41 lines
2.4 KiB
Python
41 lines
2.4 KiB
Python
"""Read-only audit of fiscal-field semantics in C000025 (types, value distributions, comments)."""
|
|
import json, os, sys
|
|
from collections import Counter
|
|
from pathlib import Path
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(ROOT / "agent" / "src"))
|
|
from gti_fiscal_agent.firebird_reader import _connect # noqa: E402
|
|
|
|
FIELDS = ["CLASSIFICACAO_FISCAL","NCM","IPI","EX_TIPI","CEST","CFOP_ENTRADA","CFOP","CST_ENTRADA","CST","ALIQUOTA","CSOSN",
|
|
"COD_ENTRADA_PIS","COD_SAIDA_PIS","ALIQ_PIS","COD_ENTRADA_COFINS","COD_SAIDA_COFINS","ALIQ_COFINS","CST_IPI","ORIGEM","IAT","INCIDENCIA_PISCOFINS","IPPT"]
|
|
|
|
def load_env():
|
|
for line in (ROOT/".env").read_text(encoding="utf-8").splitlines():
|
|
if "=" in line and not line.startswith("#"):
|
|
k, _, v = line.partition("="); os.environ.setdefault(k.strip(), v.strip())
|
|
|
|
def main():
|
|
load_env()
|
|
conn = _connect(os.environ); cur = conn.cursor()
|
|
cur.execute("""SELECT rf.RDB$FIELD_NAME, f.RDB$FIELD_TYPE, f.RDB$FIELD_LENGTH, f.RDB$FIELD_PRECISION, f.RDB$FIELD_SCALE, f.RDB$CHARACTER_LENGTH, rf.RDB$DESCRIPTION, rf.RDB$DEFAULT_SOURCE
|
|
FROM RDB$RELATION_FIELDS rf JOIN RDB$FIELDS f ON rf.RDB$FIELD_SOURCE=f.RDB$FIELD_NAME WHERE rf.RDB$RELATION_NAME='C000025'""")
|
|
meta = {}
|
|
for r in cur.fetchall():
|
|
name = r[0].strip()
|
|
if name in FIELDS:
|
|
meta[name] = {"type_code": r[1], "len": r[5] or r[2], "precision": r[3], "scale": r[4], "comment": str(r[6]) if r[6] else None, "default": str(r[7]) if r[7] else None}
|
|
out = {}
|
|
for f in FIELDS:
|
|
if f not in meta:
|
|
out[f] = {"exists": False}; continue
|
|
cur.execute(f"SELECT {f}, COUNT(*) FROM C000025 GROUP BY {f}")
|
|
rows = sorted(((str(v).strip() if v is not None else None, c) for v, c in cur.fetchall()), key=lambda x: -x[1])
|
|
out[f] = {"exists": True, **meta[f], "distinct": len(rows), "top": rows[:12]}
|
|
# relations that may hold context (company/tax config), names only
|
|
cur.execute("SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0 AND (RDB$RELATION_NAME LIKE '%EMPRESA%' OR RDB$RELATION_NAME LIKE '%CFOP%' OR RDB$RELATION_NAME LIKE '%TRIB%' OR RDB$RELATION_NAME LIKE '%ICMS%' OR RDB$RELATION_NAME LIKE '%CST%' OR RDB$RELATION_NAME LIKE '%NATUREZA%')")
|
|
out["_related_tables"] = [r[0].strip() for r in cur.fetchall()]
|
|
conn.close()
|
|
print(json.dumps(out, ensure_ascii=False, indent=1, default=str))
|
|
|
|
main()
|