From 15af340a586bb66ef8226d4094e786cbb3279097 Mon Sep 17 00:00:00 2001
From: Alejandro Matos <alekosmp86@gmail.com>
Date: Thu, 7 Jan 2021 15:55:19 -0500
Subject: [PATCH] When updating a store, add the missing entries for Issuing
 Company window

---
 .../DigitalCouponsPostProcessHandler.java     | 60 +++++++++++++++++--
 .../DigitalCouponsPropertiesHandler.java      |  8 ++-
 2 files changed, 60 insertions(+), 8 deletions(-)

diff --git a/src/org/openbravo/retail/copystore/digitalcoupons/DigitalCouponsPostProcessHandler.java b/src/org/openbravo/retail/copystore/digitalcoupons/DigitalCouponsPostProcessHandler.java
index 5555d87..b56ad03 100644
--- a/src/org/openbravo/retail/copystore/digitalcoupons/DigitalCouponsPostProcessHandler.java
+++ b/src/org/openbravo/retail/copystore/digitalcoupons/DigitalCouponsPostProcessHandler.java
@@ -49,12 +49,32 @@ public class DigitalCouponsPostProcessHandler extends PostProcessHandler {
    *          The original financial account
    */
   private void processFinancialAccount(CopyStoreProcess process, IssuingCompanyAccount account) {
-    FIN_FinancialAccount finAccount = (FIN_FinancialAccount) process.newObjects
-        .get(FIN_FinancialAccount.ENTITY_NAME + '-' + account.getFinancialAccount().getId());
-    if (finAccount != null && process.isInOrgTree(account.getIssuingCompany())) {
-      IssuingCompanyAccount newICAccount = OBProvider.getInstance()
-          .get(IssuingCompanyAccount.class);
-      process.cloneObject(account, newICAccount, true);
+    if (process.updatingStore) {
+      // get all entries of new store for a specific issuing company account
+      OBCriteria<IssuingCompanyAccount> criICAccounts = OBDal.getInstance()
+          .createCriteria(IssuingCompanyAccount.class);
+      criICAccounts
+          .add(Restrictions.eq(IssuingCompanyAccount.PROPERTY_ORGANIZATION, process.newStore));
+      criICAccounts.add(Restrictions.eq(IssuingCompanyAccount.PROPERTY_ISSUINGCOMPANY,
+          account.getIssuingCompany()));
+      // if there are no entries
+      if (criICAccounts.list().size() == 0) {
+        IssuingCompanyAccount issCmpyAccount = OBProvider.getInstance()
+            .get(IssuingCompanyAccount.class);
+        FIN_FinancialAccount finacc = getFinancialAccount(account.getFinancialAccount(), process);
+        OBDal.getInstance().save(finacc);
+        process.cloneObject(account, issCmpyAccount, true);
+        issCmpyAccount.setFinancialAccount(finacc);
+        OBDal.getInstance().save(issCmpyAccount);
+      }
+    } else {
+      FIN_FinancialAccount finAccount = (FIN_FinancialAccount) process.newObjects
+          .get(FIN_FinancialAccount.ENTITY_NAME + '-' + account.getFinancialAccount().getId());
+      if (finAccount != null && process.isInOrgTree(account.getIssuingCompany())) {
+        IssuingCompanyAccount newICAccount = OBProvider.getInstance()
+            .get(IssuingCompanyAccount.class);
+        process.cloneObject(account, newICAccount, true);
+      }
     }
   }
 
@@ -71,4 +91,32 @@ public class DigitalCouponsPostProcessHandler extends PostProcessHandler {
     criICAccounts.add(Restrictions.eq(IssuingCompanyAccount.PROPERTY_ORGANIZATION, originalStore));
     return criICAccounts.list();
   }
+
+  /**
+   * When updating store, find the matching financial account for the issuing company, if it doesn't
+   * exists, create a new one based on the original financial account
+   * 
+   * @param origFinAcct
+   *          The financial account of the original store for the current issuing company
+   * @param process
+   *          The copy store process
+   * @return The matching financial account for the new store if it exists, or a new one if it
+   *         wasn't found
+   */
+  private FIN_FinancialAccount getFinancialAccount(FIN_FinancialAccount origFinAcct,
+      CopyStoreProcess process) {
+    FIN_FinancialAccount acc = OBProvider.getInstance().get(FIN_FinancialAccount.class);
+    process.cloneObject(origFinAcct, acc, false);
+    OBCriteria<FIN_FinancialAccount> finAcctCriteria = OBDal.getInstance()
+        .createCriteria(FIN_FinancialAccount.class);
+    finAcctCriteria.add(Restrictions.eq(FIN_FinancialAccount.PROPERTY_NAME, acc.getName()));
+    finAcctCriteria
+        .add(Restrictions.eq(FIN_FinancialAccount.PROPERTY_ORGANIZATION, process.newStore));
+    FIN_FinancialAccount existFinAcct = (FIN_FinancialAccount) finAcctCriteria.uniqueResult();
+    if (existFinAcct != null) {
+      return existFinAcct;
+    }
+
+    return acc;
+  }
 }
diff --git a/src/org/openbravo/retail/copystore/digitalcoupons/DigitalCouponsPropertiesHandler.java b/src/org/openbravo/retail/copystore/digitalcoupons/DigitalCouponsPropertiesHandler.java
index f4617d0..62063e6 100644
--- a/src/org/openbravo/retail/copystore/digitalcoupons/DigitalCouponsPropertiesHandler.java
+++ b/src/org/openbravo/retail/copystore/digitalcoupons/DigitalCouponsPropertiesHandler.java
@@ -37,8 +37,12 @@ public class DigitalCouponsPropertiesHandler {
     @Override
     public void handleProperty(String propertyName, BaseOBObject originalObject,
         BaseOBObject newObject, CopyStoreProcess process) {
-      newObject.set(propertyName,
-          getFinancialAccount(((IssuingCompanyAccount) originalObject), process));
+      if (process.updatingStore) {
+        newObject.set(propertyName, ((IssuingCompanyAccount) originalObject).getFinancialAccount());
+      } else {
+        newObject.set(propertyName,
+            getFinancialAccount(((IssuingCompanyAccount) originalObject), process));
+      }
     }
 
     /**
-- 
2.28.0.windows.1

