updating cycle close request feature to get approval from national dashboard instead auto from system

This commit is contained in:
Alberto-Audrix committed 2026-09-09 14:18:39 +07:00
1 parent 3a868cf1db
commit e4dbfd0252
31 files changed
+1322 -182

No files matched your search

+27 -18
View File
@@ -1,6 +1,6 @@
-- =============================================================================
-- PostgreSQL Schema — CPSP Dashboard ERD
-- Source: ERD_dashboard.png (updated 2026-08-20)
-- Source: ERD_dashboard.png (updated 2026-09-09 for GM cycle-close flow)
--
-- user_access.status: active | inactive | superadmin
-- (Django syncs is_active/is_staff/is_superuser from status on save:
@@ -8,8 +8,9 @@
-- is_staff false; active => is_active true, is_superuser false, is_staff
-- left untouched so operators can be marked staff)
-- user_access → sites → kandang → cycles
-- cycles → flock (flock.cycle_id, required; cycles has no flock_id)
-- flock → iot_panel
-- cycles.status: active | pending_close | closed (GM approves end_date)
-- cycles.close_requested_by_id → user_access (optional)
-- kandang → flock → iot_panel
-- cycles → ai_insight, feed_sacks, chicken_counting, chicken_weight,
-- manual_input, kpi
-- kpi → chicken_counting, chicken_weight, feed_sacks, manual_input
@@ -78,40 +79,48 @@ CREATE INDEX IF NOT EXISTS idx_kandang_site_id ON kandang (site_id);
-- -----------------------------------------------------------------------------
-- 4. Cycles
-- No flock_id — flock belongs to cycle via flock.cycle_id.
-- end_date is nullable until GM approves close (pending_close → closed).
-- Soft bound while open uses dashboard visible-through (app-side).
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS cycles (
cycle_id SERIAL PRIMARY KEY,
total_days INTEGER NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
doc_in_weight INTEGER NOT NULL,
doc_in_count INTEGER NOT NULL,
feed_initial_balance INTEGER NOT NULL DEFAULT 0,
cycle_id SERIAL PRIMARY KEY,
total_days INTEGER NOT NULL DEFAULT 1,
start_date DATE NOT NULL,
end_date DATE, -- set on GM approve; NULL while active / pending_close
doc_in_weight INTEGER NOT NULL,
doc_in_count INTEGER NOT NULL,
feed_initial_balance INTEGER NOT NULL DEFAULT 0,
feed_initial_balance_date DATE,
status VARCHAR(30) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
kandang_id INTEGER NOT NULL REFERENCES kandang (kandang_id) ON DELETE CASCADE,
CONSTRAINT chk_cycles_date_range CHECK (end_date >= start_date)
status VARCHAR(30) NOT NULL DEFAULT 'active', -- active | pending_close | closed
proposed_end_date DATE, -- staff proposed close date (cleared after decision)
close_requested_at TIMESTAMP WITH TIME ZONE,
close_requested_by_id INTEGER REFERENCES user_access (user_id) ON DELETE SET NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
kandang_id INTEGER NOT NULL REFERENCES kandang (kandang_id) ON DELETE CASCADE,
CONSTRAINT chk_cycles_date_range CHECK (
end_date IS NULL OR end_date >= start_date
)
);
CREATE INDEX IF NOT EXISTS idx_cycles_kandang_id ON cycles (kandang_id);
CREATE INDEX IF NOT EXISTS idx_cycles_status ON cycles (status);
CREATE INDEX IF NOT EXISTS idx_cycles_start_date ON cycles (start_date);
CREATE INDEX IF NOT EXISTS idx_cycles_close_requested_by_id ON cycles (close_requested_by_id);
-- -----------------------------------------------------------------------------
-- 5. Flock
-- Belongs to kandang (persists across cycles); used by IoT panel.
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS flock (
flock_id SERIAL PRIMARY KEY,
flock_name VARCHAR(30) NOT NULL,
cycle_id INTEGER NOT NULL REFERENCES cycles (cycle_id) ON DELETE CASCADE,
kandang_id INTEGER NOT NULL REFERENCES kandang (kandang_id) ON DELETE CASCADE,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_flock_cycle_id ON flock (cycle_id);
CREATE INDEX IF NOT EXISTS idx_flock_kandang_id ON flock (kandang_id);
-- -----------------------------------------------------------------------------
-- 6. IoT Panel