Skip to article frontmatterSkip to article content
Licence CC BY-NC-ND Thierry Parmentelat & Arnaud Legout

génération de facture

le problème

on veut automatiser la rédaction de factures à partir d’une liste d’items et de prix

exemple d’utilisation, imaginons qu’on a les données suivantes :

company_address = """Tribeca Inc.,
Somerset House – New Wing
Lancaster Place
London WC2R 1LA
"""

thanks_message = "Thanks for shopping with us today!"

currency = '€'

items = [
    ("Books", 25.0, 2),
    ("Monitor", 250.0, 1),
    ("Computer", 500.0, 1),
]

à partir de ces données on pourrait imaginer plusieurs APIs pour produire des factures comme ceci

v0 : une fonction

l’API la plus simple évidemment ce serait tout simplement ceci

from invoice import generate_invoice
invoice = generate_invoice(
    items, company_address, thanks=thanks_message, currency='$')
print(invoice)
**************************************************
                  Tribeca Inc.,                   
            Somerset House – New Wing             
                 Lancaster Place                  
                 London WC2R 1LA                  
++++++++++++++++++++++++++++++++++++++++++++++++++
         Product Name   #    Item Price           
                Books   2    25.00                
              Monitor   1    250.00               
             Computer   1    500.00               
--------------------------------------------------
                Total        800.00 $             
--------------------------------------------------
        Thanks for shopping with us today!        
--------------------------------------------------

suggestions / indices

texte = "tutu"
largeur = 10
# on peut utiliser une variable AUSSI pour la largeur du format
# ici je prends 10 caractères, et je justifie mon texte à droite (le >)
#         ↓  ↓↓↓↓↓
f"X{texte:>{largeur}}X"
'X tutuX'
# et on peut aussi centrer (le ^) ou justifier à gauche (<)
#         ↓
f"X{texte:^{largeur}}X"
'X tutu X'

v1 : une classe

maintenant on peut aussi imaginer une autre façon d’implémenter ceci, en passant par une classe, comme par exemple

from invoice import InvoiceGenerator
generator = InvoiceGenerator(
    address=company_address, 
    thanks=thanks_message,
    currency='$')

print(generator.invoice(items))
**************************************************
                  Tribeca Inc.,                   
            Somerset House – New Wing             
                 Lancaster Place                  
                 London WC2R 1LA                  

++++++++++++++++++++++++++++++++++++++++++++++++++
     Product Name     #  Item Price       
            Books     2  25.0             
          Monitor     1  250.0            
         Computer     1  500.0            
--------------------------------------------------
            Total        800.00$
++++++++++++++++++++++++++++++++++++++++++++++++++
        Thanks for shopping with us today!        
**************************************************

solution

Comme toujours, les annotations type hints sont totalement optionnelles

une solution v0

Dans une toute première version, on pourrait penser à faire des print() dans la fonction.

Toutefois cette approche n’est pas recommandée; il vaut beaucoup mieux construire et renvoyer une chaine; de cette façon l’appelant pourra toujours choisir d’utiliser print() de son coté

une solution v1