diff --git a/gestion/lib/Db/Bdd.php b/gestion/lib/Db/Bdd.php index 994fbd1..6a8e61c 100644 --- a/gestion/lib/Db/Bdd.php +++ b/gestion/lib/Db/Bdd.php @@ -391,12 +391,14 @@ class Bdd { .$this->tableprefix."devis.id_client as id_client, date_paiement, type_paiement, id_devis, ".$this->tableprefix."client.nom as nom, prenom, entreprise, " .$this->tableprefix."lieu.id as lid, ".$this->tableprefix."lieu.nom as lieu,".$this->tableprefix."lieu.adresse as adresse_soin," .$this->tableprefix."defunt.id as id_defunt, ".$this->tableprefix."defunt.nom as nom_defunt," + .$this->tableprefix."client_group_facturation.id as client_group_facturation_id, ".$this->tableprefix."client_group_facturation.group_facturation_name as group_facturation_name," .$this->tableprefix."facture.version, status_paiement FROM (".$this->tableprefix."facture LEFT JOIN ".$this->tableprefix."devis on ".$this->tableprefix."facture.id_devis = ".$this->tableprefix."devis.id) LEFT JOIN ".$this->tableprefix."lieu on ".$this->tableprefix."devis.id_lieu = ".$this->tableprefix."lieu.id LEFT JOIN ".$this->tableprefix."client on ".$this->tableprefix."devis.id_client = ".$this->tableprefix."client.id - LEFT JOIN ".$this->tableprefix."defunt on ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id + LEFT JOIN ".$this->tableprefix."defunt on ".$this->tableprefix."devis.id_defunt = ".$this->tableprefix."defunt.id + LEFT JOIN ".$this->tableprefix."client_group_facturation on ".$this->tableprefix."client.fk_client_group_facturation_id = ".$this->tableprefix."client_group_facturation.id WHERE YEAR(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[2]." AND MONTH(".$this->tableprefix."facture.date_paiement) = ".explode('-', $date)[1]." AND ".$this->tableprefix."client.id IN($clientIdsSqlPlaceholder) ORDER BY year DESC, month DESC;"; $result = $this->execSQL( diff --git a/gestion/lib/Helpers/FileExportHelpers.php b/gestion/lib/Helpers/FileExportHelpers.php index 7a81732..c614af1 100644 --- a/gestion/lib/Helpers/FileExportHelpers.php +++ b/gestion/lib/Helpers/FileExportHelpers.php @@ -37,4 +37,15 @@ class FileExportHelpers return $stringWithoutSpace; } + public static function ConvertSpecialChar($str) { + $unwanted_array = array( + 'Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', + 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', + 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', + 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', + 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y' + ); + return strtr( $str, $unwanted_array ); + } + } diff --git a/gestion/lib/Service/InvoicePdfService.php b/gestion/lib/Service/InvoicePdfService.php index b218166..4f5b768 100644 --- a/gestion/lib/Service/InvoicePdfService.php +++ b/gestion/lib/Service/InvoicePdfService.php @@ -29,6 +29,7 @@ namespace OCA\Gestion\Service; use DateTime; use OCA\Gestion\Db\Bdd; use OCA\Gestion\Helpers\DateHelpers; +use OCA\Gestion\Service\InvoiceRecap\InvoiceRecapService; use OCP\Files\IRootFolder; class InvoicePdfService { @@ -38,12 +39,17 @@ class InvoicePdfService { /** @var IRootFolder */ private $rootFolder; + /** @var InvoiceRecapService */ + private $invoiceRecapService; + private const DEFAULT_NEXTCLOUD_ADMIN = "admin"; public function __construct( Bdd $gestionBdd, - IRootFolder $rootFolder) { + IRootFolder $rootFolder, + InvoiceRecapService $invoiceRecapService) { $this->gestionBdd = $gestionBdd; $this->rootFolder = $rootFolder; + $this->invoiceRecapService = $invoiceRecapService; } private function getLogo(){ @@ -149,4 +155,9 @@ class InvoicePdfService { $file_pdf->putContent($pdfContent); return $filenamePath; } + + public function GenerateInvoiceRecap($filter,$filterType,$date,$idNextCloud){ + $filenames = $this->invoiceRecapService->generateInvoiceRecap($filter,$filterType,$date,$idNextCloud); + return $filenames; + } } diff --git a/gestion/lib/Service/InvoiceRecap/InvoiceRecapService.php b/gestion/lib/Service/InvoiceRecap/InvoiceRecapService.php new file mode 100644 index 0000000..d9dfa9f --- /dev/null +++ b/gestion/lib/Service/InvoiceRecap/InvoiceRecapService.php @@ -0,0 +1,647 @@ + + * + * @author Anna Larch + * @author Richard Steinmetz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see . + * + */ + +namespace OCA\Gestion\Service\InvoiceRecap; + +use DateTime; +use OCA\Gestion\Constants\MultipleFactureTypeConstant; +use OCA\Gestion\Db\Bdd; +use OCA\Gestion\Helpers\DateHelpers; +use OCP\Files\IRootFolder; +use \FPDF; +use IntlDateFormatter; +use OCA\Gestion\Helpers\FileExportHelpers; + +class InvoiceRecapService { + /** @var Bdd */ + private $gestionBdd; + + /** @var IRootFolder */ + private $rootFolder; + + private $defaultImagePath = "/var/www/html/data/admin/files/.gestion/"; + + private const DEFAULT_NEXTCLOUD_ADMIN = "admin"; + public function __construct( + Bdd $gestionBdd, + IRootFolder $rootFolder) { + $this->gestionBdd = $gestionBdd; + $this->rootFolder = $rootFolder; + } + + private function doesSignatureImageExists(){ + $storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN); + try{ + if(isset($storage)){ + $storage->get("/.gestion/sign.png"); + $signatureExist = true; + }else{ + $signatureExist = false; + } + } + catch(\OCP\Files\NotFoundException $e) { + $signatureExist = false; + } + return $signatureExist; + } + + private function doesLogoExist(){ + $storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN); + try{ + if(isset($storage)){ + $file = $storage->get('/.gestion/logo.png'); + return true; + }else{ + return false; + } + } + catch(\OCP\Files\NotFoundException $e) { + return false; + } + } + + private function generateInvoiceRecapPerClientGroupFacturation($clientGroupId,$date,$idNextcloud){ + $storage = $this->rootFolder->getUserFolder($idNextcloud); + $doesLogoExist = $this->doesLogoExist(); + $doesSignatureExist = $this->doesSignatureImageExists(); + $tvaIntraCommuValue = ""; + $firstClient = $this->gestionBdd->getFirstClient(); + if($firstClient != null){ + $tvaIntraCommuValue = $firstClient["legal_one"]; + } + $defaultConfig = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN)); + $factures = json_decode($this->gestionBdd->getClientFacturesByClientGroupFacturationIdAndDate($clientGroupId,$date)); + $factures = array_filter($factures, callback: function($facture) {return $facture->id_client != NULL; }); + $groupName = ""; + foreach ($factures as $key => $facture) { + $facture_temp = array( + 'num' => $facture->num, + 'id_client' => $facture->id_client, + 'client' => $facture->entreprise, + 'adresse_client' => $facture->adresse_client, + 'mail_client' => $facture->mail_client, + 'adresse_devis' => $facture->lieu, + 'nom_client' => html_entity_decode($facture->nom), + 'prenoms_client' => html_entity_decode($facture->prenom), + 'numero_commande' => $facture->numero_commande, + 'date_soin' => $facture->date_soin, + 'date' => $facture->date, + 'date_facture' => $facture->date_paiement, + 'defunt' => $facture->nom_defunt, + 'montant_htc' => 0, + 'tva' => $defaultConfig[0]->tva_default, + 'montant_tva' => 0, + 'montant_ttc' => 0, + ); + $produits = json_decode($this->gestionBdd->getListProduit($facture->id_devis,$idNextcloud)); + $produitsReferenceArray = []; + foreach ($produits as $key => $produit) { + $facture_temp['montant_htc'] += $produit->prix_unitaire * $produit->quantite; + $produitsReferenceArray[] = $produit->reference; + }; + $produitsReferenceArray = array_unique($produitsReferenceArray); + $produitsReferenceAsString = implode("-", $produitsReferenceArray); + $facture_temp['montant_tva'] = ($facture_temp['montant_htc'] * $facture_temp['tva'])/100; + $facture_temp['montant_ttc'] = $facture_temp['montant_tva'] + $facture_temp['montant_htc']; + $facture_temp['produit_references'] = $produitsReferenceAsString; + + array_push($data_factures, $facture_temp); + }; + $data_temp = array(); + foreach ($data_factures as $key => $facture) { + $datesplit = explode('-', $facture['date_facture']); + if($data_temp[strval($datesplit[0])][strval($datesplit[1])]==NULL) { + $data_temp[strval($datesplit[0])][strval($datesplit[1])] = array(0=>$facture); + } else { + array_push($data_temp[strval($datesplit[0])][strval($datesplit[1])], $facture); + } + } + foreach ($data_temp as $key_annee => $annee) { + foreach ($annee as $key_mois => $mois) { + $pdf = new FPDF(); + $pdf->AddFont('ComicSans','','Comic Sans MS.php'); + $pdf->AddFont('ComicSans','B','comic-sans-bold.php'); + $groupName = $mois[0]['group_facturation_name']; + $date_facture = $mois[0]['date_facture']; + + $date_temp = date("t-m-Y", strtotime($date_facture)); + $formatter = new IntlDateFormatter('fr_FR', IntlDateFormatter::LONG, IntlDateFormatter::NONE); + $date_formated = $formatter->format(DateTime::createFromFormat('d-m-Y', $date_temp)); + + try { + $storage->newFolder(html_entity_decode($defaultConfig[0]->path).'/DOCUMENTS RECAPITULATIFS/'.$key_annee.'/'.$key_mois.' '.strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1])).'/'); + } catch(\OCP\Files\NotPermittedException $e) { } + + $pdf->AddPage(); + // on sup les 2 cm en bas + $pdf->SetAutoPagebreak(False); + $pdf->SetMargins(0,0,0); + + // logo : 80 de largeur et 55 de hauteur + if($doesLogoExist){ + $pdf->Image($this->defaultImagePath."logo.png", 10, 10, 75, 25); + } + // adresse du facture + $pdf->SetFont('ComicSans','B',11); $_x = 122 ; $_y = 40; + $pdf->SetXY( $_x, $_y ); $pdf->Cell( 100, 8, utf8_decode('Groupe '.$groupName), 0, 0, ''); $_y += 8; + // date facture + $pdf->SetFont('ComicSans','',11); $pdf->SetXY( 122, 60 ); + $pdf->Cell( 60, 8, "Saint Senoux, le ".utf8_decode($date_formated), 0, 0, ''); + + // observations + $pdf->SetFont( "ComicSans", "BU", 10 ); $pdf->SetXY( 10, 85 ) ; $pdf->Cell($pdf->GetStringWidth("Objet:"), 0, "Objet:", 0, "L"); + $objet = utf8_decode("Récapitulatif Facturation du mois de ").strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1])); + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 85 ) ; $pdf->Cell($pdf->GetStringWidth($objet), 0, $objet, 0, "L"); + + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 95 ); $pdf->Cell($pdf->GetStringWidth("Madame, Monsieur"), 0, "Madame, Monsieur", 0, "L"); + + $text1 = utf8_decode("Veuillez trouver ci-dessous le récapitulatif de la facturation du mois de ").strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1]))."."; + $text2 = utf8_decode("Vous en souhaitant bonne réception."); + $text3 = utf8_decode("Veuillez agréer, Madame, Monsieur, mes salutations les meilleures."); + + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 105 ) ; $pdf->Cell($pdf->GetStringWidth($text1), 0, $text1, 0, "L"); + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 110 ) ; $pdf->Cell($pdf->GetStringWidth($text2), 0, $text2, 0, "L"); + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 120 ) ; $pdf->Cell($pdf->GetStringWidth($text3), 0, $text3, 0, "L"); + + // signature + $pdf->SetFont('ComicSans','',11); $pdf->SetXY( 122, 145 ); + $pdf->Cell( $pdf->GetStringWidth($defaultConfig[0]->nom.' '.$defaultConfig[0]->prenom), 0, utf8_decode(html_entity_decode($defaultConfig[0]->nom.' '.$defaultConfig[0]->prenom)), 0, 0, 'L'); + if($doesSignatureExist){ + $pdf->Image($this->defaultImagePath."sign.png", 122, 150, 55, 30); + } + + $y0 = 260; + $pageWidth = $pdf->GetPageWidth(); + //Positionnement en bas et tout centrer + $pdf->SetFont('ComicSans','',6); + + $pdf->SetXY( 1, $y0 + 4 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->legal_one)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 8 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->legal_two)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 12 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->telephone)), 0, 0, 'C'); + + /*$pdf->SetXY( 1, $y0 + 16 ); + $pdf->Cell( $pageWidth, 5, utf8_decode("SIREN 751621293"), 0, 0, 'C');*/ + + $num_page = 1; + $nb_page = ceil(sizeof($mois) / 26); + $index_facture_position = 0; + $max_nb_toget = (sizeof($mois)<=26)?sizeof($mois):26; + + $montant_ht_total = 0; + $montant_tva_total = 0; + $montant_ttc_total = 0; + + while ($num_page <= $nb_page) { + $pdf->AddPage(); + // on sup les 2 cm en bas + $pdf->SetAutoPagebreak(False); + $pdf->SetMargins(0,0,0); + + if($doesLogoExist){ + $pdf->Image($this->defaultImagePath."logo.png", 10, 10, 55, 30); + } + + // n° page en haute à droite + if($nb_page>1){ + $pdf->SetXY( 120, 5 ); $pdf->SetFont( "ComicSans", "B", 9 ); $pdf->Cell( 160, 8, $num_page . '/' . $nb_page, 0, 0, 'C'); + } + + // date facture + $pdf->SetFont('ComicSans','',11); $pdf->SetXY( 122, 15 ); + $pdf->Cell( 60, 8, "Saint Senoux, le ".utf8_decode($date_formated), 0, 0, ''); + + // n° facture, date echeance et reglement et obs + $pdf->SetLineWidth(0.1); $pdf->SetFillColor(255); $pdf->Rect(100, 30, 85, 8, "DF"); + $pdf->SetXY( 100, 30 ); $pdf->SetFont( "ComicSans", "B", 12 ); $pdf->Cell( 85, 8, 'FACTURE N'.utf8_decode('°').' ETS/'.$key_annee.'/'.strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1])), 0, 0, 'C'); + + // adresse du facture + $pdf->SetFont('ComicSans','B',11); $x = 122 ; $y = 50; + // $pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, 'doit', 0, 0, ''); $y += 8; + $pdf->SetXY( $x, $y ); $pdf->MultiCell( 80, 4, 'Groupe '.$groupName, 0, 0, ''); + + // *********************** + // le cadre des articles + // *********************** + // cadre avec 18 lignes max ! et 118 de hauteur --> 80 + 118 = 198 pour les traits verticaux + $pdf->SetLineWidth(0.1); $pdf->Rect(5, 80, 200, 153, "D"); + // cadre titre des colonnes + $pdf->Line(5, 90, 205, 90); + // les traits verticaux colonnes + $pdf->Line(145, 80, 145, 233); $pdf->Line(163, 80, 163, 233); + if($num_page == $nb_page) $pdf->Line(183, 80, 183, 240); + else $pdf->Line(183, 80, 183, 233); + // titre colonne + $pdf->SetXY( 1, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 140, 8, "OBJET", 0, 0, 'C'); + $pdf->SetXY( 147, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 13, 8, "H.T.", 0, 0, 'C'); + $pdf->SetXY( 168, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 10, 8, "TVA 20%", 0, 0, 'C'); + $pdf->SetXY( 183, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 22, 8, "T.T.C", 0, 0, 'C'); + + // (new DateTime($facture['date_soin']))->format('d-M') + $formatter_ds = new IntlDateFormatter('fr_FR', IntlDateFormatter::SHORT, IntlDateFormatter::NONE); + + // Set the pattern for the formatter to "d-MMMM" to display the day and month name in French + $formatter_ds->setPattern('dd-MMM'); + + //recuperation des factures + $y_facture = 90; + + $init_index = $index_facture_position; + + for ($index_facture_position; $index_facture_position < ($init_index + $max_nb_toget) ; $index_facture_position++) { + $date_soin_temp = new DateTime($mois[$index_facture_position]['date_soin']); + + $pdf->SetXY( 6, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 28, 8, $mois[$index_facture_position]['num'], 0, 0, ''); + $pdf->SetXY( 32, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 28, 8, $mois[$index_facture_position]['numero_commande'], 0, 0, ''); + $pdf->SetXY( 53, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 18, 8, utf8_decode($formatter_ds->format($date_soin_temp)), 0, 0, ''); + $pdf->SetXY( 65, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 38, 8, $mois[$index_facture_position]['prenoms_client'].' '.$mois[$index_facture_position]['nom_client'], 0, 0, ''); + $pdf->SetXY( 100, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 28, 8, utf8_decode(html_entity_decode($mois[$index_facture_position]['defunt'])), 0, 0, ''); + $pdf->SetXY( 147, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 13, 8, $mois[$index_facture_position]['montant_htc'].chr(128), 0, 0, 'C'); + $pdf->SetXY( 168, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 10, 8, $mois[$index_facture_position]['montant_tva'].chr(128), 0, 0, 'C'); + $pdf->SetXY( 183, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 22, 8, $mois[$index_facture_position]['montant_ttc'].chr(128), 0, 0, 'C'); + + $montant_ht_total = $montant_ht_total+$mois[$index_facture_position]['montant_htc']; + $montant_tva_total = $montant_tva_total+$mois[$index_facture_position]['montant_tva']; + $montant_ttc_total = $montant_ttc_total+$mois[$index_facture_position]['montant_ttc']; + + $y_facture=$y_facture+5; + } + + $nb_facture_chargee = $index_facture_position+1; + $reste_a_chargee = sizeof($mois) - $nb_facture_chargee; + $max_nb_toget = ($reste_a_chargee <= 26) ? $reste_a_chargee+1 : 26; + + // si derniere page alors afficher cadre des TVA + if ($num_page == $nb_page) + { + $pdf->Line(5, 225, 205, 225); + $pdf->SetFont('ComicSans','B',8); $pdf->SetXY( 5, 225 ); $pdf->Cell( 140, 8, 'TOTAL', 0, 0, 'C'); + $pdf->SetFont('ComicSans','',8); $pdf->SetXY( 147, 225 ); $pdf->Cell( 13, 8, $montant_ht_total.chr(128), 0, 0, 'C'); + $pdf->SetFont('ComicSans','',8); $pdf->SetXY( 168, 225 ); $pdf->Cell( 10, 8, $montant_tva_total.chr(128), 0, 0, 'C'); + $pdf->SetFont('ComicSans','',8); $pdf->SetXY( 183, 225 ); $pdf->Cell( 22, 8, $montant_ttc_total.chr(128), 0, 0, 'C'); + + $pdf->Rect(145, 233, 60, 7, "D"); + $pdf->SetFont('ComicSans','B',8); $pdf->SetXY( 147, 233 ); $pdf->Cell( 30, 6.5, 'TOTAL TTC', 0, 0, 'C'); + $pdf->SetFont('ComicSans','B',8); $pdf->SetXY( 183, 233 ); $pdf->SetFillColor(255, 255, 0); $pdf->SetTextColor(255, 0, 0); $pdf->Cell( 22, 6.5, $montant_ttc_total.chr(128), 0, 0, 'C', true); + } + + $y1 = 245; + + $pdf->SetFillColor(255); + $pdf->SetTextColor(0, 0, 0); + + $pdf->SetFont('ComicSans','',9); + + $pdf->SetXY( 10, $y1 ); $pdf->Cell( $pdf->GetPageWidth(), 4, utf8_decode("Loi N° 92-442 du 31 décembre 1992: La présente facture est payable en comptant a réception."), 0, 0, 'L'); + $pdf->SetXY( 10, $y1 + 4 ); $pdf->Cell( $pdf->GetPageWidth(), 4, utf8_decode("Indemnité forfaitaire pour frais de recouvrement due en cas de retard de paiement: 40").chr(128), 0, 0, 'L'); + $pdf->SetXY( 10, $y1 + 8 ); $pdf->Multicell( $pdf->GetPageWidth()-20, 4, utf8_decode("Toute somme non payée dans les trente jours est susceptible de porter intérets à un taux égal à une fois et demi le taux de l'intéret légal."), 0, 0, 'L'); + + // ************************** + // pied de page + // ************************** + + $pdf->SetFont('ComicSans','',6); + $pdf->SetXY( 1, $y0 + 4 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->legal_one)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 8 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->legal_two)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 12 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->telephone)), 0, 0, 'C'); + + /*$pdf->SetXY( 1, $y0 + 16 ); + $pdf->Cell( $pageWidth, 5, utf8_decode("SIREN 751621293"), 0, 0, 'C');*/ + + $num_page++; + } + + $ff_pdf = html_entity_decode($defaultConfig[0]->path).'/DOCUMENTS RECAPITULATIFS/'.$key_annee.'/'.$key_mois.' '.strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1])).'/GROUPE_OGF_RECAP_FACTURE_'.strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1])).'_'.$key_annee.'.pdf'; + $storage->newFile($ff_pdf); + $pdfContent = $pdf->Output('','S'); + + $file_pdf = $storage->get($ff_pdf); + $file_pdf->putContent($pdfContent); + } + } + } + + private function generateInvoiceRecapPerClient($clientId,$date,$idNextcloud){ + $storage = $this->rootFolder->getUserFolder($idNextcloud); + $doesLogoExist = $this->doesLogoExist(); + $tvaIntraCommuValue = ""; + $firstClient = $this->gestionBdd->getFirstClient(); + if($firstClient != null){ + $tvaIntraCommuValue = $firstClient["legal_one"]; + } + $defaultConfig = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN)); + $factures = json_decode($this->gestionBdd->getClientFacturesByClientIdAndDate( + clientId: $clientId, + date: $date + )); + $factures = array_filter($factures, callback: function($facture) {return $facture->id_client != NULL; }); + foreach ($factures as $key => $facture) { + $facture_temp = array( + 'num' => $facture->num, + 'id_client' => $facture->id_client, + 'client' => $facture->entreprise, + 'adresse_client' => $facture->adresse_client, + 'mail_client' => $facture->mail_client, + 'adresse_devis' => $facture->lieu, + 'nom_client' => html_entity_decode($facture->nom), + 'prenoms_client' => html_entity_decode($facture->prenom), + 'numero_commande' => $facture->numero_commande, + 'date_soin' => $facture->date_soin, + 'date' => $facture->date, + 'date_facture' => $facture->date_paiement, + 'defunt' => $facture->nom_defunt, + 'montant_htc' => 0, + 'tva' => $defaultConfig[0]->tva_default, + 'montant_tva' => 0, + 'montant_ttc' => 0, + ); + $produits = json_decode($this->gestionBdd->getListProduit($facture->id_devis,$idNextcloud)); + $produitsReferenceArray = []; + foreach ($produits as $key => $produit) { + $facture_temp['montant_htc'] += $produit->prix_unitaire * $produit->quantite; + $produitsReferenceArray[] = $produit->reference; + }; + $produitsReferenceArray = array_unique($produitsReferenceArray); + $produitsReferenceAsString = implode("-", $produitsReferenceArray); + $facture_temp['montant_tva'] = ($facture_temp['montant_htc'] * $facture_temp['tva'])/100; + $facture_temp['montant_ttc'] = $facture_temp['montant_tva'] + $facture_temp['montant_htc']; + $facture_temp['produit_references'] = $produitsReferenceAsString; + + array_push($data_factures, $facture_temp); + }; + $data_temp = array(); + foreach ($data_factures as $key => $facture) { + $datesplit = explode('-', $facture['date_facture']); + if($data_temp[strval($datesplit[0])][strval($datesplit[1])][$facture['id_client']]==NULL) { + $data_temp[strval($datesplit[0])][strval($datesplit[1])][$facture['id_client']] = array(0=>$facture); + } else { + array_push($data_temp[strval($datesplit[0])][strval($datesplit[1])][$facture['id_client']], $facture); + } + } + foreach ($data_temp as $key_annee => $annee) { + foreach ($annee as $key_mois => $mois) { + foreach ($mois as $key_client => $client) { + $pdf = new FPDF(); + $pdf->AddFont('ComicSans','','Comic Sans MS.php'); + $pdf->AddFont('ComicSans','B','comic-sans-bold.php'); + $current_client = ''; + $clientAddress = ''; + $clientCity = ''; + $date_facture; + $j=1; + foreach ($client as $key => $facture) { + if($j==1) { + $current_client = $facture['prenoms_client'].' '.$facture['nom_client']; + $date_facture = $facture['date_facture']; + $clientAddresses = FileExportHelpers::GetAddressAndCityFromAddress($facture['adresse_client']); + $clientAddress = $clientAddresses['address']; + $clientCity = $clientAddresses['city']; + } + $j++; + } + $date_temp = date("t-m-Y", strtotime($date_facture)); + $formatter = new IntlDateFormatter('fr_FR', IntlDateFormatter::LONG, IntlDateFormatter::NONE); + $date_formated = $formatter->format(DateTime::createFromFormat('d-m-Y', $date_temp)); + + try { + $storage->newFolder(html_entity_decode($defaultConfig[0]->path).'/DOCUMENTS RECAPITULATIFS/'.$key_annee.'/'.$key_mois.' '.strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1])).'/'); + } catch(\OCP\Files\NotPermittedException $e) { } + + $pdf->AddPage(); + // on sup les 2 cm en bas + $pdf->SetAutoPagebreak(False); + $pdf->SetMargins(0,0,10); + + // logo : 80 de largeur et 55 de hauteur + if($doesLogoExist){ + $pdf->Image($this->defaultImagePath."logo.png", 10, 10, 75, 25); + } + // adresse du facture + $pdf->SetFont('ComicSans','B',size: 11); + $pdf->SetY(40); + $pdf->Cell( 0, 8, utf8_decode($current_client), 0, 1, 'R'); + $pdf->Cell( 0, 8, trim(utf8_decode(html_entity_decode($clientAddress))), 0,1,'R'); + if($clientCity != ''){ + $pdf->Cell( 0, 8, trim(utf8_decode(html_entity_decode($clientCity))), 0, 1, 'R'); + } + // date facture + $pdf->SetFont('ComicSans','',11); + $pdf->Cell( 0, 8, "Saint Senoux, le ".utf8_decode($date_formated), 0, 1, 'R'); + + // observations + $pdf->SetFont( "ComicSans", "BU", 10 ); $pdf->SetXY( 10, 85 ) ; $pdf->Cell($pdf->GetStringWidth("Objet:"), 0, "Objet:", 0, "L"); + $objet = utf8_decode("Récapitulatif Facturation du mois de ").strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1])); + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 85 ) ; $pdf->Cell($pdf->GetStringWidth($objet), 0, $objet, 0, "L"); + + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 95 ); $pdf->Cell($pdf->GetStringWidth("Madame, Monsieur"), 0, "Madame, Monsieur", 0, "L"); + + $text1 = utf8_decode("Veuillez trouver ci-dessous le récapitulatif de la facturation du mois de ").strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1]))."."; + $text2 = utf8_decode("Vous en souhaitant bonne réception."); + $text3 = utf8_decode("Veuillez agréer, Madame, Monsieur, mes salutations les meilleures."); + + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 105 ) ; $pdf->Cell($pdf->GetStringWidth($text1), 0, $text1, 0, "L"); + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 110 ) ; $pdf->Cell($pdf->GetStringWidth($text2), 0, $text2, 0, "L"); + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 120 ) ; $pdf->Cell($pdf->GetStringWidth($text3), 0, $text3, 0, "L"); + + // signature + $pdf->SetFont('ComicSans','',11); $pdf->SetXY( 145, 145 ); + $pdf->Cell( $pdf->GetStringWidth($defaultConfig[0]->nom.' '.$defaultConfig[0]->prenom), 0, utf8_decode(html_entity_decode($defaultConfig[0]->nom.' '.$defaultConfig[0]->prenom)), 0, 0, 'L'); + $signatureExists = $this->doesSignatureImageExists('sign.png'); + if($signatureExists){ + $pdf->Image($this->defaultImagePath."sign.png", 135, 150, 55, 30); + } + + $y0 = 260; + $pageWidth = $pdf->GetPageWidth(); + //Positionnement en bas et tout centrer + $pdf->SetFont('ComicSans','',7); + $pdf->SetXY( 1, $y0 + 4 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->mentions_default)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 8 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->legal_one)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 12 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->legal_two)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 16 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->telephone)), 0, 0, 'C'); + + /*$pdf->SetXY( 1, $y0 + 16 ); + $pdf->Cell( $pageWidth, 5, utf8_decode("SIREN 751621293"), 0, 0, 'C');*/ + + $num_page = 1; + $nb_page = ceil(sizeof($client) / 26); + $index_facture_position = 0; + $max_nb_toget = (sizeof($client)<=26)?sizeof($client):26; + + $montant_ht_total = 0; + $montant_tva_total = 0; + $montant_ttc_total = 0; + + while ($num_page <= $nb_page) { + $pdf->AddPage(); + // on sup les 2 cm en bas + $pdf->SetAutoPagebreak(False); + $pdf->SetMargins(0,0,10); + if($doesLogoExist){ + $pdf->Image($this->defaultImagePath."logo.png", 10, 10, 75, 25); + } + + // n° page en haute à droite + if($nb_page>1){ + $pdf->SetXY( 120, 5 ); $pdf->SetFont( "ComicSans", "B", 9 ); $pdf->Cell( 160, 8, $num_page . '/' . $nb_page, 0, 0, 'C'); + } + + // date facture + $pdf->SetFont('ComicSans','',11); + $pdf->SetY(10); + $pdf->Cell( 0, 8,"Saint Senoux, le ".utf8_decode($date_formated), 0, 0, 'R'); + + // n° facture, date echeance et reglement et obs + $pdf->SetLineWidth(0.1); $pdf->SetFillColor(255); $pdf->Rect(114, 20, 85, 8, "DF"); + $pdf->SetXY( 114, 20 ); $pdf->SetFont( "ComicSans", "B", 12 ); $pdf->Cell( 85, 8, 'FACTURE N'.utf8_decode('°').' FAC/'.$key_annee.'/'.strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1])), 0, 0, 'C'); + + // adresse du facture + $pdf->SetFont('ComicSans','B',11); + $pdf->SetY(y: 32); + $pdf->Cell( 0, 6, utf8_decode($current_client), 0, 1, 'R'); + $pdf->Cell( 0, 6, trim(utf8_decode(html_entity_decode($clientAddress))), 0, 1, 'R'); + if($clientCity != ''){ + $pdf->Cell( 0, 6, trim(utf8_decode(html_entity_decode($clientCity))), 0, 1, 'R'); + } + $pdf->Cell( 0, 6, FileExportHelpers::FormatTextForExport('Numéro') . ' Siret: ' . FileExportHelpers::FormatTextForExport($tvaIntraCommuValue), 0, 1, 'R'); + $pdf->Cell( 0, 6, 'Email: ' . utf8_decode(html_entity_decode($facture['mail_client'])), 0, 1, 'R'); + + // *********************** + // le cadre des articles + // *********************** + // cadre avec 18 lignes max ! et 118 de hauteur --> 80 + 118 = 198 pour les traits verticaux + $pdf->SetLineWidth(0.1); $pdf->Rect(5, 80, 200, 153, "D"); + // cadre titre des colonnes + $pdf->Line(5, 90, 205, 90); + // les traits verticaux colonnes + $pdf->Line(145, 80, 145, 233); $pdf->Line(163, 80, 163, 233); + if($num_page == $nb_page) $pdf->Line(183, 80, 183, 240); + else $pdf->Line(183, 80, 183, 233); + // titre colonne + $pdf->SetXY( 1, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 140, 8, "OBJET", 0, 0, 'C'); + $pdf->SetXY( 147, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 13, 8, "H.T.", 0, 0, 'C'); + $pdf->SetXY( 168, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 10, 8, "TVA 20%", 0, 0, 'C'); + $pdf->SetXY( 183, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 22, 8, "T.T.C", 0, 0, 'C'); + + // (new DateTime($facture['date_soin']))->format('d-M') + $formatter_ds = new IntlDateFormatter('fr_FR', IntlDateFormatter::SHORT, IntlDateFormatter::NONE); + + // Set the pattern for the formatter to "d-MMMM" to display the day and month name in French + $formatter_ds->setPattern('dd-MMM'); + + //recuperation des factures + $y_facture = 90; + + $init_index = $index_facture_position; + + for ($index_facture_position; $index_facture_position < ($init_index + $max_nb_toget) ; $index_facture_position++) { + $date_soin_temp = new DateTime($client[$index_facture_position]['date_soin']); + + $pdf->SetXY( 6, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 28, 8, $client[$index_facture_position]['num'], 0, 0, ''); + $pdf->SetXY( 32, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 18, 8, utf8_decode($formatter_ds->format($date_soin_temp)), 0, 0, ''); + $pdf->SetXY( 50, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 38, 8, utf8_decode(html_entity_decode($client[$index_facture_position]['defunt'])), 0, 0, ''); + $pdf->SetXY( 90, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 28, 8, utf8_decode(html_entity_decode($client[$index_facture_position]['produit_references'])), 0, 0, ''); + $pdf->SetXY( 147, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 13, 8, number_format($client[$index_facture_position]['montant_htc'],2,'.','').chr(128), 0, 0, 'C'); + $pdf->SetXY( 168, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 10, 8, number_format($client[$index_facture_position]['montant_tva'],2,'.','').chr(128), 0, 0, 'C'); + $pdf->SetXY( 183, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 22, 8, number_format($client[$index_facture_position]['montant_ttc'],2,'.','').chr(128), 0, 0, 'C'); + + $montant_ht_total = $montant_ht_total+$client[$index_facture_position]['montant_htc']; + $montant_tva_total = $montant_tva_total+$client[$index_facture_position]['montant_tva']; + $montant_ttc_total = $montant_ttc_total+$client[$index_facture_position]['montant_ttc']; + + $y_facture=$y_facture+5; + } + + $nb_facture_chargee = $index_facture_position+1; + $reste_a_chargee = sizeof($client) - $nb_facture_chargee; + $max_nb_toget = ($reste_a_chargee <= 26) ? $reste_a_chargee+1 : 26; + + // si derniere page alors afficher cadre des TVA + if ($num_page == $nb_page) + { + $pdf->Line(5, 225, 205, 225); + $pdf->SetFont('ComicSans','B',8); $pdf->SetXY( 5, 225 ); $pdf->Cell( 140, 8, 'TOTAL', 0, 0, 'C'); + $pdf->SetFont('ComicSans','',8); $pdf->SetXY( 147, 225 ); $pdf->Cell( 13, 8, number_format($montant_ht_total,2,'.','').chr(128), 0, 0, 'C'); + $pdf->SetFont('ComicSans','',8); $pdf->SetXY( 168, 225 ); $pdf->Cell( 10, 8, number_format($montant_tva_total,2,'.','').chr(128), 0, 0, 'C'); + $pdf->SetFont('ComicSans','',8); $pdf->SetXY( 183, 225 ); $pdf->Cell( 22, 8, number_format($montant_ttc_total,2,'.','').chr(128), 0, 0, 'C'); + + $pdf->Rect(145, 233, 60, 7, "D"); + $pdf->SetFont('ComicSans','B',8); $pdf->SetXY( 147, 233 ); $pdf->Cell( 30, 6.5, 'TOTAL TTC', 0, 0, 'C'); + $pdf->SetFont('ComicSans','B',8); $pdf->SetXY( 183, 233 ); $pdf->Cell( 22, 6.5, number_format($montant_ttc_total,2,'.','').chr(128), 0, 0, 'C', true); + } + + $y1 = 245; + + $pdf->SetFillColor(255); + $pdf->SetTextColor(0, 0, 0); + + $pdf->SetFont('ComicSans','',9); + + $pdf->SetXY( 10, $y1 );$pdf->Cell( $pdf->GetPageWidth(), 4, utf8_decode("Loi N° 92-442 du 31 décembre 1992: La présente facture est payable en comptant a réception."), 0, 0, 'L'); + $pdf->SetXY( 10, $y1 + 4 );$pdf->Cell( $pdf->GetPageWidth(), 4, utf8_decode("Indemnité forfaitaire pour frais de recouvrement due en cas de retard de paiement: 40").chr(128), 0, 0, 'L'); + $pdf->SetXY( 10, $y1 + 8 );$pdf->Multicell( $pdf->GetPageWidth()-20, 4, utf8_decode("Toute somme non payée dans les trente jours est susceptible de porter intérets à un taux égal à une fois et demi le taux de l'intéret légal."), 0, 0, 'L'); + + // ************************** + // pied de page + // ************************** + + $pdf->SetFont('ComicSans','',7); + $pdf->SetXY( 1, $y0 + 4 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->mentions_default)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 8 );$pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->legal_one)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 12 );$pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->legal_two)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 16 );$pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($defaultConfig[0]->telephone)), 0, 0, 'C'); + + /*$pdf->SetXY( 1, $y0 + 16 ); + $pdf->Cell( $pageWidth, 5, utf8_decode("SIREN 751621293"), 0, 0, 'C');*/ + + $num_page++; + } + + $fullPdfPath = html_entity_decode($defaultConfig[0]->path).'/DOCUMENTS RECAPITULATIFS/'.$key_annee.'/'.$key_mois.' '.strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1])).'/'.strtoupper(FileExportHelpers::ConvertSpecialChar($current_client)).'_RECAP_FACTURE_'.strtoupper(FileExportHelpers::ConvertSpecialChar(explode(' ', $date_formated)[1])).'_'.$key_annee.'.pdf'; + $storage->newFile($fullPdfPath); + $pdfContent = $pdf->Output('','S'); + + $file_pdf = $storage->get($fullPdfPath); + $file_pdf->putContent($pdfContent); + + return $fullPdfPath; + } + } + } + } + + public function generateInvoiceRecap($filter,$filterType,$date,$idNextcloud){ + $defaultConfig = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN)); + try { + if($filterType == MultipleFactureTypeConstant::GROUP_FILTER_TYPE){ + $filenames = $this->generateInvoiceRecapPerClientGroupFacturation($filter,$date,$idNextcloud); + } + else{ + $filenames = $this->generateInvoiceRecapPerClient($filter,$date,$idNextcloud); + } + return $filenames; + } catch(\OCP\Files\NotFoundException $e) { } + } +} diff --git a/gestion/lib/Service/InvoiceRecap/PdfHandler/InvoiceRecapPdfHandler.php b/gestion/lib/Service/InvoiceRecap/PdfHandler/InvoiceRecapPdfHandler.php new file mode 100644 index 0000000..1de2bf0 --- /dev/null +++ b/gestion/lib/Service/InvoiceRecap/PdfHandler/InvoiceRecapPdfHandler.php @@ -0,0 +1,371 @@ + + * + * @author Anna Larch + * @author Richard Steinmetz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see . + * + */ + +namespace OCA\Gestion\Service\InvoiceRecap\PdfHandler; + +use DateTime; +use \FPDF; +use IntlDateFormatter; +use OCA\Gestion\Helpers\FileExportHelpers; +use OCA\Gestion\Helpers\PriceHelpers; + +class InvoiceRecapPdfHandler extends FPDF { + + private $invoices = []; + private $logo = null; + private $logoPath = "/var/www/html/data/admin/files/.gestion/"; + + private $configs = []; + + private $signatureImageExist = false; +// function Header() +// { +// if($this->logo != "nothing"){ +// $this->Image($this->logoPath."logo.png", 10, 10, 75, 25); +// } +// else{ +// $this->Cell(55,30,''); +// } +// } +// function Footer() +// { +// $this->SetY(-40); +// $this->SetFont('ComicSans', '', 7); +// $this->MultiCell(0,5,utf8_decode(html_entity_decode('Tout retard de paiement entraînera de plein droit une pénalité de retard de 3 fois le taux légal ( Loi 2008-776 du 4 août 2008) et une indemnité forfaitaire de 40 EUR pour frais de recouvrement sera appliquée.'))); +// $this->Ln(1); +// $this->MultiCell(0,5,utf8_decode(html_entity_decode('Si les frais de recouvrement sont supérieurs à ce montant forfaitaire, une indemnisation complémentaire sera due sur présentation de justificatifs ( articles L.441-3 et L.441-6 du code de commerce ). +// '))); + +// $this->SetY(-15); +// $this->SetFont('ComicSans', 'B', 8); +// $this->Cell(0, 10, utf8_decode(html_entity_decode($this->devisData['configuration']->legal_one)), 0, 0, 'C'); +// } + + public function SetInvoiceRecapFacture(array $invoices,array $configs,$logo = null,$signatureImageExist = false){ + $this->invoices = $invoices; + $this->logo = $logo; + $this->signatureImageExist = $signatureImageExist; + $this->configs = $configs; + } + + public function SetInvoiceRecap(){ + $data_temp = $this->invoices; + $isLogoExist = $this->logo != null; + foreach ($data_temp as $key_annee => $annee) { + foreach ($annee as $key_mois => $mois) { + foreach ($mois as $key_client => $client) { + $pdf = new FPDF(); + $pdf->AddFont('ComicSans','','Comic Sans MS.php'); + $pdf->AddFont('ComicSans','B','comic-sans-bold.php'); + $current_client = ''; + $clientAddress = ''; + $clientCity = ''; + $date_facture; + $j=1; + foreach ($client as $key => $facture) { + if($j==1) { + $current_client = $facture['prenoms_client'].' '.$facture['nom_client']; + $date_facture = $facture['date_facture']; + $clientAddresses = FileExportHelpers::GetAddressAndCityFromAddress($facture['adresse_client']); + $clientAddress = $clientAddresses['address']; + $clientCity = $clientAddresses['city']; + } + $j++; + } + $date_temp = date("t-m-Y", strtotime($date_facture)); + $formatter = new IntlDateFormatter('fr_FR', IntlDateFormatter::LONG, IntlDateFormatter::NONE); + $date_formated = $formatter->format(DateTime::createFromFormat('d-m-Y', $date_temp)); + + $pdf->AddPage(); + // on sup les 2 cm en bas + $pdf->SetAutoPagebreak(False); + $pdf->SetMargins(0,0,10); + + // logo : 80 de largeur et 55 de hauteur + if($isLogoExist){ + $pdf->Image($this->logoPath."logo.png", 10, 10, 75, 25); + } + // adresse du facture + $pdf->SetFont('ComicSans','B',size: 11); + $pdf->SetY(40); + $pdf->Cell( 0, 8, utf8_decode($current_client), 0, 1, 'R'); + $pdf->Cell( 0, 8, trim(utf8_decode(html_entity_decode($clientAddress))), 0,1,'R'); + if($clientCity != ''){ + $pdf->Cell( 0, 8, trim(utf8_decode(html_entity_decode($clientCity))), 0, 1, 'R'); + } + // date facture + $pdf->SetFont('ComicSans','',11); + $pdf->Cell( 0, 8, "Saint Senoux, le ".utf8_decode($date_formated), 0, 1, 'R'); + + // observations + $pdf->SetFont( "ComicSans", "BU", 10 ); $pdf->SetXY( 10, 85 ) ; $pdf->Cell($pdf->GetStringWidth("Objet:"), 0, "Objet:", 0, "L"); + $objet = utf8_decode("Récapitulatif Facturation du mois de ").strtoupper($this->convert_special_char(explode(' ', $date_formated)[1])); + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 85 ) ; $pdf->Cell($pdf->GetStringWidth($objet), 0, $objet, 0, "L"); + + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 95 ); $pdf->Cell($pdf->GetStringWidth("Madame, Monsieur"), 0, "Madame, Monsieur", 0, "L"); + + $text1 = utf8_decode("Veuillez trouver ci-dessous le récapitulatif de la facturation du mois de ").strtoupper($this->convert_special_char(explode(' ', $date_formated)[1]))."."; + $text2 = utf8_decode("Vous en souhaitant bonne réception."); + $text3 = utf8_decode("Veuillez agréer, Madame, Monsieur, mes salutations les meilleures."); + + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 105 ) ; $pdf->Cell($pdf->GetStringWidth($text1), 0, $text1, 0, "L"); + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 110 ) ; $pdf->Cell($pdf->GetStringWidth($text2), 0, $text2, 0, "L"); + $pdf->SetFont( "ComicSans", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 120 ) ; $pdf->Cell($pdf->GetStringWidth($text3), 0, $text3, 0, "L"); + + // signature + $pdf->SetFont('ComicSans','',11); $pdf->SetXY( 145, 145 ); + $pdf->Cell( $pdf->GetStringWidth($this->configs[0]->nom.' '.$this->configs[0]->prenom), 0, utf8_decode(html_entity_decode($this->configs[0]->nom.' '.$this->configs[0]->prenom)), 0, 0, 'L'); + if($this->signatureImageExist){ + $pdf->Image($this->logoPath."sign.png", 135, 150, 55, 30); + } + + $y0 = 260; + $pageWidth = $pdf->GetPageWidth(); + //Positionnement en bas et tout centrer + $pdf->SetFont('ComicSans','',7); + $pdf->SetXY( 1, $y0 + 4 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($this->configs[0]->mentions_default)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 8 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($this->configs[0]->legal_one)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 12 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($this->configs[0]->legal_two)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 16 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($this->configs[0]->telephone)), 0, 0, 'C'); + + /*$pdf->SetXY( 1, $y0 + 16 ); + $pdf->Cell( $pageWidth, 5, utf8_decode("SIREN 751621293"), 0, 0, 'C');*/ + + $num_page = 1; + $nb_page = ceil(sizeof($client) / 26); + $index_facture_position = 0; + $max_nb_toget = (sizeof($client)<=26)?sizeof($client):26; + + $montant_ht_total = 0; + $montant_tva_total = 0; + $montant_ttc_total = 0; + + while ($num_page <= $nb_page) { + $pdf->AddPage(); + // on sup les 2 cm en bas + $pdf->SetAutoPagebreak(False); + $pdf->SetMargins(0,0,10); + if($isLogoExist){ + $pdf->Image($this->logoPath."logo.png", 10, 10, 75, 25); + } + + // n° page en haute à droite + if($nb_page>1){ + $pdf->SetXY( 120, 5 ); $pdf->SetFont( "ComicSans", "B", 9 ); $pdf->Cell( 160, 8, $num_page . '/' . $nb_page, 0, 0, 'C'); + } + + // date facture + $pdf->SetFont('ComicSans','',11); + $pdf->SetY(10); + $pdf->Cell( 0, 8,"Saint Senoux, le ".utf8_decode($date_formated), 0, 0, 'R'); + + // n° facture, date echeance et reglement et obs + $pdf->SetLineWidth(0.1); $pdf->SetFillColor(255); $pdf->Rect(114, 20, 85, 8, "DF"); + $pdf->SetXY( 114, 20 ); $pdf->SetFont( "ComicSans", "B", 12 ); $pdf->Cell( 85, 8, 'FACTURE N'.utf8_decode('°').' FAC/'.$key_annee.'/'.strtoupper($this->convert_special_char(explode(' ', $date_formated)[1])), 0, 0, 'C'); + + // adresse du facture + $pdf->SetFont('ComicSans','B',11); + $pdf->SetY(y: 32); + $pdf->Cell( 0, 6, utf8_decode($current_client), 0, 1, 'R'); + $pdf->Cell( 0, 6, trim(utf8_decode(html_entity_decode($clientAddress))), 0, 1, 'R'); + if($clientCity != ''){ + $pdf->Cell( 0, 6, trim(utf8_decode(html_entity_decode($clientCity))), 0, 1, 'R'); + } + $pdf->Cell( 0, 6, FileExportHelpers::FormatTextForExport('Numéro') . ' Siret: ' . FileExportHelpers::FormatTextForExport($tvaIntraCommuValue), 0, 1, 'R'); + $pdf->Cell( 0, 6, 'Email: ' . utf8_decode(html_entity_decode($facture['mail_client'])), 0, 1, 'R'); + + // *********************** + // le cadre des articles + // *********************** + // cadre avec 18 lignes max ! et 118 de hauteur --> 80 + 118 = 198 pour les traits verticaux + $pdf->SetLineWidth(0.1); $pdf->Rect(5, 80, 200, 153, "D"); + // cadre titre des colonnes + $pdf->Line(5, 90, 205, 90); + // les traits verticaux colonnes + $pdf->Line(145, 80, 145, 233); $pdf->Line(163, 80, 163, 233); + if($num_page == $nb_page) $pdf->Line(183, 80, 183, 240); + else $pdf->Line(183, 80, 183, 233); + // titre colonne + $pdf->SetXY( 1, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 140, 8, "OBJET", 0, 0, 'C'); + $pdf->SetXY( 147, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 13, 8, "H.T.", 0, 0, 'C'); + $pdf->SetXY( 168, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 10, 8, "TVA 20%", 0, 0, 'C'); + $pdf->SetXY( 183, 81 ); $pdf->SetFont('ComicSans','B',8); $pdf->Cell( 22, 8, "T.T.C", 0, 0, 'C'); + + // (new DateTime($facture['date_soin']))->format('d-M') + $formatter_ds = new IntlDateFormatter('fr_FR', IntlDateFormatter::SHORT, IntlDateFormatter::NONE); + + // Set the pattern for the formatter to "d-MMMM" to display the day and month name in French + $formatter_ds->setPattern('dd-MMM'); + + //recuperation des factures + $y_facture = 90; + + $init_index = $index_facture_position; + + for ($index_facture_position; $index_facture_position < ($init_index + $max_nb_toget) ; $index_facture_position++) { + $date_soin_temp = new DateTime($client[$index_facture_position]['date_soin']); + + $pdf->SetXY( 6, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 28, 8, $client[$index_facture_position]['num'], 0, 0, ''); + $pdf->SetXY( 32, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 18, 8, utf8_decode($formatter_ds->format($date_soin_temp)), 0, 0, ''); + $pdf->SetXY( 50, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 38, 8, utf8_decode(html_entity_decode($client[$index_facture_position]['defunt'])), 0, 0, ''); + $pdf->SetXY( 90, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 28, 8, utf8_decode(html_entity_decode($client[$index_facture_position]['produit_references'])), 0, 0, ''); + $pdf->SetXY( 147, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 13, 8, number_format($client[$index_facture_position]['montant_htc'],2,'.','').chr(128), 0, 0, 'C'); + $pdf->SetXY( 168, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 10, 8, number_format($client[$index_facture_position]['montant_tva'],2,'.','').chr(128), 0, 0, 'C'); + $pdf->SetXY( 183, $y_facture ); $pdf->SetFont('ComicSans','',8); $pdf->Cell( 22, 8, number_format($client[$index_facture_position]['montant_ttc'],2,'.','').chr(128), 0, 0, 'C'); + + $montant_ht_total = $montant_ht_total+$client[$index_facture_position]['montant_htc']; + $montant_tva_total = $montant_tva_total+$client[$index_facture_position]['montant_tva']; + $montant_ttc_total = $montant_ttc_total+$client[$index_facture_position]['montant_ttc']; + + $y_facture=$y_facture+5; + } + + $nb_facture_chargee = $index_facture_position+1; + $reste_a_chargee = sizeof($client) - $nb_facture_chargee; + $max_nb_toget = ($reste_a_chargee <= 26) ? $reste_a_chargee+1 : 26; + + // si derniere page alors afficher cadre des TVA + if ($num_page == $nb_page) + { + $pdf->Line(5, 225, 205, 225); + $pdf->SetFont('ComicSans','B',8); $pdf->SetXY( 5, 225 ); $pdf->Cell( 140, 8, 'TOTAL', 0, 0, 'C'); + $pdf->SetFont('ComicSans','',8); $pdf->SetXY( 147, 225 ); $pdf->Cell( 13, 8, number_format($montant_ht_total,2,'.','').chr(128), 0, 0, 'C'); + $pdf->SetFont('ComicSans','',8); $pdf->SetXY( 168, 225 ); $pdf->Cell( 10, 8, number_format($montant_tva_total,2,'.','').chr(128), 0, 0, 'C'); + $pdf->SetFont('ComicSans','',8); $pdf->SetXY( 183, 225 ); $pdf->Cell( 22, 8, number_format($montant_ttc_total,2,'.','').chr(128), 0, 0, 'C'); + + $pdf->Rect(145, 233, 60, 7, "D"); + $pdf->SetFont('ComicSans','B',8); $pdf->SetXY( 147, 233 ); $pdf->Cell( 30, 6.5, 'TOTAL TTC', 0, 0, 'C'); + $pdf->SetFont('ComicSans','B',8); $pdf->SetXY( 183, 233 ); $pdf->Cell( 22, 6.5, number_format($montant_ttc_total,2,'.','').chr(128), 0, 0, 'C', true); + } + + $y1 = 245; + + $pdf->SetFillColor(255); + $pdf->SetTextColor(0, 0, 0); + + $pdf->SetFont('ComicSans','',9); + + $pdf->SetXY( 10, $y1 );$pdf->Cell( $pdf->GetPageWidth(), 4, utf8_decode("Loi N° 92-442 du 31 décembre 1992: La présente facture est payable en comptant a réception."), 0, 0, 'L'); + $pdf->SetXY( 10, $y1 + 4 );$pdf->Cell( $pdf->GetPageWidth(), 4, utf8_decode("Indemnité forfaitaire pour frais de recouvrement due en cas de retard de paiement: 40").chr(128), 0, 0, 'L'); + $pdf->SetXY( 10, $y1 + 8 );$pdf->Multicell( $pdf->GetPageWidth()-20, 4, utf8_decode("Toute somme non payée dans les trente jours est susceptible de porter intérets à un taux égal à une fois et demi le taux de l'intéret légal."), 0, 0, 'L'); + + // ************************** + // pied de page + // ************************** + + $pdf->SetFont('ComicSans','',7); + $pdf->SetXY( 1, $y0 + 4 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($this->configs[0]->mentions_default)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 8 );$pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($this->configs[0]->legal_one)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 12 );$pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($this->configs[0]->legal_two)), 0, 0, 'C'); + $pdf->SetXY( 1, $y0 + 16 );$pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($this->configs[0]->telephone)), 0, 0, 'C'); + + /*$pdf->SetXY( 1, $y0 + 16 ); + $pdf->Cell( $pageWidth, 5, utf8_decode("SIREN 751621293"), 0, 0, 'C');*/ + + $num_page++; + } + + $ff_pdf = html_entity_decode($this->configs[0]->path).'/DOCUMENTS RECAPITULATIFS/'.$key_annee.'/'.$key_mois.' '.strtoupper($this->convert_special_char(explode(' ', $date_formated)[1])).'/'.strtoupper($this->convert_special_char($current_client)).'_RECAP_FACTURE_'.strtoupper($this->convert_special_char(explode(' ', $date_formated)[1])).'_'.$key_annee.'.pdf'; + $this->storage->newFile($ff_pdf); + $pdfContent = $pdf->Output('','S'); + + $file_pdf = $this->storage->get($ff_pdf); + $file_pdf->putContent($pdfContent); + } + } + } + } + + + function MultiAlignCell($w,$h,$text,$border=0,$ln=0,$align='L',$fill=false) + { + // Store reset values for (x,y) positions + $x = $this->GetX() + $w; + $y = $this->GetY(); + + // Make a call to FPDF's MultiCell + $this->MultiCell($w,$h,$text,$border,$align,$fill); + + // Reset the line position to the right, like in Cell + if( $ln==0 ) + { + $this->SetXY($x,$y); + } + } + + function NbLines($w, $txt) + { + // Compute the number of lines a MultiCell of width w will take + if(!isset($this->CurrentFont)) + $this->Error('No font has been set'); + $cw = $this->CurrentFont['cw']; + if($w==0) + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + $s = str_replace("\r",'',(string)$txt); + $nb = strlen($s); + if($nb>0 && $s[$nb-1]=="\n") + $nb--; + $sep = -1; + $i = 0; + $j = 0; + $l = 0; + $nl = 1; + while($i<$nb) + { + $c = $s[$i]; + if($c=="\n") + { + $i++; + $sep = -1; + $j = $i; + $l = 0; + $nl++; + continue; + } + if($c==' ') + $sep = $i; + $l += $cw[$c]; + if($l>$wmax) + { + if($sep==-1) + { + if($i==$j) + $i++; + } + else + $i = $sep+1; + $sep = -1; + $j = $i; + $l = 0; + $nl++; + } + else + $i++; + } + return $nl; + } +}