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

View File

@ -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

View File

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

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 = 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,

View File

@ -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 = {

View File

@ -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 = {

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

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['name'] = product_obj.partner_ref
domain = {}
if not uom and not uos:
result['product_uom'] = product_obj.uom_id.id

View File

@ -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"),

View File

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