-
-
Notifications
You must be signed in to change notification settings - Fork 716
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
3 changed files
with
450 additions
and
0 deletions.
There are no files selected for viewing
15 changes: 15 additions & 0 deletions
15
openupgrade_scripts/scripts/sale_loyalty/16.0.1.0/post-migration.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
# Copyright 2023 Tecnativa - Pilar Vargas | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). | ||
from openupgradelib import openupgrade | ||
|
||
_deleted_xml_records = [ | ||
"sale_loyalty.sale_coupon_apply_code_rule", | ||
] | ||
|
||
|
||
@openupgrade.migrate() | ||
def migrate(env, version): | ||
openupgrade.delete_records_safely_by_xml_id( | ||
env, | ||
_deleted_xml_records, | ||
) |
299 changes: 299 additions & 0 deletions
299
openupgrade_scripts/scripts/sale_loyalty/16.0.1.0/pre-migration.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,299 @@ | ||
# Copyright 2023 Tecnativa - Pilar Vargas | ||
|
||
import random | ||
|
||
from openupgradelib import openupgrade | ||
|
||
_xmlids_renames = [ | ||
( | ||
"sale_loyalty.sale_coupon_apply_code_action", | ||
"sale_loyalty.sale_loyalty_coupon_wizard_action", | ||
), | ||
( | ||
"sale_loyalty.menu_coupon_type_config", | ||
"sale_loyalty.menu_discount_loyalty_type_config", | ||
), | ||
( | ||
"sale_loyalty.menu_promotion_type_config", | ||
"sale_loyalty.menu_gift_ewallet_type_config", | ||
), | ||
( | ||
"sale_loyalty.sale_coupon_view_form", | ||
"sale_loyalty.loyalty_card_view_form_inherit_sale_loyalty", | ||
), | ||
( | ||
"sale_loyalty.sale_coupon_apply_code_view_form", | ||
"sale_loyalty.sale_loyalty_coupon_wizard_view_form", | ||
), | ||
( | ||
"sale_loyalty.sale_order_view_form", | ||
"sale_loyalty.sale_order_view_form_inherit_sale_loyalty", | ||
), | ||
] | ||
|
||
|
||
def _generate_random_reward_code(): | ||
"""This function, _generate_random_reward_code, provides a random reward code. It is | ||
used to create unique codes that identify rewards within the sale_loyalty module.""" | ||
return str(random.getrandbits(32)) | ||
|
||
|
||
def convert_applied_coupons_from_sale_order_to_many2many(env): | ||
"""This conversion from One-to-Many (o2m) to Many-to-Many (m2m) involves the | ||
creation of a relationship table between sale_order and loyalty_card, allowing | ||
multiple sale_order records to be associated with multiple loyalty_card records. | ||
This is done by inserting the ids corresponding to sale_order and loyalty_card | ||
into the loyalty_card_sale_order_rel table.""" | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
CREATE TABLE IF NOT EXISTS loyalty_card_sale_order_rel ( | ||
sale_order_id INT, | ||
loyalty_card_id INT | ||
) | ||
""", | ||
) | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
INSERT INTO loyalty_card_sale_order_rel (sale_order_id, loyalty_card_id) | ||
SELECT sales_order_id, id | ||
FROM loyalty_card | ||
""", | ||
) | ||
|
||
|
||
def fill_code_enabled_rule_ids_from_sale_order(env): | ||
"""This is an m2m field, the relationship table is created in case it does not | ||
exist and filled with the data. This field relates the id of a rule to the id of | ||
a sales order to which it has been applied, provided that the rule belongs to an | ||
applicable promotion with code.""" | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
CREATE TABLE IF NOT EXISTS loyalty_rule_sale_order_rel ( | ||
sale_order_id INT, | ||
loyalty_rule_id INT | ||
) | ||
""", | ||
) | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
INSERT INTO loyalty_rule_sale_order_rel (sale_order_id, loyalty_rule_id) | ||
SELECT lc.order_id, lr.id | ||
FROM loyalty_card lc | ||
JOIN loyalty_rule lr ON lc.program_id = lr.program_id | ||
JOIN loyalty_program lp ON lr.program_id = lp.id | ||
WHERE (lr.mode = 'with_code' OR lp.program_type = 'gift_card') | ||
""", | ||
) | ||
|
||
|
||
def generate_sale_order_coupon_points(env): | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
CREATE TABLE IF NOT EXISTS sale_order_coupon_points ( | ||
coupon_id INT, | ||
order_id INT, | ||
points FLOAT, | ||
create_uid INT, | ||
write_uid INT, | ||
create_date DATE, | ||
write_date DATE | ||
) | ||
""", | ||
) | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
INSERT INTO sale_order_coupon_points ( | ||
coupon_id, order_id, points, create_uid, write_uid, create_date, write_date | ||
) | ||
SELECT | ||
id AS coupon_id, | ||
order_id, | ||
1 AS points, | ||
create_uid, | ||
write_uid, | ||
create_date, | ||
write_date | ||
FROM loyalty_card; | ||
""", | ||
) | ||
|
||
|
||
def update_loyalty_program_data(env): | ||
# Set sale_ok default values | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
ALTER TABLE loyalty_program | ||
ADD COLUMN IF NOT EXISTS sale_ok BOOLEAN | ||
""", | ||
) | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
UPDATE loyalty_program | ||
SET sale_ok = true | ||
""", | ||
) | ||
|
||
|
||
def update_sale_order_line_data(env): | ||
# Fill reward_id field | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
ALTER TABLE sale_order_line | ||
ADD COLUMN IF NOT EXISTS reward_id INT | ||
""", | ||
) | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
UPDATE sale_order_line sol | ||
SET reward_id = lr.id | ||
FROM loyalty_reward lr | ||
WHERE sol.product_id = lr.discount_line_product_id | ||
""", | ||
) | ||
# Fill coupon_id field(env): | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
ALTER TABLE sale_order_line | ||
ADD COLUMN IF NOT EXISTS coupon_id INT | ||
""", | ||
) | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
UPDATE sale_order_line | ||
SET coupon_id = loyalty_card.id | ||
FROM loyalty_card | ||
WHERE sale_order_line.order_id = loyalty_card.sales_order_id | ||
""", | ||
) | ||
# Fill reward_identifier_code | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
ALTER TABLE sale_order_line | ||
ADD COLUMN IF NOT EXISTS reward_identifier_code VARCHAR | ||
""", | ||
) | ||
reward_code = _generate_random_reward_code() | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
UPDATE sale_order_line | ||
SET reward_identifier_code = %s | ||
WHERE reward_id IS NOT NULL | ||
""", | ||
(reward_code,), | ||
) | ||
# Fill points_cost field | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
ALTER TABLE sale_order_line | ||
ADD COLUMN IF NOT EXISTS points_cost FLOAT | ||
""", | ||
) | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
UPDATE sale_order_line | ||
SET points_cost = ABS(untaxed_amount_to_invoice) | ||
WHERE reward_id IS NOT NULL | ||
AND untaxed_amount_to_invoice < 0 | ||
""", | ||
) | ||
|
||
|
||
def delete_sql_constraints(env): | ||
# Delete constraints to recreate it | ||
openupgrade.delete_sql_constraint_safely( | ||
env, "sale_loyalty", "sale_order_coupon_points", "order_coupon_unique" | ||
) | ||
|
||
|
||
def update_template_keys(env): | ||
"""Update template keys of the merged sale_gift_card module in loyalty_sale""" | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
UPDATE ir_ui_view | ||
SET key = 'sale_loyalty.used_gift_card' | ||
WHERE key = 'sale_gif_card.used_gift_card' | ||
""", | ||
) | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
UPDATE ir_ui_view | ||
SET key = 'sale_loyalty.sale_purchased_gift_card' | ||
WHERE key = 'sale_gif_card.sale_purchased_gift_card' | ||
""", | ||
) | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
UPDATE ir_ui_view | ||
SET key = 'sale_loyalty.sale_orde_portal_content_inherit' | ||
WHERE key = 'sale_gif_card.sale_orde_portal_content_inherit' | ||
""", | ||
) | ||
|
||
|
||
def merge_sale_gift_card_to_sale_loyalty_card(env): | ||
# Update the coupon_id column in the sale_order_line table with the ID of the | ||
# loyalty_card table based on certain criteria and relationships established between | ||
# the loyalty_card, loyalty_reward and gift_card tables | ||
# program_id is added to the gift_card table in the loyalty migration script. | ||
table = openupgrade.get_model2table("gift.card") | ||
if not openupgrade.table_exists(env.cr, table): | ||
return | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
UPDATE sale_order_line AS sol | ||
SET coupon_id = lc.id | ||
FROM loyalty_card AS lc | ||
JOIN loyalty_reward AS lr ON lc.program_id = lr.program_id | ||
JOIN gift_card AS gc ON lc.program_id = gc.program_id | ||
WHERE sol.reward_id = lr.id | ||
AND lr.program_id = lc.program_id | ||
AND lc.program_id = gc.program_id | ||
AND sol.gift_card_id = gc.id | ||
AND sol.reward_id IS NOT NULL | ||
""", | ||
) | ||
# Values corresponding to the order_id and coupon_id columns of the sale_order_line | ||
# table where reward_id is not null and gift_card_id is not null | ||
openupgrade.logged_query( | ||
env.cr, | ||
""" | ||
INSERT INTO loyalty_card_sale_order_rel (sale_order_id, loyalty_card_id) | ||
SELECT sol.order_id, sol.coupon_id | ||
FROM sale_order_line AS sol | ||
WHERE sol.reward_id IS NOT NULL | ||
AND sol.gift_card_id IS NOT NULL | ||
""", | ||
) | ||
|
||
|
||
@openupgrade.migrate() | ||
def migrate(env, version): | ||
openupgrade.rename_xmlids(env.cr, _xmlids_renames) | ||
convert_applied_coupons_from_sale_order_to_many2many(env) | ||
fill_code_enabled_rule_ids_from_sale_order(env) | ||
generate_sale_order_coupon_points(env) | ||
update_loyalty_program_data(env) | ||
update_sale_order_line_data(env) | ||
delete_sql_constraints(env) | ||
update_template_keys(env) | ||
merge_sale_gift_card_to_sale_loyalty_card(env) |
Oops, something went wrong.