ENTIDADES GOLD DEL TABLERO DE INVENTARIOS
El Tablero de Inventario está compuesto por entidades que consolidan información clave de órdenes de compra, órdenes de venta, órdenes de producción y tablas descriptivas (tablas TXT). Su objetivo es proporcionar una proyección de stock a futuro, permitiendo una gestión eficiente de inventarios basada en:
- Materiales comprometidos (en proceso de venta).
- Stock entrante (en proceso de compra).
- Transferencia de stock (movimientos internos de materiales).
- Stock en producción (materiales en órdenes de fabricación).
Estas entidades permiten visualizar la disponibilidad de materiales y prever posibles faltantes o excesos, optimizando la planificación de suministros y el cumplimiento de pedidos.
Entidades que componen el Tablero de Inventarios
Las siguientes entidades forman parte de este modelo:
- OI_GOLD_SD_OPEN_TRACKER_ECC.sql
- OI_GOLD_SD_OPEN_TRACKER_RECIVINGS_ECC.sql
- OI_GOLD_SD_INVENTORY_ECC.sql
OI_GOLD_SD_OPEN_TRACKER_ECC
Este modelo pertenece a la capa Gold de la arquitectura medallón y se compone de la entidad Silver de órdenes de venta. Su propósito es identificar órdenes de venta no completadas con fecha de entrega a futuro, permitiendo estimar el stock comprometido.
Dependencias
- OI_SILVER_SD_SALES_ORDER_ECC (Órdenes de Venta - Capa Silver)
Contiene información consolidada de las órdenes de venta dentro del módulo SD en SAP ECC.
<client>_<environment>_SD_ORDENES_VENTA_SILVER
- MARD (Stock de Material por Almacén)
Almacena información sobre los niveles de inventario de los materiales en cada almacén, permitiendo gestionar la disponibilidad de stock en tiempo real.
<client>_<environment>_MM_MATERIAL_ALMACEN
- T001W (Centros de Planta)
Contiene la lista de centros en SAP, representando ubicaciones físicas donde se realizan operaciones logísticas, productivas o de almacenamiento.
<client>_<environment>_DM_PLANTAS
- TVKOT (Organización de Ventas - Descripción)
Contiene las descripciones de las organizaciones de ventas en diferentes idiomas, permitiendo identificar las estructuras comerciales dentro de SAP.
<client>_<environment>_DM_ORGANIZACION_VENTAS_TXT
- TVTWT (Canales de Distribución - Descripción)
Almacena las descripciones de los canales de distribución utilizados en SAP SD, facilitando la segmentación y gestión de ventas.
<client>_<environment>_DM_CANAL_DISTRBUCION_TXT
- TSPAT (Grupo de Estadísticas de Materiales)
Contiene información sobre la clasificación de materiales para estadísticas de ventas y análisis de desempeño comercial.
<client>_<environment>_DM_SECTOR_COMERCIAL_TXT
- T023T (Grupo de Materiales - Descripción)
Almacena las descripciones de los grupos de materiales en diferentes idiomas, facilitando la categorización de productos.
<client>_<environment>_DM_GRUPO_MATERIAL_TXT
- TVKBT (Grupos de Clientes - Descripción)
Contiene las descripciones de los grupos de clientes en SAP.
<client>_<environment>_DM_OFICINA_VENTAS_TXT
- T179T (Jerarquía de Materiales - Descripción)
Almacena la información estructurada de la jerarquía de materiales, facilitando la clasificación de productos dentro del sistema.
<client>_<environment>_DM_JERARQUIA_MATERIALES_TXT
- MAKT (Descripción de Materiales)
Contiene las descripciones de los materiales en diferentes idiomas.
<client>_<environment>_MM_MATERIAL_DESCRIPCION
- KNA1 (Maestro de Clientes - Datos Generales)
Almacena los datos generales de los clientes en SAP.
<client>_<environment>_SD_MAESTRO_CLIENTES
Supuestos
- Se consideran órdenes de venta completadas únicamente aquellos registros donde statusglob_vbuk = 'C'.
- El estado del inventario se calcula con la suma de la cantidad disponible de stock libre para su uso, consolidado por planta y material:
SUM(mard.libre_utiliz) AS disponible, agrupado por planta y material.
- El estado de entrega se determina como la diferencia en días entre la fecha actual y la fecha de entrega estimada, calculada de la siguiente manera:
dateDiff('day', NOW(), toDate(sso.feentrega_vbep, '%Y%m%d')) AS delivery_time.
Instalación
La instalación de esta entidad sigue el mismo proceso que OI_SILVER_SD_SALES_ORDER_ECC, ya que ambas forman parte de una instalación en cadena.
Es importante asegurarse de que todas las dependencias y entidades previas en la cadena de instalación estén correctamente configuradas antes de proceder con la ejecución.
Para desplegar el modelo, ejecutar el siguiente comando:
docker-compose up -d dbt_oi_sales_order --build
Modelo sql ejecutado
- {{ config(
- order_by='(mandante_vbak, docvtas_vbak, posicion_vbap)',
- engine='ReplacingMergeTree(_version)',
- materialized='incremental',
- incremental_strategy='append',
- pre_hook=[
- "{% if is_incremental() %}
- ALTER TABLE {{this}} DELETE
- WHERE (docvtas_vbak) NOT IN (
- SELECT docvtas_vbak
- FROM {{ ref('OI_SILVER_SD_SALES_ORDER_ECC') }})
- {% endif %}"
- ],
- post_hook=[
- "ALTER TABLE {{this}} DELETE
- WHERE statusglob_vbuk = 'C'",
- ]
- ) }}
- /*
- * SOLO PROCESARÁ VENTAS NUEVAS O REALIZARÁ UN RECALCULO EN CASO DE UN VENTA ELIMINADA.
- */
- WITH new_data AS (
- SELECT
- sso.mandante_vbak as mandante_vbak,
- sso.docvtas_vbak as docvtas_vbak,
- sso.posicion_vbap as posicion_vbap,
- sso.material_vbap as material_vbap,
- sso.centro_vbap as centro_vbap,
- sso.ctdped_vbep as ctdped_vbep,
- formatDateTime(toDate(sso.feentrega_vbep, '%Y%m%d'), '%Y-%m-%d') as fecha_entrega,
- formatDateTime(toDate(sso.feentrega_vbep, '%Y%m%d'), '%Y-%m') as mes_entrega,
- sso.solic_vbak as solic_vbak,
- sso.grclient_vbkd as grclient_vbkd,
- sso.pais_vbpa as pais_vbpa,
- sso.feentrega_vbep as feentrega_vbep,
- sso.fechsol_vbak as fechsol_vbak,
- sso.direccion_vbpa as direccion_vbpa,
- sso.condexp_vbak as condexp_vbak,
- sso.orgventas_vbak as orgventas_vbak,
- sso.candistr_vbak as candistr_vbak,
- sso.oficvta_vbak as oficvta_vbak,
- sso.jquiaprod_vbap as jquiaprod_vbap,
- sso.sector_vbap as sector_vbap,
- sso.priorentr_vbap as priorentr_vbap,
- sso.gpoartic_vbap as gpoartic_vbap,
- sso.ruta_vbap as ruta_vbap,
- sso.zona_vbpa as zona_vbpa,
- sso.statusglob_vbuk as statusglob_vbuk,
- sso._version as updated_at
- FROM {{ ref('OI_SILVER_SD_SALES_ORDER_ECC')}} as sso FINAL
- {% if is_incremental() %}
- WHERE sso._version >= (SELECT max(updated_at) FROM {{this}})
- {% endif %}
- ),
- inventory as (
- SELECT
- mard.mandante as mandante,
- mard.material as material,
- mard.centro as centro,
- SUM(mard.libre_utiliz) disponible
- FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_ALMACEN') }} mard FINAL
- GROUP BY mard.mandante, mard.material, mard.centro
- )
- SELECT DISTINCT
- sso.mandante_vbak as mandante_vbak,
- sso.docvtas_vbak as docvtas_vbak,
- sso.posicion_vbap as posicion_vbap,
- sso.material_vbap as material_vbap,
- sso.centro_vbap as centro_vbap,
- sso.ctdped_vbep as ctdped_vbep,
- sso.fecha_entrega as fecha_entrega,
- sso.mes_entrega as mes_entrega,
- sso.solic_vbak as solic_vbak,
- sso.grclient_vbkd as grclient_vbkd,
- sso.pais_vbpa as pais_vbpa,
- sso.feentrega_vbep as feentrega_vbep,
- sso.fechsol_vbak as fechsol_vbak,
- sso.direccion_vbpa as direccion_vbpa,
- sso.condexp_vbak as condexp_vbak,
- sso.orgventas_vbak as orgventas_vbak,
- sso.candistr_vbak as candistr_vbak,
- sso.oficvta_vbak as oficvta_vbak,
- sso.jquiaprod_vbap as jquiaprod_vbap,
- sso.sector_vbap as sector_vbap,
- sso.priorentr_vbap as priorentr_vbap,
- sso.gpoartic_vbap as gpoartic_vbap,
- sso.ruta_vbap as ruta_vbap,
- sso.zona_vbpa as zona_vbpa,
- sso.statusglob_vbuk as statusglob_vbuk,
- sso.updated_at as updated_at,
- dateDiff('day', NOW(), toDate(sso.feentrega_vbep, '%Y%m%d')) as delivery_time,
- LEAST(delivery_time, 8) as status,
-
- ssiv.disponible as stock_disponible,
- t001w.nom1 as centro,
- t001w.idioma AS idioma,
- tvkot.denomin AS orgventas,
- tvtwt.denomin AS candistr,
- tspat.denomin AS sector,
- t023t.gpoartic1 AS gpoartic,
- tvkbt.denomin AS oficvta,
- t179t.denom as jquiaprod,
- makt.denominacion as material,
- kna1.nombre1 as cliente,
- --tvsbt.denomin as condexp,
- -- tvrot.name as route,
- -- tzon.ctryreg as ctryreg,
- -- tzon.descript as zone_txt,
- now64() as _version
- FROM new_data as sso
- --TODO: CAMBIAR LUEGO
- LEFT JOIN inventory as ssiv
- ON ssiv.material = sso.material_vbap and ssiv.centro = sso.centro_vbap
- LEFT JOIN (SELECT cp, nom1, centro , idioma FROM {{ source('oneconnect', 'PR0_B_DM_PLANTAS') }} FINAL) AS t001w on t001w.centro = sso.centro_vbap AND t001w.idioma ='S'
- LEFT JOIN (SELECT denomin, orgventas, idioma FROM {{ source('oneconnect', 'PR0_B_DM_ORGANIZACION_VENTAS_TXT') }} FINAL) AS tvkot on tvkot.orgventas = sso.orgventas_vbak and tvkot.idioma = t001w.idioma
- LEFT JOIN (SELECT denomin, candistr, idioma FROM {{ source('oneconnect', 'PR0_B_DM_CANAL_DISTRBUCION_TXT') }} FINAL) AS tvtwt on tvtwt.candistr = sso.candistr_vbak and tvtwt.idioma = t001w.idioma
- LEFT JOIN (SELECT idioma, sector, denomin FROM {{ source('oneconnect', 'PR0_B_DM_SECTOR_COMERCIAL_TXT') }} FINAL) AS tspat on tspat.sector = sso.sector_vbap and tspat.idioma = t001w.idioma
- LEFT JOIN (SELECT gpoartic1, gpoartic, idioma FROM {{ source('oneconnect', 'PR0_B_DM_GRUPO_MATERIAL_TXT') }} FINAL) AS t023t on t023t.gpoartic = sso.gpoartic_vbap and t023t.idioma = t001w.idioma
- LEFT JOIN (SELECT idioma, oficvta, denomin FROM {{ source('oneconnect', 'PR0_B_DM_OFICINA_VENTAS_TXT') }} FINAL) AS tvkbt on tvkbt.oficvta = sso.oficvta_vbak and tvkbt.idioma = t001w.idioma
- LEFT JOIN (SELECT idioma, jquiaprod, denom FROM {{ source('oneconnect', 'PR0_B_DM_JERARQUIA_MATERIALES_TXT') }} FINAL) AS t179t on t179t.jquiaprod = sso.jquiaprod_vbap and t179t.idioma = t001w.idioma
- LEFT JOIN (SELECT denominacion, material, idioma FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_DESCRIPCION') }} FINAL) AS makt on makt.material = sso.material_vbap and makt.idioma = t001w.idioma
- LEFT JOIN (SELECT nombre1, cliente, idioma FROM {{ source('oneconnect', 'PR0_B_SD_MAESTRO_CLIENTES') }} FINAL) AS kna1 on kna1.cliente = sso.solic_vbak and kna1.idioma = t001w.idioma
- --LEFT JOIN (SELECT idioma, condexp, denomin FROM {{ source('oneconnect', 'PR0_B_DM_COND_EXPEDICION_TXT') }} FINAL) AS tvsbt on tvsbt.condexp = sso.condexp_vbak and tvsbt.idioma = t001w.idioma
- ORDER BY fecha_entrega ASC
OI_GOLD_SD_OPEN_TRACKER_RECIVINGS_ECC
Este modelo consolida información clave de órdenes de compra, órdenes de producción y transferencias de stock, enfocándose en aquellos registros con fechas de entrega futuras y estados no completados. Su objetivo es proporcionar una visión integral de las operaciones pendientes, facilitando el seguimiento y la planificación del inventario.
Componentes del Modelo:
- Órdenes de compra: Información sobre los materiales solicitados a proveedores, asegurando visibilidad de los suministros entrantes.
- Órdenes de producción: Datos de los productos en proceso de fabricación, permitiendo anticipar la disponibilidad de manufactura.
- Transferencias de stock: Registros de movimientos de materiales entre plantas, optimizando la gestión de inventario interno.
El modelo filtra los registros con estados distintos a "completado" y fechas de entrega posteriores a la fecha actual, asegurando un seguimiento preciso de las actividades en curso y su impacto en la disponibilidad de stock.
Dependencias
- OI_SILVER_MM_PURCHASE_ORDER_ECC (Órdenes de Compra - Capa Silver)
Contiene información consolidada de las órdenes de compra dentro del módulo MM en SAP ECC, proporcionando visibilidad sobre los materiales solicitados a proveedores.
OI_SILVER_MM_PURCHASE_ORDER_ECC
- OI_SILVER_PP_PRODUCTION_ORDER_ECC (Órdenes de Producción - Capa Silver)
Almacena datos estructurados de las órdenes de producción en el módulo PP de SAP, permitiendo el análisis y seguimiento de materiales en proceso de fabricación.
OI_SILVER_PP_PRODUCTION_ORDER_ECC
- MARD (Stock de Material por Almacén)
Almacena información sobre los niveles de inventario de los materiales en cada almacén, permitiendo gestionar la disponibilidad de stock en tiempo real.
<client>_<environment>_MM_MATERIAL_ALMACEN
- T001W (Centros de Planta)
Contiene la lista de centros en SAP, representando ubicaciones físicas donde se realizan operaciones logísticas, productivas o de almacenamiento.
<client>_<environment>_DM_PLANTAS
- MAKT (Descripción de Materiales)
Contiene las descripciones de los materiales en diferentes idiomas.
<client>_<environment>_MM_MATERIAL_DESCRIPCION
Supuestos
- Se considera Orden de Compra no completadas a los registros de la entidad OI_SILVER_MM_PURCHASE_ORDER_ECC filtros:
...
fechaentrgestad_eket <> '00000000'
and fechaentrgestad_eket <> ''
and cantidad_pedido_ekpo <> 0
and tipo_posicion_ekpo <> '7'
and entregado_compl_ekpo <> 'X'
and material_ekpo <> ''
...
- Se considera Transferencia de Stock no completados a los registros de la entidad OI_SILVER_MM_PURCHASE_ORDER_ECC con filtros:
...
fechaentrgestad_eket <> '00000000'
and fechaentrgestad_eket <> ''
and cantidad_pedido_ekpo <> 0
and tipo_posicion_ekpo = '7'
and entregado_compl_ekpo <> 'X'
and material_ekpo <> ''
...
- Se considera Orden de Producción no completados o en progreso a los registros de la entidad OI_SILVER_PP_PRODUCTION_ORDER_ECC con los siguientes filtros:
...
fin_programado_afpo <> ''
and fin_programado_afpo <> '00000000'
and notiffinal_afru <> 'X'
...
Instalación
docker-compose up -d dbt_oi_production_order --build
Modelo sql ejecutado
- {{ config(
- order_by='(operacion, nro_orden, posicion, material, centro)',
- engine='ReplacingMergeTree(_version)',
- materialized='incremental',
- incremental_strategy='append'
- ) }}
- WITH inventory as (
-
- SELECT
- mard.mandante as mandante,
- mard.material as material,
- mard.centro as centro,
- SUM(mard.libre_utiliz) disponible
- FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_ALMACEN') }} mard FINAL
- GROUP BY mard.mandante, mard.material, mard.centro
- ),
- purchase_orders as (
- SELECT
- 'Orden de Compra' as operacion,
- ospo.doccompras_ekpo as nro_orden,
- ospo.posicion_ekpo as posicion,
- ospo.centro_ekpo as centro,
- ospo.material_ekpo as material,
- formatDateTime(toDate(ospo.fechaentrgestad_eket, '%Y%m%d'), '%Y-%m-%d') as fecha_entrega,
- ospo.fechaentrgestad_eket as fecha_entrega_str,
- ospo.cantidad_pedido_ekpo as cantidad_pedido,
- formatDateTime(toDate(ospo.fechaentrgestad_eket, '%Y%m%d'), '%Y-%m') as mes_entrega,
- ospo._version as purchase_updated_at,
- toDateTime64(0, 8) as transfer_updated_at,
- toDateTime64(0, 8) as production_updated_at
- FROM {{ ref('OI_SILVER_MM_PURCHASE_ORDER_ECC') }} AS ospo FINAL
- WHERE
-
- ospo.fechaentrgestad_eket <> '00000000'
- and ospo.fechaentrgestad_eket <> ''
- and ospo.cantidad_pedido_ekpo <> 0
- and ospo.tipo_posicion_ekpo <> '7'
- and ospo.entregado_compl_ekpo <> 'X'
- and ospo.material_ekpo <> ''
- {% if is_incremental() %}
- and ospo._version >= (select max(purchase_updated_at) from {{this}})
- {% endif %}
- ),
- stock_orders as (
- SELECT
- 'Transferencia de Stock' as operacion,
- ospo.doccompras_ekpo as nro_orden,
- ospo.posicion_ekpo as posicion,
- ospo.centro_ekpo as centro_ekpo,
- ospo.material_ekpo as material,
- formatDateTime(toDate(ospo.fechaentrgestad_eket, '%Y%m%d'), '%Y-%m-%d') as fecha_entrega,
- ospo.fechaentrgestad_eket as fecha_entrega_str,
- ospo.cantidad_pedido_ekpo as cantidad_pedido,
- formatDateTime(toDate(ospo.fechaentrgestad_eket, '%Y%m%d'), '%Y-%m') as mes_entrega,
- toDateTime64(0, 8) as purchase_updated_at,
- ospo._version as transfer_updated_at,
- toDateTime64(0, 8) as production_updated_at
- FROM {{ ref('OI_SILVER_MM_PURCHASE_ORDER_ECC') }} AS ospo FINAL
- WHERE
- ospo.fechaentrgestad_eket <> '00000000'
- and ospo.fechaentrgestad_eket <> ''
- and ospo.cantidad_pedido_ekpo <> 0
- and ospo.tipo_posicion_ekpo = '7'
- and ospo.entregado_compl_ekpo <> 'X'
- and ospo.material_ekpo <> ''
- {% if is_incremental() %}
- and ospo._version >= (select max(transfer_updated_at) from {{this}})
- {% endif %}
- ),
- production_orders as (
- SELECT
- 'Orden de Producción' as operacion,
- ssp.orden_afpo as nro_orden,
- ssp.n_posicion_afpo as posicion,
- ssp.centro_afpo as centro,
- ssp.numero_material_afpo as material,
- formatDateTime(toDate(ssp.fin_programado_afpo, '%Y%m%d'), '%Y-%m-%d') as fecha_entrega,
- ssp.fin_programado_afpo as fecha_entrega_str,
- ssp.cantidad_pos_afpo as cantidad_pedido,
- formatDateTime(toDate(ssp.fin_programado_afpo, '%Y%m%d'), '%Y-%m') as mes_entrega,
- toDateTime64(0, 8) as purchase_updated_at,
- toDateTime64(0, 8) as transfer_updated_at,
- ssp._version as production_updated_at
- FROM {{ ref('OI_SILVER_PP_PRODUCTION_ORDER_ECC') }} AS ssp FINAL
- where
- ssp.fin_programado_afpo <> ''
- and ssp.fin_programado_afpo <> '00000000'
- and ssp.notiffinal_afru <> 'X'
- {% if is_incremental() %}
- and ssp._version >= (select max(production_updated_at) from {{this}})
- {% endif %}
- ),
- plants as (
- SELECT
- nom1,
- centro,
- idioma
- FROM {{ source('oneconnect', 'PR0_B_DM_PLANTAS') }}
- FINAL
- ),
- material_desc as (
- SELECT
- denominacion,
- material,
- idioma
- FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_DESCRIPCION') }}
- FINAL
- )
- SELECT
- orders.operacion as operacion,
- orders.nro_orden as nro_orden,
- orders.posicion as posicion,
- orders.centro as centro,
- orders.material as material,
- orders.fecha_entrega as fecha_entrega,
- orders.fecha_entrega_str as fecha_entrega_str,
- orders.cantidad_pedido as cantidad_pedido,
- orders.mes_entrega as mes_entrega,
- orders.purchase_updated_at as purchase_updated_at,
- orders.transfer_updated_at as transfer_updated_at,
- orders.production_updated_at as production_updated_at,
- mard.disponible as disponible,
- t001w.nom1 as desc_centro,
- makt.denominacion AS desc_material,
- now64() as _version
- FROM (
- SELECT *
- FROM purchase_orders
- UNION ALL
- SELECT *
- FROM stock_orders
- UNION ALL
- SELECT *
- FROM production_orders
- ) AS orders
- left JOIN inventory as mard on mard.material = orders.material and mard.centro = orders.centro
- left JOIN plants AS t001w on t001w.centro = orders.centro AND t001w.idioma = 'S'
- left JOIN material_desc as makt on makt.material = mard.material and makt.idioma = t001w.idioma
OI_GOLD_SD_INVENTORY_ECC
Este modelo proporciona una proyección dinámica del estado del inventario a futuro, integrando información clave de múltiples fuentes para ofrecer una visión completa de la disponibilidad de stock en el tiempo.
Componentes del Modelo:
El modelo combina diversas fuentes de datos para generar una previsión precisa del inventario:
- Órdenes de ventas: Cantidades comprometidas para entregas futuras, reduciendo la disponibilidad de stock.
- Órdenes de compras: Materiales en tránsito desde proveedores, aumentando la disponibilidad proyectada.
- Órdenes de producción: Productos en proceso de fabricación, impactando el inventario una vez finalizados.
- Transferencias de stock entre plantas: Movimientos internos planificados que afectan la disponibilidad en distintas ubicaciones.
Dependencias
- OI_SILVER_MM_PURCHASE_ORDER_ECC (Órdenes de Compra - Capa Silver)
Contiene información consolidada de las órdenes de compra dentro del módulo MM en SAP, proporcionando visibilidad sobre los materiales solicitados a proveedores y su impacto en la planificación de inventario.
<client>_<environment>_MM_ORDENES_COMPRA_SILVER
- OI_SILVER_PP_PRODUCTION_ORDER_ECC (Órdenes de Producción - Capa Silver)
Almacena datos estructurados de las órdenes de producción en el módulo PP de SAP, permitiendo el análisis y seguimiento de materiales en proceso de fabricación.
<client>_<environment>_PP_ORDENES_PRODUCCION_SILVER
- OI_GOLD_SD_OPEN_TRACKER_ECC (Seguimiento de Órdenes Abiertas - Capa Gold)
Consolida información de órdenes de venta no completadas con fechas de entrega a futuro, proporcionando un seguimiento del stock comprometido y su impacto en la disponibilidad de inventario.
<client>_<environment>_SD_ORDENES_ABIERTAS_GOLD
- MARC (Datos de Material por Centro)
Almacena información específica de cada material por centro.
<client>_<environment>_MM_MATERIAL_PLANTA
- MARD (Stock de Material por Almacén)
Almacena información sobre los niveles de inventario de los materiales en cada almacén, permitiendo gestionar la disponibilidad de stock en tiempo real.
<client>_<environment>_MM_MATERIAL_ALMACEN
- T001W (Centros de Planta)
Contiene la lista de centros en SAP, representando ubicaciones físicas donde se realizan operaciones logísticas, productivas o de almacenamiento.
<client>_<environment>_DM_PLANTAS
- MAKT (Descripción de Materiales)
Contiene las descripciones de los materiales en diferentes idiomas.
<client>_<environment>_MM_MATERIAL_DESCRIPCION
Supuestos
- Se considera Stock disponible a la operacion SUM(mard.libre_utiliz) agrupado por planta y material.
- Se considera Cantidad Recibido por día a la operación ventana de la cantidad esperada de las ordenes de compras, ordenes de producción o transferencias de stock de la entidad OI_GOLD_SD_OPEN_TRACKER_RECIVINGS_ECC :
...
SUM(cantidad_pedido_dia) OVER (PARTITION BY material, centro ORDER BY fecha_entrega ASC) as cantidad_pedido_dia_ventana,
...
- Se considera Cantidad de perdido al día a la operación ventana de la cantidad comprometida de las ordenes de ventas:
...
SUM(cantidad_pedido_dia) OVER (PARTITION BY material, centro ORDER BY fecha_entrega ASC) as cantidad_pedido_dia_ventana
...
- Se considera Stock futuro a la operación :
...
(stock_disponible + cantidad_recibido_dia_ventana - cantidad_pedido_dia_ventana) as future_stock,
...
- Se considera Stock actual a la operación :
...
(stock_disponible - cantidad_pedido_dia_ventana) as actual_stock,
...
Instalación
docker-compose up -d dbt_oi_sales_order --build
Modelo sql ejecutado
- {{ config(
- order_by='(material, centro, fecha_entrega_str)',
- engine='ReplacingMergeTree(_version)',
- materialized='incremental',
- incremental_strategy='append'
- ) }}
- /* new_sales_orders: muestra los nuevas ordenes de ventas registradas.
- * sales_orders_affected: muestra todas las ordenes de ventas pasadas en el mes y mismo material.
- * sales_orders_sumary: Calculo de las ventas por días y periodo.
- */
- WITH new_sales_orders as (
- select DISTINCT
- got.fecha_entrega as fecha_entrega,
- got.feentrega_vbep as fecha_entrega_str,
- got.mes_entrega as mes_entrega,
- got.docvtas_vbak as orden,
- got.material_vbap as material,
- got.centro_vbap as centro,
- got.ctdped_vbep as cantidad_pedido, -- KWMENG
- got._version as _version
- FROM {{ ref('OI_GOLD_SD_OPEN_TRACKER_ECC')}} got FINAL
- {% if is_incremental() %}
- WHERE got._version >= (select max(got_version) from {{this}})
- {% endif %}
- ),
- sales_orders_affected as (
- SELECT
- *
- FROM new_sales_orders
- {% if is_incremental() %}
- UNION DISTINCT
- SELECT
- got.fecha_entrega as fecha_entrega,
- got.feentrega_vbep as fecha_entrega_str,
- got.mes_entrega as mes_entrega,
- got.docvtas_vbak as orden,
- got.material_vbap as material,
- got.centro_vbap as centro,
- got.ctdped_vbep as cantidad_pedido,
- got._version as _version
- FROM {{ ref('OI_GOLD_SD_OPEN_TRACKER_ECC')}} AS got FINAL
- where (got.centro_vbap, got.material_vbap) IN (SELECT DISTINCT centro, material FROM new_sales_orders)
- {% endif %}
- ),
- sales_orders_sumary as (
- SELECT
- fecha_entrega,
- fecha_entrega_str,
- material,
- centro,
- SUM(cantidad_pedido) as cantidad_pedido_dia,
- MAX(_version) AS _version
- FROM sales_orders_affected
- GROUP BY fecha_entrega,fecha_entrega_str, material, centro
- ),
- new_orders_receiving as (
- SELECT DISTINCT
- operacion,
- fecha_entrega,
- fecha_entrega_str,
- mes_entrega,
- nro_orden,
- cantidad_pedido,
- centro,
- material,
- _version
- FROM {{ ref('OI_GOLD_SD_OPEN_TRACKER_RECIVINGS_ECC')}}
- FINAL
- {% if is_incremental() %}
- WHERE _version >= (select max(goptr_version) from {{this}})
- {% endif %}
- ),
- orders_receiving_affected as (
- SELECT
- *
- FROM new_orders_receiving
- {% if is_incremental() %}
- UNION DISTINCT
- SELECT
- operacion,
- fecha_entrega,
- fecha_entrega_str,
- mes_entrega,
- nro_orden,
- cantidad_pedido,
- centro,
- material,
- _version as goptr_version
- FROM {{ ref('OI_GOLD_SD_OPEN_TRACKER_RECIVINGS_ECC')}}
- FINAL
- where (centro, material) IN (SELECT DISTINCT centro, material FROM new_orders_receiving)
- {% endif %}
- ),
- orders_receiving_sumary as (
- SELECT
- fecha_entrega,
- fecha_entrega_str,
- centro,
- material,
- SUM(cantidad_pedido) as cantidad_recibido_dia,
- MAX(_version) as _version
- FROM orders_receiving_affected
- GROUP BY fecha_entrega, fecha_entrega_str, material, centro
- ),
- material_quantity_sumary as (
- SELECT *,
- -- SUM(sumary.cantidad_recibido_dia - sumary.quantity_sales_order_day) OVER (PARTITION BY material, centro ORDER BY fecha_entrega ASC) as orders_sumary,
- SUM(sumary.cantidad_pedido_dia) OVER (PARTITION BY material, centro ORDER BY fecha_entrega ASC) as cantidad_pedido_dia_ventana,
- SUM(sumary.cantidad_recibido_dia) OVER (PARTITION BY material, centro ORDER BY fecha_entrega ASC) as cantidad_recibido_dia_ventana
- -- MAX(sumary.cantidad_pedido_total) OVER (PARTITION BY material, centro ) as cantidad_pedido_total
- FROM (
- SELECT
- greatest(rqs.fecha_entrega, oqs.fecha_entrega) as fecha_entrega,
- greatest(rqs.fecha_entrega_str, oqs.fecha_entrega_str) as fecha_entrega_str,
- greatest(rqs.material, oqs.material) as material,
- greatest(rqs.centro, oqs.centro) as centro,
-
- coalesce(rqs.cantidad_recibido_dia,0) as cantidad_recibido_dia,
- --coalesce(rqs.order_recivings_sum_period,0) as quantity_receivings_period,
- rqs._version as goptr_version,
-
- coalesce(oqs.cantidad_pedido_dia,0) as cantidad_pedido_dia,
- -- coalesce(oqs.cantidad_pedido_total,0) as cantidad_pedido_total,
-
-
- oqs._version as got_version
- FROM sales_orders_sumary as oqs
- FULL JOIN orders_receiving_sumary as rqs
- ON rqs.centro = oqs.centro and rqs.material = oqs.material and rqs.fecha_entrega_str = oqs.fecha_entrega_str
- ) as sumary
- ),
- status_inventory as (
- SELECT
- mard.mandante as mandante,
- mard.material as material,
- mard.centro as centro,
- -- SUM(mard.stockintfr) AS in_transit,
- -- SUM(mard.restricted) AS on_order,
- -- SUM(mard.restricted) AS in_quality_control,
- -- SUM(mard.blocked) AS allocated, --SPEME
- -- SUM(mard.returns) AS damaged, --RETME
- SUM(mard.libre_utiliz) stock_disponible, --LABST
- MAX(marc.stock_maximo) AS stock_maximo, -- MABST
- MAX(marc.stock_seguridad) AS stock_seguridad, --EISBE
- CASE
- WHEN stock_disponible > stock_maximo THEN 'Excess Stock'
- WHEN stock_disponible < stock_seguridad THEN 'Low Stock'
- WHEN stock_disponible = 0 THEN 'Out of Stock'
- ELSE 'Balanced Stock'
- END as status,
- max(mard._version) as _version
- FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_ALMACEN') }} mard FINAL
- INNER JOIN (
- SELECT stock_maximo, stock_seguridad, centro, material
- FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_PLANTA') }} FINAL
- ) AS marc
- ON mard.centro = marc.centro and mard.material = marc.material
- {% if is_incremental() %}
- WHERE
- mard._version >= (select max(mard_version) from {{this}})
- OR mard.material in (select material from material_quantity_sumary)
- {% endif %}
- GROUP BY mard.mandante, mard.material, mard.centro
- )
- SELECT
- mqs.fecha_entrega as fecha_entrega,
- mqs.fecha_entrega_str as fecha_entrega_str,
- mqs.material as material,
- mqs.centro as centro,
- mqs.cantidad_recibido_dia as cantidad_recibido_dia,
- mqs.cantidad_recibido_dia_ventana as cantidad_recibido_dia_ventana,
- -- mqs.cantidad_pedido_total as cantidad_pedido_total,
- mqs.cantidad_pedido_dia as cantidad_pedido_dia,
- mqs.cantidad_pedido_dia_ventana as cantidad_pedido_dia_ventana,
- --mqs.on_hand as quantity_sales_order_period,
- ssin.stock_maximo as stock_maximo,
- ssin.stock_seguridad as stock_seguridad,
- ssin.status as status,
- ssin.stock_disponible as stock_disponible,
- (ssin.stock_disponible + mqs.cantidad_recibido_dia_ventana - mqs.cantidad_pedido_dia_ventana) as future_stock,
- (ssin.stock_disponible - mqs.cantidad_pedido_dia_ventana) as actual_stock,
- --SUM(mqs.cantidad_recibido_dia - mqs.quantity_sales_order_day) OVER (PARTITION BY mqs.material, mqs.centro ORDER BY mqs.fecha_entrega ASC) as future_stock,
-
- t001w.nom1 as plant,
- t001w.cp as codigo_postal,
- makt.denominacion as desc_material,
- -- ssin.in_transit as in_transit,
- -- ssin.on_order as on_order,
- -- ssin.allocated as allocated,
- -- ssin.damaged as damaged,
- -- ssin.in_quality_control as in_quality_control,
- ssin._version as updated_at,
- ssin._version as mard_version,
- mqs.goptr_version as goptr_version,
- mqs.got_version as got_version,
- now64() as _version
- FROM material_quantity_sumary as mqs
- LEFT JOIN status_inventory ssin
- ON mqs.material = ssin.material and mqs.centro = ssin.centro
- LEFT JOIN ( SELECT cp, nom1, centro, idioma FROM {{ source('oneconnect', 'PR0_B_DM_PLANTAS') }} FINAL ) AS t001w
- ON t001w.centro = mqs.centro AND t001w.idioma ='S'
- LEFT JOIN (SELECT denominacion, material, idioma FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_DESCRIPCION') }} FINAL) AS makt
- ON makt.material = mqs.material and makt.idioma ='S'