Merge branch 'fixes/fix-facture-tva-amount' into staging

This commit is contained in:
Tiavina 2025-01-03 10:49:33 +03:00
commit 9987e9d02c
4 changed files with 89 additions and 41 deletions

View File

@ -782,14 +782,17 @@ class PageController extends Controller {
$pdf = new FPDF(); $pdf = new FPDF();
$current_client = ''; $current_client = '';
$adresse = ''; $clientAddress = '';
$clientCity = '';
$date_facture; $date_facture;
$j=1; $j=1;
foreach ($client as $key => $facture) { foreach ($client as $key => $facture) {
if($j==1) { if($j==1) {
$current_client = $facture['prenoms_client'].' '.$facture['nom_client']; $current_client = $facture['prenoms_client'].' '.$facture['nom_client'];
$adresse = $facture['adresse_client'];
$date_facture = $facture['date_facture']; $date_facture = $facture['date_facture'];
$clientAddresses = FileExportHelpers::GetAddressAndCityFromAddress($facture['adresse_client']);
$clientAddress = $clientAddresses['address'];
$clientCity = $clientAddresses['city'];
} }
$j++; $j++;
} }
@ -804,19 +807,23 @@ class PageController extends Controller {
$pdf->AddPage(); $pdf->AddPage();
// on sup les 2 cm en bas // on sup les 2 cm en bas
$pdf->SetAutoPagebreak(False); $pdf->SetAutoPagebreak(False);
$pdf->SetMargins(0,0,0); $pdf->SetMargins(0,0,10);
// logo : 80 de largeur et 55 de hauteur // logo : 80 de largeur et 55 de hauteur
if($isLogoExist){ if($isLogoExist){
$pdf->Image($this->currentUserImagePath."logo.png", 10, 10, 55, 30); $pdf->Image($this->currentUserImagePath."logo.png", 10, 10, 55, 30);
} }
// adresse du facture // adresse du facture
$pdf->SetFont('Arial','B',size: 11); $_x = 122 ; $_y = 40; $pdf->SetFont('Arial','B',size: 11);
$pdf->SetXY( $_x, $_y ); $pdf->Cell( 100, 8, utf8_decode($current_client), 0, 0, ''); $_y += 8; $pdf->SetY(40);
$pdf->SetXY( $_x, $_y ); $pdf->MultiCell( 80, 4, utf8_decode(html_entity_decode($adresse)), 0, 0, ''); $pdf->Cell( 0, 8, utf8_decode($current_client), 0, 1, 'R');
$pdf->Cell( 0, 8, utf8_decode(html_entity_decode($clientAddress)), 0,1,'R');
if($clientCity != ''){
$pdf->Cell( 0, 8, utf8_decode(html_entity_decode($clientCity)), 0, 1, 'R');
}
// date facture // date facture
$pdf->SetFont('Arial','',11); $pdf->SetXY( 122, 60 ); $pdf->SetFont('Arial','',11);
$pdf->MultiCell( 60, 8, $current_config[0]->adresse . " le, ".utf8_decode($date_formated), 0, 0, ''); $pdf->Cell( 0, 8, "Saint Senoux le, ".utf8_decode($date_formated), 0, 1, 'R');
// observations // observations
$pdf->SetFont( "Arial", "BU", 10 ); $pdf->SetXY( 10, 85 ) ; $pdf->Cell($pdf->GetStringWidth("Objet:"), 0, "Objet:", 0, "L"); $pdf->SetFont( "Arial", "BU", 10 ); $pdf->SetXY( 10, 85 ) ; $pdf->Cell($pdf->GetStringWidth("Objet:"), 0, "Objet:", 0, "L");
@ -834,17 +841,17 @@ class PageController extends Controller {
$pdf->SetFont( "Arial", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 120 ) ; $pdf->Cell($pdf->GetStringWidth($text3), 0, $text3, 0, "L"); $pdf->SetFont( "Arial", "", 10 ); $pdf->SetXY( $pdf->GetStringWidth("Objet")+15, 120 ) ; $pdf->Cell($pdf->GetStringWidth($text3), 0, $text3, 0, "L");
// signature // signature
$pdf->SetFont('Arial','',11); $pdf->SetXY( 122, 145 ); $pdf->SetFont('Arial','',11); $pdf->SetXY( 145, 145 );
$pdf->Cell( $pdf->GetStringWidth($current_config[0]->nom.' '.$current_config[0]->prenom), 0, utf8_decode(html_entity_decode($current_config[0]->nom.' '.$current_config[0]->prenom)), 0, 0, 'L'); $pdf->Cell( $pdf->GetStringWidth($current_config[0]->nom.' '.$current_config[0]->prenom), 0, utf8_decode(html_entity_decode($current_config[0]->nom.' '.$current_config[0]->prenom)), 0, 0, 'L');
$signatureExists = $this->signatureImageExists('sign.png'); $signatureExists = $this->signatureImageExists('sign.png');
if($signatureExists){ if($signatureExists){
$pdf->Image($this->currentUserImagePath."sign.png", 122, 150, 55, 30); $pdf->Image($this->currentUserImagePath."sign.png", 135, 150, 55, 30);
} }
$y0 = 260; $y0 = 260;
$pageWidth = $pdf->GetPageWidth(); $pageWidth = $pdf->GetPageWidth();
//Positionnement en bas et tout centrer //Positionnement en bas et tout centrer
$pdf->SetFont('Arial','',6); $pdf->SetFont('Arial','',8);
$pdf->SetXY( 1, $y0 + 4 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->mentions_default)), 0, 0, 'C'); $pdf->SetXY( 1, $y0 + 4 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->mentions_default)), 0, 0, 'C');
$pdf->SetXY( 1, $y0 + 8 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->legal_one)), 0, 0, 'C'); $pdf->SetXY( 1, $y0 + 8 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->legal_one)), 0, 0, 'C');
$pdf->SetXY( 1, $y0 + 12 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->legal_two)), 0, 0, 'C'); $pdf->SetXY( 1, $y0 + 12 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->legal_two)), 0, 0, 'C');
@ -866,7 +873,7 @@ class PageController extends Controller {
$pdf->AddPage(); $pdf->AddPage();
// on sup les 2 cm en bas // on sup les 2 cm en bas
$pdf->SetAutoPagebreak(False); $pdf->SetAutoPagebreak(False);
$pdf->SetMargins(0,0,0); $pdf->SetMargins(0,0,10);
if($isLogoExist){ if($isLogoExist){
$pdf->Image($this->currentUserImagePath."logo.png", 10, 10, 55, 30); $pdf->Image($this->currentUserImagePath."logo.png", 10, 10, 55, 30);
} }
@ -877,21 +884,24 @@ class PageController extends Controller {
} }
// date facture // date facture
$pdf->SetFont('Arial','',11); $pdf->SetXY( 122, y: 10 ); $pdf->SetFont('Arial','',11);
$pdf->MultiCell( 60, 8, $current_config[0]->adresse . " le, ".utf8_decode($date_formated), 0, 0, ''); $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 // n° facture, date echeance et reglement et obs
$pdf->SetLineWidth(0.1); $pdf->SetFillColor(255); $pdf->Rect(100, 30, 85, 8, "DF"); $pdf->SetLineWidth(0.1); $pdf->SetFillColor(255); $pdf->Rect(114, 20, 85, 8, "DF");
$pdf->SetXY( 100, 30 ); $pdf->SetFont( "Arial", "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'); $pdf->SetXY( 114, 20 ); $pdf->SetFont( "Arial", "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 // adresse du facture
$pdf->SetFont('Arial','B',11); $x = 122 ; $y = 45; $pdf->SetFont('Arial','B',11);
$pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, utf8_decode($current_client), 0, 0, ''); $y += 8; $pdf->SetY(y: 32);
$pdf->SetXY( $x, $y ); $pdf->MultiCell( 80, 4, utf8_decode(html_entity_decode($adresse)), 0, 0, ''); $y += 7; $pdf->Cell( 0, 6, utf8_decode($current_client), 0, 1, 'R');
$pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, FileExportHelpers::FormatTextForExport('Numéro') . ' TVA:', 0, 0, ''); $x+=25; $pdf->Cell( 0, 6, utf8_decode(html_entity_decode($clientAddress)), 0, 1, 'R');
$pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, FileExportHelpers::FormatTextForExport($tvaIntraCommuValue), 0, 0, '');$y += 7;$x-=25; if($clientCity != ''){
$pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, 'Email:', 0, 0, ''); $x+=13; $pdf->Cell( 0, 6, utf8_decode(html_entity_decode($clientCity)), 0, 1, 'R');
$pdf->SetXY( $x, $y ); $pdf->Cell( 100, 8, utf8_decode(html_entity_decode($facture['mail_client'])), 0, 0, ''); }
$pdf->Cell( 0, 6, FileExportHelpers::FormatTextForExport('Numéro') . ' TVA: ' . 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 // le cadre des articles
@ -972,7 +982,7 @@ class PageController extends Controller {
// pied de page // pied de page
// ************************** // **************************
$pdf->SetFont('Arial','',6); $pdf->SetFont('Arial','',8);
$pdf->SetXY( 1, $y0 + 4 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->mentions_default)), 0, 0, 'C'); $pdf->SetXY( 1, $y0 + 4 ); $pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->mentions_default)), 0, 0, 'C');
$pdf->SetXY( 1, $y0 + 8 );$pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->legal_one)), 0, 0, 'C'); $pdf->SetXY( 1, $y0 + 8 );$pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->legal_one)), 0, 0, 'C');
$pdf->SetXY( 1, $y0 + 12 );$pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->legal_two)), 0, 0, 'C'); $pdf->SetXY( 1, $y0 + 12 );$pdf->Cell( $pageWidth, 5, utf8_decode(html_entity_decode($current_config[0]->legal_two)), 0, 0, 'C');

View File

@ -2322,6 +2322,7 @@ class Bdd {
client.entreprise as client_entreprise, client.entreprise as client_entreprise,
client.adresse as client_adresse, client.adresse as client_adresse,
defunt.nom as defunt_nom, defunt.nom as defunt_nom,
defunt.sexe as defunt_sexe,
lieu.nom as lieu_nom, lieu.nom as lieu_nom,
lieu.adresse as lieu_adresse, lieu.adresse as lieu_adresse,
thanato.nom as thanato_nom, thanato.nom as thanato_nom,

View File

@ -11,4 +11,24 @@ class FileExportHelpers
return $textFormatted; return $textFormatted;
} }
public static function GetAddressAndCityFromAddress(string $adresse){
$adresseResult = "";
$cityResult = "";
$adresses = explode("-",$adresse);
if(isset($adresses[0])){
$adresseResult = trim($adresses[0]);
}
if(isset($adresses[1])){
$cityResult = trim($adresses[1]);
}
return [
"address" => $adresseResult,
"city" => $cityResult
];
}
public static function GetSexeLabel(string $sexeKey){
return $sexeKey === 'f' ? 'Mme' : 'Mr';
}
} }

View File

@ -28,6 +28,7 @@ namespace OCA\Gestion\Service;
use DateTime; use DateTime;
use \FPDF; use \FPDF;
use OCA\Gestion\Helpers\FileExportHelpers;
use OCA\Gestion\Helpers\PriceHelpers; use OCA\Gestion\Helpers\PriceHelpers;
class InvoicePdfHandler extends FPDF { class InvoicePdfHandler extends FPDF {
@ -79,13 +80,22 @@ sera due sur présentation de justificatifs ( articles L.441-3 et L.441-6 du cod
public function GetFactureContent(){ public function GetFactureContent(){
$this->AddPage(); $this->AddPage();
$this->SetMargins(10,0,10);
$factureDate = $this->factureData['date']; $factureDate = $this->factureData['date'];
$factureDate = DateTime::createFromFormat('Y-m-d',$factureDate); $factureDate = DateTime::createFromFormat('Y-m-d',$factureDate);
$factureDate = $factureDate->format('d-m-Y'); $factureDate = $factureDate->format('d-m-Y');
$factureDatePaiement = $this->factureData['date_paiement']; $factureDatePaiement = $this->factureData['date_paiement'];
$factureDatePaiement = DateTime::createFromFormat('Y-m-d',$factureDatePaiement); $factureDatePaiement = DateTime::createFromFormat('Y-m-d',$factureDatePaiement);
$factureDateEcheance = $factureDatePaiement;
$factureDatePaiement = $factureDatePaiement->format('d-m-Y'); $factureDatePaiement = $factureDatePaiement->format('d-m-Y');
$factureDateEcheance->modify('+30 days');
$factureDateEcheance = $factureDateEcheance->format('d-m-Y');
$devisDate = $this->factureData['devis_date'];
$devisDate = DateTime::createFromFormat('Y-m-d',$devisDate);
$devisDate = $devisDate->format('d-m-Y');
$this->SetFont('Arial', '', 12); $this->SetFont('Arial', '', 12);
$this->Cell(0, 7, utf8_decode(html_entity_decode($this->factureData['configuration']->entreprise)), 0, 0); $this->Cell(0, 7, utf8_decode(html_entity_decode($this->factureData['configuration']->entreprise)), 0, 0);
$this->Cell(0, 7, utf8_decode(html_entity_decode($this->factureData['client_nom'] . ' ' . $this->factureData['client_entreprise'])), 0, 1,'R'); $this->Cell(0, 7, utf8_decode(html_entity_decode($this->factureData['client_nom'] . ' ' . $this->factureData['client_entreprise'])), 0, 1,'R');
@ -101,15 +111,15 @@ sera due sur présentation de justificatifs ( articles L.441-3 et L.441-6 du cod
//facture infos //facture infos
$this->SetFont('Arial', 'B', 11); $this->SetFont('Arial', 'B', 11);
$this->Cell(30, 7, 'DATE', 1, 0, 'C'); $this->Cell(30, 7, 'DATE', 1, 0, 'C');
$this->Cell(70, 7, 'CLIENT', 1, 0, 'C'); $this->Cell(80, 7, 'CLIENT', 1, 0, 'C');
$this->Cell(40, 7, 'FACTURE', 1, 0, 'C'); $this->Cell(40, 7, 'FACTURE', 1, 0, 'C');
$this->Cell(40, 7, 'ECHEANCE', 1, 1, 'C'); $this->Cell(40, 7, 'ECHEANCE', 1, 1, 'C');
$this->SetFont('Arial', '', 10); $this->SetFont('Arial', '', 10);
$this->Cell(30, 7, $factureDate, 1, 0, 'C'); $this->Cell(30, 7, $factureDatePaiement, 1, 0, 'C');
$this->Cell(70, 7, utf8_decode(html_entity_decode($this->factureData['client_nom'])), 1, 0, 'C'); $this->Cell(80, 7, utf8_decode(html_entity_decode($this->factureData['client_nom'])), 1, 0, 'C');
$this->Cell(40, 7, $this->factureData['num'], 1, 0, 'C'); $this->Cell(40, 7, $this->factureData['num'], 1, 0, 'C');
$this->Cell(40, 7, $factureDatePaiement, 1, 1, 'C'); $this->Cell(40, 7, $factureDateEcheance, 1, 1, 'C');
$this->Ln(8); $this->Ln(8);
@ -117,29 +127,36 @@ sera due sur présentation de justificatifs ( articles L.441-3 et L.441-6 du cod
$tvaValue = $this->factureData["configuration"]->tva_default; $tvaValue = $this->factureData["configuration"]->tva_default;
$this->SetFont('Arial', 'B', 11); $this->SetFont('Arial', 'B', 11);
$this->Cell(20, 8, 'Date', 1, 0); $this->Cell(20, 8, 'Date', 1, 0);
$this->Cell(80, 8, 'Description', 1, 0,'C'); $this->Cell(90, 8, 'Description', 1, 0,'C');
$this->Cell(30, 8, 'Prix Uni. HT', 1, 0, 'C'); $this->Cell(30, 8, 'Prix Uni. HT', 1, 0, 'C');
$this->Cell(20, 8, 'TVA ' . $tvaValue . '%', 1, 0, 'C'); $this->Cell(20, 8, 'TVA ' . $tvaValue . '%', 1, 0, 'C');
$this->Cell(30, 8, 'Prix Uni. TTC', 1, 1, 'C'); $this->Cell(30, 8, 'Prix Uni. TTC', 1, 1, 'C');
$totalHt = 0; $totalHt = 0;
$totalTtc = 0; $totalTtc = 0;
foreach($this->factureData["products"] as $product){ $products = $this->factureData["products"];
foreach($products as $product){
$valueHt = $product['produit_price']; $valueHt = $product['produit_price'];
$valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt,$tvaValue); $valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt,$tvaValue);
$totalHt+=$valueHt; $totalHt+=$valueHt;
$totalTtc+=$valueTtc; $totalTtc+=$valueTtc;
$descriptionLineNumber = $this->NbLines(80,$product["produit_description"]); $descriptionLineNumber = $this->NbLines(90,$product["produit_description"]);
$articleListMaxHeight = $descriptionLineNumber * 10; $productDescription = $product["produit_description"];
$dateValue = "";
if($product === end($products)){
$dateValue = $devisDate;
$productDescription .= " de " . FileExportHelpers::GetSexeLabel($this->factureData['defunt_sexe']) . ' '. $this->factureData["defunt_nom"];
}
$articleListMaxHeight = $descriptionLineNumber * 6;
$tvaAmount = $valueTtc - $valueHt; $tvaAmount = $valueTtc - $valueHt;
$this->SetFont('Arial', '', 10); $this->SetFont('Arial', '', 10);
$this->Cell(20, $articleListMaxHeight, $factureDate, 'LR',0); $this->Cell(20, $articleListMaxHeight, $dateValue, 'LR',0);
$this->MultiAlignCell(80, $articleListMaxHeight, utf8_decode(html_entity_decode($product["produit_description"])),'LR','0',); $this->MultiAlignCell(90, $articleListMaxHeight, utf8_decode(html_entity_decode($productDescription)),'LR','0',);
$this->Cell(30, $articleListMaxHeight, number_format($valueHt,2,'.',''), 'LR', 0, 'C'); $this->Cell(30, $articleListMaxHeight, number_format($valueHt,2,'.','').chr(128), 'LR', 0, 'C');
$this->Cell(20, $articleListMaxHeight, number_format($tvaAmount,2,'.',''), 'LR', 0, 'C'); $this->Cell(20, $articleListMaxHeight, number_format($tvaAmount,2,'.','').chr(128), 'LR', 0, 'C');
$this->Cell(30, $articleListMaxHeight, number_format($valueTtc,2,'.',''), 'LR', 1, 'C'); $this->Cell(30, $articleListMaxHeight, number_format($valueTtc,2,'.','').chr(128), 'LR', 1, 'C');
} }
$this->Cell(180,0,'','T'); $this->Cell(190,0,'','T');
$this->Ln(8); $this->Ln(8);
$this->SetFont('Arial', '', 9); $this->SetFont('Arial', '', 9);
$this->MultiCell(0,5,utf8_decode(html_entity_decode("Paiement à votre convenance par chèque à l'ordre de ". $this->factureData['configuration']->entreprise))); $this->MultiCell(0,5,utf8_decode(html_entity_decode("Paiement à votre convenance par chèque à l'ordre de ". $this->factureData['configuration']->entreprise)));
@ -163,7 +180,7 @@ sera due sur présentation de justificatifs ( articles L.441-3 et L.441-6 du cod
$this->Cell($totalHtArrayWidth, 7, 'TOTAL HT', 1, 1, 'C'); $this->Cell($totalHtArrayWidth, 7, 'TOTAL HT', 1, 1, 'C');
$this->SetXY($ibanLastPositionX,$ibanCursorY); $this->SetXY($ibanLastPositionX,$ibanCursorY);
$this->SetFont('Arial', '', 11); $this->SetFont('Arial', '', 11);
$this->Cell($totalHtArrayWidth, 20, number_format($totalHt,2,'.',''), 1, 1, 'C'); $this->Cell($totalHtArrayWidth, 20, number_format($totalHt,2,'.','').chr(128), 1, 1, 'C');
$tableHTLastPostionX = $ibanLastPositionX + $totalHtArrayWidth + 10; $tableHTLastPostionX = $ibanLastPositionX + $totalHtArrayWidth + 10;
//TABLE TTC //TABLE TTC
@ -172,7 +189,7 @@ sera due sur présentation de justificatifs ( articles L.441-3 et L.441-6 du cod
$this->Cell(30, 7, 'TOTAL TTC', 1, 1, 'C'); $this->Cell(30, 7, 'TOTAL TTC', 1, 1, 'C');
$this->SetXY($tableHTLastPostionX,$ibanCursorY+14); $this->SetXY($tableHTLastPostionX,$ibanCursorY+14);
$this->SetFont('Arial', '', 11); $this->SetFont('Arial', '', 11);
$this->Cell(30, 7, number_format($totalTtc,2,'.',''), 1, 1, 'C'); $this->Cell(30, 7, number_format($totalTtc,2,'.','').chr(128), 1, 1, 'C');
$pdfContent = $this->Output('','S'); $pdfContent = $this->Output('','S');