Saltar a contenido

SOURCE-002 Future Layer Mapping

Fecha: 2026-06-07

Estado: MAPEO CONCEPTUAL FUTURO / NO IMPLEMENTADO

Scope: tenant

tenant_id: alpuntodeventa

Owner: Gabi / Carlos Canu

Fuente de verdad: docs/tenants/alpuntodeventa/business-observer/SOURCE-002-FUTURE-LAYER-MAPPING.md

Autoridad base relacionada: docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-002-PRODUCTOS-PRODUCTS-AUTHORITY.sql

Decision economica relacionada: docs/tenants/alpuntodeventa/business-observer/SOURCE-002-ECONOMIC-LAYER.md

1. Proposito

Este documento existe para dejar cerrado un principio de diseno conceptual antes de cualquier implementacion futura en Postgres:

SOURCE-002 es autoridad de lectura de negocio, pero no implica una unica tabla destino pesada.

La query autoridad de SOURCE-002 concentra en una sola lectura datos de:

  • producto maestro
  • marca
  • proveedor
  • estado / vigencia / gobernanza del producto
  • stock actual
  • inventario
  • precios
  • costos
  • impuestos
  • margenes
  • descuentos de compra
  • politica comercial
  • promociones
  • estrategia comercial
  • logistica
  • volumetria
  • actividad comercial
  • auditoria / historicos utiles

Eso es util como autoridad de negocio.

No es una recomendacion para persistir todo junto en una sola entidad futura.

2. Principio rector

Regla documental oficial:

  • SOURCE-002 sigue siendo la autoridad madre de lectura para producto y valores comerciales vigentes observados
  • tenant_id + SKU es la clave canonica del dominio producto para todas las capas futuras derivadas desde SOURCE-002
  • todo dato derivado desde SOURCE-002 debe interpretarse como atributo, medicion, relacion vigente o relacion historica del SKU
  • esa autoridad no obliga a crear una tabla ancha unica en Postgres
  • la persistencia futura debera separar dominios por ritmo de cambio, frecuencia de lectura y necesidad de trazabilidad
  • la historizacion debe responder a valor de decision
  • el producto maestro debe guardar lectura rapida vigente
  • la historia fina de cambios economicos debe vivir fuera del maestro
  • el stock intradiario liviano debe mantenerse separado de precios, costos y margenes

Corolario documental obligatorio:

  • articulo, marca, estado, stock, stock en bultos, costos, descuentos de compra, precios, listas, IVA, margenes, descuento permitido, precio oferta, proveedor, categoria, subcategoria, unidad de medida, palletizado, fechas operativas e historicos utiles no deben modelarse como datos sueltos sin ancla de producto
  • el analisis por proveedor o por marca debe derivarse siempre desde los SKU asociados

3. Regla transversal: historicos por valor de decision

Regla documental oficial:

  • todo dato util para indicadores, toma de decisiones, patrones, tendencias, alertas o aprendizaje futuro debe contemplar historico desde el diseno
  • la historizacion debe contemplarse cuando el dato permita medir evolucion, detectar patrones, explicar tendencias, generar alertas, mejorar decisiones comerciales o alimentar aprendizaje futuro
  • no se trata de guardar todo sin limite
  • se trata de disenar historicos livianos, trazables y utiles

Aplicacion minima documentada para SOURCE-002 y sus capas futuras:

  • cambios de costo
  • cambios de precio y listas
  • cambios de IVA
  • cambios de margen y descuento
  • quiebres de stock
  • recuperaciones de stock
  • ingresos de mercaderia
  • snapshots diarios utiles

4. Capas futuras recomendadas

Sin definir tablas reales ni SQL final, la separacion conceptual recomendada es:

  • producto maestro vigente
  • stock actual liviano
  • stock snapshot diario
  • precios vigentes
  • historial de precios por cambio
  • costos vigentes
  • historial de costos por cambio
  • impuestos vigentes
  • margenes y descuentos vigentes
  • politica comercial vigente
  • promociones vigentes
  • estrategia comercial vigente
  • actividad comercial vigente
  • historial liviano de impuestos cuando cambien y aporten valor de decision
  • historial liviano de margenes y descuentos cuando cambien y aporten valor de decision
  • proveedor y marca
  • logistica / palletizado
  • volumetria / logistica
  • auditoria de extraccion
  • eventos o historial por cambio

5. Reglas de frontera

Reglas que deben quedar explicitas:

  • SOURCE-002D no debe traer precios, costos, impuestos, margenes, descuentos, proveedor ni palletizado
  • SOURCE-002D existe solo para stock actual liviano e intradiario
  • SOURCE-002C puede guardar stock de cierre y, opcionalmente, algunos valores economicos resumidos de cierre
  • SOURCE-002C no debe absorber el historico fino de listas, costos, impuestos, margenes o descuentos
  • precios, costos, impuestos, margenes y descuentos deben tener trazabilidad por cambio o, en su defecto, un snapshot liviano claramente separado
  • quiebres, recuperaciones e ingresos de stock deben contemplar trazabilidad historica cuando sean utiles para indicadores, tendencias, alertas o decisiones de abastecimiento
  • producto maestro debe guardar solo valores vigentes de lectura rapida
  • proveedor, marca y logistica pueden vivir junto al maestro si se mantienen como atributos relativamente lentos
  • Cod Proveedor debe preservarse como identificador de negocio del proveedor asociado al SKU
  • Proveedor debe preservarse como nombre legible o razon social asociado al SKU
  • no debe usarse solo el texto de Proveedor como clave analitica
  • Marca debe preservarse como atributo comercial asociado al SKU
  • si luego aparece codigo de marca, debera preservarse junto con Marca
  • la auditoria de extraccion debe registrar fuente, fecha, version, frecuencia y evidencia de captura
  • las listas de precios L1..L9 no deben modelarse como columnas fijas en la capa destino principal
  • la capa economica futura debe tratarlas como filas hijas normalizadas por SKU + lista_codigo

6. Frecuencias documentales recomendadas

  • lectura base o refresh gobernado: producto maestro vigente, proveedor, marca, logistica, precios vigentes, costos vigentes, impuestos vigentes y margenes vigentes
  • alta frecuencia: stock actual liviano via SOURCE-002D
  • una vez por dia: stock snapshot diario via SOURCE-002C
  • por cambio: historial de precios, historial de costos, historial de impuestos, historial de margenes y descuentos cuando aplique, y eventos o historial economico
  • por corrida: auditoria de extraccion

7. Matriz de mapeo conceptual

Campo origen Alias en autoridad Grupo Capa futura recomendada Frecuencia Motivo
SKU SKU identidad producto maestro vigente gobernada / por cambio clave estable del item
[name] Articulo identidad producto maestro vigente gobernada / por cambio descripcion de lectura rapida
Estado Estado vigencia producto maestro vigente gobernada / por cambio define si el item participa de lecturas operativas
Clasificador Estrategico estrategia comercial estrategia comercial vigente gobernada / por cambio atributo comercial visible que no debe confundirse con stock, costo ni precio base
Devolucion Acepta Devolucion politica comercial politica comercial vigente gobernada / por cambio lectura operativa inmediata de devolucion por SKU
Category Category clasificacion producto maestro vigente gobernada / por cambio clasificacion comercial base
SubCategory SubCategoria clasificacion producto maestro vigente gobernada / por cambio detalle de clasificacion util para mix
MARCA Marca marca proveedor y marca gobernada / por cambio dimension comercial mas estable que stock o precio
Proveedor Cod Proveedor proveedor proveedor y marca gobernada / por cambio identificador del proveedor vigente
RazonSocial Proveedor proveedor proveedor y marca gobernada / por cambio nombre legible del proveedor vigente
Stock Stock stock stock actual liviano cada 10 minutos o frecuencia futura definida cambia seguido y debe leerse rapido
Stock / NULLIF(Unidades_Bulto, 0) Stock en Bultos stock stock actual liviano cada 10 minutos o frecuencia futura definida ayuda a operacion sin cargar toda la capa economica
Unidades_bulto Unidades_x_Bulto conversion logistica / palletizado gobernada / por cambio conversion base para bultos y palletizado
Stock Stock stock historico stock snapshot diario diaria valor de cierre comparable en el tiempo
Stock / NULLIF(Unidades_Bulto, 0) Stock en Bultos stock historico stock snapshot diario diaria lectura de cierre util para abastecimiento
Stock + timestamps observados futuros n/a eventos de stock eventos o historial por cambio por cambio o deteccion permite detectar quiebres, recuperaciones e ingresos cuando aportan valor de decision
CostoLista CostoListaProveedor costos costos vigentes gobernada / por cambio referencia vigente de lista proveedor
Costo Costo costos costos vigentes gobernada / por cambio costo unitario neto final a pagar al proveedor luego de descuentos encadenados
UltCambioCosto UltCambioCosto costos historial de costos por cambio por cambio fecha critica para trazabilidad y vigencia
DiasSinActCosto DiasSinActCosto actividad comercial / historico util actividad comercial vigente diaria / derivada indicador de recencia de costo; no debe confundirse con el costo vigente
CostoLista, Costo, UltCambioCosto CostoListaProveedor, Costo, UltCambioCosto costos historicos historial de costos por cambio por cambio evita perder cambios al sobrescribir el vigente
Price_L1..Price_L9 PrecioL1..PrecioL9 precios precios vigentes gobernada / por cambio listas activas para lectura comercial actual
Price_OF PrecioOfertaFinal promociones promociones vigentes gobernada / por cambio precio promocional vigente; no equivale a precio base ni a lista normal
[Costo] * (1 + [Markup] / 100) PrecioListaNeto precios derivados precios vigentes gobernada / por cambio lectura rapida del precio base neto
[Costo] * (1 + [Markup] / 100) + ... PrecioListaFinal precios derivados precios vigentes gobernada / por cambio precio final de referencia
Price_L1 * (1 - ABS(MaxDctoArticulo) / 100) PrecioCDescPermitidoFinal politica comercial politica comercial vigente gobernada / por cambio precio comercial calculado a partir de L1 y la regla de descuento permitido
Price_L1..Price_L9, Price_OF, PrecioListaFinal PrecioL1..PrecioL9, PrecioOfertaFinal, PrecioListaFinal precios historicos historial de precios por cambio por cambio preserva vigencia real y comparabilidad temporal
tax AlicuotaIVA impuestos impuestos vigentes gobernada / por cambio impuesto vigente del item
expresiones con factor_iva IVAPListaFinal, IVAPrecioL1..IVAPrecioL9 impuestos impuestos vigentes gobernada / por cambio separa carga fiscal de precio y costo
expresiones con factor_iva PrecioNetoL1..PrecioNetoL9 impuestos / netos impuestos vigentes gobernada / por cambio mantiene lectura neta sin recalculo constante
tax, IVAPListaFinal, IVAPrecioL1..IVAPrecioL9, PrecioNetoL1..PrecioNetoL9 mismos aliases impuestos historicos historial liviano de impuestos por cambio por cambio cuando aporte valor de decision permite explicar tendencias, alertas o decisiones ante cambios fiscales
Markup Markup margen margenes y descuentos vigentes gobernada / por cambio margen general visible actual
Margen_L1..Margen_L9 MargenL1..MargenL9 margen margenes y descuentos vigentes gobernada / por cambio margenes por lista que no deben vivir en stock
descCompra1..3 Dcto Compra 1..3 descuento margenes y descuentos vigentes gobernada / por cambio descuentos de compra vigentes que se aplican en cadena sobre el neto anterior
MaxDctoArticulo Descuento Permitido politica comercial politica comercial vigente gobernada / por cambio regla comercial vigente del item; no es descuento de compra
Markup, Margen_L1..Margen_L9, descCompra1..3, MaxDctoArticulo Markup, MargenL1..MargenL9, Dcto Compra 1..3, Descuento Permitido margen y descuento historicos historial liviano de margenes y descuentos por cambio por cambio cuando aporte valor de decision ayuda a entender decisiones comerciales, patrones y aprendizaje futuro
CantVtaMin CantVtaMin politica comercial politica comercial vigente gobernada / por cambio restriccion minima de venta aplicada sobre el SKU
CntVentaAgrupada CantVentaAgrupada politica comercial politica comercial vigente gobernada / por cambio regla comercial de agrupacion de venta asociada al SKU
UnidadMedida UnidadMedida volumetria / logistica volumetria / logistica gobernada / por cambio contexto fisico del item para compras, deposito y distribucion
Peso PesoxUnidad volumetria / logistica volumetria / logistica gobernada / por cambio dato fisico de baja frecuencia util para capacidad y rentabilidad logistica
Volumen VolumenxUnidad volumetria / logistica volumetria / logistica gobernada / por cambio dato fisico de baja frecuencia util para cubicaje
BasePallet, AlturaPallet BasePallet, AlturaPallet volumetria / logistica volumetria / logistica gobernada / por cambio estructura de pallet relativamente estable
calculos con BasePallet, AlturaPallet, Unidades_bulto, Peso, Volumen CantUnidxPallet, CantBultosxPallet, PesoxPalletkg, VolumenxPalletm3 volumetria / logistica derivada volumetria / logistica gobernada / por cambio mejor separados del maestro economico y del stock; sirven para capacidad, pallets y distribucion
PLU PLU Articulo identificacion comercial producto maestro vigente gobernada / por cambio identificador auxiliar estable
PluBulto [PLU Bulto] identificacion comercial producto maestro vigente gobernada / por cambio identificador auxiliar de empaque
UltimaCompra Fecha de Ultima Compra actividad comercial / historico util actividad comercial vigente diaria / por refresh gobernado lectura rapida del estado comercial reciente
UltimaVenta UltVenta actividad comercial / historico util actividad comercial vigente diaria / por refresh gobernado lectura rapida del movimiento reciente
DiasSinComprar, DiasSinVender DiasSinComprar, DiasSinVender actividad comercial / historico util actividad comercial vigente diaria / derivada ayudan a observar recencia comercial sin exigir historia completa en el maestro
metadata de corrida futura n/a auditoria auditoria de extraccion cada corrida deja trazabilidad de origen, hora, volumen y estado
cambios detectados entre corridas n/a eventos eventos o historial por cambio por cambio permite explicar saltos de stock, precio, costo, vigencia, quiebres, recuperaciones o ingresos

8. Interpretacion por capa

Producto maestro vigente

Debe concentrar:

  • identidad estable del SKU
  • descripcion y estado vigente
  • clasificacion y atributos comerciales lentos
  • fechas operativas utiles para lectura rapida
  • identificadores auxiliares como PLU

No debe intentar conservar toda la historia economica.

Stock actual liviano

Debe concentrar:

  • SKU
  • stock unidades
  • stock bultos si sale barato
  • timestamp de observacion
  • metadata minima de extraccion

No debe traer precios, costos, impuestos, margenes ni descuentos.

Stock snapshot diario

Debe concentrar:

  • SKU
  • foto de cierre
  • stock unidades
  • stock bultos si aplica
  • contexto minimo de producto
  • opcionalmente un pequeno resumen economico de cierre

No debe absorber el historico fino de cambios economicos intradiarios.

Debe contemplarse como historico util cuando ayude a medir evolucion, detectar patrones o explicar tendencias de disponibilidad.

Precios vigentes e historial de precios

La lectura rapida necesita precios vigentes visibles.

La trazabilidad necesita un historial por cambio para:

  • listas L1..L9
  • precio final
  • precio oferta
  • precio con descuento permitido
  • cambios de IVA y netos cuando afecten lectura comercial o fiscal

Decision documental especifica:

  • no usar PrecioL1..PrecioL9 como diseno estructural principal de destino
  • modelar cada lista como entidad repetible por producto
  • permitir L10, L11 o futuras listas sin cambio de estructura
  • el ejemplo real documentado para L7 en SKU 0135 y SKU 0128 confirma que MargenLn, PrecioLn, IVAPrecioLn y PrecioNetoLn son repeticiones del mismo bloque economico
  • usar JSON o payload agregado solo como cache, vista materializada o auditoria secundaria, no como fuente principal de verdad analitica

Documento relacionado:

  • SOURCE-002-ECONOMIC-LAYER.md

Costos vigentes e historial de costos

La lectura operativa necesita costo vigente.

La comparabilidad temporal necesita historial por cambio con fecha efectiva.

Semantica documental obligatoria:

  • CostoListaProveedor debe leerse como precio de lista del proveedor antes de descuentos
  • Dcto Compra 1..3 deben leerse como descuentos de compra encadenados
  • Costo debe leerse como costo unitario neto final a pagar al proveedor
  • esta semantica vive en SOURCE-002-ECONOMIC-LAYER.md y no implica implementacion

Si cambios de costo, impuesto, margen o descuento aportan valor para indicadores, alertas o aprendizaje, deben contemplar historico desde el diseno.

Impuestos vigentes

Los componentes fiscales no deberian quedar mezclados solamente dentro de precios finales.

Deben poder leerse como bloque propio vigente.

Margenes y descuentos vigentes

Markup, margenes por lista y descuentos de compra deben mantenerse fuera del stock y fuera del snapshot liviano.

Si luego se requiere historia fina, debera abrirse un historial por cambio separado.

La decision de abrirlo no depende de guardar todo, sino de si el cambio aporta valor de decision.

Politica comercial vigente

Debe concentrar reglas comerciales vigentes que cuelgan de tenant_id + SKU y no deben confundirse con costo, precio base ni stock.

Campos explicitamente incluidos:

  • Descuento Permitido
  • PrecioCDescPermitidoFinal
  • Acepta Devolucion
  • CantVtaMin
  • CantVentaAgrupada

Lectura correcta:

  • Descuento Permitido es una regla comercial, no un descuento de compra
  • PrecioCDescPermitidoFinal es un precio comercial calculado por politica y no el precio base del producto
  • Acepta Devolucion expresa una condicion comercial del SKU
  • CantVtaMin y CantVentaAgrupada deben leerse como reglas de venta, aunque tambien impacten operacion

Promociones vigentes

Debe separar precios promocionales de listas, costo y stock.

Campo explicito:

  • PrecioOfertaFinal

Lectura correcta:

  • PrecioOfertaFinal pertenece al dominio promociones
  • no debe mezclarse con PrecioListaFinal
  • conviene historizarlo por cambio cuando sirva para explicar conversion, rotacion o acciones comerciales

Estrategia comercial vigente

Debe concentrar marcaciones estrategicas relativamente lentas del SKU.

Campo explicito:

  • Estrategico

Lectura correcta:

  • Estrategico no es vigencia tecnica, costo ni precio
  • es una clasificacion de foco comercial asociada al SKU

Actividad comercial vigente

Debe concentrar fechas e indicadores de recencia comercial que cuelgan de tenant_id + SKU.

Campos explicitamente incluidos:

  • Fecha de Ultima Compra
  • UltVenta
  • DiasSinComprar
  • DiasSinVender
  • DiasSinActCosto

Lectura correcta:

  • son historicos utiles o indicadores de recencia
  • no deben confundirse con stock actual
  • no deben confundirse con costo vigente ni con precio base

Proveedor y marca

Estos datos pueden vivir junto a la capa maestra o en una dimension cercana, pero conceptualmente no pertenecen a la sync de stock liviano.

Regla documental obligatoria:

  • ambos siguen dependiendo del mismo tenant_id + SKU
  • proveedor no debe reidentificarse solo por nombre legible
  • marca no debe separarse del SKU como hecho independiente sin relacion de producto

Volumetria / logistica

Conviene tratarlos como atributos fisicos relativamente lentos.

No deberian viajar en cada capa intradiaria.

Campos explicitamente incluidos:

  • Unidades_x_Bulto
  • Stock en Bultos
  • BasePallet
  • AlturaPallet
  • CantBultosxPallet
  • CantUnidxPallet
  • PesoxUnidad
  • VolumenxUnidad
  • PesoxPalletkg
  • VolumenxPalletm3
  • UnidadMedida
  • CantVtaMin
  • CantVentaAgrupada

Utilidad documental:

  • capacidad de deposito y cubicaje
  • planificacion de pallets y bultos
  • compras y reposicion por empaque minimo
  • distribucion y carga
  • analisis de rentabilidad logistica

Cuando conviene historizar cambios volumetricos:

  • cuando cambia UnidadMedida, Unidades_x_Bulto, peso, volumen o palletizado
  • cuando el cambio altera capacidad de deposito, costo logistico o politica de compra / distribucion
  • cuando negocio necesita explicar un cambio de rentabilidad o abastecimiento

Auditoria de extraccion

Toda persistencia futura deberia poder explicar:

  • cuando se extrajo
  • desde que autoridad
  • con que frecuencia
  • con que version o evidencia de query
  • cuantos registros observo

Eventos o historial por cambio

Debe concentrar, cuando negocio lo necesite:

  • quiebres de stock
  • recuperaciones de stock
  • ingresos de mercaderia
  • cambios relevantes de vigencia economica

Su rol es explicar patrones, tendencias, alertas y decisiones, no duplicar todo el origen.

9. Relacion con SOURCE-002C y SOURCE-002D

Relaciones oficiales:

  • SOURCE-002: autoridad madre de lectura de negocio
  • SOURCE-002C: capa futura para historia diaria de stock y cierre resumido
  • SOURCE-002D: capa futura para stock actual liviano e intradiario

Lectura correcta:

  • SOURCE-002D no debe crecer hasta parecerse al maestro completo
  • SOURCE-002C no debe cargarse con toda la historia economica por cambio
  • el maestro no debe absorber toda la historia de precios o costos

10. Decision documental que queda cerrada

Queda cerrada la decision conceptual de que el futuro diseno Postgres para SOURCE-002 debe nacer por capas y no como una tabla unica pesada.

Queda abierto, para una etapa posterior:

  • decidir nombres finales de tablas
  • decidir claves tecnicas
  • decidir indices
  • decidir si impuestos y margenes se separan en entidades propias o en un bloque economico intermedio
  • decidir si algunos snapshots economicos de cierre se guardan dentro de SOURCE-002C

11. Confirmaciones de alcance

  • no se implementaron tablas
  • no se diseno SQL real
  • no se crearon scripts
  • no se crearon APIs
  • no se crearon servicios
  • no se toco runtime
  • no se toco VPS
  • no se toco Docker
  • no se toco OpenClaw
  • no se realizaron conexiones reales
  • solo se cerro documentacion conceptual futura

12. Matriz integral de cobertura del SELECT

Conteo oficial del SELECT autoridad:

  • 81 campos devueltos
  • 81 campos clasificados documentalmente
  • 0 campos sin capa futura asignada
  • 0 campos fuera de la relacion canonica tenant_id + SKU

12.1 Producto, clasificacion y relaciones comerciales

Campo devuelto Origen / calculo Significado de negocio Capa futura asignada Tipo Relacion por tenant_id + SKU Observacion
SKU RTRIM([SKU]) identificador operativo del producto producto maestro vigente vigente si clave canonica del dominio; preservar trimming sin perder valor original
Articulo RTRIM([name]) descripcion comercial legible del SKU producto maestro vigente vigente si texto visible; conviene mantener higiene de espacios
Marca RTRIM(MARCA) atributo comercial de marca del SKU proveedor y marca vigente si atributo del SKU; si aparece codigo de marca, preservarlo junto con el texto
Estado RTRIM([Estado]) vigencia funcional del producto producto maestro vigente vigente si la autoridad ya filtra ACTIVO; igual debe preservarse como estado observado
Acepta Devolucion RTRIM(Devolucion) politica comercial de devolucion del producto politica comercial vigente vigente si texto de negocio; no debe confundirse con stock ni con vigencia tecnica
Estrategico RTRIM([Clasificador]) clasificacion comercial o estrategica del producto estrategia comercial vigente vigente si atributo comercial lento; conviene controlar catalogo de valores
PLU Articulo RTRIM([PLU]) identificador auxiliar del articulo producto maestro vigente vigente si identificador secundario; preservar como atributo y no como clave primaria
[PLU Bulto] RTRIM([PluBulto]) identificador auxiliar del bulto producto maestro vigente vigente si el alias incluye corchetes en origen; conviene normalizar solo en capas futuras, no en la autoridad
Cod Proveedor RTRIM([Proveedor]) identificador de negocio del proveedor asociado al SKU proveedor y marca vigente si no reemplazar por Proveedor; es la referencia comercial estable
Proveedor RTRIM([RazonSocial]) nombre o razon social legible del proveedor vigente proveedor y marca vigente si no usar el texto solo como clave analitica
Category RTRIM([Category]) categoria comercial del producto producto maestro vigente vigente si clasificacion textual; puede requerir normalizacion futura
SubCategoria RTRIM([SubCategory]) subcategoria comercial del producto producto maestro vigente vigente si depende del mismo SKU; puede requerir normalizacion futura

12.2 Stock e inventario

Campo devuelto Origen / calculo Significado de negocio Capa futura asignada Tipo Relacion por tenant_id + SKU Observacion
Stock CAST(Stock AS INT) stock actual observado en unidades stock actual liviano vigente si lectura viva del SKU; ademas debe poder derivar snapshot diario e historia de eventos
Stock en Bultos CAST(Stock / NULLIF(Unidades_Bulto, 0) AS INT) equivalencia operativa del stock expresada en bultos stock actual liviano vigente si depende de Unidades_x_Bulto; usa NULLIF y truncamiento entero, por lo que requiere cuidado interpretativo

12.3 Costos, impuestos, descuentos y precios base

Campo devuelto Origen / calculo Significado de negocio Capa futura asignada Tipo Relacion por tenant_id + SKU Observacion
CostoListaProveedor CAST(ROUND([CostoLista], 3) AS DECIMAL(18,3)) precio de lista proveedor antes de descuentos costos vigentes vigente si semantica cerrada en SOURCE-002-ECONOMIC-LAYER.md
Dcto Compra 1 CAST([descCompra1] * +1 AS VARCHAR) + '%' primer descuento de compra vigente margenes y descuentos vigentes vigente si la autoridad lo publica como texto con %; la capa futura debera conservar tambien valor numerico normalizado
Dcto Compra 2 CAST([descCompra2] * +1 AS VARCHAR) + '%' segundo descuento de compra vigente margenes y descuentos vigentes vigente si descuento encadenado; mismo cuidado de normalizacion numerica
Dcto Compra 3 CAST([descCompra3] * +1 AS VARCHAR) + '%' tercer descuento de compra vigente margenes y descuentos vigentes vigente si descuento encadenado; mismo cuidado de normalizacion numerica
Costo CAST(ROUND([Costo], 3) AS DECIMAL(18,3)) costo unitario neto final a pagar al proveedor costos vigentes vigente si costo ya neto final observado luego de descuentos
Markup CAST(ROUND([Markup], 3) AS DECIMAL(18,3)) markup general vigente del producto margenes y descuentos vigentes vigente si redondeado a 3 decimales; historizar si cambia y aporta valor de decision
PrecioListaNeto CAST(ROUND([Costo] * (1 + [Markup] / 100), 3) AS DECIMAL(18,3)) precio base neto antes de IVA precios vigentes vigente si derivado de costo y markup; no es campo crudo del ERP
AlicuotaIVA CAST(ROUND([tax], 1) AS DECIMAL(18,1)) alicuota de IVA vigente del producto impuestos vigentes vigente si componente fiscal base; historizar si cambia y aporta valor de decision
IVAPListaFinal CAST(ROUND(([Costo] * (1 + [Markup] / 100)) * ([tax] / 100), 3) AS DECIMAL(18,3)) componente IVA del precio lista final impuestos vigentes vigente si derivado calculado; depende de costo, markup e impuesto
PrecioListaFinal CAST(ROUND([Costo] * (1 + [Markup] / 100) + ([Costo] * (1 + [Markup] / 100)) * ([tax] / 100), 3) AS DECIMAL(18,3)) precio lista final con impuesto incluido precios vigentes vigente si derivado calculado; referencia comercial completa
Descuento Permitido CAST([MaxDctoArticulo] * +1 AS VARCHAR) + '%' maximo descuento comercial permitido para el articulo politica comercial vigente vigente si la autoridad lo publica como porcentaje textual; no debe confundirse con descuento de compra
PrecioCDescPermitidoFinal CAST([Price_L1] * (1 - (ABS([MaxDctoArticulo]) / 100)) AS DECIMAL(10,3)) precio final de L1 aplicando descuento permitido politica comercial vigente vigente si depende de Price_L1; es precio comercial calculado, no precio base
PrecioOfertaFinal CAST(ROUND([Price_OF], 3) AS DECIMAL(18,3)) precio promocional u oferta vigente promociones vigentes vigente si precio especial vigente; historizar por cambio si negocio lo necesita

12.4 Bloque repetible de listas L1..L9

Campo devuelto Origen / calculo Significado de negocio Capa futura asignada Tipo Relacion por tenant_id + SKU Observacion
MargenL1 CAST(ROUND([Margen_L1], 3) AS DECIMAL(18,3)) margen vigente de la lista L1 margenes y descuentos vigentes vigente si bloque repetible; normalizar como fila lista_codigo = L1
PrecioL1 CAST(ROUND([Price_L1], 3) AS DECIMAL(18,3)) precio final vigente de la lista L1 precios vigentes vigente si no modelar como columna fija en destino principal
IVAPrecioL1 CAST(ROUND([Price_L1] - ([Price_L1] / factor_iva), 3) AS DECIMAL(18,3)) componente IVA del precio L1 impuestos vigentes vigente si derivado con factor_iva; parte del mismo bloque L1
PrecioNetoL1 CAST(ROUND([Price_L1] / factor_iva, 3) AS DECIMAL(18,3)) precio neto sin IVA de la lista L1 precios vigentes vigente si derivado con factor_iva; normalizar junto a PrecioL1
MargenL2 CAST(ROUND([Margen_L2], 3) AS DECIMAL(18,3)) margen vigente de la lista L2 margenes y descuentos vigentes vigente si bloque repetible; normalizar como fila lista_codigo = L2
PrecioL2 CAST(ROUND([Price_L2], 3) AS DECIMAL(18,3)) precio final vigente de la lista L2 precios vigentes vigente si no modelar como columna fija en destino principal
IVAPrecioL2 CAST(ROUND([Price_L2] - ([Price_L2] / factor_iva), 3) AS DECIMAL(18,3)) componente IVA del precio L2 impuestos vigentes vigente si derivado con factor_iva; parte del mismo bloque L2
PrecioNetoL2 CAST(ROUND([Price_L2] / factor_iva, 3) AS DECIMAL(18,3)) precio neto sin IVA de la lista L2 precios vigentes vigente si derivado con factor_iva; normalizar junto a PrecioL2
MargenL3 CAST(ROUND([Margen_L3], 3) AS DECIMAL(18,3)) margen vigente de la lista L3 margenes y descuentos vigentes vigente si bloque repetible; normalizar como fila lista_codigo = L3
PrecioL3 CAST(ROUND([Price_L3], 3) AS DECIMAL(18,3)) precio final vigente de la lista L3 precios vigentes vigente si no modelar como columna fija en destino principal
IVAPrecioL3 CAST(ROUND([Price_L3] - ([Price_L3] / factor_iva), 3) AS DECIMAL(18,3)) componente IVA del precio L3 impuestos vigentes vigente si derivado con factor_iva; parte del mismo bloque L3
PrecioNetoL3 CAST(ROUND([Price_L3] / factor_iva, 3) AS DECIMAL(18,3)) precio neto sin IVA de la lista L3 precios vigentes vigente si derivado con factor_iva; normalizar junto a PrecioL3
MargenL4 CAST(ROUND([Margen_L4], 3) AS DECIMAL(18,3)) margen vigente de la lista L4 margenes y descuentos vigentes vigente si bloque repetible; normalizar como fila lista_codigo = L4
PrecioL4 CAST(ROUND([Price_L4], 3) AS DECIMAL(18,3)) precio final vigente de la lista L4 precios vigentes vigente si no modelar como columna fija en destino principal
IVAPrecioL4 CAST(ROUND([Price_L4] - ([Price_L4] / factor_iva), 3) AS DECIMAL(18,3)) componente IVA del precio L4 impuestos vigentes vigente si derivado con factor_iva; parte del mismo bloque L4
PrecioNetoL4 CAST(ROUND([Price_L4] / factor_iva, 3) AS DECIMAL(18,3)) precio neto sin IVA de la lista L4 precios vigentes vigente si derivado con factor_iva; normalizar junto a PrecioL4
MargenL5 CAST(ROUND([Margen_L5], 3) AS DECIMAL(18,3)) margen vigente de la lista L5 margenes y descuentos vigentes vigente si bloque repetible; normalizar como fila lista_codigo = L5
PrecioL5 CAST(ROUND([Price_L5], 3) AS DECIMAL(18,3)) precio final vigente de la lista L5 precios vigentes vigente si no modelar como columna fija en destino principal
IVAPrecioL5 CAST(ROUND([Price_L5] - ([Price_L5] / factor_iva), 3) AS DECIMAL(18,3)) componente IVA del precio L5 impuestos vigentes vigente si derivado con factor_iva; parte del mismo bloque L5
PrecioNetoL5 CAST(ROUND([Price_L5] / factor_iva, 3) AS DECIMAL(18,3)) precio neto sin IVA de la lista L5 precios vigentes vigente si derivado con factor_iva; normalizar junto a PrecioL5
MargenL6 CAST(ROUND([Margen_L6], 3) AS DECIMAL(18,3)) margen vigente de la lista L6 margenes y descuentos vigentes vigente si bloque repetible; normalizar como fila lista_codigo = L6
PrecioL6 CAST(ROUND([Price_L6], 3) AS DECIMAL(18,3)) precio final vigente de la lista L6 precios vigentes vigente si no modelar como columna fija en destino principal
IVAPrecioL6 CAST(ROUND([Price_L6] - ([Price_L6] / factor_iva), 3) AS DECIMAL(18,3)) componente IVA del precio L6 impuestos vigentes vigente si derivado con factor_iva; parte del mismo bloque L6
PrecioNetoL6 CAST(ROUND([Price_L6] / factor_iva, 3) AS DECIMAL(18,3)) precio neto sin IVA de la lista L6 precios vigentes vigente si derivado con factor_iva; normalizar junto a PrecioL6
MargenL7 CAST(ROUND([Margen_L7], 3) AS DECIMAL(18,3)) margen vigente de la lista L7 margenes y descuentos vigentes vigente si bloque repetible; normalizar como fila lista_codigo = L7
PrecioL7 CAST(ROUND([Price_L7], 3) AS DECIMAL(18,3)) precio final vigente de la lista L7 precios vigentes vigente si no modelar como columna fija en destino principal
IVAPrecioL7 CAST(ROUND([Price_L7] - ([Price_L7] / factor_iva), 3) AS DECIMAL(18,3)) componente IVA del precio L7 impuestos vigentes vigente si derivado con factor_iva; parte del mismo bloque L7
PrecioNetoL7 CAST(ROUND([Price_L7] / factor_iva, 3) AS DECIMAL(18,3)) precio neto sin IVA de la lista L7 precios vigentes vigente si derivado con factor_iva; normalizar junto a PrecioL7
MargenL8 CAST(ROUND([Margen_L8], 3) AS DECIMAL(18,3)) margen vigente de la lista L8 margenes y descuentos vigentes vigente si bloque repetible; normalizar como fila lista_codigo = L8
PrecioL8 CAST(ROUND([Price_L8], 3) AS DECIMAL(18,3)) precio final vigente de la lista L8 precios vigentes vigente si no modelar como columna fija en destino principal
IVAPrecioL8 CAST(ROUND([Price_L8] - ([Price_L8] / factor_iva), 3) AS DECIMAL(18,3)) componente IVA del precio L8 impuestos vigentes vigente si derivado con factor_iva; parte del mismo bloque L8
PrecioNetoL8 CAST(ROUND([Price_L8] / factor_iva, 3) AS DECIMAL(18,3)) precio neto sin IVA de la lista L8 precios vigentes vigente si derivado con factor_iva; normalizar junto a PrecioL8
MargenL9 CAST(ROUND([Margen_L9], 3) AS DECIMAL(18,3)) margen vigente de la lista L9 margenes y descuentos vigentes vigente si bloque repetible; normalizar como fila lista_codigo = L9
PrecioL9 CAST(ROUND([Price_L9], 3) AS DECIMAL(18,3)) precio final vigente de la lista L9 precios vigentes vigente si no modelar como columna fija en destino principal
IVAPrecioL9 CAST(ROUND([Price_L9] - ([Price_L9] / factor_iva), 3) AS DECIMAL(18,3)) componente IVA del precio L9 impuestos vigentes vigente si derivado con factor_iva; parte del mismo bloque L9
PrecioNetoL9 CAST(ROUND([Price_L9] / factor_iva, 3) AS DECIMAL(18,3)) precio neto sin IVA de la lista L9 precios vigentes vigente si derivado con factor_iva; normalizar junto a PrecioL9

12.5 Fechas operativas e historicos utiles

Campo devuelto Origen / calculo Significado de negocio Capa futura asignada Tipo Relacion por tenant_id + SKU Observacion
Fecha de Ultima Compra CONVERT(VARCHAR(10), UltimaCompra, 120) ultima fecha conocida de compra del SKU actividad comercial vigente historico util si sale como texto yyyy-mm-dd; conviene normalizar a tipo fecha en capas futuras
UltVenta CONVERT(VARCHAR(10), [UltimaVenta], 103) ultima fecha conocida de venta del SKU actividad comercial vigente historico util si sale como texto dd/mm/yyyy; requiere normalizacion de formato para comparabilidad
UltCambioCosto CONVERT(VARCHAR(10), [UltCambioCosto], 103) ultima fecha conocida de cambio de costo historial de costos por cambio historico util si fecha clave para vigencia; tambien requiere normalizacion de formato
DiasSinComprar CAST([DiasSinComprar] AS INT) dias transcurridos desde la ultima compra actividad comercial vigente historico util si indicador derivado de recencia; no reemplaza la fecha base
DiasSinVender CAST([DiasSinVender] AS INT) dias transcurridos desde la ultima venta actividad comercial vigente historico util si indicador derivado de recencia; no reemplaza la fecha base
DiasSinActCosto CAST([DiasSinActCosto] AS INT) dias transcurridos desde la ultima actualizacion de costo actividad comercial vigente historico util si indicador de recencia de costo; depende de conservar UltCambioCosto

12.6 Politica comercial y volumetria / logistica

Campo devuelto Origen / calculo Significado de negocio Capa futura asignada Tipo Relacion por tenant_id + SKU Observacion
CantVtaMin CAST(CntVentaMin AS INT) cantidad minima de venta del producto politica comercial vigente vigente si restriccion comercial relativamente lenta que no debe leerse como stock
CantVentaAgrupada CAST([CntVentaAgrupada] AS INT) cantidad agrupada de venta o empaque comercial politica comercial vigente vigente si conviene validar semantica operativa exacta cuando se implemente
UnidadMedida RTRIM([UnidadMedida]) unidad de medida del producto volumetria / logistica vigente si texto relativamente lento; puede requerir catalogo normalizado
PesoxUnidad CAST(ROUND([Peso], 3) AS DECIMAL(18,3)) peso unitario del producto volumetria / logistica vigente si dato fisico base para calculos posteriores
VolumenxUnidad CAST(ROUND([Volumen], 3) AS DECIMAL(18,3)) volumen unitario del producto volumetria / logistica vigente si dato fisico base para calculos posteriores
BasePallet CAST([BasePallet] AS INT) cantidad de bultos o unidades base por pallet segun layout volumetria / logistica vigente si atributo estructural del palletizado
AlturaPallet CAST([AlturaPallet] AS INT) cantidad de niveles o altura operativa del pallet volumetria / logistica vigente si atributo estructural del palletizado
Unidades_x_Bulto CAST(Unidades_bulto AS INT) conversion de unidades por bulto volumetria / logistica vigente si base de conversion para bultos y pallet; critica para Stock en Bultos
CantUnidxPallet CAST(([BasePallet] * [AlturaPallet]) * [Unidades_bulto] AS INT) cantidad total de unidades por pallet volumetria / logistica vigente si derivado de estructura de pallet y bulto
CantBultosxPallet CAST([BasePallet] * [AlturaPallet] AS INT) cantidad total de bultos por pallet volumetria / logistica vigente si derivado simple de base por altura
PesoxPalletkg CAST((([BasePallet] * [AlturaPallet]) * [Unidades_bulto]) * [Peso] AS DECIMAL(18,3)) peso total estimado del pallet volumetria / logistica vigente si derivado fisico; depende de consistencia de peso y estructura
VolumenxPalletm3 CAST((([BasePallet] * [AlturaPallet]) * [Unidades_bulto]) * [Volumen] AS DECIMAL(18,3)) volumen total estimado del pallet volumetria / logistica vigente si derivado fisico; depende de consistencia de volumen y estructura

13. Cobertura funcional verificada

Cobertura explicitamente confirmada:

  • producto: SKU, Articulo, PLU Articulo, [PLU Bulto]
  • marca: Marca
  • proveedor: Cod Proveedor, Proveedor
  • categoria / subcategoria: Category, SubCategoria
  • estado / vigencia / gobernanza: Estado
  • estrategia comercial: Estrategico
  • politica comercial: Acepta Devolucion, Descuento Permitido, PrecioCDescPermitidoFinal, CantVtaMin, CantVentaAgrupada
  • stock: Stock
  • stock en bultos: Stock en Bultos
  • costos: CostoListaProveedor, Costo, UltCambioCosto
  • descuentos de compra: Dcto Compra 1, Dcto Compra 2, Dcto Compra 3
  • listas de precios: PrecioL1..PrecioL9
  • IVA: AlicuotaIVA, IVAPListaFinal, IVAPrecioL1..IVAPrecioL9
  • margenes: Markup, MargenL1..MargenL9
  • promociones: PrecioOfertaFinal
  • inventario: Stock, Stock en Bultos, mas su proyeccion documental a snapshot diario y eventos de inventario
  • volumetria / logistica: Unidades_x_Bulto, UnidadMedida, PesoxUnidad, VolumenxUnidad, BasePallet, AlturaPallet, CantBultosxPallet, CantUnidxPallet, PesoxPalletkg, VolumenxPalletm3
  • actividad comercial: Fecha de Ultima Compra, UltVenta, DiasSinComprar, DiasSinVender, DiasSinActCosto
  • auditoria / historicos utiles: fechas de ultimo evento, dias de recencia, historia por cambio recomendada para costo, precio, IVA, margen, descuento, promociones y cambios volumetricos cuando aporten valor
  • auditoria de extraccion: no aparece como campo del SELECT; queda asignada a la capa futura auditoria de extraccion por corrida

Cobertura documental SOURCE-002: 100% de campos del SELECT clasificados.