-- 考勤设置相关表创建脚本
-- 执行库：lqerp_dev / lqerp
-- 用途：支持考勤设置页面、公休时间、考勤分组、假期规则、迟到/缺卡/旷工规则、免考勤人员设置
-- 注意：MySQL 不支持 ALTER TABLE ... ADD COLUMN IF NOT EXISTS / ADD INDEX IF NOT EXISTS
-- 所以这里改为 information_schema 判断后再动态执行，兼容老版本 MySQL

SET @db_name = DATABASE();

SET @attendance_group_col_exists = (
  SELECT COUNT(1)
  FROM information_schema.COLUMNS
  WHERE TABLE_SCHEMA = @db_name
    AND TABLE_NAME = 'BASE_USER'
    AND COLUMN_NAME = 'F_AttendanceGroupId'
);
SET @attendance_group_col_sql = IF(
  @attendance_group_col_exists = 0,
  'ALTER TABLE `BASE_USER` ADD COLUMN `F_AttendanceGroupId` varchar(50) DEFAULT NULL COMMENT ''考勤分组ID'' AFTER `F_GW`;',
  'SELECT ''BASE_USER.F_AttendanceGroupId 已存在'';'
);
PREPARE stmt_attendance_group_col FROM @attendance_group_col_sql;
EXECUTE stmt_attendance_group_col;
DEALLOCATE PREPARE stmt_attendance_group_col;

SET @attendance_group_idx_exists = (
  SELECT COUNT(1)
  FROM information_schema.STATISTICS
  WHERE TABLE_SCHEMA = @db_name
    AND TABLE_NAME = 'BASE_USER'
    AND INDEX_NAME = 'idx_attendance_group_id'
);
SET @attendance_group_idx_sql = IF(
  @attendance_group_idx_exists = 0,
  'ALTER TABLE `BASE_USER` ADD INDEX `idx_attendance_group_id` (`F_AttendanceGroupId`);',
  'SELECT ''idx_attendance_group_id 已存在'';'
);
PREPARE stmt_attendance_group_idx FROM @attendance_group_idx_sql;
EXECUTE stmt_attendance_group_idx;
DEALLOCATE PREPARE stmt_attendance_group_idx;

CREATE TABLE IF NOT EXISTS `lq_attendance_setting` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_LeaveDeductDailySalaryRate` decimal(18,2) NOT NULL DEFAULT 1.00 COMMENT '请假扣款日薪倍率',
  `F_SickLeaveDeductDailySalaryRate` decimal(18,2) NOT NULL DEFAULT 1.00 COMMENT '病假扣款日薪倍率',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  `F_CreateUserId` varchar(50) DEFAULT NULL COMMENT '创建人ID',
  PRIMARY KEY (`F_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤设置主表';

CREATE TABLE IF NOT EXISTS `lq_attendance_holiday` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_HolidayDate` datetime NOT NULL COMMENT '公休日期',
  `F_HolidayName` varchar(100) DEFAULT NULL COMMENT '公休名称',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  `F_CreateUserId` varchar(50) DEFAULT NULL COMMENT '创建人ID',
  PRIMARY KEY (`F_Id`),
  KEY `idx_holiday_date` (`F_HolidayDate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤公休日期表';

CREATE TABLE IF NOT EXISTS `lq_attendance_group` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_GroupName` varchar(100) NOT NULL COMMENT '分组名称',
  `F_WorkStartTime` varchar(10) NOT NULL COMMENT '上班打卡时间',
  `F_WorkEndTime` varchar(10) NOT NULL COMMENT '下班打卡时间',
  `F_MonthlyRestDays` int NOT NULL DEFAULT 0 COMMENT '月应休天数',
  `F_HalfDaySplitRestDays` int NOT NULL DEFAULT 0 COMMENT '可拆分半天休假天数',
  `F_IsEnabled` int NOT NULL DEFAULT 1 COMMENT '是否启用（1-启用，0-禁用）',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  `F_CreateUserId` varchar(50) DEFAULT NULL COMMENT '创建人ID',
  PRIMARY KEY (`F_Id`),
  KEY `idx_group_name` (`F_GroupName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤分组表';

CREATE TABLE IF NOT EXISTS `lq_attendance_exempt_user` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_UserId` varchar(50) NOT NULL COMMENT '用户ID',
  `F_UserName` varchar(100) DEFAULT NULL COMMENT '用户姓名',
  `F_StartDate` datetime DEFAULT NULL COMMENT '生效开始日期',
  `F_EndDate` datetime DEFAULT NULL COMMENT '生效结束日期',
  `F_IsEnabled` int NOT NULL DEFAULT 1 COMMENT '是否启用（1-启用，0-禁用）',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  `F_CreateUserId` varchar(50) DEFAULT NULL COMMENT '创建人ID',
  PRIMARY KEY (`F_Id`),
  KEY `idx_exempt_user` (`F_UserId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='免考勤人员表';

CREATE TABLE IF NOT EXISTS `lq_attendance_extra_leave` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_UserId` varchar(50) NOT NULL COMMENT '用户ID',
  `F_UserName` varchar(100) DEFAULT NULL COMMENT '用户姓名',
  `F_LeaveName` varchar(100) NOT NULL COMMENT '额外假期名称',
  `F_GrantYear` int NOT NULL COMMENT '归属年份',
  `F_ExtraDays` decimal(18,2) NOT NULL DEFAULT 0.00 COMMENT '额外假期天数',
  `F_IsEnabled` int NOT NULL DEFAULT 1 COMMENT '是否启用（1-启用，0-禁用）',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  `F_CreateUserId` varchar(50) DEFAULT NULL COMMENT '创建人ID',
  PRIMARY KEY (`F_Id`),
  KEY `idx_extra_leave_user` (`F_UserId`),
  KEY `idx_extra_leave_year` (`F_GrantYear`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工额外假期配置表';

CREATE TABLE IF NOT EXISTS `lq_attendance_marriage_leave_rule` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_MinYears` int NOT NULL COMMENT '最小司龄（含）',
  `F_MaxYears` int DEFAULT NULL COMMENT '最大司龄（不含）',
  `F_LeaveDays` int NOT NULL DEFAULT 0 COMMENT '婚假天数',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`F_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='婚假规则表';

CREATE TABLE IF NOT EXISTS `lq_attendance_funeral_leave_rule` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_MinYears` int NOT NULL COMMENT '最小司龄（含）',
  `F_MaxYears` int DEFAULT NULL COMMENT '最大司龄（不含）',
  `F_DirectRelativeDays` int NOT NULL DEFAULT 0 COMMENT '直系亲属丧假天数',
  `F_IndirectRelativeDays` int NOT NULL DEFAULT 0 COMMENT '非直系亲属丧假天数',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`F_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='丧假规则表';

CREATE TABLE IF NOT EXISTS `lq_attendance_annual_leave_rule` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_MinYears` int NOT NULL COMMENT '最小司龄（含）',
  `F_MaxYears` int DEFAULT NULL COMMENT '最大司龄（不含）',
  `F_LeaveDays` int NOT NULL DEFAULT 0 COMMENT '年假天数',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`F_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='年假规则表';

CREATE TABLE IF NOT EXISTS `lq_attendance_maternity_leave_rule` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_MinYears` int NOT NULL COMMENT '最小司龄（含）',
  `F_MaxYears` int DEFAULT NULL COMMENT '最大司龄（不含）',
  `F_LeaveDays` int NOT NULL DEFAULT 0 COMMENT '产假天数',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`F_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产假规则表';

CREATE TABLE IF NOT EXISTS `lq_attendance_late_rule` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_MinMinutes` int NOT NULL COMMENT '最小迟到分钟（含）',
  `F_MaxMinutes` int DEFAULT NULL COMMENT '最大迟到分钟（不含）',
  `F_DeductMode` int NOT NULL COMMENT '扣款方式',
  `F_DeductValue` decimal(18,2) NOT NULL DEFAULT 0.00 COMMENT '扣款值',
  `F_ExpressionText` varchar(255) DEFAULT NULL COMMENT '展示说明',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`F_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='迟到扣款规则表';

CREATE TABLE IF NOT EXISTS `lq_attendance_missing_card_rule` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_MinCount` int NOT NULL COMMENT '最小缺卡次数（含）',
  `F_MaxCount` int DEFAULT NULL COMMENT '最大缺卡次数（不含）',
  `F_DeductPerTime` decimal(18,2) NOT NULL DEFAULT 0.00 COMMENT '每次扣款金额',
  `F_ExpressionText` varchar(255) DEFAULT NULL COMMENT '展示说明',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`F_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缺卡扣款规则表';

CREATE TABLE IF NOT EXISTS `lq_attendance_absenteeism_rule` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_MinDays` decimal(18,2) NOT NULL COMMENT '最小旷工天数（含）',
  `F_MaxDays` decimal(18,2) DEFAULT NULL COMMENT '最大旷工天数（不含）',
  `F_DeductMode` int DEFAULT NULL COMMENT '扣款方式',
  `F_DeductValue` decimal(18,2) DEFAULT NULL COMMENT '扣款值',
  `F_ActionType` int NOT NULL COMMENT '处理方式',
  `F_ActionText` varchar(255) DEFAULT NULL COMMENT '展示说明',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SortCode` int NOT NULL DEFAULT 0 COMMENT '排序',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`F_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='旷工规则表';

CREATE TABLE IF NOT EXISTS `lq_attendance_record` (
  `F_Id` varchar(50) NOT NULL COMMENT '主键ID',
  `F_UserId` varchar(50) NOT NULL COMMENT '员工ID',
  `F_EmployeeName` varchar(100) DEFAULT NULL COMMENT '员工姓名快照',
  `F_StoreId` varchar(50) DEFAULT NULL COMMENT '门店ID快照',
  `F_StoreName` varchar(100) DEFAULT NULL COMMENT '门店名称快照',
  `F_AttendanceGroupId` varchar(50) DEFAULT NULL COMMENT '考勤分组ID快照',
  `F_AttendanceGroupName` varchar(100) DEFAULT NULL COMMENT '考勤分组名称快照',
  `F_AttendanceDate` date NOT NULL COMMENT '打卡日期',
  `F_PunchInTime` datetime DEFAULT NULL COMMENT '上班打卡时间',
  `F_PunchOutTime` datetime DEFAULT NULL COMMENT '下班打卡时间',
  `F_PunchInType` int DEFAULT NULL COMMENT '上班打卡类型（1正常上班，2外勤）',
  `F_PunchOutType` int DEFAULT NULL COMMENT '下班打卡类型（1正常上班，2外勤）',
  `F_PunchInLongitude` decimal(18,6) DEFAULT NULL COMMENT '上班打卡经度',
  `F_PunchInLatitude` decimal(18,6) DEFAULT NULL COMMENT '上班打卡纬度',
  `F_PunchInAddress` varchar(500) DEFAULT NULL COMMENT '上班打卡地址',
  `F_PunchInPhotoUrl` varchar(500) DEFAULT NULL COMMENT '上班打卡照片地址',
  `F_PunchOutLongitude` decimal(18,6) DEFAULT NULL COMMENT '下班打卡经度',
  `F_PunchOutLatitude` decimal(18,6) DEFAULT NULL COMMENT '下班打卡纬度',
  `F_PunchOutAddress` varchar(500) DEFAULT NULL COMMENT '下班打卡地址',
  `F_PunchOutPhotoUrl` varchar(500) DEFAULT NULL COMMENT '下班打卡照片地址',
  `F_IsPunchInFenceValid` int DEFAULT NULL COMMENT '上班打卡是否通过围栏校验（1通过0未通过）',
  `F_IsPunchOutFenceValid` int DEFAULT NULL COMMENT '下班打卡是否通过围栏校验（1通过0未通过）',
  `F_Status` int NOT NULL COMMENT '打卡状态（1正常，2迟到，3休息，4请假，5病假，6缺卡，7旷工）',
  `F_LateMinutes` int NOT NULL DEFAULT 0 COMMENT '迟到分钟数',
  `F_EarlyLeaveMinutes` int NOT NULL DEFAULT 0 COMMENT '早退分钟数',
  `F_IsManual` int NOT NULL DEFAULT 0 COMMENT '是否手动补录（1是0否）',
  `F_Remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `F_SupplementRemark` varchar(500) DEFAULT NULL COMMENT '补卡备注',
  `F_SupplementOperatorId` varchar(50) DEFAULT NULL COMMENT '补卡操作人ID',
  `F_SupplementOperatorName` varchar(100) DEFAULT NULL COMMENT '补卡操作人姓名',
  `F_SupplementTime` datetime DEFAULT NULL COMMENT '补卡操作时间',
  `F_SupplementWorkflowId` varchar(50) DEFAULT NULL COMMENT '关联补卡流程ID',
  `F_RelatedWorkflowsJson` longtext COMMENT '关联流程JSON（所有与该考勤记录关联的流程信息，含请假/补卡等）',
  `F_CreateUserId` varchar(50) DEFAULT NULL COMMENT '创建人ID',
  `F_CreateTime` datetime DEFAULT NULL COMMENT '创建时间',
  `F_UpdateUserId` varchar(50) DEFAULT NULL COMMENT '更新人ID',
  `F_UpdateTime` datetime DEFAULT NULL COMMENT '更新时间',
  `F_IsEffective` int NOT NULL DEFAULT 1 COMMENT '是否有效（1有效0无效）',
  PRIMARY KEY (`F_Id`),
  UNIQUE KEY `uk_attendance_record_user_date` (`F_UserId`, `F_AttendanceDate`),
  KEY `idx_attendance_record_month_group` (`F_AttendanceDate`, `F_AttendanceGroupId`),
  KEY `idx_attendance_record_store` (`F_StoreId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤打卡记录表';
