11# Copyright 2020 Payam Yasaie <https://www.tashilgostar.com>
2+ # Copyright 2020 Andrii Skrypka <andrijskrypa@ukr.net>
23# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
34from openupgradelib import openupgrade
45
78]
89
910
11+ def mapped_reservation_state (env ):
12+ openupgrade .logged_query (
13+ env .cr , """
14+ UPDATE mrp_production
15+ SET reservation_state = NULL
16+ WHERE reservation_state = 'none'
17+ """
18+ )
19+ # in v12 reservation state is not NULL when MO was done or cancel
20+ openupgrade .logged_query (
21+ env .cr , """
22+ UPDATE mrp_production
23+ SET reservation_state = NULL
24+ WHERE state in ('done', 'cancel')
25+ """
26+ )
27+
28+ # convert 'partially_available' according to
29+ # _compute_state function of mrp_production model
30+
31+ # get MO ids which need mapped value according to _get_ready_to_produce_state function
32+ openupgrade .logged_query (
33+ env .cr , """
34+ SELECT mo.id as id
35+ FROM mrp_production mo
36+ JOIN mrp_routing_workcenter operation
37+ ON mo.routing_id = operation.routing_id
38+ JOIN mrp_bom bom
39+ ON mo.bom_id = bom.id AND bom.ready_to_produce = 'asap'
40+ WHERE mo.routing_id IS NOT NULL AND mo.reservation_state = 'partially_available'
41+ GROUP BY mo.id
42+ """
43+ )
44+ mo_ids = tuple (x [0 ] for x in env .cr .fetchall ())
45+ if mo_ids :
46+ reservation_state = {}
47+ for mo in env ['mrp.production' ].browse (mo_ids ):
48+ reservation_state .setdefault (
49+ mo ._get_ready_to_produce_state (), []).append (mo .id )
50+ for value , ids in reservation_state .items ():
51+ openupgrade .logged_query (
52+ env .cr , """
53+ UPDATE mrp_production
54+ SET reservation_state = %s
55+ WHERE id in %s
56+ """ , (value , tuple (ids ))
57+ )
58+ # set 'confirm' for record which not in mo_ids
59+ openupgrade .logged_query (
60+ env .cr , """
61+ UPDATE mrp_production mo
62+ SET reservation_state = 'confirm'
63+ WHERE mo.reservation_state = 'partially_available'
64+ """
65+ )
66+ # manual update related store=True field
67+ openupgrade .logged_query (
68+ env .cr , """
69+ UPDATE mrp_workorder wo
70+ SET production_availability = mo.reservation_state
71+ FROM mrp_production mo
72+ WHERE wo.production_id = mo.id
73+ """
74+ )
75+
76+
1077def convert_many2one_field (env ):
1178 openupgrade .m2o_to_x2m (
1279 env .cr ,
@@ -15,17 +82,64 @@ def convert_many2one_field(env):
1582 )
1683
1784
18- def fill_mrp_unbuild_company_id (cr ):
85+ def fill_unbuild_company_id (cr ):
1986 openupgrade .logged_query (
2087 cr , """
2188 UPDATE mrp_unbuild mu
22- SET company_id = ru.company_id
89+ SET company_id = COALESCE(
90+ (SELECT sm.company_id FROM stock_move sm
91+ WHERE mu.id = sm.unbuild_id AND sm.company_id IS NOT NULL
92+ LIMIT 1), ru.company_id)
2393 FROM res_users ru
2494 WHERE ru.id = mu.create_uid AND mu.company_id IS NULL
2595 """
2696 )
2797
2898
99+ def fill_stock_picking_type_sequence_code (env ):
100+ openupgrade .logged_query (
101+ env .cr , """
102+ UPDATE stock_picking_type spt
103+ SET sequence_code = CASE
104+ WHEN spt.id = wh.pbm_type_id THEN 'PC'
105+ WHEN spt.id = wh.sam_type_id THEN 'SFP'
106+ WHEN spt.id = wh.manu_type_id THEN 'MO'
107+ END
108+ FROM stock_warehouse wh
109+ WHERE sequence_code = 'TO_FILL' AND spt.id in (wh.pbm_type_id, wh.sam_type_id, wh.manu_type_id)
110+ """
111+ )
112+
113+
114+ def handle_unbuild_sequence (env ):
115+ # although later the 'mrp.sequence_mrp_unbuild' sequence will be deleted,
116+ # we need to nullify its code (if having one) here
117+ # because we want a new autogenerated sequence
118+ openupgrade .logged_query (
119+ env .cr , """
120+ UPDATE ir_sequence seq
121+ SET code = NULL
122+ FROM ir_model_data imd
123+ WHERE imd.res_id = seq.id AND imd.module = 'mrp'
124+ AND imd.name = 'sequence_mrp_unbuild'"""
125+ )
126+ # force execute this function (it is noupdate=1 in xml data)
127+ env ['res.company' ].create_missing_unbuild_sequences ()
128+
129+
130+ def fill_manufacture_mto_pull (env ):
131+ warehouses = env ['stock.warehouse' ].search ([
132+ ('manufacture_to_resupply' , '=' , True ),
133+ ('manufacture_mto_pull_id' , '=' , False ),
134+ ])
135+ for wh in warehouses :
136+ rule_details = wh ._get_global_route_rules_values ()['manufacture_mto_pull_id' ]
137+ values = rule_details .get ('update_values' , {})
138+ values .update (rule_details ['create_values' ])
139+ values .update ({'warehouse_id' : wh .id })
140+ wh ['manufacture_mto_pull_id' ] = env ['stock.rule' ].create (values ).id
141+
142+
29143def fill_mrp_workorder_product_uom_id (cr ):
30144 openupgrade .logged_query (
31145 cr , """
@@ -37,10 +151,67 @@ def fill_mrp_workorder_product_uom_id(cr):
37151 )
38152
39153
154+ def update_consumption (env ):
155+ """ Create column and pre-fill 'flexible' because In Odoo 12 work like 'flexible'"""
156+ openupgrade .logged_query (
157+ env .cr , """
158+ UPDATE mrp_bom
159+ SET consumption = 'flexible'
160+ WHERE type = 'normal'
161+ """ ,
162+ )
163+ openupgrade .logged_query (
164+ env .cr , """
165+ UPDATE mrp_workorder
166+ SET consumption = 'flexible'
167+ """ ,
168+ )
169+
170+
171+ def enable_group_mrp_byproducts (env ):
172+ if env ['mrp.bom.byproduct' ].search ([], limit = 1 ):
173+ config = env ['res.config.settings' ].create ({'group_mrp_byproducts' : True })
174+ config .execute ()
175+
176+
177+ def generate_wo_line (env ):
178+ """ Convert active_move_line_ids to raw_workorder_line_ids """
179+ openupgrade .logged_query (env .cr , """
180+ SELECT id, workorder_id
181+ FROM stock_move_line
182+ WHERE workorder_id IS NOT NULL AND done_wo = False and state NOT IN ('done', 'cancel')
183+ """ )
184+ active_sml_ids = []
185+ wo_ids = set ()
186+ for sml_id , wo_id in env .cr .fetchall ():
187+ wo_ids .add (wo_id )
188+ active_sml_ids .append (sml_id )
189+ env ['mrp.workorder' ].browse (list (wo_ids ))._refresh_wo_lines ()
190+ env ['stock.move.line' ].browse (active_sml_ids ).unlink ()
191+
192+
193+ def fill_planned_datetime (env ):
194+ openupgrade .logged_query (env .cr , """
195+ UPDATE mrp_workorder wo
196+ SET date_planned_start = mo.date_planned_start, date_planned_finished = mo.date_planned_finished
197+ FROM mrp_production mo
198+ WHERE wo.state NOT IN ('done', 'cancel') AND wo.production_id = mo.id
199+ AND wo.date_planned_finished IS NULL AND wo.date_planned_start IS NULL
200+ """ )
201+
202+
40203@openupgrade .migrate ()
41204def migrate (env , version ):
205+ mapped_reservation_state (env )
42206 convert_many2one_field (env )
43- fill_mrp_unbuild_company_id (env .cr )
207+ fill_unbuild_company_id (env .cr )
208+ fill_stock_picking_type_sequence_code (env )
209+ handle_unbuild_sequence (env )
210+ fill_manufacture_mto_pull (env )
44211 fill_mrp_workorder_product_uom_id (env .cr )
212+ update_consumption (env )
45213 openupgrade .delete_records_safely_by_xml_id (env , _unlink_by_xmlid )
46214 openupgrade .load_data (env .cr , 'mrp' , 'migrations/13.0.2.0/noupdate_changes.xml' )
215+ enable_group_mrp_byproducts (env )
216+ generate_wo_line (env )
217+ fill_planned_datetime (env )
0 commit comments