Repository navigation
Expand file tree
/
Copy pathinit.sql
More file actions
174 lines (157 loc) · 6.15 KB
/
Copy pathinit.sql
File metadata and controls
174 lines (157 loc) · 6.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
-- Create enum types for various status and types
CREATE TYPE appointment_type AS ENUM ('phone', 'online', 'walk_in');
CREATE TYPE visit_type AS ENUM ('first_visit', 'follow_up');
CREATE TYPE session_type AS ENUM ('morning', 'afternoon', 'evening');
CREATE TYPE appointment_status AS ENUM ('scheduled', 'in_progress', 'completed', 'cancelled');
CREATE TYPE payment_type AS ENUM ('cash');
-- Create Patient table
CREATE TABLE patients (
patient_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
phone VARCHAR(50) NOT NULL,
email VARCHAR(100),
address TEXT,
birth_date DATE NOT NULL,
medical_history TEXT,
has_ic_card BOOLEAN DEFAULT FALSE,
ic_card_number VARCHAR(20),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Create Doctor table
CREATE TABLE doctors (
doctor_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
specialization VARCHAR(500) NOT NULL,
phone VARCHAR(20) NOT NULL,
email VARCHAR(100),
department VARCHAR(100 ) NOT NULL,
license_number VARCHAR(50) NOT NULL UNIQUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Create Nurse table
CREATE TABLE nurses (
nurse_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
phone VARCHAR(20) NOT NULL,
email VARCHAR(100),
department VARCHAR(100) NOT NULL,
license_number VARCHAR(50) NOT NULL UNIQUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Create Appointment table
CREATE TABLE appointments (
appointment_id SERIAL PRIMARY KEY,
patient_id INTEGER NOT NULL REFERENCES patients(patient_id),
doctor_id INTEGER NOT NULL REFERENCES doctors(doctor_id),
nurse_id INTEGER REFERENCES nurses(nurse_id),
appointment_time TIMESTAMP WITH TIME ZONE NOT NULL,
status appointment_status NOT NULL DEFAULT 'scheduled',
completed_time TIMESTAMP WITH TIME ZONE,
diagnosis TEXT,
appointment_type appointment_type NOT NULL,
visit_type visit_type NOT NULL,
session session_type NOT NULL,
is_emergency BOOLEAN DEFAULT FALSE,
follow_up_to INTEGER REFERENCES appointments(appointment_id),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Create VitalSigns table
CREATE TABLE vital_signs (
vital_signs_id SERIAL PRIMARY KEY,
appointment_id INTEGER NOT NULL REFERENCES appointments(appointment_id),
nurse_id INTEGER NOT NULL REFERENCES nurses(nurse_id),
temperature DECIMAL(3,1), -- 36.5
blood_pressure VARCHAR(10), -- 120/80
pulse INTEGER,
respiratory_rate INTEGER,
measurement_time TIMESTAMP WITH TIME ZONE NOT NULL,
notes TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Create Invoice table
CREATE TABLE invoices (
invoice_id SERIAL PRIMARY KEY,
appointment_id INTEGER NOT NULL REFERENCES appointments(appointment_id),
registration_fee DECIMAL(10,2) NOT NULL,
medical_fee DECIMAL(10,2) NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
is_paid BOOLEAN DEFAULT FALSE,
payment_time TIMESTAMP WITH TIME ZONE,
payment_type payment_type,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Create Referral table
CREATE TABLE referrals (
referral_id SERIAL PRIMARY KEY,
appointment_id INTEGER NOT NULL REFERENCES appointments(appointment_id),
target_hospital VARCHAR(100) NOT NULL,
target_department VARCHAR(100) NOT NULL,
reason TEXT NOT NULL,
referral_date TIMESTAMP WITH TIME ZONE NOT NULL,
status VARCHAR(50) NOT NULL,
notes TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE doctors ALTER COLUMN specialization TYPE character varying(255);
ALTER TABLE doctors ALTER COLUMN phone TYPE character varying(60);
CREATE TABLE medications (
medication_id SERIAL PRIMARY KEY,
appointment_id INTEGER NOT NULL REFERENCES appointments(appointment_id),
medication_name TEXT NOT NULL,
dosage TEXT NOT NULL,
frequency TEXT NOT NULL,
duration TEXT,
additional_instructions TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Create triggers for updating the updated_at timestamp
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- Add update triggers to all tables
CREATE TRIGGER update_patient_updated_at
BEFORE UPDATE ON patients
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_doctor_updated_at
BEFORE UPDATE ON doctors
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_nurse_updated_at
BEFORE UPDATE ON nurses
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_appointment_updated_at
BEFORE UPDATE ON appointments
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_vital_signs_updated_at
BEFORE UPDATE ON vital_signs
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_invoice_updated_at
BEFORE UPDATE ON invoices
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_referral_updated_at
BEFORE UPDATE ON referrals
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
-- Create indexes for better query performance
CREATE INDEX idx_appointments_patient_id ON appointments(patient_id);
CREATE INDEX idx_appointments_doctor_id ON appointments(doctor_id);
CREATE INDEX idx_appointments_nurse_id ON appointments(nurse_id);
CREATE INDEX idx_vital_signs_appointment_id ON vital_signs(appointment_id);
CREATE INDEX idx_invoices_appointment_id ON invoices(appointment_id);
CREATE INDEX idx_referrals_appointment_id ON referrals(appointment_id);