CREATE OR REPLACE TRIGGER APROVAORCAGOP_VERSAOGOP
AFTER UPDATE OR INSERT
ON APROVAORCAGOP FOR EACH ROW
DECLARE
  V_NRVERSAOGOP           NUMBER;
  V_CDVERSAOGOP           NUMBER;
  V_CDFILIAL              VARCHAR2(04);
  V_NRANOORCAGOP          NUMBER;
  V_IDPERIODOORCA         VARCHAR2(30);
  V_NRPERIODOORCA         NUMBER;
  V_NRORG                 NUMBER;
  V_IDUTILVERSAOORCA      VARCHAR2(01);

  V_IDITEMVERSAOGOP       VARCHAR2(20);
  V_VRITEMVERSAO          NUMBER;
  V_NRTIPOITVERSAOGOP     NUMBER;
  V_NRITVERSAOGOP         NUMBER;
  V_CDITVERSAOGOP         NUMBER;

  V_TIPOIDITEMVERSAOGOP   VARCHAR2(100);
  V_TIPONRITVERSAOGOP     NUMBER;
  V_VRTIPOITVERSAOGOP     NUMBER;
  V_CDTIPOITVERSAOGOP     VARCHAR2(50);
  V_NMTIPOITVERSAOGOP     VARCHAR(100);

  V_NRPRODTIPOITVERSAOGOP NUMBER;
  V_CDPRODTIPOITVERSAOGOP VARCHAR(50);
  V_NMPRODTIPOITVERSAOGOP VARCHAR(50);
  V_VRPRODTIPOITVERSAOGOP NUMBER;
BEGIN
   SELECT NVL(MAX(IDUTILVERSAOORCA),'N')
     INTO V_IDUTILVERSAOORCA
     FROM PARAMORCAOPERAC;

   IF (V_IDUTILVERSAOORCA = 'S' AND :NEW.IDAPROVACAOGOP = 'APROVADO') THEN
      SELECT O.CDFILIAL, O.NRANOORCAGOP, O.IDPERIODOORCA, O.NRPERIODOORCA, O.NRORG
        INTO V_CDFILIAL, V_NRANOORCAGOP, V_IDPERIODOORCA, V_NRPERIODOORCA, V_NRORG
        FROM ORCAMENTOGOP O
       WHERE O.NRORCAMENTOGOP = :NEW.NRORCAMENTOGOP;

      SELECT MAX(CDVERSAOGOP)
        INTO V_CDVERSAOGOP
        FROM VERSAOGOP
       WHERE NRAPROVAORCAGOP = :NEW.NRAPROVAORCAGOP;
       
      IF V_CDVERSAOGOP IS NULL THEN
         V_CDVERSAOGOP := 1;
      ELSE
         V_CDVERSAOGOP := (V_CDVERSAOGOP + 1);
      END IF;
      NOVO_CODIGO_SC('VERSAOGOP', V_NRVERSAOGOP);

      INSERT INTO VERSAOGOP
          (NRVERSAOGOP, NRAPROVAORCAGOP, CDVERSAOGOP, CDFILIAL, NRANOVERSAOGOP, IDPERIODOORCA, NRPERIODOORCA, NRORG)
      VALUES
          (V_NRVERSAOGOP, :NEW.NRAPROVAORCAGOP, V_CDVERSAOGOP, V_CDFILIAL, V_NRANOORCAGOP, V_IDPERIODOORCA, V_NRPERIODOORCA, V_NRORG);

      FOR C_ITVERSAOGOP IN (SELECT IO.IDTIPOORCAOP, SUM(NVL(I.VRORCAMENTO, 0)) VRORCAMENTO, I.NRORG
                              FROM ITORCAMESGOP I INNER JOIN ITEMORCAGOP IO ON I.NRITEMORCAOP = IO.NRITEMORCAOP
                             WHERE IO.NRORCAMENTOGOP = :NEW.NRORCAMENTOGOP
                             GROUP BY IO.IDTIPOORCAOP, I.NRORG) LOOP
         NOVO_CODIGO_SC('ITVERSAOGOP', V_NRITVERSAOGOP);

         INSERT INTO ITVERSAOGOP
             (NRITVERSAOGOP, NRVERSAOGOP, CDVERSAOGOP, CDFILIAL, IDITEMVERSAOGOP, VRITEMVERSAO, NRORG)
         VALUES
             (V_NRITVERSAOGOP, V_NRVERSAOGOP, V_CDVERSAOGOP, V_CDFILIAL, C_ITVERSAOGOP.IDTIPOORCAOP, C_ITVERSAOGOP.VRORCAMENTO, C_ITVERSAOGOP.NRORG);
      END LOOP;
      
      FOR C_TIPOITVERSAOGOP IN (SELECT R.IDTIPOORCAOP, SUM(R.VRORCAMENTO), R.CDPRODUTO, R.NMPRODUTO, ITV.NRITVERSAOGOP, R.NRORG
                                  FROM (SELECT IO.IDTIPOORCAOP,
                                               CASE IO.IDTIPOORCAOP WHEN 'MAOOBRA' THEN CDORCAMENTOMO
                                                                    WHEN 'DESPMATRIZ' THEN CDDESPPREV
                                                                    WHEN 'DESPDIVERSA' THEN CDDESPPREV
                                                                    WHEN 'DESPENTRADA' THEN CDDESPPREV
                                                                    WHEN 'INVESTIMENTO' THEN CDINVEST
                                                                    WHEN 'DEPRECIACAO' THEN CDDESPPREV
                                                                    WHEN 'IMPOSTOARECUPERAR' THEN CDIMPOSTO
                                                                    WHEN 'IMPOSTOSOBLUCRO' THEN CDIMPOSTO
                                                                    WHEN 'IMPOSTO' THEN CDIMPOSTO
                                                                    ELSE NULL
                                               END CDPRODUTO,
                                               NVL(CASE IO.IDTIPOORCAOP WHEN 'MAOOBRA' THEN (SELECT MAX(DSORCAMENTOMO)
                                                                                               FROM ORCAMENTOMO O
                                                                                              WHERE O.CDORCAMENTOMO = IO.CDORCAMENTOMO
                                                                                                AND (O.CDFILIAL = OG.CDFILIAL OR O.CDFILIAL = 'T'))
                                                                        WHEN 'DESPMATRIZ' THEN (SELECT MAX(NMDESPPREV)
                                                                                                  FROM DESPPREV D 
                                                                                                 WHERE D.CDDESPPREV = IO.CDDESPPREV
                                                                                                   AND D.IDTIPODESPESA = 'MATRIZ')
                                                                        WHEN 'DESPDIVERSA' THEN (SELECT MAX(NMDESPPREV)
                                                                                                   FROM DESPPREV D 
                                                                                                  WHERE D.CDDESPPREV = IO.CDDESPPREV
                                                                                                    AND D.IDTIPODESPESA = 'DIVERSA')
                                                                        WHEN 'DESPENTRADA' THEN (SELECT NMTIPOOPER
                                                                                                   FROM TIPOOPERAC T 
                                                                                                  WHERE T.CDTIPOOPER = IO.CDTIPOOPER 
                                                                                                    AND T.IDENTRSAIDOP = IO.IDENTRSAIDOP
                                                                                                    AND IO.CDDESPPREV IS NULL
                                                                                                  UNION 
                                                                                                 SELECT NMDESPPREV
                                                                                                   FROM DESPPREV D 
                                                                                                  WHERE D.CDDESPPREV = IO.CDDESPPREV
                                                                                                    AND D.IDTIPODESPESA = 'ENTRADA'
                                                                                                    AND IO.CDTIPOOPER IS NULL)
                                                                        WHEN 'INVESTIMENTO' THEN (SELECT NMINVEST 
                                                                                                    FROM INVESTIMENTOS IV 
                                                                                                   WHERE IV.CDINVEST = IO.CDINVEST)
                                                                        WHEN 'IMPOSTOARECUPERAR' THEN (SELECT NMIMPOSTO 
                                                                                                         FROM IMPOSTO IP 
                                                                                                        WHERE IP.CDIMPOSTO = IO.CDIMPOSTO)
                                                                        WHEN 'IMPOSTOSOBLUCRO' THEN (SELECT NMIMPOSTO 
                                                                                                       FROM IMPOSTO IP 
                                                                                                      WHERE IP.CDIMPOSTO = IO.CDIMPOSTO)
                                                                        WHEN 'IMPOSTO' THEN (SELECT NMIMPOSTO 
                                                                                               FROM IMPOSTO IP 
                                                                                              WHERE IP.CDIMPOSTO = IO.CDIMPOSTO)
                                                                        ELSE ' '
                                               END,' ') NMPRODUTO, SUM(NVL(I.VRORCAMENTO, 0)) VRORCAMENTO, I.NRITEMORCAOP, I.NRORG
                                          FROM ORCAMENTOGOP OG INNER JOIN ITEMORCAGOP IO ON OG.NRORCAMENTOGOP = IO.NRORCAMENTOGOP
                                                               INNER JOIN ITORCAMESGOP I ON I.NRITEMORCAOP = IO.NRITEMORCAOP
                                         WHERE IO.NRORCAMENTOGOP = :NEW.NRORCAMENTOGOP
                                         GROUP BY IO.IDTIPOORCAOP,I.NRITEMORCAOP, I.NRORG, IO.CDDESPPREV, IO.CDINVEST, IO.CDIMPOSTO, 
                                                  IO.CDORCAMENTOMO, IO.IDENTRSAIDOP, IO.CDTIPOOPER, OG.CDFILIAL
                                         ORDER BY IO.IDTIPOORCAOP, I.NRITEMORCAOP, I.NRORG) R, ITVERSAOGOP ITV
                                 WHERE R.CDPRODUTO IS NOT NULL
                                   AND ITV.IDITEMVERSAOGOP = R.IDTIPOORCAOP
                                   AND ITV.CDVERSAOGOP = V_CDVERSAOGOP
                                 GROUP BY R.IDTIPOORCAOP, R.CDPRODUTO, R.NMPRODUTO, ITV.NRITVERSAOGOP, R.NRORG) LOOP
         
         NOVO_CODIGO_SC('TIPOITVERSAOGOP', V_NRTIPOITVERSAOGOP);
         
         INSERT INTO TIPOITVERSAOGOP
             (NRTIPOITVERSAOGOP, NRITVERSAOGOP, IDITEMVERSAOGOP, CDTIPOITVERSAOGOP, NMTIPOITVERSAOGOP, VRTIPOITVERSAOGOP, NRORG)
         VALUES
             (V_NRTIPOITVERSAOGOP, C_TIPOITVERSAOGOP.NRITVERSAOGOP, C_TIPOITVERSAOGOP.IDTIPOORCAOP, V_CDVERSAOGOP, C_TIPOITVERSAOGOP.NMPRODUTO, NVL(V_VRTIPOITVERSAOGOP, 0), V_NRORG);
      END LOOP;

      FOR C_PRODTIPOITVERSAOGOP IN (SELECT T.NRTIPOITVERSAOGOP, RESULTA.PRODUTO CDPRODUTO, RESULTA.NMPRODUTO,  NVL(SUM(RESULTA.VRORCAMENTO), 0) VRORCAMENTO, RESULTA.NRORG
                                      FROM (SELECT DETAL.NRITORCAMESGOP, DETAL.NRITDETALORCAMESGOP, DETAL.VRORCAMENTO, DETAL.NRITEMORCAOP, DETAL.IDTIPOORCAOP,
                                                   CASE IDTIPOORCAOP WHEN 'MAOOBRA' THEN DETAL.CDORCAMENTOMO
                                                                     WHEN 'DESPMATRIZ' THEN DETAL.CDDESPPREV
                                                                     WHEN 'DESPDIVERSA' THEN DETAL.CDDESPPREV
                                                                     WHEN 'DESPENTRADA' THEN DETAL.CDDESPPREV
                                                                     WHEN 'INVESTIMENTO' THEN DETAL.CDINVEST
                                                                     WHEN 'DEPRECIACAO' THEN DETAL.CDDESPPREV
                                                                     WHEN 'IMPOSTOARECUPERAR' THEN DETAL.CDIMPOSTO
                                                                     WHEN 'IMPOSTOSOBLUCRO' THEN DETAL.CDIMPOSTO
                                                                     WHEN 'IMPOSTO' THEN DETAL.CDIMPOSTO 
                                                                     ELSE NULL
                                                   END CDPRODUTO, NMPRODUTO, CDPRODUTO AS PRODUTO, DETAL.NRORG
                                              FROM (SELECT I.IDTIPOORCAOP, IM.NRITEMORCAOP, IM.NRITORCAMESGOP, IP.NRITDETALORCAMESGOP, IP.VRORCAMENTO,
                                                           I.CDDESPPREV, I.CDINVEST, I.CDIMPOSTO, I.CDORCAMENTOMO, I.IDENTRSAIDOP, I.CDTIPOOPER,
                                                           IP.CDPRODUTO, P.NMPRODUTO, IP.NRORG
                                                      FROM ITEMORCAGOP I INNER JOIN ITORCAMESGOP IM ON I.NRITEMORCAOP = IM.NRITEMORCAOP
                                                                         LEFT  JOIN ITDETALORCAMESGOP IP ON IM.NRITORCAMESGOP = IP.NRITORCAMESGOP
                                                                         LEFT  JOIN PRODUTO P ON IP.CDPRODUTO = P.CDPRODUTO
                                                     WHERE I.NRORCAMENTOGOP = :NEW.NRORCAMENTOGOP) DETAL) RESULTA INNER JOIN TIPOITVERSAOGOP T 
                                                                                                                          ON RESULTA.CDPRODUTO = T.CDTIPOITVERSAOGOP
                                                                                                                         AND RESULTA.IDTIPOORCAOP = T.IDITEMVERSAOGOP
                                                                                                                  INNER JOIN ITVERSAOGOP I 
                                                                                                                          ON T.NRITVERSAOGOP = I.NRITVERSAOGOP
                                     WHERE I.CDVERSAOGOP = V_CDVERSAOGOP
                                     GROUP BY T.NRTIPOITVERSAOGOP, RESULTA.PRODUTO, RESULTA.NMPRODUTO,  RESULTA.NRORG) LOOP
         NOVO_CODIGO_SC('PRODTIPOITVERSAOGOP', V_NRPRODTIPOITVERSAOGOP);

         INSERT INTO PRODTIPOITVERSAOPGOP
            (NRPRODTIPOITVERSAOPGOP, NRTIPOITVERSAOGOP, CDPRODTIPOITVERSAOPGOP, NMPRODTIPOITVERSAOPGOP, VRPRODTIPOITVERSAOPGOP, NRORG)
         VALUES
            (V_NRPRODTIPOITVERSAOGOP, C_PRODTIPOITVERSAOGOP.NRTIPOITVERSAOGOP, C_PRODTIPOITVERSAOGOP.CDPRODUTO,
             C_PRODTIPOITVERSAOGOP.NMPRODUTO, C_PRODTIPOITVERSAOGOP.VRORCAMENTO, C_PRODTIPOITVERSAOGOP.NRORG);
      END LOOP;
   END IF;
END;
/