CREATE OR REPLACE PROCEDURE FCT_GERA_DADOS_PROPOSTA (
    P_NRSEQORCAMENTO IN NUMBER,
    P_NRORG          IN NUMBER)
AS
    -- DADOS DA PROPOSTA
    V_NRPARCNEGOCIO     PARCNEGOCIO.NRPARCNEGOCIO%TYPE;
    V_NRORCAMENTOMODELO FCT_ORCAMENTOMODELO.NRORCAMENTOMODELO%TYPE;

    -- DADOS DO MODELO DE PROPOSTA
    V_NRTIPOORCAMENTO   FCT_ORCAMENTOMODELO.NRTIPOORCAMENTO%TYPE;
    V_QTDIASCONTRATO    FCT_ORCAMENTOMODELO.QTDIASCONTRATO%TYPE;
    V_QTDIASVALIDADE    FCT_ORCAMENTOMODELO.QTDIASVALIDADE%TYPE;
    V_IDUTILIZACOMP     FCT_ORCAMENTOMODELO.IDUTILIZACOMP%TYPE;
    V_CDOPERADOR        OPERADOR.CDOPERADOR%TYPE; --OPERADOR QUE INSERIU A PROPOSTA

    -- DEMAIS VARIAVEIS
    V_NRENDERECOPARC    ENDERECOPARC.NRENDERECOPARC%TYPE;
    V_NRENDERECOORCA    FCT_ENDERECOORCA.NRENDERECOORCA%TYPE; --NOVOCODIGO DA TABELA FCT_ENDERECOORCA
    V_NRVENDEDORORCA    FCT_VENDEDORORCA.NRVENDEDORORCA%TYPE; --NOVOCODIGO DA TABELA FCT_VENDEDORORCA
    V_NRITEMORCAMENTO   FCT_ITEMORCAMENTO.NRITEMORCAMENTO%TYPE; --NOVOCODIGO DA TABELA FCT_ITEMORCAMENTO
    V_NRITEMPAI         FCT_ITEMORCAMENTO.NRITEMORCAMENTO%TYPE;
    V_NRPARCOPERADOR    PARCNEGOCIO.NRPARCNEGOCIO%TYPE; --NRPARCNEGOCIO DO OPERADOR QUE INSERIU A PROPOSTA
    V_VRUNITITEM        FCT_ITEMORCAMODELO.VRUNITITEMORCA%TYPE;
    V_VRTOTALITEM       FCT_ITEMORCAMODELO.VRTOTALITEMORCA%TYPE;
    V_QTMEDIDA          FCT_ITEMORCAMODELO.QTMEDIDAORCA%TYPE;
    V_DTINIFATURAMENTO  DATE;
    V_NRSEQORCADOC      NUMBER;
    V_COUNT_VENDEDOR    NUMBER;

    V_QTD_DOC     INTEGER;
    V_IDMODPADRAO CHAR(1);

BEGIN
    SELECT ORC.NRPARCNEGOCIO,
           ORC.NRORCAMENTOMODELO,
           ORC.CDOPERINCLUSAO,
           OPER.NRPARCNEGOCIO,
           MODELO.IDUTILIZACOMP
      INTO V_NRPARCNEGOCIO,
           V_NRORCAMENTOMODELO,
           V_CDOPERADOR,
           V_NRPARCOPERADOR,
           V_IDUTILIZACOMP
      FROM FCT_ORCAMENTO ORC
     INNER JOIN OPERADOR OPER
        ON ORC.CDOPERINCLUSAO = OPER.CDOPERADOR
       AND ORC.NRORG          = OPER.NRORG
     LEFT JOIN FCT_ORCAMENTOMODELO MODELO
        ON ORC.NRORCAMENTOMODELO = MODELO.NRORCAMENTOMODELO
       AND ORC.NRORG          = MODELO.NRORG
     WHERE ORC.NRSEQORCAMENTO = P_NRSEQORCAMENTO
       AND ORC.NRORG          = P_NRORG;

    /* ENDERECO */

    BEGIN
        SELECT NRENDERECOPARC
          INTO V_NRENDERECOPARC
          FROM (
            SELECT NRENDERECOPARC
              FROM ENDERECOPARC
             WHERE NRPARCNEGOCIO  = V_NRPARCNEGOCIO
               AND NRORG          = P_NRORG
               AND CDTIPOENDERECO = 'PRINCIPAL'
               AND IDATIVO        = 'S'
             ORDER BY DSENDERECO)
        WHERE ROWNUM = 1;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN BEGIN
                V_NRENDERECOPARC := NULL;
            END;
    END;

    IF (V_NRENDERECOPARC IS NOT NULL) THEN

        NOVO_CODIGO_NT('NRENDERECOORCA', V_NRENDERECOORCA, 1, P_NRORG);

        INSERT INTO FCT_ENDERECOORCA (
            NRENDERECOORCA,   NRSEQORCAMENTO,     CDTIPOENDERECO,     CDPAIS,
            SGESTADO,         CDMUNICIPIO,        CDBAIRRO,           CDLOGRADOURO,
            DSENDERECO,       NRIMOVELENDERECO,   NMBAIRROENDERECO,   DSCOMPLEENDERECO,
            NRCEPENDERECO,    DSREFERENCIAENDE,   NRORG,              IDATIVO,
            DTINCLUSAO,       NRORGINCLUSAO,      CDOPERINCLUSAO)
        (SELECT V_NRENDERECOORCA AS NRENDERECOORCA,
                P_NRSEQORCAMENTO AS NRSEQORCAMENTO,
                'PRINCIPAL' AS CDTIPOENDERECO,
                CDPAIS,
                SGESTADO,
                CDMUNICIPIO,
                CDBAIRRO,
                CDLOGRADOURO,
                DSENDERECO,
                NRIMOVELENDERECO,
                NMBAIRROENDERECO,
                DSCOMPLEENDERECO,
                NRCEPENDERECO,
                DSREFERENCIAENDE,
                P_NRORG AS NRORG,
                IDATIVO,
                SYSDATE AS DTINCLUSAO,
                P_NRORG AS NRORGINCLUSAO,
                V_CDOPERADOR AS CDOPERINCLUSAO
           FROM ENDERECOPARC
          WHERE NRPARCNEGOCIO  = V_NRPARCNEGOCIO
            AND NRORG          = P_NRORG
            AND NRENDERECOPARC = V_NRENDERECOPARC);
    END IF;

    /* ITENS */

    IF (V_NRORCAMENTOMODELO IS NOT NULL) THEN

        IF (V_IDUTILIZACOMP <> 'S') THEN

            SELECT NRTIPOORCAMENTO,
                   QTDIASCONTRATO,
                   QTDIASVALIDADE
              INTO V_NRTIPOORCAMENTO,
                   V_QTDIASCONTRATO,
                   V_QTDIASVALIDADE
              FROM FCT_ORCAMENTOMODELO MODELO
             WHERE NRORCAMENTOMODELO = V_NRORCAMENTOMODELO
               AND NRORG             = P_NRORG;

            FOR C_ITENS_PAI IN (
                SELECT NRITEMORCAMODELO,
                       CDSERVORCA,
                       CDPRODUTO,
                       NMITEMORCAMENTO,
                       NVL(QTITEMORCAMENTO, 1) AS QTITEMORCAMENTO,
                       CDTPMEDIDASERV,
                       QTMEDIDAORCA,
                       NVL(VRUNITITEMORCA, 0) AS VRUNITITEMORCA,
                       NVL(VRTOTALITEMORCA, 0) AS VRTOTALITEMORCA,
                       IDFATURAORCA,
                       CDMODPGTO,
                       DSQTITEMORCA,
                       IDITEMOBRIGORCA,
                       IDSOMASUBITENS,
                       IDSOMANOITEMPAI,
                       IDSOMANOTOTALORCA,
                       NRITEMORCAMODELOPAI,
                       NRGRUPOFATURA,
                       IDIMPRESSAOORCA,
                       SGUNIDADE,
                       IDTRANSPORTADORA,
                       IDADICCOBRITEMORC,
                       IDADICITEMORC,
                       IDBLOQALTORC,
                       IDMULTMEDVRTOT,
                       NRTIPOHIERARQSERV,
                       QTDIASINICFAT,
                       QTPARCELASFATU,
                       NRDIAVENCPARCELASFATU
                  FROM FCT_ITEMORCAMODELO
                 WHERE NRORCAMENTOMODELO   = V_NRORCAMENTOMODELO
                   AND NRORG               = P_NRORG
                   AND IDITEMESPELHO       = 'NAO'
                   AND IDADICITEMORC       = 'N'
                   AND NRITEMORCAMODELOPAI IS NULL
            ) LOOP
                V_VRUNITITEM := NULL;
                V_VRTOTALITEM := NULL;
                V_QTMEDIDA := NULL;
                V_DTINIFATURAMENTO := NULL;

                IF (C_ITENS_PAI.IDMULTMEDVRTOT = 'S') THEN

                    V_QTMEDIDA := C_ITENS_PAI.QTMEDIDAORCA;
                    IF (V_QTMEDIDA IS NULL OR V_QTMEDIDA = 0) THEN
                        V_QTMEDIDA := 1;
                    END IF;

                    V_VRTOTALITEM := C_ITENS_PAI.VRUNITITEMORCA * C_ITENS_PAI.QTITEMORCAMENTO * V_QTMEDIDA;
                ELSE
                    V_VRTOTALITEM := C_ITENS_PAI.VRTOTALITEMORCA;
                END IF; --IF MULTIPLICA VALOR COM QUANTIDADE

                V_VRUNITITEM := C_ITENS_PAI.VRUNITITEMORCA;

                V_DTINIFATURAMENTO := NULL;
                IF (C_ITENS_PAI.QTDIASINICFAT IS NOT NULL) THEN
                    V_DTINIFATURAMENTO := SYSDATE + C_ITENS_PAI.QTDIASINICFAT;
                END IF;

                NOVO_CODIGO_NT('NRITEMORCAMENTO', V_NRITEMORCAMENTO, 1, P_NRORG);
                V_NRITEMPAI := V_NRITEMORCAMENTO;

                INSERT INTO FCT_ITEMORCAMENTO (
                    CDSERVORCA,           CDPRODUTO,            NMITEMORCAMENTO,      QTITEMORCAMENTO,
                    CDTPMEDIDASERV,       QTMEDIDAORCA,         VRUNITITEMORCA,       VRTOTALITEMORCA,
                    IDFATURAORCA,         CDMODPGTO,            DSQTITEMORCA,         IDITEMOBRIGORCA,
                    IDSOMASUBITENS,       IDSOMANOITEMPAI,      NRORG,                IDATIVO,
                    DTINCLUSAO,           CDOPERINCLUSAO,       IDSOMANOTOTALORCA,    NRITEMORCAMENTOPAI,
                    NRSEQORCAMENTO,       NRITEMORCAMENTO,      NRGRUPOFATURA,        IDIMPRESSAOORCA,
                    SGUNIDADE,            IDTRANSPORTADORA,     IDADICCOBRITEMORC,    IDADICITEMORC,
                    IDBLOQALTORC,         IDMULTMEDVRTOT,       DTINICFATORC,         VRITEMSEMDESC,
                    NRTIPOHIERARQSERV,    IDTPDESCORCA,         QTPARCELASFATU,       NRDIAVENCPARCELASFATU,
                    QTMEDIDACALCULADA)
                VALUES (
                    C_ITENS_PAI.CDSERVORCA,         C_ITENS_PAI.CDPRODUTO,              C_ITENS_PAI.NMITEMORCAMENTO,      ROUND(C_ITENS_PAI.QTITEMORCAMENTO, 2),
                    C_ITENS_PAI.CDTPMEDIDASERV,     ROUND(C_ITENS_PAI.QTMEDIDAORCA, 2), ROUND(V_VRUNITITEM, 2),           ROUND(V_VRTOTALITEM, 2),
                    C_ITENS_PAI.IDFATURAORCA,       C_ITENS_PAI.CDMODPGTO,              'Referente ao Produto',           C_ITENS_PAI.IDITEMOBRIGORCA,
                    C_ITENS_PAI.IDSOMASUBITENS,     C_ITENS_PAI.IDSOMANOITEMPAI,        P_NRORG,                          'S',
                    SYSDATE,                        V_CDOPERADOR,                       C_ITENS_PAI.IDSOMANOTOTALORCA,    NULL,
                    P_NRSEQORCAMENTO,               V_NRITEMORCAMENTO,                  C_ITENS_PAI.NRGRUPOFATURA,        C_ITENS_PAI.IDIMPRESSAOORCA,
                    C_ITENS_PAI.SGUNIDADE,          C_ITENS_PAI.IDTRANSPORTADORA,       C_ITENS_PAI.IDADICCOBRITEMORC,    C_ITENS_PAI.IDADICITEMORC,
                    C_ITENS_PAI.IDBLOQALTORC,       C_ITENS_PAI.IDMULTMEDVRTOT,         V_DTINIFATURAMENTO,               ROUND(V_VRTOTALITEM, 2),
                    C_ITENS_PAI.NRTIPOHIERARQSERV,  'N',                                C_ITENS_PAI.QTPARCELASFATU,       C_ITENS_PAI.NRDIAVENCPARCELASFATU,
                    ROUND(C_ITENS_PAI.QTMEDIDAORCA, 2));

                FOR C_ITENS_ADIC IN (
                    SELECT NRITEMORCAMODELO,
                           CDSERVORCA,
                           CDPRODUTO,
                           NMITEMORCAMENTO,
                           NVL(QTITEMORCAMENTO, 1) AS QTITEMORCAMENTO,
                           CDTPMEDIDASERV,
                           QTMEDIDAORCA,
                           NVL(VRUNITITEMORCA, 0) AS VRUNITITEMORCA,
                           NVL(VRTOTALITEMORCA, 0) AS VRTOTALITEMORCA,
                           IDFATURAORCA,
                           CDMODPGTO,
                           DSQTITEMORCA,
                           IDITEMOBRIGORCA,
                           IDSOMASUBITENS,
                           IDSOMANOITEMPAI,
                           IDSOMANOTOTALORCA,
                           NRITEMORCAMODELOPAI,
                           NRGRUPOFATURA,
                           IDIMPRESSAOORCA,
                           SGUNIDADE,
                           IDTRANSPORTADORA,
                           IDADICCOBRITEMORC,
                           IDADICITEMORC,
                           IDBLOQALTORC,
                           IDMULTMEDVRTOT,
                           NRTIPOHIERARQSERV,
                           QTDIASINICFAT,
                           QTPARCELASFATU,
                           NRDIAVENCPARCELASFATU
                      FROM FCT_ITEMORCAMODELO
                     WHERE NRORCAMENTOMODELO   = V_NRORCAMENTOMODELO
                       AND NRORG               = P_NRORG
                       AND IDITEMESPELHO       = 'NAO'
                       AND IDADICITEMORC       = 'S'
                       AND NRITEMORCAMODELOPAI = C_ITENS_PAI.NRITEMORCAMODELO
                ) LOOP
                    V_VRUNITITEM := NULL;
                    V_VRTOTALITEM := NULL;
                    V_QTMEDIDA := NULL;
                    V_DTINIFATURAMENTO := NULL;

                    IF (C_ITENS_ADIC.IDMULTMEDVRTOT = 'S') THEN

                        V_QTMEDIDA := C_ITENS_ADIC.QTMEDIDAORCA;
                        IF (V_QTMEDIDA IS NULL OR V_QTMEDIDA = 0) THEN
                            V_QTMEDIDA := 1;
                        END IF;

                        V_VRTOTALITEM := C_ITENS_ADIC.VRUNITITEMORCA * C_ITENS_ADIC.QTITEMORCAMENTO * V_QTMEDIDA;
                    ELSE
                        V_VRTOTALITEM := C_ITENS_ADIC.VRTOTALITEMORCA;
                    END IF; --IF MULTIPLICA VALOR COM QUANTIDADE
                    V_VRUNITITEM := C_ITENS_ADIC.VRUNITITEMORCA;

                    V_DTINIFATURAMENTO := NULL;
                    IF (C_ITENS_ADIC.QTDIASINICFAT IS NOT NULL) THEN
                        V_DTINIFATURAMENTO := SYSDATE + C_ITENS_ADIC.QTDIASINICFAT;
                    END IF;

                    NOVO_CODIGO_NT('NRITEMORCAMENTO', V_NRITEMORCAMENTO, 1, P_NRORG);

                    INSERT INTO FCT_ITEMORCAMENTO (
                        CDSERVORCA,           CDPRODUTO,            NMITEMORCAMENTO,      QTITEMORCAMENTO,
                        CDTPMEDIDASERV,       QTMEDIDAORCA,         VRUNITITEMORCA,       VRTOTALITEMORCA,
                        IDFATURAORCA,         CDMODPGTO,            DSQTITEMORCA,         IDITEMOBRIGORCA,
                        IDSOMASUBITENS,       IDSOMANOITEMPAI,      NRORG,                IDATIVO,
                        DTINCLUSAO,           CDOPERINCLUSAO,       IDSOMANOTOTALORCA,    NRITEMORCAMENTOPAI,
                        NRSEQORCAMENTO,       NRITEMORCAMENTO,      NRGRUPOFATURA,        IDIMPRESSAOORCA,
                        SGUNIDADE,            IDTRANSPORTADORA,     IDADICCOBRITEMORC,    IDADICITEMORC,
                        IDBLOQALTORC,         IDMULTMEDVRTOT,       DTINICFATORC,         VRITEMSEMDESC,
                        NRTIPOHIERARQSERV,    IDTPDESCORCA,         QTPARCELASFATU,       NRDIAVENCPARCELASFATU,
                        QTMEDIDACALCULADA)
                    VALUES (
                        C_ITENS_ADIC.CDSERVORCA,        C_ITENS_ADIC.CDPRODUTO,              C_ITENS_ADIC.NMITEMORCAMENTO,     ROUND(C_ITENS_ADIC.QTITEMORCAMENTO, 2),
                        C_ITENS_ADIC.CDTPMEDIDASERV,    ROUND(C_ITENS_ADIC.QTMEDIDAORCA, 2), ROUND(V_VRUNITITEM, 2),           ROUND(V_VRTOTALITEM, 2),
                        C_ITENS_ADIC.IDFATURAORCA,      C_ITENS_ADIC.CDMODPGTO,              'Referente ao Produto',           C_ITENS_ADIC.IDITEMOBRIGORCA,
                        C_ITENS_ADIC.IDSOMASUBITENS,    C_ITENS_ADIC.IDSOMANOITEMPAI,        P_NRORG,                          'S',
                        SYSDATE,                        V_CDOPERADOR,                        C_ITENS_ADIC.IDSOMANOTOTALORCA,   V_NRITEMPAI,
                        P_NRSEQORCAMENTO,               V_NRITEMORCAMENTO,                   C_ITENS_ADIC.NRGRUPOFATURA,       C_ITENS_ADIC.IDIMPRESSAOORCA,
                        C_ITENS_ADIC.SGUNIDADE,         C_ITENS_ADIC.IDTRANSPORTADORA,       C_ITENS_ADIC.IDADICCOBRITEMORC,   C_ITENS_ADIC.IDADICITEMORC,
                        C_ITENS_ADIC.IDBLOQALTORC,      C_ITENS_ADIC.IDMULTMEDVRTOT,         V_DTINIFATURAMENTO,               ROUND(V_VRTOTALITEM, 2),
                        C_ITENS_ADIC.NRTIPOHIERARQSERV, 'N',                                 C_ITENS_ADIC.QTPARCELASFATU,      C_ITENS_ADIC.NRDIAVENCPARCELASFATU,
                        ROUND(C_ITENS_ADIC.QTMEDIDAORCA, 2));

                END LOOP; --C_ITENS_ADIC
            END LOOP; --C_ITENS_PAI

        END IF;

        UPDATE FCT_ORCAMENTO
           SET VRORCAMENTO = ROUND((SELECT SUM(VRTOTALITEMORCA)
                                    FROM FCT_ITEMORCAMENTO
                                    WHERE NRSEQORCAMENTO = P_NRSEQORCAMENTO
                                      AND NRORG          = P_NRORG), 2)
         WHERE NRSEQORCAMENTO = P_NRSEQORCAMENTO
           AND NRORG          = P_NRORG;

        /* DOCUMENTO */

        V_QTD_DOC := 0;
        FOR C_DOC IN (SELECT ESCOPODOC.NRSEQMODDOCFCT,
                             DOC.NMARQUIVO,
                             DOC.DSCAMINHOARQ,
                             DOC.DSTIPO,
                             DOC.VRTAMANHO,
                             REL.NRTIPOORCAMENTO,
                             ESCOPODOC.IDSITUACAOORCAMENTO
                        FROM FCT_ORCAESCOPODOC ESCOPODOC
                        INNER JOIN FCT_MODELODOC DOC
                          ON ESCOPODOC.NRSEQMODDOCFCT = DOC.NRSEQMODDOCFCT
                         AND ESCOPODOC.NRORG          = DOC.NRORG
                        INNER JOIN FCT_RELACESCOPOMODELO REL
                          ON ESCOPODOC.NRRELACESCOPOMODELO = REL.NRRELACESCOPOMODELO
                          AND ESCOPODOC.NRORG              = REL.NRORG
                        INNER JOIN FCT_RELACESCOPOPROPOSTA ESCORCA
                          ON REL.NRTIPOORCAMENTO = ESCORCA.NRTIPOORCAMENTO
                          AND REL.NRORG          = ESCORCA.NRORG
                       WHERE REL.NRORCAMENTOMODELO   = V_NRORCAMENTOMODELO
                         AND REL.NRORG               = P_NRORG
                         AND ESCORCA.NRSEQORCAMENTO  = P_NRSEQORCAMENTO) LOOP

            IF (V_QTD_DOC = 0) THEN
                V_IDMODPADRAO := 'S';
            ELSE
                V_IDMODPADRAO := 'N';
            END IF;

           NOVO_CODIGO_NT('NRSEQORCADOC', V_NRSEQORCADOC, 1, P_NRORG);

           INSERT INTO FCT_ORCAMENTODOC (
               NRSEQORCADOC,     NRSEQORCAMENTO,   NRSEQMODDOCFCT,  IDIDIOMA,
               TXMODELOORCADOC,  IDPADRAOORCADOC,  NRORG,           IDATIVO,
               DTINCLUSAO,       NRORGINCLUSAO,    CDOPERINCLUSAO,  NMARQUIVO,
               DSCAMINHOARQ,     DSTIPO,           VRTAMANHO,       IDSITUACAOORCAMENTO,
               NRTIPOORCAMENTO)
           VALUES (
               V_NRSEQORCADOC,     P_NRSEQORCAMENTO,  C_DOC.NRSEQMODDOCFCT, NULL,
               NULL,               V_IDMODPADRAO,     P_NRORG,              'S',
               SYSDATE,            P_NRORG,           V_CDOPERADOR,         C_DOC.NMARQUIVO,
               C_DOC.DSCAMINHOARQ, C_DOC.DSTIPO,      C_DOC.VRTAMANHO,      C_DOC.IDSITUACAOORCAMENTO,
               C_DOC.NRTIPOORCAMENTO);

            V_QTD_DOC := V_QTD_DOC + 1;
        END LOOP; --C_DOC

    END IF; --MODELO IS NOT NULL

    COMMIT;
END;
/
