detailsp = new Statistique(); } public function index() { $idPolice = $this->requete->getParametreFormulaire("idPolice"); $debutStat = $this->requete->getParametreDate("debutStat"); $finStat = $this->requete->getParametreDate("finStat"); $codeGcAssureur = $this->requete->getParametreFormulaire("codeGcAssureur"); // Vérification 1: Données de base nécessaires if (empty($debutStat) || empty($finStat) || empty($idPolice)) { echo '
' . _("Paramètres de filtrage incomplets") . '
'; return; } // Vérification 2: Dates valides if ($debutStat > $finStat) { echo '
' . _("La date de début doit être antérieure à la date de fin") . '
'; return; } $_SESSION['debutStat'] = $debutStat; $_SESSION['finStat'] = $finStat; $entete = $this->detailsp->detailrapportspperiodepdfentete($idPolice); // Vérification 3: Données d'entête disponibles if (empty($entete)) { echo '
' . _("Aucune donnée disponible pour cette police") . '
'; return; } $p_datedebut = $_SESSION['debutStat']; $p_datefin = $_SESSION['finStat']; $p_garant = $codeGcAssureur; $p_id = $entete['idPolice']; $p_id_college = null; $p_id_clients = null; // Vérification 4: Récupération des données statistiques $p_factures = $this->detailsp->recapdepensesstatutbenef($p_garant, $p_id_clients, $p_id, $p_id_college, $p_datedebut, $p_datefin); $statutsfts = $this->detailsp->recapdepensesstatutbenefdeux($p_garant, $p_id_clients, $p_id, $p_id_college, $p_datedebut, $p_datefin); $statuts = $this->detailsp->listestatutbeneficiaire($idPolice, $debutStat, $finStat); $liensparente = $this->detailsp->liensparenteenvigueur(); // Vérification 5: Données statistiques disponibles if (empty($p_factures) || empty($statutsfts) || empty($liensparente)) { echo '
' . _("Aucune donnée statistique disponible pour cette période") . '
'; return; } // Création d'un mapping des couleurs par code de lien de parenté $couleursLiens = []; foreach ($liensparente as $lien) { // Attribution de couleurs en fonction du code de lien de parenté switch($lien['codeLienParente']) { case 'A': // Assuré Principal $couleursLiens[$lien['codeLienParente']] = [255, 0, 0]; // Rouge break; case 'C': // Conjoint $couleursLiens[$lien['codeLienParente']] = [255, 165, 0]; // Orange break; case 'E': // Enfant $couleursLiens[$lien['codeLienParente']] = [0, 0, 255]; // Bleu break; case 'M': // Enfant Majeur $couleursLiens[$lien['codeLienParente']] = [0, 128, 255]; // Bleu clair break; case 'F': // Ascendant $couleursLiens[$lien['codeLienParente']] = [0, 128, 0]; // Vert break; case 'O': // Autre Dépendant $couleursLiens[$lien['codeLienParente']] = [128, 0, 128]; // Violet break; case 'D': // Autre Conjoint $couleursLiens[$lien['codeLienParente']] = [165, 42, 42]; // Marron break; default: $couleursLiens[$lien['codeLienParente']] = [200, 200, 200]; // Gris par défaut } } // Création du PDF avec gestion du pied de page // $pdf = new class extends FPDF { $pdf = new class extends FPDF_Protection { function Header() { // Vous pouvez ajouter un en-tête personnalisé ici si besoin } function Footer() { // Positionnement à 1.5 cm du bas $this->SetY(-15); // Police Arial italique 8 $this->SetFont('Arial', 'I', 9); $this->SetTextColor(100, 100, 100); // Numéro de page centré - utilisation de {nb} qui est géré automatiquement par FPDF $this->Cell(0, 10, convertirc(_('Page')) . ' ' . $this->PageNo() . '/{nb}', 0, 0, 'C'); $this->SetTextColor(0); } }; $pdf->SetAuthor('EBENE SOLUTIONS INFORMATIQUES'); $userPassword = ''; $ownerPassword = null; $pdf->SetProtection(['print'], $userPassword, $ownerPassword); // Vérification avant d'ajouter une page try { $pdf->AliasNbPages(); $pdf->AddPage(); } catch (Exception $e) { echo '
' . _("Erreur lors de la création du PDF") . ': ' . $e->getMessage() . '
'; return; } $pdf->SetMargins(10, 10, 10); $logoPath = $_SESSION['lienLogo']; $pdf->Image($logoPath, 94, 3, 15); $pdf->SetFont('Arial', 'B', 7); $pdf->Cell(0, 5, convertirc(_('FICHE TECHNIQUE No 3')), 0, 1, 'L', false); $pdf->SetY(10); $pdf->SetFont('Arial', '', 7); $pdf->Cell(0, 5, convertirc(_('Edition du') . ' :' . heureCouranteLang($_SESSION['lang'])), 0, 1, 'R', false); $pdf->Ln(2); $pdf->SetFont('Arial', 'B', 13); $pdf->SetFillColor(182, 216, 242); // bleu $pdf->Cell(0, 8, convertirc(_("RECAPITULATIF DES DEPENSES PAR STATUT DE BENEFICIAIRES")), 1, 0, 'C', true); $pdf->Ln(10); $pdf->SetFont('Arial', 'B', 11); $pdf->SetTextColor(0); $pdf->Ln(8); $pdf->Cell(0, 5, convertirc(_('PERIODE COMPTABLE CONSIDEREE') . ' : ' . dateLang($debutStat, $_SESSION['lang']) . ' ' . _('AU') . ' ' . dateLang($finStat, $_SESSION['lang'])), 0, 1, 'C', false); if ($p_id != null) { $pdf->Ln(10); $pdf->SetFont('Arial', 'BUI', 11); $pdf->Cell(35, 8, convertirc(_('GARANT') . ' :'), 0, 0, 'L', false); $pdf->SetFont('Arial', 'BI', 11); $pdf->Cell(0, 8, convertirc($entete['garant']), 0, 1, 'L', false); $pdf->SetFont('Arial', 'BUI', 11); $pdf->Cell(35, 8, convertirc(_('SOUSCRIPTEUR') . ' :'), 0, 0, 'L', false); $pdf->SetFont('Arial', 'BI', 11); $pdf->Cell(0, 8, convertirc($entete['souscripteur']), 0, 1, 'L', false); $pdf->SetFont('Arial', 'BUI', 11); $pdf->Cell(35, 8, convertirc(_('POLICE No') . ' :'), 0, 0, 'L', false); $pdf->SetFont('Arial', 'BI', 11); $pdf->Cell(0, 8, convertirc($entete['numeroPolice'] . ' / ' . $entete['libellePolice']), 0, 1, 'L', false); $pdf->SetFont('Arial', 'BUI', 11); $pdf->Cell(35, 8, convertirc(_('COURTIER') . ' :'), 0, 0, 'L', false); $pdf->SetFont('Arial', 'BI', 11); $pdf->Cell(0, 8, convertirc($entete['courtier']), 0, 1, 'L', false); } else { $pdf->Ln(10); $pdf->SetFont('Arial', 'BUI', 11); $pdf->Cell(35, 8, convertirc(_('GARANT') . ' :'), 0, 0, 'L', false); $pdf->SetFont('Arial', 'BI', 11); $pdf->Cell(0, 8, convertirc($p_garant), 0, 1, 'L', false); } $pdf->Ln(5); $hl = 6; $pdf->SetFont('Arial', 'B', 10); $pdf->Cell(190, 6, convertirc(_('Dépenses par statut de bénéficiaires')), 1, 1, 'C', false); $pdf->SetFont('Arial', 'B', 8); $pdf->SetFillColor(182, 216, 242); $pdf->Cell(37, $hl, convertirc(_('Statut bénéficiaire')), 1, 0, 'C', true); $pdf->Cell(25, $hl, convertirc(_("Nombre")), 1, 0, 'C', true); $pdf->Cell(25, $hl, convertirc(_("Taux effectif")), 1, 0, 'C', true); $pdf->Cell(25, $hl, convertirc(_("Age moyen")), 1, 0, 'C', true); $pdf->Cell(27, $hl, convertirc(_("Montant")), 1, 0, 'C', true); $pdf->Cell(25, $hl, convertirc(_("Taux")), 1, 0, 'C', true); $pdf->Cell(26, $hl, convertirc(_("Coût moyen")), 1, 1, 'C', true); $pdf->SetFont('Arial', '', 9); $total_Nombre = 0; $total_Taux_Eff = 0; $total_Age_Moyen = 0; $total_Montant = 0; $total_tauxMontantTraite = 0; $total_coutMoyenTraite = 0; foreach ($p_factures as $p_facture) { $pdf->Cell(37, $hl, convertirc($p_facture['libelle']), 1, 0, 'L', false); $pdf->Cell(25, $hl, convertirc(format_N($p_facture['Nombre'])), 1, 0, 'C', false); $pdf->Cell(25, $hl, convertirc($p_facture['Taux_Eff'] . "%"), 1, 0, 'C', false); $pdf->Cell(25, $hl, convertirc($p_facture['Age_Moyen']), 1, 0, 'C', false); $pdf->Cell(27, $hl, convertirc(format_N($p_facture['Montant'])), 1, 0, 'C', false); $pdf->Cell(25, $hl, convertirc($p_facture['Taux_Depense'] . "%"), 1, 0, 'C', false); $pdf->Cell(26, $hl, convertirc(format_N($p_facture['CoutMoyen'])), 1, 1, 'C', false); $total_Nombre += $p_facture['Nombre']; $total_Taux_Eff += $p_facture['Taux_Eff']; $total_Age_Moyen += $p_facture['Age_Moyen']; $total_Montant += $p_facture['Montant']; $total_tauxMontantTraite += $p_facture['Taux_Depense']; $total_coutMoyenTraite += $p_facture['CoutMoyen']; } $pdf->SetFont('Arial', 'B', 9); $total_Age_Moyen = $total_Nombre > 0 ? $total_Age_Moyen / count($p_factures) : 0; $pdf->Cell(37, $hl, convertirc(_("TOTAL GENERAL")), "1", 0, 'C', true); $pdf->Cell(25, $hl, format_N($total_Nombre), 1, 0, 'C', true); $pdf->Cell(25, $hl, format_N($total_Taux_Eff) . "%", 1, 0, 'C', true); $pdf->Cell(25, $hl, format_N($total_Age_Moyen), 1, 0, 'C', true); $pdf->Cell(27, $hl, format_N($total_Montant), 1, 0, 'C', true); $pdf->Cell(25, $hl, format_N($total_tauxMontantTraite) . "%", 1, 0, 'C', true); $pdf->Cell(26, $hl, format_N($total_coutMoyenTraite), 1, 0, 'C', true); // Vérification de la position Y avant de continuer if ($pdf->GetY() > 250) { try { $pdf->AddPage(); } catch (Exception $e) { echo '
' . _("Erreur lors de l'ajout d'une page au PDF") . ': ' . $e->getMessage() . '
'; return; } } $pdf->SetFont('Arial', 'B', 10); $pdf->SetX(20); $pdf->SetY($pdf->GetY() + 10); $pdf->Cell(90, 8, convertirc(_('Récapitulatif dépenses par statut bénéficiaire (%)')), 1, 0, 'C', false); $pdf->Cell(10, 8, (''), 0, 0); $pdf->Cell(90, 8, convertirc(_('Récapitulatif des bénéficiaires traités par statut (%)')), 1, 1, 'C', false); $pdf->Ln(5); $currentY = $pdf->GetY(); $pdf->Rect(10, $currentY, 90, 60, 'D'); $pdf->Rect(110, $currentY, 90, 60, 'D'); // Préparation des données pour le premier graphique (Dépenses par statut) $dataDepenses = []; foreach ($p_factures as $facture) { $codeLien = $facture['codeLienParente'] ?? substr($facture['libelle'], 0, 1); $dataDepenses[$codeLien] = [ 'color' => $couleursLiens[$codeLien] ?? [200, 200, 200], 'value' => $facture['Taux_Depense'], 'libelle' => est_anglophone() ? $facture['libelle'] : $facture['libelleEng'] ]; } // Dessin du premier graphique (Dépenses par statut) $this->dessinerGraphiqueCirculaire($pdf, $dataDepenses, 30, $currentY + 32, 15, 55, $currentY + 17); // Préparation des données pour le deuxième graphique (Bénéficiaires traités par statut) $dataBeneficiaires = []; foreach ($statutsfts as $statut) { $codeLien = $statut['codeLienParente'] ?? substr($statut['libelle'], 0, 1); $dataBeneficiaires[$codeLien] = [ 'color' => $couleursLiens[$codeLien] ?? [200, 200, 200], 'value' => $statut['Taux_Eff'], 'libelle' => est_anglophone() ? $statut['libelle'] : $statut['libelleEng'] ]; } // Dessin du deuxième graphique (Bénéficiaires traités par statut) $this->dessinerGraphiqueCirculaire($pdf, $dataBeneficiaires, 130, $currentY + 32, 15, 155, $currentY + 17); // Vérification de la position Y avant de continuer if ($pdf->GetY() > 220) { try { $pdf->AddPage(); } catch (Exception $e) { echo '
' . _("Erreur lors de l'ajout d'une page au PDF") . ': ' . $e->getMessage() . '
'; return; } } $pdf->Ln(38); $hl = 6; $pdf->SetFont('Arial', 'B', 10); $pdf->Cell(190, 6, convertirc(_('Dépenses des bénéficiaires traités par statut')), 1, 1, 'C', false); $pdf->SetFont('Arial', 'B', 8); $pdf->SetFillColor(182, 216, 242); $pdf->Cell(37, $hl, convertirc(_('Statut bénéficiaire')), 1, 0, 'C', true); $pdf->Cell(51, $hl, convertirc(_("Nombre de fois traités sur la période")), 1, 0, 'C', true); $pdf->Cell(25, $hl, convertirc(_("Taux traités")), 1, 0, 'C', true); $pdf->Cell(27, $hl, convertirc(_("Dépenses")), 1, 0, 'C', true); $pdf->Cell(25, $hl, convertirc(_("Taux")), 1, 0, 'C', true); $pdf->Cell(25, $hl, convertirc(_("Coût moyen")), 1, 1, 'C', true); $pdf->SetFont('Arial', '', 9); $total_BenefTraite = 0; $total_Taux_EffTraite = 0; $total_Depensestraite = 0; $total_Taux_Depense = 0; $total_coutMoyenTraite = 0; foreach ($statutsfts as $statutsft) { $pdf->Cell(37, $hl, convertirc($statutsft['libelle']), 1, 0, 'L', false); $pdf->Cell(51, $hl, convertirc(format_N($statutsft['BenefTraite'])), 1, 0, 'C', false); $pdf->Cell(25, $hl, convertirc($statutsft['Taux_Eff'] . "%"), 1, 0, 'C', false); $pdf->Cell(27, $hl, convertirc(format_N($statutsft['Depenses'])), 1, 0, 'C', false); $pdf->Cell(25, $hl, convertirc($statutsft['Taux_Depense'] . "%"), 1, 0, 'C', false); $pdf->Cell(25, $hl, convertirc(format_N($statutsft['CoutMoyen'])), 1, 1, 'C', false); $total_BenefTraite += $statutsft['BenefTraite']; $total_Taux_EffTraite += $statutsft['Taux_Eff']; $total_Depensestraite += $statutsft['Depenses']; $total_Taux_Depense += $statutsft['Taux_Depense']; $total_coutMoyenTraite += $statutsft['CoutMoyen']; } $pdf->SetFont('Arial', 'B', 9); $pdf->Cell(37, $hl, convertirc("TOTAL GENERAL"), "1", 0, 'C', true); $pdf->Cell(51, $hl, format_N($total_BenefTraite), 1, 0, 'C', true); $pdf->Cell(25, $hl, $total_Taux_EffTraite . "%", 1, 0, 'C', true); $pdf->Cell(27, $hl, format_N($total_Depensestraite), 1, 0, 'C', true); $pdf->Cell(25, $hl, format_N($total_Taux_Depense) . "%", 1, 0, 'C', true); $pdf->Cell(25, $hl, format_N($total_coutMoyenTraite), 1, 0, 'C', true); $fichier = "Temp/TMP_CUMUL_SP_FICHE3_" . uniqid() . ".pdf"; // Vérification finale avant enregistrement try { $pdf->Output($fichier, "F"); } catch (Exception $e) { echo '
' . _("Erreur lors de l'enregistrement du PDF") . ': ' . $e->getMessage() . '
'; return; } $t_html = '
'; $t_html .= '' . _("TELECHARGER FICHE 03") . ''; $t_html .= '
'; echo $t_html; } /** * Dessine un graphique circulaire avec légende * * @param FPDF $pdf Instance FPDF * @param array $data Données du graphique * @param int $pieX Position X du centre du graphique * @param int $pieY Position Y du centre du graphique * @param int $r Rayon du graphique * @param int $legendX Position X de la légende * @param int $legendY Position Y de la légende */ private function dessinerGraphiqueCirculaire($pdf, $data, $pieX, $pieY, $r, $legendX, $legendY) { // Calcul du total des valeurs $dataSum = 0; foreach ($data as $item) { $dataSum += $item['value']; } // Échelle unitaire pour chaque degré $degUnit = $dataSum > 0 ? 360 / $dataSum : 0; // Angle courant $currentAngle = 0; // Position Y courante de la légende $currentLegendY = $legendY; $pdf->SetFont('Arial', '', 9); // Dessin des secteurs et de la légende foreach ($data as $index => $item) { // Taille du secteur $deg = $degUnit * $item['value']; // Définition de la couleur $pdf->SetFillColor($item['color'][0], $item['color'][1], $item['color'][2]); $pdf->SetDrawColor($item['color'][0], $item['color'][1], $item['color'][2]); // Dessin du secteur $pdf->Sector($pieX, $pieY, $r, $currentAngle, $currentAngle + $deg); // Mise à jour de l'angle $currentAngle += $deg; // Dessin de la légende $pdf->Rect($legendX, $currentLegendY, 5, 5, 'DF'); $pdf->SetXY($legendX + 6, $currentLegendY); $pdf->Cell(10, 5, convertirc($index . ' - '), 0, 0); $pdf->Cell(10, 5, convertirc(round($item['value'], 1) . '%'), 0, 0); $currentLegendY += 5; } } }