Algorithme pour le calcul de % de paiements affectés à des factures

Algorithme pour le calcul de % de paiements affectés à des factures - PHP - Programmation

Marsh Posté le 13-12-2013 à 17:34:08    

Bonjour,
 
Je cherche à optimiser un algorithme qui calcule le % d'un paiement affecté à une facture. En gros, dans une BD Mysql, j'ai des factures et des paiements faits des personnes. J'ai une relation n-m entre mes factures et les paiements. Une facture peut être payée par 1 ou plusieurs paiements, 1 paiement peut être affecté à 1 ou plusieurs factures et plusieurs factures peuvent être concernées par plusieurs paiements.
 
Pour savoir si une facture est complètement payée (j'ai un flag en base pour chaque facture, 0 ou 1), je regarde si les paiements affectés à cette facture couvre le montant. Si oui, le flag de la facture passe à 1. Sauf que certains paiements peuvent être affectés à d'autres factures (suivantes ou précédentes). Du coup, je dois être capable de calculer le % d'un paiement qui est alloué à une facture en fonction de ce qui a été alloué pour ce paiement à d'autres factures. C'est donc un pb récursif.
 
Au début, je calculais ce % alloué à la volée mais quand il y a des personnes qui file jamais le bon montant pour payer une facture, je me retrouve à devoir repartir de leur première facture et leur 1er paiement et tout "remonter", ce qui se révèle lourd. J'ai donc ajouté un champ "MontantAlloue" sur la table de liaison Factures-Paiements.
 
Du coup, c'est au moment où je saisis un paiement que je calcule le % alloué. Je suis parti sur l'idée d'ordonner les factures et les paiements en fonction de leur date de création/saisie. Sauf que la personne qui saisit les paiements peut à sa guise retirer un paiement d'une facture et le mettre sur une autre. du coup, cet ordonnancement par une date ne marche plus car un paiement saisi il y a un moment peut se retrouver sur une facture récente et vice-et-versa. Ca m'oblige donc, dans certains cas, lors de la saisie d'un paiement, de devoir recalculer tous les % alloués des paiements aux factures depuis le début, ce qui se révèle long ! Et des fois, j'ai des bugs (des factures complètements payées mais leur flag est pas à 1) :cry:
 
Auriez-vous un algo suffisamment souple pour gérer ces situations et pas trop gourmand en temps de calcul, svp ?
 
Merci :jap:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-12-2013 à 17:34:08   

Reply

Marsh Posté le 13-12-2013 à 23:01:02    

Personnellement, je ferais ça :
 
(1) table relation facture-paiement :
  - champs contenant le montant du paiement alloué à la facture
 
Lorsqu'un paiement est réparti sur une autre facture, on crée un lien de relation sur l'autre facture, et on fait varier les montants alloués des 2 relations tout en vérifiant la cohérence des montants : la somme des montants ne doit pas dépasser le montant total du paiement.
 
(2) table facture :
  - champs contenant le montant à payer de la facture
  - champs contenant le montant payé de la facture
 
Lorsqu'on modifie la relation paiement-facture, on recalcule le champs montant payé, en vérifiant que le montant payé ne dépasse jamais le montant à payer.
 
(3) table paiement :
  - champs contenant le montant du paiement
  - champs contenant le montant utilisé dans une ou plusieurs factures
 
Lorsqu'on modifie la relation paiement-facture, on recalcule le champs montant utilisé, en vérifiant que le montant utilisé ne dépasse jamais le montant du paiement.
 
Les modifications (2) et (3) ne sont pas des nécessaires, mais ce sont des optimisations qui permettent de ne pas avoir à faire de jointure pour les consultations et les vérifications de cohérence des données.
 
Les part en % se calcule par simple division entre les 2 champs montant partiel / montant total des tables facture et paiement.
Les % n'ont rien à faire en base de données, ce sont des données à calculer à l'affichage.
 
PS: De plus un %, c'est une approximation ce n'est pas une donnée fiable.


Message édité par czh le 13-12-2013 à 23:08:35
Reply

Marsh Posté le 14-12-2013 à 16:17:14    

Quand je parlais de %, on est bien d'accord que je parlais de portion d'un paiement allouée à une facture, donc un montant <= au montant du paiement.
J'ai bien une table factures-paiements avec le champ qui contient le montant du paiement alloué à la facture. Dans la table Paiements, j'ai bien le montant du paiement, et dans la table Factures, le montant de la facture + 1 flag pour dire que la facture est payée totalement.  
 
Je prends note de tes propositions d'optimisations en ajoutant un champ dans "Factures" qui indique le montant payé et dans la table "Paiements", le champ indiquant le total alloué aux factures.
 
Merci de l'idée. :)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed