[WIP] Add routes as default data

bzr revid: jco@openerp.com-20130712165449-uwxdpiix8nfd6zn1
This commit is contained in:
Josse Colpaert 2013-07-12 18:54:49 +02:00
parent 02b078788c
commit 98b1713bfb
8 changed files with 43 additions and 119 deletions

View File

@ -880,85 +880,6 @@ class mrp_production(osv.osv):
def _get_auto_picking(self, cr, uid, production):
return True
def _make_production_line_procurement(self, cr, uid, production_line, shipment_move_id, context=None):
procurement_order = self.pool.get('procurement.order')
production = production_line.production_id
location_id = production.location_src_id.id
date_planned = production.date_planned
procurement_name = (production.origin or '').split(':')[0] + ':' + production.name
procurement_id = procurement_order.create(cr, uid, {
'name': procurement_name,
'origin': procurement_name,
'date_planned': date_planned,
'product_id': production_line.product_id.id,
'product_qty': production_line.product_qty,
'product_uom': production_line.product_uom.id,
'product_uos_qty': production_line.product_uos and production_line.product_qty or False,
'product_uos': production_line.product_uos and production_line.product_uos.id or False,
'location_id': location_id,
'move_id': shipment_move_id,
'company_id': production.company_id.id,
})
self.signal_button_confirm(cr, uid, [procurement_id])
return procurement_id
def _make_production_internal_shipment_line(self, cr, uid, production_line, group_id, parent_move_id, destination_location_id=False, context=None):
stock_move = self.pool.get('stock.move')
production = production_line.production_id
date_planned = production.date_planned
# Internal shipment is created for Stockable and Consumer Products
if production_line.product_id.type not in ('product', 'consu'):
return False
source_location_id = production.location_src_id.id
if not destination_location_id:
destination_location_id = source_location_id
return stock_move.create(cr, uid, {
'name': production.name,
'group_id': group_id,
'product_id': production_line.product_id.id,
'product_qty': production_line.product_qty,
'product_uom': production_line.product_uom.id,
'product_uom_qty': production.product_qty,
'product_uos_qty': production_line.product_uos and production_line.product_uos_qty or False,
'product_uos': production_line.product_uos and production_line.product_uos.id or False,
'date': date_planned,
'move_dest_id': parent_move_id,
'location_id': source_location_id,
'location_dest_id': destination_location_id,
'state': 'waiting',
'company_id': production.company_id.id,
})
# def _make_production_internal_shipment(self, cr, uid, production, context=None):
# ir_sequence = self.pool.get('ir.sequence')
# stock_picking = self.pool.get('stock.picking')
# routing_loc = None
# pick_type = 'internal'
# partner_id = False
#
# # Take routing address as a Shipment Address.
# # If usage of routing location is a internal, make outgoing shipment otherwise internal shipment
# if production.bom_id.routing_id and production.bom_id.routing_id.location_id:
# routing_loc = production.bom_id.routing_id.location_id
# if routing_loc.usage != 'internal':
# pick_type = 'out'
# partner_id = routing_loc.partner_id and routing_loc.partner_id.id or False
#
# # Take next Sequence number of shipment base on type
# pick_name = ir_sequence.get(cr, uid, 'stock.picking.' + pick_type)
#
# picking_id = stock_picking.create(cr, uid, {
# 'name': pick_name,
# 'origin': (production.origin or '').split(':')[0] + ':' + production.name,
# 'type': pick_type,
# 'move_type': 'one',
# 'state': 'auto',
# 'partner_id': partner_id,
# 'auto_picking': self._get_auto_picking(cr, uid, production),
# 'company_id': production.company_id.id,
# })
# production.write({'picking_id': picking_id}, context=context)
# return picking_id
def _make_production_produce_line(self, cr, uid, production, context=None):
stock_move = self.pool.get('stock.move')
@ -1006,6 +927,7 @@ class mrp_production(osv.osv):
'move_dest_id': parent_move_id,
'state': 'waiting',
'company_id': production.company_id.id,
'procure_method': 'make_to_order',
})
production.write({'move_lines': [(4, move_id)]}, context=context)
return move_id
@ -1017,22 +939,17 @@ class mrp_production(osv.osv):
uncompute_ids = filter(lambda x:x, [not x.product_lines and x.id or False for x in self.browse(cr, uid, ids, context=context)])
self.action_compute(cr, uid, uncompute_ids, context=context)
for production in self.browse(cr, uid, ids, context=context):
group_id = self.pool.get("procurement.group").create(cr, uid, {'name': production.name}, context=context)
#shipment_id = self._make_production_internal_shipment(cr, uid, production, context=context)
produce_move_id = self._make_production_produce_line(cr, uid, production, context=context)
# Take routing location as a Source Location.
source_location_id = production.location_src_id.id
if production.bom_id.routing_id and production.bom_id.routing_id.location_id:
source_location_id = production.bom_id.routing_id.location_id.id
for line in production.product_lines:
consume_move_id = self._make_production_consume_line(cr, uid, line, produce_move_id, source_location_id=source_location_id, context=context)
shipment_move_id = self._make_production_internal_shipment_line(cr, uid, line, group_id, consume_move_id,\
destination_location_id=source_location_id, context=context)
self._make_production_line_procurement(cr, uid, line, shipment_move_id, context=context)
self._make_production_consume_line(cr, uid, line, produce_move_id, source_location_id=source_location_id, context=context)
production.write({'state':'confirmed'}, context=context)
return group_id
return 0
def force_production(self, cr, uid, ids, *args):
""" Assigns products.

View File

@ -66,5 +66,14 @@
<field name="res_model">purchase.order</field>
</record>
<!--Purchase related rules in routes -->
<record id="procurement_rule_customer1_xdock" model="procurement.rule">
<field name="name">Supplier > Output</field>
<field name="action">buy</field>
<field name="location_id" ref="stock.stock_location_suppliers"/>
<field name="location_src_id" ref="stock.stock_location_stock"/>
<field name="procure_method">make_to_order</field>
<field name="route_id" ref="stock.route_warehouse0_crossdock"/>
</record>
</data>
</openerp>

View File

@ -81,6 +81,7 @@ class procurement_order(osv.osv):
'move_dest_id': procurement.move_dest_id and procurement.move_dest_id.id or False,
#'cancel_cascade': procurement.rule_id and procurement.rule_id.cancel_cascade or False,
'group_id': procurement.group_id and procurement.group_id.id or False,
'picking_type': self.pool.get('stock.move').get_type_from_usage(cr, uid, procurement.rule_id.location_src_id, procurement.rule_id.location_id, context=context)
}
def _run(self, cr, uid, procurement, context=None):

View File

@ -1949,6 +1949,17 @@ class stock_move(osv.osv):
return [move.id for move in complete]
def get_type_from_usage(self, cr, uid, location, location_dest, context=None):
'''
Returns the type to be chosen based on the usages of the locations
'''
if location.usage == 'internal' and location_dest.usage in ['supplier', 'customer']:
return 'out'
if location.usage in ['supplier', 'customer'] and location_dest.usage == 'internal' :
return 'in'
return 'internal'
class stock_inventory(osv.osv):
_name = "stock.inventory"
_description = "Inventory"

View File

@ -1569,7 +1569,7 @@
<record model="ir.ui.view" id="product_template_form_view_procurement">
<field name="name">product.template.procurement</field>
<field name="model">product.template</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_template_form_view"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='type']" position="after">

View File

@ -96,7 +96,10 @@ You can use the demo data as follow:
'author': 'OpenERP SA',
'images': ['images/pulled_flow.jpeg','images/pushed_flow.jpeg'],
'depends': ['procurement','stock'],
'data': ['stock_location_view.xml', 'security/stock_location_security.xml', 'security/ir.model.access.csv'],
'data': ['stock_location_view.xml',
'stock_location_data.xml',
'security/stock_location_security.xml',
'security/ir.model.access.csv'],
'demo': [
'stock_location_demo_cpu1.xml',
'stock_location_demo_cpu3.yml',

View File

@ -72,12 +72,13 @@ class stock_location_path(osv.osv):
'delay': 1,
'invoice_state': 'none',
'picking_type': 'internal',
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'procurement.order', context=c)
}
def _apply(self, cr, uid, rule, move, context=None):
move_obj = self.pool.get('stock.move')
newdate = (datetime.strptime(move.date, '%Y-%m-%d %H:%M:%S') + relativedelta(days=rule.delay or 0)).strftime('%Y-%m-%d')
if rule.auto=='transparent':
self.write(cr, uid, [move.id], {
move_obj.write(cr, uid, [move.id], {
'date': newdate,
'location_dest_id': rule.location_dest_id.id
})
@ -93,14 +94,16 @@ class stock_location_path(osv.osv):
move_id = move_obj.copy(cr, uid, move.id, {
'location_id': move.location_dest_id.id,
'location_dest_id': rule.location_dest_id.id,
'date': time.strftime('%Y-%m-%d'),
'company_id': rule.company_id.id,
'date': datetime.now().strftime('%Y-%m-%d'),
'company_id': rule.company_id and rule.company_id.id or False,
'date_expected': newdate,
'picking_id': False,
'picking_type': move_obj.get_type_from_usage(cr, uid, move.location_id, move.location_dest_id, context=context)
})
move_obj.write(cr, uid, [move.id], {
'move_dest_id': move_id,
})
move_obj.action_confirm(self, cr, uid, [move_id], context=None)
move_obj.action_confirm(cr, uid, [move_id], context=None)
return move_id
@ -206,25 +209,6 @@ class stock_move(osv.osv):
'cancel_cascade': fields.boolean('Cancel Cascade', help='If checked, when this move is cancelled, cancel the linked move too'),
'putaway_ids': fields.one2many('stock.move.putaway', 'move_id', 'Put Away Suggestions'),
}
# TODO: reimplement this
# def _pull_apply(self, cr, uid, moves, context):
# # Create a procurement is MTO on stock.move
# # Call _assign on procurement
# for move in moves:
# #If move is MTO, then you should create a procurement
# #Search for original rule
# #Then change procurement to stock
# for route in move.product_id.route_ids:
# found = False
# for rule in route.pull_ids:
# if rule.location_id.id == move.location_dest_id.id and move.procure_method == "make_to_order":
# self._create_procurement(cr, uid, rule, move, context=context)
# found = True
# break
# if found: break
# return True
def _push_apply(self, cr, uid, moves, context):
for move in moves:
@ -241,10 +225,9 @@ class stock_move(osv.osv):
# Create the stock.move.putaway records
def _putaway_apply(self,cr, uid, ids, context=None):
for move in self.browse(cr, uid, ids, context=context):
res = self.pool.get('stock.location').get_putaway_strategy(cr, uid, move.location_dest_id.id, move.product_id.id, context=context)
res = self.pool.get('stock.location').get_putaway_strategy(cr, uid, move.location_dest_id, move.product_id, context=context)
if res:
raise 'put away strategies not implemented yet!'
return True
def action_assign(self, cr, uid, ids, context=None):
@ -266,7 +249,7 @@ class stock_location(osv.osv):
}
def get_putaway_strategy(self, cr, uid, id, location, product, context=None):
def get_putaway_strategy(self, cr, uid, location, product, context=None):
pa = self.pool.get('product.putaway')
categ = product.categ_id
categs = [categ.id, False]
@ -280,7 +263,7 @@ class stock_location(osv.osv):
], context=context)
if result:
return pa.browse(cr, uid, result[0], context=context)
return super(stock_location, self).get_putaway_strategy(cr, uid, location, product, context=context)
#return super(stock_location, self).get_putaway_strategy(cr, uid, location, product, context=context)
def get_removal_strategy(self, cr, uid, location, product, context=None):
pr = self.pool.get('product.removal')

View File

@ -66,8 +66,8 @@
<field name="model">stock.location.route</field>
<field name="arch" type="xml">
<tree string="Routes">
<field name="name" />
<field name="sequence" />
<field name="sequence" widget="handle" />
<field name="name"/>
</tree>
</field>
</record>
@ -79,7 +79,7 @@
<field name="arch" type="xml">
<form string="Route">
<field name="name" />
<field name="sequence" />
<field name="sequence" groups="base.group_no_one"/>
<group string="Push Rules" colspan="4" >
<field name="push_ids" colspan="4" nolabel="1"/>
</group>