
---
 src-db/database/sourcedata/AD_MESSAGE.xml     | 12 ++++
 src-db/database/sourcedata/AD_REF_LIST.xml    | 14 +++++
 .../database/sourcedata/OBMOBC_SERVICES.xml   | 12 ++++
 .../ChequeCadeauComponentProvider.java        |  3 +-
 .../hooks/ValidateChequeCadeauBarcode.java    | 57 +++++++++++++++++++
 .../js/hooks/hookObidcoPreAddCouponHook.js    | 56 ++++++++++++++++++
 6 files changed, 153 insertions(+), 1 deletion(-)
 create mode 100644 src-db/database/sourcedata/AD_REF_LIST.xml
 create mode 100644 src/org/openbravo/retail/chequecadeau/hooks/ValidateChequeCadeauBarcode.java
 create mode 100644 web/org.openbravo.retail.chequecadeau/js/hooks/hookObidcoPreAddCouponHook.js

diff --git a/src-db/database/sourcedata/AD_MESSAGE.xml b/src-db/database/sourcedata/AD_MESSAGE.xml
index 0d64b78..15c7d24 100644
--- a/src-db/database/sourcedata/AD_MESSAGE.xml
+++ b/src-db/database/sourcedata/AD_MESSAGE.xml
@@ -36,6 +36,18 @@
 <!--62770D76114843B39B50FC5718D5C784-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
 <!--62770D76114843B39B50FC5718D5C784--></AD_MESSAGE>
 
+<!--66C2A9A65ABC40E28C9F407E5A55A981--><AD_MESSAGE>
+<!--66C2A9A65ABC40E28C9F407E5A55A981-->  <AD_MESSAGE_ID><![CDATA[66C2A9A65ABC40E28C9F407E5A55A981]]></AD_MESSAGE_ID>
+<!--66C2A9A65ABC40E28C9F407E5A55A981-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--66C2A9A65ABC40E28C9F407E5A55A981-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--66C2A9A65ABC40E28C9F407E5A55A981-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--66C2A9A65ABC40E28C9F407E5A55A981-->  <VALUE><![CDATA[CCGS_DuplicatedCodeBar]]></VALUE>
+<!--66C2A9A65ABC40E28C9F407E5A55A981-->  <MSGTEXT><![CDATA[Barcode %0 is duplicated. The barcode can only be once in a Digital Coupon and only in one Digital Coupon.]]></MSGTEXT>
+<!--66C2A9A65ABC40E28C9F407E5A55A981-->  <MSGTYPE><![CDATA[I]]></MSGTYPE>
+<!--66C2A9A65ABC40E28C9F407E5A55A981-->  <AD_MODULE_ID><![CDATA[9E626202DAE041FEBD88DFB476D1E17A]]></AD_MODULE_ID>
+<!--66C2A9A65ABC40E28C9F407E5A55A981-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
+<!--66C2A9A65ABC40E28C9F407E5A55A981--></AD_MESSAGE>
+
 <!--8781FB64FEDD47A4AEEFE71A641CCAF4--><AD_MESSAGE>
 <!--8781FB64FEDD47A4AEEFE71A641CCAF4-->  <AD_MESSAGE_ID><![CDATA[8781FB64FEDD47A4AEEFE71A641CCAF4]]></AD_MESSAGE_ID>
 <!--8781FB64FEDD47A4AEEFE71A641CCAF4-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff --git a/src-db/database/sourcedata/AD_REF_LIST.xml b/src-db/database/sourcedata/AD_REF_LIST.xml
new file mode 100644
index 0000000..8b4c308
--- /dev/null
+++ b/src-db/database/sourcedata/AD_REF_LIST.xml
@@ -0,0 +1,14 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<data>
+<!--11391077D1534ADC8EF62E4DC6A1E778--><AD_REF_LIST>
+<!--11391077D1534ADC8EF62E4DC6A1E778-->  <AD_REF_LIST_ID><![CDATA[11391077D1534ADC8EF62E4DC6A1E778]]></AD_REF_LIST_ID>
+<!--11391077D1534ADC8EF62E4DC6A1E778-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--11391077D1534ADC8EF62E4DC6A1E778-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--11391077D1534ADC8EF62E4DC6A1E778-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--11391077D1534ADC8EF62E4DC6A1E778-->  <VALUE><![CDATA[CCGS_CheckBarcodeDuplicity]]></VALUE>
+<!--11391077D1534ADC8EF62E4DC6A1E778-->  <NAME><![CDATA[Check Barcode duplicity in Digital Coupons]]></NAME>
+<!--11391077D1534ADC8EF62E4DC6A1E778-->  <AD_REFERENCE_ID><![CDATA[A26BA480E2014707B47257024C3CBFF7]]></AD_REFERENCE_ID>
+<!--11391077D1534ADC8EF62E4DC6A1E778-->  <AD_MODULE_ID><![CDATA[9E626202DAE041FEBD88DFB476D1E17A]]></AD_MODULE_ID>
+<!--11391077D1534ADC8EF62E4DC6A1E778--></AD_REF_LIST>
+
+</data>
diff --git a/src-db/database/sourcedata/OBMOBC_SERVICES.xml b/src-db/database/sourcedata/OBMOBC_SERVICES.xml
index 7e72629..ec19197 100644
--- a/src-db/database/sourcedata/OBMOBC_SERVICES.xml
+++ b/src-db/database/sourcedata/OBMOBC_SERVICES.xml
@@ -11,4 +11,16 @@
 <!--4BFA2BE5FBA84CB69493D1FF100090AF-->  <SERVER_RUNTIME><![CDATA[OBSTSYN_ON_CENTRAL]]></SERVER_RUNTIME>
 <!--4BFA2BE5FBA84CB69493D1FF100090AF--></OBMOBC_SERVICES>
 
+<!--83619F547EFB4759B28329C7BBFCE16E--><OBMOBC_SERVICES>
+<!--83619F547EFB4759B28329C7BBFCE16E-->  <OBMOBC_SERVICES_ID><![CDATA[83619F547EFB4759B28329C7BBFCE16E]]></OBMOBC_SERVICES_ID>
+<!--83619F547EFB4759B28329C7BBFCE16E-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--83619F547EFB4759B28329C7BBFCE16E-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--83619F547EFB4759B28329C7BBFCE16E-->  <AD_MODULE_ID><![CDATA[9E626202DAE041FEBD88DFB476D1E17A]]></AD_MODULE_ID>
+<!--83619F547EFB4759B28329C7BBFCE16E-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--83619F547EFB4759B28329C7BBFCE16E-->  <SERVICE><![CDATA[org.openbravo.retail.chequecadeau.hooks.ValidateChequeCadeauBarcode]]></SERVICE>
+<!--83619F547EFB4759B28329C7BBFCE16E-->  <DESCRIPTION><![CDATA[Check the duplicities in digital coupon codebar attribute]]></DESCRIPTION>
+<!--83619F547EFB4759B28329C7BBFCE16E-->  <ROUTINGTYPE><![CDATA[Failover]]></ROUTINGTYPE>
+<!--83619F547EFB4759B28329C7BBFCE16E-->  <SERVER_RUNTIME><![CDATA[OBSTSYN_RUN_ON_STORE_NO_SYNC_ERRORS]]></SERVER_RUNTIME>
+<!--83619F547EFB4759B28329C7BBFCE16E--></OBMOBC_SERVICES>
+
 </data>
diff --git a/src/org/openbravo/retail/chequecadeau/ChequeCadeauComponentProvider.java b/src/org/openbravo/retail/chequecadeau/ChequeCadeauComponentProvider.java
index e5a3353..4e786b4 100644
--- a/src/org/openbravo/retail/chequecadeau/ChequeCadeauComponentProvider.java
+++ b/src/org/openbravo/retail/chequecadeau/ChequeCadeauComponentProvider.java
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2015-2019 Openbravo S.L.U.
+ * Copyright (C) 2015-2021 Openbravo S.L.U.
  * Licensed under the Openbravo Commercial License version 1.0
  * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
  * or in the legal folder of this module distribution.
@@ -45,6 +45,7 @@ public class ChequeCadeauComponentProvider extends BaseComponentProvider {
     grhelper.add("chequecadeauutils.js");
     grhelper.add("modalDigitalCouponsBtnCloseExtension.js");
     grhelper.add("hooks/PreOrderSaveHook.js");
+    grhelper.add("hooks/hookObidcoPreAddCouponHook.js");
 
     grhelper.addCSS("inputscan.css");
 
diff --git a/src/org/openbravo/retail/chequecadeau/hooks/ValidateChequeCadeauBarcode.java b/src/org/openbravo/retail/chequecadeau/hooks/ValidateChequeCadeauBarcode.java
new file mode 100644
index 0000000..06480d9
--- /dev/null
+++ b/src/org/openbravo/retail/chequecadeau/hooks/ValidateChequeCadeauBarcode.java
@@ -0,0 +1,57 @@
+/*
+ ************************************************************************************
+ * Copyright (C) 2021 Openbravo S.L.U.
+ * Licensed under the Openbravo Commercial License version 1.0
+ * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
+ * or in the legal folder of this module distribution.
+ ************************************************************************************
+ */
+package org.openbravo.retail.chequecadeau.hooks;
+
+import javax.servlet.ServletException;
+
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.hibernate.criterion.Restrictions;
+import org.openbravo.base.exception.OBException;
+import org.openbravo.dal.core.OBContext;
+import org.openbravo.dal.service.OBCriteria;
+import org.openbravo.dal.service.OBDal;
+import org.openbravo.retail.digitalcoupons.data.OBDICO_DigitalCoupons;
+import org.openbravo.retail.posterminal.JSONProcessSimple;
+import org.openbravo.service.json.JsonConstants;
+
+public class ValidateChequeCadeauBarcode extends JSONProcessSimple {
+
+  @Override
+  public JSONObject exec(JSONObject jsonsent) throws JSONException, ServletException {
+    JSONObject result = new JSONObject();
+    JSONObject data = new JSONObject();
+    JSONObject coupon = jsonsent.getJSONObject("coupon");
+
+    OBContext.setAdminMode();
+    try {
+      String chBarcode = coupon.optString("ccgsBarcode");
+      if (!"".equals(chBarcode) && !chBarcode.isEmpty()) {
+        OBCriteria<OBDICO_DigitalCoupons> obc = OBDal.getInstance()
+            .createCriteria(OBDICO_DigitalCoupons.class);
+        obc.add(Restrictions.eq(OBDICO_DigitalCoupons.PROPERTY_CCGSBARCODE, chBarcode));
+        obc.setFilterOnReadableClients(false);
+        obc.setFilterOnReadableOrganization(false);
+        obc.setMaxResults(1);
+        OBDICO_DigitalCoupons digitalCoupon = (OBDICO_DigitalCoupons) obc.uniqueResult();
+        if (digitalCoupon != null) {
+          data.put("duplicated", "true");
+        }
+      }
+    } catch (JSONException e) {
+      throw new OBException(e);
+    } finally {
+      OBContext.restorePreviousMode();
+    }
+
+    result.put("data", data);
+    result.put("status", JsonConstants.RPCREQUEST_STATUS_SUCCESS);
+    return result;
+  }
+}
diff --git a/web/org.openbravo.retail.chequecadeau/js/hooks/hookObidcoPreAddCouponHook.js b/web/org.openbravo.retail.chequecadeau/js/hooks/hookObidcoPreAddCouponHook.js
new file mode 100644
index 0000000..98fd085
--- /dev/null
+++ b/web/org.openbravo.retail.chequecadeau/js/hooks/hookObidcoPreAddCouponHook.js
@@ -0,0 +1,56 @@
+/*
+ ************************************************************************************
+ * Copyright (C) 2021 Openbravo S.L.U.
+ * Licensed under the Openbravo Commercial License version 1.0
+ * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
+ * or in the legal folder of this module distribution.
+ ************************************************************************************
+ */
+
+/*global OB */
+
+(function() {
+  OB.UTIL.HookManager.registerHook('obidcoPreAddCouponHook', function(
+    args,
+    callback
+  ) {
+    if (OB.MobileApp.model.hasPermission('CCGS_CheckBarcodeDuplicity', true)) {
+      var procesValidateDate = new OB.DS.Process(
+        'org.openbravo.retail.chequecadeau.hooks.ValidateChequeCadeauBarcode'
+      );
+      procesValidateDate.exec(
+        {
+          coupon: args.coupon.attributes
+        },
+        function(data) {
+          if (data && data.duplicated) {
+            args.cancellation = true;
+            var me = args.digitalCouponWindow;
+            me.hide();
+            OB.UTIL.showConfirmation.display(
+              OB.I18N.getLabel('OBMOBC_Error'),
+              OB.I18N.getLabel('CCGS_DuplicatedCodeBar', [
+                args.coupon.get('ccgsBarcode')
+              ]),
+              null,
+              {
+                onShowFunction: function(popup) {
+                  popup.$.headerCloseButton.hide();
+                },
+                onHideFunction: function() {
+                  me.show({
+                    receipt: me.receipt,
+                    payment: me.payment,
+                    doNotChangeMode: true
+                  });
+                },
+                autoDismiss: false
+              }
+            );
+          }
+          OB.UTIL.HookManager.callbackExecutor(args, callback);
+        }
+      );
+    }
+  });
+})();
-- 
2.28.0

