mirror of
https://gitlab.crans.org/bde/nk20
synced 2025-04-30 18:41:35 +00:00
Ajout des factures
parent
712ca38bd2
commit
80e4257e77
@ -1,2 +1,79 @@
|
||||
L'application de Trésorerie facilite la vie des trésorier, et sert d'interface de création de facture.
|
||||
Elle permet également le suivi des remises de chèque reçu par le BDE.
|
||||
Elle permet également le suivi des remises de chèques reçus par le BDE.
|
||||
|
||||
# Factures
|
||||
|
||||
## Modèle des factures
|
||||
|
||||
Il est possible de créer des factures, qui seront enregistrées en base de données. Les différents attributs sont :
|
||||
|
||||
* `id` : Le numéro de la facture
|
||||
* `name` : Le nom de la personne ou la raison sociale à qui est destinée la facture
|
||||
* `address` : L'adresse de cette personne ou raison sociale
|
||||
* `bde` : Le nom du fichier contenant le logo du BDE sous lequel a été éditée la facture. Ce champ ne peut pas être modifié depuis la note, et vaut par défaut le logo du BDE en fonction (exemple : `Saperlistpopette.png`)
|
||||
* `date` : Le jour d'émission de la facture (par défaut le jour même)
|
||||
* `object` : L'objet de la facture, le titre
|
||||
* `description` : La description de la facture
|
||||
* `acquitted` : Indique si la facture a déjà été acquittée ou non.
|
||||
|
||||
Les factures contiennent également certaines valeurs hard-codées pour ne pas polluer la base de données, telle que la raison sociale du BDE, son adresse ainsi que ses coordonnées bancaires.
|
||||
|
||||
## Produits
|
||||
|
||||
À chaque facture est associée plusieurs produits. Pour permettre cela, un modèle `Product` a été créé contenant 4 attributs :
|
||||
|
||||
* `invoice` : `ForeignKey` vers la facture associée au produit
|
||||
* `designation` : Désignation du produit
|
||||
* `quantity` : Quantité achetée
|
||||
* `amount` : Prix unitaire (HT) du produit (peut être négatif si jamais il s'agit d'un rabais, d'un solde prépayé, ...)
|
||||
|
||||
Pour ajouter des produits à une facture, cela se passe sur le même formulaire d'ajout/de modification de factures. Pour cela, on utilise un `FormSet`, qui permet de gérer un nombre arbitraire de formulaires (chaque produit est un sous-formulaire).
|
||||
|
||||
En en-tête, ce code HTML est généré automatiquement :
|
||||
|
||||
```html
|
||||
<input type="hidden" name="product_set-TOTAL_FORMS" value="<N>" id="id_product_set-TOTAL_FORMS">
|
||||
<input type="hidden" name="product_set-INITIAL_FORMS" value="<N>" id="id_product_set-INITIAL_FORMS">
|
||||
<input type="hidden" name="product_set-MIN_NUM_FORMS" value="0" id="id_product_set-MIN_NUM_FORMS">
|
||||
<input type="hidden" name="product_set-MAX_NUM_FORMS" value="1000" id="id_product_set-MAX_NUM_FORMS">
|
||||
```
|
||||
|
||||
Où `<N>` est le nombre de produits initialement. Cela permet d'indiquer au FormSet combien de formulaires il y a et combien il faut en gérer. La partie HTML de chaque produit ressemble à ceci :
|
||||
|
||||
```html
|
||||
<tr class="row-formset">
|
||||
<td><input type="text" name="product_set-__prefix__-designation" maxlength="255" id="id_product_set-__prefix__-designation"></td>
|
||||
<td><input type="number" name="product_set-__prefix__-quantity" min="0" id="id_product_set-__prefix__-quantity"> </td>
|
||||
<td>
|
||||
<div class="input-group">
|
||||
<input type="number" name="product_set-__prefix__-amount" step="0.01" id="id_product_set-__prefix__-amount">
|
||||
<div class="input-group-append">
|
||||
<span class="input-group-text">€</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<input type="hidden" name="product_set-__prefix__-invoice" value="<INVOICE_ID>" id="id_product_set-__prefix__-invoice">
|
||||
<input type="hidden" name="product_set-__prefix__-id" id="id_product_set-__prefix__-id">
|
||||
</tr>
|
||||
```
|
||||
|
||||
Où ``__prefix__`` est remplacé par le numéro de ligne et ``<INVOICE_ID>`` l'identifiant de la facture (non renseigné si non encore créé). De cette manière, le FormSet sait associer chaque formulaire à ses données. On note la présence de deux champs cachés :
|
||||
|
||||
* ``product_set-__prefix__-invoice`` contient l'identifiant de la facture (si existant)
|
||||
* ``product_set-__prefix__-id`` contient l'identifiant du produit en base de données (si existant, sinon 0)
|
||||
|
||||
Deux boutons sont présents sur la page, pour ajouter et supprimer un produit. Cela a pour effet de mettre à jour les informations présentes dans les méta-données du formulaire présentées ci-dessus, et de copier une ligne vide (présentée ci-dessus) et de l'afficher en remplaçant ``__prefix__`` par les bonnes valeurs.
|
||||
|
||||
Au moment de la sauvegarde du formulaire, on s'assure d'enregistrer tous les produits associés.
|
||||
|
||||
## Génération
|
||||
|
||||
Les factures peuvent s'exporter au format PDF (là est tout leur intérêt). Pour cela, on utilise le template LaTeX présent à l'adresse suivante : [/templates/treasury/invoice_sample.tex](https://gitlab.crans.org/bde/nk20/-/tree/master/templates/treasury/invoice_sample.tex)
|
||||
|
||||
On le remplit avec les données de la facture et les données du BDE, hard-codées. On copie le template rempli dans un ficher tex dans un dossier temporaire. On fait ensuite 2 appels à `pdflatex` pour générer la facture au format PDF. Les deux appels sont nécessaires, il y a besoin d'un double rendu. Ensuite, le PDF est envoyé à l'utilisateur et on supprime les données temporaires.
|
||||
|
||||
On remarque que les PDF sont générés à la volée et ne sont pas sauvegardés. Niveau performances, cela prend du temps au plus 2-3 secondes), mais cela n'est pas un problème car on ne génère pas des factures fréquemment. Niveau fiabilité des données, il faut s'assurer que les données hard-codées ne changent pas, et si elles sont amenées à changer (pour cause de déménagement), il faudra s'assurer que cela n'impacte pas les anciennes factures, en ajoutant par exemple un champ `old` (ou `kchan`) pour savoir s'il s'agit d'une nouvelle ou d'une ancienne facture.
|
||||
|
||||
# Modèles
|
||||
|
||||

|
Loading…
x
Reference in New Issue
Block a user