New pricing system (#306)
This commit is contained in:
@@ -0,0 +1,211 @@
|
||||
-- New pricing system
|
||||
|
||||
drop table if exists price_segments cascade;
|
||||
create table price_segments (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name TEXT NOT NULL UNIQUE
|
||||
);
|
||||
INSERT INTO price_segments (name) VALUES ('BASE'), ('A'), ('B'), ('C'), ('OWN-IMAGE');
|
||||
INSERT INTO price_segments (name) VALUES ('custom1'), ('designer-b');
|
||||
|
||||
drop table if exists prices_wallpaper_m2 cascade;
|
||||
CREATE TABLE prices_wallpaper_m2 (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INT REFERENCES "product-materials" (materialid) NOT NULL,
|
||||
segment_id INT REFERENCES price_segments (id) NOT NULL,
|
||||
market_id INT REFERENCES markets (id) NOT NULL,
|
||||
price NUMERIC NOT NULL CHECK (price > 0),
|
||||
UNIQUE (material_id, segment_id, market_id)
|
||||
);
|
||||
|
||||
drop table if exists prices_external_products cascade;
|
||||
CREATE TABLE prices_external_products (
|
||||
id SERIAL PRIMARY KEY,
|
||||
external_product_id TEXT REFERENCES external_print_products (external_product_id) NOT NULL,
|
||||
segment_id INT REFERENCES price_segments (id) NOT NULL,
|
||||
market_id INT REFERENCES markets (id) NOT NULL,
|
||||
price NUMERIC NOT NULL CHECK (price > 0),
|
||||
UNIQUE (external_product_id, segment_id, market_id)
|
||||
);
|
||||
|
||||
drop table if exists price_segmentations cascade;
|
||||
CREATE TABLE price_segmentations (
|
||||
product_id INT REFERENCES "product-products" (productid),
|
||||
designer_id INT REFERENCES designers (designerid),
|
||||
custom BOOLEAN DEFAULT false,
|
||||
segment_id INT REFERENCES price_segments (id) NOT NULL,
|
||||
CONSTRAINT either_product_or_designer CHECK ( (product_id IS NULL AND designer_id IS NOT NULL) OR (product_id IS NOT NULL AND designer_id IS NULL) ),
|
||||
UNIQUE (product_id, custom),
|
||||
UNIQUE (designer_id, custom)
|
||||
);
|
||||
-- Todo: will add constraint that segment_id cannot be 'OWN-IMAGE'
|
||||
|
||||
drop view if exists v_price_product_segments cascade;
|
||||
create view v_price_product_segments as
|
||||
with duplicates as (
|
||||
-- First read all actual segment assignments from table
|
||||
select
|
||||
products.productid,
|
||||
segment_id,
|
||||
(case when custom and product_id is not null then 5 when custom and designer_id is not null then 4 when not custom and product_id is not null then 3 else 2 end) as priority
|
||||
from
|
||||
"product-products" products join price_segmentations on productid = product_id or designerid = designer_id
|
||||
UNION
|
||||
-- Then add the fallback assignment to BASE segment, with lowest priority
|
||||
select products.productid, 1 as segment_id, 1 as priority from "product-products" products
|
||||
) select
|
||||
-- Remove duplicate segment assignments
|
||||
productid, segment_id, max(priority) as priority from duplicates group by productid, segment_id;
|
||||
|
||||
|
||||
drop view if exists v_listprices_new;
|
||||
create view v_listprices_new as
|
||||
select
|
||||
printid printproduct_id,
|
||||
markets.id market_id,
|
||||
CASE
|
||||
WHEN groupid in (1,3) THEN (
|
||||
select price
|
||||
from v_price_product_segments v
|
||||
join prices_wallpaper_m2 p on v.segment_id = p.segment_id and material_id = 1
|
||||
where v.productid = prints.productid and market_id = markets.id
|
||||
order by priority desc
|
||||
limit 1
|
||||
)
|
||||
WHEN groupid = 2 THEN (
|
||||
select price
|
||||
from v_price_product_segments v
|
||||
join prices_external_products p on v.segment_id = p.segment_id
|
||||
and external_product_id = 'canvas_200x300-mm-8x12-inch_canvas_wood-fsc-slim_4-0_ver'
|
||||
where v.productid = prints.productid and market_id = markets.id
|
||||
order by priority desc
|
||||
limit 1
|
||||
)
|
||||
WHEN groupid in (7,8) THEN (
|
||||
select price
|
||||
from v_price_product_segments v
|
||||
join prices_external_products p on v.segment_id = p.segment_id
|
||||
and external_product_id = 'flat_250x250-mm-10x10-inch_200-gsm-80lb-uncoated_4-0_ver'
|
||||
where v.productid = prints.productid and market_id = markets.id
|
||||
order by priority desc
|
||||
limit 1
|
||||
)
|
||||
END as listprice
|
||||
from
|
||||
"product-printproducts" prints,
|
||||
markets
|
||||
;
|
||||
|
||||
|
||||
--------------------------------------
|
||||
-- Fake price data for development
|
||||
-- segment 1 (BASE), standard material. copy listprice from a non-designer wallpaper
|
||||
INSERT INTO prices_wallpaper_m2 (material_id, segment_id, market_id, price)
|
||||
select 1, 1, market_id, round(listprice)
|
||||
from v_listprices where printproduct_id = (
|
||||
select printid from "product-products" join "product-printproducts" using (productid)
|
||||
where designerid is null and browsable = 1 and groupid = 1 limit 1
|
||||
) order by market_id;
|
||||
-- premium, product, segment 1 (1.09 * standard listprice)
|
||||
INSERT INTO prices_wallpaper_m2 (material_id, segment_id, market_id, price)
|
||||
SELECT 4, 1, market_id, round(price * 1.09) FROM prices_wallpaper_m2 WHERE segment_id = 1 and material_id = 1;
|
||||
-- standard, product, segment 2 (2 * standard listprice)
|
||||
INSERT INTO prices_wallpaper_m2 (material_id, segment_id, market_id, price)
|
||||
SELECT 1, 2, market_id, round(price * 2) FROM prices_wallpaper_m2 WHERE segment_id = 1 and material_id = 1;
|
||||
-- premium, product, segment 2 (2.29 * standard listprice)
|
||||
INSERT INTO prices_wallpaper_m2 (material_id, segment_id, market_id, price)
|
||||
SELECT 4, 2, market_id, round(price * 2.29) FROM prices_wallpaper_m2 WHERE segment_id = 1 and material_id = 1;
|
||||
-- standard, product, segment 3 (1.15 * standard listprice)
|
||||
INSERT INTO prices_wallpaper_m2 (material_id, segment_id, market_id, price)
|
||||
SELECT 1, 3, market_id, round(price * 1.15) FROM prices_wallpaper_m2 WHERE segment_id = 1 and material_id = 1;
|
||||
-- premium, product, segment 3 (1.19 * standard listprice)
|
||||
INSERT INTO prices_wallpaper_m2 (material_id, segment_id, market_id, price)
|
||||
SELECT 4, 3, market_id, round(price * 1.19) FROM prices_wallpaper_m2 WHERE segment_id = 1 and material_id = 1;
|
||||
-- standard, product, segment 4 (0.9 * standard listprice)
|
||||
INSERT INTO prices_wallpaper_m2 (material_id, segment_id, market_id, price)
|
||||
SELECT 1, 4, market_id, round(price * 0.9) FROM prices_wallpaper_m2 WHERE segment_id = 1 and material_id = 1;
|
||||
-- premium, product, segment 4 (0.92 * standard listprice)
|
||||
INSERT INTO prices_wallpaper_m2 (material_id, segment_id, market_id, price)
|
||||
SELECT 4, 4, market_id, round(price * 0.92) FROM prices_wallpaper_m2 WHERE segment_id = 1 and material_id = 1;
|
||||
-- External products
|
||||
-- segment 1 (base), normal products
|
||||
insert into prices_external_products (external_product_id, segment_id, market_id, price)
|
||||
select external_product_id, 1, markets.id, round(price_sek * price_adjustment * vat * exchange_rate)
|
||||
from external_print_products, markets join "product-currencies" on currency = iso3char
|
||||
order by markets.id, external_product_id;
|
||||
-- segment 2-4 (A,B,C)
|
||||
insert into prices_external_products (external_product_id, segment_id, market_id, price)
|
||||
select external_product_id, 2, market_id, round(price * 2) from prices_external_products where segment_id = 1;
|
||||
insert into prices_external_products (external_product_id, segment_id, market_id, price)
|
||||
select external_product_id, 3, market_id, round(price * 1.2) from prices_external_products where segment_id = 1;
|
||||
insert into prices_external_products (external_product_id, segment_id, market_id, price)
|
||||
select external_product_id, 4, market_id, round(price * 0.9) from prices_external_products where segment_id = 1;
|
||||
|
||||
insert into prices_wallpaper_m2(material_id, segment_id, market_id, price)
|
||||
select material_id, (select id from price_segments where name = 'OWN-IMAGE'), market_id, price
|
||||
from prices_wallpaper_m2 where segment_id = 1;
|
||||
update prices_wallpaper_m2 set price = price * 3
|
||||
where segment_id = (select id from price_segments where name = 'OWN-IMAGE') and market_id = 1;
|
||||
insert into prices_external_products (external_product_id, segment_id, market_id, price)
|
||||
select external_product_id, (select id from price_segments where name = 'OWN-IMAGE'), market_id, price
|
||||
from prices_external_products where segment_id = 1;
|
||||
update prices_external_products set price = price * 3
|
||||
where segment_id = (select id from price_segments where name = 'OWN-IMAGE') and market_id = 1;
|
||||
|
||||
insert into price_segmentations (product_id, designer_id, custom, segment_id)
|
||||
values
|
||||
(62542, null, false, 1),
|
||||
(62542, null, true, 6),
|
||||
(null, 249, true, 7),
|
||||
(null, 249, false, 1),
|
||||
(null, 182, false, 2),
|
||||
(46596, null, false, 3),
|
||||
(46880, null, false, 2),
|
||||
(null, 123, false, 2)
|
||||
;
|
||||
|
||||
drop table if exists price_file_imports cascade;
|
||||
create table price_file_imports (
|
||||
id serial primary key,
|
||||
inserted timestamp with time zone not null DEFAULT now(),
|
||||
comment text,
|
||||
csv_content text,
|
||||
active boolean default false,
|
||||
deleted timestamp with time zone DEFAULT null,
|
||||
meta jsonb
|
||||
);
|
||||
|
||||
drop type if exists price_file_imports_history_type cascade;
|
||||
CREATE TYPE price_file_imports_history_type AS ENUM ('activated', 'deactivated');
|
||||
|
||||
drop table if exists price_file_imports_history cascade;
|
||||
create table price_file_imports_history (
|
||||
import_id int REFERENCES price_file_imports (id) NOT NULL,
|
||||
type price_file_imports_history_type NOT NULL,
|
||||
date timestamp with time zone not null DEFAULT now()
|
||||
);
|
||||
|
||||
drop table if exists prices_other_products cascade;
|
||||
CREATE TABLE prices_other_products (
|
||||
market_id INT REFERENCES markets (id) PRIMARY KEY,
|
||||
wallpaper_kit_price NUMERIC NOT NULL CHECK (wallpaper_kit_price > 0),
|
||||
wallpaper_sample_price NUMERIC NOT NULL CHECK (wallpaper_kit_price > 0),
|
||||
updated timestamp with time zone default now()
|
||||
);
|
||||
CREATE TRIGGER updated_timestamp BEFORE UPDATE ON prices_other_products FOR EACH ROW EXECUTE PROCEDURE updated_timestamp();
|
||||
|
||||
INSERT INTO prices_other_products (market_id, wallpaper_kit_price, wallpaper_sample_price) select id, 500, 50 from markets order by id;
|
||||
update prices_other_products set wallpaper_kit_price = 19 where market_id in (select id from markets where name in ('GB','GLOBAL','PL'));
|
||||
update prices_other_products set wallpaper_kit_price = 199 where market_id in (select id from markets where name in ('DK','NO','SE'));
|
||||
update prices_other_products set wallpaper_kit_price = 21 where market_id in (select id from markets where name in ('AT','CH','IE','IT','LU','SG','US'));
|
||||
update prices_other_products set wallpaper_kit_price = 22 where market_id in (select id from markets where name in ('DE','FR'));
|
||||
update prices_other_products set wallpaper_kit_price = 23 where market_id in (select id from markets where name in ('EE','NL'));
|
||||
update prices_other_products set wallpaper_kit_price = 24 where market_id in (select id from markets where name in ('BE','CA','ES','FI'));
|
||||
update prices_other_products set wallpaper_kit_price = 26 where market_id = (select id from markets where name = 'AU');
|
||||
update prices_other_products set wallpaper_sample_price = 2 where market_id in
|
||||
(select id from markets where name in ('US','SG','CH','GB','FI','GLOBAL','DE','NL','AT','ES','FR','PL','IT','BE','IE','EE','LU'));
|
||||
update prices_other_products set wallpaper_sample_price = 3 where market_id in (select id from markets where name in ('CA','AU'));
|
||||
update prices_other_products set wallpaper_sample_price = 19 where market_id in (select id from markets where name in ('SE','NO','DK'));
|
||||
|
||||
-- New price on SE to make testing easier:
|
||||
update prices_other_products set wallpaper_kit_price = 49, wallpaper_sample_price = 29 where market_id = 1;
|
||||
Reference in New Issue
Block a user