PocketAccountant / scripts /demo_ledger.py
eldinosaur's picture
PocketAccountant: custom ledger UI + deterministic agent (engine, ledger, retrieval, classifier)
c55ab5e verified
Raw
History Blame Contribute Delete
2.82 kB
"""End-to-end: book a freelancer's month into the ledger, then let the engine read
the real aggregates and compute what's owed. No model — just storage + math.
Run from the project root: python -m scripts.demo_ledger
"""
import sys
try:
sys.stdout.reconfigure(encoding="utf-8")
except (AttributeError, ValueError):
pass
from src.engine import (
isr_provisional_monthly,
iva_monthly,
profit_margin,
resico_isr_monthly,
taxable_base,
)
from src.ledger import Ledger
def rule(title):
print("\n" + "═" * 64 + f"\n{title}\n" + "═" * 64)
def main():
lg = Ledger(":memory:") # in real use: data/user/ledger.db
# --- A month of activity for a freelance designer (May 2024) ----------
lg.record_income("2024-05-03", "Branding — Café Luna", 18000, iva_rate="0.16")
lg.record_income("2024-05-17", "Sitio web — Dental MX", 27000, iva_rate="0.16",
isr_retenido="2700", iva_retenido="2880") # invoiced a persona moral
lg.record_expense("2024-05-05", "Adobe Creative Cloud", 1300, iva_rate="0.16")
lg.record_expense("2024-05-12", "Renta de oficina (parte)", 4000, iva_rate="0.16")
lg.record_expense("2024-05-22", "Comida no deducible", 600, iva_rate="0.16",
deductible=False)
rule("LEDGER · May 2024 — what got booked")
m = lg.month_totals(2024, 5)
print(f"Income (CFDI-backed): {m.income}")
print(f"Deductible expenses: {m.deductible_expenses}")
print(f"Non-deductible expenses: {m.nondeductible_expenses}")
print(f"IVA trasladado (cobrado): {m.iva_trasladado}")
print(f"IVA acreditable (pagado): {m.iva_acreditable}")
print(f"IVA retenido by clients: {m.iva_retenido}")
print(f"ISR retenido by clients: {m.isr_retenido}")
rule("TAXES · computed from the real ledger (RESICO vs general)")
print(resico_isr_monthly(m.income).explain())
print()
base = taxable_base(m.income, m.deductible_expenses)
print(f"General-regime taxable base = {m.income}{m.deductible_expenses} = {base}")
print(isr_provisional_monthly(base).explain())
print()
print(iva_monthly(m.iva_trasladado, m.iva_acreditable, m.iva_retenido).explain())
rule("STATEMENTS")
s = lg.income_statement(2024, 5)
print(f"Income statement {s.period}: revenue {s.revenue} − expenses {s.expenses} "
f"= net {s.net_profit}")
print(profit_margin(s.net_profit, s.revenue).explain())
bs = lg.balance_sheet("2024-05-31")
print(f"Balance sheet @ {bs.as_of}: assets {bs.assets} = liabilities "
f"{bs.liabilities} + equity {bs.equity}")
lg.close()
print("\nThe books balance, and every tax figure was derived from booked "
"transactions — not typed in by hand.")
if __name__ == "__main__":
main()