Skip to content

Commit

Permalink
Sales Order: add onComplete validator for PayPal PaymentRule without …
Browse files Browse the repository at this point in the history
…contact

#6579
  • Loading branch information
TheBestPessimist committed May 6, 2020
1 parent 757677a commit 356094f
Show file tree
Hide file tree
Showing 2 changed files with 141 additions and 35 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
-- 2020-05-06T06:18:34.068Z
-- I forgot to set the DICTIONARY_ID_COMMENTS System Configurator
INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,AD_Org_ID,EntityType) VALUES ('I','Please select a contact with valid email address.',0,'Y',TO_TIMESTAMP('2020-05-06 09:18:33','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-05-06 09:18:33','YYYY-MM-DD HH24:MI:SS'),100,544982,'de.metas.order.model.interceptor.C_Order.PleaseSelectAContactWithValidEmailAddress ',0,'D')
;

-- 2020-05-06T06:18:34.078Z
-- I forgot to set the DICTIONARY_ID_COMMENTS System Configurator
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy) 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 FROM AD_Language l, AD_Message t WHERE l.IsActive='Y'AND (l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N') AND t.AD_Message_ID=544982 AND NOT EXISTS (SELECT 1 FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;

-- 2020-05-06T06:18:45.274Z
-- I forgot to set the DICTIONARY_ID_COMMENTS System Configurator
UPDATE AD_Message_Trl SET MsgText='Bitte einen Kontakt mit gültiger E-Mail-Adresse auswählen.', IsTranslated='Y',Updated=TO_TIMESTAMP('2020-05-06 09:18:45','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Language='de_CH' AND AD_Message_ID=544982
;

-- 2020-05-06T06:18:47.403Z
-- I forgot to set the DICTIONARY_ID_COMMENTS System Configurator
UPDATE AD_Message_Trl SET IsTranslated='Y',Updated=TO_TIMESTAMP('2020-05-06 09:18:47','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Language='en_US' AND AD_Message_ID=544982
;

-- 2020-05-06T06:18:54.332Z
-- I forgot to set the DICTIONARY_ID_COMMENTS System Configurator
UPDATE AD_Message SET MsgText='Bitte einen Kontakt mit gültiger E-Mail-Adresse auswählen.',Updated=TO_TIMESTAMP('2020-05-06 09:18:54','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=544982
;

-- 2020-05-06T06:24:52.344Z
-- I forgot to set the DICTIONARY_ID_COMMENTS System Configurator
UPDATE AD_Message SET Value='de.metas.order.model.interceptor.C_Order.PleaseSelectAContactWithValidEmailAddress',Updated=TO_TIMESTAMP('2020-05-06 09:24:52','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=544982
;

Original file line number Diff line number Diff line change
@@ -1,42 +1,8 @@
package de.metas.order.model.interceptor;

import java.util.List;
import java.util.Optional;

import org.adempiere.ad.callout.annotations.Callout;
import org.adempiere.ad.callout.annotations.CalloutMethod;
import org.adempiere.ad.dao.IQueryBL;
import org.adempiere.ad.modelvalidator.annotations.DocValidate;
import org.adempiere.ad.modelvalidator.annotations.Interceptor;
import org.adempiere.ad.modelvalidator.annotations.ModelChange;
import org.adempiere.model.InterfaceWrapperHelper;
import org.adempiere.service.ISysConfigBL;
import org.compiere.model.I_C_Payment;
import org.compiere.model.I_M_PriceList;
import org.compiere.model.ModelValidator;

import com.google.common.annotations.VisibleForTesting;

import de.metas.adempiere.model.I_C_Order;
import de.metas.interfaces.I_C_OrderLine;
import de.metas.order.DeliveryViaRule;
import de.metas.order.IOrderBL;
import de.metas.order.IOrderDAO;
import de.metas.order.IOrderLineBL;
import de.metas.order.IOrderLinePricingConditions;
import de.metas.organization.OrgId;
import de.metas.payment.api.IPaymentDAO;
import de.metas.pricing.service.IPriceListDAO;
import de.metas.util.Check;
import de.metas.util.Services;
import de.metas.util.lang.ExternalId;
import lombok.NonNull;

/*
* #%L
* de.metas.business
* %%
* Copyright (C) 2016 metas GmbH
* Copyright (C) 2020 metas GmbH
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
Expand All @@ -54,6 +20,50 @@
* #L%
*/

package de.metas.order.model.interceptor;

import com.google.common.annotations.VisibleForTesting;
import de.metas.adempiere.model.I_C_Order;
import de.metas.bpartner.BPartnerContactId;
import de.metas.bpartner.service.IBPartnerDAO;
import de.metas.i18n.AdMessageKey;
import de.metas.i18n.IMsgBL;
import de.metas.i18n.ITranslatableString;
import de.metas.interfaces.I_C_OrderLine;
import de.metas.order.DeliveryViaRule;
import de.metas.order.IOrderBL;
import de.metas.order.IOrderDAO;
import de.metas.order.IOrderLineBL;
import de.metas.order.IOrderLinePricingConditions;
import de.metas.organization.OrgId;
import de.metas.payment.PaymentRule;
import de.metas.payment.api.IPaymentDAO;
import de.metas.payment.reservation.PaymentReservationService;
import de.metas.pricing.service.IPriceListDAO;
import de.metas.util.Check;
import de.metas.util.Services;
import de.metas.util.lang.ExternalId;
import lombok.NonNull;
import org.adempiere.ad.callout.annotations.Callout;
import org.adempiere.ad.callout.annotations.CalloutMethod;
import org.adempiere.ad.callout.api.ICalloutField;
import org.adempiere.ad.dao.IQueryBL;
import org.adempiere.ad.modelvalidator.annotations.DocValidate;
import org.adempiere.ad.modelvalidator.annotations.Interceptor;
import org.adempiere.ad.modelvalidator.annotations.ModelChange;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.model.InterfaceWrapperHelper;
import org.adempiere.service.ISysConfigBL;
import org.compiere.SpringContextHolder;
import org.compiere.model.I_C_Payment;
import org.compiere.model.I_M_PriceList;
import org.compiere.model.ModelValidator;
import org.compiere.util.Env;

import javax.annotation.Nullable;
import java.util.List;
import java.util.Optional;

@Interceptor(I_C_Order.class)
@Callout(I_C_Order.class)
public class C_Order
Expand All @@ -62,6 +72,7 @@ public class C_Order

@VisibleForTesting
public static final String AUTO_ASSIGN_TO_SALES_ORDER_BY_EXTERNAL_ORDER_ID_SYSCONFIG = "de.metas.payment.autoAssignToSalesOrderByExternalOrderId.enabled";
private static final AdMessageKey MSG_SELECT_CONTACT_WITH_VALID_EMAIL = AdMessageKey.of("de.metas.order.model.interceptor.C_Order.PleaseSelectAContactWithValidEmailAddress");

private C_Order()
{
Expand Down Expand Up @@ -204,9 +215,74 @@ public void unlinkSalesOrders(final I_C_Order order)
@DocValidate(timings = ModelValidator.TIMING_BEFORE_COMPLETE)
public void checkPricingConditionsInOrderLines(final I_C_Order order)
{
checkPaymentRuleWithReservation(order);
Services.get(IOrderLinePricingConditions.class).failForMissingPricingConditions(order);
}

@CalloutMethod(columnNames = I_C_Order.COLUMNNAME_PaymentRule)
public void checkPaymentRuleWithReservation(@NonNull final I_C_Order salesOrder, @NonNull final ICalloutField calloutField)
{
final AdMessageKey errorMessage = checkNeedsAndHasContactWithValidEmail(salesOrder);

if (errorMessage != null)
{
final ITranslatableString msgText = Services.get(IMsgBL.class).getTranslatableMsgText(errorMessage);
calloutField.fireDataStatusEEvent(
msgText.translate(Env.getAD_Language()),
msgText.translate(Env.getAD_Language()), // this appears onHover
true);
}
else
{
// TODO teo: there's no way to remove the callout error right now, unless the user reloads the page.
// It will always appear when changing the PaymentRule after it was set once.
}
}

private void checkPaymentRuleWithReservation(@NonNull final I_C_Order salesOrder)
{
final AdMessageKey errorMessage = checkNeedsAndHasContactWithValidEmail(salesOrder);

if (errorMessage != null)
{
throw new AdempiereException(errorMessage);
}
}

@Nullable
private AdMessageKey checkNeedsAndHasContactWithValidEmail(@NonNull final I_C_Order salesOrder)
{
if (!salesOrder.isSOTrx())
{
return null;
}

final PaymentRule paymentRule = PaymentRule.ofCode(salesOrder.getPaymentRule());

final PaymentReservationService paymentReservationService = SpringContextHolder.instance.getBean(PaymentReservationService.class);
if (!paymentReservationService.isPaymentReservationRequired(paymentRule))
{
return null;
}

final IOrderBL ordersService = Services.get(IOrderBL.class);
final boolean hasBillToContactId = ordersService.hasBillToContactId(salesOrder);
if (!hasBillToContactId)
{
return MSG_SELECT_CONTACT_WITH_VALID_EMAIL;
}

final BPartnerContactId billToContactId = ordersService.getBillToContactId(salesOrder);
final IBPartnerDAO bpartnerDAO = Services.get(IBPartnerDAO.class);

if (!bpartnerDAO.hasEmailAddress(billToContactId))
{
return MSG_SELECT_CONTACT_WITH_VALID_EMAIL;
}

return null;
}

@DocValidate(timings = ModelValidator.TIMING_AFTER_COMPLETE)
public void linkWithPaymentByExternalOrderId(@NonNull final I_C_Order order)
{
Expand Down

0 comments on commit 356094f

Please sign in to comment.