Skip to content

Commit

Permalink
[OU-ADD] sale_loyalty
Browse files Browse the repository at this point in the history
TT44353
  • Loading branch information
pilarvargas-tecnativa committed Jul 10, 2024
1 parent d1054b6 commit a1ddd3f
Show file tree
Hide file tree
Showing 3 changed files with 450 additions and 0 deletions.
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 openupgrade_scripts/scripts/sale_loyalty/16.0.1.0/pre-migration.py
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)
Loading

0 comments on commit a1ddd3f

Please sign in to comment.