Files
cart/schema/schema_art_DDL.sql

389 lines
12 KiB
PL/PgSQL
Executable File

-- CREATE SCHEMA
/*
-- DROP SCHEMA art CASCADE;
CREATE SCHEMA art AUTHORIZATION sherwinp;
*/
-- POSTGRESQL SQL SCHEMA DDL: art
SET search_path TO art;
-- art."document" definition
-- Drop table
-- DROP TABLE "document";
CREATE TABLE "document" (
document_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
document_url varchar(254) NOT NULL,
CONSTRAINT pk_document PRIMARY KEY (document_id)
);
-- art.zip definition
-- Drop table
-- DROP TABLE zip;
CREATE TABLE zip (
zip varchar(5) NOT NULL,
city varchar(16) NULL,
state varchar(2) NULL,
CONSTRAINT pk_zip PRIMARY KEY (zip),
CONSTRAINT zip_check CHECK (regexp_like((zip)::text, '\d{5}'::text))
);
-- art.contact definition
-- Drop table
-- DROP TABLE contact;
CREATE TABLE contact (
contact_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
first_name varchar(16) NOT NULL,
last_name varchar(16) NOT NULL,
phone_no varchar(12) NULL,
email varchar(64) NOT NULL,
modified_by int4 NULL,
created_dt timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
modified_dt timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
CONSTRAINT pk_contact_id PRIMARY KEY (contact_id),
CONSTRAINT contact_modified_by_fkey FOREIGN KEY (modified_by) REFERENCES contact(contact_id)
);
-- art."plan" definition
-- Drop table
-- DROP TABLE "plan";
CREATE TABLE "plan" (
plan_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
description varchar(32) NULL,
fk_document_id int4 NOT NULL,
duration int4 NULL,
price int4 NULL,
modified_by int4 NULL,
created_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
modified_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT pk_plan PRIMARY KEY (plan_id),
CONSTRAINT plan_fk_document_id_fkey FOREIGN KEY (fk_document_id) REFERENCES "document"(document_id)
);
-- art.profile definition
-- Drop table
-- DROP TABLE profile;
CREATE TABLE profile (
profile_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
fk_contact_id int4 NOT NULL,
active bool DEFAULT false NULL,
modified_by int4 NOT NULL,
created_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
modified_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT pk_profile_id PRIMARY KEY (profile_id),
CONSTRAINT profile_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id) ON DELETE CASCADE,
CONSTRAINT profile_modified_by_fkey FOREIGN KEY (modified_by) REFERENCES profile(profile_id)
);
-- art.staff definition
-- Drop table
-- DROP TABLE staff;
CREATE TABLE staff (
fk_profile_id int4 NOT NULL,
"position" varchar(14) NOT NULL,
CONSTRAINT check_position CHECK ((("position")::text = ANY ((ARRAY['Director'::character varying, 'Curator'::character varying, 'Art Handler'::character varying, 'Registrar'::character varying, 'Associate'::character varying])::text[]))),
CONSTRAINT pk_staff PRIMARY KEY (fk_profile_id),
CONSTRAINT staff_fk_profile_id_fkey FOREIGN KEY (fk_profile_id) REFERENCES profile(profile_id)
);
-- art."subscription" definition
-- Drop table
-- DROP TABLE "subscription";
CREATE TABLE "subscription" (
fk_plan_id int4 NOT NULL,
fk_contact_id int4 NOT NULL,
modified_by int4 NULL,
created_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
modified_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT pk_subscription PRIMARY KEY (fk_plan_id, fk_contact_id),
CONSTRAINT subscription_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id),
CONSTRAINT subscription_fk_plan_id_fkey FOREIGN KEY (fk_plan_id) REFERENCES "plan"(plan_id)
);
-- art.task_history definition
-- Drop table
-- DROP TABLE task_history;
CREATE TABLE task_history (
task_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
assigned_to_profile_id int4 NOT NULL,
created_by_profile_id int4 NOT NULL,
related_entity_type varchar(32) NULL,
related_entity_id int4 NULL,
task_type varchar(32) NOT NULL,
task_title varchar(64) NOT NULL,
description varchar(128) NULL,
fk_document_id int4 NULL,
status varchar(16) DEFAULT 'pending'::character varying NULL,
due_date timestamp NULL,
completed_at timestamp NULL,
created_at timestamp DEFAULT CURRENT_TIMESTAMP NULL,
updated_at timestamp DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT chk_status CHECK (((status)::text = ANY ((ARRAY['pending'::character varying, 'in_progress'::character varying, 'completed'::character varying, 'cancelled'::character varying])::text[]))),
CONSTRAINT task_history_pkey PRIMARY KEY (task_id),
CONSTRAINT task_history_fk_document_id_fkey FOREIGN KEY (fk_document_id) REFERENCES "document"(document_id)
);
-- art.userrole definition
-- Drop table
-- DROP TABLE userrole;
CREATE TABLE userrole (
fk_profile_id int4 NOT NULL,
rolename varchar(16) NULL,
passwordhash varchar(256) DEFAULT NULL::character varying NULL,
CONSTRAINT check_role CHECK (((rolename)::text = ANY ((ARRAY['SYSTEM'::character varying, 'CONTACT'::character varying, 'CUSTOMER'::character varying, 'STAFF'::character varying, 'SUPPLIER'::character varying])::text[]))),
CONSTRAINT pk_userrole PRIMARY KEY (fk_profile_id),
CONSTRAINT userrole_fk_profile_id_fkey FOREIGN KEY (fk_profile_id) REFERENCES profile(profile_id) ON DELETE CASCADE
);
-- art.address definition
-- Drop table
-- DROP TABLE address;
CREATE TABLE address (
zip varchar(5) NOT NULL,
fk_contact_id int4 NOT NULL,
street varchar(32) NOT NULL,
CONSTRAINT pk_address PRIMARY KEY (zip, fk_contact_id),
CONSTRAINT address_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id) ON DELETE CASCADE,
CONSTRAINT address_zip_fkey FOREIGN KEY (zip) REFERENCES zip(zip)
);
-- art.authorize definition
-- Drop table
-- DROP TABLE authorize;
CREATE TABLE authorize (
authorization_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
fk_contact_id int4 NULL,
authorization_status varchar(16) NOT NULL,
authorization_date timestamp DEFAULT CURRENT_TIMESTAMP NULL,
expiration_date timestamp DEFAULT CURRENT_TIMESTAMP NULL,
fk_document_id int4 NULL,
modified_by int4 NULL,
created_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
modified_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT authorize_pkey PRIMARY KEY (authorization_id),
CONSTRAINT check_authorization_status CHECK (((authorization_status)::text = ANY ((ARRAY['pending'::character varying, 'approved'::character varying, 'rejected'::character varying, 'expired'::character varying])::text[]))),
CONSTRAINT authorize_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id),
CONSTRAINT authorize_fk_document_id_fkey FOREIGN KEY (fk_document_id) REFERENCES "document"(document_id)
);
-- art.inventory definition
-- Drop table
-- DROP TABLE inventory;
CREATE TABLE inventory (
inventory_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
fk_contact_id int4 NOT NULL,
fk_authorization_id int4 NULL,
sku varchar(100) NOT NULL,
product_description varchar(100) NOT NULL,
unit_cost numeric(10, 2) NOT NULL,
lead_time_days int4 NOT NULL,
product_name varchar(100) NOT NULL,
unit_of_measure varchar(50) NOT NULL,
base_price numeric(10, 2) NOT NULL,
quantity_available int4 DEFAULT 0 NOT NULL,
created_at timestamp DEFAULT CURRENT_TIMESTAMP NULL,
updated_at timestamp DEFAULT CURRENT_TIMESTAMP NULL,
fk_document_id int4 NULL,
CONSTRAINT inventory_pkey PRIMARY KEY (inventory_id),
CONSTRAINT supplier_unique_sku UNIQUE (fk_contact_id, sku),
CONSTRAINT inventory_fk_authorization_id_fkey FOREIGN KEY (fk_authorization_id) REFERENCES authorize(authorization_id),
CONSTRAINT inventory_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id),
CONSTRAINT inventory_fk_document_id_fkey FOREIGN KEY (fk_document_id) REFERENCES "document"(document_id)
);
-- art.invoice definition
-- Drop table
-- DROP TABLE invoice;
CREATE TABLE invoice (
invoice_id uuid DEFAULT gen_random_uuid() NOT NULL,
fk_plan_id int4 NULL,
fk_contact_id int4 NULL,
invoicedate date NULL,
amountpaid numeric(10, 2) DEFAULT 0 NULL,
CONSTRAINT invoice_pkey PRIMARY KEY (invoice_id),
CONSTRAINT invoice_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id),
CONSTRAINT invoice_fk_plan_id_fkey FOREIGN KEY (fk_plan_id) REFERENCES "plan"(plan_id)
);
-- art.order_items definition
-- Drop table
-- DROP TABLE order_items;
CREATE TABLE order_items (
order_item_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
fk_profile_id int4 NOT NULL,
transaction_id varchar(32) NULL,
created_at timestamp NOT NULL,
quantity int4 DEFAULT 1 NOT NULL,
unit_price numeric(10, 2) NOT NULL,
line_total numeric(10, 2) NOT NULL,
fk_inventory_id int4 NOT NULL,
CONSTRAINT order_items_pkey PRIMARY KEY (order_item_id),
CONSTRAINT order_items_fk_inventory_id_fkey FOREIGN KEY (fk_inventory_id) REFERENCES inventory(inventory_id),
CONSTRAINT order_items_fk_profile_id_fkey FOREIGN KEY (fk_profile_id) REFERENCES profile(profile_id)
);
-- art.exhibit definition
-- Drop table
-- DROP TABLE exhibit;
CREATE TABLE exhibit (
exhibit_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
fk_inventory_id int4 NOT NULL,
fk_plan_id int4 NULL,
CONSTRAINT exhibit_pkey PRIMARY KEY (exhibit_id),
CONSTRAINT exhibit_fk_inventory_id_fkey FOREIGN KEY (fk_inventory_id) REFERENCES inventory(inventory_id),
CONSTRAINT exhibit_fk_plan_id_fkey FOREIGN KEY (fk_plan_id) REFERENCES "plan"(plan_id)
);
/* VIEW of available exhibit inventory */
CREATE OR REPLACE VIEW view_available_inventory
AS SELECT inventory.inventory_id,
inventory.fk_contact_id,
inventory.fk_authorization_id,
inventory.sku,
inventory.product_description,
inventory.unit_cost,
inventory.lead_time_days,
inventory.product_name,
inventory.unit_of_measure,
inventory.base_price,
inventory.quantity_available,
inventory.created_at,
inventory.updated_at,
inventory.fk_document_id
FROM art.inventory
WHERE inventory.quantity_available > 0
INTERSECT
SELECT exhibit.fk_inventory_id AS inventory_id,
NULL::integer AS fk_contact_id,
NULL::integer AS fk_authorization_id,
NULL::character varying AS sku,
NULL::character varying AS product_description,
NULL::numeric AS unit_cost,
NULL::integer AS lead_time_days,
NULL::character varying AS product_name,
NULL::character varying AS unit_of_measure,
NULL::numeric AS base_price,
NULL::integer AS quantity_available,
NULL::timestamp without time zone AS created_at,
NULL::timestamp without time zone AS updated_at,
NULL::integer AS fk_document_id
FROM art.exhibit;
CREATE OR REPLACE VIEW VIEW_SYSTEMROLE AS
SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, u.ROLENAME, p.ACTIVE FROM
USERROLE u
JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID AND u.ROLENAME = 'SYSTEM';
CREATE OR REPLACE VIEW VIEW_STAFF AS
SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, u.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME, s.POSITION FROM
USERROLE u
JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID AND u.ROLENAME = 'STAFF'
JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID
JOIN STAFF s on s.FK_PROFILE_ID = p.PROFILE_ID;
CREATE OR REPLACE VIEW VIEW_SUPPLIER AS
SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, u.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME FROM
USERROLE u
JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID AND u.ROLENAME = 'SUPPLIER'
JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID;
CREATE OR REPLACE VIEW VIEW_CUSTOMER AS
SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, u.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME FROM
USERROLE u
JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID AND u.ROLENAME = 'CUSTOMER'
JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID;
-- Trigger Function Paid Invoice, generates subscription
CREATE OR REPLACE FUNCTION invoice_paid_subscription()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
INSERT INTO SUBSCRIPTION (FK_PLAN_ID, FK_CONTACT_ID) VALUES (NEW.FK_PLAN_ID, NEW.FK_CONTACT_ID);
RETURN NEW;
END;
$function$
;
-- Trigger on invoice
create trigger paid_subscription after
insert
on invoice for each row
execute function invoice_paid_subscription();
CREATE OR REPLACE FUNCTION ORDER_ITEMS_reserved()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
UPDATE INVENTORY SET QUANTITY_AVAILABLE = QUANTITY_AVAILABLE - NEW.QUANTITY WHERE INVENTORY_ID= NEW.FK_INVENTORY_ID;
RETURN NEW;
END;
$function$
;
-- Trigger on ORDER_ITEMS customer ordered items reservation
CREATE TRIGGER ORDER_ITEMS_reserved AFTER
INSERT
ON ORDER_ITEMS FOR EACH ROW
execute function ORDER_ITEMS_reserved();