CREATE OR REPLACE PROCEDURE APLICA_DESCONTO_ITRETROBILL
(P_CDFILIAL IN VARCHAR2,
 P_NRRETROBILL IN NUMBER,
 P_TIPO IN VARCHAR2,
 P_VALOR IN VARCHAR2,
 P_CDOPERADOR IN VARCHAR2,
 P_NRORG IN NUMBER DEFAULT 1)
AS
   V_VRPERCENTUAL FLOAT;
   V_VRRETROBILL FLOAT;
   V_VRTOTALDESCONTO FLOAT;
   V_MAXVRFINAL FLOAT;
   V_NRSERVICOCIAFILI NUMBER;
   V_CDCICLO VARCHAR2(4);
   V_CDCLASSE VARCHAR2(4);
BEGIN
   IF P_TIPO = 'A' THEN      
      SELECT MAX(VRRETROBILL)
        INTO V_VRRETROBILL
        FROM RETROBILL
       WHERE CDFILIAL = P_CDFILIAL
         AND NRRETROBILL = P_NRRETROBILL;
      
      IF NVL(P_VALOR, 0.00) > V_VRRETROBILL THEN
         /*Operacao bloqueada. Valor absoluto nao deve ser maior que o total do retrobill.*/
         RAISE_APPLICATION_ERROR( -20502, 'APPERRMSGSTR' || 'APP-00030' || 'APPERRMSGEND', FALSE);
      END IF;
      
      V_VRPERCENTUAL := CASE WHEN V_VRRETROBILL = 0.00 THEN 0.00 ELSE ROUND(NVL(P_VALOR, 0.00)/V_VRRETROBILL * 100, 2) END;
   ELSE     
      V_VRPERCENTUAL := NVL(P_VALOR, 0.00);
      IF V_VRPERCENTUAL > 100 THEN
         /*Operacao bloqueada. Valor percentual nao deve ser maior que 100%.*/
         RAISE_APPLICATION_ERROR( -20502, 'APPERRMSGSTR' || 'APP-00031' || 'APPERRMSGEND', FALSE);
      END IF;
   END IF;
   
   UPDATE ITRETROBILLCONS
      SET VRDESCONTO = ROUND(VRRETROBILL * V_VRPERCENTUAL/100, 2),
          VRFINALRETROBILL = VRRETROBILL - ROUND(VRRETROBILL * V_VRPERCENTUAL/100, 2),
          CDOPERULTATU = P_CDOPERADOR,
          DTULTATU = SYSDATE
    WHERE CDFILIAL = P_CDFILIAL
      AND NRRETROBILL = P_NRRETROBILL;
   
   /*Joga a diferenca restante entre o valor absoluto informado e o total de descontos nos itens no primeiro item que comporta a diferenca*/
   IF P_TIPO = 'A' THEN
      SELECT SUM(VRDESCONTO), MAX(VRFINALRETROBILL)
        INTO V_VRTOTALDESCONTO, V_MAXVRFINAL
        FROM ITRETROBILLCONS
       WHERE CDFILIAL = P_CDFILIAL
         AND NRRETROBILL = P_NRRETROBILL;
      
      SELECT MAX(NRSERVICOCIAFILI), MAX(CDCICLO), MAX(CDCLASSE)
        INTO V_NRSERVICOCIAFILI, V_CDCICLO, V_CDCLASSE
        FROM ITRETROBILLCONS
       WHERE CDFILIAL = P_CDFILIAL
         AND NRRETROBILL = P_NRRETROBILL
         AND VRFINALRETROBILL = V_MAXVRFINAL;
      
      UPDATE ITRETROBILLCONS
         SET VRDESCONTO = VRDESCONTO + ROUND(P_VALOR - V_VRTOTALDESCONTO, 2)
       WHERE CDFILIAL = P_CDFILIAL
         AND NRRETROBILL = P_NRRETROBILL
         AND NRSERVICOCIAFILI = V_NRSERVICOCIAFILI
         AND CDCLASSE = V_CDCLASSE
         AND CDCICLO = V_CDCICLO;
   END IF;
END;
/