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()