diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 4b9ab3f10d5..73642c15c2e 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -857,26 +857,11 @@ class account_invoice_line(osv.osv): taxep=None lang=self.pool.get('res.partner').read(cr, uid, [partner_id])[0]['lang'] tax_obj = self.pool.get('account.tax') + part = self.pool.get('res.partner').browse(cr, uid, partner_id) if type in ('out_invoice', 'out_refund'): - part = self.pool.get('res.partner').browse(cr, uid, partner_id) - taxep = part.property_account_position and part.property_account_position.account_tax - if not taxep or not taxep.id: - tax_id = map(lambda x: x.id, res.taxes_id) - else: - tax_id = [taxep.id] - for t in res.taxes_id: - if not t.tax_group==taxep.tax_group: - tax_id.append(t.id) + tax_id = self.pool.get('account.fiscal.position').map_tax(cr, uid, part, res.taxes_id) else: - part = self.pool.get('res.partner').browse(cr, uid, partner_id) - taxep = part.property_account_position and part.property_account_position.account_supplier_tax - if not taxep or not taxep.id: - tax_id = map(lambda x: x.id, res.supplier_taxes_id) - else: - tax_id = [taxep.id] - for t in res.supplier_taxes_id: - if not t.tax_group==taxep.tax_group: - tax_id.append(t.id) + tax_id = self.pool.get('account.fiscal.position').map_tax(cr, uid, part, res.supplier_taxes_id) if type in ('in_invoice', 'in_refund'): result = self.product_id_change_unit_price_inv(cr, uid, tax_id, price_unit, qty, address_invoice_id, product, partner_id, context=context) else: diff --git a/addons/account/partner.py b/addons/account/partner.py index fbb4839f452..6049e4df483 100644 --- a/addons/account/partner.py +++ b/addons/account/partner.py @@ -37,16 +37,24 @@ class account_fiscal_position(osv.osv): _columns = { 'name': fields.char('Fiscal Position', size=64, translate=True, required=True), 'company_id': fields.many2one('res.company', 'Company'), - 'account_tax': fields.many2one( - 'account.tax', 'Customer Tax', - help="This account will be used as the receivable account for partners in this position", - ), - 'account_supplier_tax': fields.many2one( - 'account.tax', 'Supplier Tax', - help="This account will be used as the payable account for partners in this position", - ), - 'account_ids': fields.one2many('account.fiscal.position.account', 'position_id', 'Accounts Mapping') + 'account_ids': fields.one2many('account.fiscal.position.account', 'position_id', 'Accounts Mapping'), + 'tax_ids': fields.one2many('account.fiscal.position.tax', 'position_id', 'Taxes Mapping') } + def map_tax(self, cr, uid, partner, taxes, context={}): + if (not partner) or (not partner.property_account_position) : + return taxes + result = [] + for t in taxes: + ok = False + for tax in partner.property_account_position.tax_ids: + if tax.tax_src_id.id==t.id: + if tax.tax_dest_id: + result.append(tax.tax_dest_id.id) + ok=True + if not ok: + result.append(t.id) + return result + def map_account(self, cr, uid, partner, account_id, context={}): if (not partner) or (not partner.property_account_position) : return account_id @@ -58,6 +66,18 @@ class account_fiscal_position(osv.osv): account_fiscal_position() +class account_fiscal_position_tax(osv.osv): + _name = 'account.fiscal.position.tax' + _description = 'Fiscal Position Taxes Mapping' + _rec_name = 'position_id' + _columns = { + 'position_id': fields.many2one('account.fiscal.position', 'Fiscal Position', required=True, ondelete='cascade'), + 'tax_src_id': fields.many2one('account.tax', 'Tax Source', required=True), + 'tax_dest_id': fields.many2one('account.tax', 'Replacement Tax') + } +account_fiscal_position_tax() + + class account_fiscal_position_account(osv.osv): _name = 'account.fiscal.position.account' _description = 'Fiscal Position Accounts Mapping' diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml index bfe4e80ced0..e8044aec16b 100644 --- a/addons/account/partner_view.xml +++ b/addons/account/partner_view.xml @@ -11,8 +11,16 @@ - - + + + + + +
+ + + + @@ -34,8 +42,6 @@ - - diff --git a/addons/account/security/ir.model.access.csv b/addons/account/security/ir.model.access.csv index 234f2c10962..9dbdcb18b55 100644 --- a/addons/account/security/ir.model.access.csv +++ b/addons/account/security/ir.model.access.csv @@ -74,6 +74,8 @@ "access_account_account_product_manager","account.account product manager","model_account_account","product.group_product_manager",1,0,0,0 "access_account_journal_product_manager","account.journal product manager","model_account_journal","product.group_product_manager",1,0,0,0 "access_account_fiscal_position_product_manager","account.fiscal.position account.manager","model_account_fiscal_position","account.group_account_manager",1,1,1,1 -"access_account_fiscal_position_account_product_manager","account.fiscal.position account.manager","model_account_fiscal_position_account","account.group_account_manager",1,1,1,1 "access_account_fiscal_position","account.fiscal.position all","model_account_fiscal_position","base.group_user",1,0,0,0 +"access_account_fiscal_position_tax_product_manager","account.fiscal.position.tax account.manager","model_account_fiscal_position_tax","account.group_account_manager",1,1,1,1 +"access_account_fiscal_position_tax","account.fiscal.position.tax all","model_account_fiscal_position_tax","base.group_user",1,0,0,0 +"access_account_fiscal_position_account_product_manager","account.fiscal.position account.manager","model_account_fiscal_position_account","account.group_account_manager",1,1,1,1 "access_account_fiscal_position_account","account.fiscal.position all","model_account_fiscal_position_account","base.group_user",1,0,0,0 diff --git a/addons/delivery/stock.py b/addons/delivery/stock.py index b85180df04a..5b1ab81decc 100644 --- a/addons/delivery/stock.py +++ b/addons/delivery/stock.py @@ -85,25 +85,13 @@ class stock_picking(osv.osv): taxes = self.pool.get('account.tax').browse(cursor, user, [x.id for x in picking.carrier_id.product_id.taxes_id]) - taxep = None partner_id=picking.address_id.partner_id and picking.address_id.partner_id.id or False + taxes_ids = [x.id for x in picking.carrier_id.product_id.taxes_id] if partner_id: - print 'Found Partner' partner = picking.address_id.partner_id taxep = partner.property_account_position and partner.property_account_position.account_tax - print account_id account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, partner, account_id) - print account_id - - if not taxep or not taxep.id: - taxes_ids = [x.id for x in picking.carrier_id.product_id.taxes_id] - else: - res5 = [taxep.id] - for t in taxes: - if not t.tax_group==taxep.tax_group: - res5.append(t.id) - taxes_ids = res5 - + taxes_ids = self.pool.get('account.fiscal.position').map_tax(cr, uid, partner, picking.carrier_id.product_id.taxes_id) invoice_line_obj.create(cursor, user, { 'name': picking.carrier_id.name, diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index ca8d0a6bcd0..199e60885a4 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -1000,25 +1000,11 @@ class mrp_procurement(osv.osv): 'notes':product.description_purchase, } - taxes = self.pool.get('account.tax').browse(cr, uid, - [x.id for x in procurement.product_id.product_tmpl_id.supplier_taxes_id]) - taxep = None - if partner_id: - taxep = partner.property_account_position and partner.property_account_position.account_supplier_tax - if not taxep or not taxep.id: - taxes_ids = [x.id for x in procurement.product_id.product_tmpl_id.supplier_taxes_id] - else: - res5 = [taxep.id] - for t in taxes: - if not t.tax_group==taxep.tax_group: - res5.append(t.id) - taxes_ids = res5 - + taxes_ids = procurement.product_id.product_tmpl_id.supplier_taxes_id + self.pool.get('account.fiscal.position').map_tax(cr, uid, partner, taxes) line.update({ 'taxes_id':[(6,0,taxes_ids)] }) - - purchase_id = self.pool.get('purchase.order').create(cr, uid, { 'origin': procurement.origin, 'partner_id': partner_id, diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 2e05c1f62b1..5fbda6cb9f2 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -437,20 +437,9 @@ class purchase_order_line(osv.osv): res = {'value': {'price_unit': price, 'name':prod_name, 'taxes_id':prod['supplier_taxes_id'], 'date_planned': dt,'notes':prod['description_purchase'], 'product_uom': uom}} domain = {} - + partner = partner_obj.browse(cr, uid, partner_id) taxes = self.pool.get('account.tax').browse(cr, uid,prod['supplier_taxes_id']) - taxep = None - if partner_id: - partner = self.pool.get('res.partner').browse(cr, uid, partner_id) - taxep = partner.property_account_position and partner.property_account_position.account_supplier_tax - if not taxep or not taxep.id: - res['value']['taxes_id'] = prod['supplier_taxes_id'] - else: - res5 = [taxep.id] - for t in taxes: - if not t.tax_group==taxep.tax_group: - res5.append(t.id) - res['value']['taxes_id'] = res5 + res['value']['taxes_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, partner, taxes) res2 = self.pool.get('product.uom').read(cr, uid, [uom], ['category_id']) res3 = self.pool.get('product.uom').read(cr, uid, [prod_uom_po], ['category_id']) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index be89c2dbd73..3be1db928ea 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -837,20 +837,8 @@ class sale_order_line(osv.osv): if update_tax: #The quantity only have changed result['delay'] = (product_obj.sale_delay or 0.0) - taxes = self.pool.get('account.tax').browse(cr, uid, - [x.id for x in product_obj.taxes_id]) - taxep = None - if partner_id: - partner = partner_obj.browse(cr, uid, partner_id) - taxep = partner.property_account_position and partner.property_account_position.account_tax - if not taxep or not taxep.id: - result['tax_id'] = [x.id for x in product_obj.taxes_id] - else: - res5 = [taxep.id] - for t in taxes: - if not t.tax_group==taxep.tax_group: - res5.append(t.id) - result['tax_id'] = res5 + partner = partner_obj.browse(cr, uid, partner_id) + result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, partner, product_obj.taxes_id) result['name'] = product_obj.partner_ref