details:   https://code.openbravo.com/erp/devel/pi/rev/3e75e4d92c64
changeset: 23416:3e75e4d92c64
user:      Eduardo Argal Guibert <eduardo.argal <at> openbravo.com>
date:      Mon Jun 02 12:50:56 2014 +0200
summary:   Fixes issue 25976: Open Balances

diffstat:

 modules/org.openbravo.advpaymentmngt/src-db/database/sourcedata/AD_PROCESS.xml 
                     |     24 +
 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/RecordID2Filling.java
 |    461 +
 referencedata/sampledata/F_B_International_Group/FACT_ACCT.xml                 
                     |  21427 ++++++---
 src-db/database/model/tables/FACT_ACCT.xml                                     
                     |     13 +
 src-db/database/sourcedata/AD_COLUMN.xml                                       
                     |     45 +-
 src-db/database/sourcedata/AD_ELEMENT.xml                                      
                     |     14 +
 src-db/database/sourcedata/AD_TEXTINTERFACES.xml                               
                     |     11 +
 src-test/org/openbravo/test/AllAntTaskTests.java                               
                     |      4 +
 src-test/org/openbravo/test/accounting/RecordID2Test.java                      
                     |    663 +
 src/org/openbravo/erpCommon/ad_forms/AcctServer.java                           
                     |      2 +
 src/org/openbravo/erpCommon/ad_forms/DocFINFinAccTransaction.java              
                     |     11 +-
 src/org/openbravo/erpCommon/ad_forms/DocFINPayment.java                        
                     |      8 +-
 src/org/openbravo/erpCommon/ad_forms/DocFINReconciliation.java                 
                     |     14 +-
 src/org/openbravo/erpCommon/ad_forms/DocInvoice.java                           
                     |      2 +-
 src/org/openbravo/erpCommon/ad_forms/DocInvoice_data.xsql                      
                     |     10 +-
 src/org/openbravo/erpCommon/ad_forms/FactLine.java                             
                     |      6 +
 src/org/openbravo/erpCommon/ad_forms/FactLine_data.xsql                        
                     |     25 +
 src/org/openbravo/erpCommon/ad_reports/ReportGeneralLedger.html                
                     |      3 +
 src/org/openbravo/erpCommon/ad_reports/ReportGeneralLedger.java                
                     |     45 +-
 src/org/openbravo/erpCommon/ad_reports/ReportGeneralLedger.xml                 
                     |      2 +
 src/org/openbravo/erpCommon/ad_reports/ReportGeneralLedger_data.xsql           
                     |      2 +
 src/org/openbravo/financial/ResetAccounting.java                               
                     |     14 +-
 22 files changed, 14675 insertions(+), 8131 deletions(-)

diffs (truncated from 65242 to 300 lines):

diff -r 123836b0013c -r 3e75e4d92c64 
modules/org.openbravo.advpaymentmngt/src-db/database/sourcedata/AD_PROCESS.xml
--- 
a/modules/org.openbravo.advpaymentmngt/src-db/database/sourcedata/AD_PROCESS.xml
    Mon Jun 02 12:57:42 2014 +0200
+++ 
b/modules/org.openbravo.advpaymentmngt/src-db/database/sourcedata/AD_PROCESS.xml
    Mon Jun 02 12:50:56 2014 +0200
@@ -345,6 +345,30 @@
 <!--7AC7BE9024E448A0BB863C159DA762F9-->  
<IS_EXPLICIT_ACCESS><![CDATA[N]]></IS_EXPLICIT_ACCESS>
 <!--7AC7BE9024E448A0BB863C159DA762F9--></AD_PROCESS>
 
+<!--AA64E3BA23F24D4F8E6B06970500FC70--><AD_PROCESS>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<AD_PROCESS_ID><![CDATA[AA64E3BA23F24D4F8E6B06970500FC70]]></AD_PROCESS_ID>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  <VALUE><![CDATA[recordid2]]></VALUE>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  <NAME><![CDATA[Open Balances: Review 
historical data]]></NAME>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  <DESCRIPTION><![CDATA[Review 
historical data to fulfill required information for 'Open Balances' 
project]]></DESCRIPTION>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  <HELP><![CDATA[Open Balances: 
Record_ID2 and DateBalanced Filling]]></HELP>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<ACCESSLEVEL><![CDATA[3]]></ACCESSLEVEL>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<ISUSERSTARTABLE><![CDATA[N]]></ISUSERSTARTABLE>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  <ISREPORT><![CDATA[N]]></ISREPORT>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<ISDIRECTPRINT><![CDATA[N]]></ISDIRECTPRINT>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<CLASSNAME><![CDATA[org.openbravo.advpaymentmngt.process.RecordID2Filling]]></CLASSNAME>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<ISBACKGROUND><![CDATA[Y]]></ISBACKGROUND>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  <ISJASPER><![CDATA[N]]></ISJASPER>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<ISEXTERNALSERVICE><![CDATA[N]]></ISEXTERNALSERVICE>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<AD_MODULE_ID><![CDATA[A918E3331C404B889D69AA9BFAFB23AC]]></AD_MODULE_ID>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  <UIPATTERN><![CDATA[M]]></UIPATTERN>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<ISADVANCEDFEATURE><![CDATA[N]]></ISADVANCEDFEATURE>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<PREVENTCONCURRENT><![CDATA[Y]]></PREVENTCONCURRENT>
+<!--AA64E3BA23F24D4F8E6B06970500FC70-->  
<IS_EXPLICIT_ACCESS><![CDATA[N]]></IS_EXPLICIT_ACCESS>
+<!--AA64E3BA23F24D4F8E6B06970500FC70--></AD_PROCESS>
+
 <!--B54318B49E984B9CB855AEFB1F474CD6--><AD_PROCESS>
 <!--B54318B49E984B9CB855AEFB1F474CD6-->  
<AD_PROCESS_ID><![CDATA[B54318B49E984B9CB855AEFB1F474CD6]]></AD_PROCESS_ID>
 <!--B54318B49E984B9CB855AEFB1F474CD6-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r 123836b0013c -r 3e75e4d92c64 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/RecordID2Filling.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ 
b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/RecordID2Filling.java
       Mon Jun 02 12:50:56 2014 +0200
@@ -0,0 +1,461 @@
+package org.openbravo.advpaymentmngt.process;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.hibernate.Query;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.criterion.Restrictions;
+import org.openbravo.dal.core.OBContext;
+import org.openbravo.dal.service.OBCriteria;
+import org.openbravo.dal.service.OBDal;
+import org.openbravo.dal.service.OBQuery;
+import org.openbravo.model.financialmgmt.accounting.AccountingFact;
+import org.openbravo.model.financialmgmt.accounting.coa.AccountingCombination;
+import org.openbravo.model.financialmgmt.accounting.coa.AcctSchema;
+import org.openbravo.model.financialmgmt.payment.FIN_FinaccTransaction;
+import org.openbravo.model.financialmgmt.payment.FIN_FinancialAccount;
+import org.openbravo.model.financialmgmt.payment.FIN_Payment;
+import org.openbravo.model.financialmgmt.payment.FIN_PaymentMethod;
+import org.openbravo.model.financialmgmt.payment.FIN_PaymentScheduleDetail;
+import org.openbravo.model.financialmgmt.payment.FinAccPaymentMethod;
+import org.openbravo.scheduling.ProcessBundle;
+import org.openbravo.scheduling.ProcessLogger;
+import org.openbravo.service.db.DalBaseProcess;
+
+public class RecordID2Filling extends DalBaseProcess {
+
+  private static final Object TRANSACTION_TABLE_ID = 
"4D8C3B3C31D1410DA046140C9F024D17";
+  private ProcessLogger logger;
+
+  @Override
+  protected void doExecute(ProcessBundle bundle) throws Exception {
+    logger = bundle.getLogger();
+    final StringBuilder hqlInvoices = new StringBuilder();
+    Set<AcctSchema> schemas = getSchemas();
+    Set<String> bpAccounts = new HashSet<String>();
+    Set<String> faAccounts = new HashSet<String>();
+    for (AcctSchema acctSchema : schemas) {
+      bpAccounts.addAll(getBPAccountList(true, acctSchema.getId()));
+      bpAccounts.addAll(getBPAccountList(false, acctSchema.getId()));
+      faAccounts.addAll(getFAAccountList(true, acctSchema.getId()));
+      faAccounts.addAll(getFAAccountList(false, acctSchema.getId()));
+    }
+
+    hqlInvoices.append(" update FinancialMgmtAccountingFact as f set 
f.recordID2 = f.lineID ");
+    hqlInvoices.append(" where f.table.id = '318' ");
+    hqlInvoices
+        .append("   and exists (select 1 from FIN_Payment_Schedule as ps where 
ps.id = f.lineID)");
+    hqlInvoices.append("   and f.account.id in :accounts");
+    hqlInvoices.append("   and f.recordID2 is null");
+    Query updateInvoices = 
OBDal.getInstance().getSession().createQuery(hqlInvoices.toString());
+    updateInvoices.setParameterList("accounts", bpAccounts);
+    int numberInvoices = updateInvoices.executeUpdate();
+    logger.logln("Number of invoice entries updated: " + numberInvoices);
+    OBDal.getInstance().flush();
+
+    final StringBuilder hqlPayments = new StringBuilder();
+    hqlPayments
+        .append(" update FinancialMgmtAccountingFact as f set f.recordID2 = ("
+            + "select case when psd.invoicePaymentSchedule is null then 
psd.orderPaymentSchedule else psd.invoicePaymentSchedule end "
+            + "from FIN_Payment_ScheduleDetail as psd join psd.paymentDetails 
as pd"
+            + " where pd.id = f.lineID)");
+    hqlPayments.append("where f.table.id = 'D1A97202E832470285C9B1EB026D54E2' 
");
+    hqlPayments.append(" and f.account.id in :accounts");
+    hqlPayments.append(" and f.recordID2 is null");
+    Query updatePayments = 
OBDal.getInstance().getSession().createQuery(hqlPayments.toString());
+    updatePayments.setParameterList("accounts", bpAccounts);
+    int numberPayments = updatePayments.executeUpdate();
+
+    logger.logln("Number of payment entries updated: " + numberPayments);
+    OBDal.getInstance().flush();
+
+    // Updates in transit accounts (record_id2)
+    final StringBuilder hqlPaymentsInTransit = new StringBuilder();
+    hqlPaymentsInTransit
+        .append(" update FinancialMgmtAccountingFact as f set f.recordID2 = 
f.recordID");
+    hqlPaymentsInTransit.append(" where f.lineID is null ");
+    hqlPaymentsInTransit.append(" and f.recordID2 is null");
+    hqlPaymentsInTransit
+        .append(" and exists (select 1 from FIN_Payment as p where p.id = 
f.recordID "
+            + "and not exists( select 1 from FIN_Payment_Credit as pc where 
pc.creditPaymentUsed = p))");
+    Query updatePaymentsinTransit = OBDal.getInstance().getSession()
+        .createQuery(hqlPaymentsInTransit.toString());
+    int numberPaymentsInTransit = updatePaymentsinTransit.executeUpdate();
+
+    System.out
+        .println("Number of payment entries updated (In Transit): " + 
numberPaymentsInTransit);
+    OBDal.getInstance().flush();
+
+    final StringBuilder hqlTrxRec = new StringBuilder();
+    hqlTrxRec.append(" select f from FinancialMgmtAccountingFact as f ");
+    hqlTrxRec.append(" where f.recordID2 is null ");
+    hqlTrxRec
+        .append("   and exists (select 1 from FIN_Finacc_Transaction as t 
where t.id = f.lineID)");
+    hqlTrxRec.append("   and account.id in :accounts");
+    Query query = 
OBDal.getInstance().getSession().createQuery(hqlTrxRec.toString());
+
+    query.setParameterList("accounts", bpAccounts);
+    int i = 0;
+    int j = 0;
+    query.setFetchSize(1000);
+    final ScrollableResults scroller = query.scroll(ScrollMode.FORWARD_ONLY);
+    try {
+      while (scroller.next()) {
+        OBContext.setAdminMode(false);
+        final AccountingFact accountingEntry = (AccountingFact) 
scroller.get()[0];
+        try {
+          FIN_FinaccTransaction trx = 
OBDal.getInstance().get(FIN_FinaccTransaction.class,
+              accountingEntry.getLineID());
+          if (trx != null && trx.getFinPayment() != null) {
+            if (trx.getFinPayment().getFINPaymentDetailList().size() == 1
+                && (trx.getFinPayment().getFINPaymentDetailList().get(0)
+                    
.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null 
|| trx
+                    .getFinPayment().getFINPaymentDetailList().get(0)
+                    
.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null)) {
+              accountingEntry
+                  
.setRecordID2(trx.getFinPayment().getFINPaymentDetailList().get(0)
+                      
.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() == null ? 
trx
+                      .getFinPayment().getFINPaymentDetailList().get(0)
+                      
.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getId()
+                      : trx.getFinPayment().getFINPaymentDetailList().get(0)
+                          
.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule()
+                          .getId());
+              OBDal.getInstance().save(accountingEntry);
+              j++;
+            } else {
+              FIN_PaymentScheduleDetail psd = 
getOrderedPSDs(trx.getFinPayment()).get(
+                  getAccountingEntryPosition(accountingEntry, bpAccounts));
+              
accountingEntry.setRecordID2(psd.getPaymentDetails().isPrepayment() ? psd
+                  .getOrderPaymentSchedule().getId() : 
psd.getInvoicePaymentSchedule().getId());
+              OBDal.getInstance().save(accountingEntry);
+              j++;
+            }
+          }
+          // clear the session every 100 records
+          if ((i % 100) == 0 && i != 0) {
+            logger.logln(String.valueOf(i + 1) + " - " + String.valueOf(j));
+            logger.logln(String.valueOf(i + 1) + " - " + String.valueOf(j));
+            OBDal.getInstance().flush();
+            OBDal.getInstance().getSession().clear();
+          }
+          i++;
+        } catch (Exception e) {
+          logger.logln("Entry not updated: " + accountingEntry.getId());
+          continue;
+        }
+      }
+      OBDal.getInstance().flush();
+      OBDal.getInstance().getSession().clear();
+    } finally {
+      OBContext.restorePreviousMode();
+      scroller.close();
+    }
+    // Update Transactions and Reconciliations
+    final StringBuilder hqlTrxRecInTransit = new StringBuilder();
+    hqlTrxRecInTransit.append(" select f from FinancialMgmtAccountingFact as f 
");
+    hqlTrxRecInTransit.append(" where f.recordID2 is null ");
+    hqlTrxRecInTransit
+        .append("   and (exists (select 1 from FIN_Finacc_Transaction as t 
where t.id = f.lineID) or (f.lineID is null and f.table.id = '"
+            + TRANSACTION_TABLE_ID + "'))");
+    hqlTrxRecInTransit.append("   and account.id in :accounts");
+    Query queryInTransit = OBDal.getInstance().getSession()
+        .createQuery(hqlTrxRecInTransit.toString());
+
+    queryInTransit.setParameterList("accounts", faAccounts);
+    i = 0;
+    j = 0;
+    queryInTransit.setFetchSize(1000);
+    final ScrollableResults scrollerInTransit = 
queryInTransit.scroll(ScrollMode.FORWARD_ONLY);
+    try {
+      while (scrollerInTransit.next()) {
+        OBContext.setAdminMode(false);
+        final AccountingFact accountingEntry = (AccountingFact) 
scrollerInTransit.get()[0];
+        try {
+          FIN_FinaccTransaction trx = OBDal.getInstance().get(
+              FIN_FinaccTransaction.class,
+              accountingEntry.getLineID() == null ? 
accountingEntry.getRecordID() : accountingEntry
+                  .getLineID());
+          if (trx != null && trx.getFinPayment() != null) {
+            // logger.logln("Table: " + accountingEntry.getTable().getName());
+            // logger.logln("Accounting entry: ");
+            // logger.logln(accountingEntry.getAccountingEntryDescription() + 
" - "
+            // + accountingEntry.getDebit().toString() + " - "
+            // + accountingEntry.getCredit().toString());
+            // logger.logln("Payment Method: " + 
trx.getFinPayment().getPaymentMethod().getName());
+            // logger.logln("Financial Account: " + 
trx.getAccount().getName());
+
+            Set<String> paymentAccount = 
getFAAccountList(trx.getFinPayment().isReceipt(),
+                accountingEntry.getAccountingSchema().getId(), 
trx.getAccount().getId(), trx
+                    .getFinPayment().getPaymentMethod().getId(), "PAY");
+            Set<String> transactionAccount = 
getFAAccountList(trx.getFinPayment().isReceipt(),
+                accountingEntry.getAccountingSchema().getId(), 
trx.getAccount().getId(), trx
+                    .getFinPayment().getPaymentMethod().getId(), "TRX");
+
+            // logger.logln("Payment event account: " + paymentAccount);
+            // logger.logln("Transaction event account: " + 
transactionAccount);
+            if (paymentAccount.contains(accountingEntry.getAccount().getId())) 
{
+              logger.logln("Use: Payment ID= " + trx.getFinPayment().getId());
+              accountingEntry.setRecordID2(trx.getFinPayment().getId());
+              OBDal.getInstance().save(accountingEntry);
+              j++;
+            } else if 
(transactionAccount.contains(accountingEntry.getAccount().getId())) {
+              logger.logln("Use: Transaction ID= " + trx.getId());
+              accountingEntry.setRecordID2(trx.getId());
+              OBDal.getInstance().save(accountingEntry);
+              j++;
+            }
+          }
+          // clear the session every 100 records
+          if ((i % 100) == 0 && i != 0) {
+            logger.logln(String.valueOf(i + 1) + " - " + String.valueOf(j));
+            logger.logln(String.valueOf(i + 1) + " - " + String.valueOf(j));
+            OBDal.getInstance().flush();
+            OBDal.getInstance().getSession().clear();
+          }
+          i++;
+        } catch (Exception e) {
+          logger.logln("Entry not updated: " + accountingEntry.getId());
+          continue;
+        }
+      }
+      OBDal.getInstance().flush();
+      OBDal.getInstance().getSession().clear();
+    } finally {
+      OBContext.restorePreviousMode();
+      scrollerInTransit.close();
+    }
+
+    // Update date balancing
+    final StringBuilder hqlDateBalanced = new StringBuilder();
+    hqlDateBalanced
+        .append(" update FinancialMgmtAccountingFact as f set f.dateBalanced = 
"
+            + "(select max(f2.accountingDate) from FinancialMgmtAccountingFact 
as f2 "
+            + "where f2.recordID2 = f.recordID2 and f2.accountingSchema = 
f.accountingSchema and f2.account = f.account group by f2.recordID2 having 
sum(f2.credit-f2.debit)=0) ");
+    hqlDateBalanced
+        .append(" where exists (select 1 from FinancialMgmtAccountingFact as 
f3 "
+            + "where f3.recordID2 = f.recordID2 and f3.accountingSchema = 
f.accountingSchema and f3.account = f.account group by f3.recordID2 having 
sum(f3.credit-f3.debit)=0)");
+    hqlDateBalanced.append(" and f.dateBalanced is null");
+    Query updateDateBalanced = OBDal.getInstance().getSession()
+        .createQuery(hqlDateBalanced.toString());
+    int numberBalanced = updateDateBalanced.executeUpdate();
+    logger.logln("Number of date balanced entries: " + numberBalanced);
+    OBDal.getInstance().flush();
+  }
+
+  private Set<AcctSchema> getSchemas() {
+    OBCriteria<AcctSchema> obc = 
OBDal.getInstance().createCriteria(AcctSchema.class);
+    return new HashSet<AcctSchema>(obc.list());
+  }
+
+  private int getAccountingEntryPosition(AccountingFact accountingEntry, 
Set<String> accounts) {
+    final StringBuilder hqlString = new StringBuilder();
+    hqlString.append(" as f");
+    hqlString.append(" where f.account.id in :accounts");
+    hqlString.append(" and f.recordID = :recordID");
+    hqlString.append(" order by abs(f.debit-f.credit), f.creationDate");
+    final OBQuery<AccountingFact> query = 
OBDal.getInstance().createQuery(AccountingFact.class,
+        hqlString.toString());
+    query.setNamedParameter("accounts", accounts);

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their 
applications. Written by three acclaimed leaders in the field, 
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Openbravo-commits mailing list
Openbravo-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to