Projeto

Geral

Perfil

Melhoramento #73 » PROCEDURE ALTERA_STATUS_TABELAS.txt

Alisson Cleiton dos Santos, 10/12/2025 07:50

 
1
create or replace PROCEDURE        ALTERA_STATUS_TABELAS (
2
    PA_GR_USUARIO   IN  VARCHAR2,           -- A27 (opcional, para trilha/auditoria)
3
    pa_co_programa  IN  VARCHAR2 DEFAULT 'B40015F9',
4
    pa_do_commit    IN  VARCHAR2 DEFAULT 'Y',  -- 'Y' = COMMIT ao final, 'N' = não comitar
5
    pa_mens_erro    OUT VARCHAR2
6
) AS
7
    -- Datas referência (formato texto YYYYMMDD / HH24MISS como nos arquivos Natural)
8
    v_hoje_char            VARCHAR2(8)  := TO_CHAR(SYSDATE, 'YYYYMMDD');
9
    v_hora_char            VARCHAR2(6)  := TO_CHAR(SYSDATE, 'HH24MISS');
10

    
11
    -- Faixas de datas (texto) conforme a lógica Natural
12
    v_off_ini              VARCHAR2(8); -- hoje - 30
13
    v_off_fim              VARCHAR2(8); -- hoje - 1
14
    v_cmd_ini              VARCHAR2(8); -- hoje - 60
15
    -- v_cmd_fim           VARCHAR2(8); -- Natural atual deixou sem limite superior (bloco comentado)
16
    v_pro_ini              VARCHAR2(8); -- hoje - 7
17
    v_pro_fim              VARCHAR2(8); -- hoje - 1
18

    
19
    -- Contadores (opcional, para diagnóstico)
20
    v_rows_offline   PLS_INTEGER := 0;
21
    v_rows_comando   PLS_INTEGER := 0;
22
    v_rows_proc_c    PLS_INTEGER := 0; -- processos virados para 'C'
23
    v_rows_proc_i    PLS_INTEGER := 0; -- processos virados para 'I'
24

    
25
    -- Utilitário para converter data DATE -> CHAR(8) YYYYMMDD
26
    FUNCTION d2c(p_date DATE) RETURN VARCHAR2 IS
27
    BEGIN
28
        RETURN TO_CHAR(p_date, 'YYYYMMDD');
29
    END;
30
BEGIN
31
    pa_mens_erro := NULL;
32

    
33
    -------------------------------------------------------------------------
34
    -- 1) CHAVE OFFLINE: de D-30 até D-1 e status = 'T'  ? limpar status
35
    -------------------------------------------------------------------------
36
    v_off_ini := d2c(TRUNC(SYSDATE) - 30);
37
    v_off_fim := d2c(TRUNC(SYSDATE) - 1);
38

    
39
    UPDATE SITAFE.SITAFE_CHAVE_OFFLINE
40
       SET IT_IN_STATUS  = ' ',
41
           IT_CO_PROGRAMA = pa_co_programa
42
     WHERE IT_IN_STATUS = 'T'
43
       AND IT_DA_TRANSACAO BETWEEN v_off_ini AND v_off_fim;
44

    
45
    v_rows_offline := SQL%ROWCOUNT;
46

    
47
    -------------------------------------------------------------------------
48
    -- 2) COMANDO BKG: desde D-60 (sem limite superior, como no Natural atual)
49
    --    Filtros: programa origem B40015M7, comando_status <> '0', status <> 'C',
50
    --    módulo processamento = 'B'  ? setar IT_IN_COMANDO_STATUS = '1'
51
    -------------------------------------------------------------------------
52
    v_cmd_ini := d2c(TRUNC(SYSDATE) - 60);
53

    
54
    UPDATE SITAFE.SITAFE_COMANDO
55
       SET IT_IN_COMANDO_STATUS = '1',
56
           IT_CO_PROGRAMA       = pa_co_programa
57
     WHERE IT_CO_PROGRAMA          = 'B40015M7'
58
       AND IT_DA_TRANSACAO        >= v_cmd_ini
59
       AND NVL(IT_IN_COMANDO_STATUS, ' ') <> '0'
60
       AND NVL(IT_IN_STATUS, ' ')         <> 'C'
61
       AND IT_IN_MODULO_PROCESSAMENTO     = 'B';
62

    
63
    v_rows_comando := SQL%ROWCOUNT;
64

    
65
    -------------------------------------------------------------------------
66
    -- 3) PROCESSO ADM (CO_SERVICO = '072') pendente:
67
    --    Abertura entre D-7 e D-1; IT_IN_STATUS = 'P'
68
    --    - Se NÃO existe em SITAFE_NF_FISCAL_AUX: status 'C'
69
    --    - Se existe com IT_IN_SITUACAO = '1': status 'I'
70
    --    Atualiza também CO_PROGRAMA, DA_TRANSACAO, HO_TRANSACAO
71
    -------------------------------------------------------------------------
72
    v_pro_ini := d2c(TRUNC(SYSDATE) - 7);
73
    v_pro_fim := d2c(TRUNC(SYSDATE) - 1);
74

    
75
    /* Estratégia com duas atualizações específicas (sem cursor),
76
       usando EXISTS/NOT EXISTS como no Natural */
77

    
78
    -- 3.a) SEM notas vinculadas ? 'C'
79
    UPDATE SITAFE.SITAFE_PROCESSO_ADMINISTRATIVO pa
80
       SET pa.IT_IN_STATUS    = 'C',
81
           pa.IT_CO_PROGRAMA  = pa_co_programa,
82
           pa.IT_DA_TRANSACAO = v_hoje_char,
83
           pa.IT_HO_TRANSACAO = v_hora_char
84
     WHERE pa.IT_CO_SERVICO   = '072'
85
       AND pa.IT_IN_STATUS    = 'P'
86
       AND pa.IT_DA_ABERTURA BETWEEN v_pro_ini AND v_pro_fim
87
       AND NOT EXISTS (
88
             SELECT 1
89
               FROM SITAFE_NF_FISCAL_AUX fa
90
              WHERE fa.IT_NU_PROCESSO = pa.IT_NU_PROCESSO
91
           );
92

    
93
    v_rows_proc_c := SQL%ROWCOUNT;
94

    
95
    -- 3.b) COM notas e situacao = '1' ? 'I'
96
    UPDATE SITAFE.SITAFE_PROCESSO_ADMINISTRATIVO pa
97
       SET pa.IT_IN_STATUS    = 'I',
98
           pa.IT_CO_PROGRAMA  = pa_co_programa,
99
           pa.IT_DA_TRANSACAO = v_hoje_char,
100
           pa.IT_HO_TRANSACAO = v_hora_char
101
     WHERE pa.IT_CO_SERVICO   = '072'
102
       AND pa.IT_IN_STATUS    = 'P'
103
       AND pa.IT_DA_ABERTURA BETWEEN v_pro_ini AND v_pro_fim
104
       AND EXISTS (
105
             SELECT 1
106
               FROM SITAFE_NF_FISCAL_AUX fa
107
              WHERE fa.IT_NU_PROCESSO = pa.IT_NU_PROCESSO
108
                AND fa.IT_IN_SITUACAO = '1'
109
           );
110

    
111
    v_rows_proc_i := SQL%ROWCOUNT;
112

    
113
    -------------------------------------------------------------------------
114
    -- Commit / Retorno
115
    -------------------------------------------------------------------------
116
    IF pa_do_commit = 'Y' THEN
117
        COMMIT;
118
    END IF;
119

    
120
    pa_mens_erro := 'OK';
121

    
122
    -- (Opcional) Se quiser logar quantidades afetadas, crie um log aqui
123
    -- 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, ...);
124

    
125
EXCEPTION
126
    WHEN OTHERS THEN
127
        pa_mens_erro := 'ERRO: ' || SQLERRM;
128
        -- Se preferir reverter sempre:
129
        ROLLBACK;
130
        RAISE;
131
END ALTERA_STATUS_TABELAS;
    (1-1/1)