40 lines
1.6 KiB
SQL
40 lines
1.6 KiB
SQL
-- migrate:up
|
|
|
|
-- Nueva tabla para items de reglas de recomendación con qty/unit
|
|
create table if not exists reco_rule_items (
|
|
id bigserial primary key,
|
|
rule_id bigint not null references product_reco_rules(id) on delete cascade,
|
|
woo_product_id integer not null,
|
|
qty_per_person numeric(6,3), -- ej: 0.200 = 200g por persona
|
|
unit text, -- kg | g | unidad
|
|
reason text, -- razón opcional (ej: "base del asado")
|
|
display_order integer not null default 0,
|
|
unique (rule_id, woo_product_id)
|
|
);
|
|
|
|
create index if not exists reco_rule_items_rule_idx on reco_rule_items(rule_id);
|
|
|
|
-- Agregar tipo de regla y evento trigger a product_reco_rules
|
|
alter table product_reco_rules
|
|
add column if not exists rule_type text not null default 'crosssell',
|
|
add column if not exists trigger_event text;
|
|
|
|
-- Índice para búsqueda por tipo y evento
|
|
create index if not exists product_reco_rules_type_event_idx
|
|
on product_reco_rules(tenant_id, rule_type, trigger_event)
|
|
where active = true;
|
|
|
|
-- Migrar datos existentes: copiar recommended_product_ids a reco_rule_items
|
|
insert into reco_rule_items (rule_id, woo_product_id, display_order)
|
|
select r.id, unnest(r.recommended_product_ids), row_number() over (partition by r.id)
|
|
from product_reco_rules r
|
|
where array_length(r.recommended_product_ids, 1) > 0
|
|
on conflict (rule_id, woo_product_id) do nothing;
|
|
|
|
-- migrate:down
|
|
drop index if exists product_reco_rules_type_event_idx;
|
|
alter table product_reco_rules
|
|
drop column if exists rule_type,
|
|
drop column if exists trigger_event;
|
|
drop table if exists reco_rule_items;
|