verifyRole('viewOrder');
$data['page_title'] = $this->pageTitle;
return $this->render_template('orders/index', $data);
}
public function fetchOrdersData()
{
helper(['url', 'form']);
$Orders = new Orders();
$result = ['data' => []];
$data = $Orders->getOrdersData();
$session = session();
$users = $session->get('user');
// ========================================
// POUR CAISSIÈRE
// ========================================
if ($users['group_name'] == "Caissière") {
foreach ($data as $key => $value) {
$date_time = date('d-m-Y h:i a', strtotime($value['date_time']));
$buttons = '';
// Bouton imprimer (sauf pour SECURITE)
if (in_array('viewOrder', $this->permission) && $users['group_name'] != "SECURITE" && $users['group_name'] != "COMMERCIALE") {
$buttons .= '';
}
// Bouton voir
if (in_array('viewOrder', $this->permission)) {
$buttons .= '
';
}
// ✅ Bouton modifier pour statuts 0 (Refusé) et 2 (En Attente)
if (in_array('updateOrder', $this->permission)
&& $users["store_id"] == $value['store_id']
&& in_array($value['paid_status'], [0, 2])) {
$buttons .= ' ';
}
// Statut de paiement
if ($value['paid_status'] == 1) {
$paid_status = 'Validé';
} elseif ($value['paid_status'] == 2) {
$paid_status = 'En Attente';
} elseif ($value['paid_status'] == 3) {
$paid_status = 'Validé et Livré';
} else {
$paid_status = 'Refusé';
}
// Calcul délai
$date1 = new DateTime($date_time);
$date2 = new DateTime();
$interval = $date1->diff($date2);
$daysPassed = $interval->days;
$statuDate = '';
if ($value['paid_status'] == 2) {
if ($daysPassed < 8) {
$statuDate = ' depuis ' . $daysPassed . ' Jours';
} elseif ($daysPassed >= 8 && $daysPassed < 15) {
$statuDate = ' depuis ' . $daysPassed . ' Jours';
} else {
$statuDate = ' depuis ' . $daysPassed . ' Jours';
}
}
$result['data'][$key] = [
$value['product_names'],
$value['user_name'],
$date_time . "
" . $statuDate,
number_format((int) $value['discount'], 0, ',', ' '),
number_format((int) $value['gross_amount'], 0, ',', ' '),
$paid_status,
$buttons
];
}
return $this->response->setJSON($result);
}
// ========================================
// POUR DIRECTION OU DAF
// ========================================
elseif($users['group_name'] == "Direction" || $users['group_name'] == "DAF"){
foreach ($data as $key => $value) {
$date_time = date('d-m-Y h:i a', strtotime($value['date_time']));
$buttons = '';
// Bouton imprimer
if (in_array('viewOrder', $this->permission) && $users['group_name'] != "SECURITE" && $users['group_name'] != "COMMERCIALE") {
$buttons .= '';
}
// ✅ Bouton modifier pour statuts 0 (Refusé) et 2 (En Attente)
if (in_array('updateOrder', $this->permission) && in_array($value['paid_status'], [0, 2])) {
$buttons .= ' ';
}
// ✅ Bouton supprimer pour statuts 0 et 2
if (in_array('deleteOrder', $this->permission) && in_array($value['paid_status'], [0, 2])) {
$buttons .= ' ';
}
// Statut de paiement
if ($value['paid_status'] == 1) {
$paid_status = 'Validé';
} elseif ($value['paid_status'] == 2) {
$paid_status = 'En Attente';
} elseif ($value['paid_status'] == 3) {
$paid_status = 'Validé et Livré';
} else {
$paid_status = 'Refusé';
}
// Calcul délai
$date1 = new DateTime($date_time);
$date2 = new DateTime();
$interval = $date1->diff($date2);
$daysPassed = $interval->days;
$statuDate = '';
if ($value['paid_status'] == 2) {
if ($daysPassed < 8) {
$statuDate = ' depuis ' . $daysPassed . ' Jours';
} elseif ($daysPassed >= 8 && $daysPassed < 15) {
$statuDate = ' depuis ' . $daysPassed . ' Jours';
} else {
$statuDate = ' depuis ' . $daysPassed . ' Jours';
}
}
$result['data'][$key] = [
$value['bill_no'],
$value['customer_name'],
$value['customer_phone'],
$date_time . "
" . $statuDate,
number_format((int) $value['discount'], 0, ',', ' '),
number_format((int) $value['gross_amount'], 0, ',', ' '),
$paid_status,
$buttons
];
}
return $this->response->setJSON($result);
}
// ========================================
// POUR LES AUTRES UTILISATEURS (COMMERCIALE, SECURITE, etc.)
// ========================================
else {
foreach ($data as $key => $value) {
$date_time = date('d-m-Y h:i a', strtotime($value['date_time']));
$buttons = '';
// Bouton imprimer
if (in_array('viewOrder', $this->permission) && $users['group_name'] != "SECURITE" && $users['group_name'] != "COMMERCIALE") {
$buttons .= '';
}
// ✅ Bouton modifier pour statuts 0 et 2, ET si c'est l'utilisateur créateur
if (in_array('updateOrder', $this->permission)
&& $users["id"] == $value['user_id']
&& in_array($value['paid_status'], [0, 2])) {
$buttons .= ' ';
}
// Bouton voir
if (in_array('viewOrder', $this->permission)) {
$buttons .= '
';
}
// ✅ Bouton supprimer pour statuts 0 et 2, ET si c'est l'utilisateur créateur
if (in_array('deleteOrder', $this->permission)
&& $users["id"] == $value['user_id']
&& in_array($value['paid_status'], [0, 2])) {
$buttons .= ' ';
}
// Statut de paiement
if ($value['paid_status'] == 1) {
$paid_status = 'Validé';
} elseif ($value['paid_status'] == 2) {
$paid_status = 'En Attente';
} elseif ($value['paid_status'] == 3) {
$paid_status = 'Validé et Livré';
} else {
$paid_status = 'Refusé';
}
// Calcul délai
$date1 = new DateTime($date_time);
$date2 = new DateTime();
$interval = $date1->diff($date2);
$daysPassed = $interval->days;
$statuDate = '';
if ($value['paid_status'] == 2) {
if ($daysPassed < 8) {
$statuDate = ' depuis ' . $daysPassed . ' Jours';
} elseif ($daysPassed >= 8 && $daysPassed < 15) {
$statuDate = ' depuis ' . $daysPassed . ' Jours';
} else {
$statuDate = ' depuis ' . $daysPassed . ' Jours';
}
}
$result['data'][$key] = [
$value['product_names'],
$value['user_name'],
$date_time . "
" . $statuDate,
number_format((int) $value['discount'], 0, ',', ' '),
number_format((int) $value['gross_amount'], 0, ',', ' '),
$paid_status,
$buttons
];
}
return $this->response->setJSON($result);
}
}
/**
* Affiche le formulaire create avec les données d'une commande existante
* Pour le rôle COMMERCIALE
*/
/**
* function who check if the product is null
* and create notification about it
* @param array $product_id id of the product
* @param int $store_id id of the store
* @return void
*/
private function checkProductisNull(array $product_id, $store_id)
{
$notification = new NotificationController();
$product = new Products();
for ($i = 0; $i < count($product_id); $i++) {
$singleProduct = $product->getProductData($product_id[$i]);
if ($singleProduct['product_sold'] == true) {
$notification->createNotification("Produit en rupture de stock", "Direction", $store_id, "products");
}
}
}
private function calculGross($request)
{
$amount = $request;
$montant = 0;
for ($i = 0; $i < \count($amount); $i++) {
$montant += $amount[$i];
}
return $montant;
}
public function create()
{
$this->verifyRole('createOrder');
$data['page_title'] = $this->pageTitle;
$validation = \Config\Services::validation();
$products = $this->request->getPost('product[]');
if ($products !== null && (count($products) !== count(array_unique($products)))) {
return redirect()->back()->withInput()->with('errors', ['product' => 'Chaque produit sélectionné doit être unique.']);
}
$validation->setRules([
'product[]' => 'required'
]);
$validationData = [
'product[]' => $this->request->getPost('product[]')
];
$Orders = new Orders();
$Company = new Company();
$Products = new Products();
if ($this->request->getMethod() === 'post' && $validation->run($validationData)) {
$session = session();
$users = $session->get('user');
$user_id = $users['id'];
$bill_no = 'BILPR-' . strtoupper(substr(md5(uniqid(mt_rand(), true)), 0, 4));
// Récupération des produits
$posts = $this->request->getPost('product[]');
$rates = $this->request->getPost('rate_value[]');
$amounts = $this->request->getPost('amount_value[]');
$discount = (float)$this->request->getPost('discount') ?? 0;
$gross_amount = $this->calculGross($amounts);
// ✅ Vérification prix minimal SI rabais existe
if ($discount > 0) {
$FourchettePrix = new \App\Models\FourchettePrix();
foreach ($posts as $index => $productId) {
$productId = (int)$productId;
// Récupérer données produit + prix minimal
$productData = $Products->getProductData($productId);
$fourchette = $FourchettePrix->getFourchettePrixByProductId($productId);
if ($fourchette) {
$prixMinimal = (float)$fourchette['prix_minimal'];
// ✅ Le rabais devient le prix de vente
if ($discount < $prixMinimal) {
$prixMinimalFormatted = number_format($prixMinimal, 0, ',', ' ');
$discountFormatted = number_format($discount, 0, ',', ' ');
return redirect()->back()
->withInput()
->with('errors', [
"⚠️ Commande bloquée : Le rabais de {$discountFormatted} Ar pour « {$productData['name']} » est trop élevé."
]);
}
}
}
}
// ✅ NOUVELLE LOGIQUE : Calculer le montant à payer et net_amount
$montant_a_payer = ($discount > 0) ? $discount : $gross_amount;
// Récupérer les tranches
$tranche_1 = (float)$this->request->getPost('tranche_1') ?? 0;
$tranche_2 = (float)$this->request->getPost('tranche_2') ?? 0;
// Calculer net_amount selon les tranches
if ($tranche_1 > 0 && $tranche_2 > 0) {
// Paiement en 2 tranches
$net_amount = $tranche_1 + $tranche_2;
} else {
// Paiement en 1 tranche ou pas de tranches
$net_amount = $montant_a_payer;
}
// ✅ Création de la commande avec la nouvelle logique
$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'),
'date_time' => date('Y-m-d H:i:s'),
'service_charge_rate' => 0,
'vat_charge_rate' => 0,
'vat_charge' => 0,
'net_amount' => $net_amount, // ✅ Net amount = tranches OU montant_a_payer
'discount' => $discount,
'paid_status' => 2, // Toujours En Attente au départ
'user_id' => $user_id,
'amount_value' => $amounts,
'gross_amount' => $gross_amount,
'rate_value' => $rates,
'store_id' => $users['store_id'],
'tranche_1' => $tranche_1,
'tranche_2' => $tranche_2,
'order_payment_mode' => $this->request->getPost('order_payment_mode_1'),
'order_payment_mode_1' => $this->request->getPost('order_payment_mode_2')
];
$order_id = $Orders->create($data, $posts);
if ($order_id) {
session()->setFlashdata('success', 'Créé avec succès');
$Notification = new NotificationController();
// ✅ WORKFLOW SELON LA REMISE
if ($discount > 0) {
// AVEC REMISE : Créer demande + Notifier Conseil
$Order_item1 = new OrderItems();
$order_item_data = $Order_item1->getOrdersItemData($order_id);
$product_ids = array_column($order_item_data, 'product_id');
$productData = new Products();
$product_data_results = [];
foreach ($product_ids as $prod_id) {
$id = (int) $prod_id;
$product_data_results[] = $productData->getProductData($id);
}
$product_lines = [];
foreach ($product_data_results as $product) {
if (isset($product['sku'], $product['price'])) {
$sku = $product['sku'];
$price = $product['price'];
$product_lines[] = "{$sku}:{$price}";
}
}
$product_output = implode("\n", $product_lines);
$data1 = [
'date_demande' => date('Y-m-d H:i:s'),
'montant_demande' => $discount,
'total_price' => $amounts,
'id_store' => $users['store_id'],
'id_order' => $order_id,
'product' => $product_output,
'demande_status' => 'En attente'
];
$Remise = new Remise();
$id_remise = $Remise->addDemande($data1);
// Notification au CONSEIL
$Notification->createNotification(
"Nouvelle demande de remise à valider - Commande " . $bill_no,
"Direction",
(int)$users['store_id'],
"remise/"
);
} else {
// SANS REMISE : Notifier directement la Caissière
$Notification->createNotification(
"Nouvelle commande à valider - " . $bill_no,
"Caissière",
(int)$users['store_id'],
"orders"
);
}
// Redirection selon le rôle
if ($users["group_name"] != "COMMERCIALE") {
$this->checkProductisNull($posts, $users['store_id']);
}
return redirect()->to('orders/');
} else {
session()->setFlashdata('errors', 'Error occurred!!');
return redirect()->to('orders/create/');
}
} else {
// Affichage du formulaire
$company = $Company->getCompanyData(1);
$session = session();
$users = $session->get('user');
$store_id = $users['store_id'];
$data = [
'paid_status' => 2,
'company_data' => $company,
'is_vat_enabled' => ($company['vat_charge_value'] > 0),
'is_service_enabled' => ($company['service_charge_value'] > 0),
'products' => $Products->getProductData2($store_id),
'validation' => $validation,
'page_title' => $this->pageTitle,
];
return $this->render_template('orders/create', $data);
}
}
/**
* Marquer une commande comme livrée
* Accessible uniquement par le rôle SECURITE
*/
public function markAsDelivered()
{
// Activer le retour JSON même en cas d'erreur
ini_set('display_errors', 0);
$order_id = $this->request->getPost('order_id');
$response = ['success' => false, 'messages' => ''];
try {
$session = session();
$users = $session->get('user');
// Vérifier que l'utilisateur est SECURITE
if (!isset($users['group_name']) || $users['group_name'] !== 'SECURITE') {
$response['messages'] = "Accès refusé : seule la sécurité peut marquer une commande comme livrée.";
return $this->response->setJSON($response);
}
if (!$order_id) {
$response['messages'] = "ID de commande manquant.";
return $this->response->setJSON($response);
}
$Orders = new Orders();
// Récupérer la commande actuelle
$current_order = $Orders->getOrdersData((int)$order_id);
if (!$current_order) {
$response['messages'] = "Commande introuvable.";
return $this->response->setJSON($response);
}
// Vérifier que la commande est validée (paid_status = 1)
if ($current_order['paid_status'] != 1) {
$response['messages'] = "Cette commande doit être validée avant d'être marquée comme livrée.";
return $this->response->setJSON($response);
}
// Mettre à jour UNIQUEMENT le statut à 3 (Livré)
$updated = $Orders->update((int)$order_id, ['paid_status' => 3]);
if ($updated) {
// Créer une notification
try {
$Notification = new NotificationController();
$Notification->createNotification(
"Commande " . $current_order['bill_no'] . " livrée avec succès",
"Direction",
(int)$current_order['store_id'],
"orders"
);
} catch (\Exception $e) {
// Si la notification échoue, on continue quand même
log_message('error', 'Erreur notification: ' . $e->getMessage());
}
$response['success'] = true;
$response['messages'] = "La commande a été marquée comme livrée avec succès.";
} else {
$response['messages'] = "Erreur lors de la mise à jour du statut.";
}
} catch (\Exception $e) {
log_message('error', 'Erreur markAsDelivered: ' . $e->getMessage());
$response['messages'] = "Erreur serveur : " . $e->getMessage();
}
return $this->response->setJSON($response);
}
public function getProductValueById()
{
$product_id = $this->request->getPost('product_id');
if ($product_id) {
$Products = new \App\Models\Products();
$product_data = $Products->getProductData($product_id);
$FourchettePrix = new \App\Models\FourchettePrix();
$fourchette = $FourchettePrix->where('product_id', $product_id)->first();
$response = [
'id' => $product_data['id'],
'sku' => $product_data['sku'],
'name' => $product_data['name'],
'prix_vente' => $product_data['prix_vente'],
'prix_minimal' => $fourchette ? $fourchette['prix_minimal'] : 0,
];
return $this->response->setJSON($response);
}
}
public function getTableProductRow()
{
$Products = new Products();
$session = session();
$users = $session->get('user');
$store_id = $users['store_id'];
$product_data = $Products->getProductData2($store_id);
die(var_dump($product_data));
return $this->response->setJSON($product_data);
}
public function update(int $id)
{
$this->verifyRole('updateOrder');
$data['page_title'] = $this->pageTitle;
$validation = \Config\Services::validation();
// ✅ NOUVELLE VÉRIFICATION : Bloquer UNIQUEMENT si statut = Validé (1) ou Validé et Livré (3)
$Orders = new Orders();
$current_order = $Orders->getOrdersData($id);
if (!$current_order) {
session()->setFlashData('errors', 'Commande introuvable.');
return redirect()->to('orders/');
}
// ✅ Bloquer UNIQUEMENT les statuts 1 (Validé) et 3 (Validé et Livré)
// Le statut 0 (Refusé) et 2 (En Attente) restent modifiables
if (in_array($current_order['paid_status'], [1, 3])) {
session()->setFlashData('errors', 'Cette commande ne peut plus être modifiée car elle est déjà validée ou livrée.');
return redirect()->to('orders/');
}
// Règles de validation
$validation->setRules([
'product' => 'required'
]);
$validationData = [
'product' => $this->request->getPost('product')
];
$Company = new Company();
$Products = new Products();
$OrderItems = new OrderItems();
$session = session();
$user = $session->get('user');
$role = $user['group_name'] ?? null;
if ($this->request->getMethod() === 'post' && $validation->run($validationData)) {
// ✅ DOUBLE VÉRIFICATION avant l'update
$current_order_check = $Orders->getOrdersData($id);
if (in_array($current_order_check['paid_status'], [1, 3])) {
session()->setFlashData('errors', 'Cette commande ne peut plus être modifiée car elle est déjà validée ou livrée.');
return redirect()->to('orders/');
}
$old_paid_status = $current_order['paid_status'];
// ✅ Statut payé pour COMMERCIALE reste toujours "En attente"
if ($role === 'COMMERCIALE') {
$paid_status = 2;
} else {
$paid_status = $this->request->getPost('paid_status');
}
// Gestion remise
$discount = $this->request->getPost('discount');
$original_discount = $this->request->getPost('original_discount');
if ($discount === '' || $discount === null) {
$discount = $original_discount;
}
$dataUpdate = [
'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'),
'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')),
'vat_charge_rate' => $this->request->getPost('vat_charge_rate'),
'vat_charge' => max(0, (float)$this->request->getPost('vat_charge_value')),
'net_amount' => $this->request->getPost('net_amount_value'),
'discount' => (float)$discount,
'paid_status' => $paid_status,
'product' => $this->request->getPost('product'),
'product_sold' => true,
'rate_value' => $this->request->getPost('rate_value'),
'amount_value' => $this->request->getPost('amount_value'),
'tranche_1' => $role !== 'COMMERCIALE' ? $this->request->getPost('tranche_1') : null,
'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
];
if ($Orders->updates($id, $dataUpdate)) {
$order_item_data = $OrderItems->getOrdersItemData($id);
$product_ids = array_column($order_item_data, 'product_id');
$Notification = new NotificationController();
// Notification pour la sécurité si commande validée
if ($old_paid_status == 2 && $paid_status == 1) {
$customer_name = $this->request->getPost('customer_name');
$bill_no = $current_order['bill_no'];
$Notification->createNotification(
"Commande validée: {$bill_no} - Client: {$customer_name}",
"SECURITE",
(int)$user['store_id'],
'orders'
);
}
// Gestion demande de remise
if ((float)$discount > 0) {
$productData = new Products();
$product_data_results = [];
foreach ($product_ids as $product_id) {
$product_data_results[] = $productData->getProductData((int) $product_id);
}
$product_lines = [];
foreach ($product_data_results as $product) {
if (isset($product['sku'], $product['price'])) {
$product_lines[] = "{$product['sku']}:{$product['price']}";
}
}
$product_output = implode("\n", $product_lines);
$data1 = [
'date_demande' => date('Y-m-d H:i:s'),
'montant_demande' => $this->request->getPost('discount'),
'total_price' => $this->request->getPost('amount_value'),
'id_store' => $user['store_id'],
'id_order' => $id,
'product' => $product_output,
'demande_status' => 'En attente'
];
$Remise = new Remise();
$Remise->updateRemise1($id, $data1);
$Notification->createNotification(
"Une nouvelle demande de remise a été ajoutée",
"Direction",
(int)$user['store_id'] ?? null,
"remise/"
);
}
session()->setFlashData('success', 'Commande mise à jour avec succès.');
return redirect()->to('orders/');
} else {
session()->setFlashData('errors', 'Une erreur est survenue lors de la mise à jour.');
return redirect()->to('orders/update/' . $id);
}
}
// Si GET ou validation échoue
$company = $Company->getCompanyData(1);
$data['company_data'] = $company;
$data['is_vat_enabled'] = ($company['vat_charge_value'] > 0);
$data['is_service_enabled'] = ($company['service_charge_value'] > 0);
$orders_data = $Orders->getOrdersData($id);
// ✅ Ajouter un flag pour désactiver le formulaire UNIQUEMENT pour les statuts 1 et 3
$data['is_editable'] = !in_array($orders_data['paid_status'], [1, 3]);
// Montant tranches
$orders_data['montant_tranches'] = (!empty($orders_data['discount']) && $orders_data['discount'] > 0)
? $orders_data['discount']
: $orders_data['gross_amount'];
$result = ['order' => $orders_data];
$orders_item = $OrderItems->getOrdersItemData($orders_data['id']);
foreach ($orders_item as $item) {
$result['order_item'][] = $item;
}
$data['order_data'] = $result;
$data['products'] = $Products->getActiveProductData();
$data['validation'] = $validation;
return $this->render_template('orders/edit', $data);
}
public function lookOrder(int $id)
{
$this->verifyRole('viewOrder');
$data['page_title'] = $this->pageTitle;
$Orders = new Orders();
$Company = new Company();
$Products = new Products();
$OrderItems = new OrderItems();
$Brands = new Brands();
// En cas d’échec de la validation ou si GET
$company = $Company->getCompanyData(1);
$data['company_data'] = $company;
$data['is_vat_enabled'] = ($company['vat_charge_value'] > 0);
$data['is_service_enabled'] = ($company['service_charge_value'] > 0);
$orders_data = $Orders->getOrdersData($id);
// $sum_order_item = $OrderItems->getSumOrdersItemData($orders_data['id']);
$result = [
'order' => $orders_data,
// 'sum_order_data' => $sum_order_item
];
$orders_item = $OrderItems->getOrdersItemData($orders_data['id']);
foreach ($orders_item as $item) {
$result['order_item'][] = $item;
}
$data['order_data'] = $result;
$data['products'] = $Products->getActiveProductData();
$data['brands'] = $Brands->findAll();
return $this->response->setJSON($data);
}
/**
* return storename
* @param int $id
* @return string
*/
private function returnStore($id)
{
$Stores = new Stores();
$store = $Stores->getActiveStore();
$name = "";
foreach ($store as $key => $value) {
if ($value['id'] == $id) {
$name = $value['name'];
}
}
return $name;
}
public function print2(int $id)
{
$this->verifyRole('viewOrder');
if ($id) {
$Orders = new Orders();
$Company = new Company();
$Products = new Products();
$OrderItems = new OrderItems();
// Récupération des données
$order_data = $Orders->getOrdersData($id);
$orders_items = $OrderItems->getOrdersItemData($id);
$company_info = $Company->getCompanyData(1);
// die(\var_dump($orders_items));
$html = '';
// Vérifier si l'utilisateur a payé
if ($order_data['paid_status'] == 1) {
$paid_status = "Validé";
} elseif ($order_data['paid_status'] == 2) {
$paid_status = "En Attente";
} else {
$paid_status = "Refusé";
}
// Génération du HTML
$html .= '
Facture ID : ' . esc($order_data['bill_no']) . '
NIF : ' . esc($company_info['NIF']) . '
STAT : ' . esc($company_info['STAT']) . '
Contact : ' . esc($company_info['phone']) . ' ' . esc($company_info['phone2']) . '
Magasin : ' . esc($this->returnStore($order_data['store_id'])) . '
Nom: ' . esc($order_data['customer_name']) . '
Adresse: ' . esc($order_data['customer_address']) . '
Téléphone: ' . esc($order_data['customer_phone']) . '
CIN: ' . esc($order_data['customer_cin']) . '
Antananarivo le ' . esc(date('d/m/Y')) . '
| Marque | Moteur | Puissance | Prix |
|---|---|---|---|
| ' . esc($product_data['sku']) . ' | ' . esc($product_data['numero_de_moteur']) . ' | ' . number_format((float) $item['amount'], 2, '.', ' ') . ' |
| Total: | ' . number_format(((float) $order_data['gross_amount'] - ((float) $order_data['gross_amount'] * 0.2)), 2, '.', ' ') . ' |
|---|---|
| TVA: | ' . number_format((((float) $order_data['gross_amount'] * 0.2)), 2, '.', ' ') . ' |
| Réduction: | ' . number_format((float) $order_data['discount'], 2, '.', ' ') . ' |
| Total à payer: | ' . number_format((float) ($order_data['net_amount']), 2, '.', ' ') . ' |
| Statut: | ' . $paid_status . ' |
| Mode de paiement: | ' . esc($order_data['order_payment_mode']) . ' |
| Tranche 1: | ' . number_format((float) $order_data['tranche_1'], 2, '.', ' ') . ' |
| Tranche 2: | ' . number_format((float) $order_data['tranche_2'], 2, '.', ' ') . ' |
L\'acheteur
Le vendeur
Facture ID : ' . esc($order_data['bill_no']) . '
NIF : ' . esc($company_info['NIF']) . '
STAT : ' . esc($company_info['STAT']) . '
Contact : ' . esc($company_info['phone']) . ' ' . esc($company_info['phone2']) . '
Magasin : ' . esc($this->returnStore($order_data['store_id'])) . '
Nom: ' . esc($order_data['customer_name']) . '
Adresse: ' . esc($order_data['customer_address']) . '
Téléphone: ' . esc($order_data['customer_phone']) . '
CIN: ' . esc($order_data['customer_cin']) . '
Antananarivo le ' . esc(date('d/m/Y')) . '
| Marque | Moteur | Puissance | Prix |
|---|---|---|---|
| ' . esc($product_data['sku']) . ' | ' . esc($product_data['numero_de_moteur']) . ' | ' . number_format((float)$item['amount'], 2, '.', ' ') . ' |
| Total: | ' . number_format($item['amount'] - ($item['amount'] * 0.2), 2, '.', ' ') . ' |
|---|---|
| TVA: | ' . number_format($item['amount'] * 0.2, 2, '.', ' ') . ' |
| Réduction: | ' . number_format($order_data['discount'], 2, '.', ' ') . ' |
| Total à payer: | ' . number_format($item['amount'] - $order_data['discount'], 2, '.', ' ') . ' |
| Statut: | ' . $paid_status . ' |
| Mode de paiement: | ' . esc($order_data['order_payment_mode']) . ' |
| Tranche 1: | ' . number_format((float)$order_data['tranche_1'], 2, '.', ' ') . ' |
| Tranche 2: | ' . number_format((float)$order_data['tranche_2'], 2, '.', ' ') . ' |
L\'acheteur
Le vendeur
Facture ID : ' . esc($order_data['bill_no']) . '
NIF : ' . esc($company_info['NIF']) . '
STAT : ' . esc($company_info['STAT']) . '
Contact : ' . esc($company_info['phone']) . ' / ' . esc($company_info['phone2']) . '
Magasin : ' . esc($this->returnStore($order_data['store_id'])) . '
Nom: ' . esc($order_data['customer_name']) . '
Adresse: ' . esc($order_data['customer_address']) . '
Téléphone: ' . esc($order_data['customer_phone']) . '
CIN: ' . esc($order_data['customer_cin']) . '
| Marque | Moteur | Puissance | Prix unitaire |
|---|---|---|---|
| ' . esc($product_data['sku']) . ' | ' . esc($product_data['numero_de_moteur']) . ' | ' . esc($product_data['puissance']) . ' | ' . number_format($unitPrice, 2, '.', ' ') . ' |
| Total: | |
|---|---|
| TVA (20%): | |
| Réduction: | |
| Total à payer: | |
| Statut: | |
| Mode de paiement: | |
| Tranche 1: | |
| Tranche 2: |
L\'acheteur
Le vendeur
Commande ID : ' . esc($order_data['order_no'] ?? $order_data['bill_no']) . '
Magasin : ' . esc($this->returnStore($order_data['store_id'])) . '
Nom: ' . esc($order_data['customer_name']) . '
Adresse: ' . esc($order_data['customer_address']) . '
Téléphone: ' . esc($order_data['customer_phone']) . '
CIN: ' . esc($order_data['customer_cin']) . '
| Marque | Moteur | Puissance | Prix |
|---|---|---|---|
| ' . esc($product_data['sku']) . ' | ' . esc($product_data['numero_de_moteur']) . ' | ' . number_format((float)$item['amount'], 2, '.', ' ') . ' |
| Total: | ' . number_format($total_ht, 2, '.', ' ') . ' |
|---|---|
| TVA: | ' . number_format($tva, 2, '.', ' ') . ' |
| Réduction: | ' . number_format($order_data['discount'], 2, '.', ' ') . ' |
| Total à payer: | ' . number_format($total_ttc, 2, '.', ' ') . ' |
L\'acheteur
Le vendeur
NIF : '.esc($company['NIF']).'
STAT : '.esc($company['STAT']).'
Contact : '.esc($company['phone']).' | '.esc($company['phone2']).'
Facture N° '.esc($order['bill_no']).'
DOIT Nom : '.esc($order['customer_name']).'
Adresse : '.esc($order['customer_address']).'
CIN : '.esc($order['customer_cin']).'
Téléphone : '.esc($order['customer_phone'] ?? '').'
Antananarivo, le '.$today.'
| Produit | Prix (Ar) | |||||
|---|---|---|---|---|---|---|
| '.esc($details['product_name']);
// Afficher le commentaire s'il existe
if (!empty($details['commentaire'])) {
$html .= ' '.esc($details['commentaire']).''; } $html .= ' |
'.number_format($prixAffiche, 0, '', ' ').' | |||||
| MARQUE | Désignation | N° Moteur | N° Châssis | Puissance (CC) | PRIX (Ar) |
|---|---|---|---|---|---|
| '.esc($details['marque']).' | '.esc($details['product_name']).' | '.esc($details['numero_moteur']).' | '.esc($details['numero_chassis']).' | '.esc($details['puissance']).' | '.number_format($prixAffiche, 0, '', ' ').' |
| Prix (HT) : | '.number_format($totalHT, 0, '', ' ').' Ar |
| TVA (20%) : | '.number_format($tva, 0, '', ' ').' Ar |
| Total (TTC) : | '.number_format($totalTTC, 0, '', ' ').' Ar |
NIF : '.esc($company['NIF']).'
STAT : '.esc($company['STAT']).'
Contact : '.esc($company['phone']).' | '.esc($company['phone2']).'
Bon de commande N° '.esc($order['bill_no']).'
Client : '.esc($order['customer_name']).'
Adresse : '.esc($order['customer_address']).'
Téléphone : '.esc($order['customer_phone']).'
CIN : '.esc($order['customer_cin']).'
Antananarivo, le '.$today.'
| Produit | Prix Unitaire (Ar) |
|---|---|
| '.esc($details['product_name']);
// Afficher le commentaire s'il existe
if (!empty($details['commentaire'])) {
$html .= ' Remarque : '.esc($details['commentaire']).''; } $html .= ' |
'.number_format($prixAffiche, 0, '', ' ').' |
| Nom | Marque | Catégorie | N° Moteur | Châssis | Puissance (CC) | Prix Unitaire (Ar) |
|---|---|---|---|---|---|---|
| '.esc($details['product_name']).' | '.esc($details['marque']).' | '.esc($categoryName).' | '.esc($details['numero_moteur']).' | '.esc($details['numero_chassis']).' | '.esc($details['puissance']).' | '.number_format($prixAffiche, 0, '', ' ').' |
| Total HT : | '.number_format($totalHT, 0, '', ' ').' Ar |
| TVA (20%) : | '.number_format($tva, 0, '', ' ').' Ar |
| Total TTC : | '.number_format($totalTTC, 0, '', ' ').' Ar |
| Statut : | '.$paidLabel.' |
| Mode de paiement : | '.esc($order['order_payment_mode']).' |
| Tranche 1 : | '.number_format((float)$order['tranche_1'], 0, '', ' ').' Ar |
| Tranche 2 : | '.number_format((float)$order['tranche_2'], 0, '', ' ').' Ar |
NIF : ' . esc($company_info['NIF']) . '
'; echo 'STAT : ' . esc($company_info['STAT']) . '
'; echo 'Contact : ' . esc($company_info['phone']) . ' | ' . esc($company_info['phone2']) . '
'; echo 'Magasin : ' . esc($this->returnStore($order_data['store_id'])) . '
'; echo '
';
echo 'Facture N° ' . esc($order_data['bill_no']) . '
'; echo 'Antananarivo, le ' . date('d/m/Y') . '
'; echo 'DOIT : ' . esc($order_data['customer_name']) . '
'; echo 'Adresse : ' . esc($order_data['customer_address']) . '
'; echo 'Téléphone : ' . esc($order_data['customer_phone']) . '
'; echo 'CIN : ' . esc($order_data['customer_cin']) . '
'; echo '| Désignation | '; echo 'Produit à compléter | '; echo 'Prix (Ar) | '; echo '
|---|---|---|
| ' . esc($details['product_name']) . ' | '; echo ''; echo ' | ' . number_format($prixAffiche, 0, '', ' ') . ' | '; echo '
| Remarque : ' . esc($details['commentaire']) . ' | ||
| Nom | Marque | Catégorie | N° Moteur | Châssis | Puissance (CC) | Prix Unit. (Ar) | '; echo '
|---|---|---|---|---|---|---|
| ' . esc($details['product_name']) . ' | '; echo '' . esc($details['marque']) . ' | '; echo '' . esc($categoryName) . ' | '; echo '' . esc($details['numero_moteur']) . ' | '; echo '' . esc($details['numero_chassis']) . ' | '; echo '' . esc($details['puissance']) . ' | '; echo '' . number_format($prixAffiche, 0, '', ' ') . ' | '; echo '
| Total HT : | ' . number_format($itemHT, 0, '', ' ') . ' Ar |
| TVA (20%) : | ' . number_format($itemTVA, 0, '', ' ') . ' Ar |
| Total TTC : | ' . number_format($prixAffiche, 0, '', ' ') . ' Ar |
| Statut : | ' . $paid_status . ' |
| Mode de paiement : | ' . esc($order_data['order_payment_mode']) . ' |
| Tranche 1 : | ' . number_format((float)$order_data['tranche_1'], 0, '', ' ') . ' Ar |
| Tranche 2 : | ' . number_format((float)$order_data['tranche_2'], 0, '', ' ') . ' Ar |
NIF : ' . esc($company_info['NIF']) . '
'; echo 'STAT : ' . esc($company_info['STAT']) . '
'; echo 'Contact : ' . esc($company_info['phone']) . ' | ' . esc($company_info['phone2']) . '
'; echo '
';
echo 'Bon de Commande N° ' . esc($order_data['bill_no']) . '
'; echo 'Client : ' . esc($order_data['customer_name']) . '
'; echo 'Adresse : ' . esc($order_data['customer_address']) . '
'; echo 'Téléphone : ' . esc($order_data['customer_phone']) . '
'; echo 'CIN : ' . esc($order_data['customer_cin']) . '
'; echo '| Désignation | '; echo 'Produit à compléter | '; echo 'Prix (Ar) | '; echo '
|---|---|---|
| ' . esc($details['product_name']) . ' | '; echo ''; echo ' | ' . number_format($prixAffiche, 0, '', ' ') . ' | '; echo '
| Nom | Marque | Catégorie | N° Moteur | Châssis | Puissance | Prix (Ar) | '; echo '
|---|---|---|---|---|---|---|
| ' . esc($details['product_name']) . ' | '; echo '' . esc($details['marque']) . ' | '; echo '' . esc($categoryName) . ' | '; echo '' . esc($details['numero_moteur']) . ' | '; echo '' . esc($details['numero_chassis']) . ' | '; echo '' . esc($details['puissance']) . ' | '; echo '' . number_format($prixAffiche, 0, '', ' ') . ' | '; echo '
| Total HT : | ' . number_format($totalHT, 0, '', ' ') . ' Ar |
| TVA : | ' . number_format($tva, 0, '', ' ') . ' Ar |
| Réduction : | ' . number_format($discount, 0, '', ' ') . ' Ar |
| Total TTC : | ' . number_format($totalTTC, 0, '', ' ') . ' Ar |
';
echo '