This is an automated email from the ASF dual-hosted git repository.
nmalin pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
The following commit(s) were added to refs/heads/trunk by this push:
new e67062a6ab Improved: Allow multiple contactMech with same purpose on
ShoppingCart (OFBIZ-13199)
e67062a6ab is described below
commit e67062a6ab7e9ae21c050c1cba9be6cbfc7545f3
Author: Nicolas Malin <[email protected]>
AuthorDate: Thu Jan 23 09:25:59 2025 +0100
Improved: Allow multiple contactMech with same purpose on ShoppingCart
(OFBIZ-13199)
During the shopping cart process, you can add some contactMech to your
order but only one by purpose.
For someone, it would be logical like SHIPPING_LOCATION (although we could
sequence it) but for some case like ORDER_EMAIL it's seem more complicated.
No reason to block multiple email address that will receive order
notification.
For that we authorize the shopping cart to load a unique list of contact
mech id by purpose instead only one
---
.../thirdparty/paypal/PayPalServices.java | 6 +--
.../ofbiz/order/order/CheckoutServices.groovy | 10 ++---
.../ofbiz/order/shoppingcart/ShoppingCart.java | 45 ++++++++++++++--------
.../order/shoppingcart/ShoppingCartServices.java | 2 +-
4 files changed, 37 insertions(+), 26 deletions(-)
diff --git
a/applications/accounting/src/main/java/org/apache/ofbiz/accounting/thirdparty/paypal/PayPalServices.java
b/applications/accounting/src/main/java/org/apache/ofbiz/accounting/thirdparty/paypal/PayPalServices.java
index 3c1888fea3..730676f69e 100644
---
a/applications/accounting/src/main/java/org/apache/ofbiz/accounting/thirdparty/paypal/PayPalServices.java
+++
b/applications/accounting/src/main/java/org/apache/ofbiz/accounting/thirdparty/paypal/PayPalServices.java
@@ -484,7 +484,7 @@ public class PayPalServices {
return ServiceUtil.returnError(e.getMessage());
}
}
- cart.addContactMech("ORDER_EMAIL", emailContactMechId);
+ cart.addContactMechId("ORDER_EMAIL", emailContactMechId);
// Phone number
String phoneNumber = decoder.get("PHONENUM");
@@ -508,7 +508,7 @@ public class PayPalServices {
try {
outMap = dispatcher.runSync("createUpdatePartyTelecomNumber",
inMap);
phoneContactId = (String) outMap.get("contactMechId");
- cart.addContactMech("PHONE_BILLING", phoneContactId);
+ cart.addContactMechId("PHONE_BILLING", phoneContactId);
} catch (GenericServiceException e) {
Debug.logError(e, MODULE);
}
@@ -517,7 +517,7 @@ public class PayPalServices {
String postalContactId = null;
boolean needsShippingPurpose = true;
// if the cart for some reason already has a billing address, we'll
leave it be
- boolean needsBillingPurpose = (cart.getContactMech("BILLING_LOCATION")
== null);
+ boolean needsBillingPurpose =
(cart.getContactMechId("BILLING_LOCATION") == null);
Map<String, Object> postalMap = new HashMap<>();
postalMap.put("toName", decoder.get("SHIPTONAME"));
postalMap.put("address1", decoder.get("SHIPTOSTREET"));
diff --git
a/applications/order/src/main/groovy/org/apache/ofbiz/order/order/CheckoutServices.groovy
b/applications/order/src/main/groovy/org/apache/ofbiz/order/order/CheckoutServices.groovy
index eb69276ced..f799ef1cc2 100644
---
a/applications/order/src/main/groovy/org/apache/ofbiz/order/order/CheckoutServices.groovy
+++
b/applications/order/src/main/groovy/org/apache/ofbiz/order/order/CheckoutServices.groovy
@@ -86,7 +86,7 @@ Map createUpdateCustomerAndShippingAddress() {
result.shipToPhoneContactMechId = serviceResultCUPTN.contactMechId
if (shipToPhoneContactMechId) {
- shoppingCart.addContactMech('PHONE_SHIPPING', shipToPhoneContactMechId)
+ shoppingCart.addContactMechId('PHONE_SHIPPING',
shipToPhoneContactMechId)
}
// Create Update email address
Map createUpdatePartyEmailCtx = emailAddressCtx
@@ -98,10 +98,10 @@ Map createUpdateCustomerAndShippingAddress() {
result.emailContactMechId = serviceResultCUPEM.contactMechId
result.partyId = partyId
if (parameters.emailContactMechId) {
- shoppingCart.addContactMech('ORDER_EMAIL',
parameters.emailContactMechId)
+ shoppingCart.addContactMechId('ORDER_EMAIL',
parameters.emailContactMechId)
}
shoppingCart.setUserLogin(userLogin, dispatcher)
- shoppingCart.addContactMech('SHIPPING_LOCATION',
parameters.shipToContactMechId)
+ shoppingCart.addContactMechId('SHIPPING_LOCATION',
parameters.shipToContactMechId)
shoppingCart.setAllShippingContactMechId(parameters.shipToContactMechId)
shoppingCart.setOrderPartyId(partyId)
return result
@@ -149,7 +149,7 @@ Map createUpdateBillingAddressAndPaymentMethod() {
parameters.billToContactMechId = serviceResultCUBA.contactMechId
result.contactMechId = serviceResultCUBA.contactMechId
if (parameters.billToContactMechId) {
- shoppingCart.addContactMech('BILLING_LOCATION',
parameters.billToContactMechId)
+ shoppingCart.addContactMechId('BILLING_LOCATION',
parameters.billToContactMechId)
}
// Create Update Billing Telecom Number
Map createUpdatePartyTelecomNumberCtx = billToPhoneContext
@@ -165,7 +165,7 @@ Map createUpdateBillingAddressAndPaymentMethod() {
String billToPhoneContactMechId = serviceResultCUPTN.contactMechId
result.billToPhoneContactMechId = serviceResultCUPTN.contactMechId
if (billToPhoneContactMechId) {
- shoppingCart.addContactMech('PHONE_BILLING', billToPhoneContactMechId)
+ shoppingCart.addContactMechId('PHONE_BILLING',
billToPhoneContactMechId)
}
// Create Update credit card
Map creditCartCtx = parameters
diff --git
a/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCart.java
b/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCart.java
index 431c6cfb12..196cb99c16 100644
---
a/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCart.java
+++
b/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCart.java
@@ -139,7 +139,7 @@ public class ShoppingCart implements
Iterable<ShoppingCartItem>, Serializable {
private long nextGroupNumber = 1;
private List<CartPaymentInfo> paymentInfo = new LinkedList<>();
private List<CartShipInfo> shipInfo = new LinkedList<>();
- private Map<String, String> contactMechIdsMap = new HashMap<>();
+ private Map<String, Set<String>> contactMechIdsMap = new HashMap<>();
private Map<String, String> orderAttributes = new HashMap<>();
private Map<String, Object> attributes = new HashMap<>(); // user defined
attributes
// Lists of internal/public notes: when the order is stored they are
transformed into OrderHeaderNotes
@@ -3465,28 +3465,41 @@ public class ShoppingCart implements
Iterable<ShoppingCartItem>, Serializable {
}
/** Add a contact mech to this purpose; the contactMechPurposeTypeId is
required */
- public void addContactMech(String contactMechPurposeTypeId, String
contactMechId) {
+ public void addContactMechId(String contactMechPurposeTypeId, String
contactMechId) {
if (contactMechPurposeTypeId == null) {
throw new IllegalArgumentException("You must specify a
contactMechPurposeTypeId to add a ContactMech");
}
- contactMechIdsMap.put(contactMechPurposeTypeId, contactMechId);
+ UtilMisc.addToSetInMap(contactMechId, contactMechIdsMap,
contactMechPurposeTypeId);
}
/** Get the contactMechId for this cart given the contactMechPurposeTypeId
*/
- public String getContactMech(String contactMechPurposeTypeId) {
- return contactMechIdsMap.get(contactMechPurposeTypeId);
+ public String getContactMechId(String contactMechPurposeTypeId) {
+ return
UtilValidate.isNotEmpty(getContactMechIds(contactMechPurposeTypeId))
+ ? getContactMechIds(contactMechPurposeTypeId).get(0)
+ : null;
}
- /** Remove the contactMechId from this cart given the
contactMechPurposeTypeId */
- public String removeContactMech(String contactMechPurposeTypeId) {
- return contactMechIdsMap.remove(contactMechPurposeTypeId);
+ /** Get the contactMechIds list for this cart given the
contactMechPurposeTypeId */
+ public List<String> getContactMechIds(String contactMechPurposeTypeId) {
+ Set<String> contactMechIds =
contactMechIdsMap.get(contactMechPurposeTypeId);
+ return contactMechIds != null
+ ? new ArrayList<>(contactMechIds)
+ : List.of();
+ }
+
+ /** Remove the contactMechIds list from this cart given the
contactMechPurposeTypeId */
+ public List<String> removeContactMechId(String contactMechPurposeTypeId) {
+ Set<String> contactMechIds =
contactMechIdsMap.remove(contactMechPurposeTypeId);
+ return contactMechIds != null
+ ? new ArrayList<>(contactMechIds)
+ : List.of();
}
/**
* Gets order contact mech ids.
* @return the order contact mech ids
*/
- public Map<String, String> getOrderContactMechIds() {
+ public Map<String, Set<String>> getOrderContactMechIds() {
return this.contactMechIdsMap;
}
@@ -4616,17 +4629,15 @@ public class ShoppingCart implements
Iterable<ShoppingCartItem>, Serializable {
public List<GenericValue> makeAllOrderContactMechs() {
List<GenericValue> allOrderContactMechs = new LinkedList<>();
- Map<String, String> contactMechIds = this.getOrderContactMechIds();
-
+ Map<String, Set<String>> contactMechIds =
this.getOrderContactMechIds();
if (contactMechIds != null) {
- for (Map.Entry<String, String> entry : contactMechIds.entrySet()) {
- GenericValue orderContactMech =
getDelegator().makeValue("OrderContactMech");
- orderContactMech.set("contactMechPurposeTypeId",
entry.getKey());
- orderContactMech.set("contactMechId", entry.getValue());
- allOrderContactMechs.add(orderContactMech);
+ for (Map.Entry<String, Set<String>> entry :
contactMechIds.entrySet()) {
+ entry.getValue().forEach(contactMechId ->
+
allOrderContactMechs.add(getDelegator().makeValue("OrderContactMech",
+ Map.of("contactMechPurposeTypeId",
entry.getKey(),
+ "contactMechId", contactMechId))));
}
}
-
return allOrderContactMechs;
}
diff --git
a/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCartServices.java
b/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCartServices.java
index d25583c86b..20f2dd8493 100644
---
a/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCartServices.java
+++
b/applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/ShoppingCartServices.java
@@ -329,7 +329,7 @@ public class ShoppingCartServices {
}
if (UtilValidate.isNotEmpty(orderContactMechs)) {
for (GenericValue orderContactMech : orderContactMechs) {
-
cart.addContactMech(orderContactMech.getString("contactMechPurposeTypeId"),
orderContactMech.getString("contactMechId"));
+
cart.addContactMechId(orderContactMech.getString("contactMechPurposeTypeId"),
orderContactMech.getString("contactMechId"));
}
}
List<GenericValue> orderItemShipGroupList =
orh.getOrderItemShipGroups();