[IMP] purchase: sum the quantities of same product/uom in place of adding a new line in existing PO, when a PO line is about to be added from procurement resolution. Also modified the action_piking_create in order to create one incomming shipment for all products ordered, that will spread into several as soon as received in input location
bzr revid: qdp-launchpad@openerp.com-20140214141202-kfdvpd0ebq9g1hwi
This commit is contained in:
parent
6afae4da34
commit
20bfab5c30
|
@ -673,11 +673,10 @@ class purchase_order(osv.osv):
|
||||||
if order.currency_id.id != order.company_id.currency_id.id:
|
if order.currency_id.id != order.company_id.currency_id.id:
|
||||||
#we don't round the price_unit, as we may want to store the standard price with more digits than allowed by the currency
|
#we don't round the price_unit, as we may want to store the standard price with more digits than allowed by the currency
|
||||||
price_unit = self.pool.get('res.currency').compute(cr, uid, order.currency_id.id, order.company_id.currency_id.id, price_unit, round=False, context=context)
|
price_unit = self.pool.get('res.currency').compute(cr, uid, order.currency_id.id, order.company_id.currency_id.id, price_unit, round=False, context=context)
|
||||||
res = [{
|
res = []
|
||||||
|
move_template = {
|
||||||
'name': order_line.name or '',
|
'name': order_line.name or '',
|
||||||
'product_id': order_line.product_id.id,
|
'product_id': order_line.product_id.id,
|
||||||
'product_uom_qty': order_line.product_qty,
|
|
||||||
'product_uos_qty': order_line.product_qty,
|
|
||||||
'product_uom': order_line.product_uom.id,
|
'product_uom': order_line.product_uom.id,
|
||||||
'product_uos': order_line.product_uom.id,
|
'product_uos': order_line.product_uom.id,
|
||||||
'date': self.date_to_datetime(cr, uid, order.date_order, context),
|
'date': self.date_to_datetime(cr, uid, order.date_order, context),
|
||||||
|
@ -686,34 +685,37 @@ class purchase_order(osv.osv):
|
||||||
'location_dest_id': order.location_id.id,
|
'location_dest_id': order.location_id.id,
|
||||||
'picking_id': picking_id,
|
'picking_id': picking_id,
|
||||||
'partner_id': order.dest_address_id.id or order.partner_id.id,
|
'partner_id': order.dest_address_id.id or order.partner_id.id,
|
||||||
'move_dest_id': order_line.move_dest_id.id,
|
'move_dest_id': False,
|
||||||
'state': 'draft',
|
'state': 'draft',
|
||||||
'purchase_line_id': order_line.id,
|
'purchase_line_id': order_line.id,
|
||||||
'company_id': order.company_id.id,
|
'company_id': order.company_id.id,
|
||||||
'price_unit': price_unit,
|
'price_unit': price_unit,
|
||||||
'picking_type_id': order.picking_type_id.id,
|
'picking_type_id': order.picking_type_id.id,
|
||||||
'group_id': group_id,
|
'group_id': group_id,
|
||||||
'procurement_id': order_line.procurement_ids and order_line.procurement_ids[0].id or False,
|
'procurement_id': False,
|
||||||
'origin': order.name,
|
'origin': order.name,
|
||||||
'route_ids': order.picking_type_id.warehouse_id and [(6, 0, [x.id for x in order.picking_type_id.warehouse_id.route_ids])] or [],
|
'route_ids': order.picking_type_id.warehouse_id and [(6, 0, [x.id for x in order.picking_type_id.warehouse_id.route_ids])] or [],
|
||||||
}]
|
}
|
||||||
|
|
||||||
|
diff_quantity = order_line.product_qty
|
||||||
|
for procurement in order_line.procurement_ids:
|
||||||
|
procurement_qty = product_uom._compute_qty(cr, uid, procurement.product_uom.id, procurement.product_qty, to_uom_id=order_line.product_uom.id)
|
||||||
|
tmp = move_template.copy()
|
||||||
|
tmp.update({
|
||||||
|
'product_uom_qty': min(procurement_qty, diff_quantity),
|
||||||
|
'product_uos_qty': min(procurement_qty, diff_quantity),
|
||||||
|
'move_dest_id': procurement.move_dest_id.id, # blabla
|
||||||
|
'group_id': procurement.group_id.id or group_id, # blabla to check ca devrait etre bon et groupé dans le meme picking qd meme
|
||||||
|
'procurement_id': procurement.id,
|
||||||
|
})
|
||||||
|
diff_quantity -= min(procurement_qty, diff_quantity)
|
||||||
|
res.append(tmp)
|
||||||
#if the order line has a bigger quantity than the procurement it was for (manually changed or minimal quantity), then
|
#if the order line has a bigger quantity than the procurement it was for (manually changed or minimal quantity), then
|
||||||
#split the future stock move in two because the route followed may be different.
|
#split the future stock move in two because the route followed may be different.
|
||||||
if order_line.procurement_ids:
|
|
||||||
procurement = order_line.procurement_ids[0]
|
|
||||||
procurement_quantity = product_uom._compute_qty(cr, uid, procurement.product_uom.id, procurement.product_qty, to_uom_id=order_line.product_uom.id)
|
|
||||||
diff_quantity = order_line.product_qty - procurement_quantity
|
|
||||||
if diff_quantity > 0:
|
if diff_quantity > 0:
|
||||||
tmp = res[0].copy()
|
move_template['product_uom_qty'] = diff_quantity
|
||||||
res[0]['product_uom_qty'] = diff_quantity
|
move_template['product_uos_qty'] = diff_quantity
|
||||||
res[0]['product_uos_qty'] = diff_quantity
|
res.append(move_template)
|
||||||
res[0]['procurement_id'] = False
|
|
||||||
res[0]['move_dest_id'] = False
|
|
||||||
tmp['product_uom_qty'] = procurement.product_qty
|
|
||||||
tmp['product_uos_qty'] = procurement.product_qty
|
|
||||||
tmp['product_uom'] = procurement.product_uom.id
|
|
||||||
tmp['product_uos'] = procurement.product_uom.id
|
|
||||||
res.append(tmp)
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _create_stock_moves(self, cr, uid, order, order_lines, picking_id=False, context=None):
|
def _create_stock_moves(self, cr, uid, order, order_lines, picking_id=False, context=None):
|
||||||
|
@ -737,8 +739,6 @@ class purchase_order(osv.osv):
|
||||||
"""
|
"""
|
||||||
stock_move = self.pool.get('stock.move')
|
stock_move = self.pool.get('stock.move')
|
||||||
todo_moves = []
|
todo_moves = []
|
||||||
new_group = False
|
|
||||||
if any([(not x.group_id) for x in order_lines]):
|
|
||||||
new_group = self.pool.get("procurement.group").create(cr, uid, {'name': order.name, 'partner_id': order.partner_id.id}, context=context)
|
new_group = self.pool.get("procurement.group").create(cr, uid, {'name': order.name, 'partner_id': order.partner_id.id}, context=context)
|
||||||
|
|
||||||
for order_line in order_lines:
|
for order_line in order_lines:
|
||||||
|
@ -746,8 +746,7 @@ class purchase_order(osv.osv):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if order_line.product_id.type in ('product', 'consu'):
|
if order_line.product_id.type in ('product', 'consu'):
|
||||||
group_id = order_line.group_id and order_line.group_id.id or new_group
|
for vals in self._prepare_order_line_move(cr, uid, order, order_line, picking_id, new_group, context=context):
|
||||||
for vals in self._prepare_order_line_move(cr, uid, order, order_line, picking_id, group_id, context=context):
|
|
||||||
move = stock_move.create(cr, uid, vals, context=context)
|
move = stock_move.create(cr, uid, vals, context=context)
|
||||||
todo_moves.append(move)
|
todo_moves.append(move)
|
||||||
|
|
||||||
|
@ -785,7 +784,8 @@ class purchase_order(osv.osv):
|
||||||
|
|
||||||
def action_picking_create(self, cr, uid, ids, context=None):
|
def action_picking_create(self, cr, uid, ids, context=None):
|
||||||
for order in self.browse(cr, uid, ids):
|
for order in self.browse(cr, uid, ids):
|
||||||
self._create_stock_moves(cr, uid, order, order.order_line, None, context=context)
|
picking_id = self.pool.get('stock.picking').create(cr, uid, {'picking_type_id': order.picking_type_id.id}, context=context)
|
||||||
|
self._create_stock_moves(cr, uid, order, order.order_line, picking_id, context=context)
|
||||||
|
|
||||||
def picking_done(self, cr, uid, ids, context=None):
|
def picking_done(self, cr, uid, ids, context=None):
|
||||||
self.write(cr, uid, ids, {'shipped':1,'state':'approved'}, context=context)
|
self.write(cr, uid, ids, {'shipped':1,'state':'approved'}, context=context)
|
||||||
|
@ -832,7 +832,7 @@ class purchase_order(osv.osv):
|
||||||
list_key = []
|
list_key = []
|
||||||
for field in fields:
|
for field in fields:
|
||||||
field_val = getattr(br, field)
|
field_val = getattr(br, field)
|
||||||
if field in ('product_id', 'move_dest_id', 'account_analytic_id'):
|
if field in ('product_id', 'account_analytic_id'):
|
||||||
if not field_val:
|
if not field_val:
|
||||||
field_val = False
|
field_val = False
|
||||||
if isinstance(field_val, browse_record):
|
if isinstance(field_val, browse_record):
|
||||||
|
@ -939,7 +939,6 @@ class purchase_order_line(osv.osv):
|
||||||
'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True),
|
'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True),
|
||||||
'product_id': fields.many2one('product.product', 'Product', domain=[('purchase_ok','=',True)], change_default=True),
|
'product_id': fields.many2one('product.product', 'Product', domain=[('purchase_ok','=',True)], change_default=True),
|
||||||
'move_ids': fields.one2many('stock.move', 'purchase_line_id', 'Reservation', readonly=True, ondelete='set null'),
|
'move_ids': fields.one2many('stock.move', 'purchase_line_id', 'Reservation', readonly=True, ondelete='set null'),
|
||||||
'move_dest_id': fields.many2one('stock.move', 'Reservation Destination', ondelete='set null'),
|
|
||||||
'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Product Price')),
|
'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Product Price')),
|
||||||
'price_subtotal': fields.function(_amount_line, string='Subtotal', digits_compute= dp.get_precision('Account')),
|
'price_subtotal': fields.function(_amount_line, string='Subtotal', digits_compute= dp.get_precision('Account')),
|
||||||
'order_id': fields.many2one('purchase.order', 'Order Reference', select=True, required=True, ondelete='cascade'),
|
'order_id': fields.many2one('purchase.order', 'Order Reference', select=True, required=True, ondelete='cascade'),
|
||||||
|
@ -955,7 +954,6 @@ class purchase_order_line(osv.osv):
|
||||||
'partner_id': fields.related('order_id','partner_id',string='Partner',readonly=True,type="many2one", relation="res.partner", store=True),
|
'partner_id': fields.related('order_id','partner_id',string='Partner',readonly=True,type="many2one", relation="res.partner", store=True),
|
||||||
'date_order': fields.related('order_id','date_order',string='Order Date',readonly=True,type="date"),
|
'date_order': fields.related('order_id','date_order',string='Order Date',readonly=True,type="date"),
|
||||||
'procurement_ids': fields.one2many('procurement.order', 'purchase_line_id', string='Associated procurements'),
|
'procurement_ids': fields.one2many('procurement.order', 'purchase_line_id', string='Associated procurements'),
|
||||||
'group_id': fields.related('procurement_ids', 'group_id', type='many2one', relation='procurement.group', string='Procurement Group'),
|
|
||||||
}
|
}
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'product_uom' : _get_uom_id,
|
'product_uom' : _get_uom_id,
|
||||||
|
@ -1267,7 +1265,6 @@ class procurement_order(osv.osv):
|
||||||
'product_uom': uom_id,
|
'product_uom': uom_id,
|
||||||
'price_unit': price or 0.0,
|
'price_unit': price or 0.0,
|
||||||
'date_planned': schedule_date.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
'date_planned': schedule_date.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
'move_dest_id': procurement.move_dest_id and procurement.move_dest_id.id or False,
|
|
||||||
'taxes_id': [(6, 0, taxes)],
|
'taxes_id': [(6, 0, taxes)],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1282,6 +1279,7 @@ class procurement_order(osv.osv):
|
||||||
seq_obj = self.pool.get('ir.sequence')
|
seq_obj = self.pool.get('ir.sequence')
|
||||||
pass_ids = []
|
pass_ids = []
|
||||||
linked_po_ids = []
|
linked_po_ids = []
|
||||||
|
sum_po_line_ids = []
|
||||||
for procurement in self.browse(cr, uid, ids, context=context):
|
for procurement in self.browse(cr, uid, ids, context=context):
|
||||||
partner = self._get_product_supplier(cr, uid, procurement, context=context)
|
partner = self._get_product_supplier(cr, uid, procurement, context=context)
|
||||||
if not partner:
|
if not partner:
|
||||||
|
@ -1296,6 +1294,14 @@ class procurement_order(osv.osv):
|
||||||
('location_id', '=', procurement.location_id.id), ('company_id', '=', procurement.company_id.id)], context=context)
|
('location_id', '=', procurement.location_id.id), ('company_id', '=', procurement.company_id.id)], context=context)
|
||||||
if available_draft_po_ids:
|
if available_draft_po_ids:
|
||||||
po_id = available_draft_po_ids[0]
|
po_id = available_draft_po_ids[0]
|
||||||
|
#look for any other PO line in the selected PO with same product and UoM to sum quantities instead of creating a new po line
|
||||||
|
available_po_line_ids = po_line_obj.search(cr, uid, [('order_id', '=', po_id), ('product_id', '=', line_vals['product_id']), ('product_uom', '=', line_vals['product_uom'])], context=context)
|
||||||
|
if available_po_line_ids:
|
||||||
|
po_line = po_line_obj.browse(cr, uid, available_po_line_ids[0], context=context)
|
||||||
|
po_line_obj.write(cr, uid, po_line.id, {'product_qty': po_line.product_qty + line_vals['product_qty']}, context=context)
|
||||||
|
po_line_id = po_line.id
|
||||||
|
sum_po_line_ids.append(procurement.id)
|
||||||
|
else:
|
||||||
line_vals.update(order_id=po_id)
|
line_vals.update(order_id=po_id)
|
||||||
po_line_id = po_line_obj.create(cr, uid, line_vals, context=context)
|
po_line_id = po_line_obj.create(cr, uid, line_vals, context=context)
|
||||||
linked_po_ids.append(procurement.id)
|
linked_po_ids.append(procurement.id)
|
||||||
|
@ -1323,6 +1329,8 @@ class procurement_order(osv.osv):
|
||||||
self.message_post(cr, uid, pass_ids, body=_("Draft Purchase Order created"), context=context)
|
self.message_post(cr, uid, pass_ids, body=_("Draft Purchase Order created"), context=context)
|
||||||
if linked_po_ids:
|
if linked_po_ids:
|
||||||
self.message_post(cr, uid, linked_po_ids, body=_("Purchase line created and linked to an existing Purchase Order"), context=context)
|
self.message_post(cr, uid, linked_po_ids, body=_("Purchase line created and linked to an existing Purchase Order"), context=context)
|
||||||
|
if sum_po_line_ids:
|
||||||
|
self.message_post(cr, uid, sum_po_line_ids, body=_("Quantity added in existing Purchase Order Line"), context=context)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _product_virtual_get(self, cr, uid, order_point):
|
def _product_virtual_get(self, cr, uid, order_point):
|
||||||
|
|
Loading…
Reference in New Issue