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.

  1. 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], ... ]
    
  2. 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]]
       """
    
  3. 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
       """
    
  4. 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() i str.format().

  5. 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.34
    
  6. Per a conèixer la data actual, utilitzeu la funció datetime.date.today().