-- ============================================================
-- 薪资拆分明细表 + 考勤数据表 建表SQL
-- 创建时间: 2026-07-29
-- 数据来源: 薪资拆分明细表_脱敏.xlsx / 考勤数据表-脱敏.xlsx
-- 导入规则: 遵循现有 import_log + records 模式
-- ============================================================

-- ============================================================
-- 一、薪资拆分明细表
-- ============================================================

-- 1. 导入日志表
CREATE TABLE IF NOT EXISTS public.salary_import_log (
  import_id        BIGSERIAL PRIMARY KEY,
  report_month     DATE NOT NULL,
  source_file      TEXT NOT NULL,
  file_sha256      TEXT NOT NULL,
  workbook_rows    INTEGER,
  imported_rows    INTEGER,
  imported_at      TIMESTAMPTZ NOT NULL DEFAULT now(),
  UNIQUE(report_month, source_file, file_sha256)
);

-- 2. 薪资明细记录表
CREATE TABLE IF NOT EXISTS public.salary_detail_records (
  record_id        BIGSERIAL PRIMARY KEY,
  import_id        BIGINT NOT NULL REFERENCES public.salary_import_log(import_id) ON DELETE CASCADE,
  source_row       INTEGER NOT NULL,

  -- 组织层级
  org_level1       TEXT,
  org_level2       TEXT,
  org_level3       TEXT,
  org_level4       TEXT,
  org_level5       TEXT,   -- 门店名
  org_level6       TEXT,
  org_level7       TEXT,
  org_level8       TEXT,

  -- 员工信息
  employee_code    TEXT NOT NULL,
  salary_period    TEXT,
  position         TEXT,
  work_type        TEXT,
  employment_type  TEXT,
  hire_date        TEXT,
  leave_date       TEXT,

  -- 工资构成
  salary_standard  NUMERIC(18,2) DEFAULT 0,   -- 工资额度
  base_wage        NUMERIC(18,2) DEFAULT 0,   -- 基本工资
  overtime_subsidy NUMERIC(18,2) DEFAULT 0,   -- 加班补贴
  social_subsidy   NUMERIC(18,2) DEFAULT 0,   -- 社保补贴
  position_wage    NUMERIC(18,2) DEFAULT 0,   -- 岗位工资
  tenure_wage      NUMERIC(18,2) DEFAULT 0,   -- 工龄工资
  hourly_rate      NUMERIC(18,2) DEFAULT 0,   -- 时薪
  total_wage       NUMERIC(18,2) DEFAULT 0,   -- 工资总额
  brand_wage       NUMERIC(18,2) DEFAULT 0,   -- 品牌工资
  rent_subsidy     NUMERIC(18,2) DEFAULT 0,   -- 租房补贴

  -- 出勤信息
  month_days       NUMERIC(18,2) DEFAULT 0,   -- 本月天数
  expected_attend  NUMERIC(18,2) DEFAULT 0,   -- 应出勤天数
  calc_attend      NUMERIC(18,2) DEFAULT 0,   -- 算薪天数
  actual_attend    NUMERIC(18,2) DEFAULT 0,   -- 实出勤天数
  actual_hours     NUMERIC(18,2) DEFAULT 0,   -- 实际出勤时长
  expected_rest    NUMERIC(18,2) DEFAULT 0,   -- 应休公休天数
  actual_rest      NUMERIC(18,2) DEFAULT 0,   -- 实公休天数
  expected_legal_holiday NUMERIC(18,2) DEFAULT 0,
  actual_legal_holiday   NUMERIC(18,2) DEFAULT 0,
  comp_leave_days  NUMERIC(18,2) DEFAULT 0,   -- 调休天数
  annual_leave     NUMERIC(18,2) DEFAULT 0,   -- 年假天数
  marriage_leave   NUMERIC(18,2) DEFAULT 0,
  paid_leave       NUMERIC(18,2) DEFAULT 0,
  bereavement_leave NUMERIC(18,2) DEFAULT 0,
  personal_leave_days NUMERIC(18,2) DEFAULT 0,
  personal_leave_deduction NUMERIC(18,2) DEFAULT 0,
  furlough_days    NUMERIC(18,2) DEFAULT 0,
  furlough_deduction NUMERIC(18,2) DEFAULT 0,
  injury_leave_days NUMERIC(18,2) DEFAULT 0,
  injury_leave_deduction NUMERIC(18,2) DEFAULT 0,
  absent_days      NUMERIC(18,2) DEFAULT 0,   -- 旷工天数
  absent_deduction NUMERIC(18,2) DEFAULT 0,
  join_leave_absent NUMERIC(18,2) DEFAULT 0,

  -- 薪资计算
  attendance_wage  NUMERIC(18,2) DEFAULT 0,   -- 出勤薪资
  rest_subsidy     NUMERIC(18,2) DEFAULT 0,   -- 公休补助
  overtime_pay     NUMERIC(18,2) DEFAULT 0,   -- 加班
  shift_subsidy    NUMERIC(18,2) DEFAULT 0,   -- 班次补贴
  comp_leave_wage  NUMERIC(18,2) DEFAULT 0,
  cashier_amount   NUMERIC(18,2) DEFAULT 0,   -- 收银金额
  bonus            NUMERIC(18,2) DEFAULT 0,   -- 奖励
  subsidy          NUMERIC(18,2) DEFAULT 0,   -- 补助
  subsidy_remark   TEXT,
  rush_wage        NUMERIC(18,2) DEFAULT 0,   -- 抢班工资
  total_supplement NUMERIC(18,2) DEFAULT 0,   -- 应补合计
  late_deduction   NUMERIC(18,2) DEFAULT 0,   -- 迟到早退扣款
  no_punch_deduction NUMERIC(18,2) DEFAULT 0, -- 未打卡扣款
  internal_social_total NUMERIC(18,2) DEFAULT 0,
  internal_social_remark TEXT,
  loan             NUMERIC(18,2) DEFAULT 0,
  loan_remark      TEXT,
  fine             NUMERIC(18,2) DEFAULT 0,
  compensation     NUMERIC(18,2) DEFAULT 0,
  total_deduction  NUMERIC(18,2) DEFAULT 0,   -- 应扣合计
  injury_wage      NUMERIC(18,2) DEFAULT 0,
  singapore_subsidy NUMERIC(18,2) DEFAULT 0,

  -- 绩效
  perf_standard    NUMERIC(18,2) DEFAULT 0,
  perf_score       NUMERIC(18,2) DEFAULT 0,
  perf_amount      NUMERIC(18,2) DEFAULT 0,

  -- 其他
  phone_allowance  NUMERIC(18,2) DEFAULT 0,
  dorm_fee         NUMERIC(18,2) DEFAULT 0,
  net_salary       NUMERIC(18,2) DEFAULT 0,   -- 实得薪资
  gross_pay        NUMERIC(18,2) DEFAULT 0,   -- 应发工资
  income_tax       NUMERIC(18,2) DEFAULT 0,   -- 个人所得税
  net_pay          NUMERIC(18,2) DEFAULT 0,   -- 实发工资

  -- 外账
  external_base_standard NUMERIC(18,2) DEFAULT 0,
  external_overtime NUMERIC(18,2) DEFAULT 0,
  external_absence NUMERIC(18,2) DEFAULT 0,
  external_bonus   NUMERIC(18,2) DEFAULT 0,
  external_subsidy NUMERIC(18,2) DEFAULT 0,
  external_other_deduction NUMERIC(18,2) DEFAULT 0,
  external_gross   NUMERIC(18,2) DEFAULT 0,
  pension_deduction NUMERIC(18,2) DEFAULT 0,
  medical_deduction NUMERIC(18,2) DEFAULT 0,
  unemployment_deduction NUMERIC(18,2) DEFAULT 0,
  external_social_total NUMERIC(18,2) DEFAULT 0,
  external_tax     NUMERIC(18,2) DEFAULT 0,
  external_net     NUMERIC(18,2) DEFAULT 0,
  internal_tax     NUMERIC(18,2) DEFAULT 0,
  internal_net     NUMERIC(18,2) DEFAULT 0,

  -- 其他字段
  external_unit    TEXT,
  attendance_remark TEXT,    -- 考勤备注_店长填写
  employment_type_orig TEXT, -- 雇佣类型
  salary_category  TEXT,     -- 薪酬类别

  imported_at      TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_salary_import_id ON public.salary_detail_records(import_id);
CREATE INDEX IF NOT EXISTS idx_salary_employee ON public.salary_detail_records(employee_code);
CREATE INDEX IF NOT EXISTS idx_salary_org5 ON public.salary_detail_records(org_level5);
CREATE INDEX IF NOT EXISTS idx_salary_period ON public.salary_detail_records(salary_period);

-- ============================================================
-- 二、考勤数据表
-- ============================================================

-- 1. 导入日志表
CREATE TABLE IF NOT EXISTS public.attendance_import_log (
  import_id        BIGSERIAL PRIMARY KEY,
  report_month     DATE NOT NULL,
  source_file      TEXT NOT NULL,
  file_sha256      TEXT NOT NULL,
  workbook_rows    INTEGER,
  imported_rows    INTEGER,
  imported_at      TIMESTAMPTZ NOT NULL DEFAULT now(),
  UNIQUE(report_month, source_file, file_sha256)
);

-- 2. 考勤记录表（宽表：工号×日期）
CREATE TABLE IF NOT EXISTS public.attendance_records (
  record_id        BIGSERIAL PRIMARY KEY,
  import_id        BIGINT NOT NULL REFERENCES public.attendance_import_log(import_id) ON DELETE CASCADE,
  source_row       INTEGER NOT NULL,
  employee_code    TEXT NOT NULL,
  position         TEXT,
  department       TEXT,    -- 所在部门
  day_01           TEXT,
  day_02           TEXT,
  day_03           TEXT,
  day_04           TEXT,
  day_05           TEXT,
  day_06           TEXT,
  day_07           TEXT,
  day_08           TEXT,
  day_09           TEXT,
  day_10           TEXT,
  day_11           TEXT,
  day_12           TEXT,
  day_13           TEXT,
  day_14           TEXT,
  day_15           TEXT,
  day_16           TEXT,
  day_17           TEXT,
  day_18           TEXT,
  day_19           TEXT,
  day_20           TEXT,
  day_21           TEXT,
  day_22           TEXT,
  day_23           TEXT,
  day_24           TEXT,
  day_25           TEXT,
  day_26           TEXT,
  day_27           TEXT,
  day_28           TEXT,
  day_29           TEXT,
  day_30           TEXT,
  day_31           TEXT,
  imported_at      TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_attendance_import_id ON public.attendance_records(import_id);
CREATE INDEX IF NOT EXISTS idx_attendance_employee ON public.attendance_records(employee_code);
