verifyRole('viewRemise');
$data = json_decode($this->fetchTotal(),true);
$this->render_template('demande/index', $data);
}
public function fetchTotal(){
$data = [
'user_permission' => $this->permission,
'page_title' => $this->pageTitle
];
return json_encode($data);
}
public function fetchRemiseData()
{
helper(['url', 'form']);
$Remise = new Remise();
$draw = intval($this->request->getVar('draw'));
$data = $Remise->getAllDemandeRemiseToday();
$totalRecords = count($data);
$result = [
"draw" => $draw,
"recordsTotal" => $totalRecords,
"recordsFiltered" => $totalRecords,
"data" => []
];
// ✅ RÉCUPÉRER LE RÔLE DE L'UTILISATEUR
$session = session();
$user = $session->get('user');
$role = $user['group_name'] ?? '';
foreach ($data as $key => $value) {
$buttons = '';
// ✅ SEUL LE SUPERADMIN PEUT VALIDER/REFUSER
if ($role === 'SuperAdmin' && $value['demande_status'] == 'En attente') {
$buttons .= '';
$buttons .= ' ';
}
// ✅ DIRECTION ET DAF VOIENT SEULEMENT (pas de boutons d'action)
if (in_array($role, ['Direction', 'DAF'])) {
$buttons = 'Consultation uniquement';
}
$result['data'][$key] = [
$value['id_demande'],
$value['product'],
number_format($value['total_price'], 0, '.', ' '),
number_format($value['montant_demande'], 0, '.', ' '),
$value['demande_status'],
$buttons
];
}
return $this->response->setJSON($result);
}
/**
* ✅ AMÉLIORATION : Notifications centralisées lors de la validation/refus des remises
*/
public function updateRemise($id_demande)
{
// ✅ VÉRIFIER QUE SEUL LE SUPERADMIN PEUT VALIDER
$session = session();
$user = $session->get('user');
$role = $user['group_name'] ?? '';
if ($role !== 'SuperAdmin') {
return $this->response->setJSON([
'success' => false,
'messages' => 'Seul le SuperAdmin peut valider ou refuser les demandes de remise.'
]);
}
$this->verifyRole('validateRemise');
$validation = \Config\Services::validation();
$data['page_title'] = $this->pageTitle;
$validation->setRules([
'demande_status' => 'required'
]);
$validationData = [
'demande_status' => $this->request->getPost('demande_status')
];
$Remise = new Remise();
if ($this->request->getMethod() == 'post') {
$today = date('Y-m-d');
$demande_status = $this->request->getPost('demande_status');
$data = [
'demande_status' => $demande_status,
'date_demande' => $today,
];
if ($Remise->updateRemise($id_demande, $data)) {
$remise_product = $Remise->getProductByDemandeId($id_demande);
$Notification = new NotificationController();
$ordersModel = new Orders();
$order_id = $Remise->getOrderIdByDemandeId($id_demande);
// ✅ Récupérer les infos de la commande
$order_info = $ordersModel->getOrdersData($order_id);
$bill_no = $order_info['bill_no'] ?? '';
$store_id = $order_info['store_id'] ?? 0;
// ✅ RÉCUPÉRER TOUS LES STORES
$Stores = new Stores();
$allStores = $Stores->getActiveStore();
// ✅ SI REFUSÉ PAR LE SUPERADMIN
if ($demande_status == 'Refusé') {
if ($order_id) {
$ordersModel->update($order_id, ['paid_status' => 0]);
}
// Message de refus
$messageRefus = "❌ Demande de remise refusée : {$bill_no}
" .
"Produit : {$remise_product}
" .
"Décision : SuperAdmin";
// Notifier le commercial du store concerné
$Notification->createNotification(
$messageRefus . "
Veuillez modifier la commande.",
"COMMERCIALE",
(int)$store_id,
"orders"
);
// ✅ NOTIFIER DIRECTION ET DAF DE TOUS LES STORES (POUR INFORMATION)
if (is_array($allStores) && count($allStores) > 0) {
foreach ($allStores as $store) {
$Notification->createNotification(
$messageRefus . "
Pour information",
"Direction",
(int)$store['id'],
'remise/'
);
$Notification->createNotification(
$messageRefus . "
Pour information",
"DAF",
(int)$store['id'],
'remise/'
);
}
}
$message = 'La demande de remise a été refusée. Le commercial et les responsables ont été notifiés.';
} elseif ($demande_status == 'Accepté' || $demande_status == 'Validé') {
// ✅ SI ACCEPTÉ PAR LE SUPERADMIN
if ($order_id) {
$ordersModel->update($order_id, ['paid_status' => 2]);
}
$messageAcceptation = "✅ Demande de remise acceptée : {$bill_no}
" .
"Produit : {$remise_product}
" .
"Décision : SuperAdmin";
// Notifier la Caissière du store concerné
$Notification->createNotification(
$messageAcceptation . "
Commande prête à être traitée",
"Caissière",
(int)$store_id,
"orders"
);
// Notifier le commercial du store concerné
$Notification->createNotification(
$messageAcceptation,
"COMMERCIALE",
(int)$store_id,
"orders"
);
// ✅ NOTIFIER DIRECTION ET DAF DE TOUS LES STORES (POUR INFORMATION)
if (is_array($allStores) && count($allStores) > 0) {
foreach ($allStores as $store) {
$Notification->createNotification(
$messageAcceptation . "
Pour information",
"Direction",
(int)$store['id'],
'remise/'
);
$Notification->createNotification(
$messageAcceptation . "
Pour information",
"DAF",
(int)$store['id'],
'remise/'
);
}
}
$message = 'La demande de remise a été acceptée. La caissière, le commercial et les responsables ont été notifiés.';
}
return $this->response->setJSON([
'success' => true,
'messages' => $message
]);
} else {
return $this->response->setJSON([
'success' => false,
'messages' => 'Erreur lors de la modification de la remise.'
]);
}
}
}
}