-- =====================================================================
-- 2026_sprint13_wage_rules.sql — اسپرینت ۱۳ (Mission 4)
-- سیستمِ دستمزدِ پرستار مبتنی بر «مبلغِ ثابتِ نقش‌محور» + استثناها + ردپا
--   nurse_wage_rules       : قانونِ دستمزدِ هر پروسیجر (مبلغِ هر نقش + حالتِ محاسبه)
--   nurse_wage_adjustments : پاداش/کسر/بازنویسیِ دستیِ مالی (بدونِ دست‌زدن به دادهٔ بالینی)
--   wage_audit_log         : ردپای تغییراتِ قانون/استثنا
--   role_type='co_primary' : نفرِ دومِ انجام‌دهنده (جدا از ED) — role_type از قبل VARCHAR است
-- افزایشی و اجرای مجدد امن. دیتابیس: shadicli_nurse
-- =====================================================================
SET NAMES utf8mb4;

-- ۱) قانونِ دستمزدِ هر پروسیجر (مبلغِ ثابت به تومان، به تفکیکِ نقش)
CREATE TABLE IF NOT EXISTS `nurse_wage_rules` (
  `id`                INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `procedure_id`      INT UNSIGNED NOT NULL,
  `primary_fee`       DECIMAL(14,0) NOT NULL DEFAULT 0,   -- انجام‌دهنده اصلی
  `assist_doctor_fee` DECIMAL(14,0) NOT NULL DEFAULT 0,   -- ED کنار پزشک
  `assist_nurse_fee`  DECIMAL(14,0) NOT NULL DEFAULT 0,   -- ED کنار پرستار
  `co_primary_fee`    DECIMAL(14,0) NOT NULL DEFAULT 0,   -- نفرِ دومِ انجام‌دهنده (co-primary)
  `calculation_mode`  ENUM('per_person','split_total','percent_split') NOT NULL DEFAULT 'per_person',
  `primary_percent`   DECIMAL(5,2) NOT NULL DEFAULT 50,   -- برای percent_split: سهمِ نفرِ اصلی
  `active`            TINYINT(1) NOT NULL DEFAULT 1,
  `effective_from`    DATE NULL DEFAULT NULL,
  `effective_to`      DATE NULL DEFAULT NULL,
  `created_by`        INT UNSIGNED NULL,
  `updated_by`        INT UNSIGNED NULL,
  `created_at`        DATETIME NULL,
  `updated_at`        DATETIME NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_proc_active` (`procedure_id`,`active`),
  KEY `idx_proc` (`procedure_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ۲) استثنا/اصلاحِ دستیِ مالی (فقط پرداخت؛ رکوردِ بالینی دست‌نخورده)
CREATE TABLE IF NOT EXISTS `nurse_wage_adjustments` (
  `id`                   INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `record_id`            INT UNSIGNED NULL,
  `record_procedure_id`  INT UNSIGNED NULL,
  `nurse_id`             INT UNSIGNED NOT NULL,
  `adjustment_type`      ENUM('bonus','deduction','override') NOT NULL,
  `amount`               DECIMAL(14,0) NOT NULL DEFAULT 0,
  `note`                 VARCHAR(400) NULL,
  `adj_date`             DATE NULL,
  `created_by`           INT UNSIGNED NULL,
  `created_at`           DATETIME NULL,
  PRIMARY KEY (`id`),
  KEY `idx_nurse` (`nurse_id`),
  KEY `idx_record` (`record_id`),
  KEY `idx_rp` (`record_procedure_id`),
  KEY `idx_date` (`adj_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ۳) ردپای تغییراتِ دستمزد (قانون/استثنا) — مکملِ activity_logs
CREATE TABLE IF NOT EXISTS `wage_audit_log` (
  `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id`    INT UNSIGNED NULL,
  `action`     VARCHAR(60) NOT NULL,          -- wage_rule_save / wage_adj_add / wage_adj_delete
  `ref_type`   VARCHAR(40) NULL,              -- procedure / adjustment
  `ref_id`     INT UNSIGNED NULL,
  `detail`     TEXT NULL,
  `created_at` DATETIME NULL,
  PRIMARY KEY (`id`),
  KEY `idx_action` (`action`),
  KEY `idx_ref` (`ref_type`,`ref_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ۴) عمداً هیچ کاربر، رمز خام یا هشِ رمزی در migration ساخته نمی‌شود.
-- پس از اجرا، کاربر مالی را از صفحهٔ users.php بسازید و دسترسی‌های finance.*،
-- reports.nurse_performance، export.nurse_wages، reports، export و records.view_today را تخصیص دهید.

-- =====================================================================
-- ROLLBACK:
-- DROP TABLE IF EXISTS `nurse_wage_rules`;
-- DROP TABLE IF EXISTS `nurse_wage_adjustments`;
-- DROP TABLE IF EXISTS `wage_audit_log`;
-- =====================================================================
