Company options values, portfolio options values migration done

This commit is contained in:
2026-08-12 09:38:18 +05:30
parent c835a9deb0
commit 61bea5fb6e
17 changed files with 616 additions and 22 deletions

View File

@@ -0,0 +1,54 @@
BEGIN;
CREATE SCHEMA IF NOT EXISTS platform;
ALTER TABLE public.portfolio
ADD COLUMN IF NOT EXISTS portfolio_reference uuid;
UPDATE public.portfolio
SET portfolio_reference = gen_random_uuid()
WHERE portfolio_reference IS NULL;
ALTER TABLE public.portfolio
ALTER COLUMN portfolio_reference SET DEFAULT gen_random_uuid(),
ALTER COLUMN portfolio_reference SET NOT NULL;
CREATE UNIQUE INDEX IF NOT EXISTS uq_portfolio_reference
ON public.portfolio (portfolio_reference);
CREATE UNIQUE INDEX IF NOT EXISTS uq_company_branch_company_branch
ON public.company_branch (company_id, branch_id);
CREATE TABLE IF NOT EXISTS platform.company_branch_portfolios (
company_id smallint NOT NULL,
company_branch_id smallint NOT NULL,
portfolio_reference uuid NOT NULL,
createdon timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT pk_company_branch_portfolios
PRIMARY KEY (company_id, company_branch_id, portfolio_reference),
CONSTRAINT fk_company_branch_portfolios_branch
FOREIGN KEY (company_id, company_branch_id)
REFERENCES public.company_branch (company_id, branch_id),
CONSTRAINT fk_company_branch_portfolios_portfolio
FOREIGN KEY (portfolio_reference)
REFERENCES public.portfolio (portfolio_reference)
);
INSERT INTO platform.company_branch_portfolios (
company_id,
company_branch_id,
portfolio_reference,
createdon
)
SELECT
p.company_id,
p.branch_id,
p.portfolio_reference,
COALESCE(p.createdon, CURRENT_TIMESTAMP)
FROM public.portfolio p
JOIN public.company_branch cb
ON cb.company_id = p.company_id
AND cb.branch_id = p.branch_id
ON CONFLICT (company_id, company_branch_id, portfolio_reference) DO NOTHING;
COMMIT;

View File

@@ -0,0 +1,145 @@
BEGIN;
CREATE SCHEMA IF NOT EXISTS platform;
CREATE TABLE platform.options
(LIKE public.options INCLUDING ALL);
CREATE TABLE platform.options_values
(LIKE public.options_values INCLUDING ALL);
CREATE TABLE platform.options_mapping
(LIKE public.options_mapping INCLUDING ALL);
CREATE TABLE platform.company_options_mapping
(LIKE public.comp_options_mapping INCLUDING ALL);
CREATE TABLE platform.options_history
(LIKE public.options_history INCLUDING ALL);
ALTER TABLE platform.options_mapping
ADD COLUMN company_id smallint,
ADD COLUMN portfolio_reference uuid;
INSERT INTO platform.options
SELECT * FROM public.options;
INSERT INTO platform.options_values
SELECT * FROM public.options_values;
INSERT INTO platform.options_mapping (
portfolio_id, option_id, createdon, createdby, lasteditedon,
lasteditedby, opt_value_id, opt_map_id, company_id, portfolio_reference
)
SELECT
om.portfolio_id, om.option_id, om.createdon, om.createdby, om.lasteditedon,
om.lasteditedby, om.opt_value_id, om.opt_map_id, 1,
COALESCE(p.portfolio_reference, archived.portfolio_reference)
FROM public.options_mapping om
LEFT JOIN public.portfolio p ON p.portfolio_id = om.portfolio_id
LEFT JOIN (
SELECT portfolio_id, gen_random_uuid() portfolio_reference
FROM public.options_mapping
GROUP BY portfolio_id
) archived ON archived.portfolio_id = om.portfolio_id;
INSERT INTO platform.company_options_mapping (
company_id, option_id, createdon, createdby, lasteditedon,
lasteditedby, opt_value_id, opt_map_id
)
SELECT
1, option_id, createdon, createdby, lasteditedon,
lasteditedby, opt_value_id, opt_map_id
FROM public.comp_options_mapping;
INSERT INTO platform.options_history
SELECT * FROM public.options_history;
ALTER TABLE platform.options_mapping
ALTER COLUMN company_id SET NOT NULL,
ALTER COLUMN portfolio_reference SET NOT NULL;
DO $duplicates$
BEGIN
IF EXISTS (
SELECT 1
FROM platform.options_mapping
GROUP BY option_id, opt_value_id, portfolio_reference, company_id
HAVING count(*) > 1
) THEN
RAISE EXCEPTION
'Duplicate platform.options_mapping rows found for (option_id, opt_value_id, portfolio_reference, company_id)';
END IF;
IF EXISTS (
SELECT 1
FROM platform.company_options_mapping
GROUP BY option_id, opt_value_id, company_id
HAVING count(*) > 1
) THEN
RAISE EXCEPTION
'Duplicate platform.company_options_mapping rows found for (option_id, opt_value_id, company_id)';
END IF;
END
$duplicates$;
ALTER TABLE platform.options_mapping
ADD CONSTRAINT uq_platform_options_mapping_scope
UNIQUE (option_id, opt_value_id, portfolio_reference, company_id);
ALTER TABLE platform.company_options_mapping
ADD CONSTRAINT uq_platform_company_options_mapping_scope
UNIQUE (option_id, opt_value_id, company_id);
-- CREATE TABLE ... LIKE does not copy foreign keys. Recreate the source FK
-- against the copied platform table rather than retaining a public dependency.
ALTER TABLE platform.options_mapping
DROP CONSTRAINT IF EXISTS options_mapping_opt_value_id;
ALTER TABLE platform.options_mapping
ADD CONSTRAINT options_mapping_opt_value_id
FOREIGN KEY (opt_value_id)
REFERENCES platform.options_values (opt_value_id)
ON UPDATE CASCADE ON DELETE CASCADE NOT VALID;
-- Replace copied defaults that still point to public sequences.
CREATE SEQUENCE platform.options_mapping_opt_map_id_seq;
ALTER SEQUENCE platform.options_mapping_opt_map_id_seq
OWNED BY platform.options_mapping.opt_map_id;
ALTER TABLE platform.options_mapping
ALTER COLUMN opt_map_id
SET DEFAULT nextval('platform.options_mapping_opt_map_id_seq'::regclass);
SELECT setval(
'platform.options_mapping_opt_map_id_seq',
COALESCE((SELECT max(opt_map_id) FROM platform.options_mapping), 1),
EXISTS (SELECT 1 FROM platform.options_mapping)
);
ALTER TABLE platform.options_mapping
DROP COLUMN portfolio_id;
CREATE SEQUENCE platform.company_options_mapping_opt_map_id_seq;
ALTER SEQUENCE platform.company_options_mapping_opt_map_id_seq
OWNED BY platform.company_options_mapping.opt_map_id;
ALTER TABLE platform.company_options_mapping
ALTER COLUMN opt_map_id
SET DEFAULT nextval('platform.company_options_mapping_opt_map_id_seq'::regclass);
SELECT setval(
'platform.company_options_mapping_opt_map_id_seq',
COALESCE((SELECT max(opt_map_id) FROM platform.company_options_mapping), 1),
EXISTS (SELECT 1 FROM platform.company_options_mapping)
);
CREATE SEQUENCE platform.options_history_uid_seq;
ALTER SEQUENCE platform.options_history_uid_seq
OWNED BY platform.options_history.uid;
ALTER TABLE platform.options_history
ALTER COLUMN uid
SET DEFAULT nextval('platform.options_history_uid_seq'::regclass);
SELECT setval(
'platform.options_history_uid_seq',
COALESCE((SELECT max(uid) FROM platform.options_history), 1),
EXISTS (SELECT 1 FROM platform.options_history)
);
COMMIT;

View File

@@ -0,0 +1,76 @@
BEGIN;
ALTER TABLE platform.options_mapping
ADD COLUMN IF NOT EXISTS portfolio_reference uuid;
CREATE TEMPORARY TABLE portfolio_reference_migration (
company_id smallint NOT NULL,
portfolio_id smallint NOT NULL,
portfolio_reference uuid NOT NULL,
PRIMARY KEY (company_id, portfolio_id)
) ON COMMIT DROP;
DO $migration$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema='platform' AND table_name='options_mapping'
AND column_name='portfolio_id'
) THEN
EXECUTE $sql$
INSERT INTO portfolio_reference_migration
(company_id, portfolio_id, portfolio_reference)
SELECT om.company_id, om.portfolio_id,
COALESCE(
(array_agg(p.portfolio_reference)
FILTER (WHERE p.portfolio_reference IS NOT NULL))[1],
gen_random_uuid())
FROM platform.options_mapping om
LEFT JOIN public.portfolio p ON p.portfolio_id=om.portfolio_id
GROUP BY om.company_id, om.portfolio_id
$sql$;
EXECUTE $sql$
UPDATE platform.options_mapping om
SET portfolio_reference=prm.portfolio_reference
FROM portfolio_reference_migration prm
WHERE prm.company_id=om.company_id
AND prm.portfolio_id=om.portfolio_id
AND om.portfolio_reference IS NULL
$sql$;
END IF;
END
$migration$;
DO $validation$
BEGIN
IF EXISTS (SELECT 1 FROM platform.options_mapping WHERE portfolio_reference IS NULL) THEN
RAISE EXCEPTION 'Some option mappings have no portfolio reference';
END IF;
IF EXISTS (
SELECT 1
FROM platform.options_mapping
GROUP BY option_id, opt_value_id, portfolio_reference, company_id
HAVING count(*) > 1
) THEN
RAISE EXCEPTION 'Duplicate option mappings found for portfolio references';
END IF;
END
$validation$;
ALTER TABLE platform.options_mapping
ALTER COLUMN portfolio_reference SET NOT NULL,
DROP CONSTRAINT IF EXISTS uq_platform_options_mapping_scope;
ALTER TABLE platform.options_mapping
ADD CONSTRAINT uq_platform_options_mapping_scope
UNIQUE (option_id, opt_value_id, portfolio_reference, company_id);
ALTER TABLE platform.options_mapping
DROP COLUMN IF EXISTS portfolio_id;
DROP INDEX IF EXISTS platform.uq_company_branch_portfolios_local_scope;
ALTER TABLE platform.company_branch_portfolios
DROP COLUMN IF EXISTS portfolio_id;
COMMIT;

View File

@@ -0,0 +1,8 @@
BEGIN;
UPDATE platform.application_query
SET query_text = 'select!C0L!SELECT portfolio_id AS "value", portname AS "label", portfolio_reference::text AS "description", ''portfolio.'' AS "group" FROM portfolio WHERE branch_id=? AND isactive=? ORDER BY portname',
ismigrated = true
WHERE query_id = 3;
COMMIT;