diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index 8b5356a8573..a5d4f0870bd 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -1000,7 +1000,10 @@ class stock_move(osv.osv):
\nThe state is \'Waiting\' if the move is waiting for another one.'),
'price_unit': fields.float('Unit Price',
digits=(16, int(config['price_accuracy']))),
- 'company_id': fields.many2one('res.company', 'Company', required=True),
+ 'company_id': fields.many2one('res.company', 'Company', required=True),
+ 'purchase_id': fields.related('picking_id','purchase_id',type='many2one', relation="purchase.order", string="Purchase Orders"),
+ 'supplier_id': fields.related('picking_id','address_id','partner_id',type='many2one', relation="res.partner", string="Supplier"),
+ 'backorder_id': fields.related('picking_id','backorder_id',type='many2one', relation="stock.picking", string="Back Orders"),
}
_constraints = [
(_check_tracking,
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index d5da515f50e..a85ba9320e7 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -1138,6 +1138,83 @@
+ ====================================
+ Reception Picking (By Stock Move)
+ ====================================
+
+
+ stock.move.tree2
+ stock.move
+ tree
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.move.form2
+ stock.move
+ form
+
+
+
+
+
+
+
+ stock.move.search2
+ stock.move
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reception Picking Stock Moves
+ stock.move
+ ir.actions.act_window
+ form
+ tree,form
+
+
+
+
+
# -------------------------------------------------------------
# Stock incoterms
diff --git a/addons/stock/stock_wizard.xml b/addons/stock/stock_wizard.xml
index 319e8926bb7..2c1fc950f34 100644
--- a/addons/stock/stock_wizard.xml
+++ b/addons/stock/stock_wizard.xml
@@ -21,6 +21,13 @@
name="stock.partial_picking"
string="Partial picking"/>
+
+
).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import time
+import netsvc
+from tools.misc import UpdateableStr, UpdateableDict
+import pooler
+
+import wizard
+from osv import osv
+import tools
+from tools.translate import _
+
+_moves_arch = UpdateableStr()
+_moves_fields = UpdateableDict()
+
+_moves_arch_end = '''
+'''
+_moves_fields_end = {
+ 'back_order_notification': {'string':'Back Order' ,'type':'text', 'readonly':True}
+ }
+
+def make_default(val):
+ def fct(uid, data, state):
+ return val
+ return fct
+
+def _to_xml(s):
+ return (s or '').replace('&','&').replace('<','<').replace('>','>')
+
+def _get_moves(self, cr, uid, data, context):
+ move_obj = pooler.get_pool(cr.dbname).get('stock.move')
+ move_lines = move_obj.browse(cr, uid, [data['id']], context)
+ res = {}
+
+ _moves_fields.clear()
+ _moves_arch_lst = ['', '')
+ _moves_arch.string = '\n'.join(_moves_arch_lst)
+ return res
+
+def _do_split(self, cr, uid, data, context):
+ move_obj = pooler.get_pool(cr.dbname).get('stock.move')
+ pick_obj = pooler.get_pool(cr.dbname).get('stock.picking')
+ move_lines = move_obj.browse(cr, uid, data['id'])
+ pick = pick_obj.browse(cr, uid, [move_lines.picking_id.id])[0]
+ pool = pooler.get_pool(cr.dbname)
+ complete, too_few, too_many = False, False, False
+ states = []
+
+ if move_lines.product_qty == data['form']['move%s' % data['id']]:
+ complete = move_lines
+ elif move_lines.product_qty > data['form']['move%s' % data['id']]:
+ too_few = move_lines
+ else:
+ too_many = move_lines
+
+ # Average price computation
+ if (move_lines.picking_id.type == 'in') and (move_lines.product_id.cost_method == 'average'):
+ product_obj = pool.get('product.product')
+ currency_obj = pool.get('res.currency')
+ users_obj = pool.get('res.users')
+ uom_obj = pool.get('product.uom')
+
+ product = product_obj.browse(cr, uid, [move_lines.product_id.id])[0]
+ user = users_obj.browse(cr, uid, [uid])[0]
+
+ qty = data['form']['move%s' % move_lines.id]
+ uom = data['form']['uom%s' % move_lines.id]
+ price = data['form']['price%s' % move_lines.id]
+ currency = data['form']['currency%s' % move_lines.id]
+
+ qty = uom_obj._compute_qty(cr, uid, uom, qty, product.uom_id.id)
+
+ if (qty > 0):
+ new_price = currency_obj.compute(cr, uid, currency,
+ user.company_id.currency_id.id, price)
+ new_price = uom_obj._compute_price(cr, uid, uom, new_price,
+ product.uom_id.id)
+ if product.qty_available<=0:
+ new_std_price = new_price
+ else:
+ new_std_price = ((product.standard_price * product.qty_available)\
+ + (new_price * qty))/(product.qty_available + qty)
+
+ product_obj.write(cr, uid, [product.id],
+ {'standard_price': new_std_price})
+ move_obj.write(cr, uid, [move_lines.id], {'price_unit': new_price})
+ if complete:
+ move_obj.write(cr, uid, [complete.id],{
+ 'product_qty': data['form']['move%s' % complete.id],
+ 'product_uos_qty': data['form']['move%s' % complete.id],
+ 'state':'done' })
+ for move in pick.move_lines:
+ if move.state == 'done':
+ states.append(True)
+ else:
+ states.append(False)
+ if False not in states:
+ pick_obj.write(cr, uid, complete.picking_id.id, {
+ 'name': pool.get('ir.sequence').get(cr, uid, 'stock.picking'),
+ 'state':'done' })
+ return {'back_order':False}
+ if too_few:
+ pick_obj.write(cr, uid, too_few.picking_id.id, {
+ 'name': pool.get('ir.sequence').get(cr, uid, 'stock.picking'),
+ 'move_lines' : [],
+ 'state':'assigned' })
+ if data['form']['move%s' % too_few.id] <> 0:
+ new_obj = move_obj.copy(cr, uid, too_few.id,
+ {
+ 'product_qty' : data['form']['move%s' % too_few.id],
+ 'product_uos_qty':data['form']['move%s' % too_few.id],
+ 'picking_id' : too_few.picking_id.id,
+ 'move_dest_id': False,
+ 'price_unit': too_few.price_unit,
+ })
+ move_obj.write(cr, uid, [new_obj],{'state':'done'})
+ move_obj.write(cr, uid, [too_few.id],{
+ 'product_qty' : move_lines.product_qty - data['form']['move%s' % too_few.id],
+ 'product_uos_qty':move_lines.product_qty - data['form']['move%s' % too_few.id],
+ 'state':'assigned' })
+ if too_many:
+ move_obj.write(cr, uid, [too_many.id],{
+ 'product_qty': data['form']['move%s' % too_many.id],
+ 'product_uos_qty': data['form']['move%s' % too_many.id],
+ 'state':'assigned' })
+ return {'back_order':False}
+
+def _get_default(self, cr, uid, data, context):
+ if data['form']['back_order']:
+ data['form']['back_order_notification'] = _('Back Order %s Assigned to this Picking.') % (tools.ustr(data['form']['back_order']),)
+ return data['form']
+
+class partial_move(wizard.interface):
+
+ states = {
+ 'init': {
+ 'actions': [ _get_moves ],
+ 'result': {'type': 'form', 'arch': _moves_arch, 'fields': _moves_fields,
+ 'state' : (
+ ('end', 'Cancel'),
+ ('split', 'Partial')
+ )
+ },
+ },
+ 'split': {
+ 'actions': [ _do_split ],
+ 'result': {'type': 'state', 'state': 'end2'},
+ },
+ 'end2': {
+ 'actions': [ _get_default ],
+ 'result': {'type': 'form', 'arch': _moves_arch_end,
+ 'fields': _moves_fields_end,
+ 'state': (
+ ('end', 'Close'),
+ )
+ },
+ },
+ }
+
+partial_move('stock.partial_move')
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+