diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 73642c15c2e..4dbb6da2ca5 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -953,13 +953,8 @@ class account_invoice_line(osv.osv): return {} taxes = self.pool.get('account.account').browse(cr, uid, account_id).tax_ids part = self.pool.get('res.partner').browse(cr, uid, partner_id) - taxep = partner.property_account_position and partner.property_account_position.account_tax - if not taxep.id: - return {'value': {'invoice_line_tax_id': map(lambda x: x.id, taxes or []) }} - res = [taxep.id] - for t in taxes: - if not t.tax_group==taxep.tax_group: - res.append(t.id) + + res = self.pool.get('account.fiscal.position').map_tax(cr, uid, part, taxes) r = {'value':{'invoice_line_tax_id': res}} return r account_invoice_line() diff --git a/addons/account/partner.py b/addons/account/partner.py index 6049e4df483..bbc79406780 100644 --- a/addons/account/partner.py +++ b/addons/account/partner.py @@ -42,7 +42,7 @@ class account_fiscal_position(osv.osv): } def map_tax(self, cr, uid, partner, taxes, context={}): if (not partner) or (not partner.property_account_position) : - return taxes + return map(lambda x: x.id, taxes) result = [] for t in taxes: ok = False diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml index e8044aec16b..94f5f7fec00 100644 --- a/addons/account/partner_view.xml +++ b/addons/account/partner_view.xml @@ -13,12 +13,12 @@ - - + +
- - + + diff --git a/addons/delivery/stock.py b/addons/delivery/stock.py index 5b1ab81decc..5ac19b1c0e4 100644 --- a/addons/delivery/stock.py +++ b/addons/delivery/stock.py @@ -83,15 +83,14 @@ class stock_picking(osv.osv): account_id = picking.carrier_id.product_id.categ_id\ .property_account_income_categ.id - taxes = self.pool.get('account.tax').browse(cursor, user, - [x.id for x in picking.carrier_id.product_id.taxes_id]) + taxes = picking.carrier_id.product_id.taxes_id + 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: partner = picking.address_id.partner_id - taxep = partner.property_account_position and partner.property_account_position.account_tax - account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, partner, account_id) - taxes_ids = self.pool.get('account.fiscal.position').map_tax(cr, uid, partner, picking.carrier_id.product_id.taxes_id) + account_id = self.pool.get('account.fiscal.position').map_account(cursor, user, partner, account_id) + taxes_ids = self.pool.get('account.fiscal.position').map_tax(cursor, user, partner, taxes) invoice_line_obj.create(cursor, user, { 'name': picking.carrier_id.name, diff --git a/addons/delivery/wizard/delivery_sale_order.py b/addons/delivery/wizard/delivery_sale_order.py index 3462a6b0ba0..ca630ddcf4f 100644 --- a/addons/delivery/wizard/delivery_sale_order.py +++ b/addons/delivery/wizard/delivery_sale_order.py @@ -68,22 +68,9 @@ def _delivery_set(self, cr, uid, data, context): grid_obj=pooler.get_pool(cr.dbname).get('delivery.grid') grid = grid_obj.browse(cr, uid, [grid_id])[0] - taxes = pooler.get_pool(cr.dbname).get('account.tax').browse(cr, uid, - [x.id for x in grid.carrier_id.product_id.taxes_id]) - taxep = None - partner_id=order.partner_id and order.partner_id.id or False - if partner_id: - partner = order.partner_id - taxep = partner.property_account_position and partner.property_account_position.account_tax - if not taxep or not taxep.id: - taxes_ids = [x.id for x in grid.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 = grid.carrier_id.product_id.taxes_id + taxes_ids = pooler.get_pool(cr.dbname).get('account.fiscal.position').map_tax(cr, uid, order.partner_id, taxes) + line_obj.create(cr, uid, { 'order_id': order.id, 'name': grid.carrier_id.name, diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_final_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_final_invoice_create.py index a712b81445f..7e8a9ff3887 100644 --- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_final_invoice_create.py +++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_final_invoice_create.py @@ -108,15 +108,7 @@ class final_invoice_create(wizard.interface): price = 0.0 taxes = product.taxes_id - taxep = account.partner_id.property_account_position and account.partner_id.property_account_position.account_tax - if not taxep.id: - tax = [x.id for x in taxes or []] - else: - tax = [taxep.id] - for t in taxes: - if not t.tax_group==taxep.tax_group: - tax.append(t.id) - + tax = self.pool.get('account.fiscal.position').map_tax(cr, uid, account.partner_id, taxes) account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id curr_line = { @@ -165,15 +157,8 @@ class final_invoice_create(wizard.interface): taxes = product.taxes_id else: taxes = [] - taxep = account.partner_id.property_account_position and account.partner_id.property_account_position.account_tax - if not taxep.id: - tax = [x.id for x in taxes or []] - else: - tax = [taxep.id] - for t in taxes: - if not t.tax_group==taxep.tax_group: - tax.append(t.id) + tax = self.pool.get('account.fiscal.position').map_tax(cr, uid, account.partner_id, taxes) curr_line = { 'price_unit': -amount, 'quantity': 1.0, @@ -194,15 +179,7 @@ class final_invoice_create(wizard.interface): product = pool.get('product.product').browse(cr, uid, data['form']['balance_product'], context2) taxes = product.taxes_id - taxep = account.partner_id.property_account_position and account.partner_id.property_account_position.account_tax - if not taxep.id: - tax = [x.id for x in taxes or []] - else: - tax = [taxep.id] - for t in taxes: - if not t.tax_group==taxep.tax_group: - tax.append(t.id) - + tax = self.pool.get('account.fiscal.position').map_tax(cr, uid, account.partner_id, taxes) account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id curr_line = { diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py index 4ec0cd93e8c..1e7c328f9dd 100644 --- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py +++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py @@ -113,15 +113,7 @@ class invoice_create(wizard.interface): price = 0.0 taxes = product.taxes_id - taxep = account.partner_id.property_account_position and account.partner_id.property_account_position.account_tax - if not taxep.id: - tax = [x.id for x in taxes or []] - else: - tax = [taxep.id] - for t in taxes: - if not t.tax_group==taxep.tax_group: - tax.append(t.id) - + tax = self.pool.get('account.fiscal.position').map_tax(cr, uid, account.partner_id, taxes) account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id curr_line = { diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 5fbda6cb9f2..94b0c6e69d6 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -437,7 +437,7 @@ 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) + partner = self.pool.get('res.partner').browse(cr, uid, partner_id) taxes = self.pool.get('account.tax').browse(cr, uid,prod['supplier_taxes_id']) res['value']['taxes_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, partner, taxes) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 3be1db928ea..94c4ccbf00c 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -841,7 +841,6 @@ class sale_order_line(osv.osv): result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, partner, product_obj.taxes_id) result['name'] = product_obj.partner_ref - domain = {} if not uom and not uos: result['product_uom'] = product_obj.uom_id.id diff --git a/addons/stock/product.py b/addons/stock/product.py index f9eeef4f907..de035b213de 100644 --- a/addons/stock/product.py +++ b/addons/stock/product.py @@ -131,35 +131,32 @@ class product_product(osv.osv): res[prod_id] -= amount return res - def _get_product_available_func(states, what): - def _product_available(self, cr, uid, ids, field_names=None, arg=False, context={}): - if not field_names: - field_names=[] - context.update({ - 'states':states, - 'what':what - }) - stock=self.get_product_available(cr,uid,ids,context=context) - res = {} + def _product_available(self, cr, uid, ids, field_names=None, arg=False, context={}): + if not field_names: + field_names=[] + res = {} + for id in ids: + res[id] = {}.fromkeys(field_names, 0.0) + for f in field_names: + c = context.copy() + if f=='qty_available': + c.update({ 'states':('done',), 'what':('in', 'out') }) + if f=='virtual_available': + c.update({ 'states':('confirmed','waiting','assigned','done'), 'what':('in', 'out') }) + if f=='incoming_qty': + c.update({ 'states':('confirmed','waiting','assigned'), 'what':('in',) }) + if f=='outgoing_qty': + c.update({ 'states':('confirmed','waiting','assigned'), 'what':('out',) }) + stock=self.get_product_available(cr,uid,ids,context=c) for id in ids: - res[id] = {}.fromkeys(field_names, 0.0) - for a in field_names: - res[id][a] = stock.get(id, 0.0) - return res - - return _product_available - - _product_qty_available = _get_product_available_func(('done',), ('in', 'out')) - _product_virtual_available = _get_product_available_func(('confirmed','waiting','assigned','done'), ('in', 'out')) - _product_outgoing_qty = _get_product_available_func(('confirmed','waiting','assigned'), ('out',)) - _product_incoming_qty = _get_product_available_func(('confirmed','waiting','assigned'), ('in',)) - + res[id][f] = stock.get(id, 0.0) + return res _columns = { - 'qty_available': fields.function(_product_qty_available, method=True, type='float', string='Real Stock',multi='qty_available', help="Current quantities of products in selected locations or all internal if none have been selected."), - 'virtual_available': fields.function(_product_virtual_available, method=True, type='float', string='Virtual Stock',multi='qty_available', help="Futur stock for this product according to the selected location or all internal if none have been selected. Computed as: Real Stock - Outgoing + Incoming."), - 'incoming_qty': fields.function(_product_incoming_qty, method=True, type='float', string='Incoming',multi='qty_available', help="Quantities of products that are planned to arrive in selected locations or all internal if none have been selected."), - 'outgoing_qty': fields.function(_product_outgoing_qty, method=True, type='float', string='Outgoing',multi='qty_available', help="Quantities of products that are planned to leave in selected locations or all internal if none have been selected."), + 'qty_available': fields.function(_product_available, method=True, type='float', string='Real Stock', help="Current quantities of products in selected locations or all internal if none have been selected.", multi='qty_available'), + 'virtual_available': fields.function(_product_available, method=True, type='float', string='Virtual Stock', help="Futur stock for this product according to the selected location or all internal if none have been selected. Computed as: Real Stock - Outgoing + Incoming.", multi='qty_available'), + 'incoming_qty': fields.function(_product_available, method=True, type='float', string='Incoming', help="Quantities of products that are planned to arrive in selected locations or all internal if none have been selected.", multi='qty_available'), + 'outgoing_qty': fields.function(_product_available, method=True, type='float', string='Outgoing', help="Quantities of products that are planned to leave in selected locations or all internal if none have been selected.", multi='qty_available'), 'track_production' : fields.boolean('Track Production Lots' , help="Force to use a Production Lot during production order"), 'track_incoming' : fields.boolean('Track Incomming Lots', help="Force to use a Production Lot during receptions"), 'track_outgoing' : fields.boolean('Track Outging Lots', help="Force to use a Production Lot during deliveries"), diff --git a/addons/stock/stock.py b/addons/stock/stock.py index f7f37830edb..5372bed8325 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -77,13 +77,20 @@ class stock_location(osv.osv): res[m.id] = _get_one_full_name(m) return res - def _product_qty_available(self, cr, uid, ids, name, arg, context={}): - res = {}.fromkeys(ids, 0.0) - if 'product_id' not in context: - return res + def _product_qty_available(self, cr, uid, ids, field_names, arg, context={}): + res = {} for id in ids: - location_ids = self.search(cr, uid, [('location_id', 'child_of', [id])]) - res[id] = self._product_get_multi_location(cr, uid, location_ids, [context['product_id']], context, ('done',), ('in','out'))[context['product_id']] + res[id] = {}.fromkeys(field_names, 0.0) + if ('product_id' not in context) or not ids: + return res + location_ids = self.search(cr, uid, [('location_id', 'child_of', ids)]) + for loc in location_ids: + context['location'] = [loc] + prod = self.pool.get('product.product').browse(cr, uid, context['product_id'], context) + if 'stock_real' in field_names: + res[loc]['stock_real'] = prod.qty_available + if 'stock_virtual' in field_names: + res[loc]['stock_virtual'] = prod.virtual_available return res _columns = { @@ -94,8 +101,8 @@ class stock_location(osv.osv): 'complete_name': fields.function(_complete_name, method=True, type='char', size=100, string="Location Name"), - 'stock_real': fields.function(_product_qty_available, method=True, type='float', string='Real Stock'), - 'stock_virtual': fields.function(_product_qty_available, method=True, type='float', string='Virtual Stock'), + 'stock_real': fields.function(_product_qty_available, method=True, type='float', string='Real Stock', multi="stock"), + 'stock_virtual': fields.function(_product_qty_available, method=True, type='float', string='Virtual Stock', multi="stock"), 'account_id': fields.many2one('account.account', string='Inventory Account', domain=[('type','!=','view')]), 'location_id': fields.many2one('stock.location', 'Parent Location', select=True, ondelete='cascade'), @@ -401,7 +408,7 @@ class stock_picking(osv.osv): ("invoiced","Invoiced"), ("2binvoiced","To be invoiced"), ("none","Not from Packing")], "Invoice Status", - select=True, required=True), + select=True, required=True, readonly=True, states={'draft':[('readonly',False)]}), } _defaults = { 'name': lambda self,cr,uid,context: self.pool.get('ir.sequence').get(cr, uid, 'stock.picking'), @@ -566,9 +573,19 @@ class stock_picking(osv.osv): def _get_taxes_invoice(self, cursor, user, move_line, type): '''Return taxes ids for the move line''' if type in ('in_invoice', 'in_refund'): - return [x.id for x in move_line.product_id.supplier_taxes_id] + taxes = move_line.product_id.supplier_taxes_id else: - return [x.id for x in move_line.product_id.taxes_id] + taxes = move_line.product_id.taxes_id + + if move_line.picking_id and move_line.picking_id.address_id and move_line.picking_id.address_id.partner_id: + return self.pool.get('account.fiscal.position').map_tax( + cursor, + user, + move_line.picking_id.address_id.partner_id, + taxes + ) + else: + return map(lambda x: x.id, taxes) def _get_account_analytic_invoice(self, cursor, user, picking, move_line): return False @@ -597,7 +614,8 @@ class stock_picking(osv.osv): partner = picking.address_id and picking.address_id.partner_id if type in ('out_invoice', 'out_refund'): account_id = partner.property_account_receivable.id - payment_term_id= picking.sale_id.payment_term.id + if picking.sale_id and picking.sale_id.payment_term: + payment_term_id= picking.sale_id.payment_term.id else: account_id = partner.property_account_payable.id @@ -611,7 +629,7 @@ class stock_picking(osv.osv): else: invoice_vals = { 'name': picking.name, - 'origin': picking.name + ':' + picking.origin, + 'origin': picking.name + (picking.origin and (':' + picking.origin) or ''), 'type': type, 'account_id': account_id, 'partner_id': partner.id, @@ -650,6 +668,7 @@ class stock_picking(osv.osv): sale_line, type) discount = self._get_discount_invoice(cursor, user, sale_line) tax_ids = self._get_taxes_invoice(cursor, user, sale_line, type) + account_analytic_id = self._get_account_analytic_invoice(cursor, user, picking, sale_line) @@ -705,7 +724,7 @@ class stock_picking(osv.osv): 'account_id': account_id, 'price_unit': price_unit, 'discount': discount, - 'quantity': move_line.product_uos_qty, + 'quantity': move_line.product_uos_qty or move_line.product_qty, 'invoice_line_tax_id': [(6, 0, tax_ids)], 'account_analytic_id': account_analytic_id, }, context=context) @@ -720,7 +739,6 @@ class stock_picking(osv.osv): self.write(cursor, user, res.keys(), { 'invoice_state': 'invoiced', }, context=context) - print res return res stock_picking()