You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
6.6 KiB
176 lines
6.6 KiB
<?php
|
|
|
|
use App\Models\Users;
|
|
use App\Models\Avance;
|
|
use App\Models\AlertMail;
|
|
|
|
function checkDeadlineAlerts()
|
|
{
|
|
log_message('info', "=== DÉBUT checkDeadlineAlerts ===");
|
|
|
|
$cacheFile = WRITEPATH . 'cache/check_deadline_last_run.txt';
|
|
|
|
// On enlève la vérification de 24h pour s'assurer que le script tourne quotidiennement
|
|
file_put_contents($cacheFile, time());
|
|
|
|
$avanceModel = new Avance();
|
|
$alertMailModel = new AlertMail();
|
|
$usersModel = new Users();
|
|
|
|
$today = date('Y-m-d');
|
|
log_message('info', "Date du jour: {$today}");
|
|
|
|
// Modification pour vérifier les avances dans 0-3 jours
|
|
$avances = $avanceModel
|
|
->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 = "
|
|
<h3>⚠️ URGENT : Avance approchant de la deadline</h3>
|
|
<p><strong>ID Avance :</strong> {$avance['avance_id']}</p>
|
|
<p><strong>Client :</strong> {$avance['customer_name']}</p>
|
|
<p><strong>Montant avance :</strong> " . number_format($avance['avance_amount'], 0, ',', ' ') . " Ar</p>
|
|
<p><strong>Montant dû :</strong> " . number_format($avance['amount_due'], 0, ',', ' ') . " Ar</p>
|
|
<p><strong>Deadline :</strong> {$deadline}</p>
|
|
<p><strong>Statut :</strong> <span style='color: red; font-weight: bold;'>{$urgencyText}</span></p>
|
|
<p><strong>Téléphone client :</strong> {$avance['customer_phone']}</p>
|
|
<p><strong>Adresse client :</strong> {$avance['customer_address']}</p>
|
|
<hr>
|
|
<p><em>Cette avance " . ($daysLeft === 0 ? "arrive à échéance aujourd'hui" : "arrivera à échéance dans {$daysLeft} jour(s)") . ". Action requise immédiatement.</em></p>
|
|
";
|
|
|
|
$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;
|
|
}
|
|
}
|