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