Project:
View Issue Details[ Jump to Notes ] | [ Issue History ] [ Print ] | |||||||
ID | ||||||||
0031580 | ||||||||
Type | Category | Severity | Reproducibility | Date Submitted | Last Update | |||
defect | [Openbravo ERP] Z. Others | major | always | 2015-11-25 13:42 | 2016-03-17 10:55 | |||
Reporter | maite | View Status | public | |||||
Assigned To | vmromanos | |||||||
Priority | immediate | Resolution | fixed | Fixed in Version | ||||
Status | closed | Fix in branch | Fixed in SCM revision | 7dafd0844a3d | ||||
Projection | none | ETA | none | Target Version | ||||
OS | Any | Database | Any | Java version | ||||
OS Version | Database version | Ant version | ||||||
Product Version | SCM revision | |||||||
Review Assigned To | vmromanos | |||||||
Web browser | ||||||||
Modules | Core | |||||||
Regression level | ||||||||
Regression date | ||||||||
Regression introduced in release | ||||||||
Regression introduced by commit | ||||||||
Triggers an Emergency Pack | No | |||||||
Summary | 0031580: Java Heap Space error when posting payment with huge amount of details | |||||||
Description | Java Heap Space error when posting payment with huge amount of details | |||||||
Steps To Reproduce | In case of having Payment documents with huge number of lines (<= 101.698 lines), java heap space error is thrown when posting the document NOTE: I can provide environment where problem is reproducible | |||||||
Proposed Solution | Problem seems to be in "loadLinesFieldProvider" method because huge list of FIN_PaymentDetail objects is being loaded in following line: List<FIN_PaymentDetail> paymentDetails = FIN_Utility.getOrderedPaymentDetailList(payment); Proposed solution will be not to load this info as FIN_PaymentDetail objects but just handle it as ID (and after that instance objects when required) | |||||||
Tags | No tags attached. | |||||||
Attached Files | 31580.diff [^] (71,897 bytes) 2015-12-29 10:55 [Show Content] [Hide Content]# HG changeset patch # User Alvaro Ferraz <alvaro.ferraz@openbravo.com> # Date 1448984670 -3600 # Tue Dec 01 16:44:30 2015 +0100 # Node ID 7b32e9806ed968e8b545b7eb4032824773e7c93f # Parent 3d941e94a739d3ea6e3049fa0f06553040dfef95 Fixes issue 31580: Java Heap Space error when posting payment with many details Add a new FIN_Utility.getOrderedPaymentDetailList method and deprecate the old one, to return a List<String> instead of a List<FIN_PaymentDetail> and avoid loading all the entities in memory. Adapt loadLines methods in DocFINFinAccTransaction, DocFINPayment and DocFINReconciliation to the new FIN_Utility.getOrderedPaymentDetailList method. Create a new getPaymentDetailWriteOffAndAmount method in AcctServer to adapt it to new parameters. diff --git a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java --- a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java +++ b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java @@ -1310,8 +1310,11 @@ } /** - * Returns Payment Details from a Payment ordered by Invoice and Order + * Returns Payment Details from a Payment ordered by Invoice and Order. This method is deprecated + * as it does not perform well. Use {@link #getOrderedPaymentDetailList(String paymentId)} instead + * */ + @Deprecated public static List<FIN_PaymentDetail> getOrderedPaymentDetailList(FIN_Payment payment) { List<FIN_PaymentDetail> pdList = null; @@ -1343,6 +1346,39 @@ } /** + * Returns Payment Details from a Payment ordered by Invoice and Order + */ + @SuppressWarnings("unchecked") + public static List<String> getOrderedPaymentDetailList(String paymentId) { + + List<String> pdList = null; + + OBContext.setAdminMode(); + try { + final StringBuilder whereClause = new StringBuilder(); + whereClause.append(" select pd." + FIN_PaymentDetail.PROPERTY_ID); + whereClause.append(" from " + FIN_PaymentDetail.ENTITY_NAME + " as pd"); + whereClause.append(" left join pd." + FIN_PaymentDetail.PROPERTY_FINPAYMENTSCHEDULEDETAILLIST + + " as psd"); + whereClause.append(" where pd." + FIN_PaymentDetail.PROPERTY_FINPAYMENT + ".id = '" + + paymentId + "'"); + whereClause.append(" and pd." + FIN_PaymentDetail.PROPERTY_ACTIVE + " = true"); + whereClause.append(" order by psd." + + FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE); + whereClause.append(", coalesce(psd." + + FIN_PaymentScheduleDetail.PROPERTY_ORDERPAYMENTSCHEDULE + ",'0')"); + + Query query = OBDal.getInstance().getSession().createQuery(whereClause.toString()); + pdList = query.list(); + + } finally { + OBContext.restorePreviousMode(); + } + + return pdList; + } + + /** * Returns true if the payment is a reverse payment not a reversed one. */ public static boolean isReversePayment(FIN_Payment payment) { diff --git a/src/org/openbravo/erpCommon/ad_forms/AcctServer.java b/src/org/openbravo/erpCommon/ad_forms/AcctServer.java --- a/src/org/openbravo/erpCommon/ad_forms/AcctServer.java +++ b/src/org/openbravo/erpCommon/ad_forms/AcctServer.java @@ -2954,24 +2954,74 @@ public HashMap<String, BigDecimal> getPaymentDetailWriteOffAndAmount( List<FIN_PaymentDetail> paymentDetails, FIN_PaymentSchedule ps, FIN_PaymentSchedule psi, FIN_PaymentSchedule pso, int currentPaymentDetailIndex, final FieldProvider fieldProvider) { + FIN_PaymentDetail paymentDetail = OBDal.getInstance().get(FIN_PaymentDetail.class, + paymentDetails.get(currentPaymentDetailIndex)); + String paymentDetailNextId = null; + String paymentDetailPreviousId = null; + if (currentPaymentDetailIndex < paymentDetails.size() - 1) { + paymentDetailNextId = paymentDetails.get(currentPaymentDetailIndex + 1).getId(); + } + if (currentPaymentDetailIndex > 0) { + paymentDetailPreviousId = paymentDetails.get(currentPaymentDetailIndex - 1).getId(); + } + return getPaymentDetailWriteOffAndAmount(paymentDetail, paymentDetailNextId, + paymentDetailPreviousId, ps, psi, pso, fieldProvider); + } + + /** + * Returns the writeoff and the amount of a Payment Detail. In case the related Payment Schedule + * Detail was generated for compensate the difference between an Order and a related Invoice, it + * merges it's amount with the next Payment Schedule Detail. Issue 19567: + * https://issues.openbravo.com/view.php?id=19567 <br /> + * It does exactly the same as the + * {@link #getPaymentDetailWriteOffAndAmount(List, FIN_PaymentSchedule, FIN_PaymentSchedule, FIN_PaymentSchedule, int)} + * method, but it also stores a new field "MergedPaymentDetailId" inside the fieldProvider with + * the merged payment detail id (if any). + * + * @param paymentDetail + * Payment Detail + * @param paymentDetailNextId + * Next Payment Detail id + * @param paymentDetailPreviousId + * Previous Payment Detail id + * @param ps + * Previous Payment Schedule + * @param psi + * Invoice Payment Schedule of actual Payment Detail + * @param pso + * Order Payment Schedule of actual Payment Detail + * @param fieldProvider + * contains the FieldProvider with the Payment Detail currently being processed. Used to + * store the "MergedPaymentDetailId" (if any) as a new field of the fieldProvider + */ + public HashMap<String, BigDecimal> getPaymentDetailWriteOffAndAmount( + FIN_PaymentDetail paymentDetail, String paymentDetailNextId, String paymentDetailPreviousId, + FIN_PaymentSchedule ps, FIN_PaymentSchedule psi, FIN_PaymentSchedule pso, + final FieldProvider fieldProvider) { HashMap<String, BigDecimal> amountAndWriteOff = new HashMap<String, BigDecimal>(); // Default return values - amountAndWriteOff.put("amount", paymentDetails.get(currentPaymentDetailIndex).getAmount()); - amountAndWriteOff.put("writeoff", paymentDetails.get(currentPaymentDetailIndex) - .getWriteoffAmount()); + amountAndWriteOff.put("amount", paymentDetail.getAmount()); + amountAndWriteOff.put("writeoff", paymentDetail.getWriteoffAmount()); // If the Payment Detail has either an Invoice or an Order associated to it if (psi != null || pso != null) { // If the Payment Detail has no Order associated to it, or it has an Invoice associated and is // the same one as the previous Payment Detail if ((psi != null && psi.equals(ps)) || pso == null) { - FIN_PaymentScheduleDetail psdNext = (currentPaymentDetailIndex == paymentDetails.size() - 1) ? null - : paymentDetails.get(currentPaymentDetailIndex + 1).getFINPaymentScheduleDetailList() - .get(0); - FIN_PaymentScheduleDetail psdPrevious = (currentPaymentDetailIndex == 0) ? null - : paymentDetails.get(currentPaymentDetailIndex - 1).getFINPaymentScheduleDetailList() - .get(0); + FIN_PaymentDetail paymentDetailNext = null; + FIN_PaymentDetail paymentDetailPrevious = null; + FIN_PaymentScheduleDetail psdNext = null; + FIN_PaymentScheduleDetail psdPrevious = null; + if (paymentDetailNextId != null) { + paymentDetailNext = OBDal.getInstance().get(FIN_PaymentDetail.class, paymentDetailNextId); + psdNext = paymentDetailNext.getFINPaymentScheduleDetailList().get(0); + } + if (paymentDetailPreviousId != null) { + paymentDetailPrevious = OBDal.getInstance().get(FIN_PaymentDetail.class, + paymentDetailPreviousId); + psdPrevious = paymentDetailPrevious.getFINPaymentScheduleDetailList().get(0); + } // If the Payment Detail has no Order associated, and the next Payment Detail belongs to the // same Invoice and it has an Order related, then return null if (pso == null && psdNext != null && psdNext.getInvoicePaymentSchedule() == psi @@ -2982,15 +3032,13 @@ // related to it, return the sum of amounts. } else if (psdPrevious != null && psdPrevious.getInvoicePaymentSchedule() == psi && psdPrevious.getOrderPaymentSchedule() == null) { - amountAndWriteOff.put("amount", paymentDetails.get(currentPaymentDetailIndex).getAmount() - .add(paymentDetails.get(currentPaymentDetailIndex - 1).getAmount())); - amountAndWriteOff.put( - "writeoff", - paymentDetails.get(currentPaymentDetailIndex).getWriteoffAmount() - .add(paymentDetails.get(currentPaymentDetailIndex - 1).getWriteoffAmount())); + amountAndWriteOff.put("amount", + paymentDetail.getAmount().add(paymentDetailPrevious.getAmount())); + amountAndWriteOff.put("writeoff", + paymentDetail.getWriteoffAmount().add(paymentDetailPrevious.getWriteoffAmount())); if (fieldProvider != null) { - FieldProviderFactory.setField(fieldProvider, "MergedPaymentDetailId", paymentDetails - .get(currentPaymentDetailIndex - 1).getId()); + FieldProviderFactory.setField(fieldProvider, "MergedPaymentDetailId", + paymentDetailPreviousId); } } } diff --git a/src/org/openbravo/erpCommon/ad_forms/DocFINFinAccTransaction.java b/src/org/openbravo/erpCommon/ad_forms/DocFINFinAccTransaction.java --- a/src/org/openbravo/erpCommon/ad_forms/DocFINFinAccTransaction.java +++ b/src/org/openbravo/erpCommon/ad_forms/DocFINFinAccTransaction.java @@ -114,38 +114,48 @@ public FieldProviderFactory[] loadLinesPaymentDetailsFieldProvider( FIN_FinaccTransaction transaction) { FIN_Payment payment = transaction.getFinPayment(); - List<FIN_PaymentDetail> paymentDetails = FIN_Utility.getOrderedPaymentDetailList(payment); + List<String> paymentDetails = FIN_Utility.getOrderedPaymentDetailList(payment.getId()); FieldProviderFactory[] data = new FieldProviderFactory[paymentDetails.size()]; FIN_PaymentSchedule ps = null; FIN_PaymentDetail pd = null; OBContext.setAdminMode(); try { for (int i = 0; i < data.length; i++) { + FIN_PaymentDetail paymentDetail = OBDal.getInstance().get(FIN_PaymentDetail.class, + paymentDetails.get(i)); /* * if (!getPaymentConfirmation(payment)) continue; */ // Details refunded used credit are excluded as the entry will be created using the credit // used - if (paymentDetails.get(i).isRefund() && paymentDetails.get(i).isPrepayment()) { + if (paymentDetail.isRefund() && paymentDetail.isPrepayment()) { continue; } // If the Payment Detail has already been processed, skip it - if (paymentDetails.get(i).equals(pd)) { + if (paymentDetail.equals(pd)) { continue; } - pd = paymentDetails.get(i); + pd = paymentDetail; data[i] = new FieldProviderFactory(null); - FIN_PaymentSchedule psi = paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) + FIN_PaymentSchedule psi = paymentDetail.getFINPaymentScheduleDetailList().get(0) .getInvoicePaymentSchedule(); - FIN_PaymentSchedule pso = paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) + FIN_PaymentSchedule pso = paymentDetail.getFINPaymentScheduleDetailList().get(0) .getOrderPaymentSchedule(); // Related to Issue Issue 19567. Some Payment Detail's amount and writeoff amount are merged // into one. // https://issues.openbravo.com/view.php?id=19567 + String paymentDetailNextId = null; + String paymentDetailPreviousId = null; + if (i < paymentDetails.size() - 1) { + paymentDetailNextId = paymentDetails.get(i + 1); + } + if (i > 0) { + paymentDetailPreviousId = paymentDetails.get(i - 1); + } HashMap<String, BigDecimal> amountAndWriteOff = getPaymentDetailWriteOffAndAmount( - paymentDetails, ps, psi, pso, i, data[i]); + paymentDetail, paymentDetailNextId, paymentDetailPreviousId, ps, psi, pso, data[i]); BigDecimal amount = amountAndWriteOff.get("amount"); BigDecimal writeOff = amountAndWriteOff.get("writeoff"); if (amount == null) { @@ -158,150 +168,131 @@ ps = psi; FieldProviderFactory.setField(data[i], "FIN_Finacc_Transaction_ID", transaction.getId()); - FieldProviderFactory.setField(data[i], "AD_Client_ID", paymentDetails.get(i).getClient() - .getId()); - FieldProviderFactory.setField(data[i], "AD_Org_ID", paymentDetails.get(i).getOrganization() - .getId()); - FieldProviderFactory.setField(data[i], "FIN_Payment_Detail_ID", paymentDetails.get(i) - .getId()); + FieldProviderFactory.setField(data[i], "AD_Client_ID", paymentDetail.getClient().getId()); + FieldProviderFactory + .setField(data[i], "AD_Org_ID", paymentDetail.getOrganization().getId()); + FieldProviderFactory.setField(data[i], "FIN_Payment_Detail_ID", paymentDetail.getId()); FieldProviderFactory.setField(data[i], "FIN_Payment_ID", payment.getId()); FieldProviderFactory.setField(data[i], "DepositAmount", transaction.getDepositAmount() .toString()); FieldProviderFactory.setField(data[i], "PaymentAmount", transaction.getPaymentAmount() .toString()); - FieldProviderFactory.setField(data[i], "DoubtFulDebtAmount", paymentDetails.get(i) + FieldProviderFactory.setField(data[i], "DoubtFulDebtAmount", paymentDetail .getFINPaymentScheduleDetailList().get(0).getDoubtfulDebtAmount().toString()); - FieldProviderFactory.setField(data[i], "isprepayment", - paymentDetails.get(i).isPrepayment() ? "Y" : "N"); + FieldProviderFactory.setField(data[i], "isprepayment", paymentDetail.isPrepayment() ? "Y" + : "N"); // Check if payment against invoice is in a previous date than invoice accounting date - boolean isPaymentDatePriorToInvoiceDate = isPaymentDatePriorToInvoiceDate(paymentDetails - .get(i)); + boolean isPaymentDatePriorToInvoiceDate = isPaymentDatePriorToInvoiceDate(paymentDetail); FieldProviderFactory.setField(data[i], "isPaymentDatePriorToInvoiceDate", - isPaymentDatePriorToInvoiceDate && !paymentDetails.get(i).isPrepayment() ? "Y" : "N"); + isPaymentDatePriorToInvoiceDate && !paymentDetail.isPrepayment() ? "Y" : "N"); FieldProviderFactory.setField(data[i], "WriteOffAmt", writeOff.toString()); FieldProviderFactory.setField(data[i], "cGlItemId", - paymentDetails.get(i).getGLItem() != null ? paymentDetails.get(i).getGLItem().getId() - : ""); + paymentDetail.getGLItem() != null ? paymentDetail.getGLItem().getId() : ""); // Calculate Business Partner from payment header or from details if header is null BusinessPartner bPartner = payment.getBusinessPartner() != null ? payment - .getBusinessPartner() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() - .getBusinessPartner() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getBusinessPartner() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getBusinessPartner()))); + .getBusinessPartner() + : (paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getBusinessPartner() + : (paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() + .getBusinessPartner() + : (paymentDetail.getFINPaymentScheduleDetailList().get(0).getBusinessPartner()))); FieldProviderFactory.setField(data[i], "cBpartnerId", bPartner != null ? bPartner.getId() : ""); - FieldProviderFactory.setField(data[i], "Refund", paymentDetails.get(i).isRefund() ? "Y" - : "N"); - FieldProviderFactory.setField(data[i], "adOrgId", paymentDetails.get(i).getOrganization() - .getId()); + FieldProviderFactory.setField(data[i], "Refund", paymentDetail.isRefund() ? "Y" : "N"); + FieldProviderFactory.setField(data[i], "adOrgId", paymentDetail.getOrganization().getId()); FieldProviderFactory.setField(data[i], "description", transaction.getDescription()); FieldProviderFactory.setField(data[i], "cCurrencyId", transaction.getCurrency().getId()); - FieldProviderFactory.setField(data[i], "cProjectId", paymentDetails.get(i) + FieldProviderFactory.setField(data[i], "cProjectId", paymentDetail .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getProject() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getProject().getId() : (paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getProject() != null ? paymentDetails.get(i) + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getProject() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getProject().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getProject() != null ? paymentDetail.getFINPaymentScheduleDetailList() + .get(0).getOrderPaymentSchedule().getOrder().getProject().getId() : (paymentDetail + .getFINPaymentScheduleDetailList().get(0).getProject() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getProject().getId() : ""))); + FieldProviderFactory.setField(data[i], "cCampaignId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getSalesCampaign() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getSalesCampaign().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getSalesCampaign() != null ? paymentDetail .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getProject().getId() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getProject() != null ? paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getProject().getId() : ""))); - FieldProviderFactory - .setField( - data[i], - "cCampaignId", - paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getSalesCampaign() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getSalesCampaign().getId() - : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getSalesCampaign() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() - .getOrder().getSalesCampaign().getId() - : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getSalesCampaign() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getSalesCampaign().getId() - : ""))); - FieldProviderFactory.setField(data[i], "cActivityId", paymentDetails.get(i) + .getSalesCampaign().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getSalesCampaign() != null ? paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getSalesCampaign().getId() : ""))); + FieldProviderFactory.setField(data[i], "cActivityId", paymentDetail .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getActivity() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getActivity().getId() : (paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getActivity() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getActivity().getId() : (paymentDetails.get(i).getFINPaymentScheduleDetailList() - .get(0).getActivity() != null ? paymentDetails.get(i).getFINPaymentScheduleDetailList() - .get(0).getActivity().getId() : ""))); - FieldProviderFactory.setField(data[i], "mProductId", paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getProduct() != null ? paymentDetails.get(i) + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getActivity() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getActivity().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getActivity() != null ? paymentDetail.getFINPaymentScheduleDetailList() + .get(0).getOrderPaymentSchedule().getOrder().getActivity().getId() : (paymentDetail + .getFINPaymentScheduleDetailList().get(0).getActivity() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getActivity().getId() : ""))); + FieldProviderFactory.setField(data[i], "mProductId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getProduct() != null ? paymentDetail .getFINPaymentScheduleDetailList().get(0).getProduct().getId() : ""); - FieldProviderFactory.setField(data[i], "cSalesregionId", paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getSalesRegion() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getSalesRegion().getId() : ""); + FieldProviderFactory.setField(data[i], "cSalesregionId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getSalesRegion() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getSalesRegion().getId() : ""); FieldProviderFactory.setField(data[i], "lineno", transaction.getLineNo().toString()); - FieldProviderFactory.setField(data[i], "user1Id", paymentDetails.get(i) + FieldProviderFactory.setField(data[i], "user1Id", paymentDetail .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getStDimension() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getStDimension().getId() : (paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getStDimension() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getStDimension().getId() : (paymentDetails.get(i).getFINPaymentScheduleDetailList() - .get(0).getStDimension() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getStDimension().getId() : ""))); - FieldProviderFactory.setField(data[i], "user2Id", paymentDetails.get(i) + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getStDimension() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getStDimension().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getStDimension() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() + .getStDimension().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getStDimension() != null ? paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getStDimension().getId() : ""))); + FieldProviderFactory.setField(data[i], "user2Id", paymentDetail .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getNdDimension() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getNdDimension().getId() : (paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getNdDimension() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getNdDimension().getId() : (paymentDetails.get(i).getFINPaymentScheduleDetailList() - .get(0).getNdDimension() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getNdDimension().getId() : ""))); - FieldProviderFactory - .setField( - data[i], - "cCostcenterId", - paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getCostcenter() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getCostcenter().getId() - : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getCostcenter() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() - .getOrder().getCostcenter().getId() - : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getCostCenter() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getCostCenter().getId() : ""))); - FieldProviderFactory.setField(data[i], "recordId2", - paymentDetails.get(i).isPrepayment() ? (pso != null ? pso.getId() : "") - : (psi != null ? psi.getId() : "")); + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getNdDimension() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getNdDimension().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getNdDimension() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() + .getNdDimension().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getNdDimension() != null ? paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getNdDimension().getId() : ""))); + FieldProviderFactory.setField(data[i], "cCostcenterId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getCostcenter() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getCostcenter().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getCostcenter() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() + .getCostcenter().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getCostCenter() != null ? paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getCostCenter().getId() : ""))); + FieldProviderFactory.setField( + data[i], + "recordId2", + paymentDetail.isPrepayment() ? (pso != null ? pso.getId() : "") : (psi != null ? psi + .getId() : "")); } } finally { diff --git a/src/org/openbravo/erpCommon/ad_forms/DocFINPayment.java b/src/org/openbravo/erpCommon/ad_forms/DocFINPayment.java --- a/src/org/openbravo/erpCommon/ad_forms/DocFINPayment.java +++ b/src/org/openbravo/erpCommon/ad_forms/DocFINPayment.java @@ -86,7 +86,7 @@ public FieldProviderFactory[] loadLinesFieldProvider(String Id) { FIN_Payment payment = OBDal.getInstance().get(FIN_Payment.class, Id); - List<FIN_PaymentDetail> paymentDetails = FIN_Utility.getOrderedPaymentDetailList(payment); + List<String> paymentDetails = FIN_Utility.getOrderedPaymentDetailList(Id); if (paymentDetails == null) return null; @@ -96,28 +96,39 @@ OBContext.setAdminMode(); try { for (int i = 0; i < data.length; i++) { + FIN_PaymentDetail paymentDetail = OBDal.getInstance().get(FIN_PaymentDetail.class, + paymentDetails.get(i)); + // Details refunded used credit are excluded as the entry will be created using the credit // used - if (paymentDetails.get(i).isRefund() && paymentDetails.get(i).isPrepayment()) { + if (paymentDetail.isRefund() && paymentDetail.isPrepayment()) { continue; } // If the Payment Detail has already been processed, skip it - if (paymentDetails.get(i).equals(pd)) { + if (paymentDetail.equals(pd)) { continue; } - pd = paymentDetails.get(i); + pd = paymentDetail; data[i] = new FieldProviderFactory(null); - FIN_PaymentSchedule psi = paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) + FIN_PaymentSchedule psi = paymentDetail.getFINPaymentScheduleDetailList().get(0) .getInvoicePaymentSchedule(); - FIN_PaymentSchedule pso = paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) + FIN_PaymentSchedule pso = paymentDetail.getFINPaymentScheduleDetailList().get(0) .getOrderPaymentSchedule(); // Related to Issue Issue 19567. Some Payment Detail's amount and writeoff amount are merged // into one. // https://issues.openbravo.com/view.php?id=19567 + String paymentDetailNextId = null; + String paymentDetailPreviousId = null; + if (i < paymentDetails.size() - 1) { + paymentDetailNextId = paymentDetails.get(i + 1); + } + if (i > 0) { + paymentDetailPreviousId = paymentDetails.get(i - 1); + } HashMap<String, BigDecimal> amountAndWriteOff = getPaymentDetailWriteOffAndAmount( - paymentDetails, ps, psi, pso, i, data[i]); + paymentDetail, paymentDetailNextId, paymentDetailPreviousId, ps, psi, pso, data[i]); BigDecimal amount = amountAndWriteOff.get("amount"); BigDecimal writeOff = amountAndWriteOff.get("writeoff"); if (amount == null) { @@ -129,142 +140,123 @@ } ps = psi; - FieldProviderFactory.setField(data[i], "AD_Client_ID", paymentDetails.get(i).getClient() - .getId()); - FieldProviderFactory.setField(data[i], "AD_Org_ID", paymentDetails.get(i).getOrganization() - .getId()); - FieldProviderFactory.setField(data[i], "FIN_Payment_Detail_ID", paymentDetails.get(i) - .getId()); + FieldProviderFactory.setField(data[i], "AD_Client_ID", paymentDetail.getClient().getId()); + FieldProviderFactory + .setField(data[i], "AD_Org_ID", paymentDetail.getOrganization().getId()); + FieldProviderFactory.setField(data[i], "FIN_Payment_Detail_ID", paymentDetail.getId()); // Calculate Business Partner from payment header or from details if header is null or from // the PSD in case of GL Item BusinessPartner bPartner = payment.getBusinessPartner() != null ? payment - .getBusinessPartner() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() - .getBusinessPartner() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getBusinessPartner() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getBusinessPartner()))); + .getBusinessPartner() + : (paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getBusinessPartner() + : (paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() + .getBusinessPartner() + : (paymentDetail.getFINPaymentScheduleDetailList().get(0).getBusinessPartner()))); FieldProviderFactory.setField(data[i], "cBpartnerId", bPartner != null ? bPartner.getId() : ""); - FieldProviderFactory.setField(data[i], "DoubtFulDebtAmount", paymentDetails.get(i) + FieldProviderFactory.setField(data[i], "DoubtFulDebtAmount", paymentDetail .getFINPaymentScheduleDetailList().get(0).getDoubtfulDebtAmount().toString()); FieldProviderFactory.setField(data[i], "WriteOffAmt", writeOff.toString()); FieldProviderFactory.setField(data[i], "C_GLItem_ID", - paymentDetails.get(i).getGLItem() != null ? paymentDetails.get(i).getGLItem().getId() - : ""); - FieldProviderFactory.setField(data[i], "Refund", paymentDetails.get(i).isRefund() ? "Y" - : "N"); + paymentDetail.getGLItem() != null ? paymentDetail.getGLItem().getId() : ""); + FieldProviderFactory.setField(data[i], "Refund", paymentDetail.isRefund() ? "Y" : "N"); // Check if payment against invoice is in a previous date than invoice accounting date - boolean isPaymentDatePriorToInvoiceDate = isPaymentDatePriorToInvoiceDate(paymentDetails - .get(i)); - FieldProviderFactory.setField(data[i], "isprepayment", - paymentDetails.get(i).isPrepayment() ? "Y" : (isPaymentDatePriorToInvoiceDate ? "Y" - : "N")); + boolean isPaymentDatePriorToInvoiceDate = isPaymentDatePriorToInvoiceDate(paymentDetail); + FieldProviderFactory.setField(data[i], "isprepayment", paymentDetail.isPrepayment() ? "Y" + : (isPaymentDatePriorToInvoiceDate ? "Y" : "N")); FieldProviderFactory.setField(data[i], "isPaymentDatePriorToInvoiceDate", - isPaymentDatePriorToInvoiceDate && !paymentDetails.get(i).isPrepayment() ? "Y" : "N"); - FieldProviderFactory.setField(data[i], "cProjectId", paymentDetails.get(i) + isPaymentDatePriorToInvoiceDate && !paymentDetail.isPrepayment() ? "Y" : "N"); + FieldProviderFactory.setField(data[i], "cProjectId", paymentDetail .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getProject() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getProject().getId() : (paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getProject() != null ? paymentDetails.get(i) + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getProject() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getProject().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getProject() != null ? paymentDetail.getFINPaymentScheduleDetailList() + .get(0).getOrderPaymentSchedule().getOrder().getProject().getId() : (paymentDetail + .getFINPaymentScheduleDetailList().get(0).getProject() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getProject().getId() : ""))); + FieldProviderFactory.setField(data[i], "cCampaignId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getSalesCampaign() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getSalesCampaign().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getSalesCampaign() != null ? paymentDetail .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getProject().getId() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getProject() != null ? paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getProject().getId() : ""))); - FieldProviderFactory - .setField( - data[i], - "cCampaignId", - paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getSalesCampaign() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getSalesCampaign().getId() - : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getSalesCampaign() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() - .getOrder().getSalesCampaign().getId() - : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getSalesCampaign() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getSalesCampaign().getId() - : ""))); - FieldProviderFactory.setField(data[i], "cActivityId", paymentDetails.get(i) + .getSalesCampaign().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getSalesCampaign() != null ? paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getSalesCampaign().getId() : ""))); + FieldProviderFactory.setField(data[i], "cActivityId", paymentDetail .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getActivity() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getActivity().getId() : (paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getActivity() != null ? paymentDetails.get(i) + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getActivity() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getActivity().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getActivity() != null ? paymentDetail.getFINPaymentScheduleDetailList() + .get(0).getOrderPaymentSchedule().getOrder().getActivity().getId() : (paymentDetail + .getFINPaymentScheduleDetailList().get(0).getActivity() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getActivity().getId() : ""))); + FieldProviderFactory.setField(data[i], "mProductId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getProduct() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getProduct().getId() : ""); + FieldProviderFactory.setField(data[i], "cSalesregionId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getSalesRegion() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getSalesRegion().getId() : ""); + FieldProviderFactory.setField(data[i], "cCostcenterId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getCostcenter() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getCostcenter().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getCostcenter() != null ? paymentDetail .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getActivity().getId() : (paymentDetails.get(i).getFINPaymentScheduleDetailList() - .get(0).getActivity() != null ? paymentDetails.get(i).getFINPaymentScheduleDetailList() - .get(0).getActivity().getId() : ""))); - FieldProviderFactory.setField(data[i], "mProductId", paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getProduct() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getProduct().getId() : ""); - FieldProviderFactory.setField(data[i], "cSalesregionId", paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getSalesRegion() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getSalesRegion().getId() : ""); - FieldProviderFactory - .setField( - data[i], - "cCostcenterId", - paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getCostcenter() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getCostcenter().getId() - : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getCostcenter() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() - .getOrder().getCostcenter().getId() - : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getCostCenter() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getCostCenter().getId() : ""))); + .getCostcenter().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getCostCenter() != null ? paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getCostCenter().getId() : ""))); - FieldProviderFactory.setField(data[i], "user1Id", paymentDetails.get(i) + FieldProviderFactory.setField(data[i], "user1Id", paymentDetail .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getStDimension() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getStDimension().getId() : (paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getStDimension() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getStDimension().getId() : (paymentDetails.get(i).getFINPaymentScheduleDetailList() - .get(0).getStDimension() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getStDimension().getId() : ""))); - FieldProviderFactory.setField(data[i], "user2Id", paymentDetails.get(i) + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getStDimension() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getStDimension().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getStDimension() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() + .getStDimension().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getStDimension() != null ? paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getStDimension().getId() : ""))); + FieldProviderFactory.setField(data[i], "user2Id", paymentDetail .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getNdDimension() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getNdDimension().getId() : (paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getNdDimension() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getNdDimension().getId() : (paymentDetails.get(i).getFINPaymentScheduleDetailList() - .get(0).getNdDimension() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getNdDimension().getId() : ""))); - FieldProviderFactory.setField(data[i], "recordId2", - paymentDetails.get(i).isPrepayment() ? (pso != null ? pso.getId() : "") - : (psi != null ? psi.getId() : "")); + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getNdDimension() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getNdDimension().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getNdDimension() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() + .getNdDimension().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getNdDimension() != null ? paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getNdDimension().getId() : ""))); + FieldProviderFactory.setField( + data[i], + "recordId2", + paymentDetail.isPrepayment() ? (pso != null ? pso.getId() : "") : (psi != null ? psi + .getId() : "")); } } finally { diff --git a/src/org/openbravo/erpCommon/ad_forms/DocFINReconciliation.java b/src/org/openbravo/erpCommon/ad_forms/DocFINReconciliation.java --- a/src/org/openbravo/erpCommon/ad_forms/DocFINReconciliation.java +++ b/src/org/openbravo/erpCommon/ad_forms/DocFINReconciliation.java @@ -163,35 +163,46 @@ FIN_FinaccTransaction transaction) { FIN_Payment payment = OBDal.getInstance().get(FIN_Payment.class, transaction.getFinPayment().getId()); - List<FIN_PaymentDetail> paymentDetails = FIN_Utility.getOrderedPaymentDetailList(payment); + List<String> paymentDetails = FIN_Utility.getOrderedPaymentDetailList(payment.getId()); FieldProviderFactory[] data = new FieldProviderFactory[paymentDetails.size()]; FIN_PaymentSchedule ps = null; FIN_PaymentDetail pd = null; OBContext.setAdminMode(); try { for (int i = 0; i < data.length; i++) { + FIN_PaymentDetail paymentDetail = OBDal.getInstance().get(FIN_PaymentDetail.class, + paymentDetails.get(i)); + // Details refunded used credit are excluded as the entry will be created using the credit // used - if (paymentDetails.get(i).isRefund() && paymentDetails.get(i).isPrepayment()) { + if (paymentDetail.isRefund() && paymentDetail.isPrepayment()) { continue; } // If the Payment Detail has already been processed, skip it - if (paymentDetails.get(i).equals(pd)) { + if (paymentDetail.equals(pd)) { continue; } - pd = paymentDetails.get(i); + pd = paymentDetail; data[i] = new FieldProviderFactory(null); - FIN_PaymentSchedule psi = paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) + FIN_PaymentSchedule psi = paymentDetail.getFINPaymentScheduleDetailList().get(0) .getInvoicePaymentSchedule(); - FIN_PaymentSchedule pso = paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) + FIN_PaymentSchedule pso = paymentDetail.getFINPaymentScheduleDetailList().get(0) .getOrderPaymentSchedule(); // Related to Issue Issue 19567. Some Payment Detail's amount and writeoff amount are merged // into one. // https://issues.openbravo.com/view.php?id=19567 + String paymentDetailNextId = null; + String paymentDetailPreviousId = null; + if (i < paymentDetails.size() - 1) { + paymentDetailNextId = paymentDetails.get(i + 1); + } + if (i > 0) { + paymentDetailPreviousId = paymentDetails.get(i - 1); + } HashMap<String, BigDecimal> amountAndWriteOff = getPaymentDetailWriteOffAndAmount( - paymentDetails, ps, psi, pso, i, data[i]); + paymentDetail, paymentDetailNextId, paymentDetailPreviousId, ps, psi, pso, data[i]); BigDecimal amount = amountAndWriteOff.get("amount"); BigDecimal writeOff = amountAndWriteOff.get("writeoff"); if (amount == null) { @@ -206,12 +217,10 @@ FieldProviderFactory.setField(data[i], "FIN_Reconciliation_ID", transaction .getReconciliation().getId()); FieldProviderFactory.setField(data[i], "FIN_Finacc_Transaction_ID", transaction.getId()); - FieldProviderFactory.setField(data[i], "AD_Client_ID", paymentDetails.get(i).getClient() - .getId()); - FieldProviderFactory.setField(data[i], "AD_Org_ID", paymentDetails.get(i).getOrganization() - .getId()); - FieldProviderFactory.setField(data[i], "FIN_Payment_Detail_ID", paymentDetails.get(i) - .getId()); + FieldProviderFactory.setField(data[i], "AD_Client_ID", paymentDetail.getClient().getId()); + FieldProviderFactory + .setField(data[i], "AD_Org_ID", paymentDetail.getOrganization().getId()); + FieldProviderFactory.setField(data[i], "FIN_Payment_Detail_ID", paymentDetail.getId()); FieldProviderFactory.setField(data[i], "FIN_Payment_ID", payment.getId()); String dateFormat = OBPropertiesProvider.getInstance().getOpenbravoProperties() .getProperty("dateFormat.java"); @@ -222,33 +231,30 @@ .toString()); FieldProviderFactory.setField(data[i], "PaymentAmount", transaction.getPaymentAmount() .toString()); - FieldProviderFactory.setField(data[i], "DoubtFulDebtAmount", paymentDetails.get(i) + FieldProviderFactory.setField(data[i], "DoubtFulDebtAmount", paymentDetail .getFINPaymentScheduleDetailList().get(0).getDoubtfulDebtAmount().toString()); - FieldProviderFactory.setField(data[i], "isprepayment", - paymentDetails.get(i).isPrepayment() ? "Y" : "N"); + FieldProviderFactory.setField(data[i], "isprepayment", paymentDetail.isPrepayment() ? "Y" + : "N"); // Check if payment against invoice is in a previous date than invoice accounting date - boolean isPaymentDatePriorToInvoiceDate = isPaymentDatePriorToInvoiceDate(paymentDetails - .get(i)); + boolean isPaymentDatePriorToInvoiceDate = isPaymentDatePriorToInvoiceDate(paymentDetail); FieldProviderFactory.setField(data[i], "isPaymentDatePriorToInvoiceDate", - isPaymentDatePriorToInvoiceDate && !paymentDetails.get(i).isPrepayment() ? "Y" : "N"); + isPaymentDatePriorToInvoiceDate && !paymentDetail.isPrepayment() ? "Y" : "N"); FieldProviderFactory.setField(data[i], "WriteOffAmt", writeOff.toString()); FieldProviderFactory.setField(data[i], "cGlItemId", - paymentDetails.get(i).getGLItem() != null ? paymentDetails.get(i).getGLItem().getId() - : ""); + paymentDetail.getGLItem() != null ? paymentDetail.getGLItem().getId() : ""); // Calculate Business Partner from payment header or from details if header is null BusinessPartner bPartner = payment.getBusinessPartner() != null ? payment - .getBusinessPartner() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() - .getBusinessPartner() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getBusinessPartner() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getBusinessPartner()))); + .getBusinessPartner() + : (paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getBusinessPartner() + : (paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() + .getBusinessPartner() + : (paymentDetail.getFINPaymentScheduleDetailList().get(0).getBusinessPartner()))); FieldProviderFactory.setField(data[i], "cBpartnerId", bPartner != null ? bPartner.getId() : ""); - FieldProviderFactory.setField(data[i], "Refund", paymentDetails.get(i).isRefund() ? "Y" - : "N"); + FieldProviderFactory.setField(data[i], "Refund", paymentDetail.isRefund() ? "Y" : "N"); FieldProviderFactory.setField(data[i], "adOrgId", transaction.getOrganization().getId()); FieldProviderFactory.setField( data[i], @@ -257,74 +263,66 @@ .getField("cGlItemId")); FieldProviderFactory.setField(data[i], "description", transaction.getDescription()); FieldProviderFactory.setField(data[i], "cCurrencyId", transaction.getCurrency().getId()); - FieldProviderFactory.setField(data[i], "cProjectId", paymentDetails.get(i) + FieldProviderFactory.setField(data[i], "cProjectId", paymentDetail .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getProject() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getProject().getId() : (paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getProject() != null ? paymentDetails.get(i) + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getProject() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getProject().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getProject() != null ? paymentDetail.getFINPaymentScheduleDetailList() + .get(0).getOrderPaymentSchedule().getOrder().getProject().getId() : (paymentDetail + .getFINPaymentScheduleDetailList().get(0).getProject() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getProject().getId() : ""))); + FieldProviderFactory.setField(data[i], "cCampaignId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getSalesCampaign() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getSalesCampaign().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getSalesCampaign() != null ? paymentDetail .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getProject().getId() : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getProject() != null ? paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getProject().getId() : ""))); - FieldProviderFactory - .setField( - data[i], - "cCampaignId", - paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getSalesCampaign() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getSalesCampaign().getId() - : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getSalesCampaign() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() - .getOrder().getSalesCampaign().getId() - : (paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getSalesCampaign() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getSalesCampaign().getId() - : ""))); - FieldProviderFactory.setField(data[i], "cActivityId", paymentDetails.get(i) + .getSalesCampaign().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getSalesCampaign() != null ? paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getSalesCampaign().getId() : ""))); + FieldProviderFactory.setField(data[i], "cActivityId", paymentDetail .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getInvoicePaymentSchedule().getInvoice().getActivity() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() - .getInvoice().getActivity().getId() : (paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() != null - && paymentDetails.get(i).getFINPaymentScheduleDetailList().get(0) - .getOrderPaymentSchedule().getOrder().getActivity() != null ? paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule().getOrder() - .getActivity().getId() : (paymentDetails.get(i).getFINPaymentScheduleDetailList() - .get(0).getActivity() != null ? paymentDetails.get(i).getFINPaymentScheduleDetailList() - .get(0).getActivity().getId() : ""))); - FieldProviderFactory.setField(data[i], "mProductId", paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getProduct() != null ? paymentDetails.get(i) + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule() + .getInvoice().getActivity() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getInvoicePaymentSchedule().getInvoice() + .getActivity().getId() : (paymentDetail.getFINPaymentScheduleDetailList().get(0) + .getOrderPaymentSchedule() != null + && paymentDetail.getFINPaymentScheduleDetailList().get(0).getOrderPaymentSchedule() + .getOrder().getActivity() != null ? paymentDetail.getFINPaymentScheduleDetailList() + .get(0).getOrderPaymentSchedule().getOrder().getActivity().getId() : (paymentDetail + .getFINPaymentScheduleDetailList().get(0).getActivity() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getActivity().getId() : ""))); + FieldProviderFactory.setField(data[i], "mProductId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getProduct() != null ? paymentDetail .getFINPaymentScheduleDetailList().get(0).getProduct().getId() : ""); - FieldProviderFactory.setField(data[i], "cSalesregionId", paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getSalesRegion() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getSalesRegion().getId() : ""); - FieldProviderFactory - .setField(data[i], "cCostcenterId", paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getCostCenter() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getCostCenter().getId() : ""); + FieldProviderFactory.setField(data[i], "cSalesregionId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getSalesRegion() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getSalesRegion().getId() : ""); + FieldProviderFactory.setField(data[i], "cCostcenterId", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getCostCenter() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getCostCenter().getId() : ""); FieldProviderFactory.setField(data[i], "lineno", transaction.getLineNo().toString()); - FieldProviderFactory.setField(data[i], "user1Id", paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getStDimension() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getStDimension().getId() : ""); + FieldProviderFactory.setField(data[i], "user1Id", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getStDimension() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getStDimension().getId() : ""); - FieldProviderFactory.setField(data[i], "user2Id", paymentDetails.get(i) - .getFINPaymentScheduleDetailList().get(0).getNdDimension() != null ? paymentDetails - .get(i).getFINPaymentScheduleDetailList().get(0).getNdDimension().getId() : ""); - FieldProviderFactory.setField(data[i], "recordId2", - paymentDetails.get(i).isPrepayment() ? (pso != null ? pso.getId() : "") - : (psi != null ? psi.getId() : "")); + FieldProviderFactory.setField(data[i], "user2Id", paymentDetail + .getFINPaymentScheduleDetailList().get(0).getNdDimension() != null ? paymentDetail + .getFINPaymentScheduleDetailList().get(0).getNdDimension().getId() : ""); + FieldProviderFactory.setField( + data[i], + "recordId2", + paymentDetail.isPrepayment() ? (pso != null ? pso.getId() : "") : (psi != null ? psi + .getId() : "")); } } finally { OBContext.restorePreviousMode(); 31580_cr.diff [^] (2,008 bytes) 2015-12-29 11:34 [Show Content] [Hide Content] # HG changeset patch # User Víctor Martínez Romanos <victor.martinez@openbravo.com> # Date 1451385154 -3600 # Tue Dec 29 11:32:34 2015 +0100 # Node ID 0f2f9ebaeb234937c883a903dd939d78254dd313 # Parent efa3da8d66bd88b2a114277ad6221c1256d7f051 Fixed bug 31580: code review improvements Properly passing parameter to the HQL query Force to check client+org when using admin mode diff --git a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java --- a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java +++ b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java @@ -1357,15 +1357,15 @@ List<String> pdList = null; - OBContext.setAdminMode(); + OBContext.setAdminMode(true); try { final StringBuilder whereClause = new StringBuilder(); whereClause.append(" select pd." + FIN_PaymentDetail.PROPERTY_ID); whereClause.append(" from " + FIN_PaymentDetail.ENTITY_NAME + " as pd"); whereClause.append(" left join pd." + FIN_PaymentDetail.PROPERTY_FINPAYMENTSCHEDULEDETAILLIST + " as psd"); - whereClause.append(" where pd." + FIN_PaymentDetail.PROPERTY_FINPAYMENT + ".id = '" - + paymentId + "'"); + whereClause + .append(" where pd." + FIN_PaymentDetail.PROPERTY_FINPAYMENT + ".id = :paymentId "); whereClause.append(" and pd." + FIN_PaymentDetail.PROPERTY_ACTIVE + " = true"); whereClause.append(" order by psd." + FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE); @@ -1373,6 +1373,7 @@ + FIN_PaymentScheduleDetail.PROPERTY_ORDERPAYMENTSCHEDULE + ",'0')"); Query query = OBDal.getInstance().getSession().createQuery(whereClause.toString()); + query.setParameter("paymentId", paymentId); pdList = query.list(); } finally { with_last_fix_after_reopening_issue_post_payment_and_transaction.png [^] (36,579 bytes) 2016-01-21 17:07 | |||||||
Relationships [ Relation Graph ] [ Dependency Graph ] | ||||||||||||||||||||||
|
Notes | |
(0083117) vmromanos (manager) 2015-12-31 16:38 |
Patches provided to be tested by reporter in customer's environment |
(0083202) hgbot (developer) 2016-01-11 19:05 |
Repository: erp/devel/pi Changeset: 217fb3a426febf71995fa1394dac159afa49b44f Author: Alvaro Ferraz <alvaro.ferraz <at> openbravo.com> Date: Tue Dec 01 16:44:30 2015 +0100 URL: http://code.openbravo.com/erp/devel/pi/rev/217fb3a426febf71995fa1394dac159afa49b44f [^] Fixes issue 31580: Java Heap Space error when posting payment with many details Add a new FIN_Utility.getOrderedPaymentDetailList method and deprecate the old one, to return a List<String> instead of a List<FIN_PaymentDetail> and avoid loading all the entities in memory. Adapt loadLines methods in DocFINFinAccTransaction, DocFINPayment and DocFINReconciliation to the new FIN_Utility.getOrderedPaymentDetailList method. Create a new getPaymentDetailWriteOffAndAmount method in AcctServer to adapt it to new parameters. --- M modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java M src/org/openbravo/erpCommon/ad_forms/AcctServer.java M src/org/openbravo/erpCommon/ad_forms/DocFINFinAccTransaction.java M src/org/openbravo/erpCommon/ad_forms/DocFINPayment.java M src/org/openbravo/erpCommon/ad_forms/DocFINReconciliation.java --- |
(0083203) hgbot (developer) 2016-01-11 19:05 |
Repository: erp/devel/pi Changeset: 1817418c55aff648d979a7ca7c3d56a90ecab721 Author: Víctor Martínez Romanos <victor.martinez <at> openbravo.com> Date: Tue Dec 29 11:32:34 2015 +0100 URL: http://code.openbravo.com/erp/devel/pi/rev/1817418c55aff648d979a7ca7c3d56a90ecab721 [^] Fixed bug 31580: code review improvements Properly passing parameter to the HQL query Force to check client+org when using admin mode --- M modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java --- |
(0083204) vmromanos (manager) 2016-01-11 19:05 |
Code review + testing OK Pending to be confirmed by customer |
(0083398) maite (developer) 2016-01-19 14:00 |
I still obtain Java Heap Space error with changes applied. Error is obtained after 3 hours of execution for a single FIN_Payment document and using following tomcat configuration: -Xms2048M -Xmx2048M -XX:MaxPermSize=256M I can provide environment where problem is still reproducible |
(0083575) hgbot (developer) 2016-01-25 09:15 |
Repository: erp/devel/pi Changeset: 7dafd0844a3dcfa21a67cca627e283e2ba7ba76b Author: Víctor Martínez Romanos <victor.martinez <at> openbravo.com> Date: Thu Jan 21 16:52:52 2016 +0100 URL: http://code.openbravo.com/erp/devel/pi/rev/7dafd0844a3dcfa21a67cca627e283e2ba7ba76b [^] Related to issue 31580: Reduced Java Heap Usage even more DocFINFinAccTransaction and DocFINPayment: + Avoid storing useless objects like ps and pd, and replaced by String Ids, so we can safely clear the Hibernate session + Save cInvoiceId when loading lines in field provider so it's available latter on when loading the document lines, thus we avoid an extra query to the database to get the invoice from the payment detail + Forces a session clear every 100 records when working with the payment details. This is only possible because DAL objects are not stored anywhere. DocLine_FINFinAccTransaction and DocLine_FINPayment: + Declare a String invoiceId parameter instead of using an Invoice object. This improves the memory consumption and allows to manage external session clears when required. + Declare as deprecated all the methods that used the invoice object and adapt the getInvoice() to be backward compatible (returns the invoice object is previously declared in the object, or a new object based on the invoiceId) + For DocLine_FINPayment only, adapted the Order object usage following the same logic. FIN_Utility.getOrderedPaymentDetailList() query uses an inner join to the FPSD because having a linked FPSD is a requirement in the accounting classes. Note that DocFINReconciliation class should be also adapted following the same logics described above. However, this class would require deeper refactor mainly because of the attribute Set<FIN_FinaccTransaction> transactionsToBePosted, that avoids safely session clears. --- M modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java M src/org/openbravo/erpCommon/ad_forms/DocFINFinAccTransaction.java M src/org/openbravo/erpCommon/ad_forms/DocFINPayment.java M src/org/openbravo/erpCommon/ad_forms/DocLine_FINFinAccTransaction.java M src/org/openbravo/erpCommon/ad_forms/DocLine_FINPayment.java --- |
(0083576) vmromanos (manager) 2016-01-25 09:19 |
With the last changeset the memory consumption is reduced around 1.5GB. See attached with_last_fix_after_reopening_issue_post_payment_and_transaction.png for details |
(0085028) hudsonbot (developer) 2016-03-17 10:53 |
A changeset related to this issue has been promoted main and to the Central Repository, after passing a series of tests. Promotion changeset: https://code.openbravo.com/erp/devel/main/rev/b22fb0500156 [^] Maturity status: Test |
(0085029) hudsonbot (developer) 2016-03-17 10:53 |
A changeset related to this issue has been promoted main and to the Central Repository, after passing a series of tests. Promotion changeset: https://code.openbravo.com/erp/devel/main/rev/b22fb0500156 [^] Maturity status: Test |
(0085077) hudsonbot (developer) 2016-03-17 10:55 |
A changeset related to this issue has been promoted main and to the Central Repository, after passing a series of tests. Promotion changeset: https://code.openbravo.com/erp/devel/main/rev/b22fb0500156 [^] Maturity status: Test |
Issue History | |||
Date Modified | Username | Field | Change |
2015-11-25 13:42 | maite | New Issue | |
2015-11-25 13:42 | maite | Assigned To | => Triage Finance |
2015-11-25 13:42 | maite | Modules | => Core |
2015-11-25 13:42 | maite | Resolution time | => 1448578800 |
2015-11-25 13:42 | maite | Triggers an Emergency Pack | => No |
2015-11-25 13:43 | maite | Issue Monitored: networkb | |
2015-11-27 12:35 | aferraz | Assigned To | Triage Finance => aferraz |
2015-11-27 12:36 | aferraz | Status | new => scheduled |
2015-12-29 10:55 | vmromanos | File Added: 31580.diff | |
2015-12-29 11:34 | vmromanos | File Added: 31580_cr.diff | |
2015-12-30 11:34 | vmromanos | Target Version | 3.0PR16Q1 => |
2015-12-31 16:38 | vmromanos | Note Added: 0083117 | |
2016-01-11 19:05 | hgbot | Checkin | |
2016-01-11 19:05 | hgbot | Note Added: 0083202 | |
2016-01-11 19:05 | hgbot | Status | scheduled => resolved |
2016-01-11 19:05 | hgbot | Resolution | open => fixed |
2016-01-11 19:05 | hgbot | Fixed in SCM revision | => http://code.openbravo.com/erp/devel/pi/rev/217fb3a426febf71995fa1394dac159afa49b44f [^] |
2016-01-11 19:05 | hgbot | Checkin | |
2016-01-11 19:05 | hgbot | Note Added: 0083203 | |
2016-01-11 19:05 | hgbot | Fixed in SCM revision | http://code.openbravo.com/erp/devel/pi/rev/217fb3a426febf71995fa1394dac159afa49b44f [^] => http://code.openbravo.com/erp/devel/pi/rev/1817418c55aff648d979a7ca7c3d56a90ecab721 [^] |
2016-01-11 19:05 | vmromanos | Review Assigned To | => vmromanos |
2016-01-11 19:05 | vmromanos | Note Added: 0083204 | |
2016-01-11 19:05 | vmromanos | Status | resolved => closed |
2016-01-19 14:00 | maite | Note Added: 0083398 | |
2016-01-19 14:00 | maite | Status | closed => new |
2016-01-19 14:00 | maite | Resolution | fixed => open |
2016-01-20 13:25 | vmromanos | Assigned To | aferraz => vmromanos |
2016-01-20 13:25 | vmromanos | Status | new => acknowledged |
2016-01-21 10:19 | vmromanos | Status | acknowledged => scheduled |
2016-01-21 17:07 | vmromanos | File Added: with_last_fix_after_reopening_issue_post_payment_and_transaction.png | |
2016-01-25 09:15 | hgbot | Checkin | |
2016-01-25 09:15 | hgbot | Note Added: 0083575 | |
2016-01-25 09:16 | vmromanos | Status | scheduled => resolved |
2016-01-25 09:16 | vmromanos | Fixed in SCM revision | http://code.openbravo.com/erp/devel/pi/rev/1817418c55aff648d979a7ca7c3d56a90ecab721 [^] => http://code.openbravo.com/erp/devel/pi/rev/7dafd0844a3dcfa21a67cca627e283e2ba7ba76b [^] |
2016-01-25 09:16 | vmromanos | Resolution | open => fixed |
2016-01-25 09:19 | vmromanos | Note Added: 0083576 | |
2016-01-25 09:19 | vmromanos | Status | resolved => closed |
2016-02-11 13:07 | vmromanos | Relationship added | causes 0032203 |
2016-03-17 10:53 | hudsonbot | Checkin | |
2016-03-17 10:53 | hudsonbot | Note Added: 0085028 | |
2016-03-17 10:53 | hudsonbot | Checkin | |
2016-03-17 10:53 | hudsonbot | Note Added: 0085029 | |
2016-03-17 10:55 | hudsonbot | Checkin | |
2016-03-17 10:55 | hudsonbot | Note Added: 0085077 | |
2016-07-22 14:26 | aferraz | Relationship added | causes 0033508 |
2016-08-12 11:41 | aferraz | Relationship added | causes 0033688 |
Copyright © 2000 - 2009 MantisBT Group |