diff --git a/web/org.openbravo.retail.discounts.bytotal/js/promotion-freeitemstotal.js b/web/org.openbravo.retail.discounts.bytotal/js/promotion-freeitemstotal.js
index 8c88a8c..1eb81cf 100644
--- a/web/org.openbravo.retail.discounts.bytotal/js/promotion-freeitemstotal.js
+++ b/web/org.openbravo.retail.discounts.bytotal/js/promotion-freeitemstotal.js
@@ -15,6 +15,12 @@ OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'] = {
   async: true,
   discountedUnits: {},
   implementation: function (discountRule, receipt, line, listener) {
+    OB.MobileApp.model.receipt.off('calculatedReceipt', null, OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF']);
+    OB.MobileApp.model.receipt.on('calculatedReceipt', function () {
+      OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'].discountedUnits = {};
+      receipt.off('calculatedReceipt', null, OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'].removeDiscountedUnits);
+    }, OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF']);
+
     if (!OB.Model.Discounts.DISCT.doProcess()) {
       // nothing to do for now
       listener.trigger('completed');
@@ -52,7 +58,7 @@ OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'] = {
 
             fp = OB.Model.Discounts.DISCT.isFreeProduct(l.get('product'), freeProducts);
             if (fp) {
-              fpId = fp.get('product');
+              fpId = fp.get('product') + '-' + discountRule.id;
 
               // a product can be in more than one line, keep count of how many units
               // have already been discounted
@@ -65,7 +71,7 @@ OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'] = {
               dr.discountedUnits[fpId] += unitsToDiscount;
 
               _.each(l.get('promotions'), function (p) {
-                if (p.discountType === discountRule.get('discountType')) {
+                if (p.ruleId === discountRule.get('ruleId')) {
                   discountApplied = true;
                   return;
                 }
