@ -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)