[REF] some refactoring made during code review
bzr revid: qdp-launchpad@openerp.com-20140205172444-4v7msetkkp7ypb7y
This commit is contained in:
parent
abb8f9c929
commit
369d222965
|
@ -26,7 +26,6 @@ import time
|
|||
|
||||
from openerp.osv import fields, osv
|
||||
from openerp.tools.translate import _
|
||||
from openerp import tools
|
||||
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
|
||||
from openerp import SUPERUSER_ID
|
||||
import openerp.addons.decimal_precision as dp
|
||||
|
@ -784,8 +783,8 @@ class stock_picking(osv.osv):
|
|||
'''This function prints the delivery order'''
|
||||
assert len(ids) == 1, 'This option should only be used for a single id at a time'
|
||||
datas = {
|
||||
'model': 'stock.picking',
|
||||
'ids': ids,
|
||||
'model': 'stock.picking',
|
||||
'ids': ids,
|
||||
}
|
||||
return {'type': 'ir.actions.report.xml', 'report_name': 'stock.picking.list', 'datas': datas, 'nodestroy': True}
|
||||
|
||||
|
@ -793,8 +792,8 @@ class stock_picking(osv.osv):
|
|||
'''This function prints the picking list'''
|
||||
assert len(ids) == 1, 'This option should only be used for a single id at a time'
|
||||
datas = {
|
||||
'model': 'stock.picking',
|
||||
'ids': ids,
|
||||
'model': 'stock.picking',
|
||||
'ids': ids,
|
||||
}
|
||||
return {'type': 'ir.actions.report.xml', 'report_name': 'stock.picking.list.internal', 'datas': datas, 'nodestroy': True}
|
||||
|
||||
|
@ -841,7 +840,6 @@ class stock_picking(osv.osv):
|
|||
self.do_prepare_partial(cr, uid, [pick.id], context=None)
|
||||
return True
|
||||
|
||||
|
||||
def action_cancel(self, cr, uid, ids, context=None):
|
||||
for pick in self.browse(cr, uid, ids, context=context):
|
||||
ids2 = [move.id for move in pick.move_lines]
|
||||
|
@ -1204,14 +1202,13 @@ class stock_production_lot(osv.osv):
|
|||
@return: A dictionary of values
|
||||
"""
|
||||
quant_obj = self.pool.get("stock.quant")
|
||||
move_obj = self.pool.get("stock.move")
|
||||
quants = quant_obj.search(cr, uid, [('lot_id', 'in', ids)], context=context)
|
||||
moves = set()
|
||||
for quant in quant_obj.browse(cr, uid, quants, context=context):
|
||||
moves |= {move.id for move in quant.history_ids}
|
||||
if moves:
|
||||
return {
|
||||
'domain': "[('id','in',["+','.join(map(str, list(moves)))+"])]",
|
||||
return {
|
||||
'domain': "[('id','in',[" + ','.join(map(str, list(moves))) + "])]",
|
||||
'name': _('Traceability'),
|
||||
'view_mode': 'tree,form',
|
||||
'view_type': 'form',
|
||||
|
@ -1220,7 +1217,6 @@ class stock_production_lot(osv.osv):
|
|||
'type': 'ir.actions.act_window',
|
||||
}
|
||||
return False
|
||||
|
||||
|
||||
|
||||
# ----------------------------------------------------
|
||||
|
@ -1396,7 +1392,7 @@ class stock_move(osv.osv):
|
|||
'price_unit': fields.float('Unit Price', help="Technical field used to record the product cost set by the user during a picking confirmation (when costing method used is 'average price' or 'real'). Value given in company currency and in product uom."), # as it's a technical field, we intentionally don't provide the digits attribute
|
||||
|
||||
'company_id': fields.many2one('res.company', 'Company', required=True, select=True),
|
||||
'split_from': fields.many2one('stock.move', string="Move Split From", select=True),
|
||||
'split_from': fields.many2one('stock.move', string="Move Split From", help="Technical field used to track the origin of a split move, which can be useful in case of debug"),
|
||||
'backorder_id': fields.related('picking_id', 'backorder_id', type='many2one', relation="stock.picking", string="Back Order of", select=True),
|
||||
'origin': fields.char("Source"),
|
||||
'procure_method': fields.selection([('make_to_stock', 'Make to Stock'), ('make_to_order', 'Make to Order')], 'Procurement Method', required=True, help="Make to Stock: When needed, the product is taken from the stock or we wait for replenishment. \nMake to Order: When needed, the product is purchased or produced."),
|
||||
|
@ -1803,7 +1799,6 @@ class stock_move(osv.osv):
|
|||
self._putaway_check(cr, uid, ids, context=context)
|
||||
return self.write(cr, uid, ids, {'state': 'assigned'})
|
||||
|
||||
|
||||
def check_tracking(self, cr, uid, move, lot_id, context=None):
|
||||
""" Checks if serial number is assigned to stock move or not and raise an error if it had to.
|
||||
"""
|
||||
|
@ -1839,6 +1834,7 @@ class stock_move(osv.osv):
|
|||
fallback_domain = prev_quant_ids and [('id', 'not in', prev_quant_ids)] or []
|
||||
#we always keep the quants already assigned and try to find the remaining quantity on quants not assigned only
|
||||
main_domain = [('reservation_id', '=', False), ('qty', '>', 0)]
|
||||
#if the move is returned from another, restrict the choice of quants to the ones that follow the returned move
|
||||
if move.origin_returned_move_id:
|
||||
main_domain += [('history_ids', 'in', move.origin_returned_move_id.id)]
|
||||
#first try to find quants based on specific domains given by linked operations
|
||||
|
@ -1906,8 +1902,6 @@ class stock_move(osv.osv):
|
|||
pickings.add(move.picking_id.id)
|
||||
qty = move.product_qty
|
||||
main_domain = [('qty', '>', 0)]
|
||||
if move.origin_returned_move_id:
|
||||
main_domain += [('history_ids', 'in', move.origin_returned_move_id.id)]
|
||||
prefered_domain = [('reservation_id', '=', move.id)]
|
||||
fallback_domain = [('reservation_id', '=', False)]
|
||||
#first, process the move per linked operation first because it may imply some specific domains to consider
|
||||
|
|
|
@ -43,15 +43,13 @@ class stock_return_picking(osv.osv_memory):
|
|||
_description = 'Return Picking'
|
||||
_columns = {
|
||||
'product_return_moves': fields.one2many('stock.return.picking.line', 'wizard_id', 'Moves'),
|
||||
'move_dest_exists': fields.boolean('Chained Move Exists', readonly = True),
|
||||
'move_dest_method': fields.selection([('nothing', 'Do Nothing'), ('cancel', 'Split and Cancel Next Moves => Do not receive returned products again'),
|
||||
('create', 'Split and Create New Original Move => Receive returned products again later')],
|
||||
string="With Chained Moves"),
|
||||
'move_dest_exists': fields.boolean('Chained Move Exists', readonly=True, help="Technical field used to hide 'move_dest_method' and help tooltip if not needed"),
|
||||
'move_dest_method': fields.selection([('cancel', 'Cancel'), ('create', 'Recreate'), ('nothing', 'Fix Manually')], string="Chained Picking Resolution"),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'move_dest_method': 'nothing',
|
||||
}
|
||||
}
|
||||
|
||||
def default_get(self, cr, uid, fields, context=None):
|
||||
"""
|
||||
|
@ -72,24 +70,18 @@ class stock_return_picking(osv.osv_memory):
|
|||
pick = pick_obj.browse(cr, uid, record_id, context=context)
|
||||
quant_obj = self.pool.get("stock.quant")
|
||||
move_obj = self.pool.get("stock.move")
|
||||
move_dest = False
|
||||
chained_move_exist = False
|
||||
if pick:
|
||||
if pick.state != 'done':
|
||||
raise osv.except_osv(_('Warning!'), _("You may only return pickings that are Done!"))
|
||||
|
||||
#Check if chained moves are not done already. In the mean time, sum the quants in that location
|
||||
for move in pick.move_lines:
|
||||
if move.move_dest_id:
|
||||
move_dest = True
|
||||
#Backorder moves
|
||||
moves = move_obj.search(cr, uid, [('split_from', '=', move.move_dest_id.id)], context=context)
|
||||
moves = [move.move_dest_id] + move_obj.browse(cr, uid, moves, context=context)
|
||||
if all([x.state in ['done'] for x in moves]):
|
||||
raise osv.except_osv(_('Warning!'), _('You can not reverse when the chained moves are done!'))
|
||||
#Search quants
|
||||
quant_search = quant_obj.search(cr, uid, ['&', '&', ('history_ids', 'in', move.id), ('qty', '>', 0.0),
|
||||
('location_id', 'child_of', move.location_dest_id.id)], context=context)
|
||||
chained_move_exist = True
|
||||
#Sum the quants in that location that can be returned (they must belong to the moves that were included in the returned picking)
|
||||
qty = 0
|
||||
quant_search = quant_obj.search(cr, uid, [('history_ids', 'in', move.id), ('qty', '>', 0.0),
|
||||
('location_id', 'child_of', move.location_dest_id.id)], context=context)
|
||||
for quant in quant_obj.browse(cr, uid, quant_search, context=context):
|
||||
if not quant.reservation_id or quant.reservation_id.origin_returned_move_id.id != move.id:
|
||||
qty += quant.qty
|
||||
|
@ -100,7 +92,7 @@ class stock_return_picking(osv.osv_memory):
|
|||
if 'product_return_moves' in fields:
|
||||
res.update({'product_return_moves': result1})
|
||||
if 'move_dest_exists' in fields:
|
||||
res.update({'move_dest_exists': move_dest})
|
||||
res.update({'move_dest_exists': chained_move_exist})
|
||||
return res
|
||||
|
||||
def _create_returns(self, cr, uid, ids, context=None):
|
||||
|
@ -114,15 +106,14 @@ class stock_return_picking(osv.osv_memory):
|
|||
pick = pick_obj.browse(cr, uid, record_id, context=context)
|
||||
data = self.read(cr, uid, ids[0], context=context)
|
||||
returned_lines = 0
|
||||
|
||||
# Cancel assignment of existing chained assigned moves
|
||||
moves_to_unreserve = [x.move_dest_id.id for x in pick.move_lines if x.move_dest_id and x.move_dest_id.quant_ids]
|
||||
if moves_to_unreserve:
|
||||
move_obj.do_unreserve(cr, uid, moves_to_unreserve, context=context)
|
||||
|
||||
#Create new picking for returned products
|
||||
pick_type_id = pick.picking_type_id.return_picking_type_id and pick.picking_type_id.return_picking_type_id.id or pick.picking_type_id.id
|
||||
|
||||
# Cancel assignment of existing chained assigned moves
|
||||
moves_to_unreserve = [x.move_dest_id.id for x in pick.move_lines if x.move_dest_id and x.move_dest_id.state == "assigned"]
|
||||
if moves_to_unreserve:
|
||||
move_obj.do_unreserve(cr, uid, moves_to_unreserve, context=context)
|
||||
|
||||
new_picking = pick_obj.copy(cr, uid, pick.id, {
|
||||
'move_lines': [],
|
||||
'picking_type_id': pick_type_id,
|
||||
|
@ -137,7 +128,7 @@ class stock_return_picking(osv.osv_memory):
|
|||
new_qty = data_get.quantity
|
||||
if new_qty:
|
||||
returned_lines += 1
|
||||
return_move = move_obj.copy(cr, uid, move.id, {
|
||||
move_obj.copy(cr, uid, move.id, {
|
||||
'product_id': data_get.product_id.id,
|
||||
'product_uom_qty': new_qty,
|
||||
'product_uos_qty': uom_obj._compute_qty(cr, uid, move.product_uom.id, new_qty, move.product_uos.id),
|
||||
|
|
|
@ -41,12 +41,19 @@
|
|||
<field name="model">stock.return.picking</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Return lines" version="7.0">
|
||||
<label string="Provide the quantities of the returned products."/>
|
||||
<group>
|
||||
<group string="Provide the quantities of the returned products.">
|
||||
<field name="move_dest_exists" invisible="1"/>
|
||||
<field name="move_dest_method" attrs="{'invisible': [('move_dest_exists','=',False)]}"/>
|
||||
<div colspan="4" class="oe_grey oe_inline" attrs="{'invisible': [('move_dest_exists','=',False)]}">
|
||||
<p>This picking is chained with at least another operation. Choose what you want to do with it:</p>
|
||||
<ul>
|
||||
<li>Cancel: use this option if you're not going to receive the goods you're returning. The next picking will be split and the returned part will be cancelled.</li>
|
||||
<li>Recreate: use this option if you plan to receive the returned goods later on. The next picking will be split and linked to another incoming picking for the same quantity</li>
|
||||
<li>Fix manually: use this option if none of the 2 other suits you or if you want to process the next picking in a single time.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</group>
|
||||
<group>
|
||||
<field name="move_dest_method" attrs="{'invisible': [('move_dest_exists','=',False)]}"/>
|
||||
<field name="product_return_moves"/>
|
||||
</group>
|
||||
<footer>
|
||||
|
@ -61,4 +68,3 @@
|
|||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
|
|
Loading…
Reference in New Issue