Refactor boot process and error handling; simplify library path setup and enhance number formatting functions. Archivo: parrafos_dinamicos_forma_pago.py

This commit is contained in:
mabejoyb
2026-05-18 12:44:32 -03:00
parent 33cbdd36b8
commit 4af511d016

View File

@@ -9,27 +9,11 @@ import unicodedata
import datetime as dt import datetime as dt
from decimal import Decimal, InvalidOperation from decimal import Decimal, InvalidOperation
def _rb_set_early(name, value):
try:
SetVar(name, value)
except Exception:
pass
# -------------------- # --------------------
# Boot libs (Rocketbot portable) # Boot libs (Rocketbot portable)
# -------------------- # --------------------
_rb_set_early("gdoc_textos_status", "BOOTING")
try:
base_dir = os.path.dirname(sys.executable) base_dir = os.path.dirname(sys.executable)
libs_candidates = [ libs_dir = os.path.join(base_dir, "py_libs", "py310")
os.path.join(base_dir, "py_libs", "py310"),
os.path.join(base_dir, "librerias", "py_libs", "py310"),
os.path.join(os.getcwd(), "librerias", "py_libs", "py310"),
]
for libs_dir in libs_candidates:
if os.path.isdir(libs_dir) and libs_dir not in sys.path:
sys.path.insert(0, libs_dir) sys.path.insert(0, libs_dir)
for k in list(sys.modules.keys()): for k in list(sys.modules.keys()):
@@ -39,11 +23,6 @@ try:
from googleapiclient.discovery import build from googleapiclient.discovery import build
from googleapiclient.errors import HttpError from googleapiclient.errors import HttpError
from google.oauth2 import service_account from google.oauth2 import service_account
except Exception as e:
_rb_set_early("gdoc_textos_status", "ERROR")
_rb_set_early("gdoc_textos_error", "BOOT_IMPORT: " + repr(e))
print("BOOT_IMPORT error:", repr(e))
raise
# ----------------------------------------------------------- # -----------------------------------------------------------
@@ -113,12 +92,21 @@ def _normalizar_numero(valor) -> str:
if "," in s: if "," in s:
parts = s.split(',') parts = s.split(',')
if len(parts) == 2 and len(parts[1]) == 3 and parts[0].replace('-', '').isdigit():
return "".join(parts)
if len(parts) > 2 and all(len(p) == 3 for p in parts[1:]):
return "".join(parts)
if len(parts) > 2: if len(parts) > 2:
return "".join(parts[:-1]) + "." + parts[-1] return "".join(parts[:-1]) + "." + parts[-1]
return s.replace(',', '.') return s.replace(',', '.')
if s.count('.') > 1: if "." in s:
parts = s.split('.') parts = s.split('.')
if len(parts) == 2 and len(parts[1]) == 3 and parts[0].replace('-', '').isdigit():
return "".join(parts)
if len(parts) > 2 and all(len(p) == 3 for p in parts[1:]):
return "".join(parts)
if len(parts) > 2:
return "".join(parts[:-1]) + "." + parts[-1] return "".join(parts[:-1]) + "." + parts[-1]
return s return s
@@ -161,7 +149,7 @@ def numero_decimal_a_palabras_es(valor, max_decimales=2) -> str:
def numero_a_letras_es(valor, max_decimales=2) -> str: def numero_a_letras_es(valor, max_decimales=2) -> str:
return numero_decimal_a_palabras_es(valor, max_decimales=max_decimales) return numero_decimal_a_palabras_es(valor, max_decimales=max_decimales)
def cantidad_a_letras_con_moneda(valor, max_decimales=2, moneda_prefix="DOLARES AMERICANOS") -> str: def cantidad_a_letras_con_moneda(valor, max_decimales=0, moneda_prefix="DOLARES AMERICANOS") -> str:
s = numero_decimal_a_palabras_es(valor, max_decimales=max_decimales) s = numero_decimal_a_palabras_es(valor, max_decimales=max_decimales)
if not s or s.strip() == "": if not s or s.strip() == "":
return "" return ""
@@ -258,26 +246,34 @@ def _to_int(v) -> int:
return 0 return 0
def _format_money_es(v) -> str: def _format_money_es(v) -> str:
d = _to_decimal_money(v) from decimal import ROUND_HALF_UP
s = f"{d:,.2f}" d = _to_decimal_money(v).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
return s.replace(",", "X").replace(".", ",").replace("X", ".") s = f"{d:,.0f}"
return s.replace(",", ".")
def _money_amount_display(v) -> str: def _money_amount_display(v) -> str:
from decimal import ROUND_HALF_UP
s = _normalizar_numero(v) s = _normalizar_numero(v)
if s == "": if s == "":
return "0,00" return "0"
try: try:
d = Decimal(s) d = Decimal(s).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
except Exception: except Exception:
return _format_money_es(v) return _format_money_es(v)
s2 = f"{d:,.2f}" s2 = f"{d:,.0f}"
return s2.replace(",", "X").replace(".", ",").replace("X", ".") return s2.replace(",", ".")
def _raw_or_money_text(v) -> str: def _raw_or_money_text(v) -> str:
s = str(v or "").strip() s = str(v or "").strip()
if s != "" and s != "ERROR_NOT_VAR" and s.lower() != "none": if s == "" or s == "ERROR_NOT_VAR" or s.lower() == "none":
return s return "0"
return _format_money_es(v) return _money_amount_display(v)
def _sanitize_usd_amounts_in_text(text: str) -> str:
s = str(text or "")
def _repl(m):
return f"USD. {_money_amount_display(m.group(1))}"
return re.sub(r"USD\.\s*([0-9][0-9\.,]*)", _repl, s)
def _first_non_empty(*values): def _first_non_empty(*values):
for v in values: for v in values:
@@ -383,7 +379,7 @@ def _money_text_and_letters(raw_value, raw_letters=""):
txt = _raw_or_money_text(raw_value) txt = _raw_or_money_text(raw_value)
letters = str(raw_letters or "").strip() letters = str(raw_letters or "").strip()
if letters == "": if letters == "":
letters = cantidad_a_letras_con_moneda(raw_value, max_decimales=2) letters = cantidad_a_letras_con_moneda(raw_value, max_decimales=0)
return txt, letters return txt, letters
def _build_cuotas_pre_paragraphs(cuotas_pre, base_label="a", sep_line="--------------------------------------------------------", nl="\n"): def _build_cuotas_pre_paragraphs(cuotas_pre, base_label="a", sep_line="--------------------------------------------------------", nl="\n"):
@@ -406,7 +402,7 @@ def _build_cuotas_pre_paragraphs(cuotas_pre, base_label="a", sep_line="---------
amount_txt = _raw_or_money_text(amount_raw) amount_txt = _raw_or_money_text(amount_raw)
amount_letras = _first_non_empty( amount_letras = _first_non_empty(
_safe_dict_get(cuota, "amount_letras", ""), _safe_dict_get(cuota, "amount_letras", ""),
cantidad_a_letras_con_moneda(amount_raw, max_decimales=2) cantidad_a_letras_con_moneda(amount_raw, max_decimales=0)
) )
frequency = str(_safe_dict_get(cuota, "frequency", "") or "").lower() frequency = str(_safe_dict_get(cuota, "frequency", "") or "").lower()
fecha_txt = _date_text_long(_safe_dict_get(cuota, "date", "")) fecha_txt = _date_text_long(_safe_dict_get(cuota, "date", ""))
@@ -436,7 +432,7 @@ def _build_cuotas_post_paragraphs(cuotas_post, base_label="a", sep_line="-------
amount_txt = _raw_or_money_text(amount_raw) amount_txt = _raw_or_money_text(amount_raw)
amount_letras = _first_non_empty( amount_letras = _first_non_empty(
_safe_dict_get(cuota, "amount_letras", ""), _safe_dict_get(cuota, "amount_letras", ""),
cantidad_a_letras_con_moneda(amount_raw, max_decimales=2) cantidad_a_letras_con_moneda(amount_raw, max_decimales=0)
) )
frequency = str(_safe_dict_get(cuota, "frequency", "") or "").lower() frequency = str(_safe_dict_get(cuota, "frequency", "") or "").lower()
fecha_txt = _date_text_long(_safe_dict_get(cuota, "date", "")) fecha_txt = _date_text_long(_safe_dict_get(cuota, "date", ""))
@@ -460,7 +456,7 @@ def _build_refuerzos_pre_paragraphs(refuerzos_pre, sep_line="-------------------
refuerzo_monto_txt = _money_amount_display(refuerzo_monto_raw) refuerzo_monto_txt = _money_amount_display(refuerzo_monto_raw)
refuerzo_letras = _first_non_empty( refuerzo_letras = _first_non_empty(
_safe_dict_get(refuerzo, "amount_letras", ""), _safe_dict_get(refuerzo, "amount_letras", ""),
cantidad_a_letras_con_moneda(refuerzo_monto_raw, max_decimales=2) cantidad_a_letras_con_moneda(refuerzo_monto_raw, max_decimales=0)
) )
fecha_txt = _date_text_long(_safe_dict_get(refuerzo, "date", "")) fecha_txt = _date_text_long(_safe_dict_get(refuerzo, "date", ""))
parts.append( parts.append(
@@ -479,7 +475,7 @@ def _build_refuerzos_post_paragraphs(refuerzos_post, sep_line="-----------------
refuerzo_monto_txt = _money_amount_display(refuerzo_monto_raw) refuerzo_monto_txt = _money_amount_display(refuerzo_monto_raw)
refuerzo_letras = _first_non_empty( refuerzo_letras = _first_non_empty(
_safe_dict_get(refuerzo, "amount_letras", ""), _safe_dict_get(refuerzo, "amount_letras", ""),
cantidad_a_letras_con_moneda(refuerzo_monto_raw, max_decimales=2) cantidad_a_letras_con_moneda(refuerzo_monto_raw, max_decimales=0)
) )
fecha_txt = _date_text_long(_safe_dict_get(refuerzo, "date", "")) fecha_txt = _date_text_long(_safe_dict_get(refuerzo, "date", ""))
parts.append( parts.append(
@@ -557,6 +553,7 @@ def get_services(credentials_json_path, impersonated_user):
drive = build("drive", "v3", credentials=creds, cache_discovery=False) drive = build("drive", "v3", credentials=creds, cache_discovery=False)
return docs, drive, "service_account_impersonated" return docs, drive, "service_account_impersonated"
# ----------------------------------------------------------- # -----------------------------------------------------------
# DRIVE / DOC HELPERS # DRIVE / DOC HELPERS
# ----------------------------------------------------------- # -----------------------------------------------------------
@@ -934,10 +931,6 @@ globals().update(locals())
# MAIN # MAIN
# ----------------------------------------------------------- # -----------------------------------------------------------
try: try:
_sv("gdoc_textos_status", "STARTED")
_sv("gdoc_textos_error", "")
print("parrafos_dinamicos_forma_pago.py STARTED")
NL = "\n" NL = "\n"
# usar SOLO current_url # usar SOLO current_url
@@ -963,7 +956,7 @@ try:
cred_path = os.path.join(base_dir, cred_path) cred_path = os.path.join(base_dir, cred_path)
if not os.path.exists(cred_path): if not os.path.exists(cred_path):
raise RuntimeError("No existe JSON de cuenta de servicio: " + cred_path) raise RuntimeError("No existe credentials.json: " + cred_path)
impersonated_user = _gvs("gdoc_impersonated_user", "") impersonated_user = _gvs("gdoc_impersonated_user", "")
@@ -1099,7 +1092,7 @@ try:
) )
# valor financiado con interés incluído # valor financiado con interés incluído
valor_total_compra_financiado = _to_decimal_money(_gvs("valor_total_compra_financiado", "0")) valor_total_compra_financiado = _raw_or_money_text(_gvs("valor_total_compra_financiado", ""))
valor_total_letras_financiado = _first_non_empty( valor_total_letras_financiado = _first_non_empty(
_gvs("valor_total_letras_financiado", ""), _gvs("valor_total_letras_financiado", ""),
cantidad_a_letras_con_moneda(_gvs("valor_total_compra_financiado", "0")) cantidad_a_letras_con_moneda(_gvs("valor_total_compra_financiado", "0"))
@@ -1210,7 +1203,7 @@ try:
saldo_a_pagar_raw = _gvs("saldo_a_pagar", "") saldo_a_pagar_raw = _gvs("saldo_a_pagar", "")
saldo_a_pagar = _raw_or_money_text(saldo_a_pagar_raw) saldo_a_pagar = _raw_or_money_text(saldo_a_pagar_raw)
saldo_letras = cantidad_a_letras_con_moneda(saldo_a_pagar_raw, max_decimales=2) saldo_letras = cantidad_a_letras_con_moneda(saldo_a_pagar_raw, max_decimales=0)
num_pre_cuotas_fallback = _to_int(_gvs("num_pre_cuotas", "0")) num_pre_cuotas_fallback = _to_int(_gvs("num_pre_cuotas", "0"))
@@ -1250,7 +1243,7 @@ try:
pre_amount = _raw_or_money_text(pre_amount_raw) pre_amount = _raw_or_money_text(pre_amount_raw)
pre_amount_letras = _first_non_empty( pre_amount_letras = _first_non_empty(
_safe_dict_get(primer_pre, "amount_letras", ""), _safe_dict_get(primer_pre, "amount_letras", ""),
cantidad_a_letras_con_moneda(pre_amount_raw, max_decimales=2) cantidad_a_letras_con_moneda(pre_amount_raw, max_decimales=0)
) )
frecuencia_pre = str(_safe_dict_get(primer_pre, "frequency", "") or "").lower() frecuencia_pre = str(_safe_dict_get(primer_pre, "frequency", "") or "").lower()
@@ -1258,7 +1251,7 @@ try:
pos_cuota_monto = _raw_or_money_text(pos_amount_raw) pos_cuota_monto = _raw_or_money_text(pos_amount_raw)
pos_cuota_letras = _first_non_empty( pos_cuota_letras = _first_non_empty(
_safe_dict_get(primer_pos, "amount_letras", ""), _safe_dict_get(primer_pos, "amount_letras", ""),
cantidad_a_letras_con_moneda(pos_amount_raw, max_decimales=2) cantidad_a_letras_con_moneda(pos_amount_raw, max_decimales=0)
) )
frecuencia_pos = str(_safe_dict_get(primer_pos, "frequency", "") or "").lower() frecuencia_pos = str(_safe_dict_get(primer_pos, "frequency", "") or "").lower()
@@ -1789,6 +1782,10 @@ try:
# -------------------- # --------------------
# REEMPLAZAR MARCADORES # REEMPLAZAR MARCADORES
# -------------------- # --------------------
_sv("debug_script_version", "v4_sanitize_usd_final")
texto_precio = _sanitize_usd_amounts_in_text(texto_precio)
texto_fp = _sanitize_usd_amounts_in_text(texto_fp)
precio_insert_info = replace_marker_by_index( precio_insert_info = replace_marker_by_index(
docs_service=docs_service, docs_service=docs_service,
doc_id=doc_id, doc_id=doc_id,
@@ -1833,12 +1830,9 @@ try:
except HttpError as e: except HttpError as e:
_sv("gdoc_textos_status", "ERROR") _sv("gdoc_textos_status", "ERROR")
_sv("gdoc_textos_error", "HttpError: " + str(e)) _sv("gdoc_textos_error", "HttpError: " + str(e))
_sv("gdoc_textos_traceback", "HttpError: " + str(e))
raise raise
except Exception as e: except Exception as e:
import traceback
_sv("gdoc_textos_status", "ERROR") _sv("gdoc_textos_status", "ERROR")
_sv("gdoc_textos_error", str(e)) _sv("gdoc_textos_error", str(e))
_sv("gdoc_textos_traceback", traceback.format_exc())
raise raise