📄 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -