diff --git a/app/Controllers/OrderController.php b/app/Controllers/OrderController.php index 65fea499..07218c0b 100644 --- a/app/Controllers/OrderController.php +++ b/app/Controllers/OrderController.php @@ -343,12 +343,18 @@ class OrderController extends AdminController return redirect()->back()->withInput()->with('errors', ['product' => 'Chaque produit sélectionné doit être unique.']); } + // ✅ AJOUT DES RÈGLES DE VALIDATION $validation->setRules([ - 'product[]' => 'required' + 'product[]' => 'required', + 'customer_type' => 'required', + 'source' => 'required' ]); + // ✅ AJOUT DES DONNÉES DE VALIDATION $validationData = [ - 'product[]' => $this->request->getPost('product[]') + 'product[]' => $this->request->getPost('product[]'), + 'customer_type' => $this->request->getPost('customer_type'), + 'source' => $this->request->getPost('source') ]; $Orders = new Orders(); @@ -361,7 +367,6 @@ class OrderController extends AdminController $users = $session->get('user'); $user_id = $users['id']; - // ✅ UTILISER LA NOUVELLE MÉTHODE $bill_no = $this->generateBillNo($users['store_id']); // Récupération des produits @@ -372,7 +377,7 @@ class OrderController extends AdminController $discount = (float)$this->request->getPost('discount') ?? 0; $gross_amount = $this->calculGross($amounts); - // ✅ Vérification prix minimal SI rabais existe + // Vérification prix minimal SI rabais existe if ($discount > 0) { $FourchettePrix = new \App\Models\FourchettePrix(); @@ -399,7 +404,7 @@ class OrderController extends AdminController } } - // ✅ Calculer le montant à payer et net_amount + // Calculer le montant à payer et net_amount $montant_a_payer = ($discount > 0) ? $discount : $gross_amount; $tranche_1 = (float)$this->request->getPost('tranche_1') ?? 0; @@ -411,13 +416,15 @@ class OrderController extends AdminController $net_amount = $montant_a_payer; } - // ✅ Création de la commande + // ✅ AJOUT DES NOUVEAUX CHAMPS ICI $data = [ 'bill_no' => $bill_no, 'customer_name' => $this->request->getPost('customer_name'), 'customer_address' => $this->request->getPost('customer_address'), 'customer_phone' => $this->request->getPost('customer_phone'), 'customer_cin' => $this->request->getPost('customer_cin'), + 'customer_type' => $this->request->getPost('customer_type'), // ✅ NOUVEAU + 'source' => $this->request->getPost('source'), // ✅ NOUVEAU 'date_time' => date('Y-m-d H:i:s'), 'service_charge_rate' => 0, 'vat_charge_rate' => 0, @@ -689,7 +696,9 @@ public function update(int $id) $Orders = new Orders(); $current_order = $Orders->getOrdersData($id); - if (!$current_order) { + // ✅ AJOUT : Vérification plus détaillée + if (!$current_order || !isset($current_order['id'])) { + log_message('error', 'Commande introuvable pour ID: ' . $id); session()->setFlashData('errors', 'Commande introuvable.'); return redirect()->to('orders/'); } @@ -731,17 +740,14 @@ public function update(int $id) $paid_status = $this->request->getPost('paid_status'); } - // ✅ AJOUT : TRACER LA VALIDATION PAR LE CAISSIER - $validated_by = $current_order['validated_by'] ?? null; // Garder l'ancienne valeur si existe + $validated_by = $current_order['validated_by'] ?? null; $validated_at = $current_order['validated_at'] ?? null; - // Si le statut passe à "Validé" (1) et que l'utilisateur est un caissier if ($old_paid_status != 1 && $paid_status == 1 && $role === 'Caissière') { $validated_by = $user['id']; $validated_at = date('Y-m-d H:i:s'); } - // Si le statut repasse à "En attente" ou "Refusé", effacer la validation if (in_array($paid_status, [0, 2])) { $validated_by = null; $validated_at = null; @@ -758,6 +764,8 @@ public function update(int $id) 'customer_address' => $this->request->getPost('customer_address'), 'customer_phone' => $this->request->getPost('customer_phone'), 'customer_cin' => $this->request->getPost('customer_cin'), + 'customer_type' => $this->request->getPost('customer_type'), + 'source' => $this->request->getPost('source'), 'gross_amount' => $this->request->getPost('gross_amount_value'), 'service_charge_rate' => $this->request->getPost('service_charge_rate'), 'service_charge' => max(0, (float)$this->request->getPost('service_charge_value')), @@ -775,7 +783,6 @@ public function update(int $id) 'tranche_2' => $role !== 'COMMERCIALE' ? $this->request->getPost('tranche_2') : null, 'order_payment_mode' => $role !== 'COMMERCIALE' ? $this->request->getPost('order_payment_mode_1') : null, 'order_payment_mode_1' => $role !== 'COMMERCIALE' ? $this->request->getPost('order_payment_mode_2') : null, - // ✅ AJOUT DES CHAMPS DE TRACABILITÉ 'validated_by' => $validated_by, 'validated_at' => $validated_at ]; @@ -797,7 +804,6 @@ public function update(int $id) 'orders' ); - // ✅ AJOUT : Notification pour la Direction quand un caissier valide if ($role === 'Caissière') { $Notification->createNotification( "Commande validée par la caisse: {$bill_no}", @@ -854,6 +860,7 @@ public function update(int $id) } } + // ✅ Affichage du formulaire $company = $Company->getCompanyData(1); $data['company_data'] = $company; $data['is_vat_enabled'] = ($company['vat_charge_value'] > 0); @@ -861,6 +868,13 @@ public function update(int $id) $orders_data = $Orders->getOrdersData($id); + // ✅ VÉRIFICATION SUPPLÉMENTAIRE + if (!$orders_data || !isset($orders_data['id'])) { + log_message('error', 'Données de commande vides pour ID: ' . $id); + session()->setFlashData('errors', 'Impossible de charger les données de la commande.'); + return redirect()->to('orders/'); + } + $data['is_editable'] = !in_array($orders_data['paid_status'], [1, 3]); $orders_data['montant_tranches'] = (!empty($orders_data['discount']) && $orders_data['discount'] > 0) diff --git a/app/Models/Orders.php b/app/Models/Orders.php index 7bc3379f..383ab52b 100644 --- a/app/Models/Orders.php +++ b/app/Models/Orders.php @@ -20,6 +20,8 @@ class Orders extends Model 'customer_address', 'customer_phone', 'customer_cin', + 'customer_type', + 'source', 'date_time', 'gross_amount', 'service_charge_rate', @@ -84,17 +86,17 @@ class Orders extends Model $session = session(); $user = $session->get('user'); - // Si on demande UNE commande spécifique (pas de GROUP_CONCAT) + // ✅ CORRECTION : Si on demande UNE commande spécifique if ($id !== null) { return $this->db->table('orders') ->select([ - 'orders.*', + 'orders.*', // ✅ Ceci inclut déjà customer_type et source "CONCAT(users.firstname, ' ', users.lastname) AS user_name" ]) ->join('users', 'orders.user_id = users.id', 'left') ->where('orders.id', $id) ->get() - ->getRowArray(); + ->getRowArray(); // ✅ Retourne bien un tableau associatif } // Pour la LISTE des commandes (avec GROUP_CONCAT) @@ -107,6 +109,8 @@ class Orders extends Model 'orders.customer_phone', 'orders.customer_cin', 'orders.customer_address', + 'orders.customer_type', // ✅ DÉJÀ PRÉSENT + 'orders.source', // ✅ DÉJÀ PRÉSENT 'orders.discount', 'orders.date_time', 'orders.gross_amount', diff --git a/app/Views/orders/createbyid.php b/app/Views/orders/createbyid.php index 76d617d5..89f365b2 100644 --- a/app/Views/orders/createbyid.php +++ b/app/Views/orders/createbyid.php @@ -72,6 +72,35 @@