1) Implemented DocFactory as extension, this does break backward compatibility as the Doc class now take MAcctSchema instead of MAcctSchema[] as parameter. 2) Refactor the posting control and create financial document from Doc.java to DocManager.java
This commit is contained in:
parent
6d2d70f7af
commit
c321e8feb6
|
@ -38,7 +38,7 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.compiere.acct.Doc;
|
||||
import org.compiere.acct.DocManager;
|
||||
import org.compiere.model.MAcctSchema;
|
||||
import org.compiere.model.MClient;
|
||||
import org.compiere.model.MCost;
|
||||
|
@ -52,7 +52,7 @@ import org.compiere.util.Trx;
|
|||
|
||||
/**
|
||||
* Client Accounting Processor
|
||||
*
|
||||
*
|
||||
* @author Carlos Ruiz
|
||||
*/
|
||||
public class ClientAcctProcessor extends SvrProcess
|
||||
|
@ -68,7 +68,7 @@ public class ClientAcctProcessor extends SvrProcess
|
|||
private MClient m_client = null;
|
||||
/** Accounting Schema */
|
||||
private MAcctSchema[] m_ass = null;
|
||||
|
||||
|
||||
/**
|
||||
* Prepare
|
||||
*/
|
||||
|
@ -97,17 +97,17 @@ public class ClientAcctProcessor extends SvrProcess
|
|||
protected String doIt () throws Exception
|
||||
{
|
||||
log.info("C_AcctSchema_ID=" + p_C_AcctSchema_ID + ", AD_Table_ID=" + p_AD_Table_ID);
|
||||
|
||||
|
||||
if (! MClient.isClientAccounting())
|
||||
throw new AdempiereUserError(Msg.getMsg(getCtx(), "ClientAccountingNotEnabled"));
|
||||
|
||||
m_client = MClient.get(getCtx(), getAD_Client_ID());
|
||||
|
||||
|
||||
if (p_C_AcctSchema_ID == 0)
|
||||
m_ass = MAcctSchema.getClientAcctSchema(getCtx(), getAD_Client_ID());
|
||||
else // only specific accounting schema
|
||||
m_ass = new MAcctSchema[] {new MAcctSchema (getCtx(), p_C_AcctSchema_ID, get_TrxName())};
|
||||
|
||||
|
||||
postSession();
|
||||
MCost.create(m_client);
|
||||
|
||||
|
@ -132,10 +132,10 @@ public class ClientAcctProcessor extends SvrProcess
|
|||
ts = new Timestamp(ms);
|
||||
long mili = ts.getTime();
|
||||
BigDecimal value = new BigDecimal(Long.toString(mili));
|
||||
|
||||
|
||||
//first pass, collect all ts (FR 2962094 - required for weighted average costing)
|
||||
int[] documentsTableID = Doc.getDocumentsTableID();
|
||||
String[] documentsTableName = Doc.getDocumentsTableName();
|
||||
int[] documentsTableID = DocManager.getDocumentsTableID();
|
||||
String[] documentsTableName = DocManager.getDocumentsTableName();
|
||||
for (int i = 0; i < documentsTableID.length; i++)
|
||||
{
|
||||
int AD_Table_ID = documentsTableID[i];
|
||||
|
@ -144,7 +144,7 @@ public class ClientAcctProcessor extends SvrProcess
|
|||
if (p_AD_Table_ID != 0
|
||||
&& p_AD_Table_ID != AD_Table_ID)
|
||||
continue;
|
||||
|
||||
|
||||
StringBuffer sql = new StringBuffer ("SELECT DISTINCT ProcessedOn FROM ").append(TableName)
|
||||
.append(" WHERE AD_Client_ID=? AND ProcessedOn<?")
|
||||
.append(" AND Processed='Y' AND Posted='N' AND IsActive='Y'");
|
||||
|
@ -180,12 +180,12 @@ public class ClientAcctProcessor extends SvrProcess
|
|||
count[i] = 0;
|
||||
countError[i] = 0;
|
||||
}
|
||||
|
||||
|
||||
//sort and post in the processed date order
|
||||
Collections.sort(listProcessedOn);
|
||||
for (BigDecimal processedOn : listProcessedOn)
|
||||
{
|
||||
|
||||
|
||||
for (int i = 0; i < documentsTableID.length; i++)
|
||||
{
|
||||
int AD_Table_ID = documentsTableID[i];
|
||||
|
@ -220,21 +220,11 @@ public class ClientAcctProcessor extends SvrProcess
|
|||
// Run every posting document in own transaction
|
||||
String innerTrxName = Trx.createTrxName("CAP");
|
||||
Trx innerTrx = Trx.get(innerTrxName, true);
|
||||
String postStatus = Doc.STATUS_NotPosted;
|
||||
Doc doc = Doc.get (m_ass, AD_Table_ID, rs, innerTrxName);
|
||||
|
||||
try
|
||||
{
|
||||
if (doc == null)
|
||||
{
|
||||
log.severe(getName() + ": No Doc for " + TableName);
|
||||
ok = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
String error = doc.post(false, false); // post no force/repost
|
||||
ok = (error == null);
|
||||
postStatus = doc.getPostStatus();
|
||||
}
|
||||
String error = DocManager.postDocument(m_ass, AD_Table_ID, rs, false, false, innerTrxName);
|
||||
ok = (error == null);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -243,18 +233,7 @@ public class ClientAcctProcessor extends SvrProcess
|
|||
}
|
||||
finally
|
||||
{
|
||||
if (ok)
|
||||
innerTrx.commit();
|
||||
else {
|
||||
innerTrx.rollback();
|
||||
// save the posted status error (out of trx)
|
||||
StringBuffer sqlupd = new StringBuffer("UPDATE ")
|
||||
.append(doc.get_TableName()).append(" SET Posted='").append(postStatus)
|
||||
.append("',Processing='N' ")
|
||||
.append("WHERE ")
|
||||
.append(doc.get_TableName()).append("_ID=").append(doc.get_ID());
|
||||
DB.executeUpdateEx(sqlupd.toString(), null);
|
||||
}
|
||||
innerTrx.commit();
|
||||
innerTrx.close();
|
||||
innerTrx = null;
|
||||
}
|
||||
|
@ -270,11 +249,11 @@ public class ClientAcctProcessor extends SvrProcess
|
|||
{
|
||||
DB.close(rs, pstmt);
|
||||
}
|
||||
|
||||
|
||||
} // for tableID
|
||||
|
||||
|
||||
} // for processedOn
|
||||
|
||||
|
||||
for (int i = 0; i < documentsTableID.length; i++)
|
||||
{
|
||||
String TableName = documentsTableName[i];
|
||||
|
@ -289,7 +268,7 @@ public class ClientAcctProcessor extends SvrProcess
|
|||
else
|
||||
log.finer(getName() + ": " + TableName + " - no work");
|
||||
}
|
||||
|
||||
|
||||
} // postSession
|
||||
|
||||
} // ClientAcctProcessor
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
<extension-point id="org.compiere.interfaces.Server" name="Server Interface" schema="schema/org.compiere.interfaces.Server.exsd"/>
|
||||
<extension-point id="org.compiere.interfaces.Status" name="Status interface" schema="schema/org.compiere.interfaces.Status.exsd"/>
|
||||
<extension-point id="org.adempiere.base.IModelFactory" name="Model Factory" schema="schema/org.adempiere.base.IModelFactory.exsd"/>
|
||||
<extension-point id="org.adempiere.base.IDocFactory" name="Financial Document Factory" schema="schema/org.adempiere.base.IDocFactory.exsd"/>
|
||||
<extension
|
||||
id="org.adempiere.base.DefaultModelFactory"
|
||||
name="Default model factory"
|
||||
|
@ -19,5 +20,13 @@
|
|||
priority="0">
|
||||
</factory>
|
||||
</extension>
|
||||
<extension
|
||||
point="org.adempiere.base.IDocFactory">
|
||||
<factory
|
||||
class="org.adempiere.base.DefaultDocumentFactory"
|
||||
gaap="*"
|
||||
priority="0">
|
||||
</factory>
|
||||
</extension>
|
||||
|
||||
</plugin>
|
||||
|
|
|
@ -0,0 +1,116 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Schema file written by PDE -->
|
||||
<schema targetNamespace="org.adempiere.base" xmlns="http://www.w3.org/2001/XMLSchema">
|
||||
<annotation>
|
||||
<appinfo>
|
||||
<meta.schema plugin="org.adempiere.base" id="org.adempiere.base.IDocFactory" name="Financial Document Factory"/>
|
||||
</appinfo>
|
||||
<documentation>
|
||||
[Enter description of this extension point.]
|
||||
</documentation>
|
||||
</annotation>
|
||||
|
||||
<element name="extension">
|
||||
<annotation>
|
||||
<appinfo>
|
||||
<meta.element />
|
||||
</appinfo>
|
||||
</annotation>
|
||||
<complexType>
|
||||
<choice>
|
||||
<element ref="factory"/>
|
||||
</choice>
|
||||
<attribute name="point" type="string" use="required">
|
||||
<annotation>
|
||||
<documentation>
|
||||
|
||||
</documentation>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="id" type="string">
|
||||
<annotation>
|
||||
<documentation>
|
||||
|
||||
</documentation>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="name" type="string">
|
||||
<annotation>
|
||||
<documentation>
|
||||
|
||||
</documentation>
|
||||
<appinfo>
|
||||
<meta.attribute translatable="true"/>
|
||||
</appinfo>
|
||||
</annotation>
|
||||
</attribute>
|
||||
</complexType>
|
||||
</element>
|
||||
|
||||
<element name="factory">
|
||||
<complexType>
|
||||
<attribute name="gaap" type="string" use="required">
|
||||
<annotation>
|
||||
<documentation>
|
||||
use * to match everything
|
||||
</documentation>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="priority" type="string">
|
||||
<annotation>
|
||||
<documentation>
|
||||
|
||||
</documentation>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="class" type="string" use="required">
|
||||
<annotation>
|
||||
<documentation>
|
||||
|
||||
</documentation>
|
||||
<appinfo>
|
||||
<meta.attribute kind="java" basedOn=":org.adempiere.base.IDocFactory"/>
|
||||
</appinfo>
|
||||
</annotation>
|
||||
</attribute>
|
||||
</complexType>
|
||||
</element>
|
||||
|
||||
<annotation>
|
||||
<appinfo>
|
||||
<meta.section type="since"/>
|
||||
</appinfo>
|
||||
<documentation>
|
||||
[Enter the first release in which this extension point appears.]
|
||||
</documentation>
|
||||
</annotation>
|
||||
|
||||
<annotation>
|
||||
<appinfo>
|
||||
<meta.section type="examples"/>
|
||||
</appinfo>
|
||||
<documentation>
|
||||
[Enter extension point usage example here.]
|
||||
</documentation>
|
||||
</annotation>
|
||||
|
||||
<annotation>
|
||||
<appinfo>
|
||||
<meta.section type="apiinfo"/>
|
||||
</appinfo>
|
||||
<documentation>
|
||||
[Enter API information here.]
|
||||
</documentation>
|
||||
</annotation>
|
||||
|
||||
<annotation>
|
||||
<appinfo>
|
||||
<meta.section type="implementation"/>
|
||||
</appinfo>
|
||||
<documentation>
|
||||
[Enter information about supplied implementation of this extension point.]
|
||||
</documentation>
|
||||
</annotation>
|
||||
|
||||
|
||||
</schema>
|
|
@ -56,7 +56,7 @@
|
|||
</documentation>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="class" type="string">
|
||||
<attribute name="class" type="string" use="required">
|
||||
<annotation>
|
||||
<documentation>
|
||||
|
||||
|
|
|
@ -0,0 +1,149 @@
|
|||
/******************************************************************************
|
||||
* Product: Adempiere ERP & CRM Smart Business Solution *
|
||||
* Copyright (C) 2010 Heng Sin Low *
|
||||
* 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. *
|
||||
*****************************************************************************/
|
||||
package org.adempiere.base;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.compiere.acct.Doc;
|
||||
import org.compiere.model.MAcctSchema;
|
||||
import org.compiere.model.MTable;
|
||||
import org.compiere.util.AdempiereUserError;
|
||||
import org.compiere.util.CLogger;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Env;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class DefaultDocumentFactory implements IDocFactory {
|
||||
|
||||
private final static CLogger s_log = CLogger.getCLogger(DefaultDocumentFactory.class);
|
||||
|
||||
@Override
|
||||
public Doc getDocument(MAcctSchema as, int AD_Table_ID, int Record_ID,
|
||||
String trxName) {
|
||||
String tableName = MTable.getTableName(Env.getCtx(), AD_Table_ID);
|
||||
//
|
||||
Doc doc = null;
|
||||
StringBuffer sql = new StringBuffer("SELECT * FROM ")
|
||||
.append(tableName)
|
||||
.append(" WHERE ").append(tableName).append("_ID=? AND Processed='Y'");
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
try
|
||||
{
|
||||
pstmt = DB.prepareStatement (sql.toString(), trxName);
|
||||
pstmt.setInt (1, Record_ID);
|
||||
rs = pstmt.executeQuery ();
|
||||
if (rs.next ())
|
||||
{
|
||||
doc = getDocument(as, AD_Table_ID, rs, trxName);
|
||||
}
|
||||
else
|
||||
s_log.severe("Not Found: " + tableName + "_ID=" + Record_ID);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
s_log.log (Level.SEVERE, sql.toString(), e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
DB.close(rs, pstmt);
|
||||
rs = null;
|
||||
pstmt = null;
|
||||
}
|
||||
return doc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Doc getDocument(MAcctSchema as, int AD_Table_ID, ResultSet rs,
|
||||
String trxName) {
|
||||
Doc doc = null;
|
||||
|
||||
/* Classname of the Doc class follows this convention:
|
||||
* if the prefix (letters before the first underscore _) is 1 character, then the class is Doc_TableWithoutPrefixWithoutUnderscores
|
||||
* otherwise Doc_WholeTableWithoutUnderscores
|
||||
* i.e. following this query
|
||||
SELECT t.ad_table_id, tablename,
|
||||
CASE
|
||||
WHEN instr(tablename, '_') = 2
|
||||
THEN 'Doc_' || substr(tablename, 3)
|
||||
WHEN instr(tablename, '_') > 2
|
||||
THEN 'Doc_' ||
|
||||
ELSE ''
|
||||
REPLACE
|
||||
(
|
||||
tablename, '_', ''
|
||||
)
|
||||
END AS classname
|
||||
FROM ad_table t, ad_column C
|
||||
WHERE t.ad_table_id = C.ad_table_id AND
|
||||
C.columnname = 'Posted' AND
|
||||
isview = 'N'
|
||||
ORDER BY 1
|
||||
* This is:
|
||||
* 224 GL_Journal Doc_GLJournal
|
||||
* 259 C_Order Doc_Order
|
||||
* 318 C_Invoice Doc_Invoice
|
||||
* 319 M_InOut Doc_InOut
|
||||
* 321 M_Inventory Doc_Inventory
|
||||
* 323 M_Movement Doc_Movement
|
||||
* 325 M_Production Doc_Production
|
||||
* 335 C_Payment Doc_Payment
|
||||
* 392 C_BankStatement Doc_BankStatement
|
||||
* 407 C_Cash Doc_Cash
|
||||
* 472 M_MatchInv Doc_MatchInv
|
||||
* 473 M_MatchPO Doc_MatchPO
|
||||
* 623 C_ProjectIssue Doc_ProjectIssue
|
||||
* 702 M_Requisition Doc_Requisition
|
||||
* 735 C_AllocationHdr Doc_AllocationHdr
|
||||
* 53027 PP_Order Doc_PPOrder
|
||||
* 53035 PP_Cost_Collector Doc_PPCostCollector
|
||||
* 53037 DD_Order Doc_DDOrder
|
||||
* 53092 HR_Process Doc_HRProcess
|
||||
*/
|
||||
|
||||
String tableName = MTable.getTableName(Env.getCtx(), AD_Table_ID);
|
||||
String packageName = "org.compiere.acct";
|
||||
String className = null;
|
||||
|
||||
int firstUnderscore = tableName.indexOf("_");
|
||||
if (firstUnderscore == 1)
|
||||
className = packageName + ".Doc_" + tableName.substring(2).replaceAll("_", "");
|
||||
else
|
||||
className = packageName + ".Doc_" + tableName.replaceAll("_", "");
|
||||
|
||||
try
|
||||
{
|
||||
Class<?> cClass = Class.forName(className);
|
||||
Constructor<?> cnstr = cClass.getConstructor(new Class[] {MAcctSchema.class, ResultSet.class, String.class});
|
||||
doc = (Doc) cnstr.newInstance(as, rs, trxName);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
s_log.log(Level.SEVERE, "Doc Class invalid: " + className + " (" + e.toString() + ")");
|
||||
throw new AdempiereUserError("Doc Class invalid: " + className + " (" + e.toString() + ")");
|
||||
}
|
||||
|
||||
if (doc == null)
|
||||
s_log.log(Level.SEVERE, "Unknown AD_Table_ID=" + AD_Table_ID);
|
||||
return doc;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
/******************************************************************************
|
||||
* Product: Adempiere ERP & CRM Smart Business Solution *
|
||||
* Copyright (C) 2010 Heng Sin Low *
|
||||
* 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. *
|
||||
*****************************************************************************/
|
||||
package org.adempiere.base;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
|
||||
import org.compiere.acct.Doc;
|
||||
import org.compiere.model.MAcctSchema;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public interface IDocFactory {
|
||||
/**
|
||||
* Create Posting document
|
||||
* @param as accounting schema
|
||||
* @param AD_Table_ID Table ID of Documents
|
||||
* @param Record_ID record ID to load
|
||||
* @param trxName transaction name
|
||||
* @return Document or null
|
||||
*/
|
||||
public Doc getDocument(MAcctSchema as, int AD_Table_ID, int Record_ID, String trxName);
|
||||
|
||||
/**
|
||||
* Create Posting document
|
||||
* @param as accounting schema
|
||||
* @param AD_Table_ID Table ID of Documents
|
||||
* @param rs ResultSet
|
||||
* @param trxName transaction name
|
||||
* @return Document
|
||||
*/
|
||||
public Doc getDocument(MAcctSchema as, int AD_Table_ID, ResultSet rs, String trxName);
|
||||
}
|
|
@ -28,14 +28,12 @@ import java.util.Iterator;
|
|||
import java.util.Properties;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.adempiere.exceptions.DBException;
|
||||
import org.compiere.model.MAccount;
|
||||
import org.compiere.model.MAcctSchema;
|
||||
import org.compiere.model.MConversionRate;
|
||||
import org.compiere.model.MDocType;
|
||||
import org.compiere.model.MNote;
|
||||
import org.compiere.model.MPeriod;
|
||||
import org.compiere.model.MTable;
|
||||
import org.compiere.model.ModelValidationEngine;
|
||||
import org.compiere.model.ModelValidator;
|
||||
import org.compiere.model.PO;
|
||||
|
@ -74,7 +72,7 @@ import org.compiere.util.Trx;
|
|||
*
|
||||
* M_Production: MMP
|
||||
* Doc_Production 325 - DocType fixed
|
||||
*
|
||||
*
|
||||
* M_Production: MMO
|
||||
* Doc_CostCollector 330 - DocType fixed
|
||||
*
|
||||
|
@ -98,22 +96,16 @@ import org.compiere.util.Trx;
|
|||
*
|
||||
* Project Issue PJI
|
||||
* C_ProjectIssue 623 - DocType fixed
|
||||
*
|
||||
*
|
||||
* </pre>
|
||||
* @author Jorg Janke
|
||||
* @author victor.perez@e-evolution.com, e-Evolution http://www.e-evolution.com
|
||||
* <li>FR [ 2520591 ] Support multiples calendar for Org
|
||||
* @see http://sourceforge.net/tracker2/?func=detail&atid=879335&aid=2520591&group_id=176962
|
||||
* <li>FR [ 2520591 ] Support multiples calendar for Org
|
||||
* @see http://sourceforge.net/tracker2/?func=detail&atid=879335&aid=2520591&group_id=176962
|
||||
* @version $Id: Doc.java,v 1.6 2006/07/30 00:53:33 jjanke Exp $
|
||||
*/
|
||||
public abstract class Doc
|
||||
{
|
||||
/** AD_Table_ID's of documents */
|
||||
private static int[] documentsTableID = null;
|
||||
|
||||
/** Table Names of documents */
|
||||
private static String[] documentsTableName = null;
|
||||
|
||||
/**************************************************************************
|
||||
* Document Types
|
||||
* --------------
|
||||
|
@ -175,7 +167,7 @@ public abstract class Doc
|
|||
/** Purchase Requisition */
|
||||
public static final String DOCTYPE_PurchaseRequisition = "POR";
|
||||
|
||||
|
||||
|
||||
// Posting Status - AD_Reference_ID=234 //
|
||||
/** Document Status */
|
||||
public static final String STATUS_NotPosted = "N";
|
||||
|
@ -194,144 +186,32 @@ public abstract class Doc
|
|||
/** Document Status */
|
||||
public static final String STATUS_Error = "E";
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Create Posting document
|
||||
* @param ass accounting schema
|
||||
* @param as accounting schema
|
||||
* @param AD_Table_ID Table ID of Documents
|
||||
* @param Record_ID record ID to load
|
||||
* @param trxName transaction name
|
||||
* @return Document or null
|
||||
*/
|
||||
public static Doc get (MAcctSchema[] ass, int AD_Table_ID, int Record_ID, String trxName)
|
||||
public static Doc get (MAcctSchema as, int AD_Table_ID, int Record_ID, String trxName)
|
||||
{
|
||||
String TableName = null;
|
||||
for (int i = 0; i < getDocumentsTableID().length; i++)
|
||||
{
|
||||
if (getDocumentsTableID()[i] == AD_Table_ID)
|
||||
{
|
||||
TableName = getDocumentsTableName()[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (TableName == null)
|
||||
{
|
||||
s_log.severe("Not found AD_Table_ID=" + AD_Table_ID);
|
||||
return null;
|
||||
}
|
||||
//
|
||||
Doc doc = null;
|
||||
StringBuffer sql = new StringBuffer("SELECT * FROM ")
|
||||
.append(TableName)
|
||||
.append(" WHERE ").append(TableName).append("_ID=? AND Processed='Y'");
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
try
|
||||
{
|
||||
pstmt = DB.prepareStatement (sql.toString(), trxName);
|
||||
pstmt.setInt (1, Record_ID);
|
||||
rs = pstmt.executeQuery ();
|
||||
if (rs.next ())
|
||||
{
|
||||
doc = get (ass, AD_Table_ID, rs, trxName);
|
||||
}
|
||||
else
|
||||
s_log.severe("Not Found: " + TableName + "_ID=" + Record_ID);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
s_log.log (Level.SEVERE, sql.toString(), e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
DB.close(rs, pstmt);
|
||||
rs = null;
|
||||
pstmt = null;
|
||||
}
|
||||
return doc;
|
||||
return DocManager.getDocument(as, AD_Table_ID, Record_ID, trxName);
|
||||
} // get
|
||||
|
||||
|
||||
/**
|
||||
* Create Posting document
|
||||
* @param ass accounting schema
|
||||
* @param as accounting schema
|
||||
* @param AD_Table_ID Table ID of Documents
|
||||
* @param rs ResultSet
|
||||
* @param trxName transaction name
|
||||
* @return Document
|
||||
* @throws AdempiereUserError
|
||||
* @throws AdempiereUserError
|
||||
*/
|
||||
public static Doc get (MAcctSchema[] ass, int AD_Table_ID, ResultSet rs, String trxName) throws AdempiereUserError
|
||||
public static Doc get (MAcctSchema as, int AD_Table_ID, ResultSet rs, String trxName)
|
||||
{
|
||||
Doc doc = null;
|
||||
|
||||
/* Classname of the Doc class follows this convention:
|
||||
* if the prefix (letters before the first underscore _) is 1 character, then the class is Doc_TableWithoutPrefixWithoutUnderscores
|
||||
* otherwise Doc_WholeTableWithoutUnderscores
|
||||
* i.e. following this query
|
||||
SELECT t.ad_table_id, tablename,
|
||||
CASE
|
||||
WHEN instr(tablename, '_') = 2
|
||||
THEN 'Doc_' || substr(tablename, 3)
|
||||
WHEN instr(tablename, '_') > 2
|
||||
THEN 'Doc_' ||
|
||||
ELSE ''
|
||||
REPLACE
|
||||
(
|
||||
tablename, '_', ''
|
||||
)
|
||||
END AS classname
|
||||
FROM ad_table t, ad_column C
|
||||
WHERE t.ad_table_id = C.ad_table_id AND
|
||||
C.columnname = 'Posted' AND
|
||||
isview = 'N'
|
||||
ORDER BY 1
|
||||
* This is:
|
||||
* 224 GL_Journal Doc_GLJournal
|
||||
* 259 C_Order Doc_Order
|
||||
* 318 C_Invoice Doc_Invoice
|
||||
* 319 M_InOut Doc_InOut
|
||||
* 321 M_Inventory Doc_Inventory
|
||||
* 323 M_Movement Doc_Movement
|
||||
* 325 M_Production Doc_Production
|
||||
* 335 C_Payment Doc_Payment
|
||||
* 392 C_BankStatement Doc_BankStatement
|
||||
* 407 C_Cash Doc_Cash
|
||||
* 472 M_MatchInv Doc_MatchInv
|
||||
* 473 M_MatchPO Doc_MatchPO
|
||||
* 623 C_ProjectIssue Doc_ProjectIssue
|
||||
* 702 M_Requisition Doc_Requisition
|
||||
* 735 C_AllocationHdr Doc_AllocationHdr
|
||||
* 53027 PP_Order Doc_PPOrder
|
||||
* 53035 PP_Cost_Collector Doc_PPCostCollector
|
||||
* 53037 DD_Order Doc_DDOrder
|
||||
* 53092 HR_Process Doc_HRProcess
|
||||
*/
|
||||
|
||||
String tableName = MTable.getTableName(Env.getCtx(), AD_Table_ID);
|
||||
String packageName = "org.compiere.acct";
|
||||
String className = null;
|
||||
|
||||
int firstUnderscore = tableName.indexOf("_");
|
||||
if (firstUnderscore == 1)
|
||||
className = packageName + ".Doc_" + tableName.substring(2).replaceAll("_", "");
|
||||
else
|
||||
className = packageName + ".Doc_" + tableName.replaceAll("_", "");
|
||||
|
||||
try
|
||||
{
|
||||
Class<?> cClass = Class.forName(className);
|
||||
Constructor<?> cnstr = cClass.getConstructor(new Class[] {MAcctSchema[].class, ResultSet.class, String.class});
|
||||
doc = (Doc) cnstr.newInstance(ass, rs, trxName);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
s_log.log(Level.SEVERE, "Doc Class invalid: " + className + " (" + e.toString() + ")");
|
||||
throw new AdempiereUserError("Doc Class invalid: " + className + " (" + e.toString() + ")");
|
||||
}
|
||||
|
||||
if (doc == null)
|
||||
s_log.log(Level.SEVERE, "Unknown AD_Table_ID=" + AD_Table_ID);
|
||||
return doc;
|
||||
return DocManager.getDocument(as, AD_Table_ID, rs, trxName);
|
||||
} // get
|
||||
|
||||
/**
|
||||
|
@ -343,13 +223,10 @@ public abstract class Doc
|
|||
* @param trxName transaction
|
||||
* @return null if the document was posted or error message
|
||||
*/
|
||||
public static String postImmediate (MAcctSchema[] ass,
|
||||
public static String postImmediate (MAcctSchema[] ass,
|
||||
int AD_Table_ID, int Record_ID, boolean force, String trxName)
|
||||
{
|
||||
Doc doc = get (ass, AD_Table_ID, Record_ID, trxName);
|
||||
if (doc != null)
|
||||
return doc.post (force, true); // repost
|
||||
return "NoDoc";
|
||||
return DocManager.postDocument(ass, AD_Table_ID, Record_ID, force, true, trxName);
|
||||
} // post
|
||||
|
||||
/** Static Log */
|
||||
|
@ -357,25 +234,25 @@ public abstract class Doc
|
|||
/** Log per Document */
|
||||
protected CLogger log = CLogger.getCLogger(getClass());
|
||||
|
||||
/* If the transaction must be managed locally (false if it's managed externally by the caller) */
|
||||
/* If the transaction must be managed locally (false if it's managed externally by the caller) */
|
||||
private boolean m_manageLocalTrx;
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param clazz Document Class
|
||||
* @param rs result set
|
||||
* @param defaultDocumentType default document type or null
|
||||
* @param trxName trx
|
||||
*/
|
||||
Doc (MAcctSchema[] ass, Class<?> clazz, ResultSet rs, String defaultDocumentType, String trxName)
|
||||
Doc (MAcctSchema as, Class<?> clazz, ResultSet rs, String defaultDocumentType, String trxName)
|
||||
{
|
||||
p_Status = STATUS_Error;
|
||||
m_ass = ass;
|
||||
m_ctx = new Properties(m_ass[0].getCtx());
|
||||
m_ctx.setProperty("#AD_Client_ID", String.valueOf(m_ass[0].getAD_Client_ID()));
|
||||
|
||||
m_as = as;
|
||||
m_ctx = new Properties(m_as.getCtx());
|
||||
m_ctx.setProperty("#AD_Client_ID", String.valueOf(m_as.getAD_Client_ID()));
|
||||
|
||||
String className = clazz.getName();
|
||||
className = className.substring(className.lastIndexOf('.')+1);
|
||||
try
|
||||
|
@ -389,31 +266,32 @@ public abstract class Doc
|
|||
log.severe(msg);
|
||||
throw new IllegalArgumentException(msg);
|
||||
}
|
||||
|
||||
|
||||
// DocStatus
|
||||
int index = p_po.get_ColumnIndex("DocStatus");
|
||||
if (index != -1)
|
||||
m_DocStatus = (String)p_po.get_Value(index);
|
||||
|
||||
|
||||
// Document Type
|
||||
setDocumentType (defaultDocumentType);
|
||||
m_trxName = trxName;
|
||||
m_manageLocalTrx = false;
|
||||
if (m_trxName == null) {
|
||||
if (m_trxName == null)
|
||||
{
|
||||
m_trxName = "Post" + m_DocumentType + p_po.get_ID();
|
||||
m_manageLocalTrx = true;
|
||||
}
|
||||
p_po.set_TrxName(m_trxName);
|
||||
|
||||
// Amounts
|
||||
m_Amounts[0] = Env.ZERO;
|
||||
m_Amounts[1] = Env.ZERO;
|
||||
m_Amounts[2] = Env.ZERO;
|
||||
m_Amounts[3] = Env.ZERO;
|
||||
for(int i = 0; i < m_Amounts.length; i++)
|
||||
{
|
||||
m_Amounts[i] = Env.ZERO;
|
||||
}
|
||||
} // Doc
|
||||
|
||||
/** Accounting Schema Array */
|
||||
private MAcctSchema[] m_ass = null;
|
||||
/** Accounting Schema */
|
||||
private MAcctSchema m_as = null;
|
||||
/** Properties */
|
||||
private Properties m_ctx = null;
|
||||
/** Transaction Name */
|
||||
|
@ -467,7 +345,7 @@ public abstract class Doc
|
|||
|
||||
/** No Currency in Document Indicator (-1) */
|
||||
protected static final int NO_CURRENCY = -2;
|
||||
|
||||
|
||||
/** Actual Document Status */
|
||||
protected String p_Status = null;
|
||||
public String getPostStatus() {
|
||||
|
@ -476,8 +354,8 @@ public abstract class Doc
|
|||
|
||||
/** Error Message */
|
||||
protected String p_Error = null;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get Context
|
||||
* @return context
|
||||
|
@ -495,7 +373,7 @@ public abstract class Doc
|
|||
{
|
||||
return p_po.get_TableName();
|
||||
} // get_TableName
|
||||
|
||||
|
||||
/**
|
||||
* Get Table ID
|
||||
* @return table id
|
||||
|
@ -513,16 +391,16 @@ public abstract class Doc
|
|||
{
|
||||
return p_po.get_ID();
|
||||
} // get_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get Persistent Object
|
||||
* @return po
|
||||
*/
|
||||
protected PO getPO()
|
||||
public PO getPO()
|
||||
{
|
||||
return p_po;
|
||||
} // getPO
|
||||
|
||||
|
||||
/**
|
||||
* Post Document.
|
||||
* <pre>
|
||||
|
@ -550,14 +428,14 @@ public abstract class Doc
|
|||
else
|
||||
return "Invalid DocStatus='" + m_DocStatus + "' for DocumentNo=" + getDocumentNo();
|
||||
//
|
||||
if (p_po.getAD_Client_ID() != m_ass[0].getAD_Client_ID())
|
||||
if (p_po.getAD_Client_ID() != m_as.getAD_Client_ID())
|
||||
{
|
||||
String error = "AD_Client_ID Conflict - Document=" + p_po.getAD_Client_ID()
|
||||
+ ", AcctSchema=" + m_ass[0].getAD_Client_ID();
|
||||
+ ", AcctSchema=" + m_as.getAD_Client_ID();
|
||||
log.severe(error);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
// Lock Record ----
|
||||
String trxName = null; // outside trx if on server
|
||||
if (! m_manageLocalTrx)
|
||||
|
@ -574,13 +452,13 @@ public abstract class Doc
|
|||
log.info("Locked: " + get_TableName() + "_ID=" + get_ID());
|
||||
else
|
||||
{
|
||||
log.log(Level.SEVERE, "Resubmit - Cannot lock " + get_TableName() + "_ID="
|
||||
log.log(Level.SEVERE, "Resubmit - Cannot lock " + get_TableName() + "_ID="
|
||||
+ get_ID() + ", Force=" + force + ",RePost=" + repost);
|
||||
if (force)
|
||||
return "Cannot Lock - ReSubmit";
|
||||
return "Cannot Lock - ReSubmit or RePost with Force";
|
||||
}
|
||||
|
||||
|
||||
p_Error = loadDocumentDetails();
|
||||
if (p_Error != null)
|
||||
return p_Error;
|
||||
|
@ -606,43 +484,36 @@ public abstract class Doc
|
|||
trx.commit(); trx.close();
|
||||
return "AlreadyPosted";
|
||||
}
|
||||
|
||||
|
||||
p_Status = STATUS_NotPosted;
|
||||
|
||||
// Create Fact per AcctSchema
|
||||
m_fact = new ArrayList<Fact>();
|
||||
|
||||
// for all Accounting Schema
|
||||
boolean OK = true;
|
||||
getPO().setDoc(this);
|
||||
try
|
||||
{
|
||||
for (int i = 0; OK && i < m_ass.length; i++)
|
||||
// if acct schema has "only" org, skip
|
||||
boolean skip = false;
|
||||
if (m_as.getAD_OrgOnly_ID() != 0)
|
||||
{
|
||||
// if acct schema has "only" org, skip
|
||||
boolean skip = false;
|
||||
if (m_ass[i].getAD_OrgOnly_ID() != 0)
|
||||
// Header Level Org
|
||||
skip = m_as.isSkipOrg(getAD_Org_ID());
|
||||
// Line Level Org
|
||||
if (p_lines != null)
|
||||
{
|
||||
// Header Level Org
|
||||
skip = m_ass[i].isSkipOrg(getAD_Org_ID());
|
||||
// Line Level Org
|
||||
if (p_lines != null)
|
||||
for (int line = 0; skip && line < p_lines.length; line++)
|
||||
{
|
||||
for (int line = 0; skip && line < p_lines.length; line++)
|
||||
{
|
||||
skip = m_ass[i].isSkipOrg(p_lines[line].getAD_Org_ID());
|
||||
if (!skip)
|
||||
break;
|
||||
}
|
||||
skip = m_as.isSkipOrg(p_lines[line].getAD_Org_ID());
|
||||
if (!skip)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (skip)
|
||||
continue;
|
||||
}
|
||||
if (!skip)
|
||||
{
|
||||
// post
|
||||
log.info("(" + i + ") " + p_po);
|
||||
p_Status = postLogic (i);
|
||||
if (!p_Status.equals(STATUS_Posted))
|
||||
OK = false;
|
||||
p_Status = postLogic ();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -650,39 +521,36 @@ public abstract class Doc
|
|||
log.log(Level.SEVERE, "", e);
|
||||
p_Status = STATUS_Error;
|
||||
p_Error = e.toString();
|
||||
OK = false;
|
||||
}
|
||||
|
||||
String validatorMsg = null;
|
||||
// Call validator on before post
|
||||
if (p_Status.equals(STATUS_Posted)) {
|
||||
if (!p_Status.equals(STATUS_Error)) {
|
||||
validatorMsg = ModelValidationEngine.get().fireDocValidate(getPO(), ModelValidator.TIMING_BEFORE_POST);
|
||||
if (validatorMsg != null) {
|
||||
p_Status = STATUS_Error;
|
||||
p_Error = validatorMsg;
|
||||
OK = false;
|
||||
}
|
||||
}
|
||||
|
||||
// commitFact
|
||||
p_Status = postCommit (p_Status);
|
||||
|
||||
if (p_Status.equals(STATUS_Posted)) {
|
||||
if (!p_Status.equals(STATUS_Error)) {
|
||||
validatorMsg = ModelValidationEngine.get().fireDocValidate(getPO(), ModelValidator.TIMING_AFTER_POST);
|
||||
if (validatorMsg != null) {
|
||||
p_Status = STATUS_Error;
|
||||
p_Error = validatorMsg;
|
||||
OK = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Create Note
|
||||
if (!p_Status.equals(STATUS_Posted))
|
||||
{
|
||||
// Insert Note
|
||||
String AD_MessageValue = "PostingError-" + p_Status;
|
||||
int AD_User_ID = p_po.getUpdatedBy();
|
||||
MNote note = new MNote (getCtx(), AD_MessageValue, AD_User_ID,
|
||||
MNote note = new MNote (getCtx(), AD_MessageValue, AD_User_ID,
|
||||
getAD_Client_ID(), getAD_Org_ID(), null);
|
||||
note.setRecord(p_po.get_Table_ID(), p_po.get_ID());
|
||||
// Reference
|
||||
|
@ -699,7 +567,8 @@ public abstract class Doc
|
|||
.append(", Amount=").append(getAmount())
|
||||
.append(", Sta=").append(p_Status)
|
||||
.append(" - PeriodOpen=").append(isPeriodOpen())
|
||||
.append(", Balanced=").append(isBalanced());
|
||||
.append(", Balanced=").append(isBalanced())
|
||||
.append(", Schema=").append(m_as.getName());
|
||||
note.setTextMsg(Text.toString());
|
||||
note.save();
|
||||
p_Error = Text.toString();
|
||||
|
@ -723,11 +592,12 @@ public abstract class Doc
|
|||
* Delete Accounting
|
||||
* @return number of records
|
||||
*/
|
||||
private int deleteAcct()
|
||||
protected int deleteAcct()
|
||||
{
|
||||
StringBuffer sql = new StringBuffer ("DELETE Fact_Acct WHERE AD_Table_ID=")
|
||||
.append(get_Table_ID())
|
||||
.append(" AND Record_ID=").append(p_po.get_ID());
|
||||
.append(" AND Record_ID=").append(p_po.get_ID())
|
||||
.append(" AND C_AcctSchema_ID=").append(m_as.getC_AcctSchema_ID());
|
||||
int no = DB.executeUpdate(sql.toString(), getTrxName());
|
||||
if (no != 0)
|
||||
log.info("deleted=" + no);
|
||||
|
@ -736,19 +606,16 @@ public abstract class Doc
|
|||
|
||||
/**
|
||||
* Posting logic for Accounting Schema index
|
||||
* @param index Accounting Schema index
|
||||
* @return posting status/error code
|
||||
*/
|
||||
private final String postLogic (int index)
|
||||
private final String postLogic ()
|
||||
{
|
||||
log.info("(" + index + ") " + p_po);
|
||||
|
||||
// rejectUnbalanced
|
||||
if (!m_ass[index].isSuspenseBalancing() && !isBalanced())
|
||||
if (!m_as.isSuspenseBalancing() && !isBalanced())
|
||||
return STATUS_NotBalanced;
|
||||
|
||||
// rejectUnconvertible
|
||||
if (!isConvertible(m_ass[index]))
|
||||
if (!isConvertible(m_as))
|
||||
return STATUS_NotConvertible;
|
||||
|
||||
// rejectPeriodClosed
|
||||
|
@ -756,17 +623,17 @@ public abstract class Doc
|
|||
return STATUS_PeriodClosed;
|
||||
|
||||
// createFacts
|
||||
ArrayList<Fact> facts = createFacts (m_ass[index]);
|
||||
ArrayList<Fact> facts = createFacts (m_as);
|
||||
if (facts == null)
|
||||
return STATUS_Error;
|
||||
|
||||
|
||||
// call modelValidator
|
||||
String validatorMsg = ModelValidationEngine.get().fireFactsValidate(m_ass[index], facts, getPO());
|
||||
String validatorMsg = ModelValidationEngine.get().fireFactsValidate(m_as, facts, getPO());
|
||||
if (validatorMsg != null) {
|
||||
p_Error = validatorMsg;
|
||||
return STATUS_Error;
|
||||
}
|
||||
|
||||
|
||||
for (int f = 0; f < facts.size(); f++)
|
||||
{
|
||||
Fact fact = facts.get(f);
|
||||
|
@ -779,11 +646,11 @@ public abstract class Doc
|
|||
// check accounts
|
||||
if (!fact.checkAccounts())
|
||||
return STATUS_InvalidAccount;
|
||||
|
||||
|
||||
// distribute
|
||||
if (!fact.distribute())
|
||||
return STATUS_Error;
|
||||
|
||||
|
||||
// balanceSource
|
||||
if (!fact.isSourceBalanced())
|
||||
{
|
||||
|
@ -807,9 +674,9 @@ public abstract class Doc
|
|||
if (!fact.isAcctBalanced())
|
||||
return STATUS_NotBalanced;
|
||||
}
|
||||
|
||||
|
||||
} // for all facts
|
||||
|
||||
|
||||
return STATUS_Posted;
|
||||
} // postLogic
|
||||
|
||||
|
@ -821,7 +688,7 @@ public abstract class Doc
|
|||
*/
|
||||
private final String postCommit (String status)
|
||||
{
|
||||
log.info("Sta=" + status + " DT=" + getDocumentType()
|
||||
log.info("Sta=" + status + " DT=" + getDocumentType()
|
||||
+ " ID=" + p_po.get_ID());
|
||||
p_Status = status;
|
||||
|
||||
|
@ -851,17 +718,9 @@ public abstract class Doc
|
|||
}
|
||||
}
|
||||
}
|
||||
// Commit Doc
|
||||
if (!save(getTrxName())) // contains unlock & document status update
|
||||
{
|
||||
log.log(Level.SEVERE, "(doc not saved) ... rolling back");
|
||||
if (m_manageLocalTrx) {
|
||||
trx.rollback();
|
||||
trx.close();
|
||||
}
|
||||
unlock();
|
||||
return STATUS_Error;
|
||||
}
|
||||
|
||||
unlock();
|
||||
|
||||
// Success
|
||||
if (m_manageLocalTrx) {
|
||||
trx.commit(true);
|
||||
|
@ -899,7 +758,7 @@ public abstract class Doc
|
|||
{
|
||||
return m_trxName;
|
||||
} // getTrxName
|
||||
|
||||
|
||||
/**
|
||||
* Unlock Document
|
||||
*/
|
||||
|
@ -960,13 +819,13 @@ public abstract class Doc
|
|||
finally
|
||||
{
|
||||
DB.close(rsDT, pstmt);
|
||||
rsDT = null;
|
||||
rsDT = null;
|
||||
pstmt = null;
|
||||
}
|
||||
}
|
||||
if (m_DocumentType == null)
|
||||
{
|
||||
log.log(Level.SEVERE, "No DocBaseType for C_DocType_ID="
|
||||
log.log(Level.SEVERE, "No DocBaseType for C_DocType_ID="
|
||||
+ getC_DocType_ID() + ", DocumentNo=" + getDocumentNo());
|
||||
}
|
||||
|
||||
|
@ -1021,7 +880,7 @@ public abstract class Doc
|
|||
throw new IllegalStateException("Document Type not found");
|
||||
} // setDocumentType
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Is the Source Document Balanced
|
||||
* @return true if (source) balanced
|
||||
|
@ -1109,7 +968,7 @@ public abstract class Doc
|
|||
{
|
||||
if (m_period != null)
|
||||
return;
|
||||
|
||||
|
||||
// Period defined in GL Journal (e.g. adjustment period)
|
||||
int index = p_po.get_ColumnIndex("C_Period_ID");
|
||||
if (index != -1)
|
||||
|
@ -1121,13 +980,13 @@ public abstract class Doc
|
|||
if (m_period == null)
|
||||
m_period = MPeriod.get(getCtx(), getDateAcct(), getAD_Org_ID());
|
||||
// Is Period Open?
|
||||
if (m_period != null
|
||||
if (m_period != null
|
||||
&& m_period.isOpen(getDocumentType(), getDateAcct()))
|
||||
m_C_Period_ID = m_period.getC_Period_ID();
|
||||
else
|
||||
m_C_Period_ID = -1;
|
||||
//
|
||||
log.fine( // + AD_Client_ID + " - "
|
||||
log.fine( // + AD_Client_ID + " - "
|
||||
getDateAcct() + " - " + getDocumentType() + " => " + m_C_Period_ID);
|
||||
} // setC_Period_ID
|
||||
|
||||
|
@ -1234,7 +1093,7 @@ public abstract class Doc
|
|||
}
|
||||
return m_qty;
|
||||
} // getQty
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/** Account Type - Invoice - Charge */
|
||||
|
@ -1372,7 +1231,7 @@ public abstract class Doc
|
|||
sql = "SELECT B_PaymentSelect_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=? AND C_AcctSchema_ID=?";
|
||||
para_1 = getC_BankAccount_ID();
|
||||
}
|
||||
|
||||
|
||||
/** Account Type - Allocation */
|
||||
else if (AcctType == ACCTTYPE_DiscountExp)
|
||||
{
|
||||
|
@ -1545,25 +1404,6 @@ public abstract class Doc
|
|||
return acct;
|
||||
} // getAccount
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Save to Disk - set posted flag
|
||||
* @param trxName transaction name
|
||||
* @return true if saved
|
||||
*/
|
||||
private final boolean save (String trxName)
|
||||
{
|
||||
log.fine(toString() + "->" + p_Status);
|
||||
|
||||
StringBuffer sql = new StringBuffer("UPDATE ");
|
||||
sql.append(get_TableName()).append(" SET Posted='").append(p_Status)
|
||||
.append("',Processing='N' ")
|
||||
.append("WHERE ")
|
||||
.append(get_TableName()).append("_ID=").append(p_po.get_ID());
|
||||
int no = DB.executeUpdate(sql.toString(), trxName);
|
||||
return no == 1;
|
||||
} // save
|
||||
|
||||
/**
|
||||
* Get DocLine with ID
|
||||
* @param Record_ID Record ID
|
||||
|
@ -1591,7 +1431,7 @@ public abstract class Doc
|
|||
return p_po.toString();
|
||||
} // toString
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get AD_Client_ID
|
||||
* @return client
|
||||
|
@ -1600,7 +1440,7 @@ public abstract class Doc
|
|||
{
|
||||
return p_po.getAD_Client_ID();
|
||||
} // getAD_Client_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get AD_Org_ID
|
||||
* @return org
|
||||
|
@ -1626,7 +1466,7 @@ public abstract class Doc
|
|||
m_DocumentNo = (String)p_po.get_Value(index);
|
||||
return m_DocumentNo;
|
||||
} // getDocumentNo
|
||||
|
||||
|
||||
/**
|
||||
* Get Description
|
||||
* @return Description
|
||||
|
@ -1643,7 +1483,7 @@ public abstract class Doc
|
|||
}
|
||||
return m_Description;
|
||||
} // getDescription
|
||||
|
||||
|
||||
/**
|
||||
* Get C_Currency_ID
|
||||
* @return currency
|
||||
|
@ -1664,7 +1504,7 @@ public abstract class Doc
|
|||
}
|
||||
return m_C_Currency_ID;
|
||||
} // getC_Currency_ID
|
||||
|
||||
|
||||
/**
|
||||
* Set C_Currency_ID
|
||||
* @param C_Currency_ID id
|
||||
|
@ -1673,7 +1513,7 @@ public abstract class Doc
|
|||
{
|
||||
m_C_Currency_ID = C_Currency_ID;
|
||||
} // setC_Currency_ID
|
||||
|
||||
|
||||
/**
|
||||
* Is Multi Currency
|
||||
* @return mc
|
||||
|
@ -1691,7 +1531,7 @@ public abstract class Doc
|
|||
{
|
||||
m_MultiCurrency = mc;
|
||||
} // setIsMultiCurrency
|
||||
|
||||
|
||||
/**
|
||||
* Is Tax Included
|
||||
* @return tax incl
|
||||
|
@ -1709,7 +1549,7 @@ public abstract class Doc
|
|||
{
|
||||
m_TaxIncluded = ti;
|
||||
} // setIsTaxIncluded
|
||||
|
||||
|
||||
/**
|
||||
* Get C_ConversionType_ID
|
||||
* @return ConversionType
|
||||
|
@ -1725,7 +1565,7 @@ public abstract class Doc
|
|||
}
|
||||
return 0;
|
||||
} // getC_ConversionType_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get GL_Category_ID
|
||||
* @return category
|
||||
|
@ -1734,7 +1574,7 @@ public abstract class Doc
|
|||
{
|
||||
return m_GL_Category_ID;
|
||||
} // getGL_Category_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get GL_Category_ID
|
||||
* @return category
|
||||
|
@ -1777,7 +1617,7 @@ public abstract class Doc
|
|||
{
|
||||
m_DateAcct = da;
|
||||
} // setDateAcct
|
||||
|
||||
|
||||
/**
|
||||
* Get Document Date
|
||||
* @return currency
|
||||
|
@ -1797,7 +1637,7 @@ public abstract class Doc
|
|||
}
|
||||
throw new IllegalStateException("No DateDoc");
|
||||
} // getDateDoc
|
||||
|
||||
|
||||
/**
|
||||
* Set Date Doc
|
||||
* @param dd document date
|
||||
|
@ -1824,7 +1664,7 @@ public abstract class Doc
|
|||
}
|
||||
throw new IllegalStateException("No Posted");
|
||||
} // isPosted
|
||||
|
||||
|
||||
/**
|
||||
* Is Sales Trx
|
||||
* @return true if posted
|
||||
|
@ -1867,7 +1707,7 @@ public abstract class Doc
|
|||
}
|
||||
return 0;
|
||||
} // getC_DocType_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get header level C_Charge_ID
|
||||
* @return Charge
|
||||
|
@ -1899,7 +1739,7 @@ public abstract class Doc
|
|||
}
|
||||
return 0;
|
||||
} // getSalesRep_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get C_BankAccount_ID
|
||||
* @return BankAccount
|
||||
|
@ -1929,7 +1769,7 @@ public abstract class Doc
|
|||
{
|
||||
m_C_BankAccount_ID = C_BankAccount_ID;
|
||||
} // setC_BankAccount_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get C_CashBook_ID
|
||||
* @return CashBook
|
||||
|
@ -1976,7 +1816,7 @@ public abstract class Doc
|
|||
return 0;
|
||||
} // getM_Warehouse_ID
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get C_BPartner_ID
|
||||
* @return BPartner
|
||||
|
@ -2006,7 +1846,7 @@ public abstract class Doc
|
|||
{
|
||||
m_C_BPartner_ID = C_BPartner_ID;
|
||||
} // setC_BPartner_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get C_BPartner_Location_ID
|
||||
* @return BPartner Location
|
||||
|
@ -2038,7 +1878,7 @@ public abstract class Doc
|
|||
}
|
||||
return 0;
|
||||
} // getC_Project_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get C_ProjectPhase_ID
|
||||
* @return Project Phase
|
||||
|
@ -2054,7 +1894,7 @@ public abstract class Doc
|
|||
}
|
||||
return 0;
|
||||
} // getC_ProjectPhase_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get C_ProjectTask_ID
|
||||
* @return Project Task
|
||||
|
@ -2070,7 +1910,7 @@ public abstract class Doc
|
|||
}
|
||||
return 0;
|
||||
} // getC_ProjectTask_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get C_SalesRegion_ID
|
||||
* @return Sales Region
|
||||
|
@ -2086,7 +1926,7 @@ public abstract class Doc
|
|||
}
|
||||
return 0;
|
||||
} // getC_SalesRegion_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get C_SalesRegion_ID
|
||||
* @return Sales Region
|
||||
|
@ -2116,7 +1956,7 @@ public abstract class Doc
|
|||
{
|
||||
m_BP_C_SalesRegion_ID = C_SalesRegion_ID;
|
||||
} // setBP_C_SalesRegion_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get C_Activity_ID
|
||||
* @return Activity
|
||||
|
@ -2189,7 +2029,7 @@ public abstract class Doc
|
|||
{
|
||||
return m_C_LocFrom_ID;
|
||||
} // getC_LocFrom_ID
|
||||
|
||||
|
||||
/**
|
||||
* Set C_LocFrom_ID
|
||||
* @param C_LocFrom_ID loc from
|
||||
|
@ -2232,7 +2072,7 @@ public abstract class Doc
|
|||
}
|
||||
return 0;
|
||||
} // getUser1_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get User2_ID
|
||||
* @return Campaign
|
||||
|
@ -2248,7 +2088,7 @@ public abstract class Doc
|
|||
}
|
||||
return 0;
|
||||
} // getUser2_ID
|
||||
|
||||
|
||||
/**
|
||||
* Get User Defined value
|
||||
* @return User defined
|
||||
|
@ -2264,8 +2104,8 @@ public abstract class Doc
|
|||
}
|
||||
return 0;
|
||||
} // getValue
|
||||
|
||||
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
// To be overwritten by Subclasses
|
||||
|
||||
|
@ -2295,60 +2135,4 @@ public abstract class Doc
|
|||
public ArrayList<Fact> getFacts() {
|
||||
return m_fact;
|
||||
}
|
||||
|
||||
/*
|
||||
* Array of tables with Post column
|
||||
*/
|
||||
public static int[] getDocumentsTableID() {
|
||||
fillDocumentsTableArrays();
|
||||
return documentsTableID;
|
||||
}
|
||||
|
||||
public static String[] getDocumentsTableName() {
|
||||
fillDocumentsTableArrays();
|
||||
return documentsTableName;
|
||||
}
|
||||
|
||||
private static void fillDocumentsTableArrays() {
|
||||
if (documentsTableID == null) {
|
||||
String sql = "SELECT t.AD_Table_ID, t.TableName " +
|
||||
"FROM AD_Table t, AD_Column c " +
|
||||
"WHERE t.AD_Table_ID=c.AD_Table_ID AND " +
|
||||
"c.ColumnName='Posted' AND " +
|
||||
"IsView='N' " +
|
||||
"ORDER BY t.AD_Table_ID";
|
||||
ArrayList<Integer> tableIDs = new ArrayList<Integer>();
|
||||
ArrayList<String> tableNames = new ArrayList<String>();
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
try
|
||||
{
|
||||
pstmt = DB.prepareStatement(sql, null);
|
||||
rs = pstmt.executeQuery();
|
||||
while (rs.next())
|
||||
{
|
||||
tableIDs.add(rs.getInt(1));
|
||||
tableNames.add(rs.getString(2));
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new DBException(e, sql);
|
||||
}
|
||||
finally
|
||||
{
|
||||
DB.close(rs, pstmt);
|
||||
rs = null; pstmt = null;
|
||||
}
|
||||
// Convert to array
|
||||
documentsTableID = new int[tableIDs.size()];
|
||||
documentsTableName = new String[tableIDs.size()];
|
||||
for (int i = 0; i < documentsTableID.length; i++)
|
||||
{
|
||||
documentsTableID[i] = tableIDs.get(i);
|
||||
documentsTableName[i] = tableNames.get(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // Doc
|
||||
|
|
|
@ -0,0 +1,370 @@
|
|||
/******************************************************************************
|
||||
* 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.acct;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.adempiere.base.IDocFactory;
|
||||
import org.adempiere.base.Service;
|
||||
import org.adempiere.base.ServiceQuery;
|
||||
import org.adempiere.exceptions.AdempiereException;
|
||||
import org.adempiere.exceptions.DBException;
|
||||
import org.compiere.model.MAcctSchema;
|
||||
import org.compiere.model.MTable;
|
||||
import org.compiere.util.AdempiereUserError;
|
||||
import org.compiere.util.CLogger;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.Trx;
|
||||
import org.compiere.util.ValueNamePair;
|
||||
|
||||
/**
|
||||
* This class contains methods to manage the posting of financial document. Most of the code is adapted from the legacy code in Doc.java
|
||||
* @author Jorg Janke
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class DocManager {
|
||||
|
||||
private final static CLogger s_log = CLogger.getCLogger(DocManager.class);
|
||||
|
||||
/** AD_Table_ID's of documents */
|
||||
private static int[] documentsTableID = null;
|
||||
|
||||
/** Table Names of documents */
|
||||
private static String[] documentsTableName = null;
|
||||
|
||||
/*
|
||||
* Array of tables with Post column
|
||||
*/
|
||||
public static int[] getDocumentsTableID() {
|
||||
fillDocumentsTableArrays();
|
||||
return documentsTableID;
|
||||
}
|
||||
|
||||
public static String[] getDocumentsTableName() {
|
||||
fillDocumentsTableArrays();
|
||||
return documentsTableName;
|
||||
}
|
||||
|
||||
private static void fillDocumentsTableArrays() {
|
||||
if (documentsTableID == null) {
|
||||
String sql = "SELECT t.AD_Table_ID, t.TableName " +
|
||||
"FROM AD_Table t, AD_Column c " +
|
||||
"WHERE t.AD_Table_ID=c.AD_Table_ID AND " +
|
||||
"c.ColumnName='Posted' AND " +
|
||||
"IsView='N' " +
|
||||
"ORDER BY t.AD_Table_ID";
|
||||
ArrayList<Integer> tableIDs = new ArrayList<Integer>();
|
||||
ArrayList<String> tableNames = new ArrayList<String>();
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
try
|
||||
{
|
||||
pstmt = DB.prepareStatement(sql, null);
|
||||
rs = pstmt.executeQuery();
|
||||
while (rs.next())
|
||||
{
|
||||
tableIDs.add(rs.getInt(1));
|
||||
tableNames.add(rs.getString(2));
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new DBException(e, sql);
|
||||
}
|
||||
finally
|
||||
{
|
||||
DB.close(rs, pstmt);
|
||||
rs = null; pstmt = null;
|
||||
}
|
||||
// Convert to array
|
||||
documentsTableID = new int[tableIDs.size()];
|
||||
documentsTableName = new String[tableIDs.size()];
|
||||
for (int i = 0; i < documentsTableID.length; i++)
|
||||
{
|
||||
documentsTableID[i] = tableIDs.get(i);
|
||||
documentsTableName[i] = tableNames.get(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Posting document
|
||||
* @param as accounting schema
|
||||
* @param AD_Table_ID Table ID of Documents
|
||||
* @param Record_ID record ID to load
|
||||
* @param trxName transaction name
|
||||
* @return Document or null
|
||||
*/
|
||||
public static Doc getDocument(MAcctSchema as, int AD_Table_ID, int Record_ID, String trxName)
|
||||
{
|
||||
String TableName = null;
|
||||
for (int i = 0; i < DocManager.getDocumentsTableID().length; i++)
|
||||
{
|
||||
if (DocManager.getDocumentsTableID()[i] == AD_Table_ID)
|
||||
{
|
||||
TableName = DocManager.getDocumentsTableName()[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (TableName == null)
|
||||
{
|
||||
s_log.severe("Not found AD_Table_ID=" + AD_Table_ID);
|
||||
return null;
|
||||
}
|
||||
|
||||
ServiceQuery query = new ServiceQuery();
|
||||
query.put("gaap", as.getGAAP());
|
||||
List<IDocFactory> factoryList = Service.list(IDocFactory.class, query);
|
||||
if (factoryList != null)
|
||||
{
|
||||
for(IDocFactory factory : factoryList)
|
||||
{
|
||||
Doc doc = factory.getDocument(as, AD_Table_ID, Record_ID, trxName);
|
||||
if (doc != null)
|
||||
return doc;
|
||||
}
|
||||
}
|
||||
|
||||
query.clear();
|
||||
query.put("gaap", "*");
|
||||
factoryList = Service.list(IDocFactory.class, query);
|
||||
if (factoryList != null)
|
||||
{
|
||||
for(IDocFactory factory : factoryList)
|
||||
{
|
||||
Doc doc = factory.getDocument(as, AD_Table_ID, Record_ID, trxName);
|
||||
if (doc != null)
|
||||
return doc;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Posting document
|
||||
* @param as accounting schema
|
||||
* @param AD_Table_ID Table ID of Documents
|
||||
* @param rs ResultSet
|
||||
* @param trxName transaction name
|
||||
* @return Document
|
||||
* @throws AdempiereUserError
|
||||
*/
|
||||
public static Doc getDocument(MAcctSchema as, int AD_Table_ID, ResultSet rs, String trxName)
|
||||
{
|
||||
ServiceQuery query = new ServiceQuery();
|
||||
query.put("gaap", as.getGAAP());
|
||||
List<IDocFactory> factoryList = Service.list(IDocFactory.class,query);
|
||||
if (factoryList != null)
|
||||
{
|
||||
for(IDocFactory factory : factoryList)
|
||||
{
|
||||
Doc doc = factory.getDocument(as, AD_Table_ID, rs, trxName);
|
||||
if (doc != null)
|
||||
return doc;
|
||||
}
|
||||
}
|
||||
|
||||
query.clear();
|
||||
query.put("gaap", "*");
|
||||
factoryList = Service.list(IDocFactory.class,query);
|
||||
if (factoryList != null)
|
||||
{
|
||||
for(IDocFactory factory : factoryList)
|
||||
{
|
||||
Doc doc = factory.getDocument(as, AD_Table_ID, rs, trxName);
|
||||
if (doc != null)
|
||||
return doc;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Post Document
|
||||
* @param ass accounting schema
|
||||
* @param AD_Table_ID Transaction table
|
||||
* @param Record_ID Record ID of this document
|
||||
* @param force force posting
|
||||
* @param repost Repost document
|
||||
* @param trxName transaction
|
||||
* @return null if the document was posted or error message
|
||||
*/
|
||||
public static String postDocument(MAcctSchema[] ass,
|
||||
int AD_Table_ID, int Record_ID, boolean force, boolean repost, String trxName) {
|
||||
|
||||
String tableName = null;
|
||||
for (int i = 0; i < getDocumentsTableID().length; i++)
|
||||
{
|
||||
if (getDocumentsTableID()[i] == AD_Table_ID)
|
||||
{
|
||||
tableName = getDocumentsTableName()[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (tableName == null)
|
||||
{
|
||||
s_log.severe("Table not a financial document. AD_Table_ID=" + AD_Table_ID);
|
||||
return "Table not a financial document. AD_Table_ID="+AD_Table_ID;
|
||||
}
|
||||
|
||||
StringBuffer sql = new StringBuffer("SELECT * FROM ")
|
||||
.append(tableName)
|
||||
.append(" WHERE ").append(tableName).append("_ID=? AND Processed='Y'");
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
try
|
||||
{
|
||||
pstmt = DB.prepareStatement (sql.toString(), trxName);
|
||||
pstmt.setInt (1, Record_ID);
|
||||
rs = pstmt.executeQuery ();
|
||||
if (rs.next ())
|
||||
{
|
||||
return postDocument(ass, AD_Table_ID, rs, force, repost, trxName);
|
||||
}
|
||||
else
|
||||
{
|
||||
s_log.severe("Not Found: " + tableName + "_ID=" + Record_ID);
|
||||
return "NoDoc";
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (e instanceof RuntimeException)
|
||||
throw (RuntimeException)e;
|
||||
else
|
||||
throw new AdempiereException(e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
DB.close(rs, pstmt);
|
||||
rs = null;
|
||||
pstmt = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Post Document
|
||||
* @param ass accounting schema
|
||||
* @param AD_Table_ID Transaction table
|
||||
* @param rs Result set
|
||||
* @param force force posting
|
||||
* @param repost Repost document
|
||||
* @param trxName transaction
|
||||
* @return null if the document was posted or error message
|
||||
*/
|
||||
public static String postDocument(MAcctSchema[] ass,
|
||||
int AD_Table_ID, ResultSet rs, boolean force, boolean repost, String trxName) {
|
||||
String localTrxName = null;
|
||||
if (trxName == null)
|
||||
{
|
||||
localTrxName = Trx.createTrxName("Post");
|
||||
trxName = localTrxName;
|
||||
}
|
||||
|
||||
String error = null;
|
||||
try
|
||||
{
|
||||
String status = "";
|
||||
for(MAcctSchema as : ass)
|
||||
{
|
||||
Doc doc = Doc.get (as, AD_Table_ID, rs, trxName);
|
||||
if (doc != null)
|
||||
{
|
||||
error = doc.post (force, repost); // repost
|
||||
status = doc.getPostStatus();
|
||||
if (error != null && error.trim().length() > 0)
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
return "NoDoc";
|
||||
}
|
||||
}
|
||||
|
||||
MTable table = MTable.get(Env.getCtx(), AD_Table_ID);
|
||||
int Record_ID = rs.getInt(table.getKeyColumns()[0]);
|
||||
// Commit Doc
|
||||
if (!save(trxName, AD_Table_ID, Record_ID, status))
|
||||
{
|
||||
ValueNamePair dbError = CLogger.retrieveError();
|
||||
// log.log(Level.SEVERE, "(doc not saved) ... rolling back");
|
||||
if (localTrxName != null) {
|
||||
Trx trx = Trx.get(localTrxName, false);
|
||||
if (trx != null)
|
||||
trx.rollback();
|
||||
}
|
||||
if (dbError != null)
|
||||
error = dbError.getValue();
|
||||
else
|
||||
error = "SaveError";
|
||||
}
|
||||
if (localTrxName != null) {
|
||||
Trx trx = Trx.get(localTrxName, false);
|
||||
if (trx != null)
|
||||
trx.commit();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (localTrxName != null) {
|
||||
Trx trx = Trx.get(localTrxName, false);
|
||||
if (trx != null)
|
||||
trx.rollback();
|
||||
}
|
||||
if (e instanceof RuntimeException)
|
||||
throw (RuntimeException) e;
|
||||
else
|
||||
throw new AdempiereException(e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (localTrxName != null)
|
||||
{
|
||||
Trx trx = Trx.get(localTrxName, false);
|
||||
if (trx != null)
|
||||
trx.close();
|
||||
}
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* Save to Disk - set posted flag
|
||||
* @param trxName transaction name
|
||||
* @return true if saved
|
||||
*/
|
||||
private final static boolean save (String trxName, int AD_Table_ID, int Record_ID, String status)
|
||||
{
|
||||
MTable table = MTable.get(Env.getCtx(), AD_Table_ID);
|
||||
StringBuffer sql = new StringBuffer("UPDATE ");
|
||||
sql.append(table.getTableName()).append(" SET Posted='").append(status)
|
||||
.append("',Processing='N' ")
|
||||
.append("WHERE ")
|
||||
.append(table.getTableName()).append("_ID=").append(Record_ID);
|
||||
CLogger.resetLast();
|
||||
int no = DB.executeUpdate(sql.toString(), trxName);
|
||||
return no == 1;
|
||||
} // save
|
||||
}
|
|
@ -46,26 +46,26 @@ import org.compiere.util.Env;
|
|||
* </pre>
|
||||
* @author Jorg Janke
|
||||
* @version $Id: Doc_Allocation.java,v 1.6 2006/07/30 00:53:33 jjanke Exp $
|
||||
*
|
||||
* FR [ 1840016 ] Avoid usage of clearing accounts - subject to C_AcctSchema.IsPostIfClearingEqual
|
||||
*
|
||||
* FR [ 1840016 ] Avoid usage of clearing accounts - subject to C_AcctSchema.IsPostIfClearingEqual
|
||||
* Avoid posting if Receipt and both accounts Unallocated Cash and Receivable are equal
|
||||
* Avoid posting if Payment and both accounts Payment Select and Liability are equal
|
||||
*
|
||||
*
|
||||
* @author phib
|
||||
* BF [ 2019262 ] Allocation posting currency gain/loss omits line reference
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class Doc_AllocationHdr extends Doc
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_AllocationHdr (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_AllocationHdr (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, MAllocationHdr.class, rs, DOCTYPE_Allocation, trxName);
|
||||
super (as, MAllocationHdr.class, rs, DOCTYPE_Allocation, trxName);
|
||||
} // Doc_Allocation
|
||||
|
||||
/** Tolerance G&L */
|
||||
|
@ -100,7 +100,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
{
|
||||
MAllocationLine line = lines[i];
|
||||
DocLine_Allocation docLine = new DocLine_Allocation(line, this);
|
||||
|
||||
|
||||
// Get Payment Conversion Rate
|
||||
if (line.getC_Payment_ID() != 0)
|
||||
{
|
||||
|
@ -119,7 +119,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
return dls;
|
||||
} // loadLines
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Get Source Currency Balance - subtracts line and tax amounts from total - no rounding
|
||||
* @return positive amount, if total invoice is bigger than lines
|
||||
|
@ -145,7 +145,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
* DiscountExp DR
|
||||
* WriteOff DR
|
||||
* Receivables CR
|
||||
*
|
||||
*
|
||||
* AP_Invoice_Payment
|
||||
* Liability DR
|
||||
* DiscountRev CR
|
||||
|
@ -163,7 +163,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
* Realized Gain & Loss
|
||||
* AR/AP DR CR
|
||||
* Realized G/L DR CR
|
||||
*
|
||||
*
|
||||
*
|
||||
* </pre>
|
||||
* Tax needs to be corrected for discount & write-off;
|
||||
|
@ -184,15 +184,15 @@ public class Doc_AllocationHdr extends Doc
|
|||
{
|
||||
DocLine_Allocation line = (DocLine_Allocation)p_lines[i];
|
||||
setC_BPartner_ID(line.getC_BPartner_ID());
|
||||
|
||||
|
||||
// CashBankTransfer - all references null and Discount/WriteOff = 0
|
||||
if (line.getC_Payment_ID() != 0
|
||||
if (line.getC_Payment_ID() != 0
|
||||
&& line.getC_Invoice_ID() == 0 && line.getC_Order_ID() == 0
|
||||
&& line.getC_CashLine_ID() == 0 && line.getC_BPartner_ID() == 0
|
||||
&& Env.ZERO.compareTo(line.getDiscountAmt()) == 0
|
||||
&& Env.ZERO.compareTo(line.getWriteOffAmt()) == 0)
|
||||
continue;
|
||||
|
||||
|
||||
// Receivables/Liability Amt
|
||||
BigDecimal allocationSource = line.getAmtSource()
|
||||
.add(line.getDiscountAmt())
|
||||
|
@ -211,7 +211,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
MInvoice invoice = null;
|
||||
if (line.getC_Invoice_ID() != 0)
|
||||
invoice = new MInvoice (getCtx(), line.getC_Invoice_ID(), getTrxName());
|
||||
|
||||
|
||||
// No Invoice
|
||||
if (invoice == null)
|
||||
{
|
||||
|
@ -230,32 +230,32 @@ public class Doc_AllocationHdr extends Doc
|
|||
return null;
|
||||
}
|
||||
}
|
||||
// Sales Invoice
|
||||
// Sales Invoice
|
||||
else if (invoice.isSOTrx())
|
||||
{
|
||||
|
||||
// Avoid usage of clearing accounts
|
||||
// If both accounts Unallocated Cash and Receivable are equal
|
||||
// then don't post
|
||||
|
||||
|
||||
MAccount acct_unallocated_cash = null;
|
||||
if (line.getC_Payment_ID() != 0)
|
||||
acct_unallocated_cash = getPaymentAcct(as, line.getC_Payment_ID());
|
||||
acct_unallocated_cash = getPaymentAcct(as, line.getC_Payment_ID());
|
||||
else if (line.getC_CashLine_ID() != 0)
|
||||
acct_unallocated_cash = getCashAcct(as, line.getC_CashLine_ID());
|
||||
MAccount acct_receivable = getAccount(Doc.ACCTTYPE_C_Receivable, as);
|
||||
|
||||
|
||||
if ((!as.isPostIfClearingEqual()) && acct_unallocated_cash != null && acct_unallocated_cash.equals(acct_receivable) && (!isInterOrg)) {
|
||||
|
||||
|
||||
// if not using clearing accounts, then don't post amtsource
|
||||
// change the allocationsource to be writeoff + discount
|
||||
allocationSource = line.getDiscountAmt().add(line.getWriteOffAmt());
|
||||
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
// Normal behavior -- unchanged if using clearing accounts
|
||||
|
||||
|
||||
// Payment/Cash DR
|
||||
if (line.getC_Payment_ID() != 0)
|
||||
{
|
||||
|
@ -275,7 +275,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
|
||||
}
|
||||
// End Avoid usage of clearing accounts
|
||||
|
||||
|
||||
// Discount DR
|
||||
if (Env.ZERO.compareTo(line.getDiscountAmt()) != 0)
|
||||
{
|
||||
|
@ -292,27 +292,27 @@ public class Doc_AllocationHdr extends Doc
|
|||
if (fl != null && payment != null)
|
||||
fl.setAD_Org_ID(payment.getAD_Org_ID());
|
||||
}
|
||||
|
||||
|
||||
// AR Invoice Amount CR
|
||||
if (as.isAccrual())
|
||||
{
|
||||
bpAcct = getAccount(Doc.ACCTTYPE_C_Receivable, as);
|
||||
fl = fact.createLine (line, bpAcct,
|
||||
getC_Currency_ID(), null, allocationSource); // payment currency
|
||||
getC_Currency_ID(), null, allocationSource); // payment currency
|
||||
if (fl != null)
|
||||
allocationAccounted = fl.getAcctBalance().negate();
|
||||
if (fl != null && invoice != null)
|
||||
fl.setAD_Org_ID(invoice.getAD_Org_ID());
|
||||
|
||||
|
||||
// for Realized Gain & Loss
|
||||
flForRGL = factForRGL.createLine (line, bpAcct,
|
||||
getC_Currency_ID(), null, allocationSourceForRGL); // payment currency
|
||||
getC_Currency_ID(), null, allocationSourceForRGL); // payment currency
|
||||
if (flForRGL != null)
|
||||
allocationAccountedForRGL = flForRGL.getAcctBalance().negate();
|
||||
}
|
||||
else // Cash Based
|
||||
{
|
||||
allocationAccounted = createCashBasedAcct (as, fact,
|
||||
allocationAccounted = createCashBasedAcct (as, fact,
|
||||
invoice, allocationSource);
|
||||
allocationAccountedForRGL = allocationAccounted;
|
||||
}
|
||||
|
@ -331,12 +331,12 @@ public class Doc_AllocationHdr extends Doc
|
|||
acct_payment_select = getCashAcct(as, line.getC_CashLine_ID());
|
||||
MAccount acct_liability = getAccount(Doc.ACCTTYPE_V_Liability, as);
|
||||
boolean isUsingClearing = true;
|
||||
|
||||
|
||||
// Save original allocation source for realized gain & loss purposes
|
||||
allocationSourceForRGL = allocationSourceForRGL.negate();
|
||||
|
||||
|
||||
if ((!as.isPostIfClearingEqual()) && acct_payment_select != null && acct_payment_select.equals(acct_liability) && (!isInterOrg)) {
|
||||
|
||||
|
||||
// if not using clearing accounts, then don't post amtsource
|
||||
// change the allocationsource to be writeoff + discount
|
||||
allocationSource = line.getDiscountAmt().add(line.getWriteOffAmt());
|
||||
|
@ -344,7 +344,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
|
||||
}
|
||||
// End Avoid usage of clearing accounts
|
||||
|
||||
|
||||
allocationSource = allocationSource.negate(); // allocation is negative
|
||||
// AP Invoice Amount DR
|
||||
if (as.isAccrual())
|
||||
|
@ -365,11 +365,11 @@ public class Doc_AllocationHdr extends Doc
|
|||
}
|
||||
else // Cash Based
|
||||
{
|
||||
allocationAccounted = createCashBasedAcct (as, fact,
|
||||
allocationAccounted = createCashBasedAcct (as, fact,
|
||||
invoice, allocationSource);
|
||||
allocationAccountedForRGL = allocationAccounted;
|
||||
}
|
||||
|
||||
|
||||
// Discount CR
|
||||
if (Env.ZERO.compareTo(line.getDiscountAmt()) != 0)
|
||||
{
|
||||
|
@ -403,7 +403,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
fl.setAD_Org_ID(cashLine.getAD_Org_ID());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// VAT Tax Correction
|
||||
if (invoice != null && as.isTaxCorrection())
|
||||
{
|
||||
|
@ -415,8 +415,8 @@ public class Doc_AllocationHdr extends Doc
|
|||
//
|
||||
if (taxCorrectionAmt.signum() != 0)
|
||||
{
|
||||
if (!createTaxCorrection(as, fact, line,
|
||||
getAccount(invoice.isSOTrx() ? Doc.ACCTTYPE_DiscountExp : Doc.ACCTTYPE_DiscountRev, as),
|
||||
if (!createTaxCorrection(as, fact, line,
|
||||
getAccount(invoice.isSOTrx() ? Doc.ACCTTYPE_DiscountExp : Doc.ACCTTYPE_DiscountRev, as),
|
||||
getAccount(Doc.ACCTTYPE_WriteOff, as), invoice.isSOTrx()))
|
||||
{
|
||||
p_Error = "Cannot create Tax correction";
|
||||
|
@ -424,18 +424,18 @@ public class Doc_AllocationHdr extends Doc
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Realized Gain & Loss
|
||||
if (invoice != null
|
||||
&& (getC_Currency_ID() != as.getC_Currency_ID() // payment allocation in foreign currency
|
||||
|| getC_Currency_ID() != line.getInvoiceC_Currency_ID())) // allocation <> invoice currency
|
||||
{
|
||||
p_Error = createRealizedGainLoss (line, as, fact, bpAcct, invoice,
|
||||
p_Error = createRealizedGainLoss (line, as, fact, bpAcct, invoice,
|
||||
allocationSource, allocationAccounted);
|
||||
if (p_Error != null)
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
} // for all lines
|
||||
|
||||
// FR [ 1840016 ] Avoid usage of clearing accounts - subject to C_AcctSchema.IsPostIfClearingEqual
|
||||
|
@ -462,7 +462,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
fact.remove(factline);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// reset line info
|
||||
setC_BPartner_ID(0);
|
||||
//
|
||||
|
@ -479,12 +479,12 @@ public class Doc_AllocationHdr extends Doc
|
|||
// no org element or not need to be balanced
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (p_lines.length <= 0) {
|
||||
// no lines
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
int startorg = p_lines[0].getAD_Org_ID();
|
||||
// validate if the allocation involves more than one org
|
||||
for (int i = 0; i < p_lines.length; i++) {
|
||||
|
@ -513,20 +513,20 @@ public class Doc_AllocationHdr extends Doc
|
|||
order = new MOrder (getCtx(), line.getC_Order_ID(), getTrxName());
|
||||
orgorder = order.getAD_Org_ID();
|
||||
}
|
||||
|
||||
if ( line.getAD_Org_ID() != startorg
|
||||
|
||||
if ( line.getAD_Org_ID() != startorg
|
||||
|| orgpayment != startorg
|
||||
|| orginvoice != startorg
|
||||
|| orginvoice != startorg
|
||||
|| orgcashline != startorg
|
||||
|| orgorder != startorg)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare the dimension ID's from two factlines
|
||||
* Compare the dimension ID's from two factlines
|
||||
* @param allEquals
|
||||
* @param prevFactLine
|
||||
* @param factLine
|
||||
|
@ -547,8 +547,8 @@ public class Doc_AllocationHdr extends Doc
|
|||
&& factLine.getC_LocTo_ID() == prevFactLine.getC_LocTo_ID()
|
||||
&& factLine.getC_Period_ID() == prevFactLine.getC_Period_ID()
|
||||
&& factLine.getC_Project_ID() == prevFactLine.getC_Project_ID()
|
||||
&& factLine.getC_ProjectPhase_ID() == prevFactLine.getC_ProjectPhase_ID()
|
||||
&& factLine.getC_ProjectTask_ID() == prevFactLine.getC_ProjectTask_ID()
|
||||
&& factLine.getC_ProjectPhase_ID() == prevFactLine.getC_ProjectPhase_ID()
|
||||
&& factLine.getC_ProjectTask_ID() == prevFactLine.getC_ProjectTask_ID()
|
||||
&& factLine.getC_SalesRegion_ID() == prevFactLine.getC_SalesRegion_ID()
|
||||
&& factLine.getC_SubAcct_ID() == prevFactLine.getC_SubAcct_ID()
|
||||
&& factLine.getC_Tax_ID() == prevFactLine.getC_Tax_ID()
|
||||
|
@ -559,7 +559,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
&& factLine.getM_Product_ID() == prevFactLine.getM_Product_ID()
|
||||
&& factLine.getUserElement1_ID() == prevFactLine.getUserElement1_ID()
|
||||
&& factLine.getUserElement2_ID() == prevFactLine.getUserElement2_ID()
|
||||
&& factLine.getUser1_ID() == prevFactLine.getUser1_ID()
|
||||
&& factLine.getUser1_ID() == prevFactLine.getUser1_ID()
|
||||
&& factLine.getUser2_ID() == prevFactLine.getUser2_ID());
|
||||
}
|
||||
|
||||
|
@ -571,7 +571,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
* @param allocationSource allocation amount (incl discount, writeoff)
|
||||
* @return Accounted Amt
|
||||
*/
|
||||
private BigDecimal createCashBasedAcct (MAcctSchema as, Fact fact, MInvoice invoice,
|
||||
private BigDecimal createCashBasedAcct (MAcctSchema as, Fact fact, MInvoice invoice,
|
||||
BigDecimal allocationSource)
|
||||
{
|
||||
BigDecimal allocationAccounted = Env.ZERO;
|
||||
|
@ -581,32 +581,32 @@ public class Doc_AllocationHdr extends Doc
|
|||
percent = 1.0;
|
||||
log.config("Multiplier=" + percent + " - GrandTotal=" + invoice.getGrandTotal()
|
||||
+ " - Allocation Source=" + allocationSource);
|
||||
|
||||
|
||||
// Get Invoice Postings
|
||||
Doc_Invoice docInvoice = (Doc_Invoice)Doc.get(new MAcctSchema[]{as},
|
||||
Doc_Invoice docInvoice = (Doc_Invoice)Doc.get(as,
|
||||
MInvoice.Table_ID, invoice.getC_Invoice_ID(), getTrxName());
|
||||
docInvoice.loadDocumentDetails();
|
||||
allocationAccounted = docInvoice.createFactCash(as, fact, new BigDecimal(percent));
|
||||
log.config("Allocation Accounted=" + allocationAccounted);
|
||||
|
||||
// Cash Based Commitment Release
|
||||
|
||||
// Cash Based Commitment Release
|
||||
if (as.isCreatePOCommitment() && !invoice.isSOTrx())
|
||||
{
|
||||
MInvoiceLine[] lines = invoice.getLines();
|
||||
for (int i = 0; i < lines.length; i++)
|
||||
{
|
||||
Fact factC = Doc_Order.getCommitmentRelease(as, this,
|
||||
Fact factC = Doc_Order.getCommitmentRelease(as, this,
|
||||
lines[i].getQtyInvoiced(), lines[i].getC_InvoiceLine_ID(), new BigDecimal(percent));
|
||||
if (factC == null)
|
||||
return null;
|
||||
m_facts.add(factC);
|
||||
}
|
||||
} // Commitment
|
||||
|
||||
|
||||
return allocationAccounted;
|
||||
} // createCashBasedAcct
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get Payment (Unallocated Payment or Payment Selection) Acct of Bank Account
|
||||
* @param as accounting schema
|
||||
|
@ -616,7 +616,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
private MAccount getPaymentAcct (MAcctSchema as, int C_Payment_ID)
|
||||
{
|
||||
setC_BankAccount_ID(0);
|
||||
// Doc.ACCTTYPE_UnallocatedCash (AR) or C_Prepayment
|
||||
// Doc.ACCTTYPE_UnallocatedCash (AR) or C_Prepayment
|
||||
// or Doc.ACCTTYPE_PaymentSelect (AP) or V_Prepayment
|
||||
int accountType = Doc.ACCTTYPE_UnallocatedCash;
|
||||
//
|
||||
|
@ -644,7 +644,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
accountType = Doc.ACCTTYPE_V_Prepayment;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
log.log(Level.SEVERE, sql, e);
|
||||
|
@ -654,7 +654,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
DB.close(rs, pstmt);
|
||||
rs = null; pstmt = null;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
if (getC_BankAccount_ID() <= 0)
|
||||
{
|
||||
|
@ -663,7 +663,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
}
|
||||
return getAccount (accountType, as);
|
||||
} // getPaymentAcct
|
||||
|
||||
|
||||
/**
|
||||
* Get Cash (Transfer) Acct of CashBook
|
||||
* @param as accounting schema
|
||||
|
@ -683,7 +683,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
}
|
||||
return getAccount(Doc.ACCTTYPE_CashTransfer, as);
|
||||
} // getCashAcct
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Create Realized Gain & Loss.
|
||||
|
@ -703,9 +703,9 @@ public class Doc_AllocationHdr extends Doc
|
|||
BigDecimal invoiceSource = null;
|
||||
BigDecimal invoiceAccounted = null;
|
||||
//
|
||||
String sql = "SELECT "
|
||||
+ (invoice.isSOTrx()
|
||||
? "SUM(AmtSourceDr), SUM(AmtAcctDr)" // so
|
||||
String sql = "SELECT "
|
||||
+ (invoice.isSOTrx()
|
||||
? "SUM(AmtSourceDr), SUM(AmtAcctDr)" // so
|
||||
: "SUM(AmtSourceCr), SUM(AmtAcctCr)") // po
|
||||
+ " FROM Fact_Acct "
|
||||
+ "WHERE AD_Table_ID=318 AND Record_ID=?" // Invoice
|
||||
|
@ -744,13 +744,13 @@ public class Doc_AllocationHdr extends Doc
|
|||
// Allocation not Invoice Currency
|
||||
if (getC_Currency_ID() != invoice.getC_Currency_ID())
|
||||
{
|
||||
BigDecimal allocationSourceNew = MConversionRate.convert(getCtx(),
|
||||
allocationSource, getC_Currency_ID(),
|
||||
invoice.getC_Currency_ID(), getDateAcct(),
|
||||
BigDecimal allocationSourceNew = MConversionRate.convert(getCtx(),
|
||||
allocationSource, getC_Currency_ID(),
|
||||
invoice.getC_Currency_ID(), getDateAcct(),
|
||||
invoice.getC_ConversionType_ID(), invoice.getAD_Client_ID(), invoice.getAD_Org_ID());
|
||||
if (allocationSourceNew == null)
|
||||
return "Gain/Loss - No Conversion from Allocation->Invoice";
|
||||
String d2 = "Allocation=(" + getC_Currency_ID() + ")" + allocationSource
|
||||
String d2 = "Allocation=(" + getC_Currency_ID() + ")" + allocationSource
|
||||
+ "->(" + invoice.getC_Currency_ID() + ")" + allocationSourceNew;
|
||||
log.fine(d2);
|
||||
description += " - " + d2;
|
||||
|
@ -785,22 +785,22 @@ public class Doc_AllocationHdr extends Doc
|
|||
log.fine(d2);
|
||||
description += " - " + d2;
|
||||
}
|
||||
|
||||
|
||||
if (acctDifference.signum() == 0)
|
||||
{
|
||||
log.fine("No Difference");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
MAccount gain = MAccount.get (as.getCtx(), as.getAcctSchemaDefault().getRealizedGain_Acct());
|
||||
MAccount loss = MAccount.get (as.getCtx(), as.getAcctSchemaDefault().getRealizedLoss_Acct());
|
||||
//
|
||||
if (invoice.isSOTrx())
|
||||
{
|
||||
FactLine fl = fact.createLine (line, loss, gain,
|
||||
FactLine fl = fact.createLine (line, loss, gain,
|
||||
as.getC_Currency_ID(), acctDifference);
|
||||
fl.setDescription(description);
|
||||
fact.createLine (line, acct,
|
||||
fact.createLine (line, acct,
|
||||
as.getC_Currency_ID(), acctDifference.negate());
|
||||
fl.setDescription(description);
|
||||
}
|
||||
|
@ -808,7 +808,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
{
|
||||
fact.createLine (line, acct,
|
||||
as.getC_Currency_ID(), acctDifference);
|
||||
FactLine fl = fact.createLine (line, loss, gain,
|
||||
FactLine fl = fact.createLine (line, loss, gain,
|
||||
as.getC_Currency_ID(), acctDifference.negate());
|
||||
}
|
||||
return null;
|
||||
|
@ -823,8 +823,8 @@ public class Doc_AllocationHdr extends Doc
|
|||
* Example:
|
||||
* Invoice: Net $100 + Tax1 $15 + Tax2 $5 = Total $120
|
||||
* Payment: $115 (i.e. $5 underpayment)
|
||||
* Tax Adjustment = Tax1 = 0.63 (15/120*5) Tax2 = 0.21 (5/120/5)
|
||||
*
|
||||
* Tax Adjustment = Tax1 = 0.63 (15/120*5) Tax2 = 0.21 (5/120/5)
|
||||
*
|
||||
* @param as accounting schema
|
||||
* @param fact fact
|
||||
* @param line Allocation line
|
||||
|
@ -832,7 +832,7 @@ public class Doc_AllocationHdr extends Doc
|
|||
* @param WriteOffAccoint write off acct
|
||||
* @return true if created
|
||||
*/
|
||||
private boolean createTaxCorrection (MAcctSchema as, Fact fact,
|
||||
private boolean createTaxCorrection (MAcctSchema as, Fact fact,
|
||||
DocLine_Allocation line,
|
||||
MAccount DiscountAccount, MAccount WriteOffAccoint, boolean isSOTrx)
|
||||
{
|
||||
|
@ -843,10 +843,10 @@ public class Doc_AllocationHdr extends Doc
|
|||
BigDecimal writeOff = Env.ZERO;
|
||||
if (as.isTaxCorrectionWriteOff())
|
||||
writeOff = line.getWriteOffAmt();
|
||||
|
||||
|
||||
Doc_AllocationTax tax = new Doc_AllocationTax (
|
||||
DiscountAccount, discount, WriteOffAccoint, writeOff, isSOTrx);
|
||||
|
||||
|
||||
// Get Source Amounts with account
|
||||
String sql = "SELECT * "
|
||||
+ "FROM Fact_Acct "
|
||||
|
@ -882,14 +882,14 @@ public class Doc_AllocationHdr extends Doc
|
|||
if (tax.getLineCount() < 2)
|
||||
return true;
|
||||
return tax.createEntries (as, fact, line);
|
||||
|
||||
|
||||
} // createTaxCorrection
|
||||
|
||||
} // Doc_Allocation
|
||||
|
||||
/**
|
||||
* Allocation Document Tax Handing
|
||||
*
|
||||
*
|
||||
* @author Jorg Janke
|
||||
* @version $Id: Doc_Allocation.java,v 1.6 2006/07/30 00:53:33 jjanke Exp $
|
||||
*/
|
||||
|
@ -931,7 +931,7 @@ class Doc_AllocationTax
|
|||
{
|
||||
m_facts.add(fact);
|
||||
} // addInvoiceLine
|
||||
|
||||
|
||||
/**
|
||||
* Get Line Count
|
||||
* @return number of lines
|
||||
|
@ -940,7 +940,7 @@ class Doc_AllocationTax
|
|||
{
|
||||
return m_facts.size();
|
||||
} // getLineCount
|
||||
|
||||
|
||||
/**
|
||||
* Create Accounting Entries
|
||||
* @param as account schema
|
||||
|
@ -958,15 +958,15 @@ class Doc_AllocationTax
|
|||
if (factAcct.getAmtSourceDr().compareTo(total) > 0)
|
||||
{
|
||||
total = factAcct.getAmtSourceDr();
|
||||
m_totalIndex = i;
|
||||
m_totalIndex = i;
|
||||
}
|
||||
if (factAcct.getAmtSourceCr().compareTo(total) > 0)
|
||||
{
|
||||
total = factAcct.getAmtSourceCr();
|
||||
m_totalIndex = i;
|
||||
m_totalIndex = i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MFactAcct factAcct = (MFactAcct)m_facts.get(m_totalIndex);
|
||||
log.info ("Total Invoice = " + total + " - " + factAcct);
|
||||
int precision = as.getStdPrecision();
|
||||
|
@ -975,10 +975,10 @@ class Doc_AllocationTax
|
|||
// No Tax Line
|
||||
if (i == m_totalIndex)
|
||||
continue;
|
||||
|
||||
|
||||
factAcct = (MFactAcct)m_facts.get(i);
|
||||
log.info (i + ": " + factAcct);
|
||||
|
||||
|
||||
// Create Tax Account
|
||||
MAccount taxAcct = factAcct.getMAccount();
|
||||
if (taxAcct == null || taxAcct.get_ID() == 0)
|
||||
|
@ -986,15 +986,15 @@ class Doc_AllocationTax
|
|||
log.severe ("Tax Account not found/created");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Discount Amount
|
||||
|
||||
|
||||
// Discount Amount
|
||||
if (m_DiscountAmt.signum() != 0)
|
||||
{
|
||||
// Original Tax is DR - need to correct it CR
|
||||
if (Env.ZERO.compareTo(factAcct.getAmtSourceDr()) != 0)
|
||||
{
|
||||
BigDecimal amount = calcAmount(factAcct.getAmtSourceDr(),
|
||||
BigDecimal amount = calcAmount(factAcct.getAmtSourceDr(),
|
||||
total, m_DiscountAmt, precision);
|
||||
if (amount.signum() != 0)
|
||||
{
|
||||
|
@ -1011,13 +1011,13 @@ class Doc_AllocationTax
|
|||
fact.createLine (line, taxAcct,
|
||||
as.getC_Currency_ID(), null, amount.negate());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
// Original Tax is CR - need to correct it DR
|
||||
else
|
||||
{
|
||||
BigDecimal amount = calcAmount(factAcct.getAmtSourceCr(),
|
||||
BigDecimal amount = calcAmount(factAcct.getAmtSourceCr(),
|
||||
total, m_DiscountAmt, precision);
|
||||
if (amount.signum() != 0)
|
||||
{
|
||||
|
@ -1036,14 +1036,14 @@ class Doc_AllocationTax
|
|||
}
|
||||
}
|
||||
} // Discount
|
||||
|
||||
// WriteOff Amount
|
||||
|
||||
// WriteOff Amount
|
||||
if (m_WriteOffAmt.signum() != 0)
|
||||
{
|
||||
// Original Tax is DR - need to correct it CR
|
||||
if (Env.ZERO.compareTo(factAcct.getAmtSourceDr()) != 0)
|
||||
{
|
||||
BigDecimal amount = calcAmount(factAcct.getAmtSourceDr(),
|
||||
BigDecimal amount = calcAmount(factAcct.getAmtSourceDr(),
|
||||
total, m_WriteOffAmt, precision);
|
||||
if (amount.signum() != 0)
|
||||
{
|
||||
|
@ -1056,7 +1056,7 @@ class Doc_AllocationTax
|
|||
// Original Tax is CR - need to correct it DR
|
||||
else
|
||||
{
|
||||
BigDecimal amount = calcAmount(factAcct.getAmtSourceCr(),
|
||||
BigDecimal amount = calcAmount(factAcct.getAmtSourceCr(),
|
||||
total, m_WriteOffAmt, precision);
|
||||
if (amount.signum() != 0)
|
||||
{
|
||||
|
@ -1067,11 +1067,11 @@ class Doc_AllocationTax
|
|||
}
|
||||
}
|
||||
} // WriteOff
|
||||
|
||||
|
||||
} // for all lines
|
||||
return true;
|
||||
} // createEntries
|
||||
|
||||
|
||||
/**
|
||||
* Calc Amount tax / total * amt
|
||||
* @param tax tax
|
||||
|
@ -1083,17 +1083,17 @@ class Doc_AllocationTax
|
|||
private BigDecimal calcAmount (BigDecimal tax, BigDecimal total, BigDecimal amt, int precision)
|
||||
{
|
||||
log.fine("Amt=" + amt + " - Total=" + total + ", Tax=" + tax);
|
||||
if (tax.signum() == 0
|
||||
if (tax.signum() == 0
|
||||
|| total.signum() == 0
|
||||
|| amt.signum() == 0)
|
||||
return Env.ZERO;
|
||||
//
|
||||
BigDecimal multiplier = tax.divide(total, 10, BigDecimal.ROUND_HALF_UP);
|
||||
BigDecimal multiplier = tax.divide(total, 10, BigDecimal.ROUND_HALF_UP);
|
||||
BigDecimal retValue = multiplier.multiply(amt);
|
||||
if (retValue.scale() > precision)
|
||||
retValue = retValue.setScale(precision, BigDecimal.ROUND_HALF_UP);
|
||||
log.fine(retValue + " (Mult=" + multiplier + "(Prec=" + precision + ")");
|
||||
return retValue;
|
||||
} // calcAmount
|
||||
|
||||
|
||||
} // Doc_AllocationTax
|
||||
|
|
|
@ -36,27 +36,27 @@ import org.compiere.util.Env;
|
|||
* </pre>
|
||||
* @author Jorg Janke
|
||||
* @version $Id: Doc_Bank.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $
|
||||
*
|
||||
* FR [ 1840016 ] Avoid usage of clearing accounts - subject to C_AcctSchema.IsPostIfClearingEqual
|
||||
*
|
||||
* FR [ 1840016 ] Avoid usage of clearing accounts - subject to C_AcctSchema.IsPostIfClearingEqual
|
||||
* Avoid posting if both accounts BankAsset and BankInTransit are equal
|
||||
* @author victor.perez@e-evolution.com, e-Evolution http://www.e-evolution.com
|
||||
* <li>FR [ 2520591 ] Support multiples calendar for Org
|
||||
* @see http://sourceforge.net/tracker2/?func=detail&atid=879335&aid=2520591&group_id=176962
|
||||
*
|
||||
* <li>FR [ 2520591 ] Support multiples calendar for Org
|
||||
* @see http://sourceforge.net/tracker2/?func=detail&atid=879335&aid=2520591&group_id=176962
|
||||
*
|
||||
*/
|
||||
public class Doc_BankStatement extends Doc
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_BankStatement (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_BankStatement (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, MBankStatement.class, rs, DOCTYPE_BankStatement, trxName);
|
||||
super (as, MBankStatement.class, rs, DOCTYPE_BankStatement, trxName);
|
||||
} // Doc_Bank
|
||||
|
||||
|
||||
/** Bank Account */
|
||||
private int m_C_BankAccount_ID = 0;
|
||||
|
||||
|
@ -69,7 +69,7 @@ public class Doc_BankStatement extends Doc
|
|||
MBankStatement bs = (MBankStatement)getPO();
|
||||
setDateDoc(bs.getStatementDate());
|
||||
setDateAcct(bs.getStatementDate()); // Overwritten on Line Level
|
||||
|
||||
|
||||
m_C_BankAccount_ID = bs.getC_BankAccount_ID();
|
||||
// Amounts
|
||||
setAmount(AMTTYPE_Gross, bs.getStatementDifference());
|
||||
|
@ -118,7 +118,7 @@ public class Doc_BankStatement extends Doc
|
|||
return dls;
|
||||
} // loadLines
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Get Source Currency Balance - subtracts line amounts from total - no rounding
|
||||
* @return positive amount, if total invoice is bigger than lines
|
||||
|
@ -170,20 +170,20 @@ public class Doc_BankStatement extends Doc
|
|||
{
|
||||
DocLine_Bank line = (DocLine_Bank)p_lines[i];
|
||||
int C_BPartner_ID = line.getC_BPartner_ID();
|
||||
|
||||
|
||||
// Avoid usage of clearing accounts
|
||||
// If both accounts BankAsset and BankInTransit are equal
|
||||
// then remove the posting
|
||||
|
||||
|
||||
MAccount acct_bank_asset = getAccount(Doc.ACCTTYPE_BankAsset, as);
|
||||
MAccount acct_bank_in_transit = getAccount(Doc.ACCTTYPE_BankInTransit, as);
|
||||
|
||||
|
||||
// if ((!as.isPostIfClearingEqual()) && acct_bank_asset.equals(acct_bank_in_transit) && (!isInterOrg)) {
|
||||
// don't validate interorg on banks for this - normally banks are balanced by orgs
|
||||
if ((!as.isPostIfClearingEqual()) && acct_bank_asset.equals(acct_bank_in_transit)) {
|
||||
// Not using clearing accounts
|
||||
// just post the difference (if any)
|
||||
|
||||
|
||||
BigDecimal amt_stmt_minus_trx = line.getStmtAmt().subtract(line.getTrxAmt());
|
||||
if (amt_stmt_minus_trx.compareTo(Env.ZERO) != 0) {
|
||||
|
||||
|
@ -195,13 +195,13 @@ public class Doc_BankStatement extends Doc
|
|||
fl.setAD_Org_ID(AD_Org_ID);
|
||||
if (fl != null && C_BPartner_ID != 0)
|
||||
fl.setC_BPartner_ID(C_BPartner_ID);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
// Normal Adempiere behavior -- unchanged if using clearing accounts
|
||||
|
||||
|
||||
// BankAsset DR CR (Statement)
|
||||
fl = fact.createLine(line,
|
||||
getAccount(Doc.ACCTTYPE_BankAsset, as),
|
||||
|
@ -210,7 +210,7 @@ public class Doc_BankStatement extends Doc
|
|||
fl.setAD_Org_ID(AD_Org_ID);
|
||||
if (fl != null && C_BPartner_ID != 0)
|
||||
fl.setC_BPartner_ID(C_BPartner_ID);
|
||||
|
||||
|
||||
// BankInTransit DR CR (Payment)
|
||||
fl = fact.createLine(line,
|
||||
getAccount(Doc.ACCTTYPE_BankInTransit, as),
|
||||
|
@ -224,10 +224,10 @@ public class Doc_BankStatement extends Doc
|
|||
else
|
||||
fl.setAD_Org_ID(line.getAD_Org_ID(true)); // from payment
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// End Avoid usage of clearing accounts
|
||||
|
||||
|
||||
// Charge DR (Charge)
|
||||
if (line.getChargeAmt().compareTo(Env.ZERO) > 0) {
|
||||
fl = fact.createLine(line,
|
||||
|
@ -269,12 +269,12 @@ public class Doc_BankStatement extends Doc
|
|||
// no org element or not need to be balanced
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (p_lines.length <= 0) {
|
||||
// no lines
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
int startorg = getBank_Org_ID();
|
||||
if (startorg == 0)
|
||||
startorg = p_lines[0].getAD_Org_ID();
|
||||
|
@ -283,7 +283,7 @@ public class Doc_BankStatement extends Doc
|
|||
if (p_lines[i].getAD_Org_ID() != startorg)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -40,13 +40,13 @@ public class Doc_Cash extends Doc
|
|||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_Cash (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_Cash (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super(ass, MCash.class, rs, DOCTYPE_CashJournal, trxName);
|
||||
super(as, MCash.class, rs, DOCTYPE_CashJournal, trxName);
|
||||
} // Doc_Cash
|
||||
|
||||
/**
|
||||
|
@ -97,7 +97,7 @@ public class Doc_Cash extends Doc
|
|||
return dls;
|
||||
} // loadLines
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Get Source Currency Balance - subtracts line amounts from total - no rounding
|
||||
* @return positive amount, if total invoice is bigger than lines
|
||||
|
|
|
@ -40,19 +40,19 @@ public class Doc_GLJournal extends Doc
|
|||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_GLJournal (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_GLJournal (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super(ass, MJournal.class, rs, null, trxName);
|
||||
super(as, MJournal.class, rs, null, trxName);
|
||||
} // Doc_GL_Journal
|
||||
|
||||
/** Posting Type */
|
||||
private String m_PostingType = null;
|
||||
private int m_C_AcctSchema_ID = 0;
|
||||
|
||||
|
||||
/**
|
||||
* Load Specific Document Details
|
||||
* @return error message or null
|
||||
|
@ -62,7 +62,7 @@ public class Doc_GLJournal extends Doc
|
|||
MJournal journal = (MJournal)getPO();
|
||||
m_PostingType = journal.getPostingType();
|
||||
m_C_AcctSchema_ID = journal.getC_AcctSchema_ID();
|
||||
|
||||
|
||||
// Contained Objects
|
||||
p_lines = loadLines(journal);
|
||||
log.fine("Lines=" + p_lines.length);
|
||||
|
@ -82,7 +82,7 @@ public class Doc_GLJournal extends Doc
|
|||
for (int i = 0; i < lines.length; i++)
|
||||
{
|
||||
MJournalLine line = lines[i];
|
||||
DocLine docLine = new DocLine (line, this);
|
||||
DocLine docLine = new DocLine (line, this);
|
||||
// -- Source Amounts
|
||||
docLine.setAmount (line.getAmtSourceDr(), line.getAmtSourceCr());
|
||||
// -- Converted Amounts
|
||||
|
@ -100,7 +100,7 @@ public class Doc_GLJournal extends Doc
|
|||
return dls;
|
||||
} // loadLines
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Get Source Currency Balance - subtracts line and tax amounts from total - no rounding
|
||||
* @return positive amount, if total invoice is bigger than lines
|
||||
|
@ -137,7 +137,7 @@ public class Doc_GLJournal extends Doc
|
|||
// Other Acct Schema
|
||||
if (as.getC_AcctSchema_ID() != m_C_AcctSchema_ID)
|
||||
return facts;
|
||||
|
||||
|
||||
// create Fact Header
|
||||
Fact fact = new Fact (this, as, m_PostingType);
|
||||
|
||||
|
|
|
@ -50,18 +50,18 @@ public class Doc_InOut extends Doc
|
|||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_InOut (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_InOut (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, MInOut.class, rs, null, trxName);
|
||||
super (as, MInOut.class, rs, null, trxName);
|
||||
} // DocInOut
|
||||
|
||||
private int m_Reversal_ID = 0;
|
||||
private String m_DocStatus = "";
|
||||
|
||||
|
||||
/**
|
||||
* Load Document Details
|
||||
* @return error message or null
|
||||
|
@ -91,20 +91,20 @@ public class Doc_InOut extends Doc
|
|||
for (int i = 0; i < lines.length; i++)
|
||||
{
|
||||
MInOutLine line = lines[i];
|
||||
if (line.isDescription()
|
||||
if (line.isDescription()
|
||||
|| line.getM_Product_ID() == 0
|
||||
|| line.getMovementQty().signum() == 0)
|
||||
{
|
||||
log.finer("Ignored: " + line);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
DocLine docLine = new DocLine (line, this);
|
||||
BigDecimal Qty = line.getMovementQty();
|
||||
docLine.setReversalLine_ID(line.getReversalLine_ID());
|
||||
docLine.setReversalLine_ID(line.getReversalLine_ID());
|
||||
docLine.setQty (Qty, getDocumentType().equals(DOCTYPE_MatShipment)); // sets Trx and Storage Qty
|
||||
|
||||
//Define if Outside Processing
|
||||
|
||||
//Define if Outside Processing
|
||||
String sql = "SELECT PP_Cost_Collector_ID FROM C_OrderLine WHERE C_OrderLine_ID=? AND PP_Cost_Collector_ID IS NOT NULL";
|
||||
int PP_Cost_Collector_ID = DB.getSQLValueEx(getTrxName(), sql, new Object[]{line.getC_OrderLine_ID()});
|
||||
docLine.setPP_Cost_Collector_ID(PP_Cost_Collector_ID);
|
||||
|
@ -165,7 +165,7 @@ public class Doc_InOut extends Doc
|
|||
{
|
||||
DocLine line = p_lines[i];
|
||||
// MZ Goodwill
|
||||
// if Shipment CostDetail exist then get Cost from Cost Detail
|
||||
// if Shipment CostDetail exist then get Cost from Cost Detail
|
||||
BigDecimal costs = line.getProductCosts(as, line.getAD_Org_ID(), true, "M_InOutLine_ID=?");
|
||||
// end MZ
|
||||
if (costs == null || costs.signum() == 0) // zero costs OK
|
||||
|
@ -195,18 +195,18 @@ public class Doc_InOut extends Doc
|
|||
dr.setLocationFromBPartner(getC_BPartner_Location_ID(), false); // to Loc
|
||||
dr.setAD_Org_ID(line.getOrder_Org_ID()); // Revenue X-Org
|
||||
dr.setQty(line.getQty().negate());
|
||||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed)
|
||||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed)
|
||||
&& m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctDr from Original Shipment/Receipt
|
||||
if (!dr.updateReverseLine (MInOut.Table_ID,
|
||||
if (!dr.updateReverseLine (MInOut.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Shipment/Receipt not posted yet";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Inventory CR
|
||||
cr = fact.createLine(line,
|
||||
line.getAccount(ProductCost.ACCTTYPE_P_Asset, as),
|
||||
|
@ -220,11 +220,11 @@ public class Doc_InOut extends Doc
|
|||
cr.setM_Locator_ID(line.getM_Locator_ID());
|
||||
cr.setLocationFromLocator(line.getM_Locator_ID(), true); // from Loc
|
||||
cr.setLocationFromBPartner(getC_BPartner_Location_ID(), false); // to Loc
|
||||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed)
|
||||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed)
|
||||
&& m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctCr from Original Shipment/Receipt
|
||||
if (!cr.updateReverseLine (MInOut.Table_ID,
|
||||
if (!cr.updateReverseLine (MInOut.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Shipment/Receipt not posted yet";
|
||||
|
@ -235,7 +235,7 @@ public class Doc_InOut extends Doc
|
|||
//
|
||||
if (line.getM_Product_ID() != 0)
|
||||
{
|
||||
MCostDetail.createShipment(as, line.getAD_Org_ID(),
|
||||
MCostDetail.createShipment(as, line.getAD_Org_ID(),
|
||||
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
|
||||
line.get_ID(), 0,
|
||||
costs, line.getQty(),
|
||||
|
@ -250,13 +250,13 @@ public class Doc_InOut extends Doc
|
|||
for (int i = 0; i < p_lines.length; i++)
|
||||
{
|
||||
DocLine line = p_lines[i];
|
||||
Fact factcomm = Doc_Order.getCommitmentSalesRelease(as, this,
|
||||
Fact factcomm = Doc_Order.getCommitmentSalesRelease(as, this,
|
||||
line.getQty(), line.get_ID(), Env.ONE);
|
||||
if (factcomm != null)
|
||||
facts.add(factcomm);
|
||||
}
|
||||
} // Commitment
|
||||
|
||||
|
||||
} // Shipment
|
||||
// *** Sales - Return
|
||||
else if ( getDocumentType().equals(DOCTYPE_MatReceipt) && isSOTrx() )
|
||||
|
@ -265,10 +265,10 @@ public class Doc_InOut extends Doc
|
|||
{
|
||||
DocLine line = p_lines[i];
|
||||
// MZ Goodwill
|
||||
// if Shipment CostDetail exist then get Cost from Cost Detail
|
||||
// if Shipment CostDetail exist then get Cost from Cost Detail
|
||||
BigDecimal costs = line.getProductCosts(as, line.getAD_Org_ID(), true, "M_InOutLine_ID=?");
|
||||
// end MZ
|
||||
|
||||
|
||||
if (costs == null || costs.signum() == 0) // zero costs OK
|
||||
{
|
||||
MProduct product = line.getProduct();
|
||||
|
@ -294,11 +294,11 @@ public class Doc_InOut extends Doc
|
|||
dr.setM_Locator_ID(line.getM_Locator_ID());
|
||||
dr.setLocationFromLocator(line.getM_Locator_ID(), true); // from Loc
|
||||
dr.setLocationFromBPartner(getC_BPartner_Location_ID(), false); // to Loc
|
||||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed)
|
||||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed)
|
||||
&& m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctDr from Original Shipment/Receipt
|
||||
if (!dr.updateReverseLine (MInOut.Table_ID,
|
||||
if (!dr.updateReverseLine (MInOut.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Shipment/Receipt not posted yet";
|
||||
|
@ -309,13 +309,13 @@ public class Doc_InOut extends Doc
|
|||
//
|
||||
if (line.getM_Product_ID() != 0)
|
||||
{
|
||||
MCostDetail.createShipment(as, line.getAD_Org_ID(),
|
||||
MCostDetail.createShipment(as, line.getAD_Org_ID(),
|
||||
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
|
||||
line.get_ID(), 0,
|
||||
costs, line.getQty(),
|
||||
line.getDescription(), true, getTrxName());
|
||||
}
|
||||
|
||||
|
||||
// CoGS CR
|
||||
cr = fact.createLine(line,
|
||||
line.getAccount(ProductCost.ACCTTYPE_P_Cogs, as),
|
||||
|
@ -331,21 +331,21 @@ public class Doc_InOut extends Doc
|
|||
cr.setLocationFromBPartner(getC_BPartner_Location_ID(), false); // to Loc
|
||||
cr.setAD_Org_ID(line.getOrder_Org_ID()); // Revenue X-Org
|
||||
cr.setQty(line.getQty().negate());
|
||||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed)
|
||||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed)
|
||||
&& m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctCr from Original Shipment/Receipt
|
||||
if (!cr.updateReverseLine (MInOut.Table_ID,
|
||||
if (!cr.updateReverseLine (MInOut.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Shipment/Receipt not posted yet";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
} // for all lines
|
||||
updateProductInfo(as.getC_AcctSchema_ID()); // only for SO!
|
||||
} // Sales Return
|
||||
|
||||
|
||||
// *** Purchasing - Receipt
|
||||
else if (getDocumentType().equals(DOCTYPE_MatReceipt) && !isSOTrx())
|
||||
{
|
||||
|
@ -364,10 +364,10 @@ public class Doc_InOut extends Doc
|
|||
{
|
||||
int C_OrderLine_ID = line.getC_OrderLine_ID();
|
||||
// Low - check if c_orderline_id is valid
|
||||
if (C_OrderLine_ID > 0)
|
||||
if (C_OrderLine_ID > 0)
|
||||
{
|
||||
MOrderLine orderLine = new MOrderLine (getCtx(), C_OrderLine_ID, getTrxName());
|
||||
// Elaine 2008/06/26
|
||||
// Elaine 2008/06/26
|
||||
C_Currency_ID = orderLine.getC_Currency_ID();
|
||||
//
|
||||
costs = orderLine.getPriceCost();
|
||||
|
@ -386,7 +386,7 @@ public class Doc_InOut extends Doc
|
|||
log.fine("Costs=" + costs + " - Tax=" + costTax);
|
||||
costs = costs.subtract(costTax);
|
||||
}
|
||||
} // correct included Tax
|
||||
} // correct included Tax
|
||||
}
|
||||
costs = costs.multiply(line.getQty());
|
||||
}
|
||||
|
@ -409,16 +409,16 @@ public class Doc_InOut extends Doc
|
|||
// Inventory/Asset DR
|
||||
MAccount assets = line.getAccount(ProductCost.ACCTTYPE_P_Asset, as);
|
||||
if (product.isService())
|
||||
{
|
||||
{
|
||||
//if the line is a Outside Processing then DR WIP
|
||||
if(line.getPP_Cost_Collector_ID() > 0)
|
||||
assets = line.getAccount(ProductCost.ACCTTYPE_P_WorkInProcess, as);
|
||||
else
|
||||
assets = line.getAccount(ProductCost.ACCTTYPE_P_WorkInProcess, as);
|
||||
else
|
||||
assets = line.getAccount(ProductCost.ACCTTYPE_P_Expense, as);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Elaine 2008/06/26
|
||||
/*dr = fact.createLine(line, assets,
|
||||
as.getC_Currency_ID(), costs, null);*/
|
||||
|
@ -437,14 +437,14 @@ public class Doc_InOut extends Doc
|
|||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed) && m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctDr from Original Shipment/Receipt
|
||||
if (!dr.updateReverseLine (MInOut.Table_ID,
|
||||
if (!dr.updateReverseLine (MInOut.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Receipt not posted yet";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// NotInvoicedReceipt CR
|
||||
// Elaine 2008/06/26
|
||||
/*cr = fact.createLine(line,
|
||||
|
@ -467,7 +467,7 @@ public class Doc_InOut extends Doc
|
|||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed) && m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctCr from Original Shipment/Receipt
|
||||
if (!cr.updateReverseLine (MInOut.Table_ID,
|
||||
if (!cr.updateReverseLine (MInOut.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Receipt not posted yet";
|
||||
|
@ -538,14 +538,14 @@ public class Doc_InOut extends Doc
|
|||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed) && m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctDr from Original Shipment/Receipt
|
||||
if (!dr.updateReverseLine (MInOut.Table_ID,
|
||||
if (!dr.updateReverseLine (MInOut.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Receipt not posted yet";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Inventory/Asset CR
|
||||
MAccount assets = line.getAccount(ProductCost.ACCTTYPE_P_Asset, as);
|
||||
if (product.isService())
|
||||
|
@ -568,7 +568,7 @@ public class Doc_InOut extends Doc
|
|||
if (m_DocStatus.equals(MInOut.DOCSTATUS_Reversed) && m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctCr from Original Shipment/Receipt
|
||||
if (!cr.updateReverseLine (MInOut.Table_ID,
|
||||
if (!cr.updateReverseLine (MInOut.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Receipt not posted yet";
|
||||
|
|
|
@ -44,16 +44,16 @@ public class Doc_Inventory extends Doc
|
|||
{
|
||||
private int m_Reversal_ID = 0;
|
||||
private String m_DocStatus = "";
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_Inventory (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_Inventory (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, MInventory.class, rs, DOCTYPE_MatInventory, trxName);
|
||||
super (as, MInventory.class, rs, DOCTYPE_MatInventory, trxName);
|
||||
} // Doc_Inventory
|
||||
|
||||
/**
|
||||
|
@ -91,7 +91,7 @@ public class Doc_Inventory extends Doc
|
|||
&& line.getQtyInternalUse().signum() == 0)
|
||||
continue;
|
||||
//
|
||||
DocLine docLine = new DocLine (line, this);
|
||||
DocLine docLine = new DocLine (line, this);
|
||||
BigDecimal Qty = line.getQtyInternalUse();
|
||||
if (Qty.signum() != 0)
|
||||
Qty = Qty.negate(); // Internal Use entered positive
|
||||
|
@ -148,7 +148,7 @@ public class Doc_Inventory extends Doc
|
|||
{
|
||||
DocLine line = p_lines[i];
|
||||
// MZ Goodwill
|
||||
// if Physical Inventory CostDetail is exist then get Cost from Cost Detail
|
||||
// if Physical Inventory CostDetail is exist then get Cost from Cost Detail
|
||||
BigDecimal costs = line.getProductCosts(as, line.getAD_Org_ID(), true, "M_InventoryLine_ID=?");
|
||||
// end MZ
|
||||
if (costs == null || costs.signum() == 0)
|
||||
|
@ -167,14 +167,14 @@ public class Doc_Inventory extends Doc
|
|||
if (m_DocStatus.equals(MInventory.DOCSTATUS_Reversed) && m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctDr from Original Phys.Inventory
|
||||
if (!dr.updateReverseLine (MInventory.Table_ID,
|
||||
if (!dr.updateReverseLine (MInventory.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Physical Inventory not posted yet";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// InventoryDiff DR CR
|
||||
// or Charge
|
||||
MAccount invDiff = null;
|
||||
|
@ -201,7 +201,7 @@ public class Doc_Inventory extends Doc
|
|||
if (m_DocStatus.equals(MInventory.DOCSTATUS_Reversed) && m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctCr from Original Phys.Inventory
|
||||
if (!cr.updateReverseLine (MInventory.Table_ID,
|
||||
if (!cr.updateReverseLine (MInventory.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Physical Inventory not posted yet";
|
||||
|
@ -212,10 +212,10 @@ public class Doc_Inventory extends Doc
|
|||
|
||||
// Cost Detail
|
||||
/* Source move to MInventory.createCostDetail()
|
||||
MCostDetail.createInventory(as, line.getAD_Org_ID(),
|
||||
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
|
||||
line.get_ID(), 0,
|
||||
costs, line.getQty(),
|
||||
MCostDetail.createInventory(as, line.getAD_Org_ID(),
|
||||
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
|
||||
line.get_ID(), 0,
|
||||
costs, line.getQty(),
|
||||
line.getDescription(), getTrxName());*/
|
||||
}
|
||||
//
|
||||
|
|
|
@ -46,20 +46,20 @@ import org.compiere.util.Env;
|
|||
* @author Jorg Janke
|
||||
* @author Armen Rizal, Goodwill Consulting
|
||||
* <li>BF: 2797257 Landed Cost Detail is not using allocation qty
|
||||
*
|
||||
*
|
||||
* @version $Id: Doc_Invoice.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $
|
||||
*/
|
||||
public class Doc_Invoice extends Doc
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schemata
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_Invoice(MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_Invoice(MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, MInvoice.class, rs, null, trxName);
|
||||
super (as, MInvoice.class, rs, null, trxName);
|
||||
} // Doc_Invoice
|
||||
|
||||
/** Contained Optional Tax Lines */
|
||||
|
@ -84,7 +84,7 @@ public class Doc_Invoice extends Doc
|
|||
setAmount(Doc.AMTTYPE_Gross, invoice.getGrandTotal());
|
||||
setAmount(Doc.AMTTYPE_Net, invoice.getTotalLines());
|
||||
setAmount(Doc.AMTTYPE_Charge, invoice.getChargeAmt());
|
||||
|
||||
|
||||
// Contained Objects
|
||||
m_taxes = loadTaxes();
|
||||
p_lines = loadLines(invoice);
|
||||
|
@ -119,7 +119,7 @@ public class Doc_Invoice extends Doc
|
|||
BigDecimal amount = rs.getBigDecimal(5);
|
||||
boolean salesTax = "Y".equals(rs.getString(6));
|
||||
//
|
||||
DocTax taxLine = new DocTax(C_Tax_ID, name, rate,
|
||||
DocTax taxLine = new DocTax(C_Tax_ID, name, rate,
|
||||
taxBaseAmt, amount, salesTax);
|
||||
log.fine(taxLine.toString());
|
||||
list.add(taxLine);
|
||||
|
@ -159,7 +159,7 @@ public class Doc_Invoice extends Doc
|
|||
DocLine docLine = new DocLine(line, this);
|
||||
// Qty
|
||||
BigDecimal Qty = line.getQtyInvoiced();
|
||||
boolean cm = getDocumentType().equals(DOCTYPE_ARCredit)
|
||||
boolean cm = getDocumentType().equals(DOCTYPE_ARCredit)
|
||||
|| getDocumentType().equals(DOCTYPE_APCredit);
|
||||
docLine.setQty(cm ? Qty.negate() : Qty, invoice.isSOTrx());
|
||||
//
|
||||
|
@ -187,7 +187,7 @@ public class Doc_Invoice extends Doc
|
|||
PriceList = PriceList.subtract(PriceListTax);
|
||||
}
|
||||
} // correct included Tax
|
||||
|
||||
|
||||
docLine.setAmount (LineNetAmt, PriceList, Qty); // qty for discount calc
|
||||
if (docLine.isItem())
|
||||
m_allLinesService = false;
|
||||
|
@ -197,7 +197,7 @@ public class Doc_Invoice extends Doc
|
|||
log.fine(docLine.toString());
|
||||
list.add(docLine);
|
||||
}
|
||||
|
||||
|
||||
// Convert to Array
|
||||
DocLine[] dls = new DocLine[list.size()];
|
||||
list.toArray(dls);
|
||||
|
@ -209,7 +209,7 @@ public class Doc_Invoice extends Doc
|
|||
{
|
||||
if (m_taxes[i].isIncludedTaxDifference())
|
||||
{
|
||||
BigDecimal diff = m_taxes[i].getIncludedTaxDifference();
|
||||
BigDecimal diff = m_taxes[i].getIncludedTaxDifference();
|
||||
for (int j = 0; j < dls.length; j++)
|
||||
{
|
||||
if (dls[j].getC_Tax_ID() == m_taxes[i].getC_Tax_ID())
|
||||
|
@ -221,7 +221,7 @@ public class Doc_Invoice extends Doc
|
|||
} // tax difference
|
||||
} // for all taxes
|
||||
} // Included Tax difference
|
||||
|
||||
|
||||
// Return Array
|
||||
return dls;
|
||||
} // loadLines
|
||||
|
@ -237,7 +237,7 @@ public class Doc_Invoice extends Doc
|
|||
return m_precision;
|
||||
} // getPrecision
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Get Source Currency Balance - subtracts line and tax amounts from total - no rounding
|
||||
* @return positive amount, if total invoice is bigger than lines
|
||||
|
@ -313,12 +313,12 @@ public class Doc_Invoice extends Doc
|
|||
return facts;
|
||||
|
||||
// ** ARI, ARF
|
||||
if (getDocumentType().equals(DOCTYPE_ARInvoice)
|
||||
if (getDocumentType().equals(DOCTYPE_ARInvoice)
|
||||
|| getDocumentType().equals(DOCTYPE_ARProForma))
|
||||
{
|
||||
BigDecimal grossAmt = getAmount(Doc.AMTTYPE_Gross);
|
||||
BigDecimal serviceAmt = Env.ZERO;
|
||||
|
||||
|
||||
// Header Charge CR
|
||||
BigDecimal amt = getAmount(Doc.AMTTYPE_Charge);
|
||||
if (amt != null && amt.signum() != 0)
|
||||
|
@ -372,11 +372,11 @@ public class Doc_Invoice extends Doc
|
|||
fLines[i].setLocationFromBPartner(getC_BPartner_Location_ID(), false); // to Loc
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Receivables DR
|
||||
int receivables_ID = getValidCombination_ID(Doc.ACCTTYPE_C_Receivable, as);
|
||||
int receivablesServices_ID = getValidCombination_ID (Doc.ACCTTYPE_C_Receivable_Services, as);
|
||||
if (m_allLinesItem || !as.isPostServices()
|
||||
if (m_allLinesItem || !as.isPostServices()
|
||||
|| receivables_ID == receivablesServices_ID)
|
||||
{
|
||||
grossAmt = getAmount(Doc.AMTTYPE_Gross);
|
||||
|
@ -456,7 +456,7 @@ public class Doc_Invoice extends Doc
|
|||
// Receivables CR
|
||||
int receivables_ID = getValidCombination_ID (Doc.ACCTTYPE_C_Receivable, as);
|
||||
int receivablesServices_ID = getValidCombination_ID (Doc.ACCTTYPE_C_Receivable_Services, as);
|
||||
if (m_allLinesItem || !as.isPostServices()
|
||||
if (m_allLinesItem || !as.isPostServices()
|
||||
|| receivables_ID == receivablesServices_ID)
|
||||
{
|
||||
grossAmt = getAmount(Doc.AMTTYPE_Gross);
|
||||
|
@ -474,7 +474,7 @@ public class Doc_Invoice extends Doc
|
|||
fact.createLine(null, MAccount.get(getCtx(), receivablesServices_ID),
|
||||
getC_Currency_ID(), null, serviceAmt);
|
||||
}
|
||||
|
||||
|
||||
// ** API
|
||||
else if (getDocumentType().equals(DOCTYPE_APInvoice))
|
||||
{
|
||||
|
@ -540,7 +540,7 @@ public class Doc_Invoice extends Doc
|
|||
//
|
||||
if (line.getM_Product_ID() != 0
|
||||
&& line.getProduct().isService()) // otherwise Inv Matching
|
||||
MCostDetail.createInvoice(as, line.getAD_Org_ID(),
|
||||
MCostDetail.createInvoice(as, line.getAD_Org_ID(),
|
||||
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
|
||||
line.get_ID(), 0, // No Cost Element
|
||||
line.getAmtSource(), line.getQty(),
|
||||
|
@ -561,7 +561,7 @@ public class Doc_Invoice extends Doc
|
|||
// Liability CR
|
||||
int payables_ID = getValidCombination_ID (Doc.ACCTTYPE_V_Liability, as);
|
||||
int payablesServices_ID = getValidCombination_ID (Doc.ACCTTYPE_V_Liability_Services, as);
|
||||
if (m_allLinesItem || !as.isPostServices()
|
||||
if (m_allLinesItem || !as.isPostServices()
|
||||
|| payables_ID == payablesServices_ID)
|
||||
{
|
||||
grossAmt = getAmount(Doc.AMTTYPE_Gross);
|
||||
|
@ -646,7 +646,7 @@ public class Doc_Invoice extends Doc
|
|||
//
|
||||
if (line.getM_Product_ID() != 0
|
||||
&& line.getProduct().isService()) // otherwise Inv Matching
|
||||
MCostDetail.createInvoice(as, line.getAD_Org_ID(),
|
||||
MCostDetail.createInvoice(as, line.getAD_Org_ID(),
|
||||
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
|
||||
line.get_ID(), 0, // No Cost Element
|
||||
line.getAmtSource().negate(), line.getQty(),
|
||||
|
@ -666,7 +666,7 @@ public class Doc_Invoice extends Doc
|
|||
// Liability DR
|
||||
int payables_ID = getValidCombination_ID (Doc.ACCTTYPE_V_Liability, as);
|
||||
int payablesServices_ID = getValidCombination_ID (Doc.ACCTTYPE_V_Liability_Services, as);
|
||||
if (m_allLinesItem || !as.isPostServices()
|
||||
if (m_allLinesItem || !as.isPostServices()
|
||||
|| payables_ID == payablesServices_ID)
|
||||
{
|
||||
grossAmt = getAmount(Doc.AMTTYPE_Gross);
|
||||
|
@ -694,7 +694,7 @@ public class Doc_Invoice extends Doc
|
|||
facts.add(fact);
|
||||
return facts;
|
||||
} // createFact
|
||||
|
||||
|
||||
/**
|
||||
* Create Fact Cash Based (i.e. only revenue/expense)
|
||||
* @param as accounting schema
|
||||
|
@ -798,8 +798,8 @@ public class Doc_Invoice extends Doc
|
|||
}
|
||||
return acctAmt;
|
||||
} // createFactCash
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Create Landed Cost accounting & Cost lines
|
||||
* @param as accounting schema
|
||||
|
@ -808,19 +808,19 @@ public class Doc_Invoice extends Doc
|
|||
* @param dr DR entry (normal api)
|
||||
* @return true if landed costs were created
|
||||
*/
|
||||
private boolean landedCost (MAcctSchema as, Fact fact, DocLine line, boolean dr)
|
||||
private boolean landedCost (MAcctSchema as, Fact fact, DocLine line, boolean dr)
|
||||
{
|
||||
int C_InvoiceLine_ID = line.get_ID();
|
||||
MLandedCostAllocation[] lcas = MLandedCostAllocation.getOfInvoiceLine(
|
||||
getCtx(), C_InvoiceLine_ID, getTrxName());
|
||||
if (lcas.length == 0)
|
||||
return false;
|
||||
|
||||
|
||||
// Calculate Total Base
|
||||
double totalBase = 0;
|
||||
for (int i = 0; i < lcas.length; i++)
|
||||
totalBase += lcas[i].getBase().doubleValue();
|
||||
|
||||
|
||||
// Create New
|
||||
MInvoiceLine il = new MInvoiceLine (getCtx(), C_InvoiceLine_ID, getTrxName());
|
||||
for (int i = 0; i < lcas.length; i++)
|
||||
|
@ -835,10 +835,10 @@ public class Doc_Invoice extends Doc
|
|||
else
|
||||
desc += " - " + percent + "%";
|
||||
if (line.getDescription() != null)
|
||||
desc += " - " + line.getDescription();
|
||||
|
||||
desc += " - " + line.getDescription();
|
||||
|
||||
// Accounting
|
||||
ProductCost pc = new ProductCost (Env.getCtx(),
|
||||
ProductCost pc = new ProductCost (Env.getCtx(),
|
||||
lca.getM_Product_ID(), lca.getM_AttributeSetInstance_ID(), getTrxName());
|
||||
BigDecimal drAmt = null;
|
||||
BigDecimal crAmt = null;
|
||||
|
@ -850,13 +850,13 @@ public class Doc_Invoice extends Doc
|
|||
getC_Currency_ID(), drAmt, crAmt);
|
||||
fl.setDescription(desc);
|
||||
fl.setM_Product_ID(lca.getM_Product_ID());
|
||||
|
||||
|
||||
// Cost Detail - Convert to AcctCurrency
|
||||
BigDecimal allocationAmt = lca.getAmt();
|
||||
if (getC_Currency_ID() != as.getC_Currency_ID())
|
||||
allocationAmt = MConversionRate.convert(getCtx(), allocationAmt,
|
||||
allocationAmt = MConversionRate.convert(getCtx(), allocationAmt,
|
||||
getC_Currency_ID(), as.getC_Currency_ID(),
|
||||
getDateAcct(), getC_ConversionType_ID(),
|
||||
getDateAcct(), getC_ConversionType_ID(),
|
||||
getAD_Client_ID(), getAD_Org_ID());
|
||||
if (allocationAmt.scale() > as.getCostingPrecision())
|
||||
allocationAmt = allocationAmt.setScale(as.getCostingPrecision(), BigDecimal.ROUND_HALF_UP);
|
||||
|
@ -864,14 +864,14 @@ public class Doc_Invoice extends Doc
|
|||
allocationAmt = allocationAmt.negate();
|
||||
// AZ Goodwill
|
||||
// use createInvoice to create/update non Material Cost Detail
|
||||
MCostDetail.createInvoice(as, lca.getAD_Org_ID(),
|
||||
MCostDetail.createInvoice(as, lca.getAD_Org_ID(),
|
||||
lca.getM_Product_ID(), lca.getM_AttributeSetInstance_ID(),
|
||||
C_InvoiceLine_ID, lca.getM_CostElement_ID(),
|
||||
allocationAmt, lca.getQty(),
|
||||
desc, getTrxName());
|
||||
// end AZ
|
||||
}
|
||||
|
||||
|
||||
log.config("Created #" + lcas.length);
|
||||
return true;
|
||||
} // landedCosts
|
||||
|
@ -885,7 +885,7 @@ public class Doc_Invoice extends Doc
|
|||
MClientInfo ci = MClientInfo.get(getCtx(), as.getAD_Client_ID());
|
||||
if (ci.getC_AcctSchema1_ID() != as.getC_AcctSchema_ID())
|
||||
return;
|
||||
|
||||
|
||||
StringBuffer sql = new StringBuffer (
|
||||
"UPDATE M_Product_PO po "
|
||||
+ "SET PriceLastInv = "
|
||||
|
@ -899,7 +899,7 @@ public class Doc_Invoice extends Doc
|
|||
{
|
||||
sql.append(" AND ROWNUM=1 ");
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
sql.append(" AND il.C_InvoiceLine_ID = (SELECT MIN(il1.C_InvoiceLine_ID) "
|
||||
+ "FROM C_Invoice i1, C_InvoiceLine il1 "
|
||||
|
@ -917,7 +917,7 @@ public class Doc_Invoice extends Doc
|
|||
int no = DB.executeUpdate(sql.toString(), getTrxName());
|
||||
log.fine("Updated=" + no);
|
||||
} // updateProductPO
|
||||
|
||||
|
||||
/**
|
||||
* Update Product Info (old).
|
||||
* - Costing (PriceLastInv)
|
||||
|
|
|
@ -42,8 +42,8 @@ import org.compiere.util.Env;
|
|||
* Update Costing Records
|
||||
* @author Jorg Janke
|
||||
* @version $Id: Doc_MatchInv.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $
|
||||
*
|
||||
* FR [ 1840016 ] Avoid usage of clearing accounts - subject to C_AcctSchema.IsPostIfClearingEqual
|
||||
*
|
||||
* FR [ 1840016 ] Avoid usage of clearing accounts - subject to C_AcctSchema.IsPostIfClearingEqual
|
||||
* Avoid posting if both accounts Not Invoiced Receipts and Inventory Clearing are equal
|
||||
* BF [ 2789949 ] Multicurrency in matching posting
|
||||
*/
|
||||
|
@ -51,25 +51,25 @@ public class Doc_MatchInv extends Doc
|
|||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param ass accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_MatchInv (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_MatchInv (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super(ass, MMatchInv.class, rs, DOCTYPE_MatMatchInv, trxName);
|
||||
super(as, MMatchInv.class, rs, DOCTYPE_MatMatchInv, trxName);
|
||||
} // Doc_MatchInv
|
||||
|
||||
/** Invoice Line */
|
||||
private MInvoiceLine m_invoiceLine = null;
|
||||
/** Material Receipt */
|
||||
private MInOutLine m_receiptLine = null;
|
||||
|
||||
|
||||
private ProductCost m_pc = null;
|
||||
|
||||
/** Commitments */
|
||||
// private DocLine[] m_commitments = null;
|
||||
|
||||
|
||||
/**
|
||||
* Load Specific Document Details
|
||||
* @return error message or null
|
||||
|
@ -84,16 +84,16 @@ public class Doc_MatchInv extends Doc
|
|||
int C_InvoiceLine_ID = matchInv.getC_InvoiceLine_ID();
|
||||
m_invoiceLine = new MInvoiceLine (getCtx(), C_InvoiceLine_ID, null);
|
||||
// BP for NotInvoicedReceipts
|
||||
int C_BPartner_ID = m_invoiceLine.getParent().getC_BPartner_ID();
|
||||
int C_BPartner_ID = m_invoiceLine.getParent().getC_BPartner_ID();
|
||||
setC_BPartner_ID(C_BPartner_ID);
|
||||
//
|
||||
int M_InOutLine_ID = matchInv.getM_InOutLine_ID();
|
||||
m_receiptLine = new MInOutLine (getCtx(), M_InOutLine_ID, null);
|
||||
m_receiptLine = new MInOutLine (getCtx(), M_InOutLine_ID, null);
|
||||
//
|
||||
m_pc = new ProductCost (Env.getCtx(),
|
||||
m_pc = new ProductCost (Env.getCtx(),
|
||||
getM_Product_ID(), matchInv.getM_AttributeSetInstance_ID(), null);
|
||||
m_pc.setQty(getQty());
|
||||
|
||||
|
||||
return null;
|
||||
} // loadDocumentDetails
|
||||
|
||||
|
@ -107,7 +107,7 @@ public class Doc_MatchInv extends Doc
|
|||
return Env.ZERO;
|
||||
} // getBalance
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Create Facts (the accounting logic) for
|
||||
* MXI.
|
||||
|
@ -136,7 +136,7 @@ public class Doc_MatchInv extends Doc
|
|||
return facts;
|
||||
}
|
||||
// MMatchInv matchInv = (MMatchInv)getPO();
|
||||
|
||||
|
||||
// create Fact Header
|
||||
Fact fact = new Fact(this, as, Fact.POST_Actual);
|
||||
setC_Currency_ID (as.getC_Currency_ID());
|
||||
|
@ -149,8 +149,8 @@ public class Doc_MatchInv extends Doc
|
|||
return fact;
|
||||
}
|
||||
**/
|
||||
|
||||
|
||||
|
||||
|
||||
// NotInvoicedReceipt DR
|
||||
// From Receipt
|
||||
BigDecimal multiplier = getQty()
|
||||
|
@ -178,7 +178,7 @@ public class Doc_MatchInv extends Doc
|
|||
p_Error = "Mat.Receipt not posted yet";
|
||||
return null;
|
||||
}
|
||||
log.fine("CR - Amt(" + temp + "->" + dr.getAcctBalance()
|
||||
log.fine("CR - Amt(" + temp + "->" + dr.getAcctBalance()
|
||||
+ ") - " + dr.toString());
|
||||
|
||||
// InventoryClearing CR
|
||||
|
@ -203,7 +203,7 @@ public class Doc_MatchInv extends Doc
|
|||
{
|
||||
log.fine("Line Net Amt=0 - M_Product_ID=" + getM_Product_ID()
|
||||
+ ",Qty=" + getQty() + ",InOutQty=" + m_receiptLine.getMovementQty());
|
||||
|
||||
|
||||
// Invoice Price Variance
|
||||
BigDecimal ipv = dr.getSourceBalance().negate();
|
||||
if (ipv.signum() != 0)
|
||||
|
@ -235,14 +235,14 @@ public class Doc_MatchInv extends Doc
|
|||
p_Error = "Invoice not posted yet";
|
||||
return null;
|
||||
}
|
||||
log.fine("DR - Amt(" + temp + "->" + cr.getAcctBalance()
|
||||
log.fine("DR - Amt(" + temp + "->" + cr.getAcctBalance()
|
||||
+ ") - " + cr.toString());
|
||||
}
|
||||
else // Cash Acct
|
||||
{
|
||||
MInvoice invoice = m_invoiceLine.getParent();
|
||||
if (as.getC_Currency_ID() != invoice.getC_Currency_ID())
|
||||
LineNetAmt = MConversionRate.convert(getCtx(), LineNetAmt,
|
||||
LineNetAmt = MConversionRate.convert(getCtx(), LineNetAmt,
|
||||
invoice.getC_Currency_ID(), as.getC_Currency_ID(),
|
||||
invoice.getDateAcct(), invoice.getC_ConversionType_ID(),
|
||||
invoice.getAD_Client_ID(), invoice.getAD_Org_ID());
|
||||
|
@ -260,32 +260,32 @@ public class Doc_MatchInv extends Doc
|
|||
cr.setUser2_ID(m_invoiceLine.getUser2_ID());
|
||||
|
||||
//AZ Goodwill
|
||||
//Desc: Source Not Balanced problem because Currency is Difference - PO=CNY but AP=USD
|
||||
//Desc: Source Not Balanced problem because Currency is Difference - PO=CNY but AP=USD
|
||||
//see also Fact.java: checking for isMultiCurrency()
|
||||
if (dr.getC_Currency_ID() != cr.getC_Currency_ID())
|
||||
setIsMultiCurrency(true);
|
||||
//end AZ
|
||||
|
||||
|
||||
// Avoid usage of clearing accounts
|
||||
// If both accounts Not Invoiced Receipts and Inventory Clearing are equal
|
||||
// then remove the posting
|
||||
|
||||
|
||||
MAccount acct_db = dr.getAccount(); // not_invoiced_receipts
|
||||
MAccount acct_cr = cr.getAccount(); // inventory_clearing
|
||||
|
||||
|
||||
if ((!as.isPostIfClearingEqual()) && acct_db.equals(acct_cr) && (!isInterOrg)) {
|
||||
|
||||
|
||||
BigDecimal debit = dr.getAmtSourceDr();
|
||||
BigDecimal credit = cr.getAmtSourceCr();
|
||||
|
||||
|
||||
if (debit.compareTo(credit) == 0) {
|
||||
fact.remove(dr);
|
||||
fact.remove(cr);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// End Avoid usage of clearing accounts
|
||||
|
||||
|
||||
|
||||
// Invoice Price Variance difference
|
||||
BigDecimal ipv = cr.getAcctBalance().add(dr.getAcctBalance()).negate();
|
||||
|
@ -304,8 +304,8 @@ public class Doc_MatchInv extends Doc
|
|||
pv.setUser2_ID(m_invoiceLine.getUser2_ID());
|
||||
}
|
||||
log.fine("IPV=" + ipv + "; Balance=" + fact.getSourceBalance());
|
||||
|
||||
// Elaine 2008/6/20
|
||||
|
||||
// Elaine 2008/6/20
|
||||
/* Source move to MInvoice.createMatchInvCostDetail()
|
||||
// Cost Detail Record - data from Expense/IncClearing (CR) record
|
||||
// MZ Goodwill
|
||||
|
@ -324,12 +324,12 @@ public class Doc_MatchInv extends Doc
|
|||
}
|
||||
}
|
||||
tAmt = tAmt.add(cr.getAcctBalance().negate()); //Invoice Price
|
||||
|
||||
|
||||
// Different currency
|
||||
MInvoice invoice = m_invoiceLine.getParent();
|
||||
if (as.getC_Currency_ID() != invoice.getC_Currency_ID())
|
||||
{
|
||||
tAmt = MConversionRate.convert(getCtx(), tAmt,
|
||||
tAmt = MConversionRate.convert(getCtx(), tAmt,
|
||||
invoice.getC_Currency_ID(), as.getC_Currency_ID(),
|
||||
invoice.getDateAcct(), invoice.getC_ConversionType_ID(),
|
||||
invoice.getAD_Client_ID(), invoice.getAD_Org_ID());
|
||||
|
@ -339,37 +339,37 @@ public class Doc_MatchInv extends Doc
|
|||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// set Qty to negative value when MovementType is Vendor Returns
|
||||
MInOut receipt = m_receiptLine.getParent();
|
||||
if (receipt.getMovementType().equals(MInOut.MOVEMENTTYPE_VendorReturns))
|
||||
tQty = tQty.add(getQty().negate()); // Qty is set to negative value
|
||||
else
|
||||
tQty = tQty.add(getQty());
|
||||
|
||||
// Set Total Amount and Total Quantity from Matched Invoice
|
||||
MCostDetail.createInvoice(as, getAD_Org_ID(),
|
||||
|
||||
// Set Total Amount and Total Quantity from Matched Invoice
|
||||
MCostDetail.createInvoice(as, getAD_Org_ID(),
|
||||
getM_Product_ID(), matchInv.getM_AttributeSetInstance_ID(),
|
||||
m_invoiceLine.getC_InvoiceLine_ID(), 0, // No cost element
|
||||
tAmt, tQty, getDescription(), getTrxName());
|
||||
// end MZ
|
||||
*/
|
||||
// Update Costing
|
||||
updateProductInfo(as.getC_AcctSchema_ID(),
|
||||
updateProductInfo(as.getC_AcctSchema_ID(),
|
||||
MAcctSchema.COSTINGMETHOD_StandardCosting.equals(as.getCostingMethod()));
|
||||
//
|
||||
facts.add(fact);
|
||||
|
||||
|
||||
/** Commitment release ****/
|
||||
if (as.isAccrual() && as.isCreatePOCommitment())
|
||||
{
|
||||
fact = Doc_Order.getCommitmentRelease(as, this,
|
||||
fact = Doc_Order.getCommitmentRelease(as, this,
|
||||
getQty(), m_invoiceLine.getC_InvoiceLine_ID(), Env.ONE);
|
||||
if (fact == null)
|
||||
return null;
|
||||
facts.add(fact);
|
||||
} // Commitment
|
||||
|
||||
|
||||
return facts;
|
||||
} // createFact
|
||||
|
||||
|
@ -386,7 +386,7 @@ public class Doc_MatchInv extends Doc
|
|||
// verify if org of receipt line is different from org of invoice line
|
||||
if (m_receiptLine != null && m_invoiceLine != null && m_receiptLine.getAD_Org_ID() != m_invoiceLine.getAD_Org_ID())
|
||||
return true;
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -422,7 +422,7 @@ public class Doc_MatchInv extends Doc
|
|||
+ "WHERE pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(
|
||||
" AND EXISTS (SELECT * FROM M_MatchInv m "
|
||||
+ "WHERE pc.M_Product_ID=m.M_Product_ID"
|
||||
+ " AND m.M_MatchInv_ID=").append(get_ID()).append(")");
|
||||
+ " AND m.M_MatchInv_ID=").append(get_ID()).append(")");
|
||||
int no = DB.executeUpdate(sql.toString(), getTrxName());
|
||||
log.fine("M_Product_Costing - Qty/Amt Updated #=" + no);
|
||||
|
||||
|
@ -434,7 +434,7 @@ public class Doc_MatchInv extends Doc
|
|||
.append(" AND M_Product_ID=").append(getM_Product_ID());
|
||||
no = DB.executeUpdate(sql.toString(), getTrxName());
|
||||
log.fine("M_Product_Costing - AvgCost Updated #=" + no);
|
||||
|
||||
|
||||
|
||||
// Update Current Cost
|
||||
if (!standardCosting)
|
||||
|
|
|
@ -50,13 +50,13 @@ public class Doc_MatchPO extends Doc
|
|||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schemata
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_MatchPO (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_MatchPO (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super(ass, MMatchPO.class, rs, DOCTYPE_MatMatchPO, trxName);
|
||||
super(as, MMatchPO.class, rs, DOCTYPE_MatMatchPO, trxName);
|
||||
} // Doc_MatchPO
|
||||
|
||||
private int m_C_OrderLine_ID = 0;
|
||||
|
@ -65,7 +65,7 @@ public class Doc_MatchPO extends Doc
|
|||
private int m_M_InOutLine_ID = 0;
|
||||
private MInOutLine m_ioLine = null;
|
||||
private int m_C_InvoiceLine_ID = 0;
|
||||
|
||||
|
||||
private ProductCost m_pc;
|
||||
private int m_M_AttributeSetInstance_ID = 0;
|
||||
|
||||
|
@ -86,18 +86,18 @@ public class Doc_MatchPO extends Doc
|
|||
m_oLine = new MOrderLine (getCtx(), m_C_OrderLine_ID, getTrxName());
|
||||
//
|
||||
m_M_InOutLine_ID = matchPO.getM_InOutLine_ID();
|
||||
m_ioLine = new MInOutLine (getCtx(), m_M_InOutLine_ID, null);
|
||||
|
||||
m_ioLine = new MInOutLine (getCtx(), m_M_InOutLine_ID, null);
|
||||
|
||||
m_C_InvoiceLine_ID = matchPO.getC_InvoiceLine_ID();
|
||||
|
||||
|
||||
//
|
||||
m_pc = new ProductCost (Env.getCtx(),
|
||||
m_pc = new ProductCost (Env.getCtx(),
|
||||
getM_Product_ID(), m_M_AttributeSetInstance_ID, getTrxName());
|
||||
m_pc.setQty(getQty());
|
||||
return null;
|
||||
} // loadDocumentDetails
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Get Source Currency Balance - subtracts line and tax amounts from total - no rounding
|
||||
* @return Zero - always balanced
|
||||
|
@ -107,7 +107,7 @@ public class Doc_MatchPO extends Doc
|
|||
return Env.ZERO;
|
||||
} // getBalance
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Create Facts (the accounting logic) for
|
||||
* MXP.
|
||||
|
@ -135,19 +135,19 @@ public class Doc_MatchPO extends Doc
|
|||
Fact fact = new Fact(this, as, Fact.POST_Actual);
|
||||
setC_Currency_ID(as.getC_Currency_ID());
|
||||
boolean isInterOrg = isInterOrg(as);
|
||||
|
||||
|
||||
// Purchase Order Line
|
||||
BigDecimal poCost = m_oLine.getPriceCost();
|
||||
if (poCost == null || poCost.signum() == 0)
|
||||
poCost = m_oLine.getPriceActual();
|
||||
|
||||
MInOutLine receiptLine = new MInOutLine (getCtx(), m_M_InOutLine_ID, getTrxName());
|
||||
MInOut inOut = receiptLine.getParent();
|
||||
|
||||
MInOutLine receiptLine = new MInOutLine (getCtx(), m_M_InOutLine_ID, getTrxName());
|
||||
MInOut inOut = receiptLine.getParent();
|
||||
boolean isReturnTrx = inOut.getMovementType().equals(X_M_InOut.MOVEMENTTYPE_VendorReturns);
|
||||
|
||||
|
||||
// calculate po cost
|
||||
poCost = poCost.multiply(getQty()); // Delivered so far
|
||||
|
||||
|
||||
// Different currency
|
||||
if (m_oLine.getC_Currency_ID() != as.getC_Currency_ID())
|
||||
{
|
||||
|
@ -171,7 +171,7 @@ public class Doc_MatchPO extends Doc
|
|||
MProduct product = MProduct.get(getCtx(), getM_Product_ID());
|
||||
String costingMethod = product.getCostingMethod(as);
|
||||
//get standard cost and also make sure cost for other costing method is updated
|
||||
BigDecimal costs = m_pc.getProductCosts(as, getAD_Org_ID(),
|
||||
BigDecimal costs = m_pc.getProductCosts(as, getAD_Org_ID(),
|
||||
MAcctSchema.COSTINGMETHOD_StandardCosting, m_C_OrderLine_ID, false); // non-zero costs
|
||||
|
||||
if (MAcctSchema.COSTINGMETHOD_StandardCosting.equals(costingMethod))
|
||||
|
@ -183,7 +183,7 @@ public class Doc_MatchPO extends Doc
|
|||
log.log(Level.SEVERE, p_Error);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
// Difference
|
||||
BigDecimal difference = poCost.subtract(costs);
|
||||
// Nothing to post
|
||||
|
@ -192,7 +192,7 @@ public class Doc_MatchPO extends Doc
|
|||
log.log(Level.FINE, "No Cost Difference for M_Product_ID=" + getM_Product_ID());
|
||||
return facts;
|
||||
}
|
||||
|
||||
|
||||
// Product PPV
|
||||
FactLine cr = fact.createLine(null,
|
||||
m_pc.getAccount(ProductCost.ACCTTYPE_P_PPV, as),
|
||||
|
@ -210,7 +210,7 @@ public class Doc_MatchPO extends Doc
|
|||
cr.setUser1_ID(m_oLine.getUser1_ID());
|
||||
cr.setUser2_ID(m_oLine.getUser2_ID());
|
||||
}
|
||||
|
||||
|
||||
// PPV Offset
|
||||
FactLine dr = fact.createLine(null,
|
||||
getAccount(Doc.ACCTTYPE_PPVOffset, as),
|
||||
|
@ -228,27 +228,27 @@ public class Doc_MatchPO extends Doc
|
|||
dr.setUser1_ID(m_oLine.getUser1_ID());
|
||||
dr.setUser2_ID(m_oLine.getUser2_ID());
|
||||
}
|
||||
|
||||
|
||||
// Avoid usage of clearing accounts
|
||||
// If both accounts Purchase Price Variance and Purchase Price Variance Offset are equal
|
||||
// then remove the posting
|
||||
|
||||
|
||||
MAccount acct_db = dr.getAccount(); // PPV
|
||||
MAccount acct_cr = cr.getAccount(); // PPV Offset
|
||||
|
||||
|
||||
if ((!as.isPostIfClearingEqual()) && acct_db.equals(acct_cr) && (!isInterOrg)) {
|
||||
|
||||
|
||||
BigDecimal debit = dr.getAmtSourceDr();
|
||||
BigDecimal credit = cr.getAmtSourceCr();
|
||||
|
||||
|
||||
if (debit.compareTo(credit) == 0) {
|
||||
fact.remove(dr);
|
||||
fact.remove(cr);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// End Avoid usage of clearing accounts
|
||||
|
||||
|
||||
//
|
||||
facts.add(fact);
|
||||
return facts;
|
||||
|
@ -258,7 +258,7 @@ public class Doc_MatchPO extends Doc
|
|||
return facts;
|
||||
}
|
||||
} // createFact
|
||||
|
||||
|
||||
/** Verify if the posting involves two or more organizations
|
||||
@return true if there are more than one org involved on the posting
|
||||
*/
|
||||
|
@ -274,7 +274,7 @@ public class Doc_MatchPO extends Doc
|
|||
if (m_ioLine != null && m_oLine != null
|
||||
&& m_ioLine.getAD_Org_ID() != m_oLine.getAD_Org_ID())
|
||||
return true;
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,16 +42,16 @@ public class Doc_Movement extends Doc
|
|||
{
|
||||
private int m_Reversal_ID = 0;
|
||||
private String m_DocStatus = "";
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_Movement (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_Movement (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, MMovement.class, rs, DOCTYPE_MatMovement, trxName);
|
||||
super (as, MMovement.class, rs, DOCTYPE_MatMovement, trxName);
|
||||
} // Doc_Movement
|
||||
|
||||
/**
|
||||
|
@ -132,7 +132,7 @@ public class Doc_Movement extends Doc
|
|||
{
|
||||
DocLine line = p_lines[i];
|
||||
// MZ Goodwill
|
||||
// if Inventory Move CostDetail exist then get Cost from Cost Detail
|
||||
// if Inventory Move CostDetail exist then get Cost from Cost Detail
|
||||
BigDecimal costs = line.getProductCosts(as, line.getAD_Org_ID(), true, "M_MovementLine_ID=? AND IsSOTrx='N'");
|
||||
// end MZ
|
||||
|
||||
|
@ -147,14 +147,14 @@ public class Doc_Movement extends Doc
|
|||
if (m_DocStatus.equals(MMovement.DOCSTATUS_Reversed) && m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctDr from Original Movement
|
||||
if (!dr.updateReverseLine (MMovement.Table_ID,
|
||||
if (!dr.updateReverseLine (MMovement.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Inventory Move not posted yet";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ** InventoryTo DR CR
|
||||
cr = fact.createLine(line,
|
||||
line.getAccount(ProductCost.ACCTTYPE_P_Asset, as),
|
||||
|
@ -166,7 +166,7 @@ public class Doc_Movement extends Doc
|
|||
if (m_DocStatus.equals(MMovement.DOCSTATUS_Reversed) && m_Reversal_ID !=0 && line.getReversalLine_ID() != 0)
|
||||
{
|
||||
// Set AmtAcctCr from Original Movement
|
||||
if (!cr.updateReverseLine (MMovement.Table_ID,
|
||||
if (!cr.updateReverseLine (MMovement.Table_ID,
|
||||
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
|
||||
{
|
||||
p_Error = "Original Inventory Move not posted yet";
|
||||
|
@ -192,7 +192,7 @@ public class Doc_Movement extends Doc
|
|||
costs.negate(), line.getQty().negate(), true,
|
||||
description + "(|->)", getTrxName());
|
||||
// Cost Detail To
|
||||
MCostDetail.createMovement(as, cr.getAD_Org_ID(), // locator org
|
||||
MCostDetail.createMovement(as, cr.getAD_Org_ID(), // locator org
|
||||
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
|
||||
line.get_ID(), 0,
|
||||
costs, line.getQty(), false,
|
||||
|
|
|
@ -49,13 +49,13 @@ public class Doc_Order extends Doc
|
|||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_Order (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_Order (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, MOrder.class, rs, null, trxName);
|
||||
super (as, MOrder.class, rs, null, trxName);
|
||||
} // Doc_Order
|
||||
|
||||
/** Contained Optional Tax Lines */
|
||||
|
@ -78,7 +78,7 @@ public class Doc_Order extends Doc
|
|||
setAmount(AMTTYPE_Gross, order.getGrandTotal());
|
||||
setAmount(AMTTYPE_Net, order.getTotalLines());
|
||||
setAmount(AMTTYPE_Charge, order.getChargeAmt());
|
||||
|
||||
|
||||
// Contained Objects
|
||||
m_taxes = loadTaxes();
|
||||
p_lines = loadLines(order);
|
||||
|
@ -136,7 +136,7 @@ public class Doc_Order extends Doc
|
|||
PriceList = PriceList.subtract(PriceListTax);
|
||||
}
|
||||
} // correct included Tax
|
||||
|
||||
|
||||
docLine.setAmount (LineNetAmt, PriceList, Qty);
|
||||
list.add(docLine);
|
||||
}
|
||||
|
@ -146,8 +146,8 @@ public class Doc_Order extends Doc
|
|||
list.toArray(dl);
|
||||
return dl;
|
||||
} // loadLines
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Load Requisitions
|
||||
* @return requisition lines of Order
|
||||
|
@ -208,14 +208,14 @@ public class Doc_Order extends Doc
|
|||
DB.close(rs, pstmt);
|
||||
rs = null; pstmt = null;
|
||||
}
|
||||
|
||||
|
||||
// Return Array
|
||||
DocLine[] dls = new DocLine[list.size ()];
|
||||
list.toArray (dls);
|
||||
return dls;
|
||||
} // loadRequisitions
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get Currency Precision
|
||||
* @return precision
|
||||
|
@ -254,7 +254,7 @@ public class Doc_Order extends Doc
|
|||
BigDecimal amount = rs.getBigDecimal(5);
|
||||
boolean salesTax = "Y".equals(rs.getString(6));
|
||||
//
|
||||
DocTax taxLine = new DocTax(C_Tax_ID, name, rate,
|
||||
DocTax taxLine = new DocTax(C_Tax_ID, name, rate,
|
||||
taxBaseAmt, amount, salesTax);
|
||||
list.add(taxLine);
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ public class Doc_Order extends Doc
|
|||
return tl;
|
||||
} // loadTaxes
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Get Source Currency Balance - subtracts line and tax amounts from total - no rounding
|
||||
* @return positive amount, if total invoice is bigger than lines
|
||||
|
@ -309,7 +309,7 @@ public class Doc_Order extends Doc
|
|||
sb.append("]");
|
||||
}
|
||||
//
|
||||
if (retValue.signum() != 0 // Sum of Cost(vs. Price) in lines may not add up
|
||||
if (retValue.signum() != 0 // Sum of Cost(vs. Price) in lines may not add up
|
||||
&& getDocumentType().equals(DOCTYPE_POrder)) // PO
|
||||
{
|
||||
log.fine(toString() + " Balance=" + retValue + sb.toString() + " (ignored)");
|
||||
|
@ -320,7 +320,7 @@ public class Doc_Order extends Doc
|
|||
return retValue;
|
||||
} // getBalance
|
||||
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* Create Facts (the accounting logic) for
|
||||
* SOO, POO.
|
||||
|
@ -377,7 +377,7 @@ public class Doc_Order extends Doc
|
|||
//
|
||||
facts.add(fact);
|
||||
}
|
||||
|
||||
|
||||
// Reverse Reservation
|
||||
if (as.isCreateReservation())
|
||||
{
|
||||
|
@ -446,12 +446,12 @@ public class Doc_Order extends Doc
|
|||
//
|
||||
facts.add(fact);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
return facts;
|
||||
} // createFact
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Update ProductPO PriceLastPO
|
||||
* @param as accounting schema
|
||||
|
@ -473,7 +473,7 @@ public class Doc_Order extends Doc
|
|||
{
|
||||
sql.append(" AND ROWNUM=1 ");
|
||||
}
|
||||
else
|
||||
else
|
||||
sql.append(" AND ol.C_OrderLine_ID = (SELECT MIN(ol1.C_OrderLine_ID) "
|
||||
+ "FROM C_Order o1, C_OrderLine ol1 "
|
||||
+ "WHERE o1.C_Order_ID=ol1.C_Order_ID"
|
||||
|
@ -488,8 +488,8 @@ public class Doc_Order extends Doc
|
|||
int no = DB.executeUpdate(sql.toString(), getTrxName());
|
||||
log.fine("Updated=" + no);
|
||||
} // updateProductPO
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get Commitments
|
||||
* @param doc document
|
||||
|
@ -545,7 +545,7 @@ public class Doc_Order extends Doc
|
|||
else
|
||||
LineNetAmt = Qty.multiply(PriceActual);
|
||||
maxQty = maxQty.subtract(Qty);
|
||||
|
||||
|
||||
docLine.setAmount (LineNetAmt); // DR
|
||||
BigDecimal PriceList = line.getPriceList();
|
||||
int C_Tax_ID = docLine.getC_Tax_ID();
|
||||
|
@ -562,7 +562,7 @@ public class Doc_Order extends Doc
|
|||
PriceList = PriceList.subtract(PriceListTax);
|
||||
}
|
||||
} // correct included Tax
|
||||
|
||||
|
||||
docLine.setAmount (LineNetAmt, PriceList, Qty);
|
||||
list.add(docLine);
|
||||
}
|
||||
|
@ -576,7 +576,7 @@ public class Doc_Order extends Doc
|
|||
DB.close(rs, pstmt);
|
||||
rs = null; pstmt = null;
|
||||
}
|
||||
|
||||
|
||||
// Return Array
|
||||
DocLine[] dl = new DocLine[list.size()];
|
||||
list.toArray(dl);
|
||||
|
@ -593,13 +593,13 @@ public class Doc_Order extends Doc
|
|||
* @param multiplier 1 for accrual
|
||||
* @return Fact
|
||||
*/
|
||||
protected static Fact getCommitmentRelease(MAcctSchema as, Doc doc,
|
||||
protected static Fact getCommitmentRelease(MAcctSchema as, Doc doc,
|
||||
BigDecimal Qty, int C_InvoiceLine_ID, BigDecimal multiplier)
|
||||
{
|
||||
Fact fact = new Fact(doc, as, Fact.POST_Commitment);
|
||||
DocLine[] commitments = Doc_Order.getCommitments(doc, Qty,
|
||||
DocLine[] commitments = Doc_Order.getCommitments(doc, Qty,
|
||||
C_InvoiceLine_ID);
|
||||
|
||||
|
||||
BigDecimal total = Env.ZERO;
|
||||
FactLine fl = null;
|
||||
int C_Currency_ID = -1;
|
||||
|
@ -634,7 +634,7 @@ public class Doc_Order extends Doc
|
|||
C_Currency_ID, total, null);
|
||||
return fact;
|
||||
} // getCommitmentRelease
|
||||
|
||||
|
||||
/**
|
||||
* Get Commitments Sales
|
||||
* @param doc document
|
||||
|
@ -685,7 +685,7 @@ public class Doc_Order extends Doc
|
|||
else
|
||||
LineNetAmt = Qty.multiply(PriceActual);
|
||||
maxQty = maxQty.subtract(Qty);
|
||||
|
||||
|
||||
docLine.setAmount (LineNetAmt); // DR
|
||||
BigDecimal PriceList = line.getPriceList();
|
||||
int C_Tax_ID = docLine.getC_Tax_ID();
|
||||
|
@ -702,7 +702,7 @@ public class Doc_Order extends Doc
|
|||
PriceList = PriceList.subtract(PriceListTax);
|
||||
}
|
||||
} // correct included Tax
|
||||
|
||||
|
||||
docLine.setAmount (LineNetAmt, PriceList, Qty);
|
||||
list.add(docLine);
|
||||
}
|
||||
|
@ -716,7 +716,7 @@ public class Doc_Order extends Doc
|
|||
DB.close(rs, pstmt);
|
||||
rs = null; pstmt = null;
|
||||
}
|
||||
|
||||
|
||||
// Return Array
|
||||
DocLine[] dl = new DocLine[list.size()];
|
||||
list.toArray(dl);
|
||||
|
@ -733,13 +733,13 @@ public class Doc_Order extends Doc
|
|||
* @param multiplier 1 for accrual
|
||||
* @return Fact
|
||||
*/
|
||||
protected static Fact getCommitmentSalesRelease(MAcctSchema as, Doc doc,
|
||||
protected static Fact getCommitmentSalesRelease(MAcctSchema as, Doc doc,
|
||||
BigDecimal Qty, int M_InOutLine_ID, BigDecimal multiplier)
|
||||
{
|
||||
Fact fact = new Fact(doc, as, Fact.POST_Commitment);
|
||||
DocLine[] commitments = Doc_Order.getCommitmentsSales(doc, Qty,
|
||||
DocLine[] commitments = Doc_Order.getCommitmentsSales(doc, Qty,
|
||||
M_InOutLine_ID);
|
||||
|
||||
|
||||
BigDecimal total = Env.ZERO;
|
||||
FactLine fl = null;
|
||||
int C_Currency_ID = -1;
|
||||
|
@ -774,7 +774,7 @@ public class Doc_Order extends Doc
|
|||
C_Currency_ID, null, total);
|
||||
return fact;
|
||||
} // getCommitmentSalesRelease
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Update Product Info (old)
|
||||
* - Costing (PriceLastPO)
|
||||
|
@ -803,7 +803,7 @@ public class Doc_Order extends Doc
|
|||
{
|
||||
sql.append(" AND ROWNUM=1 ");
|
||||
}
|
||||
else
|
||||
else
|
||||
sql.append(" AND ol.C_OrderLine_ID = (SELECT MIN(ol1.C_OrderLine_ID) "
|
||||
+ "FROM C_Order o1, C_OrderLine ol1 "
|
||||
+ "WHERE o1.C_Order_ID=ol1.C_Order_ID"
|
||||
|
|
|
@ -41,15 +41,15 @@ public class Doc_Payment extends Doc
|
|||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param ass accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_Payment (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_Payment (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, MPayment.class, rs, null, trxName);
|
||||
super (as, MPayment.class, rs, null, trxName);
|
||||
} // Doc_Payment
|
||||
|
||||
|
||||
/** Tender Type */
|
||||
private String m_TenderType = null;
|
||||
/** Prepayment */
|
||||
|
@ -73,7 +73,7 @@ public class Doc_Payment extends Doc
|
|||
return null;
|
||||
} // loadDocumentDetails
|
||||
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Get Source Currency Balance - always zero
|
||||
* @return Zero (always balanced)
|
||||
|
@ -115,7 +115,7 @@ public class Doc_Payment extends Doc
|
|||
return facts;
|
||||
}
|
||||
|
||||
int AD_Org_ID = getBank_Org_ID(); // Bank Account Org
|
||||
int AD_Org_ID = getBank_Org_ID(); // Bank Account Org
|
||||
if (getDocumentType().equals(DOCTYPE_ARReceipt))
|
||||
{
|
||||
// Asset
|
||||
|
@ -123,7 +123,7 @@ public class Doc_Payment extends Doc
|
|||
getC_Currency_ID(), getAmount(), null);
|
||||
if (fl != null && AD_Org_ID != 0)
|
||||
fl.setAD_Org_ID(AD_Org_ID);
|
||||
//
|
||||
//
|
||||
MAccount acct = null;
|
||||
if (getC_Charge_ID() != 0)
|
||||
acct = MCharge.getAccount(getC_Charge_ID(), as, getAmount());
|
||||
|
@ -152,7 +152,7 @@ public class Doc_Payment extends Doc
|
|||
if (fl != null && AD_Org_ID != 0
|
||||
&& getC_Charge_ID() == 0) // don't overwrite charge
|
||||
fl.setAD_Org_ID(AD_Org_ID);
|
||||
|
||||
|
||||
// Asset
|
||||
fl = fact.createLine(null, getAccount(Doc.ACCTTYPE_BankInTransit, as),
|
||||
getC_Currency_ID(), null, getAmount());
|
||||
|
@ -183,5 +183,5 @@ public class Doc_Payment extends Doc
|
|||
MBankAccount ba = MBankAccount.get(getCtx(), m_C_BankAccount_ID);
|
||||
return ba.getAD_Org_ID();
|
||||
} // getBank_Org_ID
|
||||
|
||||
|
||||
} // Doc_Payment
|
||||
|
|
|
@ -45,13 +45,13 @@ public class Doc_Production extends Doc
|
|||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_Production (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_Production (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, X_M_Production.class, rs, DOCTYPE_MatProduction, trxName);
|
||||
super (as, X_M_Production.class, rs, DOCTYPE_MatProduction, trxName);
|
||||
} // Doc_Production
|
||||
|
||||
/**
|
||||
|
@ -174,15 +174,15 @@ public class Doc_Production extends Doc
|
|||
DocLine line = p_lines[i];
|
||||
// Calculate Costs
|
||||
BigDecimal costs = null;
|
||||
|
||||
|
||||
// MZ Goodwill
|
||||
// if Production CostDetail exist then get Cost from Cost Detail
|
||||
MCostDetail cd = MCostDetail.get (as.getCtx(), "M_ProductionLine_ID=?",
|
||||
// if Production CostDetail exist then get Cost from Cost Detail
|
||||
MCostDetail cd = MCostDetail.get (as.getCtx(), "M_ProductionLine_ID=?",
|
||||
line.get_ID(), line.getM_AttributeSetInstance_ID(), as.getC_AcctSchema_ID(), getTrxName());
|
||||
if (cd != null)
|
||||
costs = cd.getAmt();
|
||||
else
|
||||
{
|
||||
{
|
||||
if (line.isProductionBOM())
|
||||
{
|
||||
// Get BOM Cost - Sum of individual lines
|
||||
|
@ -209,7 +209,7 @@ public class Doc_Production extends Doc
|
|||
costs = line.getProductCosts(as, line.getAD_Org_ID(), false);
|
||||
}
|
||||
// end MZ
|
||||
|
||||
|
||||
// Inventory DR CR
|
||||
fl = fact.createLine(line,
|
||||
line.getAccount(ProductCost.ACCTTYPE_P_Asset, as),
|
||||
|
@ -221,17 +221,17 @@ public class Doc_Production extends Doc
|
|||
}
|
||||
fl.setM_Locator_ID(line.getM_Locator_ID());
|
||||
fl.setQty(line.getQty());
|
||||
|
||||
|
||||
// Cost Detail
|
||||
String description = line.getDescription();
|
||||
if (description == null)
|
||||
description = "";
|
||||
if (line.isProductionBOM())
|
||||
description += "(*)";
|
||||
MCostDetail.createProduction(as, line.getAD_Org_ID(),
|
||||
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
|
||||
line.get_ID(), 0,
|
||||
costs, line.getQty(),
|
||||
MCostDetail.createProduction(as, line.getAD_Org_ID(),
|
||||
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
|
||||
line.get_ID(), 0,
|
||||
costs, line.getQty(),
|
||||
description, getTrxName());
|
||||
}
|
||||
//
|
||||
|
|
|
@ -33,9 +33,9 @@ import org.compiere.util.Env;
|
|||
/**
|
||||
* Project Issue.
|
||||
* Note:
|
||||
* Will load the default GL Category.
|
||||
* Set up a document type to set the GL Category.
|
||||
*
|
||||
* Will load the default GL Category.
|
||||
* Set up a document type to set the GL Category.
|
||||
*
|
||||
* @author Jorg Janke
|
||||
* @version $Id: Doc_ProjectIssue.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $
|
||||
*/
|
||||
|
@ -43,13 +43,13 @@ public class Doc_ProjectIssue extends Doc
|
|||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_ProjectIssue (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_ProjectIssue (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, MProjectIssue.class, rs, DOCTYPE_ProjectIssue, trxName);
|
||||
super (as, MProjectIssue.class, rs, DOCTYPE_ProjectIssue, trxName);
|
||||
} // Doc_ProjectIssue
|
||||
|
||||
/** Pseudo Line */
|
||||
|
@ -67,11 +67,11 @@ public class Doc_ProjectIssue extends Doc
|
|||
m_issue = (MProjectIssue)getPO();
|
||||
setDateDoc (m_issue.getMovementDate());
|
||||
setDateAcct(m_issue.getMovementDate());
|
||||
|
||||
|
||||
// Pseudo Line
|
||||
m_line = new DocLine (m_issue, this);
|
||||
m_line = new DocLine (m_issue, this);
|
||||
m_line.setQty (m_issue.getMovementQty(), true); // sets Trx and Storage Qty
|
||||
|
||||
|
||||
// Pseudo Line Check
|
||||
if (m_line.getM_Product_ID() == 0)
|
||||
log.warning(m_line.toString() + " - No Product");
|
||||
|
@ -122,7 +122,7 @@ public class Doc_ProjectIssue extends Doc
|
|||
MProject project = new MProject (getCtx(), m_issue.getC_Project_ID(), getTrxName());
|
||||
String ProjectCategory = project.getProjectCategory();
|
||||
MProduct product = MProduct.get(getCtx(), m_issue.getM_Product_ID());
|
||||
|
||||
|
||||
// Line pointers
|
||||
FactLine dr = null;
|
||||
FactLine cr = null;
|
||||
|
@ -135,7 +135,7 @@ public class Doc_ProjectIssue extends Doc
|
|||
cost = getLaborCost(as);
|
||||
if (cost == null) // standard Product Costs
|
||||
cost = m_line.getProductCosts(as, getAD_Org_ID(), false);
|
||||
|
||||
|
||||
// Project DR
|
||||
int acctType = ACCTTYPE_ProjectWIP;
|
||||
if (MProject.PROJECTCATEGORY_AssetProject.equals(ProjectCategory))
|
||||
|
@ -143,7 +143,7 @@ public class Doc_ProjectIssue extends Doc
|
|||
dr = fact.createLine(m_line,
|
||||
getAccount(acctType, as), as.getC_Currency_ID(), cost, null);
|
||||
dr.setQty(m_line.getQty().negate());
|
||||
|
||||
|
||||
// Inventory CR
|
||||
acctType = ProductCost.ACCTTYPE_P_Asset;
|
||||
if (product.isService())
|
||||
|
@ -211,24 +211,24 @@ public class Doc_ProjectIssue extends Doc
|
|||
|
||||
private BigDecimal getLaborCost(MAcctSchema as)
|
||||
{
|
||||
// Todor Lulov 30.01.2008
|
||||
// Todor Lulov 30.01.2008
|
||||
BigDecimal retValue = Env.ZERO;
|
||||
BigDecimal qty = Env.ZERO;
|
||||
|
||||
String sql = "SELECT ConvertedAmt, Qty FROM S_TimeExpenseLine " +
|
||||
String sql = "SELECT ConvertedAmt, Qty FROM S_TimeExpenseLine " +
|
||||
" WHERE S_TimeExpenseLine.S_TimeExpenseLine_ID = ?";
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
try
|
||||
{
|
||||
pstmt = DB.prepareStatement (sql.toString (), getTrxName());
|
||||
pstmt.setInt(1, m_issue.getS_TimeExpenseLine_ID());
|
||||
rs = pstmt.executeQuery();
|
||||
pstmt.setInt(1, m_issue.getS_TimeExpenseLine_ID());
|
||||
rs = pstmt.executeQuery();
|
||||
if (rs.next())
|
||||
{
|
||||
retValue = rs.getBigDecimal(1);
|
||||
qty = rs.getBigDecimal(2);
|
||||
retValue = retValue.multiply(qty);
|
||||
retValue = retValue.multiply(qty);
|
||||
log.fine("ExpLineCost = " + retValue);
|
||||
}
|
||||
else
|
||||
|
@ -242,7 +242,7 @@ public class Doc_ProjectIssue extends Doc
|
|||
{
|
||||
DB.close(rs, pstmt);
|
||||
pstmt = null; rs = null;
|
||||
}
|
||||
}
|
||||
return retValue;
|
||||
} // getLaborCost
|
||||
|
||||
|
|
|
@ -30,12 +30,12 @@ import org.compiere.util.Env;
|
|||
|
||||
/**
|
||||
* Post Order Documents.
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* Table: M_Requisition
|
||||
* Document Types: POR (Requisition)
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* @author Jorg Janke
|
||||
* @version $Id: Doc_Requisition.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $
|
||||
*/
|
||||
|
@ -43,13 +43,13 @@ public class Doc_Requisition extends Doc
|
|||
{
|
||||
/**
|
||||
* Constructor
|
||||
* @param ass accounting schemata
|
||||
* @param as accounting schema
|
||||
* @param rs record
|
||||
* @param trxName trx
|
||||
*/
|
||||
public Doc_Requisition (MAcctSchema[] ass, ResultSet rs, String trxName)
|
||||
public Doc_Requisition (MAcctSchema as, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ass, MRequisition.class, rs, DOCTYPE_PurchaseRequisition, trxName);
|
||||
super (as, MRequisition.class, rs, DOCTYPE_PurchaseRequisition, trxName);
|
||||
} // Doc_Requisition
|
||||
|
||||
/**
|
||||
|
@ -100,7 +100,7 @@ public class Doc_Requisition extends Doc
|
|||
/***************************************************************************
|
||||
* Get Source Currency Balance - subtracts line and tax amounts from total -
|
||||
* no rounding
|
||||
*
|
||||
*
|
||||
* @return positive amount, if total invoice is bigger than lines
|
||||
*/
|
||||
public BigDecimal getBalance ()
|
||||
|
@ -151,7 +151,7 @@ public class Doc_Requisition extends Doc
|
|||
fact.createLine (null, offset, getC_Currency_ID(), null, total);
|
||||
facts.add(fact);
|
||||
}
|
||||
|
||||
|
||||
return facts;
|
||||
} // createFact
|
||||
} // Doc_Requisition
|
||||
|
|
|
@ -21,14 +21,14 @@ package org.compiere.util;
|
|||
* Adempiere User Error.
|
||||
* Cuased by (lack of) user input/selection.
|
||||
* (No program error)
|
||||
*
|
||||
*
|
||||
* @author Jorg Janke
|
||||
* @version $Id: AdempiereUserError.java,v 1.2 2006/07/30 00:54:35 jjanke Exp $
|
||||
*/
|
||||
public class AdempiereUserError extends Exception
|
||||
public class AdempiereUserError extends RuntimeException
|
||||
{
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -5318376918072817705L;
|
||||
|
||||
|
@ -64,7 +64,7 @@ public class AdempiereUserError extends Exception
|
|||
|
||||
/** Additional Info how to fix **/
|
||||
private String m_fixHint = null;
|
||||
|
||||
|
||||
/**
|
||||
* @return Returns the fixHint.
|
||||
*/
|
||||
|
@ -72,7 +72,7 @@ public class AdempiereUserError extends Exception
|
|||
{
|
||||
return m_fixHint;
|
||||
} // getFixHint
|
||||
|
||||
|
||||
/**
|
||||
* Set Fix Hint
|
||||
* @param fixHint fix hint
|
||||
|
@ -81,8 +81,8 @@ public class AdempiereUserError extends Exception
|
|||
{
|
||||
m_fixHint = fixHint;
|
||||
} // setFixHint
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* String Representation
|
||||
* @return info
|
||||
|
@ -96,5 +96,5 @@ public class AdempiereUserError extends Exception
|
|||
sb.append(" (").append(m_fixHint).append (")");
|
||||
return sb.toString ();
|
||||
} // toString
|
||||
|
||||
|
||||
} // AdempiereUserError
|
||||
|
|
|
@ -25,7 +25,7 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.compiere.acct.Doc;
|
||||
import org.compiere.acct.DocManager;
|
||||
import org.compiere.model.MAcctProcessor;
|
||||
import org.compiere.model.MAcctProcessorLog;
|
||||
import org.compiere.model.MAcctSchema;
|
||||
|
@ -38,7 +38,7 @@ import org.compiere.util.TimeUtil;
|
|||
|
||||
/**
|
||||
* Accounting Processor
|
||||
*
|
||||
*
|
||||
* @author Jorg Janke
|
||||
* @version $Id: AcctProcessor.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $
|
||||
*/
|
||||
|
@ -46,7 +46,7 @@ public class AcctProcessor extends AdempiereServer
|
|||
{
|
||||
/**
|
||||
* Accounting Processor
|
||||
* @param model model
|
||||
* @param model model
|
||||
*/
|
||||
public AcctProcessor (MAcctProcessor model)
|
||||
{
|
||||
|
@ -63,7 +63,7 @@ public class AcctProcessor extends AdempiereServer
|
|||
private MClient m_client = null;
|
||||
/** Accounting Schemata */
|
||||
private MAcctSchema[] m_ass = null;
|
||||
|
||||
|
||||
/**
|
||||
* Work
|
||||
*/
|
||||
|
@ -83,7 +83,7 @@ public class AcctProcessor extends AdempiereServer
|
|||
m_summary.append("Logs deleted=").append(no);
|
||||
//
|
||||
MAcctProcessorLog pLog = new MAcctProcessorLog(m_model, m_summary.toString());
|
||||
pLog.setReference("#" + String.valueOf(p_runCount)
|
||||
pLog.setReference("#" + String.valueOf(p_runCount)
|
||||
+ " - " + TimeUtil.formatElapsed(new Timestamp(p_startWork)));
|
||||
pLog.save();
|
||||
} // doWork
|
||||
|
@ -104,10 +104,10 @@ public class AcctProcessor extends AdempiereServer
|
|||
ts = new Timestamp(ms);
|
||||
long mili = ts.getTime();
|
||||
BigDecimal value = new BigDecimal(Long.toString(mili));
|
||||
|
||||
|
||||
//first pass, collect all ts (FR 2962094 - required for weighted average costing)
|
||||
int[] documentsTableID = Doc.getDocumentsTableID();
|
||||
String[] documentsTableName = Doc.getDocumentsTableName();
|
||||
int[] documentsTableID = DocManager.getDocumentsTableID();
|
||||
String[] documentsTableName = DocManager.getDocumentsTableName();
|
||||
for (int i = 0; i < documentsTableID.length; i++)
|
||||
{
|
||||
int AD_Table_ID = documentsTableID[i];
|
||||
|
@ -116,7 +116,7 @@ public class AcctProcessor extends AdempiereServer
|
|||
if (m_model.getAD_Table_ID() != 0
|
||||
&& m_model.getAD_Table_ID() != AD_Table_ID)
|
||||
continue;
|
||||
|
||||
|
||||
StringBuffer sql = new StringBuffer ("SELECT DISTINCT ProcessedOn FROM ").append(TableName)
|
||||
.append(" WHERE AD_Client_ID=? AND ProcessedOn<?")
|
||||
.append(" AND Processed='Y' AND Posted='N' AND IsActive='Y'");
|
||||
|
@ -152,18 +152,18 @@ public class AcctProcessor extends AdempiereServer
|
|||
count[i] = 0;
|
||||
countError[i] = 0;
|
||||
}
|
||||
|
||||
|
||||
//sort and post in the processed date order
|
||||
Collections.sort(listProcessedOn);
|
||||
for (BigDecimal processedOn : listProcessedOn)
|
||||
{
|
||||
|
||||
|
||||
for (int i = 0; i < documentsTableID.length; i++)
|
||||
{
|
||||
int AD_Table_ID = documentsTableID[i];
|
||||
String TableName = documentsTableName[i];
|
||||
// Post only special documents
|
||||
if (m_model.getAD_Table_ID() != 0
|
||||
if (m_model.getAD_Table_ID() != 0
|
||||
&& m_model.getAD_Table_ID() != AD_Table_ID)
|
||||
continue;
|
||||
// SELECT * FROM table
|
||||
|
@ -191,17 +191,8 @@ public class AcctProcessor extends AdempiereServer
|
|||
boolean ok = true;
|
||||
try
|
||||
{
|
||||
Doc doc = Doc.get (m_ass, AD_Table_ID, rs, null);
|
||||
if (doc == null)
|
||||
{
|
||||
log.severe(getName() + ": No Doc for " + TableName);
|
||||
ok = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
String error = doc.post(false, false); // post no force/repost
|
||||
ok = error == null;
|
||||
}
|
||||
String error = DocManager.postDocument(m_ass, AD_Table_ID, rs, false, false, null);
|
||||
ok = error == null;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -221,11 +212,11 @@ public class AcctProcessor extends AdempiereServer
|
|||
{
|
||||
DB.close(rs, pstmt);
|
||||
}
|
||||
|
||||
|
||||
} // for tableID
|
||||
|
||||
|
||||
} // for processedOn
|
||||
|
||||
|
||||
for (int i = 0; i < documentsTableID.length; i++)
|
||||
{
|
||||
String TableName = documentsTableName[i];
|
||||
|
@ -240,9 +231,9 @@ public class AcctProcessor extends AdempiereServer
|
|||
else
|
||||
log.finer(getName() + ": " + TableName + " - no work");
|
||||
}
|
||||
|
||||
|
||||
} // postSession
|
||||
|
||||
|
||||
/**
|
||||
* Get Server Info
|
||||
* @return info
|
||||
|
|
Loading…
Reference in New Issue