CREATE OR REPLACE PROCEDURE altera_status_tabelas -- ***************************************************************************** -- Analista......: REBSON YUKO -- Programador...: REBSON YUKO -- Data..........: 18/12/2025 -- Objetivo......: Procedure para altarar tabelas do fronteira -- Versao 01 -- ***************************************************************************** ( pa_gr_usuario IN VARCHAR2, pa_co_programa IN VARCHAR2 DEFAULT 'PROCEDUR', pa_do_commit IN VARCHAR2 DEFAULT 'Y', pa_mens_erro OUT VARCHAR2 ) AS -- Datas referência (formato texto YYYYMMDD / HH24MISS como nos arquivos Natural) v_hoje_char VARCHAR2(8) := to_char(sysdate, 'YYYYMMDD'); v_hora_char VARCHAR2(6) := to_char(sysdate, 'HH24MISS'); -------------------------------------------------------------------------------- -- Faixas de datas (texto) conforme a lógica Natural v_off_ini VARCHAR2(8); v_off_fim VARCHAR2(8); v_cmd_ini VARCHAR2(8); v_cmd_fim VARCHAR2(8); v_pro_ini VARCHAR2(8); v_pro_fim VARCHAR2(8); -- Contadores (opcional, para diagnóstico) v_rows_offline PLS_INTEGER := 0; v_rows_comando PLS_INTEGER := 0; v_rows_proc_c PLS_INTEGER := 0; -- processos virados para 'C' v_rows_proc_i PLS_INTEGER := 0; -- processos virados para 'I' -- Utilitário para converter data DATE -> CHAR(8) YYYYMMDD FUNCTION d2c ( p_date DATE ) RETURN VARCHAR2 IS BEGIN RETURN to_char(p_date, 'YYYYMMDD'); END; BEGIN pa_mens_erro := NULL; -------------------------------------------------------------------------------- ------------------------------------------------------------------------- -- 1) CHAVE OFFLINE: de D-30 até D-1 e status = 'T' ? limpar status ------------------------------------------------------------------------- v_off_ini := d2c(trunc(sysdate) - 30); v_off_fim := d2c(trunc(sysdate) - 1); UPDATE sitafe.sitafe_chave_offline SET it_in_status = ' ', it_co_programa = pa_co_programa WHERE it_in_status = 'T' AND it_da_transacao BETWEEN v_off_ini AND v_off_fim; v_rows_offline := SQL%rowcount; ------------------------------------------------------------------------- -- 2) COMANDO BKG: desde D-60 (sem limite superior, como no Natural atual) -- Filtros: programa origem B40015M7, comando_status <> '0', status <> 'C', -- módulo processamento = 'B' ? setar IT_IN_COMANDO_STATUS = '1' ------------------------------------------------------------------------- v_cmd_ini := d2c(trunc(sysdate) - 60); v_cmd_fim := d2c(trunc(sysdate) - 3); UPDATE sitafe.sitafe_comando SET it_in_comando_status = '1', it_co_programa = pa_co_programa WHERE it_co_programa = 'B40015M7' AND it_da_transacao BETWEEN v_cmd_ini AND v_cmd_fim AND nvl(it_in_comando_status, ' ') <> '0' AND nvl(it_in_status, ' ') <> 'C' AND it_in_modulo_processamento = 'B'; v_rows_comando := SQL%rowcount; -------------------------------------------------------------------------------- -- 3) PROCESSO ADM (CO_SERVICO = '072') pendente: -- Abertura entre D-30 e D-1; IT_IN_STATUS = 'P' -- - Se NÿO existe em SITAFE_NF_FISCAL_AUX: status 'C' -- - Se existe com IT_IN_SITUACAO = '1': status 'I' -- Atualiza também CO_PROGRAMA, DA_TRANSACAO, HO_TRANSACAO ------------------------------------------------------------------------- v_pro_ini := d2c(trunc(sysdate) - 30); v_pro_fim := d2c(trunc(sysdate) - 1); /* Estratégia com duas atualizações específicas (sem cursor), usando EXISTS/NOT EXISTS como no Natural */ DELETE FROM internamento_notas.capa_internamentos i WHERE i.processo IN ( SELECT pa.it_nu_processo FROM sitafe.sitafe_processo_administrativo pa WHERE pa.it_nu_processo = i.processo AND pa.it_co_servico = '072' AND pa.it_in_status = 'P' AND pa.IT_TP_PROCESSO = 'I' AND pa.it_da_abertura BETWEEN v_pro_ini AND v_pro_fim ); DELETE FROM internamento_notas.nota_internadas n WHERE n.capa_internamento_processo IN ( SELECT pa.it_nu_processo FROM sitafe.sitafe_processo_administrativo pa WHERE pa.it_nu_processo = n.capa_internamento_processo AND pa.it_co_servico = '072' AND pa.it_in_status = 'P' AND pa.IT_TP_PROCESSO = 'I' AND pa.it_da_abertura BETWEEN v_pro_ini AND v_pro_fim ); -------------------------------------------------------------------------------- -- a) SEM notas vinculadas ? 'C' UPDATE sitafe.sitafe_processo_administrativo pa SET pa.it_in_status = 'C', pa.it_co_programa = pa_co_programa, pa.it_da_transacao = v_hoje_char, pa.it_ho_transacao = v_hora_char WHERE pa.it_co_servico = '072' AND pa.it_in_status = 'P' AND pa.it_da_abertura BETWEEN v_pro_ini AND v_pro_fim AND NOT EXISTS ( SELECT 1 FROM sitafe_nf_fiscal_aux fa WHERE fa.it_nu_processo = pa.it_nu_processo ); v_rows_proc_c := SQL%rowcount; -------------------------------------------------------------------------------- -- b) COM notas e situacao = '1' ? 'I' UPDATE sitafe.sitafe_processo_administrativo pa SET pa.it_in_status = 'I', pa.it_co_programa = pa_co_programa, pa.it_da_transacao = v_hoje_char, pa.it_ho_transacao = v_hora_char WHERE pa.it_co_servico = '072' AND pa.it_in_status = 'P' AND pa.it_da_abertura BETWEEN v_pro_ini AND v_pro_fim AND EXISTS ( SELECT 1 FROM sitafe_nf_fiscal_aux fa WHERE fa.it_nu_processo = pa.it_nu_processo AND fa.it_in_situacao = '1' ); v_rows_proc_i := SQL%rowcount; ------------------------------------------------------------------------- -- Commit / Retorno ------------------------------------------------------------------------- IF pa_do_commit = 'Y' THEN COMMIT; END IF; pa_mens_erro := 'OK'; -------------------------------------------------------------------------------- -- (Opcional) Se quiser logar quantidades afetadas, crie um log aqui -- INSERT INTO SUA_TABELA_LOG(...) VALUES (SYSDATE, v_rows_offline, v_rows_comando, v_rows_proc_c, v_rows_proc_i, p_gr_usuario, p_co_programa, ...); EXCEPTION WHEN OTHERS THEN pa_mens_erro := 'ERRO: ' || sqlerrm; -- Se preferir reverter sempre: ROLLBACK; RAISE; END altera_status_tabelas;