GL Reconciliation contribution
https://sourceforge.net/tracker/?func=detail&aid=3058505&group_id=176962&atid=883808 Integration done by Carlos Ruiz (globalqss) to work from Paul Bowden / Adaxa (phib)
This commit is contained in:
parent
108b3527a5
commit
d44998bf12
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,187 @@
|
|||
/******************************************************************************
|
||||
* Product: Adempiere ERP & CRM Smart Business Solution *
|
||||
* Copyright (C) 1999-2007 ComPiere, Inc. All Rights Reserved. *
|
||||
* This program is free software, you can redistribute it and/or modify it *
|
||||
* under the terms version 2 of the GNU General Public License as published *
|
||||
* by the Free Software Foundation. This program is distributed in the hope *
|
||||
* that it will be useful, but WITHOUT ANY WARRANTY, without even the implied *
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||
* See the GNU General Public License for more details. *
|
||||
* You should have received a copy of the GNU General Public License along *
|
||||
* with this program, if not, write to the Free Software Foundation, Inc., *
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||
* For the text or an alternative of this public license, you may reach us *
|
||||
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||
*****************************************************************************/
|
||||
package org.compiere.model;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.sql.Timestamp;
|
||||
import org.compiere.util.KeyNamePair;
|
||||
|
||||
/** Generated Interface for Fact_Reconciliation
|
||||
* @author Adempiere (generated)
|
||||
* @version 360LTS.013
|
||||
*/
|
||||
public interface I_Fact_Reconciliation
|
||||
{
|
||||
|
||||
/** TableName=Fact_Reconciliation */
|
||||
public static final String Table_Name = "Fact_Reconciliation";
|
||||
|
||||
/** AD_Table_ID=53286 */
|
||||
public static final int Table_ID = MTable.getTable_ID(Table_Name);
|
||||
|
||||
KeyNamePair Model = new KeyNamePair(Table_ID, Table_Name);
|
||||
|
||||
/** AccessLevel = 3 - Client - Org
|
||||
*/
|
||||
BigDecimal accessLevel = BigDecimal.valueOf(3);
|
||||
|
||||
/** Load Meta Data */
|
||||
|
||||
/** Column name Account_ID */
|
||||
public static final String COLUMNNAME_Account_ID = "Account_ID";
|
||||
|
||||
/** Set Account.
|
||||
* Account used
|
||||
*/
|
||||
public void setAccount_ID (int Account_ID);
|
||||
|
||||
/** Get Account.
|
||||
* Account used
|
||||
*/
|
||||
public int getAccount_ID();
|
||||
|
||||
public I_C_ElementValue getAccount() throws RuntimeException;
|
||||
|
||||
/** Column name AD_Client_ID */
|
||||
public static final String COLUMNNAME_AD_Client_ID = "AD_Client_ID";
|
||||
|
||||
/** Get Client.
|
||||
* Client/Tenant for this installation.
|
||||
*/
|
||||
public int getAD_Client_ID();
|
||||
|
||||
/** Column name AD_Org_ID */
|
||||
public static final String COLUMNNAME_AD_Org_ID = "AD_Org_ID";
|
||||
|
||||
/** Set Organization.
|
||||
* Organizational entity within client
|
||||
*/
|
||||
public void setAD_Org_ID (int AD_Org_ID);
|
||||
|
||||
/** Get Organization.
|
||||
* Organizational entity within client
|
||||
*/
|
||||
public int getAD_Org_ID();
|
||||
|
||||
/** Column name AmtAcct */
|
||||
public static final String COLUMNNAME_AmtAcct = "AmtAcct";
|
||||
|
||||
/** Set Accounted Amount.
|
||||
* Amount Balance in Currency of Accounting Schema
|
||||
*/
|
||||
public void setAmtAcct (BigDecimal AmtAcct);
|
||||
|
||||
/** Get Accounted Amount.
|
||||
* Amount Balance in Currency of Accounting Schema
|
||||
*/
|
||||
public BigDecimal getAmtAcct();
|
||||
|
||||
/** Column name C_BPartner_ID */
|
||||
public static final String COLUMNNAME_C_BPartner_ID = "C_BPartner_ID";
|
||||
|
||||
/** Set Business Partner .
|
||||
* Identifies a Business Partner
|
||||
*/
|
||||
public void setC_BPartner_ID (int C_BPartner_ID);
|
||||
|
||||
/** Get Business Partner .
|
||||
* Identifies a Business Partner
|
||||
*/
|
||||
public int getC_BPartner_ID();
|
||||
|
||||
public I_C_BPartner getC_BPartner() throws RuntimeException;
|
||||
|
||||
/** Column name Created */
|
||||
public static final String COLUMNNAME_Created = "Created";
|
||||
|
||||
/** Get Created.
|
||||
* Date this record was created
|
||||
*/
|
||||
public Timestamp getCreated();
|
||||
|
||||
/** Column name CreatedBy */
|
||||
public static final String COLUMNNAME_CreatedBy = "CreatedBy";
|
||||
|
||||
/** Get Created By.
|
||||
* User who created this records
|
||||
*/
|
||||
public int getCreatedBy();
|
||||
|
||||
/** Column name DateAcct */
|
||||
public static final String COLUMNNAME_DateAcct = "DateAcct";
|
||||
|
||||
/** Set Account Date.
|
||||
* Accounting Date
|
||||
*/
|
||||
public void setDateAcct (Timestamp DateAcct);
|
||||
|
||||
/** Get Account Date.
|
||||
* Accounting Date
|
||||
*/
|
||||
public Timestamp getDateAcct();
|
||||
|
||||
/** Column name Fact_Acct_ID */
|
||||
public static final String COLUMNNAME_Fact_Acct_ID = "Fact_Acct_ID";
|
||||
|
||||
/** Set Accounting Fact */
|
||||
public void setFact_Acct_ID (int Fact_Acct_ID);
|
||||
|
||||
/** Get Accounting Fact */
|
||||
public int getFact_Acct_ID();
|
||||
|
||||
/** Column name IsActive */
|
||||
public static final String COLUMNNAME_IsActive = "IsActive";
|
||||
|
||||
/** Set Active.
|
||||
* The record is active in the system
|
||||
*/
|
||||
public void setIsActive (boolean IsActive);
|
||||
|
||||
/** Get Active.
|
||||
* The record is active in the system
|
||||
*/
|
||||
public boolean isActive();
|
||||
|
||||
/** Column name MatchCode */
|
||||
public static final String COLUMNNAME_MatchCode = "MatchCode";
|
||||
|
||||
/** Set Match Code.
|
||||
* String identifying related accounting facts
|
||||
*/
|
||||
public void setMatchCode (String MatchCode);
|
||||
|
||||
/** Get Match Code.
|
||||
* String identifying related accounting facts
|
||||
*/
|
||||
public String getMatchCode();
|
||||
|
||||
/** Column name Updated */
|
||||
public static final String COLUMNNAME_Updated = "Updated";
|
||||
|
||||
/** Get Updated.
|
||||
* Date this record was updated
|
||||
*/
|
||||
public Timestamp getUpdated();
|
||||
|
||||
/** Column name UpdatedBy */
|
||||
public static final String COLUMNNAME_UpdatedBy = "UpdatedBy";
|
||||
|
||||
/** Get Updated By.
|
||||
* User who updated this records
|
||||
*/
|
||||
public int getUpdatedBy();
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package org.compiere.model;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.util.Properties;
|
||||
|
||||
public class MFactReconciliation extends X_Fact_Reconciliation {
|
||||
|
||||
public MFactReconciliation(Properties ctx, int Fact_Acct_ID,
|
||||
String trxName) {
|
||||
super(ctx, Fact_Acct_ID, trxName);
|
||||
}
|
||||
|
||||
public MFactReconciliation(Properties ctx, ResultSet rs, String trxName) {
|
||||
super(ctx, rs, trxName);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,203 @@
|
|||
/******************************************************************************
|
||||
* Product: Adempiere ERP & CRM Smart Business Solution *
|
||||
* Copyright (C) 1999-2007 ComPiere, Inc. All Rights Reserved. *
|
||||
* This program is free software, you can redistribute it and/or modify it *
|
||||
* under the terms version 2 of the GNU General Public License as published *
|
||||
* by the Free Software Foundation. This program is distributed in the hope *
|
||||
* that it will be useful, but WITHOUT ANY WARRANTY, without even the implied *
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||
* See the GNU General Public License for more details. *
|
||||
* You should have received a copy of the GNU General Public License along *
|
||||
* with this program, if not, write to the Free Software Foundation, Inc., *
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||
* For the text or an alternative of this public license, you may reach us *
|
||||
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
|
||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
||||
*****************************************************************************/
|
||||
/** Generated Model - DO NOT CHANGE */
|
||||
package org.compiere.model;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.Properties;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.KeyNamePair;
|
||||
|
||||
/** Generated Model for Fact_Reconciliation
|
||||
* @author Adempiere (generated)
|
||||
* @version 360LTS.013 - $Id$ */
|
||||
public class X_Fact_Reconciliation extends PO implements I_Fact_Reconciliation, I_Persistent
|
||||
{
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 20111102L;
|
||||
|
||||
/** Standard Constructor */
|
||||
public X_Fact_Reconciliation (Properties ctx, int Fact_Reconciliation_ID, String trxName)
|
||||
{
|
||||
super (ctx, Fact_Reconciliation_ID, trxName);
|
||||
/** if (Fact_Reconciliation_ID == 0)
|
||||
{
|
||||
setFact_Acct_ID (0);
|
||||
} */
|
||||
}
|
||||
|
||||
/** Load Constructor */
|
||||
public X_Fact_Reconciliation (Properties ctx, ResultSet rs, String trxName)
|
||||
{
|
||||
super (ctx, rs, trxName);
|
||||
}
|
||||
|
||||
/** AccessLevel
|
||||
* @return 3 - Client - Org
|
||||
*/
|
||||
protected int get_AccessLevel()
|
||||
{
|
||||
return accessLevel.intValue();
|
||||
}
|
||||
|
||||
/** Load Meta Data */
|
||||
protected POInfo initPO (Properties ctx)
|
||||
{
|
||||
POInfo poi = POInfo.getPOInfo (ctx, Table_ID, get_TrxName());
|
||||
return poi;
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
StringBuffer sb = new StringBuffer ("X_Fact_Reconciliation[")
|
||||
.append(get_ID()).append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public I_C_ElementValue getAccount() throws RuntimeException
|
||||
{
|
||||
return (I_C_ElementValue)MTable.get(getCtx(), I_C_ElementValue.Table_Name)
|
||||
.getPO(getAccount_ID(), get_TrxName()); }
|
||||
|
||||
/** Set Account.
|
||||
@param Account_ID
|
||||
Account used
|
||||
*/
|
||||
public void setAccount_ID (int Account_ID)
|
||||
{
|
||||
throw new IllegalArgumentException ("Account_ID is virtual column"); }
|
||||
|
||||
/** Get Account.
|
||||
@return Account used
|
||||
*/
|
||||
public int getAccount_ID ()
|
||||
{
|
||||
Integer ii = (Integer)get_Value(COLUMNNAME_Account_ID);
|
||||
if (ii == null)
|
||||
return 0;
|
||||
return ii.intValue();
|
||||
}
|
||||
|
||||
/** Set Accounted Amount.
|
||||
@param AmtAcct
|
||||
Amount Balance in Currency of Accounting Schema
|
||||
*/
|
||||
public void setAmtAcct (BigDecimal AmtAcct)
|
||||
{
|
||||
throw new IllegalArgumentException ("AmtAcct is virtual column"); }
|
||||
|
||||
/** Get Accounted Amount.
|
||||
@return Amount Balance in Currency of Accounting Schema
|
||||
*/
|
||||
public BigDecimal getAmtAcct ()
|
||||
{
|
||||
BigDecimal bd = (BigDecimal)get_Value(COLUMNNAME_AmtAcct);
|
||||
if (bd == null)
|
||||
return Env.ZERO;
|
||||
return bd;
|
||||
}
|
||||
|
||||
public I_C_BPartner getC_BPartner() throws RuntimeException
|
||||
{
|
||||
return (I_C_BPartner)MTable.get(getCtx(), I_C_BPartner.Table_Name)
|
||||
.getPO(getC_BPartner_ID(), get_TrxName()); }
|
||||
|
||||
/** Set Business Partner .
|
||||
@param C_BPartner_ID
|
||||
Identifies a Business Partner
|
||||
*/
|
||||
public void setC_BPartner_ID (int C_BPartner_ID)
|
||||
{
|
||||
throw new IllegalArgumentException ("C_BPartner_ID is virtual column"); }
|
||||
|
||||
/** Get Business Partner .
|
||||
@return Identifies a Business Partner
|
||||
*/
|
||||
public int getC_BPartner_ID ()
|
||||
{
|
||||
Integer ii = (Integer)get_Value(COLUMNNAME_C_BPartner_ID);
|
||||
if (ii == null)
|
||||
return 0;
|
||||
return ii.intValue();
|
||||
}
|
||||
|
||||
/** Set Account Date.
|
||||
@param DateAcct
|
||||
Accounting Date
|
||||
*/
|
||||
public void setDateAcct (Timestamp DateAcct)
|
||||
{
|
||||
throw new IllegalArgumentException ("DateAcct is virtual column"); }
|
||||
|
||||
/** Get Account Date.
|
||||
@return Accounting Date
|
||||
*/
|
||||
public Timestamp getDateAcct ()
|
||||
{
|
||||
return (Timestamp)get_Value(COLUMNNAME_DateAcct);
|
||||
}
|
||||
|
||||
/** Set Accounting Fact.
|
||||
@param Fact_Acct_ID Accounting Fact */
|
||||
public void setFact_Acct_ID (int Fact_Acct_ID)
|
||||
{
|
||||
if (Fact_Acct_ID < 1)
|
||||
set_ValueNoCheck (COLUMNNAME_Fact_Acct_ID, null);
|
||||
else
|
||||
set_ValueNoCheck (COLUMNNAME_Fact_Acct_ID, Integer.valueOf(Fact_Acct_ID));
|
||||
}
|
||||
|
||||
/** Get Accounting Fact.
|
||||
@return Accounting Fact */
|
||||
public int getFact_Acct_ID ()
|
||||
{
|
||||
Integer ii = (Integer)get_Value(COLUMNNAME_Fact_Acct_ID);
|
||||
if (ii == null)
|
||||
return 0;
|
||||
return ii.intValue();
|
||||
}
|
||||
|
||||
/** Get Record ID/ColumnName
|
||||
@return ID/ColumnName pair
|
||||
*/
|
||||
public KeyNamePair getKeyNamePair()
|
||||
{
|
||||
return new KeyNamePair(get_ID(), String.valueOf(getFact_Acct_ID()));
|
||||
}
|
||||
|
||||
/** Set Match Code.
|
||||
@param MatchCode
|
||||
String identifying related accounting facts
|
||||
*/
|
||||
public void setMatchCode (String MatchCode)
|
||||
{
|
||||
set_Value (COLUMNNAME_MatchCode, MatchCode);
|
||||
}
|
||||
|
||||
/** Get Match Code.
|
||||
@return String identifying related accounting facts
|
||||
*/
|
||||
public String getMatchCode ()
|
||||
{
|
||||
return (String)get_Value(COLUMNNAME_MatchCode);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,192 @@
|
|||
/******************************************************************************
|
||||
* 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.process;
|
||||
|
||||
import java.math.*;
|
||||
import java.sql.*;
|
||||
import java.util.logging.*;
|
||||
|
||||
import org.compiere.model.*;
|
||||
import org.compiere.util.*;
|
||||
|
||||
/**
|
||||
* Suspense account reconciliation report
|
||||
* @author Paul Bowden (phib)
|
||||
*/
|
||||
public class FactReconcile extends SvrProcess
|
||||
{
|
||||
private MElementValue account;
|
||||
private String type;
|
||||
private int ruleID;
|
||||
|
||||
/**
|
||||
* Prepare - e.g., get Parameters.
|
||||
*/
|
||||
protected void prepare()
|
||||
{
|
||||
int accountID = 0;
|
||||
ProcessInfoParameter[] para = getParameter();
|
||||
for (int i = 0; i < para.length; i++)
|
||||
{
|
||||
String name = para[i].getParameterName();
|
||||
if (para[i].getParameter() == null)
|
||||
;
|
||||
else if (name.equals("AD_Rule_ID"))
|
||||
ruleID = para[i].getParameterAsInt();
|
||||
else if (name.equals("Account_ID"))
|
||||
accountID = para[i].getParameterAsInt();
|
||||
else
|
||||
log.log(Level.SEVERE, "Unknown Parameter: " + name);
|
||||
|
||||
if ( accountID > 0 )
|
||||
account = new MElementValue(getCtx(), accountID, get_TrxName());
|
||||
}
|
||||
} // prepare
|
||||
|
||||
/**
|
||||
* DoIt
|
||||
* @return Message
|
||||
* @throws Exception
|
||||
*/
|
||||
protected String doIt() throws Exception
|
||||
{
|
||||
|
||||
String result;
|
||||
log.info("Reconcile Account: " + account.getName());
|
||||
|
||||
String subselect = "null";
|
||||
|
||||
MRule rule = MRule.get(getCtx(), ruleID);
|
||||
|
||||
if ( rule == null || rule.is_new() || !rule.getRuleType().equals("Q") || ! rule.getEventType().equals("R") )
|
||||
return "Invalid rule for account reconciliation.";
|
||||
else
|
||||
subselect = rule.getScript();
|
||||
|
||||
log.log(Level.FINE, "Rule subselect: " + subselect);
|
||||
|
||||
|
||||
/* example matching rules:
|
||||
*
|
||||
*
|
||||
// ar/ap TRade (Receivables/Vendor Liability)
|
||||
if ( type.equals("TR") )
|
||||
subselect = " (CASE WHEN fa.AD_Table_ID = " + MInvoice.Table_ID +
|
||||
" THEN 'C_Invoice:' || fa.Record_ID " +
|
||||
" WHEN fa.AD_Table_ID = " + MAllocationHdr.Table_ID +
|
||||
" THEN (SELECT 'C_Invoice:' || al.C_Invoice_ID FROM C_AllocationLine al " +
|
||||
" WHERE al.C_AllocationHdr_ID = fa.Record_ID " +
|
||||
" AND al.C_AllocationLine_ID = fa.Line_ID ) END)";
|
||||
// Bank in Transit
|
||||
else if ( type.equals("BT"))
|
||||
subselect = " (CASE WHEN fa.AD_Table_ID = " + MPayment.Table_ID +
|
||||
" THEN 'C_Payment:' || fa.Record_ID " +
|
||||
" WHEN fa.AD_Table_ID = " + MBankStatement.Table_ID +
|
||||
" THEN (SELECT 'C_Payment:' || bsl.C_Payment_ID FROM C_BankStatementLine bsl " +
|
||||
" WHERE bsl.C_BankStatement_ID = fa.Record_ID " +
|
||||
" AND bsl.C_BankStatementLine_ID = fa.Line_ID ) END)";
|
||||
// Payment Clearing (unallocated cash/payment selection)
|
||||
else if ( type.equals("PC") )
|
||||
subselect = " (CASE WHEN fa.AD_Table_ID = " + MPayment.Table_ID +
|
||||
" THEN 'C_Payment:' || fa.Record_ID " +
|
||||
" WHEN fa.AD_Table_ID = " + MAllocationHdr.Table_ID +
|
||||
" THEN (SELECT 'C_Payment:' || al.C_Payment_ID FROM C_AllocationLine al " +
|
||||
" WHERE al.C_AllocationHdr_ID = fa.Record_ID " +
|
||||
" AND al.C_AllocationLine_ID = fa.Line_ID ) END)";
|
||||
|
||||
*/
|
||||
|
||||
String sql = "";
|
||||
|
||||
log.info("AD_PInstance_ID= " + getAD_PInstance_ID());
|
||||
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
int count;
|
||||
int unmatched;
|
||||
try
|
||||
{
|
||||
|
||||
// add new facts into reconciliation table
|
||||
sql = "INSERT into Fact_Reconciliation " +
|
||||
"(AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, " +
|
||||
"IsActive, Fact_Acct_ID) " +
|
||||
"SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, " +
|
||||
"Updated, UpdatedBy, IsActive, " +
|
||||
"Fact_Acct_ID " +
|
||||
"FROM Fact_Acct f " +
|
||||
"WHERE Account_ID = ? " +
|
||||
"AND NOT EXISTS (SELECT 1 FROM Fact_Reconciliation r " +
|
||||
"WHERE r.Fact_Acct_ID = f.Fact_Acct_ID) ";
|
||||
|
||||
pstmt = DB.prepareStatement(sql, get_TrxName());
|
||||
pstmt.setInt(1, account.get_ID());
|
||||
count = pstmt.executeUpdate();
|
||||
log.log(Level.FINE, "Inserted " + count + " new facts into Fact_Reconciliation");
|
||||
|
||||
// set the matchcode based on the rule found in AD_Rule
|
||||
// which is a sql fragment that returns a string based on the accounting fact
|
||||
sql = "UPDATE Fact_Reconciliation " +
|
||||
"SET MatchCode = (" + subselect +
|
||||
" ) " +
|
||||
"WHERE MatchCode is null " +
|
||||
"AND (SELECT f.Account_ID FROM Fact_Acct f " +
|
||||
" WHERE f.Fact_Acct_ID = Fact_Reconciliation.Fact_Acct_ID ) = ? " +
|
||||
"AND ( " + subselect +
|
||||
" ) IS NOT NULL " ;
|
||||
|
||||
pstmt = DB.prepareStatement(sql, get_TrxName());
|
||||
pstmt.setInt(1, account.get_ID());
|
||||
count = pstmt.executeUpdate();
|
||||
|
||||
log.log(Level.FINE, "Updated " + count + " match codes.");
|
||||
|
||||
// remove any matchcodes that don't balance to zero
|
||||
sql = "UPDATE Fact_Reconciliation " +
|
||||
"SET MatchCode = null " +
|
||||
" WHERE (SELECT f1.Account_ID FROM Fact_Acct f1 " +
|
||||
" WHERE f1.Fact_Acct_ID=Fact_Reconciliation.Fact_Acct_ID) = ? " +
|
||||
" AND (SELECT SUM(f2.amtacctdr-f2.amtacctcr) FROM Fact_Reconciliation r " +
|
||||
" INNER JOIN Fact_Acct f2 ON (f2.Fact_Acct_ID = r.Fact_Acct_ID) " +
|
||||
" WHERE r.MatchCode=Fact_Reconciliation.MatchCode" +
|
||||
" AND f2.Account_ID = ?) <> 0 " +
|
||||
" AND MatchCode IS NOT NULL";
|
||||
|
||||
pstmt = DB.prepareStatement(sql, get_TrxName());
|
||||
pstmt.setInt(1, account.get_ID());
|
||||
pstmt.setInt(2, account.get_ID());
|
||||
unmatched = pstmt.executeUpdate();
|
||||
|
||||
log.log(Level.FINE, "Cleared match codes from " + unmatched + " unreconciled facts.");
|
||||
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.log(Level.SEVERE, sql, e);
|
||||
return e.getLocalizedMessage();
|
||||
}
|
||||
finally
|
||||
{
|
||||
DB.close(rs, pstmt);
|
||||
rs = null; pstmt = null;
|
||||
}
|
||||
|
||||
return "Matched " + (count-unmatched) + " facts";
|
||||
} // doIt
|
||||
|
||||
} // FactReconcile
|
||||
|
|
@ -0,0 +1,118 @@
|
|||
package org.compiere.process;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Msg;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class FactReconciliation extends SvrProcess
|
||||
{
|
||||
private Timestamp p_DateAcct_From = null;
|
||||
private Timestamp p_DateAcct_To = null;
|
||||
private int p_Account_ID = 0;
|
||||
/** Start Time */
|
||||
private long m_start = System.currentTimeMillis();
|
||||
|
||||
/**
|
||||
* Prepare - e.g., get Parameters.
|
||||
*/
|
||||
protected void prepare()
|
||||
{
|
||||
StringBuffer sb = new StringBuffer ("AD_PInstance_ID=")
|
||||
.append(getAD_PInstance_ID());
|
||||
// Parameter
|
||||
ProcessInfoParameter[] para = getParameter();
|
||||
for (int i = 0; i < para.length; i++)
|
||||
{
|
||||
String name = para[i].getParameterName();
|
||||
if (name.equals("DateAcct"))
|
||||
{
|
||||
p_DateAcct_From = (Timestamp)para[i].getParameter();
|
||||
p_DateAcct_To = (Timestamp)para[i].getParameter_To();
|
||||
}
|
||||
else if (name.equals("Account_ID"))
|
||||
p_Account_ID = ((BigDecimal)para[i].getParameter()).intValue();
|
||||
else
|
||||
log.log(Level.SEVERE, "Unknown Parameter: " + name);
|
||||
}
|
||||
} // prepare
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Perform process.
|
||||
* @return Message to be translated
|
||||
*/
|
||||
protected String doIt()
|
||||
{
|
||||
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
|
||||
String sql = "INSERT into T_Reconciliation " +
|
||||
"(AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, " +
|
||||
"IsActive, Fact_Acct_ID, " +
|
||||
"AD_PInstance_ID, MatchCode) " +
|
||||
"SELECT f.AD_Client_ID, f.AD_Org_ID, f.Created, f.CreatedBy, " +
|
||||
"f.Updated, f.UpdatedBy, f.IsActive, " +
|
||||
"f.Fact_Acct_ID, ?, r.MatchCode " +
|
||||
"FROM Fact_Acct f " +
|
||||
"LEFT OUTER JOIN Fact_Reconciliation r ON (f.Fact_Acct_ID=r.Fact_Acct_ID) " +
|
||||
"WHERE Account_ID = ? " +
|
||||
"AND DateAcct BETWEEN ? AND ? ";
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
pstmt = DB.prepareStatement(sql, get_TrxName());
|
||||
pstmt.setInt(1, getAD_PInstance_ID());
|
||||
pstmt.setInt(2, p_Account_ID);
|
||||
pstmt.setTimestamp(3, p_DateAcct_From);
|
||||
pstmt.setTimestamp(4, p_DateAcct_To);
|
||||
int count = pstmt.executeUpdate();
|
||||
String result = Msg.getMsg(getCtx(),"@Created@") + ": " + count + ", ";
|
||||
|
||||
log.log(Level.FINE, result);
|
||||
|
||||
sql = "DELETE FROM T_Reconciliation t " +
|
||||
"WHERE (SELECT SUM(f.amtacctdr-f.amtacctcr) FROM T_Reconciliation r " +
|
||||
" INNER JOIN Fact_Acct f ON (f.Fact_Acct_ID = r.Fact_Acct_ID) " +
|
||||
" WHERE r.MatchCode=t.MatchCode" +
|
||||
" AND r.AD_PInstance_ID = t.AD_PInstance_ID) = 0 " +
|
||||
"AND t.AD_PInstance_ID = ?";
|
||||
|
||||
pstmt = DB.prepareStatement(sql, get_TrxName());
|
||||
pstmt.setInt(1, getAD_PInstance_ID());
|
||||
count = pstmt.executeUpdate();
|
||||
result = Msg.getMsg(getCtx(), "@Deleted@") + ": " + count;
|
||||
|
||||
log.log(Level.FINE, result);
|
||||
|
||||
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.log(Level.SEVERE, sql, e);
|
||||
return e.getLocalizedMessage();
|
||||
}
|
||||
finally
|
||||
{
|
||||
DB.close(rs, pstmt);
|
||||
rs = null; pstmt = null;
|
||||
}
|
||||
|
||||
log.fine((System.currentTimeMillis() - m_start) + " ms");
|
||||
return "";
|
||||
} // doIt
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,680 @@
|
|||
/******************************************************************************
|
||||
* 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 *
|
||||
* Contributors: *
|
||||
* Colin Rooney (croo) Patch 1605368 Fixed Payment Terms & Only due *
|
||||
*****************************************************************************/
|
||||
package org.compiere.apps.form;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.math.BigDecimal;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Properties;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.event.TableModelEvent;
|
||||
import javax.swing.event.TableModelListener;
|
||||
import javax.swing.table.DefaultTableModel;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import org.adempiere.plaf.AdempierePLAF;
|
||||
import org.compiere.apps.AEnv;
|
||||
import org.compiere.apps.ConfirmPanel;
|
||||
import org.compiere.grid.ed.AutoCompletion;
|
||||
import org.compiere.grid.ed.VCheckBox;
|
||||
import org.compiere.grid.ed.VComboBox;
|
||||
import org.compiere.grid.ed.VDate;
|
||||
import org.compiere.grid.ed.VLookup;
|
||||
import org.compiere.minigrid.ColumnInfo;
|
||||
import org.compiere.minigrid.IDColumn;
|
||||
import org.compiere.minigrid.MiniTable;
|
||||
import org.compiere.model.MClient;
|
||||
import org.compiere.model.MFactReconciliation;
|
||||
import org.compiere.model.MLookup;
|
||||
import org.compiere.model.MLookupFactory;
|
||||
import org.compiere.model.MRole;
|
||||
import org.compiere.model.Query;
|
||||
import org.compiere.plaf.CompiereColor;
|
||||
import org.compiere.process.ProcessInfo;
|
||||
import org.compiere.swing.CLabel;
|
||||
import org.compiere.swing.CPanel;
|
||||
import org.compiere.swing.CTextField;
|
||||
import org.compiere.util.ASyncProcess;
|
||||
import org.compiere.util.CLogger;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.DisplayType;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.KeyNamePair;
|
||||
import org.compiere.util.Msg;
|
||||
|
||||
/**
|
||||
* Create manual match of accounting facts
|
||||
*/
|
||||
public class VFactReconcile extends CPanel
|
||||
implements FormPanel, ActionListener, TableModelListener, ASyncProcess
|
||||
{
|
||||
/**
|
||||
* Initialize Panel
|
||||
* @param WindowNo window
|
||||
* @param frame frame
|
||||
*/
|
||||
public void init (int WindowNo, FormFrame frame)
|
||||
{
|
||||
log.info("");
|
||||
m_WindowNo = WindowNo;
|
||||
m_frame = frame;
|
||||
try
|
||||
{
|
||||
dynInit();
|
||||
jbInit();
|
||||
|
||||
frame.getContentPane().add(commandPanel, BorderLayout.SOUTH);
|
||||
frame.getContentPane().add(mainPanel, BorderLayout.CENTER);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
log.log(Level.SEVERE, "", e);
|
||||
}
|
||||
} // init
|
||||
|
||||
/** Window No */
|
||||
private int m_WindowNo = 0;
|
||||
/** FormFrame */
|
||||
private FormFrame m_frame;
|
||||
|
||||
/** Format */
|
||||
private DecimalFormat m_format = DisplayType.getNumberFormat(DisplayType.Amount);
|
||||
/** SQL for Query */
|
||||
private String m_sql;
|
||||
/** Number of selected rows */
|
||||
private int m_noSelected = 0;
|
||||
/** Client ID */
|
||||
private int m_AD_Client_ID = 0;
|
||||
/**/
|
||||
private boolean m_isLocked = false;
|
||||
/** Logger */
|
||||
private static CLogger log = CLogger.getCLogger(VFactReconcile.class);
|
||||
|
||||
//
|
||||
private CPanel mainPanel = new CPanel();
|
||||
private BorderLayout mainLayout = new BorderLayout();
|
||||
private CPanel parameterPanel = new CPanel();
|
||||
private CLabel labelAcctSchema = new CLabel();
|
||||
private VLookup fieldAcctSchema = null;
|
||||
private MigLayout parameterLayout = null;
|
||||
private CLabel labelOrg = new CLabel();
|
||||
private VLookup fieldOrg = null;
|
||||
private VCheckBox isReconciled = new VCheckBox();
|
||||
private CLabel labelAccount = new CLabel();
|
||||
private VComboBox fieldAccount = new VComboBox();
|
||||
private CLabel labelBPartner = new CLabel();
|
||||
private VLookup fieldBPartner = null;
|
||||
|
||||
private JLabel dataStatus = new JLabel();
|
||||
private JScrollPane dataPane = new JScrollPane();
|
||||
private MiniTable miniTable = new MiniTable();
|
||||
private CPanel commandPanel = new CPanel();
|
||||
private JButton bCancel = ConfirmPanel.createCancelButton(true);
|
||||
private JButton bGenerate = ConfirmPanel.createProcessButton(true);
|
||||
private JButton bReset = ConfirmPanel.createResetButton(true);
|
||||
private JButton bZoom = ConfirmPanel.createZoomButton(true);
|
||||
private FlowLayout commandLayout = new FlowLayout();
|
||||
private JButton bRefresh = ConfirmPanel.createRefreshButton(true);
|
||||
private CLabel labelDateAcct = new CLabel();
|
||||
private VDate fieldDateAcct = new VDate();
|
||||
private CLabel labelDateAcct2 = new CLabel();
|
||||
private VDate fieldDateAcct2 = new VDate();
|
||||
|
||||
private CLabel labelProduct = new CLabel();
|
||||
private VLookup fieldProduct = null;
|
||||
private boolean loading = false;
|
||||
private int idColIndex = 3;
|
||||
private int amtColIndex = 1;
|
||||
private CLabel differenceLabel = new CLabel();
|
||||
private CTextField differenceField = new CTextField();
|
||||
|
||||
/**
|
||||
* Static Init
|
||||
* @throws Exception
|
||||
*/
|
||||
private void jbInit() throws Exception
|
||||
{
|
||||
CompiereColor.setBackground(this);
|
||||
//
|
||||
mainPanel.setLayout(mainLayout);
|
||||
parameterLayout = new MigLayout("fillx, wrap 4, hidemode 0", " [150:150][250:250][100:100][200:200]");
|
||||
parameterPanel.setLayout(parameterLayout);
|
||||
bRefresh.addActionListener(this);
|
||||
bReset.addActionListener(this);
|
||||
bZoom.addActionListener(this);
|
||||
bGenerate.setEnabled(false);
|
||||
bReset.setEnabled(false);
|
||||
//bRefresh.setText(Msg.getMsg(Env.getCtx(), "Query"));
|
||||
bGenerate.setText(Msg.getMsg(Env.getCtx(),"Process"));
|
||||
bReset.setText(Msg.getMsg(Env.getCtx(),"Reset"));
|
||||
bZoom.setText(Msg.translate(Env.getCtx(), "Fact_Acct_ID"));
|
||||
|
||||
//
|
||||
labelAcctSchema.setText(Msg.translate(Env.getCtx(), "C_AcctSchema_ID"));
|
||||
labelAccount.setText(Msg.translate(Env.getCtx(), "Account_ID"));
|
||||
labelBPartner.setText(Msg.translate(Env.getCtx(), "C_BPartner_ID"));
|
||||
labelDateAcct.setText(Msg.translate(Env.getCtx(), "DateAcct"));
|
||||
labelDateAcct2.setText("-");
|
||||
labelProduct.setText(Msg.translate(Env.getCtx(), "M_Product_ID"));
|
||||
//
|
||||
labelOrg.setText(Msg.translate(Env.getCtx(), "AD_Org_ID"));
|
||||
isReconciled.setText(Msg.translate(Env.getCtx(), "IsReconciled"));
|
||||
dataStatus.setText(" ");
|
||||
|
||||
|
||||
differenceLabel.setText(Msg.getMsg(Env.getCtx(), "Difference"));
|
||||
differenceField.setBackground(AdempierePLAF.getFieldBackground_Inactive());
|
||||
differenceField.setEditable(false);
|
||||
differenceField.setText("0");
|
||||
differenceField.setColumns(8);
|
||||
differenceField.setHorizontalAlignment(SwingConstants.RIGHT);
|
||||
//
|
||||
bGenerate.addActionListener(this);
|
||||
bCancel.addActionListener(this);
|
||||
//
|
||||
mainPanel.add(parameterPanel, BorderLayout.NORTH);
|
||||
parameterPanel.add(labelAcctSchema, "");
|
||||
parameterPanel.add(fieldAcctSchema, "growx");
|
||||
|
||||
parameterPanel.add(labelOrg, "");
|
||||
parameterPanel.add(fieldOrg, "growx");
|
||||
|
||||
parameterPanel.add(labelAccount, "");
|
||||
parameterPanel.add(fieldAccount, "wmax 250");
|
||||
|
||||
parameterPanel.add(isReconciled, "skip 1");
|
||||
|
||||
parameterPanel.add(labelBPartner, "");
|
||||
parameterPanel.add(fieldBPartner, "growx");
|
||||
|
||||
parameterPanel.add(labelProduct, "");
|
||||
parameterPanel.add(fieldProduct, "growx");
|
||||
|
||||
parameterPanel.add(labelDateAcct, "");
|
||||
parameterPanel.add(fieldDateAcct, "growx");
|
||||
|
||||
parameterPanel.add(labelDateAcct2, "");
|
||||
parameterPanel.add(fieldDateAcct2, "growx");
|
||||
|
||||
parameterPanel.add(bRefresh, "growx");
|
||||
|
||||
|
||||
mainPanel.add(dataStatus, BorderLayout.SOUTH);
|
||||
mainPanel.add(dataPane, BorderLayout.CENTER);
|
||||
dataPane.getViewport().add(miniTable, null);
|
||||
//
|
||||
commandPanel.setLayout(commandLayout);
|
||||
commandLayout.setAlignment(FlowLayout.RIGHT);
|
||||
commandLayout.setHgap(10);
|
||||
commandPanel.add(bZoom, null);
|
||||
commandPanel.add(differenceLabel, null);
|
||||
commandPanel.add(differenceField, null);
|
||||
commandPanel.add(bGenerate, null);
|
||||
commandPanel.add(bReset, null);
|
||||
commandPanel.add(bCancel, null);
|
||||
} // jbInit
|
||||
|
||||
/**
|
||||
* Dynamic Init.
|
||||
* - Load Bank Info
|
||||
* - Load BPartner
|
||||
* - Load Document Type
|
||||
* - Init Table
|
||||
*/
|
||||
private void dynInit()
|
||||
{
|
||||
Properties ctx = Env.getCtx();
|
||||
//
|
||||
m_AD_Client_ID = Env.getAD_Client_ID(Env.getCtx());
|
||||
|
||||
|
||||
int AD_Column_ID = 2513; // Fact_Acct.C_AcctSchema_ID
|
||||
MLookup lookupAS = MLookupFactory.get (Env.getCtx(), m_WindowNo, 0, AD_Column_ID, DisplayType.TableDir);
|
||||
fieldAcctSchema = new VLookup("C_AcctSchema_ID", true, false, true, lookupAS);
|
||||
fieldAcctSchema.addActionListener(this);
|
||||
MClient.get(Env.getCtx()).getAcctSchema().getC_AcctSchema_ID();
|
||||
fieldAcctSchema.setValue(MClient.get(Env.getCtx()).getAcctSchema().getC_AcctSchema_ID());
|
||||
|
||||
Dimension dim = fieldAcctSchema.getPreferredSize();
|
||||
dim.width = 300;
|
||||
fieldAcctSchema.setPreferredSize(dim);
|
||||
|
||||
// Organization filter selection
|
||||
AD_Column_ID = 839; //C_Period.AD_Org_ID (needed to allow org 0)
|
||||
MLookup lookupOrg = MLookupFactory.get(Env.getCtx(), m_WindowNo, 0, AD_Column_ID, DisplayType.TableDir);
|
||||
fieldOrg = new VLookup("AD_Org_ID", true, false, true, lookupOrg);
|
||||
if (lookupOrg.containsKey(0))
|
||||
fieldOrg.setValue(0);
|
||||
else
|
||||
fieldOrg.setValue(Env.getAD_Org_ID(Env.getCtx()));
|
||||
|
||||
|
||||
dim = fieldOrg.getPreferredSize();
|
||||
dim.width = 300;
|
||||
fieldOrg.setPreferredSize(dim);
|
||||
|
||||
// BPartner
|
||||
AD_Column_ID = 3499; // C_Invoice.C_BPartner_ID
|
||||
MLookup lookupBP = MLookupFactory.get (Env.getCtx(), m_WindowNo, 0, AD_Column_ID, DisplayType.Search);
|
||||
fieldBPartner = new VLookup("C_BPartner_ID", false, false, true, lookupBP);
|
||||
|
||||
// Product
|
||||
AD_Column_ID = 2527; // Fact_Acct.M_Product_ID
|
||||
MLookup lookupProduct = MLookupFactory.get (Env.getCtx(), m_WindowNo, 0, AD_Column_ID, DisplayType.Search);
|
||||
fieldProduct = new VLookup("M_Product_ID", false, false, true, lookupProduct);
|
||||
|
||||
|
||||
// Account
|
||||
KeyNamePair pp;
|
||||
String sql = MRole.getDefault().addAccessSQL(
|
||||
"SELECT ev.C_ElementValue_ID, ev.Value || ' ' || ev.Name FROM C_ElementValue ev", "ev",
|
||||
MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO)
|
||||
+ "AND ev.IsActive='Y' AND ev.IsSummary='N' "
|
||||
+ "AND ev.C_Element_ID IN (SELECT C_Element_ID FROM C_AcctSchema_Element ase "
|
||||
+ "WHERE ase.ElementType='AC' AND ase.AD_Client_ID=" + m_AD_Client_ID + ") "
|
||||
+ "ORDER BY 2";
|
||||
|
||||
try
|
||||
{
|
||||
PreparedStatement pstmt = DB.prepareStatement(sql, null);
|
||||
ResultSet rs = pstmt.executeQuery();
|
||||
while (rs.next())
|
||||
{
|
||||
pp = new KeyNamePair(rs.getInt(1), rs.getString(2));
|
||||
fieldAccount.addItem(pp);
|
||||
}
|
||||
rs.close();
|
||||
pstmt.close();
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.log(Level.SEVERE, sql, e);
|
||||
}
|
||||
|
||||
AutoCompletion.enable(fieldAccount);
|
||||
fieldAccount.setMandatory(true);
|
||||
fieldAccount.setSelectedIndex(0);
|
||||
|
||||
m_sql = miniTable.prepareTable(new ColumnInfo[] {
|
||||
new ColumnInfo(Msg.translate(ctx, "Amt"), "abs(fa.amtacctdr-fa.amtacctcr)", BigDecimal.class),
|
||||
new ColumnInfo(Msg.translate(ctx, "AmtAcct"), "(fa.amtacctdr-fa.amtacctcr)", BigDecimal.class,true,true,null),
|
||||
new ColumnInfo("DR/CR", "(CASE WHEN (fa.amtacctdr-fa.amtacctcr) < 0 THEN 'CR' ELSE 'DR' END)", String.class),
|
||||
new ColumnInfo(" ", "fa.Fact_Acct_ID", IDColumn.class, false, false, null),
|
||||
new ColumnInfo(Msg.translate(ctx, "C_BPartner_ID"), "bp.Name", String.class),
|
||||
new ColumnInfo(Msg.translate(ctx, "DateAcct"), "fa.DateAcct", Timestamp.class),
|
||||
new ColumnInfo(Msg.translate(ctx, "GL_Category_ID"), "glc.Name", String.class),
|
||||
new ColumnInfo(Msg.translate(ctx, "M_Product_ID"), "p.Value", String.class),
|
||||
new ColumnInfo(Msg.translate(ctx, "Qty"), "Qty", BigDecimal.class),
|
||||
new ColumnInfo(Msg.translate(ctx, "Description"), "fa.Description", String.class),
|
||||
new ColumnInfo(Msg.translate(ctx, "MatchCode"), "r.MatchCode", String.class),
|
||||
new ColumnInfo(Msg.translate(ctx, "DateTrx"), "fa.DateTrx", Timestamp.class),
|
||||
new ColumnInfo(Msg.translate(ctx, "AD_Org_ID"), "o.Value", String.class)},
|
||||
// FROM
|
||||
"Fact_Acct fa"
|
||||
+ " LEFT OUTER JOIN Fact_Reconciliation r ON (fa.Fact_Acct_ID=r.Fact_Acct_ID)"
|
||||
+ " LEFT OUTER JOIN C_BPartner bp ON (fa.C_BPartner_ID=bp.C_BPartner_ID)"
|
||||
+ " LEFT OUTER JOIN AD_Org o ON (o.AD_Org_ID=fa.AD_Org_ID)"
|
||||
+ " LEFT OUTER JOIN M_Product p ON (p.M_Product_ID=fa.M_Product_ID)"
|
||||
+ " LEFT OUTER JOIN GL_Category glc ON (fa.GL_Category_ID=glc.GL_Category_ID)",
|
||||
// WHERE
|
||||
" fa.AD_Client_ID=?", // additional where & order in loadTableInfo()
|
||||
true, "fa");
|
||||
//
|
||||
miniTable.getModel().addTableModelListener(this);
|
||||
miniTable.setColumnVisibility(miniTable.getColumnModel().getColumn(1), false);
|
||||
|
||||
} // dynInit
|
||||
|
||||
/**
|
||||
* Query and create TableInfo
|
||||
*/
|
||||
private void loadTableInfo()
|
||||
{
|
||||
log.config("");
|
||||
// not yet initialized
|
||||
if (m_sql == null)
|
||||
return;
|
||||
loading = true;
|
||||
|
||||
|
||||
|
||||
String sql = m_sql;
|
||||
KeyNamePair pp = (KeyNamePair)fieldAccount.getSelectedItem();
|
||||
int Account_ID = pp.getKey();
|
||||
if (Account_ID != 0)
|
||||
sql += " AND fa.Account_ID=?";
|
||||
|
||||
if ( ((Integer) fieldAcctSchema.getValue()) > 0 )
|
||||
sql += " AND fa.C_AcctSchema_ID = ?";
|
||||
|
||||
sql += " AND ((SELECT SUM(f.amtacctdr-f.amtacctcr) FROM Fact_Reconciliation rec " +
|
||||
" INNER JOIN Fact_Acct f ON (f.Fact_Acct_ID = rec.Fact_Acct_ID) " +
|
||||
" WHERE r.MatchCode=rec.MatchCode) ";
|
||||
if ( isReconciled.isSelected() )
|
||||
sql += "= 0) ";
|
||||
else
|
||||
sql += "<> 0 OR r.MatchCode IS NULL) ";
|
||||
|
||||
|
||||
|
||||
if ( fieldBPartner.getValue() != null )
|
||||
sql += " AND fa.C_BPartner_ID = ?";
|
||||
|
||||
if ( fieldProduct.getValue() != null )
|
||||
sql += " AND fa.M_Product_ID = ?";
|
||||
|
||||
if ( fieldDateAcct.getValue() != null )
|
||||
sql += " AND fa.DateAcct >= ?";
|
||||
|
||||
if ( fieldDateAcct2.getValue() != null )
|
||||
sql += " AND fa.DateAcct <= ?";
|
||||
|
||||
|
||||
sql += " ORDER BY 1,5,3,6";
|
||||
|
||||
log.finest(sql + "Account_ID =" + Account_ID );
|
||||
// Get facts
|
||||
try
|
||||
{
|
||||
int index = 1;
|
||||
PreparedStatement pstmt = DB.prepareStatement(sql, null);
|
||||
|
||||
pstmt.setInt(index++, m_AD_Client_ID); // Client
|
||||
|
||||
pstmt.setInt(index++, (Integer) fieldAccount.getValue()); // account
|
||||
|
||||
if ( ((Integer) fieldAcctSchema.getValue()) > 0 )
|
||||
pstmt.setInt(index++, (Integer) fieldAcctSchema.getValue());
|
||||
|
||||
if ( fieldBPartner.getValue() != null )
|
||||
pstmt.setInt(index++, (Integer) fieldBPartner.getValue());
|
||||
|
||||
if ( fieldProduct.getValue() != null )
|
||||
pstmt.setInt(index++, (Integer) fieldProduct.getValue());
|
||||
|
||||
if ( fieldDateAcct.getValue() != null )
|
||||
pstmt.setTimestamp(index++, (Timestamp) fieldDateAcct.getValue());
|
||||
|
||||
|
||||
if ( fieldDateAcct2.getValue() != null )
|
||||
pstmt.setTimestamp(index++, (Timestamp) fieldDateAcct2.getValue());
|
||||
|
||||
|
||||
ResultSet rs = pstmt.executeQuery();
|
||||
miniTable.loadTable(rs);
|
||||
rs.close();
|
||||
pstmt.close();
|
||||
log.log(Level.FINE, sql);
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.log(Level.SEVERE, sql, e);
|
||||
}
|
||||
loading = false;
|
||||
|
||||
calculateSelection();
|
||||
} // loadTableInfo
|
||||
|
||||
/**
|
||||
* Dispose
|
||||
*/
|
||||
public void dispose()
|
||||
{
|
||||
if (m_frame != null)
|
||||
m_frame.dispose();
|
||||
m_frame = null;
|
||||
} // dispose
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* ActionListener
|
||||
* @param e event
|
||||
*/
|
||||
public void actionPerformed (ActionEvent e)
|
||||
{
|
||||
// Generate Reconciliation
|
||||
if (e.getSource() == bGenerate)
|
||||
{
|
||||
generateReconciliation();
|
||||
}
|
||||
|
||||
else if (e.getSource() == bReset)
|
||||
{
|
||||
resetReconciliation();
|
||||
}
|
||||
else if (e.getSource() == bZoom)
|
||||
{
|
||||
zoom();
|
||||
}
|
||||
|
||||
else if (e.getSource() == bCancel)
|
||||
dispose();
|
||||
|
||||
// Update
|
||||
else if (e.getSource() == bRefresh)
|
||||
loadTableInfo();
|
||||
|
||||
} // actionPerformed
|
||||
|
||||
/**
|
||||
* Zoom to target
|
||||
* @param AD_Window_ID window id
|
||||
* @param zoomQuery zoom query
|
||||
*/
|
||||
protected void zoom ()
|
||||
{
|
||||
log.info("");
|
||||
|
||||
int selected = miniTable.getSelectedRow();
|
||||
|
||||
if ( selected == -1 )
|
||||
return;
|
||||
|
||||
int factId = ((IDColumn) miniTable.getModel().getValueAt(selected, idColIndex)).getRecord_ID();
|
||||
|
||||
AEnv.zoom(270, factId);
|
||||
} // zoom
|
||||
|
||||
|
||||
private void resetReconciliation() {
|
||||
log.info("");
|
||||
//
|
||||
miniTable.stopEditor(true);
|
||||
if (miniTable.getRowCount() == 0)
|
||||
return;
|
||||
miniTable.setRowSelectionInterval(0,0);
|
||||
calculateSelection();
|
||||
if (m_noSelected == 0)
|
||||
return;
|
||||
|
||||
for ( int r = 0; r < miniTable.getModel().getRowCount(); r++ )
|
||||
{
|
||||
if ( ((IDColumn) miniTable.getModel().getValueAt(r, idColIndex)).isSelected() )
|
||||
{
|
||||
int factId = ((IDColumn) miniTable.getModel().getValueAt(r, idColIndex )).getRecord_ID();
|
||||
|
||||
MFactReconciliation rec = new Query(Env.getCtx(), MFactReconciliation.Table_Name, "Fact_Acct_ID = ?", null)
|
||||
.setParameters(new Object[] {factId}).first();
|
||||
|
||||
if ( rec == null )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
rec.setMatchCode(null);
|
||||
rec.saveEx();
|
||||
|
||||
((DefaultTableModel) miniTable.getModel()).removeRow(r--);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Table Model Listener
|
||||
* @param e event
|
||||
*/
|
||||
public void tableChanged(TableModelEvent e)
|
||||
{
|
||||
if (! loading )
|
||||
calculateSelection();
|
||||
} // valueChanged
|
||||
|
||||
/**
|
||||
* Calculate selected rows.
|
||||
* - add up selected rows
|
||||
*/
|
||||
public void calculateSelection()
|
||||
{
|
||||
m_noSelected = 0;
|
||||
BigDecimal selectedAmt = new BigDecimal(0.0);
|
||||
|
||||
int rows = miniTable.getRowCount();
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
IDColumn id = (IDColumn)miniTable.getModel().getValueAt(i, idColIndex);
|
||||
if (id.isSelected())
|
||||
{
|
||||
BigDecimal amt = (BigDecimal)miniTable.getModel().getValueAt(i, amtColIndex);
|
||||
if (amt != null)
|
||||
selectedAmt = selectedAmt.add(amt);
|
||||
m_noSelected++;
|
||||
}
|
||||
}
|
||||
|
||||
// Information
|
||||
StringBuffer info = new StringBuffer();
|
||||
info.append(m_noSelected).append(" ").append(Msg.getMsg(Env.getCtx(), "Selected")).append(" / ").append(miniTable.getRowCount());
|
||||
|
||||
differenceField.setText(m_format.format(selectedAmt));
|
||||
dataStatus.setText(info.toString());
|
||||
//
|
||||
bGenerate.setEnabled(m_noSelected != 0 && Env.ZERO.compareTo(selectedAmt) == 0 && !isReconciled.isSelected());
|
||||
bReset.setEnabled(m_noSelected > 0 && isReconciled.isSelected());
|
||||
} // calculateSelection
|
||||
|
||||
/**
|
||||
* Generate Reconciliation record
|
||||
*/
|
||||
private void generateReconciliation()
|
||||
{
|
||||
log.info("");
|
||||
//
|
||||
miniTable.stopEditor(true);
|
||||
if (miniTable.getRowCount() == 0)
|
||||
return;
|
||||
miniTable.setRowSelectionInterval(0,0);
|
||||
calculateSelection();
|
||||
if (m_noSelected == 0)
|
||||
return;
|
||||
|
||||
|
||||
String format = "yyyy-MM-dd HH:mm:ss.SSS";
|
||||
Calendar cal = Calendar.getInstance();
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(format);
|
||||
String time = sdf.format(cal.getTime());
|
||||
|
||||
String matchcode = "Manual: " + Env.getContext(Env.getCtx(), "#AD_User_Name") + " " + time;
|
||||
|
||||
for ( int r = 0; r < miniTable.getModel().getRowCount(); r++ )
|
||||
{
|
||||
if ( ((IDColumn) miniTable.getModel().getValueAt(r, idColIndex)).isSelected() )
|
||||
{
|
||||
int factId = ((IDColumn) miniTable.getModel().getValueAt(r, idColIndex )).getRecord_ID();
|
||||
|
||||
MFactReconciliation rec = new Query(Env.getCtx(), MFactReconciliation.Table_Name, "Fact_Acct_ID = ?", null)
|
||||
.setParameters(new Object[] {factId}).first();
|
||||
|
||||
if ( rec == null )
|
||||
{
|
||||
rec = new MFactReconciliation(Env.getCtx(), 0, null);
|
||||
rec.setFact_Acct_ID(factId);
|
||||
}
|
||||
|
||||
rec.setMatchCode(matchcode);
|
||||
rec.saveEx();
|
||||
|
||||
((DefaultTableModel) miniTable.getModel()).removeRow(r--);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Lock User Interface
|
||||
* Called from the Worker before processing
|
||||
* @param pi process info
|
||||
*/
|
||||
public void lockUI (ProcessInfo pi)
|
||||
{
|
||||
this.setEnabled(false);
|
||||
m_isLocked = true;
|
||||
} // lockUI
|
||||
|
||||
/**
|
||||
* Unlock User Interface.
|
||||
* Called from the Worker when processing is done
|
||||
* @param pi process info
|
||||
*/
|
||||
public void unlockUI (ProcessInfo pi)
|
||||
{
|
||||
this.setEnabled(true);
|
||||
m_isLocked = false;
|
||||
} // unlockUI
|
||||
|
||||
/**
|
||||
* Is the UI locked (Internal method)
|
||||
* @return true, if UI is locked
|
||||
*/
|
||||
public boolean isUILocked()
|
||||
{
|
||||
return m_isLocked;
|
||||
} // isLoacked
|
||||
|
||||
/**
|
||||
* Method to be executed async.
|
||||
* Called from the ASyncProcess worker
|
||||
* @param pi process info
|
||||
*/
|
||||
public void executeASync (ProcessInfo pi)
|
||||
{
|
||||
log.config("-");
|
||||
} // executeASync
|
||||
|
||||
} // VPaySelect
|
Loading…
Reference in New Issue