SOURCE-003 Sales Items Column Mapping¶
Fecha: 2026-06-10
Estado: APPROVED_FOR_CONTROLLED_PILOT / MAPPING CSV POSTGRES / PRODUCCION FINAL BLOQUEADA
portal_visible = yes
Scope: tenant
tenant_id: alpuntodeventa
Owner: Gabi / Carlos Canu
Fuente de verdad:
docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-COLUMN-MAPPING.md
1. Alcance¶
Mapping documental entre el CSV real de SOURCE-003 / Tabla 2 V2 y la
propuesta revisada de columnas PostgreSQL para source_003_sales_items.
Este documento no autoriza carga, sync, migracion ni escritura en
PostgreSQL.
2. Reglas de mapping¶
line_key_v4usa solo identidad documental,Hora,CodigoCliente,SKU,Vendedoryline_sequence_v1generado por pipeline.source_row_hash_v1debe cubrir las68columnas reales de Tabla 2 V2.- Los codigos numericos de negocio se guardan como
textcuando funcionan como identificadores. - Los valores calculados monetarios usan
numericpara evitar perdida de precision. - Las columnas personales/contacto/logisticas se persisten por trazabilidad, pero no deben exponerse sin control en vistas de consumo.
3. Mapping CSV -> PostgreSQL¶
| # | Columna CSV Tabla 2 | Columna PostgreSQL | Transformacion | Tipo | Nullable | Persistir | Entra en line_key | Entra en source_row_hash | Observaciones |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Fecha |
fecha |
CONVERT(date, v.Fecha) |
date |
NO |
SI |
SI |
SI |
fecha documental de la venta |
| 2 | Hora |
hora_origen_sgc |
LTRIM/RTRIM(v.Hora) |
text |
NO |
SI |
SI |
SI |
formato observado HHMMSS |
| 3 | Vendedor |
vendedor_codigo |
trim de v.Vendedor |
text |
NO |
SI |
SI |
SI |
vendedor transaccional |
| 4 | NomVendedor |
vendedor_nombre_raw |
trim de v.NomVendedor |
text |
SI |
SI |
NO |
SI |
lectura humana |
| 5 | CodigoCliente |
codigo_cliente |
trim de v.CodigoCliente |
text |
NO |
SI |
SI |
SI |
clave comercial del cliente |
| 6 | Nombre |
cliente_nombre_raw |
trim de v.Nombre |
text |
SI |
SI |
NO |
SI |
no usar como identidad |
| 7 | Direccion_de_pedidos |
direccion_de_pedidos_raw |
trim de c.Direccion_de_pedidos |
text |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 8 | Condicion_Fiscal |
condicion_fiscal_raw |
trim de v.CondFiscal |
text |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 9 | TipoComp |
tipo_comp |
trim de v.TipoComp |
text |
NO |
SI |
SI |
SI |
tipo de comprobante |
| 10 | NroComp |
nro_comp |
trim de v.NroComp |
text |
NO |
SI |
SI |
SI |
numero de comprobante |
| 11 | TipoDocInt |
tipo_doc_int |
trim de v.TipoDocInt |
text |
NO |
SI |
SI |
SI |
tipo documento interno |
| 12 | NroIntDoc |
nro_int_doc |
trim de v.NroIntDoc |
text |
NO |
SI |
SI |
SI |
numero interno |
| 13 | Documento |
documento |
trim de v.Documento |
text |
NO |
SI |
SI |
SI |
documento comercial |
| 14 | SKU |
sku |
trim de v.Codigo via ap.SKU |
text |
NO |
SI |
SI |
SI |
producto vendido |
| 15 | Articulo |
articulo_raw |
trim de v.Descripcion |
text |
SI |
SI |
NO |
SI |
descripcion raw |
| 16 | Marcas |
marca_raw |
trim de v.Marcas |
text |
SI |
SI |
NO |
SI |
marca raw |
| 17 | Precio_Neto_Unitario |
precio_unitario |
calc1.PrecioUnit_Neto |
numeric(19,6) |
SI |
SI |
NO |
SI |
calculado por regla fiscal |
| 18 | PorcDescLinea |
porc_desc_linea |
cast numerico de v.PorcDescLinea |
numeric(9,4) |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 19 | DescNetoUnitarioXLinea |
desc_neto_unitario_linea |
b.Precio * PorcDescLinea/100 |
numeric(19,6) |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 20 | IVA |
iva_alicuota_pct |
cast numerico de v.TaxIva |
numeric(9,4) |
SI |
SI |
NO |
SI |
alicuota, no importe |
| 21 | Precio_Neto_Unitario_CDescLinea |
precio_neto_unitario_cdesc_linea |
CASE de Tabla 2 para precio con descuento de linea |
numeric(19,6) |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 22 | Unidades |
unidades |
cast numerico de v.Unidades |
numeric(19,4) |
NO |
SI |
NO |
SI |
cantidad de la linea |
| 23 | SubtotalNetoItem_cDescLinea |
subtotal_neto_item_cdesc_linea |
SignoDoc * ABS(SubtotalNetoItem_cDescLinea_Raw) |
numeric(19,4) |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 24 | DescAlPie |
desc_al_pie_pct |
cast numerico de v.DescAlPie |
numeric(9,4) |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 25 | Desc_Pie_Unitario_Neto |
desc_pie_unitario_neto |
PrecioUnit_CDescLinea * DescAlPie/100 |
numeric(19,6) |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 26 | Precio_Neto_Unitario_CDescPie |
precio_neto_unitario_cdesc_pie |
SignoDoc * ABS(PrecioUnit_CDescPie) |
numeric(19,6) |
SI |
SI |
NO |
SI |
base de impuestos |
| 27 | ImponibleNetoItem |
imponible_neto_item |
SignoDoc * ABS(PrecioUnit_CDescPie * Unidades) |
numeric(19,4) |
SI |
SI |
NO |
SI |
base imponible |
| 28 | PercIIBB |
perc_iibb_raw |
SignoDoc * ABS(b.PercIIBB) |
numeric(19,4) |
SI |
SI |
NO |
SI |
percepcion origen |
| 29 | AlicuotaPercIIBBCalculada |
alicuota_perc_iibb_calculada_pct |
cast numerico de v.AlicIIBB |
numeric(9,4) |
SI |
SI |
NO |
SI |
alicuota IIBB |
| 30 | PercIIBBItemUnidad |
perc_iibb_item_unidad |
regla IIBB unitaria de Tabla 2 | numeric(19,6) |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 31 | PercIIBBItemImporte |
iibb_item |
PercIIBBItemUnidad * Unidades, firmado |
numeric(19,4) |
SI |
SI |
NO |
SI |
importe IIBB item |
| 32 | IVAItemUnidad |
iva_item_unidad |
PrecioUnit_CDescPie * TaxIva cuando aplica |
numeric(19,6) |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 33 | IVATotalItems |
iva_item |
IVAItemUnidad * Unidades, firmado |
numeric(19,4) |
SI |
SI |
NO |
SI |
importe IVA item |
| 34 | Importe_Total_Item |
importe_total_unitario |
neto unitario con descuentos + IIBB unidad + IVA unidad | numeric(19,4) |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 35 | Importe_Total_Todos_los_Items |
importe_total_item |
ImponibleNetoItem + IVATotalItems + PercIIBBItemImporte |
numeric(19,4) |
NO |
SI |
NO |
SI |
total de linea |
| 36 | Total_Desc_Neto_Linea |
total_desc_neto_linea |
Precio * PorcDescLinea/100 * Unidades |
numeric(19,4) |
SI |
SI |
NO |
SI |
antes solo consolidada en descuento_item |
| 37 | Total_Desc_Neto_Al_Pie |
total_desc_neto_al_pie |
Desc_Pie_Unitario_Neto * Unidades |
numeric(19,4) |
SI |
SI |
NO |
SI |
antes solo consolidada en descuento_item |
| 38 | Total_Desc_NP |
total_desc_np |
total firmado si SKU es 3793 o 3998, si no 0 |
numeric(19,4) |
SI |
SI |
NO |
SI |
antes solo consolidada en descuento_item |
| 39 | Total_Ajustes_Saldos_CtaCte |
total_ajustes_saldos_ctacte |
total firmado si SKU es 4010, si no 0 |
numeric(19,4) |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 40 | PercIva |
perc_iva |
cast numerico de v.PercIva |
numeric(19,4) |
SI |
SI |
NO |
SI |
percepcion IVA origen |
| 41 | CostoLista |
costo_lista |
cast numerico de p.CostoLista |
numeric(19,4) |
SI |
SI |
NO |
SI |
costo desde PRODUCTS |
| 42 | descCompra1 |
desc_compra1 |
cast numerico de p.descCompra1 |
numeric(9,4) |
SI |
SI |
NO |
SI |
descuento compra |
| 43 | descCompra2 |
desc_compra2 |
cast numerico de p.descCompra2 |
numeric(9,4) |
SI |
SI |
NO |
SI |
descuento compra |
| 44 | descCompra3 |
desc_compra3 |
cast numerico de p.descCompra3 |
numeric(9,4) |
SI |
SI |
NO |
SI |
descuento compra |
| 45 | CMVBruto_Unidad |
cmv_bruto_unidad |
CostoLista * descuentos compra * factor IVA |
numeric(19,4) |
SI |
SI |
NO |
SI |
costo bruto unitario |
| 46 | CMVBruto_Item |
cmv_bruto_item |
CMVBruto_Unidad * UnidadesBrutas |
numeric(19,4) |
SI |
SI |
NO |
SI |
costo bruto de linea |
| 47 | Markup |
markup |
cast numerico de p.Markup |
numeric(9,4) |
SI |
SI |
NO |
SI |
politica comercial |
| 48 | MaxDctoArticulo |
max_dcto_articulo |
cast numerico de p.MaxDctoArticulo |
numeric(9,4) |
SI |
SI |
NO |
SI |
descuento maximo permitido |
| 49 | Contribucion_BalanceCtaCteFinal |
contribucion_item |
misma suma firmada que total de item en V2 | numeric(19,4) |
SI |
SI |
NO |
SI |
revisar significado antes de usar como margen |
| 50 | Indicador_TipoRegistro |
indicador_tipo_registro |
-1 notas de credito, 1 resto |
smallint |
SI |
SI |
NO |
SI |
signo funcional |
| 51 | Lista_De_Precio |
lista_de_precio_raw |
trim de v.Lista |
text |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 52 | Proveedor |
proveedor_codigo_raw |
trim de v.Proveedor |
text |
SI |
SI |
NO |
SI |
codigo proveedor |
| 53 | HojaDeRuta |
hoja_ruta_raw |
trim de v.HojaRuta |
text |
SI |
SI |
NO |
SI |
logistica |
| 54 | DireccionEntrega |
direccion_entrega_raw |
trim de v.Direccion |
text |
SI |
SI |
NO |
SI |
direccion de entrega, acceso controlado |
| 55 | LocalidadEntrega |
localidad_entrega_raw |
trim de v.Localidad |
text |
SI |
SI |
NO |
SI |
localidad de entrega |
| 56 | ProvinciaEntrega |
provincia_entrega_raw |
trim de v.Provincia |
text |
SI |
SI |
NO |
SI |
provincia de entrega |
| 57 | CodRepartidor |
cod_repartidor_raw |
trim de v.Repartidor |
text |
SI |
SI |
NO |
SI |
faltaba en DDL piloto actual |
| 58 | Repartidor |
repartidor_raw |
trim de v.RepNombre |
text |
SI |
SI |
NO |
SI |
puede contener contacto; acceso controlado |
| 59 | MotivoDevolucion |
motivo_devolucion_raw |
trim de v.MotivoDevolucion |
text |
SI |
SI |
NO |
SI |
devoluciones, rechazos y mermas |
| 60 | Peso_Total |
peso_total |
Unidades * p.Peso |
numeric(19,6) |
SI |
SI |
NO |
SI |
metrica fisica |
| 61 | Volumen_Total |
volumen_total |
Unidades * p.Volumen |
numeric(19,6) |
SI |
SI |
NO |
SI |
metrica fisica |
| 62 | Cant_Bultos_Vendidos |
cant_bultos_vendidos |
Unidades / NULLIF(p.Unidades_bulto, 0) |
numeric(19,6) |
SI |
SI |
NO |
SI |
metrica fisica |
| 63 | Zona |
zona_raw |
trim de v.Zona |
text |
SI |
SI |
NO |
SI |
zona transaccional/logistica |
| 64 | Ramo |
ramo_raw |
trim de v.Ramo |
text |
SI |
SI |
NO |
SI |
contexto comercial |
| 65 | Canal |
canal_raw |
trim de v.Canal |
text |
SI |
SI |
NO |
SI |
puede venir vacio |
| 66 | Grupo |
grupo_raw |
trim de v.Grupo |
text |
SI |
SI |
NO |
SI |
segmentacion producto |
| 67 | Rubro |
rubro_raw |
trim de v.Rubro |
text |
SI |
SI |
NO |
SI |
segmentacion producto |
| 68 | RazonSocial_Proveedor |
proveedor_nombre_raw |
trim de pr.RazonSocial |
text |
SI |
SI |
NO |
SI |
nombre proveedor |
4. Columnas tecnicas generadas por pipeline¶
| Columna PostgreSQL | Origen | Tipo | Nullable | Persistir | Entra en line_key | Entra en source_row_hash | Observaciones |
|---|---|---|---|---|---|---|---|
id |
generado por pipeline | uuid |
NO |
SI |
NO |
NO |
identidad tecnica interna |
tenant_id |
contexto de carga | text |
NO |
SI |
NO |
NO |
aislamiento tenant |
line_key |
generado por pipeline como line_key_v4 |
text |
NO |
SI |
NO |
NO |
hash de identidad logica; no es valor fuente |
line_sequence_v1 |
generado por pipeline con ROW_NUMBER() |
integer |
NO |
SI |
SI |
NO |
participa en line_key_v4; riesgo AMARILLO ACEPTADO |
source_row_hash |
generado por pipeline desde 68 columnas CSV | text |
NO |
SI |
NO |
NO |
detecta cambios de valores de origen |
source_system |
metadata de carga | text |
NO |
SI |
NO |
NO |
alias origen |
source_object |
metadata de carga | text |
NO |
SI |
NO |
NO |
nombre logico de fuente/salida |
source_query_version |
metadata de carga | text |
NO |
SI |
NO |
NO |
version autoridad SQL |
sync_batch_id |
metadata de carga | uuid |
NO |
SI |
NO |
NO |
lote de sync/carga |
extracted_at |
metadata de carga | timestamptz |
NO |
SI |
NO |
NO |
momento de extraccion |
last_seen_at |
metadata de reconciliacion | timestamptz |
NO |
SI |
NO |
NO |
ultima observacion valida |
created_at |
metadata interna | timestamptz |
NO |
SI |
NO |
NO |
alta interna |
updated_at |
metadata interna | timestamptz |
NO |
SI |
NO |
NO |
actualizacion interna |
record_status |
metadata funcional | text |
NO |
SI |
NO |
NO |
active, inactive, corrected o missing_from_source |
5. Campos de line_key_v4¶
| Campo fuente | Campo destino |
|---|---|
Fecha |
fecha |
Hora |
hora_origen_sgc |
TipoComp |
tipo_comp |
NroComp |
nro_comp |
TipoDocInt |
tipo_doc_int |
NroIntDoc |
nro_int_doc |
Documento |
documento |
CodigoCliente |
codigo_cliente |
SKU |
sku |
Vendedor |
vendedor_codigo |
| generado por pipeline | line_sequence_v1 |
Formula conceptual:
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
))
6. Decision de carga¶
Gabi aprueba explicitamente este mapping para piloto controlado, no para produccion final.
La aprobacion acepta las 68 columnas reales de SOURCE-003 / Tabla 2 V2
para persistencia segun el mapping CSV/PostgreSQL y habilita la preparacion de
una carga piloto controlada desde SOURCE-003-SNAPSHOT-001 contra
PostgreSQL local.
La aprobacion no habilita sync diaria, carga masiva, produccion final, automatizacion ni exposicion operativa. Cualquier ejecucion posterior debe mantener alcance piloto, trazabilidad de snapshot, validaciones previas y rollback documentado.
7. Aprobacion humana¶
Estado de aprobacion: APPROVED_FOR_CONTROLLED_PILOT.
Aprobacion humana registrada:
| Rol | Estado |
|---|---|
| owner negocio / datos | Gabi |
| aprobacion de mapping | APROBADA PARA PILOTO CONTROLADO |
| columnas reales aceptadas para persistencia | 68/68 |
| autorizacion para preparacion de carga piloto | SI, DESDE SOURCE-003-SNAPSHOT-001 CONTRA POSTGRESQL LOCAL |
| autorizacion para produccion final | NO AUTORIZADA |
| autorizacion para sync diaria | NO AUTORIZADA |
| autorizacion para carga masiva | NO AUTORIZADA |
Safe points documentales:
| Instancia | Control | Resultado |
|---|---|---|
| revision previa | git status -sb |
## main...origin/main |
| revision previa | git rev-parse HEAD |
3cd0fd6875428dd82663ffa8185fee10ba7357cc |
| aprobacion humana | git status -sb |
## main...origin/main |
| aprobacion humana | git rev-parse HEAD |
501cf4f643f7c1ff84d3a62c63d00a3b73160878 |
Resultado de validacion previa:
| Control | Resultado |
|---|---|
| header real del snapshot local | 68 columnas |
| filas de mapping CSV/PostgreSQL | 68/68 |
| orden del mapping contra snapshot | MATCH |
| columnas CSV faltantes en mapping | 0 |
| columnas PostgreSQL del mapping faltantes en DDL documental SQL | 0 |
| columnas reales no persistidas | 0 |
columnas reales en source_row_hash_v1 |
68/68 |
columnas CSV en line_key_v4 |
10/68 |
columna tecnica en line_key_v4 |
line_sequence_v1 |
Columnas especialmente revisadas:
| Columna CSV | Columna PostgreSQL | Persistir | source_row_hash_v1 |
line_key_v4 |
Estado |
|---|---|---|---|---|---|
DireccionEntrega |
direccion_entrega_raw |
SI |
SI |
NO |
OK |
LocalidadEntrega |
localidad_entrega_raw |
SI |
SI |
NO |
OK |
ProvinciaEntrega |
provincia_entrega_raw |
SI |
SI |
NO |
OK |
CodRepartidor |
cod_repartidor_raw |
SI |
SI |
NO |
OK |
Repartidor |
repartidor_raw |
SI |
SI |
NO |
OK |
DescAlPie |
desc_al_pie_pct |
SI |
SI |
NO |
OK |
PorcDescLinea |
porc_desc_linea |
SI |
SI |
NO |
OK |
DescNetoUnitarioXLinea |
desc_neto_unitario_linea |
SI |
SI |
NO |
OK |
Precio_Neto_Unitario_CDescLinea |
precio_neto_unitario_cdesc_linea |
SI |
SI |
NO |
OK |
Condiciones aceptadas por la aprobacion:
- el diccionario completo queda aprobado para piloto controlado
- este mapping queda aprobado para piloto controlado
source_row_hash_v1debe canonicalizar las68columnas reales del CSV- el pipeline piloto debe producir todas las columnas persistibles documentadas
Contribucion_BalanceCtaCteFinalqueda aprobada como persistible, con semantica de negocio pendienteTotal_Credito_MERMASqueda aprobado con posibilidad futura de columna separada si se confirma necesidadPercIIBBqueda aprobado, con lectura fina pendiente junto aPercIIBBItemImporte
Restricciones vigentes:
- no produccion final
- no sync diaria
- no carga masiva
- no
VPS - no
Docker - no
OpenClawruntime - no APIs
- no IA
- no exposicion de datos personales/logisticos sin controles
Proximo paso habilitado:
Preparar la carga piloto controlada desde SOURCE-003-SNAPSHOT-001 contra
PostgreSQL local, con validacion previa de transformaciones, conteos,
conciliaciones, line_key_v4, line_sequence_v1, source_row_hash_v1 y
rollback.