# HG changeset patch
# User Ranjith S R <ranjith@qualiantech.com>
# Date 1507720047 -19800
#      Wed Oct 11 16:37:27 2017 +0530
# Node ID 151206529fa6c794ec0ec576ff1c8c5b9a4cea81
# Parent  48858e58f45cb218a52925479a6bb66d6a3f7cc7
Fixed issue 36622: Adapted for 17Q2

Add a not needed payment can generate wrong data

An additional check has been added when done button is clicked.

The check has been also added to multiorders addPayment function.

For reverse payment, it has been added to set in client side the
attribute is ReversePayment for those payment lines loaded from the
backend.

diff -r 48858e58f45c -r 151206529fa6 src-db/database/sourcedata/AD_MESSAGE.xml
--- a/src-db/database/sourcedata/AD_MESSAGE.xml	Tue May 23 05:06:51 2017 +0000
+++ b/src-db/database/sourcedata/AD_MESSAGE.xml	Wed Oct 11 16:37:27 2017 +0530
@@ -4480,6 +4480,18 @@
 <!--8026C3CA5F874BA6B3AD37B230C0A318-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
 <!--8026C3CA5F874BA6B3AD37B230C0A318--></AD_MESSAGE>
 
+<!--806C9DA64DD441E1933EBA525F925A27--><AD_MESSAGE>
+<!--806C9DA64DD441E1933EBA525F925A27-->  <AD_MESSAGE_ID><![CDATA[806C9DA64DD441E1933EBA525F925A27]]></AD_MESSAGE_ID>
+<!--806C9DA64DD441E1933EBA525F925A27-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--806C9DA64DD441E1933EBA525F925A27-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--806C9DA64DD441E1933EBA525F925A27-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--806C9DA64DD441E1933EBA525F925A27-->  <VALUE><![CDATA[OBPOS_PaymentOnReturnReceipt]]></VALUE>
+<!--806C9DA64DD441E1933EBA525F925A27-->  <MSGTEXT><![CDATA[Positive payments cannot be added for return receipt]]></MSGTEXT>
+<!--806C9DA64DD441E1933EBA525F925A27-->  <MSGTYPE><![CDATA[E]]></MSGTYPE>
+<!--806C9DA64DD441E1933EBA525F925A27-->  <AD_MODULE_ID><![CDATA[FF808181326CC34901326D53DBCF0018]]></AD_MODULE_ID>
+<!--806C9DA64DD441E1933EBA525F925A27-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
+<!--806C9DA64DD441E1933EBA525F925A27--></AD_MESSAGE>
+
 <!--8109E36E97274C50945566BFA7B38B9F--><AD_MESSAGE>
 <!--8109E36E97274C50945566BFA7B38B9F-->  <AD_MESSAGE_ID><![CDATA[8109E36E97274C50945566BFA7B38B9F]]></AD_MESSAGE_ID>
 <!--8109E36E97274C50945566BFA7B38B9F-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
@@ -5705,6 +5717,18 @@
 <!--A11C5D573C53475383B8144D6505E822-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
 <!--A11C5D573C53475383B8144D6505E822--></AD_MESSAGE>
 
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2--><AD_MESSAGE>
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2-->  <AD_MESSAGE_ID><![CDATA[A1BA921FC2D24048AB1EE9B3B6DA59C2]]></AD_MESSAGE_ID>
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2-->  <VALUE><![CDATA[OBPOS_NegativePaymentOnReceipt]]></VALUE>
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2-->  <MSGTEXT><![CDATA[Negative payments cannot be added for normal receipt]]></MSGTEXT>
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2-->  <MSGTYPE><![CDATA[E]]></MSGTYPE>
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2-->  <AD_MODULE_ID><![CDATA[FF808181326CC34901326D53DBCF0018]]></AD_MODULE_ID>
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
+<!--A1BA921FC2D24048AB1EE9B3B6DA59C2--></AD_MESSAGE>
+
 <!--A20C6C8A724F4576A9B79B5E1DF4BBC8--><AD_MESSAGE>
 <!--A20C6C8A724F4576A9B79B5E1DF4BBC8-->  <AD_MESSAGE_ID><![CDATA[A20C6C8A724F4576A9B79B5E1DF4BBC8]]></AD_MESSAGE_ID>
 <!--A20C6C8A724F4576A9B79B5E1DF4BBC8-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
@@ -7577,6 +7601,18 @@
 <!--D8024B7BD37C44189D8E829043E74351-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
 <!--D8024B7BD37C44189D8E829043E74351--></AD_MESSAGE>
 
+<!--D8044F40335C4AA38344370661028286--><AD_MESSAGE>
+<!--D8044F40335C4AA38344370661028286-->  <AD_MESSAGE_ID><![CDATA[D8044F40335C4AA38344370661028286]]></AD_MESSAGE_ID>
+<!--D8044F40335C4AA38344370661028286-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--D8044F40335C4AA38344370661028286-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--D8044F40335C4AA38344370661028286-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--D8044F40335C4AA38344370661028286-->  <VALUE><![CDATA[OBPOS_UnnecessaryPaymentAdded]]></VALUE>
+<!--D8044F40335C4AA38344370661028286-->  <MSGTEXT><![CDATA[There are more payments than needed. Please, remove your unnecessary payments before continuing]]></MSGTEXT>
+<!--D8044F40335C4AA38344370661028286-->  <MSGTYPE><![CDATA[E]]></MSGTYPE>
+<!--D8044F40335C4AA38344370661028286-->  <AD_MODULE_ID><![CDATA[FF808181326CC34901326D53DBCF0018]]></AD_MODULE_ID>
+<!--D8044F40335C4AA38344370661028286-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
+<!--D8044F40335C4AA38344370661028286--></AD_MESSAGE>
+
 <!--D8364927BAAC4279A9967AFDDA8DC239--><AD_MESSAGE>
 <!--D8364927BAAC4279A9967AFDDA8DC239-->  <AD_MESSAGE_ID><![CDATA[D8364927BAAC4279A9967AFDDA8DC239]]></AD_MESSAGE_ID>
 <!--D8364927BAAC4279A9967AFDDA8DC239-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r 48858e58f45c -r 151206529fa6 web/org.openbravo.retail.posterminal/js/model/order.js
--- a/web/org.openbravo.retail.posterminal/js/model/order.js	Tue May 23 05:06:51 2017 +0000
+++ b/web/org.openbravo.retail.posterminal/js/model/order.js	Wed Oct 11 16:37:27 2017 +0530
@@ -3253,6 +3253,10 @@
         OB.UTIL.showWarning(OB.I18N.getLabel('OBPOS_CannotAddPayments'));
         return;
       }
+      if (!payment.get('isReversePayment') && this.getPending() <= 0 && payment.get('amount') > 0) {
+        OB.UTIL.showWarning(OB.I18N.getLabel('OBPOS_PaymentsExact'));
+        return;
+      }
 
       order = this;
       if (order.get('orderType') === 3 && order.getGross() === 0) {
@@ -3321,6 +3325,7 @@
         payment.set('id', OB.UTIL.get_UUID());
         payment.set('orderGross', order.getGross());
         payment.set('isPaid', order.get('isPaid'));
+        payment.set('isReturnOrder', order.getPaymentStatus().isNegative);
         if (order.get('doCancelAndReplace') && order.get('replacedorder')) {
           // Added properties to payment related with cancel an replace order
           payment.set('cancelAndReplace', order.get('doCancelAndReplace'));
@@ -4510,6 +4515,7 @@
           return currentPayment.paymentId === payment.reversedPaymentId;
         });
         reversalPayment.reversedPaymentId = payment.paymentId;
+        reversalPayment.isReversePayment = true;
         delete payment.reversedPaymentId;
       });
 
@@ -5238,6 +5244,10 @@
         OB.UTIL.showWarning(OB.I18N.getLabel('OBPOS_CannotAddPayments'));
         return;
       }
+      if (!payment.get('isReversePayment') && this.getPending() <= 0 && payment.get('amount') > 0) {
+        OB.UTIL.showWarning(OB.I18N.getLabel('OBPOS_PaymentsExact'));
+        return;
+      }
 
       payments = this.get('payments');
       total = OB.DEC.abs(this.getTotal());
@@ -5296,6 +5306,7 @@
           order.set('openDrawer', payment.get('openDrawer'));
         }
         payment.set('date', new Date());
+        payment.set('isReturnOrder', false);
         payment.set('id', OB.UTIL.get_UUID());
         payments.add(payment);
         order.adjustPayment();
diff -r 48858e58f45c -r 151206529fa6 web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js	Tue May 23 05:06:51 2017 +0000
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js	Wed Oct 11 16:37:27 2017 +0530
@@ -1067,7 +1067,8 @@
   tap: function () {
     var myModel = this.owner.model,
         me = this,
-        payments, avoidPayment = false,
+        payments, isMultiOrder = myModel.get('leftColumnViewManager').isOrder() ? false : true,
+        avoidPayment = false,
         orderDesc = '';
     //*** Avoid double click ***
     if (this.getContent() === OB.I18N.getLabel('OBPOS_LblDone')) {
@@ -1086,13 +1087,15 @@
       }
     }
 
+    this.avoidCompleteReceipt = false;
+    this.alreadyPaid = false;
     this.allowOpenDrawer = false;
 
     if (this.disabled) {
       return true;
     }
 
-    if (!myModel.get('leftColumnViewManager').isOrder()) {
+    if (isMultiOrder) {
       var receipts = this.owner.model.get('multiOrders').get('multiOrdersList').models;
       receipts.forEach(function (receipt) {
         if ((receipt.get('orderType') === 2 || receipt.get('orderType') === 3) && receipt.get('bp').id === OB.MobileApp.model.get('terminal').businessPartner && !OB.MobileApp.model.get('terminal').layaway_anonymouscustomer) {
@@ -1106,10 +1109,42 @@
     var synchId = OB.UTIL.SynchronizationHelper.busyUntilFinishes("doneButton");
 
     if (!avoidPayment) {
-      if (myModel.get('leftColumnViewManager').isOrder()) {
+      if (isMultiOrder) {
+        payments = this.owner.model.get('multiOrders').get('payments');
+      } else {
         payments = this.owner.receipt.get('payments');
-      } else {
-        payments = this.owner.model.get('multiOrders').get('payments');
+      }
+
+      var errorMsgLbl, totalPaid = 0,
+          totalToPaid = isMultiOrder ? this.owner.model.get('multiOrders').getTotal() : this.owner.receipt.getTotal(),
+          isReturnOrder = isMultiOrder ? false : this.owner.receipt.getPaymentStatus().isNegative;
+      if (_.filter(payments.models, function (payment) {
+        return (OB.UTIL.isNullOrUndefined(payment.get('isReturnOrder')) ? isReturnOrder : payment.get('isReturnOrder')) !== isReturnOrder;
+      }).length > 0) {
+        me.avoidCompleteReceipt = true;
+        if (isReturnOrder) {
+          errorMsgLbl = 'OBPOS_PaymentOnReturnReceipt';
+        } else {
+          errorMsgLbl = 'OBPOS_NegativePaymentOnReceipt';
+        }
+      }
+      payments.each(function (payment) {
+        if (me.alreadyPaid) {
+          me.avoidCompleteReceipt = true;
+          errorMsgLbl = 'OBPOS_UnnecessaryPaymentAdded';
+          return false;
+        }
+        if (!payment.get('isReversePayment') && !payment.get('isReversed') && !payment.get('isPrePayment')) {
+          totalPaid = OB.DEC.add(totalPaid, payment.get('amount'));
+          if (totalPaid >= totalToPaid) {
+            me.alreadyPaid = true;
+          }
+        }
+      });
+      if (this.avoidCompleteReceipt) {
+        OB.UTIL.showConfirmation.display(OB.I18N.getLabel('OBMOBC_Error'), OB.I18N.getLabel(errorMsgLbl));
+        OB.UTIL.SynchronizationHelper.finished(synchId, "doneButton");
+        return;
       }
 
       payments.each(function (payment) {
@@ -1118,7 +1153,7 @@
         }
       });
 
-      if (myModel.get('leftColumnViewManager').isOrder()) {
+      if (!isMultiOrder) {
         if (this.drawerpreference && this.allowOpenDrawer) {
           if (this.drawerOpened) {
             if (this.owner.receipt.get('orderType') === 3 && !this.owner.receipt.get('cancelLayaway')) {
