-- Table HIST_BLOQUEIO_SEMANAL -- CREATE TABLE CREATE TABLE HIST_BLOQUEIO_SABADO ( DATA_SABADO DATE NOT NULL, TIPO_BLOQUEIO VARCHAR2(30) NOT NULL, CODFILIAL VARCHAR2(10) NOT NULL, CODPROD NUMBER NOT NULL, DESCRICAO VARCHAR2(200), MARCA VARCHAR2(80), QTESTGER NUMBER(18,4), QT NUMBER(18,4), CUSTOFIN NUMBER(18,6), VALOR NUMBER(18,2), DATA_TIPO DATE, -- (DADOS.DATA) CODMOTIVO NUMBER, MOTIVO VARCHAR2(200), CODFUNC NUMBER, FUNCIONARIO VARCHAR2(120), HISTORICO VARCHAR2(4000), FAIXA_PRIM VARCHAR2(30), DT_CARGA TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL, CONSTRAINT PK_HIST_BLOQ_SAB PRIMARY KEY (DATA_SABADO, CODFILIAL, CODPROD, TIPO_BLOQUEIO) ); CREATE INDEX IX_HIST_BLOQ_SAB_01 ON HIST_BLOQUEIO_SABADO (CODFILIAL, CODPROD, DATA_SABADO); CREATE INDEX IX_HIST_BLOQ_SAB_02 ON HIST_BLOQUEIO_SABADO (DATA_SABADO, TIPO_BLOQUEIO, FAIXA_PRIM); -- CREATE PROCEDURE CREATE OR REPLACE PROCEDURE PRC_SNAPSHOT_BLOQUEIO_SABADO ( P_DATA_BASE IN DATE DEFAULT SYSDATE ) AS V_SABADO DATE; BEGIN V_SABADO := TRUNC(P_DATA_BASE,'IW') + 5; -- sábado DELETE FROM HIST_BLOQUEIO_SABADO WHERE DATA_SABADO = V_SABADO; INSERT INTO HIST_BLOQUEIO_SABADO ( DATA_SABADO, TIPO_BLOQUEIO, CODFILIAL, CODPROD, DESCRICAO, MARCA, QTESTGER, QT, CUSTOFIN, VALOR, DATA_TIPO, CODMOTIVO, MOTIVO, CODFUNC, FUNCIONARIO, HISTORICO, FAIXA_PRIM, DT_CARGA ) WITH /* --------------------------------------------------------- BASE ESTOQUE (fonte de quantidades da 9871) --------------------------------------------------------- */ BASE_EST AS ( SELECT E.CODFILIAL, E.CODPROD, NVL(E.QTBLOQUEADA,0) AS QT_BLOQ_TOTAL, NVL(E.QTINDENIZ,0) AS QT_AVARIA, NVL(E.QTEXPOSICAO,0) AS QT_EXPOSICAO, E.QTESTGER, NVL(E.CUSTOFIN,0) AS CUSTOFIN FROM PCEST E ), /* --------------------------------------------------------- ÚLTIMO MOV 53 (só para DATA/CODMOTIVO/CODFUNC/HIST) --------------------------------------------------------- */ MOV53 AS ( SELECT CODFILIAL, CODPROD, TRUNC(DTINCLUSAO) AS DATA_EXPO, CODMOTIVO, CODFUNC, HISTORICO FROM ( SELECT M.*, ROW_NUMBER() OVER ( PARTITION BY M.CODFILIAL, M.CODPROD ORDER BY M.DTINCLUSAO DESC, M.ROWID DESC ) RN FROM ESTMOVBLOQESTOQUE M WHERE M.CODMOTIVO IN (53) ) WHERE RN = 1 ), /* --------------------------------------------------------- ÚLTIMO EA (AVARIA) para DATA/CODMOTIVO/CODFUNC/HIST --------------------------------------------------------- */ EA AS ( SELECT CODFILIAL, CODPROD, TRUNC(DATA) AS DATA_EA, CODMOTIVO, CODFUNC, HISTORICO FROM ( SELECT M.*, ROW_NUMBER() OVER ( PARTITION BY M.CODFILIAL, M.CODPROD ORDER BY TRUNC(M.DATA) DESC, M.ROWID DESC ) RN FROM ESTMOVBLOQESTOQUE M WHERE M.TIPO = 'EA' ) WHERE RN = 1 ), /* --------------------------------------------------------- Data ENTRADA (último B no log, exceto 9871) igual 8189 --------------------------------------------------------- */ DT_ENTRADA AS ( SELECT CODFILIAL, CODPROD, MAX(TRUNC(DATA)) AS DATA_ENT FROM ESTLOGBLOQESTOQUE WHERE PROGRAMA NOT LIKE '%9871%' AND TIPOBLOQUEIO = 'B' GROUP BY CODFILIAL, CODPROD ), /* --------------------------------------------------------- EXPOSIÇÃO (lógica 9871) --------------------------------------------------------- */ EXPOSICAO AS ( SELECT 'BLOQUEIO EXPOSICAO' AS TIPO_BLOQUEIO, B.QT_EXPOSICAO AS QUANTIDADE, M53.DATA_EXPO AS DATA, B.CODPROD, B.CODFILIAL, M53.CODMOTIVO, M53.CODFUNC, M53.HISTORICO FROM BASE_EST B LEFT JOIN MOV53 M53 ON M53.CODFILIAL = B.CODFILIAL AND M53.CODPROD = B.CODPROD WHERE B.QT_EXPOSICAO > 0 ), /* --------------------------------------------------------- MANUAL (lógica 9871) = QTBLOQMANUAL - QTEXPOSICAO --------------------------------------------------------- */ MANUAL AS ( SELECT 'BLOQUEIO MANUAL' AS TIPO_BLOQUEIO, GREATEST(NVL(EBP.QTBLOQMANUAL,0) - B.QT_EXPOSICAO, 0) AS QUANTIDADE, TRUNC(EBP.DTPRIMBLOQUEIO) AS DATA, B.CODPROD, B.CODFILIAL, CAST(NULL AS NUMBER) AS CODMOTIVO, CAST(NULL AS NUMBER) AS CODFUNC, CAST(NULL AS VARCHAR2(4000)) AS HISTORICO FROM BASE_EST B LEFT JOIN ESTBLOQUEIOPRODUTO EBP ON EBP.CODFILIAL = B.CODFILIAL AND EBP.CODPROD = B.CODPROD WHERE GREATEST(NVL(EBP.QTBLOQMANUAL,0) - B.QT_EXPOSICAO, 0) > 0 ), /* --------------------------------------------------------- ENTRADA (lógica 9871 = 8189) Entrada = QTBLOQUEADA - QTINDENIZ - QTBLOQMANUAL --------------------------------------------------------- */ ENTRADA AS ( SELECT 'BLOQUEIO ENTRADA' AS TIPO_BLOQUEIO, GREATEST(B.QT_BLOQ_TOTAL - B.QT_AVARIA - NVL(EBP.QTBLOQMANUAL,0), 0) AS QUANTIDADE, X.DATA_ENT AS DATA, B.CODPROD, B.CODFILIAL, CAST(NULL AS NUMBER) AS CODMOTIVO, CAST(NULL AS NUMBER) AS CODFUNC, CAST(NULL AS VARCHAR2(4000)) AS HISTORICO FROM BASE_EST B LEFT JOIN ESTBLOQUEIOPRODUTO EBP ON EBP.CODFILIAL = B.CODFILIAL AND EBP.CODPROD = B.CODPROD INNER JOIN DT_ENTRADA X ON X.CODFILIAL = B.CODFILIAL AND X.CODPROD = B.CODPROD WHERE GREATEST(B.QT_BLOQ_TOTAL - B.QT_AVARIA - NVL(EBP.QTBLOQMANUAL,0), 0) > 0 ), /* --------------------------------------------------------- AVARIA (quantidade vem do PCEST.QTINDENIZ) --------------------------------------------------------- */ AVARIA AS ( SELECT 'BLOQUEIO AVARIA' AS TIPO_BLOQUEIO, B.QT_AVARIA AS QUANTIDADE, EA.DATA_EA AS DATA, B.CODPROD, B.CODFILIAL, EA.CODMOTIVO, EA.CODFUNC, EA.HISTORICO FROM BASE_EST B LEFT JOIN EA ON EA.CODFILIAL = B.CODFILIAL AND EA.CODPROD = B.CODPROD WHERE B.QT_AVARIA > 0 ), DADOS AS ( SELECT * FROM EXPOSICAO UNION ALL SELECT * FROM MANUAL UNION ALL SELECT * FROM ENTRADA UNION ALL SELECT * FROM AVARIA ) SELECT V_SABADO AS DATA_SABADO, DADOS.TIPO_BLOQUEIO, TO_CHAR(DADOS.CODFILIAL) AS CODFILIAL, DADOS.CODPROD, P.DESCRICAO, M.MARCA, E.QTESTGER, DADOS.QUANTIDADE AS QT, ROUND(E.CUSTOFIN, 2) AS CUSTOFIN, ROUND(DADOS.QUANTIDADE * E.CUSTOFIN, 2) AS VALOR, DADOS.DATA AS DATA_TIPO, DADOS.CODMOTIVO, TD.MOTIVO, DADOS.CODFUNC, F.NOME AS FUNCIONARIO, DADOS.HISTORICO, CASE WHEN DADOS.DATA IS NULL THEN '?' WHEN V_SABADO - TRUNC(DADOS.DATA) <= 3 THEN '1 - 0 A 3 DIAS' WHEN V_SABADO - TRUNC(DADOS.DATA) <= 7 THEN '2 - 4 A 7 DIAS' WHEN V_SABADO - TRUNC(DADOS.DATA) <= 14 THEN '3 - 8 A 14 DIAS' WHEN V_SABADO - TRUNC(DADOS.DATA) <= 30 THEN '4 - 15 A 30 DIAS' WHEN V_SABADO - TRUNC(DADOS.DATA) <= 60 THEN '5 - 30 A 60 DIAS' ELSE '6 - 60 + DIAS' END AS FAIXA_PRIM, SYSTIMESTAMP AS DT_CARGA FROM DADOS JOIN PCPRODUT P ON P.CODPROD = DADOS.CODPROD JOIN PCEST E ON E.CODPROD = DADOS.CODPROD AND E.CODFILIAL = DADOS.CODFILIAL LEFT JOIN PCMARCA M ON M.CODMARCA = P.CODMARCA LEFT JOIN PCTABDEV TD ON TD.CODDEVOL = DADOS.CODMOTIVO LEFT JOIN PCEMPR F ON F.MATRICULA = DADOS.CODFUNC; COMMIT; END; / -- job (todo sábado) BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'JOB_SNAPSHOT_BLOQUEIO_SABADO', job_type => 'STORED_PROCEDURE', job_action => 'PRC_SNAPSHOT_BLOQUEIO_SABADO', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=WEEKLY;BYDAY=SAT;BYHOUR=23;BYMINUTE=55;BYSECOND=0', enabled => TRUE ); END; /