SOURCE-003 Sales Items DDL Design¶
Fecha: 2026-06-10
Estado: DISENO DOCUMENTAL / CARGA PILOTO 001 EJECUTADA / 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-DDL-DESIGN.md
SQL relacionados:
docs/tenants/alpuntodeventa/business-observer/design/sql/001_source_003_sales_items_design.sqldocs/tenants/alpuntodeventa/business-observer/design/sql/002_source_003_sales_items_pilot_migration.sqldocs/tenants/alpuntodeventa/business-observer/design/sql/002_source_003_sales_items_pilot_rollback.sql
Documentos relacionados:
docs/governance/standards/DATA-DESIGN-STANDARD.mddocs/tenants/alpuntodeventa/business-observer/design/POSTGRES-PHYSICAL-ARCHITECTURE.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-PILOT-MIGRATION.mddocs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-PILOT-LOAD.mddocs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-PILOT-LOAD-001.mddocs/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/SOURCE-003-DRIFT-ANALYSIS-001.mddocs/tenants/alpuntodeventa/business-observer/sources/SOURCE-003-SGC-VENTAS-COMPROBANTES.mddocs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY.sqldocs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY-V2.sqldocs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-003-QUERY-DELTA-REVIEW.mddocs/tenants/alpuntodeventa/business-observer/BUSINESS-OBSERVER-DATA-CONTRACT-001.md
1. Proposito¶
Disenar documentalmente el DDL futuro de la tabla PostgreSQL
source_003_sales_items, usando la evidencia validada de
SOURCE-003 / Tabla 2 vNext, line_key_v4 y source_row_hash_v1.
Este documento nacio como propuesta revisable para una migracion futura. La
implementacion piloto posterior quedo limitada a PostgreSQL local y
documentada como excepcion controlada; no habilita produccion final.
Registro V2 2026-06-10:
SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY-V2.sqlqueda registrada como candidata actualHoradebe permanecer incluida en la query definitiva por aclaracion humana deGabi- el delta V1 vs V2 queda clasificado como
MEDIOporque V2 conservaTabla 2,Hora, joins, filtros y calculos, pero cambia flags de salida - este
DDLno queda invalidado textualmente, pero queda pendiente de revalidacion contraTabla 2 V2antes de cualquier migracion, snapshot, carga o sync
La identidad line_key_v4 queda aceptada humanamente en estado
AMARILLO ACEPTADO para sync inicial analitico. Esa aceptacion permite
preparar una migracion piloto/documental ejecutable, pero no habilita
produccion final ni auditoria legal perfecta de renglones ERP.
La version revisada del SQL piloto queda preparada documentalmente y no fue
ejecutada en esta revision. Vive en
design/sql/002_source_003_sales_items_pilot_migration.sql, con rollback
piloto historico en design/sql/002_source_003_sales_items_pilot_rollback.sql.
Registro de diccionario completo 2026-06-10:
- el snapshot controlado
SOURCE-003-SNAPSHOT-001confirma68columnas reales enTabla 2 V2 - el DDL piloto anterior contemplaba semanticamente
37columnas y dejaba31columnas faltantes o solo consolidadas - quedan creados el diccionario completo de columnas y el mapping CSV/PostgreSQL
- la persistencia futura debe preservar las
68columnas reales de Tabla 2 V2 como columnas estructuradas o mapping directo documentado source_row_hash_v1debe cubrir las68columnas reales canonicalizadas antes de cualquier carga- la carga piloto quedaba bloqueada hasta aprobacion humana del diccionario y
mapping; esa aprobacion fue registrada posteriormente y la carga piloto
001quedo ejecutada desdeSOURCE-003-SNAPSHOT-001
2. Limites¶
Este documento es modo DESIGN. La revalidacion de Hora pertenece al modo
INVENTORY y queda documentada en
SOURCE-INVENTORY-RESULTS-003.md.
No incluye:
- ejecucion de migraciones
- ejecucion del SQL piloto
- creacion de tablas fisicas
- queries operativas de sync contra
SGC - cambios en
PostgreSQL - cambios en runtime
- cambios en
VPS - cambios en
Docker - definicion final de schema destino
- aprobacion para carga productiva
3. Evidencia validada¶
La propuesta se apoya en el inventario controlado de
SOURCE-003 / Tabla 2 vNext ejecutado para la ventana 2026-06-08.
Resultado: VERDE.
Metricas observadas:
| Metrica | Resultado |
|---|---|
| filas | 1269 |
| clientes unicos | 125 |
| comprobantes unicos | 305 |
SKU unicos |
178 |
| vendedores unicos | 23 |
filas con SKU vacio |
0 |
| filas con cliente vacio | 0 |
| filas con vendedor vacio | 0 |
| filas con documento o comprobante vacio | 0 |
filas con CMVBruto_Item nulo o cero |
6 |
Conciliacion minima contra Tabla 1:
| Comparacion | Diferencia |
|---|---|
importe Tabla 2 vs Tabla 1 |
0.28 |
CMV Tabla 2 vs Tabla 1 |
0.01 |
Lectura:
- las diferencias son residuales y compatibles con redondeos
Tabla 2 vNextqueda como candidata canonica para ventas itemizadas- la validacion todavia cubre una ventana chica y debe ampliarse antes de produccion
Revalidacion mayor 2026-06-10:
| Metrica | Resultado |
|---|---|
| ventana | 2026-05-05 a 2026-06-09 |
| fechas con datos | 30 |
filas Tabla 2 |
48976 |
claves line_key_v1 distintas |
48970 |
claves line_key_v1 duplicadas |
6 |
| filas involucradas en duplicados | 12 |
| grupos con salida completa identica | 3 |
Resultado de esa revalidacion: ROJO.
Lectura:
line_key_v1no sostiene unicidad para indice unico- agregar importes,
source_row_hash_v1, campos logisticos o todas las columnas expuestas no resuelve todos los duplicados - las escalas numericas observadas quedan cubiertas por los tipos documentales actuales
- el diseno no debe convertirse en migracion ejecutable hasta definir un
line_sequence_v1estable o un identificador funcional de linea
Investigacion de identidad de linea 2026-06-10:
| Metrica | Resultado |
|---|---|
| ventana | 2026-05-05 a 2026-06-09 |
filas Tabla 2 medidas en la corrida exacta |
48973 |
columnas candidatas de metadata V_VENTAS |
5 |
columnas aptas como line_id_source |
0 |
claves line_key_v2 con line_sequence_v1 distintas |
48973 |
claves line_key_v2 duplicadas |
0 |
| grupos absolutamente identicos | 3 |
| filas en grupos absolutamente identicos | 6 |
Resultado vigente: AMARILLO ACEPTADO.
Lectura:
- no existe
line_id_sourceapto en la metadata visible deV_VENTAS line_sequence_v1resuelve unicidad agregada, pero tiene riesgo documentado cuando dos ocurrencias son absolutamente identicasline_key_v1queda preservada como historicamente fallidaline_key_v2queda preservada como clave con unicidad agregada previa- la decision humana acepta el riesgo residual para sync inicial analitico
- el diseno sigue sin habilitar produccion final ni auditoria legal perfecta de
renglones
ERP
Revalidacion de Hora y line_key_v3 2026-06-10:
| Metrica | Resultado |
|---|---|
| ventana | 2026-05-05 a 2026-06-09 |
v.Hora en V_VENTAS |
char(6) NOT NULL |
filas Tabla 2 medidas |
48973 |
columnas Tabla 2 con Hora |
68 |
posicion Hora en salida |
2 |
filas con Hora formato HHMMSS |
48973 |
claves line_key_v3 distintas |
48967 |
claves line_key_v3 duplicadas |
6 |
filas involucradas en duplicados line_key_v3 |
12 |
duplicados line_key_v3 con misma Hora |
6 grupos / 12 filas |
Lectura:
Horadebe preservarse comohora_origen_sgc- es valor raw de
SGC, con formato observado esperadoHHMMSS - ejemplo documental de formato:
085923 - no debe usarse como timestamp unico sin validacion
line_key_v3falla porque los duplicados restantes comparten la mismaHora- la clave documental aceptada pasa a ser
line_key_v4, combinandohora_origen_sgcconline_sequence_v1
Deriva operativa confirmada 2026-06-10:
| Metrica | Historico | Observado posterior | Delta |
|---|---|---|---|
filas Tabla 2 para 2026-06-08 |
1269 |
1262 |
-7 |
suma Importe_Total_Todos_los_Items |
24852533.32 |
24866892.52 |
14359.20 |
suma CMVBruto_Item |
19122718.36 |
19078909.1264 |
-43809.2336 |
Lectura de diseno:
SOURCE-003 / SGC Ventases una fuente viva, no un historico congelado por fecha de comprobante- el
SGCpuede modificar, anular, refacturar o ajustar comprobantes aproximadamente hasta7dias hacia atras por entregas, rechazos, cobros, descuentos, notas de credito, cuenta corriente y cambios operativos de entrega o cobranza - no debe usarse incremental simple basado solo en
ultima fecha cargada - la tabla futura debe tolerar que una linea aparezca, cambie valores, desaparezca de una extraccion activa, quede anulada o reciba una nota de credito/ajuste posterior
- el freeze date de pilotos y conciliaciones debe salir de snapshot, no de una
relectura posterior de
SGCvivo
4. Tabla propuesta¶
Nombre futuro:
text
source_003_sales_items
Capa conceptual:
text
raw/core
Grano:
text
una linea calculada de Tabla 2 por tenant, documento, cliente, SKU,
vendedor transaccional, hora_origen_sgc, line_sequence_v1 y line_key_v4
Clave logica documental propuesta:
text
unique (tenant_id, line_key)
Estado vigente de esa clave:
text
line_key debe representar line_key_v4; version revisada de migracion piloto
documental preparada y no ejecutada en esta revision; produccion final
pendiente
Regla central:
ides identidad tecnica internaline_sequence_v1es una columna tecnica generada por pipeline, no dato fuentetenant_id + line_keyrepresenta la identidad logica solo siline_keycontieneline_key_v4line_key_v1no alcanza como identidad logica unica con la evidencia vigenteline_key_v3tampoco alcanza porqueHorano distingue las colisiones observadassource_row_hashdetecta cambios de valores de la linea- no se usa
IdFilade la autoridad SQL como clave persistida porque es tecnico de sesion - la clave final suma
hora_origen_sgcyline_sequence_v1, con riesgo residual aceptado para filas absolutamente identicas
5. Columnas principales¶
Identidad interna¶
| Columna | Tipo propuesto | Nulabilidad | Uso |
|---|---|---|---|
id |
uuid |
not null |
identidad tecnica interna |
tenant_id |
text |
not null |
aislamiento tenant |
line_key |
text |
not null |
line_key_v4 versionada de linea |
line_sequence_v1 |
integer |
not null |
secuencia tecnica generada por pipeline |
source_row_hash |
text |
not null |
preserva source_row_hash_v1 para deteccion de cambios de valores |
Trazabilidad¶
| Columna | Tipo propuesto | Nulabilidad | Uso |
|---|---|---|---|
source_system |
text |
not null |
alias origen, por ejemplo mssql:mssql-sgc-ecommerce |
source_object |
text |
not null |
objeto/logica origen, por ejemplo SOURCE-003 Tabla 2 vNext |
source_query_version |
text |
not null |
version de autoridad de extraccion |
sync_batch_id |
uuid |
not null |
lote de sync futuro |
extracted_at |
timestamptz |
not null |
momento de lectura desde origen |
last_seen_at |
timestamptz |
not null |
ultima observacion valida |
created_at |
timestamptz |
not null default now() |
alta tecnica interna |
updated_at |
timestamptz |
not null default now() |
actualizacion tecnica interna |
record_status |
text |
not null |
estado tecnico/funcional |
Identidad documental¶
| Columna | Tipo propuesto | Nulabilidad |
|---|---|---|
fecha |
date |
not null |
hora_origen_sgc |
text |
not null |
tipo_comp |
text |
not null |
nro_comp |
text |
not null |
tipo_doc_int |
text |
not null |
nro_int_doc |
text |
not null |
documento |
text |
not null |
condicion_fiscal_raw |
text |
null |
Cliente¶
| Columna | Tipo propuesto | Nulabilidad |
|---|---|---|
codigo_cliente |
text |
not null |
cliente_nombre_raw |
text |
null |
direccion_de_pedidos_raw |
text |
null |
Vendedor transaccional¶
| Columna | Tipo propuesto | Nulabilidad |
|---|---|---|
vendedor_codigo |
text |
not null |
vendedor_nombre_raw |
text |
null |
Producto/item¶
| Columna | Tipo propuesto | Nulabilidad |
|---|---|---|
sku |
text |
not null |
articulo_raw |
text |
null |
marca_raw |
text |
null |
proveedor_codigo_raw |
text |
null |
proveedor_nombre_raw |
text |
null |
Canal/contexto¶
| Columna | Tipo propuesto | Nulabilidad |
|---|---|---|
estado_comprobante_raw |
text |
null |
canal_raw |
text |
null |
ramo_raw |
text |
null |
grupo_raw |
text |
null |
rubro_raw |
text |
null |
motivo_devolucion_raw |
text |
null |
Logistica¶
| Columna | Tipo propuesto | Nulabilidad |
|---|---|---|
hoja_ruta_raw |
text |
null |
direccion_entrega_raw |
text |
null |
localidad_entrega_raw |
text |
null |
provincia_entrega_raw |
text |
null |
cod_repartidor_raw |
text |
null |
repartidor_raw |
text |
null |
zona_raw |
text |
null |
Metricas¶
| Columna | Tipo propuesto | Nulabilidad | Criterio |
|---|---|---|---|
unidades |
numeric(19,4) |
not null |
cantidad de la linea |
precio_unitario |
numeric(19,6) |
null |
precio unitario con mayor escala |
porc_desc_linea |
numeric(9,4) |
null |
porcentaje de descuento de linea |
desc_neto_unitario_linea |
numeric(19,6) |
null |
descuento neto unitario de linea |
iva_alicuota_pct |
numeric(9,4) |
null |
alicuota IVA |
precio_neto_unitario_cdesc_linea |
numeric(19,6) |
null |
precio neto unitario con descuento de linea |
subtotal_neto_item_cdesc_linea |
numeric(19,4) |
null |
subtotal neto con descuento de linea |
desc_al_pie_pct |
numeric(9,4) |
null |
porcentaje de descuento al pie |
desc_pie_unitario_neto |
numeric(19,6) |
null |
descuento al pie unitario neto |
precio_neto_unitario_cdesc_pie |
numeric(19,6) |
null |
precio neto unitario con descuentos de linea y pie |
imponible_neto_item |
numeric(19,4) |
null |
imponible neto por item |
perc_iibb_raw |
numeric(19,4) |
null |
percepcion IIBB raw firmada |
alicuota_perc_iibb_calculada_pct |
numeric(9,4) |
null |
alicuota IIBB usada en calculo |
perc_iibb_item_unidad |
numeric(19,6) |
null |
IIBB unitario |
iva_item |
numeric(19,4) |
null |
componente IVA |
iva_item_unidad |
numeric(19,6) |
null |
IVA unitario |
iibb_item |
numeric(19,4) |
null |
componente IIBB |
importe_total_unitario |
numeric(19,4) |
null |
total unitario con impuestos |
importe_total_item |
numeric(19,4) |
not null |
total calculado de la linea |
total_desc_neto_linea |
numeric(19,4) |
null |
descuento neto total de linea |
total_desc_neto_al_pie |
numeric(19,4) |
null |
descuento neto total al pie |
total_desc_np |
numeric(19,4) |
null |
creditos NP por SKU especial |
total_ajustes_saldos_ctacte |
numeric(19,4) |
null |
ajustes de saldos de cuenta corriente |
perc_iva |
numeric(19,4) |
null |
percepcion IVA raw |
costo_lista |
numeric(19,4) |
null |
costo lista desde PRODUCTS |
desc_compra1 |
numeric(9,4) |
null |
descuento compra 1 |
desc_compra2 |
numeric(9,4) |
null |
descuento compra 2 |
desc_compra3 |
numeric(9,4) |
null |
descuento compra 3 |
cmv_bruto_unidad |
numeric(19,4) |
null |
CMV bruto unitario |
cmv_bruto_item |
numeric(19,4) |
null |
puede ser cero por evidencia real |
descuento_item |
numeric(19,4) |
null |
descuentos de linea/pie consolidados |
markup |
numeric(9,4) |
null |
markup vigente del producto |
max_dcto_articulo |
numeric(9,4) |
null |
descuento maximo permitido |
contribucion_item |
numeric(19,4) |
null |
contribucion calculada de la linea |
indicador_tipo_registro |
smallint |
null |
signo funcional por tipo de comprobante |
lista_de_precio_raw |
text |
null |
lista de precio aplicada |
peso_total |
numeric(19,6) |
null |
metrica fisica |
volumen_total |
numeric(19,6) |
null |
metrica fisica |
cant_bultos_vendidos |
numeric(19,6) |
null |
metrica fisica |
6. Mapeo inicial desde Tabla 2¶
El mapping completo CSV/PostgreSQL vive en:
docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-COLUMN-MAPPING.md
Ese documento es la autoridad de mapeo campo a campo para las 68 columnas
reales de Tabla 2 V2.
Resumen de decisiones:
| Decision | Resultado |
|---|---|
| columnas reales detectadas | 68 |
| columnas reales a persistir | 68 |
columnas que participan en line_key_v4 |
Fecha, Hora, TipoComp, NroComp, TipoDocInt, NroIntDoc, Documento, CodigoCliente, SKU, Vendedor y line_sequence_v1 |
columnas reales que participan en source_row_hash_v1 |
68/68 |
| direccion de pedidos | direccion_de_pedidos_raw |
| direccion/localidad/provincia de entrega | direccion_entrega_raw, localidad_entrega_raw, provincia_entrega_raw |
| repartidor | cod_repartidor_raw, repartidor_raw |
| descuentos separados | porc_desc_linea, desc_neto_unitario_linea, desc_al_pie_pct, desc_pie_unitario_neto, total_desc_neto_linea, total_desc_neto_al_pie, total_desc_np |
| costos separados | costo_lista, desc_compra1, desc_compra2, desc_compra3, cmv_bruto_unidad, cmv_bruto_item |
Regla:
- no aprobar carga piloto si el pipeline no produce todas las columnas persistibles del mapping
- no aprobar carga piloto si
source_row_hash_v1no canonicaliza las68columnas reales deTabla 2 V2
7. Constraints y checks documentales¶
Constraints sugeridas para el DDL futuro:
text
primary key (id)
unique documental: tenant_id + line_key
line_sequence_v1 >= 1
hora_origen_sgc formato HHMMSS observado
record_status in ('active','inactive','corrected','missing_from_source')
fecha <= current_date + interval '1 day'
unidades is not null
importe_total_item is not null
La restriccion unique (tenant_id, line_key) solo es valida si line_key
representa line_key_v4. Queda descartada para line_key_v1 y
line_key_v3.
Regla sobre hora_origen_sgc:
- corresponde a
Horaraw deSGC - formato observado esperado:
HHMMSS, ejemplo085923 - no debe interpretarse como timestamp unico sin validacion adicional
- participa en
line_key_v4como parte candidata de identidad, no como identificador suficiente por si sola
Regla sobre CMV:
cmv_bruto_itemno debe tener check> 0- el inventario inicial observo
6casos conCMVBruto_Itemnulo o cero - la revalidacion mayor observo
381casos conCMVBruto_Item = 0y0nulos - la nulabilidad final de
cmv_bruto_itemdebe confirmarse antes de migrar - cero no implica error automatico para esta fuente
Nota de revision humana:
- el check dependiente de
current_datees documental y debe revisarse antes de convertirlo en migracion; si se prefiere evitar una regla temporal dentro deCHECK, puede moverse a validacion de carga
8. Indices sugeridos¶
Indices documentales para la tabla futura:
| Indice | Columnas | Uso |
|---|---|---|
source_003_sales_items_tenant_fecha_idx |
tenant_id, fecha |
lecturas por ventana |
source_003_sales_items_tenant_cliente_idx |
tenant_id, codigo_cliente |
ventas por cliente |
source_003_sales_items_tenant_vendedor_fecha_idx |
tenant_id, vendedor_codigo, fecha |
atribucion transaccional |
source_003_sales_items_tenant_sku_fecha_idx |
tenant_id, sku, fecha |
ventas por producto |
source_003_sales_items_tenant_documento_idx |
tenant_id, tipo_comp, nro_comp |
busqueda documental |
source_003_sales_items_tenant_batch_idx |
tenant_id, sync_batch_id |
auditoria por batch |
source_003_sales_items_tenant_status_idx |
tenant_id, record_status |
conciliacion de estado |
source_003_sales_items_tenant_hash_idx |
tenant_id, source_row_hash |
deteccion e inspeccion de cambios con source_row_hash_v1 |
9. line_key_v1 historica fallida¶
Formula conceptual:
text
line_key_v1 =
sha256(canonical(
fecha,
tipo_comp,
nro_comp,
tipo_doc_int,
nro_int_doc,
documento,
codigo_cliente,
sku,
vendedor_codigo
))
Campos incluidos:
fechatipo_compnro_comptipo_doc_intnro_int_docdocumentocodigo_clienteskuvendedor_codigo
Por que no usa importes:
- los importes, impuestos, descuentos y costos son valores de la linea
- si cambian, debe cambiar
source_row_hash, no la identidad de la linea - incluir importes en la clave convertiria una correccion en una fila nueva
Por que no usa nombre de cliente:
- el nombre puede cambiar por normalizacion, correccion administrativa o diferencia textual
- no es una identidad funcional fuerte
- puede contener texto personal/comercial que no debe participar en la clave
- la identidad de cliente debe apoyarse en
codigo_cliente
Limitacion:
line_key_v1paso en la ventana chica2026-06-08line_key_v1fallo unicidad en la ventana mayor2026-05-05a2026-06-09- se observaron
6claves duplicadas y12filas involucradas 3grupos duplicados son identicos incluso considerando toda la salida deTabla 2- debe usarse
line_key_v4conhora_origen_sgc + line_sequence_v1o un futuroline_id_sourcereal antes de crear el indice unico
10. line_sequence_v1, Hora y line_key_v4¶
No se encontro line_id_source apto en ecommerce.dbo.V_VENTAS.
Columnas candidatas revisadas:
| Columna | Conclusion |
|---|---|
ImpIntLinea |
no apta; un unico valor observado en la salida evaluada |
Localidad |
no apta; cabecera/logistica |
PorcDescLinea |
no apta; metrica mutable de descuento |
Repartidor |
no apta; cabecera/logistica |
Unidades |
no apta; metrica mutable, solo reduce parcialmente duplicados |
line_sequence_v1 debe generarse en el pipeline con ROW_NUMBER():
text
ROW_NUMBER() OVER (
PARTITION BY
fecha,
tipo_comp,
nro_comp,
tipo_doc_int,
nro_int_doc,
documento,
codigo_cliente,
sku,
vendedor_codigo
ORDER BY
articulo_raw,
marca_raw,
proveedor_codigo_raw,
unidades,
precio_unitario,
porc_desc_linea,
desc_neto_unitario_linea,
precio_neto_unitario_cdesc_linea,
desc_al_pie_pct,
desc_pie_unitario_neto,
precio_neto_unitario_cdesc_pie,
imponible_neto_item,
iva_item,
iva_item_unidad,
iibb_item,
perc_iibb_item_unidad,
importe_total_item,
importe_total_unitario,
cmv_bruto_unidad,
cmv_bruto_item,
total_desc_neto_linea,
total_desc_neto_al_pie,
total_desc_np,
total_ajustes_saldos_ctacte,
contribucion_item,
motivo_devolucion_raw,
canal_raw,
ramo_raw,
hoja_ruta_raw,
peso_total,
volumen_total,
cant_bultos_vendidos
)
Reglas:
line_sequence_v1no viene del origen; es tecnica de pipeline- no usar
IdFilade la autoridad SQL - no usar nombre de cliente ni direccion como criterio de orden
- versionar la regla como
line_sequence_v1 - si una ocurrencia cambia en un grupo absolutamente identico, la asociacion historica queda en riesgo porque no existe id fisico de linea
Hora fue agregada a la salida Tabla 2 como hora_origen_sgc.
line_key_v3, que suma Hora a la clave natural sin line_sequence_v1,
fue revalidada y fallo con 6 claves duplicadas y 12 filas involucradas.
Los duplicados restantes tienen la misma Hora, por lo que el campo ayuda a
trazabilidad pero no alcanza solo para unicidad.
Formula conceptual previa preservada:
text
line_key_v2 =
sha256(canonical(
fecha,
tipo_comp,
nro_comp,
tipo_doc_int,
nro_int_doc,
documento,
codigo_cliente,
sku,
vendedor_codigo,
line_sequence_v1
))
Validacion agregada de line_key_v2:
| Metrica | Resultado |
|---|---|
| filas evaluadas | 48973 |
claves line_key_v2 distintas |
48973 |
claves line_key_v2 duplicadas |
0 |
| grupos absolutamente identicos | 3 |
| filas en grupos absolutamente identicos | 6 |
Formula conceptual vigente:
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_codigo,
line_sequence_v1
))
Conclusion: AMARILLO ACEPTADO.
line_key_v4 conserva la unicidad agregada de line_key_v2, suma la hora raw
del origen y mantiene el mismo riesgo residual: filas completamente identicas
son diferenciadas por line_sequence_v1, no por identidad fisica ERP. Ese
riesgo queda aceptado para sync inicial analitico, no para auditoria legal
perfecta.
11. source_row_hash_v1¶
Formula conceptual:
text
source_row_hash_v1 =
sha256(canonical(
68 columnas reales de Tabla 2 V2,
en el orden y con las transformaciones documentadas en
SOURCE-003-SALES-ITEMS-COLUMN-MAPPING.md
))
Campos incluidos:
- identidad documental y hora raw de origen
SGC - cliente, direccion de pedidos, vendedor, producto y proveedor
- canal/contexto, grupo, rubro, ramo, zona y motivo de devolucion
- logistica, entrega y reparto
- unidades, precios, descuentos de linea, descuentos al pie y creditos
NP - imponibles,
IVA,IIBB, percepciones, importes totales y signo - costos, descuentos de compra,
CMV, markup, descuento maximo y contribucion - peso, volumen y bultos
Objetivo:
- detectar cambios reales de valores de la linea
- evitar comparar campo por campo en cada sync
- auditar recalculos de ventanas moviles
- distinguir una linea sin cambios de una linea corregida
Diferencia entre line_key y source_row_hash:
| Campo | Rol |
|---|---|
line_key |
componente de identidad; debe generarse como line_key_v4 |
source_row_hash |
detecta si cambiaron los valores de esa linea |
Lectura operativa:
- si cambia
source_row_hash, la fila sigue siendo la misma linea pero con valores actualizados - si cambia
line_key, el proceso futuro debe tratarlo como identidad nueva o revisar una posible colision/definicion incompleta
Canonicalizacion minima:
- fechas en ISO
YYYY-MM-DD - textos con trim
- nulos con sentinel estable
- decimales con escala definida antes de serializar
- serializacion estructurada o separador escapado para evitar colisiones
- version explicita
v1
12. Estrategia de carga futura¶
La carga futura debe ser por batch, trazable por fila y compatible con una
fuente viva. No debe depender solo de ultima fecha cargada, porque una fecha
ya cargada puede cambiar al volver a leer SGC.
Reglas:
- ejecutar una carga historica inicial controlada antes de la sync diaria
- tomar snapshot diario de la salida
Tabla 2para congelar evidencia de conciliacion - reprocesar una ventana movil inicial sugerida de
10dias para cubrir una semana operativa aproximada mas margen - cada carga pertenece a un
sync_batch_id - hacer
upsertportenant_id + line_key, siempre queline_keysealine_key_v4 - si no existe la clave, insertar la fila con
record_status = active - si existe y
source_row_hashcambio, actualizar valores,source_row_hash,sync_batch_id,extracted_at,last_seen_atyupdated_at - si existe y
source_row_hashno cambio, actualizarlast_seen_at,sync_batch_idyextracted_at - si una extraccion
fullvalida o una extraccion de ventana controlada no vuelve a observar una linea que deberia estar dentro de la ventana, marcarrecord_status = missing_from_source - no hacer
hard delete - el freeze date de una fecha piloto debe salir del snapshot tomado, no de
SGCvivo - preservar
estado_comprobante_rawsi la salida o una extension futura de autoridad lo expone - preservar cambios relevantes en auditoria futura si se implementa
source_003_sales_item_audit
Lectura para ventanas moviles:
- recalcular la ventana definida desde la autoridad
Tabla 2 - comparar contra
source_003_sales_items - una linea puede aparecer, cambiar valores, desaparecer, quedar anulada o recibir nota de credito/ajuste posterior dentro de la ventana
- no reemplazar calculos por campos crudos del
ERP - no depender de
Tabla 1/3/4/5/6como fuente primaria
13. Checks pre-migracion¶
Antes de convertir este diseno en migracion ejecutable, se debe confirmar:
- revalidar
Tabla 2 V2contra la nueva autoridad candidata preservada - riesgo
AMARILLO ACEPTADOdeline_sequence_v1preservado y mitigado - si negocio/ERP puede exponer un identificador fisico de detalle
- revalidar
line_key_v4en backfill o ventana mayor adicional - confirmar tipos reales y escalas numericas contra salida
Tabla 2 - confirmar nombres exactos de columnas de
Tabla 2 - aprobar humanamente el diccionario completo de
68columnas deTabla 2 V2 - aprobar humanamente el mapping CSV/PostgreSQL de
68columnas reales - confirmar que
source_row_hash_v1canonicaliza las68columnas reales - confirmar si hace falta
source_003_sales_documents - confirmar permisos y schema destino
- confirmar estrategia de particionado por
fecha - confirmar si el check de fecha futura vive como
CHECKo como validacion de carga - confirmar generacion de
uuidy extension disponible en PostgreSQL destino - confirmar auditoria futura para cambios de
source_row_hash - confirmar politica final para
estado_comprobante_rawsi la autoridad de extraccion lo expone
14. Pendientes¶
Pendientes antes de produccion:
- revision humana del documento, del SQL documental y del SQL piloto
- revision humana del diccionario y mapping antes de cualquier carga piloto
- ejecucion piloto aprobada con backup y validacion post
- ambiente destino PostgreSQL
- schema destino
- migracion productiva final
- carga inicial
- validacion de backfill
- performance real
- permisos de consumo
- estrategia final de particionado
15. Confirmaciones de alcance¶
- modo
DESIGNaplicado - sin runtime
- con revalidacion de inventario de solo lectura documentada
- sin queries operativas de sync
- sin tablas fisicas
- sin migraciones ejecutadas en esta revision
- sin
VPS - sin
Docker DDLdocumental creado- version revisada de migracion piloto/documental preparada y no ejecutada
- rollback piloto preparado
line_key_v1preservada como fallida historicamenteline_key_v2preservada como evidencia previa con unicidad agregadaline_key_v3preservada como fallida al sumarHorasin secuencialine_key_v4aceptada como clave documental para sync inicial analiticohora_origen_sgcincluida como valor raw deSGCline_sequence_v1incluida como columna tecnica generada por pipelinesource_row_hash_v1incluidasource_row_hash_v1ampliada documentalmente a las68columnas reales deTabla 2 V2- columnas de entrega/repartidor y descuentos separados incluidas
- carga piloto
001ejecutada desdeSOURCE-003-SNAPSHOT-001despues de aprobar diccionario y mapping - fuente viva, ventana movil inicial de
10dias y no hard delete documentados - checks e indices sugeridos documentados
- produccion final bloqueada hasta validacion adicional y aprobacion explicita
16. Proximo paso recomendado¶
Revisar humanamente la evidencia de la carga piloto 001 y decidir si se
habilita un siguiente piloto de ventana movil/backfill antes de cualquier sync
diaria, carga masiva o produccion final.