telegramService = $telegramService; $this->chatId = $chatId; $this->userId = $userId; $this->loadEmployeeId(); } private function loadEmployeeId(): void { $employeeModel = new Employee(Database::getInstance()); $employee = $employeeModel->findByChatUserId((string) $this->userId); if ($employee && $employee->id) { $this->employeeId = $employee->id; // log_message("BalanceCheckHandler: Employee ID {$this->employeeId} loaded for Telegram user ID {$this->userId}"); } else { log_message("BalanceCheckHandler: No employee record found for Telegram user ID {$this->userId}."); } } /** * @return null */ public function showBalances(): void { if ($this->employeeId === null) { $this->telegramService->sendMessage($this->chatId, "ขออภัยค่ะ ไม่พบข้อมูลพนักงานของคุณ (Telegram User ID: {$this->userId}) ในระบบ โปรดติดต่อ HR เพื่อลงทะเบียน Telegram User ID ของคุณก่อนค่ะ"); return; } $currentYear = (int) date('Y'); $leaveBalanceModel = new LeaveBalance(Database::getInstance()); $balancesData = $leaveBalanceModel->getBalancesForEmployeeByYear($this->employeeId, $currentYear); $employeeModel = new Employee(Database::getInstance()); $employeeObject = $employeeModel->read($this->employeeId); // Assuming read(id) returns the employee object or false $employeeName = ($employeeObject && $employeeObject->first_name) ? htmlspecialchars($employeeObject->first_name) : "ผู้ใช้"; if (empty($balancesData)) { $this->telegramService->sendMessage( $this->chatId, "คุณ {$employeeName} (ID: {$this->employeeId}) ยังไม่มียอดวันลาสำหรับปี {$currentYear} ค่ะ หรืออาจยังไม่มีการตั้งค่าประเภทวันลาที่สามารถตรวจสอบยอดได้" ); return; } $responseText = "ยอดวันลาคงเหลือของคุณ {$employeeName} สำหรับปี {$currentYear} (ID: {$this->employeeId}):\n"; $foundBalances = false; foreach ($balancesData as $balance) { // Based on LeaveBalance->getBalancesForEmployeeByYear current implementation, $balance is an array if (is_array($balance) && isset($balance['leave_type_name']) && isset($balance['balance_days'])) { $balanceDisplay = rtrim(rtrim(number_format((float) $balance['balance_days'], 2, '.', ''), '0'), '.'); if ($balanceDisplay === '') { $balanceDisplay = '0'; } $typeName = htmlspecialchars($balance['leave_type_name']); $responseText .= "• {$typeName}: {$balanceDisplay} วัน\n"; $foundBalances = true; } // This elseif is a fallback if the model changes to return objects with populated LeaveType elseif (is_object($balance) && isset($balance->leaveType) && isset($balance->leaveType->name) && isset($balance->balance_days)) { $balanceDisplay = rtrim(rtrim(number_format((float) $balance->balance_days, 2, '.', ''), '0'), '.'); if ($balanceDisplay === '') { $balanceDisplay = '0'; } $typeName = htmlspecialchars($balance->leaveType->name); $responseText .= "• {$typeName}: {$balanceDisplay} วัน\n"; $foundBalances = true; } } if (!$foundBalances) { $responseText = "ไม่พบข้อมูลยอดวันลาที่สามารถแสดงผลได้สำหรับปี {$currentYear} ค่ะ (คุณ {$employeeName}, ID: {$this->employeeId})"; } $this->telegramService->sendMessage($this->chatId, $responseText); } }