details:   /erp/devel/pi/rev/09ef43d4e7ec
changeset: 9272:09ef43d4e7ec
user:      Eduardo Argal Guibert <eduardo.argal <at> openbravo.com>
date:      Tue Dec 21 12:09:26 2010 +0100
summary:   Adds new utilities

details:   /erp/devel/pi/rev/570b7999e553
changeset: 9273:570b7999e553
user:      Eduardo Argal Guibert <eduardo.argal <at> openbravo.com>
date:      Tue Dec 21 12:14:51 2010 +0100
summary:   Fixes utilities in previous commit

details:   /erp/devel/pi/rev/8ca18c8b50b9
changeset: 9274:8ca18c8b50b9
user:      Eduardo Argal Guibert <eduardo.argal <at> openbravo.com>
date:      Tue Dec 21 12:16:35 2010 +0100
summary:   Adds support to bankstatement posting - prototype

details:   /erp/devel/pi/rev/146dcba884ea
changeset: 9275:146dcba884ea
user:      Eduardo Argal Guibert <eduardo.argal <at> openbravo.com>
date:      Tue Dec 21 12:22:51 2010 +0100
summary:   APRM accounting classes polishing

details:   /erp/devel/pi/rev/c6fbbccb2ac4
changeset: 9276:c6fbbccb2ac4
user:      Eduardo Argal Guibert <eduardo.argal <at> openbravo.com>
date:      Tue Dec 21 12:24:48 2010 +0100
summary:   Changed name of parameter

details:   /erp/devel/pi/rev/d367ad3ec845
changeset: 9277:d367ad3ec845
user:      Eduardo Argal Guibert <eduardo.argal <at> openbravo.com>
date:      Tue Dec 21 12:25:29 2010 +0100
summary:   changed name for parameter

details:   /erp/devel/pi/rev/62893960dcdb
changeset: 9278:62893960dcdb
user:      Eduardo Argal Guibert <eduardo.argal <at> openbravo.com>
date:      Tue Dec 21 12:26:15 2010 +0100
summary:   Avoid null pointer

details:   /erp/devel/pi/rev/12bb21dae559
changeset: 9279:12bb21dae559
user:      Eduardo Argal Guibert <eduardo.argal <at> openbravo.com>
date:      Tue Dec 21 12:27:50 2010 +0100
summary:   Polishing

details:   /erp/devel/pi/rev/86e9d9074b95
changeset: 9280:86e9d9074b95
user:      Eduardo Argal Guibert <eduardo.argal <at> openbravo.com>
date:      Tue Dec 21 12:30:09 2010 +0100
summary:   Adds new matching algorithm - prototype

diffstat:

 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/ad_actionbutton/AddOrderOrInvoice.java
  |    5 +-
 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/ad_actionbutton/MatchTransaction.java
   |   34 +-
 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/algorithm/InvoiceMatchingAlgorithm.java
 |  289 ++++++++++
 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/dao/AdvPaymentMngtDao.java
              |   16 +
 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_PaymentProcess.java
         |    2 -
 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_MatchingAlgorithm.java
      |    2 +-
 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_MatchingTransaction.java
    |    4 +-
 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java
                |   84 ++
 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/Value.java
                      |   51 +
 src-db/database/model/tables/FIN_BANKSTATEMENT.xml                             
                               |    4 +
 src-db/database/sourcedata/AD_COLUMN.xml                                       
                               |   35 +
 src-db/database/sourcedata/AD_TABLE.xml                                        
                               |    2 +
 src/org/openbravo/erpCommon/ad_forms/AcctServer.java                           
                               |    2 +
 src/org/openbravo/erpCommon/ad_forms/DocFINBankStatement.java                  
                               |  238 ++++++++
 src/org/openbravo/erpCommon/ad_forms/DocFINBankStatementTemplate.java          
                               |   53 +
 src/org/openbravo/erpCommon/ad_forms/DocFINFinAccTransaction.java              
                               |    7 +-
 src/org/openbravo/erpCommon/ad_forms/DocFINFinAccTransactionTemplate.java      
                               |    2 +-
 src/org/openbravo/erpCommon/ad_forms/DocFINPayment.java                        
                               |    5 +-
 src/org/openbravo/erpCommon/ad_forms/DocFINPaymentTemplate.java                
                               |    4 +-
 src/org/openbravo/erpCommon/ad_forms/DocFINReconciliation.java                 
                               |   11 +-
 src/org/openbravo/erpCommon/ad_forms/DocFINReconciliationTemplate.java         
                               |    2 +-
 21 files changed, 817 insertions(+), 35 deletions(-)

diffs (truncated from 1158 to 300 lines):

diff -r 1e94a9dbd396 -r 86e9d9074b95 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/ad_actionbutton/AddOrderOrInvoice.java
--- 
a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/ad_actionbutton/AddOrderOrInvoice.java
      Tue Dec 21 16:44:32 2010 +0530
+++ 
b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/ad_actionbutton/AddOrderOrInvoice.java
      Tue Dec 21 12:30:09 2010 +0100
@@ -326,8 +326,9 @@
 
       FieldProvider[] data = 
FieldProviderFactory.getFieldProviderArray(paymentDetails);
       for (int i = 0; i < data.length; i++) {
-        FieldProviderFactory.setField(data[i], "cglitemid", 
paymentDetailArray[i].getGLItem()
-            .getIdentifier());
+        FieldProviderFactory.setField(data[i], "cglitemid",
+            paymentDetailArray[i].getGLItem() != null ? 
paymentDetailArray[i].getGLItem()
+                .getIdentifier() : "");
         FieldProviderFactory.setField(data[i], "amount", 
paymentDetailArray[i].getAmount()
             .toString());
         FieldProviderFactory.setField(data[i], "finpaymentdetailid", 
paymentDetailArray[i].getId());
diff -r 1e94a9dbd396 -r 86e9d9074b95 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/ad_actionbutton/MatchTransaction.java
--- 
a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/ad_actionbutton/MatchTransaction.java
       Tue Dec 21 16:44:32 2010 +0530
+++ 
b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/ad_actionbutton/MatchTransaction.java
       Tue Dec 21 12:30:09 2010 +0100
@@ -174,7 +174,7 @@
                   transactionLine.getFinPayment().setStatus("RPPC");
                 }
                 if 
(item.getTransactionDate().compareTo(transactionLine.getTransactionDate()) < 0) 
{
-                  // We set processed to false before changing dates to avoid 
trigger exception
+                  // Set processed to false before changing dates to avoid 
trigger exception
                   boolean posted = "Y".equals(transactionLine.getPosted());
                   if (posted) {
                     transactionLine.setPosted("N");
@@ -188,7 +188,7 @@
                   transactionLine.setDateAcct(item.getTransactionDate());
                   OBDal.getInstance().save(transactionLine);
                   OBDal.getInstance().flush();
-                  // We set processed to true afterwards
+                  // Set processed to true afterwards
                   transactionLine.setProcessed(true);
                   OBDal.getInstance().save(transactionLine);
                   OBDal.getInstance().flush();
@@ -404,10 +404,13 @@
       OBDal.getInstance().save(bsline);
       OBDal.getInstance().flush();
 
-      if (finTrans.getFinPayment() != null) {
-        finTrans.getFinPayment()
-            .setStatus((finTrans.getFinPayment().isReceipt()) ? "RDNC" : 
"PWNC");
+      if (finTrans != null) {
+        if (finTrans.getFinPayment() != null) {
+          finTrans.getFinPayment().setStatus(
+              (finTrans.getFinPayment().isReceipt()) ? "RDNC" : "PWNC");
+        }
         finTrans.setStatus((finTrans.getFinPayment().isReceipt()) ? "RDNC" : 
"PWNC");
+        finTrans.setReconciliation(null);
         OBDal.getInstance().save(finTrans);
         OBDal.getInstance().flush();
       }
@@ -462,6 +465,15 @@
             matched = new FIN_MatchedTransaction(null, 
FIN_MatchedTransaction.NOMATCH);
           }
           transaction = matched.getTransaction();
+          // if (transaction != null) {
+          // FIN_BankStatementLine bsl = FIN_BankStatementLines[i];
+          // bsl.setFinancialAccountTransaction(transaction);
+          // bsl.setMatchingtype(matched.getMatchLevel());
+          // // FIXME payment CLEARING
+          // OBDal.getInstance().save(transaction);
+          // OBDal.getInstance().save(bsl);
+          // OBDal.getInstance().flush();
+          // }
           excluded.add(transaction);
           matchingType = matched.getMatchLevel();
 
@@ -479,17 +491,17 @@
         // CREDIT - DEBIT
         FieldProviderFactory.setField(data[i], "bankLineAmount", 
FIN_BankStatementLines[i]
             
.getCramount().subtract(FIN_BankStatementLines[i].getDramount()).toString());
-        FieldProviderFactory.setField(data[i], "matchStyle", matchingType
-            .equals(FIN_MatchedTransaction.STRONG) ? COLOR_STRONG : 
((matchingType
-            .equals(FIN_MatchedTransaction.WEAK)) ? COLOR_WEAK : COLOR_WHITE));
+        FieldProviderFactory.setField(data[i], "matchStyle", 
FIN_MatchedTransaction.STRONG
+            .equals(matchingType) ? COLOR_STRONG : 
((FIN_MatchedTransaction.WEAK
+            .equals(matchingType)) ? COLOR_WEAK : 
((FIN_MatchedTransaction.NOMATCH
+            .equals(matchingType)) ? COLOR_WHITE : matchingType)));
         FieldProviderFactory.setField(data[i], "matchingType", matchingType);
 
         if (transaction != null) {
           FieldProviderFactory.setField(data[i], "disabled", "N");
           // Auto Matching or already matched
-          FieldProviderFactory.setField(data[i], "checked",
-              (matchingType.equals(FIN_MatchedTransaction.STRONG) || 
transaction
-                  .getReconciliation() != null) ? "Y" : "N");
+          FieldProviderFactory.setField(data[i], "checked", 
(FIN_MatchedTransaction.STRONG
+              .equals(matchingType) || transaction.getReconciliation() != 
null) ? "Y" : "N");
           FieldProviderFactory.setField(data[i], "finTransactionId", 
transaction.getId());
           FieldProviderFactory.setField(data[i], "transactionDate", 
Utility.formatDate(transaction
               .getTransactionDate().compareTo(reconciliation.getEndingDate()) 
> 0 ? reconciliation
diff -r 1e94a9dbd396 -r 86e9d9074b95 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/algorithm/InvoiceMatchingAlgorithm.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ 
b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/algorithm/InvoiceMatchingAlgorithm.java
     Tue Dec 21 12:30:09 2010 +0100
@@ -0,0 +1,289 @@
+/*
+ *************************************************************************
+ * The contents of this file are subject to the Openbravo  Public  License
+ * Version  1.0  (the  "License"),  being   the  Mozilla   Public  License
+ * Version 1.1  with a permitted attribution clause; you may not  use this
+ * file except in compliance with the License. You  may  obtain  a copy of
+ * the License at http://www.openbravo.com/legal/license.html
+ * Software distributed under the License  is  distributed  on  an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific  language  governing  rights  and  limitations
+ * under the License.
+ * The Original Code is Openbravo ERP.
+ * The Initial Developer of the Original Code is Openbravo SLU
+ * All portions are Copyright (C) 2010 Openbravo SLU
+ * All Rights Reserved.
+ * Contributor(s):  ______________________________________.
+ *************************************************************************
+ */
+
+package org.openbravo.advpaymentmngt.algorithm;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.ServletException;
+
+import org.openbravo.advpaymentmngt.dao.AdvPaymentMngtDao;
+import org.openbravo.advpaymentmngt.dao.MatchTransactionDao;
+import org.openbravo.advpaymentmngt.dao.TransactionsDao;
+import org.openbravo.advpaymentmngt.process.FIN_AddPayment;
+import org.openbravo.advpaymentmngt.utility.FIN_MatchedTransaction;
+import org.openbravo.advpaymentmngt.utility.FIN_MatchingAlgorithm;
+import org.openbravo.advpaymentmngt.utility.FIN_Utility;
+import org.openbravo.base.secureApp.VariablesSecureApp;
+import org.openbravo.dal.core.OBContext;
+import org.openbravo.dal.service.OBDal;
+import org.openbravo.dal.service.OBQuery;
+import org.openbravo.database.ConnectionProvider;
+import org.openbravo.model.common.enterprise.DocumentType;
+import org.openbravo.model.common.invoice.Invoice;
+import org.openbravo.model.financialmgmt.payment.FIN_BankStatementLine;
+import org.openbravo.model.financialmgmt.payment.FIN_FinaccTransaction;
+import org.openbravo.model.financialmgmt.payment.FIN_Payment;
+import org.openbravo.model.financialmgmt.payment.FIN_PaymentSchedule;
+import org.openbravo.model.financialmgmt.payment.FIN_PaymentScheduleDetail;
+import org.openbravo.service.db.DalConnectionProvider;
+
+public class InvoiceMatchingAlgorithm implements FIN_MatchingAlgorithm {
+
+  public FIN_MatchedTransaction match(FIN_BankStatementLine line,
+      List<FIN_FinaccTransaction> excluded) throws ServletException {
+    List<FIN_FinaccTransaction> transactions = 
MatchTransactionDao.getMatchingFinancialTransaction(
+        line.getBankStatement().getAccount().getId(), line.getReferenceNo(), 
(line.getCramount()
+            .subtract(line.getDramount())), line.getBpartnername(), excluded);
+    if (!transactions.isEmpty())
+      return new FIN_MatchedTransaction(transactions.get(0), 
FIN_MatchedTransaction.STRONG);
+    transactions = 
MatchTransactionDao.getMatchingFinancialTransaction(line.getBankStatement()
+        .getAccount().getId(), 
line.getCramount().subtract(line.getDramount()), excluded);
+    if (!transactions.isEmpty())
+      return new FIN_MatchedTransaction(transactions.get(0), 
FIN_MatchedTransaction.WEAK);
+    // If there is no match against existing transactions then try with 
existing payments
+    FIN_FinaccTransaction transactionCreatedFromPayment = findPayment(line);
+    if (transactionCreatedFromPayment != null)
+      transactions.add(transactionCreatedFromPayment);
+    if (!transactions.isEmpty() && transactions.get(0) != null)
+      return new FIN_MatchedTransaction(transactions.get(0), 
FIN_MatchedTransaction.STRONG);
+    // If there is no match against existing transactions then try with 
existing invoices
+    FIN_FinaccTransaction transactionCreatedFromInvoice = findInvoice(line);
+    if (transactionCreatedFromInvoice != null)
+      transactions.add(transactionCreatedFromInvoice);
+    if (!transactions.isEmpty() && transactions.get(0) != null)
+      return new FIN_MatchedTransaction(transactions.get(0), 
FIN_MatchedTransaction.STRONG);
+
+    return new FIN_MatchedTransaction(null, FIN_MatchedTransaction.NOMATCH);
+  }
+
+  FIN_FinaccTransaction findInvoice(FIN_BankStatementLine line) {
+    final StringBuilder whereClause = new StringBuilder();
+    final List<Object> parameters = new ArrayList<Object>();
+    BigDecimal amount = line.getCramount().subtract(line.getDramount());
+    boolean isReceipt = amount.signum() > 0;
+    // FIXME: added to access the FIN_PaymentSchedule and 
FIN_PaymentScheduleDetail tables to be
+    // removed when new security implementation is done
+    OBContext.setAdminMode();
+    try {
+
+      whereClause.append(" as psd "); // pending scheduled payments //
+      whereClause.append(" left outer join psd.invoicePaymentSchedule ");
+      whereClause.append(" left outer join psd.invoicePaymentSchedule.invoice 
");
+      whereClause.append(" where psd.");
+      whereClause.append(FIN_PaymentScheduleDetail.PROPERTY_PAYMENTDETAILS);
+      whereClause.append(" is null");
+      whereClause.append(" and psd.");
+      whereClause.append(FIN_PaymentSchedule.PROPERTY_ORGANIZATION);
+      whereClause.append(".id in (");
+      
whereClause.append(parse(OBContext.getOBContext().getOrganizationStructureProvider()
+          .getNaturalTree(line.getOrganization().getId())));
+      whereClause.append(")");
+
+      // Transaction type filter
+      whereClause.append(" and psd.");
+      
whereClause.append(FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE);
+      whereClause.append(".");
+      whereClause.append(FIN_PaymentSchedule.PROPERTY_INVOICE);
+      whereClause.append(" is not null");
+      if (line.getBusinessPartner() != null) {
+        whereClause.append(" and psd.");
+        
whereClause.append(FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE);
+        whereClause.append(".");
+        whereClause.append(FIN_PaymentSchedule.PROPERTY_INVOICE);
+        whereClause.append(".");
+        whereClause.append(Invoice.PROPERTY_BUSINESSPARTNER);
+        whereClause.append(".id = '");
+        whereClause.append(line.getBusinessPartner().getId());
+        whereClause.append("'");
+      }
+      whereClause.append(" and psd.");
+      
whereClause.append(FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE);
+      whereClause.append(".");
+      whereClause.append(FIN_PaymentSchedule.PROPERTY_INVOICE);
+      whereClause.append(".");
+      whereClause.append(Invoice.PROPERTY_SALESTRANSACTION);
+      whereClause.append(" = ");
+      whereClause.append(isReceipt);
+      whereClause.append(" and psd.");
+      
whereClause.append(FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE);
+      whereClause.append(".");
+      whereClause.append(FIN_PaymentSchedule.PROPERTY_INVOICE);
+      whereClause.append(".");
+      whereClause.append(Invoice.PROPERTY_CURRENCY);
+      whereClause.append(".id = '");
+      
whereClause.append(line.getBankStatement().getAccount().getCurrency().getId());
+      whereClause.append("'");
+      // amount
+      whereClause.append(" and psd.");
+      
whereClause.append(FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE);
+      whereClause.append(".");
+      whereClause.append(FIN_PaymentSchedule.PROPERTY_OUTSTANDINGAMOUNT);
+      whereClause.append(" = ?");
+      parameters.add(amount.abs());
+      // dateTo
+      // TODO Review this date. i guess someone can pay a bill prior to due 
date
+      // whereClause.append(" and psd.");
+      // 
whereClause.append(FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE);
+      // whereClause.append(".");
+      // whereClause.append(FIN_PaymentSchedule.PROPERTY_DUEDATE);
+      // whereClause.append(" <= ?");
+      // parameters.add(line.getTransactionDate());
+      // TODO: Add order to show first scheduled payments from invoices and 
later scheduled payments
+      // from not invoiced orders.
+      whereClause.append(" order by");
+      whereClause.append(" psd.");
+      
whereClause.append(FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE);
+      whereClause.append(".");
+      whereClause.append(FIN_PaymentSchedule.PROPERTY_DUEDATE);
+      whereClause.append(", psd.");
+      
whereClause.append(FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE);
+      whereClause.append(".");
+      whereClause.append(FIN_PaymentSchedule.PROPERTY_INVOICE);
+      whereClause.append(".");
+      whereClause.append(Invoice.PROPERTY_DOCUMENTNO);
+      final OBQuery<FIN_PaymentScheduleDetail> obqPSD = 
OBDal.getInstance().createQuery(
+          FIN_PaymentScheduleDetail.class, whereClause.toString());
+
+      obqPSD.setParameters(parameters);
+      List<FIN_PaymentScheduleDetail> paymentScheduleDetails = obqPSD.list();
+      if (!paymentScheduleDetails.isEmpty()) {
+        AdvPaymentMngtDao dao = new AdvPaymentMngtDao();
+        DocumentType docType = 
FIN_Utility.getDocumentType(paymentScheduleDetails.get(0)
+            .getOrganization(), isReceipt ? "ARR" : "APP");
+        // get DocumentNo
+        HashMap<String, BigDecimal> hm = new HashMap<String, BigDecimal>();
+        hm.put(paymentScheduleDetails.get(0).getId(), 
paymentScheduleDetails.get(0).getAmount());
+        String strPaymentDocumentNo = FIN_Utility.getDocumentNo(docType,
+            docType.getTable() != null ? docType.getTable().getDBTableName() : 
"");
+        FIN_Payment payment = FIN_AddPayment.savePayment(null, isReceipt, 
docType,
+            strPaymentDocumentNo, 
paymentScheduleDetails.get(0).getInvoicePaymentSchedule()
+                .getInvoice().getBusinessPartner(), 
paymentScheduleDetails.get(0)
+                .getInvoicePaymentSchedule().getFinPaymentmethod(), 
line.getBankStatement()
+                .getAccount(), 
paymentScheduleDetails.get(0).getAmount().toString(), line
+                .getTransactionDate(), 
paymentScheduleDetails.get(0).getOrganization(), line
+                .getReferenceNo(), paymentScheduleDetails.subList(0, 1), hm, 
false, false);
+        try {
+          ConnectionProvider conn = new DalConnectionProvider();
+          FIN_AddPayment.processPayment(new 
VariablesSecureApp(OBContext.getOBContext().getUser()
+              .getId(), OBContext.getOBContext().getCurrentClient().getId(), 
OBContext
+              .getOBContext().getCurrentOrganization().getId(), 
OBContext.getOBContext().getRole()
+              .getId()), conn, "P", payment);
+        } catch (Exception e) {
+          return null;
+        }
+        FIN_FinaccTransaction transaction = 
dao.getFinancialTransaction(payment);
+        TransactionsDao.process(transaction);
+        return transaction;
+      }
+      return null;
+    } finally {
+      OBContext.restorePreviousMode();
+    }

------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to