Saltar a contenido

SOURCE-003 Drift Analysis 001

Fecha: 2026-06-10

Estado: DRIFT CONFIRMADO / SIN CARGA / PILOTO NO ESTABLE

Scope: tenant

tenant_id: alpuntodeventa

Owner: Gabi / Carlos Canu

Fuente de verdad: docs/tenants/alpuntodeventa/business-observer/SOURCE-003-DRIFT-ANALYSIS-001.md

Documentos relacionados:

  • docs/tenants/alpuntodeventa/business-observer/SOURCE-INVENTORY-RESULTS-003.md
  • docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-PILOT-LOAD.md
  • docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY.sql

1. Objetivo

Investigar por que la extraccion actual de SOURCE-003 / Tabla 2 vNext para 2026-06-08 no coincide con la evidencia historica documentada.

La investigacion se ejecuto en modo INVENTORY + VALIDATE, sin cargar datos, sin migraciones, sin inserts, sin PostgreSQL y sin modificar tablas.

2. Safe point

  • git status -sb: ## main...origin/main
  • git rev-parse HEAD: ffd71f4051c6ce72c7851fb69272407df24510ea

3. Alcance aplicado

  • conexion SGC: solo lectura funcional
  • SELECT 1 contra SGC: PASS
  • autoridad SQL ejecutada: SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY.sql
  • fecha: 2026-06-08
  • salida: Tabla 2
  • PostgreSQL: no tocado
  • inserts, upserts, deletes, migraciones: no ejecutados
  • objetos persistentes en origen: no creados
  • documentacion: solo agregados
  • datos personales: no expuestos

La conexion se abrio con intencion de lectura, aislamiento READ UNCOMMITTED, uso de temporales de sesion de la autoridad SQL y cierre con rollback.

4. Resultado actual confirmado

Metrica Resultado actual
filas totales 1262
columnas 68
clientes unicos 124
comprobantes unicos 299
vendedores unicos 23
SKU unicos 178
suma Importe_Total_Todos_los_Items 24866892.52
suma CMVBruto_Item 19078909.1264
CMVBruto_Item cero 6
importes negativos 171
unidades negativas 171
valores Hora distintos 272
Hora minima 080221
Hora maxima 160711

Tipos de comprobante actuales:

Tipo de comprobante Filas Importe total CMV total Clientes Vendedores SKU Comprobantes
FACTURA A 124 4311929.18 3045966.6289 9 5 70 21
FACTURA B 16 460205.46 324310.3792 2 2 14 3
GUIA DE DESPACHO 951 24514320.20 17018487.6089 89 18 148 139
N/C GUIA DE DESPACHO 151 -3629636.91 -713499.1325 103 22 53 133
NOTA CREDITO A 1 -9989.46 -8963.1076 1 1 1 1
NOTA CREDITO B 19 -779935.95 -587393.2505 1 1 19 2

5. Comparacion contra evidencia historica

Evidencia historica documentada:

Metrica Historico Actual Delta actual - historico
filas 1269 1262 -7
importe total 24852533.32 24866892.52 14359.20
CMV total 19122718.36 19078909.1264 -43809.2336
clientes unicos 125 124 -1
vendedores unicos 23 23 0
SKU unicos 178 178 0

Tipos de comprobante:

Tipo de comprobante Historico Actual Delta
FACTURA A 124 124 0
FACTURA B 16 16 0
GUIA DE DESPACHO 954 951 -3
N/C GUIA DE DESPACHO 155 151 -4
NOTA CREDITO A 1 1 0
NOTA CREDITO B 19 19 0

Residual historico menos actual:

Metrica Residual
filas 7
importe total -14359.20
CMV total 43809.2336
GUIA DE DESPACHO 3
N/C GUIA DE DESPACHO 4

6. Control de deriva de SQL

Se ejecuto tambien la autoridad SQL historica del commit 5ed86a68df1d54e371ff728052658ca7a2bc3b7d, anterior a la incorporacion de Hora.

Resultado con datos actuales de SGC:

Autoridad SQL Columnas Filas Importe total CMV total
SQL historico sin Hora 67 1262 24866892.52 19078909.1264
SQL actual con Hora 68 1262 24866892.52 19078909.1264

Conclusion: la diferencia no proviene de la incorporacion de Hora ni de una deriva material del SQL autoridad. El cambio en Git agrega Hora a la salida, pero no modifica filtros, joins ni calculos.

7. Identificacion agregada de las 7 filas

La autoridad filtra:

sql WHERE v.Estado <> 'ANULADO'

La vista actual ecommerce.dbo.V_VENTAS para 2026-06-08 contiene estos estados por tipo:

Estado actual SGC Tipo de comprobante Filas
ANULADO GUIA DE DESPACHO 20
ANULADO N/C GUIA DE DESPACHO 4
DEVOLUCION N/C GUIA DE DESPACHO 78
DEVOLUCION NOTA CREDITO A 1
EN TRANSITO FACTURA A 94
EN TRANSITO FACTURA B 8
EN TRANSITO GUIA DE DESPACHO 513
EN TRANSITO N/C GUIA DE DESPACHO 73
EN TRANSITO NOTA CREDITO B 19
ENTREGADO FACTURA A 30
ENTREGADO FACTURA B 8
ENTREGADO GUIA DE DESPACHO 438

Cruce agregado entre crudo actual, salida actual e historico:

Tipo Crudo actual ANULADO actual Salida actual Historico Filas que explican el delta
FACTURA A 124 0 124 124 0
FACTURA B 16 0 16 16 0
GUIA DE DESPACHO 971 20 951 954 3
N/C GUIA DE DESPACHO 155 4 151 155 4
NOTA CREDITO A 1 0 1 1 0
NOTA CREDITO B 19 0 19 19 0

Lectura:

  • las 7 filas de diferencia quedan identificadas en grano agregado como 3 filas de GUIA DE DESPACHO y 4 filas de N/C GUIA DE DESPACHO
  • esas filas estan hoy fuera de Tabla 2 porque el estado actual del origen las deja dentro del universo ANULADO
  • no se expusieron clientes, documentos, direcciones ni comprobantes
  • V_VENTAS no expone columnas de auditoria de modificacion; solo se observaron Fecha, Hora y Estado entre las columnas relevantes
  • sin snapshot historico de filas no es posible reconstruir con certeza documental el identificador exacto de cada fila historica

8. Casos especiales

Notas de credito:

Control Historico Actual Delta
N/C GUIA DE DESPACHO 155 151 -4
NOTA CREDITO A 1 1 0
NOTA CREDITO B 19 19 0
total notas de credito 175 171 -4

Notas de credito actuales:

Metrica Resultado
filas activas 171
importe total -4419562.32
CMV total -1309855.4906
N/C GUIA DE DESPACHO anuladas actuales 4
importe de N/C GUIA DE DESPACHO anuladas actuales -95494.84
CMV de N/C GUIA DE DESPACHO anuladas actuales -0.0004

Anulaciones:

Control Resultado
filas actuales con Estado = ANULADO 24
GUIA DE DESPACHO anuladas actuales 20
N/C GUIA DE DESPACHO anuladas actuales 4
comprobantes unicos anulados actuales 9
clientes unicos anulados actuales 6
vendedores unicos anulados actuales 5
SKU unicos anulados actuales 17
filas inferidas como nuevas exclusiones vs historico 7

Devoluciones y motivos activos:

Motivo Filas Importe total CMV total
AJUSTE K 86 -2668591.94 -7994.0787
ANULADO 19 -779935.95 -587393.2505
MERMAS Y ROTURAS VENCIDOS 19 -189312.00 -123130.5549
RECHAZO PARCIAL NO PIDIO 13 -434066.34 -341096.1040
FALTANTE DE MERC. EN ARMADO 12 -180907.56 -130254.5535
SIN STOCK 5 -70872.96 -54559.5489

Creditos NP:

Control Resultado
filas activas con Total_Desc_NP <> 0 85
suma activa Total_Desc_NP -2656736.66
filas anuladas actuales con Total_Desc_NP <> 0 4
suma anulada actual Total_Desc_NP -95494.84

Mermas:

Control Resultado
filas activas con motivo MERMAS Y ROTURAS VENCIDOS 19
importe activo asociado -189312.00
CMV activo asociado -123130.5549
filas anuladas actuales con ese motivo 0

Ajustes cuenta corriente:

Control Resultado
filas activas con Total_Ajustes_Saldos_CtaCte <> 0 1
suma activa Total_Ajustes_Saldos_CtaCte -9146.44
filas anuladas actuales con ajuste cuenta corriente 0

9. Hipotesis evaluadas

Hipotesis 1 - cambio en SQL autoridad

Resultado: DESCARTADA.

Evidencia:

  • el SQL historico sin Hora devuelve los mismos agregados actuales
  • el diff de autoridad entre la evidencia historica y el SQL vigente solo incorpora Hora a la salida
  • los filtros y calculos relevantes permanecen iguales

Hipotesis 2 - cambio retroactivo de estados en SGC

Resultado: PROBABLE.

Evidencia:

  • el delta de filas se explica exactamente por tipo: 3 GUIA DE DESPACHO y 4 N/C GUIA DE DESPACHO
  • esos son los unicos tipos donde la salida actual cae contra el historico
  • la fuente actual contiene filas ANULADO para esos tipos y la autoridad las excluye
  • el conteo historico de N/C GUIA DE DESPACHO coincide con el crudo actual, mientras que la salida actual pierde las 4 que hoy estan anuladas

Hipotesis 3 - cambios economicos adicionales en filas vivas

Resultado: POSIBLE / PROBABLE.

Evidencia:

  • el residual economico historico menos actual es -14359.20 de importe y 43809.2336 de CMV
  • sumar todas las filas actualmente anuladas no reproduce ese residual
  • no hay snapshot historico de filas para comparar source_row_hash
  • CMVBruto_Item se calcula con join al maestro vivo PRODUCTS, por lo que cambios de costo/lista/descuentos de compra pueden alterar CMV historico aunque las ventas tengan la misma fecha

10. Causa probable

La causa probable es deriva retroactiva de SGC para la fecha 2026-06-08, principalmente por cambios de Estado que hoy excluyen 7 filas que antes formaban parte de Tabla 2.

La diferencia economica no debe atribuirse solo a esas 7 filas sin snapshot historico, porque la fuente y los maestros usados por la autoridad son vivos. El CMV en particular depende del maestro PRODUCTS actual y no de un costo historico congelado dentro de la salida.

11. Clasificacion SOURCE-003

Clasificacion: C) mezcla de ambas.

Lectura:

  • no es plenamente reproducible historicamente desde SGC vivo
  • si se ejecuta dos veces cerca en el tiempo puede comportarse como fuente operativa consistente
  • si se reejecuta despues de anulaciones, devoluciones o cambios de maestros, puede cambiar retroactivamente para una misma fecha cerrada

Por lo tanto, SOURCE-003 debe tratarse como fuente viva con componentes retroactivos y calculos dependientes de maestros vivos.

Regla operativa:

  • SOURCE-003 / SGC Ventas no debe tratarse como historico congelado por fecha de comprobante
  • el SGC puede modificar, anular, refacturar o ajustar comprobantes ya emitidos aproximadamente hasta 7 dias hacia atras
  • las causas operativas esperadas incluyen liquidacion de entregas, rechazos de clientes, anulaciones, refacturacion, descuentos posteriores, notas de credito, ajustes de cuenta corriente y cambios de cobro o entrega
  • una fecha ya cargada puede cambiar si se vuelve a leer desde SGC vivo
  • el estado raw del comprobante debe preservarse si la salida o una extension futura de autoridad lo expone

12. Riesgo para sync

Riesgo: ALTO si se usa una fecha piloto o una ventana historica como baseline estable sin snapshot.

Riesgos concretos:

  • no sirve un incremental simple basado solo en ultima fecha cargada
  • un gate fijo por conteo/totales puede fallar aunque el pipeline este bien
  • reintentos sobre la misma fecha pueden producir filas y hashes distintos
  • anulaciones retroactivas pueden requerir deletes logicos o cambio de estado, no solo inserts
  • una linea puede aparecer, cambiar valores, desaparecer de una extraccion activa, quedar anulada o recibir una nota de credito/ajuste posterior
  • el CMV puede variar por cambios de maestro PRODUCTS
  • sin source_row_hash historico no se puede saber que filas cambiaron
  • una unica fecha piloto no congelada puede bloquear cargas correctas futuras

13. Recomendacion y mitigacion

No usar 2026-06-08 como fecha piloto estable.

Estrategia propuesta:

  1. carga historica inicial: backfill controlado desde la autoridad Tabla 2, con sync_batch_id, extracted_at, line_key_v4 y source_row_hash_v1.
  2. snapshot diario: guardar la salida completa de Tabla 2 por fecha de extraccion para congelar evidencia y conciliaciones futuras.
  3. watermark: registrar fecha/hora de extraccion y version de autoridad SQL usada para cada batch.
  4. ventana movil: reprocesar inicialmente 10 dias para cubrir una semana operativa aproximada mas margen; ajustar luego con evidencia real.
  5. upsert: persistir por tenant_id + line_key; insertar si no existe, actualizar si cambia source_row_hash y refrescar last_seen_at si la fila reaparece sin cambios.
  6. missing_from_source: si una linea deja de aparecer dentro de una extraccion full o de ventana controlada, marcarla como missing_from_source; no hacer hard delete.
  7. freeze date: elegir una nueva fecha piloto solo despues de tomar snapshot y congelar sus agregados esperados desde ese snapshot, no desde SGC vivo.
  8. drift gate: comparar cada corrida contra el ultimo snapshot y clasificar altas, bajas logicas y cambios de hash antes de tocar destino.
  9. estado fuente: preservar Estado raw cuando se disene la sync, porque el filtro Estado <> 'ANULADO' es una causa directa de deriva.

Ejemplo operativo:

  • el dia 2026-06-08 se carga una guia por $10.000
  • el 2026-06-10 el cliente rechaza parte del pedido o se refactura un descuento
  • el SGC puede mostrar para 2026-06-08 un importe diferente, una nota de credito o un estado distinto
  • la sync no debe confiar en la ultima fecha cargada; debe volver a leer 2026-06-08 dentro de la ventana movil y actualizar PostgreSQL por tenant_id + line_key y source_row_hash

14. Respuesta explicita

Pregunta: Podemos seguir usando 2026-06-08 como fecha piloto estable?

Respuesta: NO.

Motivo:

  • la fecha ya no reproduce los agregados historicos documentados
  • el SQL autoridad no explica la diferencia
  • el origen vivo cambio retroactivamente para la misma fecha

15. Proximo paso recomendado

Revisar humanamente la estrategia de carga historica inicial, snapshot diario, ventana movil inicial de 10 dias, upsert por tenant_id + line_key, comparacion por source_row_hash y freeze date desde snapshot antes de cualquier nuevo intento de carga hacia business_observer.source_003_sales_items.

16. Checklist

  • sin PostgreSQL: SI
  • sin inserts: SI
  • sin migraciones: SI
  • sin modificaciones de tablas: SI
  • solo lectura SGC: SI
  • deriva documentada: SI
  • fuente viva documentada: SI
  • ventana movil inicial sugerida: 10 dias
  • upsert/hash/last_seen/missing_from_source documentados: SI
  • causa probable identificada: SI
  • mitigacion propuesta: SI
  • datos personales expuestos: NO

17. Snapshot controlado posterior - 2026-06-10

Referencia: docs/tenants/alpuntodeventa/business-observer/SOURCE-003-SNAPSHOT-001.md

Se ejecuto un snapshot controlado posterior de SOURCE-003 / Tabla 2 V2 para 2026-06-09, fecha cerrada mas reciente disponible al 2026-06-10. La extraccion forzo @ShowTabla2 = 1 y @ShowTabla1/3/4/5/6 = 0, con un unico resultset de Tabla 2.

Resultado agregado:

Metrica Resultado
filas 1886
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 nuevo snapshot queda valido como base congelada para piloto
  • no reemplaza la clasificacion de fuente viva ni elimina el riesgo de deriva
  • el siguiente intento de carga, si se aprueba, debe gatear contra el snapshot y no contra una expectativa historica reconstruida desde SGC vivo
  • no se ejecuto carga, sync, migracion ni escritura en destino