3. Factures

Una empresa vol calcular les línies d’una factura a partir de la informació de comandes, productes i tipus d’IVA.

Abans de tractar tota aquesta informació, primer generarem línies de factura a partir de l’SKU del producte (un codi alfanumèric), les unitats demanades, el preu i el tipus d’IVA. A una línia de factura, l’import sense impostos és la quantitat multiplicada pel preu i l’import amb impostos és l’import sense impostos més el tant per cent que correspon a un tipus d’IVA.

Dissenya la funció següent i desa-la al mòdul factures (fitxer factures.py):

factures.linia_factura(sku, quantitat, preu, perc_iva)

Retorna una tupla amb tota la informació d’una línia de factura.

Paràmetres:
  • sku (str) – SKU del producte

  • quantitat (int) – nombre d’unitats demanades

  • preu (float) – preu del producte

  • perc_iva (float) – tant per cent d’IVA del producte

Tipus de retorn:

tuple (str, int, float, float, float, float)

Retorna:

tupla amb tota la informació d’una línia de factura: sku, quantitat, preu, perc_iva, import sense impostos i import amb impostos.

Tant l’import sense impostos com l’import amb impostos han d’estar arrodonits a dos decimals.

Per exemple:


>>> linia = linia_factura('ZT003', 13, 5.02, 10)
>>> linia
('ZT003', 13, 5.02, 10, 65.26, 71.79)

>>> linia = linia_factura('XR274', 6, 12, 21)
>>> linia
('XR274', 6, 12, 21, 72, 87.12)

Nota

Disposes de més tests al fitxer test-linia_factura.txt.


D’altra banda, l’empresa disposa d’informació de les comandes. Una comanda és una llista de tuples amb l’identificador d’un producte i la quantitat encarregada. Per exemple:


>>> com1 = [(2, 10), (23, 13), (7, 15),
...   (3, 5), (4, 12), (18, 6),
... ]

La informació sobre els productes està en un diccionari en què les claus són identificadors del producte i els valors associats són una tupla amb l’SKU (un codi alfanumèric), el tipus d’IVA i el preu. Per exemple:


>>> prods = {
...   3: ('XR007', 'normal', 3),
...   7: ('XR045', 'reduït', 2.5),
...   9: ('ZT921', 'general', 9.33),
...   18: ('XR274', 'general', 12),
...   23: ('ZT003', 'reduït', 5.02),
... }

El tant per cent que correspon a cada tipus d’IVA també està en un diccionari en què les claus són el tipus d’IVA i els valors el tant per cent. Per exemple:


>>> iva = {
...   'general': 21, 'reduït': 10, 'superreduït': 4, 'zero': 0
... }

Dissenya la funció següent i desa-la al mòdul factures (fitxer factures.py):

factures.linies_factura(comanda, productes, iva)

Retorna una tupla de dues llistes amb les línies de factura vàlides i els productes dels quals no hi ha informació disponible.

Paràmetres:
  • comanda (list) – Llista de tuples amb l’identificador d’un producte i la quantitat encarregada.

  • productes (dict) – Diccionari on les claus són identificadors de producte i els valors són tuples amb l’SKU (string), el tipus d’IVA (string) i el preu (int/float).

  • iva (dict) – diccionari en què les claus són el tipus d’IVA (string) i els valors el tant per cent corresponent.

Tipus de retorn:

tuple (list, list)

Retorna:

tupla amb dues llistes:

  • Llista amb la informació d’una línia de factura per cada element de comanda que tingui un codi present a productes i el seu tipus d’IVA estigui present a iva.

  • Llista amb els codis dels productes de comanda que no es troben a productes.

Per exemple, amb la llista com1 i els diccionaris prods i iva anteriors:


>>> linies1, pi = linies_factura(com1, prods, iva)
>>> pprint(linies1)
[('ZT003', 13, 5.02, 10, 65.26, 71.79),
 ('XR045', 15, 2.5, 10, 37.5, 41.25),
 ('XR274', 6, 12, 21, 72, 87.12)]
>>> pi
[2, 4]

Nota

Disposes de més tests al fitxer test-linies_factura.txt.

Important

Cal que linies_factura() cridi linia_factura().

Disposes de solucions al fitxer factures.py.