IDEMPIERE-860 Review Payment Processors

- Ensure that both bank account processor and payment processor accept the selected card type
- Add a checking to throw error when trying to save an active Bank Account Processor record with inactive payment processor
- Set the credit card type, credit card number and account name to read-only when a partner bank account record is tied to a customer profile ID reference
This commit is contained in:
Elaine Tan 2013-06-03 12:55:43 +08:00
parent e82acb3840
commit 2a7586baab
4 changed files with 121 additions and 29 deletions

View File

@ -0,0 +1,27 @@
-- May 31, 2013 7:34:01 PM SGT
-- IDEMPIERE-860 Review Payment Processors
UPDATE AD_Column SET ReadOnlyLogic='@CustomerPaymentProfileID@!''''',Updated=TO_DATE('2013-05-31 19:34:01','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=5240
;
-- May 31, 2013 7:34:10 PM SGT
-- IDEMPIERE-860 Review Payment Processors
UPDATE AD_Column SET ReadOnlyLogic='@CustomerPaymentProfileID@!''''',Updated=TO_DATE('2013-05-31 19:34:10','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=5239
;
-- May 31, 2013 7:34:17 PM SGT
-- IDEMPIERE-860 Review Payment Processors
UPDATE AD_Column SET ReadOnlyLogic='@CustomerPaymentProfileID@!''''',Updated=TO_DATE('2013-05-31 19:34:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=5232
;
-- May 31, 2013 7:35:47 PM SGT
-- IDEMPIERE-860 Review Payment Processors
INSERT INTO AD_Message (AD_Client_ID,EntityType,MsgType,MsgText,AD_Message_ID,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created) VALUES (0,'D','E','Inactive payment processor',200176,'e9638795-bd2f-405b-b3cb-567036b3871d','InactivePaymentProcessor','Y',TO_DATE('2013-05-31 19:35:45','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_DATE('2013-05-31 19:35:45','YYYY-MM-DD HH24:MI:SS'))
;
-- May 31, 2013 7:35:47 PM SGT
-- IDEMPIERE-860 Review Payment Processors
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200176 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;
SELECT register_migration_script('201305311943_IDEMPIERE-860.sql') FROM dual
;

View File

@ -0,0 +1,27 @@
-- May 31, 2013 7:34:01 PM SGT
-- IDEMPIERE-860 Review Payment Processors
UPDATE AD_Column SET ReadOnlyLogic='@CustomerPaymentProfileID@!''''',Updated=TO_TIMESTAMP('2013-05-31 19:34:01','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=5240
;
-- May 31, 2013 7:34:10 PM SGT
-- IDEMPIERE-860 Review Payment Processors
UPDATE AD_Column SET ReadOnlyLogic='@CustomerPaymentProfileID@!''''',Updated=TO_TIMESTAMP('2013-05-31 19:34:10','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=5239
;
-- May 31, 2013 7:34:17 PM SGT
-- IDEMPIERE-860 Review Payment Processors
UPDATE AD_Column SET ReadOnlyLogic='@CustomerPaymentProfileID@!''''',Updated=TO_TIMESTAMP('2013-05-31 19:34:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=5232
;
-- May 31, 2013 7:35:47 PM SGT
-- IDEMPIERE-860 Review Payment Processors
INSERT INTO AD_Message (AD_Client_ID,EntityType,MsgType,MsgText,AD_Message_ID,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created) VALUES (0,'D','E','Inactive payment processor',200176,'e9638795-bd2f-405b-b3cb-567036b3871d','InactivePaymentProcessor','Y',TO_TIMESTAMP('2013-05-31 19:35:45','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_TIMESTAMP('2013-05-31 19:35:45','YYYY-MM-DD HH24:MI:SS'))
;
-- May 31, 2013 7:35:47 PM SGT
-- IDEMPIERE-860 Review Payment Processors
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200176 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;
SELECT register_migration_script('201305311943_IDEMPIERE-860.sql') FROM dual
;

View File

@ -22,8 +22,10 @@ import java.util.ArrayList;
import java.util.Properties;
import java.util.logging.Level;
import org.adempiere.exceptions.AdempiereException;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Msg;
/**
* Bank Account Payment Processor
@ -72,26 +74,26 @@ public class MBankAccountProcessor extends X_C_BankAccount_Processor {
+ " AND (bap.C_Currency_ID IS NULL OR bap.C_Currency_ID=?)" // #2
+ " AND (bap.MinimumAmt IS NULL OR bap.MinimumAmt = 0 OR bap.MinimumAmt <= ?)"); // #3
if (MPayment.TENDERTYPE_DirectDeposit.equals(tender))
sql.append(" AND bap.AcceptDirectDeposit='Y'");
sql.append(" AND bap.AcceptDirectDeposit='Y' AND pp.AcceptDirectDeposit='Y' ");
else if (MPayment.TENDERTYPE_DirectDebit.equals(tender))
sql.append(" AND bap.AcceptDirectDebit='Y'");
sql.append(" AND bap.AcceptDirectDebit='Y' AND AND pp.AcceptDirectDebit='Y' ");
else if (MPayment.TENDERTYPE_Check.equals(tender))
sql.append(" AND bap.AcceptCheck='Y'");
sql.append(" AND bap.AcceptCheck='Y' AND pp.AcceptCheck='Y' ");
// CreditCards
else if (MPayment.CREDITCARDTYPE_ATM.equals(CCType))
sql.append(" AND bap.AcceptATM='Y'");
sql.append(" AND bap.AcceptATM='Y' AND pp.AcceptATM='Y' ");
else if (MPayment.CREDITCARDTYPE_Amex.equals(CCType))
sql.append(" AND bap.AcceptAMEX='Y'");
sql.append(" AND bap.AcceptAMEX='Y' AND pp.AcceptAMEX='Y' ");
else if (MPayment.CREDITCARDTYPE_Visa.equals(CCType))
sql.append(" AND bap.AcceptVISA='Y'");
sql.append(" AND bap.AcceptVISA='Y' AND pp.AcceptVISA='Y' ");
else if (MPayment.CREDITCARDTYPE_MasterCard.equals(CCType))
sql.append(" AND bap.AcceptMC='Y'");
sql.append(" AND bap.AcceptMC='Y' AND pp.AcceptMC='Y' ");
else if (MPayment.CREDITCARDTYPE_Diners.equals(CCType))
sql.append(" AND bap.AcceptDiners='Y'");
sql.append(" AND bap.AcceptDiners='Y' AND pp.AcceptDiners='Y' ");
else if (MPayment.CREDITCARDTYPE_Discover.equals(CCType))
sql.append(" AND bap.AcceptDiscover='Y'");
sql.append(" AND bap.AcceptDiscover='Y' AND pp.AcceptDiscover='Y' ");
else if (MPayment.CREDITCARDTYPE_PurchaseCard.equals(CCType))
sql.append(" AND bap.AcceptCORPORATE='Y'");
sql.append(" AND bap.AcceptCORPORATE='Y' AND pp.AcceptCORPORATE='Y' ");
sql.append(" ORDER BY ba.IsDefault DESC ");
//
PreparedStatement pstmt = null;
@ -157,6 +159,19 @@ public class MBankAccountProcessor extends X_C_BankAccount_Processor {
setC_PaymentProcessor_ID(C_PaymentProcessor_ID); // FK
}
@Override
protected boolean beforeSave(boolean newRecord)
{
if (getC_PaymentProcessor_ID() > 0 && isActive())
{
MPaymentProcessor pp = new MPaymentProcessor(getCtx(), getC_PaymentProcessor_ID(), get_TrxName());
if (!pp.isActive())
throw new AdempiereException(Msg.translate(getCtx(), "InactivePaymentProcessor") + ". " + pp.toString());
}
return true;
}
/**
* Does Payment Processor accepts tender / CC
* @param TenderType tender type
@ -165,19 +180,40 @@ public class MBankAccountProcessor extends X_C_BankAccount_Processor {
*/
public boolean accepts (String TenderType, String CreditCardType)
{
if ((MPayment.TENDERTYPE_DirectDeposit.equals(TenderType) && isAcceptDirectDeposit())
|| (MPayment.TENDERTYPE_DirectDebit.equals(TenderType) && isAcceptDirectDebit())
|| (MPayment.TENDERTYPE_Check.equals(TenderType) && isAcceptCheck())
//
|| (MPayment.CREDITCARDTYPE_ATM.equals(CreditCardType) && isAcceptATM())
|| (MPayment.CREDITCARDTYPE_Amex.equals(CreditCardType) && isAcceptAMEX())
|| (MPayment.CREDITCARDTYPE_PurchaseCard.equals(CreditCardType) && isAcceptCorporate())
|| (MPayment.CREDITCARDTYPE_Diners.equals(CreditCardType) && isAcceptDiners())
|| (MPayment.CREDITCARDTYPE_Discover.equals(CreditCardType) && isAcceptDiscover())
|| (MPayment.CREDITCARDTYPE_MasterCard.equals(CreditCardType) && isAcceptMC())
|| (MPayment.CREDITCARDTYPE_Visa.equals(CreditCardType) && isAcceptVisa()))
return true;
return false;
if (getC_PaymentProcessor_ID() > 0)
{
MPaymentProcessor pp = new MPaymentProcessor(getCtx(), getC_PaymentProcessor_ID(), get_TrxName());
if ((MPayment.TENDERTYPE_DirectDeposit.equals(TenderType) && isAcceptDirectDeposit() && pp.isAcceptDirectDeposit())
|| (MPayment.TENDERTYPE_DirectDebit.equals(TenderType) && isAcceptDirectDebit() && pp.isAcceptDirectDebit())
|| (MPayment.TENDERTYPE_Check.equals(TenderType) && isAcceptCheck() && pp.isAcceptCheck())
//
|| (MPayment.CREDITCARDTYPE_ATM.equals(CreditCardType) && isAcceptATM() && pp.isAcceptATM())
|| (MPayment.CREDITCARDTYPE_Amex.equals(CreditCardType) && isAcceptAMEX() && pp.isAcceptAMEX())
|| (MPayment.CREDITCARDTYPE_PurchaseCard.equals(CreditCardType) && isAcceptCorporate() && pp.isAcceptCorporate())
|| (MPayment.CREDITCARDTYPE_Diners.equals(CreditCardType) && isAcceptDiners() && pp.isAcceptDiners())
|| (MPayment.CREDITCARDTYPE_Discover.equals(CreditCardType) && isAcceptDiscover() && pp.isAcceptDiscover())
|| (MPayment.CREDITCARDTYPE_MasterCard.equals(CreditCardType) && isAcceptMC() && pp.isAcceptMC())
|| (MPayment.CREDITCARDTYPE_Visa.equals(CreditCardType) && isAcceptVisa() && pp.isAcceptVisa()))
return true;
return false;
}
else
{
if ((MPayment.TENDERTYPE_DirectDeposit.equals(TenderType) && isAcceptDirectDeposit())
|| (MPayment.TENDERTYPE_DirectDebit.equals(TenderType) && isAcceptDirectDebit())
|| (MPayment.TENDERTYPE_Check.equals(TenderType) && isAcceptCheck())
//
|| (MPayment.CREDITCARDTYPE_ATM.equals(CreditCardType) && isAcceptATM())
|| (MPayment.CREDITCARDTYPE_Amex.equals(CreditCardType) && isAcceptAMEX())
|| (MPayment.CREDITCARDTYPE_PurchaseCard.equals(CreditCardType) && isAcceptCorporate())
|| (MPayment.CREDITCARDTYPE_Diners.equals(CreditCardType) && isAcceptDiners())
|| (MPayment.CREDITCARDTYPE_Discover.equals(CreditCardType) && isAcceptDiscover())
|| (MPayment.CREDITCARDTYPE_MasterCard.equals(CreditCardType) && isAcceptMC())
|| (MPayment.CREDITCARDTYPE_Visa.equals(CreditCardType) && isAcceptVisa()))
return true;
return false;
}
} // accepts
public String toString()

View File

@ -1011,17 +1011,19 @@ public final class MPayment extends X_C_Payment
for (int i = 0; i < m_mBankAccountProcessors.length; i++)
{
MBankAccountProcessor bankAccountProcessor = m_mBankAccountProcessors[i];
if (bankAccountProcessor.isAcceptAMEX())
MPaymentProcessor paymentProcessor = new MPaymentProcessor(getCtx(), bankAccountProcessor.getC_PaymentProcessor_ID(), get_TrxName());
if (bankAccountProcessor.isAcceptAMEX() && paymentProcessor.isAcceptAMEX())
map.put (CREDITCARDTYPE_Amex, getCreditCardPair (CREDITCARDTYPE_Amex));
if (bankAccountProcessor.isAcceptDiners())
if (bankAccountProcessor.isAcceptDiners() && paymentProcessor.isAcceptDiners())
map.put (CREDITCARDTYPE_Diners, getCreditCardPair (CREDITCARDTYPE_Diners));
if (bankAccountProcessor.isAcceptDiscover())
if (bankAccountProcessor.isAcceptDiscover() && paymentProcessor.isAcceptDiscover())
map.put (CREDITCARDTYPE_Discover, getCreditCardPair (CREDITCARDTYPE_Discover));
if (bankAccountProcessor.isAcceptMC())
if (bankAccountProcessor.isAcceptMC() && paymentProcessor.isAcceptMC())
map.put (CREDITCARDTYPE_MasterCard, getCreditCardPair (CREDITCARDTYPE_MasterCard));
if (bankAccountProcessor.isAcceptCorporate())
if (bankAccountProcessor.isAcceptCorporate() && paymentProcessor.isAcceptCorporate())
map.put (CREDITCARDTYPE_PurchaseCard, getCreditCardPair (CREDITCARDTYPE_PurchaseCard));
if (bankAccountProcessor.isAcceptVisa())
if (bankAccountProcessor.isAcceptVisa() && paymentProcessor.isAcceptVisa())
map.put (CREDITCARDTYPE_Visa, getCreditCardPair (CREDITCARDTYPE_Visa));
} // for all payment processors
//