production/Controleur/ControleurAjaxstatsmaladiefichetechniquetroispdf.php
2025-12-02 11:29:44 +00:00

399 lines
18 KiB
PHP
Executable File

<?php
require_once 'Framework/Controleurrequete.php';
require_once 'Modele/Statistique.php';
class ControleurAjaxstatsmaladiefichetechniquetroispdf extends Controleur
{
private $detailsp;
public function __construct() {
$this->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 '<div class="alert alert-warning">' . _("Paramètres de filtrage incomplets") . '</div>';
return;
}
// Vérification 2: Dates valides
if ($debutStat > $finStat) {
echo '<div class="alert alert-warning">' . _("La date de début doit être antérieure à la date de fin") . '</div>';
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 '<div class="alert alert-warning">' . _("Aucune donnée disponible pour cette police") . '</div>';
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 '<div class="alert alert-warning">' . _("Aucune donnée statistique disponible pour cette période") . '</div>';
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 '<div class="alert alert-danger">' . _("Erreur lors de la création du PDF") . ': ' . $e->getMessage() . '</div>';
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 '<div class="alert alert-danger">' . _("Erreur lors de l'ajout d'une page au PDF") . ': ' . $e->getMessage() . '</div>';
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 '<div class="alert alert-danger">' . _("Erreur lors de l'ajout d'une page au PDF") . ': ' . $e->getMessage() . '</div>';
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 '<div class="alert alert-danger">' . _("Erreur lors de l'enregistrement du PDF") . ': ' . $e->getMessage() . '</div>';
return;
}
$t_html = '<div id="div_export_b" class="alert alert-info">';
$t_html .= '<a style="font-size:15pt;" href="' . $fichier . '" target="_blank">' . _("TELECHARGER FICHE 03") . '</a>';
$t_html .= '</div>';
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;
}
}
}