import './leave_model.dart'; import '../services/generic_api_service.dart'; import 'package:intl/intl.dart'; import '../auth_manager.dart'; // 確保引入 AuthManager class LeaveApiService { final GenericApiService _apiService = GenericApiService(); // 新增:獲取所有啟用的假別清單 Future> fetchLeaveTypes() async { // 這裡通常不需要特別的 filter,或可根據公司邏輯過濾性別等 return await _apiService.fetchList( tableName: "hrs_leavetype", pk: "leavetype_id", queryFilter: "1^100^leavetype_id^*^^^", // 取得前100筆 fromJson: (json) => LeaveType.fromJson(json), ); } // 查詢員工清單 (代理人) Future>> fetchEmployees(String keyword) async { // 1. 設定查詢過濾器 (依據 Generic API 規範) // 格式:當前頁^每頁筆數^排序欄位^關鍵字欄位^關鍵字內容 // 我們同時搜尋姓名(personcname)或工號(personid) String queryFilter = "1^50^personid^*^^^personcname^$keyword"; final List result = await _apiService.fetchList( tableName: "basperson", // 指向員工主檔 pk: "personid", queryFilter: queryFilter, fromJson: (json) => json, ); // 2. 轉換並確保回傳正確的欄位映射 return result.map((e) => { 'id': e['personid'] ?? '', 'name': e['personcname'] ?? '', 'dept': e['departmentid'] ?? '', }).toList(); } // 獲取個人請假紀錄 Future> fetchLeaves(String personId) async { // 排序:按單據日期降冪 String queryFilter = "1^100^billdate^*^start_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)^^personid^$personId"; return await _apiService.fetchList( tableName: "hrs_leave", pk: "billno", queryFilter: queryFilter, fromJson: (json) => Leave.fromJson(json), ); } // 提交請假單 (新增) //Future createLeave(Leave leave) async { Future> createLeave(Leave leave) async { final String currentUid = AuthManager().currentUserId ?? leave.personId; final Map data = { "billdate": DateFormat('yyyy-MM-dd HH:mm:ss').format(DateTime.now()), "billno": "LV${DateTime.now().millisecondsSinceEpoch}", // 範例編號 "personid": currentUid, "agentid": leave.agentId, "leavetype": leave.leaveType, "starttime": DateFormat('yyyy-MM-dd HH:mm:ss').format(leave.startTime!), "endtime": DateFormat('yyyy-MM-dd HH:mm:ss').format(leave.endTime!), "days": leave.days, "hours": leave.hours, "leave_note": leave.leaveNote, "flow_status": "1", // 提交即進入審核中 "create_user": currentUid, "create_date": DateFormat('yyyy-MM-dd HH:mm:ss').format(DateTime.now()), // Sync calc "start_date": DateFormat('yyyy-MM-dd').format(leave.startTime!), "end_date": DateFormat('yyyy-MM-dd').format(leave.endTime!), "start_time": DateFormat('HH:mm').format(leave.startTime!), "end_time": DateFormat('HH:mm').format(leave.endTime!), }; return await _apiService.fetchList( tableName: "hrs_leave", pk: "ClockInId", queryFilter: "", // 通常新增不需要 filter,依後端 API 協議而定 action: "C", // 傳入您指定的動作碼 'C' (Create) data: data, // 將打卡欄位資料透過額外參數傳入 fromJson: (json) => Leave.fromJson(json), // 這裡填入模型的解析工廠 ); } // 修正 5: 實作撤回請假單 API Future withdrawLeave(String billNo) async { try { await _apiService.fetchList( tableName: "hrs_leave", pk: "billno", queryFilter: "billno^$billNo", // 指定該單號 action: "U", // U 代表 Update data: { "flow_status": "0", // 0: 退回草稿/已撤回 "update_user": AuthManager().currentUserId, "update_date": DateFormat('yyyy-MM-dd HH:mm:ss').format(DateTime.now()), }, fromJson: (json) => json, ); return true; } catch (e) { print("撤回失敗: $e"); return false; } } // 修正 3: 查詢簽核進度 (FlowLog) Future> fetchFlowLogs(String billNo) async { // 假設有一張表 flow_log 記錄簽核歷程 return await _apiService.fetchList( tableName: "flow_log", pk: "log_id", queryFilter: "1^50^create_date^*^^^billno^$billNo", fromJson: (json) => FlowLog( stepName: json['step_name'] ?? '簽核節點', approverName: json['approver_name'] ?? '系統/主管', status: json['status'] ?? '0', time: json['create_date'] != null ? DateTime.tryParse(json['create_date']) : null, ), ); } }