Skip to content

Commit ad77122

Browse files
committed
[IMP] mrp migration
1 parent 72d7354 commit ad77122

File tree

3 files changed

+245
-17
lines changed

3 files changed

+245
-17
lines changed

addons/mrp/migrations/13.0.2.0/openupgrade_analysis_work.txt

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ new model mrp.workorder.line
99
# NOTHING TO DO: new models
1010

1111
---Fields in module 'mrp'---
12-
mrp / mrp.bom / byproduct_ids (one2many) : NEW relation: mrp.bom.byproduct
1312
mrp / mrp.bom / consumption (selection) : NEW selection_keys: ['flexible', 'strict'], hasdefault
14-
# NOTHING TO DO: has default value
13+
mrp / mrp.workorder / consumption (selection) : NEW required, selection_keys: ['flexible', 'strict']
14+
# DONE: pre-migration: set 'flexible' for normal bom and workorder
1515

1616
mrp / mrp.bom.byproduct / company_id (many2one) : NEW relation: res.company, isrelated: related, stored
1717
mrp / mrp.bom.byproduct / routing_id (many2one) : NEW relation: mrp.routing, isrelated: related, stored
@@ -20,7 +20,7 @@ mrp / mrp.bom.line / company_id (many2one) : NEW re
2020

2121
mrp / mrp.bom.line / attribute_value_ids (many2many): DEL relation: product.attribute.value
2222
mrp / mrp.bom.line / bom_product_template_attribute_value_ids (many2many): NEW relation: product.template.attribute.value
23-
# DONE: pre-migration: field and relation table renamed
23+
# DONE: pre-migration: relation table renamed and mapped value
2424

2525
mrp / mrp.document / key (char) : module is now 'website' ('mrp')
2626
mrp / mrp.document / res_id (integer) : relation is now 'res_model' ('False') [nothing to do]
@@ -31,6 +31,10 @@ mrp / mrp.document / website_url (char) : module
3131

3232
mrp / mrp.production / availability (selection) : DEL selection_keys: ['assigned', 'none', 'partially_available', 'waiting']
3333
mrp / mrp.production / reservation_state (selection) : NEW selection_keys: ['assigned', 'confirmed', 'waiting'], isfunction: function, stored
34+
# DONE: pre-migration: copy `availability`
35+
# post-migration: set NULL IF availability == 'none' OR state in ('done', 'cancel')
36+
# set 'assign' or 'confirm' according to _compute_state function
37+
3438
mrp / mrp.production / propagate (boolean) : DEL
3539
mrp / mrp.production / propagate_cancel (boolean) : NEW
3640
# DONE: pre-migration (renamed)
@@ -58,16 +62,19 @@ mrp / mrp.workorder / final_lot_id (many2one) : DEL re
5862
mrp / mrp.workorder / finished_lot_id (many2one) : NEW relation: stock.production.lot
5963
# DONE: pre-migration (renamed)
6064

61-
mrp / mrp.workorder / consumption (selection) : NEW required, selection_keys: ['flexible', 'strict']
6265
mrp / mrp.workorder / active_move_line_ids (one2many): DEL relation: stock.move.line
6366
mrp / mrp.workorder / activity_ids (one2many) : NEW relation: mail.activity
67+
mrp / mrp.workorder / leave_id (many2one) : NEW relation: resource.calendar.leaves
68+
mrp / mrp.workorder / move_finished_ids (one2many) : NEW relation: stock.move
69+
# NOTHING TO DO: new features
70+
6471
mrp / mrp.workorder / date_planned_finished (datetime): now a function
6572
mrp / mrp.workorder / date_planned_start (datetime) : now a function
73+
# DONE: post-migration: set where empty
74+
6675
mrp / mrp.workorder / finished_workorder_line_ids (one2many): NEW relation: mrp.workorder.line
67-
mrp / mrp.workorder / leave_id (many2one) : NEW relation: resource.calendar.leaves
68-
mrp / mrp.workorder / move_finished_ids (one2many) : NEW relation: stock.move
6976
mrp / mrp.workorder / raw_workorder_line_ids (one2many): NEW relation: mrp.workorder.line
70-
# NOTHING TO DO: new features
77+
# DONE: post-migration: generate new records where need
7178

7279
mrp / mrp.workorder / product_uom_id (many2one) : is now stored
7380
mrp / mrp.workorder / product_uom_id (many2one) : not related anymore
@@ -86,22 +93,25 @@ mrp / mrp.workorder.line / raw_workorder_id (many2one) : NEW re
8693
# NOTHING TO DO: new model
8794

8895
mrp / stock.move / active_move_line_ids (one2many): DEL relation: stock.move.line
89-
mrp / stock.move / byproduct_id (many2one) : NEW relation: mrp.bom.byproduct
9096
mrp / stock.move.line / done_wo (boolean) : DEL
91-
# NOTHING TO DO: new feature
97+
# NOTHING TO DO
9298

9399
mrp / stock.move.line / lot_produced_id (many2one) : DEL relation: stock.production.lot
94100
mrp / stock.move.line / lot_produced_ids (many2many) : NEW relation: stock.production.lot
95101
# DONE: post-migration: transformed the many2one to many2many
96102

97103
mrp / stock.picking.type / use_create_components_lots (boolean): NEW hasdefault
98104
mrp / stock.production.lot / use_next_on_work_order_id (many2one): DEL relation: mrp.workorder
99-
mrp / stock.warehouse / manufacture_mto_pull_id (many2one): NEW relation: stock.rule
100105
# NOTHING TO DO: new feature
101106

107+
mrp / stock.warehouse / manufacture_mto_pull_id (many2one): NEW relation: stock.rule
108+
# Done: post-migration: generate for warehouses where manufacture_to_resupply is set True
109+
110+
mrp / mrp.bom / byproduct_ids (one2many) : NEW relation: mrp.bom.byproduct
111+
mrp / stock.move / byproduct_id (many2one) : NEW relation: mrp.bom.byproduct
102112
mrp_byproduct / mrp.bom / sub_products (one2many) : DEL relation: mrp.subproduct
103113
mrp_byproduct / stock.move / subproduct_id (many2one) : DEL relation: mrp.subproduct
104-
# NOTHING TO DO
114+
# DONE: pre-migration: field renamed
105115

106116
---XML records in module 'mrp'---
107117
NEW ir.actions.report: mrp.label_manufacture_template

addons/mrp/migrations/13.0.2.0/post-migration.py

Lines changed: 174 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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).
34
from openupgradelib import openupgrade
45

@@ -7,6 +8,72 @@
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+
1077
def 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+
29143
def 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()
41204
def 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)

addons/mrp/migrations/13.0.2.0/pre-migration.py

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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).
34
from openupgradelib import openupgrade
45

@@ -7,23 +8,33 @@
78
]
89

910
_table_renames = [
10-
('mrp_subproduct', 'mrp_bom_byproduct'),
1111
('mrp_bom_line_product_attribute_value_rel', 'mrp_bom_line_product_template_attribute_value_rel'),
1212
]
1313

14+
_mrp_subproduct_table_renames = [
15+
('mrp_subproduct', 'mrp_bom_byproduct'),
16+
]
17+
1418
_field_renames = [
1519
('mrp.workorder', 'mrp_workorder', 'final_lot_id', 'finished_lot_id'),
20+
('mrp.bom', 'mrp_bom', 'sub_products', 'byproduct_ids'),
1621
('mrp.bom.line', 'mrp_bom_line', 'attribute_value_ids', 'bom_product_template_attribute_value_ids'),
17-
('mrp.production', 'mrp_production', 'availability', 'reservation_state'),
1822
('mrp.production', 'mrp_production', 'propagate', 'propagate_cancel'),
23+
('stock.move', 'stock_move', 'subproduct_id', 'byproduct_id'),
1924
]
2025

2126
_column_renames = {
2227
'stock_move_line': [
2328
('lot_produced_id', None),
2429
],
30+
}
31+
32+
_column_copies = {
33+
'mrp_production': [
34+
('availability', 'reservation_state', None),
35+
],
2536
'mrp_bom_line_product_template_attribute_value_rel': [
26-
('product_attribute_value_id', 'product_template_attribute_value_id'),
37+
('product_attribute_value_id', 'product_template_attribute_value_id', None),
2738
],
2839
}
2940

@@ -34,10 +45,46 @@
3445
]
3546

3647

48+
def fill_bom_product_template_attribute_value(env):
49+
""" Convert product.attribute.value ids to product.template.attribute.value ids"""
50+
openupgrade.logged_query(env.cr, """
51+
UPDATE mrp_bom_line_product_template_attribute_value_rel mbl_ptav_rel
52+
SET product_template_attribute_value_id = (
53+
SELECT id
54+
FROM product_template_attribute_value ptav
55+
WHERE mb.product_tmpl_id = ptav.product_tmpl_id
56+
AND mbl_ptav_rel.product_attribute_value_id = ptav.product_attribute_value_id
57+
LIMIT 1
58+
)
59+
FROM mrp_bom_line mbl
60+
JOIN mrp_bom mb ON mbl.bom_id = mb.id
61+
WHERE mbl.id = mbl_ptav_rel.mrp_bom_line_id
62+
""")
63+
64+
65+
def mapped_reservation_state(env):
66+
openupgrade.logged_query(
67+
env.cr, """
68+
UPDATE mrp_production
69+
SET reservation_state = CASE
70+
WHEN reservation_state = 'partially_available' THEN 'assigned'
71+
WHEN reservation_state = 'none' THEN NULL
72+
END
73+
WHERE reservation_state in ('partially_available', 'none')
74+
"""
75+
)
76+
77+
3778
@openupgrade.migrate()
3879
def migrate(env, version):
80+
openupgrade.remove_tables_fks(env.cr, 'mrp_bom_line_product_attribute_value_rel')
3981
openupgrade.rename_models(env.cr, _model_renames)
4082
openupgrade.rename_tables(env.cr, _table_renames)
83+
if openupgrade.table_exists(env.cr, 'mrp_subproduct'):
84+
openupgrade.rename_tables(env.cr, _mrp_subproduct_table_renames)
4185
openupgrade.rename_fields(env, _field_renames)
86+
openupgrade.copy_columns(env.cr, _column_copies)
4287
openupgrade.rename_columns(env.cr, _column_renames)
4388
openupgrade.rename_xmlids(env.cr, _xmlid_renames)
89+
fill_bom_product_template_attribute_value(env)
90+
mapped_reservation_state(env)

0 commit comments

Comments
 (0)