# HG changeset patch
# User Miguel de Juana <miguel.dejuana@openbravo.com>
# Date 1489476949 -3600
#      Tue Mar 14 08:35:49 2017 +0100
# Node ID 7bc504b2c2db7e60da023c7f26d79227a538318e
# Parent  eda11b75aa26e1776f5d6759eb47e432e5e465b1
Fixed issue 0035444: DeleteLine logic is duplicated across several functionalities

- Remove unneeded hook file
- Gather delete line logic in pointofsale.js

diff --git a/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java b/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java
--- a/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java
+++ b/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java
@@ -259,7 +259,7 @@
         "model/discounts",
 
         // Hook
-        "components/menuhook", "components/hookPreDeleteLine",
+        "components/menuhook",
 
         // Websockets
         "utils/rfidWebsocket",
diff --git a/web/org.openbravo.retail.posterminal/js/components/hookPreDeleteLine.js b/web/org.openbravo.retail.posterminal/js/components/hookPreDeleteLine.js
deleted file mode 100644
--- a/web/org.openbravo.retail.posterminal/js/components/hookPreDeleteLine.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- ************************************************************************************
- * Copyright (C) 2015-2016 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 enyo */
-
-OB.UTIL.HookManager.registerHook('OBPOS_PreDeleteLine', function (args, c) {
-  enyo.$.scrim.show();
-  args.order.get('lines').forEach(function (line, idx) {
-    line.set('undoPosition', idx);
-  });
-  OB.UTIL.HookManager.callbackExecutor(args, c);
-});
\ No newline at end of file
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/editline.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/editline.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/editline.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/editline.js
@@ -200,84 +200,9 @@
     i18nContent: 'OBPOS_ButtonDelete',
     classes: 'btnlink-orange',
     tap: function () {
-      var me = this,
-          order = this.model.get('order'),
-          unGroupedServiceLines;
-
-      function callback() {
-        OB.UTIL.HookManager.executeHooks('OBPOS_PostDeleteLine', {
-          order: order,
-          selectedLines: me.owner.owner.selectedModels
-        }, function () {
-          order.unset('preventServicesUpdate');
-          order.unset('deleting');
-          order.get('lines').trigger('updateRelations');
-          order.calculateReceipt();
-          enyo.$.scrim.hide();
-        });
-      }
-      OB.UTIL.HookManager.executeHooks('OBPOS_PreDeleteLine', {
-        order: me.owner.owner.receipt,
-        selectedLines: me.owner.owner.selectedModels
-      }, function () {
-        me.owner.owner.receipt.set('undo', null);
-        if (order && order.get('isQuotation') && order.get('hasbeenpaid') === 'Y') {
-          me.owner.owner.doShowPopup({
-            popup: 'modalNotEditableOrder'
-          });
-          return;
-        }
-
-        unGroupedServiceLines = _.filter(me.owner.owner.selectedModels, function (line) {
-          return line.get('product').get('productType') === 'S' && line.get('product').get('quantityRule') === 'PP' && !line.get('groupService') && line.has('relatedLines') && line.get('relatedLines').length > 0 && !line.get('originalOrderLineId');
-        });
-
-        if (unGroupedServiceLines && unGroupedServiceLines.length > 0) {
-          var i, j, serviceQty, productQty, uniqueServices, getServiceQty, getProductQty;
-          uniqueServices = _.uniq(unGroupedServiceLines, false, function (line) {
-            return line.get('product').get('id') + line.get('relatedLines')[0].orderlineId;
-          });
-
-          getServiceQty = function (service) {
-            return _.filter(unGroupedServiceLines, function (line) {
-              return line.get('product').get('id') === service.get('product').get('id') && line.get('relatedLines')[0].orderlineId === service.get('relatedLines')[0].orderlineId;
-            }).length;
-          };
-
-          getProductQty = function (service) {
-            return _.find(order.get('lines').models, function (line) {
-              return _.indexOf(_.pluck(service.get('relatedLines'), 'orderlineId'), line.get('id')) !== -1;
-            }).get('qty');
-          };
-
-          for (i = 0; i < uniqueServices.length; i++) {
-            serviceQty = getServiceQty(uniqueServices[i]);
-            productQty = getProductQty(uniqueServices[i]);
-            if (productQty && productQty !== serviceQty) {
-              OB.UTIL.showConfirmation.display(OB.I18N.getLabel('OBPOS_LineCanNotBeDeleted'), OB.I18N.getLabel('OBPOS_AllServiceLineMustSelectToDelete'), [{
-                label: OB.I18N.getLabel('OBMOBC_LblOk')
-              }]);
-              return;
-            }
-          }
-        }
-
-        OB.UTIL.Approval.requestApproval(
-        me.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
-          if (approved) {
-            order.set('preventServicesUpdate', true);
-            order.set('deleting', true);
-            if (me.owner.owner.selectedModels && me.owner.owner.selectedModels.length > 1) {
-              order.deleteLines(me.owner.owner.selectedModels, 0, me.owner.owner.selectedModels.length, callback);
-              order.trigger('scan');
-            } else {
-              me.owner.owner.doDeleteLine({
-                line: me.owner.owner.line,
-                callback: callback
-              });
-            }
-          }
-        });
+      this.owner.owner.doDeleteLine({
+        line: this.owner.owner.line,
+        selectedModels: this.owner.owner.selectedModels
       });
     },
     init: function (model) {
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboardorder.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboardorder.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboardorder.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboardorder.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2016 Openbravo S.L.U.
+ * Copyright (C) 2012-2017 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.
@@ -22,7 +22,8 @@
     onAddProduct: '',
     onSetDiscountQty: '',
     onDiscountsMode: '',
-    onSetMultiSelectionItems: ''
+    onSetMultiSelectionItems: '',
+    onDeleteLine: ''
   },
   discountsMode: false,
   handlers: {
@@ -213,34 +214,13 @@
 
     // action bindable to a command that completely deletes a product from the order list
     var actionDeleteLine = function (keyboard) {
-        function callback() {
-          OB.UTIL.HookManager.executeHooks('OBPOS_PostDeleteLine', {
-            order: me.receipt,
-            selectedLines: me.selectedModels
-          }, function () {
-            keyboard.receipt.unset('preventServicesUpdate');
-            keyboard.receipt.unset('deleting');
-            keyboard.receipt.get('lines').trigger('updateRelations');
-            keyboard.receipt.calculateReceipt();
-            enyo.$.scrim.hide();
-          });
-        }
         if (!me.validateReceipt(keyboard, true)) {
           return true;
         }
         if (keyboard.line) {
-          OB.UTIL.HookManager.executeHooks('OBPOS_PreDeleteLine', {
-            order: me.receipt,
-            selectedLines: me.selectedModels
-          }, function () {
-            keyboard.receipt.set('preventServicesUpdate', true);
-            keyboard.receipt.set('deleting', true);
-            if (me.selectedModels.length > 1) {
-              keyboard.receipt.deleteLines(me.selectedModels, 0, me.selectedModels.length, callback);
-            } else {
-              keyboard.receipt.deleteLine(keyboard.line, false, callback);
-            }
-            keyboard.receipt.trigger('scan');
+          keyboard.doDeleteLine({
+            line: keyboard.line,
+            selectedModels: keyboard.selectedModels
           });
         }
         };
@@ -250,19 +230,6 @@
         var value = OB.I18N.parseNumber(txt),
             toadd;
 
-        function callback() {
-          OB.UTIL.HookManager.executeHooks('OBPOS_PostDeleteLine', {
-            order: me.receipt,
-            selectedLines: me.selectedModels
-          }, function () {
-            keyboard.receipt.unset('preventServicesUpdate');
-            keyboard.receipt.unset('deleting');
-            keyboard.receipt.get('lines').trigger('updateRelations');
-            keyboard.receipt.calculateReceipt();
-            enyo.$.scrim.hide();
-          });
-        }
-
         if (!keyboard.line) {
           return true;
         }
@@ -285,22 +252,9 @@
             }
             if (toadd !== 0) {
               if (value === 0) { // If final quantity will be 0 then request approval
-                OB.UTIL.Approval.requestApproval(me.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
-                  if (approved) {
-                    OB.UTIL.HookManager.executeHooks('OBPOS_PreDeleteLine', {
-                      order: me.receipt,
-                      selectedLines: me.selectedModels
-                    }, function () {
-                      keyboard.receipt.set('preventServicesUpdate', true);
-                      keyboard.receipt.set('deleting', true);
-                      if (me.selectedModels.length > 1) {
-                        keyboard.receipt.deleteLines(me.selectedModels, 0, me.selectedModels.length, callback);
-                      } else {
-                        keyboard.receipt.deleteLine(me.line, false, callback);
-                      }
-                      keyboard.receipt.trigger('scan');
-                    });
-                  }
+                keyboard.doDeleteLine({
+                  line: keyboard.line,
+                  selectedModels: keyboard.selectedModels
                 });
               } else {
                 actionAddProduct(keyboard, toadd);
@@ -427,19 +381,6 @@
           return;
         }
 
-        function callback() {
-          OB.UTIL.HookManager.executeHooks('OBPOS_PostDeleteLine', {
-            order: me.receipt,
-            selectedLines: me.selectedModels
-          }, function () {
-            keyboard.receipt.unset('preventServicesUpdate');
-            keyboard.receipt.unset('deleting');
-            keyboard.receipt.get('lines').trigger('updateRelations');
-            keyboard.receipt.calculateReceipt();
-            enyo.$.scrim.hide();
-          });
-        }
-
         if ((!_.isNull(txt) || !_.isUndefined(txt)) && !_.isNaN(OB.I18N.parseNumber(txt))) {
           qty = OB.I18N.parseNumber(txt);
           if (!me.validateQuantity(keyboard, qty)) {
@@ -467,19 +408,6 @@
           return true;
         }
 
-        function callback() {
-          OB.UTIL.HookManager.executeHooks('OBPOS_PostDeleteLine', {
-            order: me.receipt,
-            selectedLines: me.selectedModels
-          }, function () {
-            keyboard.receipt.unset('preventServicesUpdate');
-            keyboard.receipt.unset('deleting');
-            keyboard.receipt.get('lines').trigger('updateRelations');
-            keyboard.receipt.calculateReceipt();
-            enyo.$.scrim.hide();
-          });
-        }
-
         function actionAddProducts() {
           keyboard.receipt.set('undo', null);
           if (me.selectedModels.length > 1) {
@@ -502,24 +430,9 @@
           value = keyboard.line.get('qty') - qty;
         }
         if (value === 0) { // If final quantity will be 0 then request approval
-          OB.UTIL.Approval.requestApproval(me.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
-            if (approved) {
-              OB.UTIL.HookManager.executeHooks('OBPOS_PreDeleteLine', {
-                order: me.receipt,
-                selectedLines: me.selectedModels
-              }, function () {
-                keyboard.receipt.set('undo', null);
-                keyboard.line.set('deleteApproved', true);
-                keyboard.receipt.set('preventServicesUpdate', true);
-                keyboard.receipt.set('deleting', true);
-                if (me.selectedModels.length > 1) {
-                  keyboard.receipt.deleteLines(me.selectedModels, 0, me.selectedModels.length, callback);
-                } else {
-                  keyboard.receipt.deleteLine(me.line, false, callback);
-                }
-                keyboard.receipt.trigger('scan');
-              });
-            }
+          keyboard.doDeleteLine({
+            line: keyboard.line,
+            selectedModels: keyboard.selectedModels
           });
         } else {
           var approvalNeeded = false,
@@ -637,12 +550,7 @@
       stateless: true,
       action: function (keyboard) {
         if (keyboard.line) {
-          OB.UTIL.Approval.requestApproval(me.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
-            if (approved) {
-              keyboard.line.set('deleteApproved', true);
-              actionDeleteLine(keyboard);
-            }
-          });
+          actionDeleteLine(keyboard);
         }
       }
     });
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js
@@ -894,18 +894,95 @@
     this.tabChange(inSender, inEvent);
   },
   deleteLine: function (inSender, inEvent) {
+    var me = this,
+        ln = inEvent.line,
+        selectedModels = inEvent.selectedModels,
+        receipt = this.model.get('order');
+
+    function postDeleteLine() {
+      OB.UTIL.HookManager.executeHooks('OBPOS_PostDeleteLine', {
+        order: receipt,
+        selectedLines: selectedModels
+      }, function () {
+        receipt.unset('preventServicesUpdate');
+        receipt.unset('deleting');
+        receipt.get('lines').trigger('updateRelations');
+        receipt.calculateReceipt();
+        enyo.$.scrim.hide();
+      });
+    }
+
+    function preDeleteLine() {
+      OB.UTIL.HookManager.executeHooks('OBPOS_PreDeleteLine', {
+        order: receipt,
+        selectedLines: selectedModels
+      }, function () {
+        enyo.$.scrim.show();
+        receipt.get('lines').forEach(function (line, idx) {
+          line.set('undoPosition', idx);
+        });
+        receipt.set('undo', null);
+        receipt.set('preventServicesUpdate', true);
+        receipt.set('deleting', true);
+        if (selectedModels.length > 1) {
+          receipt.deleteLines(selectedModels, 0, selectedModels.length, postDeleteLine);
+        } else {
+          receipt.deleteLine(ln, false, postDeleteLine);
+        }
+        receipt.trigger('scan');
+      });
+    }
+
+
+    //Editable Validation
     if (this.model.get('order').get('isEditable') === false) {
       this.doShowPopup({
         popup: 'modalNotEditableOrder'
       });
       return true;
     }
-    var line = inEvent.line,
-        receipt = this.model.get('order');
-    if (line && receipt) {
-      receipt.deleteLine(line, false, inEvent.callback);
-      receipt.trigger('scan');
+
+    //Services validation
+    var unGroupedServiceLines = _.filter(selectedModels, function (line) {
+      return line.get('product').get('productType') === 'S' && line.get('product').get('quantityRule') === 'PP' && !line.get('groupService') && line.has('relatedLines') && line.get('relatedLines').length > 0 && !line.get('originalOrderLineId');
+    });
+    if (unGroupedServiceLines && unGroupedServiceLines.length > 0) {
+      var i, j, serviceQty, productQty, uniqueServices, getServiceQty, getProductQty;
+      uniqueServices = _.uniq(unGroupedServiceLines, false, function (line) {
+        return line.get('product').get('id') + line.get('relatedLines')[0].orderlineId;
+      });
+      getServiceQty = function (service) {
+        return _.filter(unGroupedServiceLines, function (line) {
+          return line.get('product').get('id') === service.get('product').get('id') && line.get('relatedLines')[0].orderlineId === service.get('relatedLines')[0].orderlineId;
+        }).length;
+      };
+      getProductQty = function (service) {
+        return _.find(receipt.get('lines').models, function (line) {
+          return _.indexOf(_.pluck(service.get('relatedLines'), 'orderlineId'), line.get('id')) !== -1;
+        }).get('qty');
+      };
+
+      for (i = 0; i < uniqueServices.length; i++) {
+        serviceQty = getServiceQty(uniqueServices[i]);
+        productQty = getProductQty(uniqueServices[i]);
+        if (productQty && productQty !== serviceQty) {
+          OB.UTIL.showConfirmation.display(OB.I18N.getLabel('OBPOS_LineCanNotBeDeleted'), OB.I18N.getLabel('OBPOS_AllServiceLineMustSelectToDelete'), [{
+            label: OB.I18N.getLabel('OBMOBC_LblOk')
+          }]);
+          return;
+        }
+      }
     }
+
+    OB.UTIL.Approval.requestApproval(me.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
+      if (approved) {
+        ln.set('deleteApproved', true);
+        selectedModels.forEach(function (line, idx) {
+          line.set('deleteApproved', true);
+        });
+        preDeleteLine();
+      }
+    });
   },
   editLine: function (inSender, inEvent) {
     if (this.model.get('order').get('isEditable') === false) {
