motorbike/app/Controllers/SecuriteController.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

188 lines
6.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Controllers;
use App\Models\Securite;
use App\Models\Products;
use App\Models\Orders;
use App\Models\Stores;
use App\Models\Historique;
class SecuriteController extends AdminController
{
public function __construct()
{
parent::__construct();
helper(['form', 'url']);
}
private $pageTitle = 'Validation sortie motos';
public function index() // ou validateSecurite() ou autre nom
{
$this->verifyRole('viewSecurite'); // ou autre permission
$session = session();
$user = $session->get('user');
$data['page_title'] = 'Validation Sécurité';
$data['user_role'] = $user['group_name']; // ✅ AJOUTER CETTE LIGNE
$data['user_permission'] = $this->permission;
// ✅ RÉCUPÉRER LES MAGASINS
$storeModel = new \App\Models\Stores();
$data['stores'] = $storeModel->getActiveStore();
return $this->render_template('securite/index', $data);
}
public function fetchSecuriteData()
{
$securiteModel = new Securite();
$Products = new Products();
$securites = $securiteModel->getAllSecuriteData();
$result = ['data' => []];
foreach ($securites as $securite) {
if ($securite['status'] === 'PENDING') {
$product = $Products->getProductData($securite['product_id']);
if (! $product) continue;
// Bouton daction
$buttons = in_array('validateCommande1', $this->permission)
? '<button type="button" class="btn btn-success" onclick="editFunc(' . $securite['id'] . ')"><i class="fa fa-check"></i></button>'
: '';
// Statut
$statut = '<span class="label label-warning">EN ATTENTE DE VALIDATION</span>';
// Image
$img = '<img src="' . base_url('assets/images/product_image/' . $product['image']) . '" '
. 'alt="' . esc($product['name']) . '" class="img-circle" width="50" height="50" />';
$result['data'][] = [
'image' => $img,
'ugs' => esc($product['sku']),
'designation' => esc($product['name']),
'statut' => $statut,
'action' => $buttons
];
}
}
return $this->response->setJSON($result);
}
public function fetchSecuriteDataById($id)
{
if ($id) {
$Securite = new Securite();
$Orders = new Orders();
$Products = new Products();
$data = $Securite->getSecuriteData($id);
$order_data = $Orders->getOrdersDataByBillNo($data['bill_no']);
$product = $Products->getProductData($data['product_id']);
$response = [
'image' => base_url('assets/images/product_image/' . $product['image']),
'nom' => $product['name'],
'ugs' => $product['sku'],
'bill_no' => $data['bill_no'],
'customer_name' => $order_data['customer_name'],
'customer_address' => $order_data['customer_address'],
'customer_phone' => $order_data['customer_phone'],
'customer_cin' => $order_data['customer_cin'],
];
return $this->response->setJSON($response);
}
}
public function update(int $id)
{
$this->verifyRole('updateCommande1');
$securiteModel = new Securite();
$post = $this->request->getPost();
$response = [];
if ($id && isset($post['status'])) {
$data = [
'status' => $post['status'],
'active' => 0
];
$session = session();
$users = $session->get('user');
$Notification = new NotificationController();
if ($securiteModel->updateSecurite($data, $id)) {
if ($post['status'] === "Validé") {
// ✅ Récupérer les infos de la ligne securite
$securiteData = $securiteModel->getSecuriteData($id);
if ($securiteData) {
// ✅ Marquer le produit comme vendu (product_sold = 1)
$productModel = new Products();
$productModel->update($securiteData['product_id'], ['product_sold' => 1]);
// ✅ Mettre à jour la commande liée (paid_status = 3 = livré)
if (!empty($securiteData['bill_no'])) {
$orderModel = new Orders();
$order = $orderModel->getOrdersDataByBillNo($securiteData['bill_no']);
if ($order) {
$orderModel->update($order['id'], [
'paid_status' => 3,
'delivered_by' => $users['id'],
'delivered_at' => date('Y-m-d H:i:s')
]);
}
}
}
$Notification->notifyGroupsByPermission('notifRemise', 'Une commande a été validée et livrée', (int)$users['store_id'], 'orders');
}
// Log de l'action livraison
$historique = new Historique();
$billNo = $securiteData['bill_no'] ?? 'N/A';
$historique->logAction('securite', 'DELIVERY', $id, "Confirmation de livraison - Facture: {$billNo}");
$response = ['success' => true, 'messages' => 'Livraison confirmée avec succès'];
} else {
$response = ['success' => false, 'messages' => 'Erreur en base lors de la mise à jour'];
}
} else {
$response = ['success' => false, 'messages' => 'ID ou statut manquant'];
}
return $this->response->setJSON($response);
}
public function remove()
{
$this->verifyRole('deleteCommande1');
$response = [];
$storeId = $this->request->getPost('store_id');
if ($storeId) {
$storeModel = new Stores();
if ($storeModel->delete($storeId)) {
$response['success'] = true;
$response['messages'] = "Supprimé avec succès";
} else {
$response['success'] = false;
$response['messages'] = "Erreur dans la base de données lors de la suppression des informations sur la marque";
}
} else {
$response['success'] = false;
$response['messages'] = "Référez à nouveau la page !!";
}
return $this->response->setJSON($response);
}
}