From 0427cff53f39e4598f2ed9650cb73c76bc2413be Mon Sep 17 00:00:00 2001 From: ced <> Date: Tue, 19 Jun 2007 11:01:02 +0000 Subject: [PATCH] ACCOUNT, ACCOUNT_TAX_INCLUDE, PURCHASE, PURCHASE_TAX_INCLUDE, SALE_TAX_INCLUDE: fix tax include bzr revid: ced-1bbd054ee49127bcd6018da41a9657c389ca9a51 --- addons/account/invoice.py | 4 +- .../account_tax_include/invoice_tax_incl.py | 30 ++++++---- addons/purchase/purchase.py | 15 ++--- .../purchase_tax_include/purchase_tax_incl.py | 54 ++++++++++++----- .../purchase_tax_incl.xml | 12 ++++ addons/sale_tax_include/sale_tax_incl.py | 59 ++++++++++++++----- addons/sale_tax_include/sale_tax_incl.xml | 11 ++++ 7 files changed, 134 insertions(+), 51 deletions(-) diff --git a/addons/account/invoice.py b/addons/account/invoice.py index ebf34ee56c8..8f4317ee230 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -784,14 +784,14 @@ class account_invoice_tax(osv.osv): cur = inv.currency_id for line in inv.invoice_line: - for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, line.price_unit, line.quantity, inv.address_invoice_id.id, line.product_id, inv.partner_id): + for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, (line.price_unit* (1-(line.discount or 0.0)/100.0)), line.quantity, inv.address_invoice_id.id, line.product_id, inv.partner_id): val={} val['invoice_id'] = inv.id val['name'] = tax['name'] val['amount'] = cur_obj.round(cr, uid, cur, tax['amount']) val['manual'] = False val['sequence'] = tax['sequence'] - val['base'] = tax['price_unit'] * line['quantity'] + val['base'] = tax['price_unit'] * line['quantity'] * (1-(line.discount or 0.0)/100.0) if inv.type in ('out_invoice','in_invoice'): val['base_code_id'] = tax['base_code_id'] diff --git a/addons/account_tax_include/invoice_tax_incl.py b/addons/account_tax_include/invoice_tax_incl.py index 6d14ebeb4d9..15d6f3a8244 100644 --- a/addons/account_tax_include/invoice_tax_incl.py +++ b/addons/account_tax_include/invoice_tax_incl.py @@ -68,8 +68,8 @@ class account_invoice(osv.osv): 'Price method', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'amount_untaxed': fields.function(_amount_untaxed, digits=(16,2), method=True,string='Untaxed Amount'), - 'amount_tax': fields.function(_amount_tax, method=True, string='Tax'), - 'amount_total': fields.function(_amount_total, method=True, string='Total'), + 'amount_tax': fields.function(_amount_tax, method=True, string='Tax', store=True), + 'amount_total': fields.function(_amount_total, method=True, string='Total', store=True), } _defaults = { 'price_type': lambda *a: 'tax_excluded', @@ -88,22 +88,32 @@ class account_invoice_line(osv.osv): res2 = res.copy() for line in self.browse(cr, uid, ids): if line.invoice_id.price_type == 'tax_included': + product_taxes = None if line.product_id: - for tax in tax_obj.compute_inv(cr, uid,line.product_id.taxes_id, line.price_unit, line.quantity): + if line.invoice_id.type in ('out_invoice', 'out_refund'): + product_taxes = line.product_id.taxes_id + else: + product_taxes = line.product_id.supplier_taxes_id + if product_taxes: + for tax in tax_obj.compute_inv(cr, uid, product_taxes, res[line.id]/line.quantity, line.quantity): res[line.id] = res[line.id] - tax['amount'] else: - for tax in tax_obj.compute_inv(cr, uid,line.invoice_line_tax_id, line.price_unit, line.quantity): + for tax in tax_obj.compute_inv(cr, uid,line.invoice_line_tax_id, res[line.id]/line.quantity, line.quantity): res[line.id] = res[line.id] - tax['amount'] - if name == 'price_subtotal_incl': - if line.product_id and line.invoice_id.price_type == 'tax_included': - prod_taxe_ids = [ t.id for t in line.product_id.taxes_id ] + if name == 'price_subtotal_incl' and line.invoice_id.price_type == 'tax_included': + prod_taxe_ids = None + line_taxe_ids = None + if product_taxes: + prod_taxe_ids = [ t.id for t in product_taxes ] prod_taxe_ids.sort() line_taxe_ids = [ t.id for t in line.invoice_line_tax_id ] line_taxe_ids.sort() - if line.product_id and line.invoice_id.price_type == 'tax_included' and prod_taxe_ids == line_taxe_ids: + if product_taxes and prod_taxe_ids == line_taxe_ids: + res[line.id] = res2[line.id] + elif not line.product_id: res[line.id] = res2[line.id] else: - for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, line.price_unit, line.quantity): + for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, res[line.id]/line.quantity, line.quantity): res[line.id] = res[line.id] + tax['amount'] res[line.id]= round(res[line.id], 2) return res @@ -193,7 +203,7 @@ class account_invoice_tax(osv.osv): return super(account_invoice_tax,self).compute(cr, uid, invoice_id) for line in inv.invoice_line: - for tax in tax_obj.compute_inv(cr, uid, line.invoice_line_tax_id, line.price_unit, line.quantity, inv.address_invoice_id.id, line.product_id, inv.partner_id): + for tax in tax_obj.compute_inv(cr, uid, line.invoice_line_tax_id, (line.price_unit * (1-(line.discount or 0.0)/100.0)), line.quantity, inv.address_invoice_id.id, line.product_id, inv.partner_id): val={} val['invoice_id'] = inv.id val['name'] = tax['name'] diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 69d06296f79..f19ba079b31 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -48,14 +48,15 @@ class purchase_order(osv.osv): return res def _amount_untaxed(self, cr, uid, ids, field_name, arg, context): - id_set = ",".join(map(str, ids)) - cr.execute("SELECT s.id,COALESCE(SUM(l.price_unit*l.product_qty),0) AS amount FROM purchase_order s LEFT OUTER JOIN purchase_order_line l ON (s.id=l.order_id) WHERE s.id IN ("+id_set+") GROUP BY s.id ") - res = dict(cr.fetchall()) + res = {} cur_obj=self.pool.get('res.currency') - for id in res.keys(): - order=self.browse(cr, uid, [id])[0] - cur=order.pricelist_id.currency_id - res[id]=cur_obj.round(cr, uid, cur, res[id]) + for purchase in self.browse(cr, uid, ids): + res[purchase.id] = 0.0 + for line in purchase.order_line: + res[purchase.id] += line.price_subtotal + cur = purchase.pricelist_id.currency_id + res[purchase.id] = cur_obj.round(cr, uid, cur, res[purchase.id]) + return res def _amount_tax(self, cr, uid, ids, field_name, arg, context): diff --git a/addons/purchase_tax_include/purchase_tax_incl.py b/addons/purchase_tax_include/purchase_tax_incl.py index 718718e8c57..dc30cf530ad 100644 --- a/addons/purchase_tax_include/purchase_tax_incl.py +++ b/addons/purchase_tax_include/purchase_tax_incl.py @@ -34,20 +34,7 @@ from osv import fields, osv import ir class purchase_order(osv.osv): - def _amount_untaxed(self, cr, uid, ids, prop, unknow_none,unknow_dict): - ti = [] - for inv in self.read(cr, uid, ids, ['price_type']): - if inv['price_type']=='tax_included': - ti.append(inv['id']) - id_set=",".join(map(str,ids)) - cr.execute("SELECT s.id,COALESCE(SUM(l.price_unit*l.product_qty),0)::decimal(16,2) AS amount FROM purchase_order s LEFT OUTER JOIN purchase_order_line l ON (s.id=l.order_id) WHERE s.id IN ("+id_set+") GROUP BY s.id ") - res=dict(cr.fetchall()) - if len(ti): - tax = self._amount_tax(cr, uid, ti, prop, unknow_none,unknow_dict) - for id in ti: - res[id] = res[id] - tax.get(id, 0.0) - return res - + _inherit = "purchase.order" def _amount_tax(self, cr, uid, ids, field_name, arg, context): res = {} cur_obj=self.pool.get('res.currency') @@ -63,13 +50,11 @@ class purchase_order(osv.osv): val += cur_obj.round(cr, uid, cur, c['amount']) res[order.id]=cur_obj.round(cr, uid, cur, val) return res - _inherit = "purchase.order" _columns = { 'price_type': fields.selection([ ('tax_included','Tax included'), ('tax_excluded','Tax excluded') ], 'Price method', required=True), - 'amount_untaxed': fields.function(_amount_untaxed, method=True, string='Untaxed Amount'), 'amount_tax': fields.function(_amount_tax, method=True, string='Taxes'), } _defaults = { @@ -81,3 +66,40 @@ class purchase_order(osv.osv): } purchase_order() +class purchase_order_line(osv.osv): + _inherit = 'purchase.order.line' + def _amount_line(self, cr, uid, ids, name, arg, context): + res = {} + cur_obj=self.pool.get('res.currency') + tax_obj = self.pool.get('account.tax') + res = super(purchase_order_line, self)._amount_line(cr, uid, ids, name, arg, context) + res2 = res.copy() + for line in self.browse(cr, uid, ids): + if line.order_id.price_type == 'tax_included': + if line.product_id: + for tax in tax_obj.compute_inv(cr, uid, line.product_id.supplier_taxes_id, res[line.id]/line.product_qty, line.product_qty): + res[line.id] = res[line.id] - tax['amount'] + else: + for tax in tax_obj.compute_inv(cr, uid, line.taxes_id, res[line.id]/line.product_qty, line.product_qty): + res[line.id] = res[line.id] - tax['amount'] + if name == 'price_subtotal_incl' and line.order_id.price_type == 'tax_included': + if line.product_id: + prod_taxe_ids = [ t.id for t in line.product_id.supplier_taxes_id ] + prod_taxe_ids.sort() + line_taxe_ids = [ t.id for t in line.taxes_id ] + line_taxe_ids.sort() + if line.product_id and prod_taxe_ids == line_taxe_ids: + res[line.id] = res2[line.id] + elif not line.product_id: + res[line.id] = res2[line.id] + else: + for tax in tax_obj.compute(cr, uid, line.taxes_id, res[line.id]/line.product_qty, line.product_qty): + res[line.id] = res[line.id] + tax['amount'] + cur = line.order_id.pricelist_id.currency_id + res[line.id] = cur_obj.round(cr, uid, cur, res[line.id]) + return res + _columns = { + 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal w/o tax'), + 'price_subtotal_incl': fields.function(_amount_line, method=True, string='Subtotal'), + } +purchase_order_line() diff --git a/addons/purchase_tax_include/purchase_tax_incl.xml b/addons/purchase_tax_include/purchase_tax_incl.xml index fb1e1e9a1de..1d698439f4d 100644 --- a/addons/purchase_tax_include/purchase_tax_incl.xml +++ b/addons/purchase_tax_include/purchase_tax_incl.xml @@ -14,6 +14,18 @@ + + purchase.order.line.tree + tree + purchase.order.line + + + + + + + + diff --git a/addons/sale_tax_include/sale_tax_incl.py b/addons/sale_tax_include/sale_tax_incl.py index b6a7d3fe19b..e623d8844a7 100644 --- a/addons/sale_tax_include/sale_tax_incl.py +++ b/addons/sale_tax_include/sale_tax_incl.py @@ -34,20 +34,7 @@ from osv import fields, osv import ir class sale_order(osv.osv): - def _amount_untaxed(self, cr, uid, ids, prop, unknow_none,unknow_dict): - ti = [] - for inv in self.read(cr, uid, ids, ['price_type']): - if inv['price_type']=='tax_included': - ti.append(inv['id']) - id_set=",".join(map(str,ids)) - cr.execute("SELECT s.id,COALESCE(SUM(l.price_unit*l.product_uos_qty*(100.0-l.discount))/100.0,0)::decimal(16,2) AS amount FROM sale_order s LEFT OUTER JOIN sale_order_line l ON (s.id=l.order_id) WHERE s.id IN ("+id_set+") GROUP BY s.id ") - res=dict(cr.fetchall()) - if len(ti): - tax = self._amount_tax(cr, uid, ti, prop, unknow_none,unknow_dict) - for id in ti: - res[id] = res[id] - tax.get(id,0.0) - return res - + _inherit = "sale.order" def _amount_tax(self, cr, uid, ids, field_name, arg, context): res = {} cur_obj=self.pool.get('res.currency') @@ -63,13 +50,11 @@ class sale_order(osv.osv): val += cur_obj.round(cr, uid, cur, c['amount']) res[order.id]=cur_obj.round(cr, uid, cur, val) return res - _inherit = "sale.order" _columns = { 'price_type': fields.selection([ ('tax_included','Tax included'), ('tax_excluded','Tax excluded') ], 'Price method', required=True), - 'amount_untaxed': fields.function(_amount_untaxed, method=True, string='Untaxed Amount'), 'amount_tax': fields.function(_amount_tax, method=True, string='Taxes'), } _defaults = { @@ -81,3 +66,45 @@ class sale_order(osv.osv): } sale_order() +class sale_order_line(osv.osv): + _inherit = "sale.order.line" + def _amount_line(self, cr, uid, ids, name, arg, context): + res = {} + cur_obj=self.pool.get('res.currency') + tax_obj = self.pool.get('account.tax') + res = super(sale_order_line, self)._amount_line(cr, uid, ids, name, arg, context) + res2 = res.copy() + for line in self.browse(cr, uid, ids): + if line.product_uos.id: + qty = line.product_uos_qty + else: + qty = line.product_uom_qty + if line.order_id.price_type == 'tax_included': + if line.product_id: + for tax in tax_obj.compute_inv(cr, uid, line.product_id.taxes_id, res[line.id]/qty, qty): + res[line.id] = res[line.id] - tax['amount'] + else: + for tax in tax_obj.compute_inv(cr, uid, line.tax_id, res[line.id]/qty, qty): + res[line.id] = res[line.id] - tax['amount'] + if name == 'price_subtotal_incl' and line.order_id.price_type == 'tax_included': + if line.product_id: + prod_taxe_ids = [ t.id for t in line.product_id.taxes_id ] + prod_taxe_ids.sort() + line_taxe_ids = [ t.id for t in line.tax_id ] + line_taxe_ids.sort() + if line.product_id and prod_taxe_ids == line_taxe_ids: + res[line.id] = res2[line.id] + elif not line.product_id: + res[line.id] = res2[line.id] + else: + for tax in tax_obj.compute(cr, uid, line.tax_id, res[line.id]/qty, qty): + res[line.id] = res[line.id] + tax['amount'] + cur = line.order_id.pricelist_id.currency_id + res[line.id] = cur_obj.round(cr, uid, cur, res[line.id]) + return res + _columns = { + 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal w/o tax'), + 'price_subtotal_incl': fields.function(_amount_line, method=True, string='Subtotal'), + } +sale_order_line() + diff --git a/addons/sale_tax_include/sale_tax_incl.xml b/addons/sale_tax_include/sale_tax_incl.xml index c4ee1847a59..9ba410fccb5 100644 --- a/addons/sale_tax_include/sale_tax_incl.xml +++ b/addons/sale_tax_include/sale_tax_incl.xml @@ -13,6 +13,17 @@ + + sale.order.exlcuded.view.form + form + sale.order + + + + + + +