Files
AdministradorContable/main.py
2026-02-19 15:34:40 -06:00

751 lines
30 KiB
Python

import json
from datetime import datetime
import pandas as pd
ruta = "./estado.json"
IVA_RATE = 0.16 # 16% de IVA
LIMITE_EFECTIVO = 2000.0
def sumatoriaContable(cuentas: list[float]):
"""Suma todos los elementos de la lista de cuentas"""
sumatoria = 0.0
for valor in cuentas:
if isinstance(valor, (int, float)):
sumatoria += valor
return sumatoria
def sumatoriaContableActivos():
"""Calcula la suma total de activos"""
estado['activo']['suma_activos'] = (
estado['activo']['circulantes']['suma_activos_circulantes'] +
estado['activo']['no_circulantes']['suma_activos_no_circulantes']
)
def sumatoriaContablePasivos():
"""Calcula la suma total de pasivos"""
suma_corto = sumatoriaContable([
estado['pasivos']['corto_plazo']['acreedores'],
estado['pasivos']['corto_plazo']['documentos_por_pagar'],
estado['pasivos']['corto_plazo']['anticipo_de_clientes'],
estado['pasivos']['corto_plazo']['iva_trasladado']
])
estado['pasivos']['suma_pasivos'] = suma_corto
def actualizarSumasActivos():
"""Actualiza todas las sumas de activos circulantes y no circulantes"""
estado['activo']['circulantes']['suma_activos_circulantes'] = sumatoriaContable([
estado['activo']['circulantes']['caja'],
estado['activo']['circulantes']['bancos'],
estado['activo']['circulantes']['inventarios'],
estado['activo']['circulantes']['iva_acreditado'],
estado['activo']['circulantes']['iva_por_acreditar']
])
estado['activo']['no_circulantes']['suma_activos_no_circulantes'] = sumatoriaContable([
estado['activo']['no_circulantes']['edificios'],
estado['activo']['no_circulantes']['mobiliario'],
estado['activo']['no_circulantes']['papeleria'],
estado['activo']['no_circulantes']['computo'],
estado['activo']['no_circulantes']['rentas_pagadas_por_adelantado']
])
sumatoriaContableActivos()
sumatoriaContablePasivos()
def abono(ruta_cuenta: str, monto: float):
"""
Realiza un abono a una cuenta específica usando la ruta como string
Ejemplo: abono('activo.circulantes.caja', 100.0)
"""
claves = ruta_cuenta.split('.')
cuenta = estado
for clave in claves[:-1]:
cuenta = cuenta[clave]
cuenta[claves[-1]] += monto
def asientoApertura():
"""Permite ingresar fondos iniciales de las cuentas de activo"""
sel0 = 'y'
while sel0.lower() == 'y':
print("\n¿A qué cuenta deseas añadir fondos?")
print("Circulantes: \n a11 - Caja\n a12 - Bancos\n a13 - Inventarios")
print("No Circulantes: \n a21 - Edificios\n a22 - Mobiliario\n a23 - Papelería\n a24 - Cómputo\n a25 - Rentas pagadas por adelantado")
sel1 = input("Elije: ").lower().strip()
try:
sel2 = float(input("¿De cuánto es tu abono?: "))
if sel2 < 0:
print("El monto debe ser positivo")
continue
except ValueError:
print("Por favor ingresa un número válido")
continue
rutas = {
"a11": "activo.circulantes.caja",
"a12": "activo.circulantes.bancos",
"a13": "activo.circulantes.inventarios",
"a21": "activo.no_circulantes.edificios",
"a22": "activo.no_circulantes.mobiliario",
"a23": "activo.no_circulantes.papeleria",
"a24": "activo.no_circulantes.computo",
"a25": "activo.no_circulantes.rentas_pagadas_por_adelantado"
}
if sel1 in rutas:
abono(rutas[sel1], sel2)
actualizarSumasActivos()
estado['capital_contable']['contribuido']['capital_social'] = estado['activo']['suma_activos']
print(f"✓ Abono registrado correctamente")
else:
print("Opción no válida, intenta de nuevo")
continue
sel0 = input("\n¿Deseas añadir algo más? (y/n): ").lower().strip()
def obtenerCuentaBien():
"""Permite al usuario elegir qué cuenta de activo afectar con la compra"""
print("\n¿Qué tipo de bien está comprando?")
print("1 - Inventarios (mercancías)")
print("2 - Papelería")
print("3 - Cómputo")
print("4 - Mobiliario")
print("5 - Edificios")
opcion = input("Elija: ").strip()
rutas = {
"1": "activo.circulantes.inventarios",
"2": "activo.no_circulantes.papeleria",
"3": "activo.no_circulantes.computo",
"4": "activo.no_circulantes.mobiliario",
"5": "activo.no_circulantes.edificios"
}
return rutas.get(opcion, None)
def obtenerCuentaPago(monto):
"""Determina de dónde se pagará según el monto"""
if monto > LIMITE_EFECTIVO:
print(f"\nMonto mayor a ${LIMITE_EFECTIVO}, el pago será desde Bancos")
return "activo.circulantes.bancos"
else:
print(f"\nMonto menor o igual a ${LIMITE_EFECTIVO}")
print("1 - Caja")
print("2 - Bancos")
opcion = input("¿De dónde desea pagar?: ").strip()
if opcion == "2":
return "activo.circulantes.bancos"
else:
return "activo.circulantes.caja"
def compraEfectivo():
"""
Compra pagada en efectivo/bancos
- Aumenta cuenta del bien por subtotal
- Disminuye bancos/caja por total (subtotal + IVA)
- Aumenta IVA acreditable por monto del IVA
"""
print("\n" + "="*50)
print("COMPRA EN EFECTIVO/CONTADO")
print("="*50)
try:
subtotal = float(input("Ingrese el subtotal de la compra: $"))
if subtotal <= 0:
print("❌ El monto debe ser positivo")
return
iva = subtotal * IVA_RATE
total = subtotal + iva
print(f"\nSubtotal: ${subtotal:.2f}")
print(f"IVA (16%): ${iva:.2f}")
print(f"Total: ${total:.2f}")
cuenta_bien = obtenerCuentaBien()
if not cuenta_bien:
print("❌ Opción de bien no válida")
return
cuenta_pago = obtenerCuentaPago(total)
# Asientos contables
abono(cuenta_bien, subtotal) # Aumenta bien
abono(cuenta_pago, -total) # Disminuye efectivo/banco
abono("activo.circulantes.iva_acreditado", iva) # Aumenta IVA acreditable
actualizarSumasActivos()
guardarEstado()
print("\n✓ Compra registrada correctamente")
print(f" - Bien: +${subtotal:.2f}")
print(f" - Bancos/Caja: -${total:.2f}")
print(f" - IVA Acreditable: +${iva:.2f}")
except ValueError:
print("❌ Ingrese valores numéricos válidos")
def compraACredito():
"""
Compra a crédito
- Aumenta cuenta del bien por subtotal
- Aumenta pasivo Acreedores por total
- Aumenta IVA por acreditar (no acreditable hasta pagar)
"""
print("\n" + "="*50)
print("COMPRA A CRÉDITO")
print("="*50)
try:
subtotal = float(input("Ingrese el subtotal de la compra: $"))
if subtotal <= 0:
print("❌ El monto debe ser positivo")
return
iva = subtotal * IVA_RATE
total = subtotal + iva
print(f"\nSubtotal: ${subtotal:.2f}")
print(f"IVA (16%): ${iva:.2f}")
print(f"Total: ${total:.2f}")
cuenta_bien = obtenerCuentaBien()
if not cuenta_bien:
print("❌ Opción de bien no válida")
return
# Asientos contables
abono(cuenta_bien, subtotal) # Aumenta bien
abono("pasivos.corto_plazo.acreedores", total) # Aumenta pasivo
abono("activo.circulantes.iva_por_acreditar", iva) # Aumenta IVA por acreditar
actualizarSumasActivos()
guardarEstado()
print("\n✓ Compra a crédito registrada correctamente")
print(f" - Bien: +${subtotal:.2f}")
print(f" - Acreedores: +${total:.2f}")
print(f" - IVA por Acreditar: +${iva:.2f}")
except ValueError:
print("❌ Ingrese valores numéricos válidos")
def compraCombinada():
"""
Compra combinada (parte en contado, parte a crédito)
- Aumenta bien por subtotal
- Disminuye bancos/caja por parte de contado (con IVA)
- Aumenta Documentos por Pagar por parte a crédito (con IVA)
- Aumenta IVA acreditable e IVA por acreditar proporcionalmente
"""
print("\n" + "="*50)
print("COMPRA COMBINADA (CONTADO + CRÉDITO)")
print("="*50)
try:
subtotal = float(input("Ingrese el subtotal de la compra: $"))
if subtotal <= 0:
print("❌ El monto debe ser positivo")
return
porcentaje_contado = float(input("¿Qué porcentaje es de contado? (0-100): "))
if not (0 <= porcentaje_contado <= 100):
print("❌ El porcentaje debe estar entre 0 y 100")
return
porcentaje_credito = 100 - porcentaje_contado
subtotal_contado = subtotal * (porcentaje_contado / 100)
subtotal_credito = subtotal * (porcentaje_credito / 100)
iva_total = subtotal * IVA_RATE
iva_contado = iva_total * (porcentaje_contado / 100)
iva_credito = iva_total * (porcentaje_credito / 100)
total_contado = subtotal_contado + iva_contado
total_credito = subtotal_credito + iva_credito
print(f"\n--- Parte Contado ({porcentaje_contado}%) ---")
print(f"Subtotal: ${subtotal_contado:.2f}")
print(f"IVA: ${iva_contado:.2f}")
print(f"Total: ${total_contado:.2f}")
print(f"\n--- Parte Crédito ({porcentaje_credito}%) ---")
print(f"Subtotal: ${subtotal_credito:.2f}")
print(f"IVA: ${iva_credito:.2f}")
print(f"Total: ${total_credito:.2f}")
cuenta_bien = obtenerCuentaBien()
if not cuenta_bien:
print("❌ Opción de bien no válida")
return
cuenta_pago = obtenerCuentaPago(total_contado)
# Asientos contables
abono(cuenta_bien, subtotal) # Aumenta bien por subtotal total
abono(cuenta_pago, -total_contado) # Disminuye bancos/caja
abono("pasivos.corto_plazo.documentos_por_pagar", total_credito) # Documentos por pagar
abono("activo.circulantes.iva_acreditado", iva_contado) # IVA acreditable
abono("activo.circulantes.iva_por_acreditar", iva_credito) # IVA por acreditar
actualizarSumasActivos()
guardarEstado()
print("\n✓ Compra combinada registrada correctamente")
print(f" - Bien: +${subtotal:.2f}")
print(f" - Bancos/Caja: -${total_contado:.2f}")
print(f" - Documentos por Pagar: +${total_credito:.2f}")
print(f" - IVA Acreditable: +${iva_contado:.2f}")
print(f" - IVA por Acreditar: +${iva_credito:.2f}")
except ValueError:
print("❌ Ingrese valores numéricos válidos")
def anticipoClientes():
"""
Anticipo de clientes (venta futura)
- Aumenta Bancos por el total del anticipo
- Aumenta pasivo Anticipo de Clientes por subtotal
- Aumenta pasivo IVA Trasladado por el IVA
"""
print("\n" + "="*50)
print("ANTICIPO DE CLIENTES")
print("="*50)
try:
subtotal = float(input("Ingrese el subtotal del anticipo: $"))
if subtotal <= 0:
print("❌ El monto debe ser positivo")
return
iva = subtotal * IVA_RATE
total = subtotal + iva
print(f"\nSubtotal: ${subtotal:.2f}")
print(f"IVA Trasladado (16%): ${iva:.2f}")
print(f"Total: ${total:.2f}")
# Asientos contables
abono("activo.circulantes.bancos", total) # Aumenta bancos
abono("pasivos.corto_plazo.anticipo_de_clientes", subtotal) # Pasivo anticipo
abono("pasivos.corto_plazo.iva_trasladado", iva) # Pasivo IVA trasladado
actualizarSumasActivos()
guardarEstado()
print("\n✓ Anticipo de cliente registrado correctamente")
print(f" - Bancos: +${total:.2f}")
print(f" - Anticipo de Clientes: +${subtotal:.2f}")
print(f" - IVA Trasladado: +${iva:.2f}")
except ValueError:
print("❌ Ingrese valores numéricos válidos")
def pagoRentasAdelantadas():
"""
Pago de rentas adelantadas
- Disminuye Bancos/Caja por el total
- Aumenta Rentas Pagadas por Adelantado por subtotal
- Aumenta IVA Acreditable por el IVA
- Aumenta pasivo Documentos por Pagar (si hay crédito del arrendador)
"""
print("\n" + "="*50)
print("PAGO DE RENTAS ADELANTADAS")
print("="*50)
try:
subtotal = float(input("Ingrese el subtotal de la renta: $"))
if subtotal <= 0:
print("❌ El monto debe ser positivo")
return
iva = subtotal * IVA_RATE
total = subtotal + iva
print(f"\nSubtotal: ${subtotal:.2f}")
print(f"IVA (16%): ${iva:.2f}")
print(f"Total: ${total:.2f}")
# Preguntar si hay crédito del arrendador
tiene_credito = input("\n¿Parte de la renta es a crédito? (s/n): ").lower().strip()
if tiene_credito == 's':
try:
porcentaje_contado = float(input("¿Qué porcentaje es de contado? (0-100): "))
if not (0 <= porcentaje_contado <= 100):
print("❌ El porcentaje debe estar entre 0 y 100")
return
porcentaje_credito = 100 - porcentaje_contado
except ValueError:
print("❌ Ingrese un porcentaje válido")
return
else:
porcentaje_contado = 100
porcentaje_credito = 0
subtotal_contado = subtotal * (porcentaje_contado / 100)
subtotal_credito = subtotal * (porcentaje_credito / 100)
iva_contado = iva * (porcentaje_contado / 100)
iva_credito = iva * (porcentaje_credito / 100)
total_contado = subtotal_contado + iva_contado
total_credito = subtotal_credito + iva_credito
cuenta_pago = obtenerCuentaPago(total_contado)
# Asientos contables
abono(cuenta_pago, -total_contado) # Disminuye bancos/caja por parte contado
abono("activo.no_circulantes.rentas_pagadas_por_adelantado", subtotal) # Aumenta rentas
abono("activo.circulantes.iva_acreditado", iva_contado) # IVA acreditable
if porcentaje_credito > 0:
abono("pasivos.corto_plazo.documentos_por_pagar", total_credito) # Documentos por pagar
print(f" - IVA por Acreditar: +${iva_credito:.2f}")
abono("activo.circulantes.iva_por_acreditar", iva_credito)
actualizarSumasActivos()
guardarEstado()
print("\n✓ Pago de renta adelantada registrado correctamente")
print(f" - Bancos/Caja: -${total_contado:.2f}")
print(f" - Rentas Pagadas por Adelantado: +${subtotal:.2f}")
print(f" - IVA Acreditable: +${iva_contado:.2f}")
if porcentaje_credito > 0:
print(f" - Documentos por Pagar: +${total_credito:.2f}")
except ValueError:
print("❌ Ingrese valores numéricos válidos")
def guardarEstado():
"""Guarda el estado actual en el archivo JSON"""
with open(ruta, "w", encoding="utf-8") as estado_file:
json.dump(estado, estado_file, indent=4, ensure_ascii=False, default=str)
estado_file.close()
def guardarEstadoCSV():
"""
Guarda el Estado de Situación Financiera en formato CSV lado a lado
Crea un archivo con el nombre: EMPRESA_ESTADO_FINANCIERO_FECHA.csv
Activos en columnas 1-2, Pasivos+Capital en columnas 3-4
"""
try:
fecha_archivo = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
nombre_empresa = estado['Empresa'].replace(" ", "_").replace("/", "-")
nombre_archivo = f"{nombre_empresa}_ESTADO_FINANCIERO_{fecha_archivo}.csv"
fecha_actual = datetime.now().strftime("%d de %B de %Y")
# Preparar líneas de activos y pasivos
lineas_activos = []
lineas_pasivos = []
# COLUMNA IZQUIERDA - ACTIVOS
lineas_activos.append(["Activo", ""])
lineas_activos.append(["", ""])
lineas_activos.append([" Circulantes", ""])
lineas_activos.append([" Caja", f"${estado['activo']['circulantes']['caja']:,.2f}"])
lineas_activos.append([" Bancos", f"${estado['activo']['circulantes']['bancos']:,.2f}"])
lineas_activos.append([" Inventarios", f"${estado['activo']['circulantes']['inventarios']:,.2f}"])
lineas_activos.append([" IVA Acreditable", f"${estado['activo']['circulantes']['iva_acreditado']:,.2f}"])
lineas_activos.append([" IVA por Acreditar", f"${estado['activo']['circulantes']['iva_por_acreditar']:,.2f}"])
lineas_activos.append(["", ""])
lineas_activos.append([" Suma activos circulantes", f"${estado['activo']['circulantes']['suma_activos_circulantes']:,.2f}"])
lineas_activos.append(["", ""])
lineas_activos.append([" No circulantes", ""])
lineas_activos.append([" Edificios", f"${estado['activo']['no_circulantes']['edificios']:,.2f}"])
lineas_activos.append([" Mobiliario", f"${estado['activo']['no_circulantes']['mobiliario']:,.2f}"])
lineas_activos.append([" Papelería", f"${estado['activo']['no_circulantes']['papeleria']:,.2f}"])
lineas_activos.append([" Cómputo", f"${estado['activo']['no_circulantes']['computo']:,.2f}"])
lineas_activos.append([" Rentas pagadas adelantado", f"${estado['activo']['no_circulantes']['rentas_pagadas_por_adelantado']:,.2f}"])
lineas_activos.append(["", ""])
lineas_activos.append([" Suma activos no circulantes", f"${estado['activo']['no_circulantes']['suma_activos_no_circulantes']:,.2f}"])
lineas_activos.append(["", ""])
lineas_activos.append(["Suma activos", f"${estado['activo']['suma_activos']:,.2f}"])
# COLUMNA DERECHA - PASIVOS Y CAPITAL
lineas_pasivos.append(["Pasivos", ""])
lineas_pasivos.append(["", ""])
lineas_pasivos.append([" Corto Plazo", ""])
lineas_pasivos.append([" Acreedores", f"${estado['pasivos']['corto_plazo']['acreedores']:,.2f}"])
lineas_pasivos.append([" Documentos por pagar", f"${estado['pasivos']['corto_plazo']['documentos_por_pagar']:,.2f}"])
lineas_pasivos.append([" IVA Trasladable", f"${estado['pasivos']['corto_plazo']['iva_trasladado']:,.2f}"])
lineas_pasivos.append(["", ""])
lineas_pasivos.append([" Anticipo Clientes", f"${estado['pasivos']['corto_plazo']['anticipo_de_clientes']:,.2f}"])
lineas_pasivos.append(["", ""])
lineas_pasivos.append([" Largo plazo", ""])
lineas_pasivos.append(["", ""])
total_pas = estado['pasivos']['suma_pasivos']
lineas_pasivos.append(["Suma pasivos", f"${total_pas:,.2f}"])
lineas_pasivos.append(["", ""])
lineas_pasivos.append(["Capital contable", ""])
lineas_pasivos.append(["", ""])
lineas_pasivos.append([" contribuido", ""])
total_capital = estado['capital_contable']['contribuido']['capital_social']
lineas_pasivos.append([" Capital social", f"${total_capital:,.2f}"])
lineas_pasivos.append(["", ""])
lineas_pasivos.append(["", ""])
total_pasivo_capital = total_pas + total_capital
lineas_pasivos.append(["Total capital contable + Pasivos", f"${total_pasivo_capital:,.2f}"])
# Preparar datos para CSV lado a lado
datos = []
# Encabezados
datos.append([estado['Empresa'], "", estado['Empresa'], ""])
datos.append(["ESTADO DE SITUACIÓN FINANCIERA A " + fecha_actual.upper(), "", "ESTADO DE SITUACIÓN FINANCIERA A " + fecha_actual.upper(), ""])
datos.append(["", "", "", ""])
# Combinar líneas de activos y pasivos lado a lado
max_lineas = max(len(lineas_activos), len(lineas_pasivos))
for i in range(max_lineas):
if i < len(lineas_activos):
linea_izq = lineas_activos[i]
else:
linea_izq = ["", ""]
if i < len(lineas_pasivos):
linea_der = lineas_pasivos[i]
else:
linea_der = ["", ""]
datos.append([linea_izq[0], linea_izq[1], linea_der[0], linea_der[1]])
# Verificación de ecuación contable
datos.append(["", "", "", ""])
diferencia = abs(estado['activo']['suma_activos'] - total_pasivo_capital)
if diferencia < 0.01:
datos.append(["ECUACIÓN CONTABLE BALANCEADA", "", "", ""])
datos.append(["Activo = Pasivo + Capital", "", "", ""])
else:
datos.append([f"ADVERTENCIA: Diferencia de ${diferencia:,.2f}", "", "", ""])
# Firmas
datos.append(["", "", "", ""])
datos.append(["", "", "", ""])
datos.append(["PROPIETARIO", "", "SUPERVISÓ", ""])
datos.append([estado['firmas']['propietario'], "", estado['firmas']['superviso'], ""])
# Crear DataFrame y guardar CSV
df = pd.DataFrame(datos)
df.to_csv(nombre_archivo, index=False, header=False, encoding='utf-8')
print(f"\n✓ Estado de Situación Financiera guardado en: {nombre_archivo}")
return True
except Exception as e:
print(f"\n❌ Error al guardar CSV: {str(e)}")
return False
def mostrarEstado():
"""
Muestra el Estado de Situación Financiera en formato profesional
Activos a la izquierda | Pasivos + Capital a la derecha (lado a lado)
Sigue estructura jerárquica con espaciados adecuados
"""
fecha_actual = datetime.now().strftime("%d de %B de %Y")
empresa = estado['Empresa']
ancho_col = 48
# Encabezado
print("\n" + "="*100)
print(f"{empresa.upper()}".center(100))
print(f"ESTADO DE SITUACIÓN FINANCIERA A {fecha_actual.upper()}".center(100))
print("="*100)
# Recolectar datos para mostrar lado a lado
lineas_activos = []
lineas_pasivos = []
# COLUMNA IZQUIERDA - ACTIVOS
lineas_activos.append("Activo")
lineas_activos.append("")
lineas_activos.append(" Circulantes")
lineas_activos.append(f" Caja ${estado['activo']['circulantes']['caja']:>13,.2f}")
lineas_activos.append(f" Bancos ${estado['activo']['circulantes']['bancos']:>13,.2f}")
lineas_activos.append(f" Inventarios ${estado['activo']['circulantes']['inventarios']:>13,.2f}")
lineas_activos.append(f" IVA Acreditable ${estado['activo']['circulantes']['iva_acreditado']:>13,.2f}")
lineas_activos.append(f" IVA por Acreditar ${estado['activo']['circulantes']['iva_por_acreditar']:>13,.2f}")
lineas_activos.append("")
total_circ = estado['activo']['circulantes']['suma_activos_circulantes']
lineas_activos.append(f" Suma activos circulantes ${total_circ:>13,.2f}")
lineas_activos.append("")
lineas_activos.append(" No circulantes")
lineas_activos.append(f" Edificios ${estado['activo']['no_circulantes']['edificios']:>13,.2f}")
lineas_activos.append(f" Mobiliario ${estado['activo']['no_circulantes']['mobiliario']:>13,.2f}")
lineas_activos.append(f" Papelería ${estado['activo']['no_circulantes']['papeleria']:>13,.2f}")
lineas_activos.append(f" Cómputo ${estado['activo']['no_circulantes']['computo']:>13,.2f}")
lineas_activos.append(f" Rentas pagadas adelant. ${estado['activo']['no_circulantes']['rentas_pagadas_por_adelantado']:>11,.2f}")
lineas_activos.append("")
total_no_circ = estado['activo']['no_circulantes']['suma_activos_no_circulantes']
lineas_activos.append(f" Suma activos no circulantes ${total_no_circ:>13,.2f}")
lineas_activos.append("")
total_act = estado['activo']['suma_activos']
lineas_activos.append(f"Suma activos ${total_act:>13,.2f}")
# COLUMNA DERECHA - PASIVOS Y CAPITAL
lineas_pasivos.append("Pasivos")
lineas_pasivos.append("")
lineas_pasivos.append(" Corto Plazo")
lineas_pasivos.append(f" Acreedores ${estado['pasivos']['corto_plazo']['acreedores']:>13,.2f}")
lineas_pasivos.append(f" Documentos por pagar ${estado['pasivos']['corto_plazo']['documentos_por_pagar']:>13,.2f}")
lineas_pasivos.append(f" IVA Trasladable ${estado['pasivos']['corto_plazo']['iva_trasladado']:>13,.2f}")
lineas_pasivos.append("")
lineas_pasivos.append(" Anticipo Clientes")
lineas_pasivos.append(f" ${estado['pasivos']['corto_plazo']['anticipo_de_clientes']:>13,.2f}")
lineas_pasivos.append("")
lineas_pasivos.append(" Largo plazo")
lineas_pasivos.append("")
total_pas = estado['pasivos']['suma_pasivos']
lineas_pasivos.append(f"Suma pasivos ${total_pas:>13,.2f}")
lineas_pasivos.append("")
lineas_pasivos.append("Capital contable")
lineas_pasivos.append("")
lineas_pasivos.append(" contribuido")
total_cap = estado['capital_contable']['contribuido']['capital_social']
lineas_pasivos.append(f" Capital social ${total_cap:>13,.2f}")
lineas_pasivos.append("")
lineas_pasivos.append("")
total_pas_cap = total_pas + total_cap
lineas_pasivos.append(f"Total capital contable + Pasivos ${total_pas_cap:>13,.2f}")
# Mostrar lado a lado
print("\n")
max_lineas = max(len(lineas_activos), len(lineas_pasivos))
for i in range(max_lineas):
linea_izq = lineas_activos[i] if i < len(lineas_activos) else ""
linea_der = lineas_pasivos[i] if i < len(lineas_pasivos) else ""
# Ajustar ancho de la columna izquierda
print(f"{linea_izq:<{ancho_col}} {linea_der}")
# Verificar ecuación contable
diferencia = abs(total_act - total_pas_cap)
print("\n")
if diferencia < 0.01:
print("✓ ECUACIÓN CONTABLE BALANCEADA: Activo = Pasivo + Capital".center(100))
else:
print(f"⚠ ADVERTENCIA: Diferencia de ${diferencia:,.2f}".center(100))
# Pie de firma
print("\n")
print(" " * 20 + "_" * 30 + " " * 20 + "_" * 30)
print(" " * 20 + "PROPIETARIO" + " " * 32 + "SUPERVISÓ")
print(f"{estado['firmas']['propietario']:^52} {estado['firmas']['superviso']:^48}")
print("\n" + "="*100 + "\n")
def menu():
"""Menú principal de operaciones"""
conti = 'y'
while conti.lower() == 'y':
print("\n" + "="*50)
print("¿QUÉ OPERACIÓN DESEA HACER?")
print("="*50)
print("1. Compra en efectivo/contado")
print("2. Compra a crédito")
print("3. Compra combinada (contado + crédito)")
print("4. Anticipo de clientes")
print("5. Pago de rentas adelantadas")
print("6. Ver estado actual")
print("7. Guardar estado en CSV")
print("8. Salir")
try:
sel0 = int(input("\nElija una opción (1-8): ").strip())
match (sel0):
case 1:
compraEfectivo()
case 2:
compraACredito()
case 3:
compraCombinada()
case 4:
anticipoClientes()
case 5:
pagoRentasAdelantadas()
case 6:
mostrarEstado()
case 7:
guardarEstadoCSV()
case 8:
conti = 'n'
case _:
print("❌ Opción no válida, intente de nuevo")
continue
if sel0 != 8 and sel0 != 6:
conti = input("\n¿Desea realizar otra operación? (y/n): ").lower().strip()
except ValueError:
print("❌ Por favor ingrese un número válido")
# Programa principal
try:
with open(ruta, "r", encoding="utf-8") as estado_file:
print("✓ Archivo encontrado, leyendo...")
estado = json.load(estado_file)
estado_file.close()
menu()
except FileNotFoundError:
print("Archivo no encontrado, creando uno nuevo\n")
empresa = input("¿Cómo se llama su empresa?: ").strip()
empresario = input("¿Cómo se llama usted?: ").strip()
estado = {
"Empresa": empresa,
"Fecha": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"activo": {
"circulantes": {
"caja": 0.0,
"bancos": 0.0,
"inventarios": 0.0,
"iva_acreditado": 0.0,
"iva_por_acreditar": 0.0,
"suma_activos_circulantes": 0.0
},
"no_circulantes": {
"edificios": 0.0,
"mobiliario": 0.0,
"papeleria": 0.0,
"computo": 0.0,
"rentas_pagadas_por_adelantado": 0.0,
"suma_activos_no_circulantes": 0.0
},
"suma_activos": 0.0
},
"pasivos": {
"corto_plazo": {
"acreedores": 0.0,
"documentos_por_pagar": 0.0,
"anticipo_de_clientes": 0.0,
"iva_trasladado": 0.0
},
"largo_plazo": {},
"suma_pasivos": 0.0
},
"capital_contable": {
"contribuido": {
"capital_social": 0.0
}
},
"suma_pasivos_mas_capital_contable": 0.0,
"firmas": {
"propietario": empresario,
"superviso": "NGZ"
}
}
asientoApertura()
guardarEstado()
print("\n✓ Archivo creado y guardado exitosamente")
menu()