verifyRole('viewOrder');
$data['page_title'] = $this->pageTitle;
return $this->render_template('orders/index', $data);
}
/**
* Génère un numéro de facture personnalisé selon le magasin
* @param int $store_id
* @return string
*/
private function generateSimpleSequentialBillNo(int $store_id): string
{
$storePrefixes = [
1 => 'ANTS',
2 => 'BESA',
3 => 'BYPA',
4 => 'TOAM',
];
$prefix = $storePrefixes[$store_id] ?? 'STORE';
$db = \Config\Database::connect();
$lastBill = $db->table('orders')
->select('bill_no')
->like('bill_no', $prefix . '-', 'after')
->orderBy('id', 'DESC')
->limit(1)
->get()
->getRowArray();
if ($lastBill && !empty($lastBill['bill_no'])) {
// Extraire le numéro (ex: "BESA-001" -> 1)
preg_match('/-(\d+)$/', $lastBill['bill_no'], $matches);
if (isset($matches[1])) {
$lastNumber = (int)$matches[1];
$newNumber = $lastNumber + 1;
} else {
$newNumber = 1;
}
} else {
$newNumber = 1;
}
// Formater avec zéros (ex: 001, 002, 010, 100)
return $prefix . '-' . str_pad($newNumber, 3, '0', STR_PAD_LEFT);
}
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") {
$Remise = new Remise();
foreach ($data as $key => $value) {
$date_time = date('d-m-Y h:i a', strtotime($value['date_time']));
$buttons = '';
$discount = (float)$value['discount'];
// ✅ VÉRIFICATION : Si la commande est refusée (paid_status = 0), aucun bouton
if ($value['paid_status'] == 0) {
$buttons = ' Accès bloqué';
} else {
// ✅ Bouton imprimer
if (in_array('viewOrder', $this->permission)) {
// CAS 1 : Commande payée (1) ou livrée (3) → Toujours afficher imprimer
if (in_array($value['paid_status'], [1, 3])) {
$buttons .= '';
}
// CAS 2 : Commande en attente (2) SANS remise → Afficher imprimer
elseif ($value['paid_status'] == 2 && $discount == 0) {
$buttons .= '';
}
// CAS 3 : Commande en attente (2) AVEC remise validée → Afficher imprimer
elseif ($value['paid_status'] == 2 && $Remise->hasRemiseValidatedForOrder($value['id'])) {
$buttons .= '';
}
// CAS 4 : Commande en attente (2) AVEC remise en attente → Indicateur
elseif ($value['paid_status'] == 2 && $Remise->hasRemisePendingForOrder($value['id'])) {
$buttons .= '';
}
}
// ✅ Bouton voir
if (in_array('viewOrder', $this->permission)) {
// Afficher pour toutes les commandes sauf celles refusées
// Et pour les commandes en attente : seulement si pas de remise OU remise validée
if ($value['paid_status'] == 2) {
// En attente : vérifier la remise
if ($discount == 0 || $Remise->hasRemiseValidatedForOrder($value['id'])) {
$buttons .= '
';
}
} else {
// Payé ou Livré : toujours afficher
$buttons .= '
';
}
}
// ✅ Bouton modifier (seulement si paid_status = 2)
if (in_array('updateOrder', $this->permission)
&& $users["store_id"] == $value['store_id']
&& $value['paid_status'] == 2) {
// CAS 1 : Pas de remise → Afficher le bouton modifier
if ($discount == 0) {
$buttons .= ' ';
}
// CAS 2 : Remise validée → Afficher le bouton modifier
elseif ($Remise->hasRemiseValidatedForOrder($value['id'])) {
$buttons .= ' ';
}
}
}
// Statut de paiement
if ($value['paid_status'] == 1) {
$paid_status = 'Payé';
} elseif ($value['paid_status'] == 2) {
$paid_status = 'En Attente';
} elseif ($value['paid_status'] == 3) {
$paid_status = 'Payé 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(in_array($users['group_name'], ["Direction", "DAF", "SuperAdmin", "Administrator"])){
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 = 'payé';
} elseif ($value['paid_status'] == 2) {
$paid_status = 'En Attente';
} elseif ($value['paid_status'] == 3) {
$paid_status = 'Payé 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, Cheffe d'Agence)
// ========================================
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 = 'Payé';
} elseif ($value['paid_status'] == 2) {
$paid_status = 'En Attente';
} elseif ($value['paid_status'] == 3) {
$paid_status = 'Payé 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';
}
}
// ✅ CONDITION SPÉCIALE POUR SECURITE : remplacer Prix demandé et Prix de vente par Marque et Désignation
if ($users['group_name'] == "SECURITE") {
// Récupérer les infos produit
$OrderItems = new OrderItems();
$Products = new Products();
$Brands = new Brands();
$order_items = $OrderItems->getOrdersItemData($value['id']);
$marque = 'N/A';
$numero_serie = 'N/A';
if (!empty($order_items[0])) {
$product = $Products->getProductData($order_items[0]['product_id']);
if ($product) {
$numero_serie = $product['sku'] ?? 'N/A'; // ✅ Numéro de série
if (!empty($product['marque'])) {
$brand = $Brands->find($product['marque']);
if ($brand) {
$marque = $brand['name'];
}
}
}
}
$result['data'][$key] = [
$value['product_names'],
$value['user_name'],
$date_time . "
" . $statuDate,
$marque, // ✅ Remplace Prix demandé
$numero_serie, // ✅ Remplace Prix de vente
$paid_status,
$buttons
];
} else {
// Pour les autres (COMMERCIALE, Cheffe d'Agence)
$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->notifyGroupsByPermission('notifProduit', "Produit en rupture de stock", $store_id, "products");
}
}
}
private function calculGross($request)
{
$amount = $request;
$montant = 0;
for ($i = 0; $i < \count($amount); $i++) {
$montant += $amount[$i];
}
return $montant;
}
/**
* ✅ AMÉLIORATION : Notifications centralisées pour Direction/DAF/SuperAdmin (tous stores)
*/
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',
'customer_type' => 'required',
'source' => 'required'
]);
$validationData = [
'product' => $this->request->getPost('product'),
'customer_type' => $this->request->getPost('customer_type'),
'source' => $this->request->getPost('source')
];
$Orders = new Orders();
$Company = new Company();
$Products = new Products();
if (strtolower($this->request->getMethod()) === 'post' && $validation->run($validationData)) {
$session = session();
$users = $session->get('user');
$user_id = $users['id'];
$bill_no = $this->generateSimpleSequentialBillNo($users['store_id']);
$document_type = $this->request->getPost('document_type') ?? 'facture';
$posts = $this->request->getPost('product');
$rates = $this->request->getPost('rate_value');
$amounts = $this->request->getPost('amount_value');
$puissances = $this->request->getPost('puissance');
$quantities = $this->request->getPost('qty'); // ✅ RÉCUPÉRER LES QUANTITÉS
$discount = (float)$this->request->getPost('discount') ?? 0;
$gross_amount = $this->calculGross($amounts);
$net_amount = $gross_amount - $discount;
// Vérification prix minimal SI rabais existe
if ($discount > 0) {
$FourchettePrix = new \App\Models\FourchettePrix();
foreach ($posts as $index => $productId) {
$productId = (int)$productId;
$productData = $Products->getProductData($productId);
$fourchette = $FourchettePrix->getFourchettePrixByProductId($productId);
if ($fourchette) {
$prixMinimal = (float)$fourchette['prix_minimal'];
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é."
]);
}
}
}
}
$tranche_1 = (float)$this->request->getPost('tranche_1') ?? 0;
$tranche_2 = (float)$this->request->getPost('tranche_2') ?? 0;
if ($tranche_1 > 0 && $tranche_2 > 0) {
$total_tranches = $tranche_1 + $tranche_2;
if (abs($total_tranches - $net_amount) > 0.01) {
return redirect()->back()
->withInput()
->with('errors', [
'Les tranches de paiement ne correspondent pas au montant total (' .
number_format($net_amount, 0, ',', ' ') . ' Ar)'
]);
}
}
$data = [
'bill_no' => $bill_no,
'document_type' => $document_type,
'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'),
'source' => $this->request->getPost('source'),
'date_time' => date('Y-m-d H:i:s'),
'service_charge_rate' => 0,
'vat_charge_rate' => 0,
'vat_charge' => 0,
'net_amount' => $net_amount,
'discount' => $discount,
'paid_status' => 2,
'user_id' => $user_id,
'amount_value' => $amounts,
'gross_amount' => $gross_amount,
'rate_value' => $rates,
'puissance' => $puissances,
'qty' => $quantities, // ✅ AJOUTER LES QUANTITÉS
'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) {
// ✅ MARQUER LES PRODUITS COMME VENDUS (SEULEMENT SI QTY = 1)
$productModel = new Products();
foreach ($posts as $index => $product_id) {
$qty = isset($quantities[$index]) ? (int)$quantities[$index] : 1;
if ($qty == 1) {
// Vente unitaire : marquer comme vendu
$productModel->update($product_id, ['product_sold' => 1]);
}
// Si qty > 1, vous devriez décrémenter un stock si vous en avez un
}
session()->setFlashdata('success', 'Créé avec succès');
$Notification = new NotificationController();
$Stores = new Stores();
if ($discount > 0) {
// Demande de remise
$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 = [];
$product_info_lines = [];
foreach ($product_data_results as $product) {
if (isset($product['sku'], $product['price'])) {
$product_lines[] = $product['sku'] . ':' . $product['price'];
}
$name = $product['name'] ?? '-';
$sku = $product['sku'] ?? '-';
$moteur = $product['numero_de_moteur'] ?? '-';
$chasis = $product['chasis'] ?? '-';
$puissance= $product['puissance'] ?? '-';
$image = $product['image'] ?? '';
$imgUrl = base_url('assets/images/product_image/' . $image);
$details = htmlspecialchars(json_encode([
'name' => $name,
'sku' => $sku,
'moteur' => $moteur,
'chasis' => $chasis,
'puissance' => $puissance,
'image' => $image ? $imgUrl : '',
], JSON_UNESCAPED_UNICODE), ENT_QUOTES);
$imgTag = $image
? ""
: "No img";
$product_info_lines[] =
"
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 (CC) | Prix unitaire |
|---|---|---|---|
| ' . esc($product_data['sku']) . ' | ' . esc($product_data['numero_de_moteur']) . ' | ' . number_format($unitPrice, 2, '.', ' ') . ' |
| Total HT: | ' . number_format($subtotal, 2, '.', ' ') . ' Ar |
|---|---|
| TVA (20%): | ' . number_format($vatAmount, 2, '.', ' ') . ' Ar |
| Réduction: | ' . number_format($discount, 2, '.', ' ') . ' Ar |
| Total à payer: | ' . number_format($totalNet, 2, '.', ' ') . ' Ar |
| Statut: | ' . $paid_status . ' |
| Mode de paiement: | ' . esc($order_data['order_payment_mode']) . ' |
| Tranche 1: | ' . number_format((float)$order_data['tranche_1'], 2, '.', ' ') . ' Ar |
| Tranche 2: | ' . number_format((float)$order_data['tranche_2'], 2, '.', ' ') . ' Ar |
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 (CC) | Prix |
|---|---|---|---|
| ' . esc($product_data['sku']) . ' | ' . esc($product_data['numero_de_moteur']) . ' | ' . number_format((float)$item['amount'], 2, '.', ' ') . ' |
| Total HT: | ' . number_format($total_ht, 2, '.', ' ') . ' Ar |
|---|---|
| TVA (20%): | ' . number_format($tva, 2, '.', ' ') . ' Ar |
| Réduction: | ' . number_format($order_data['discount'], 2, '.', ' ') . ' Ar |
| Total à payer: | ' . number_format($total_ttc, 2, '.', ' ') . ' Ar |
L\'acheteur
Le vendeur
NIF : '.esc($company['NIF']).'
STAT : '.esc($company['STAT']).'
Contact : '.esc($company['phone']).' | '.esc($company['phone2']).'
'.$documentTitle.' 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 | Quantité | Prix unitaire (Ar) | Montant (Ar) |
|---|---|---|---|
| '.esc($details['product_name']);
if (!empty($details['commentaire'])) {
$html .= ' '.esc($details['commentaire']).''; } $html .= ' |
'.esc($qty).' | '.number_format($prixUnitaire, 0, '', ' ').' | '.number_format($prixTotal, 0, '', ' ').' |
| MARQUE | Désignation | N° Moteur | N° Châssis | Puissance (CC) | Quantité | Prix Unit. (Ar) | Montant (Ar) |
|---|---|---|---|---|---|---|---|
| '.esc($details['marque']).' | '.esc($details['product_name']).' | '.esc($details['numero_moteur']).' | '.esc($details['numero_chassis']).' | '.esc($details['puissance']).' | '.esc($qty).' | '.number_format($prixUnitaire, 0, '', ' ').' | '.number_format($prixTotal, 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']).'
'.$documentTitle.' 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 | Quantité | Prix Unitaire (Ar) | Montant (Ar) |
|---|---|---|---|
| '.esc($details['product_name']);
if (!empty($details['commentaire'])) {
$html .= ' Remarque : '.esc($details['commentaire']).''; } $html .= ' |
'.esc($qty).' | '.number_format($prixUnitaire, 0, '', ' ').' | '.number_format($prixTotal, 0, '', ' ').' |
| Nom | Marque | Catégorie | N° Moteur | Châssis | Puissance (CC) | Quantité | Prix Unit. (Ar) | Montant (Ar) |
|---|---|---|---|---|---|---|---|---|
| '.esc($details['product_name']).' | '.esc($details['marque']).' | '.esc($categoryName).' | '.esc($details['numero_moteur']).' | '.esc($details['numero_chassis']).' | '.esc($details['puissance']).' | '.esc($qty).' | '.number_format($prixUnitaire, 0, '', ' ').' | '.number_format($prixTotal, 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 '' . $documentTitle . ' 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 'Quantité | '; echo 'Prix Unit. (Ar) | '; echo 'Montant (Ar) | '; echo '
|---|---|---|---|---|
| ' . esc($details['product_name']) . ' | '; echo ''; echo ' | ' . esc($qty) . ' | '; echo '' . number_format($prixUnitaire, 0, '', ' ') . ' | '; echo '' . number_format($prixTotal, 0, '', ' ') . ' | '; echo '
| Remarque : ' . esc($details['commentaire']) . ' | ||||
| Nom | '; echo 'Marque | '; echo 'Catégorie | '; echo 'N° Moteur | '; echo 'Châssis | '; echo 'Puissance (CC) | '; echo 'Qté | '; echo 'Prix Unit. (Ar) | '; echo 'Montant (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 '' . esc($qty) . ' | '; echo '' . number_format($prixUnitaire, 0, '', ' ') . ' | '; echo '' . number_format($prixTotal, 0, '', ' ') . ' | '; echo '
| Total HT : | ' . number_format($itemHT, 0, '', ' ') . ' Ar |
| TVA (20%) : | ' . number_format($itemTVA, 0, '', ' ') . ' Ar |
| Total TTC : | ' . number_format($prixTotal, 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 '' . $documentTitle . ' 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 'Quantité | '; echo 'Prix Unit. (Ar) | '; echo 'Montant (Ar) | '; echo '
|---|---|---|---|---|
| ' . esc($details['product_name']) . ' | '; echo ''; echo ' | ' . esc($qty) . ' | '; echo '' . number_format($prixUnitaire, 0, '', ' ') . ' | '; echo '' . number_format($prixTotal, 0, '', ' ') . ' | '; echo '
| Nom | '; echo 'Marque | '; echo 'Catégorie | '; echo 'N° Moteur | '; echo 'Châssis | '; echo 'Puissance | '; echo 'Qté | '; echo 'Prix Unit. (Ar) | '; echo 'Montant (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 '' . esc($qty) . ' | '; echo '' . number_format($prixUnitaire, 0, '', ' ') . ' | '; echo '' . number_format($prixTotal, 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 '