IDEMPIERE-2134 Issues found on Payment Selection process
* Payment Selection Manual: ** WPaySelect.onEvent: improved to refresh lines on onlydue, paymentrule and paymentdate changes ** PaySelect.getPaymentRuleData: is getting also inactive payment rules ** WPaySelect is showing correctly the schedule records of an invoice, but the due date is wrong - leading to wrong schedule records shown with only due invoices flag ** PaySelect.getDocTypeData: Is just selecting API/APC, can also include AR documents * Payment Selection Create (button on window) ** running PaySelectionCreateFrom repeated the invoices - must just add new ** issotrx set based on payment rule - direct debit Y, otherwise N ** The process is getting the records from C_Invoice instead of C_Invoice_V (as manual does) - this must be leading to error on selected schedule records for only due parameter (test required to confirm) * Payment Print/Export ** deleted not used PayPrint.getPaySelectionData
This commit is contained in:
parent
f4f2cb9555
commit
2c04735527
|
@ -59,7 +59,7 @@ BEGIN
|
||||||
INTO v_Amount
|
INTO v_Amount
|
||||||
FROM C_InvoicePaySchedule
|
FROM C_InvoicePaySchedule
|
||||||
WHERE C_InvoicePaySchedule_ID=p_C_InvoicePaySchedule_ID
|
WHERE C_InvoicePaySchedule_ID=p_C_InvoicePaySchedule_ID
|
||||||
AND DiscountDate <= v_PayDate;
|
AND DiscountDate >= v_PayDate;
|
||||||
--
|
--
|
||||||
RETURN v_Amount;
|
RETURN v_Amount;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
|
@ -64,7 +64,7 @@ BEGIN
|
||||||
INTO v_Amount
|
INTO v_Amount
|
||||||
FROM C_InvoicePaySchedule
|
FROM C_InvoicePaySchedule
|
||||||
WHERE C_InvoicePaySchedule_ID=p_C_InvoicePaySchedule_ID
|
WHERE C_InvoicePaySchedule_ID=p_C_InvoicePaySchedule_ID
|
||||||
AND DiscountDate <= v_PayDate;
|
AND DiscountDate >= v_PayDate;
|
||||||
--
|
--
|
||||||
RETURN v_Amount;
|
RETURN v_Amount;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
SET SQLBLANKLINES ON
|
||||||
|
SET DEFINE OFF
|
||||||
|
|
||||||
|
-- Aug 11, 2014 11:38:21 AM CEST
|
||||||
|
-- IDEMPIERE-2134 Issues found on Payment Selection process
|
||||||
|
UPDATE AD_Process_Para SET DefaultValue='N',Updated=TO_DATE('2014-08-11 11:38:21','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=184
|
||||||
|
;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION invoiceDiscount
|
||||||
|
(
|
||||||
|
p_C_Invoice_ID IN NUMBER,
|
||||||
|
p_PayDate IN DATE,
|
||||||
|
p_C_InvoicePaySchedule_ID IN NUMBER
|
||||||
|
)
|
||||||
|
RETURN NUMBER
|
||||||
|
/*************************************************************************
|
||||||
|
* The contents of this file are subject to the Compiere License. You may
|
||||||
|
* obtain a copy of the License at http://www.compiere.org/license.html
|
||||||
|
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
|
||||||
|
* express or implied. See the License for details. Code: Compiere ERP+CRM
|
||||||
|
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
|
||||||
|
*************************************************************************
|
||||||
|
* $Id: C_Invoice_Discount.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
|
||||||
|
***
|
||||||
|
* Title: Calculate Payment Discount Amount
|
||||||
|
* Description:
|
||||||
|
* - Calculate discountable amount (i.e. with or without tax)
|
||||||
|
* - Calculate and return payment discount
|
||||||
|
************************************************************************/
|
||||||
|
AS
|
||||||
|
v_Amount NUMBER;
|
||||||
|
v_IsDiscountLineAmt CHAR(1);
|
||||||
|
v_GrandTotal NUMBER;
|
||||||
|
v_TotalLines NUMBER;
|
||||||
|
v_C_PaymentTerm_ID NUMBER(10);
|
||||||
|
v_C_Currency_ID NUMBER(10);
|
||||||
|
v_DocDate DATE;
|
||||||
|
v_PayDate DATE := SysDate;
|
||||||
|
v_IsPayScheduleValid CHAR(1);
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
SELECT ci.IsDiscountLineAmt, i.GrandTotal, i.TotalLines,
|
||||||
|
i.C_PaymentTerm_ID, i.DateInvoiced, i.IsPayScheduleValid, C_Currency_ID
|
||||||
|
INTO v_IsDiscountLineAmt, v_GrandTotal, v_TotalLines,
|
||||||
|
v_C_PaymentTerm_ID, v_DocDate, v_IsPayScheduleValid, v_C_Currency_ID
|
||||||
|
FROM AD_ClientInfo ci, C_Invoice i
|
||||||
|
WHERE ci.AD_Client_ID=i.AD_Client_ID
|
||||||
|
AND i.C_Invoice_ID=p_C_Invoice_ID;
|
||||||
|
-- What Amount is the Discount Base?
|
||||||
|
IF (v_IsDiscountLineAmt = 'Y') THEN
|
||||||
|
v_Amount := v_TotalLines;
|
||||||
|
ELSE
|
||||||
|
v_Amount := v_GrandTotal;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Anything to discount?
|
||||||
|
IF (v_Amount = 0) THEN
|
||||||
|
RETURN 0;
|
||||||
|
END IF;
|
||||||
|
IF (p_PayDate IS NOT NULL) THEN
|
||||||
|
v_PayDate := p_PayDate;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Valid Payment Schedule
|
||||||
|
IF (v_IsPayScheduleValid='Y' AND p_C_InvoicePaySchedule_ID > 0) THEN
|
||||||
|
SELECT COALESCE(MAX(DiscountAmt),0)
|
||||||
|
INTO v_Amount
|
||||||
|
FROM C_InvoicePaySchedule
|
||||||
|
WHERE C_InvoicePaySchedule_ID=p_C_InvoicePaySchedule_ID
|
||||||
|
AND DiscountDate >= v_PayDate;
|
||||||
|
--
|
||||||
|
RETURN v_Amount;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- return discount amount
|
||||||
|
RETURN paymentTermDiscount (v_Amount, v_C_Currency_ID, v_C_PaymentTerm_ID, v_DocDate, p_PayDate);
|
||||||
|
|
||||||
|
-- Most likely if invoice not found
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
RETURN NULL;
|
||||||
|
END invoiceDiscount;
|
||||||
|
/
|
||||||
|
|
||||||
|
SELECT register_migration_script('201408111139_IDEMPIERE-2134.sql') FROM dual
|
||||||
|
;
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
-- Aug 11, 2014 11:38:21 AM CEST
|
||||||
|
-- IDEMPIERE-2134 Issues found on Payment Selection process
|
||||||
|
UPDATE AD_Process_Para SET DefaultValue='N',Updated=TO_TIMESTAMP('2014-08-11 11:38:21','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=184
|
||||||
|
;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION invoiceDiscount
|
||||||
|
(
|
||||||
|
p_C_Invoice_ID NUMERIC,
|
||||||
|
p_paydate timestamp with time zone,
|
||||||
|
p_C_InvoicePaySchedule_ID NUMERIC
|
||||||
|
)
|
||||||
|
RETURNS numeric AS $body$
|
||||||
|
/*************************************************************************
|
||||||
|
* The contents of this file are subject to the Compiere License. You may
|
||||||
|
* obtain a copy of the License at http://www.compiere.org/license.html
|
||||||
|
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
|
||||||
|
* express or implied. See the License for details. Code: Compiere ERP+CRM
|
||||||
|
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* converted to postgreSQL by Karsten Thiemann (Schaeffer AG),
|
||||||
|
* kthiemann@adempiere.org
|
||||||
|
*************************************************************************
|
||||||
|
***
|
||||||
|
* Title: Calculate Payment Discount Amount
|
||||||
|
* Description:
|
||||||
|
* - Calculate discountable amount (i.e. with or without tax)
|
||||||
|
* - Calculate and return payment discount
|
||||||
|
* Test:
|
||||||
|
* select invoiceDiscount(109, now(), 103) from ad_system; => 0
|
||||||
|
************************************************************************/
|
||||||
|
DECLARE
|
||||||
|
v_Amount NUMERIC;
|
||||||
|
v_IsDiscountLineAmt CHAR(1);
|
||||||
|
v_GrandTotal NUMERIC;
|
||||||
|
v_TotalLines NUMERIC;
|
||||||
|
v_C_PaymentTerm_ID NUMERIC(10);
|
||||||
|
v_C_Currency_ID NUMERIC(10);
|
||||||
|
v_DocDate timestamp with time zone;
|
||||||
|
v_PayDate timestamp with time zone := now();
|
||||||
|
v_IsPayScheduleValid CHAR(1);
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
SELECT ci.IsDiscountLineAmt, i.GrandTotal, i.TotalLines,
|
||||||
|
i.C_PaymentTerm_ID, i.DateInvoiced, i.IsPayScheduleValid, C_Currency_ID
|
||||||
|
INTO v_IsDiscountLineAmt, v_GrandTotal, v_TotalLines,
|
||||||
|
v_C_PaymentTerm_ID, v_DocDate, v_IsPayScheduleValid, v_C_Currency_ID
|
||||||
|
FROM AD_ClientInfo ci, C_Invoice i
|
||||||
|
WHERE ci.AD_Client_ID=i.AD_Client_ID
|
||||||
|
AND i.C_Invoice_ID=p_C_Invoice_ID;
|
||||||
|
|
||||||
|
-- What Amount is the Discount Base?
|
||||||
|
IF (v_IsDiscountLineAmt = 'Y') THEN
|
||||||
|
v_Amount := v_TotalLines;
|
||||||
|
ELSE
|
||||||
|
v_Amount := v_GrandTotal;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Anything to discount?
|
||||||
|
IF (v_Amount = 0) THEN
|
||||||
|
RETURN 0;
|
||||||
|
END IF;
|
||||||
|
IF (p_PayDate IS NOT NULL) THEN
|
||||||
|
v_PayDate := p_PayDate;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Valid Payment Schedule
|
||||||
|
IF (v_IsPayScheduleValid='Y' AND p_C_InvoicePaySchedule_ID > 0) THEN
|
||||||
|
SELECT COALESCE(MAX(DiscountAmt),0)
|
||||||
|
INTO v_Amount
|
||||||
|
FROM C_InvoicePaySchedule
|
||||||
|
WHERE C_InvoicePaySchedule_ID=p_C_InvoicePaySchedule_ID
|
||||||
|
AND DiscountDate >= v_PayDate;
|
||||||
|
--
|
||||||
|
RETURN v_Amount;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- return discount amount
|
||||||
|
RETURN paymentTermDiscount (v_Amount, v_C_Currency_ID, v_C_PaymentTerm_ID, v_DocDate, p_PayDate);
|
||||||
|
|
||||||
|
-- Most likely if invoice not found
|
||||||
|
EXCEPTION
|
||||||
|
WHEN OTHERS THEN
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
|
||||||
|
$body$ LANGUAGE plpgsql STABLE;
|
||||||
|
|
||||||
|
SELECT register_migration_script('201408111139_IDEMPIERE-2134.sql') FROM dual
|
||||||
|
;
|
||||||
|
|
|
@ -19,11 +19,15 @@ package org.compiere.process;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.adempiere.exceptions.AdempiereException;
|
||||||
|
import org.adempiere.exceptions.DBException;
|
||||||
import org.compiere.model.MPaySelection;
|
import org.compiere.model.MPaySelection;
|
||||||
import org.compiere.model.MPaySelectionLine;
|
import org.compiere.model.MPaySelectionLine;
|
||||||
|
import org.compiere.model.X_C_Order;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
|
|
||||||
|
@ -115,21 +119,27 @@ public class PaySelectionCreateFrom extends SvrProcess
|
||||||
|
|
||||||
StringBuilder sql = new StringBuilder("SELECT C_Invoice_ID,")
|
StringBuilder sql = new StringBuilder("SELECT C_Invoice_ID,")
|
||||||
// Open
|
// Open
|
||||||
.append(" currencyConvert(invoiceOpen(i.C_Invoice_ID, 0)")
|
.append(" currencyConvert(invoiceOpen(i.C_Invoice_ID, i.C_InvoicePaySchedule_ID)")
|
||||||
.append(",i.C_Currency_ID, ?,?, i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID),") // ##1/2 Currency_To,PayDate
|
.append(",i.C_Currency_ID, ?,?, i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID) AS PayAmt,") // ##1/2 Currency_To,PayDate
|
||||||
// Discount
|
// Discount
|
||||||
.append(" currencyConvert(paymentTermDiscount(i.GrandTotal,i.C_Currency_ID,i.C_PaymentTerm_ID,i.DateInvoiced, ?)") // ##3 PayDate
|
.append(" currencyConvert(invoiceDiscount(i.C_Invoice_ID,?,i.C_InvoicePaySchedule_ID)") // ##3 PayDate
|
||||||
.append(",i.C_Currency_ID, ?,?,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID),") // ##4/5 Currency_To,PayDate
|
.append(",i.C_Currency_ID, ?,?,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID) AS DiscountAmt,") // ##4/5 Currency_To,PayDate
|
||||||
.append(" PaymentRule, IsSOTrx ") // 4..6
|
.append(" PaymentRule, IsSOTrx ") // 4..6
|
||||||
.append("FROM C_Invoice i ")
|
.append("FROM C_Invoice_v i WHERE ");
|
||||||
.append("WHERE IsSOTrx='N' AND IsPaid='N' AND DocStatus IN ('CO','CL')")
|
if (X_C_Order.PAYMENTRULE_DirectDebit.equals(p_PaymentRule))
|
||||||
|
sql.append("IsSOTrx='Y'");
|
||||||
|
else
|
||||||
|
sql.append("IsSOTrx='N'");
|
||||||
|
sql.append(" AND IsPaid='N' AND DocStatus IN ('CO','CL')")
|
||||||
.append(" AND AD_Client_ID=?") // ##6
|
.append(" AND AD_Client_ID=?") // ##6
|
||||||
// Existing Payments - Will reselect Invoice if prepared but not paid
|
// Existing Payments - Will reselect Invoice if prepared but not paid
|
||||||
.append(" AND NOT EXISTS (SELECT * FROM C_PaySelectionLine psl")
|
.append(" AND NOT EXISTS (SELECT * FROM C_PaySelectionLine psl")
|
||||||
.append(" INNER JOIN C_PaySelectionCheck psc ON (psl.C_PaySelectionCheck_ID=psc.C_PaySelectionCheck_ID)")
|
.append(" INNER JOIN C_PaySelectionCheck psc ON (psl.C_PaySelectionCheck_ID=psc.C_PaySelectionCheck_ID)")
|
||||||
.append(" LEFT OUTER JOIN C_Payment pmt ON (pmt.C_Payment_ID=psc.C_Payment_ID)")
|
.append(" LEFT OUTER JOIN C_Payment pmt ON (pmt.C_Payment_ID=psc.C_Payment_ID)")
|
||||||
.append(" WHERE i.C_Invoice_ID=psl.C_Invoice_ID AND psl.IsActive='Y'")
|
.append(" WHERE i.C_Invoice_ID=psl.C_Invoice_ID AND psl.IsActive='Y'")
|
||||||
.append(" AND (pmt.DocStatus IS NULL OR pmt.DocStatus NOT IN ('VO','RE')) )");
|
.append(" AND (pmt.DocStatus IS NULL OR pmt.DocStatus NOT IN ('VO','RE')) )")
|
||||||
|
// Don't generate again invoices already on this payment selection
|
||||||
|
.append(" AND i.C_Invoice_ID NOT IN (SELECT i.C_Invoice_ID FROM C_PaySelectionLine psl WHERE psl.C_PaySelection_ID=?)"); // ##7
|
||||||
// Disputed
|
// Disputed
|
||||||
if (!p_IncludeInDispute)
|
if (!p_IncludeInDispute)
|
||||||
sql.append(" AND i.IsInDispute='N'");
|
sql.append(" AND i.IsInDispute='N'");
|
||||||
|
@ -143,7 +153,7 @@ public class PaySelectionCreateFrom extends SvrProcess
|
||||||
sql.append(" AND (");
|
sql.append(" AND (");
|
||||||
else
|
else
|
||||||
sql.append(" AND ");
|
sql.append(" AND ");
|
||||||
sql.append("paymentTermDiscount(invoiceOpen(C_Invoice_ID, 0), C_Currency_ID, C_PaymentTerm_ID, DateInvoiced, ?) > 0"); // ##
|
sql.append("invoiceDiscount(i.C_Invoice_ID,?,i.C_InvoicePaySchedule_ID) > 0"); // ##
|
||||||
}
|
}
|
||||||
// OnlyDue
|
// OnlyDue
|
||||||
if (p_OnlyDue)
|
if (p_OnlyDue)
|
||||||
|
@ -152,7 +162,8 @@ public class PaySelectionCreateFrom extends SvrProcess
|
||||||
sql.append(" OR ");
|
sql.append(" OR ");
|
||||||
else
|
else
|
||||||
sql.append(" AND ");
|
sql.append(" AND ");
|
||||||
sql.append("paymentTermDueDays(C_PaymentTerm_ID, DateInvoiced, ?) >= 0"); // ##
|
// sql.append("paymentTermDueDays(C_PaymentTerm_ID, DateInvoiced, ?) >= 0"); // ##
|
||||||
|
sql.append("i.DueDate<=?"); // ##
|
||||||
if (p_OnlyDiscount)
|
if (p_OnlyDiscount)
|
||||||
sql.append(")");
|
sql.append(")");
|
||||||
}
|
}
|
||||||
|
@ -197,6 +208,7 @@ public class PaySelectionCreateFrom extends SvrProcess
|
||||||
pstmt.setTimestamp(index++, psel.getPayDate());
|
pstmt.setTimestamp(index++, psel.getPayDate());
|
||||||
//
|
//
|
||||||
pstmt.setInt(index++, psel.getAD_Client_ID());
|
pstmt.setInt(index++, psel.getAD_Client_ID());
|
||||||
|
pstmt.setInt(index++, p_C_PaySelection_ID);
|
||||||
if (p_PaymentRule != null)
|
if (p_PaymentRule != null)
|
||||||
pstmt.setString(index++, p_PaymentRule);
|
pstmt.setString(index++, p_PaymentRule);
|
||||||
if (p_OnlyDiscount)
|
if (p_OnlyDiscount)
|
||||||
|
@ -229,9 +241,13 @@ public class PaySelectionCreateFrom extends SvrProcess
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (SQLException e)
|
||||||
|
{
|
||||||
|
throw new DBException(e);
|
||||||
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
log.log(Level.SEVERE, sql.toString(), e);
|
throw new AdempiereException(e);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|
|
@ -39,6 +39,8 @@ import org.adempiere.webui.component.Row;
|
||||||
import org.adempiere.webui.component.Rows;
|
import org.adempiere.webui.component.Rows;
|
||||||
import org.adempiere.webui.component.WListbox;
|
import org.adempiere.webui.component.WListbox;
|
||||||
import org.adempiere.webui.editor.WDateEditor;
|
import org.adempiere.webui.editor.WDateEditor;
|
||||||
|
import org.adempiere.webui.event.ValueChangeEvent;
|
||||||
|
import org.adempiere.webui.event.ValueChangeListener;
|
||||||
import org.adempiere.webui.event.WTableModelEvent;
|
import org.adempiere.webui.event.WTableModelEvent;
|
||||||
import org.adempiere.webui.event.WTableModelListener;
|
import org.adempiere.webui.event.WTableModelListener;
|
||||||
import org.adempiere.webui.panel.ADForm;
|
import org.adempiere.webui.panel.ADForm;
|
||||||
|
@ -76,7 +78,7 @@ import org.zkoss.zul.Space;
|
||||||
* @version $Id: VPaySelect.java,v 1.3 2006/07/30 00:51:28 jjanke Exp $
|
* @version $Id: VPaySelect.java,v 1.3 2006/07/30 00:51:28 jjanke Exp $
|
||||||
*/
|
*/
|
||||||
public class WPaySelect extends PaySelect
|
public class WPaySelect extends PaySelect
|
||||||
implements IFormController, EventListener<Event>, WTableModelListener, IProcessUI
|
implements IFormController, EventListener<Event>, WTableModelListener, IProcessUI, ValueChangeListener
|
||||||
{
|
{
|
||||||
/** @todo withholding */
|
/** @todo withholding */
|
||||||
|
|
||||||
|
@ -164,6 +166,8 @@ public class WPaySelect extends PaySelect
|
||||||
onlyDue.setText(Msg.getMsg(Env.getCtx(), "OnlyDue"));
|
onlyDue.setText(Msg.getMsg(Env.getCtx(), "OnlyDue"));
|
||||||
dataStatus.setText(" ");
|
dataStatus.setText(" ");
|
||||||
dataStatus.setPre(true);
|
dataStatus.setPre(true);
|
||||||
|
onlyDue.addActionListener(this);
|
||||||
|
fieldPayDate.addValueChangeListener(this);
|
||||||
//
|
//
|
||||||
bGenerate.addActionListener(this);
|
bGenerate.addActionListener(this);
|
||||||
bCancel.addActionListener(this);
|
bCancel.addActionListener(this);
|
||||||
|
@ -322,11 +326,18 @@ public class WPaySelect extends PaySelect
|
||||||
dispose();
|
dispose();
|
||||||
|
|
||||||
// Update Open Invoices
|
// Update Open Invoices
|
||||||
else if (e.getTarget() == fieldBPartner || e.getTarget() == bRefresh || e.getTarget() == fieldDtype)
|
else if (e.getTarget() == fieldBPartner || e.getTarget() == bRefresh || e.getTarget() == fieldDtype
|
||||||
|
|| e.getTarget() == fieldPaymentRule || e.getTarget() == onlyDue)
|
||||||
loadTableInfo();
|
loadTableInfo();
|
||||||
|
|
||||||
} // actionPerformed
|
} // actionPerformed
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void valueChange(ValueChangeEvent e) {
|
||||||
|
if (e.getSource() == fieldPayDate)
|
||||||
|
loadTableInfo();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Table Model Listener
|
* Table Model Listener
|
||||||
* @param e event
|
* @param e event
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.compiere.apps.form;
|
package org.compiere.apps.form;
|
||||||
|
|
||||||
|
import static org.compiere.model.SystemIDs.REFERENCE_PAYMENTRULE;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
|
@ -28,11 +30,9 @@ import org.compiere.model.MLookupFactory;
|
||||||
import org.compiere.model.MLookupInfo;
|
import org.compiere.model.MLookupInfo;
|
||||||
import org.compiere.model.MPaySelectionCheck;
|
import org.compiere.model.MPaySelectionCheck;
|
||||||
import org.compiere.model.MPaymentBatch;
|
import org.compiere.model.MPaymentBatch;
|
||||||
import static org.compiere.model.SystemIDs.*;
|
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
import org.compiere.util.KeyNamePair;
|
|
||||||
import org.compiere.util.Language;
|
import org.compiere.util.Language;
|
||||||
import org.compiere.util.ValueNamePair;
|
import org.compiere.util.ValueNamePair;
|
||||||
|
|
||||||
|
@ -54,45 +54,6 @@ public class PayPrint {
|
||||||
/** Logger */
|
/** Logger */
|
||||||
public static CLogger log = CLogger.getCLogger(PayPrint.class);
|
public static CLogger log = CLogger.getCLogger(PayPrint.class);
|
||||||
|
|
||||||
public ArrayList<KeyNamePair> getPaySelectionData()
|
|
||||||
{
|
|
||||||
ArrayList<KeyNamePair> data = new ArrayList<KeyNamePair>();
|
|
||||||
|
|
||||||
log.config("");
|
|
||||||
int AD_Client_ID = Env.getAD_Client_ID(Env.getCtx());
|
|
||||||
|
|
||||||
// Load PaySelect
|
|
||||||
String sql = "SELECT C_PaySelection_ID, Name || ' - ' || TotalAmt FROM C_PaySelection "
|
|
||||||
+ "WHERE AD_Client_ID=? AND Processed='Y' AND IsActive='Y'"
|
|
||||||
+ "ORDER BY PayDate DESC";
|
|
||||||
PreparedStatement pstmt = null;
|
|
||||||
ResultSet rs = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
pstmt = DB.prepareStatement(sql, null);
|
|
||||||
pstmt.setInt(1, AD_Client_ID);
|
|
||||||
rs = pstmt.executeQuery();
|
|
||||||
//
|
|
||||||
while (rs.next())
|
|
||||||
{
|
|
||||||
KeyNamePair pp = new KeyNamePair(rs.getInt(1), rs.getString(2));
|
|
||||||
data.add(pp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (SQLException e)
|
|
||||||
{
|
|
||||||
log.log(Level.SEVERE, sql, e);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
DB.close(rs, pstmt);
|
|
||||||
rs = null;
|
|
||||||
pstmt = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String bank;
|
public String bank;
|
||||||
public String currency;
|
public String currency;
|
||||||
public BigDecimal balance;
|
public BigDecimal balance;
|
||||||
|
|
|
@ -25,6 +25,8 @@ import java.util.ArrayList;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.adempiere.exceptions.AdempiereException;
|
||||||
|
import org.adempiere.exceptions.DBException;
|
||||||
import org.compiere.minigrid.ColumnInfo;
|
import org.compiere.minigrid.ColumnInfo;
|
||||||
import org.compiere.minigrid.IDColumn;
|
import org.compiere.minigrid.IDColumn;
|
||||||
import org.compiere.minigrid.IMiniTable;
|
import org.compiere.minigrid.IMiniTable;
|
||||||
|
@ -173,7 +175,7 @@ public class PaySelect
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
sql = MRole.getDefault().addAccessSQL(
|
sql = MRole.getDefault().addAccessSQL(
|
||||||
"SELECT doc.c_doctype_id,doc.name FROM c_doctype doc WHERE doc.ad_client_id = ? AND doc.docbasetype in ('API','APC') ORDER BY 2", "doc",
|
"SELECT doc.c_doctype_id,doc.name FROM c_doctype doc WHERE doc.ad_client_id = ? AND doc.docbasetype in ('API','APC','ARI','ARC') ORDER BY 2", "doc",
|
||||||
MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO);
|
MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO);
|
||||||
|
|
||||||
KeyNamePair dt = new KeyNamePair(0, "");
|
KeyNamePair dt = new KeyNamePair(0, "");
|
||||||
|
@ -214,7 +216,7 @@ public class PaySelect
|
||||||
i.GrandTotal-paymentTermDiscount(i.GrandTotal,i.C_PaymentTerm_ID,i.DateInvoiced,SysDate) AS DueAmount,
|
i.GrandTotal-paymentTermDiscount(i.GrandTotal,i.C_PaymentTerm_ID,i.DateInvoiced,SysDate) AS DueAmount,
|
||||||
currencyConvert(i.GrandTotal-paymentTermDiscount(i.GrandTotal,i.C_PaymentTerm_ID,i.DateInvoiced,SysDate,null),
|
currencyConvert(i.GrandTotal-paymentTermDiscount(i.GrandTotal,i.C_PaymentTerm_ID,i.DateInvoiced,SysDate,null),
|
||||||
i.C_Currency_ID,xx100,SysDate) AS PayAmt
|
i.C_Currency_ID,xx100,SysDate) AS PayAmt
|
||||||
FROM C_Invoice i, C_BPartner bp, C_Currency c, C_PaymentTerm p
|
FROM C_Invoice_v i, C_BPartner bp, C_Currency c, C_PaymentTerm p
|
||||||
WHERE i.IsSOTrx='N'
|
WHERE i.IsSOTrx='N'
|
||||||
AND i.C_BPartner_ID=bp.C_BPartner_ID
|
AND i.C_BPartner_ID=bp.C_BPartner_ID
|
||||||
AND i.C_Currency_ID=c.C_Currency_ID
|
AND i.C_Currency_ID=c.C_Currency_ID
|
||||||
|
@ -226,16 +228,16 @@ public class PaySelect
|
||||||
m_sql = miniTable.prepareTable(new ColumnInfo[] {
|
m_sql = miniTable.prepareTable(new ColumnInfo[] {
|
||||||
// 0..4
|
// 0..4
|
||||||
new ColumnInfo(" ", "i.C_Invoice_ID", IDColumn.class, false, false, null),
|
new ColumnInfo(" ", "i.C_Invoice_ID", IDColumn.class, false, false, null),
|
||||||
new ColumnInfo(Msg.translate(ctx, "DueDate"), "paymentTermDueDate(i.C_PaymentTerm_ID, i.DateInvoiced) AS DateDue", Timestamp.class, true, true, null),
|
new ColumnInfo(Msg.translate(ctx, "DueDate"), "i.DueDate AS DateDue", Timestamp.class, true, true, null),
|
||||||
new ColumnInfo(Msg.translate(ctx, "C_BPartner_ID"), "bp.Name", KeyNamePair.class, true, false, "i.C_BPartner_ID"),
|
new ColumnInfo(Msg.translate(ctx, "C_BPartner_ID"), "bp.Name", KeyNamePair.class, true, false, "i.C_BPartner_ID"),
|
||||||
new ColumnInfo(Msg.translate(ctx, "DocumentNo"), "i.DocumentNo", String.class),
|
new ColumnInfo(Msg.translate(ctx, "DocumentNo"), "i.DocumentNo", String.class),
|
||||||
new ColumnInfo(Msg.translate(ctx, "C_Currency_ID"), "c.ISO_Code", KeyNamePair.class, true, false, "i.C_Currency_ID"),
|
new ColumnInfo(Msg.translate(ctx, "C_Currency_ID"), "c.ISO_Code", KeyNamePair.class, true, false, "i.C_Currency_ID"),
|
||||||
// 5..9
|
// 5..9
|
||||||
new ColumnInfo(Msg.translate(ctx, "GrandTotal"), "i.GrandTotal", BigDecimal.class),
|
new ColumnInfo(Msg.translate(ctx, "GrandTotal"), "i.GrandTotal", BigDecimal.class),
|
||||||
new ColumnInfo(Msg.translate(ctx, "DiscountAmt"), "paymentTermDiscount(i.GrandTotal,i.C_Currency_ID,i.C_PaymentTerm_ID,i.DateInvoiced, ?)", BigDecimal.class),
|
new ColumnInfo(Msg.translate(ctx, "DiscountAmt"), "invoiceDiscount(i.C_Invoice_ID,?,i.C_InvoicePaySchedule_ID)", BigDecimal.class),
|
||||||
new ColumnInfo(Msg.getMsg(ctx, "DiscountDate"), "SysDate-paymentTermDueDays(i.C_PaymentTerm_ID,i.DateInvoiced,SysDate)", Timestamp.class),
|
new ColumnInfo(Msg.getMsg(ctx, "DiscountDate"), "COALESCE((SELECT discountdate from C_InvoicePaySchedule ips WHERE ips.C_InvoicePaySchedule_ID=i.C_InvoicePaySchedule_ID),i.DateInvoiced+p.DiscountDays+p.GraceDays) AS DiscountDate", Timestamp.class),
|
||||||
new ColumnInfo(Msg.getMsg(ctx, "AmountDue"), "currencyConvert(invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID)", BigDecimal.class),
|
new ColumnInfo(Msg.getMsg(ctx, "AmountDue"), "currencyConvert(invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID) AS AmountDue", BigDecimal.class),
|
||||||
new ColumnInfo(Msg.getMsg(ctx, "AmountPay"), "currencyConvert(invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID)-paymentTermDiscount(i.GrandTotal,i.C_Currency_ID,i.C_PaymentTerm_ID,i.DateInvoiced, ?),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID)", BigDecimal.class)
|
new ColumnInfo(Msg.getMsg(ctx, "AmountPay"), "currencyConvert(invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID)-invoiceDiscount(i.C_Invoice_ID,?,i.C_InvoicePaySchedule_ID),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID) AS AmountPay", BigDecimal.class)
|
||||||
},
|
},
|
||||||
// FROM
|
// FROM
|
||||||
"C_Invoice_v i"
|
"C_Invoice_v i"
|
||||||
|
@ -271,7 +273,7 @@ public class PaySelect
|
||||||
MLookupInfo info = MLookupFactory.getLookup_List(language, AD_Reference_ID);
|
MLookupInfo info = MLookupFactory.getLookup_List(language, AD_Reference_ID);
|
||||||
String sql = info.Query.substring(0, info.Query.indexOf(" ORDER BY"))
|
String sql = info.Query.substring(0, info.Query.indexOf(" ORDER BY"))
|
||||||
+ " AND " + info.KeyColumn
|
+ " AND " + info.KeyColumn
|
||||||
+ " IN (SELECT PaymentRule FROM C_BankAccountDoc WHERE C_BankAccount_ID=?) "
|
+ " IN (SELECT PaymentRule FROM C_BankAccountDoc WHERE C_BankAccount_ID=? AND IsActive='Y') "
|
||||||
+ info.Query.substring(info.Query.indexOf(" ORDER BY"));
|
+ info.Query.substring(info.Query.indexOf(" ORDER BY"));
|
||||||
PreparedStatement pstmt = null;
|
PreparedStatement pstmt = null;
|
||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
|
@ -283,7 +285,7 @@ public class PaySelect
|
||||||
ValueNamePair vp = null;
|
ValueNamePair vp = null;
|
||||||
while (rs.next())
|
while (rs.next())
|
||||||
{
|
{
|
||||||
vp = new ValueNamePair(rs.getString(2), rs.getString(3)); // returns also not active
|
vp = new ValueNamePair(rs.getString(2), rs.getString(3));
|
||||||
data.add(vp);
|
data.add(vp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -321,7 +323,7 @@ public class PaySelect
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
if (onlyDue)
|
if (onlyDue)
|
||||||
sql += " AND paymentTermDueDate(i.C_PaymentTerm_ID, i.DateInvoiced) <= ?";
|
sql += " AND i.DueDate <= ?";
|
||||||
//
|
//
|
||||||
KeyNamePair pp = bpartner;
|
KeyNamePair pp = bpartner;
|
||||||
int C_BPartner_ID = pp.getKey();
|
int C_BPartner_ID = pp.getKey();
|
||||||
|
@ -362,7 +364,11 @@ public class PaySelect
|
||||||
}
|
}
|
||||||
catch (SQLException e)
|
catch (SQLException e)
|
||||||
{
|
{
|
||||||
log.log(Level.SEVERE, sql, e);
|
throw new DBException(e);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new AdempiereException(e);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue