DROP FUNCTION RESUMO_GOP
/

DROP TYPE RESUMO_GOP_TABLE
/

DROP TYPE RESUMO_GOP_TYPE
/

CREATE TYPE RESUMO_GOP_TYPE AS
OBJECT (NRRESUMO_GOP        NUMBER,
        DSDESCRICAO         VARCHAR2(40),
        NRTOPICO            VARCHAR2(10),
        DSDESCRICAOTOP      VARCHAR2(50),
        DTORCAMENTO         DATE,
        VRORCADO            FLOAT(126),
        VRPERORCADO         FLOAT(126),
        NRORDEM             NUMBER,
        NRORG               NUMBER)
/

CREATE TYPE RESUMO_GOP_TABLE AS
TABLE OF RESUMO_GOP_TYPE
/

CREATE OR REPLACE FUNCTION RESUMO_GOP
 (P_LFILIAL       IN VARCHAR2,
  P_LOPERADOR     IN VARCHAR2,
  P_IDPERIODOORCA IN VARCHAR2,
  P_NRPERIODOORCA IN VARCHAR2,
  P_NRANOORCAGOP  IN VARCHAR2,
  P_IDMODELO      IN VARCHAR2 DEFAULT 'P',
  P_IDPERCEN      IN VARCHAR2 DEFAULT NULL,
  P_DESCRICAO     IN VARCHAR2 DEFAULT NULL) RETURN RESUMO_GOP_TABLE PIPELINED
IS
  V_IDUTILVERSAOORCA VARCHAR2(01);
  V_DSDESCRICAO      VARCHAR2(40);
  V_VRFATLIQUIDO     FLOAT(126);
  V_VRMARGEMCONTRIB  FLOAT(126);
  V_VRFATLUCRO       FLOAT(126);
  V_RESULTADO        FLOAT(126);
  V_DESPESA          FLOAT(126);
  V_VRCALCPERC       FLOAT(126);
  V_IDCALCPERCENTFAT VARCHAR2(30);

  V_NRRESUMO_ROP     NUMBER;
  V_NRORG            NUMBER;

  V_DTORCAMENTO      DATE;

  OUT_RECORD RESUMO_GOP_TYPE := RESUMO_GOP_TYPE(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
BEGIN
/*   SELECT NVL(MAX(IDUTILVERSAOORCA),'N')
     INTO V_IDUTILVERSAOORCA
     FROM PARAMORCAOPERAC; */

   V_DTORCAMENTO := NULL;
   V_DSDESCRICAO := P_DESCRICAO;
   V_NRRESUMO_ROP := 0;
   V_DESPESA := 0;

   IF P_IDPERCEN IS NULL THEN
      SELECT NVL(MIN(P.IDCALCPERCENTFAT), 'FATURAMENTO_BRUTO') IDCALCPERCENTFAT
        INTO V_IDCALCPERCENTFAT
        FROM PARFILIALROP P, LISTA L
       WHERE L.NRLISTA = P_LFILIAL
         AND P.CDFILIAL = TIPOPARAM_DRO(L.CDLISTA);
   ELSE
      V_IDCALCPERCENTFAT := CASE WHEN P_IDPERCEN = 'B' THEN 'FATURAMENTO_BRUTO' ELSE 'FATURAMENTO_LIQUIDO' END;
   END IF;

   FOR C_ORCAMENTO IN (SELECT I.IDTIPOORCAOP, M.DTORCAMENTO, SUM(M.VRORCAMENTO) VRORCAMENTO, A.IDAPROVACAOGOP, O.NRORG
                         FROM ORCAMENTOGOP O INNER JOIN ITEMORCAGOP I ON I.NRORCAMENTOGOP = O.NRORCAMENTOGOP
                                             INNER JOIN ITORCAMESGOP M ON M.NRITEMORCAOP = I.NRITEMORCAOP
                                             INNER JOIN LISTA L ON L.CDLISTA = O.CDFILIAL
                                             INNER JOIN APROVAORCAGOP A ON A.NRORCAMENTOGOP = O.NRORCAMENTOGOP
                        WHERE O.NRANOORCAGOP = P_NRANOORCAGOP
                          AND O.IDPERIODOORCA = P_IDPERIODOORCA
                          AND O.NRPERIODOORCA = P_NRPERIODOORCA
                          AND L.NRLISTA = P_LFILIAL
                          AND A.IDAPROVACAOGOP = 'APROVADO'
                        GROUP BY I.IDTIPOORCAOP, M.DTORCAMENTO, A.IDAPROVACAOGOP, O.NRORG
                        ORDER BY M.DTORCAMENTO, CASE I.IDTIPOORCAOP 
                                                   WHEN 'FATURAMENTO' THEN 1
                                                   WHEN 'IMPOSTO' THEN 2
                                                   WHEN 'IMPOSTOARECUPERAR' THEN 3
                                                   WHEN 'TAXAADM' THEN 4
                                                   WHEN 'CONSUMO' THEN 5
                                                   WHEN 'DESPDIVERSA' THEN 6
                                                   WHEN 'DESPENTRADA' THEN 7
                                                   WHEN 'DESPMATRIZ' THEN 8
                                                   WHEN 'MAOOBRA' THEN 9
                                                   WHEN 'DEPRECIACAO' THEN 10
                                                   WHEN 'INVESTIMENTO' THEN 11
                                                   WHEN 'IMPOSTOSOBLUCRO' THEN 12
                                                END) LOOP

      IF C_ORCAMENTO.DTORCAMENTO <> NVL(V_DTORCAMENTO, C_ORCAMENTO.DTORCAMENTO-1) THEN
         SELECT NVL(SUM(CASE WHEN I.IDTIPOORCAOP = 'IMPOSTO'
                             THEN M.VRORCAMENTO*(-1)
                             ELSE M.VRORCAMENTO
                        END),0) VRORCAMENTO
           INTO V_VRCALCPERC
           FROM ORCAMENTOGOP O INNER JOIN ITEMORCAGOP I ON I.NRORCAMENTOGOP = O.NRORCAMENTOGOP
                               INNER JOIN ITORCAMESGOP M ON M.NRITEMORCAOP = I.NRITEMORCAOP
                               INNER JOIN LISTA L ON L.CDLISTA = O.CDFILIAL
                               INNER JOIN APROVAORCAGOP A ON A.NRORCAMENTOGOP = O.NRORCAMENTOGOP
          WHERE O.NRANOORCAGOP = P_NRANOORCAGOP
            AND O.IDPERIODOORCA = P_IDPERIODOORCA
            AND O.NRPERIODOORCA = P_NRPERIODOORCA
            AND L.NRLISTA = P_LFILIAL
            AND A.IDAPROVACAOGOP = 'APROVADO'
            AND M.DTORCAMENTO = C_ORCAMENTO.DTORCAMENTO
            AND ((V_IDCALCPERCENTFAT = 'FATURAMENTO_BRUTO' AND I.IDTIPOORCAOP IN ('FATURAMENTO')) OR
                  V_IDCALCPERCENTFAT = 'FATURAMENTO_LIQUIDO' AND I.IDTIPOORCAOP IN ('FATURAMENTO', 'IMPOSTO', 'IMPOSTOARECUPERAR'));

         IF V_DTORCAMENTO IS NOT NULL THEN
            OUT_RECORD.NRORDEM         := 4;
            OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
            OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
            OUT_RECORD.NRTOPICO        := '(=)';
            OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
            OUT_RECORD.DSDESCRICAOTOP  := 'FATLIQUIDO';
            OUT_RECORD.VRORCADO        := V_VRFATLIQUIDO;
            OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                               THEN V_VRFATLIQUIDO / V_VRCALCPERC
                                               ELSE 0
                                          END;
            OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
            PIPE ROW (OUT_RECORD);

            OUT_RECORD.NRORDEM         := 7;
            OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
            OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
            OUT_RECORD.NRTOPICO        := '(=)';
            OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
            OUT_RECORD.DSDESCRICAOTOP  := 'MARGEMCONTRIB';
            OUT_RECORD.VRORCADO        := V_VRMARGEMCONTRIB;
            OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                               THEN V_VRMARGEMCONTRIB / V_VRCALCPERC
                                               ELSE 0
                                          END;
            OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
            PIPE ROW (OUT_RECORD);

            OUT_RECORD.NRORDEM         := 8;
            OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
            OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
            OUT_RECORD.NRTOPICO        := '(=)';
            OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
            OUT_RECORD.DSDESCRICAOTOP  := 'DESPESATOTAL';
            OUT_RECORD.VRORCADO        := V_DESPESA;
            OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                               THEN V_DESPESA / V_VRCALCPERC
                                               ELSE 0
                                          END;
            OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
            PIPE ROW (OUT_RECORD);

            V_DESPESA := 0;

            OUT_RECORD.NRORDEM         := 13;
            OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
            OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
            OUT_RECORD.NRTOPICO        := '(=)';
            OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
            OUT_RECORD.DSDESCRICAOTOP  := 'FATLUCRO';
            OUT_RECORD.VRORCADO        := V_RESULTADO;
            OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                               THEN V_RESULTADO / V_VRCALCPERC
                                               ELSE 0
                                          END;
            OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
            PIPE ROW (OUT_RECORD);

            OUT_RECORD.NRORDEM         := 17;
            OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
            OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
            OUT_RECORD.NRTOPICO        := '(=)';
            OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
            OUT_RECORD.DSDESCRICAOTOP  := 'RESULTADO';
            OUT_RECORD.VRORCADO        := V_VRFATLUCRO;
            OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                               THEN V_VRFATLUCRO / V_VRCALCPERC
                                               ELSE 0
                                          END;
            OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
            PIPE ROW (OUT_RECORD);
         END IF;
         V_VRFATLIQUIDO := 0;
         V_VRMARGEMCONTRIB := 0;
         V_VRFATLUCRO := 0;
         V_RESULTADO := 0;

         V_DTORCAMENTO := C_ORCAMENTO.DTORCAMENTO;
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'FATURAMENTO' THEN            
         V_VRFATLIQUIDO := C_ORCAMENTO.VRORCAMENTO;
         V_VRMARGEMCONTRIB := C_ORCAMENTO.VRORCAMENTO;
         V_VRFATLUCRO := C_ORCAMENTO.VRORCAMENTO;
         V_RESULTADO := C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 1;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(+)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'FATUBRUTO';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'IMPOSTO' THEN
         V_VRFATLIQUIDO := V_VRFATLIQUIDO - C_ORCAMENTO.VRORCAMENTO;
         V_VRMARGEMCONTRIB := V_VRMARGEMCONTRIB - C_ORCAMENTO.VRORCAMENTO;
         V_VRFATLUCRO := V_VRFATLUCRO - C_ORCAMENTO.VRORCAMENTO;
         V_RESULTADO := V_RESULTADO - C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 2;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(-)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'IMPOSTO';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'IMPOSTOARECUPERAR' THEN
         V_VRFATLIQUIDO := V_VRFATLIQUIDO + C_ORCAMENTO.VRORCAMENTO;
         V_VRMARGEMCONTRIB := V_VRMARGEMCONTRIB + C_ORCAMENTO.VRORCAMENTO;
         V_VRFATLUCRO := V_VRFATLUCRO + C_ORCAMENTO.VRORCAMENTO;
         V_RESULTADO := V_RESULTADO + C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 3;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(+)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'IMPOSTOARECUPERAR';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'TAXAADM' THEN
         V_VRMARGEMCONTRIB := V_VRMARGEMCONTRIB - C_ORCAMENTO.VRORCAMENTO;
         V_VRFATLUCRO := V_VRFATLUCRO - C_ORCAMENTO.VRORCAMENTO;
         V_RESULTADO := V_RESULTADO - C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 5;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(-)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'TAXAADM';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'CONSUMO' THEN
         V_VRMARGEMCONTRIB := V_VRMARGEMCONTRIB - C_ORCAMENTO.VRORCAMENTO;
         V_VRFATLUCRO := V_VRFATLUCRO - C_ORCAMENTO.VRORCAMENTO;
         V_RESULTADO := V_RESULTADO - C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 6;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(-)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'CONSUMO';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'DESPDIVERSA' THEN
         V_VRFATLUCRO := V_VRFATLUCRO - C_ORCAMENTO.VRORCAMENTO;
         V_RESULTADO := V_RESULTADO - C_ORCAMENTO.VRORCAMENTO;
         V_DESPESA := C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 9;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(-)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'DESPDIVERSA';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'DESPENTRADA' THEN
         V_VRFATLUCRO := V_VRFATLUCRO - C_ORCAMENTO.VRORCAMENTO;
         V_RESULTADO := V_RESULTADO - C_ORCAMENTO.VRORCAMENTO;
         V_DESPESA := C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 10;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(-)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'DESPENTRADA';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'DESPMATRIZ' THEN
         V_VRFATLUCRO := V_VRFATLUCRO - C_ORCAMENTO.VRORCAMENTO;
         V_RESULTADO := V_RESULTADO - C_ORCAMENTO.VRORCAMENTO;
         V_DESPESA := C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 11;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(-)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'DESPMATRIZ';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;      

      IF C_ORCAMENTO.IDTIPOORCAOP = 'MAOOBRA' THEN
         V_VRFATLUCRO := V_VRFATLUCRO - C_ORCAMENTO.VRORCAMENTO;
         V_RESULTADO := V_RESULTADO - C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 12;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(-)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'MAOOBRA';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'DEPRECIACAO' THEN
         V_RESULTADO := V_RESULTADO - C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 14;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(-)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'DEPRECIACAO';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'INVESTIMENTO' THEN
         V_RESULTADO := V_RESULTADO - C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 15;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(-)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'INVESTIMENTO';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      IF C_ORCAMENTO.IDTIPOORCAOP = 'IMPOSTOSOBLUCRO' THEN
         V_RESULTADO := V_RESULTADO - C_ORCAMENTO.VRORCAMENTO;

         OUT_RECORD.NRORDEM         := 16;
         OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
         OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
         OUT_RECORD.NRTOPICO        := '(-)';
         OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
         OUT_RECORD.DSDESCRICAOTOP  := 'IMPOSTOSOBLUCRO';
         OUT_RECORD.VRORCADO        := C_ORCAMENTO.VRORCAMENTO;
         OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                            THEN C_ORCAMENTO.VRORCAMENTO / V_VRCALCPERC
                                            ELSE 0
                                       END;
         OUT_RECORD.NRORG := C_ORCAMENTO.NRORG;
         PIPE ROW (OUT_RECORD);
      END IF;

      V_NRORG := C_ORCAMENTO.NRORG;
   END LOOP;

   IF V_NRORG IS NOT NULL THEN
      OUT_RECORD.NRORDEM         := 4;
      OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
      OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
      OUT_RECORD.NRTOPICO        := '(=)';
      OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
      OUT_RECORD.DSDESCRICAOTOP  := 'FATLIQUIDO';
      OUT_RECORD.VRORCADO        := V_VRFATLIQUIDO;
      OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                         THEN V_VRFATLIQUIDO / V_VRCALCPERC
                                         ELSE 0
                                    END;
      OUT_RECORD.NRORG := V_NRORG;
      PIPE ROW (OUT_RECORD);

      OUT_RECORD.NRORDEM         := 7;
      OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
      OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
      OUT_RECORD.NRTOPICO        := '(=)';
      OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
      OUT_RECORD.DSDESCRICAOTOP  := 'MARGEMCONTRIB';
      OUT_RECORD.VRORCADO        := V_VRMARGEMCONTRIB;
      OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                         THEN V_VRMARGEMCONTRIB / V_VRCALCPERC
                                         ELSE 0
                                    END;
      OUT_RECORD.NRORG := V_NRORG;
      PIPE ROW (OUT_RECORD);      

      IF V_DESPESA IS NULL THEN
         V_DESPESA := 0;
      END IF;

      OUT_RECORD.NRORDEM         := 8;
      OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
      OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
      OUT_RECORD.NRTOPICO        := '(=)';
      OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
      OUT_RECORD.DSDESCRICAOTOP  := 'DESPESATOTAL';
      OUT_RECORD.VRORCADO        := V_DESPESA;
      OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                         THEN V_DESPESA / V_VRCALCPERC
                                         ELSE 0
                                    END;
      OUT_RECORD.NRORG := V_NRORG;
      PIPE ROW (OUT_RECORD);

      OUT_RECORD.NRORDEM         := 13;
      OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
      OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
      OUT_RECORD.NRTOPICO        := '(=)';
      OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
      OUT_RECORD.DSDESCRICAOTOP  := 'FATLUCRO';
      OUT_RECORD.VRORCADO        := V_RESULTADO;
      OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                         THEN V_RESULTADO / V_VRCALCPERC
                                         ELSE 0
                                    END;
      OUT_RECORD.NRORG := V_NRORG;
      PIPE ROW (OUT_RECORD);

      OUT_RECORD.NRORDEM         := 17;
      OUT_RECORD.NRRESUMO_GOP    := V_NRRESUMO_ROP;
      OUT_RECORD.DSDESCRICAO     := V_DSDESCRICAO;
      OUT_RECORD.NRTOPICO        := '(=)';
      OUT_RECORD.DTORCAMENTO     := V_DTORCAMENTO;
      OUT_RECORD.DSDESCRICAOTOP  := 'RESULTADO';
      OUT_RECORD.VRORCADO        := V_VRFATLUCRO;
      OUT_RECORD.VRPERORCADO     := CASE WHEN V_VRCALCPERC <> 0
                                         THEN V_VRFATLUCRO / V_VRCALCPERC
                                         ELSE 0
                                    END;
      OUT_RECORD.NRORG := V_NRORG;
      PIPE ROW (OUT_RECORD);
   END IF;
END;
/