Init All Docs

This commit is contained in:
Aditya Siregar
2025-09-08 12:24:37 +07:00
parent aa662a321f
commit 2319019eb2
68 changed files with 5417 additions and 437 deletions
@@ -0,0 +1,25 @@
-- Rollback: Remove status and letter_incoming_id columns from letter_incoming_dispositions_department table
-- Drop the constraint first
ALTER TABLE letter_incoming_dispositions_department
DROP CONSTRAINT IF EXISTS check_disposition_department_status;
-- Drop indexes
DROP INDEX IF EXISTS idx_letter_incoming_dispositions_department_status;
DROP INDEX IF EXISTS idx_letter_incoming_dispositions_department_letter_id;
-- Drop the columns
ALTER TABLE letter_incoming_dispositions_department
DROP COLUMN IF EXISTS status;
ALTER TABLE letter_incoming_dispositions_department
DROP COLUMN IF EXISTS letter_incoming_id;
ALTER TABLE letter_incoming_dispositions_department
DROP COLUMN IF EXISTS read_at;
ALTER TABLE letter_incoming_dispositions_department
DROP COLUMN IF EXISTS completed_at;
ALTER TABLE letter_incoming_dispositions_department
DROP COLUMN IF EXISTS updated_at;
@@ -0,0 +1,38 @@
-- Add status and letter_incoming_id columns to letter_incoming_dispositions_department table
-- Add letter_incoming_id column
ALTER TABLE letter_incoming_dispositions_department
ADD COLUMN IF NOT EXISTS letter_incoming_id UUID NOT NULL REFERENCES letters_incoming(id);
-- Add status column with default value
ALTER TABLE letter_incoming_dispositions_department
ADD COLUMN IF NOT EXISTS status VARCHAR(50) NOT NULL DEFAULT 'pending';
-- Add read_at column
ALTER TABLE letter_incoming_dispositions_department
ADD COLUMN IF NOT EXISTS read_at TIMESTAMP;
-- Add completed_at column
ALTER TABLE letter_incoming_dispositions_department
ADD COLUMN IF NOT EXISTS completed_at TIMESTAMP;
-- Add updated_at column
ALTER TABLE letter_incoming_dispositions_department
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
-- Create index for faster queries
CREATE INDEX IF NOT EXISTS idx_letter_incoming_dispositions_department_status
ON letter_incoming_dispositions_department(department_id, status);
CREATE INDEX IF NOT EXISTS idx_letter_incoming_dispositions_department_letter_id
ON letter_incoming_dispositions_department(letter_incoming_id);
-- Update existing records to have status 'dispositioned' (assuming existing records are already dispositioned)
UPDATE letter_incoming_dispositions_department
SET status = 'dispositioned'
WHERE status = 'pending';
-- Add constraint to ensure valid status values
ALTER TABLE letter_incoming_dispositions_department
ADD CONSTRAINT check_disposition_department_status
CHECK (status IN ('pending', 'dispositioned', 'read', 'completed'));
@@ -0,0 +1,12 @@
BEGIN;
-- Delete new setting
DELETE FROM app_settings WHERE key = 'INCOMING_LETTER_DEPARTMENT_RECIPIENTS';
-- Restore old setting
INSERT INTO app_settings(key, value)
VALUES
('INCOMING_LETTER_RECIPIENTS', '{"department_codes": ["aslog"]}'::jsonb)
ON CONFLICT (key) DO NOTHING;
COMMIT;
@@ -0,0 +1,18 @@
BEGIN;
-- Delete old setting if exists
DELETE FROM app_settings WHERE key = 'INCOMING_LETTER_RECIPIENTS';
-- Insert new setting with department IDs as a direct array
-- Using empty array as placeholder that should be replaced with actual department IDs
INSERT INTO app_settings(key, value)
VALUES
('INCOMING_LETTER_DEPARTMENT_RECIPIENTS', '[]'::jsonb)
ON CONFLICT (key) DO NOTHING;
-- Example to set actual department IDs (uncomment and modify as needed):
-- UPDATE app_settings
-- SET value = '["ae66af10-bcb7-4939-8110-940d2a387e19"]'::jsonb
-- WHERE key = 'INCOMING_LETTER_DEPARTMENT_RECIPIENTS';
COMMIT;
@@ -0,0 +1,16 @@
BEGIN;
-- Drop indexes
DROP INDEX IF EXISTS idx_users_email;
DROP INDEX IF EXISTS idx_user_department_user_id;
DROP INDEX IF EXISTS idx_user_department_department_id;
DROP INDEX IF EXISTS idx_letter_outgoing_recipients_user_id;
DROP INDEX IF EXISTS idx_letter_outgoing_recipients_letter_id;
DROP INDEX IF EXISTS idx_letters_outgoing_status;
DROP INDEX IF EXISTS idx_letters_outgoing_deleted_at;
DROP INDEX IF EXISTS idx_letters_incoming_status;
DROP INDEX IF EXISTS idx_letters_incoming_deleted_at;
DROP INDEX IF EXISTS idx_letter_incoming_recipients_dept_id;
DROP INDEX IF EXISTS idx_letter_incoming_recipients_user_id;
COMMIT;
@@ -0,0 +1,26 @@
BEGIN;
-- Add index for users.email for faster email lookups
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
-- Add indexes for user_department relationship (singular table name)
CREATE INDEX IF NOT EXISTS idx_user_department_user_id ON user_department(user_id);
CREATE INDEX IF NOT EXISTS idx_user_department_department_id ON user_department(department_id);
-- Add indexes for letter_outgoing_recipients for faster joins
CREATE INDEX IF NOT EXISTS idx_letter_outgoing_recipients_user_id ON letter_outgoing_recipients(user_id);
CREATE INDEX IF NOT EXISTS idx_letter_outgoing_recipients_letter_id ON letter_outgoing_recipients(letter_id);
-- Add index for letters_outgoing status queries
CREATE INDEX IF NOT EXISTS idx_letters_outgoing_status ON letters_outgoing(status) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_letters_outgoing_deleted_at ON letters_outgoing(deleted_at);
-- Add index for letters_incoming status queries
CREATE INDEX IF NOT EXISTS idx_letters_incoming_status ON letters_incoming(status) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_letters_incoming_deleted_at ON letters_incoming(deleted_at);
-- Add index for letter_incoming_recipients for department lookups
CREATE INDEX IF NOT EXISTS idx_letter_incoming_recipients_dept_id ON letter_incoming_recipients(recipient_department_id);
CREATE INDEX IF NOT EXISTS idx_letter_incoming_recipients_user_id ON letter_incoming_recipients(recipient_user_id);
COMMIT;
@@ -0,0 +1,9 @@
BEGIN;
-- Drop indexes
DROP INDEX IF EXISTS idx_user_profiles_user_id;
DROP INDEX IF EXISTS idx_departments_id;
DROP INDEX IF EXISTS idx_user_department_composite;
DROP INDEX IF EXISTS idx_users_id_not_deleted;
COMMIT;
@@ -0,0 +1,11 @@
BEGIN;
CREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);
CREATE INDEX IF NOT EXISTS idx_departments_id ON departments(id);
CREATE INDEX IF NOT EXISTS idx_user_department_composite ON user_department(user_id, department_id);
CREATE INDEX IF NOT EXISTS idx_users_id_not_deleted ON users(id);
COMMIT;
@@ -0,0 +1,20 @@
BEGIN;
-- Remove system user from department (cascade should handle this, but being explicit)
DELETE FROM user_department
WHERE user_id = '11111111-2222-3333-4444-555555555555'::uuid
AND department_id = '11111111-2222-3333-4444-555555555555'::uuid;
-- Remove system user profile
DELETE FROM user_profiles
WHERE user_id = '11111111-2222-3333-4444-555555555555'::uuid;
-- Remove system user
DELETE FROM users
WHERE id = '11111111-2222-3333-4444-555555555555'::uuid;
-- Remove system department
DELETE FROM departments
WHERE id = '11111111-2222-3333-4444-555555555555'::uuid;
COMMIT;
@@ -0,0 +1,88 @@
BEGIN;
INSERT INTO departments (id, name, code, path, created_at, updated_at)
VALUES (
'11111111-2222-3333-4444-555555555555'::uuid,
'System',
'SYSTEM',
'system'::ltree,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
) ON CONFLICT (id) DO NOTHING;
INSERT INTO users (
id,
username,
email,
name,
password_hash,
status,
is_active,
created_at,
updated_at
)
VALUES (
'11111111-2222-3333-4444-555555555555'::uuid,
'system',
'system@eslogad.internal',
'System User',
'$2a$10$SYSTEM.USER.SHOULD.NEVER.LOGIN.WITH.PASSWORD.HASH',
'active',
true,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
) ON CONFLICT (id) DO NOTHING;
-- Create user profile for system user
INSERT INTO user_profiles (
user_id,
full_name,
display_name,
job_title,
preferences,
notification_prefs,
created_at,
updated_at
)
VALUES (
'11111111-2222-3333-4444-555555555555'::uuid,
'System User',
'System',
'Automated Process',
'{}'::jsonb,
'{}'::jsonb,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
) ON CONFLICT (user_id) DO NOTHING;
-- Link system user to system department
INSERT INTO user_department (
id,
user_id,
department_id,
is_primary,
assigned_at,
removed_at
)
VALUES (
gen_random_uuid(),
'11111111-2222-3333-4444-555555555555'::uuid,
'11111111-2222-3333-4444-555555555555'::uuid,
true,
CURRENT_TIMESTAMP,
NULL
) ON CONFLICT (user_id, department_id) WHERE removed_at IS NULL DO NOTHING;
-- Optionally, create a system role if your application uses roles
-- Uncomment and modify if needed:
-- INSERT INTO roles (id, code, name, description, created_at, updated_at)
-- VALUES (
-- gen_random_uuid(),
-- 'SYSTEM',
-- 'System Role',
-- 'Role for system automated processes',
-- CURRENT_TIMESTAMP,
-- CURRENT_TIMESTAMP
-- ) ON CONFLICT (code) DO NOTHING;
COMMIT;
@@ -0,0 +1,10 @@
BEGIN;
-- Drop the index first
DROP INDEX IF EXISTS idx_letter_incoming_disposition_dept_status_notes;
-- Remove notes column from letter_incoming_disposition_department table
ALTER TABLE letter_incoming_disposition_department
DROP COLUMN IF EXISTS notes;
COMMIT;
@@ -0,0 +1,12 @@
BEGIN;
-- Add notes column to letter_incoming_dispositions_department table
ALTER TABLE letter_incoming_dispositions_department
ADD COLUMN IF NOT EXISTS notes TEXT;
-- Add index for better performance when querying by status with notes
CREATE INDEX IF NOT EXISTS idx_letter_incoming_disposition_dept_status_notes
ON letter_incoming_dispositions_department(status)
WHERE notes IS NOT NULL;
COMMIT;
@@ -0,0 +1,17 @@
-- Drop indexes for letter_incoming_recipients
DROP INDEX IF EXISTS idx_letter_incoming_recipients_archived;
DROP INDEX IF EXISTS idx_letter_incoming_recipients_user_archived;
DROP INDEX IF EXISTS idx_letter_incoming_recipients_letter_archived;
DROP INDEX IF EXISTS idx_letter_incoming_recipients_dept_archived;
-- Drop indexes for letter_outgoing_recipients
DROP INDEX IF EXISTS idx_letter_outgoing_recipients_archived;
DROP INDEX IF EXISTS idx_letter_outgoing_recipients_user_archived;
DROP INDEX IF EXISTS idx_letter_outgoing_recipients_letter_archived;
-- Drop the is_archived columns
ALTER TABLE letter_incoming_recipients
DROP COLUMN IF EXISTS is_archived;
ALTER TABLE letter_outgoing_recipients
DROP COLUMN IF EXISTS is_archived;
@@ -0,0 +1,36 @@
-- Add is_archived column to letter_incoming_recipients if it doesn't exist
ALTER TABLE letter_incoming_recipients
ADD COLUMN IF NOT EXISTS is_archived BOOLEAN DEFAULT FALSE;
-- Add is_archived column to letter_outgoing_recipients if it doesn't exist
ALTER TABLE letter_outgoing_recipients
ADD COLUMN IF NOT EXISTS is_archived BOOLEAN DEFAULT FALSE;
-- Add indexes for efficient archiving queries on letter_incoming_recipients
-- Note: letter_incoming_recipients uses recipient_user_id and recipient_department_id
CREATE INDEX IF NOT EXISTS idx_letter_incoming_recipients_archived
ON letter_incoming_recipients(is_archived, recipient_user_id, letter_id)
WHERE is_archived = false;
CREATE INDEX IF NOT EXISTS idx_letter_incoming_recipients_user_archived
ON letter_incoming_recipients(recipient_user_id, is_archived, letter_id);
CREATE INDEX IF NOT EXISTS idx_letter_incoming_recipients_letter_archived
ON letter_incoming_recipients(letter_id, is_archived);
-- Add indexes for efficient archiving queries on letter_outgoing_recipients
-- Note: letter_outgoing_recipients uses user_id and department_id
CREATE INDEX IF NOT EXISTS idx_letter_outgoing_recipients_archived
ON letter_outgoing_recipients(is_archived, user_id, letter_id)
WHERE is_archived = false;
CREATE INDEX IF NOT EXISTS idx_letter_outgoing_recipients_user_archived
ON letter_outgoing_recipients(user_id, is_archived, letter_id);
CREATE INDEX IF NOT EXISTS idx_letter_outgoing_recipients_letter_archived
ON letter_outgoing_recipients(letter_id, is_archived);
-- Add composite index for filtering non-archived letters by department
CREATE INDEX IF NOT EXISTS idx_letter_incoming_recipients_dept_archived
ON letter_incoming_recipients(recipient_department_id, is_archived, letter_id)
WHERE is_archived = false;