| Attached Files |   saftpt.diff [^] (9,350 bytes) 2021-11-22 11:43 [Show Content] [Hide Content]diff --git a/src-db/database/sourcedata/AD_REF_LIST.xml b/src-db/database/sourcedata/AD_REF_LIST.xml
index 381861c1bd2397b081cfa1f773e9483d26e00c9f..888d66a0af2e00b18cf2a0b8d199ad4d33b55473 100644
--- a/src-db/database/sourcedata/AD_REF_LIST.xml
+++ b/src-db/database/sourcedata/AD_REF_LIST.xml
@@ -47,6 +47,17 @@
 <!--0679356FA2C645C894203D274F82F5E1-->  <AD_MODULE_ID><![CDATA[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]]></AD_MODULE_ID>
 <!--0679356FA2C645C894203D274F82F5E1--></AD_REF_LIST>
 
+<!--0CE0D13E80394E5B9272E4A5A539F942--><AD_REF_LIST>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <AD_REF_LIST_ID><![CDATA[0CE0D13E80394E5B9272E4A5A539F942]]></AD_REF_LIST_ID>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <VALUE><![CDATA[SAFT_RootOrgDuplicatedNIF]]></VALUE>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <NAME><![CDATA[Root organization to verify duplicated NIF]]></NAME>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <AD_REFERENCE_ID><![CDATA[A26BA480E2014707B47257024C3CBFF7]]></AD_REFERENCE_ID>
+<!--0CE0D13E80394E5B9272E4A5A539F942-->  <AD_MODULE_ID><![CDATA[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]]></AD_MODULE_ID>
+<!--0CE0D13E80394E5B9272E4A5A539F942--></AD_REF_LIST>
+
 <!--1BFDDEEC636541CDB5AE5098421C3B13--><AD_REF_LIST>
 <!--1BFDDEEC636541CDB5AE5098421C3B13-->  <AD_REF_LIST_ID><![CDATA[1BFDDEEC636541CDB5AE5098421C3B13]]></AD_REF_LIST_ID>
 <!--1BFDDEEC636541CDB5AE5098421C3B13-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff --git a/src/com/practicsbs/saftpt/SaftUtility.java b/src/com/practicsbs/saftpt/SaftUtility.java
index 3d2d05955f757bd1961145d537357c3f841ee7c9..c76068ab687ca150aff41398677fd936e2d28945 100644
--- a/src/com/practicsbs/saftpt/SaftUtility.java
+++ b/src/com/practicsbs/saftpt/SaftUtility.java
@@ -25,11 +25,14 @@ import org.openbravo.dal.security.OrganizationStructureProvider;
 import org.openbravo.dal.service.OBCriteria;
 import org.openbravo.dal.service.OBDal;
 import org.openbravo.database.ConnectionProvider;
+import org.openbravo.erpCommon.businessUtility.Preferences;
 import org.openbravo.erpCommon.utility.OBError;
 import org.openbravo.erpCommon.utility.OBMessageUtils;
+import org.openbravo.erpCommon.utility.PropertyException;
 import org.openbravo.erpCommon.utility.Utility;
 import org.openbravo.model.ad.system.Client;
 import org.openbravo.model.ad.utility.Sequence;
+import org.openbravo.model.common.businesspartner.BusinessPartner;
 import org.openbravo.model.common.enterprise.DocumentType;
 import org.openbravo.model.common.enterprise.Organization;
 import org.openbravo.model.common.invoice.Invoice;
@@ -45,6 +48,8 @@ public class SaftUtility {
 
   private static Logger logger = Logger.getLogger(SaftUtility.class);
 
+  private static final String ROOTORGDUPLICATEDNIF_PREFERENCE = "SAFT_RootOrgDuplicatedNIF";
+
   private static final String NIF_FORMAT = "([123568]\\d{1}|45|7[0124579]|9[0189])(\\d{7})";
   public static final String SUCCESS = "Success";
   public static final String ERROR = "Error";
@@ -463,6 +468,64 @@ public class SaftUtility {
     }
   }
 
+  /**
+   * Check if the tax id value already exists in a given set of Organizations from the result.
+   * 
+   * @param taxId
+   *          The new Tax ID to check.
+   * @param businessPartnerId
+   *          Id of the current business partner where the Tax ID is going to be set.
+   * @param rootOrg
+   *          Set of organization where it is necessary to check for duplicated Tax ID's.
+   * 
+   * 
+   * @return If the Tax ID already exists or not.
+   */
+  public static boolean isNifDuplicated(String taxId, String businessPartnerId, String rootOrgId) {
+
+    Set<String> orgTree = OBContext.getOBContext()
+        .getOrganizationStructureProvider()
+        .getChildTree(rootOrgId, true);
+
+    String contextOrgId = OBContext.getOBContext().getCurrentOrganization().getId();
+
+    if (!orgTree.contains(contextOrgId)) {
+      return false;
+    }
+
+    if (SaftUtility.isEmpty(taxId) || SaftUtility.isGenericNif(taxId) || taxId == null) {
+      return false;
+    }
+
+    // BusinessPartner with the same Tax ID:
+    OBCriteria<BusinessPartner> bpCriteria = OBDal.getInstance()
+        .createCriteria(BusinessPartner.class);
+    bpCriteria.setFilterOnReadableOrganization(false);
+    bpCriteria.add(Restrictions.eq(BusinessPartner.PROPERTY_TAXID, taxId).ignoreCase());
+    bpCriteria.add(Restrictions.ne(BusinessPartner.PROPERTY_ID, businessPartnerId));
+    bpCriteria.add(Restrictions.in(BusinessPartner.PROPERTY_ORGANIZATION + ".id",
+        (Object[]) orgTree.toArray()));
+
+    if (bpCriteria.count() > 0) {
+      return true;
+    }
+
+    return false;
+  }
+
+  public static String isPreferenceRootOrgDuplicatedNIF() {
+    String rootOrganizationID = null;
+    try {
+      rootOrganizationID = Preferences.getPreferenceValue(ROOTORGDUPLICATEDNIF_PREFERENCE, true,
+          OBContext.getOBContext().getCurrentClient(),
+          OBContext.getOBContext().getCurrentOrganization(), OBContext.getOBContext().getUser(),
+          OBContext.getOBContext().getRole(), null);
+    } catch (PropertyException pe) {
+      // Pref not defined
+    }
+    return rootOrganizationID;
+  }
+
   public static JSONObject createSuccessProcessMessage(String message, boolean retryExecution)
       throws JSONException {
     return createPickAndExecuteMessage(message, SaftUtility.getMessageFromBD("OBUIAPP_Success"),
diff --git a/src/com/practicsbs/saftpt/handler/SaftBPartnerFieldsHandler.java b/src/com/practicsbs/saftpt/handler/SaftBPartnerFieldsHandler.java
index ebc8a008f622b1c9b5e80435ecd92c520dcaec28..1d336c2d63abe28d43c97907dd81c99bd0bd2145 100644
--- a/src/com/practicsbs/saftpt/handler/SaftBPartnerFieldsHandler.java
+++ b/src/com/practicsbs/saftpt/handler/SaftBPartnerFieldsHandler.java
@@ -2,16 +2,15 @@ package com.practicsbs.saftpt.handler;
 
 import javax.enterprise.event.Observes;
 
-import org.hibernate.criterion.Restrictions;
 import org.openbravo.base.exception.OBException;
 import org.openbravo.base.model.Entity;
 import org.openbravo.base.model.ModelProvider;
 import org.openbravo.base.model.Property;
 import org.openbravo.client.kernel.event.EntityNewEvent;
 import org.openbravo.client.kernel.event.EntityUpdateEvent;
-import org.openbravo.dal.service.OBCriteria;
 import org.openbravo.dal.service.OBDal;
 import org.openbravo.model.common.businesspartner.BusinessPartner;
+import org.openbravo.model.common.enterprise.Organization;
 
 import com.practicsbs.saftpt.SaftUtility;
 import com.practicsbs.saftpt.data.Utils;
@@ -31,9 +30,13 @@ public class SaftBPartnerFieldsHandler extends SaftFieldsHandler {
     }
     BusinessPartner bPartner = (BusinessPartner) event.getTargetInstance();
 
-    // NIF Duplicated:
-    if (isNifDuplicated(bPartner)) {
-      throw new OBException(SaftUtility.getMessageFromBD("SAFT_DuplicatedNIF"));
+    String rootOrgDuplicatedNif = SaftUtility.isPreferenceRootOrgDuplicatedNIF();
+    if (rootOrgDuplicatedNif != null) {
+      Organization rootOrg = OBDal.getInstance().get(Organization.class, rootOrgDuplicatedNif);
+      // NIF Duplicated:
+      if (SaftUtility.isNifDuplicated(bPartner.getTaxID(), bPartner.getId(), rootOrg.getId())) {
+        throw new OBException(SaftUtility.getMessageFromBD("SAFT_DuplicatedNIF"));
+      }
     }
 
     // Portuguese NIF Valid:
@@ -49,9 +52,14 @@ public class SaftBPartnerFieldsHandler extends SaftFieldsHandler {
     BusinessPartner bPartner = (BusinessPartner) event.getTargetInstance();
     boolean hasNIFChanged = hasNIFChanged(bPartner, event);
 
-    // NIF Duplicated:
-    if (hasNIFChanged && isNifDuplicated(bPartner)) {
-      throw new OBException(SaftUtility.getMessageFromBD("SAFT_DuplicatedNIF"));
+    String rootOrgDuplicatedNif = SaftUtility.isPreferenceRootOrgDuplicatedNIF();
+    if (rootOrgDuplicatedNif != null) {
+      Organization rootOrg = OBDal.getInstance().get(Organization.class, rootOrgDuplicatedNif);
+      // NIF Duplicated:
+      if (hasNIFChanged
+          && SaftUtility.isNifDuplicated(bPartner.getTaxID(), bPartner.getId(), rootOrg.getId())) {
+        throw new OBException(SaftUtility.getMessageFromBD("SAFT_DuplicatedNIF"));
+      }
     }
 
     // Portuguese NIF Valid:
@@ -135,24 +143,4 @@ public class SaftBPartnerFieldsHandler extends SaftFieldsHandler {
     return true;
   }
 
-  private boolean isNifDuplicated(BusinessPartner bPartner) {
-    String taxId = bPartner.getTaxID();
-
-    if (SaftUtility.isEmpty(taxId) || SaftUtility.isGenericNif(taxId)) {
-      return false;
-    }
-
-    // BusinessPartner with the same Tax ID:
-    OBCriteria<BusinessPartner> bpCriteria = OBDal.getInstance()
-        .createCriteria(BusinessPartner.class);
-    bpCriteria.add(Restrictions.eq(BusinessPartner.PROPERTY_TAXID, bPartner.getTaxID()));
-    bpCriteria.add(Restrictions.ne(BusinessPartner.PROPERTY_ID, bPartner.getId()));
-
-    if (bpCriteria.count() > 0) {
-      return true;
-    }
-
-    return false;
-  }
-
 }
 
  saftpt.retail.diff [^] (5,645 bytes) 2021-11-22 11:43 [Show Content] [Hide Content]diff --git a/src-db/database/sourcedata/AD_MESSAGE.xml b/src-db/database/sourcedata/AD_MESSAGE.xml
index b894398d932a598bc4489ab24af236355f405c9a..16bf3af4d1dc244fb525e9fed66682bba61b91ad 100644
--- a/src-db/database/sourcedata/AD_MESSAGE.xml
+++ b/src-db/database/sourcedata/AD_MESSAGE.xml
@@ -481,6 +481,18 @@
 <!--AC5735FC4B1D4DC0818B4AC2B2981733-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
 <!--AC5735FC4B1D4DC0818B4AC2B2981733--></AD_MESSAGE>
 
+<!--B257BAB9053043228C7362806BFB69E9--><AD_MESSAGE>
+<!--B257BAB9053043228C7362806BFB69E9-->  <AD_MESSAGE_ID><![CDATA[B257BAB9053043228C7362806BFB69E9]]></AD_MESSAGE_ID>
+<!--B257BAB9053043228C7362806BFB69E9-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--B257BAB9053043228C7362806BFB69E9-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--B257BAB9053043228C7362806BFB69E9-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--B257BAB9053043228C7362806BFB69E9-->  <VALUE><![CDATA[SAFTR_DuplicatedTaxId]]></VALUE>
+<!--B257BAB9053043228C7362806BFB69E9-->  <MSGTEXT><![CDATA[Duplicated Tax ID]]></MSGTEXT>
+<!--B257BAB9053043228C7362806BFB69E9-->  <MSGTYPE><![CDATA[I]]></MSGTYPE>
+<!--B257BAB9053043228C7362806BFB69E9-->  <AD_MODULE_ID><![CDATA[8257C8776A0A4FB6A9284E3D3B8B6B26]]></AD_MODULE_ID>
+<!--B257BAB9053043228C7362806BFB69E9-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
+<!--B257BAB9053043228C7362806BFB69E9--></AD_MESSAGE>
+
 <!--B5221C8EF5704B8B8AC39058BAB99074--><AD_MESSAGE>
 <!--B5221C8EF5704B8B8AC39058BAB99074-->  <AD_MESSAGE_ID><![CDATA[B5221C8EF5704B8B8AC39058BAB99074]]></AD_MESSAGE_ID>
 <!--B5221C8EF5704B8B8AC39058BAB99074-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff --git a/src-db/database/sourcedata/OBMOBC_SERVICES.xml b/src-db/database/sourcedata/OBMOBC_SERVICES.xml
index 7d94df5875108846d2015880b9af9ba034974377..f54eecd32fc752c31e3eabf37167d72cb7cc2a43 100644
--- a/src-db/database/sourcedata/OBMOBC_SERVICES.xml
+++ b/src-db/database/sourcedata/OBMOBC_SERVICES.xml
@@ -34,4 +34,17 @@
 <!--750D2264212749769E23921F9955652F-->  <SERVER_RUNTIME><![CDATA[OBSTSYN_ON_CENTRAL]]></SERVER_RUNTIME>
 <!--750D2264212749769E23921F9955652F--></OBMOBC_SERVICES>
 
+<!--CAC1601327F04DF2A97872AB6D370282--><OBMOBC_SERVICES>
+<!--CAC1601327F04DF2A97872AB6D370282-->  <OBMOBC_SERVICES_ID><![CDATA[CAC1601327F04DF2A97872AB6D370282]]></OBMOBC_SERVICES_ID>
+<!--CAC1601327F04DF2A97872AB6D370282-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--CAC1601327F04DF2A97872AB6D370282-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--CAC1601327F04DF2A97872AB6D370282-->  <AD_MODULE_ID><![CDATA[8257C8776A0A4FB6A9284E3D3B8B6B26]]></AD_MODULE_ID>
+<!--CAC1601327F04DF2A97872AB6D370282-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--CAC1601327F04DF2A97872AB6D370282-->  <SERVICE><![CDATA[com.practicsbs.saftpt.retail.service.CheckDuplicatedFiscalDocument]]></SERVICE>
+<!--CAC1601327F04DF2A97872AB6D370282-->  <DESCRIPTION><![CDATA[Chek duplicated tax id service]]></DESCRIPTION>
+<!--CAC1601327F04DF2A97872AB6D370282-->  <ROUTINGTYPE><![CDATA[Failover]]></ROUTINGTYPE>
+<!--CAC1601327F04DF2A97872AB6D370282-->  <DEFAULTTIMEOUT><![CDATA[15]]></DEFAULTTIMEOUT>
+<!--CAC1601327F04DF2A97872AB6D370282-->  <SERVER_RUNTIME><![CDATA[OBSTSYN_ON_CENTRAL]]></SERVER_RUNTIME>
+<!--CAC1601327F04DF2A97872AB6D370282--></OBMOBC_SERVICES>
+
 </data>
diff --git a/src/com/practicsbs/saftpt/retail/service/CheckDuplicatedFiscalDocument.java b/src/com/practicsbs/saftpt/retail/service/CheckDuplicatedFiscalDocument.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb34294e75daaab05065c5862d380510b2edc9ea
--- /dev/null
+++ b/src/com/practicsbs/saftpt/retail/service/CheckDuplicatedFiscalDocument.java
@@ -0,0 +1,57 @@
+package com.practicsbs.saftpt.retail.service;
+
+import javax.servlet.ServletException;
+
+import org.apache.log4j.Logger;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.openbravo.dal.core.OBContext;
+import org.openbravo.dal.service.OBDal;
+import org.openbravo.mobile.core.process.JSONProcessSimple;
+import org.openbravo.model.common.enterprise.Organization;
+
+import com.practicsbs.saftpt.SaftUtility;
+
+public class CheckDuplicatedFiscalDocument extends JSONProcessSimple {
+  private static Logger logger = Logger.getLogger(CheckDuplicatedFiscalDocument.class);
+
+  @Override
+  public JSONObject exec(JSONObject jsonsent) throws JSONException, ServletException {
+    final JSONObject data = new JSONObject();
+    final JSONObject result = new JSONObject();
+
+    OBContext.setAdminMode(false);
+    try {
+      String taxId = jsonsent.optString("taxId");
+      String businessPartnerId = jsonsent.optString("businessPartnerId");
+
+      String rootOrgDuplicatedNif = SaftUtility.isPreferenceRootOrgDuplicatedNIF();
+      if (rootOrgDuplicatedNif != null) {
+        Organization rootOrg = OBDal.getInstance().get(Organization.class, rootOrgDuplicatedNif);
+
+        if (rootOrg != null) {
+          boolean duplicated = SaftUtility.isNifDuplicated(taxId, businessPartnerId,
+              rootOrg.getId());
+
+          data.put("status", 0);
+          result.put("duplicated", duplicated);
+          data.put("data", result);
+          return data;
+        }
+      }
+      data.put("status", 0);
+      result.put("duplicated", false);
+      data.put("data", result);
+    } catch (Exception e) {
+      logger.error(e.getMessage(), e);
+      result.put("message", e.getMessage());
+      data.put("status", 0);
+      data.put("error", true);
+      data.put("data", result);
+    } finally {
+      OBContext.restorePreviousMode();
+    }
+    return data;
+  }
+
+}
 |