399 lines
18 KiB
PHP
Executable File
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;
|
|
}
|
|
}
|
|
} |