.. module:: factures ========== 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 :mod:`factures` (fitxer :file:`factures.py`): .. py:function:: linia_factura(sku, quantitat, preu, perc_iva) Retorna una tupla amb tota la informació d'una línia de factura. :param str sku: SKU del producte :param int quantitat: nombre d'unitats demanades :param float preu: preu del producte :param float perc_iva: tant per cent d'IVA del producte :rtype: tuple (str, int, float, float, float, float) :return: 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: .. literalinclude:: test-linia_factura.txt :language: pycon :start-after: inici :end-before: fi .. note:: Disposes de més tests al fitxer :download:`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: .. literalinclude:: test-linies_factura.txt :language: pycon :start-after: Comanda :end-before: Productes 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: .. literalinclude:: test-linies_factura.txt :language: pycon :start-after: Productes :end-before: IVA 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: .. literalinclude:: test-linies_factura.txt :language: pycon :start-after: IVA :end-before: Generem Dissenya la funció següent i desa-la al mòdul :mod:`factures` (fitxer :file:`factures.py`): .. py:function:: 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. :param list comanda: Llista de tuples amb l'identificador d'un producte i la quantitat encarregada. :param dict productes: 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). :param dict iva: diccionari en què les claus són el tipus d'IVA (string) i els valors el tant per cent corresponent. :rtype: tuple (list, list) :return: 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: .. literalinclude:: test-linies_factura.txt :language: pycon :start-after: Generem :end-before: Més tests .. note:: Disposes de més tests al fitxer :download:`test-linies_factura.txt`. .. Important:: Cal que :func:`linies_factura` cridi :func:`linia_factura`. Disposes de solucions al fitxer :download:`factures.py`.