CREATE OR REPLACE PROCEDURE FCT_GERAR_PARCELAS_FATURA (
    P_NRSEQCONTRATO IN FCT_CONTRATO.NRSEQCONTRATO%TYPE,
    P_NRORG         IN NUMBER,
    P_CDOPERADOR    IN VARCHAR2
)
AS
    V_IDTPFATURA            FCT_FATURACONT.IDTPFATURA%TYPE;
    V_NRGRUPOFATURA         FCT_GRUPOFATURA.NRGRUPOFATURA%TYPE;
    V_CDFILIALFATURA        FILIAL.CDFILIAL%TYPE;
    V_NRPARCFATURA          PARCNEGOCIO.NRPARCNEGOCIO%TYPE;
    V_DTINICOMPET           VARCHAR2(10);
    V_DTFINCOMPET           VARCHAR2(10);
    V_TIPO                  CHAR(1);
    V_NRSEQORCAMENTO_ORIGEM FCT_ORCAMENTO.NRSEQORCAMENTO%TYPE;
    V_CONT                  INTEGER;
    V_CONT_X                INTEGER;

    V_NRFATURACONT          NOVOCODIGO.NRSEQUENCIAL%TYPE;
    V_NRITFATURACONT        NOVOCODIGO.NRSEQUENCIAL%TYPE;
    V_NRMEDICAOFATURA       NOVOCODIGO.NRSEQUENCIAL%TYPE;
    V_NRITMEDICAOFATURA     NOVOCODIGO.NRSEQUENCIAL%TYPE;
    V_NRMEDVARMEDICAOFATURA NOVOCODIGO.NRSEQUENCIAL%TYPE;
BEGIN

    /*
    ERROS
    -20001 - Contrato nao foi gerado a partir de uma proposta
    */

    FCT_EXCLUIR_PARCELAS_FATURA(P_NRSEQCONTRATO, P_NRORG);

    FCT_GERAR_ITENS_TRAB_FATURA(P_NRSEQCONTRATO, P_NRORG);

    V_IDTPFATURA     := 'X';
    V_NRGRUPOFATURA  := -1;
    V_CDFILIALFATURA := 'X';
    V_NRPARCFATURA   := -1;
    V_DTINICOMPET    := 'X';
    V_DTFINCOMPET    := 'X';
    V_CONT           := 1;
    V_CONT_X         := 1;
    FOR C_ITENS_TRAB IN (
        SELECT NRITEMOCONTRATO,
               IDTPFATURA,
               DTINICOMPET,
               DTFINCOMPET,
               VRVENCIMENTO,
               DTLIMITEAPU,
               DTVENCIMENTO,
               NRDIASVENCIMENTO,
               QTDIASFATUVENC,
               NRGRUPOFATURA,
               CDPRODFATURA,
               CDFILIALFATURA,
               NRPARCFATURA,
               CDSERVORCA
          FROM FCT_TRAB_ITFATURACONT
         WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
           AND NRORG         = P_NRORG
         ORDER BY IDTPFATURA, NRGRUPOFATURA, CDFILIALFATURA, NRPARCFATURA, DTLIMITEAPU, NRITEMOCONTRATO
    ) LOOP

        IF (C_ITENS_TRAB.IDTPFATURA <> 'X') THEN

            IF (C_ITENS_TRAB.VRVENCIMENTO > 0) THEN

                V_TIPO := 'U';
                IF (V_CONT = 1 OR
                    C_ITENS_TRAB.IDTPFATURA <> V_IDTPFATURA OR
                    C_ITENS_TRAB.NRGRUPOFATURA <> V_NRGRUPOFATURA OR
                    C_ITENS_TRAB.CDFILIALFATURA <> V_CDFILIALFATURA OR
                    C_ITENS_TRAB.NRPARCFATURA <> V_NRPARCFATURA OR
                    TO_CHAR(C_ITENS_TRAB.DTINICOMPET, 'DD/MM/YYYY') <> V_DTINICOMPET OR
                    TO_CHAR(C_ITENS_TRAB.DTFINCOMPET, 'DD/MM/YYYY') <> V_DTFINCOMPET) THEN

                    V_TIPO := 'I';
                END IF;

                IF (V_TIPO = 'I') THEN

                    NOVO_CODIGO_SC('FCT_FATURACONT', V_NRFATURACONT, 1, P_NRORG);

                    INSERT INTO FCT_FATURACONT (
                        NRFATURACONT   , NRSEQCONTRATO , NRGRUPOFATURA    ,
                        CDFILIALFATURA , NRPARCFATURA  , IDTPFATURA       ,
                        IDSITUACAO     , DTINICOMPET   , DTFINCOMPET      ,
                        DTLIMITEAPU    , DTVENCIMENTO  , NRDIASVENCIMENTO ,
                        QTDIASFATUVENC , VRVENCIMENTO  , VRFATURADO       ,
                        VRFALTAFATURAR , IDFORMAFATURA , DSJUSTIFICATIVA  ,
                        NRAPURACAO     , IDATIVO       , NRORG            ,
                        DTINCLUSAO     , NRORGINCLUSAO , CDOPERINCLUSAO
                    )
                    VALUES (
                        V_NRFATURACONT               , P_NRSEQCONTRATO           , C_ITENS_TRAB.NRGRUPOFATURA    ,
                        C_ITENS_TRAB.CDFILIALFATURA  , C_ITENS_TRAB.NRPARCFATURA , C_ITENS_TRAB.IDTPFATURA       ,
                        '1'                          , C_ITENS_TRAB.DTINICOMPET  , C_ITENS_TRAB.DTFINCOMPET      ,
                        C_ITENS_TRAB.DTLIMITEAPU     , C_ITENS_TRAB.DTVENCIMENTO , C_ITENS_TRAB.NRDIASVENCIMENTO ,
                        C_ITENS_TRAB.QTDIASFATUVENC  , C_ITENS_TRAB.VRVENCIMENTO , 0                             ,
                        C_ITENS_TRAB.VRVENCIMENTO    , NULL                      , NULL                          ,
                        NULL                         , 'S'                       , P_NRORG                       ,
                        SYSDATE                      , P_NRORG                   , P_CDOPERADOR
                    );

                ELSE

                    UPDATE FCT_FATURACONT
                       SET VRVENCIMENTO   = VRVENCIMENTO + C_ITENS_TRAB.VRVENCIMENTO,
                           VRFALTAFATURAR = VRFALTAFATURAR + C_ITENS_TRAB.VRVENCIMENTO
                    WHERE NRFATURACONT  = V_NRFATURACONT
                    AND NRSEQCONTRATO = P_NRSEQCONTRATO
                    AND NRORG         = P_NRORG;

                END IF;

                NOVO_CODIGO_SC('FCT_ITFATURACONT', V_NRITFATURACONT, 1, P_NRORG);

                INSERT INTO FCT_ITFATURACONT (
                    NRITFATURACONT  , NRFATURACONT     , NRSEQCONTRATO  ,
                    NRITEMOCONTRATO , CDPRODFATURA     , IDSITUACAO     ,
                    VRVENCIMENTO    , VRFATURADO       , VRFALTAFATURAR ,
                    IDFORMAFATURA   , DSJUSTIFICATIVA  , NRAPURACAO     ,
                    IDATIVO         , NRORG            , DTINCLUSAO     ,
                    NRORGINCLUSAO   , CDOPERINCLUSAO
                )
                VALUES (
                    V_NRITFATURACONT             , V_NRFATURACONT             , P_NRSEQCONTRATO           ,
                    C_ITENS_TRAB.NRITEMOCONTRATO , C_ITENS_TRAB.CDPRODFATURA  , '1'                       ,
                    C_ITENS_TRAB.VRVENCIMENTO    , 0                          , C_ITENS_TRAB.VRVENCIMENTO ,
                    NULL                         , NULL                       , NULL                      ,
                    'S'                          , P_NRORG                    , SYSDATE                   ,
                    P_NRORG                      , P_CDOPERADOR
                );

                V_IDTPFATURA := C_ITENS_TRAB.IDTPFATURA;
                V_NRGRUPOFATURA := C_ITENS_TRAB.NRGRUPOFATURA;
                V_CDFILIALFATURA := C_ITENS_TRAB.CDFILIALFATURA;
                V_NRPARCFATURA := C_ITENS_TRAB.NRPARCFATURA;
                V_DTINICOMPET := TO_CHAR(C_ITENS_TRAB.DTINICOMPET, 'DD/MM/YYYY');
                V_DTFINCOMPET := TO_CHAR(C_ITENS_TRAB.DTFINCOMPET, 'DD/MM/YYYY');
                V_CONT := V_CONT+1;

            END IF;

        ELSE --IDTPFATURA = 'X'

            V_TIPO := 'U';
            --RAISE_APPLICATION_ERROR(-20010,'C_ITENS_TRAB.NRGRUPOFATURA -> '||C_ITENS_TRAB.NRGRUPOFATURA||'  V_NRGRUPOFATURA -> '||V_NRGRUPOFATURA||' C_ITENS_TRAB.CDFILIALFATURA -> '||C_ITENS_TRAB.CDFILIALFATURA||'  V_CDFILIALFATURA -> '||V_CDFILIALFATURA||' C_ITENS_TRAB.NRPARCFATURA -> '||C_ITENS_TRAB.NRPARCFATURA||'  V_NRPARCFATURA -> '||V_NRPARCFATURA||'  C_ITENS_TRAB.DTINICOMPET -> '||TO_CHAR(C_ITENS_TRAB.DTINICOMPET, 'DD/MM/YYYY')||'  V_DTINICOMPET -> '||V_DTINICOMPET||'  C_ITENS_TRAB.DTFINCOMPET -> '||TO_CHAR(C_ITENS_TRAB.DTFINCOMPET, 'DD/MM/YYYY')||'  V_DTFINCOMPET -> '||V_DTFINCOMPET);

            IF (V_CONT_X = 1 OR
                C_ITENS_TRAB.NRGRUPOFATURA <> V_NRGRUPOFATURA OR
                C_ITENS_TRAB.CDFILIALFATURA <> V_CDFILIALFATURA OR
                C_ITENS_TRAB.NRPARCFATURA <> V_NRPARCFATURA OR
                TO_CHAR(C_ITENS_TRAB.DTINICOMPET, 'DD/MM/YYYY') <> V_DTINICOMPET OR
                TO_CHAR(C_ITENS_TRAB.DTFINCOMPET, 'DD/MM/YYYY') <> V_DTFINCOMPET) THEN

              --  RAISE_APPLICATION_ERROR(-20010,'oeeeeee');

                V_TIPO := 'I';
            END IF;

            IF (V_TIPO = 'I') THEN

                NOVO_CODIGO_SC('FCT_MEDICAOFATURA', V_NRMEDICAOFATURA, 1, P_NRORG);

                INSERT INTO FCT_MEDICAOFATURA (
                    NRMEDICAOFATURA , NRSEQCONTRATO    , NRGRUPOFATURA  ,
                    CDFILIALFATURA  , NRPARCFATURA     , IDSITUACAO     ,
                    DTINICOMPET     , DTFINCOMPET      , DTLIMITEAPU    ,
                    DTVENCIMENTO    , NRDIASVENCIMENTO , QTDIASFATUVENC ,
                    VRMEDICAO       , IDATIVO          , NRORG          ,
                    DTINCLUSAO      , NRORGINCLUSAO    , CDOPERINCLUSAO
                )
                VALUES (
                    V_NRMEDICAOFATURA           , P_NRSEQCONTRATO               , C_ITENS_TRAB.NRGRUPOFATURA  ,
                    C_ITENS_TRAB.CDFILIALFATURA , C_ITENS_TRAB.NRPARCFATURA     , '1'                         ,
                    C_ITENS_TRAB.DTINICOMPET    , C_ITENS_TRAB.DTFINCOMPET      , C_ITENS_TRAB.DTLIMITEAPU    ,
                    C_ITENS_TRAB.DTVENCIMENTO   , C_ITENS_TRAB.NRDIASVENCIMENTO , C_ITENS_TRAB.QTDIASFATUVENC ,
                    0                           , 'S'                           , P_NRORG                     ,
                    SYSDATE                     , P_NRORG                       , P_CDOPERADOR
                );

            END IF;

            NOVO_CODIGO_SC('FCT_ITMEDICAOFATURA', V_NRITMEDICAOFATURA, 1, P_NRORG);

            INSERT INTO FCT_ITMEDICAOFATURA (
                NRITMEDICAOFATURA,
                NRMEDICAOFATURA,
                NRSEQCONTRATO,
                NRITEMOCONTRATO,
                CDPRODFATURA,
                CDSERVORCA,
                IDSITUACAO,
                VRTOTITEMCONT,
                IDATIVO,
                NRORG,
                DTINCLUSAO,
                NRORGINCLUSAO,
                CDOPERINCLUSAO
            )
            VALUES (
                V_NRITMEDICAOFATURA,
                V_NRMEDICAOFATURA,
                P_NRSEQCONTRATO,
                C_ITENS_TRAB.NRITEMOCONTRATO,
                C_ITENS_TRAB.CDPRODFATURA,
                C_ITENS_TRAB.CDSERVORCA,
                '1',
                C_ITENS_TRAB.VRVENCIMENTO,
                'S',
                P_NRORG,
                SYSDATE,
                P_NRORG,
                P_CDOPERADOR
            );

            --Buscar o codigo da proposta que gerou o contrato
            BEGIN
                SELECT NRSEQORCAMENTO
                  INTO V_NRSEQORCAMENTO_ORIGEM
                  FROM FCT_REFEORCACONT
                 WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                   AND NRORG         = P_NRORG;
            EXCEPTION WHEN NO_DATA_FOUND THEN
                RAISE_APPLICATION_ERROR('-20001', 'CONTRATO_SEM_PROPOSTA');
            END;

            --Buscar os itens na proposta pra saber a medida variavel e sua quantidade
            FOR C_MEDIDAS IN (                
                SELECT REL.IDELEMENTORAIZ,
                       REL.CDTPMEDIDAVARIAVEL,
                       REL.QTMEDIDAVARIAVEL,
                       REL.QTFRANQUIA,
                       VAR.IDMULTIPVARIACAO
                  FROM FCT_RELACMEDIDAPROPOSTA REL
                  LEFT JOIN FCT_VARPRECBASESERVORCA VAR
                    ON REL.NRSEQORCAMENTO     = VAR.NRSEQORCAMENTO
                   AND REL.CDTPMEDIDAVARIAVEL = VAR.CDTPMEDIDAVARIAVEL
                   AND REL.NRORG              = VAR.NRORG
                 WHERE REL.NRSEQORCAMENTO = V_NRSEQORCAMENTO_ORIGEM
                   AND REL.NRORG          = P_NRORG
                   AND VAR.CDSERVORCA     = C_ITENS_TRAB.CDSERVORCA
                   AND REL.QTMEDIDAVARIAVEL BETWEEN VAR.QTMEDIDAINIVARIACAO AND VAR.QTMEDIDAFIMVARIACAO
                 ORDER BY REL.IDELEMENTORAIZ
            ) LOOP

                NOVO_CODIGO_SC('FCT_MEDVARMEDICAOFATURA', V_NRMEDVARMEDICAOFATURA, 1, P_NRORG);

                INSERT INTO FCT_MEDVARMEDICAOFATURA (
                    NRMEDVARMEDICAOFATURA,
                    NRMEDICAOFATURA,
                    IDELEMENTORAIZ,
                    CDSERVORCA,
                    CDTPMEDIDAVARIAVEL,
                    QTMEDIDAVARIAVEL,
                    QTMEDIDAMEDICAO,
                    QTFRANQUIA,
                    IDMULTIPVARIACAO,
                    IDATIVO,
                    NRORG,
                    DTINCLUSAO,
                    NRORGINCLUSAO,
                    CDOPERINCLUSAO
                )
                VALUES (
                    V_NRMEDVARMEDICAOFATURA,
                    V_NRMEDICAOFATURA,
                    C_MEDIDAS.IDELEMENTORAIZ,
                    C_ITENS_TRAB.CDSERVORCA,
                    C_MEDIDAS.CDTPMEDIDAVARIAVEL,
                    C_MEDIDAS.QTMEDIDAVARIAVEL,
                    C_MEDIDAS.QTMEDIDAVARIAVEL - C_MEDIDAS.QTFRANQUIA,
                    C_MEDIDAS.QTFRANQUIA,
                    C_MEDIDAS.IDMULTIPVARIACAO,
                    'S',
                    P_NRORG,
                    SYSDATE,
                    P_NRORG,
                    P_CDOPERADOR
                );

            END LOOP;

            V_NRGRUPOFATURA  := C_ITENS_TRAB.NRGRUPOFATURA;
            V_CDFILIALFATURA := C_ITENS_TRAB.CDFILIALFATURA;
            V_NRPARCFATURA   := C_ITENS_TRAB.NRPARCFATURA;
            V_DTINICOMPET    := TO_CHAR(C_ITENS_TRAB.DTINICOMPET, 'DD/MM/YYYY');
            V_DTFINCOMPET    := TO_CHAR(C_ITENS_TRAB.DTFINCOMPET, 'DD/MM/YYYY');
            V_CONT_X         := V_CONT_X+1;

        END IF;

    END LOOP;

    DELETE FROM FCT_TRAB_ITFATURACONT
     WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
       AND NRORG         = P_NRORG;

    COMMIT;

END;