SOURCE-003 Sales Items Pilot Load¶
Fecha: 2026-06-11
Estado: CARGA PILOTO 001 EJECUTADA / WINDOW PILOT 001 EJECUTADO / PRODUCCION FINAL BLOQUEADA
Scope: tenant
tenant_id: alpuntodeventa
Owner: Gabi / Carlos Canu
Fuente de verdad:
docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-PILOT-LOAD.md
Documentos relacionados:
docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-PILOT-MIGRATION.mddocs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-LINE-IDENTITY-DECISION.mddocs/tenants/alpuntodeventa/business-observer/SOURCE-INVENTORY-RESULTS-003.mddocs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY.sqldocs/tenants/alpuntodeventa/business-observer/data-dictionary/SOURCE-003-TABLA2-COLUMN-DICTIONARY.mddocs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-COLUMN-MAPPING.mddocs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-PILOT-LOAD-001.mddocs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-WINDOW-PILOT-001.md
1. Objetivo¶
Ejecutar una carga piloto controlada de SOURCE-003 / Tabla 2 vNext hacia
business_observer.source_003_sales_items, usando solo la fecha piloto
2026-06-08.
La carga debia validar line_sequence_v1, line_key_v4,
source_row_hash_v1, conteos, conciliacion y permanencia del dataset piloto
si todas las validaciones pasaban.
2. Safe point¶
Safe point previo a la ejecucion:
git status -sb:## main...origin/maingit rev-parse HEAD:cabe1c9e942cc23ea62202e33ba193e46194f059
3. Ambiente y gate previo¶
Ambiente destino:
- motor:
PostgreSQL 15.15 - host/puerto:
localhost:5432 - base:
gestion_de_negocios_core - schema:
business_observer - tabla:
business_observer.source_003_sales_items - alias:
postgres:postgres-alpuntodeventa-dev-env
Fuente:
- alias:
mssql:mssql-sgc-ecommerce - salida:
SOURCE-003 / Tabla 2 vNext - SQL autoridad:
docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY.sql - fecha piloto:
2026-06-08
Gate previo:
| Control | Resultado |
|---|---|
| repo limpio antes de operar | PASS |
| tabla destino existe | PASS |
| tabla destino vacia antes de cargar | PASS, 0 filas |
conexion SGC SELECT 1 |
PASS |
conexion PostgreSQL SELECT 1 |
PASS |
| backup logico previo generado | PASS |
4. Backup¶
Antes de intentar la carga se genero backup logico nuevo del destino.
Backup:
- archivo:
C:\APV\backups_postgres\openclawai\source_003_sales_items_pilot_load\20260610-165324-gestion_de_negocios_core-pre-source-003-sales-items-pilot-load.dump - archivo hash:
C:\APV\backups_postgres\openclawai\source_003_sales_items_pilot_load\20260610-165324-gestion_de_negocios_core-pre-source-003-sales-items-pilot-load.dump.sha256 - archivo
TOC:C:\APV\backups_postgres\openclawai\source_003_sales_items_pilot_load\20260610-165324-gestion_de_negocios_core-pre-source-003-sales-items-pilot-load.dump.toc.txt - tamano:
12872973bytes - sha256:
3b0bfd79eab50694e81a7abe50b42236c0195374b97c9a3ed80bd35beb50a471 - verificacion:
pg_restore --list TOC Entries:870
El backup no se guardo en Git.
5. Extraccion piloto¶
Se ejecuto la autoridad SOURCE-003 / Tabla 2 vNext sin modificar la logica
de calculo documentada.
Parametros efectivos preservados por el SQL autoridad:
| Parametro | Valor |
|---|---|
@FechaDesde |
2026-06-08 |
@FechaHasta |
2026-06-08 |
@ShowTabla1 |
0 |
@ShowTabla2 |
1 |
@ShowTabla3 |
0 |
@ShowTabla4 |
0 |
@ShowTabla5 |
0 |
@ShowTabla6 |
0 |
Resultado observado:
| Metrica | Resultado |
|---|---|
| resultsets | 1 |
| columnas | 68 |
| filas extraidas | 1262 |
| clientes unicos | 124 |
| comprobantes unicos | 299 |
SKU unicos |
178 |
| vendedores unicos | 23 |
| fecha minima | 2026-06-08 |
| fecha maxima | 2026-06-08 |
CMVBruto_Item cero |
6 |
| importes negativos | 171 |
| unidades negativas | 171 |
suma Importe_Total_Todos_los_Items |
24866892.52 |
suma CMVBruto_Item |
19078909.1264 |
Tipos de comprobante observados:
| Tipo de comprobante | Filas |
|---|---|
FACTURA A |
124 |
FACTURA B |
16 |
GUIA DE DESPACHO |
951 |
N/C GUIA DE DESPACHO |
151 |
NOTA CREDITO A |
1 |
NOTA CREDITO B |
19 |
6. Conciliacion contra evidencia previa¶
La extraccion actual no coincidio con la evidencia previa documentada para la misma fecha piloto.
| Control | Evidencia previa | Observado actual | Diferencia | Diferencia absoluta | Diferencia porcentual absoluta |
|---|---|---|---|---|---|
filas Tabla 2 |
1269 |
1262 |
-7 |
7 |
0.55161545% |
suma Importe_Total_Todos_los_Items |
24852533.32 |
24866892.52 |
14359.20 |
14359.20 |
0.05777761% |
suma CMVBruto_Item |
19122718.36 |
19078909.1264 |
-43809.2336 |
43809.2336 |
0.22909522% |
Lectura:
- el conteo esperado
1269no paso - la conciliacion de importe total no paso
- la conciliacion de
CMVno paso - la fuente parece haber cambiado para la misma fecha o hay deriva de evidencia que debe revalidarse antes de cargar
- la deriva posterior quedo confirmada en
docs/tenants/alpuntodeventa/business-observer/SOURCE-003-DRIFT-ANALYSIS-001.md SOURCE-003 / SGC Ventasdebe tratarse como fuente viva, no como historico congelado por fecha de comprobante
7. Decision de stop¶
La carga se detuvo antes de transformar e insertar filas porque fallo el gate de conteo y conciliacion contra la evidencia previa.
No se calcularon ni persistieron:
line_sequence_v1line_key_v4source_row_hash_v1sync_batch_idde carga
No se ejecuto INSERT, UPSERT ni DELETE sobre
business_observer.source_003_sales_items.
8. Estado final del destino¶
Estado final:
| Control | Resultado |
|---|---|
| filas cargadas | 0 |
| filas finales en tabla | 0 |
| datos piloto quedaron cargados | NO |
| rollback ejecutado | NO |
| motivo | no hubo transaccion de carga ni filas insertadas |
La tabla quedo vacia al cierre del intento.
9. Confirmaciones de alcance¶
- modo
BUILD + VALIDATEaplicado PostgreSQLlocal tocado conscientemente solo para gate, backup y conteoSGCleido en solo lectura- sin
VPS - sin
Docker - sin
OpenClaw - sin
NPM - sin sync diaria
- sin automatizacion
- sin carga masiva
- sin produccion final
- sin datos personales documentados
- documentacion con agregados solamente
10. Implicancia operativa para sync futura¶
La carga piloto no debe reintentarse como incremental simple basado en
ultima fecha cargada.
Regla:
- una fecha ya cargada puede cambiar al volver a leer
SGC - el
SGCpuede modificar, anular, refacturar o ajustar comprobantes aproximadamente hasta7dias hacia atras por liquidacion de entregas, rechazos, anulaciones, refacturacion, descuentos posteriores, notas de credito, ajustes de cuenta corriente y cambios operativos de cobro/entrega - una linea puede aparecer, cambiar valores, desaparecer de la extraccion activa, quedar anulada o recibir nota de credito o ajuste posterior
- la estrategia futura debe combinar carga historica inicial, snapshot diario y
ventana movil de reproceso inicialmente sugerida de
10dias - la persistencia futura debe hacer
upsertportenant_id + line_key, compararsource_row_hash, refrescarlast_seen_atsi no cambia, actualizar si cambia y marcarmissing_from_sourceen extraccionesfullo ventanas controladas cuando una linea deje de aparecer - no corresponde
hard delete - el freeze date de la proxima fecha piloto debe salir de un snapshot, no de
SGCvivo
Ejemplo:
- el
2026-06-08se carga una guia por$10.000 - el
2026-06-10el cliente rechaza parte del pedido o se refactura un descuento - el
SGCpuede mostrar para2026-06-08un importe distinto o una nota de credito - el sync debe releer
2026-06-08dentro de la ventana movil y actualizar la fila destino portenant_id + line_keyysource_row_hash
11. Proximo paso unico recomendado¶
Usar SOURCE-003-SNAPSHOT-001 como baseline congelada para preparar un nuevo
intento de carga piloto sobre la ventana 2026-06-09, solo con aprobacion
explicita y gate previo de hash/agregados.
Antes de cualquier nuevo intento de carga, la estrategia de sync debe quedar
alineada con ventana movil, upsert, source_row_hash, last_seen_at,
missing_from_source y no hard delete.
En ese momento, hasta aprobar ese gate, no correspondia cargar
source_003_sales_items. Ese bloqueo quedo levantado solo para la carga
piloto 001 documentada mas abajo, no para sync diaria, carga masiva ni
produccion final.
12. Snapshot controlado posterior - 2026-06-10¶
Referencia:
docs/tenants/alpuntodeventa/business-observer/SOURCE-003-SNAPSHOT-001.md
Se capturo un snapshot controlado de SOURCE-003 / Tabla 2 V2 para
2026-06-09, usando flags explicitos para emitir solo Tabla 2.
Resumen:
| Metrica | Resultado |
|---|---|
| filas | 1886 |
| columnas | 68 |
| importe total | 48087486.83 |
CMV total |
37881269.3025 |
| clientes unicos | 173 |
| vendedores unicos | 25 |
SKU unicos |
180 |
| comprobantes unicos | 428 |
Hora vacia o nula |
0 |
duplicados line_key_v4 + line_sequence_v1 |
0 |
| sha256 snapshot | 07092c284b5b636b8a31cd616ef5b4fa5d0ce499b81c767437842b1f7edfcbc3 |
Decision:
- el snapshot queda valido como baseline congelada para un futuro piloto
- conviene usar la misma ventana
2026-06-09para la proxima carga piloto controlada - no se ejecuto carga, sync, migracion ni escritura en
PostgreSQL
13. Bloqueo por diccionario y mapping¶
Revision documental posterior sobre el snapshot SOURCE-003-SNAPSHOT-001
confirma:
| Control | Resultado |
|---|---|
columnas reales Tabla 2 V2 |
68 |
| columnas ya contempladas semanticamente en DDL piloto previo | 37 |
| columnas faltantes o solo consolidadas | 31 |
| columnas reales propuestas para persistencia | 68 |
Decision:
- no ejecutar carga piloto hasta aprobar humanamente el diccionario completo de columnas
- no ejecutar carga piloto hasta aprobar humanamente el mapping CSV/PostgreSQL
- no ejecutar carga piloto si el pipeline no produce todas las columnas
persistibles de
Tabla 2 V2 - no ejecutar carga piloto si
source_row_hash_v1no canonicaliza las68columnas reales del CSV
Estado de carga piloto historico: BLOQUEADA hasta aprobacion de diccionario
y mapping.
14. Carga piloto 001 desde snapshot congelado¶
Referencia:
docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-PILOT-LOAD-001.md
El 2026-06-10 se ejecuto una carga piloto controlada desde
SOURCE-003-SNAPSHOT-001 usando exclusivamente el CSV congelado
SOURCE-003-TABLA2-V2-2026-06-09_20260610-210406-0300.csv.
Gate y backup:
| Control | Resultado |
|---|---|
| repo limpio antes de operar | PASS |
| sha256 CSV | 07092c284b5b636b8a31cd616ef5b4fa5d0ce499b81c767437842b1f7edfcbc3 |
conexion PostgreSQL SELECT 1 |
PASS |
| tabla destino existe | PASS |
| filas antes de cargar | 0 |
| backup logico previo | PASS |
Backup:
- archivo:
C:\APV\backups_postgres\openclawai\source_003_sales_items_pilot_load_001\20260610-230617-gestion_de_negocios_core-pre-source-003-sales-items-pilot-load-001.dump - sha256:
8bc5f6429f2efaa0d67c53e9aac2a146b42b2320792559d9b32cd684a9d738e0 - verificacion:
pg_restore --list PASS TOC Entries:870
La tabla fisica existia vacia con 52 columnas. Dentro de la misma
transaccion de carga se ajusto la estructura local piloto hasta 83 columnas
fisicas para cubrir las 68 columnas reales aprobadas por el diccionario y el
mapping. El ajuste incluyo 3 renombres de columnas logisticas previas y 31
columnas agregadas.
Resultado de carga:
| Control | Resultado |
|---|---|
| filas cargadas | 1886 |
| fecha unica | 2026-06-09 |
distinct line_key |
1886 |
duplicados line_key |
0 |
| importe total | 48087486.8300 |
CMV total |
37881269.3025 |
| clientes unicos | 173 |
| vendedores unicos | 25 |
SKU unicos |
180 |
| comprobantes unicos | 428 |
Hora vacia |
0 |
record_status = active |
1886 |
sync_batch_id distintos |
1 |
| timestamps no nulos | 1886 |
source_row_hash no nulo |
1886 |
line_sequence_v1 no nulo |
1886 |
| columnas de negocio persistidas o mapeadas | 68/68 |
Metadata:
| Campo | Valor |
|---|---|
source_system |
snapshot:SOURCE-003-SNAPSHOT-001 |
source_object |
SOURCE-003 / Tabla 2 V2 |
source_query_version |
SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY-V2 |
sync_batch_id |
2d2f3c4d-72b9-45e5-b113-608166daeeda |
Estado final:
- datos piloto quedaron cargados:
SI - rollback ejecutado:
NO SGCvivo consultado para cargar:NO- sync diaria ejecutada:
NO - carga masiva ejecutada:
NO - produccion final habilitada:
NO
Proximo paso recomendado:
Revisar humanamente la evidencia de la carga piloto 001 y aprobar o bloquear
el diseno del siguiente piloto de ventana movil/backfill antes de cualquier
sync diaria, carga masiva o produccion final.
15. Intento de ventana movil/backfill corto 001¶
Referencia:
docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-WINDOW-PILOT-001.md
El 2026-06-10 se intento iniciar un piloto controlado de ventana
movil/backfill corto para SOURCE-003 / Tabla 2 V2, con ventana solicitada
2026-06-03 a 2026-06-09.
Resultado: BLOQUEADO EN GATE PREVIO.
Controles:
| Control | Resultado |
|---|---|
| repo limpio | PASS |
conexion PostgreSQL SELECT 1 |
FAIL |
conexion SGC SELECT 1 solo lectura |
FAIL |
| backup logico previo | NO GENERADO |
| extraccion | NO EJECUTADA |
| transformacion | NO EJECUTADA |
| upsert | NO EJECUTADO |
| rollback | NO, no hubo transaccion de carga |
| datos nuevos cargados | NO |
| decision | ROJO |
Motivo:
- la sesion local no tenia credencial PostgreSQL utilizable para
gestion_de_negocios_core - la sesion local no tenia conexion SGC reutilizable para ejecutar
SELECT 1en solo lectura - segun el gate solicitado, la corrida se detuvo antes de backup, extraccion o carga
Proximo paso recomendado:
Configurar credenciales locales no versionadas para PostgreSQL y SGC, y
reintentar solo el gate previo antes de cualquier nuevo piloto de ventana.
16. Reintento de ventana movil/backfill corto - 2026-06-11¶
Referencia:
docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-WINDOW-PILOT-001.md
Gabi aprobo explicitamente reintentar el piloto controlado de ventana movil
para SOURCE-003 / Tabla 2 V2, ventana 2026-06-03 a 2026-06-09, en modo
BUILD + VALIDATE.
Resultado: BLOQUEADO EN GATE PREVIO / BACKUP LOGICO DB NO CONFIRMADO.
Controles:
| Control | Resultado |
|---|---|
| safe point | ## main...origin/main, HEAD be976919322c02c01379d913ef39ba219427f27a |
.env local existe / ignorado / no versionado |
PASS |
conexion PostgreSQL SELECT 1 |
PASS |
conexion SGC SELECT 1 solo lectura |
PASS |
| tabla destino existe | PASS |
| filas pre-carga | 1886 |
| fechas presentes destino | 2026-06-09: 1886 |
filas de 2026-06-09 |
1886 |
backup logico previo de gestion_de_negocios_core |
FAIL |
| extraccion de ventana | NO EJECUTADA |
| transformacion | NO EJECUTADA |
| upsert | NO EJECUTADO |
| inserts / updates / unchanged | 0 / 0 / 0 |
| filas finales | 1886 |
| rollback ejecutado | NO, no hubo transaccion de carga |
| datos nuevos cargados | NO |
| decision | ROJO |
Motivo:
- el rol local disponible
openclaw_writerpermite conectividad y operacion minima sobrebusiness_observer.source_003_sales_items pg_dumpcompleto degestion_de_negocios_corefallo conpermission denied for schema cobranzas- no se confirmo backup logico completo ni
pg_restore --list - por instruccion de gate, se detuvo antes de ejecutar la autoridad SQL de
SOURCE-003, snapshot, transformacion o carga
Estado de destino al cierre:
business_observer.source_003_sales_itemsconserva las1886filas del pilotoSOURCE-003-SNAPSHOT-001- no se tocaron
VPS,Docker,OpenClaw,NPM - no se creo sync diaria, automatizacion, carga masiva ni produccion final
Proximo paso recomendado:
Provisionar una credencial local de backup/maintenance para
gestion_de_negocios_core, o conceder a un rol de backup permisos suficientes
para ejecutar pg_dump completo verificable con pg_restore --list; despues
reejecutar solo el gate de backup antes de cualquier extraccion de ventana.
17. Piloto de ventana movil/backfill ejecutado - 2026-06-11¶
Referencia:
docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-WINDOW-PILOT-001.md
Gabi aprobo ejecutar el ultimo piloto ampliado sobre PostgreSQL local legacy
gestion_de_negocios_core antes de pasar a DB dedicada o sandbox VPS
evaluado. La ventana ejecutada fue 2026-06-03 a 2026-06-09, sin usar el
dia en curso.
Gate:
| Control | Resultado |
|---|---|
| safe point | ## main...origin/main, HEAD 64b1c2f50ed81f02ea764069230e183fc5e324ac |
.env local existe / ignorado / no versionado |
PASS |
PostgreSQL SELECT 1 |
PASS |
SGC SELECT 1 solo lectura |
PASS |
| tabla destino existe | PASS |
| filas pre-carga | 1886 |
backup acotado business_observer |
PASS |
pg_restore --list |
PASS |
Backup de corrida:
| Campo | Valor |
|---|---|
| dump | C:\APV\backups_postgres\openclawai\source_003_sales_items_window_pilot_001\20260611-123730-gestion_de_negocios_core-business_observer-pre-window-pilot-001.dump |
| sha256 | 4d76c8cd05735691728b46ab4a6f6387e429832d4af8f9db1c11f41ea0481a9f |
| bytes | 382481 |
| TOC lines | 35 |
Extraccion y snapshot:
| Control | Resultado |
|---|---|
| query | SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY-V2 |
| flags | Tabla1=0, Tabla2=1, Tabla3=0, Tabla4=0, Tabla5=0, Tabla6=0 |
| filas extraidas | 9760 |
| columnas | 68 |
| snapshot | C:\APV\openclawai\snapshots\source-003\SOURCE-003-TABLA2-V2-2026-06-03_2026-06-09_20260611-123846-0300.csv |
| snapshot sha256 | 6ead2bb9c7c1f23d3acb7aa49bdcb7ca66ea2fc663874f03fb0a4039ebf97072 |
Validacion pre-carga:
| Control | Resultado |
|---|---|
| headers esperados | 68/68 |
Hora vacia |
0 |
duplicados line_key_v4 |
0 |
| nulos criticos | 0 |
| clientes unicos | 794 |
| vendedores unicos | 29 |
SKU unicos |
223 |
| comprobantes unicos | 2333 |
| notas de credito | 1286 |
CMV cero |
102 |
Resultado de upsert:
| Control | Resultado |
|---|---|
sync_batch_id |
e0aa281c-00ee-49ba-8119-1bfb91ff8ceb |
| inserts | 7875 |
| updates por hash cambiado | 25 |
unchanged con last_seen_at refrescado |
1860 |
filas con last_seen_at de corrida |
9760 |
| filas no vistas en ventana | 1 |
| filas finales | 9761 |
duplicados line_key finales |
0 |
source_row_hash nulo o vacio |
0 |
line_sequence_v1 nulo |
0 |
Comparacion contra snapshot:
| Control | Snapshot | PostgreSQL observado | Estado |
|---|---|---|---|
| filas | 9760 |
9760 |
PASS |
| importe total | 250966424.65 |
250966424.6500 |
PASS |
CMV total |
204329816.0149 |
204329816.0149 |
PASS |
Performance:
| Etapa | Segundos |
|---|---|
| extraccion | 13.278 |
| transformacion | 2.223 |
| upsert | 3.475 |
| validacion post-carga | 0.088 |
Estado final:
- decision final:
VERDE - rollback tecnico previo:
SI, sin modificar destino - rollback de transaccion final:
NO - datos quedaron cargados:
SI - hard delete:
NO missing_from_source:NO- sync diaria:
NO - carga masiva:
NO - produccion final:
NO VPS,Docker,OpenClaw,NPM:NO TOCADOS
Proximo paso recomendado:
No ejecutar otro piloto ampliado sobre gestion_de_negocios_core. Preparar
una DB dedicada local openclaw_business_observer_dev o evaluar formalmente
un sandbox VPS antes de cualquier nueva carga, sync diaria, carga masiva o
produccion final.