Add support for prev notification collection structure
All checks were successful
CI / ci (pull_request) Successful in 19s

This commit is contained in:
Anibal Angulo
2026-03-10 18:51:23 +00:00
parent 1803d011d0
commit b911c92e05
4 changed files with 80 additions and 50 deletions

View File

@@ -11,6 +11,8 @@ Usage:
import sys
import time
from datetime import datetime
from typing import Any
import yaml
from google.cloud.firestore import Client
@@ -19,6 +21,21 @@ _SECONDS_PER_HOUR = 3600
_DEFAULT_WINDOW_HOURS = 48
def _extract_ts(n: dict[str, Any]) -> float:
"""Return the creation timestamp of a notification as epoch seconds."""
raw = n.get("timestamp_creacion", n.get("timestampCreacion", 0))
if isinstance(raw, (int, float)):
return float(raw)
if isinstance(raw, datetime):
return raw.timestamp()
if isinstance(raw, str):
try:
return float(raw)
except ValueError:
return 0.0
return 0.0
def main() -> None:
if len(sys.argv) < 2:
print(f"Usage: {sys.argv[0]} <phone> [--hours N]")
@@ -55,11 +72,8 @@ def main() -> None:
cutoff = time.time() - (window_hours * _SECONDS_PER_HOUR)
def _ts(n: dict) -> float:
return n.get("timestamp_creacion", n.get("timestampCreacion", 0))
recent = [n for n in all_notifications if _ts(n) >= cutoff]
recent.sort(key=_ts, reverse=True)
recent = [n for n in all_notifications if _extract_ts(n) >= cutoff]
recent.sort(key=_extract_ts, reverse=True)
if not recent:
print(
@@ -74,14 +88,13 @@ def main() -> None:
)
now = time.time()
for i, n in enumerate(recent, 1):
ts = _ts(n)
ts = _extract_ts(n)
ago = _format_time_ago(now, ts)
categoria = n.get("parametros", {}).get(
"notification_po_Categoria", ""
)
texto = n.get("texto", "")
params = n.get("parameters", n.get("parametros", {}))
categoria = params.get("notification_po_Categoria", "")
texto = n.get("text", n.get("texto", ""))
print(f" [{i}] {ago}")
print(f" ID: {n.get('id_notificacion', '?')}")
print(f" ID: {n.get('notificationId', n.get('id_notificacion', '?'))}")
if categoria:
print(f" Category: {categoria}")
print(f" {texto[:120]}{'' if len(texto) > 120 else ''}")

View File

@@ -8,51 +8,54 @@ Usage:
uv run utils/register_notification_firestore.py <phone>
Reads project/database/collection settings from config.yaml.
The generated notification follows the latest English-camelCase schema
used in the production collection (``artifacts/default-app-id/notifications``).
"""
import random
import sys
import time
import uuid
from datetime import datetime, timezone
import yaml
from google.cloud.firestore import Client
from google.cloud.firestore import Client, SERVER_TIMESTAMP
NOTIFICATION_TEMPLATES = [
{
"texto": "Se detectó un cargo de $1,500 en tu cuenta",
"parametros": {
"text": "Se detectó un cargo de $1,500 en tu cuenta",
"parameters": {
"notification_po_transaction_id": "TXN15367",
"notification_po_amount": 5814,
},
},
{
"texto": (
"text": (
"💡 Recuerda que puedes obtener tu Adelanto de Nómina en"
" cualquier momento, sólo tienes que seleccionar Solicitud"
" adelanto de Nómina en tu app."
),
"parametros": {
"parameters": {
"notification_po_Categoria": "Adelanto de Nómina solicitud",
"notification_po_caption": "Adelanto de Nómina",
},
},
{
"texto": (
"text": (
"Estás a un clic de Programa de Lealtad, entra a tu app y"
" finaliza Tu contratación en instantes. ⏱ 🤳"
),
"parametros": {
"parameters": {
"notification_po_Categoria": "Tarjeta de Crédito Contratación",
"notification_po_caption": "Tarjeta de Crédito",
},
},
{
"texto": (
"text": (
"🚀 ¿Listo para obtener tu Cápsula Plus? Continúa en tu app"
" y termina al instante. Conoce más en: va.app"
),
"parametros": {},
"parameters": {},
},
]
@@ -75,15 +78,16 @@ def main() -> None:
collection_path = cfg["notifications_collection_path"]
doc_ref = db.collection(collection_path).document(phone)
now = datetime.now(tz=timezone.utc)
template = random.choice(NOTIFICATION_TEMPLATES)
notification = {
"id_notificacion": str(uuid.uuid4()),
"notificationId": str(uuid.uuid4()),
"telefono": phone,
"timestamp_creacion": time.time(),
"texto": template["texto"],
"nombre_evento_dialogflow": "notificacion",
"codigo_idioma_dialogflow": "es",
"parametros": template["parametros"],
"timestampCreacion": now,
"text": template["text"],
"event": "notificacion",
"languageCode": "es",
"parameters": template["parameters"],
"status": "active",
}
@@ -92,14 +96,23 @@ def main() -> None:
data = doc.to_dict() or {}
notifications = data.get("notificaciones", [])
notifications.append(notification)
doc_ref.update({"notificaciones": notifications})
doc_ref.update({
"notificaciones": notifications,
"ultimaActualizacion": SERVER_TIMESTAMP,
})
else:
doc_ref.set({"notificaciones": [notification]})
doc_ref.set({
"sessionId": "",
"telefono": phone,
"fechaCreacion": SERVER_TIMESTAMP,
"ultimaActualizacion": SERVER_TIMESTAMP,
"notificaciones": [notification],
})
total = len(doc_ref.get().to_dict().get("notificaciones", []))
print(f"✅ Registered notification for {phone}")
print(f" ID: {notification['id_notificacion']}")
print(f" Text: {template['texto'][:80]}...")
print(f" ID: {notification['notificationId']}")
print(f" Text: {template['text'][:80]}...")
print(f" Collection: {collection_path}")
print(f" Total notifications for this phone: {total}")