Saltar a contenido

PDF-011G - Customer Activation DDL Candidate

Estado: PDF-011G CUSTOMER ACTIVATION DDL CANDIDATE / CANDIDATE ONLY / SIN SQL WRITE

Fecha: 2026-06-24

Objetivo

Disenar el DDL candidate para guardar el onboarding ecommerce B2B de La Directa sin ejecutar SQL y sin activar runtime:

  • Clientes ecommerce derivados desde SGC.
  • Solicitudes de alta de contactos nuevos sin codigo SGC.
  • Auditoria de solicitudes.
  • Auditoria de activaciones.
  • Domicilio fiscal y domicilio de pedido/envio.

Este documento baja a candidato DDL el contrato definido en PDF-011F.

Restricciones

  • No se ejecuto SQL write.
  • No se crearon tablas.
  • No se toco PostgreSQL.
  • No se toco WooCommerce API.
  • No se enviaron emails reales.
  • No se modifico .env.
  • No se imprimieron secrets.
  • No se tocaron datos.
  • No se toco VPS/prod con datos.
  • No se activaron runtime, sync, scheduler, cron ni pipelines.

Secrets Hostinger

Ruta esperada:

C:\APV\openclawai.venv-portal\secrets\ladirecta-hostinger-email.env

Estado: PENDING_SECRET / PENDING_SMTP_CONFIG.

No se invento host SMTP, no se imprimio password y no se envio email real. Si el archivo privado aparece en un gate posterior, se validara solo existencia, que este ignorado por Git y que no aparezca en git status; nunca se debe imprimir contenido.

Archivos del paquete

  • infra/business-observer/production/b2b-pricing/PDF-011G/PDF-011G-CUSTOMER-ACTIVATION-DDL-CANDIDATE.sql
  • infra/business-observer/production/b2b-pricing/PDF-011G/PDF-011G-CUSTOMER-ACTIVATION-ROLLBACK-CANDIDATE.sql
  • infra/business-observer/production/b2b-pricing/PDF-011G/validate_pdf_011g_customer_activation_ddl_candidate.py

Tablas Candidate

business_observer.clientes_ecommerce

Guarda el cliente ecommerce derivado desde SGC y su estado de activacion.

Campos incluidos:

  • ecommerce_customer_id
  • tenant_code
  • sgc_customer_id
  • codigo_cliente
  • cuit_normalizado
  • razon_social
  • nombre_fantasia
  • estado_sgc
  • lista_precio
  • vendedor
  • telefono_whatsapp
  • email_sgc
  • email_real
  • email_temporal
  • wc_customer_id
  • activation_status
  • activation_method
  • onboarding_source
  • onboarding_status
  • sgc_registration_status
  • billing_review_status
  • billing_review_requested_at
  • billing_review_email_sent_at
  • billing_review_email_to
  • domicilio_fiscal
  • domicilio_fiscal_normalizado
  • domicilio_pedido
  • domicilio_pedido_normalizado
  • domicilio_pedido_es_fiscal
  • source_hash
  • quality_status
  • created_at
  • updated_at
  • last_sync_at

Constraints candidate:

  • unique por tenant + codigo_cliente cuando exista: ux_clientes_ecommerce_codigo_cliente.
  • unique por tenant + cuit_normalizado para clientes activos: ux_clientes_ecommerce_active_cuit.
  • unique email_real cuando este activado: ux_clientes_ecommerce_active_email_real.
  • unique por tenant + wc_customer_id activo: ux_clientes_ecommerce_active_wc_customer.
  • checks para activation_status, onboarding_status, sgc_registration_status, billing_review_status, quality_status, CUIT normalizado, email lower-case, WhatsApp normalizado y domicilios.

business_observer.ecommerce_customer_requests

Guarda solicitudes de alta de contactos nuevos sin codigo SGC.

Campos incluidos:

  • request_id
  • tenant_code
  • request_status
  • razon_social
  • nombre_fantasia
  • cuit_normalizado
  • condicion_iva
  • email
  • telefono_whatsapp
  • contacto_nombre
  • contacto_rol
  • rubro
  • comentario
  • domicilio_fiscal
  • domicilio_fiscal_normalizado
  • domicilio_pedido
  • domicilio_pedido_normalizado
  • domicilio_pedido_es_fiscal
  • billing_email_to
  • billing_email_status
  • billing_email_sent_at
  • sgc_customer_id
  • codigo_cliente_asignado
  • created_at
  • updated_at
  • quality_status

Constraints candidate:

  • checks para request_status, billing_email_status y quality_status.
  • CUIT normalizado con 11 digitos numericos.
  • email en lower-case.
  • WhatsApp normalizado en formato + y digitos.
  • domicilio fiscal/pedido con campo normalizado obligatorio si se guarda JSON.
  • bloqueo conceptual de secrets/passwords/tokens dentro de metadata JSON.

business_observer.ecommerce_customer_request_audit

Audita cambios sobre solicitudes de alta.

Campos incluidos:

  • audit_id
  • request_id
  • event_type
  • event_status
  • event_reason
  • event_at
  • actor_type
  • actor_ref
  • metadata_sanitized

Incluye FK candidate hacia ecommerce_customer_requests, checks de evento y metadata sanitizada sin password, secret ni token.

business_observer.customer_activation_audit

Audita activaciones de clientes ecommerce.

Campos incluidos:

  • activation_audit_id
  • ecommerce_customer_id
  • sgc_customer_id
  • wc_customer_id
  • event_type
  • event_status
  • event_reason
  • event_at
  • ip_hash
  • user_agent_hash
  • metadata_sanitized

Incluye FK candidate hacia clientes_ecommerce, hashes de IP/user-agent y metadata sanitizada.

Reglas De Normalizacion

  • No guardar passwords.
  • No guardar secrets.
  • No guardar CUIT/email/telefono sin normalizar cuando exista campo normalizado.
  • cuit_normalizado queda solo numerico de 11 digitos.
  • emails quedan lower-case.
  • telefono_whatsapp queda en formato candidate E.164 simplificado.
  • domicilio_fiscal_normalizado y domicilio_pedido_normalizado quedan como texto normalizado obligatorio si se guarda estructura JSON asociada.

Rollback Candidate

El rollback candidate elimina en orden dependiente:

  1. business_observer.customer_activation_audit
  2. business_observer.ecommerce_customer_request_audit
  3. business_observer.ecommerce_customer_requests
  4. business_observer.clientes_ecommerce

No fue ejecutado.

Validacion

Validador:

python infra/business-observer/production/b2b-pricing/PDF-011G/validate_pdf_011g_customer_activation_ddl_candidate.py

El validador revisa:

  • tablas y campos requeridos.
  • constraints/checks/indices candidate.
  • rollback candidate.
  • documento publico, README, mkdocs.yml, PROJECT-STATE, ROADMAP y ACTIVE-CONTEXT.
  • estado PENDING_SECRET / PENDING_SMTP_CONFIG.
  • ausencia de patrones de secrets.
  • ausencia de DML en el DDL candidate.

Estado Final

PDF-011G queda como candidato documental listo para revision. Falta un gate separado para preflight PostgreSQL real/local-dev, backup/snapshot aprobado y autorizacion explicita antes de cualquier SQL write.

No se ejecuto SQL write, no se enviaron emails reales, no se toco WooCommerce API, no se tocaron datos, no se toco VPS/prod con datos, no se imprimieron secrets y no se activaron runtime, sync, scheduler, cron ni pipelines.