motorbike/app/Controllers/ActionLogController.php
andrymodeste a195d24e78 feat: refonte gestion commandes, sécurité, impressions et notifications
## Gestion Moto & Commandes
- Correction des notifications pour la Caissière
- Le bouton "Enregistrer" changé en "Payer"
- La moto commandée reste visible dans la liste jusqu'à livraison par la sécurité

## Espace Sécurité
- Ajout des notifications de livraison
- Transfert vers l'espace commande après livraison

## Espace SuperAdmin
- Rejet de commande : le produit redevient disponible en stock automatiquement
- Correction de la gestion des rôles (permissions inversées)
- Avance complète : s'affiche directement chez la Caissière

## Historique des Actions
- Ajout de l'historique des actions pour SuperAdmin (traçabilité)

## Dashboard
- Filtre par date ajouté (par défaut : aujourd'hui)
- Affichage uniquement des données du site concerné

## Espace Commercial
- Liste des produits disponibles sur la liste déroulante dans l'ajout des commandes
- Le bouton "+" se cache après le premier clic pour les clients particuliers

## Impression Documents
- Refonte facture, bon de livraison, facture d'acompte (QR codes, infos dynamiques)

## Sidebar
- Correction des animations et du logo dynamique

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 07:28:05 +02:00

155 lines
5.4 KiB
PHP

<?php
namespace App\Controllers;
use App\Models\Historique;
use App\Models\Stores;
class ActionLogController extends AdminController
{
private $pageTitle = 'Historique des Actions';
public function __construct()
{
parent::__construct();
helper(['form', 'url']);
}
public function index()
{
$session = session();
$user = $session->get('user');
if ($user['group_name'] !== 'SuperAdmin') {
return redirect()->to('/');
}
$storesModel = new Stores();
$data['page_title'] = $this->pageTitle;
$data['stores'] = $storesModel->getActiveStore();
return $this->render_template('action_log/index', $data);
}
public function fetchData()
{
$session = session();
$user = $session->get('user');
if ($user['group_name'] !== 'SuperAdmin') {
return $this->response->setJSON(['data' => []]);
}
$historiqueModel = new Historique();
$filters = [
'action' => $this->request->getGet('action'),
'store_name' => $this->request->getGet('store_name'),
'product_name' => $this->request->getGet('product'),
'sku' => $this->request->getGet('sku'),
'date_from' => $this->request->getGet('date_from'),
'date_to' => $this->request->getGet('date_to'),
];
$allData = $historiqueModel->getHistoriqueWithFilters($filters);
$result = ['data' => []];
foreach ($allData as $row) {
$result['data'][] = [
date('d/m/Y H:i', strtotime($row['created_at'])),
$row['user_name'] ?? '<em>Système</em>',
$this->getActionBadge($row['action']),
$this->getTableLabel($row['table_name']),
$row['description'] ?? '',
];
}
return $this->response->setJSON($result);
}
private function getActionBadge($action)
{
$badges = [
'CREATE' => '<span class="label label-success">Création</span>',
'UPDATE' => '<span class="label label-warning">Modification</span>',
'DELETE' => '<span class="label label-danger">Suppression</span>',
'PAYMENT' => '<span class="label label-primary">Paiement</span>',
'VALIDATE' => '<span class="label label-info">Validation</span>',
'REFUSE' => '<span class="label label-danger">Refus</span>',
'DELIVERY' => '<span class="label label-success">Livraison</span>',
'ASSIGN_STORE' => '<span class="label label-info">Assignation</span>',
'ENTRER' => '<span class="label label-primary">Entrée</span>',
'SORTIE' => '<span class="label label-default">Sortie</span>',
'IMPORT' => '<span class="label label-success">Import</span>',
'LOGIN' => '<span class="label label-default">Connexion</span>',
];
return $badges[$action] ?? '<span class="label label-secondary">' . $action . '</span>';
}
private function getTableLabel($tableName)
{
$labels = [
'orders' => 'Commande',
'products' => 'Produit',
'users' => 'Utilisateur',
'groups' => 'Rôle',
'avances' => 'Avance',
'securite' => 'Sécurité',
'remise' => 'Remise',
'sortie_caisse' => 'Décaissement',
'autres_encaissements' => 'Encaissement',
'recouvrement' => 'Recouvrement',
'stores' => 'Point de vente',
'brands' => 'Marque',
'categories' => 'Catégorie',
];
return $labels[$tableName] ?? $tableName;
}
public function export()
{
$session = session();
$user = $session->get('user');
if ($user['group_name'] !== 'SuperAdmin') {
return redirect()->to('/');
}
$historiqueModel = new Historique();
$filters = [
'action' => $this->request->getGet('action'),
'store_name' => $this->request->getGet('store_name'),
'date_from' => $this->request->getGet('date_from'),
'date_to' => $this->request->getGet('date_to'),
];
$data = $historiqueModel->getHistoriqueWithFilters($filters);
$csv = "\xEF\xBB\xBF"; // BOM UTF-8 pour Excel
$csv .= "Date;Heure;Utilisateur;Action;Module;Description\n";
foreach ($data as $row) {
$date = date('d-m-Y', strtotime($row['created_at']));
$heure = date('H:i', strtotime($row['created_at']));
$userName = $row['user_name'] ?? 'Système';
$action = $row['action'];
$module = $this->getTableLabel($row['table_name']);
$description = str_replace('"', '""', $row['description'] ?? '');
$csv .= "{$date};{$heure};{$userName};{$action};{$module};\"{$description}\"\n";
}
$filename = 'historique_actions_' . date('Y-m-d_H-i') . '.csv';
return $this->response
->setHeader('Content-Type', 'text/csv; charset=utf-8')
->setHeader('Content-Disposition', 'attachment; filename="' . $filename . '"')
->setBody($csv);
}
}