<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * Pdf_fret Library
 * Génération des documents PDF pour le module Fret
 * 
 * MODIFIÉ: Support du champ nb_colis (nombre de colis identiques par ligne)
 * 
 * Documents générés:
 * - Bordereau d'expédition (2 pages: exemplaire client + étiquette marchandise en ROUGE)
 * - Connaissement maritime (Bill of Lading)
 * - Bon de livraison
 * - Manifeste fret
 */

require_once APPPATH . 'third_party/fpdf/fpdf.php';

class Pdf_fret extends FPDF {
    
    protected $CI;
    
    public function __construct() {
        parent::__construct('P', 'mm', 'A4');
        $this->CI =& get_instance();
        $this->SetAutoPageBreak(true, 15);
    }
    
    /**
     * En-tête standard (désactivé pour contrôle manuel)
     */
    public function Header() {
        // Désactivé - on gère manuellement
    }
    
    /**
     * Pied de page
     */
    public function Footer() {
        $this->SetY(-15);
        $this->SetFont('Arial', 'I', 8);
        $this->Cell(0, 10, 'Page ' . $this->PageNo() . '/{nb}', 0, 0, 'C');
    }
    
    /**
     * En-tête entreprise réutilisable
     */
    protected function enteteEntreprise() {
        // Logo (si disponible)
        if (file_exists(FCPATH . 'assets/img/logo.png')) {
            $this->Image(FCPATH . 'assets/img/logo.png', 10, 8, 30);
        }
        
        $this->SetFont('Arial', 'B', 18);
        $this->Cell(0, 8, 'YAMEELA', 0, 1, 'C');
        $this->SetFont('Arial', 'B', 12);
        $this->Cell(0, 6, 'WASSIM SERVICES', 0, 1, 'C');
        $this->SetFont('Arial', '', 10);
        $this->Cell(0, 5, 'Transport Maritime Inter-Iles - Union des Comores', 0, 1, 'C');
        $this->Cell(0, 5, 'Tel: +269 444 44 42 | Email: wassimserviceswassim@gmail.com', 0, 1, 'C');
        
        $this->Ln(3);
        $this->Line(10, $this->GetY(), 200, $this->GetY());
        $this->Ln(5);
    }
    
    /**
     * Calculer le nombre total de colis d'une expédition
     * NOUVEAU: Prend en compte le champ nb_colis de chaque ligne
     */
    protected function calculerTotalColis($lignes) {
        $total = 0;
        foreach ($lignes as $ligne) {
            $nb_colis = isset($ligne->nb_colis) ? (int)$ligne->nb_colis : 1;
            $total += $nb_colis;
        }
        return $total;
    }
    
    /**
     * Calculer le poids total réel (avec nb_colis)
     */
    protected function calculerPoidsTotal($lignes) {
        $total = 0;
        foreach ($lignes as $ligne) {
            $nb_colis = isset($ligne->nb_colis) ? (int)$ligne->nb_colis : 1;
            $poids = isset($ligne->poids_facture) ? (float)$ligne->poids_facture : 0;
            $total += ($poids * $nb_colis);
        }
        return $total;
    }
    
    // ================================================================
    // BORDEREAU D'EXPÉDITION - 2 PAGES
    // Page 1: Exemplaire client/bureau
    // Page 2: Étiquette à coller sur marchandise (en ROUGE)
    // ================================================================
    
    /**
     * Générer bordereau d'expédition complet (2 pages)
     */
    public function generer_bordereau($expedition, $lignes) {
        $this->AliasNbPages();
        
        // PAGE 1: Exemplaire client/bureau
        $this->AddPage();
        $this->generer_page_bordereau($expedition, $lignes, 'EXEMPLAIRE CLIENT');
        
        // PAGE 2: Étiquette à coller sur marchandise
        $this->AddPage();
        $this->generer_page_etiquette($expedition, $lignes);
        
        // Output
        $filename = 'Bordereau_' . $expedition->numero_expedition . '.pdf';
        $this->Output('D', $filename);
    }
    
    /**
     * Page 1: Bordereau standard
     * MODIFIÉ: Ajout colonne Nb Colis
     */
    protected function generer_page_bordereau($expedition, $lignes, $type_exemplaire = '') {
        // En-tête entreprise
        $this->enteteEntreprise();
        
        // Titre document
        $this->SetFont('Arial', 'B', 14);
        $this->SetFillColor(52, 73, 94);
        $this->SetTextColor(255, 255, 255);
        $this->Cell(0, 10, "BON D'EMBARQUEMENT / BORDEREAU D'EXPEDITION FRET", 1, 1, 'C', true);
        $this->SetTextColor(0, 0, 0);
        
        // Type d'exemplaire
        if ($type_exemplaire) {
            $this->SetFont('Arial', 'I', 9);
            $this->Cell(0, 5, $type_exemplaire, 0, 1, 'C');
        }
        $this->Ln(3);
        
        // Numéro et date
        $this->SetFont('Arial', 'B', 11);
        $this->Cell(95, 8, utf8_decode('N°: ' . $expedition->numero_expedition), 1, 0, 'L');
        $this->Cell(95, 8, 'Date: ' . date('d/m/Y H:i', strtotime($expedition->created_at)), 1, 1, 'R');
        
        // Voyage
        $this->SetFont('Arial', '', 10);
        $this->SetFillColor(236, 240, 241);
        $voyage_info = 'VOYAGE: ' . $expedition->numero_voyage . ' - ' . 
                       date('d/m/Y', strtotime($expedition->date_voyage)) . ' | ' . 
                       $expedition->port_depart . ' -> ' . $expedition->port_arrivee;
        $this->Cell(190, 7, utf8_decode($voyage_info), 1, 1, 'C', true);
        $this->Ln(3);
        
        // Expéditeur / Destinataire
        $this->SetFont('Arial', 'B', 10);
        $this->SetFillColor(230, 230, 230);
        $this->Cell(95, 7, 'EXPEDITEUR', 1, 0, 'C', true);
        $this->Cell(95, 7, 'DESTINATAIRE', 1, 1, 'C', true);
        
        $this->SetFont('Arial', '', 10);
        $this->Cell(95, 6, utf8_decode($expedition->expediteur_nom), 1, 0);
        $this->Cell(95, 6, utf8_decode($expedition->destinataire_nom), 1, 1);
        
        $this->Cell(95, 6, utf8_decode('Tel: ' . $expedition->expediteur_telephone), 1, 0);
        $this->Cell(95, 6, utf8_decode('Tel: ' . $expedition->destinataire_telephone), 1, 1);
        
        $addr_exp = $expedition->expediteur_adresse ?: '-';
        $addr_dest = $expedition->destinataire_adresse ?: '-';
        $this->Cell(95, 6, utf8_decode('Adresse: ' . substr($addr_exp, 0, 40)), 1, 0);
        $this->Cell(95, 6, utf8_decode('Adresse: ' . substr($addr_dest, 0, 40)), 1, 1);
        
        $this->Ln(3);
        
        // Détail des marchandises - MODIFIÉ: Ajout colonne Nb Colis
        $this->SetFont('Arial', 'B', 9);
        $this->SetFillColor(200, 200, 200);
        $this->Cell(8, 7, '#', 1, 0, 'C', true);
        $this->Cell(60, 7, 'DESIGNATION', 1, 0, 'C', true);
        $this->Cell(18, 7, 'TAILLE', 1, 0, 'C', true);
        $this->Cell(12, 7, 'QTE', 1, 0, 'C', true);
        $this->Cell(18, 7, 'NB COLIS', 1, 0, 'C', true); // NOUVEAU
        $this->Cell(20, 7, 'POIDS', 1, 0, 'C', true);
        $this->Cell(27, 7, 'P.U.', 1, 0, 'C', true);
        $this->Cell(27, 7, 'TOTAL', 1, 1, 'C', true);
        
        $this->SetFont('Arial', '', 8);
        $total_colis = 0;
        
        foreach ($lignes as $ligne) {
            $nb_colis = isset($ligne->nb_colis) ? (int)$ligne->nb_colis : 1;
            $total_colis += $nb_colis;
            
            // Préparer la désignation complète
            $designation = $ligne->designation;
            if (isset($ligne->description) && !empty($ligne->description)) {
                $designation .= ' - ' . $ligne->description;
            }
            if (isset($ligne->est_perissable) && $ligne->est_perissable) $designation .= ' [P]';
            if (isset($ligne->est_fragile) && $ligne->est_fragile) $designation .= ' [F]';
            $designation_decoded = utf8_decode($designation);
            
            // Calculer la hauteur nécessaire pour la désignation
            // Environ 28 caractères par ligne dans une cellule de 60mm avec police 8
            $nb_lignes_texte = max(1, ceil($this->GetStringWidth($designation_decoded) / 56));
            $hauteur_ligne = max(6, $nb_lignes_texte * 4);
            
            // Sauvegarder la position de départ
            $y_start = $this->GetY();
            $x_start = $this->GetX();
            
            // D'abord dessiner le MultiCell pour la désignation (pour connaître la hauteur réelle)
            $this->SetXY($x_start + 8, $y_start); // Position après la colonne #
            $this->MultiCell(60, 4, $designation_decoded, 1, 'L');
            $y_after = $this->GetY();
            $hauteur_reelle = $y_after - $y_start;
            
            // Revenir en arrière pour dessiner la colonne # avec la bonne hauteur
            $this->SetXY($x_start, $y_start);
            $this->Cell(8, $hauteur_reelle, $ligne->ligne_numero, 1, 0, 'C');
            
            // Positionner après la désignation pour les autres colonnes
            $this->SetXY($x_start + 8 + 60, $y_start);
            
            // Autres colonnes avec la même hauteur
            $this->Cell(18, $hauteur_reelle, isset($ligne->taille_code) ? $ligne->taille_code : '-', 1, 0, 'C');
            $this->Cell(12, $hauteur_reelle, $ligne->quantite, 1, 0, 'C');
            
            // Affichage nb_colis en bleu si > 1
            if ($nb_colis > 1) {
                $this->SetTextColor(0, 102, 204);
                $this->SetFont('Arial', 'B', 8);
            }
            $this->Cell(18, $hauteur_reelle, $nb_colis, 1, 0, 'C');
            $this->SetTextColor(0, 0, 0);
            $this->SetFont('Arial', '', 8);
            
            // Poids total pour cette ligne (poids × nb_colis)
            $poids_unitaire = isset($ligne->poids_facture) ? $ligne->poids_facture : 0;
            $poids_total_ligne = $poids_unitaire * $nb_colis;
            $poids_display = $poids_total_ligne > 0 ? number_format($poids_total_ligne, 1) . 'kg' : 'N/A';
            $this->Cell(20, $hauteur_reelle, $poids_display, 1, 0, 'C');
            
            $this->Cell(27, $hauteur_reelle, number_format($ligne->tarif_unitaire, 0, ',', ' '), 1, 0, 'R');
            $this->Cell(27, $hauteur_reelle, number_format($ligne->tarif_ligne, 0, ',', ' '), 1, 0, 'R');
            
            // Aller à la ligne suivante
            $this->SetY($y_after);
        }
        
        // Réinitialiser la position X
        $this->SetX(10);
        
        // Ligne de totaux
        $this->SetFont('Arial', 'B', 8);
        $this->SetFillColor(240, 240, 240);
        $this->Cell(98, 6, 'TOTAUX', 1, 0, 'R', true);
        $this->Cell(18, 6, $total_colis . ' colis', 1, 0, 'C', true);
        $this->Cell(20, 6, number_format($expedition->poids_total_kg, 1) . 'kg', 1, 0, 'C', true);
        $this->Cell(54, 6, number_format($expedition->sous_total_articles, 0, ',', ' ') . ' FC', 1, 1, 'R', true);
        
        $this->Ln(3);
        
        // Récapitulatif tarification
        $this->SetFont('Arial', '', 10);
        $x_label = 120;
        $w_label = 45;
        $w_value = 35;
        
        $this->Cell($x_label, 6, '', 0, 0);
        $this->Cell($w_label, 6, 'Sous-total:', 0, 0, 'R');
        $this->Cell($w_value, 6, number_format($expedition->sous_total_articles, 0, ',', ' ') . ' FC', 0, 1, 'R');
        
        if ($expedition->coefficient_route != 1) {
            $this->Cell($x_label, 6, '', 0, 0);
            $this->Cell($w_label, 6, utf8_decode('Coef. route (x' . $expedition->coefficient_route . '):'), 0, 0, 'R');
            $this->Cell($w_value, 6, number_format($expedition->montant_apres_coef, 0, ',', ' ') . ' FC', 0, 1, 'R');
        }
        
        if (isset($expedition->supplement_lourd) && $expedition->supplement_lourd > 0) {
            $this->Cell($x_label, 6, '', 0, 0);
            $this->Cell($w_label, 6, '+ Lourd:', 0, 0, 'R');
            $this->Cell($w_value, 6, number_format($expedition->supplement_lourd, 0, ',', ' ') . ' FC', 0, 1, 'R');
        }
        
        if (isset($expedition->supplement_fragile) && $expedition->supplement_fragile > 0) {
            $this->Cell($x_label, 6, '', 0, 0);
            $this->Cell($w_label, 6, '+ Fragile:', 0, 0, 'R');
            $this->Cell($w_value, 6, number_format($expedition->supplement_fragile, 0, ',', ' ') . ' FC', 0, 1, 'R');
        }
        
        if (isset($expedition->montant_remise) && $expedition->montant_remise > 0) {
            $this->Cell($x_label, 6, '', 0, 0);
            $this->Cell($w_label, 6, '- Remise:', 0, 0, 'R');
            $this->SetTextColor(200, 0, 0);
            $this->Cell($w_value, 6, '-' . number_format($expedition->montant_remise, 0, ',', ' ') . ' FC', 0, 1, 'R');
            $this->SetTextColor(0, 0, 0);
        }
        
        // Total final
        $this->Ln(2);
        $this->SetFont('Arial', 'B', 12);
        $this->Cell($x_label, 10, '', 0, 0);
        $this->SetFillColor(39, 174, 96);
        $this->SetTextColor(255, 255, 255);
        $this->Cell($w_label + $w_value, 10, 'TOTAL: ' . number_format($expedition->tarif_total, 0, ',', ' ') . ' FC', 1, 1, 'C', true);
        $this->SetTextColor(0, 0, 0);
        
        // Statut paiement
        $this->Ln(3);
        $this->SetFont('Arial', 'B', 10);
        if ($expedition->statut_paiement == 'PAYE') {
            $this->SetTextColor(39, 174, 96);
            $this->Cell(0, 6, utf8_decode('PAYÉ le ' . date('d/m/Y à H:i', strtotime($expedition->date_paiement))), 0, 1, 'C');
        } else {
            $this->SetTextColor(231, 76, 60);
            $this->Cell(0, 6, 'EN ATTENTE DE PAIEMENT', 0, 1, 'C');
        }
        $this->SetTextColor(0, 0, 0);
        
        // Informations complémentaires - MODIFIÉ: Utilise total_colis calculé
        $this->Ln(3);
        $this->SetFont('Arial', '', 9);
        $this->Cell(95, 5, 'Poids total: ' . number_format($expedition->poids_total_kg, 2) . ' kg', 0, 0);
        $this->Cell(95, 5, utf8_decode('Volume: ' . number_format($expedition->volume_total_m3, 3) . ' m³'), 0, 1);
        
        // MODIFIÉ: Affichage du vrai nombre de colis
        $nb_colis_total = isset($expedition->nb_colis_total) ? $expedition->nb_colis_total : $total_colis;
        $this->Cell(95, 5, 'Nombre de colis: ' . $nb_colis_total, 0, 0);
        $mode_paiement = isset($expedition->mode_paiement_reel) ? $expedition->mode_paiement_reel : 
                        (isset($expedition->mode_paiement_prevu) ? $expedition->mode_paiement_prevu : '-');
        $this->Cell(95, 5, utf8_decode('Mode paiement: ' . $mode_paiement), 0, 1);
        
        // Numéro d'expédition
        $this->Ln(5);
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(0, 5, utf8_decode('N° EXPÉDITION: ') . $expedition->numero_expedition, 0, 1, 'C');
        
        $this->Ln(5);
        
        // Signature à droite (70mm de large)
        $this->Cell(120, 6, '', 0, 0); // Espace à gauche
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(70, 6, 'Cachet et Signature', 1, 1, 'C');
        $this->Cell(120, 20, '', 0, 0); // Espace à gauche
        $this->Cell(70, 20, '', 1, 1);
    }
    
    /**
     * Page 2: Étiquette à coller sur marchandise (EN ROUGE)
     * MODIFIÉ: Affichage du vrai nombre de colis
     */
    protected function generer_page_etiquette($expedition, $lignes) {
        // Calculer le vrai nombre de colis
        $total_colis = $this->calculerTotalColis($lignes);
        
        // Cadre rouge épais
        $this->SetDrawColor(200, 0, 0);
        $this->SetLineWidth(3);
        $this->Rect(10, 10, 190, 277, 'D');
        $this->SetLineWidth(0.2);
        $this->SetDrawColor(0, 0, 0);
        
        // MENTION ROUGE EN HAUT
        $this->SetY(18);
        $this->SetFont('Arial', 'B', 18);
        $this->SetTextColor(200, 0, 0);
        $this->Cell(0, 12, '!!! A COLLER SUR LA MARCHANDISE !!!', 0, 1, 'C');
        
        $this->Ln(3);
        
        // En-tête entreprise
        $this->SetTextColor(0, 0, 0);
        $this->SetFont('Arial', 'B', 16);
        $this->Cell(0, 8, 'YAMEELA', 0, 1, 'C');
        $this->SetFont('Arial', 'B', 11);
        $this->Cell(0, 6, 'WASSIM SERVICES', 0, 1, 'C');
        $this->SetFont('Arial', '', 10);
        $this->Cell(0, 5, 'SERVICE FRET MARITIME', 0, 1, 'C');
        
        $this->Ln(5);
        
        // Numéro d'expédition GRAND
        $this->SetFont('Arial', 'B', 22);
        $this->SetFillColor(200, 0, 0);
        $this->SetTextColor(255, 255, 255);
        $this->Cell(0, 14, $expedition->numero_expedition, 1, 1, 'C', true);
        $this->SetTextColor(0, 0, 0);
        
        $this->Ln(5);
        
        // Route
        $this->SetFont('Arial', 'B', 16);
        $this->SetFillColor(41, 128, 185);
        $this->SetTextColor(255, 255, 255);
        $route = $expedition->port_depart . '  -->  ' . $expedition->port_arrivee;
        $this->Cell(0, 12, utf8_decode($route), 1, 1, 'C', true);
        $this->SetTextColor(0, 0, 0);
        
        $this->Ln(3);
        
        // Voyage
        $this->SetFont('Arial', '', 11);
        $voyage_info = 'Voyage: ' . $expedition->numero_voyage . ' - ' . date('d/m/Y', strtotime($expedition->date_voyage));
        $this->Cell(0, 7, utf8_decode($voyage_info), 0, 1, 'C');
        
        $this->Ln(5);
        
        // DESTINATAIRE (grand et visible) - ENCADRÉ ROUGE
        $this->SetFont('Arial', 'B', 11);
        $this->SetFillColor(255, 200, 200);
        $this->SetDrawColor(200, 0, 0);
        $this->SetLineWidth(1);
        $this->Cell(0, 8, 'DESTINATAIRE', 1, 1, 'C', true);
        
        $this->SetFont('Arial', 'B', 18);
        $this->Cell(0, 12, utf8_decode(strtoupper($expedition->destinataire_nom)), 1, 1, 'C');
        
        $this->SetFont('Arial', 'B', 14);
        $this->Cell(0, 10, utf8_decode('TEL: ' . $expedition->destinataire_telephone), 1, 1, 'C');
        
        if ($expedition->destinataire_adresse) {
            $this->SetFont('Arial', '', 11);
            $this->Cell(0, 7, utf8_decode($expedition->destinataire_adresse), 1, 1, 'C');
        }
        
        $this->SetLineWidth(0.2);
        $this->SetDrawColor(0, 0, 0);
        
        $this->Ln(5);
        
        // Expéditeur
        $this->SetFont('Arial', 'B', 10);
        $this->SetFillColor(230, 230, 230);
        $this->Cell(0, 6, 'EXPEDITEUR', 1, 1, 'C', true);
        
        $this->SetFont('Arial', '', 11);
        $exp_info = $expedition->expediteur_nom . ' - Tel: ' . $expedition->expediteur_telephone;
        $this->Cell(0, 7, utf8_decode($exp_info), 1, 1, 'C');
        
        $this->Ln(5);
        
        // Contenu résumé - MODIFIÉ: Inclut nb_colis
        $this->SetFont('Arial', 'B', 10);
        $this->SetFillColor(230, 230, 230);
        $this->Cell(0, 6, 'CONTENU', 1, 1, 'C', true);
        
        $this->SetFont('Arial', '', 10);
        $designations = array();
        foreach ($lignes as $ligne) {
            $nb_colis = isset($ligne->nb_colis) ? (int)$ligne->nb_colis : 1;
            $qte_display = $ligne->quantite;
            if ($nb_colis > 1) {
                $designations[] = $ligne->designation . ' (x' . $qte_display . ') x' . $nb_colis . ' colis';
            } else {
                $designations[] = $ligne->designation . ' (x' . $qte_display . ')';
            }
        }
        $contenu = implode(', ', $designations);
        if (strlen($contenu) > 80) {
            $contenu = substr($contenu, 0, 77) . '...';
        }
        $this->MultiCell(0, 6, utf8_decode($contenu), 1, 'C');
        
        $this->Ln(3);
        
        // Poids et nombre de colis - MODIFIÉ: Utilise le vrai total
        $this->SetFont('Arial', 'B', 14);
        $poids_display = ($expedition->poids_total_kg > 0) ? number_format($expedition->poids_total_kg, 2) . ' kg' : 'N/A';
        $this->Cell(95, 12, 'POIDS: ' . $poids_display, 1, 0, 'C');
        $this->Cell(95, 12, 'COLIS: ' . $total_colis, 1, 1, 'C');
        
        $this->Ln(3);
        
        // Mentions spéciales EN ROUGE
        $mentions = array();
        if (isset($expedition->est_fragile) && $expedition->est_fragile) $mentions[] = '!!! FRAGILE !!!';
        if (isset($expedition->est_prioritaire) && $expedition->est_prioritaire) $mentions[] = 'PRIORITAIRE';
        if (isset($expedition->est_urgent) && $expedition->est_urgent) $mentions[] = 'URGENT';
        
        if (!empty($mentions)) {
            $this->SetFont('Arial', 'B', 16);
            $this->SetTextColor(200, 0, 0);
            $this->Cell(0, 12, implode('   ', $mentions), 0, 1, 'C');
            $this->SetTextColor(0, 0, 0);
        }
        
        // Statut paiement
        $this->Ln(2);
        $this->SetFont('Arial', 'B', 12);
        if ($expedition->statut_paiement == 'PAYE') {
            $this->SetFillColor(39, 174, 96);
            $this->SetTextColor(255, 255, 255);
            $this->Cell(0, 10, 'PAYE', 1, 1, 'C', true);
        } else {
            $this->SetFillColor(200, 0, 0);
            $this->SetTextColor(255, 255, 255);
            $this->Cell(0, 10, 'A PAYER: ' . number_format($expedition->tarif_total, 0, ',', ' ') . ' FC', 1, 1, 'C', true);
        }
        $this->SetTextColor(0, 0, 0);
        
        // Numéro d'expédition en gros
        $this->Ln(5);
        $this->SetFont('Arial', 'B', 16);
        $this->Cell(0, 10, $expedition->numero_expedition, 0, 1, 'C');
    }
    
    // ================================================================
    // CONNAISSEMENT MARITIME (BILL OF LADING) - STANDARD IMO
    // ================================================================

    /**
     * Générer le connaissement maritime - Standard IMO
     * MODIFIÉ: Support du champ nb_colis
     */
    public function generer_connaissement($expedition, $lignes) {
        $this->AliasNbPages();
        $this->AddPage();
        
        // Calculer les totaux réels
        $total_colis = $this->calculerTotalColis($lignes);
        $total_poids = $this->calculerPoidsTotal($lignes);
        
        // Cadre extérieur double
        $this->SetDrawColor(0, 0, 0);
        $this->SetLineWidth(0.8);
        $this->Rect(5, 5, 200, 287, 'D');
        $this->SetLineWidth(0.3);
        $this->Rect(7, 7, 196, 283, 'D');
        $this->SetLineWidth(0.2);
        
        // =============================================
        // EN-TÊTE - IDENTIFICATION DU DOCUMENT
        // =============================================
        $this->SetY(10);
        
        // Logo et nom transporteur (gauche)
        $this->SetFont('Arial', 'B', 14);
        $this->Cell(100, 7, 'YAMEELA', 0, 0, 'L');
        
        // Numéro B/L (droite)
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(90, 7, 'BILL OF LADING No. / CONNAISSEMENT N', 0, 1, 'R');
        
        $this->SetFont('Arial', 'B', 10);
        $this->Cell(100, 5, 'WASSIM SERVICES', 0, 0, 'L');
        $this->SetFont('Arial', 'B', 12);
        $this->Cell(90, 5, $expedition->numero_expedition, 0, 1, 'R');
        
        $this->SetFont('Arial', '', 8);
        $this->Cell(100, 4, 'Maritime Carrier / Transporteur Maritime', 0, 0, 'L');
        $this->SetFont('Arial', '', 7);
        $this->Cell(90, 4, 'Reference: ' . date('Y', strtotime($expedition->created_at)) . '/' . substr($expedition->numero_expedition, -6), 0, 1, 'R');
        
        $this->Cell(100, 4, 'Union des Comores / Union of Comoros', 0, 1, 'L');
        
        $this->Ln(2);
        
        // =============================================
        // TITRE PRINCIPAL
        // =============================================
        $this->SetFont('Arial', 'B', 14);
        $this->SetFillColor(0, 51, 102);
        $this->SetTextColor(255, 255, 255);
        $this->Cell(196, 10, 'BILL OF LADING / CONNAISSEMENT', 1, 1, 'C', true);
        $this->SetTextColor(0, 0, 0);
        
        $this->SetFont('Arial', '', 7);
        $this->Cell(196, 4, 'NON-NEGOTIABLE UNLESS CONSIGNED "TO ORDER" / NON NEGOCIABLE SAUF CONSIGNE "A ORDRE"', 0, 1, 'C');
        
        $this->Ln(1);
        
        // =============================================
        // SECTION 1: SHIPPER / EXPEDITEUR
        // =============================================
        $this->SetFont('Arial', 'B', 7);
        $this->SetFillColor(240, 240, 240);
        $this->Cell(98, 5, '1. SHIPPER / EXPEDITEUR (Full name and address)', 1, 0, 'L', true);
        $this->Cell(98, 5, '2. CONSIGNEE / DESTINATAIRE (Full name and address)', 1, 1, 'L', true);
        
        $this->SetFont('Arial', '', 9);
        $y_start = $this->GetY();
        
        // Shipper
        $shipper_text = strtoupper($expedition->expediteur_nom) . "\n" .
                        "Tel: " . $expedition->expediteur_telephone . "\n" .
                        ($expedition->expediteur_adresse ? $expedition->expediteur_adresse . "\n" : "") .
                        $expedition->port_depart . ", COMORES";
        $this->MultiCell(98, 5, utf8_decode($shipper_text), 1, 'L');
        $y_shipper = $this->GetY();
        
        // Consignee
        $this->SetXY(105, $y_start);
        $consignee_text = strtoupper($expedition->destinataire_nom) . "\n" .
                        "Tel: " . $expedition->destinataire_telephone . "\n" .
                        ($expedition->destinataire_adresse ? $expedition->destinataire_adresse . "\n" : "") .
                        $expedition->port_arrivee . ", COMORES";
        $this->MultiCell(98, 5, utf8_decode($consignee_text), 1, 'L');
        $y_consignee = $this->GetY();
        
        $this->SetY(max($y_shipper, $y_consignee));
        
        // =============================================
        // SECTION 2: NOTIFY PARTY
        // =============================================
        $this->SetFont('Arial', 'B', 7);
        $this->Cell(98, 5, '3. NOTIFY PARTY / PARTIE A NOTIFIER (if different from consignee)', 1, 0, 'L', true);
        $this->Cell(98, 5, '4. CARRIER / TRANSPORTEUR', 1, 1, 'L', true);
        
        $this->SetFont('Arial', '', 9);
        $y_start = $this->GetY();
        
        // Notify (même que destinataire si pas spécifié)
        $notify_text = "SAME AS CONSIGNEE\n" .
                    strtoupper($expedition->destinataire_nom) . "\n" .
                    "Tel: " . $expedition->destinataire_telephone;
        $this->MultiCell(98, 5, utf8_decode($notify_text), 1, 'L');
        $y_notify = $this->GetY();
        
        // Carrier
        $this->SetXY(105, $y_start);
        $carrier_text = "YAMEELA - WASSIM SERVICES\n" .
                        "Transport Maritime Inter-Iles\n" .
                        "Tel: +269 444 44 42\n" .
                        "Moroni, Union des Comores";
        $this->MultiCell(98, 5, utf8_decode($carrier_text), 1, 'L');
        $y_carrier = $this->GetY();
        
        $this->SetY(max($y_notify, $y_carrier));
        
        // =============================================
        // SECTION 3: VESSEL AND VOYAGE DETAILS
        // =============================================
        $this->SetFont('Arial', 'B', 7);
        $this->Cell(49, 5, '5. VESSEL / NAVIRE', 1, 0, 'C', true);
        $this->Cell(49, 5, '6. VOYAGE No', 1, 0, 'C', true);
        $this->Cell(49, 5, '7. PORT OF LOADING', 1, 0, 'C', true);
        $this->Cell(49, 5, '8. PORT OF DISCHARGE', 1, 1, 'C', true);
        
        $this->SetFont('Arial', 'B', 10);
        $ferry_nom = isset($expedition->ferry_nom) ? $expedition->ferry_nom : 'YAMEELA';
        $this->Cell(49, 8, utf8_decode(strtoupper($ferry_nom)), 1, 0, 'C');
        $this->Cell(49, 8, $expedition->numero_voyage, 1, 0, 'C');
        $this->Cell(49, 8, utf8_decode(strtoupper($expedition->port_depart)), 1, 0, 'C');
        $this->Cell(49, 8, utf8_decode(strtoupper($expedition->port_arrivee)), 1, 1, 'C');
        
        // Ligne supplémentaire voyage
        $this->SetFont('Arial', 'B', 7);
        $this->Cell(98, 5, '9. DATE OF SHIPMENT / DATE D\'EMBARQUEMENT', 1, 0, 'C', true);
        $this->Cell(98, 5, '10. PLACE OF DELIVERY / LIEU DE LIVRAISON', 1, 1, 'C', true);
        
        $this->SetFont('Arial', '', 9);
        $this->Cell(98, 6, date('d/m/Y', strtotime($expedition->date_voyage)) . ' - ' . (isset($expedition->heure_depart) ? substr($expedition->heure_depart, 0, 5) : ''), 1, 0, 'C');
        $this->Cell(98, 6, utf8_decode(strtoupper($expedition->port_arrivee) . ', COMORES'), 1, 1, 'C');
        
        $this->Ln(1);
        
        // =============================================
        // SECTION 4: DESCRIPTION DES MARCHANDISES
        // MODIFIÉ: Ajout colonne Nb Colis
        // =============================================
        $this->SetFont('Arial', 'B', 8);
        $this->SetFillColor(0, 51, 102);
        $this->SetTextColor(255, 255, 255);
        $this->Cell(196, 6, '11. PARTICULARS OF GOODS / DESCRIPTION DES MARCHANDISES', 1, 1, 'C', true);
        $this->SetTextColor(0, 0, 0);
        
        // En-têtes tableau marchandises - MODIFIÉ
        $this->SetFont('Arial', 'B', 6);
        $this->SetFillColor(240, 240, 240);
        $this->Cell(18, 8, "MARKS &\nNUMBERS", 1, 0, 'C', true);
        $this->Cell(15, 8, "NB\nCOLIS", 1, 0, 'C', true); // NOUVEAU
        $this->Cell(15, 8, "QTE/\nCOLIS", 1, 0, 'C', true);
        $this->Cell(78, 8, "DESCRIPTION OF GOODS / DESCRIPTION DES MARCHANDISES", 1, 0, 'C', true);
        $this->Cell(35, 8, "GROSS WEIGHT\n(KG)", 1, 0, 'C', true);
        $this->Cell(35, 8, "MEASUREMENT\n(M3)", 1, 1, 'C', true);
        
        // Données marchandises
        $this->SetFont('Arial', '', 8);
        $sum_colis = 0;
        $sum_poids = 0;
        $sum_volume = 0;
        
        foreach ($lignes as $index => $ligne) {
            $nb_colis = isset($ligne->nb_colis) ? (int)$ligne->nb_colis : 1;
            
            // Marques
            $mark = substr($expedition->numero_expedition, -6) . '-' . ($index + 1);
            
            // Description avec détails
            $description = strtoupper($ligne->designation);
            $details = array();
            if (isset($ligne->taille_nom) && !empty($ligne->taille_nom)) {
                $details[] = 'Size: ' . $ligne->taille_nom;
            }
            if (isset($ligne->est_fragile) && $ligne->est_fragile) {
                $details[] = 'FRAGILE';
            }
            if (isset($ligne->est_perissable) && $ligne->est_perissable) {
                $details[] = 'PERISHABLE';
            }
            if (!empty($details)) {
                $description .= ' (' . implode(', ', $details) . ')';
            }
            
            if (strlen($description) > 45) {
                $description = substr($description, 0, 42) . '...';
            }
            
            $poids_unitaire = isset($ligne->poids_facture) ? $ligne->poids_facture : 0;
            $poids_total_ligne = $poids_unitaire * $nb_colis;
            
            $volume_unitaire = 0;
            if (isset($ligne->longueur) && isset($ligne->largeur) && isset($ligne->hauteur)) {
                $volume_unitaire = ($ligne->longueur * $ligne->largeur * $ligne->hauteur) / 1000000;
            }
            $volume_total_ligne = $volume_unitaire * $nb_colis;
            
            $sum_colis += $nb_colis;
            $sum_poids += $poids_total_ligne;
            $sum_volume += $volume_total_ligne;
            
            $this->Cell(18, 6, $mark, 1, 0, 'C');
            
            // NOUVEAU: Nb colis en couleur si > 1
            if ($nb_colis > 1) {
                $this->SetTextColor(0, 102, 204);
                $this->SetFont('Arial', 'B', 8);
            }
            $this->Cell(15, 6, $nb_colis, 1, 0, 'C');
            $this->SetTextColor(0, 0, 0);
            $this->SetFont('Arial', '', 8);
            
            $this->Cell(15, 6, $ligne->quantite, 1, 0, 'C');
            $this->Cell(78, 6, utf8_decode($description), 1, 0, 'L');
            $this->Cell(35, 6, ($poids_total_ligne > 0) ? number_format($poids_total_ligne, 2, ',', ' ') : 'N/A', 1, 0, 'R');
            $this->Cell(35, 6, ($volume_total_ligne > 0) ? number_format($volume_total_ligne, 3, ',', ' ') : 'N/A', 1, 1, 'R');
        }
        
        // Ligne TOTAUX - MODIFIÉ: Utilise les vrais totaux
        $this->SetFont('Arial', 'B', 8);
        $this->SetFillColor(240, 240, 240);
        $this->Cell(18, 7, 'TOTAL', 1, 0, 'C', true);
        $this->Cell(15, 7, $sum_colis, 1, 0, 'C', true);
        $this->Cell(15, 7, '-', 1, 0, 'C', true);
        $this->Cell(78, 7, utf8_decode($sum_colis . ' COLIS / PACKAGES'), 1, 0, 'C', true);
        $this->Cell(35, 7, ($sum_poids > 0) ? number_format($sum_poids, 2, ',', ' ') . ' KG' : 'N/A', 1, 0, 'R', true);
        $this->Cell(35, 7, ($sum_volume > 0) ? number_format($sum_volume, 3, ',', ' ') . ' M3' : 'N/A', 1, 1, 'R', true);
        
        // =============================================
        // ARRÊTÉ EN LETTRES - MODIFIÉ
        // =============================================
        $this->SetFont('Arial', 'B', 8);
        $colis_lettres = $this->nombre_en_lettres_bl($sum_colis);
        
        if ($sum_poids > 0) {
            $poids_lettres = $this->nombre_en_lettres_bl(floor($sum_poids));
            $arrete_text = utf8_decode('Present connaissement arrete a ' . $colis_lettres . ' (' . $sum_colis . ') colis pesant ' . $poids_lettres . ' (' . number_format($sum_poids, 2, ',', ' ') . ') kilogrammes.');
        } else {
            $arrete_text = utf8_decode('Present connaissement arrete a ' . $colis_lettres . ' (' . $sum_colis . ') colis. Poids non renseigne.');
        }
        $this->Cell(196, 6, $arrete_text, 1, 1, 'L');
        
        $this->Ln(1);
        
        // =============================================
        // SECTION 5: FREIGHT AND CHARGES
        // =============================================
        $this->SetFont('Arial', 'B', 7);
        $this->Cell(65, 5, '12. FREIGHT PAYABLE AT', 1, 0, 'C', true);
        $this->Cell(66, 5, '13. NUMBER OF ORIGINAL B/L', 1, 0, 'C', true);
        $this->Cell(65, 5, '14. FREIGHT STATUS', 1, 1, 'C', true);
        
        $this->SetFont('Arial', 'B', 9);
        $freight_payable = ($expedition->statut_paiement == 'PAYE') ? 'ORIGIN / DEPART' : 'DESTINATION';
        $this->Cell(65, 7, utf8_decode($freight_payable), 1, 0, 'C');
        $this->Cell(66, 7, 'THREE (3) ORIGINALS', 1, 0, 'C');
        
        // Statut paiement avec couleur
        if ($expedition->statut_paiement == 'PAYE') {
            $this->SetFillColor(39, 174, 96);
            $this->SetTextColor(255, 255, 255);
            $this->Cell(65, 7, 'FREIGHT PREPAID / FRET PAYE', 1, 1, 'C', true);
        } else {
            $this->SetFillColor(231, 76, 60);
            $this->SetTextColor(255, 255, 255);
            $this->Cell(65, 7, 'FREIGHT COLLECT / FRET DU', 1, 1, 'C', true);
        }
        $this->SetTextColor(0, 0, 0);
        
        $this->Ln(1);
        
        // =============================================
        // SECTION 6: PLACE AND DATE OF ISSUE + SIGNATURE
        // =============================================
        $this->SetFont('Arial', 'B', 7);
        $this->Cell(98, 5, '15. PLACE AND DATE OF ISSUE / LIEU ET DATE D\'EMISSION', 1, 0, 'L', true);
        $this->Cell(98, 5, '16. SIGNATURE OF CARRIER OR AGENT', 1, 1, 'L', true);
        
        $this->SetFont('Arial', '', 9);
        $y_start = $this->GetY();
        
        // Lieu et date
        $issue_text = utf8_decode(strtoupper($expedition->port_depart) . ", COMORES\n\n" .
                    "Date: " . date('d/m/Y', strtotime($expedition->created_at)) . "\n\n" .
                    "Heure / Time: " . date('H:i', strtotime($expedition->created_at)));
        $this->MultiCell(98, 5, $issue_text, 1, 'L');
        $y_left = $this->GetY();
        
        // Signature
        $this->SetXY(105, $y_start);
        $this->SetFont('Arial', '', 8);
        $this->MultiCell(98, 5, utf8_decode(
            "For and on behalf of the Carrier\n" .
            "Pour et au nom du Transporteur\n\n" .
            "YAMEELA - WASSIM SERVICES\n\n\n\n" .
            "____________________________\n" .
            "Authorized Signature / Signature"
        ), 1, 'C');
        $y_right = $this->GetY();
        
        $this->SetY(max($y_left, $y_right));
        
        // =============================================
        // CLAUSES LÉGALES - STANDARD IMO
        // =============================================
        $this->Ln(1);
        $this->SetFont('Arial', 'B', 6);
        $this->SetFillColor(240, 240, 240);
        $this->Cell(196, 4, 'TERMS AND CONDITIONS / TERMES ET CONDITIONS', 1, 1, 'C', true);
        
        $this->SetFont('Arial', '', 5);
        $legal_text = utf8_decode(
            "SHIPPED on board in apparent good order and condition (unless otherwise stated) the goods specified above for carriage to the port of discharge.\n" .
            "EMBARQUE a bord en bon etat et condition apparents (sauf indication contraire) les marchandises specifiees ci-dessus pour transport au port de dechargement.\n\n" .
            "This Bill of Lading is subject to the Hague-Visby Rules. The Carrier shall not be liable for loss or damage arising from:\n" .
            "- Act of God, war, strikes, or any cause beyond carrier's control / Force majeure, guerre, greves\n" .
            "- Insufficiency of packing or marks / Insuffisance de l'emballage ou des marques\n" .
            "- Inherent vice of the goods / Vice propre des marchandises\n\n" .
            "This Bill of Lading is governed by the laws of Union des Comores. / Ce connaissement est regi par les lois de l'Union des Comores.\n" .
            "IN WITNESS WHEREOF the Carrier has signed THREE (3) original Bills of Lading, one being accomplished, the others stand void.\n" .
            "EN FOI DE QUOI le Transporteur a signe TROIS (3) connaissements originaux, l'un accompli, les autres seront nuls."
        );
        $this->MultiCell(196, 3, $legal_text, 1, 'L');
        
        // =============================================
        // PIED DE PAGE
        // =============================================
        $this->SetFont('Arial', 'B', 6);
        $this->Cell(196, 4, 'IMO STANDARD BILL OF LADING - UNION DES COMORES - ' . $expedition->numero_expedition, 0, 1, 'C');
        
        // Output
        $filename = 'Bill_of_Lading_' . $expedition->numero_expedition . '.pdf';
        $this->Output('D', $filename);
    }

    /**
     * Convertir un nombre en lettres (francais) pour le B/L
     */
    private function nombre_en_lettres_bl($nombre) {
        $nombre = intval($nombre);
        
        if ($nombre == 0) return 'zero';
        
        $unites = array('', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf', 'dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf');
        $dizaines = array('', '', 'vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'soixante', 'quatre-vingt', 'quatre-vingt');
        
        $result = '';
        
        // Milliers
        if ($nombre >= 1000) {
            $milliers = floor($nombre / 1000);
            if ($milliers == 1) {
                $result .= 'mille ';
            } else {
                $result .= $this->nombre_en_lettres_bl($milliers) . ' mille ';
            }
            $nombre = $nombre % 1000;
        }
        
        // Centaines
        if ($nombre >= 100) {
            $centaines = floor($nombre / 100);
            if ($centaines == 1) {
                $result .= 'cent ';
            } else {
                $result .= $unites[$centaines] . ' cent ';
            }
            $nombre = $nombre % 100;
            
            if ($nombre == 0 && $centaines > 1) {
                $result = rtrim($result) . 's ';
            }
        }
        
        // Dizaines et unites
        if ($nombre >= 20) {
            $d = floor($nombre / 10);
            $u = $nombre % 10;
            
            if ($d == 7 || $d == 9) {
                $result .= $dizaines[$d];
                if ($u == 1 && $d == 7) {
                    $result .= '-et-onze';
                } else {
                    $result .= '-' . $unites[10 + $u];
                }
            } else {
                $result .= $dizaines[$d];
                if ($u == 1 && $d != 8) {
                    $result .= '-et-un';
                } elseif ($u > 0) {
                    $result .= '-' . $unites[$u];
                } elseif ($d == 8) {
                    $result .= 's';
                }
            }
        } elseif ($nombre > 0) {
            $result .= $unites[$nombre];
        }
        
        return trim($result);
    }
    
    // ================================================================
    // BON DE LIVRAISON
    // MODIFIÉ: Support du champ nb_colis
    // ================================================================
    
    /**
     * Générer bon de livraison
     */
    public function generer_bon_livraison($expedition, $lignes) {
        $this->AliasNbPages();
        $this->AddPage();
        
        // Calculer le vrai nombre de colis
        $total_colis = $this->calculerTotalColis($lignes);
        
        $this->enteteEntreprise();
        
        // Titre
        $this->SetFont('Arial', 'B', 14);
        $this->Cell(0, 10, 'BON DE LIVRAISON', 0, 1, 'C');
        $this->SetFont('Arial', 'B', 12);
        $this->Cell(0, 8, utf8_decode('N° ' . $expedition->numero_expedition), 0, 1, 'C');
        $this->Ln(5);
        
        // Destinataire
        $this->SetFont('Arial', 'B', 10);
        $this->SetFillColor(230, 230, 230);
        $this->Cell(0, 7, 'DESTINATAIRE', 1, 1, 'C', true);
        $this->SetFont('Arial', '', 10);
        $this->Cell(0, 6, utf8_decode($expedition->destinataire_nom), 1, 1);
        $this->Cell(0, 6, utf8_decode('Tel: ' . $expedition->destinataire_telephone), 1, 1);
        $this->Cell(0, 6, utf8_decode('Adresse: ' . ($expedition->destinataire_adresse ?: '-')), 1, 1);
        
        $this->Ln(5);
        
        // Liste colis - MODIFIÉ: Ajout colonne Nb Colis
        $this->SetFont('Arial', 'B', 9);
        $this->SetFillColor(200, 200, 200);
        $this->Cell(12, 7, '#', 1, 0, 'C', true);
        $this->Cell(80, 7, 'DESIGNATION', 1, 0, 'C', true);
        $this->Cell(20, 7, 'QTE', 1, 0, 'C', true);
        $this->Cell(25, 7, 'NB COLIS', 1, 0, 'C', true); // NOUVEAU
        $this->Cell(53, 7, 'RECU', 1, 1, 'C', true);
        
        $this->SetFont('Arial', '', 9);
        foreach ($lignes as $ligne) {
            $nb_colis = isset($ligne->nb_colis) ? (int)$ligne->nb_colis : 1;
            
            $this->Cell(12, 6, $ligne->ligne_numero, 1, 0, 'C');
            $this->Cell(80, 6, utf8_decode(substr($ligne->designation, 0, 42)), 1, 0);
            $this->Cell(20, 6, $ligne->quantite, 1, 0, 'C');
            
            // NOUVEAU: Nb colis en couleur si > 1
            if ($nb_colis > 1) {
                $this->SetTextColor(0, 102, 204);
                $this->SetFont('Arial', 'B', 9);
            }
            $this->Cell(25, 6, $nb_colis, 1, 0, 'C');
            $this->SetTextColor(0, 0, 0);
            $this->SetFont('Arial', '', 9);
            
            $this->Cell(53, 6, '', 1, 1, 'C');
        }
        
        // Ligne totaux
        $this->SetFont('Arial', 'B', 9);
        $this->SetFillColor(240, 240, 240);
        $this->Cell(112, 6, 'TOTAL', 1, 0, 'R', true);
        $this->Cell(25, 6, $total_colis . ' colis', 1, 0, 'C', true);
        $this->Cell(53, 6, '', 1, 1, 'C', true);
        
        $this->Ln(5);
        
        // Numéro d'expédition
        $this->SetFont('Arial', 'B', 12);
        $this->Cell(0, 8, $expedition->numero_expedition, 0, 1, 'C');
        
        $this->Ln(10);
        
        // Réception
        $this->SetFont('Arial', 'B', 10);
        $this->Cell(0, 7, 'RECEPTION', 0, 1);
        $this->SetFont('Arial', '', 10);
        
        $this->Cell(50, 6, utf8_decode('Réceptionnaire:'), 0, 0);
        $this->Cell(140, 6, '....................................................', 0, 1);
        
        $this->Cell(50, 6, utf8_decode('Pièce d\'identité:'), 0, 0);
        $this->Cell(140, 6, '....................................................', 0, 1);
        
        $this->Cell(50, 6, 'Date/Heure:', 0, 0);
        $this->Cell(140, 6, '....................................................', 0, 1);
        
        $this->Ln(10);
        
        // Signatures
        $this->SetFont('Arial', 'B', 10);
        $this->Cell(95, 6, 'Signature Agent', 0, 0, 'C');
        $this->Cell(95, 6, utf8_decode('Signature Réceptionnaire'), 0, 1, 'C');
        $this->Cell(95, 25, '', 1, 0);
        $this->Cell(95, 25, '', 1, 1);
        
        $this->Ln(5);
        $this->SetFont('Arial', 'I', 8);
        $this->Cell(0, 5, utf8_decode('Document à conserver. Toute réclamation doit être faite dans les 24h.'), 0, 1, 'C');
        
        // Output
        $filename = 'BonLivraison_' . $expedition->numero_expedition . '.pdf';
        $this->Output('D', $filename);
    }
    
    // ================================================================
    // MANIFESTE FRET
    // MODIFIÉ: Support du champ nb_colis
    // ================================================================
    
    /**
     * Générer manifeste fret voyage
     */
    public function generer_manifeste($voyage, $expeditions, $stats) {
        $this->AliasNbPages();
        $this->AddPage('L');
        
        // En-tête
        $this->SetFont('Arial', 'B', 18);
        $this->Cell(0, 8, 'YAMEELA', 0, 1, 'C');
        $this->SetFont('Arial', 'B', 12);
        $this->Cell(0, 6, 'WASSIM SERVICES', 0, 1, 'C');
        $this->SetFont('Arial', '', 10);
        $this->Cell(0, 5, 'MANIFESTE FRET / CARGO MANIFEST', 0, 1, 'C');
        
        $this->Ln(3);
        
        // Infos voyage
        $this->SetFont('Arial', 'B', 12);
        $voyage_info = 'Voyage: ' . $voyage->numero_voyage . ' - ' . 
                      date('d/m/Y', strtotime($voyage->date_voyage)) . ' - ' .
                      $voyage->port_depart . ' -> ' . $voyage->port_arrivee;
        $this->Cell(0, 8, utf8_decode($voyage_info), 0, 1, 'C');
        $this->SetFont('Arial', '', 10);
        $this->Cell(0, 5, utf8_decode('Ferry: ' . $voyage->ferry_nom . ' | Départ: ' . substr($voyage->heure_depart, 0, 5)), 0, 1, 'C');
        
        $this->Ln(5);
        
        // Tableau
        $this->SetFont('Arial', 'B', 8);
        $this->SetFillColor(200, 200, 200);
        $this->Cell(8, 7, '#', 1, 0, 'C', true);
        $this->Cell(35, 7, utf8_decode('N° EXPEDITION'), 1, 0, 'C', true);
        $this->Cell(45, 7, 'EXPEDITEUR', 1, 0, 'C', true);
        $this->Cell(45, 7, 'DESTINATAIRE', 1, 0, 'C', true);
        $this->Cell(70, 7, 'MARCHANDISES', 1, 0, 'C', true);
        $this->Cell(15, 7, 'COLIS', 1, 0, 'C', true);
        $this->Cell(20, 7, 'POIDS', 1, 0, 'C', true);
        $this->Cell(25, 7, 'MONTANT', 1, 0, 'C', true);
        $this->Cell(15, 7, 'PAYE', 1, 1, 'C', true);
        
        $this->SetFont('Arial', '', 7);
        $num = 0;
        $grand_total_colis = 0;
        
        foreach ($expeditions as $exp) {
            $num++;
            
            // Calculer le vrai nombre de colis pour cette expédition
            $exp_total_colis = 0;
            if (isset($exp->lignes)) {
                foreach ($exp->lignes as $l) {
                    $nb_colis = isset($l->nb_colis) ? (int)$l->nb_colis : 1;
                    $exp_total_colis += $nb_colis;
                }
            } else {
                // Fallback sur nb_colis_total ou nombre_lignes
                $exp_total_colis = isset($exp->nb_colis_total) ? $exp->nb_colis_total : $exp->nombre_lignes;
            }
            $grand_total_colis += $exp_total_colis;
            
            // Construire description complète
            $marchandises = array();
            if (isset($exp->lignes)) {
                foreach ($exp->lignes as $l) {
                    $desc_parts = array();
                    $nb_colis = isset($l->nb_colis) ? (int)$l->nb_colis : 1;
                    
                    // Quantité × Nb colis
                    if ($nb_colis > 1) {
                        $desc_parts[] = $nb_colis . 'x';
                    } elseif ($l->quantite > 1) {
                        $desc_parts[] = $l->quantite . 'x';
                    }
                    
                    // Article/Designation
                    if (!empty($l->article_nom)) {
                        $desc_parts[] = substr($l->article_nom, 0, 18);
                    } elseif (!empty($l->designation)) {
                        $desc_parts[] = substr($l->designation, 0, 18);
                    }
                    
                    // Taille
                    if (!empty($l->taille_code) && $l->taille_code != '-' && $l->taille_code != 'UNIQUE') {
                        $desc_parts[] = '[' . $l->taille_code . ']';
                    }
                    
                    // Poids
                    $poids = 0;
                    if (!empty($l->poids_facture)) {
                        $poids = $l->poids_facture * $nb_colis;
                    } elseif (!empty($l->poids_reel)) {
                        $poids = $l->poids_reel * $nb_colis;
                    }
                    if ($poids > 0) {
                        $desc_parts[] = '(' . number_format($poids, 0) . 'kg)';
                    }
                    
                    $marchandises[] = implode(' ', $desc_parts);
                }
            }
            
            // Afficher max 2 lignes, avec "..." si plus
            $marchandises_txt = implode(', ', array_slice($marchandises, 0, 2));
            if (count($marchandises) > 2) {
                $marchandises_txt .= ' +' . (count($marchandises) - 2);
            }
            
            $this->Cell(8, 6, $num, 1, 0, 'C');
            $this->Cell(35, 6, $exp->numero_expedition, 1, 0);
            $this->Cell(45, 6, utf8_decode(substr($exp->expediteur_nom, 0, 22)), 1, 0);
            $this->Cell(45, 6, utf8_decode(substr($exp->destinataire_nom, 0, 22)), 1, 0);
            $this->Cell(70, 6, utf8_decode(substr($marchandises_txt, 0, 40)), 1, 0);
            $this->Cell(15, 6, $exp_total_colis, 1, 0, 'C'); // MODIFIÉ: Vrai total colis
            $this->Cell(20, 6, ($exp->poids_total_kg > 0) ? number_format($exp->poids_total_kg, 1) . ' kg' : 'N/A', 1, 0, 'R');
            $this->Cell(25, 6, number_format($exp->tarif_total, 0, ',', ' '), 1, 0, 'R');
            $paye = ($exp->statut_paiement == 'PAYE') ? 'OUI' : 'NON';
            $this->Cell(15, 6, $paye, 1, 1, 'C');
        }
        
        // Totaux - MODIFIÉ: Utilise grand_total_colis
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(203, 7, 'TOTAUX', 1, 0, 'R', true);
        $this->Cell(15, 7, $grand_total_colis, 1, 0, 'C', true);
        $this->Cell(20, 7, (isset($stats->poids_total) && $stats->poids_total > 0) ? number_format($stats->poids_total, 1) . ' kg' : 'N/A', 1, 0, 'R', true);
        $this->Cell(25, 7, isset($stats->recettes_total) ? number_format($stats->recettes_total, 0, ',', ' ') : '-', 1, 0, 'R', true);
        $this->Cell(15, 7, '', 1, 1, 'C', true);
        
        $this->Ln(10);
        
        // Signatures
        $this->SetFont('Arial', '', 10);
        $this->Cell(93, 6, 'Agent Fret:', 0, 0);
        $this->Cell(93, 6, 'Commandant:', 0, 0);
        $this->Cell(93, 6, 'Date/Heure:', 0, 1);
        $this->Cell(93, 15, '', 1, 0);
        $this->Cell(93, 15, '', 1, 0);
        $this->Cell(93, 15, '', 1, 1);
        
        // Output
        $filename = 'Manifeste_Fret_' . $voyage->numero_voyage . '.pdf';
        $this->Output('D', $filename);
    }
}