bugixes_stock

bzr revid: fp@tinyerp.com-20081021162819-qx3kee4bcrevgadd
This commit is contained in:
Fabien Pinckaers 2008-10-21 18:28:19 +02:00
parent 6abbaf87a0
commit 84ccb0acff
11 changed files with 75 additions and 111 deletions

View File

@ -953,13 +953,8 @@ class account_invoice_line(osv.osv):
return {} return {}
taxes = self.pool.get('account.account').browse(cr, uid, account_id).tax_ids taxes = self.pool.get('account.account').browse(cr, uid, account_id).tax_ids
part = self.pool.get('res.partner').browse(cr, uid, partner_id) 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: res = self.pool.get('account.fiscal.position').map_tax(cr, uid, part, taxes)
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)
r = {'value':{'invoice_line_tax_id': res}} r = {'value':{'invoice_line_tax_id': res}}
return r return r
account_invoice_line() account_invoice_line()

View File

@ -42,7 +42,7 @@ class account_fiscal_position(osv.osv):
} }
def map_tax(self, cr, uid, partner, taxes, context={}): def map_tax(self, cr, uid, partner, taxes, context={}):
if (not partner) or (not partner.property_account_position) : if (not partner) or (not partner.property_account_position) :
return taxes return map(lambda x: x.id, taxes)
result = [] result = []
for t in taxes: for t in taxes:
ok = False ok = False

View File

@ -13,12 +13,12 @@
<newline/> <newline/>
<field name="tax_ids" colspan="4"> <field name="tax_ids" colspan="4">
<tree string="Taxes Mapping" editable="bottom"> <tree string="Taxes Mapping" editable="bottom">
<field name="tax_src_id"/> <field name="tax_src_id" domain="[('parent_id','=',False)]"/>
<field name="tax_dest_id"/> <field name="tax_dest_id" domain="[('parent_id','=',False)]"/>
</tree> </tree>
<form string="Taxes Mapping"> <form string="Taxes Mapping">
<field name="tax_src_id"/> <field name="tax_src_id" domain="[('parent_id','=',False)]"/>
<field name="tax_dest_id"/> <field name="tax_dest_id" domain="[('parent_id','=',False)]"/>
</form> </form>
</field> </field>
<field name="account_ids" colspan="4"> <field name="account_ids" colspan="4">

View File

@ -83,15 +83,14 @@ class stock_picking(osv.osv):
account_id = picking.carrier_id.product_id.categ_id\ account_id = picking.carrier_id.product_id.categ_id\
.property_account_income_categ.id .property_account_income_categ.id
taxes = self.pool.get('account.tax').browse(cursor, user, taxes = picking.carrier_id.product_id.taxes_id
[x.id for x in picking.carrier_id.product_id.taxes_id])
partner_id=picking.address_id.partner_id and picking.address_id.partner_id.id or False 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] taxes_ids = [x.id for x in picking.carrier_id.product_id.taxes_id]
if partner_id: if partner_id:
partner = picking.address_id.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(cursor, user, partner, account_id)
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(cursor, user, partner, taxes)
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, { invoice_line_obj.create(cursor, user, {
'name': picking.carrier_id.name, 'name': picking.carrier_id.name,

View File

@ -68,22 +68,9 @@ def _delivery_set(self, cr, uid, data, context):
grid_obj=pooler.get_pool(cr.dbname).get('delivery.grid') grid_obj=pooler.get_pool(cr.dbname).get('delivery.grid')
grid = grid_obj.browse(cr, uid, [grid_id])[0] grid = grid_obj.browse(cr, uid, [grid_id])[0]
taxes = pooler.get_pool(cr.dbname).get('account.tax').browse(cr, uid, taxes = grid.carrier_id.product_id.taxes_id
[x.id for x in 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)
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
line_obj.create(cr, uid, { line_obj.create(cr, uid, {
'order_id': order.id, 'order_id': order.id,
'name': grid.carrier_id.name, 'name': grid.carrier_id.name,

View File

@ -108,15 +108,7 @@ class final_invoice_create(wizard.interface):
price = 0.0 price = 0.0
taxes = product.taxes_id taxes = product.taxes_id
taxep = account.partner_id.property_account_position and account.partner_id.property_account_position.account_tax tax = self.pool.get('account.fiscal.position').map_tax(cr, uid, account.partner_id, taxes)
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)
account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id
curr_line = { curr_line = {
@ -165,15 +157,8 @@ class final_invoice_create(wizard.interface):
taxes = product.taxes_id taxes = product.taxes_id
else: else:
taxes = [] 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 = { curr_line = {
'price_unit': -amount, 'price_unit': -amount,
'quantity': 1.0, '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) product = pool.get('product.product').browse(cr, uid, data['form']['balance_product'], context2)
taxes = product.taxes_id taxes = product.taxes_id
taxep = account.partner_id.property_account_position and account.partner_id.property_account_position.account_tax tax = self.pool.get('account.fiscal.position').map_tax(cr, uid, account.partner_id, taxes)
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)
account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id
curr_line = { curr_line = {

View File

@ -113,15 +113,7 @@ class invoice_create(wizard.interface):
price = 0.0 price = 0.0
taxes = product.taxes_id taxes = product.taxes_id
taxep = account.partner_id.property_account_position and account.partner_id.property_account_position.account_tax tax = self.pool.get('account.fiscal.position').map_tax(cr, uid, account.partner_id, taxes)
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)
account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id
curr_line = { curr_line = {

View File

@ -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}} 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 = {} 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']) 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) res['value']['taxes_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, partner, taxes)

View File

@ -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['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, partner, product_obj.taxes_id)
result['name'] = product_obj.partner_ref result['name'] = product_obj.partner_ref
domain = {} domain = {}
if not uom and not uos: if not uom and not uos:
result['product_uom'] = product_obj.uom_id.id result['product_uom'] = product_obj.uom_id.id

View File

@ -131,35 +131,32 @@ class product_product(osv.osv):
res[prod_id] -= amount res[prod_id] -= amount
return res return res
def _get_product_available_func(states, what): def _product_available(self, cr, uid, ids, field_names=None, arg=False, context={}):
def _product_available(self, cr, uid, ids, field_names=None, arg=False, context={}): if not field_names:
if not field_names: field_names=[]
field_names=[] res = {}
context.update({ for id in ids:
'states':states, res[id] = {}.fromkeys(field_names, 0.0)
'what':what for f in field_names:
}) c = context.copy()
stock=self.get_product_available(cr,uid,ids,context=context) if f=='qty_available':
res = {} 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: for id in ids:
res[id] = {}.fromkeys(field_names, 0.0) res[id][f] = stock.get(id, 0.0)
for a in field_names: return res
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',))
_columns = { _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."), '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_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."), '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_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."), '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_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."), '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_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_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"), 'track_outgoing' : fields.boolean('Track Outging Lots', help="Force to use a Production Lot during deliveries"),

View File

@ -77,13 +77,20 @@ class stock_location(osv.osv):
res[m.id] = _get_one_full_name(m) res[m.id] = _get_one_full_name(m)
return res return res
def _product_qty_available(self, cr, uid, ids, name, arg, context={}): def _product_qty_available(self, cr, uid, ids, field_names, arg, context={}):
res = {}.fromkeys(ids, 0.0) res = {}
if 'product_id' not in context:
return res
for id in ids: for id in ids:
location_ids = self.search(cr, uid, [('location_id', 'child_of', [id])]) res[id] = {}.fromkeys(field_names, 0.0)
res[id] = self._product_get_multi_location(cr, uid, location_ids, [context['product_id']], context, ('done',), ('in','out'))[context['product_id']] 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 return res
_columns = { _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"), '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_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'), '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')]), 'account_id': fields.many2one('account.account', string='Inventory Account', domain=[('type','!=','view')]),
'location_id': fields.many2one('stock.location', 'Parent Location', select=True, ondelete='cascade'), 'location_id': fields.many2one('stock.location', 'Parent Location', select=True, ondelete='cascade'),
@ -401,7 +408,7 @@ class stock_picking(osv.osv):
("invoiced","Invoiced"), ("invoiced","Invoiced"),
("2binvoiced","To be invoiced"), ("2binvoiced","To be invoiced"),
("none","Not from Packing")], "Invoice Status", ("none","Not from Packing")], "Invoice Status",
select=True, required=True), select=True, required=True, readonly=True, states={'draft':[('readonly',False)]}),
} }
_defaults = { _defaults = {
'name': lambda self,cr,uid,context: self.pool.get('ir.sequence').get(cr, uid, 'stock.picking'), '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): def _get_taxes_invoice(self, cursor, user, move_line, type):
'''Return taxes ids for the move line''' '''Return taxes ids for the move line'''
if type in ('in_invoice', 'in_refund'): 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: 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): def _get_account_analytic_invoice(self, cursor, user, picking, move_line):
return False return False
@ -597,7 +614,8 @@ class stock_picking(osv.osv):
partner = picking.address_id and picking.address_id.partner_id partner = picking.address_id and picking.address_id.partner_id
if type in ('out_invoice', 'out_refund'): if type in ('out_invoice', 'out_refund'):
account_id = partner.property_account_receivable.id 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: else:
account_id = partner.property_account_payable.id account_id = partner.property_account_payable.id
@ -611,7 +629,7 @@ class stock_picking(osv.osv):
else: else:
invoice_vals = { invoice_vals = {
'name': picking.name, 'name': picking.name,
'origin': picking.name + ':' + picking.origin, 'origin': picking.name + (picking.origin and (':' + picking.origin) or ''),
'type': type, 'type': type,
'account_id': account_id, 'account_id': account_id,
'partner_id': partner.id, 'partner_id': partner.id,
@ -650,6 +668,7 @@ class stock_picking(osv.osv):
sale_line, type) sale_line, type)
discount = self._get_discount_invoice(cursor, user, sale_line) discount = self._get_discount_invoice(cursor, user, sale_line)
tax_ids = self._get_taxes_invoice(cursor, user, sale_line, type) tax_ids = self._get_taxes_invoice(cursor, user, sale_line, type)
account_analytic_id = self._get_account_analytic_invoice(cursor, account_analytic_id = self._get_account_analytic_invoice(cursor,
user, picking, sale_line) user, picking, sale_line)
@ -705,7 +724,7 @@ class stock_picking(osv.osv):
'account_id': account_id, 'account_id': account_id,
'price_unit': price_unit, 'price_unit': price_unit,
'discount': discount, '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)], 'invoice_line_tax_id': [(6, 0, tax_ids)],
'account_analytic_id': account_analytic_id, 'account_analytic_id': account_analytic_id,
}, context=context) }, context=context)
@ -720,7 +739,6 @@ class stock_picking(osv.osv):
self.write(cursor, user, res.keys(), { self.write(cursor, user, res.keys(), {
'invoice_state': 'invoiced', 'invoice_state': 'invoiced',
}, context=context) }, context=context)
print res
return res return res
stock_picking() stock_picking()