diff --git a/product/ERP5/Document/PaySheetTransaction.py b/product/ERP5/Document/PaySheetTransaction.py
index 3ffd7ebd28b0d49c4cb6b5ba2f8bb299b4efc576..fb778e4ec0fc30844e26faaf1960992560516173 100644
--- a/product/ERP5/Document/PaySheetTransaction.py
+++ b/product/ERP5/Document/PaySheetTransaction.py
@@ -251,39 +251,11 @@ class PaySheetTransaction(Invoice):
     # Get Precision
     precision = self.getPriceCurrencyValue().getQuantityPrecision()
 
-    def getDictList(category_list):
-      '''
-        This method return a list of dict wich are composed with the given
-        category as key and an integer as value. It's used to find datas 
-        in a two-dimensional table
-      '''
-      list_of_dict = []
-      for category in category_list:
-        base_amount_list=[x.getRelativeUrl() for x in\
-                          self.portal_categories[category].objectValues()]
-        list_of_dict.append(dict([[base, base_amount_list.index(base)] \
-            for base in base_amount_list]))
-      return list_of_dict
-
-    def getEmptyTwoDimentionalTable(nb_columns=0, nb_rows=0):
-      '''
-        create a two-dimentional table with nb_columns columns and nb_rows rows
-        all item of this table are set to None
-        ex : with nb_columns=2 and nb_rows=4, this function returns :
-        [[None, None, None, None], [None, None, None, None]]
-      '''
-      base_amount = []
-      for i in range(nb_columns):
-        line = []
-        for j in range(nb_rows):
-          line.append(None)
-        base_amount.append(line)
-      return base_amount
-
-    # this dict permit to have the index of the category in the table
-    column, row = getDictList(['tax_category', 'base_amount'])
-    base_amount_table = getEmptyTwoDimentionalTable(nb_columns=len(column),
-                                                    nb_rows=len(row))
+
+    # in this dictionary will be saved the current amount corresponding to 
+    # the tuple (tax_category, base_amount) :
+    # current_amount = base_amount_table[(tax_category, base_amount)]
+    base_amount_table = {}
 
     def sortByIntIndex(a, b):
       return cmp(a.getIntIndex(),
@@ -303,20 +275,17 @@ class PaySheetTransaction(Invoice):
       service = paysheetline.getResourceValue()
       base_amount_list = service.getBaseAmountList(base=1)
       for base_amount in base_amount_list:
-        if not row.has_key(base_amount):
-           raise ValueError, "Unable to find `%s` base_amount category" % \
-                                                                 base_amount
         paysheetcell_list = paysheetline.contentValues(portal_type = \
                                                             ['Pay Sheet Cell'])
         for paysheetcell in paysheetcell_list:
           tax_category = paysheetcell.getTaxCategory(base=1)
           if tax_category and paysheetcell.getQuantity():
-            old_val = base_amount_table[column[tax_category]][row[base_amount]]
-            if old_val is not None:
-              new_val = old_val + paysheetcell.getQuantity()
-            else: 
-              new_val = paysheetcell.getQuantity()
-            base_amount_table[column[tax_category]][row[base_amount]] = new_val
+            if base_amount_table.has_key((tax_category, base_amount)):
+              old_val = base_amount_table[(tax_category, base_amount)]
+            else:
+              old_val = 0
+            new_val = old_val + paysheetcell.getQuantity()
+            base_amount_table[(tax_category, base_amount)] = new_val
 
     # get not editables model lines
     model = self.getSpecialiseValue()
@@ -353,20 +322,8 @@ class PaySheetTransaction(Invoice):
                                       base_category_list=['salary_range',])
 
       for share in variation_share_list:
-        base_application = None
         for slice in variation_slice_list:
-
-          #get the amount of application for this line
-          base_application_list = model_line.getBaseAmountList(base=1)
-          if base_application is None:
-            base_application = 0
-            for base in model_line.getBaseAmountList(base=1):
-              if base_amount_table[column[share]][row[base]] is not None:
-                base_application += \
-                    base_amount_table[column[share]][row[base]]
-            
           cell = model_line.getCell(slice, share)
-          
           if cell is not None:
             # get the slice :
             model_slice = None
@@ -376,8 +333,6 @@ class PaySheetTransaction(Invoice):
             if model_slice is not None:
               model_slice_min = model_slice.getQuantityRangeMin()
               model_slice_max = model_slice.getQuantityRangeMax()
-              quantity = cell.getQuantity()
-              price = cell.getPrice()
 
               ######################
               # calculation part : #
@@ -397,13 +352,14 @@ class PaySheetTransaction(Invoice):
                                                                  script_name
               LOG('script_name :',0,script_name)
               calculation_script = getattr(self, script_name, None)
-              quantity, price = calculation_script(\
-                  base_application=base_application,
-                  model_slice_min = model_slice_min, 
+              result = calculation_script(\
+                  base_amount_table=base_amount_table,
+                  share=share,
+                  model_slice_min=model_slice_min, 
                   model_slice_max=model_slice_max, 
-                  quantity=quantity, 
-                  price=price, 
-                  model_line=model_line)
+                  cell=cell,)
+              quantity = result['quantity']
+              price = result['price']
 
             # Cell creation :
             # Define an empty new cell
@@ -424,21 +380,17 @@ class PaySheetTransaction(Invoice):
             # update base participation
             base_participation_list = service.getBaseAmountList(base=1)
             for base_participation in base_participation_list:
-              old_val = \
-                  base_amount_table[column[share]][row[base_participation]]
-
               if quantity:
-                if old_val is not None:
-                  new_val = old_val + quantity
+                if base_amount_table.has_key((share, base_participation)):
+                  old_val = base_amount_table[(share, base_participation)]
                 else:
-                  new_val = quantity
+                  old_val = 0
+                new_val = old_val + quantity
+
                 if price:
-                  if old_val is not None:
-                    new_val = round((old_val + quantity*price), precision)
-                base_amount_table[column[share]][row[base_participation]]= \
-                                                                      new_val
-                base_amount_table[column[share]][row[base_participation]] = \
-                                                                      new_val
+                  if old_val != 0:
+                    new_val = round((old_val + quantity*price), precision) 
+                base_amount_table[(share, base_participation)] = new_val
 
       if cell_list:
         # create the PaySheetLine
@@ -457,7 +409,6 @@ class PaySheetTransaction(Invoice):
     # lines
     localized_add_end_line_script = getattr(self,
                                 'PaySheetTransaction_postCalculation', None)
-    LOG('localized_add_end_line_script :', 0, localized_add_end_line_script)
     if localized_add_end_line_script:
       localized_add_end_line_script(employee_tax_amount)