--- modulos-nuevos/uc_discounts_alt/uc_discounts/uc_discounts.js 
+++ modulos_patched/uc_discounts_alt/uc_discounts/uc_discounts.js 
@@ -103,17 +103,19 @@
         var line_items = null;
         var errors = null;
         var messages = null;
+        var discount_rates_ids = null;
 
         try
         {
             line_items = calculateDiscountResponse[Drupal.settings.uc_discounts.calculate_discount_response_line_items_key];
             errors = calculateDiscountResponse[Drupal.settings.uc_discounts.calculate_discount_response_errors_key];
             messages = calculateDiscountResponse[Drupal.settings.uc_discounts.calculate_discount_response_messages_key];
+            discount_rates_ids = calculateDiscountResponse[Drupal.settings.uc_discounts.discount_rates_ids];
         }
         catch (e) { }
 
         //Process discount line items and update total (false to not display messages)
-        uc_discountsRenderLineItems(line_items, true);
+        uc_discountsRenderLineItems(line_items, true, discount_rates_ids);
         uc_discountsUpdateTotal();
 
         //Add errors and messages to messages container
@@ -140,31 +142,53 @@
 }
 
 //Updates the discount line items list and updates totals
-function uc_discountsRenderLineItems(line_items, show_message)
-{
-    uc_discountsRemoveDiscountLineItems();
+function uc_discountsRenderLineItems(line_items, show_message, discount_rates_ids)
+{
+    uc_discountsRemoveDiscountLineItems(discount_rates_ids);
     
     if ( (window.set_line_item == null) || (line_items == null) )
         return;
 
-    var total_amount = 0;
+    // Calculate totals per discount rate id
+
+    var total_amount = [];
+    var total_amount_names = [];
+
+    // Reset totals
+    for (i = 0; i < line_items.length; i++) {
+      var line_item = line_items[i];
+      total_amount[parseInt(line_item["rate_type"])] = 0;
+      total_amount_names[parseInt(line_item["rate_type"])] = "";
+    }
     for (i = 0; i < line_items.length; i++)
     {
         var line_item = line_items[i];
-        total_amount += parseFloat(line_item["amount"]);
-    }
-
-    //Add total discount line item
+        total_amount[parseInt(line_item["rate_type"])] += parseFloat(line_item["amount"]);
+        if (line_item["rate_name"] != "") {
+          total_amount_names[parseInt(line_item["rate_type"])] = " - " + line_item["rate_name"];
+        }
+    }
+
+    //Add a total discount line item per rate type
     if (line_items.length > 0)
     {
-        set_line_item(Drupal.settings.uc_discounts.line_item_key_name, 
-            Drupal.settings.uc_discounts.total_discount_text, total_amount, 
-            parseFloat(Drupal.settings.uc_discounts.line_item_weight) + 0.5, 1, false);
+        var index = 0;
+        for (i = 0; i < discount_rates_ids.length; i++) {
+          // Extract the index from discount key name
+          suffix = discount_rates_ids[i].substr(12);
+          if (suffix == "") {
+            suffix = 0;
+          }
+          index = parseInt(suffix);
+          set_line_item(discount_rates_ids[i], 
+              Drupal.settings.uc_discounts.total_discount_text + total_amount_names[index], total_amount[index], 
+              parseFloat(Drupal.settings.uc_discounts.line_item_weight) + 0.5, 1, false);
+        }
     }
 }
 
 //Removes existing discount line items and updates totals (if updateLineItems is true)
-function uc_discountsRemoveDiscountLineItems(updateLineItems)
+function uc_discountsRemoveDiscountLineItems(discount_rates_ids, updateLineItems)
 {
     var line_items = uc_discountsLineItems;
     uc_discountsLineItems = [];
@@ -176,8 +200,10 @@
     for (i = 0; i < line_items.length; i++)
         remove_line_item(line_items[i]["id"]);
 
-    //Remove total discount line item
-    remove_line_item(Drupal.settings.uc_discounts.line_item_key_name);
+    //Remove total discount line items
+    for (i = 0; i < discount_rates_ids.length; i++) {
+      remove_line_item(discount_rates_ids[i]);
+    }
     
     if (updateLineItems)
         uc_discountsUpdateTotal();
