/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. This program is distributed in the hope * * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * * For the text or an alternative of this public license, you may reach us * * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * * or via info@compiere.org or http://www.compiere.org/license.html * *****************************************************************************/ package org.compiere.model; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Comparator; import java.util.Properties; import java.util.logging.Level; import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.Msg; import org.compiere.util.Trx; import org.compiere.util.Util; import org.idempiere.cache.ImmutableIntPOCache; import org.idempiere.cache.ImmutablePOSupport; /** * Location (Address) * * @author Jorg Janke * @version $Id: MLocation.java,v 1.3 2006/07/30 00:54:54 jjanke Exp $ * * @author Michael Judd (Akuna Ltd) *
  • BF [ 2695078 ] Country is not translated on invoice *
  • FR [2794312 ] Location AutoComplete - check if allow cities out of list * * @author Teo Sarca, teo.sarca@gmail.com *
  • BF [ 3002736 ] MLocation.get cache all MLocations * https://sourceforge.net/p/adempiere/bugs/2404/ */ public class MLocation extends X_C_Location implements Comparator, ImmutablePOSupport { /** * generated serial id */ private static final long serialVersionUID = -3421958100626539835L; // http://jira.idempiere.com/browse/IDEMPIERE-147 public static String LOCATION_MAPS_URL_PREFIX = MSysConfig.getValue(MSysConfig.LOCATION_MAPS_URL_PREFIX); public static String LOCATION_MAPS_ROUTE_PREFIX = MSysConfig.getValue(MSysConfig.LOCATION_MAPS_ROUTE_PREFIX); public static String LOCATION_MAPS_SOURCE_ADDRESS = MSysConfig.getValue(MSysConfig.LOCATION_MAPS_SOURCE_ADDRESS); public static String LOCATION_MAPS_DESTINATION_ADDRESS = MSysConfig.getValue(MSysConfig.LOCATION_MAPS_DESTINATION_ADDRESS); /** * Get Location from Cache (Immutable) * @param C_Location_ID id * @param trxName transaction * @return MLocation */ public static MLocation get (int C_Location_ID, String trxName) { return get(Env.getCtx(), C_Location_ID, trxName); } /** * Get Location from Cache (immutable) * @param C_Location_ID id * @return MLocation */ public static MLocation get (int C_Location_ID) { return get(C_Location_ID, (String)null); } /** * Get Location from Cache (immutable) * @param ctx context * @param C_Location_ID id * @param trxName transaction * @return MLocation */ public static MLocation get (Properties ctx, int C_Location_ID, String trxName) { // New if (C_Location_ID == 0) return new MLocation(Env.getCtx(), C_Location_ID, trxName); // Integer key = Integer.valueOf(C_Location_ID); MLocation retValue = s_cache.get (ctx, key, e -> new MLocation(ctx, e)); if (retValue != null) return retValue; retValue = new MLocation (ctx, C_Location_ID, trxName); if (retValue.get_ID () == C_Location_ID) // found { s_cache.put (key, retValue, e -> new MLocation(Env.getCtx(), e)); return retValue; } return null; // not found } // get /** * Get updateable copy of MLocation from cache * @param ctx context * @param C_Location_ID * @param trxName * @return MLocation */ public static MLocation getCopy(Properties ctx, int C_Location_ID, String trxName) { MLocation loc = get(C_Location_ID, trxName); if (loc != null && loc.getC_Location_ID() > 0) loc = new MLocation(ctx, loc, trxName); return loc; } /** * Load Location via Business Partner Location id * @param ctx context * @param C_BPartner_Location_ID Business Partner Location * @param trxName transaction * @return location or null */ public static MLocation getBPLocation (Properties ctx, int C_BPartner_Location_ID, String trxName) { if (C_BPartner_Location_ID == 0) // load default return null; MLocation loc = null; String sql = "SELECT * FROM C_Location l " + "WHERE C_Location_ID IN (SELECT C_Location_ID FROM C_BPartner_Location WHERE C_BPartner_Location_ID=?)"; PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = DB.prepareStatement(sql, trxName); pstmt.setInt(1, C_BPartner_Location_ID); rs = pstmt.executeQuery(); if (rs.next()) loc = new MLocation (ctx, rs, trxName); } catch (SQLException e) { s_log.log(Level.SEVERE, sql + " - " + C_BPartner_Location_ID, e); loc = null; } finally { DB.close(rs, pstmt); rs = null; pstmt = null; } return loc; } // getBPLocation /** Cache */ private static ImmutableIntPOCache s_cache = new ImmutableIntPOCache(Table_Name, 100, 30); /** Static Logger */ private static CLogger s_log = CLogger.getCLogger(MLocation.class); /** * UUID based Constructor * @param ctx Context * @param C_Location_UU UUID key * @param trxName Transaction */ public MLocation(Properties ctx, String C_Location_UU, String trxName) { super(ctx, C_Location_UU, trxName); if (Util.isEmpty(C_Location_UU)) setInitialDefaults(); } /** * Standard Constructor * @param ctx context * @param C_Location_ID id * @param trxName transaction */ public MLocation (Properties ctx, int C_Location_ID, String trxName) { super (ctx, C_Location_ID, trxName); if (C_Location_ID == 0) setInitialDefaults(); } // MLocation /** * Set the initial defaults for a new record */ private void setInitialDefaults() { MCountry defaultCountry = MCountry.getDefault(); setCountry(defaultCountry); MRegion defaultRegion = MRegion.getDefault(); if (defaultRegion != null && defaultRegion.getC_Country_ID() == defaultCountry.getC_Country_ID()) setRegion(defaultRegion); } /** * Parent Constructor * @param country mandatory country * @param region optional region */ public MLocation (MCountry country, MRegion region) { super (country.getCtx(), 0, country.get_TrxName()); setCountry (country); setRegion (region); } // MLocation /** * @param ctx context * @param C_Country_ID country * @param C_Region_ID region * @param city city * @param trxName transaction */ public MLocation (Properties ctx, int C_Country_ID, int C_Region_ID, String city, String trxName) { super(ctx, 0, trxName); setC_Country_ID(C_Country_ID); setC_Region_ID(C_Region_ID); setCity(city); } // MLocation /** * Load Constructor * @param ctx context * @param rs result set * @param trxName transaction */ public MLocation (Properties ctx, ResultSet rs, String trxName) { super(ctx, rs, trxName); } // MLocation /** * Copy constructor * @param copy */ public MLocation(MLocation copy) { this(Env.getCtx(), copy); } /** * Copy constructor * @param ctx * @param copy */ public MLocation(Properties ctx, MLocation copy) { this(ctx, copy, (String) null); } /** * Copy constructor * @param ctx * @param copy * @param trxName */ public MLocation(Properties ctx, MLocation copy, String trxName) { this(ctx, 0, trxName); copyPO(copy); this.m_c = copy.m_c != null ? new MCountry(ctx, copy.m_c, trxName) : null; this.m_r = copy.m_r != null ? new MRegion(ctx, copy.m_r, trxName) : null; } private MCountry m_c = null; private MRegion m_r = null; /** * Set Country * @param country */ public void setCountry (MCountry country) { if (country != null) m_c = country; else m_c = MCountry.getDefault(); super.setC_Country_ID (m_c.getC_Country_ID()); } // setCountry /** * Set C_Country_ID * @param C_Country_ID id */ public void setC_Country_ID (int C_Country_ID) { if (getC_Country_ID() != C_Country_ID) setRegion(null); setCountry (MCountry.get(C_Country_ID)); } // setCountry /** * Get Country (immutable) * @return country */ public MCountry getCountry() { // Reset country if not match if (m_c != null && m_c.get_ID() != getC_Country_ID()) m_c = null; // Load if (m_c == null) { if (getC_Country_ID() != 0) m_c = MCountry.get(getC_Country_ID()); else m_c = MCountry.getDefault(); } return m_c; } // getCountry /** * Get Country Name * @return Country Name */ public String getCountryName() { return getCountry().getName(); } // getCountryName /** * Get Country Name * @param local if true return null for default country * @return country name or null */ public String getCountry (boolean local) { if (local && getC_Country_ID() == MCountry.getDefault().getC_Country_ID()) return null; return getCountryName(); } // getCountry /** * Get Translated Country Name * @param local if true return null for default country * @return country name or null */ public String getCountry (boolean local, String language) { if (local && getC_Country_ID() == MCountry.getDefault().getC_Country_ID()) return null; MCountry mc = getCountry(); return mc.getTrlName(language); } // getCountry /** * Set Region * @param region */ public void setRegion (MRegion region) { m_r = region; if (region == null) { super.setC_Region_ID(0); setRegionName(null); } else { super.setC_Region_ID(m_r.getC_Region_ID()); setRegionName(m_r.getName()); if (m_r.getC_Country_ID() != getC_Country_ID()) { if (log.isLoggable(Level.INFO)) log.info("Region(" + region + ") C_Country_ID=" + region.getC_Country_ID() + " - From C_Country_ID=" + getC_Country_ID()); setC_Country_ID(region.getC_Country_ID()); } } } // setRegion /** * Set C_Region_ID * @param C_Region_ID region */ public void setC_Region_ID (int C_Region_ID) { if (C_Region_ID == 0) setRegion(null); // Country defined else if (getC_Country_ID() != 0) { MCountry cc = getCountry(); if (cc.isValidRegion(C_Region_ID)) super.setC_Region_ID(C_Region_ID); else setRegion(null); } else setRegion (MRegion.get(C_Region_ID)); } // setC_Region_ID /** * Get Region * @return region */ public MRegion getRegion() { // Reset region if not match if (m_r != null && m_r.get_ID() != getC_Region_ID()) m_r = null; // if (m_r == null && getC_Region_ID() != 0) m_r = MRegion.get(getC_Region_ID()); return m_r; } // getRegion /** * Get Region Name * @return region Name or "" */ public String getRegionName() { return getRegionName(false); } // getRegionName /** * Get Region Name * @param getFromRegion true to get from region (C_Region) * @return region Name or "" */ public String getRegionName (boolean getFromRegion) { if (getFromRegion && getCountry().isHasRegion() && getRegion() != null) { super.setRegionName(""); // avoid duplicates return getRegion().getName(); } // String regionName = super.getRegionName(); if (regionName == null) regionName = ""; return regionName; } // getRegionName /** * Compares to current record * @param C_Country_ID if 0 ignored * @param C_Region_ID if 0 ignored * @param Postal match postal * @param Postal_Add match postal add * @param City match city * @param Address1 match address 1 * @param Address2 match address 2 * @return true if equals */ public boolean equals (int C_Country_ID, int C_Region_ID, String Postal, String Postal_Add, String City, String Address1, String Address2) { if (C_Country_ID != 0 && getC_Country_ID() != C_Country_ID) return false; if (C_Region_ID != 0 && getC_Region_ID() != C_Region_ID) return false; // must match if (!equalsNull(Postal, getPostal())) return false; if (!equalsNull(Postal_Add, getPostal_Add())) return false; if (!equalsNull(City, getCity())) return false; if (!equalsNull(Address1, getAddress1())) return false; if (!equalsNull(Address2, getAddress2())) return false; return true; } // equals /** * Case insensitive equal check (null treated as "") * @param c1 c1 * @param c2 c2 * @return true if equal (ignore case) */ private boolean equalsNull (String c1, String c2) { if (c1 == null) c1 = ""; if (c2 == null) c2 = ""; return c1.equalsIgnoreCase(c2); } // equalsNull /** * Equals * @param cmp object to compare * @return true if ID the same */ @Override public boolean equals (Object cmp) { if (cmp == null) return false; if (cmp.getClass().equals(this.getClass())) return ((PO)cmp).get_ID() == get_ID(); return super.equals(cmp); } // equals @Override public int hashCode() { assert false : "hashCode not designed"; return 42; // any arbitrary constant will do } /** * Is Print Address in Reverse Order * @return true if reverse depending on country */ public boolean isAddressLinesReverse() { // Local if (MCountry.getDefault() != null && getC_Country_ID() == MCountry.getDefault().getC_Country_ID()) return getCountry().isAddressLinesLocalReverse(); return getCountry().isAddressLinesReverse(); } // isAddressLinesReverse /** * Get formatted City Region Postal line * @return City, Region Postal */ public String getCityRegionPostal() { return parseCRP (getCountry()); } // getCityRegionPostal /** *
    	 *  Parse City/Postal/Region according to displaySequence.
    	 *  @C@ - City   @R@ - Region   @P@ - Postal   @A@ - PostalAdd
    	 *  
    * @param c country * @return parsed String */ private String parseCRP (MCountry c) { if (c == null) return "CountryNotFound"; boolean local = MCountry.getDefault() != null && getC_Country_ID() == MCountry.getDefault().getC_Country_ID(); String inStr = local ? c.getDisplaySequenceLocal() : c.getDisplaySequence(); StringBuilder outStr = new StringBuilder(); String token; int i = inStr.indexOf('@'); while (i != -1) { outStr.append (inStr.substring(0, i)); // up to @ inStr = inStr.substring(i+1, inStr.length()); // from first @ int j = inStr.indexOf('@'); // next @ if (j < 0) { token = ""; // no second tag j = i+1; } else token = inStr.substring(0, j); // Tokens if (token.equals("C")) { if (getCity() != null) outStr.append(getCity()); } else if (token.equals("R")) { if (getRegion() != null) // we have a region outStr.append(getRegion().getTrlName()); else if (super.getRegionName() != null && super.getRegionName().length() > 0) outStr.append(super.getRegionName()); // local region name } else if (token.equals("P")) { if (getPostal() != null) outStr.append(getPostal()); } else if (token.equals("A")) { String add = getPostal_Add(); if (add != null && add.length() > 0) outStr.append("-").append(add); } else outStr.append("@").append(token).append("@"); inStr = inStr.substring(j+1, inStr.length()); // from second @ i = inStr.indexOf('@'); } outStr.append(inStr); // add the rest of the string // Print Region Name if entered and not part of pattern if (c.getDisplaySequence().indexOf("@R@") == -1 && super.getRegionName() != null && super.getRegionName().length() > 0) { String regName =null; if(getRegion()!=null) regName =getRegion().getTrlName(); else regName =super.getRegionName(); outStr.append(" ").append(regName); } String retValue = Util.replace(outStr.toString(), "\\n", "\n"); if (log.isLoggable(Level.FINEST)) log.finest("parseCRP - " + c.getDisplaySequence() + " -> " + retValue); return retValue; } // parseCRP /** * Return printable String representation * @return String */ @Override public String toString() { StringBuilder retStr = new StringBuilder(); if (isAddressLinesReverse()) { // City, Region, Postal retStr.append(parseCRP (getCountry())); if (getAddress5() != null && getAddress5().length() > 0) retStr.append(", ").append(getAddress5()); if (getAddress4() != null && getAddress4().length() > 0) retStr.append(", ").append(getAddress4()); if (getAddress3() != null && getAddress3().length() > 0) retStr.append(", ").append(getAddress3()); if (getAddress2() != null && getAddress2().length() > 0) retStr.append(", ").append(getAddress2()); if (getAddress1() != null) retStr.append(", ").append(getAddress1()); } else { if (getAddress1() != null) retStr.append(getAddress1()); if (getAddress2() != null && getAddress2().length() > 0) retStr.append(", ").append(getAddress2()); if (getAddress3() != null && getAddress3().length() > 0) retStr.append(", ").append(getAddress3()); if (getAddress4() != null && getAddress4().length() > 0) retStr.append(", ").append(getAddress4()); if (getAddress5() != null && getAddress5().length() > 0) retStr.append(", ").append(getAddress5()); // City, Region, Postal retStr.append(", ").append(parseCRP (getCountry())); } return retStr.toString(); } // toString /** * Return String representation with CR at line end * @return String */ public String toStringCR() { StringBuilder retStr = new StringBuilder(); if (isAddressLinesReverse()) { // City, Region, Postal retStr.append(parseCRP (getCountry())); if (getAddress5() != null && getAddress5().length() > 0) retStr.append("\n").append(getAddress5()); if (getAddress4() != null && getAddress4().length() > 0) retStr.append("\n").append(getAddress4()); if (getAddress3() != null && getAddress3().length() > 0) retStr.append("\n").append(getAddress3()); if (getAddress2() != null && getAddress2().length() > 0) retStr.append("\n").append(getAddress2()); if (getAddress1() != null) retStr.append("\n").append(getAddress1()); } else { if (getAddress1() != null) retStr.append(getAddress1()); if (getAddress2() != null && getAddress2().length() > 0) retStr.append("\n").append(getAddress2()); if (getAddress3() != null && getAddress3().length() > 0) retStr.append("\n").append(getAddress3()); if (getAddress4() != null && getAddress4().length() > 0) retStr.append("\n").append(getAddress4()); if (getAddress5() != null && getAddress5().length() > 0) retStr.append("\n").append(getAddress5()); // City, Region, Postal retStr.append("\n").append(parseCRP (getCountry())); } return retStr.toString(); } // toStringCR /** * Return detailed String representation * @return String */ public String toStringX() { StringBuilder sb = new StringBuilder("MLocation=["); sb.append(get_ID()) .append(",C_Country_ID=").append(getC_Country_ID()) .append(",C_Region_ID=").append(getC_Region_ID()) .append(",Postal=").append(getPostal()) .append ("]"); return sb.toString(); } // toStringX /** * Before Save * @param newRecord new * @return true */ @Override protected boolean beforeSave (boolean newRecord) { if (getAD_Org_ID() != 0) setAD_Org_ID(0); // Region Check if (getC_Region_ID() != 0) { if (m_c == null || m_c.getC_Country_ID() != getC_Country_ID()) getCountry(); if (!m_c.isHasRegion()) setC_Region_ID(0); } else { setRegionName(null); } if (getC_City_ID() <= 0 && getCity() != null && getCity().length() > 0) { int city_id = DB.getSQLValue( get_TrxName(), "SELECT C_City_ID FROM C_City WHERE C_Country_ID=? AND COALESCE(C_Region_ID,0)=? AND Name=? AND AD_Client_ID IN (0,?)", new Object[] {getC_Country_ID(), getC_Region_ID(), getCity(), getAD_Client_ID()}); if (city_id > 0) setC_City_ID(city_id); } //check city if (m_c != null && !m_c.isAllowCitiesOutOfList() && getC_City_ID()<=0) { log.saveError("CityNotFound", Msg.translate(getCtx(), "CityNotFound")); return false; } //check city id if (m_c != null && !m_c.isAllowCitiesOutOfList() && getC_City_ID() > 0) { int city_id = DB.getSQLValue(get_TrxName(), "SELECT C_City_ID "+ " FROM C_City "+ " WHERE C_Country_ID=? "+ " AND COALESCE(C_Region_ID,0)=? " + " AND C_City_ID =?", new Object[] {getC_Country_ID(), getC_Region_ID(), getC_City_ID()}); if (city_id<0){ log.saveError("CityNotFound",Msg.translate(getCtx(), "CityNotFound")+" C_City_ID["+getC_City_ID()+"]"); return false; } } return true; } // beforeSave public final static String updateBPLocName = "SELECT C_BPartner_Location_ID FROM C_BPartner_Location WHERE C_Location_ID = ? AND IsPreserveCustomName = 'N'"; /** * After Save * @param newRecord new * @param success success * @return success */ @Override protected boolean afterSave (boolean newRecord, boolean success) { if (!success) return success; // Value/Name change in Account if (!newRecord && ("Y".equals(Env.getContext(getCtx(), "$Element_LF")) || "Y".equals(Env.getContext(getCtx(), "$Element_LT"))) && (is_ValueChanged("Postal") || is_ValueChanged("City")) ){ StringBuilder msgup = new StringBuilder( "(C_LocFrom_ID=").append(getC_Location_ID()) .append(" OR C_LocTo_ID=").append(getC_Location_ID()).append(")"); MAccount.updateValueDescription(getCtx(), msgup.toString(), get_TrxName()); } //Update BP_Location name IDEMPIERE 417 if (get_TrxName().startsWith(PO.LOCAL_TRX_PREFIX)) { // saved without trx int bplID = DB.getSQLValueEx(get_TrxName(), updateBPLocName, getC_Location_ID()); if (bplID>0) { // just trigger BPLocation name change when the location change affects the name: // START_VALUE_BPLOCATION_NAME // 0 - City // 1 - City + Address1 // 2 - City + Address1 + Address2 // 3 - City + Address1 + Address2 + Region // 4 - City + Address1 + Address2 + Region + ID int bplocname = MSysConfig.getIntValue(MSysConfig.START_VALUE_BPLOCATION_NAME, 0, getAD_Client_ID(), getAD_Org_ID()); if (bplocname < 0 || bplocname > 4) bplocname = 0; if ( is_ValueChanged(COLUMNNAME_City) || is_ValueChanged(COLUMNNAME_C_City_ID) || (bplocname >= 1 && is_ValueChanged(COLUMNNAME_Address1)) || (bplocname >= 2 && is_ValueChanged(COLUMNNAME_Address2)) || (bplocname >= 3 && (is_ValueChanged(COLUMNNAME_RegionName) || is_ValueChanged(COLUMNNAME_C_Region_ID))) ) { MBPartnerLocation bpl = new MBPartnerLocation(getCtx(), bplID, get_TrxName()); bpl.setName(bpl.getBPLocName(this)); bpl.saveEx(); } } } return success; } // afterSave /** * Get formatted address for GoogleMap / IDEMPIERE-147 * @return formatted address for GoogleMap */ public String getMapsLocation() { MRegion region = new MRegion(Env.getCtx(), getC_Region_ID(), get_TrxName()); StringBuilder address = new StringBuilder(); address.append((getAddress1() != null ? getAddress1() + ", " : "")); address.append((getAddress2() != null ? getAddress2() + ", " : "")); address.append((getAddress3() != null ? getAddress3() + ", " : "")); address.append((getCity() != null ? getCity() + ", " : "")); address.append((region.getName() != null ? region.getName() + ", " : "")); address.append((getCountryName() != null ? getCountryName() : "")); return address.toString().replace(" ", "+"); } /** * @param columnName * @return field length for column */ public static int getFieldLength(String columnName) { MTable loctable = MTable.get(Env.getCtx(), Table_ID); MColumn column = loctable.getColumn(columnName); if (column == null) return -1; else return column.getFieldLength(); } /** Error Message */ private String m_errorMessage = null; /** * Set error message * @param errorMessage */ public void setErrorMessage(String errorMessage) { m_errorMessage = errorMessage; } /** * Get error message * @return error message */ public String getErrorMessage() { return m_errorMessage; } /** * Perform online address validation * @param C_AddressValidation_ID * @return true if valid */ public boolean processOnline(int C_AddressValidation_ID) { setErrorMessage(null); Trx trx = Trx.get(Trx.createTrxName("avt-"), true); trx.setDisplayName(getClass().getName()+"_processOnline"); boolean ok = false; try { MAddressTransaction at = createAddressTransaction(getCtx(), this, C_AddressValidation_ID, trx.getTrxName()); ok = at.processOnline(); at.saveEx(); setC_AddressValidation_ID(at.getC_AddressValidation_ID()); setIsValid(at.isValid()); setResult(at.getResult()); if (!ok) setErrorMessage(at.getErrorMessage()); } catch (Exception e) { log.log(Level.SEVERE, "processOnline", e); setErrorMessage(Msg.getMsg(Env.getCtx(), "AddressNotProcessed") + ": " + e.getMessage()); } finally { if (trx != null) { trx.commit(); trx.close(); } } return ok; } @Override public MLocation markImmutable() { if (is_Immutable()) return this; makeImmutable(); return this; } /** * Create address transaction instance * @param ctx * @param location * @param C_AddressValidation_ID * @param trxName * @return address transaction instance */ private static MAddressTransaction createAddressTransaction(Properties ctx, MLocation location, int C_AddressValidation_ID, String trxName) { MAddressTransaction at = new MAddressTransaction(ctx, 0, trxName); at.setAD_Org_ID(location.getAD_Org_ID()); at.setAddress1(location.getAddress1()); at.setAddress2(location.getAddress2()); at.setAddress3(location.getAddress3()); at.setAddress4(location.getAddress4()); at.setAddress5(location.getAddress5()); at.setComments(location.getComments()); at.setC_AddressValidation_ID(C_AddressValidation_ID); at.setC_Location_ID(location.getC_Location_ID()); at.setCity(location.getCity()); if (location.getCountry() != null) at.setCountry(location.getCountry().getCountryCode()); at.setIsActive(location.isActive()); at.setPostal(location.getPostal()); if (location.getRegion() != null) at.setRegion(location.getRegion().getName()); else at.setRegion(location.getRegionName()); at.saveEx(); return at; } } // MLocation