Project: 	
  | View Issue Details[ Jump to Notes ] | [ Issue History ] [ Print ] | |||||||
| ID | ||||||||
| 0043880 | ||||||||
| Type | Category | Severity | Reproducibility | Date Submitted | Last Update | |||
| defect | [Retail Modules] Discounts by Total | major | always | 2020-04-27 13:41 | 2020-05-25 09:33 | |||
| Reporter | Leyre | View Status | public | |||||
| Assigned To | ranjith_qualiantech_com | |||||||
| Priority | urgent | Resolution | unable to reproduce | Fixed in Version | RR19Q4 | |||
| Status | closed | Fix in branch | Fixed in SCM revision | |||||
| Projection | none | ETA | none | Target Version | ||||
| OS | Any | Database | Any | Java version | ||||
| OS Version | Database version | Ant version | ||||||
| Product Version | SCM revision | |||||||
| Merge Request Status | ||||||||
| Review Assigned To | marvintm | |||||||
| OBNetwork customer | Gold | |||||||
| Support ticket | 15741 | |||||||
| Regression level | ||||||||
| Regression date | ||||||||
| Regression introduced in release | ||||||||
| Regression introduced by commit | ||||||||
| Triggers an Emergency Pack | No | |||||||
| Summary | 0043880: Using the old discount engine, the "by total" discount is not calculated correctly on the receipt lines | |||||||
| Description | Using the old discount engine, the "by total" discount is not calculated correctly on the receipt lines | |||||||
| Steps To Reproduce | Using the 20Q1 version, add the "Discount rules for Retail by total" module in the correct version: ** In our local instance: Web POS 1.2.6703 Discounts & Promotions Rules for Retail 1.3.6701 Discount rules for Retail by total 1.0.1300 Apply the patches related to the issues 43322 and 43521 (or confirm that the patches are applied) ** Backend: 1. Configure the preference "Web POS Use advanced discounts engine" = N 2. Create a new "User Defined Amount" discount 3. Create a new "Variable Discount per Total Amount" discount ** Web POS: 1. Add two products non grouped with price = 9.90 2. Add another product with price = 2.90 3. Add the first discount "User Defined Amount" = 1 4. Try to add the second discount "Variable Discount per Total Amount" = 10. Verify that the total discount/line is not applied correctly or proportionally on the products. --> ANOTHER EXAMPLE DETECTED: ** Web POS: 1. Add one product = 699.9 2. Add another product 399.9 3. Add the first discount "User Defined Amount" = -20 only to the first product. 4. Add the second discount "Variable Discount per Total Amount" = -100 The sum of the "by total" discount, of all the lines is not 100  | |||||||
| Tags | No tags attached. | |||||||
| Attached Files | # HG changeset patch
# User Ranjith S R <ranjith@qualiantech.com>
# Date 1589358087 -19800
#      Wed May 13 13:51:27 2020 +0530
# Node ID 81eaca9f48fa85ee0ab598c5d68ce9fcedb85d94
# Parent  95a79c86bcff41cddf04bd0924f53a40415b7485
Related to issue 43880 : Discount should be calculated based on Total Receipt Amount
* Total Discount Amount will be calculated for the total receipt amount which excludes
  manual promotions amount or any other promotions amount.
diff -r 95a79c86bcff -r 81eaca9f48fa web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js
--- a/web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js	Tue May 05 11:00:47 2020 +0200
+++ b/web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js	Wed May 13 13:51:27 2020 +0530
@@ -117,24 +117,32 @@
           );
           //Calculate the discounts applied to receipt, to update the total receipt
           discountReceipt = preprocess.linesToCompute.reduce(function(memo, l) {
-            var discount = 0,
-              ruleApplied = _.find(l.line.get('promotions'), function(p) {
-                return p.ruleId === ruleFromReceipt.get('rule').id;
-              });
+            var discount = 0;
             if (
-              !l.line.get('splitline') &&
-              OB.UTIL.isNullOrUndefined(ruleApplied)
+              l.line.get('promotions') &&
+              l.line.get('promotions').length > 0
             ) {
-              discount =
-                l.line.getDiscount() > 0
-                  ? l.line.getDiscount()
-                  : !OB.UTIL.isNullOrUndefined(
-                      l.line.get('manualPromotions')
-                    ) && l.line.get('manualPromotions').length > 0
-                  ? l.line.get('manualPromotions').reduce(function(memo, mp) {
-                      return OB.DEC.add(memo, mp.amt);
-                    }, 0)
-                  : 0;
+              l.line.get('promotions').forEach(function(prom) {
+                if (OB.UTIL.isNullOrUndefined(prom.amt)) {
+                  return;
+                }
+                if (
+                  prom.ruleId !== discountRule.get('id') &&
+                  prom.rule.get('userAmt') !== discountRule.get('userAmt')
+                ) {
+                  discount = OB.DEC.add(discount, prom.amt);
+                }
+              });
+            } else if (
+              l.line.get('manualPromotions') &&
+              l.line.get('manualPromotions').length > 0
+            ) {
+              l.line.get('manualPromotions').forEach(function(prom) {
+                if (OB.UTIL.isNullOrUndefined(prom.amt)) {
+                  return;
+                }
+                discount = OB.DEC.add(discount, prom.amt);
+              });
             }
             return OB.DEC.add(memo, discount);
           }, 0);
# HG changeset patch
# User Ranjith S R <ranjith@qualiantech.com>
# Date 1589358127 -19800
#      Wed May 13 13:52:07 2020 +0530
# Node ID 0518edd6f88ca56c112956bc813c2ee6e23e8ec5
# Parent  25925187c340cd17b0e608123a7937645222746a
Verifies issue 43880 : Added Automated Test I43880_VerifyTotalDiscounts
diff -r 25925187c340 -r 0518edd6f88c src-test/org/openbravo/test/mobile/retail/extmodules/selenium/TestIdExtModules.java
--- a/src-test/org/openbravo/test/mobile/retail/extmodules/selenium/TestIdExtModules.java	Mon May 11 11:35:51 2020 +0530
+++ b/src-test/org/openbravo/test/mobile/retail/extmodules/selenium/TestIdExtModules.java	Wed May 13 13:52:07 2020 +0530
@@ -768,6 +768,8 @@
   // Discount Category
   public static TestIdConstructor BUTTON_DISCOUNTSCATEGORY_DISCOUNTSLIST = new TestIdConstructor(
       "coreElementContainer_discountsList", EnyoKind.BUTTON); //
+  public static TestIdConstructor BUTTON_DISCOUNTSCATEGORY_SEARCHBOX = new TestIdConstructor(
+      "discatlistitemprinter_filterText"); //
   public static TestIdConstructor BUTTON_DISCOUNTCATEGORY_SEARCH = new TestIdConstructor(
       "discatlistitemprinter_button2", EnyoKind.BUTTON);
   public static TestIdConstructor BUTTON_DISCOUNTCATEGORY_ROW1 = new TestIdConstructor(
diff -r 25925187c340 -r 0518edd6f88c src-test/org/openbravo/test/mobile/retail/extmodules/selenium/tests/discounts_bytotal/I43880_VerifyTotalDiscounts.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src-test/org/openbravo/test/mobile/retail/extmodules/selenium/tests/discounts_bytotal/I43880_VerifyTotalDiscounts.java	Wed May 13 13:52:07 2020 +0530
@@ -0,0 +1,330 @@
+/*
+ *************************************************************************
+ * The contents of this file are subject to the Openbravo Public License
+ * Version 1.0 (the "License"), being the Mozilla Public License
+ * Version 1.1 with a permitted attribution clause; you may not use this
+ * file except in compliance with the License. You may obtain a copy of
+ * the License at http://www.openbravo.com/legal/license.html
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * The Original Code is Openbravo ERP.
+ * The Initial Developer of the Original Code is Openbravo S.L.U.
+ * All portions are Copyright (C) 2019 Openbravo S.L.U.
+ * All Rights Reserved.
+ * Contributor(s):
+ ************************************************************************
+ *
+ * @author RAN
+ *
+ */
+
+package org.openbravo.test.mobile.retail.extmodules.selenium.tests.discounts_bytotal;
+
+import org.junit.Test;
+import org.openbravo.test.mobile.retail.extmodules.selenium.TestIdExtModules;
+import org.openbravo.test.mobile.retail.extmodules.selenium.terminals.WebPOSExtModulesTerminalHelper;
+
+public class I43880_VerifyTotalDiscounts extends WebPOSExtModulesTerminalHelper {
+  final String PRODUCT_NAME_1 = "Basecamp lantern";
+  final String PRODUCT_NAME_2 = "Basecamp lantern with legs";
+  final String PRODUCT_NAME_3 = "Backpack ADP2 12l";
+  final String VAR_DISCOUNT_AMT_NAME = "disc_5_var_euro";
+  final String VAR_TOTALDISCOUNT_AMT_NAME = "Variable Amount Discount By Total";
+
+  @Test
+  public void test() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_1);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "55.50");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_6);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "699.90");
+
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_2);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "731.80");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "1,099.80");
+
+    // Add User defined Discount
+    getDiscount(VAR_DISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1_CHECKBOX);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "1,079.80");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-20.00");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "979.80");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-20.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT2, "-62.97");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-37.03");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  @Test
+  public void test2() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_3);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "40.00");
+
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_2);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "71.90");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "61.80");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "51.70");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "22.70");
+
+    // Add User defined Discount
+    getDiscount(VAR_DISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_CHECKAPPLYALL);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "19.70");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-1.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-1.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT, "-1.00");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "9.70");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-1.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME2_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT2_EXTMOD, "-4.52");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-1.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME2_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT2_EXTMOD, "-4.52");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT, "-1.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT2, "-0.96");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  @Test
+  public void test3() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_3);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "20.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "40.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "60.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "80.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "100.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "120.00");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW4);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW5);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW6);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "119.40");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_6);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "59.40");
+
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 60 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-10.00");
+
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 60 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-10.00");
+
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 60 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT_EXTMOD, "-10.00");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  @Test
+  public void test4() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_1);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "55.50");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "100.00");
+
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_2);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "131.90");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "300.00");
+
+    // Add User defined Discount
+    getDiscount(VAR_DISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_5);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2_CHECKBOX);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "250.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-50.00");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_8);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "70.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 180 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-72.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-50.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 180 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT2, "-108.00");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  private void getDiscount(String discountName) {
+    tap(TestIdExtModules.BUTTON_MENU);
+    tap(TestIdExtModules.BUTTON_MENU_RECEIPTDISCOUNTS);
+    tap(TestIdExtModules.BUTTON_DISCOUNTSCATEGORY_DISCOUNTSLIST);
+    write(TestIdExtModules.BUTTON_DISCOUNTSCATEGORY_SEARCHBOX, discountName);
+    tap(TestIdExtModules.BUTTON_DISCOUNTCATEGORY_SEARCH);
+    tap(TestIdExtModules.BUTTON_DISCOUNTCATEGORY_ROW1);
+  }
+}
# HG changeset patch
# User Ranjith S R <ranjith@qualiantech.com>
# Date 1589820972 -19800
#      Mon May 18 22:26:12 2020 +0530
# Node ID df9ff9761dfaaaf75bea24f06dceed2a3b05d5a1
# Parent  132fdcec4c2f031bbf4ef530685235dcbfa88785
Related to issue 43880 : Discount should be calculated based on Total Receipt Amount
* Total Discount Amount will be calculated for the total receipt amount which excludes
  manual promotions amount or any other promotions amount.
diff -r 132fdcec4c2f -r df9ff9761dfa web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js
--- a/web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js	Thu Apr 02 15:43:26 2020 +0200
+++ b/web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js	Mon May 18 22:26:12 2020 +0530
@@ -308,7 +308,6 @@
       if (!discountRule.get('applyNext')) {
         OB.Model.Discounts.DISCT.removeAutoPromotionsFromReceipt(receipt);
       }
-
       var accumdiscount = 0;
       OB.Model.Discounts.DISCT.preprocess(
         discountRule,
@@ -321,32 +320,43 @@
             ruleFromReceipt.get('rule').userAmt ||
             discountRule.get('userAmt') ||
             discountRule.get('disctTotalamountdisc');
-          preprocess.linesToCompute = _.sortBy(
-            preprocess.linesToCompute,
-            function(rule) {
-              return rule.line.get('discountedNet');
-            }
-          );
           //Calculate the discounts applied to receipt, to update the total receipt
           discountReceipt = preprocess.linesToCompute.reduce(function(memo, l) {
             var discount = 0,
-              ruleApplied = _.find(l.line.get('promotions'), function(p) {
-                return p.ruleId === ruleFromReceipt.get('rule').id;
-              });
+              promotionList = l.line.get('promotions') || [];
+            var promoApplied = _.filter(promotionList, function(p) {
+              return (
+                p.ruleId === ruleFromReceipt.get('rule').id &&
+                p.discountinstance ===
+                  ruleFromReceipt.get('rule').discountinstance
+              );
+            });
+            if (promoApplied.length > 0) {
+              return memo;
+            }
+            if (l.line.get('orderManualPromotionsAlreadyApplied')) {
+              return memo;
+            }
+            promotionList.forEach(function(p) {
+              if (OB.UTIL.isNullOrUndefined(p.amt) || p.manual) {
+                return;
+              }
+
+              if (
+                p.ruleId !== discountRule.get('id') &&
+                p.discountinstance ===
+                  ruleFromReceipt.get('rule').discountinstance
+              ) {
+                discount = OB.DEC.add(discount, p.amt);
+              }
+            });
             if (
-              !l.line.get('splitline') &&
-              OB.UTIL.isNullOrUndefined(ruleApplied)
+              l.line.get('manualPromotions') &&
+              l.line.get('manualPromotions').length > 0
             ) {
-              discount =
-                l.line.getDiscount() > 0
-                  ? l.line.getDiscount()
-                  : !OB.UTIL.isNullOrUndefined(
-                      l.line.get('manualPromotions')
-                    ) && l.line.get('manualPromotions').length > 0
-                  ? l.line.get('manualPromotions').reduce(function(memo, mp) {
-                      return OB.DEC.add(memo, mp.amt);
-                    }, 0)
-                  : 0;
+              l.line.get('manualPromotions').forEach(function(p) {
+                discount = OB.DEC.add(discount, p.amt);
+              });
             }
             return OB.DEC.add(memo, discount);
           }, 0);
@@ -359,26 +369,28 @@
               linePrice = l.total,
               promotionList = [],
               promoApplied = null;
-            // distributing  discount in all lines based on total of each one
-            // if PIT, in gross
-            // if no PIT, in net
-            if (!l.line.get('splitline')) {
-              if (!OB.UTIL.isNullOrUndefined(l.line.get('promotions'))) {
-                promotionList = l.line.get('promotions');
-              }
-              if (!OB.UTIL.isNullOrUndefined(l.line.get('manualPromotions'))) {
-                promotionList = promotionList.concat(
-                  l.line.get('manualPromotions')
-                );
-              }
-              promotionList = _.uniq(promotionList, false, function(p) {
-                return p.ruleId;
+
+            if (
+              !OB.UTIL.isNullOrUndefined(l.line.get('promotions')) &&
+              l.line.get('promotions').length > 0
+            ) {
+              l.line.get('promotions').forEach(function(p) {
+                if (OB.UTIL.isNullOrUndefined(p.amt) || p.manual) {
+                  return;
+                }
+                promotionList.push(p);
               });
             }
+            if (!OB.UTIL.isNullOrUndefined(l.line.get('manualPromotions'))) {
+              promotionList = promotionList.concat(
+                l.line.get('manualPromotions')
+              );
+            }
             promoApplied = _.find(promotionList, function(p) {
               return (
                 p.ruleId === discountRule.get('id') &&
-                p.rule.get('userAmt') === discountRule.get('userAmt')
+                p.discountinstance ===
+                  ruleFromReceipt.get('rule').discountinstance
               );
             });
             if (!OB.UTIL.isNullOrUndefined(promoApplied)) {
# HG changeset patch
# User Ranjith S R <ranjith@qualiantech.com>
# Date 1589821023 -19800
#      Mon May 18 22:27:03 2020 +0530
# Node ID 159afc437135551f808d99367e883f921287ee2b
# Parent  46a6471562f48f1c8ecfb86670a05b44b761e3d7
Verifies issue 43880 : Added Automated Test I43880_VerifyTotalDiscounts
diff -r 46a6471562f4 -r 159afc437135 src-test/org/openbravo/test/mobile/retail/extmodules/selenium/TestIdExtModules.java
--- a/src-test/org/openbravo/test/mobile/retail/extmodules/selenium/TestIdExtModules.java	Mon May 18 16:42:03 2020 +0530
+++ b/src-test/org/openbravo/test/mobile/retail/extmodules/selenium/TestIdExtModules.java	Mon May 18 22:27:03 2020 +0530
@@ -766,6 +766,8 @@
   // Discount Category
   public static TestIdConstructor BUTTON_DISCOUNTSCATEGORY_DISCOUNTSLIST = new TestIdConstructor(
       "coreElementContainer_discountsList", EnyoKind.BUTTON); //
+  public static TestIdConstructor BUTTON_DISCOUNTSCATEGORY_SEARCHBOX = new TestIdConstructor(
+      "discatlistitemprinter_filterText"); //
   public static TestIdConstructor BUTTON_DISCOUNTCATEGORY_SEARCH = new TestIdConstructor(
       "discatlistitemprinter_button2", EnyoKind.BUTTON);
   public static TestIdConstructor BUTTON_DISCOUNTCATEGORY_ROW1 = new TestIdConstructor(
diff -r 46a6471562f4 -r 159afc437135 src-test/org/openbravo/test/mobile/retail/extmodules/selenium/tests/discounts_bytotal/I43880_VerifyTotalDiscounts.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src-test/org/openbravo/test/mobile/retail/extmodules/selenium/tests/discounts_bytotal/I43880_VerifyTotalDiscounts.java	Mon May 18 22:27:03 2020 +0530
@@ -0,0 +1,357 @@
+/*
+ *************************************************************************
+ * The contents of this file are subject to the Openbravo Public License
+ * Version 1.0 (the "License"), being the Mozilla Public License
+ * Version 1.1 with a permitted attribution clause; you may not use this
+ * file except in compliance with the License. You may obtain a copy of
+ * the License at http://www.openbravo.com/legal/license.html
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * The Original Code is Openbravo ERP.
+ * The Initial Developer of the Original Code is Openbravo S.L.U.
+ * All portions are Copyright (C) 2019 Openbravo S.L.U.
+ * All Rights Reserved.
+ * Contributor(s):
+ ************************************************************************
+ *
+ * @author RAN
+ *
+ */
+
+package org.openbravo.test.mobile.retail.extmodules.selenium.tests.discounts_bytotal;
+
+import org.junit.Test;
+import org.openbravo.test.mobile.retail.extmodules.selenium.TestIdExtModules;
+import org.openbravo.test.mobile.retail.extmodules.selenium.terminals.WebPOSExtModulesTerminalHelper;
+
+public class I43880_VerifyTotalDiscounts extends WebPOSExtModulesTerminalHelper {
+  final String PRODUCT_NAME_1 = "Basecamp lantern";
+  final String PRODUCT_NAME_2 = "Basecamp lantern with legs";
+  final String PRODUCT_NAME_3 = "Backpack ADP2 12l";
+  final String PRODUCT_NAME_4 = "Headlamp ultralight";
+  final String VAR_DISCOUNT_AMT_NAME = "disc_5_var_euro";
+  final String VAR_TOTALDISCOUNT_AMT_NAME = "Variable Amount Discount By Total";
+  final String VAR_TOTALDISCOUNT_PERCENT_NAME = "Variable Percentage Discount By Total";
+
+  @Test
+  public void test() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_1);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "55.50");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_6);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "699.90");
+
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_2);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "731.80");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "1,099.80");
+
+    // Add User defined Discount
+    getDiscount(VAR_DISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1_CHECKBOX);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "1,079.80");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-20.00");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "979.80");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-20.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT2, "-62.97");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-37.03");
+
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_4);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "998.70");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_5);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "1,039.70");
+
+    // Add User defined Discount
+    getDiscount(VAR_DISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3_CHECKBOX);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "1,029.70");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT, "-10.00");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  @Test
+  public void test2() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_3);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "20.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "40.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "60.00");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "22.70");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "12.70");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-4.36");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-4.36");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT_EXTMOD, "-1.28");
+
+    // Add Variable Percentage Discount By Total
+    getDiscount(VAR_TOTALDISCOUNT_PERCENT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "10.16");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-4.36");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME2_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_PERCENT_NAME + " - 20%");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT2_EXTMOD, "-1.11");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-4.36");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME2_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_PERCENT_NAME + " - 20%");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT2_EXTMOD, "-1.11");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT_EXTMOD, "-1.28");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME2_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_PERCENT_NAME + " - 20%");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT2_EXTMOD, "-0.32");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  @Test
+  public void test3() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_3);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "20.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "40.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "60.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "80.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "100.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "120.00");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW4);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW5);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW6);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "119.40");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_6);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "59.40");
+
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 60 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-10.00");
+
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 60 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-10.00");
+
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 60 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT_EXTMOD, "-10.00");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  @Test
+  public void test4() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_1);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "55.50");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "100.00");
+
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_2);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "131.90");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "300.00");
+
+    // Add User defined Discount
+    getDiscount(VAR_DISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_5);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2_CHECKBOX);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "250.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-50.00");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_8);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "70.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 180 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-72.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-50.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 180 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT2, "-108.00");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  private void getDiscount(String discountName) {
+    tap(TestIdExtModules.BUTTON_MENU);
+    tap(TestIdExtModules.BUTTON_MENU_RECEIPTDISCOUNTS);
+    tap(TestIdExtModules.BUTTON_DISCOUNTSCATEGORY_DISCOUNTSLIST);
+    write(TestIdExtModules.BUTTON_DISCOUNTSCATEGORY_SEARCHBOX, discountName);
+    tap(TestIdExtModules.BUTTON_DISCOUNTCATEGORY_SEARCH);
+    tap(TestIdExtModules.BUTTON_DISCOUNTCATEGORY_ROW1);
+  }
+}
diff -r 46a6471562f4 -r 159afc437135 src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java
--- a/src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java	Mon May 18 16:42:03 2020 +0530
+++ b/src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java	Mon May 18 22:27:03 2020 +0530
@@ -2899,6 +2899,10 @@
       "listOrderLines_row3_control3"); //
   public static TestIdConstructor LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT_EXTMOD = new TestIdConstructor(
       "listOrderLines_row3_control4"); //
+  public static TestIdConstructor LABEL_RECEIPT_ROW3_DISCOUNTNAME2_EXTMOD = new TestIdConstructor(
+      "listOrderLines_row3_control7"); //
+  public static TestIdConstructor LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT2_EXTMOD = new TestIdConstructor(
+      "listOrderLines_row3_control8"); //
   public static TestIdConstructor LABEL_RECEIPT_ROW4_DISCOUNTNAME_EXTMOD = new TestIdConstructor(
       "listOrderLines_row4_control3"); //
   public static TestIdConstructor LABEL_RECEIPT_ROW4_DISCOUNTAMOUNT_EXTMOD = new TestIdConstructor(
# HG changeset patch
# User Ranjith S R <ranjith@qualiantech.com>
# Date 1590391784 -19800
#      Mon May 25 12:59:44 2020 +0530
# Node ID b1749737146291fd0cf3efd5d10c81117f60c9e1
# Parent  132fdcec4c2f031bbf4ef530685235dcbfa88785
Related to issue 43880 : Discount should be calculated based on Total Receipt Amount
* Total Discount Amount will be calculated for the total receipt amount which excludes
  manual promotions amount or any other promotions amount.
diff -r 132fdcec4c2f -r b17497371462 web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js
--- a/web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js	Thu Apr 02 15:43:26 2020 +0200
+++ b/web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js	Mon May 25 12:59:44 2020 +0530
@@ -308,7 +308,6 @@
       if (!discountRule.get('applyNext')) {
         OB.Model.Discounts.DISCT.removeAutoPromotionsFromReceipt(receipt);
       }
-
       var accumdiscount = 0;
       OB.Model.Discounts.DISCT.preprocess(
         discountRule,
@@ -321,32 +320,59 @@
             ruleFromReceipt.get('rule').userAmt ||
             discountRule.get('userAmt') ||
             discountRule.get('disctTotalamountdisc');
-          preprocess.linesToCompute = _.sortBy(
-            preprocess.linesToCompute,
-            function(rule) {
-              return rule.line.get('discountedNet');
-            }
-          );
+
+          var orderManualPromotions =
+              receipt.get('orderManualPromotions') || [],
+            discountOrderNo = _.find(orderManualPromotions.models, function(p) {
+              return p.get('discountRule').get('id') === discountRule.get('id');
+            }).get('rule').noOrder,
+            validateDiscountOrder = function(currentDiscountRule) {
+              var appliedTotalDiscount = _.find(
+                orderManualPromotions.models,
+                function(p) {
+                  return (
+                    p.get('discountRule').get('id') ===
+                    currentDiscountRule.ruleId
+                  );
+                }
+              );
+              if (
+                appliedTotalDiscount &&
+                appliedTotalDiscount.get('rule').noOrder &&
+                appliedTotalDiscount.get('rule').noOrder >= discountOrderNo
+              ) {
+                return true;
+              }
+              return false;
+            };
+
           //Calculate the discounts applied to receipt, to update the total receipt
           discountReceipt = preprocess.linesToCompute.reduce(function(memo, l) {
             var discount = 0,
-              ruleApplied = _.find(l.line.get('promotions'), function(p) {
-                return p.ruleId === ruleFromReceipt.get('rule').id;
-              });
+              promotionList = l.line.get('promotions') || [];
+            promotionList.forEach(function(p) {
+              if (
+                OB.UTIL.isNullOrUndefined(p.amt) ||
+                p.manual ||
+                validateDiscountOrder(p)
+              ) {
+                return;
+              }
+              if (
+                p.ruleId !== discountRule.get('id') &&
+                p.discountinstance ===
+                  ruleFromReceipt.get('rule').discountinstance
+              ) {
+                discount = OB.DEC.add(discount, p.amt);
+              }
+            });
             if (
-              !l.line.get('splitline') &&
-              OB.UTIL.isNullOrUndefined(ruleApplied)
+              l.line.get('manualPromotions') &&
+              l.line.get('manualPromotions').length > 0
             ) {
-              discount =
-                l.line.getDiscount() > 0
-                  ? l.line.getDiscount()
-                  : !OB.UTIL.isNullOrUndefined(
-                      l.line.get('manualPromotions')
-                    ) && l.line.get('manualPromotions').length > 0
-                  ? l.line.get('manualPromotions').reduce(function(memo, mp) {
-                      return OB.DEC.add(memo, mp.amt);
-                    }, 0)
-                  : 0;
+              l.line.get('manualPromotions').forEach(function(p) {
+                discount = OB.DEC.add(discount, p.amt);
+              });
             }
             return OB.DEC.add(memo, discount);
           }, 0);
@@ -359,26 +385,32 @@
               linePrice = l.total,
               promotionList = [],
               promoApplied = null;
-            // distributing  discount in all lines based on total of each one
-            // if PIT, in gross
-            // if no PIT, in net
-            if (!l.line.get('splitline')) {
-              if (!OB.UTIL.isNullOrUndefined(l.line.get('promotions'))) {
-                promotionList = l.line.get('promotions');
-              }
-              if (!OB.UTIL.isNullOrUndefined(l.line.get('manualPromotions'))) {
-                promotionList = promotionList.concat(
-                  l.line.get('manualPromotions')
-                );
-              }
-              promotionList = _.uniq(promotionList, false, function(p) {
-                return p.ruleId;
+
+            if (
+              !OB.UTIL.isNullOrUndefined(l.line.get('promotions')) &&
+              l.line.get('promotions').length > 0
+            ) {
+              l.line.get('promotions').forEach(function(p) {
+                if (
+                  OB.UTIL.isNullOrUndefined(p.amt) ||
+                  p.manual ||
+                  validateDiscountOrder(p)
+                ) {
+                  return;
+                }
+                promotionList.push(p);
               });
             }
+            if (!OB.UTIL.isNullOrUndefined(l.line.get('manualPromotions'))) {
+              promotionList = promotionList.concat(
+                l.line.get('manualPromotions')
+              );
+            }
             promoApplied = _.find(promotionList, function(p) {
               return (
                 p.ruleId === discountRule.get('id') &&
-                p.rule.get('userAmt') === discountRule.get('userAmt')
+                p.discountinstance ===
+                  ruleFromReceipt.get('rule').discountinstance
               );
             });
             if (!OB.UTIL.isNullOrUndefined(promoApplied)) {
@@ -431,19 +463,14 @@
             definition.extraProperties =
               ruleFromReceipt.get('rule').extraProperties || {};
             definition.extraProperties.lineQtyOffer = l.line.get('qty');
-            if (
-              !line.get('splitline') &&
-              l.line.get('promotions') &&
-              l.line.get('promotions').length > 0
-            ) {
-              var discountedGross = l.line
-                .get('promotions')
-                .reduce(function(memo, element) {
-                  return OB.DEC.add(
-                    memo,
-                    element.actualAmt || element.amt || 0
-                  );
-                }, 0);
+            if (promotionList.length > 0) {
+              var discountedGross = promotionList.reduce(function(
+                memo,
+                element
+              ) {
+                return OB.DEC.add(memo, element.actualAmt || element.amt || 0);
+              },
+              0);
               if (
                 OB.DEC.sub(
                   l.line.getGross(),
# HG changeset patch
# User Ranjith S R <ranjith@qualiantech.com>
# Date 1589821023 -19800
#      Mon May 18 22:27:03 2020 +0530
# Node ID 146f562d61e0adb34088735f0ded2689f83cf63b
# Parent  455deb3b612810b59b007cd8155080816911c7b4
Verifies issue 43880 : Added Automated Test I43880_VerifyTotalDiscounts
diff -r 455deb3b6128 -r 146f562d61e0 src-test/org/openbravo/test/mobile/retail/extmodules/selenium/TestIdExtModules.java
--- a/src-test/org/openbravo/test/mobile/retail/extmodules/selenium/TestIdExtModules.java	Mon May 25 10:32:04 2020 +0530
+++ b/src-test/org/openbravo/test/mobile/retail/extmodules/selenium/TestIdExtModules.java	Mon May 18 22:27:03 2020 +0530
@@ -766,6 +766,8 @@
   // Discount Category
   public static TestIdConstructor BUTTON_DISCOUNTSCATEGORY_DISCOUNTSLIST = new TestIdConstructor(
       "coreElementContainer_discountsList", EnyoKind.BUTTON); //
+  public static TestIdConstructor BUTTON_DISCOUNTSCATEGORY_SEARCHBOX = new TestIdConstructor(
+      "discatlistitemprinter_filterText"); //
   public static TestIdConstructor BUTTON_DISCOUNTCATEGORY_SEARCH = new TestIdConstructor(
       "discatlistitemprinter_button2", EnyoKind.BUTTON);
   public static TestIdConstructor BUTTON_DISCOUNTCATEGORY_ROW1 = new TestIdConstructor(
diff -r 455deb3b6128 -r 146f562d61e0 src-test/org/openbravo/test/mobile/retail/extmodules/selenium/tests/discounts_bytotal/I43880_VerifyTotalDiscounts.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src-test/org/openbravo/test/mobile/retail/extmodules/selenium/tests/discounts_bytotal/I43880_VerifyTotalDiscounts.java	Mon May 18 22:27:03 2020 +0530
@@ -0,0 +1,457 @@
+/*
+ *************************************************************************
+ * The contents of this file are subject to the Openbravo Public License
+ * Version 1.0 (the "License"), being the Mozilla Public License
+ * Version 1.1 with a permitted attribution clause; you may not use this
+ * file except in compliance with the License. You may obtain a copy of
+ * the License at http://www.openbravo.com/legal/license.html
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * The Original Code is Openbravo ERP.
+ * The Initial Developer of the Original Code is Openbravo S.L.U.
+ * All portions are Copyright (C) 2019 Openbravo S.L.U.
+ * All Rights Reserved.
+ * Contributor(s):
+ ************************************************************************
+ *
+ * @author RAN
+ *
+ */
+
+package org.openbravo.test.mobile.retail.extmodules.selenium.tests.discounts_bytotal;
+
+import org.junit.Test;
+import org.openbravo.test.mobile.retail.extmodules.selenium.TestIdExtModules;
+import org.openbravo.test.mobile.retail.extmodules.selenium.terminals.WebPOSExtModulesTerminalHelper;
+
+public class I43880_VerifyTotalDiscounts extends WebPOSExtModulesTerminalHelper {
+  final String PRODUCT_NAME_1 = "Basecamp lantern";
+  final String PRODUCT_NAME_2 = "Basecamp lantern with legs";
+  final String PRODUCT_NAME_3 = "Backpack ADP2 12l";
+  final String PRODUCT_NAME_4 = "Headlamp ultralight";
+  final String VAR_DISCOUNT_AMT_NAME = "disc_5_var_euro";
+  final String VAR_TOTALDISCOUNT_AMT_NAME = "Variable Amount Discount By Total";
+  final String VAR_TOTALDISCOUNT_PERCENT_NAME = "Variable Percentage Discount By Total";
+
+  @Test
+  public void test() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_1);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "55.50");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_6);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "699.90");
+
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_2);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "731.80");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "1,099.80");
+
+    // Add User defined Discount
+    getDiscount(VAR_DISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1_CHECKBOX);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "1,079.80");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-20.00");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "979.80");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-20.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT2, "-62.97");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-37.03");
+
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_4);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "998.70");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_5);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "1,039.70");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-20.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT2, "-59.66");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-35.09");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT, "-5.25");
+
+    // Add User defined Discount
+    getDiscount(VAR_DISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3_CHECKBOX);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "1,029.70");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-20.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT2, "-60.18");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-35.40");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT, "-10.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 100 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT2, "-4.42");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  @Test
+  public void test2() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_3);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "20.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "40.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "60.00");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "22.70");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "12.70");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-4.36");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-4.36");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT_EXTMOD, "-1.28");
+
+    // Add Variable Percentage Discount By Total
+    getDiscount(VAR_TOTALDISCOUNT_PERCENT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "10.16");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-4.36");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME2_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_PERCENT_NAME + " - 20%");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT2_EXTMOD, "-1.11");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-4.36");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME2_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_PERCENT_NAME + " - 20%");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT2_EXTMOD, "-1.11");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT_EXTMOD, "-1.28");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME2_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_PERCENT_NAME + " - 20%");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT2_EXTMOD, "-0.32");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  @Test
+  public void test3() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_3);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "20.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "40.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "60.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "80.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "100.00");
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "120.00");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW4);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW5);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW6);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "119.40");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_6);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "59.40");
+
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 60 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-10.00");
+
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 60 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-10.00");
+
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 60 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT_EXTMOD, "-10.00");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  @Test
+  public void test4() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_1);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "55.50");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "100.00");
+
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_2);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "131.90");
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "300.00");
+
+    // Add User defined Discount
+    getDiscount(VAR_DISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_5);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2_CHECKBOX);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "250.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-50.00");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_8);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "70.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 180 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT, "-72.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT, "-50.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 180 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT2, "-108.00");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  @Test
+  public void test5() {
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_3);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "40.00");
+
+    tap(TestIdExtModules.BUTTON_SEARCH);
+    write(TestIdExtModules.FIELD_SEARCH_TEXT, PRODUCT_NAME_2);
+    tap(TestIdExtModules.BUTTON_SEARCH_EXECUTE);
+    tap(TestIdExtModules.BUTTON_SEARCHPRODUCT_FIRSTROW);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "71.90");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "61.80");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "51.70");
+
+    tap(TestIdExtModules.BUTTON_RECEIPT_ROW3);
+    tap(TestIdExtModules.BUTTON_KEYPAD_2);
+    tap(TestIdExtModules.BUTTON_KEYPAD_DOT);
+    tap(TestIdExtModules.BUTTON_KEYPAD_9);
+    tap(TestIdExtModules.BUTTON_KEYPAD_PRICE);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "22.70");
+
+    // Add User defined Discount
+    getDiscount(VAR_DISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_CHECKAPPLYALL);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "19.70");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-1.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-1.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT, "-1.00");
+
+    // Add Variable Discount per Total Amount
+    getDiscount(VAR_TOTALDISCOUNT_AMT_NAME);
+    tap(TestIdExtModules.BUTTON_KEYPAD_1);
+    tap(TestIdExtModules.BUTTON_KEYPAD_0);
+    tap(TestIdExtModules.BUTTON_KEYPAD_ENTER);
+    tap(TestIdExtModules.BUTTON_RECEIPTDISCOUNTS_APPLY);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "9.70");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME_EXTMOD, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT_EXTMOD, "-1.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTNAME2_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW1_DISCOUNTAMOUNT2_EXTMOD, "-4.52");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME_EXTMOD, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT_EXTMOD, "-1.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTNAME2_EXTMOD,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW2_DISCOUNTAMOUNT2_EXTMOD, "-4.52");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME, "-- " + VAR_DISCOUNT_AMT_NAME);
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT, "-1.00");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTNAME2,
+        "-- " + VAR_TOTALDISCOUNT_AMT_NAME + " - 10 EUR");
+    verify(TestIdExtModules.LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT2, "-0.96");
+
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT);
+    tap(TestIdExtModules.BUTTON_DELETERECEIPT_CONFIRM);
+    verify(TestIdExtModules.LABEL_TOTALTOPAY, "0.00");
+  }
+
+  private void getDiscount(String discountName) {
+    tap(TestIdExtModules.BUTTON_MENU);
+    tap(TestIdExtModules.BUTTON_MENU_RECEIPTDISCOUNTS);
+    tap(TestIdExtModules.BUTTON_DISCOUNTSCATEGORY_DISCOUNTSLIST);
+    write(TestIdExtModules.BUTTON_DISCOUNTSCATEGORY_SEARCHBOX, discountName);
+    tap(TestIdExtModules.BUTTON_DISCOUNTCATEGORY_SEARCH);
+    tap(TestIdExtModules.BUTTON_DISCOUNTCATEGORY_ROW1);
+  }
+}
diff -r 455deb3b6128 -r 146f562d61e0 src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java
--- a/src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java	Mon May 25 10:32:04 2020 +0530
+++ b/src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java	Mon May 18 22:27:03 2020 +0530
@@ -2899,6 +2899,10 @@
       "listOrderLines_row3_control3"); //
   public static TestIdConstructor LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT_EXTMOD = new TestIdConstructor(
       "listOrderLines_row3_control4"); //
+  public static TestIdConstructor LABEL_RECEIPT_ROW3_DISCOUNTNAME2_EXTMOD = new TestIdConstructor(
+      "listOrderLines_row3_control7"); //
+  public static TestIdConstructor LABEL_RECEIPT_ROW3_DISCOUNTAMOUNT2_EXTMOD = new TestIdConstructor(
+      "listOrderLines_row3_control8"); //
   public static TestIdConstructor LABEL_RECEIPT_ROW4_DISCOUNTNAME_EXTMOD = new TestIdConstructor(
       "listOrderLines_row4_control3"); //
   public static TestIdConstructor LABEL_RECEIPT_ROW4_DISCOUNTAMOUNT_EXTMOD = new TestIdConstructor(
 | |||||||
		  Relationships		[ Relation Graph ] 
		[ Dependency Graph ] 
			 | 
|||||||||||||||
  | 
|||||||||||||||
  		Notes	 | 
|
| 
				(0119839) marvintm (viewer) 2020-05-13 15:41  | 
	The problem cannot be currently reproduced in pi, as it only affected the old discounts engine. We have attached a patch with a solution which can be applied in previous releases. | 
  Issue History	 | 
|||
| Date Modified | Username | Field | Change | 
| 2020-04-27 13:41 | Leyre | New Issue | |
| 2020-04-27 13:41 | Leyre | Assigned To | => Retail | 
| 2020-04-27 13:41 | Leyre | OBNetwork customer | => Gold | 
| 2020-04-27 13:41 | Leyre | Support ticket | => 15741 | 
| 2020-04-27 13:41 | Leyre | Resolution time | => 1589752800 | 
| 2020-04-27 13:41 | Leyre | Triggers an Emergency Pack | => No | 
| 2020-04-27 13:42 | Leyre | Relationship added | related to 0043521 | 
| 2020-04-27 13:43 | Leyre | Relationship added | related to 0043322 | 
| 2020-04-30 10:23 | Leyre | Steps to Reproduce Updated | View Revisions | 
| 2020-04-30 10:23 | Leyre | Steps to Reproduce Updated | View Revisions | 
| 2020-05-05 11:44 | ranjith_qualiantech_com | Assigned To | Retail => ranjith_qualiantech_com | 
| 2020-05-06 04:57 | ranjith_qualiantech_com | Status | new => scheduled | 
| 2020-05-06 12:43 | ranjith_qualiantech_com | File Added: 43880 source bytotal.patch | |
| 2020-05-06 12:47 | ranjith_qualiantech_com | Note Added: 0119623 | |
| 2020-05-11 15:20 | ranjith_qualiantech_com | Note Deleted: 0119623 | |
| 2020-05-12 09:02 | ranjith_qualiantech_com | File Deleted: 43880 source bytotal.patch | |
| 2020-05-13 10:23 | ranjith_qualiantech_com | File Added: 43880 source bytotal.patch | |
| 2020-05-13 10:23 | ranjith_qualiantech_com | File Added: 43880 test.patch | |
| 2020-05-13 15:41 | marvintm | Review Assigned To | => marvintm | 
| 2020-05-13 15:41 | marvintm | Note Added: 0119839 | |
| 2020-05-13 15:41 | marvintm | Status | scheduled => closed | 
| 2020-05-13 15:41 | marvintm | Resolution | open => unable to reproduce | 
| 2020-05-13 15:41 | marvintm | Fixed in Version | => RR19Q4 | 
| 2020-05-18 19:04 | ranjith_qualiantech_com | File Added: 43880_source_bytotal_v2.patch | |
| 2020-05-18 19:05 | ranjith_qualiantech_com | File Added: 43880_source_test_v2.patch | |
| 2020-05-25 09:32 | ranjith_qualiantech_com | File Added: 43880_source_bytotal_v3.patch | |
| 2020-05-25 09:33 | ranjith_qualiantech_com | File Added: 43880_source_test_v3.patch | |
| Copyright © 2000 - 2009 MantisBT Group | 

