13 PRODUCCTION DASHBOARD

13 PRODUCCTION DASHBOARD


ENTIDADES GOLD DEL TABLERO DE PRODUCCIÓN 

El Tablero de Producción está compuesto por múltiples entidades Gold, proporcionando información clave sobre las órdenes de producción y su ejecución por período. Estas entidades permiten el análisis detallado del uso de materiales, tiempos de producción y cumplimiento de planes productivos, facilitando la optimización del rendimiento operativo.




Entidades que componen el Tablero de Producción

Las siguientes entidades forman parte de este modelo:

  1. OI_GOLD_PP_PRODUCTION_COMPONENT_DETAIL.sql
  2. OI_GOLD_PP_PRODUCTION_MONTHLY_SUMMARY.sql
  3. OI_GOLD_PP_PRODUCTION_SUMMARY.sql



    OI_GOLD_PP_PRODUCTION_COMPONENT_DETAIL 

Este modelo pertenece a la capa Gold de la arquitectura de medallón y se compone de la entidad Silver OI_SILVER_PP_PRODUCTION_ORDER_ECC. Su propósito es proporcionar una visión detallada de los componentes requeridos en la producción, permitiendo un seguimiento preciso de los materiales utilizados en cada orden de producción.

Características del Modelo

  • Detalle de Componentes: Identifica los materiales necesarios para la fabricación de productos, permitiendo analizar el consumo de insumos en cada proceso productivo. 
  • Seguimiento del Estado: Registra el estado de inicio y finalización de la producción de cada componente, facilitando el monitoreo del avance en la ejecución de órdenes de producción. 



Dependencias 
  • OI_SILVER_PP_PRODUCTION_ORDER_ECC (Órdenes de Producción - Capa Silver)
    Contiene información consolidada de las órdenes de producción dentro del módulo PP en SAP, permitiendo el análisis y seguimiento de materiales en proceso de fabricación y su impacto en la disponibilidad de stock.
    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
  • 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
  • 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


    Supuestos 
  • Se considera una producción demorado "Delayed" si la fecha real de finalización fue mayor a la fecha de finalización planificada: 

...

(case 

   when actual_finish_date > planned_finish_date 

       or now() > parseDateTimeBestEffort(toString(toDateOrNull(planned_finish_date)))   

   then 'Delayed'

   else 'On time' 

end ) as  status_com,

...






Instalación 

docker-compose up -d dbt_oi_production_order --build





Modelo sql ejecutado 

  1. {{ config(
  2.    order_by='(sales_order_com, material_pt_com, posicion_resb)',
  3.    engine='ReplacingMergeTree(_version)',
  4.    materialized='incremental',
  5.    incremental_strategy='append'

  6. ) }}

  7. --MARD
  8. WITH inventory AS (
  9.    SELECT 
  10.        libre_utiliz,
  11.        material, 
  12.        centro, 
  13.        almacen 
  14.    FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_ALMACEN') }} FINAL
  15. ),

  16. component_detail as (
  17.    --COMPONENT DETAIL
  18.    SELECT  
  19.        DISTINCT 
  20.        spp.orden_resb  as sales_order_com, -- where tipo = 10
  21.        spp.numero_material_afpo,
  22.        spp.material_resb  as material_pt_com,
  23.        spp.centro_resb,
  24.        spp.almacen_resb,
  25.        spp.operacion_resb as operation_com,
  26.        spp.ctdnecesaria_resb as planned_qty_com,
  27.        spp.feintardio_afvv  as planned_start_date_com,
  28.        spp.fechafinmastrd_afvv as planned_finish_date_com,
  29.        spp.cantidad_toma_resb  as actual_qty_com,

  30.        (case
  31.         when spp.ctdnecesaria_resb != 0 then divide(spp.cantidad_toma_resb,spp.ctdnecesaria_resb)
  32.         else 0 end ) as actual_qty_com_divide_planned_qty_com,

  33.        spp.rechazo_notif_afru  as rejected_qty_com,
  34.        spp.inicio_ejecuc_afru  as actual_start_date_com,
  35.        spp.fin_ejecucion_afru  as actual_finish_date_com,
  36.        spp.feinicio_real_afko  as actual_start_date,
  37.        spp.fecha_fin_real1_afko  as actual_finish_date,
  38.        spp.fin_programado_afko as planned_finish_date,
  39.        spp.posicion_resb,
  40.        (case 
  41.            when actual_finish_date > planned_finish_date 
  42.                or now() > parseDateTimeBestEffort(toString(toDateOrNull(planned_finish_date)))   
  43.            then 'Delayed'
  44.            else 'On time' 
  45.        end ) as  status_com,
  46.        CONCAT(SUBSTRING(spp.inicio_program_afko,1,4),'-',SUBSTRING(spp.inicio_program_afko,5,2)) as MY_planned_start_date,

  47.        maktc.denominacion as material_com,
  48.        t001w.nom1 as nom1,
  49.        t023t.gpoartic1 as matl_group,
  50.        t179t.denom as prodhier,
  51.        makt.denominacion as material,
  52.        
  53.        spp.rechazo_afko,
  54.        spp.rechazo_notif_afko,

  55.         (case
  56.     when spp.fin_programado_afko = '00000000' then  null
  57.     else   parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT( SUBSTRING(spp.fin_programado_afko,1,4),'-' , SUBSTRING(spp.fin_programado_afko,5,2),'-',SUBSTRING(spp.fin_programado_afko,7,2)
  58.    ,' ', fin_hora_afko  ))))  end ) as planned_end_time,
  59.    (case
  60.     when spp.inicio_program_afko = '00000000' then  null
  61.     else  parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT( SUBSTRING(spp.inicio_program_afko,1,4),'-' , SUBSTRING(spp.inicio_program_afko,5,2),'-',SUBSTRING(spp.inicio_program_afko,7,2)
  62.    ,' ', hora_inicio_afko  ))))   end )  as planned_start_time,
  63.    DATEDIFF(HOUR,planned_end_time, planned_start_time) as planned_time,

  64.     -- act_start_afko GSTRI
  65.     -- actstart_afko GSUZI
  66.    (case
  67.     when spp.feinicio_real_afko = '00000000' then  null
  68.     else  parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT( SUBSTRING(spp.feinicio_real_afko,1,4),'-' , SUBSTRING(spp.feinicio_real_afko,5,2),'-',SUBSTRING(spp.feinicio_real_afko,7,2)
  69.    ,' ', hora_inreal_afko ))))  end ) as actual_start_time,
  70.    -- actfinish_afko GLTRI
  71.    -- actfinish1_afko GEUZI
  72.    (case
  73.     when spp.fecha_fin_real1_afko = '00000000' then  null
  74.     else parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT( SUBSTRING(spp.fecha_fin_real1_afko,1,4),'-' , SUBSTRING(spp.fecha_fin_real1_afko,5,2),'-',SUBSTRING(spp.fecha_fin_real1_afko,7,2)
  75.    ,' ', fin_real_hora_afko )))) end ) as actual_end_time,
  76.    
  77.     -- 
  78.    /*
  79.    Lead Time Overtime % vs plan    Acumulado por mes actual  (depende de la fecha seleccionada)
  80.    Total de tiempo Planeado    AFKO- GLTRS - AFKO-GSTRS 
  81.    tOTAL DE Tiiempo Real    AFKO- GETRI - AFKO-GSTRI    
  82.    Solo aquellas ordenes que el tiempo real es mayor que el tiempo planeado     100 - ((Tiempo Real / Tiempo Planeado ) *100)
  83.    */
  84.     (case
  85.     when actual_end_time IS NULL then  0
  86.     else DATEDIFF(HOUR,actual_end_time, actual_start_time)  end )  as real_time,

  87.      (case when real_time > planned_time
  88.                 then 1
  89.                 else 0
  90.             end) as real_time_greater_than_planned_time,
  91.    /*
  92.    Stock Level (Component) vs planned qty    unir por material centro almacen 
  93.    MARD-LABST  -    SUMA DE RESB-BDMNG/MARD-LABST  
  94.    SUMA DE RESB-BDMNG    
  95.    */
  96.    -- DEPRECATED
  97.    (case
  98.     when mard.libre_utiliz != 0 then divide(spp.ctdnecesaria_resb ,mard.libre_utiliz)
  99.     else 0 end ) as ctdnecesaria_resb_divide_libre_utiliz,
  100.    
  101.     SUM (ctdnecesaria_resb) OVER (PARTITION BY material_resb, centro_resb, almacen_resb) ctdnecesaria_resb_total,
  102.    
  103.    liberacion_aufk,
  104.    cierre_tecnico1_aufk,
  105.    cierre_aufk,
  106.    mard.libre_utiliz
  107.    


  108.    FROM {{ ref('OI_SILVER_PP_PRODUCTION_ORDER_ECC')}} AS spp FINAL
  109.    LEFT JOIN inventory AS mard
  110.        ON mard.material = spp.material_resb  
  111.        and mard.centro = spp.centro_resb 
  112.        and mard.almacen = spp.almacen_resb
  113.    LEFT JOIN (SELECT cp, nom1, centro , idioma   FROM {{ source('oneconnect', 'PR0_B_DM_PLANTAS') }} FINAL) AS  t001w  on t001w.centro  = spp.centro_afpo AND t001w.idioma ='S'
  114.    LEFT JOIN (SELECT denominacion, material, idioma FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_DESCRIPCION') }} FINAL) AS makt ON makt.material = spp.numero_material_afpo and makt.idioma ='S'
  115.    LEFT JOIN (SELECT denominacion, material, idioma FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_DESCRIPCION') }} FINAL) AS maktc ON maktc.material = spp.material_resb and maktc.idioma ='S'
  116.    LEFT JOIN (SELECT * from {{ source('oneconnect', 'PR0_B_MM_MAESTRO_MATERIALES') }}  FINAL)  AS mara ON mara.material = spp.numero_material_afpo
  117.    LEFT JOIN (SELECT gpoartic1, gpoartic, idioma FROM {{ source('oneconnect', 'PR0_B_DM_GRUPO_MATERIAL_TXT') }} FINAL) AS t023t  on  t023t.gpoartic = mara.grupo_articulos and t023t.idioma ='S'
  118.    LEFT JOIN (SELECT idioma, jquiaprod, denom  FROM {{ source('oneconnect', 'PR0_B_DM_JERARQUIA_MATERIALES_TXT') }} FINAL) AS t179t  on t179t.jquiaprod = mara.jquiaproductos and t179t.idioma ='S'
  119.    WHERE spp.utilizacion_afko = '1' and spp.tipo_de_orden_aufk = '10'
  120.    --AND spp.orden_resb = '005041000601' AND material_resb = '000000001801001239'
  121.    ORDER BY spp.orden_resb, spp.material_resb
  122. )

  123. SELECT 
  124.    *,
  125.    now64() as _version
  126. FROM component_detail

   

OI_GOLD_PP_PRODUCTION_MONTHLY_SUMMARY 

Este modelo pertenece a la capa Gold de la arquitectura de medallón y se compone de la entidad Silver OI_SILVER_PP_PRODUCTION_ORDER_ECC. Su propósito es proporcionar una visión detallada de la planificación de producción en comparación con los tiempos reales de ejecución por período, permitiendo un seguimiento preciso de cada orden de producción.


Características del Modelo

  • Comparación Plan vs. Real: Evalúa la diferencia entre los tiempos planificados y los tiempos reales de producción, asi como tambien la calidad y eficiencia de producción. 

Dependencias 
  • OI_SILVER_PP_PRODUCTION_ORDER_ECC (Órdenes de Producción - Capa Silver)
    Contiene información consolidada de las órdenes de producción dentro del módulo PP en SAP, permitiendo el análisis y seguimiento de materiales en proceso de fabricación y su impacto en la disponibilidad de stock.
    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

Supuestos 
  • Fecha de inicio actual:
    Se obtiene concatenando los campos feinicio_real_afkohora_inreal_afko, considerando únicamente los registros donde feinicio_real_afko sea diferente de '00000000'.

(case

   when spp.feinicio_real_afko = '00000000' then null

   else parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT(

       SUBSTRING(spp.feinicio_real_afko,1,4),'-', 

       SUBSTRING(spp.feinicio_real_afko,5,2),'-',

       SUBSTRING(spp.feinicio_real_afko,7,2),' ',

       hora_inreal_afko ))))  

end ) as actual_start_time,


  • Fecha de finalización actual:
    Se calcula concatenando los campos fecha_fin_real1_afkofin_real_hora_afko, considerando únicamente los registros donde fecha_fin_real1_afko sea diferente de '00000000'.

...

(case

   when spp.fecha_fin_real1_afko = '00000000' then null

   else parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT(

       SUBSTRING(spp.fecha_fin_real1_afko,1,4),'-', 

       SUBSTRING(spp.fecha_fin_real1_afko,5,2),'-',

       SUBSTRING(spp.fecha_fin_real1_afko,7,2),' ',

       fin_real_hora_afko ))))  

end ) as actual_end_time,

...


  • Tiempo de producción real:
    Se obtiene calculando la diferencia en horas entre actual_end_timeactual_start_time. En caso de que actual_end_time sea NULL, el tiempo de producción se establece en 0

...

(case 

   when actual_end_time IS NULL then 0

   else DATEDIFF(HOUR, actual_end_time, actual_start_time)

end ) as real_time,

...


  • Fecha de inicio planificada:
    Se obtiene concatenando los campos inicio_program_afkohora_inicio_afko, considerando únicamente los registros donde inicio_program_afko sea diferente de '00000000'

...

(case

   when spp.inicio_program_afko = '00000000' then null

   else parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT(

       SUBSTRING(spp.inicio_program_afko,1,4),'-', 

       SUBSTRING(spp.inicio_program_afko,5,2),'-',

       SUBSTRING(spp.inicio_program_afko,7,2),' ',

       hora_inicio_afko ))))  

end ) as planned_start_time,

...


  • Fecha de finalización planificada:
    Se calcula concatenando los campos fin_programado_afkofin_hora_afko, considerando únicamente los registros donde fin_programado_afko sea diferente de '00000000'

...

(case

   when spp.fin_programado_afko = '00000000' then null

   else parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT(

       SUBSTRING(spp.fin_programado_afko,1,4),'-', 

       SUBSTRING(spp.fin_programado_afko,5,2),'-',

       SUBSTRING(spp.fin_programado_afko,7,2),' ',

       fin_hora_afko ))))

end ) as planned_end_time,

...


  • Tiempo de planificación:
    Se obtiene calculando la diferencia en horas entre planned_end_timeplanned_start_time

DATEDIFF(HOUR, planned_end_time, planned_start_time) as planned_time,





Instalación 

docker-compose up -d dbt_oi_production_order --build





Modelo sql ejecutado 

  1. {{ config(
  2.    order_by='(orden_afko)',
  3.    engine='ReplacingMergeTree(_version)',
  4.    materialized='incremental',
  5.    incremental_strategy='append'

  6. ) }}

  7. WITH inventory AS (
  8.    SELECT 
  9.        libre_utiliz,
  10.        material, 
  11.        centro, 
  12.        almacen 
  13.    FROM {{ source('oneconnect', 'PR0_B_MM_MATERIAL_ALMACEN') }} FINAL
  14. )


  15. SELECT
  16.    --material_afpo MATNR
  17.    numero_material_afpo,
  18.    --plant_afpo DWERK
  19.    centro_afpo,
  20.    -- location_afpo LGORT
  21.    almacen_afpo,
  22.    --order_afko AUFNR
  23.    orden_afko,
  24.    -- schedstart_afko GSTRS
  25.    CONCAT(SUBSTRING(spp.inicio_program_afko,1,4),'-',SUBSTRING(spp.inicio_program_afko,5,2)) as MY_planned_start_date,
  26.     -- act_start_afko GSTRI
  27.     -- actstart_afko GSUZI
  28.    (case
  29.     when spp.feinicio_real_afko = '00000000' then  null
  30.     else  parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT( SUBSTRING(spp.feinicio_real_afko,1,4),'-' , SUBSTRING(spp.feinicio_real_afko,5,2),'-',SUBSTRING(spp.feinicio_real_afko,7,2)
  31.    ,' ', hora_inreal_afko ))))  end ) as actual_start_time,
  32.    -- actfinish_afko GLTRI
  33.    -- actfinish1_afko GEUZI
  34.    (case
  35.     when spp.fecha_fin_real1_afko = '00000000' then  null
  36.     else parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT( SUBSTRING(spp.fecha_fin_real1_afko,1,4),'-' , SUBSTRING(spp.fecha_fin_real1_afko,5,2),'-',SUBSTRING(spp.fecha_fin_real1_afko,7,2)
  37.    ,' ', fin_real_hora_afko )))) end ) as actual_end_time,
  38.     -- 
  39.     (case
  40.     when actual_end_time IS NULL then  0
  41.     else DATEDIFF(HOUR,actual_end_time, actual_start_time )  end )  as real_time,
  42.    --schedstart_afko  GSTRS
  43.    --start_time_afko GSUZS
  44.    --GSTRS y GSUZS
  45.    (case
  46.     when spp.inicio_program_afko = '00000000' then  null
  47.     else  parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT( SUBSTRING(spp.inicio_program_afko,1,4),'-' , SUBSTRING(spp.inicio_program_afko,5,2),'-',SUBSTRING(spp.inicio_program_afko,7,2)
  48.    ,' ', hora_inicio_afko  ))))   end )  as planned_start_time,
  49.     --schedfin_afko GLTRS
  50.     -- finish_tme_afko GLUZS
  51.     --GLTRS y GLUZS
  52.     (case
  53.     when spp.fin_programado_afko = '00000000' then  null
  54.     else   parseDateTimeBestEffort(toString(toDateTimeOrNull(CONCAT( SUBSTRING(spp.fin_programado_afko,1,4),'-' , SUBSTRING(spp.fin_programado_afko,5,2),'-',SUBSTRING(spp.fin_programado_afko,7,2)
  55.    ,' ', fin_hora_afko  ))))  end ) as planned_end_time,
  56.    
  57.    DATEDIFF(HOUR,planned_end_time, planned_start_time) as planned_time,
  58.    spp._version as updated_at,
  59.    now64() as _version
  60. FROM {{ ref('OI_SILVER_PP_PRODUCTION_ORDER_ECC')}} AS spp final
  61. LEFT JOIN inventory AS mard
  62.    ON mard.material = spp.numero_material_afpo  
  63.    and mard.centro = spp.centro_afpo 
  64.    and mard.almacen = spp.almacen_afpo
  65. WHERE 
  66.    spp.utilizacion_afko = '1' AND 
  67.    spp.tipo_de_orden_aufk = '10'

    • Related Articles

    • PRODUCCTION DASHBOARD

      Tablero de Producción Descripción General Propósito: Seguimiento de ordenes y el seguimiento del performance de los procesos de producción, como la cantidad, calidad y eficiencia. Fuente de Datos: ClickHouse. Instalación del Tablero Paso 1: Importar ...
    • INVOICE DASHBOARD

      Tablero de Facturación Descripción General Propósito: Análisis de ventas y facturación mensual. Fuente de Datos: ClickHouse. Instalación del Tablero Paso 1: Importar el JSON en Grafana Iniciar sesión en Grafana. Ir a Dashboards → Manage → Import. ...
    • INVENTORY DASHBOARD

      Tablero de Inventarios Descripción General Propósito: El Tablero de Inventario está compuesto por entidades que consolidan información clave de órdenes de compra, órdenes de venta y órdenes de producción para mostrar los materiales entrantes y ...
    • 11 INVOICE DASHBOARD

      ENTIDAD GOLD DE TABLERO DE FACTURAS También conocido como Tablero de Ventas, este modelo pertenece a la capa Gold de la arquitectura de medallón y está compuesto por la entidad BI_SILVER_SD_INVOICE_ECC. Su objetivo principal es proporcionar una ...
    • 12. INVENTORY DASHBOARD

      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 ...