Files
comercio-net/email_reporter.py

90 lines
4.2 KiB
Python
Executable File

# ============================================================================
def generate_email_html(
data: dict,
cardcode: str,
cardname: str | None,
item_catalog: dict[str, str],
prices: dict[str, float],
) -> str:
cab = data.get("cabecera", {})
det = data.get("detalle", [])
num_oc = cab.get("numero_oc", "") or ""
fecha_entrega = (cab.get("fecha_embarque") or cab.get("fecha_generacion") or "")[:10]
cliente = f"{cardcode} — {cardname or ''}"
rows_html = ""
for d in det:
upc = d.get("cod_upc", "") or ""
desc = d.get("descripcion", "") or ""
empaques = d.get("empaques", 0) or 0
color_talla = d.get("color_talla_um", "") or ""
unid_emp = d.get("unid_empaque", 0) or 0
cantidad_unid = d.get("cantidad_unid", 0) or 0
importe = d.get("importe", 0) or 0
precio_unidad = round(importe / cantidad_unid) if cantidad_unid > 0 else 0
sap_item = item_catalog.get(upc, "")
sap_price = prices.get(sap_item) if sap_item else None
if not sap_item:
texto = "Sin catálogo"
elif sap_price is None:
texto = "Sin precio SAP"
elif sap_price != precio_unidad:
texto = f"Precio difiere: ${precio_unidad:,} vs ${sap_price:,.0f}"
else:
texto = "OK"
rows_html += (
"<tr>"
f"<td style='border:1px solid #ccc;padding:6px'>{upc}</td>"
f"<td style='border:1px solid #ccc;padding:6px;text-align:right'>{empaques:,}</td>"
f"<td style='border:1px solid #ccc;padding:6px'>{color_talla}</td>"
f"<td style='border:1px solid #ccc;padding:6px;text-align:right'>{unid_emp:,}</td>"
f"<td style='border:1px solid #ccc;padding:6px;text-align:right'>{cantidad_unid:,}</td>"
f"<td style='border:1px solid #ccc;padding:6px;text-align:right'>{importe:,}</td>"
f"<td style='border:1px solid #ccc;padding:6px;text-align:right'>{precio_unidad:,}</td>"
f"<td style='border:1px solid #ccc;padding:6px'>{sap_item or '—'}</td>"
f"<td style='border:1px solid #ccc;padding:6px;text-align:right'>{f'${sap_price:,.0f}' if sap_price is not None else '—'}</td>"
f"<td style='border:1px solid #ccc;padding:6px'>{texto}</td>"
f"<td style='border:1px solid #ccc;padding:6px'>{desc}</td>"
"</tr>\n"
)
html = f"""<!DOCTYPE html>
<html>
<head><meta charset="utf-8"></head>
<body style="font-family:sans-serif;font-size:13px">
<h2>Orden de Compra — {num_oc}</h2>
<table style="border-collapse:collapse;margin-bottom:16px">
<tr><td style='border:1px solid #ccc;padding:6px'><strong>N° OC:</strong></td><td style='border:1px solid #ccc;padding:6px'>{num_oc}</td></tr>
<tr><td style='border:1px solid #ccc;padding:6px'><strong>Fecha Entrega:</strong></td><td style='border:1px solid #ccc;padding:6px'>{fecha_entrega}</td></tr>
<tr><td style='border:1px solid #ccc;padding:6px'><strong>Cliente:</strong></td><td style='border:1px solid #ccc;padding:6px'>{cliente}</td></tr>
</table>
<table style="border-collapse:collapse;width:100%">
<thead>
<tr style="background:#eee">
<th style="border:1px solid #ccc;padding:6px;text-align:left">cod_upc</th>
<th style="border:1px solid #ccc;padding:6px;text-align:right">empaques</th>
<th style="border:1px solid #ccc;padding:6px;text-align:left">color_talla_um</th>
<th style="border:1px solid #ccc;padding:6px;text-align:right">unid_empaque</th>
<th style="border:1px solid #ccc;padding:6px;text-align:right">cantidad_unid</th>
<th style="border:1px solid #ccc;padding:6px;text-align:right">Importe</th>
<th style="border:1px solid #ccc;padding:6px;text-align:right">precio_unidad</th>
<th style="border:1px solid #ccc;padding:6px;text-align:left">ItemCode</th>
<th style="border:1px solid #ccc;padding:6px;text-align:right">Precio SAP</th>
<th style="border:1px solid #ccc;padding:6px;text-align:left">Texto</th>
<th style="border:1px solid #ccc;padding:6px;text-align:left">descripción</th>
</tr>
</thead>
<tbody>
{rows_html}
</tbody>
</table>
</body>
</html>"""
return html
# ============================================================================