From 4c177cf0ef3b2b2a036aa71f6ed63d60f5eaa5a3 Mon Sep 17 00:00:00 2001
From: Rafael Queralta <rafaelcuba81@gmail.com>
Date: Mon, 21 Jun 2021 17:53:31 -0400
Subject: [PATCH] Fixed BUG-47029: Added change value to lastOrder ticket
 payment

---
 .../js/printLastButton.js                     | 70 +++++++++++++++++++
 1 file changed, 70 insertions(+)

diff --git a/web/org.openbravo.retail.printlast/js/printLastButton.js b/web/org.openbravo.retail.printlast/js/printLastButton.js
index 3a79d05..cbfd9a9 100644
--- a/web/org.openbravo.retail.printlast/js/printLastButton.js
+++ b/web/org.openbravo.retail.printlast/js/printLastButton.js
@@ -59,6 +59,7 @@
         function(order) {
           if (!_.isEqual(this.lastOrder, order)) {
             OB.UTIL.clone(order, this.lastOrder);
+            includeOverPaymentAmt(this.lastOrder);
           }
         },
         this
@@ -68,10 +69,79 @@
         function(order) {
           if (!_.isEqual(this.lastOrder, order)) {
             OB.UTIL.clone(order, this.lastOrder);
+            includeOverPaymentAmt(this.lastOrder);
           }
         },
         this
       );
+
+      function includeOverPaymentAmt(ticket) {
+        const changePrePayments = ticket
+          .get('payments')
+          .models.filter(payment => {
+            const { paymentData } = payment;
+            return paymentData && paymentData.changePayment;
+          });
+        const ticketPayments = ticket
+          .get('payments')
+          .models.filter(payment => {
+            const { paymentData } = payment;
+            return !paymentData || !paymentData.changePayment;
+          })
+          .map(payment => {
+            const newPayment = { ...payment };
+            const { paymentData } = payment;
+            for (let i = 0; i < changePrePayments.length; i += 1) {
+              if (
+                changePrePayments[i].kind === payment.kind &&
+                (!payment.isPrePayment ||
+                  (paymentData &&
+                    Math.abs(paymentData.amount) ===
+                      Math.abs(changePrePayments[i].amount)))
+              ) {
+                const changePayment = changePrePayments.splice(i, 1)[0];
+                newPayment.amount = changePayment.amount
+                  ? changePayment.amount
+                  : 0;
+                break;
+              }
+            }
+            return newPayment;
+          });
+
+        ticketPayments.map(payment => {
+          const overPaymentAmounts = { amount: 0, origAmount: 0 };
+
+          if (
+            ticket.get('changePayments') &&
+            ticket.get('changePayments').length > 0
+          ) {
+            // Do not print over-payment amount for MultiTicket payments
+            const changePayments = ticket
+              .get('changePayments')
+              .filter(
+                chngpayment => chngpayment.key === payment.attributes.kind
+              );
+            const changeAmountPayment = changePayments.find(p => p.amount);
+            overPaymentAmounts.amount = changeAmountPayment
+              ? changeAmountPayment.amount
+              : 0;
+            const changeOrigAmountPayment = changePayments.find(
+              p => p.origAmount
+            );
+            overPaymentAmounts.origAmount = changeOrigAmountPayment
+              ? changeOrigAmountPayment.origAmount
+              : 0;
+          }
+          if (overPaymentAmounts.amount || overPaymentAmounts.origAmount) {
+            const { amount, origAmount } = overPaymentAmounts;
+            payment.attributes.amount += ticket.isNegative() ? -amount : amount;
+            payment.attributes.origAmount += ticket.isNegative()
+              ? -origAmount
+              : origAmount;
+          }
+        });
+      }
     }
   });
 
-- 
2.28.0

