fix(auditoria general): 25 errores encontrados en la revision modulo por modulo
SEGURIDAD (agente IA): - Conversaciones: GET /ai/conversations/:id y el reanudar chat verifican propiedad (antes cualquier usuario leia/continuaba la conversacion de otro). - /ai/documents pasa a solo-admin (antes cualquien podia inyectar o borrar documentos de la base de conocimiento). DATOS / CORRUPCION: - Cotizador: elegir un cliente del maestro en el buscador ya no crea un lead fantasma "Registro previo (CRM anterior)" en el embudo. - Afluencia con oportunidadId inexistente: 404 en vez de crear sombra fantasma. - Cobranza: los 103 planes importados quedaron con vendedor asignado (7 con su asesor real segun el Excel, el resto al admin) y el motor de recordatorios cae al admin cuando un plan no tiene vendedor: antes los 411 recordatorios se registraban 'sin-destinatario' y no los veia nadie. - Backups: script reescrito para el host real (sqlite .backup + uploads + env en /root/backups) y cron instalado (antes: script que asumia docker y sin cron programado = cero respaldos). REPORTES / METRICAS: - Mi tablero: el embudo ya excluye cancelaciones reales (Cancelo/Cancelacion Apartado) y cuenta como vendidos Firma Cliente/Escriturado/Titulado (antes 41 "apartados" donde habia 13 activos y vendidos buscaba una etapa que no existe); tasa de descarte ya compara el mismo periodo. - Scoring: etapa real 'Agendo Cita' (antes 'AGENDO' nunca aplicaba) y los descartados/perdidos ya no reciben score. - ver_cobranza (IA): ignora planes cancelados y no cuenta como vencido el pago que vence hoy. UI / FLUJOS: - mi-dia: typo CANCO -> CANCELO (los cancelados reaparecen en Escrituracion); confirmar cita ya no retrocede la etapa de Cotizador/Aparto (boton y kanban). - alta-clientes: la firma ya no se borra al navegar fuera del paso de firmas; toast de exito solo cuando el API confirma; prefill de apartado trae direccion, estado civil y fecha de nacimiento desde el alta. - Auditoria: el filtro por usuario funciona (el front enviaba 'usuario' y el API esperaba 'usuarioId') y 'hasta' incluye todo el dia. - Contactos: paginacion aplicada despues de fusionar fuentes (antes saltaban o se repetian contactos entre paginas y 'Siguiente' se deshabilitaba antes de tiempo). - Buscador global: leads -> /hoy/, contactos -> /; el cotizador entiende ?cotizacion=<id> para retomar desde la liga. - Export mi-dia: columnas Desarrollo/Origen rellenas y sin duplicados. - Recibo de cobranza: "Recibio" es FRASA (el cliente paga, no recibe). - Alta de plan de cobranza: proyecto libre con sugerencias del catalogo real (antes limitado a 3 proyectos que no cubrian la cartera). Verificado en vivo: autorizacion IA (3x 403), filtro de auditoria, 404 de afluencia. Suites: 717 API + 124 alta-clientes + 115 cotizador + 92 cobranza + 89 landing + 32 mi-dia en verde. Backup de hoy generado en /root/backups.
This commit is contained in:
@@ -1,26 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
# Backup diario FRASA — cron: 17 2 * * * /opt/frasa-ecosystem/scripts/backup.sh
|
||||
# Backup diario FRASA — corre en el HOST (el API vive en systemd, no en Docker).
|
||||
#
|
||||
# crontab: 17 2 * * * /root/frasa-ecosystem/scripts/backup.sh >> /var/log/frasa-backup.log 2>&1
|
||||
#
|
||||
# Copia consistente de la base SQLite (con .backup, no un cat del archivo en
|
||||
# uso), los expedientes subidos y el .env; conserva 30 días.
|
||||
set -euo pipefail
|
||||
|
||||
BACKUP_DIR="/backups"
|
||||
RAIZ="/root/frasa-ecosystem"
|
||||
BACKUP_DIR="/root/backups"
|
||||
FECHA=$(date +%Y%m%d)
|
||||
RETENCION_DIAS=30
|
||||
DB="$RAIZ/api-gateway/prisma/dev.db"
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
cd "$(dirname "$0")/.."
|
||||
# 1. Base de datos SQLite (copia consistente aunque el API esté escribiendo)
|
||||
sqlite3 "$DB" ".backup '$BACKUP_DIR/frasa_db_$FECHA.sqlite'"
|
||||
|
||||
# 1. Base de datos SQLite del API (mientras no se migre a Postgres)
|
||||
docker compose exec -T api sh -c 'cat /data/dev.db' > "$BACKUP_DIR/frasa_db_$FECHA.sqlite" || true
|
||||
# 2. Expedientes subidos (INE, firmas, comprobantes)
|
||||
if [ -d "$RAIZ/api-gateway/uploads" ]; then
|
||||
tar czf "$BACKUP_DIR/uploads_$FECHA.tar.gz" -C "$RAIZ/api-gateway" uploads
|
||||
fi
|
||||
|
||||
# 2. Postgres (cuando el API migre; hoy falla en silencio si no hay datos)
|
||||
docker compose exec -T postgres pg_dump -U "${POSTGRES_USER:-frasa_user}" "${POSTGRES_DB:-frasa_db}" \
|
||||
> "$BACKUP_DIR/frasa_pg_$FECHA.sql" 2>/dev/null || rm -f "$BACKUP_DIR/frasa_pg_$FECHA.sql"
|
||||
|
||||
# 3. Expedientes subidos (INE, firmas, comprobantes)
|
||||
docker compose exec -T api sh -c 'cd /data && tar czf - uploads' > "$BACKUP_DIR/uploads_$FECHA.tar.gz" || true
|
||||
# 3. Configuración de entorno (sin la cual el restore no arranca igual)
|
||||
cp "$RAIZ/.env" "$BACKUP_DIR/env_$FECHA"
|
||||
|
||||
# 4. Retención
|
||||
find "$BACKUP_DIR" -name "frasa_*" -mtime +$RETENCION_DIAS -delete
|
||||
find "$BACKUP_DIR" -name "uploads_*" -mtime +$RETENCION_DIAS -delete
|
||||
find "$BACKUP_DIR" \( -name "frasa_db_*" -o -name "uploads_*" -o -name "env_*" \) -mtime +"$RETENCION_DIAS" -delete
|
||||
|
||||
echo "[$(date -Is)] backup completo en $BACKUP_DIR"
|
||||
echo "[$(date -Is)] backup completo: $BACKUP_DIR (db + uploads + env)"
|
||||
|
||||
Reference in New Issue
Block a user