[MERGE] moved some fields from product.template to product.product. Courtesy of Sebastien Beau (Akretion)

bzr revid: qdp-launchpad@openerp.com-20120725120719-czen18843ywoqx67
This commit is contained in:
Quentin (OpenERP) 2012-07-25 14:07:19 +02:00
commit b644c99c43
4 changed files with 77 additions and 75 deletions

View File

@ -930,7 +930,7 @@
<field name="uom_po_id" ref="product.product_uom_kgm"/>
</record>
<record id="orange_supplier_asus" model="product.supplierinfo">
<field name="product_id" ref="product_orange"/>
<field name="product_template_id" ref="product_orange"/>
<field name="name" ref="base.res_partner_asus"/>
<field name="min_qty">1.0</field>
<field name="product_uom" ref="product.product_uom_kgm"/>
@ -945,7 +945,7 @@
<field name="uom_po_id" ref="product.product_uom_kgm"/>
</record>
<record id="sugar_supplier_desertic" model="product.supplierinfo">
<field name="product_id" ref="product_sugar"/>
<field name="product_template_id" ref="product_sugar"/>
<field name="name" ref="base.res_partner_desertic_hispafuentes"/>
<field name="product_uom" ref="product.product_uom_kgm"/>
<field name="min_qty">2.0</field>
@ -960,7 +960,7 @@
<field name="uom_po_id" ref="product_uom_litre"/>
</record>
<record id="water_supplier_agrolait" model="product.supplierinfo">
<field name="product_id" ref="product_water"/>
<field name="product_template_id" ref="product_water"/>
<field name="name" ref="base.res_partner_agrolait"/>
<field name="product_uom" ref="product_uom_litre"/>
<field name="min_qty">2.0</field>
@ -1050,7 +1050,7 @@
<field name="uom_po_id" ref="product.product_uom_unit"/>
</record>
<record id="cloth_supplier_maxtor" model="product.supplierinfo">
<field name="product_id" ref="product_cloth"/>
<field name="product_template_id" ref="product_cloth"/>
<field name="name" ref="base.res_partner_maxtor"/>
<field name="product_uom" ref="product.product_uom_unit"/>
<field name="min_qty">300.0</field>
@ -1065,7 +1065,7 @@
<field name="uom_po_id" ref="product.product_uom_unit"/>
</record>
<record id="buttons_supplier_asus" model="product.supplierinfo">
<field name="product_id" ref="product_buttons"/>
<field name="product_template_id" ref="product_buttons"/>
<field name="name" ref="base.res_partner_asus"/>
<field name="product_uom" ref="product.product_uom_unit"/>
<field name="min_qty">100.0</field>

View File

@ -258,32 +258,6 @@ class product_template(osv.osv):
_name = "product.template"
_description = "Product Template"
def _get_main_product_supplier(self, cr, uid, product, context=None):
"""Determines the main (best) product supplier for ``product``,
returning the corresponding ``supplierinfo`` record, or False
if none were found. The default strategy is to select the
supplier with the highest priority (i.e. smallest sequence).
:param browse_record product: product to supply
:rtype: product.supplierinfo browse_record or False
"""
sellers = [(seller_info.sequence, seller_info)
for seller_info in product.seller_ids or []
if seller_info and isinstance(seller_info.sequence, (int, long))]
return sellers and sellers[0][1] or False
def _calc_seller(self, cr, uid, ids, fields, arg, context=None):
result = {}
for product in self.browse(cr, uid, ids, context=context):
main_supplier = self._get_main_product_supplier(cr, uid, product, context=context)
result[product.id] = {
'seller_info_id': main_supplier and main_supplier.id or False,
'seller_delay': main_supplier and main_supplier.delay or 1,
'seller_qty': main_supplier and main_supplier.qty or 0.0,
'seller_id': main_supplier and main_supplier.name.id or False
}
return result
_columns = {
'name': fields.char('Name', size=128, required=True, translate=True, select=True),
'product_manager': fields.many2one('res.users','Product Manager',help="Responsible for product."),
@ -320,11 +294,7 @@ class product_template(osv.osv):
help='Coefficient to convert Unit of Measure to UOS\n'
' uos = uom * coeff'),
'mes_type': fields.selection((('fixed', 'Fixed'), ('variable', 'Variable')), 'Measure Type', required=True),
'seller_info_id': fields.function(_calc_seller, type='many2one', relation="product.supplierinfo", multi="seller_info"),
'seller_delay': fields.function(_calc_seller, type='integer', string='Supplier Lead Time', multi="seller_info", help="This is the average delay in days between the purchase order confirmation and the reception of goods for this product and for the default supplier. It is used by the scheduler to order requests based on reordering delays."),
'seller_qty': fields.function(_calc_seller, type='float', string='Supplier Quantity', multi="seller_info", help="This is minimum quantity to purchase from Main Supplier."),
'seller_id': fields.function(_calc_seller, type='many2one', relation="res.partner", string='Main Supplier', help="Main Supplier who has highest priority in Supplier List.", multi="seller_info"),
'seller_ids': fields.one2many('product.supplierinfo', 'product_id', 'Partners'),
'seller_ids': fields.one2many('product.supplierinfo', 'product_template_id', 'Partners'),
'loc_rack': fields.char('Rack', size=16),
'loc_row': fields.char('Row', size=16),
'loc_case': fields.char('Case', size=16),
@ -491,6 +461,34 @@ class product_product(osv.osv):
res[p.id] = (data['code'] and ('['+data['code']+'] ') or '') + \
(data['name'] or '') + (data['variants'] and (' - '+data['variants']) or '')
return res
def _get_main_product_supplier(self, cr, uid, product, context=None):
"""Determines the main (best) product supplier for ``product``,
returning the corresponding ``supplierinfo`` record, or False
if none were found. The default strategy is to select the
supplier with the highest priority (i.e. smallest sequence).
:param browse_record product: product to supply
:rtype: product.supplierinfo browse_record or False
"""
sellers = [(seller_info.sequence, seller_info)
for seller_info in product.seller_ids or []
if seller_info and isinstance(seller_info.sequence, (int, long))]
return sellers and sellers[0][1] or False
def _calc_seller(self, cr, uid, ids, fields, arg, context=None):
result = {}
for product in self.browse(cr, uid, ids, context=context):
main_supplier = self._get_main_product_supplier(cr, uid, product, context=context)
result[product.id] = {
'seller_info_id': main_supplier and main_supplier.id or False,
'seller_delay': main_supplier and main_supplier.delay or 1,
'seller_qty': main_supplier and main_supplier.qty or 0.0,
'seller_id': main_supplier and main_supplier.name.id or False
}
return result
_defaults = {
'active': lambda *a: 1,
@ -526,6 +524,10 @@ class product_product(osv.osv):
'name_template': fields.related('product_tmpl_id', 'name', string="Name", type='char', size=128, store=True, select=True),
'color': fields.integer('Color Index'),
'product_image': fields.binary('Image'),
'seller_info_id': fields.function(_calc_seller, type='many2one', relation="product.supplierinfo", multi="seller_info"),
'seller_delay': fields.function(_calc_seller, type='integer', string='Supplier Lead Time', multi="seller_info", help="This is the average delay in days between the purchase order confirmation and the reception of goods for this product and for the default supplier. It is used by the scheduler to order requests based on reordering delays."),
'seller_qty': fields.function(_calc_seller, type='float', string='Supplier Quantity', multi="seller_info", help="This is minimum quantity to purchase from Main Supplier."),
'seller_id': fields.function(_calc_seller, type='many2one', relation="res.partner", string='Main Supplier', help="Main Supplier who has highest priority in Supplier List.", multi="seller_info"),
}
def create(self, cr, uid, vals, context=None):
@ -783,10 +785,10 @@ class product_supplierinfo(osv.osv):
'product_name': fields.char('Supplier Product Name', size=128, help="This supplier's product name will be used when printing a request for quotation. Keep empty to use the internal one."),
'product_code': fields.char('Supplier Product Code', size=64, help="This supplier's product code will be used when printing a request for quotation. Keep empty to use the internal one."),
'sequence' : fields.integer('Sequence', help="Assigns the priority to the list of product supplier."),
'product_uom': fields.related('product_id', 'uom_po_id', type='many2one', relation='product.uom', string="Supplier Unit of Measure", readonly="1", help="This comes from the product form."),
'product_uom': fields.related('product_template_id', 'uom_po_id', type='many2one', relation='product.uom', string="Supplier Unit of Measure", readonly="1", help="This comes from the product form."),
'min_qty': fields.float('Minimal Quantity', required=True, help="The minimal quantity to purchase to this supplier, expressed in the supplier Product Unit of Measure if not empty, in the default unit of measure of the product otherwise."),
'qty': fields.function(_calc_qty, store=True, type='float', string='Quantity', multi="qty", help="This is a quantity which is converted into Default Unit of Measure."),
'product_id' : fields.many2one('product.template', 'Product', required=True, ondelete='cascade', select=True),
'product_template_id' : fields.many2one('product.template', 'Product Template', required=True, ondelete='cascade', select=True),
'delay' : fields.integer('Delivery Lead Time', required=True, help="Lead time in days between the confirmation of the purchase order and the reception of the products in your warehouse. Used by the scheduler for automatic computation of the purchase order planning."),
'pricelist_ids': fields.one2many('pricelist.partnerinfo', 'suppinfo_id', 'Supplier Pricelist'),
'company_id':fields.many2one('res.company','Company',select=1),

View File

@ -693,112 +693,112 @@
<field name="name" ref="base.res_partner_asus"/>
<field name="qty">10</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_mb1"/>
<field name="product_template_id" ref="product_product_mb1"/>
<field name="delay">5</field>
</record>
<record id="supplierinfo2" model="product.supplierinfo">
<field name="name" ref="base.res_partner_asus"/>
<field name="qty">10</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_mb2"/>
<field name="product_template_id" ref="product_product_mb2"/>
<field name="delay">5</field>
</record>
<record id="supplierinfo3" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_mb1"/>
<field name="product_template_id" ref="product_product_mb1"/>
<field name="delay">1</field>
</record>
<record id="supplierinfo4" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_mb2"/>
<field name="product_template_id" ref="product_product_mb2"/>
<field name="delay">1</field>
</record>
<record id="supplierinfo5" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_pc1"/>
<field name="product_template_id" ref="product_product_pc1"/>
<field name="delay">2</field>
</record>
<record id="supplierinfo6" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_pc2"/>
<field name="product_template_id" ref="product_product_pc2"/>
<field name="delay">2</field>
</record>
<record id="supplierinfo7" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_pc3"/>
<field name="product_template_id" ref="product_product_pc3"/>
<field name="delay">2</field>
</record>
<record id="supplierinfo8" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_pc4"/>
<field name="product_template_id" ref="product_product_pc4"/>
<field name="delay">1</field>
</record>
<record id="supplierinfo9" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_cpu1"/>
<field name="product_template_id" ref="product_product_cpu1"/>
<field name="delay">1</field>
</record>
<record id="supplierinfo10" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_cpu3"/>
<field name="product_template_id" ref="product_product_cpu3"/>
<field name="delay">1</field>
</record>
<record id="supplierinfo11" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_hdd1"/>
<field name="product_template_id" ref="product_product_hdd1"/>
<field name="delay">1</field>
</record>
<record id="supplierinfo12" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_hdd2"/>
<field name="product_template_id" ref="product_product_hdd2"/>
<field name="delay">1</field>
</record>
<record id="supplierinfo13" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_hdd3"/>
<field name="product_template_id" ref="product_product_hdd3"/>
<field name="delay">1</field>
</record>
<record id="supplierinfo14" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_20"/>
<field name="product_template_id" ref="product_product_20"/>
<field name="delay">5</field>
</record>
<record id="supplierinfo15" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_21"/>
<field name="product_template_id" ref="product_product_21"/>
<field name="delay">5</field>
</record>
<record id="supplierinfo16" model="product.supplierinfo">
<field name="name" ref="base.res_partner_4"/>
<field name="qty">1</field>
<field name="min_qty">1</field>
<field name="product_id" ref="product_product_22"/>
<field name="product_template_id" ref="product_product_22"/>
<field name="delay">5</field>
</record>
<record id="supplierinfo17" model="product.supplierinfo">
@ -806,7 +806,7 @@
<field name="qty">10</field>
<field name="min_qty">1</field>
<field name="sequence">5</field>
<field name="product_id" ref="product_product_hdd1"/>
<field name="product_template_id" ref="product_product_hdd1"/>
<field name="delay">5</field>
</record>
<record id="supplierinfo18" model="product.supplierinfo">
@ -814,7 +814,7 @@
<field name="qty">10</field>
<field name="min_qty">1</field>
<field name="sequence">5</field>
<field name="product_id" ref="product_product_hdd2"/>
<field name="product_template_id" ref="product_product_hdd2"/>
<field name="delay">5</field>
</record>
<record id="supplierinfo19" model="product.supplierinfo">
@ -822,7 +822,7 @@
<field name="qty">10</field>
<field name="min_qty">1</field>
<field name="sequence">5</field>
<field name="product_id" ref="product_product_hdd3"/>
<field name="product_template_id" ref="product_product_hdd3"/>
<field name="delay">5</field>
</record>
@ -831,7 +831,7 @@
-->
<record id="product_supplierinfo_0" model="product.supplierinfo">
<field name="product_id" ref="product_product_rearpanelarm0"/>
<field name="product_template_id" ref="product_product_rearpanelarm0"/>
<field name="delay">5</field>
<field name="min_qty">1</field>
<field name="name" ref="base.res_partner_woodywoodpecker0"/>
@ -839,7 +839,7 @@
<record id="product_supplierinfo_1" model="product.supplierinfo">
<field name="product_id" ref="product_product_rearpanelarm0"/>
<field name="product_template_id" ref="product_product_rearpanelarm0"/>
<field name="delay">5</field>
<field name="min_qty">1</field>
<field name="name" ref="base.res_partner_woodywoodpecker0"/>
@ -847,7 +847,7 @@
<record id="product_supplierinfo_2" model="product.supplierinfo">
<field name="product_id" ref="product_product_rearpanelarm1"/>
<field name="product_template_id" ref="product_product_rearpanelarm1"/>
<field name="delay">5</field>
<field name="min_qty">1</field>
<field name="name" ref="base.res_partner_woodywoodpecker0"/>
@ -855,7 +855,7 @@
<record id="product_supplierinfo_3" model="product.supplierinfo">
<field name="product_id" ref="product_product_sidepanel0"/>
<field name="product_template_id" ref="product_product_sidepanel0"/>
<field name="delay">5</field>
<field name="min_qty">1</field>
<field name="name" ref="base.res_partner_woodywoodpecker0"/>
@ -863,7 +863,7 @@
<record id="product_supplierinfo_4" model="product.supplierinfo">
<field name="product_id" ref="product_product_shelfofcm0"/>
<field name="product_template_id" ref="product_product_shelfofcm0"/>
<field name="delay">5</field>
<field name="min_qty">1</field>
<field name="name" ref="base.res_partner_woodywoodpecker0"/>
@ -871,7 +871,7 @@
<record id="product_supplierinfo_5" model="product.supplierinfo">
<field name="product_id" ref="product_product_shelfofcm1"/>
<field name="product_template_id" ref="product_product_shelfofcm1"/>
<field name="delay">5</field>
<field name="min_qty">1</field>
<field name="name" ref="base.res_partner_woodywoodpecker0"/>
@ -879,7 +879,7 @@
<record id="product_supplierinfo_6" model="product.supplierinfo">
<field name="product_id" ref="product_product_assemblysection0"/>
<field name="product_template_id" ref="product_product_assemblysection0"/>
<field name="delay">2</field>
<field name="min_qty">1</field>
<field name="name" ref="base.res_partner_woodywoodpecker0"/>
@ -887,7 +887,7 @@
<record id="product_supplierinfo_7" model="product.supplierinfo">
<field name="product_id" ref="product_product_woodlintelm0"/>
<field name="product_template_id" ref="product_product_woodlintelm0"/>
<field name="delay">5</field>
<field name="min_qty">1</field>
<field name="name" ref="base.res_partner_woodywoodpecker0"/>
@ -895,7 +895,7 @@
<record id="product_supplierinfo_8" model="product.supplierinfo">
<field name="product_id" ref="product_product_metalcleats0"/>
<field name="product_template_id" ref="product_product_metalcleats0"/>
<field name="delay">5</field>
<field name="min_qty">1</field>
<field name="name" ref="base.res_partner_woodywoodpecker0"/>

View File

@ -919,15 +919,15 @@ class purchase_order_line(osv.osv):
qty = qty or 1.0
supplierinfo = False
supplierinfo_ids = product_supplierinfo.search(cr, uid, [('name','=',partner_id),('product_id','=',product.id)])
if supplierinfo_ids:
supplierinfo = product_supplierinfo.browse(cr, uid, supplierinfo_ids[0], context=context)
if supplierinfo.product_uom.id != uom_id:
res['warning'] = {'title': _('Warning'), 'message': _('The selected supplier only sells this product by %s') % supplierinfo.product_uom.name }
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.
res['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
for supplier in product.seller_ids:
if supplier.name.id == partner_id:
supplierinfo = supplier
if supplierinfo.product_uom.id != uom_id:
res['warning'] = {'title': _('Warning'), 'message': _('The selected supplier only sells this product by %s') % supplierinfo.product_uom.name }
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.
res['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
dt = self._get_date_planned(cr, uid, supplierinfo, date_order, context=context).strftime(DEFAULT_SERVER_DATETIME_FORMAT)