diff --git a/internal/database/migrations/20251018120649_create_project_chick_ins_table.up.sql b/internal/database/migrations/20251018120649_create_project_chick_ins_table.up.sql new file mode 100644 index 00000000..fe61d85c --- /dev/null +++ b/internal/database/migrations/20251018120649_create_project_chick_ins_table.up.sql @@ -0,0 +1,57 @@ +CREATE TABLE IF NOT EXISTS project_chickins ( + id BIGSERIAL PRIMARY KEY, + project_flock_kandang_id BIGINT NOT NULL, + product_warehouse_id BIGINT NOT NULL, + chick_in_date DATE NOT NULL, + usage_qty NUMERIC(15, 3) NOT NULL, + pending_usage_qty NUMERIC(15, 3) DEFAULT 0, + notes TEXT, + created_by BIGINT NOT NULL, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now(), + deleted_at TIMESTAMPTZ +); + +DO $$ +BEGIN + IF to_regclass('project_flock_kandangs') IS NOT NULL THEN + ALTER TABLE project_chickins + ADD CONSTRAINT fk_project_chickins_kandang + FOREIGN KEY (project_flock_kandang_id) + REFERENCES project_flock_kandangs(id) + ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; + + IF to_regclass('product_warehouses') IS NOT NULL THEN + ALTER TABLE project_chickins + ADD CONSTRAINT fk_project_chickins_warehouse + FOREIGN KEY (product_warehouse_id) + REFERENCES product_warehouses(id) + ON DELETE CASCADE ON UPDATE CASCADE; + END IF; + + IF to_regclass('users') IS NOT NULL THEN + ALTER TABLE project_chickins + ADD CONSTRAINT fk_project_chickins_created_by + FOREIGN KEY (created_by) + REFERENCES users(id) + ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; +END $$; + +CREATE INDEX IF NOT EXISTS idx_chickins_kandang_id ON project_chickins (project_flock_kandang_id) +WHERE + deleted_at IS NULL; + +CREATE INDEX IF NOT EXISTS idx_chickins_warehouse_id ON project_chickins (product_warehouse_id) +WHERE + deleted_at IS NULL; + +CREATE INDEX IF NOT EXISTS idx_chickins_created_by ON project_chickins (created_by); + +CREATE INDEX IF NOT EXISTS idx_chickins_kandang_deleted ON project_chickins ( + project_flock_kandang_id, + deleted_at +); + +CREATE INDEX IF NOT EXISTS idx_chickins_deleted_at ON project_chickins (deleted_at); diff --git a/internal/database/migrations/20251020022357_create_project_flock_populations_table.up.sql b/internal/database/migrations/20251020022357_create_project_flock_populations_table.up.sql new file mode 100644 index 00000000..53241584 --- /dev/null +++ b/internal/database/migrations/20251020022357_create_project_flock_populations_table.up.sql @@ -0,0 +1,60 @@ +CREATE TABLE IF NOT EXISTS project_flock_populations ( + id BIGSERIAL PRIMARY KEY, + project_chickin_id BIGINT NOT NULL, + product_warehouse_id BIGINT NOT NULL, + total_qty NUMERIC(15, 3) NOT NULL, + total_used_qty NUMERIC(15, 3) DEFAULT 0, + notes TEXT, + created_by BIGINT NOT NULL, + created_at TIMESTAMPTZ DEFAULT now(), + updated_at TIMESTAMPTZ DEFAULT now(), + deleted_at TIMESTAMPTZ +); + +DO $$ +BEGIN + IF to_regclass('project_chickins') IS NOT NULL THEN + ALTER TABLE project_flock_populations + ADD CONSTRAINT fk_project_flock_populations_chickin + FOREIGN KEY (project_chickin_id) + REFERENCES project_chickins(id) + ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; + + IF to_regclass('product_warehouses') IS NOT NULL THEN + ALTER TABLE project_flock_populations + ADD CONSTRAINT fk_project_flock_populations_warehouse + FOREIGN KEY (product_warehouse_id) + REFERENCES product_warehouses(id) + ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; + + IF to_regclass('users') IS NOT NULL THEN + ALTER TABLE project_flock_populations + ADD CONSTRAINT fk_project_flock_populations_created_by + FOREIGN KEY (created_by) + REFERENCES users(id) + ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; +END $$; + +CREATE INDEX IF NOT EXISTS idx_populations_chickin_id ON project_flock_populations (project_chickin_id) +WHERE + deleted_at IS NULL; + +CREATE INDEX IF NOT EXISTS idx_populations_warehouse_id ON project_flock_populations (product_warehouse_id) +WHERE + deleted_at IS NULL; + +CREATE INDEX IF NOT EXISTS idx_populations_created_by ON project_flock_populations (created_by); + +CREATE INDEX IF NOT EXISTS idx_populations_chickin_deleted ON project_flock_populations ( + project_chickin_id, + deleted_at +); + +CREATE INDEX IF NOT EXISTS idx_populations_deleted_at ON project_flock_populations (deleted_at); + +CREATE UNIQUE INDEX IF NOT EXISTS idx_populations_chickin_unique ON project_flock_populations (project_chickin_id) +WHERE + deleted_at IS NULL; diff --git a/internal/database/migrations/20251022024829_create_project_chickin_details.up.sql b/internal/database/migrations/20251022024829_create_project_chickin_details.up.sql index a2364abe..64b5fc42 100644 --- a/internal/database/migrations/20251022024829_create_project_chickin_details.up.sql +++ b/internal/database/migrations/20251022024829_create_project_chickin_details.up.sql @@ -12,7 +12,7 @@ CREATE TABLE IF NOT EXISTS project_chickin_details ( DO $$ BEGIN - IF EXISTS (SELECT 1 FROM pg_tables WHERE tablename = 'project_chickins') THEN + IF to_regclass('project_chickins') IS NOT NULL THEN ALTER TABLE project_chickin_details ADD CONSTRAINT fk_project_chickin_id FOREIGN KEY (project_chickin_id) @@ -20,7 +20,7 @@ BEGIN ON DELETE CASCADE ON UPDATE CASCADE; END IF; - IF EXISTS (SELECT 1 FROM pg_tables WHERE tablename = 'product_warehouses') THEN + IF to_regclass('product_warehouses') IS NOT NULL THEN ALTER TABLE project_chickin_details ADD CONSTRAINT fk_product_warehouse_id FOREIGN KEY (product_warehouse_id) @@ -28,7 +28,7 @@ BEGIN ON DELETE RESTRICT ON UPDATE CASCADE; END IF; - IF EXISTS (SELECT 1 FROM pg_tables WHERE tablename = 'users') THEN + IF to_regclass('users') IS NOT NULL THEN ALTER TABLE project_chickin_details ADD CONSTRAINT fk_created_by FOREIGN KEY (created_by) @@ -42,4 +42,4 @@ CREATE INDEX IF NOT EXISTS idx_project_chickin_details_project_chickin_id ON pro CREATE INDEX IF NOT EXISTS idx_project_chickin_details_product_warehouse_id ON project_chickin_details (product_warehouse_id); -CREATE INDEX IF NOT EXISTS idx_project_chickin_details_created_by ON project_chickin_details (created_by); \ No newline at end of file +CREATE INDEX IF NOT EXISTS idx_project_chickin_details_created_by ON project_chickin_details (created_by);