www.pudn.com > code_source_compiere_erp_crm_logiciel_java.zip > MProductPrice.java


/****************************************************************************** 
 * The contents of this file are subject to the   Compiere License  Version 1.1 
 * ("License"); You may not use this file except in compliance with the License 
 * You may obtain a copy of the License at http://www.compiere.org/license.html 
 * Software distributed under the License is distributed on an  "AS IS"  basis, 
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for 
 * the specific language governing rights and limitations under the License. 
 * The Original Code is             Compiere  ERP & CRM Smart Business Solution 
 * The Initial Developer of the Original Code is Jorg Janke  and ComPiere, Inc. 
 * Portions created by Jorg Janke are Copyright (C) 1999-2003 Jorg Janke, parts 
 * created by ComPiere are Copyright (C) ComPiere, Inc.;   All Rights Reserved. 
 * Contributor(s): ______________________________________. 
 *****************************************************************************/ 
package org.compiere.model; 
 
import java.util.*; 
import java.sql.*; 
import java.math.*; 
 
import org.compiere.util.*; 
 
/** 
 *  Product Price Calculations 
 * 
 *  @author Jorg Janke 
 *  @version $Id: MProductPrice.java,v 1.3 2003/04/16 06:08:11 jjanke Exp $ 
 */ 
public class MProductPrice 
{ 
	/** 
	 * 	Constructor 
	 * 	@param M_Product_ID product 
	 */ 
	public MProductPrice (int M_Product_ID) 
	{ 
		m_M_Product_ID = M_Product_ID; 
	} 
 
	private int m_M_Product_ID; 
	private int m_M_PriceList_ID = 0; 
	private int m_M_PriceList_Version_ID = 0; 
	private int m_C_UOM_ID = 0; 
	private Timestamp m_PriceDate; 
	private BigDecimal m_PriceList = Env.ZERO; 
	private BigDecimal m_PriceStd = Env.ZERO; 
	private BigDecimal m_PriceLimit = Env.ZERO; 
	private int m_C_Currency_ID = 0; 
 
	private boolean m_calculated = false; 
 
	/** 
	 * 	Calculate Price 
	 * 	@return true if calculated 
	 */ 
	public boolean calculatePrice () 
	{ 
		if (m_M_Product_ID == 0) 
			return false; 
		m_calculated = calculatePLV (); 
		if (!m_calculated) 
			m_calculated = calculatePL(); 
		if (!m_calculated) 
			m_calculated = calculateBPL(); 
		if (!m_calculated) 
			setBaseInfo(); 
		return m_calculated; 
	}	//	calculatePrice 
 
	/** 
	 * 	Calculate Price based on Price List Version 
	 * 	@return true if calculated 
	 */ 
	public boolean calculatePLV() 
	{ 
		if (m_M_Product_ID == 0 || m_M_PriceList_Version_ID == 0) 
			return false; 
		// 
		String sql = "SELECT BOM_PriceStd(p.M_Product_ID,pv.M_PriceList_Version_ID) AS PriceStd,"	//	1 
			+ " BOM_PriceList(p.M_Product_ID,pv.M_PriceList_Version_ID) AS PriceList,"		//	2 
			+ " BOM_PriceLimit(p.M_Product_ID,pv.M_PriceList_Version_ID) AS PriceLimit,"	//	3 
			+ " p.C_UOM_ID,pv.ValidFrom,pl.C_Currency_ID "			// 4..6 
			+ "FROM M_Product p" 
			+ " INNER JOIN M_ProductPrice pp ON (p.M_Product_ID=pp.M_Product_ID)" 
			+ " INNER JOIN  M_PriceList_Version pv ON (pp.M_PriceList_Version_ID=pv.M_PriceList_Version_ID)" 
			+ " INNER JOIN M_Pricelist pl ON (pv.M_PriceList_ID=pl.M_PriceList_ID) " 
			+ "WHERE pv.IsActive='Y'" 
			+ " AND p.M_Product_ID=?"				//	#1 
			+ " AND pv.M_PriceList_Version_ID=?";	//	#2 
		m_calculated = false; 
		try 
		{ 
			PreparedStatement pstmt = DB.prepareStatement(sql); 
			pstmt.setInt(1, m_M_Product_ID); 
			pstmt.setInt(2, m_M_PriceList_Version_ID); 
			ResultSet rs = pstmt.executeQuery(); 
			if (rs.next()) 
			{ 
				//	Prices 
				m_PriceStd = rs.getBigDecimal(1); 
				if (rs.wasNull()) 
					m_PriceStd = Env.ZERO; 
				m_PriceList = rs.getBigDecimal(2); 
				if (rs.wasNull()) 
					m_PriceList = Env.ZERO; 
				m_PriceLimit = rs.getBigDecimal(3); 
				if (rs.wasNull()) 
					m_PriceLimit = Env.ZERO; 
				// 
				m_C_UOM_ID = rs.getInt(4); 
				m_C_Currency_ID = rs.getInt(6); 
				// 
				m_calculated = true; 
			} 
			rs.close(); 
			pstmt.close(); 
		} 
		catch (Exception e) 
		{ 
			Log.error("MProductPrice.calculatePLV", e); 
			m_calculated = false; 
		} 
		return m_calculated; 
	}	//	calculatePLV 
 
	/** 
	 * 	Calculate Price based on Price List 
	 * 	@return true if calculated 
	 */ 
	public boolean calculatePL() 
	{ 
		if (m_M_Product_ID == 0) 
			return false; 
 
		//	Get Price List 
		if (m_M_PriceList_ID == 0) 
		{ 
			String sql = "SELECT M_PriceList_ID " 
				+ "FROM M_PriceList pl" 
				+ " INNER JOIN M_Product p ON (pl.AD_Client_ID=p.AD_Client_ID) " 
				+ "WHERE M_Product_ID=? " 
				+ "ORDER BY IsDefault DESC"; 
			PreparedStatement pstmt = null; 
			try 
			{ 
				pstmt = DB.prepareStatement(sql); 
				pstmt.setInt(1, m_M_Product_ID); 
				ResultSet rs = pstmt.executeQuery(); 
				if (rs.next()) 
					m_M_PriceList_ID = rs.getInt(1); 
				rs.close(); 
				pstmt.close(); 
				pstmt = null; 
			} 
			catch (Exception e) 
			{ 
				Log.error("MProductPrice.calculatePL (PL)", e); 
			} 
			finally 
			{ 
				try 
				{ 
					if (pstmt != null) 
						pstmt.close (); 
				} 
				catch (Exception e) 
				{} 
				pstmt = null; 
			} 
		} 
		if (m_M_PriceList_ID == 0) 
		{ 
			Log.error("MProductPrice.calculatePL - No PriceList found for M_Product_ID=" + m_M_Product_ID); 
			return false; 
		} 
 
		//	Get Prices 
		String sql = "SELECT BOM_PriceStd(p.M_Product_ID,pv.M_PriceList_Version_ID) AS PriceStd,"	//	1 
			+ " BOM_PriceList(p.M_Product_ID,pv.M_PriceList_Version_ID) AS PriceList,"		//	2 
			+ " BOM_PriceLimit(p.M_Product_ID,pv.M_PriceList_Version_ID) AS PriceLimit,"	//	3 
			+ " p.C_UOM_ID,pv.ValidFrom,pl.C_Currency_ID "			// 4..6 
			+ "FROM M_Product p" 
			+ " INNER JOIN M_ProductPrice pp ON (p.M_Product_ID=pp.M_Product_ID)" 
			+ " INNER JOIN  M_PriceList_Version pv ON (pp.M_PriceList_Version_ID=pv.M_PriceList_Version_ID)" 
			+ " INNER JOIN M_Pricelist pl ON (pv.M_PriceList_ID=pl.M_PriceList_ID) " 
			+ "WHERE pv.IsActive='Y'" 
			+ " AND p.M_Product_ID=?"				//	#1 
			+ " AND pv.M_PriceList_ID=?"			//	#2 
			+ "ORDER BY pv.ValidFrom DESC"; 
		m_calculated = false; 
		if (m_PriceDate == null) 
			m_PriceDate = new Timestamp (System.currentTimeMillis()); 
		try 
		{ 
			PreparedStatement pstmt = DB.prepareStatement(sql); 
			pstmt.setInt(1, m_M_Product_ID); 
			pstmt.setInt(2, m_M_PriceList_ID); 
			ResultSet rs = pstmt.executeQuery(); 
			while (!m_calculated && rs.next()) 
			{ 
				Timestamp plDate = rs.getTimestamp(5); 
				//	we have the price list 
				//	if order date is after or equal PriceList validFrom 
				if (plDate == null || !m_PriceDate.before(plDate)) 
				{ 
					//	Prices 
					m_PriceStd = rs.getBigDecimal (1); 
					if (rs.wasNull ()) 
						m_PriceStd = Env.ZERO; 
					m_PriceList = rs.getBigDecimal (2); 
					if (rs.wasNull ()) 
						m_PriceList = Env.ZERO; 
					m_PriceLimit = rs.getBigDecimal (3); 
					if (rs.wasNull ()) 
						m_PriceLimit = Env.ZERO; 
						// 
					m_C_UOM_ID = rs.getInt (4); 
					m_C_Currency_ID = rs.getInt (6); 
					// 
					m_calculated = true; 
					break; 
				} 
			} 
			rs.close(); 
			pstmt.close(); 
		} 
		catch (Exception e) 
		{ 
			Log.error("MProductPrice.calculatePL", e); 
			m_calculated = false; 
		} 
		return m_calculated; 
	}	//	calculatePL 
 
	/** 
	 * 	Calculate Price based on Base Price List 
	 * 	@return true if calculated 
	 */ 
	public boolean calculateBPL() 
	{ 
		if (m_M_Product_ID == 0 || m_M_PriceList_ID == 0) 
			return false; 
		// 
		String sql = "SELECT BOM_PriceStd(p.M_Product_ID,pv.M_PriceList_Version_ID) AS PriceStd,"	//	1 
			+ " BOM_PriceList(p.M_Product_ID,pv.M_PriceList_Version_ID) AS PriceList,"		//	2 
			+ " BOM_PriceLimit(p.M_Product_ID,pv.M_PriceList_Version_ID) AS PriceLimit,"	//	3 
			+ " p.C_UOM_ID,pv.ValidFrom,pl.C_Currency_ID "			// 4..6 
			+ "FROM M_Product p" 
			+ " INNER JOIN M_ProductPrice pp ON (p.M_Product_ID=pp.M_Product_ID)" 
			+ " INNER JOIN  M_PriceList_Version pv ON (pp.M_PriceList_Version_ID=pv.M_PriceList_Version_ID)" 
			+ " INNER JOIN M_Pricelist bpl ON (pv.M_PriceList_ID=bpl.M_PriceList_ID)" 
			+ " INNER JOIN M_Pricelist pl ON (bpl.M_PriceList_ID=pl.BasePriceList_ID) " 
			+ "WHERE pv.IsActive='Y'" 
			+ " AND p.M_Product_ID=?"				//	#1 
			+ " AND pl.M_PriceList_ID=?"			//	#2 
			+ "ORDER BY pv.ValidFrom DESC"; 
		m_calculated = false; 
		if (m_PriceDate == null) 
			m_PriceDate = new Timestamp (System.currentTimeMillis()); 
		try 
		{ 
			PreparedStatement pstmt = DB.prepareStatement(sql); 
			pstmt.setInt(1, m_M_Product_ID); 
			pstmt.setInt(2, m_M_PriceList_ID); 
			ResultSet rs = pstmt.executeQuery(); 
			while (!m_calculated && rs.next()) 
			{ 
				Timestamp plDate = rs.getTimestamp(5); 
				//	we have the price list 
				//	if order date is after or equal PriceList validFrom 
				if (plDate == null || !m_PriceDate.before(plDate)) 
				{ 
					//	Prices 
					m_PriceStd = rs.getBigDecimal (1); 
					if (rs.wasNull ()) 
						m_PriceStd = Env.ZERO; 
					m_PriceList = rs.getBigDecimal (2); 
					if (rs.wasNull ()) 
						m_PriceList = Env.ZERO; 
					m_PriceLimit = rs.getBigDecimal (3); 
					if (rs.wasNull ()) 
						m_PriceLimit = Env.ZERO; 
						// 
					m_C_UOM_ID = rs.getInt (4); 
					m_C_Currency_ID = rs.getInt (6); 
					// 
					m_calculated = true; 
					break; 
				} 
			} 
			rs.close(); 
			pstmt.close(); 
		} 
		catch (Exception e) 
		{ 
			Log.error("MProductPrice.calculateBPL", e); 
			m_calculated = false; 
		} 
		return m_calculated; 
	}	//	calculateBPL 
 
	/** 
	 * 	Set Base Info (UOM) 
	 */ 
	public void setBaseInfo() 
	{ 
		if (m_M_Product_ID == 0) 
			return; 
		// 
		String sql = "SELECT C_UOM_ID FROM M_Product WHERE M_Product_ID=?"; 
		try 
		{ 
			PreparedStatement pstmt = DB.prepareStatement(sql); 
			pstmt.setInt(1, m_M_Product_ID); 
			ResultSet rs = pstmt.executeQuery(); 
			if (rs.next()) 
			{ 
				m_C_UOM_ID = rs.getInt (1); 
			} 
			rs.close(); 
			pstmt.close(); 
		} 
		catch (Exception e) 
		{ 
			Log.error("MProductPrice.setBaseInfo", e); 
		} 
		return; 
	}	//	setBaseInfo 
 
	/** 
	 * 	Calculate Discount based on Standard/List Price 
	 * 	@return Discount 
	 */ 
	public BigDecimal getDiscount() 
	{ 
		BigDecimal Discount = Env.ZERO; 
		if (m_PriceList.intValue() != 0) 
			Discount = new BigDecimal ((m_PriceList.doubleValue() - m_PriceStd.doubleValue()) 
				/ m_PriceList.doubleValue() * 100.0); 
		if (Discount.scale() > 2) 
			Discount = Discount.setScale(2, BigDecimal.ROUND_HALF_UP); 
		return Discount; 
	}	//	getDiscount 
 
 
 
 
	public int getM_Product_ID() 
	{ 
		return m_M_Product_ID; 
	} 
	public int getM_PriceList_ID() 
	{ 
		return m_M_PriceList_ID; 
	} 
	public void setM_PriceList_ID( int M_PriceList_ID) 
	{ 
		m_M_PriceList_ID = M_PriceList_ID; 
	} 
	public int getM_PriceList_Version_ID() 
	{ 
		return m_M_PriceList_Version_ID; 
	} 
	public void setM_PriceList_Version_ID (int M_PriceList_Version_ID) 
	{ 
		m_M_PriceList_Version_ID = M_PriceList_Version_ID; 
	} 
	public int getC_UOM_ID() 
	{ 
		if (!m_calculated) 
			calculatePrice(); 
		return m_C_UOM_ID; 
	} 
	public void setC_UOM_ID(int c_UOM_ID) 
	{ 
		m_C_UOM_ID = c_UOM_ID; 
	} 
	public Timestamp getPriceDate() 
	{ 
		return m_PriceDate; 
	} 
	public void setPriceDate(Timestamp priceDate) 
	{ 
		m_PriceDate = priceDate; 
	} 
	public BigDecimal getPriceList() 
	{ 
		if (!m_calculated) 
			calculatePrice(); 
		return m_PriceList; 
	} 
	public BigDecimal getPriceStd() 
	{ 
		if (!m_calculated) 
			calculatePrice(); 
		return m_PriceStd; 
	} 
	public BigDecimal getPriceLimit() 
	{ 
		if (!m_calculated) 
			calculatePrice(); 
		return m_PriceLimit; 
	} 
	public int getC_Currency_ID() 
	{ 
		if (!m_calculated) 
			calculatePrice(); 
		return m_C_Currency_ID; 
	} 
 
}	//	MProductPrice