Advertisement
Guest User

Untitled

a guest
Feb 26th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 9.13 KB | None | 0 0
  1. CREATE OR REPLACE
  2. PROCEDURE PR_REPROCESSAR_VENCIMENTO(parametro IN VARCHAR2) AS
  3. BEGIN
  4.  
  5.  DECLARE VCOUNT INTEGER := 0;
  6.     DATA_ABERTURA VARCHAR(30);
  7.     SLA_TURNO NUMBER := 0;  
  8.     DATA_VENCIMENTO VARCHAR(30);
  9.     TOTAL_HORAS_TURNO VARCHAR(4);
  10.     total_horas_dia INTEGER := 0;
  11.     total_minutos_dia NUMERIC (15,2) := 0;  
  12.     total_segundos_dia INTEGER := 0;
  13.     V_SLA_TEMP VARCHAR(6);
  14.     VID NUMBER;
  15.     V_DIA_PULO INTEGER := 1;  
  16.     V_DIA_FERIADO INTEGER := 0;
  17.     VDATAFINAL NUMBER;
  18.     VOPENDATE NUMBER;
  19.     VCATEGORY VARCHAR(30);
  20.     VREFNUM NUMBER;
  21.     DATA_FINAL_TURNO VARCHAR(30);
  22.     vrTempo  DATE := SYSDATE;
  23.     vrTempoF DATE;
  24.     VDIAMESANO VARCHAR(10);
  25.     VREQID VARCHAR(10);
  26.     BEGIN
  27.      
  28.         VREQID := parametro;
  29.            
  30.         -- OBTER DADOS CALL_REQ
  31.         SELECT open_date,category,REF_NUM  INTO VOPENDATE,VCATEGORY,VREFNUM  FROM call_req WHERE persid = VREQID;  
  32.      
  33.         DATA_ABERTURA := TO_CHAR((TIMESTAMP '1970-01-01 00:00:00 GMT' + NUMTODSINTERVAL(VOPENDATE, 'SECOND')) AT TIME ZONE 'AMERICA/BAHIA', 'dd/mm/yy hh24:mi:ss');
  34.        
  35.         -- DATA INICIO DO TURNO          
  36.         DATA_VENCIMENTO := to_date(sysdate, 'dd/mm/yy hh24:mi:ss');
  37.        
  38.         -- DATA FINAL TURNO
  39.         DATA_FINAL_TURNO := to_char(to_date(sysdate  || ' 18:00:00', 'dd/mm/yy hh24:mi:ss'), 'dd/mm/yy hh24:mi:ss');          
  40.        
  41.         -- CALCULA HORA QUE RESTA  
  42.          vrTempo := to_date(DATA_ABERTURA, 'dd/mm/yy hh24:mi:ss');
  43.  
  44.          vrTempoF := to_date(DATA_FINAL_TURNO, 'dd/mm/yy hh24:mi:ss');
  45.  
  46.          total_horas_dia := TRUNC(( (vrTempoF - vrTempo) * 86400 / 3600));
  47.          total_minutos_dia := TRUNC(MOD( (vrTempoF - vrTempo) * 86400 , 3600 ) / 60 );
  48.          total_segundos_dia := TRUNC(MOD(MOD( (vrTempoF - vrTempo) * 86400, 3600 ), 60));
  49.                  
  50.         -- SLA TURNO        
  51.          SELECT (SELECT  CASE WHEN CAST (REPLACE(srv_desc.z_sla_time_desc,' Horas','') AS NUMBER) IS NULL THEN 0 ELSE CAST (REPLACE(srv_desc.z_sla_time_desc,' Horas','') AS NUMBER) END   FROM prob_ctg  
  52.          INNER JOIN srv_desc  ON srv_desc.code = prob_ctg.service_type  AND prob_ctg.persid = VCATEGORY  AND prob_ctg.del=0) INTO SLA_TURNO FROM DUAL;
  53.          
  54.          -- SE O HORARIO DE ABERTURA AINDA NÃO FOR 8 HORAS DIMINUA 1 DIA
  55.          IF(total_horas_dia > 9) THEN
  56.          DATA_VENCIMENTO := to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') - 1;
  57.          END IF;         
  58.          
  59.         -- SE O SLA JÁ PASSOU DO HORARIO DE ABERTURA OU NÃO ESTA NO HORARIO DE INICIO DO TURNO NÃO ABATE HORAS              
  60.         IF ((total_horas_dia <= 0 AND total_minutos_dia < 5) OR total_horas_dia > 9 ) THEN
  61.         V_SLA_TEMP := SLA_TURNO;       
  62.         ELSE
  63.         TOTAL_HORAS_TURNO :=   total_horas_dia || ',' || total_minutos_dia;  
  64.         V_SLA_TEMP := SLA_TURNO - TOTAL_HORAS_TURNO;
  65.         END IF;
  66.        
  67.         WHILE V_SLA_TEMP > 0  LOOP
  68.            
  69.         IF V_SLA_TEMP >= 10 THEN          
  70.         DATA_VENCIMENTO := to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + 1;        
  71.      
  72.        
  73.         V_DIA_FERIADO := 1;    
  74.         WHILE V_DIA_FERIADO = 1 LOOP  
  75.         -- VERIFICA SE O DIA É SABADO OU DOMINGO ;
  76.         SELECT COUNT(*) INTO V_DIA_FERIADO FROM dual WHERE (to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss'),'d') IN (1,7));      
  77.         IF (V_DIA_FERIADO = 1) THEN          
  78.         DATA_VENCIMENTO := to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + 1;
  79.         ELSE
  80.         V_DIA_FERIADO := 0;
  81.         END IF;
  82.         -- VERIFICA SE O DIA É FERIADO    
  83.         IF  V_DIA_FERIADO = 0 THEN 
  84.         SELECT CASE WHEN (SELECT INSTR(sched, to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') , 'mm/dd/yyyy')) FROM bpwshft WHERE sym = 'Turno 8-18') > 0 THEN 1 ELSE 0 END  INTO V_DIA_FERIADO FROM dual;      
  85.         IF (V_DIA_FERIADO = 1) THEN
  86.         DATA_VENCIMENTO := to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + 1;
  87.         ELSE
  88.         V_DIA_FERIADO := 0;
  89.         END IF;    
  90.         END IF;    
  91.         END LOOP;
  92.        
  93.        
  94.        
  95.        
  96.        
  97.         -- SETAR DATA INICIAL 08:00 DO SLA    
  98.         VDIAMESANO := to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') , 'dd/mm/yy');        
  99.         DATA_VENCIMENTO := to_date(to_date(VDIAMESANO, 'dd/mm/yy') || ' 08:00:00', 'dd/mm/yy hh24:mi:ss');
  100.         DATA_VENCIMENTO := to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + (8 / 24), 'dd/mm/yy hh24:mi:ss');
  101.         SELECT CAST (ROUND((to_date(to_char(TO_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss'), 'YYYYMMDD HH24MISS'), 'YYYYMMDD HH24MISS') - TO_DATE('19700101 205959', 'YYYYMMDD HH24MISS')+1)* 86400) AS NUMERIC) INTO VDATAFINAL FROM DUAL;
  102.        
  103.        
  104.         VID := Z_TR_VENCIMENTO_SEQUENCE.NEXTVAL;
  105.         INSERT INTO z_vencimento(id,z_abertura, z_chamado, z_complemento_sla, z_data_vencimento, z_final_turno, z_tipo_serv, z_category,z_vencimento_final)
  106.         VALUES (VID,DATA_ABERTURA,VREFNUM,V_SLA_TEMP,DATA_VENCIMENTO,TOTAL_HORAS_TURNO,SLA_TURNO || ' Horas',VCATEGORY,VDATAFINAL);            
  107.         V_SLA_TEMP := V_SLA_TEMP - 10;
  108.        
  109.         -- CHEGOU AO FIM DO SLA EFETUA UPDATE
  110.         IF(V_SLA_TEMP = 0) THEN
  111.         UPDATE call_req SET z_vencimento_cr = CAST(VDATAFINAL AS NUMBER)
  112.         WHERE ref_num = to_char(VREFNUM);        
  113.         END IF;
  114.        
  115.        
  116.         ELSE -- QUANDO O SLA É MENOR QUE 10 SIGNIFICA QUE ELE JÁ CHEGOU NO FINAL  
  117.        
  118.         DATA_VENCIMENTO := to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + 1;
  119.        
  120.         V_DIA_FERIADO := 1;    
  121.         WHILE V_DIA_FERIADO = 1 LOOP  
  122.         -- VERIFICA SE O DIA É SABADO OU DOMINGO ;
  123.         SELECT COUNT(*) INTO V_DIA_FERIADO FROM dual WHERE (to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss'),'d') IN (1,7))   FROM DUAL;      
  124.         IF (V_DIA_FERIADO = 1) THEN          
  125.         DATA_VENCIMENTO := to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + 1;
  126.         ELSE
  127.         V_DIA_FERIADO := 0;
  128.         END IF;
  129.         -- VERIFICA SE O DIA É FERIADO    
  130.         IF  V_DIA_FERIADO = 0 THEN 
  131.         SELECT CASE WHEN (SELECT INSTR(sched, to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') , 'mm/dd/yyyy')) FROM bpwshft WHERE sym = 'Turno 8-18') > 0 THEN 1 ELSE 0 END  INTO V_DIA_FERIADO FROM dual;      
  132.         IF (V_DIA_FERIADO = 1) THEN
  133.         DATA_VENCIMENTO := to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + 1;
  134.         ELSE
  135.         V_DIA_FERIADO := 0;
  136.         END IF;    
  137.         END IF;    
  138.         END LOOP;
  139.        
  140.          
  141.        
  142.        -- SE TEM MINUTOS PEGA OS MINUTOS QUE RESTA;
  143.             IF (LENGTH(V_SLA_TEMP) > 1) THEN  
  144.         total_horas_dia :=  CAST (substr (V_SLA_TEMP, 0, INSTR(V_SLA_TEMP, ',', 1)-1) AS NUMERIC);
  145.         total_minutos_dia :=  CAST (substr (V_SLA_TEMP, INSTR(V_SLA_TEMP, ',', 1) + 1, 2) AS NUMERIC);
  146.             ELSE
  147.             total_horas_dia :=  CAST(V_SLA_TEMP AS NUMERIC);
  148.         total_minutos_dia := 0;
  149.         total_segundos_dia := 0;
  150.             END IF;
  151.        
  152.            
  153.          -- SETAR DATA INICIAL 08:00 DO SLA  
  154.         VDIAMESANO := to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') , 'dd/mm/yy');        
  155.         DATA_VENCIMENTO := to_date(to_date(VDIAMESANO, 'dd/mm/yy') || ' 08:00:00', 'dd/mm/yy hh24:mi:ss');
  156.         DATA_VENCIMENTO := to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + (8 / 24), 'dd/mm/yy hh24:mi:ss');
  157.        
  158.         IF(total_horas_dia > 0) THEN
  159.         DATA_VENCIMENTO := to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + (total_horas_dia / 24), 'dd/mm/yy hh24:mi:ss');
  160.         END IF;
  161.        
  162.         IF(total_minutos_dia > 0) THEN
  163.         DATA_VENCIMENTO := to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + (total_minutos_dia / 1440), 'dd/mm/yy hh24:mi:ss');
  164.         END IF;
  165.         IF(total_segundos_dia > 0) THEN
  166.         DATA_VENCIMENTO := to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') + (total_segundos_dia / 86400), 'dd/mm/yy hh24:mi:ss');
  167.         END IF;
  168.        
  169.        
  170.        
  171.         SELECT CAST (ROUND((to_date(to_char(TO_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss'), 'YYYYMMDD HH24MISS'), 'YYYYMMDD HH24MISS') - TO_DATE('19700101 205959', 'YYYYMMDD HH24MISS')+1)* 86400) AS NUMERIC) INTO VDATAFINAL FROM DUAL;
  172.      
  173.         VID :=  Z_TR_VENCIMENTO_SEQUENCE.NEXTVAL ;
  174.         INSERT INTO z_vencimento(id,z_abertura, z_chamado, z_complemento_sla, z_data_vencimento, z_final_turno, z_tipo_serv,Z_CATEGORY,z_vencimento_final)
  175.         VALUES (VID,DATA_ABERTURA,VREFNUM,V_SLA_TEMP,DATA_VENCIMENTO,TOTAL_HORAS_TURNO,SLA_TURNO || ' Horas',VCATEGORY,VDATAFINAL);
  176.    
  177.        
  178.          -- VERIFICAR SE JA PASSOU DO HORARIO DO TURNO  SE PASSOU PULE 1 DIA
  179.         total_horas_dia := to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') , 'hh24');
  180.         total_minutos_dia :=  to_char(to_date(DATA_VENCIMENTO, 'dd/mm/yy hh24:mi:ss') , 'mi');
  181.             IF (total_horas_dia >= 18 AND total_minutos_dia > 0) THEN
  182.         V_SLA_TEMP := 10;
  183.         ELSE
  184.         V_SLA_TEMP := 0;  
  185.         UPDATE call_req SET z_vencimento_cr = CAST(VDATAFINAL AS NUMBER)
  186.         WHERE ref_num = to_char(VREFNUM);  
  187.             END IF;
  188.        
  189.                    
  190.         END IF;      
  191.              
  192.                          
  193.         END LOOP;
  194.      
  195.      
  196.        
  197.      END;
  198.     END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement