where('DATE(deadline) >=', $today) // Inclut le jour même ->where('DATE(deadline) <=', date('Y-m-d', strtotime('+3 days'))) ->where('active', 1) ->findAll(); log_message('info', "Nombre d'avances trouvées (0-3 jours): " . count($avances)); $users = $usersModel->select('users.email, users.firstname, users.lastname') ->join('user_group', 'user_group.user_id = users.id') ->join('groups', 'groups.id = user_group.group_id') ->where('groups.group_name', 'DAF') ->findAll(); log_message('info', "Utilisateurs DAF trouvés: " . json_encode($users)); $emails = array_column($users, 'email'); log_message('info', "Emails extraits: " . json_encode($emails)); if (empty($emails)) { log_message('error', "Aucun email DAF trouvé"); $db = \Config\Database::connect(); $allGroups = $db->query("SELECT DISTINCT group_name FROM groups")->getResult(); log_message('info', "Groupes disponibles: " . json_encode($allGroups)); return; } foreach ($avances as $avance) { $deadline = date('Y-m-d', strtotime($avance['deadline'])); $daysLeft = (int) ceil((strtotime($deadline) - strtotime($today)) / 86400); log_message('info', "Avance ID: {$avance['avance_id']}, Deadline: {$deadline}, Jours restants: {$daysLeft}"); // Modification des types d'alerte pour 0, 1, 2, 3 jours $alertType = match($daysLeft) { 3 => 'deadline_3_days', 2 => 'deadline_2_days', 1 => 'deadline_1_day', 0 => 'deadline_today', default => null, }; if ($alertType === null) { log_message('info', "Pas d'alerte nécessaire pour {$daysLeft} jours restants"); continue; } log_message('info', "Type d'alerte: {$alertType}"); // Vérification si l'alerte a déjà été envoyée $alreadySent = $alertMailModel ->where('avance_id', $avance['avance_id']) ->where('alert_type', $alertType) ->first(); if ($alreadySent) { log_message('info', "Alerte déjà envoyée pour avance_id={$avance['avance_id']} type={$alertType}"); continue; } // Message modifié pour inclure le cas du jour même $urgencyText = $daysLeft === 0 ? "ÉCHÉANCE AUJOURD'HUI" : "{$daysLeft} jour(s) restant(s)"; $message = "
ID Avance : {$avance['avance_id']}
Client : {$avance['customer_name']}
Montant avance : " . number_format($avance['avance_amount'], 0, ',', ' ') . " Ar
Montant dû : " . number_format($avance['amount_due'], 0, ',', ' ') . " Ar
Deadline : {$deadline}
Statut : {$urgencyText}
Téléphone client : {$avance['customer_phone']}
Adresse client : {$avance['customer_address']}
Cette avance " . ($daysLeft === 0 ? "arrive à échéance aujourd'hui" : "arrivera à échéance dans {$daysLeft} jour(s)") . ". Action requise immédiatement.
"; $emailsSent = 0; foreach ($emails as $to) { log_message('info', "Tentative d'envoi email à: {$to}"); $subject = $daysLeft === 0 ? "⚠️ AVANCE URGENTE - ÉCHÉANCE AUJOURD'HUI" : "⚠️ AVANCE URGENTE - {$daysLeft} jour(s) restant(s)"; if (sendEmailInBackground($to, $subject, $message)) { $emailsSent++; log_message('info', "Email envoyé avec succès à: {$to}"); } else { log_message('error', "Échec envoi email à: {$to}"); } } if ($emailsSent > 0) { log_message('info', "Insertion alerte pour avance_id={$avance['avance_id']} avec type {$alertType}"); $alertMailModel->insert([ 'avance_id' => $avance['avance_id'], 'alert_type' => $alertType, 'sent_date' => date('Y-m-d H:i:s'), 'status' => 'sent', 'created_at' => date('Y-m-d H:i:s'), ]); } else { log_message('error', "Aucun email envoyé pour avance_id={$avance['avance_id']} avec type {$alertType}"); } } log_message('info', "=== FIN checkDeadlineAlerts ==="); } function sendEmailInBackground($to, $subject, $message) { try { log_message('info', "Préparation envoi email à: {$to}"); $email = \Config\Services::email(); $config = [ 'protocol' => 'smtp', 'SMTPHost' => 'smtp.gmail.com', 'SMTPUser' => 'rey342505@gmail.com', 'SMTPPass' => 'loirqovmfuxnasrm', 'SMTPPort' => 587, 'SMTPCrypto' => 'tls', 'mailType' => 'html', 'charset' => 'utf-8', 'newline' => "\r\n" ]; $email->initialize($config); $email->setFrom('rey342505@gmail.com', 'Système Motorbike - Alertes Avances'); $email->setTo($to); $email->setSubject($subject); $email->setMessage($message); log_message('info', "Configuration email terminée, tentative d'envoi..."); if (!$email->send()) { $debugInfo = $email->printDebugger(['headers']); log_message('error', "Erreur email à {$to}: " . print_r($debugInfo, true)); return false; } log_message('info', "Email envoyé avec succès à: {$to}"); return true; } catch (\Exception $e) { log_message('error', "Exception email à {$to}: " . $e->getMessage()); return false; } }