''' Programa que reporta totales de ventas de un día en un negocio (unidades vendidas y total vendido por artículo, y total vendido general)

En un archivo de texto precios.txt se dispone de los precios de cada artículo, y en otro las cantidades de artículos de cada venta de un día.

El programa carga en un diccionario los precios de los artículos, totaliza en otro diccionario las unidades vendidas de cada artículo a partir
del archivo de texto cuyo nombre indica el usuario y que representa el detalle de ventas de un día, y finalmente reporta las totalizaciones en pantalla.

Por ejemplo:

precios.txt
-----------
15  23700
23 219990
32  47600
44 129900

20240521.txt
------------
23 1
15 2
44 1
32 2
15 3
44 1

Los resultados deberán ser:
23 1  219990.00
15 5  118500.00
44 2  259800.00
32 2   95200.00

Total 693490.00 '''

def precios():
    ''' Devuelve un diccionario con los precios de cada artículo, que obtiene de precios.txt '''
    # Prólogo
    p = {} # diccionario vacío de precios (estado inicial)
    arch = open ('precios.txt', 'r') # apertura de archivo precios.txt para leer en variable arch

    # Desarrollo
    for línea in arch: # para cada linea del archivo, por ejemplo, la primera '15 23700'
        línea = línea.split() # se descompone la línea en un lista de subcadenas separadas por espacios, p.e. ['15', '23700']
        p[línea[0]] = float(línea[1]) # se crea un ítem del diccionario p con clave línea[0] y valor línea[1], p.e. {'15': 23700.0}

    # Epílogo
    arch.close() # cierre del archivo
    return p # devolución de diccionario de precios

def ventas(nomArch):
    ''' Devuelve un diccionario con el total de unidades vendidas por artículo, que calcula a partir del contenido del archivo con nombre representado
    por la variable nomAch '''
    # Prólogo
    v = {} # diccionario vacio de ventas (estado inicial)
    arch = open(nomArch, 'r') # apertura de archivo nomArch para totalizar unidades vendidas de cada producto

    # Desarrollo
    for línea in arch:
        línea = línea.split()
        if línea[0] in v: v[línea[0]] += int(línea[1]) # si el ítem con clave línea[0] existe en v, se suma a su valor la cantidad de unidades que figura
        else: v[línea[0]] = int(línea[1]) # si no, se crea un ítem con clave línea[0] y valor inicial la cantidad de unidades vendidas que figura en la línea

    # Epílogo
    arch.close() # cierre del archivo
    return v # devolución de diccionario de precios

def totalizar(ventas, precios):
    ''' Reporta en pantalla la cantidad de unidades y el total vendido de cada artículo, y el total de ventas general '''
    # Prólogo
    total = 0.0 # estado inicial del totalizador de ventas
    print('\nCantidad de unidades y monto total de ventas por artículo:')

    # Desarrollo
    for artículo, cantidad in ventas.items():
        total_art = cantidad*precios[artículo] # monto total vendido de un artículo
        print(f'{artículo:4s}{cantidad:4d}{total_art:12.2f}') # s indica formato string (cadena), d decimal entero y f punto flotante
        total += total_art

    print(f'\nEl total de ventas es de ${total:0.2f}')

# PROGRAMA
#Prólogo
print('Totalizaciones por artículo y general de ventas registradas en un archivo de texto\n')
p = precios() # carga de precios en diccionario p
archVentas = input('Ingrese el nombre del archivo de ventas, incluyendo la extensión .txt: ')
v = ventas(archVentas) # totalización de unidades vendidas de cada artículo en diccionario v

# Desarrollo
totalizar(v, p)

# Epílogo
input('\nPulse Intro/Enter para terminar')
