[REF] purchase: refactor product_id_change and rename with onchange_product_id
bzr revid: hmo@tinyerp.com-20120112070240-zgsic6tjiy7j7g30
This commit is contained in:
parent
c7d117be0c
commit
a4eb2a04b5
|
@ -697,56 +697,74 @@ class purchase_order_line(osv.osv):
|
||||||
default.update({'state':'draft', 'move_ids':[],'invoiced':0,'invoice_lines':[]})
|
default.update({'state':'draft', 'move_ids':[],'invoiced':0,'invoice_lines':[]})
|
||||||
return super(purchase_order_line, self).copy_data(cr, uid, id, default, context)
|
return super(purchase_order_line, self).copy_data(cr, uid, id, default, context)
|
||||||
|
|
||||||
#TOFIX:
|
|
||||||
# - name of method should "onchange_product_id"
|
def _onchange_check_partner_pricelist(self, pricelist_id, partner_id):
|
||||||
# - docstring
|
return True
|
||||||
# - split into small internal methods for clearity
|
|
||||||
def product_id_change(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id,
|
def onchange_product_uom(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id,
|
||||||
partner_id, date_order=False, fiscal_position_id=False, date_planned=False,
|
partner_id, date_order=False, fiscal_position_id=False, date_planned=False,
|
||||||
name=False, price_unit=False, notes=False, context=None):
|
name=False, price_unit=False, notes=False, context=None):
|
||||||
|
"""
|
||||||
|
onchange handler of product_uom.
|
||||||
|
"""
|
||||||
|
if not uom_id:
|
||||||
|
return {'value': {'price_unit': price_unit or 0.0, 'name': name or '', 'notes': notes or'', 'product_uom' : uom_id or False}}
|
||||||
|
return self.onchange_product_id(cr, uid, ids, pricelist_id, product_id, qty, uom_id,
|
||||||
|
partner_id, date_order=date_order, fiscal_position_id=fiscal_position_id, date_planned=date_planned,
|
||||||
|
name=name, price_unit=price_unit, notes=notes, context=context)
|
||||||
|
|
||||||
|
def onchange_product_id(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id,
|
||||||
|
partner_id, date_order=False, fiscal_position_id=False, date_planned=False,
|
||||||
|
name=False, price_unit=False, notes=False, context=None):
|
||||||
|
"""
|
||||||
|
onchange handler of product_id.
|
||||||
|
"""
|
||||||
|
res = {}
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
|
||||||
res = {'price_unit': price_unit or 0.0, 'name': name or '', 'notes': notes or'', 'product_uom' : uom_id or False}
|
|
||||||
uom_change = context.get('uom_change', False)
|
|
||||||
|
|
||||||
|
res_value = {'price_unit': price_unit or 0.0, 'name': name or '', 'notes': notes or'', 'product_uom' : uom_id or False}
|
||||||
|
if not product_id:
|
||||||
|
return {'value': res_value}
|
||||||
|
|
||||||
|
product_product = self.pool.get('product.product')
|
||||||
|
product_uom = self.pool.get('product.uom')
|
||||||
|
res_partner = self.pool.get('res.partner')
|
||||||
|
product_supplierinfo = self.pool.get('product.supplierinfo')
|
||||||
|
product_pricelist = self.pool.get('product.pricelist')
|
||||||
|
account_fiscal_position = self.pool.get('account.fiscal.position')
|
||||||
|
account_tax = self.pool.get('account.tax')
|
||||||
|
|
||||||
|
# - check for the presence of partner_id and pricelist_id
|
||||||
if not pricelist_id:
|
if not pricelist_id:
|
||||||
raise osv.except_osv(_('No Pricelist !'), _('You have to select a pricelist or a supplier in the purchase form !\nPlease set one before choosing a product.'))
|
raise osv.except_osv(_('No Pricelist !'), _('You have to select a pricelist or a supplier in the purchase form !\nPlease set one before choosing a product.'))
|
||||||
if not partner_id:
|
if not partner_id:
|
||||||
raise osv.except_osv(_('No Partner!'), _('You have to select a partner in the purchase form !\nPlease set one partner before choosing a product.'))
|
raise osv.except_osv(_('No Partner!'), _('You have to select a partner in the purchase form !\nPlease set one partner before choosing a product.'))
|
||||||
if not product_id:
|
|
||||||
return {'value': res}
|
|
||||||
|
|
||||||
|
# - determine name and notes based on product in partner lang.
|
||||||
product_uom_pool = self.pool.get('product.uom')
|
|
||||||
product_supplierinfo = self.pool.get('product.supplierinfo')
|
|
||||||
res_partner = self.pool.get('res.partner')
|
|
||||||
product_product = self.pool.get('product.product')
|
|
||||||
account_fiscal_position = self.pool.get('account.fiscal.position')
|
|
||||||
account_tax = self.pool.get('account.tax')
|
|
||||||
|
|
||||||
# set supplier langauage in context
|
|
||||||
lang = res_partner.browse(cr, uid, partner_id).lang
|
lang = res_partner.browse(cr, uid, partner_id).lang
|
||||||
if lang:
|
if lang:
|
||||||
context['lang'] = lang
|
context['lang'] = lang
|
||||||
context['partner_id'] = partner_id
|
context['partner_id'] = partner_id
|
||||||
|
|
||||||
product = product_product.browse(cr, uid, product_id, context=context)
|
product = product_product.browse(cr, uid, product_id, context=context)
|
||||||
|
res_value.update({'name': product.name, 'notes': notes or product.description_purchase})
|
||||||
|
|
||||||
|
# - set a domain on product_uom
|
||||||
domain = {'product_uom':[('category_id','=',product.uom_id.category_id.id)]}
|
domain = {'product_uom':[('category_id','=',product.uom_id.category_id.id)]}
|
||||||
res['domain'] = domain
|
res.update({'domain': domain})
|
||||||
|
|
||||||
if uom_change and not uom_id:
|
|
||||||
return {'value': res}
|
|
||||||
|
|
||||||
|
# - check that uom and product uom belong to the same category
|
||||||
product_uom_po_id = product.uom_po_id.id
|
product_uom_po_id = product.uom_po_id.id
|
||||||
if not uom_id:
|
if not uom_id:
|
||||||
uom_id = product_uom_po_id
|
uom_id = product_uom_po_id
|
||||||
|
|
||||||
# checking UOM category
|
if product.uom_id.category_id.id != product_uom.browse(cr, uid, uom_id, context=context).category_id.id:
|
||||||
if product.uom_id.category_id.id != product_uom_pool.browse(cr, uid, uom_id).category_id.id:
|
|
||||||
res.update({'warning': {'title': _('Warning'), 'message': _('Selected UOM does not have same category of default UOM')}})
|
res.update({'warning': {'title': _('Warning'), 'message': _('Selected UOM does not have same category of default UOM')}})
|
||||||
uom_id = product_uom_po_id
|
uom_id = product_uom_po_id
|
||||||
|
|
||||||
|
res_value.update({'product_uom': uom_id})
|
||||||
|
|
||||||
|
# - determine product_qty and date_planned based on seller info
|
||||||
if not date_order:
|
if not date_order:
|
||||||
date_order = time.strftime('%Y-%m-%d')
|
date_order = time.strftime('%Y-%m-%d')
|
||||||
|
|
||||||
|
@ -758,31 +776,32 @@ class purchase_order_line(osv.osv):
|
||||||
seller_delay = supplierinfo.delay
|
seller_delay = supplierinfo.delay
|
||||||
if supplierinfo.product_uom.id != uom_id:
|
if supplierinfo.product_uom.id != uom_id:
|
||||||
res.update({'warning': {'title': _('Warning'), 'message': _('The selected supplier only sells this product by %s') % supplierinfo.product_uom.name }})
|
res.update({'warning': {'title': _('Warning'), 'message': _('The selected supplier only sells this product by %s') % supplierinfo.product_uom.name }})
|
||||||
min_qty = product_uom_pool._compute_qty(cr, uid, supplierinfo.product_uom.id, supplierinfo.min_qty, to_uom_id=uom_id)
|
min_qty = product_uom._compute_qty(cr, uid, supplierinfo.product_uom.id, supplierinfo.min_qty, to_uom_id=uom_id)
|
||||||
if qty < min_qty: # If the supplier quantity is greater than entered from user, set minimal.
|
if qty < min_qty: # If the supplier quantity is greater than entered from user, set minimal.
|
||||||
res.update({'warning': {'title': _('Warning'), 'message': _('The selected supplier has a minimal quantity set to %s %s, you should not purchase less.') % (supplierinfo.min_qty, supplierinfo.product_uom.name)}})
|
res.update({'warning': {'title': _('Warning'), 'message': _('The selected supplier has a minimal quantity set to %s %s, you should not purchase less.') % (supplierinfo.min_qty, supplierinfo.product_uom.name)}})
|
||||||
qty = min_qty
|
qty = min_qty
|
||||||
|
|
||||||
price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist_id],
|
dt = (datetime.strptime(date_order, '%Y-%m-%d') + relativedelta(days=int(seller_delay) or 0.0)).strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
res_value.update({'date_planned': date_planned or dt, 'product_qty': qty})
|
||||||
|
|
||||||
|
# - determine price_unit and taxes_id
|
||||||
|
price = product_pricelist.price_get(cr, uid, [pricelist_id],
|
||||||
product.id, qty or 1.0, partner_id, {
|
product.id, qty or 1.0, partner_id, {
|
||||||
'uom': uom_id,
|
'uom': uom_id,
|
||||||
'date': date_order,
|
'date': date_order,
|
||||||
})[pricelist_id]
|
})[pricelist_id]
|
||||||
dt = (datetime.now() + relativedelta(days=int(seller_delay) or 0.0)).strftime('%Y-%m-%d %H:%M:%S')
|
|
||||||
|
|
||||||
|
|
||||||
res.update({'value': {'price_unit': price, 'name': product.name,
|
|
||||||
'taxes_id':map(lambda x: x.id, product.supplier_taxes_id),
|
|
||||||
'date_planned': date_planned or dt,'notes': notes or product.description_purchase,
|
|
||||||
'product_qty': qty,
|
|
||||||
'product_uom': uom_id}})
|
|
||||||
|
|
||||||
taxes = account_tax.browse(cr, uid, map(lambda x: x.id, product.supplier_taxes_id))
|
taxes = account_tax.browse(cr, uid, map(lambda x: x.id, product.supplier_taxes_id))
|
||||||
fpos = fiscal_position_id and account_fiscal_position.browse(cr, uid, fiscal_position_id, context=context) or False
|
fpos = fiscal_position_id and account_fiscal_position.browse(cr, uid, fiscal_position_id, context=context) or False
|
||||||
res['value']['taxes_id'] = account_fiscal_position.map_tax(cr, uid, fpos, taxes)
|
taxes_ids = account_fiscal_position.map_tax(cr, uid, fpos, taxes)
|
||||||
|
res_value.update({'price_unit': price, 'taxes_id': taxes_ids})
|
||||||
|
|
||||||
|
|
||||||
|
res.update({'value': res_value})
|
||||||
return res
|
return res
|
||||||
|
|
||||||
product_uom_change = product_id_change
|
product_id_change = onchange_product_id
|
||||||
|
product_uom_change = onchange_product_uom
|
||||||
|
|
||||||
def action_confirm(self, cr, uid, ids, context=None):
|
def action_confirm(self, cr, uid, ids, context=None):
|
||||||
self.write(cr, uid, ids, {'state': 'confirmed'}, context=context)
|
self.write(cr, uid, ids, {'state': 'confirmed'}, context=context)
|
||||||
|
|
|
@ -359,9 +359,9 @@
|
||||||
<form string="Purchase Order Line">
|
<form string="Purchase Order Line">
|
||||||
<notebook colspan="4">
|
<notebook colspan="4">
|
||||||
<page string="Order Line">
|
<page string="Order Line">
|
||||||
<field name="product_id" colspan="4" context="{'partner_id':parent.partner_id, 'quantity':product_qty, 'pricelist':parent.pricelist_id, 'uom':product_uom, 'warehouse':parent.warehouse_id}" on_change="product_id_change(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id, parent.date_order,parent.fiscal_position,date_planned,name,price_unit,notes,context)"/>
|
<field name="product_id" colspan="4" on_change="onchange_product_id(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id, parent.date_order,parent.fiscal_position,date_planned,name,price_unit,notes,context)"/>
|
||||||
<field name="product_qty" context="{'partner_id':parent.partner_id, 'quantity':product_qty, 'pricelist':parent.pricelist_id, 'uom':product_uom, 'warehouse':parent.warehouse_id}" on_change="product_id_change(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id,parent.date_order,parent.fiscal_position,date_planned,name,price_unit,notes,context)"/>
|
<field name="product_qty" on_change="onchange_product_id(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id,parent.date_order,parent.fiscal_position,date_planned,name,price_unit,notes,context)"/>
|
||||||
<field name="product_uom" on_change="product_id_change(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id, parent.date_order,parent.fiscal_position,date_planned,name,price_unit,notes,{'uom_change': True})"/>
|
<field name="product_uom" on_change="onchange_product_uom(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id, parent.date_order,parent.fiscal_position,date_planned,name,price_unit,notes,context)"/>
|
||||||
<field colspan="4" name="name"/>
|
<field colspan="4" name="name"/>
|
||||||
<field name="date_planned" widget="date"/>
|
<field name="date_planned" widget="date"/>
|
||||||
<field name="price_unit"/>
|
<field name="price_unit"/>
|
||||||
|
|
Loading…
Reference in New Issue