Firmele si lunile nu mai sunt hardcodate. extrage.py dispecerizeaza catre cele trei cititoare (pdf / xlsx / fdb, dedus din extensie, extensie necunoscuta = eroare) si scrie contractul intern; genereaza.py aplica maparea si scrie init_<FIRMA>_<an>_<luna>.xlsx plus mapare_<FIRMA>.xlsx. genereaza_xlsx.py devine biblioteca: an/luna parametri, data si scadenta calculate din ele, sablonul cautat langa script. Cand exista parteneri_ si facturi_ (drumul FDB) se emite cate un FACTURA per document, cu cod fiscal real, si numai daca suma documentelor da netul contului; altfel ramane comportamentul de azi, un FACTURA agregat. Corectat in orchestrare: la redenumirea unui cont cu parteneri, generatorul lua primul analitic ca sa afle contul sintetic. Daca analiticele erau mapate pe conturi diferite, BALANTA agregat si randurile FACTURA cadeau pe conturi diferite, tacut. Acum se opreste cu eroare; colapsarea pe acelasi cont ramane legala. Doua teste acopera ambele cazuri. 29 de teste trec, inclusiv regresia pe etalon cu generatorul modificat. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
"""Punct de intrare: de la sursa (PDF / foaie SAGA / Firebird) la contractul intern.
|
|
|
|
Dispecerizeaza catre cititoarele existente, fara sa le dubleze logica:
|
|
pdf -> extract_balanta.parse_pdf (raportul tiparit SAGA)
|
|
xlsx -> citire_xlsx.citeste_balanta (.xls / .xlsx SAGA)
|
|
fdb -> citire_fdb.produce (copia unei baze CONT_BAZA.FDB)
|
|
|
|
Scrie balanta_<FIRMA>.csv si, pe drumul fdb, parteneri_<FIRMA>.csv si
|
|
facturi_<FIRMA>.csv. Daca --sursa lipseste, se deduce din extensie; o extensie
|
|
necunoscuta da eroare, nu ghicit.
|
|
|
|
Utilizare:
|
|
py extrage.py --sursa pdf --fisier "<balanta.pdf>" --firma FIRMA --an 2025 --luna 12
|
|
py extrage.py --sursa xlsx --fisier "<balanta.xlsx>" --firma FIRMA --an 2026 --luna 9
|
|
py extrage.py --sursa fdb --fisier "<copie CONT_BAZA.FDB>" --firma FIRMA --an 2026 --luna 9
|
|
"""
|
|
|
|
import argparse
|
|
import os
|
|
|
|
import citire_fdb
|
|
import citire_xlsx
|
|
import extract_balanta
|
|
|
|
SURSE_DUPA_EXTENSIE = {
|
|
".pdf": "pdf",
|
|
".xls": "xlsx",
|
|
".xlsx": "xlsx",
|
|
".fdb": "fdb",
|
|
}
|
|
|
|
|
|
def deduce_sursa(fisier):
|
|
ext = os.path.splitext(fisier)[1].lower()
|
|
sursa = SURSE_DUPA_EXTENSIE.get(ext)
|
|
if sursa is None:
|
|
raise SystemExit(
|
|
"extensie necunoscuta pentru %s: %r (astept .pdf, .xls/.xlsx sau .fdb)"
|
|
% (fisier, ext))
|
|
return sursa
|
|
|
|
|
|
def extrage_pdf(fisier, cale):
|
|
rows = extract_balanta.parse_pdf(fisier)
|
|
citire_xlsx.scrie_csv(rows, cale)
|
|
return len(rows)
|
|
|
|
|
|
def extrage_xlsx(fisier, cale):
|
|
rows = citire_xlsx.citeste_balanta(fisier)
|
|
citire_xlsx.scrie_csv(rows, cale)
|
|
return len(rows)
|
|
|
|
|
|
def extrage_fdb(fisier, firma, an, luna, dir_iesire):
|
|
if an is None or luna is None:
|
|
raise SystemExit("--sursa fdb cere --an si --luna")
|
|
rez = citire_fdb.produce(fisier, firma, an, luna, dir_iesire)
|
|
return len(rez["balanta"])
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument("--sursa", choices=("pdf", "xlsx", "fdb"),
|
|
help="lipsa = dedusa din extensia --fisier")
|
|
parser.add_argument("--fisier", required=True)
|
|
parser.add_argument("--firma", required=True)
|
|
parser.add_argument("--an", type=int)
|
|
parser.add_argument("--luna", type=int)
|
|
parser.add_argument("--dir", default=".", help="directorul de iesire")
|
|
a = parser.parse_args()
|
|
|
|
sursa = a.sursa or deduce_sursa(a.fisier)
|
|
os.makedirs(a.dir, exist_ok=True)
|
|
|
|
if sursa == "fdb":
|
|
n = extrage_fdb(a.fisier, a.firma, a.an, a.luna, a.dir)
|
|
else:
|
|
cale = os.path.join(a.dir, "balanta_%s.csv" % a.firma)
|
|
n = extrage_pdf(a.fisier, cale) if sursa == "pdf" \
|
|
else extrage_xlsx(a.fisier, cale)
|
|
print("scris balanta_%s.csv: %d randuri (sursa %s)" % (a.firma, n, sursa))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|