- Bouton impression conditionnel : 2 boutons (Facture + BL) si 1 produit, 1 bouton (BL) si plusieurs produits - Ajout filtres (date, point de vente, utilisateur) sur la page Rapports principale - Ajout filtres (date, point de vente) sur la page Rapports/Stock pour les 3 tableaux - Remplacement affichage "UGS" par "N° SERIE" dans toutes les pages - Mise en page facture avec remise : titre FACTURE repositionné, tableau plus compact - Correction remise commandes multi-produits : total_price recevait un tableau au lieu d'un nombre - SuperAdmin voit toutes les remises (tous statuts) au lieu de seulement "En attente" Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
188 lines
6.9 KiB
PHP
188 lines
6.9 KiB
PHP
<?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 d’action
|
||
$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,
|
||
'num_serie' => 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'],
|
||
'num_serie' => $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);
|
||
}
|
||
} |