- OCR client for SQLite queue - WhatsApp flow: PDF -> OCR -> SQLite -> Oracle - PACK_CONTAFIN integration for Oracle save - README with flux documentation
187 lines
5.8 KiB
Python
187 lines
5.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Script pentru salvare note contabile în Oracle din date OCR.
|
|
"""
|
|
import sys
|
|
sys.path.insert(0, "/workspace/roa2web")
|
|
|
|
import oracledb
|
|
from datetime import datetime
|
|
from decimal import Decimal
|
|
|
|
ORACLE_CONFIG = {
|
|
"user": "CONTAFIN_ORACLE",
|
|
"password": "ROMFASTSOFT",
|
|
"dsn": "10.0.20.121:1521/ROA"
|
|
}
|
|
|
|
def get_partner_id(cursor, cui: str) -> int:
|
|
"""Găsește partener după CUI."""
|
|
cui_clean = cui.upper().replace("RO", "").strip()
|
|
|
|
cursor.execute(
|
|
"SELECT ID_PART FROM MARIUSM_AUTO.NOM_PARTENERI WHERE COD_FISCAL = :cui",
|
|
cui=cui_clean
|
|
)
|
|
row = cursor.fetchone()
|
|
if row:
|
|
print(f" Partner găsit: ID={row[0]} pentru CUI={cui_clean}")
|
|
return row[0]
|
|
|
|
# Încearcă și cu RO prefix
|
|
cursor.execute(
|
|
"SELECT ID_PART FROM MARIUSM_AUTO.NOM_PARTENERI WHERE COD_FISCAL = :cui",
|
|
cui="RO" + cui_clean
|
|
)
|
|
row = cursor.fetchone()
|
|
if row:
|
|
print(f" Partner găsit: ID={row[0]} pentru CUI=RO{cui_clean}")
|
|
return row[0]
|
|
|
|
print(f" ⚠️ Partner NU găsit pentru CUI {cui_clean}, folosim ID=0")
|
|
return 0
|
|
|
|
def save_bon_achizitie(
|
|
cursor,
|
|
receipt_date: datetime,
|
|
receipt_number: str,
|
|
amount: Decimal,
|
|
tva_amount: Decimal,
|
|
partner_cui: str,
|
|
partner_name: str,
|
|
cont_cheltuiala: str = "6028",
|
|
explicatie: str = "Import OCR"
|
|
):
|
|
"""
|
|
Salvează bon fiscal în ACT_TEMP.
|
|
Notă: NU apelează PACK_CONTAFIN - doar inserează în staging.
|
|
"""
|
|
an = receipt_date.year
|
|
luna = receipt_date.month
|
|
|
|
# Generează cod unic
|
|
cursor.execute("SELECT NVL(MAX(COD), 0) + 1 FROM MARIUSM_AUTO.ACT WHERE AN = :an AND LUNA = :luna", an=an, luna=luna)
|
|
cod = cursor.fetchone()[0]
|
|
|
|
id_part = get_partner_id(cursor, partner_cui)
|
|
|
|
total_cu_tva = float(amount)
|
|
total_fara_tva = float(amount - tva_amount)
|
|
tva = float(tva_amount)
|
|
nract = int(receipt_number) if receipt_number and receipt_number.isdigit() else 0
|
|
|
|
print(f"\nNote contabile (COD={cod}):")
|
|
print(f" Data: {receipt_date.date()}, Nr: {nract}")
|
|
print(f" Fără TVA: {total_fara_tva:.2f}, TVA: {tva:.2f}, Total: {total_cu_tva:.2f}")
|
|
|
|
# LINIA 1: Cheltuială = Furnizor
|
|
cursor.execute("""
|
|
INSERT INTO MARIUSM_AUTO.ACT_TEMP (
|
|
LUNA, AN, COD, DATAIREG, DATAACT, NRACT,
|
|
EXPLICATIA, SCD, SCC, SUMA, ID_PARTC, ID_UTIL, DATAORA
|
|
) VALUES (
|
|
:luna, :an, :cod, TRUNC(SYSDATE), :dataact, :nract,
|
|
:expl, :scd, :scc, :suma, :id_part, 0, SYSDATE
|
|
)
|
|
""",
|
|
luna=luna, an=an, cod=cod,
|
|
dataact=receipt_date.date(), nract=nract,
|
|
expl=f"{explicatie} - {partner_name}",
|
|
scd=cont_cheltuiala, scc="401", suma=total_fara_tva, id_part=id_part
|
|
)
|
|
print(f" ✓ {cont_cheltuiala} = 401: {total_fara_tva:.2f}")
|
|
|
|
# LINIA 2: TVA = Furnizor
|
|
if tva > 0:
|
|
cursor.execute("""
|
|
INSERT INTO MARIUSM_AUTO.ACT_TEMP (
|
|
LUNA, AN, COD, DATAIREG, DATAACT, NRACT,
|
|
EXPLICATIA, SCD, SCC, SUMA, PROC_TVA, ID_PARTC, ID_UTIL, DATAORA
|
|
) VALUES (
|
|
:luna, :an, :cod, TRUNC(SYSDATE), :dataact, :nract,
|
|
:expl, :scd, :scc, :suma, :proc_tva, :id_part, 0, SYSDATE
|
|
)
|
|
""",
|
|
luna=luna, an=an, cod=cod,
|
|
dataact=receipt_date.date(), nract=nract,
|
|
expl=f"TVA {explicatie}",
|
|
scd="4426", scc="401", suma=tva, proc_tva=1.19, id_part=id_part
|
|
)
|
|
print(f" ✓ 4426 = 401: {tva:.2f}")
|
|
|
|
# LINIA 3: Furnizor = Casă
|
|
cursor.execute("""
|
|
INSERT INTO MARIUSM_AUTO.ACT_TEMP (
|
|
LUNA, AN, COD, DATAIREG, DATAACT, NRACT,
|
|
EXPLICATIA, SCD, SCC, SUMA, ID_PARTD, ID_UTIL, DATAORA
|
|
) VALUES (
|
|
:luna, :an, :cod, TRUNC(SYSDATE), :dataact, :nract,
|
|
:expl, :scd, :scc, :suma, :id_part, 0, SYSDATE
|
|
)
|
|
""",
|
|
luna=luna, an=an, cod=cod,
|
|
dataact=receipt_date.date(), nract=nract,
|
|
expl=f"Plata {explicatie}",
|
|
scd="401", scc="5311", suma=total_cu_tva, id_part=id_part
|
|
)
|
|
print(f" ✓ 401 = 5311: {total_cu_tva:.2f}")
|
|
|
|
return cod
|
|
|
|
def test_insert():
|
|
"""Test inserare în ACT_TEMP."""
|
|
print("="*50)
|
|
print("TEST: Salvare note contabile în Oracle")
|
|
print("="*50)
|
|
print("\nConectare la Oracle TEST...")
|
|
|
|
conn = oracledb.connect(**ORACLE_CONFIG)
|
|
cursor = conn.cursor()
|
|
print("Conexiune OK!")
|
|
|
|
# Date de test din OCR
|
|
receipt_date = datetime(2024, 8, 1)
|
|
receipt_number = "1200302"
|
|
amount = Decimal("263.28")
|
|
tva_amount = Decimal("42.04")
|
|
partner_cui = "RO11201891"
|
|
partner_name = "Benzinărie Test"
|
|
|
|
try:
|
|
cod = save_bon_achizitie(
|
|
cursor,
|
|
receipt_date=receipt_date,
|
|
receipt_number=receipt_number,
|
|
amount=amount,
|
|
tva_amount=tva_amount,
|
|
partner_cui=partner_cui,
|
|
partner_name=partner_name,
|
|
cont_cheltuiala="6022",
|
|
explicatie=f"Bon benzină {receipt_number}"
|
|
)
|
|
|
|
# Verificare
|
|
cursor.execute("SELECT SCD, SCC, SUMA FROM MARIUSM_AUTO.ACT_TEMP WHERE COD = :cod ORDER BY ROWID", cod=cod)
|
|
print(f"\nVerificare ACT_TEMP (COD={cod}):")
|
|
for row in cursor:
|
|
print(f" {row[0]} = {row[1]}: {row[2]:.2f}")
|
|
|
|
# ROLLBACK - doar test
|
|
print("\n⚠️ ROLLBACK (test only)")
|
|
conn.rollback()
|
|
|
|
print("\n" + "="*50)
|
|
print("✅ TEST REUȘIT!")
|
|
print("="*50)
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ EROARE: {e}")
|
|
conn.rollback()
|
|
raise
|
|
finally:
|
|
cursor.close()
|
|
conn.close()
|
|
|
|
if __name__ == "__main__":
|
|
test_insert()
|