پایگاه داده — تسک ۱۵: پرونده بیمار
جدول: patient_records
| ستون |
نوع |
توضیح |
| id |
INT UNSIGNED AUTO_INCREMENT PK |
|
| uuid |
CHAR(36) UNIQUE NOT NULL |
|
| entity_type |
VARCHAR(10) NOT NULL |
'doctor' | 'clinic' |
| entity_id |
INT NOT NULL |
|
| user_id |
INT NOT NULL FK→users.id ON DELETE RESTRICT |
بیمار |
| created_by_type |
VARCHAR(15) NOT NULL |
'doctor' | 'secretary' | 'system' |
| created_by_id |
INT NOT NULL |
id ایجادکننده |
| created_at |
INT NOT NULL |
|
جدول: patient_sessions
| ستون |
نوع |
توضیح |
| id |
INT UNSIGNED AUTO_INCREMENT PK |
|
| uuid |
CHAR(36) UNIQUE NOT NULL |
|
| record_id |
INT NOT NULL FK→patient_records.id ON DELETE CASCADE |
|
| appointment_id |
INT NULL FK→appointments.id ON DELETE SET NULL |
|
| insurance_base_id |
INT NULL FK→categories.id ON DELETE SET NULL |
بیمه پایه |
| insurance_supplementary_id |
INT NULL FK→categories.id ON DELETE SET NULL |
بیمه مکمل |
| visit_price_rials |
INT NOT NULL DEFAULT 0 |
|
| base_insurance_discount_percent |
DECIMAL(5,2) NOT NULL DEFAULT 0 |
|
| supplementary_discount_percent |
DECIMAL(5,2) NOT NULL DEFAULT 0 |
|
| services_total_rials |
INT NOT NULL DEFAULT 0 |
کپی محاسبهشده |
| final_price_rials |
INT NOT NULL DEFAULT 0 |
|
| payment_method |
VARCHAR(15) NOT NULL DEFAULT 'pending' |
'cash'|'card'|'insurance'|'pending' |
| notes |
TEXT NULL |
|
| created_at |
INT NOT NULL |
|
| updated_at |
INT NOT NULL |
|
جدول: session_services
| ستون |
نوع |
توضیح |
| id |
INT UNSIGNED AUTO_INCREMENT PK |
|
| uuid |
CHAR(36) UNIQUE NOT NULL |
|
| session_id |
INT NOT NULL FK→patient_sessions.id ON DELETE CASCADE |
|
| service_item_id |
INT NOT NULL FK→service_items.id ON DELETE RESTRICT |
|
| staff_id |
INT NULL FK→clinic_staff.id ON DELETE SET NULL |
|
| price_rials |
INT NOT NULL |
کپی قیمت در زمان ثبت |
| created_at |
INT NOT NULL |
|
Migration نمونه
CREATE TABLE patient_records (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
uuid CHAR(36) NOT NULL UNIQUE,
entity_type VARCHAR(10) NOT NULL,
entity_id INT NOT NULL,
user_id INT NOT NULL,
created_by_type VARCHAR(15) NOT NULL,
created_by_id INT NOT NULL,
created_at INT NOT NULL,
UNIQUE KEY uniq_patient_record (entity_type, entity_id, user_id),
INDEX idx_patient_records_entity (entity_type, entity_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE patient_sessions (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
uuid CHAR(36) NOT NULL UNIQUE,
record_id INT NOT NULL,
appointment_id INT NULL,
insurance_base_id INT NULL,
insurance_supplementary_id INT NULL,
visit_price_rials INT NOT NULL DEFAULT 0,
base_insurance_discount_percent DECIMAL(5,2) NOT NULL DEFAULT 0,
supplementary_discount_percent DECIMAL(5,2) NOT NULL DEFAULT 0,
services_total_rials INT NOT NULL DEFAULT 0,
final_price_rials INT NOT NULL DEFAULT 0,
payment_method VARCHAR(15) NOT NULL DEFAULT 'pending',
notes TEXT NULL,
created_at INT NOT NULL,
updated_at INT NOT NULL,
FOREIGN KEY (record_id) REFERENCES patient_records(id) ON DELETE CASCADE,
FOREIGN KEY (appointment_id) REFERENCES appointments(id) ON DELETE SET NULL,
FOREIGN KEY (insurance_base_id) REFERENCES categories(id) ON DELETE SET NULL,
FOREIGN KEY (insurance_supplementary_id) REFERENCES categories(id) ON DELETE SET NULL,
INDEX idx_patient_sessions_record (record_id, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE session_services (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
uuid CHAR(36) NOT NULL UNIQUE,
session_id INT NOT NULL,
service_item_id INT NOT NULL,
staff_id INT NULL,
price_rials INT NOT NULL,
created_at INT NOT NULL,
FOREIGN KEY (session_id) REFERENCES patient_sessions(id) ON DELETE CASCADE,
FOREIGN KEY (service_item_id) REFERENCES service_items(id) ON DELETE RESTRICT,
FOREIGN KEY (staff_id) REFERENCES clinic_staff(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
نکات مهم
- UNIQUE(entity_type, entity_id, user_id) — یک بیمار یک پرونده در هر کلینیک/مطب دارد
- price_rials در session_services کپی میشود — تغییر قیمت سرویس در آینده روی سشنهای قبلی اثر ندارد
- services_total_rials و final_price_rials در PatientSession کپی محاسبهشده هستند — برای گزارشگیری سریع
- user_id ON DELETE RESTRICT — نمیتوان کاربری را که پرونده دارد حذف کرد