Files
clinicpro/docs/phase2_taskes/task-15-patient-records/database.md
T

5.3 KiB

پایگاه داده — تسک ۱۵: پرونده بیمار

جدول: 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
UNIQUE KEY uniq_patient_record (entity_type, entity_id, user_id)
INDEX idx_patient_records_entity (entity_type, entity_id)

جدول: 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
INDEX idx_patient_sessions_record (record_id, created_at)

جدول: 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 — نمی‌توان کاربری را که پرونده دارد حذف کرد