-- +goose Up -- +goose StatementBegin CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_CARGA_DADOS_PERDA ( p_data_inicial IN DATE, p_data_final IN DATE, p_empresa IN NUMBER ) AS v_id_empresa NUMBER; v_id_cat1 NUMBER; v_id_cat2 NUMBER; v_id_cat3 NUMBER; v_id_cat4 NUMBER; v_id_cat5 NUMBER; v_id_produto NUMBER; FUNCTION FN_GET_OR_CREATE_NODO ( p_id_nodo_pai IN NUMBER, p_tipo_nodo IN VARCHAR2, p_codigo IN VARCHAR2, p_nome IN VARCHAR2, p_nivel IN NUMBER, p_cod_empresa IN NUMBER DEFAULT NULL, p_cod_produto IN NUMBER DEFAULT NULL, p_seqprodutobase IN NUMBER DEFAULT NULL ) RETURN NUMBER IS v_id_nodo NUMBER; BEGIN SELECT n.id_nodo INTO v_id_nodo FROM TB_FLASH_NODO n WHERE ( n.id_nodo_pai = p_id_nodo_pai OR (n.id_nodo_pai IS NULL AND p_id_nodo_pai IS NULL) ) AND n.tipo_nodo = p_tipo_nodo AND n.codigo = p_codigo AND ( p_tipo_nodo <> 'PRODUTO' OR ( n.cod_empresa = p_cod_empresa OR (n.cod_empresa IS NULL AND p_cod_empresa IS NULL) ) ); UPDATE TB_FLASH_NODO n SET n.nome = p_nome, n.cod_empresa = p_cod_empresa, n.cod_produto = p_cod_produto, n.seqprodutobase = p_seqprodutobase, n.data_atualizacao = SYSDATE WHERE n.id_nodo = v_id_nodo AND ( NVL(n.nome, '#') <> NVL(p_nome, '#') OR NVL(n.cod_empresa, -1) <> NVL(p_cod_empresa, -1) OR NVL(n.cod_produto, -1) <> NVL(p_cod_produto, -1) OR NVL(n.seqprodutobase, -1) <> NVL(p_seqprodutobase, -1) ); RETURN v_id_nodo; EXCEPTION WHEN NO_DATA_FOUND THEN v_id_nodo := SEQ_TB_FLASH_NODO.NEXTVAL; INSERT INTO TB_FLASH_NODO ( id_nodo, id_nodo_pai, tipo_nodo, codigo, nome, nivel, ordem_exibicao, ativo, cod_empresa, cod_produto, seqprodutobase, data_cadastro, data_atualizacao ) VALUES ( v_id_nodo, p_id_nodo_pai, p_tipo_nodo, p_codigo, p_nome, p_nivel, NULL, 'S', p_cod_empresa, p_cod_produto, p_seqprodutobase, SYSDATE, NULL ); RETURN v_id_nodo; END; BEGIN DELETE FROM TB_FLASH_FATO_PERDA WHERE data_referencia BETWEEN p_data_inicial AND p_data_final AND cod_empresa = p_empresa; FOR r IN ( SELECT e.nroempresa AS empresa, e.nomereduzido AS nomeempresa, a.seqproduto AS cod_produto, a.seqprodutobase, a.desccompleta AS descricao, d.nrodivisao, seg1.nrosegmento, p.dtamovimento AS data_referencia, TO_NUMBER(TO_CHAR(p.dtamovimento, 'DD')) AS dia, TO_NUMBER(TO_CHAR(p.dtamovimento, 'MM')) AS mes, TO_NUMBER(TO_CHAR(p.dtamovimento, 'YYYY')) AS ano, TO_NUMBER(TO_CHAR(p.dtamovimento, 'D')) AS dia_semana, SUM(p.qtdperda) AS qtde_perda, SUM(p.vlrperda) AS vlr_perda, SUM(p.vlrcustoperda) AS vlr_custo_perda, a.propqtdprodutobase, ( SELECT dc.seqcategoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 1 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS codcatn1, ( SELECT cc.categoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 1 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS nomecatn1, ( SELECT dc.seqcategoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 2 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS codcatn2, ( SELECT cc.categoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 2 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS nomecatn2, ( SELECT dc.seqcategoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 3 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS codcatn3, ( SELECT cc.categoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 3 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS nomecatn3, ( SELECT dc.seqcategoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 4 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS codcatn4, ( SELECT cc.categoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 4 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS nomecatn4, ( SELECT dc.seqcategoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 5 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS codcatn5, ( SELECT cc.categoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 5 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS nomecatn5 FROM max_empresa e JOIN mar_perda p ON p.nroempresa = e.nroempresa JOIN map_produto a ON a.seqproduto = p.seqproduto JOIN map_famdivisao d ON d.seqfamilia = a.seqfamilia AND d.nrodivisao = e.nrodivisao JOIN mad_famsegmento h ON h.seqfamilia = a.seqfamilia AND h.nrosegmento = e.nrosegmentoprinc JOIN mad_segmento seg1 ON seg1.nrosegmento = h.nrosegmento AND seg1.nrodivisao = d.nrodivisao WHERE p.dtamovimento BETWEEN p_data_inicial AND p_data_final AND p.nroempresa = p_empresa GROUP BY e.nroempresa, e.nomereduzido, a.seqproduto, a.seqprodutobase, a.desccompleta, d.nrodivisao, seg1.nrosegmento, p.dtamovimento, a.propqtdprodutobase, a.seqfamilia, e.nrodivisao ) LOOP v_id_empresa := FN_GET_OR_CREATE_NODO(NULL, 'EMPRESA', TO_CHAR(r.empresa), r.nomeempresa, 1, r.empresa); IF r.codcatn1 IS NOT NULL THEN v_id_cat1 := FN_GET_OR_CREATE_NODO(v_id_empresa, 'CATEGORIA', TO_CHAR(r.codcatn1), r.nomecatn1, 2, r.empresa); ELSE v_id_cat1 := v_id_empresa; END IF; IF r.codcatn2 IS NOT NULL THEN v_id_cat2 := FN_GET_OR_CREATE_NODO(v_id_cat1, 'CATEGORIA', TO_CHAR(r.codcatn2), r.nomecatn2, 3, r.empresa); ELSE v_id_cat2 := v_id_cat1; END IF; IF r.codcatn3 IS NOT NULL THEN v_id_cat3 := FN_GET_OR_CREATE_NODO(v_id_cat2, 'CATEGORIA', TO_CHAR(r.codcatn3), r.nomecatn3, 4, r.empresa); ELSE v_id_cat3 := v_id_cat2; END IF; IF r.codcatn4 IS NOT NULL THEN v_id_cat4 := FN_GET_OR_CREATE_NODO(v_id_cat3, 'CATEGORIA', TO_CHAR(r.codcatn4), r.nomecatn4, 5, r.empresa); ELSE v_id_cat4 := v_id_cat3; END IF; IF r.codcatn5 IS NOT NULL THEN v_id_cat5 := FN_GET_OR_CREATE_NODO(v_id_cat4, 'CATEGORIA', TO_CHAR(r.codcatn5), r.nomecatn5, 6, r.empresa); ELSE v_id_cat5 := v_id_cat4; END IF; v_id_produto := FN_GET_OR_CREATE_NODO(v_id_cat5, 'PRODUTO', TO_CHAR(r.cod_produto), r.descricao, 7, r.empresa, r.cod_produto, r.seqprodutobase); INSERT INTO TB_FLASH_FATO_PERDA ( id_fato, data_referencia, ano_referencia, mes_referencia, dia_referencia, dia_semana, id_nodo, id_nodo_empresa, cod_empresa, nome_empresa, cod_produto, descricao_produto, seqprodutobase, nrodivisao, nrosegmento, vlr_custo_perda, qtde_perda, vlr_perda, propqtdprodutobase, data_cadastro ) VALUES ( SEQ_TB_FLASH_FATO_PERDA.NEXTVAL, r.data_referencia, r.ano, r.mes, r.dia, r.dia_semana, v_id_produto, v_id_empresa, r.empresa, r.nomeempresa, r.cod_produto, r.descricao, r.seqprodutobase, r.nrodivisao, r.nrosegmento, r.vlr_custo_perda, r.qtde_perda, r.vlr_perda, r.propqtdprodutobase, SYSDATE ); END LOOP; COMMIT; END; -- +goose StatementEnd -- +goose Down -- +goose StatementBegin DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM all_objects WHERE object_name = 'PRC_FLASH_CARGA_DADOS_PERDA' AND object_type = 'PROCEDURE' AND owner = 'VITRUVIO'; IF v_count > 0 THEN EXECUTE IMMEDIATE 'DROP PROCEDURE VITRUVIO.PRC_FLASH_CARGA_DADOS_PERDA'; END IF; END; -- +goose StatementEnd