Problème de syntaxe php

Par JEAN KIBA, il y a 1 an


Bonjour à tous
J'ai un souci et j'ai besoin d'un coup de main.
Je dispose de trois tables (facture, paiement)

table facture contient : (fac_code, id_art, id_client, fac_date, fac_libelle) table paiement contient : (pai_id, pai_mont_total, pai_mont_cash, pai_date, fac_code) table client contient : (id_client, nom_client)

L'idée est de créer une facture, puis au niveau de paiement, on doit vérifier si toute la facture a été honorée ou a été payée juste à moitié pour récupérer la facture une fois que le client viendra honorer sa dette, mais pour cela, il faut que le système soit capable de sortir les différentes factures du client qui ne sont pas encore honorée en totalité.

j'ai fait une requête d'abord pour afficher toutes les factures non payées et de différents articles pris par le client ainsi que le solde

SELECT facture.fac_code AS code FROM facture JOIN client ON facture.id_client = client.id_client WHERE facture.fac_libelle = 'Non honorer' AND client.id_client = 1

je rencontre un souci au niveau, le systeme doit normalement faire la sommation de tous les montants qui restent à payer même quand le client a plusieurs factures non honorées. Aidez-moi s'il vous plaît

11 réponses

Glim, il y a 1 an

Bonjour,

Quelle est l'erreur rencontrée ? Y a-t-il un message d'erreur ? Un résultat renvoyé mais qui est incorrect ? Si on exécute cette requête directemùent en BDD, fonctionne-t-elle ? (pour savoir dans quelle partie de l'application l'erreur se trouve)

Dans le SELECT, on sélectionne tbl_facture_fac.fac_code, mais il ne semble pas y avoir de table tbl_facture_fac, c'est peut-être ça le problème.

JEAN KIBA, il y a 1 an

Au fait, il n'y a pas d'erreur, mais le résultat attendu n'est pas celui que j'obtiens. je signal aussi que c'est la table facture et et non tbl_facture_fac.
lorsque j'affiche les resultats dans une balise table de html, je souhaiterai par exemple obtenir le montant reste.
Je m'explique, au départ, nous avons par exemple article qui coutent (200 $), le client vient et paie 100 $, normalement, lorsqu'il viendra régler sa dette, il doit payer 100$ qui restait, mais il peut aussi décider de prendre un autre article (50 $) à crédit sans avoir régler la dernière dette restante, ce qui veut dire qu'on doit lui créer une facture pour l'autre article et du coup, le solde devient 150 $. Mon souhait serait de récupérer ce solde pour l'afficher, une fois que le client viendra, que l'on soit capable de visualise les details de toutes ses dettes des différents articles consommés.
exemple dans la figure ci-dessous:

|Fact N°|Montant facture|Montant Payé|Montant restant|Nom client|Nom article| |___________________________________________________________________________ | 1 |200 |100 | 100 |client 1 |article 1 | ---------------------------------------------------------------------------- | 2 | 50 |0 | 0 |client 1 | article 2 | -----------------------------------------------------------------------------

La difficulté que je rencontre est d'afficher la dernière dette sans modifier la nouvelle dette. Je pense que mon vrai problème c'est dans la logique en PHP.
J'espère que mes explications sont claires, besoin de votre aide

Glim, il y a 1 an

D'accord, donc si je comprends bien, un client a, pour chaque facture, un reste à payer. Ce reste à payer correspond à la différence entre le montant total de la facture et la somme des paiements correspondant à l'id de cette facture. Ne faudrait-il pas dans ce cas que tu aies un champ dans la table facture qui contient le montant total de celle-ci ? Actuellement, j'ai l'impression que ce champ est dans la table paiement (PAI_MONT_TOTAL).
Ensuite, tu veux avoir le reste à payer de toutes les factures pour un client donné, c'est bien ça ?

JEAN KIBA, il y a 1 an

Bien sûr c'est ça, chaque article enregistré, contient un montant de prix de vente. Lorsque l'article est appelé dans la table facture et la table paiement, c'est ce montant de prix de vente qui sera pris en compte le pai_mont_total

Glim, il y a 1 an

Je pense que le montant total devrait se trouver dans la table Facture. Il y aurait plusieurs paiement associés à la facture.

On aurait une requête comme ça :

SELECT F.FAC_CODE, F.MONTANT_FACTURE, SUM(P.PAI_MONT), F.MONTANT_FACTURE - SUM(P.PAI_MONT) FROM FACTURE F INNER JOIN PAIEMENT P ON P.FAC_CODE = F.FAC_CODE INNER JOIN client ON facture.id_client = client.id_client WHERE facture.fac_libelle = 'Non honorer' AND client.id_client = 1 GROUP BY F.FAC_CODE

Je vous laisse tester si cela fonctionne.

JEAN KIBA, il y a 1 an

merci Glim pour ton intervention, je vais le tester tout à l'heure là

JEAN KIBA, il y a 1 an

Je viens de remarquer que la requête SQL que vous avez proposé répond parfaitement bien. je faisais la même chose sauf que chez moi le montant total se trouvait dans la table paiement, et jobtenais le même résultat. jusque là nous sommes sur le même chemin, mais si je fais référence au tableau que j'ai proposé ci-haut, j'avais du mal à afficher le résultat de telle sorte que s'il y a une facture payée à moitié (par exemple: pour une facture de 50$, 25$ a été payé cash et reste 25$) et une autre facture dont le client n'a pas encore payé même 1$ (par exemple : 100$), normalement le solde doit devenir 125$ puisque le systeme doit calculer 25$ + 100$.
mais dans le code php, j'avais du mal à le faire, et après plusieurs reflexion, je suis arrivé à trouver une solution que je n'estime pas meilleure mais qui répond quand même à ma préoccupation.
voici le code php:
Cette 1ère requête me permet de récupérer toutes les factures qui n'ont pas encore été payées

$sql1 = "SELECT facture.fac_code AS code, facture.fac_mont AS montant_fact, client.nom_complet AS Nom_complet, article.nom AS nom_artile FROM facture JOIN client ON facture.id_client = client.id_client JOIN article ON facture.id_art = article.id_art JOIN client ON facture.id_client = client.id_client WHERE facture.periode = :periode ";

Cette 2ème requête me permet de récupérer toutes les factures qui sont payées soit par acompte ou par paiement total de la facture

$sql2 = "SELECT facture.fac_code AS numero, facture.fac_mont AS montant_facture, SUM(paiement.pai_mont_cash) AS montant_cash, facture.fac_mont - SUM(paiement.pai_mont_cash) AS solde FROM paiement JOIN facture ON paiement.fac_code = facture.fac_code JOIN client ON facture.id_client = client.id_client JOIN article ON facture.id_art = article.id_art WHERE facture.fac_libelle = :libelle AND client.id_client = :id GROUP BY facture.fac_code";

Ensuite, l'idée est d'avoir une table html qui va afficher la liste des factures qui ne sont pas encore payées et puis on doit avoir un bouton de paiement sur chaque ligne qui va valider un paiement en cas de nécessité

voici le code :

<table class="table" > <thead class="table-primary"> <tr> <th scope="col" >Fact n°</th> <th scope="col" >Client</th> <th scope="col" >Article</th> <th scope="col" >Montant</th> </tr> <tbody> <?php $params1 = []; $params2 = []; $periode = "2025"; $libelle = "Ouvert"; $id = 1; $pdo = $this->connect();//connexion bdd $stmt1 = $pdo->prepare($sql1); $stmt2 = $pdo->prepare($sql2); $params1['periode'] = $periode; $params2['libelle'] = $libelle; $params2['id'] = $id; $stmt1->execute($params1); $rows = $stmt1->fetchAll(PDO::FETCH_OBJ); $stmt2->execute($params2); $data = $stmt1->fetchAll(PDO::FETCH_OBJ); if(!empty($rows)): foreach($rows AS $row): if(!empty($data)): foreach($data AS $dt): $numero = $dt->numero; $montant_cash = $dt->montant_cash; endforeach; else: $numero = 0; $montant_cash = 0; endif; ?> <tr> <td><?= $row->code ?></td> <td><?= $row->Nom_complet ?></td> <td><?= $row->nom_artile ?></td> <td id="calcul_sommes"> <?php if($row->code == $numero): echo $row->montant_fact - $montant_cash; else: echo $row->montant_fact; endif; //avec cette condition, je peux obtenir le solde de chaque facture, et c'était mon premier souci ?> </td> </tr> <?php endforeach; endif; ?> </tbody> </table>

Bien que ce petit script fonctionne comme je souhaitais, mais je sollicite une idée qui peut faire mieux que ça, néanmoins, mon souci
reste de trouver le total de tous les soldes de facture payées à moitié ou de facture non encore payées. Je sais qu'avec JS c'est possible de trouver la solution
mais je suis encore bloqué. Mon souhait est de faire la sommes d'une manière dynamique de tous les montant affichés dans laa colonne montant du tableau et c'est cette somme qui sera affichée comme la dette que doit encore le client. Je vous prie de me guider, je suis bloqué

Glim, il y a 1 an

Il faudrait faire un script pour récupérer tous les prix. Ensuite faire la somme et modifier le contenu de la colonne #calcul_sommes.
Quel est le problème avec le code actuel s'il renvoie le bon résultat ?

JEAN KIBA, il y a 1 an

j'ai un soucis avec ça, c'est possible de m'orienter?

Another, il y a 1 an
SELECT f.fac_code AS code, f.fac_mont AS montant_fact, c.nom_complet AS Nom_complet, a.nom AS nom_article, COALESCE(SUM(p.pai_mont_cash), 0) AS montant_cash, (f.fac_mont - COALESCE(SUM(p.pai_mont_cash), 0)) AS solde FROM facture f JOIN client c ON f.id_client = c.id_client JOIN article a ON f.id_art = a.id_art LEFT JOIN paiement p ON f.fac_code = p.fac_code WHERE f.periode = :periode GROUP BY f.fac_code; $params = ['periode' => "2025"]; $pdo = $this->connect(); $stmt = $pdo->prepare($sql); $stmt->execute($params); $rows = $stmt->fetchAll(PDO::FETCH_OBJ); ?> <table class="table"> <thead class="table-primary"> <tr> <th scope="col">Fact n°</th> <th scope="col">Client</th> <th scope="col">Article</th> <th scope="col">Montant</th> </tr> </thead> <tbody> <?php foreach ($rows as $row): ?> <tr> <td><?= htmlspecialchars($row->code) ?></td> <td><?= htmlspecialchars($row->Nom_complet) ?></td> <td><?= htmlspecialchars($row->nom_article) ?></td> <td class="solde"><?= $row->solde ?></td> </tr> <?php endforeach; ?> </tbody> </table> <p><strong>Total des dettes :</strong> <span id="totalSolde">0</span> $</p> <script> document.addEventListener("DOMContentLoaded", function() { let total = 0; document.querySelectorAll(".solde").forEach(cell => { total += parseFloat(cell.textContent); }); document.getElementById("totalSolde").textContent = total.toFixed(2); }); </script>

Requête optimisé pour réduire le nombre de requête à une au lieu de deux

Et le solde qui se met dynamiquement en js

JEAN KIBA, il y a 1 an

Merci beacoup Another, je viens d'essayer cette requête et ça marche très bien, merci pour votre apport et pour m'avoir appris quelque chose que j'ignorais vraiment. Merci beaucoup grafikart