MConversionRate.java
| Index Score | ||
|---|---|---|
![]() |
![]() |
org.compiere.model |
![]() |
![]() |
Compiere |
View: Reasons, Metrics, Source Code
These are the metrics that contribute to the Enerjy Score for this file, ranked by impact. So the metrics listed at the top influence the score to a greater extent that the metrics listed at the bottom.
/******************************************************************************
* Product: Compiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2007 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., 3600 Bridge Parkway #102, Redwood City, CA 94065, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.model;
import java.math.*;
import java.sql.*;
import java.text.*;
import java.util.logging.*;
import org.compiere.api.*;
import org.compiere.common.constants.*;
import org.compiere.framework.*;
import org.compiere.util.*;
/**
* Currency Conversion Rate Model
*
* @author Jorg Janke
* @version $Id: MConversionRate.java,v 1.2 2006/07/30 00:58:18 jjanke Exp $
*/
public class MConversionRate extends X_C_Conversion_Rate
{
/**
*
*/
private static final long serialVersionUID = 1L;
/** Logger */
private static CLogger s_log = CLogger.getCLogger (MConversionRate.class);
/**
* Convert an amount to base Currency
* @param ctx context
* @param CurFrom_ID The C_Currency_ID FROM
* @param ConvDate conversion date - if null - use current date
* @param C_ConversionType_ID conversion rate type - if 0 - use Default
* @param Amt amount to be converted
* @param AD_Client_ID client
* @param AD_Org_ID organization
* @return converted amount
*/
public static BigDecimal convertBase (Ctx ctx,
BigDecimal Amt, int CurFrom_ID,
Timestamp ConvDate, int C_ConversionType_ID,
int AD_Client_ID, int AD_Org_ID)
{
return convert (ctx, Amt, CurFrom_ID, MClient.get(ctx).getC_Currency_ID(),
ConvDate, C_ConversionType_ID, AD_Client_ID, AD_Org_ID);
} // convertBase
/**
* Convert an amount with today's default rate
* @param ctx context
* @param CurFrom_ID The C_Currency_ID FROM
* @param CurTo_ID The C_Currency_ID TO
* @param Amt amount to be converted
* @param AD_Client_ID client
* @param AD_Org_ID organization
* @return converted amount
*/
public static BigDecimal convert (Ctx ctx,
BigDecimal Amt, int CurFrom_ID, int CurTo_ID,
int AD_Client_ID, int AD_Org_ID)
{
return convert (ctx, Amt, CurFrom_ID, CurTo_ID, null, 0, AD_Client_ID, AD_Org_ID);
} // convert
/**
* Convert an amount
* @param ctx context
* @param CurFrom_ID The C_Currency_ID FROM
* @param CurTo_ID The C_Currency_ID TO
* @param ConvDate conversion date - if null - use current date
* @param C_ConversionType_ID conversion rate type - if 0 - use Default
* @param Amt amount to be converted
* @param AD_Client_ID client
* @param AD_Org_ID organization
* @return converted amount or null if no rate
*/
public static BigDecimal convert (Ctx ctx,
BigDecimal Amt, int CurFrom_ID, int CurTo_ID,
Timestamp ConvDate, int C_ConversionType_ID,
int AD_Client_ID, int AD_Org_ID)
{
if (Amt == null)
throw new IllegalArgumentException("Required parameter missing - Amt");
if (CurFrom_ID == CurTo_ID)
return Amt;
// Get Rate
BigDecimal retValue = getRate (CurFrom_ID, CurTo_ID,
ConvDate, C_ConversionType_ID,
AD_Client_ID, AD_Org_ID);
if (retValue == null)
return null;
// Get Amount in Currency Precision
retValue = retValue.multiply(Amt);
int stdPrecision = MCurrency.getStdPrecision(ctx, CurTo_ID);
if (retValue.scale() > stdPrecision)
retValue = retValue.setScale(stdPrecision, BigDecimal.ROUND_HALF_UP);
return retValue;
} // convert
/**
* Get Currency Conversion Rate
* @param CurFrom_ID The C_Currency_ID FROM
* @param CurTo_ID The C_Currency_ID TO
* @param ConvDate The Conversion date - if null - use current date
* @param ConversionType_ID Conversion rate type - if 0 - use Default
* @param AD_Client_ID client
* @param AD_Org_ID organization
* @return currency Rate or null
*/
public static BigDecimal getRate (int CurFrom_ID, int CurTo_ID,
Timestamp ConvDate, int ConversionType_ID, int AD_Client_ID, int AD_Org_ID)
{
if (CurFrom_ID == CurTo_ID)
return Env.ONE;
// Conversion Type
int C_ConversionType_ID = ConversionType_ID;
if (C_ConversionType_ID == 0)
C_ConversionType_ID = MConversionType.getDefault(AD_Client_ID);
// Conversion Date
if (ConvDate == null)
ConvDate = new Timestamp (System.currentTimeMillis());
// Get Rate
String sql = "SELECT MultiplyRate "
+ "FROM C_Conversion_Rate "
+ "WHERE C_Currency_ID=?" // #1
+ " AND C_Currency_To_ID=?" // #2
+ " AND C_ConversionType_ID=?" // #3
+ " AND ? BETWEEN ValidFrom AND ValidTo" // #4 TRUNC (?) ORA-00932: inconsistent datatypes: expected NUMBER got TIMESTAMP
+ " AND AD_Client_ID IN (0,?)" // #5
+ " AND AD_Org_ID IN (0,?) " // #6
+ "ORDER BY AD_Client_ID DESC, AD_Org_ID DESC, ValidFrom DESC";
BigDecimal retValue = null;
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, CurFrom_ID);
pstmt.setInt(2, CurTo_ID);
pstmt.setInt(3, C_ConversionType_ID);
pstmt.setTimestamp(4, ConvDate);
pstmt.setInt(5, AD_Client_ID);
pstmt.setInt(6, AD_Org_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
retValue = rs.getBigDecimal(1);
rs.close();
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
s_log.log(Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
if (retValue == null)
s_log.info ("Not found - CurFrom=" + CurFrom_ID
+ ", CurTo=" + CurTo_ID
+ ", " + ConvDate
+ ", Type=" + ConversionType_ID + (ConversionType_ID==C_ConversionType_ID ? "" : "->" + C_ConversionType_ID)
+ ", Client=" + AD_Client_ID
+ ", Org=" + AD_Org_ID);
return retValue;
} // getRate
/**************************************************************************
* Standard Constructor
* @param ctx context
* @param C_Conversion_Rate_ID id
* @param trxName transaction
*/
public MConversionRate (Ctx ctx, int C_Conversion_Rate_ID, String trxName)
{
super(ctx, C_Conversion_Rate_ID, trxName);
if (C_Conversion_Rate_ID == 0)
{
// setC_Conversion_Rate_ID (0);
// setC_Currency_ID (0);
// setC_Currency_To_ID (0);
super.setDivideRate (Env.ZERO);
super.setMultiplyRate (Env.ZERO);
setValidFrom (new Timestamp(System.currentTimeMillis()));
}
} // MConversionRate
/**
* Load Constructor
* @param ctx context
* @param rs result set
* @param trxName transaction
*/
public MConversionRate (Ctx ctx, ResultSet rs, String trxName)
{
super(ctx, rs, trxName);
} // MConversionRate
/**
* New Constructor
* @param po parent
* @param C_ConversionType_ID conversion type
* @param C_Currency_ID currency
* @param C_Currency_To_ID currency to
* @param MultiplyRate multiply rate
* @param ValidFrom valid from
*/
public MConversionRate (PO po,
int C_ConversionType_ID,
int C_Currency_ID, int C_Currency_To_ID,
BigDecimal MultiplyRate, Timestamp ValidFrom)
{
this (po.getCtx(), 0, po.get_TrxName());
setClientOrg(po);
setC_ConversionType_ID (C_ConversionType_ID);
setC_Currency_ID (C_Currency_ID);
setC_Currency_To_ID (C_Currency_To_ID);
//
setMultiplyRate (MultiplyRate);
setValidFrom(ValidFrom);
} // MConversionRate
/**
* Callout
* @param MultiplyRateOld old value
* @param MultiplyRateNew new value
* @param windowNo windowNo
*/
@UICallout public void setMultiplyRate (String MultiplyRateOld,
String MultiplyRateNew, int windowNo) throws Exception
{
setMultiplyRate(convertToBigDecimal(MultiplyRateNew));
} // setMultiplyRate
/**
* Set Multiply Rate
* Sets also Divide Rate
* @param MultiplyRate multiply rate
*/
@Override
public void setMultiplyRate (BigDecimal MultiplyRate)
{
if (MultiplyRate == null
|| MultiplyRate.signum() == 0
|| MultiplyRate.compareTo(Env.ONE) == 0)
{
super.setDivideRate(Env.ONE);
super.setMultiplyRate(Env.ONE);
}
else
{
super.setMultiplyRate(MultiplyRate);
double dd = 1 / MultiplyRate.doubleValue();
super.setDivideRate(new BigDecimal(dd));
}
} // setMultiplyRate
/**
* Callout
* @param DivideRateOld old value
* @param DivideRateNew new value
* @param windowNo window no
*/
@UICallout public void setDivideRate (String DivideRateOld,
String DivideRateNew, int WindowNo) throws Exception
{
setDivideRate(convertToBigDecimal(DivideRateNew));
} // setDivideRate
/**
* Set Divide Rate.
* Sets also Multiply Rate
* @param DivideRate divide rate
*/
@Override
public void setDivideRate (BigDecimal DivideRate)
{
if (DivideRate == null
|| DivideRate.signum() == 0
|| DivideRate.compareTo(Env.ONE) == 0)
{
super.setDivideRate(Env.ONE);
super.setMultiplyRate(Env.ONE);
}
else
{
super.setDivideRate(DivideRate);
double dd = 1 / DivideRate.doubleValue();
super.setMultiplyRate(new BigDecimal(dd));
}
} // setDivideRate
/**
* String Representation
* @return info
*/
@Override
public String toString()
{
StringBuffer sb = new StringBuffer("MConversionRate[");
sb.append(get_ID())
.append(",Currency=").append(getC_Currency_ID())
.append(",To=").append(getC_Currency_To_ID())
.append(", Multiply=").append(getMultiplyRate())
.append(",Divide=").append(getDivideRate())
.append(", ValidFrom=").append(getValidFrom());
sb.append("]");
return sb.toString();
} // toString
/**
* Before Save.
* - Same Currency
* - Date Range Check
* - Set To date to 2056
* @param newRecord new
* @return true if OK to save
*/
@Override
protected boolean beforeSave (boolean newRecord)
{
// From - To is the same
if (getC_Currency_ID() == getC_Currency_To_ID())
{
log.saveError("Error", Msg.parseTranslation(getCtx(), "@C_Currency_ID@ = @C_Currency_ID@"));
return false;
}
// Nothing to convert
if (getMultiplyRate().compareTo(Env.ZERO) <= 0)
{
log.saveError("Error", Msg.parseTranslation(getCtx(), "@MultiplyRate@ <= 0"));
return false;
}
// Date Range Check
Timestamp from = getValidFrom();
if (getValidTo() == null)
setValidTo (TimeUtil.getDay(2056, 1, 29)); // no exchange rates after my 100th birthday
Timestamp to = getValidTo();
if (to.before(from))
{
SimpleDateFormat df = DisplayType.getDateFormat(DisplayTypeConstants.Date);
log.saveError("Error", df.format(to) + " < " + df.format(from));
return false;
}
return true;
} // beforeSave
} // MConversionRate
The table below shows all metrics for MConversionRate.java.




