| CREATE TABLE roles ( |
| role_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| role_code TEXT UNIQUE NOT NULL, |
| role_name TEXT NOT NULL, |
| role_level INT NOT NULL |
| ); |
|
|
| CREATE TABLE credit_hubs ( |
| hub_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| hub_code TEXT UNIQUE NOT NULL, |
| hub_name TEXT NOT NULL, |
| city TEXT NOT NULL, |
| state TEXT NOT NULL |
| ); |
|
|
| CREATE TABLE users ( |
| user_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| employee_id TEXT UNIQUE NOT NULL, |
| email TEXT UNIQUE NOT NULL, |
| role_id UUID REFERENCES roles(role_id), |
| hub_id UUID REFERENCES credit_hubs(hub_id), |
| branch_name TEXT, |
| is_active BOOLEAN DEFAULT TRUE |
| ); |
|
|
| CREATE TABLE cases ( |
| case_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| kurie_no TEXT NOT NULL, |
| draw_no INT NOT NULL, |
| loyalty_id TEXT NOT NULL, |
| chittal_no TEXT NOT NULL, |
| chittal TEXT NOT NULL, |
| prize_money NUMERIC(14,2) NOT NULL, |
| future_liability NUMERIC(14,2) NOT NULL, |
| remaining_liability NUMERIC(14,2) NOT NULL, |
| bid_loss NUMERIC(14,2), |
| branch_name TEXT NOT NULL, |
| current_hub_id UUID REFERENCES credit_hubs(hub_id), |
| pending_days INT DEFAULT 0, |
| status TEXT NOT NULL, |
| created_at TIMESTAMPTZ DEFAULT now() |
| ); |
|
|
| CREATE TABLE security_types ( |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| code TEXT UNIQUE NOT NULL, |
| name TEXT NOT NULL, |
| formula_config JSONB NOT NULL, |
| is_active BOOLEAN DEFAULT TRUE |
| ); |
|
|
| CREATE TABLE parties ( |
| party_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| case_id UUID REFERENCES cases(case_id), |
| party_type TEXT NOT NULL, |
| loyalty_id TEXT, |
| temp_id TEXT, |
| full_name TEXT NOT NULL, |
| gross_monthly_income NUMERIC(14,2) |
| ); |
|
|
| CREATE TABLE case_securities ( |
| security_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| case_id UUID REFERENCES cases(case_id), |
| security_type_id UUID REFERENCES security_types(id), |
| party_id UUID REFERENCES parties(party_id), |
| holder_type TEXT NOT NULL, |
| accepted_value NUMERIC(14,2) NOT NULL, |
| input_params JSONB NOT NULL |
| ); |
|
|
| CREATE TABLE document_master ( |
| doc_code TEXT PRIMARY KEY, |
| doc_title TEXT NOT NULL, |
| category TEXT NOT NULL, |
| upload_method TEXT NOT NULL |
| ); |
|
|
| CREATE TABLE document_security_mapping ( |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| doc_code TEXT REFERENCES document_master(doc_code), |
| security_type_id UUID REFERENCES security_types(id), |
| applicable_to TEXT NOT NULL, |
| is_mandatory BOOLEAN DEFAULT TRUE |
| ); |
|
|
| CREATE TABLE case_documents ( |
| doc_instance_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| case_id UUID REFERENCES cases(case_id), |
| party_id UUID REFERENCES parties(party_id), |
| doc_code TEXT REFERENCES document_master(doc_code), |
| status TEXT NOT NULL, |
| file_url TEXT, |
| uploaded_at TIMESTAMPTZ, |
| verified_by UUID REFERENCES users(user_id) |
| ); |
|
|
| CREATE TABLE dispatch_records ( |
| dispatch_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| case_id UUID UNIQUE REFERENCES cases(case_id), |
| hub_id UUID REFERENCES credit_hubs(hub_id), |
| courier_name TEXT NOT NULL, |
| awb_number TEXT NOT NULL, |
| dispatch_date TIMESTAMPTZ NOT NULL, |
| received_date TIMESTAMPTZ |
| ); |
|
|
| CREATE TABLE field_investigations ( |
| fi_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| case_id UUID REFERENCES cases(case_id), |
| assigned_to UUID REFERENCES users(user_id), |
| questionnaire_responses JSONB, |
| status TEXT NOT NULL |
| ); |
|
|
| CREATE TABLE fi_uploads ( |
| upload_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| fi_id UUID REFERENCES field_investigations(fi_id), |
| upload_type TEXT NOT NULL, |
| file_url TEXT NOT NULL, |
| gps_latitude NUMERIC(10,7), |
| gps_longitude NUMERIC(10,7) |
| ); |
|
|
| CREATE TABLE approvals ( |
| approval_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| case_id UUID REFERENCES cases(case_id), |
| approval_level TEXT NOT NULL, |
| approver_id UUID REFERENCES users(user_id), |
| decision TEXT NOT NULL, |
| remarks TEXT, |
| decided_at TIMESTAMPTZ DEFAULT now() |
| ); |
|
|
| CREATE TABLE case_workflow_log ( |
| log_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| case_id UUID REFERENCES cases(case_id), |
| from_status TEXT, |
| to_status TEXT NOT NULL, |
| action TEXT NOT NULL, |
| actioned_by UUID REFERENCES users(user_id), |
| remarks TEXT, |
| actioned_at TIMESTAMPTZ DEFAULT now() |
| ); |
|
|
| CREATE TABLE audit_logs ( |
| log_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| timestamp TIMESTAMPTZ DEFAULT now(), |
| user_id UUID REFERENCES users(user_id), |
| action TEXT NOT NULL, |
| entity_type TEXT NOT NULL, |
| entity_id UUID NOT NULL, |
| old_value JSONB, |
| new_value JSONB, |
| ip_address INET |
| ); |
|
|
| CREATE TABLE sla_tracking ( |
| sla_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| case_id UUID REFERENCES cases(case_id), |
| role_code TEXT NOT NULL, |
| started_at TIMESTAMPTZ NOT NULL, |
| sla_deadline TIMESTAMPTZ NOT NULL, |
| completed_at TIMESTAMPTZ, |
| status TEXT NOT NULL |
| ); |
|
|
| CREATE TABLE notifications ( |
| notif_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| case_id UUID REFERENCES cases(case_id), |
| recipient_id UUID REFERENCES users(user_id), |
| type TEXT NOT NULL, |
| channel TEXT NOT NULL, |
| message TEXT NOT NULL, |
| is_read BOOLEAN DEFAULT FALSE, |
| sent_at TIMESTAMPTZ DEFAULT now() |
| ); |
|
|
| CREATE INDEX idx_cases_status_hub ON cases(status, current_hub_id); |
| CREATE INDEX idx_cases_draw_pending ON cases(created_at, pending_days); |
| CREATE INDEX idx_case_documents_case_doc ON case_documents(case_id, doc_code); |
| CREATE INDEX idx_audit_entity ON audit_logs(entity_id, entity_type); |
| CREATE INDEX idx_sla_status_deadline ON sla_tracking(status, sla_deadline); |
| CREATE INDEX idx_notifications_recipient ON notifications(recipient_id, is_read); |
|
|