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
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.
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
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 ?
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
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.
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é