SOURCE-003 - SGC Ventas / Comprobantes calculados¶
Fecha: 2026-06-10
Estado: CANDIDATA VNEXT V2 / SNAPSHOT CARGADO EN PILOTO LOCAL / LINE_KEY_V4 AMARILLO ACEPTADO
Scope: tenant
tenant_id: alpuntodeventa
Owner: Gabi / Carlos Canu
Fuente de verdad:
docs/tenants/alpuntodeventa/business-observer/sources/SOURCE-003-SGC-VENTAS-COMPROBANTES.md
Autoridad SQL preservada anterior:
docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-TABLA2-AUTHORITY.sql
Autoridad SQL vNext candidate preservada:
docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY.sql
Autoridad SQL vNext candidate V2 preservada:
docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY-V2.sql
Documentos relacionados:
docs/tenants/alpuntodeventa/business-observer/sources/SOURCE-003-CHANNEL-TAXONOMY.mddocs/tenants/alpuntodeventa/business-observer/SOURCE-INVENTORY-RESULTS-003.mddocs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-LINE-IDENTITY-DECISION.mddocs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-DDL-DESIGN.mddocs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-QUERY-DELTA-REVIEW.mddocs/tenants/alpuntodeventa/business-observer/SOURCE-003-SNAPSHOT-001.md
1. Proposito¶
Documentar la fuente funcional de ventas y comprobantes calculados que el
Business Observer de APV debera usar en el futuro para leer ventas
historicas, detalle por item y comportamiento documental sin implementar nada,
sin crear tablas, sin crear scripts, sin tocar runtime y sin disenar SQL
productivo.
Regla critica:
- la query compartida por
Gabidebe tratarse como autoridad funcional estricta - la logica de calculo observada en esa query es sagrada
- no debe reemplazarse por campos crudos del
ERP - no debe simplificarse
IVA,IIBB, descuentos,CMV, notas de credito, guias, motivos niBalanceCtaCteFinal
2. Fuente base¶
La evidencia funcional compartida por Gabi indica que esta fuente nace de una
query calculada sobre estas bases operativas:
ecommerce.dbo.V_VENTASecommerce.dbo.VCLIENTESecommerce.dbo.PRODUCTSecommerce.dbo.VPROVEEDORES
Lectura prudente:
SOURCE-003no debe leerse como una tabla cruda aisladaSOURCE-003debe leerse como una salida calculada y compuesta- la autoridad no es una tabla individual sino la logica completa de la query
Credencial de origen ya identificada:
- alias canonico:
mssql:mssql-sgc-ecommerce
3. Evidencia funcional disponible¶
La evidencia funcional de esta fuente incluye estas autoridades preservadas:
- autoridad anterior:
docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-TABLA2-AUTHORITY.sql - autoridad
vNext candidate:docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY.sql - autoridad
vNext candidate V2:docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY-V2.sql - delta review V1 vs V2:
docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-QUERY-DELTA-REVIEW.md
Regla de preservacion:
- la autoridad anterior no se reemplaza ni se borra
- la query
vNextprevia queda preservada como V1 - la query actual completa pegada por
Gabiqueda versionada aparte como V2 candidata Gabiaclaro queHorafue omitida por olvido en el pegado y que debe quedar incluida en la query definitiva
Dentro de la autoridad V2 candidata existen varios selectores de salida:
DECLARE @ShowTabla1 BIT = 1DECLARE @ShowTabla2 BIT = 1DECLARE @ShowTabla3 BIT = 0DECLARE @ShowTabla4 BIT = 0DECLARE @ShowTabla5 BIT = 1DECLARE @ShowTabla6 BIT = 1
Confirmacion cerrada por Gabi:
Tabla 2es la unica salida que interesa para sincronizacionTabla 1,Tabla 3,Tabla 4,Tabla 5yTabla 6no deben sincronizarse como fuentes separadas- esas tablas deben tratarse como reportes derivados reconstruibles desde
Tabla 2 - la autoridad real no es
V_VENTASsola, sino la logica completa compuesta porV_VENTAS,VCLIENTES,PRODUCTS,VPROVEEDORESy calculos - la query completa debe quedar documentada paso a paso para futura
replicacion en
Python/Postgressi alguna vez hace falta
Lectura vNext obligatoria:
- la query preservada en
SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY.sqlpasa a tratarse como candidata vNext V1para la futura sync de ventas itemizadas- la query preservada en
SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY-V2.sqlpasa a tratarse comocandidata vNext V2revalidada para snapshot controlado de ventas itemizadas - no corresponde marcarla todavia como autoridad final de runtime o de sync
productiva porque falta diseno fisico ejecutable,
DDLy validacion de backfill antes de operar - la autoridad anterior sigue preservada como referencia historica de esta evolucion documental
- el ejemplo preservado hoy usa
@FechaDesde = '2026-06-08'y@FechaHasta = '2026-06-08' - esa fecha es solo un ejemplo de corrida y la query queda documentada como
parametrizable por
@FechaDesde / @FechaHasta
Cambio funcional visible en la candidata vNext:
- incorpora tratamiento explicito del codigo
4010para ajustes de saldos de cuenta corriente - documenta
CMVBrutocomo lectura economica principal observada en esta nueva version - mantiene a
Tabla 2como salida canonica candidata y aTabla 1/3/4/5/6como referenciasERP
Version documental recomendada para esta query:
SOURCE-003 vNext candidate V2 / Tabla 2 canonical sync output / 2026-06-10
Regla de no reemplazo silencioso:
- esta iteracion no declara a
SOURCE-003 vNext V2como autoridad final cerrada - esta iteracion si deja asentado que la nueva query completa es la candidata actual para esa autoridad futura
- la validacion real de inventario controlado de V1 queda documentada en
SOURCE-INVENTORY-RESULTS-003.md - V2 fue revalidada contra
SGCconTabla 2seleccionada explicitamente; queda habilitada solo para preparar snapshot controlado, no para carga o sync
Aclaracion obligatoria:
- este repositorio versiona la query completa autoridad como
SQLpreservado - este documento no redefine la query
- este documento solo deja asentado que la logica observada en esa query es la referencia funcional que debera respetarse en cualquier sync futuro
Estado de preservacion actual:
- existe evidencia funcional fuerte
- existe en este repo la query completa autoridad preservada como
SQL - existe validacion real de
Tabla 2 vNext V1en ventana controlada - existe V2 candidata preservada y revalidada en
Tabla 2con flags explicitos - la referencia oficial de preservacion queda en:
source-authority/SOURCE-AUTHORITY-REGISTRY.md
4. Decision documental vNext de sincronizacion¶
Decision documental vigente de SOURCE-003 vNext:
- sincronizar solo
Tabla 2 - no sincronizar
Tabla 1,Tabla 3,Tabla 4,Tabla 5niTabla 6como fuentes independientes - reconstruir
Tabla 1,Tabla 3,Tabla 4,Tabla 5yTabla 6como reportes derivados desdeTabla 2cuando negocio los necesite - aceptar
line_key_v4en estadoAMARILLO ACEPTADOpara sync inicial analitico deTabla 2, conhora_origen_sgc + line_sequence_v1 - preservar
Horaen V2 como campo obligatorio de la query definitiva, por aclaracion humana deGabi - usar V2 para snapshot controlado solo si la extraccion fuerza explicitamente
Tabla 2 - la carga piloto
001ya fue habilitada por gate posterior contraSOURCE-003-SNAPSHOT-001y quedo ejecutada enPostgreSQLlocal - mantener bloqueadas sync diaria, carga masiva y produccion final hasta aprobacion explicita posterior
Flags obligatorios para cualquier extractor futuro de Tabla 2:
| Flag | Valor obligatorio |
|---|---|
@ShowTabla1 |
0 |
@ShowTabla2 |
1 |
@ShowTabla3 |
0 |
@ShowTabla4 |
0 |
@ShowTabla5 |
0 |
@ShowTabla6 |
0 |
Regla:
- no depender de los defaults de V2
- no seleccionar resultsets por posicion implicita si la query se ejecuta con otros flags activos
- para sync,
Tabla 2debe ser la unica salida emitida o la unica salida explicitamente seleccionada por el extractor
Resultado agregado de revalidacion Tabla 2 V2 explicita:
| Metrica | Resultado |
|---|---|
| fecha controlada | 2026-06-08 |
| resultsets con filas | 1 |
filas Tabla 2 |
1262 |
columnas Tabla 2 |
68 |
| importe total | 24866892.52 |
CMV total |
19078909.1264 |
| clientes unicos | 124 |
| vendedores unicos | 23 |
SKU unicos |
178 |
Hora vacia o nula |
0 |
formato Hora observado |
HHMMSS |
duplicados line_key_v4 + line_sequence_v1 |
0 |
La fecha 2026-06-08 sigue sin ser snapshot estable; solo se uso para
comparar contra la deriva ya documentada.
Snapshot controlado posterior:
| Metrica | Resultado |
|---|---|
| documento | SOURCE-003-SNAPSHOT-001.md |
| fecha controlada | 2026-06-09 |
| archivo local | snapshots/source-003/SOURCE-003-TABLA2-V2-2026-06-09_20260610-210406-0300.csv |
filas Tabla 2 |
1886 |
columnas Tabla 2 |
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 |
Lectura:
2026-06-09queda como baseline congelada valida para un futuro piloto- cualquier carga posterior debe usar el snapshot como expectativa de gate, no
una relectura viva no congelada de
SGC - no se ejecuto carga, sync, migracion ni escritura en destino
Implicancia de gobierno:
SOURCE-003no equivale aV_VENTASsolaSOURCE-003equivale a la logica completa preservada en la query autoridad- cualquier implementacion futura debe respetar joins, reglas de signo, calculos, saneos y redondeos observados en esa query
Destino conceptual futuro:
- la base sincronizada recomendada para
PostgreSQL / OpenClawpasa a sersource_003_sales_items - el
DDLdocumental futuro de esa tabla queda endesign/SOURCE-003-SALES-ITEMS-DDL-DESIGN.mdy su SQL documental asociado queda endesign/sql/001_source_003_sales_items_design.sql - esa base debe nacer desde
Tabla 2 Tabla 1,Tabla 3,Tabla 4,Tabla 5yTabla 6quedan como referenciasERPy controles de conciliacion, no como fuente primaria de sync- la migracion piloto/documental puede prepararse con
line_key_v4, pero no debe presentarse como auditoria legal perfecta de renglonesERP - despues de revalidar V2, la carga piloto
001se ejecuto solo desdeSOURCE-003-SNAPSHOT-001; cualquier sync diaria, carga masiva, backfill o produccion final sigue bloqueado hasta aprobar el siguiente gate
5. Por que Tabla 2 es la salida principal¶
Tabla 2 debe tratarse como salida principal porque, segun la evidencia
compartida, es la capa donde queda expresada la composicion final por item de
BalanceCtaCteFinal.
Eso la vuelve la salida correcta para el observer por estas razones:
- expone granularidad por item, no solo resumen de cabecera
- conserva el contexto documental necesario para distinguir facturas, notas de credito, guias y otros motivos
- mantiene la logica calculada que negocio ya considera valida
- evita reconstruir a posteriori calculos sensibles desde campos crudos del
ERP - permite que
UC001aUC009consuman una misma lectura transaccional gobernada
Adicionalmente, Tabla 2 es la unica salida prudente para sync porque:
- preserva el mayor nivel de detalle util
- permite reconstruir reportes agregados sin perder contexto historico
- evita sincronizar multiples tablas ya resumidas que podrian divergir entre si
- concentra la logica documental de facturas, guias, notas de credito y motivos de devolucion en una sola lectura gobernada
Regla madre:
si existe diferencia entre un campo crudo del ERP y el resultado de
Tabla 2, la autoridad funcional para SOURCE-003 debe ser Tabla 2.
6. Grano funcional de Tabla 2¶
La confirmacion funcional vigente es:
Tabla 2representa el registro itemizado de cada comprobante, cliente, venta ySKU
Lectura prudente del grano:
- una fila representa una linea comercial calculada dentro de un comprobante
- el mismo comprobante puede tener multiples
SKU - el mismo comprobante podria repetir un mismo
SKUmas de una vez - por eso no alcanza con asumir unicidad por
tipo comprobante + numero + SKU
Recomendacion documental obligatoria para implementacion futura:
- definir una
line_keyrobusta - esa
line_keydebe distinguir lineas repetidas del mismoSKUdentro del mismo comprobante - si el origen no expone un identificador de linea visible, la replicacion futura debera documentar una clave funcional compuesta mas estable y una estrategia explicita para colisiones
Grano canonico recomendado para la futura base sincronizada:
fechaclientecomprobantedocumentoSKUseller_transactionallinea_tecnica
Traduccion operativa recomendada de ese grano:
tenant_idfechacodigo_clientetipo_compnro_comptipo_doc_intnro_int_docdocumentoskuseller_transactionalline_keyoline_idtecnico si el origen lo expone o si luego debe derivarse con criterio documentado
7. Campos principales de Tabla 2¶
Sin fijar alias definitivos ni disenar SQL final, la salida principal debe
conservar como minimo estos bloques funcionales observados:
| Bloque funcional | Lectura esperada |
|---|---|
| fecha de venta / fecha documental | fecha base del hecho comercial |
| tipo y numero de comprobante | identidad documental de la operacion |
| estado documental | lectura para distinguir documentos validos, anulados u otras variantes segun la query |
| cliente | referencia comercial del cliente vinculada a VCLIENTES |
| vendedor | ownership comercial de la venta |
| canal / ramo | contexto comercial transaccional observado en V_VENTAS |
SKU / articulo |
item vendido vinculado a PRODUCTS |
| descripcion / marca / proveedor | contexto comercial del item para cruce con producto y proveedor |
| cantidad / unidades | volumen transaccional del item |
| precio e importes base | valor de la linea segun la logica calculada |
| descuentos | componente de descuento calculado por la query |
IVA |
componente impositivo calculado por la query |
IIBB |
componente impositivo calculado por la query |
CMV |
componente de costo / margen segun la logica observada |
| notas de credito | tratamiento documental y de signo segun la query |
| guias y motivos | contexto documental que no debe perderse |
BalanceCtaCteFinal |
salida calculada final que da sentido a Tabla 2 |
Regla de documentacion:
- los nombres exactos de columnas deben seguir la query compartida por
Gabi - este documento solo fija los bloques funcionales que no pueden perderse
Campos reales principales observados en la salida Tabla 2 preservada:
- identidad documental:
Fecha,Hora,TipoComp,NroComp,TipoDocInt,NroIntDoc,Documento - cliente:
CodigoCliente,Nombre,Direccion_de_pedidos,Condicion_Fiscal - vendedor transaccional:
Vendedor,NomVendedor - item:
SKU,Articulo,Marcas - pricing e importes por item:
Precio_Neto_Unitario,Precio_Neto_Unitario_CDescLinea,Precio_Neto_Unitario_CDescPie,SubtotalNetoItem_cDescLinea,ImponibleNetoItem,Importe_Total_Item,Importe_Total_Todos_los_Items - descuentos:
PorcDescLinea,DescNetoUnitarioXLinea,DescAlPie,Desc_Pie_Unitario_Neto,Total_Desc_Neto_Linea,Total_Desc_Neto_Al_Pie,Total_Desc_NP - impuestos:
IVA,PercIIBB,AlicuotaPercIIBBCalculada,PercIIBBItemUnidad,PercIIBBItemImporte,IVAItemUnidad,IVATotalItems - costos y margen:
CostoLista,descCompra1,descCompra2,CMV_Neto_Unitario,CMV_Neto_Total_Item,Factor_de_Correccion_Compra_Articulo,Markup,MaxDctoArticulo,Contribucion_BalanceCtaCteFinal - clasificacion documental:
Indicador_TipoRegistro,MotivoDevolucion - logistica y canal:
Lista_De_Precio,Proveedor,RazonSocial_Proveedor,HojaDeRuta,DireccionEntrega,LocalidadEntrega,ProvinciaEntrega,CodRepartidor,Repartidor,Zona,Ramo,Canal,Grupo,Rubro - metricas fisicas:
Unidades,Peso_Total,Volumen_Total,Cant_Bultos_Vendidos
8. Campos indispensables a preservar¶
Para no depender del maestro actual si cambia despues de la transaccion, la
salida sincronizable de Tabla 2 debe preservar como minimo:
- identidad documental: fecha, tipo de comprobante, numero de comprobante, documento interno, documento visible y cualquier otro identificador expuesto por la query
- contexto comercial de la transaccion: cliente, vendedor, canal, ramo, condicion fiscal, motivos documentales y reglas de signo
- identidad de item:
SKU, descripcion y cualquier identificador de linea que exista o pueda derivarse de forma robusta - contexto historico del producto al momento de la venta: marca, proveedor, razon social del proveedor, costo, precio, descuentos, impuestos, peso, volumen y bultos
- valores economicos calculados:
Total_NetoSD,Venta_Total,Total_IIBB,Total_IVA,DescAlPie_Importe_Item, descuentos permitidos,CMVyBalanceCtaCteFinal - metricas fisicas: unidades, peso total, volumen total y cantidad de bultos vendidos
Confirmacion semantica cerrada:
Proveedor= codigo proveedorRazonSocial_Proveedor= nombre / razon social del proveedor
Confirmacion semantica adicional al 2026-06-09:
SOURCE-003expone un campo real de canal:LTRIM(RTRIM(v.Canal)) AS CanalSOURCE-003expone tambienLTRIM(RTRIM(v.Ramo)) AS Ramo- la taxonomia funcional parcial observada para esos campos queda documentada
en:
sources/SOURCE-003-CHANNEL-TAXONOMY.md
Confirmacion semantica adicional al 2026-06-10:
SOURCE-003exponeLTRIM(RTRIM(v.Hora)) AS HoraHoraexiste enecommerce.dbo.V_VENTAScomochar(6) NOT NULLHoradebe documentarse en destino comohora_origen_sgc- es valor raw de
SGC - formato observado esperado:
HHMMSS, ejemplo085923 - no debe usarse como timestamp unico sin validacion
- debe tratarse como parte candidata de identidad de linea
- en V2,
Horaqueda preservada por aclaracion humana posterior al pegado de la query actual; no debe removerse de la salida definitiva deTabla 2
9. Logica funcional observada paso a paso¶
La query autoridad debe poder replicarse en el futuro con una lectura mas clara si hiciera falta. A nivel documental, la secuencia observada es esta:
- toma una ventana por fecha y filtros opcionales
- arma una base cruda desde
V_VENTAS - enriquece esa base con cliente desde
VCLIENTES - enriquece el item con producto y atributos fisicos/comerciales desde
PRODUCTS - enriquece proveedor desde
VPROVEEDORES - sanea textos, numeros y formatos antes de calcular
- clasifica tipos de comprobante, notas de credito, guias y motivos
- aplica reglas de signo y tratamiento economico segun tipo de comprobante y condicion fiscal
- calcula importes netos, brutos, impuestos, descuentos, creditos y
CMVcon precision interna mayor a la salida final - compone
Tabla 2a nivel itemizado - deriva desde esa base los reportes agregados de
Tabla 1,Tabla 3,Tabla 4,Tabla 5yTabla 6
Lectura operativa obligatoria:
- la futura replicacion no debe empezar desde una tabla ya resumida
- debe reproducir la secuencia funcional completa
- la paridad debe medirse contra
Tabla 2, no contra reportes agregados
10. Tabla 2 como salida canonica de sync¶
Lectura conceptual obligatoria:
Tabla 2es la salida canonica futura para sincronizar ventas itemizadas haciaPostgreSQL / OpenClaw- la query completa sigue siendo el motor de calculo
ERP - la sync no debe intentar usar
Tabla 1/3/4/5/6como base primaria PostgreSQLdebe guardar el itemizado y luego producir sus propios agregados, snapshots o materializaciones derivadas
Tabla base sugerida para esa sync futura:
source_003_sales_items
Campos tecnicos minimos recomendados para esa tabla futura:
tenant_idsource_systemsource_objectsource_query_versionsource_row_hashsync_batch_idextracted_atlast_seen_atcreated_atupdated_at
Capas de dato recomendadas dentro de esa tabla futura:
- datos
rawrelevantes preservados desdeTabla 2 - datos normalizados para consumo
- metricas calculadas por item
- trazabilidad completa de sync
11. Tablas auxiliares como referencia ERP¶
Las demas salidas de la query deben conservarse documentadas, pero con este rol:
Tabla 1: totales porcliente + fecha; base agregada inmediata del calculoERPTabla 3: totales consolidados por fechaTabla 4: totales por fecha y vendedorTabla 5: totales por vendedor en el rangoTabla 6: consolidado unico del rango
Reglas de uso:
- no se sincronizan como fuente primaria
- sirven como modelo de calculo del
ERP - sirven como control de conciliacion contra
ERP - sirven para validar futuros agregados que
PostgreSQLderive desdesource_003_sales_items - sirven como referencia de calculo para:
totales por
cliente + fecha, totales por fecha, totales por fecha y vendedor, totales por vendedor en rango y consolidado general
12. Calculos relevantes observados¶
Calculos economicos y fisicos que la documentacion vNext debe preservar como
obligatorios:
- neto:
Total_NetoSD,Precio_Neto_Unitario,ImponibleNetoItem - bruto:
Venta_Total,Importe_Total_Todos_los_Items,BalanceCtaCteFinal / Contribucion_BalanceCtaCteFinal IVA:Total_IVA,IVAItemUnidad,IVATotalItemsIIBB:Total_IIBB,PercIIBBItemUnidad,PercIIBBItemImporte- descuentos:
DescAlPie_Importe_Item,PorcDescLinea,Total_Desc_Neto_Linea,Total_Desc_Neto_Al_Pie CMV:CMVNeta_Item,CMVTotal_Item,CMV_Neto_Unitario,CMV_Neto_Total_Item- contribucion:
Contribucion_BalanceCtaCteFinal - creditos
NP:Total_Credito_NP_3793,Total_Credito_NP_3998,Credito_NP_3793_Neto,Credito_NP_3998_Neto - ajustes de cuenta corriente:
BalanceCtaCteFinal,BalanceCtaCteNeto,Dinero_Disponible_Segun_Balance - mermas:
Total_Credito_MERMAS,Credito_MERMAS_Neto,Total_Credito_Mermas_Roturas_Vencidos - peso:
Peso_Total_Item / Peso_Total - volumen:
Volumen_Total_Item / Volumen_Total - bultos:
Cant_Bultos_Vendidos_Item / Cant_Bultos_Vendidos
13. Tipos de comprobante, anulaciones y reglas de signo¶
La confirmacion funcional vigente es:
- dentro de la query ya se contemplan tipos de comprobantes que anulan o corrigen
Por lo tanto:
- la lectura futura no debe asumir que todo comprobante suma en positivo
- facturas, notas de credito, guias y variantes documentales deben respetar la logica de signo observada en la query
- la forma correcta de interpretar anulaciones, correcciones o compensaciones es la logica documental ya preservada, no una heuristica externa simplificada
- si la implementacion futura traduce esto a
Python/Postgres, debera dejar una tabla de reglas o un bloque de paridad explicito por tipo de comprobante
14. Parametros configurables futuros¶
Si en una sincronizacion futura hiciera falta parametrizar la lectura, los parametros documentados y permitidos deberian ser:
FechaDesdeFechaHastaFiltroMarcaFiltroProveedorFiltroVendedorFiltroCliente
Lectura de gobierno:
- estos parametros se documentan como capacidad futura
- no autorizan a cambiar la logica sagrada de calculo
- deben usarse como recorte de lectura o debug, no como reemplazo de reglas de negocio
Aclaracion de parametrizacion:
- la query preservada usa una fecha de ejemplo puntual
- esa fecha no debe leerse como restriccion estructural
- la frontera temporal oficial de esta documentacion queda expresada por
@FechaDesde / @FechaHasta
15. Estrategia futura de sincronizacion¶
Sin implementar nada, la estrategia futura recomendada para esta fuente es:
- hacer una carga historica inicial controlada
- tomar snapshot diario de
Tabla 2para congelar evidencia - sincronizar una ventana movil inicial sugerida de
10dias para cubrir una semana operativa aproximada mas margen - recalcular siempre esa ventana usando la query compartida por
Gabicon seleccion explicita deTabla 2 - hacer
upsertportenant_id + line_key - comparar
source_row_hashpara detectar cambios de valores - refrescar
last_seen_atcuando la linea reaparece sin cambios - actualizar valores cuando cambia
source_row_hash - marcar
missing_from_sourcesi una linea deja de aparecer en una extraccionfullo ventana controlada - no hacer
hard delete - congelar fechas piloto desde snapshot, no desde
SGCvivo - conservar trazabilidad completa de la corrida
Justificacion funcional:
- ventas y comprobantes pueden modificarse despues del primer alta
- liquidacion de entregas, rechazos de clientes, anulaciones, refacturacion, descuentos posteriores, notas de credito, ajustes de cuenta corriente y cambios operativos de cobro/entrega pueden impactar dias recientes
- una fecha ya cargada puede cambiar si se reextrae desde
SGCvivo - una linea puede aparecer, cambiar valores, desaparecer de la extraccion activa, quedar anulada o recibir nota de credito o ajuste posterior
- recalcular por ventana protege la logica sagrada sin depender de supuestos parciales
16. Estrategia futura de actualizacion y trazabilidad¶
Sin disenar tablas finales, esta fuente debera prever como minimo:
line_key_v4source_row_hash_v1sync_batch_idextracted_atlast_seen_atorigen- ventana sincronizada
- estado raw del comprobante si la salida o una extension futura de autoridad lo expone
Clave funcional vigente para sync inicial¶
La identidad futura aceptada para sync inicial analitico es line_key_v4 en
estado AMARILLO ACEPTADO, documentada en
design/SOURCE-003-LINE-IDENTITY-DECISION.md.
La clave sale de la propia granularidad de Tabla 2, combinando:
- fecha documental
- hora de origen
SGC - tipo de comprobante
- numero de comprobante
- cliente
SKU- vendedor transaccional
line_sequence_v1
Regla de cuidado:
line_key_v4no es identidad fisica legal perfecta delERP- no debe inventarse una clave que colapse lineas distintas o mezcle notas de credito con ventas normales
- debe contemplar explicitamente el caso de un mismo comprobante con el mismo
SKUrepetido mas de una vez - si el
ERPexpone en el futuro un id fisico de detalle, la identidad debera evolucionar de forma versionada
Resultado de inventario controlado inicial 2026-06-10:
Tabla 2 vNextejecuto en solo lectura para la ventana2026-06-08a2026-06-08- la candidata
Efecha + tipo_comp + nro_comp + documento + sku + vendedorno duplico en1269filas medidas - no se observo un
line_idestable expuesto porecommerce.dbo.V_VENTAS - el
IdFilaobservado en la autoridad es tecnico de sesion y no debe usarse como clave persistida - propuesta inicial previa a la revalidacion mayor:
text
line_key_v1 = sha256(canonical(
fecha,
tipo_comp,
nro_comp,
tipo_doc_int,
nro_int_doc,
documento,
codigo_cliente,
sku,
vendedor
))
Revalidacion mayor e investigacion de identidad de linea 2026-06-10:
line_key_v1fallo unicidad en la ventana2026-05-05a2026-06-09- no se encontro
line_id_sourceapto en la metadata visible deecommerce.dbo.V_VENTAS - las columnas candidatas
ImpIntLinea,Localidad,PorcDescLinea,RepartidoryUnidadesno son identificadores reales de linea line_sequence_v1queda recomendado como columna tecnica generada por pipeline, no como dato fuenteline_key_v2queda preservada como evidencia previa con unicidad agregada:
text
line_key_v2 = sha256(canonical(
fecha,
tipo_comp,
nro_comp,
tipo_doc_int,
nro_int_doc,
documento,
codigo_cliente,
sku,
vendedor,
line_sequence_v1
))
line_key_v2conline_sequence_v1no duplico en la corrida exacta de48973filasHorafue confirmada comochar(6) NOT NULLenV_VENTASy agregada aTabla 2inmediatamente a la derecha deFechaline_key_v3sumaHoraa la clave natural sinline_sequence_v1:
text
line_key_v3 = sha256(canonical(
fecha,
hora,
tipo_comp,
nro_comp,
tipo_doc_int,
nro_int_doc,
documento,
codigo_cliente,
sku,
vendedor
))
line_key_v3fallo con6claves duplicadas y12filas involucradas- todos los duplicados restantes de
line_key_v3comparten la mismaHora Horaayuda a trazabilidad y debe conservarse como parte candidata de identidad, pero no alcanza solaline_key_v4queda aceptada como:
text
line_key_v4 = sha256(canonical(
fecha,
hora_origen_sgc,
tipo_comp,
nro_comp,
tipo_doc_int,
nro_int_doc,
documento,
codigo_cliente,
sku,
vendedor,
line_sequence_v1
))
- la conclusion es
AMARILLO ACEPTADO, noVERDE, porque existen3grupos y6filas absolutamente identicas en la salidaTabla 2 - no existe
line_id_sourcefisico en la vistaSGCdisponible - el
DDLdocumental debe incluirhora_origen_sgc,line_sequence_v1yline_key_v4 - la migracion piloto/documental puede avanzar para analitica,
BI,IAyML, pero no como auditoria legal perfecta de renglonesERP
Trazabilidad minima futura¶
source_row_hash_v1: para detectar cambios reales en lineas ya sincronizadassync_batch_id: para identificar la corrida que observo o actualizo la filaextracted_at: para saber cuando se leyo la fila desdeSGClast_seen_at: para saber cuando una linea fue vista por ultima vez sin hard deleteorigen: debe registrarmssql:mssql-sgc-ecommerce- ventana sincronizada: para dejar evidencia del rango recalculado en cada corrida
missing_from_source: para marcar desapariciones dentro de extraccionesfullo ventanas controladas
source_row_hash recomendado por inventario 2026-06-10:
- version:
source_row_hash_v1 - campos base:
fecha,hora_origen_sgc,tipo_comp,nro_comp,tipo_doc_int,nro_int_doc,documento,codigo_cliente,vendedor,sku,unidades,precio_neto_unitario,imponible_neto_item,iva,iibb,importe_total_todos_los_items,cmv_bruto_item,descuentos,canal,ramo,motivo_devolucion - canonicalizar textos, fechas y decimales antes de calcular el hash
- no usar nombre de cliente, importes como identidad ni campos no deterministas de sesion como clave
17. Precision y redondeo¶
Decision documental obligatoria:
- la salida sincronizada de
Tabla 2debe preservar suficiente precision para evitar diferencias futuras por redondeo
Lectura tecnica prudente:
- la query autoridad calcula varios valores internos con mas precision y recien despues expone salidas redondeadas
- una futura replicacion en
Python/Postgresno deberia recalcular desde valores ya redondeados si eso cambia resultados - si hubiera que persistir una capa sincronizada, conviene preservar valores con precision suficiente para reproducir agregados sin drift acumulado
18. Tablas derivadas futuras en PostgreSQL¶
Tablas o lecturas derivadas conceptuales futuras recomendadas desde
source_003_sales_items:
analytics_sales_dailyanalytics_sales_by_seller_dailyanalytics_sales_by_customer_dailyanalytics_sales_by_product_dailyanalytics_sales_by_brand_dailyanalytics_sales_by_supplier_dailyanalytics_sales_rejections_dailyanalytics_cmv_margin_dailyanalytics_sales_logistics_daily
Ejemplos conceptuales de agregacion futura desde source_003_sales_items:
- ventas netas por dia
- ventas brutas por dia
CMVpor dia- margen o contribucion por dia
- ventas por vendedor
- ventas por cliente
- ventas por
SKU - ventas por marca y proveedor
- bultos, peso y volumen por fecha o ruta
- rechazos, notas de credito y mermas
19. Casos de uso consumidores¶
Esta fuente calculada tiene relacion directa con todos los casos de uso del observer:
UC001UC002UC003UC004UC005UC006UC007UC008UC009
Lectura resumida:
UC001necesita ultima compra, frecuencia y comportamiento documentalUC002necesita ventas por cliente, vendedor, marca ySKUUC003necesita medir antes y despues de accionesUC004necesita entender que se vendio, que se devolvio y donde hubo impacto economicoUC005necesita una base temporal confiable de comprobantesUC006necesita importes calculados, descuentos, impuestos yCMVUC007necesita senales comerciales confiables y trazablesUC008necesita detalle por item para leer surtido y mixUC009necesita impacto por proveedor, marca ySKU
20. Riesgos¶
Riesgos principales de esta fuente:
- tocar calculos sagrados
- elegir la tabla equivocada y no la salida calculada correcta
- usar campos crudos en lugar de la logica de la query
- no detectar modificaciones dentro de la ventana movil inicial de
10dias o definir una ventana demasiado corta para la operacion real - duplicar lineas por una clave funcional incompleta
- no identificar correctamente notas de credito
- perder precision y generar diferencias futuras por redondeo
- asumir unicidad por comprobante +
SKUcuando el mismoSKUpuede repetirse - no contar con un
line_id_sourcefisico visible en el origen - depender de
line_sequence_v1cuando existen ocurrencias absolutamente identicas - asumir que
Horaes un timestamp unico de linea; la revalidacion mostro que los duplicados restantes comparten la mismaHora - depender del maestro actual de
PRODUCTSpara reconstruir despues costo, proveedor, marca o atributos que deberian quedar congelados en la venta
Riesgo rector:
convertir SOURCE-003 en una lectura simplificada del ERP en vez de respetar
la composicion calculada de Tabla 2.
21. Pendientes abiertos¶
Pendientes que siguen abiertos:
- ampliar validacion de
Tabla 2 V2a una ventana movil o backfill antes de ejecutar cualquierDDL - usar el snapshot controlado de
Tabla 2 V2para2026-06-09como baseline congelada antes de cualquier nuevo intento de carga piloto - comparar totales de
Tabla 2contraTabla 3,Tabla 4,Tabla 5yTabla 6 - confirmar con evidencia si la ventana movil inicial de
10dias es suficiente o debe ampliarse - revisar humanamente el
DDLdocumental desource_003_sales_items - revisar nuevamente la migracion piloto/documental de
source_003_sales_itemsconline_key_v4solo despues de revalidar V2, sin produccion final - convertir el piloto en migracion productiva solo cuando exista ambiente destino aprobado, validacion adicional y aprobacion final
- confirmar schema, permisos y estrategia de particionado
- definir
materialized views - definir performance real
- definir permisos de consumo
- confirmar si los filtros futuros quedan solo para debug o tambien para sync
Pendientes ya cerrados en esta iteracion:
Tabla 2es la unica salida a sincronizarTabla 1,Tabla 3,Tabla 4,Tabla 5yTabla 6son reportes derivados- la logica documental ya contempla comprobantes que corrigen o anulan segun tipo y signo
Tabla 2 vNextfue validada en solo lectura con datos reales para la ventana2026-06-08line_key_v1queda preservada como clave historica fallida en ventana mayor- no se encontro
line_id_sourceapto en metadata visible deV_VENTAS Horaqueda agregada aTabla 2como valor raw deSGCline_key_v2queda preservada como evidencia previa con unicidad agregadaline_key_v3queda preservada como fallida porque los duplicados comparten la mismaHoraline_key_v4queda aceptada conhora_origen_sgc + line_sequence_v1y conclusionAMARILLO ACEPTADOsource_row_hash_v1queda preservado con campos canonicos recomendadosTabla 2 V2queda revalidada conHoraincluida y seleccion explicita de resultset para la fecha minima controlada2026-06-08- V2 queda habilitada para preparar snapshot controlado, no para carga ni sync
SOURCE-003-SNAPSHOT-001queda capturado para2026-06-09con1886filas, hash global y agregados documentadosline_key_v4,hora_origen_sgc,line_sequence_v1,source_row_hash_v1, checks e indices quedan llevados a disenoDDLdocumental revisable parasource_003_sales_items- la conciliacion minima
Tabla 2vsTabla 1fue ejecutada con diferencias residuales por redondeo
Documento futuro recomendado, sin implementar todavia:
docs/tenants/alpuntodeventa/business-observer/SOURCE-003-PYTHON-POSTGRES-REPLICATION-DESIGN.md
Objetivo esperado de ese documento futuro:
- describir la logica original paso a paso
- proponer una logica equivalente mas clara para
Python/Postgres - dejar checklist de paridad contra
Tabla 2
18. Relacion con otras fuentes¶
Relacion funcional esperada:
SOURCE-001aporta maestro de clientes y ownership comercial baseSOURCE-002aporta maestro de productos porSKUSOURCE-003aporta el hecho transaccional calculado de ventas y comprobantesSOURCE-002CySOURCE-002Dno reemplazan esta fuente porque resuelven stock, no ventas calculadas
Regla de separacion:
SOURCE-003no debe mezclarse conSOURCE-002SOURCE-003no debe reinterpretarse como una fuente de stockSOURCE-003gobierna ventas calculadas y comportamiento documental
Regla documental adicional para territorio comercial:
SOURCE-003es la fuente transaccional que permite medir el territorio comercial real del vendedor- la pregunta por territorio del vendedor no debe responderse con
Zonaaislada deSOURCE-001 - la lectura correcta debe cruzar clientes asignados y geografia desde
SOURCE-001con ventas reales desdeSOURCE-003y atributos de producto desdeSOURCE-002
19. Confirmaciones de alcance¶
- no se implemento codigo
- no se crearon tablas
- no se crearon scripts
- no se toco runtime
- no se toco
VPS - se ejecuto conexion real de solo lectura contra
SGCpara inventario - no se diseno
SQLproductivo - no se modifico la query compartida por
Gabi - la logica de la query queda documentada como autoridad funcional estricta