Amit Dodiya (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-addons/5.0-opw-18126-ado into 
lp:openobject-addons/5.0.

Requested reviews:
  Raphael Collet (OpenERP) (rco-openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/5.0-opw-18126-ado/+merge/79252

Hello,

[FIX] Tax included in price is not working : case(18126)

In Sales order / Account Invoice / Purchase Order when making tax calculations, 
the amount calculation is wrong. It adds the Tax even if we have checked the 
"taxes included in the price" in Taxes card.

Thanks,
Amit


-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/5.0-opw-18126-ado/+merge/79252
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/5.0-opw-18126-ado.
=== modified file 'account/account.py'
--- account/account.py	2011-09-22 12:00:02 +0000
+++ account/account.py	2011-10-13 10:47:44 +0000
@@ -1585,6 +1585,39 @@
                 cur_price_unit+=amount2
         return res
 
+    def compute_all(self, cr, uid, taxes, price_unit, quantity, address_id=None, product=None, partner=None):
+        """
+        RETURN: {
+                'total': 0.0,                # Total without taxes
+                'total_included: 0.0,        # Total with taxes
+                'taxes': []                  # List of taxes, see compute for the format
+            }
+        """
+        totalin = totalex = round(price_unit * quantity, int(config['price_accuracy']))
+        tin = []
+        tex = []
+        for tax in taxes:
+            if tax.price_include:
+                tin.append(tax)
+            else:
+                tex.append(tax)
+        tin = self.compute_inv(cr, uid, tin, price_unit, quantity, address_id=address_id, product=product, partner=partner)
+        for r in tin:
+            totalex -= r.get('amount', 0.0)
+        totlex_qty = 0.0
+        try:
+            totlex_qty=totalex/quantity
+        except:
+            pass
+        tex = self.compute(cr, uid, tex, totlex_qty, quantity, address_id=address_id, product=product, partner=partner)
+        for r in tex:
+            totalin += r.get('amount', 0.0)
+        return {
+            'total': totalex,
+            'total_included': totalin,
+            'taxes': tin + tex
+        }
+
     def compute(self, cr, uid, taxes, price_unit, quantity, address_id=None, product=None, partner=None):
 
         """

=== modified file 'account/invoice.py'
--- account/invoice.py	2011-09-08 08:35:21 +0000
+++ account/invoice.py	2011-10-13 10:47:44 +0000
@@ -53,8 +53,8 @@
             }
             for line in invoice.invoice_line:
                 res[invoice.id]['amount_untaxed'] += line.price_subtotal
-            for line in invoice.tax_line:
-                res[invoice.id]['amount_tax'] += line.amount
+                for c in self.pool.get('account.tax').compute_all(cr, uid, line.invoice_line_tax_id, line.price_unit, line.quantity, line.product_id)['taxes']:
+                        res[invoice.id]['amount_tax']+= c.get('amount', 0.0)
             res[invoice.id]['amount_total'] = res[invoice.id]['amount_tax'] + res[invoice.id]['amount_untaxed']
         return res
 
@@ -999,11 +999,13 @@
     def _amount_line(self, cr, uid, ids, prop, unknow_none,unknow_dict):
         res = {}
         cur_obj=self.pool.get('res.currency')
+        tax_obj = self.pool.get('account.tax')
         for line in self.browse(cr, uid, ids):
             if line.invoice_id:
-                res[line.id] = line.price_unit * line.quantity * (1-(line.discount or 0.0)/100.0)
+                price = line.price_unit * line.quantity * (1-(line.discount or 0.0)/100.0)
                 cur = line.invoice_id.currency_id
-                res[line.id] = cur_obj.round(cr, uid, cur, res[line.id])
+                taxes = tax_obj.compute_all(cr, uid, line.invoice_line_tax_id, price, line.quantity, line.product_id)
+                res[line.id] = cur_obj.round(cr, uid, cur, taxes['total'])
             else:
                 res[line.id] = round(line.price_unit * line.quantity * (1-(line.discount or 0.0)/100.0),int(config['price_accuracy']))
         return res

=== modified file 'purchase/purchase.py'
--- purchase/purchase.py	2011-09-15 09:04:43 +0000
+++ purchase/purchase.py	2011-10-13 10:47:44 +0000
@@ -55,8 +55,8 @@
             val = val1 = 0.0
             cur=order.pricelist_id.currency_id
             for line in order.order_line:
-                for c in self.pool.get('account.tax').compute(cr, uid, line.taxes_id, line.price_unit, line.product_qty, order.partner_address_id.id, line.product_id, order.partner_id):
-                    val+= c['amount']
+                for c in self.pool.get('account.tax').compute_all(cr, uid, line.taxes_id, line.price_unit, line.product_qty, order.partner_address_id.id, line.product_id, order.partner_id)['taxes']:
+                    val+= c.get('amount', 0.0)
                 val1 += line.price_subtotal
             res[order.id]['amount_tax']=cur_obj.round(cr, uid, cur, val)
             res[order.id]['amount_untaxed']=cur_obj.round(cr, uid, cur, val1)
@@ -464,9 +464,11 @@
     def _amount_line(self, cr, uid, ids, prop, unknow_none,unknow_dict):
         res = {}
         cur_obj=self.pool.get('res.currency')
+        tax_obj = self.pool.get('account.tax')
         for line in self.browse(cr, uid, ids):
             cur = line.order_id.pricelist_id.currency_id
-            res[line.id] = cur_obj.round(cr, uid, cur, line.price_unit * line.product_qty)
+            taxes = tax_obj.compute_all(cr, uid, line.taxes_id, line.price_unit, line.product_qty, line.order_id.partner_address_id.id, line.product_id, line.order_id.partner_id)
+            res[line.id] = cur_obj.round(cr, uid, cur, taxes['total'])
         return res
 
     _columns = {

=== modified file 'sale/sale.py'
--- sale/sale.py	2011-09-14 14:17:35 +0000
+++ sale/sale.py	2011-10-13 10:47:44 +0000
@@ -64,8 +64,8 @@
 
     def _amount_line_tax(self, cr, uid, line, context={}):
         val = 0.0
-        for c in self.pool.get('account.tax').compute(cr, uid, line.tax_id, line.price_unit * (1-(line.discount or 0.0)/100.0), line.product_uom_qty, line.order_id.partner_invoice_id.id, line.product_id, line.order_id.partner_id):
-            val += c['amount']
+        for c in self.pool.get('account.tax').compute_all(cr, uid, line.tax_id, line.price_unit * (1-(line.discount or 0.0)/100.0), line.product_uom_qty, line.order_id.partner_invoice_id.id, line.product_id, line.order_id.partner_id)['taxes']:
+            val += c.get('amount', 0.0)
         return val
 
     def _amount_all(self, cr, uid, ids, field_name, arg, context):
@@ -767,10 +767,12 @@
     def _amount_line(self, cr, uid, ids, field_name, arg, context):
         res = {}
         cur_obj = self.pool.get('res.currency')
+        tax_obj = self.pool.get('account.tax')
         for line in self.browse(cr, uid, ids):
-            res[line.id] = line.price_unit * line.product_uom_qty * (1 - (line.discount or 0.0) / 100.0)
+            price = line.price_unit * (1 - (line.discount or 0.0) / 100.0)
+            taxes = tax_obj.compute_all(cr, uid, line.tax_id, price, line.product_uom_qty, line.order_id.partner_invoice_id.id, line.product_id, line.order_id.partner_id)
             cur = line.order_id.pricelist_id.currency_id
-            res[line.id] = cur_obj.round(cr, uid, cur, res[line.id])
+            res[line.id] = cur_obj.round(cr, uid, cur, taxes['total'])
         return res
 
     def _number_packages(self, cr, uid, ids, field_name, arg, context):

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to