/****************************************************************************** * 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.ResultSet; import java.sql.Timestamp; import java.util.Properties; import java.util.logging.Level; import org.compiere.util.Env; import org.compiere.util.Util; import org.idempiere.cache.ImmutableIntPOCache; import org.idempiere.cache.ImmutablePOSupport; /** * Price List Model * * @author Jorg Janke * @version $Id: MPriceList.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $ * * @author Teo Sarca, www.arhipac.ro *
  • BF [ 2073484 ] MPriceList.getDefault is not working correctly */ public class MPriceList extends X_M_PriceList implements ImmutablePOSupport { /** * generated serial id */ private static final long serialVersionUID = 7128840936482927934L; /** * Get Price List (cached) (immutable) * @param M_PriceList_ID id * @return PriceList */ public static MPriceList get (int M_PriceList_ID) { return get(M_PriceList_ID, (String)null); } /** * Get Price List (cached) (immutable) * @param M_PriceList_ID id * @param trxName transaction * @return PriceList */ public static MPriceList get (int M_PriceList_ID, String trxName) { return get(Env.getCtx(), M_PriceList_ID, trxName); } /** * Get Price List (cached) (immutable) * @param ctx context * @param M_PriceList_ID id * @param trxName transaction * @return PriceList */ public static MPriceList get (Properties ctx, int M_PriceList_ID, String trxName) { Integer key = Integer.valueOf(M_PriceList_ID); MPriceList retValue = s_cache.get(ctx, key, e -> new MPriceList(ctx, e)); if (retValue == null) { retValue = new MPriceList (ctx, M_PriceList_ID, trxName); if (retValue.get_ID() == M_PriceList_ID) { s_cache.put(key, retValue, e -> new MPriceList(Env.getCtx(), e)); return retValue; } return null; } return retValue; } // get /** * Get updateable copy of MPriceList from cache * @param ctx * @param M_PriceList_ID * @param trxName * @return MPriceList */ public static MPriceList getCopy(Properties ctx, int M_PriceList_ID, String trxName) { MPriceList pl = get(ctx, M_PriceList_ID, trxName); if (pl != null) pl = new MPriceList(ctx, pl, trxName); return pl; } /** * Get Default Price List for Client (cached) * @param ctx context * @param IsSOPriceList SO or PO * @return PriceList or null */ public static MPriceList getDefault (Properties ctx, boolean IsSOPriceList) { int AD_Client_ID = Env.getAD_Client_ID(ctx); // Search for it in cache MPriceList[] it = s_cache.values().toArray(new MPriceList[0]); for(MPriceList retValue : it) { if (retValue.isDefault() && retValue.getAD_Client_ID() == AD_Client_ID && retValue.isSOPriceList() == IsSOPriceList) { return retValue; } } // Get from DB final String whereClause = "AD_Client_ID=? AND IsDefault=? AND IsSOPriceList=?"; MPriceList retValue = new Query(ctx, Table_Name, whereClause, null) .setParameters(AD_Client_ID, "Y", IsSOPriceList ? "Y" : "N") .setOnlyActiveRecords(true) .setOrderBy("M_PriceList_ID") .first(); // Return value if (retValue != null) { s_cache.put(retValue.get_ID(), retValue, e -> new MPriceList(Env.getCtx(), e)); } return retValue; } // getDefault /** * Get Default Price List for Client (cached) with given currency * @param ctx context * @param IsSOPriceList SO or PO * @param ISOCurrency * @return PriceList or null */ public static MPriceList getDefault(Properties ctx, boolean IsSOPriceList, String ISOCurrency) { int AD_Client_ID = Env.getAD_Client_ID(ctx); MCurrency currency = MCurrency.get(ctx, ISOCurrency); // If currency is null, return the default without looking at currency if (currency==null) return(getDefault(ctx, IsSOPriceList)); int M_Currency_ID = currency.get_ID(); // Search for it in cache MPriceList[] it = s_cache.values().toArray(new MPriceList[0]); for (MPriceList retValue : it) { if (retValue.isDefault() && retValue.getAD_Client_ID() == AD_Client_ID && retValue.isSOPriceList() == IsSOPriceList && retValue.getC_Currency_ID()==M_Currency_ID ) { return retValue; } } // Get from DB final String whereClause = "AD_Client_ID=? AND IsDefault=? AND IsSOPriceList=? AND C_Currency_ID=?"; MPriceList retValue = new Query(ctx, Table_Name, whereClause, null) .setParameters(AD_Client_ID, "Y", IsSOPriceList ? "Y" : "N", M_Currency_ID) .setOnlyActiveRecords(true) .setOrderBy("M_PriceList_ID") .first(); // Return value if (retValue != null) { s_cache.put(retValue.get_ID(), retValue, e -> new MPriceList(Env.getCtx(), e)); } return retValue; } /** * Get Standard Currency Precision from price list * @param ctx context * @param M_PriceList_ID price list * @return precision */ public static int getStandardPrecision (Properties ctx, int M_PriceList_ID) { MPriceList pl = MPriceList.get(ctx, M_PriceList_ID, null); return pl.getStandardPrecision(); } // getStandardPrecision /** * Get Price Precision from price list * @param ctx context * @param M_PriceList_ID price list * @return precision */ public static int getPricePrecision (Properties ctx, int M_PriceList_ID) { MPriceList pl = MPriceList.get(ctx, M_PriceList_ID, null); return pl.getPricePrecision(); } // getPricePrecision /** Cache of Price Lists */ private static ImmutableIntPOCache s_cache = new ImmutableIntPOCache(Table_Name, 5, 5); /** * UUID based Constructor * @param ctx Context * @param M_PriceList_UU UUID key * @param trxName Transaction */ public MPriceList(Properties ctx, String M_PriceList_UU, String trxName) { super(ctx, M_PriceList_UU, trxName); if (Util.isEmpty(M_PriceList_UU)) setInitialDefaults(); } /** * Standard Constructor * @param ctx context * @param M_PriceList_ID id * @param trxName transaction */ public MPriceList(Properties ctx, int M_PriceList_ID, String trxName) { super(ctx, M_PriceList_ID, trxName); if (M_PriceList_ID == 0) setInitialDefaults(); } // MPriceList /** * Set the initial defaults for a new record */ private void setInitialDefaults() { setEnforcePriceLimit (false); setIsDefault (false); setIsSOPriceList (false); setIsTaxIncluded (false); setPricePrecision (2); // 2 } /** * Load Constructor * @param ctx context * @param rs result set * @param trxName transaction */ public MPriceList (Properties ctx, ResultSet rs, String trxName) { super(ctx, rs, trxName); } // MPriceList /** * Import Constructor * @param impPL import */ public MPriceList (X_I_PriceList impPL) { this (impPL.getCtx(), 0, impPL.get_TrxName()); setClientOrg(impPL); setUpdatedBy(impPL.getUpdatedBy()); // setName(impPL.getName()); setDescription(impPL.getDescription()); setC_Currency_ID(impPL.getC_Currency_ID()); setPricePrecision(impPL.getPricePrecision()); setIsSOPriceList(impPL.isSOPriceList()); setIsTaxIncluded(impPL.isTaxIncluded()); setEnforcePriceLimit(impPL.isEnforcePriceLimit()); } // MPriceList /** * Copy constructor * @param copy */ public MPriceList(MPriceList copy) { this(Env.getCtx(), copy); } /** * Copy constructor * @param ctx * @param copy */ public MPriceList(Properties ctx, MPriceList copy) { this(ctx, copy, (String) null); } /** * Copy constructor * @param ctx * @param copy * @param trxName */ public MPriceList(Properties ctx, MPriceList copy, String trxName) { this(ctx, 0, trxName); copyPO(copy); if (copy.m_plv != null) { this.m_plv = new MPriceListVersion(ctx, copy.m_plv, trxName); this.m_plv.m_pl = this; } else { this.m_plv = null; } this.m_precision = copy.m_precision; } /** Cached PLV */ private MPriceListVersion m_plv = null; /** Cached Precision */ private Integer m_precision = null; /** * Get Price List Version * @param valid date where PLV must be valid or today if null * @return MPriceListVersion */ public MPriceListVersion getPriceListVersion (Timestamp valid) { if (valid == null) valid = new Timestamp (System.currentTimeMillis()); final String whereClause = "M_PriceList_ID=? AND TRUNC(ValidFrom)<=?"; m_plv = new Query(getCtx(), I_M_PriceList_Version.Table_Name, whereClause, get_TrxName()) .setParameters(getM_PriceList_ID(), valid) .setOnlyActiveRecords(true) .setOrderBy("ValidFrom DESC") .first(); if (m_plv == null) if (log.isLoggable(Level.INFO)) log.info("None found M_PriceList_ID=" + getM_PriceList_ID() + " - " + valid); else if (log.isLoggable(Level.FINE)) log.fine(m_plv.toString()); if (m_plv != null && is_Immutable()) m_plv.markImmutable(); return m_plv; } // getPriceListVersion /** * Get Standard Currency Precision * @return precision */ public int getStandardPrecision() { if (m_precision == null) { MCurrency c = MCurrency.get(getCtx(), getC_Currency_ID()); m_precision = Integer.valueOf(c.getStdPrecision()); } return m_precision.intValue(); } // getStandardPrecision @Override public MPriceList markImmutable() { if (is_Immutable()) return this; makeImmutable(); if (m_plv != null) m_plv.markImmutable(); return this; } } // MPriceList