formateur informatique

Editer la facture client au format PDF

Accueil  >  Technique  >  Php  >  Php Avancé  >  Editer la facture client au format PDF
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Editer la facture au format PDF

Dans cette formation Php, sur la base de l'application Web de facturation que nous avons développée, nous souhaitons proposer à l'administrateur, un bouton permettant d'éditer la facture du client au format PDF.

Et nous allons le voir, c'est une classe offrant tous les objets nécessaires qui va permettre de disposer les éléments pour concevoir le document final par le code Php.

Sources et présentation de la problématique
Cette solution doit être développée sur les travaux aboutis de la facturation client. Nous devons donc les réceptionner. La décompression fournit les fichiers de l'application Web pour la facturation, l'approvisionnement et la gestion des stocks. Pour mener à bien ces travaux, vous devez disposer de la base de données MySql stocks. Le cas échéant, vous devez la créer et importer le fichier stocks.sql situé dans le sous dossier bdd du dossier de décompression. Les informations du compte utilisateur à associer sont dévoilées dans le fichier connexion.php du sous dossier commun.

Bien sûr, ce projet doit être référencé dans EasyPhp en spécifiant son adresse issue de l'explorateur Windows. Les deux serveurs, Http et Database, doivent être démarrés. Dès lors, nous pouvons débuter.
  • Depuis l'interface d'EasyPhp, cliquer sur le lien du projet,
Interface Web Php pour approvisionner les stocks avec accès page Facturation clients

Nous accédons ainsi à l'interface Web d'approvisionnement des stocks. Nos travaux doivent porter sur la facturation.
  • Dans le pied de page, cliquer sur la seconde icône,
Cette fois, nous accédons à l'interface de facturation.

Interface Web Php pour construire les commandes des clients

Le principe est le suivant. L'administrateur désigne une référence client à l'aide de la première liste déroulante. Puis, il s'agit d'ajouter les articles à la commande. Il désigne une référence produit à l'aide de la seconde liste déroulante, saisit la quantité achetée et clique sur le bouton Ajouter. A chaque clic, les articles se cumulent dans la représentation de la facture, en bas de l'interface. A l'issue, l'utilisateur clique sur le bouton Valider pour archiver la commande en base de données MySql. Un message de succès est retourné à la fin du traitement.

Bouton pour éditer la facture
Une fois la commande validée, donc archivée en base de données, nous proposons de greffer un bouton d'édition en bas de la facture client, soit en bas de l'interface. Ce bouton n'existe pas. Il doit donc être créé pour apparaître dynamiquement. Un calque de réception à piloter par le code client est nécessaire. Donc il doit posséder un identifiant. Souvenez-vous en effet, c'est la fonction Javascript recolter, exploitant des objets Ajax qui récolte les traitements réalisés par le serveur.
  • A la racine du dossier de décompression, cliquer droit sur le fichier facturation.php,
  • Dans le menu contextuel, choisir de l'ouvrir avec un éditeur comme le Notepad ++,
  • En bas de la page Web, après la ligne 223 du div fermant, ajouter les deux calques mentionnés en gras dans l'extrait ci-dessous :
...
<div class="prix" style="font-weight:bold;">
1243.75
</div>
<div class="bord"></div>

</div>

<div style="float:left; width:5%; height:25px;"></div>

<div style="float:left; width:100%; height:auto;" id="editer">
</div>


</div>
</div>
<div style="float:left; width:10%; height:auto;"></div>
...


Nous ajoutons ces deux calques juste en-dessous de la facture. Le premier consiste à aérer la présentation. Il s'agit d'un calque vide d'une hauteur de 25 px. Le second est destiné à recevoir le bouton à créer dynamiquement, une fois la commande validée. C'est pourquoi nous lui attribuons l'identifiant editer. C'est par ce nom désormais que nous pourrons le piloter par le code client Javascript.
  • Enregistrer les modifications (CTRL + S) et remonter en haut de la page, jusqu'à découvrir la fonction Javascript recolter,
L'instruction switch que nous y avions développée sert à réceptionner les données du serveur selon l'action enclenchée. Dans notre cas, il s'agit de la facturation identifiée par la dernière branche (case 'facturer').

...

case 'facturer':
if(transport.responseText=="ok")
alert("La facture a été validée avec succès");
else
alert("Une erreur est survenue");
break;

}
...


Et c'est elle que nous devons adapter. En l'état, elle se contente de retourner un message à l'utilisateur. Désormais, en cas de succès, le bouton d'édition de la facture doit être créé dans le calque editer que nous venons d'ajouter. Ce bouton doit déclencher l'affichage d'une nouvelle page php à créer. C'est elle qui doit se charger de construire la facture au format PDF. Mais pour cela, elle doit connaître le client et la commande concernés. Donc le bouton doit appeler la page en lui passant ces paramètres. En conséquence, nous devons intervenir dans le traitement serveur pour retourner les identifiants correspondants.
  • A la racine du dossier de décompression, cliquer droit sur le fichier rep_facture.php,
  • Dans le menu contextuel, choisir de l'ouvrir avec le Notepad,
C'est une fois de plus la dernière branche du switch (case "facturer") qui nous intéresse. En cas d'erreur, l'indication nok est retournée (print("nok")). En cas de succès, l'indication ok (print("ok")) doit être remplacée par les identifiants du client et de la commande.
  • Remplacer l'instruction print("ok"), comme suit :
...
$requete = "UPDATE articles SET Article_Qte=Article_Qte-".$ligne_com[1]." WHERE Article_code='".$ligne_com[0]."';";
$retours = mysqli_query($liaison2, $requete);
}
}
print($com_client."-".$detail_com);
}
else
print("nok");

break;
}
...


Ces variables sont déclarées plus haut dans le code. Elles correspondent respectivement à l'identifiant du client et à celui de sa commande fraîchement validée. Grâce à l'instruction print, nous les retournons concaténées, séparées par un tiret. Côté client, ce tiret servira à les réceptionner indépendamment.
  • Enregistrer les modifications et revenir dans le code de la page facturation.php,
  • Dans la fonction recolter, adapter le code de la branche facturer, comme suit :
...
case 'facturer':
var reponse = transport.responseText;
if(transport.responseText=="nok")
alert("Une erreur est survenue");
else
{
alert("La facture a été validée avec succès");
document.getElementById("editer").innerHTML = "<input type='button' value='Editer la facture' onclick='window.open(\"edition.php?info=" + reponse + "\")'/>";
}

break;
...


Nous stockons tout d'abord le résultat du traitement serveur dans la variable reponse. Nous intervertissons le test de l'instruction conditionnelle, pour l'adapter aux modifications que nous venons d'entreprendre côté serveur. Lorsque l'information nok est retournée, comme précédemment, nous en alertons l'administrateur à l'aide d'une boîte de message (alert). Dans le cas contraire (else), en plus du message de succès, nous construisons dynamiquement le bouton d'édition dans le calque d'identifiant editer. Nous le désignons comme toujours grâce à la méthode getElementById de l'objet Javascript document. Grâce à sa propriété innerHTML, nous pouvons construire son balisage interne. Nous y ajoutons donc un contrôle input de type button. Au clic, celui-ci exploite la méthode open de l'objet Javascript window. Elle permet d'ouvrir la page désignée en paramètre. Elle se nomme edition.php. Nous devons la créer. Et comme vous le constatez, le paramètre info lui est associé dans l'url. Il s'agit de la réponse serveur, soit des identifiants pour le client et la commande. Notez la présence des antislashs pour permettre d'encadrer cette url de côtes. L'expression est en effet déjà encadrée de doubles et de simples côtes.
  • Enregistrer les modifications (CTRL + S) et basculer sur le navigateur Internet,
  • Recharger la page Web en validant sa barre d'adresse avec la touche Entrée du clavier,
  • Choisir un client avec la première liste déroulante,
  • Choisir un article avec la seconde liste déroulante,
  • Saisir une quantité et cliquer sur le bouton Ajouter,
  • Enfin, cliquer sur le bouton Valider pour archiver la commande,
  • Au message de succès en retour, cliquer sur le bouton Ok,
Création dynamique bouton Html à validation commande pour éditer facture en PDF

Comme vous le constatez, le bouton d'édition vient se greffer sous les données de la facture. Il occupe toute la largeur disponible. C'est ainsi que les styles CSS le contraignent. Si vous souhaitez le réduire, il suffit de régler certains attributs de sa propriété Style, au moment de sa création.

Bien sûr à ce stade, si vous cliquez sur ce bouton, une erreur est retournée par le navigateur. La page n'est pas trouvée. Et pour cause, elle n'existe pas encore.

Réceptionner les données de la facture
Pour éditer la facture au format PDF, encore faut-il regrouper tous les éléments qui la concerne. Nous devons commencer par réceptionner les identifiants transmis dans l'url de la page Web. Sur ces identifiants, nous devons exécuter une requête multi-table. Elle doit permettre d'extraire toutes les informations du client et de sa commande.
  • A la racine du dossier de décompression, créer le fichier edition.php,
  • Puis, l'éditer dans le Notepad,
  • Créer alors la section de code Php suivante :
<?php

if(isset($_GET['info']) && $_GET['info']!="")
{

$liaison2 = mysqli_connect('127.0.0.1', 'gStock', 'gS123k12');
mysqli_select_db($liaison2, 'stocks');

$tab_param = explode("-",$_GET['info']);
$num_cli = $tab_param[0];
$num_com = $tab_param[1];
echo "Numero client : ".$num_cli."<br />Numero commande :".$num_com;

mysqli_close($liaison2);
}
?>


Comme nous l'avons appris lors de précédentes formations, c'est l'instruction Php $_GET qui permet de réceptionner le paramètre de l'URL en mentionnant son nom. Nous testons tout d'abord son existence grâce à la fonction isset. De même, nous nous assurons qu'il n'est pas vide. Si ces critères sont satisfaits, nous commençons par initialiser la chaîne de connexion à la base de données ($liaison2). Nous devons effectivement exécuter des requêtes.

Ensuite, nous exploitons la fonction Php explode pour découper la chaîne du paramètre sur le tiret. Les deux identifiants sont désormais rangés indépendamment dans le tableau de variables $tab_param. Nous l'exploitons pour les stocker dans des variables respectives ($num_cli et $num_com). Puis, à titre de test temporaire, nous les restituons à l'écran, grâce à la fonction Php echo. Nous n'oublions pas de refermer la connexion à la base de données à l'issue du traitement (mysqli_close), même si pour l'instant elle n'a pas encore été sollicitée.
  • Enregistrer les modifications et basculer sur le navigateur Internet,
  • Recharger la page Web en validant sa barre d'adresse,
  • Créer une nouvelle facture en désignant un client et ses articles,
  • Cliquer sur le bouton Valider pour archiver la commande,
  • Enfin, cliquer sur le bouton Editer la facture,
Récupérer identifiants commande dans Url page Web pour éditer facture en PDF

Les identifiants sont parfaitement réceptionnés. Nous allons pouvoir les exploiter et les recouper pour extraire toutes les données de la commande, depuis la base de données MySql.
  • Fermer l'onglet de la page edition.php et revenir dans son code,
  • A la place de l'instruction echo, ajouter les lignes Php suivantes :
...
$c_civ=""; $c_nom=""; $c_pre=""; $c_date=""; $c_tot="";
$c_ref =""; $c_des=""; $c_qte=""; $c_pht=0; $c_mht=0; $compteur=0;

$requete = "SELECT * FROM clients a, commandes b, detail c WHERE a.Client_num=".$num_cli." AND b.Com_num=".$num_com." AND c.Detail_com=".$num_com.";";
$retours = mysqli_query($liaison2, $requete);
...


Nous déclarons tout d'abord toutes les variables nécessaires pour stocker les informations du client et de sa commande. Notez tout de même la présence de la variable $compteur. Une boucle sera nécessaire pour questionner la table articles à la recherche des informations liées aux achats. Cette variable permettra de connaître le nombre de lignes de la facturation. En conséquence, elle permettra de positionner idéalement certains éléments dans la hauteur de la page.

Ensuite, nous réalisons une requête sélection multi-table, consistant à récupérer toutes les informations de champs (*). Les tables sont énumérées les unes à la suite des autres, séparées par une virgule. Notez l'emploi d'un suffixe pour chacune. C'est une lettre de l'alphabet qui les désigne désormais. Cette technique permet ensuite de réaliser la correspondance des champs dans la clause Where, sans devoir engager la clause INNER JOIN. Nous récupérons toutes les données pour lesquelles le client est identifié dans la table commandes (a.Client_num = ".$num_cli." AND b.Com_num = ".$num_com). Et pour cette commande, nous récupérons toutes les informations dans la table detail (AND c.Detail_com=".$num_com."). Ensuite, nous exécutons cette requête sur la base de données MySql, comme toujours, grâce à la fonction Php mysqli_query.

Mais à ce stade et comme nous le disions, le client peut avoir acheté plusieurs articles. Et pour chacun d'entre eux, les informations détaillées sont archivées dans la table articles. Nous devons donc parcourir toutes les références achetées et pour chacune, réaliser une requête sélection permettant d'extraire ces informations ligne à ligne.

Avant cela, il est temps d'instancier la classe FPDF libre de droit et d'exploitation. Nous devons en effet inscrire les informations de la société émettrice et du destinataire dans l'entête du document. Vous trouverez cette classe dans le sous dossier fpdf du dossier de décompression. Si vous éditez le fichier fpdf.php, vous constatez qu'il offre de nombreuses propriétés et méthodes pour construire un document pdf.

A partir de la ligne 581 notamment, vous notez la présence de la méthode Cell.

...
function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
{
// Output a cell
$k = $this->k;
if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
{
// Automatic page break
$x = $this->x;
$ws = $this->ws;
if($ws>0)
...


Celle-ci permet de construire des cellules à disposer sur la page à fabriquer. En argument, il faut définir sa largeur, sa hauteur, son contenu mais aussi d'autres paramètres que nous dévoilerons au fur et à mesure. De nombreuses aides sont présentes sur le Web afin de comprendre l'utilité et l'exploitation des différentes propriétés et méthodes de cette classe. Ici, nous allons en aborder certaines.
  • A la suite du code précédent et avant la fermeture de la connexion à la base de données, ajouter les instructions suivantes :
...
$requete = "SELECT * FROM clients a, commandes b, detail c WHERE a.Client_num=".$num_cli." AND b.Com_num=".$num_com." AND c.Detail_com=".$num_com.";";
$retours = mysqli_query($liaison2, $requete);

require('fpdf/fpdf.php');
$pdf = new FPDF('P','mm','A4');
$pdf->AddPage();
$pdf->SetFont('Arial','',9);


mysqli_close($liaison2);
...


Tout d'abord, nous exploitons la fonction Php require afin de faire référence au fichier de cette classe. Il est ainsi inclus et reconnu dans la construction. Puis, nous instancions la classe FPDF ($pdf = new FPDF('P','mm','A4');). En premier argument, nous spécifions une orientation portrait. Le deuxième argument permet de spécifier l'unité de mesure, le millimètre ici. Et en dernier argument, nous déterminons les dimensions du document, au format A4 donc. Il en résulte un objet que nous avons nommé $pdf. Cet objet a désormais hérité des propriétés et méthodes de la classe. Pour les appeler, contrairement à de nombreux langages de programmation, nous n'utilisons pas le point mais le symbole ->. La méthode AddPage() parle d'elle-même. Elle crée la première page du document Pdf à construire. Puis, grâce à la méthode SetFont, nous définissons la police et sa taille. Le deuxième argument est vide pour utiliser un style normal. Nous aurions indiqué B pour du gras et I pour de l'italique. A chaque fois que nous devrons changer de style, nous devrons la rappeler.

Nous devons maintenant enclencher la boucle permettant l'extraction de tout le détail de la commande.
  • A la suite du code précédent et toujours avant la fermeture de la connexion à la base de données, ajouter les instructions Php suivantes :
...
while($retour = mysqli_fetch_array($retours))
{
if($c_civ=="")
{
$c_civ = $retour["Client_civilite"];
$c_nom=$retour["Client_nom"]; $c_pre=$retour["Client_prenom"];
$c_date=$retour["Com_date"]; $c_tot=$retour["Com_montant"];
$pdf->Cell(35,10,"",0,1,'R');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"Parc Info",0,0,'L');
$pdf->Cell(60,5,$c_civ." ".$c_pre." ".$c_nom,0,1,'L');
$pdf->SetFont('Arial','',9);
$pdf->Cell(120,5,"10 Boulevard Gambetta",0,0,'L');
$pdf->Cell(60,5,"Votre adresse",0,1,'L');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"38000 Grenoble",0,0,'L');
$pdf->Cell(60,5,"Votre ville",0,1,'L');
$pdf->Cell(35,10,"",0,1,'R');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"Votre commande numéro : ".$num_com,0,0,'L');
$pdf->SetFont('Arial','',9);
$pdf->Cell(60,5,"Date de commande : ".$c_date,0,1,'L');
$pdf->Cell(35,10,"",0,1,'R');
}
}
...


Tout d'abord, pour chaque enregistrement parcouru, la fonction Php mysqli_fetch_array permet de découper les données sur les informations de champ. Ces enregistrements correspondent à chacune des lignes de la commande. Désormais, c'est la variable $retour qui va nous permettre de pointer sur les champs, par leur nom.

Ensuite, nous déclenchons un test sur la variable $c_civ. Si elle est vide, nous savons qu'il s'agit du premier passage dans la boucle puisqu'elle n'a pas encore été affectée. Il en va forcément de même pour les informations du client. Nous commençons donc par récupérer ces données parentes, en les stockant dans des variables respectives.

Ensuite, nous exploitons les méthodes de l'objet $pdf, en commençant par sa méthode Cell. Nous créons tout d'abord une cellule de 35mm de hauteur et de 10mm de largeur. Cette largeur n'a que peu d'importance ici. En effet, suite à cette cellule, nous imposons le retour à la ligne ($pdf->Cell(35,10,"",0,1,'R');), comme le mentionne le chiffre 1 en cinquième argument. Le chiffre 0 à sa place aurait autorisé les cellules suivantes à se positionner à côté. Le troisième argument est vide. En conséquence, cette cellule ne contient pas de texte. Elle est utilisée pour aérer la présentation et débuter les inscriptions plus bas. Le quatrième argument fixé à 0 indique qu'aucune bordure ne doit être tracée. Avec le chiffre 1, la cellule serait encadrée. Le dernier argument n'est pas utile ici mais pas gênant. Il définit un alignement à droite (R pour Right).

Comme nous souhaitons ensuite inscrire les titres des blocs d'adresse, nous définissons une police grasse et plus grande ($pdf->SetFont('Arial','B',10);). Puis, nous débutons la construction par l'organisation des informations. Un document A4 mesure 21,7 cm de large sur 29 cm de haut. Il faut considérer des marges de 1,5 cm environ, de part et d'autre. Nous partons du principe que nous disposons de 18 cm en largeur (180 mm).

Dans une première cellule, nous inscrivons le nom de la société, aligné à gauche ($pdf->Cell(120,5,"Parc Info",0,0,'L');). Comme nous n'imposons pas le retour à la ligne, la cellule suivante est repousée à 120 mm sur la droite. Nous lui attribuons la largeur restante pour inscrire les informations du client ($pdf->Cell(60,5,$c_civ."".$c_pre." ".$c_nom,0,1,'L');), elles aussi alignées à gauche. Mais cette fois, nous imposons le retour à la ligne, pour inscrire les adresses respectives.

Ensuite, nous répliquons exactement les mêmes techniques pour disposer les adresses, codes postaux et villes, en prenant soin d'adapter le style de la police. Pour le client, étant donné qu'il s'agit d'une base de test, nous simulons ses informations par des textes standards.

Suite à ces blocs d'adresse, nous ajoutons une ligne de séparation ($pdf->Cell(35,10,"",0,1,'R');). Puis, nous inscrivons les informations sur le numéro et la date de la commande, en respectant les alignements précédents.

Il est temps d'effectuer les premiers tests.
  • Après la boucle while et toujours avant la fermeture de la connexion à la base de données, ajouter la ligne suivante :
...
}

$pdf->Output();

mysqli_close($liaison2);
}
...


La méthode Output de la classe instanciée, permet d'exporter le résultat construit. Sans argument, elle restitue ce contenu sur la page Web appelante, soit en lieu et place dans le navigateur.
  • Enregistrer les modifications et basculer sur la fenêtre du navigateur,
  • Choisir un client et ajouter des articles à la commande,
  • Cliquer sur le bouton Valider puis sur le bouton Editer la facture,
Comme vous le constatez, les premiers éléments sont en place et ils sont parfaitement disposés et alignés.

Créer entête de la facture PDF par le code PHP

Nous devons maintenant construire le corps de la facture. Il s'agit d'énumérer chaque article acheté avec sa quantité, sa désignation, son prix et le montant total. A chaque passage dans la boucle, nous devons récupérer les informations associées à la référence spécifiée dans la commande. Donc nous devons engager une nouvelle requête Sql de sélection sur la table articles avec une clause Where sur le champ de sa clé primaire, celui de la référence du produit.
  • Revenir dans le code de la page edition.php,
  • Dans la boucle while, après l'instruction conditionnelle, ajouter les lignes Php suivantes :
...
while($retour = mysqli_fetch_array($retours))
{
if($c_civ=="")
{
$c_civ = $retour["Client_civilite"];
$c_nom=$retour["Client_nom"]; $c_pre=$retour["Client_prenom"];
$c_date=$retour["Com_date"]; $c_tot=$retour["Com_montant"];
$pdf->Cell(35,10,"",0,1,'R');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"Parc Info",0,0,'L');
$pdf->Cell(60,5,$c_civ." ".$c_pre." ".$c_nom,0,1,'L');
$pdf->SetFont('Arial','',9);
$pdf->Cell(120,5,"10 Boulevard Gambetta",0,0,'L');
$pdf->Cell(60,5,"Votre adresse",0,1,'L');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"38000 Grenoble",0,0,'L');
$pdf->Cell(60,5,"Votre ville",0,1,'L');
$pdf->Cell(35,10,"",0,1,'R');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(120,5,"Votre commande numéro : ".$num_com,0,0,'L');

$pdf->SetFont('Arial','',9);
$pdf->Cell(60,5,"Date de commande : ".$c_date,0,1,'L');
$pdf->Cell(35,10,"",0,1,'R');
}
$requete = "SELECT * FROM articles WHERE Article_code='".$retour["Detail_ref"]."';";
$reponses = mysqli_query($liaison2, $requete);
$reponse = mysqli_fetch_array($reponses);

$c_ref = $reponse["Article_code"]; $c_des=$reponse["Article_designation"];
$c_qte = $retour["Detail_qte"]; $c_pht=number_format($reponse["Article_PUHT"],2, ',', ' ');
$c_mht = number_format($retour["Detail_qte"]*$reponse["Article_PUHT"],2, ',', ' ');

$pdf->Cell(20,10,"",0,0,'L');
$pdf->Cell(20,10,$c_ref,1,0,'L');
$pdf->Cell(70,10,$c_des,1,0,'L');
$pdf->Cell(10,10,$c_qte,1,0,'R');
$pdf->Cell(30,10,$c_pht,1,0,'R');
$pdf->SetFont('Arial','B',10);
$pdf->Cell(30,10,$c_mht,1,1,'R');
$pdf->SetFont('Arial','',9);
$compteur ++;

}
...


Nous mémorisons tout d'abord la syntaxe de la requête Sql permettant d'isoler l'enregistrement de la référence en cours de lecture dans la boucle (WHERE Article_code='".$retour["Detail_ref"]."'). Nous exécutons cette requête sur la base de données MySql par la fonction Php mysqli_query, comme toujours. Nous découpons alors l'information de champ grâce à la fonction mysqli_fetch_array. Il en résulte un tableau de variables ($reponse) permettant d'atteindre les données souhaitées, par leur nom de champ. Et à ce titre, nous les stockons dans des variables respectives. Notez l'emploi de la fonction Php number_format pour formater le calcul du total de l'article. Elle limite les décimales à deux chiffres après la virgule, impose un séparateur de millier et définit la virgule comme le système de décimales en vigueur. Nous n'avons plus qu'à disposer ces informations dans un tableau pour construire la facture PDF.

Comme précédemment, nous exploitons la méthode Cell pour chaque cellule à construire. Nous réalisons tout d'abord un décalage de 2cm ($pdf->Cell(20,10,"",0,0,'L')). Nous restituons la référence dans une première colonne de 2cm avec bordures ($pdf->Cell(20,10,$c_ref,1,0,'L')). Nous conservons les bordures pour toutes les autres cellules en faisant varier les largeurs, pour les adapter aux contenus attendus. Après la dernière cellule, nous imposons le retour à la ligne ($pdf->Cell(30,10,$c_mht,1,1,'R')). Ainsi, nous poursuivrons l'énumération des autres articles parcourus, sur les lignes suivantes du tableau. Nous n'oublions pas d'incrémenter la variable $compteur.

La facture n'est pas terminée, mais nous pouvons tester son rendu à ce stade.
  • Enregistrer les modifications et basculer sur la fenêtre du navigateur,
  • Choisir un client et ajouter des articles à la commande,
  • Cliquer sur le bouton Valider puis sur le bouton Editer la facture,
Construction de la facture client au format PDF avec tableau pour alignements par le code Php

Les éléments sont parfaitement listés, restitués et alignés. La facture offre un rendu tout à fait acceptable. Nous devons la poursuivre. Il est question d'afficher les informations de synthèse, comme le total hors taxe de la commande.
  • Revenir dans le code de la page edition.php,
  • Après la boucle while et toujours avant la fermeture de la connexion, ajouter les lignes Php suivantes :
...
$pdf->SetFont('Arial','',9);
$compteur ++;
}

$pdf->SetFont('Arial','B',11);
$pdf->Cell(35,10,"",0,1,'R');
$pdf->Cell(120,10,"Montant total HT : ",0,0,'R');
$pdf->Cell(30,10,"",0,0,'R');
$pdf->Cell(30,10,number_format($c_tot, 2, ',', ' '),1,1,'R');
$pdf->Cell(120,10,"TVA : 20%",0,0,'R');
$pdf->Cell(30,10,"",0,0,'R');
$pdf->Cell(30,10,number_format($c_tot/5, 2, ',', ' '),1,1,'R');
$pdf->Cell(120,10,"Montant total TTC : ",0,0,'R');
$pdf->Cell(30,10,"",0,0,'R');
$pdf->Cell(30,10,number_format($c_tot + $c_tot/5, 2, ',', ' '),1,1,'R');
$pdf->Cell(30,30,"",0,1,'R');
$pdf->SetFont('Arial','U',11);


$pdf->Output();

mysqli_close($liaison2);
}
...


Il s'agit d'une construction désormais classique qui fait intervenir les méthodes Cell et SetFont de la classe FPDF. Nous exploitons de nouveau la fonction Php number_format pour formater convenablement et de façon homogène tous les montants. Si vous avez conservé l'interface de facturation en l'état, il suffit de cliquer de nouveau sur le bouton Editer la facture pour la mettre à jour.

Montant total de la commande dans édition de facture au format PDF par le code PHP

Les éléments de synthèse sont placés comme nous l'avons décrit, par la création des cellules. Il nous reste à positionner les informations des mentions légales dans le pied de page. Nous pourrions implémenter la méthode Footer de la classe FPDF. Celle-ci existe en effet, mais elle est vide. Une autre solution consiste à calculer l'espace restant sur une page au format A4, dont la hauteur est de 297 mm. C'est la raison pour laquelle nous avons incrémenté la variable $compteur. Elle connaît le nombre de lignes du détail de la facture. Donc, elle permet de connaître l'espace variable restant pour atteindre le pied de page.

Nous proposons de raisonner sur un document de 290 mm de hauteur sur laquelle nous devons déduire 2x15 mm de marges, soit un espace alloué restant de 260 mm. Outre le détail de la facture, nous avons inséré des données dans des cellules définies, à hauteurs fixes. En reprenant le code, nous obtenons une hauteur fixe de 120mm à déduire. L'espace alloué restant est donc de 260 - 120, soit 140 mm. Nous devons préserver une hauteur de 20 mm pour le pied de page. Il reste donc 120mm. A ces 120 mm restants, nous devons déduire la hauteur totale du tableau de détail. Il en résultera la distance à parcourir pour rejoindre le pied de page.
  • En conséquence, à la suite du code précédent, ajouter les lignes Php suivantes :
...
$pdf->Cell(30,10,number_format($c_tot + $c_tot/5, 2, ',', ' '),1,1,'R');
$pdf->Cell(30,30,"",0,1,'R');
$pdf->SetFont('Arial','U',11);

$restant = 120 - $compteur*10;
$pdf->Cell(30,$restant,"",0,1,'R');
$pdf->Cell(60,10,"Mentions légales et conditions :",0,1,'L');
$pdf->SetFont('Arial','I',9);
$pdf->Cell(180,10,"blablabla blablabla blablabla blablablablablabla",0,1,'L');


$pdf->Output();

mysqli_close($liaison2);
}
?>
...


Chaque hauteur du tableau de la facture est de 10 mm. Nous multiplions cette dimension par le nombre de lignes ajoutées ($compteur*10). Nous créons une cellule vide de la distance résultante ($pdf->Cell(30,$restant,"",0,1,'R')), pour repousser la suite des instructions dans le pied de page.

Pied de page de la facture client au format PDF créée par le code PHP

Si vous cliquez de nouveau sur le bouton Editer la facture ou que vous réactualisez la page edition.php, vous remarquez que les informations sont bien inscrites en bas de page du document Pdf. Et cette position reste identique quelle que soit la hauteur de la facture grâce au calcul sur le nombre de lignes. Dernier point important, nous proposons de sauvegarder les factures Pdf sur le disque dur, plus précisément dans le sous dossier local factures. Il suffit d'exploiter de nouveau la méthode Output de la classe FPDF, mais en lui passant des arguments. L'un d'entre eux est nécessairement le nom du fichier.
  • A la fin du code, ajouter les deux lignes Php suivantes :
...
$pdf->Cell(180,10,"blablabla blablabla blablabla blablablablablabla",0,1,'L');

$nom_fichier ="factures/".$num_cli."-".$num_com.".pdf";
$pdf->Output($nom_fichier,'F');

$pdf->Output();

mysqli_close($liaison2);
}
?>
...


Fort logiquement, nous définissons le nom du fichier en fonction des identifiants du client et de sa commande, dans le sous dossier local factures. Nous appelons la méthode Output en lui passant ce chemin en premier argument. Le second ('F') précise qu'il s'agit d'un chemin relatif.

Edition de la facture au format PDF sauvegardée dans sous dossier local sur le serveur Web

La facture apparaît en effet archivée dans le sous dossier local. D'autres formations seront l'occasion d'approfondir cette précieuse classe FPDF.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn