agrego script encargado de darle formato de miles a los valores numéricos
This commit is contained in:
196
formato_numerico_a_miles.py
Normal file
196
formato_numerico_a_miles.py
Normal file
@@ -0,0 +1,196 @@
|
||||
def main():
|
||||
from decimal import Decimal, InvalidOperation
|
||||
import re, json, ast
|
||||
|
||||
# ---- Rocketbot GetVar/SetVar wrappers ----
|
||||
def rb_get(name):
|
||||
try:
|
||||
return GetVar(name)
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def rb_set(name, value):
|
||||
try:
|
||||
SetVar(name, value)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# ---- helpers ----
|
||||
def is_empty(v):
|
||||
if v is None:
|
||||
return True
|
||||
if isinstance(v, str):
|
||||
s = v.strip().lower()
|
||||
return s == "" or s in ("none", "null", "nan", "undefined")
|
||||
return False
|
||||
|
||||
def fmt_es_money(value, decimals=2):
|
||||
# self-contained (no depende de otra func global)
|
||||
if is_empty(value):
|
||||
return None
|
||||
|
||||
if isinstance(value, (int, float, Decimal)):
|
||||
d = Decimal(str(value))
|
||||
else:
|
||||
s = str(value).strip()
|
||||
s = re.sub(r"[^0-9,.\-]", "", s)
|
||||
if is_empty(s):
|
||||
return None
|
||||
|
||||
# soporta "30.000,00" -> 30000.00
|
||||
if "." in s and "," in s:
|
||||
s = s.replace(".", "").replace(",", ".")
|
||||
elif "," in s and "." not in s:
|
||||
s = s.replace(",", ".")
|
||||
|
||||
try:
|
||||
d = Decimal(s)
|
||||
except InvalidOperation:
|
||||
return None
|
||||
|
||||
q = Decimal("1." + ("0" * decimals))
|
||||
d = d.quantize(q)
|
||||
|
||||
us = f"{d:,.{decimals}f}" # 30,000.00
|
||||
return us.replace(",", "X").replace(".", ",").replace("X", ".") # 30.000,00
|
||||
|
||||
def parse_container(raw):
|
||||
"""
|
||||
Soporta:
|
||||
- JSON string (dobles comillas)
|
||||
- Python literal string (comillas simples)
|
||||
- dict/list nativo (raro)
|
||||
Retorna (obj, kind) donde kind: 'json' | 'py' | None
|
||||
"""
|
||||
if is_empty(raw):
|
||||
return None, None
|
||||
|
||||
if isinstance(raw, (dict, list)):
|
||||
return raw, "py"
|
||||
|
||||
if not isinstance(raw, str):
|
||||
return None, None
|
||||
|
||||
txt = raw.strip()
|
||||
|
||||
# JSON
|
||||
try:
|
||||
obj = json.loads(txt)
|
||||
if isinstance(obj, (dict, list)):
|
||||
return obj, "json"
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Python literal
|
||||
try:
|
||||
obj = ast.literal_eval(txt)
|
||||
if isinstance(obj, (dict, list)):
|
||||
return obj, "py"
|
||||
except Exception:
|
||||
return None, None
|
||||
|
||||
return None, None
|
||||
|
||||
def serialize_container(obj, kind):
|
||||
if kind == "json":
|
||||
return json.dumps(obj, ensure_ascii=False)
|
||||
return repr(obj) # kind == "py"
|
||||
|
||||
def format_amount_in_obj(obj):
|
||||
# Formatea amount in-place para dict o list[dict]
|
||||
if isinstance(obj, dict):
|
||||
if "amount" in obj and not is_empty(obj.get("amount")):
|
||||
f = fmt_es_money(obj.get("amount"), 2)
|
||||
if f is not None:
|
||||
obj["amount"] = f
|
||||
return
|
||||
|
||||
if isinstance(obj, list):
|
||||
for it in obj:
|
||||
if isinstance(it, dict) and "amount" in it and not is_empty(it.get("amount")):
|
||||
f = fmt_es_money(it.get("amount"), 2)
|
||||
if f is not None:
|
||||
it["amount"] = f
|
||||
|
||||
def extract_amounts(obj):
|
||||
# Devuelve lista de amounts (ya formateados) desde dict o list
|
||||
res = []
|
||||
if isinstance(obj, dict):
|
||||
if "amount" in obj and not is_empty(obj.get("amount")):
|
||||
res.append(str(obj.get("amount")))
|
||||
return res
|
||||
|
||||
if isinstance(obj, list):
|
||||
for it in obj:
|
||||
if isinstance(it, dict) and "amount" in it and not is_empty(it.get("amount")):
|
||||
res.append(str(it.get("amount")))
|
||||
return res
|
||||
|
||||
return res
|
||||
|
||||
# =========================
|
||||
# 1) Montos directos (tus variables)
|
||||
# =========================
|
||||
money_vars = [
|
||||
"precio_cochera",
|
||||
"precio_baulera",
|
||||
"precio_departamento",
|
||||
"adicional_piso",
|
||||
"pago_sena",
|
||||
"pago_inicial",
|
||||
"valor_total_compra",
|
||||
"monto_saldo",
|
||||
"total_pagado",
|
||||
"saldo_a_pagar",
|
||||
]
|
||||
|
||||
for name in money_vars:
|
||||
val = rb_get(name)
|
||||
if is_empty(val):
|
||||
continue
|
||||
f = fmt_es_money(val, 2)
|
||||
if f is not None:
|
||||
rb_set(name, f)
|
||||
|
||||
# =========================
|
||||
# 2) cuotas_pre -> pre_amount
|
||||
# (puede venir dict o list o string)
|
||||
# =========================
|
||||
rb_set("pre_amount", "")
|
||||
raw = rb_get("cuotas_pre")
|
||||
obj, kind = parse_container(raw)
|
||||
if obj is not None:
|
||||
format_amount_in_obj(obj)
|
||||
rb_set("cuotas_pre", serialize_container(obj, kind))
|
||||
amts = extract_amounts(obj)
|
||||
rb_set("pre_amount", amts[0] if amts else "")
|
||||
|
||||
# =========================
|
||||
# 3) cuotas_post -> amount_post
|
||||
# =========================
|
||||
rb_set("amount_post", "")
|
||||
raw = rb_get("cuotas_post")
|
||||
obj, kind = parse_container(raw)
|
||||
if obj is not None:
|
||||
format_amount_in_obj(obj)
|
||||
rb_set("cuotas_post", serialize_container(obj, kind))
|
||||
amts = extract_amounts(obj)
|
||||
rb_set("amount_post", " | ".join(amts) if amts else "")
|
||||
|
||||
# =========================
|
||||
# 4) refuerzos -> amount_refuerzo
|
||||
# ejemplo: [{"date":"...","amount":5000}, ...]
|
||||
# =========================
|
||||
rb_set("amount_refuerzo", "")
|
||||
raw = rb_get("refuerzos")
|
||||
obj, kind = parse_container(raw)
|
||||
if obj is not None:
|
||||
format_amount_in_obj(obj)
|
||||
rb_set("refuerzos", serialize_container(obj, kind))
|
||||
amts = extract_amounts(obj)
|
||||
rb_set("amount_refuerzo", " | ".join(amts) if amts else "")
|
||||
|
||||
# (Debug opcional para confirmar que el formatter anda)
|
||||
# rb_set("debug_format_test", fmt_es_money("30000.00", 2)) # => 30.000,00
|
||||
|
||||
main()
|
||||
Reference in New Issue
Block a user