Factures¶
Disposem d’un fitxer que ens permetrà fer una factura a un client,
però no hi ha la factura pròpiament dita (hi manquen les sumes
parcial, el cost total amb i sense IVA, etc). El nostre objectiu és
afegir-hi tot el que manca. Treballarem de format incremental: primer
llegirem les dades del fitxer inicial, les desarem en una llista,
anirem calculant tot el que faci falta i finalment desarem la factura
en un altre fitxer. Per exemple el fitxer
prefactura.txt, que pots
descarregar, mostra un exemple:
A-122 * Got de vidre * 10 * 4.50
FQ-871 * Forquilla * 6 * 2.00
CS-871 * Cullera sopera * 6 * 2.40
GV-872 * Ganivet de taula * 6 * 3.50
CP-871 * Cullera de postres * 6 * 2.15
GS-23 * Ganivet de serra * 1 * 9.90
El fitxer conté les dades dels productes comprats. A cada línia hi ha 4 dades separades per espai-asterisc-espai, la referència del producte comprat, la descripció, les unitats comprades i el preu unitari.
Definiu la funció llegir_dades(nomf) que donat el nom d’un fitxer amb el format descrit, retorni una llista amb les dades de cada producte comprat. Els elements de la llista retornada seran llistes de quatre components [r,d,q,p], essent r la referència (string), d la descripció (string), q el nombre d’unitats (enter) i p el preu unitari (float).
[['A-122','Got de vidre',10,4.5],['FQ-871','Forquilla',6,2.0], ... ]
Definiu la funció calcula_preus que modifiqui una llista de compres com la retornada a l’apartat anterior ordenant-la alfabèticament per la referència i afegint a cada producte comprat una component addicional corresponent al preu total de les unitats comprades:
def calcula_preus(lc): """ >>> a = [['FQ-871','Forquilla',6,2.0],['A-122','Got de vidre',10,4.5]] >>> calcula_preus(a) >>> a [['A-122', 'Got de vidre', 10, 4.5, 45.0], ['FQ-871', 'Forquilla', 6, 2.0, 12.0]] """
Definiu la funció calcula_imports que donada una llista de compres i l’IVA que cal aplicar (en percentatge) retorni tres nombres reals:
L’import total (base imposable)
L’import corresponent a l’IVA
L’import final, incloent l’IVA
def calcula_imports(lc, iva): """ >>> (t, i, f) = calcula_imports([['A-122', 'Got de vidre', 10, 4.5, 45.0], ['FQ-871', 'Forquilla', 6, 2.0, 12.0]], 16) >>> (round(t,2), round(i,2), round(f,2)) 57.0 9.12 66.12 """
Definiu la funció linia_compra(c) que donada una compra (una llista amb 5 components), retorni un string de 58 caràcters amb les dades en aquest format:
La quantitat (4 espais, justificada a la dreta), seguida d’un espai en blanc;
la referència (6 espais, justificada a l’esquerra), seguida d’un espai en blanc;
la descripció (30 espais, justificada a la dreta), seguida d’un espai en blanc;
el preu unitari (7 espais, justificat a la dreta, amb 2 decimals), seguida d’un espai en blanc;
i el preu total de les unitats comprades (7 espais, justificat a la dreta, amb 2 decimals).
def linia_compra(c): """ >>> linia_compra(['R-200', 'Cordill', 10, 3.2, 32.0]) ' 10 R-200 Cordill 3.20 32.00' """
Es recomana que utilitzeu els mètodes
str.ljust(),str.rjust()istr.format().Finalment, dissenyeu la funció escriu_factura(nomf1,num,dv,dc,nomf2) que donat el nom d’un fitxer de productes comprats com el del primer apartat (nomf1), un número de factura (nf), les dades del venedor (dv), les del comprador (dc) i un nom d’un fitxer on escriure (nomf2), crea el fitxer amb la factura. L’aspecte del fitxer escrit ha de ser aquest:
Emissor: Ferreteria El Clau Roent C/ Bonavista, 14 - Baixos Sant Eustaqui de Viladesords NIF: A-12345678 Destinatari: Pau Carmona Serrall NIF: B-87654321 Factura NUM: 4321 Data: 23/10/2011 Qt. Ref. Descripcio p/u import ---------------------------------------------------------- 1 A-200 Martell gran 28.00 28.00 14 CAR102 Cargols de rosca 0.60 8.40 10 R-200 Cordill 3.20 32.00 ---------------------------------------------------------- Base imp.: 68.40 IVA (16%): 10.94 TOTAL: 79.34Per a conèixer la data actual, utilitzeu la funció
datetime.date.today().