create or replace PROCEDURE ALTERA_STATUS_TABELAS ( PA_GR_USUARIO IN VARCHAR2, -- A27 (opcional, para trilha/auditoria) pa_co_programa IN VARCHAR2 DEFAULT 'B40015F9', pa_do_commit IN VARCHAR2 DEFAULT 'Y', -- 'Y' = COMMIT ao final, 'N' = não comitar 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); -- hoje - 30 v_off_fim VARCHAR2(8); -- hoje - 1 v_cmd_ini VARCHAR2(8); -- hoje - 60 -- v_cmd_fim VARCHAR2(8); -- Natural atual deixou sem limite superior (bloco comentado) v_pro_ini VARCHAR2(8); -- hoje - 7 v_pro_fim VARCHAR2(8); -- hoje - 1 -- 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); 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 >= v_cmd_ini 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-7 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) - 7); v_pro_fim := d2c(TRUNC(SYSDATE) - 1); /* Estratégia com duas atualizações específicas (sem cursor), usando EXISTS/NOT EXISTS como no Natural */ -- 3.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; -- 3.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;