CREATE OR REPLACE PROCEDURE FCT_PREENCHE_DADOS_NF
  (P_NRORG IN NUMBER,
   P_CDFILIAL IN VARCHAR2,
   P_NRLANCTONF IN VARCHAR2,
   P_NRVENCPREVCONT IN NUMBER,
   P_NRMEDICAOAPU IN NUMBER,
   P_CDOPERINCLUSAO IN VARCHAR2)
AS
  /*PARÂMETROS*/

V_NRDADOSNF         NUMBER;         /* Sequencial da tabela FCT_DADOSNF (Novo código) */
V_NRVENCPREVCONT    NUMBER;         /* Vencimento */
V_NRSEQCONTRATO     NUMBER;         /* Contrato */
V_NRGRUPOFATURA     NUMBER;         /* Grupo de Faturamento */
V_NRPARCNEGOCIO     NUMBER;         /* Parceiro de Negócio do Vencimento */
V_NRESTRUTURAM      NUMBER;         /* Local de Atendimento */
V_LOCALATENDIMENTO  NUMBER;         /* Parceiro de Negócio do Local de Atendimento */
V_NRENDERECOPARC    NUMBER;         /* Endereço para NF */
V_CDTIPOENDERECO    VARCHAR2(30);   /* Tipo de Endereço para NF */
V_CDPAIS            VARCHAR2(4);    /* País para NF */
V_SGESTADO          VARCHAR2(2);    /* Estado para NF */
V_CDMUNICIPIO       VARCHAR2(5);    /* Municipio para NF */
V_CDBAIRRO          VARCHAR2(10);   /* Bairro para NF */
V_CDLOGRADOURO      VARCHAR2(4);    /* Logradouro para NF */
V_NMBAIRROENDERECO  VARCHAR2(100);  /* Nome do Bairro para NF */
V_DSCOMPLEENDERECO  VARCHAR2(100);  /* Complemento do Endereço para NF */
V_NRCEPENDERECO     VARCHAR2(15);   /* CEP do Endereço para NF */
V_DSENDERECO        VARCHAR2(250);  /* Descrição do Endereço para NF */
V_NRIMOVELENDERECO  VARCHAR2(10);   /* Nr. Imóvel do endereço para NF */
V_DSREFERENCIANOTA  VARCHAR2(2000); /* Referencia para NF */
V_CDCLIENTE         VARCHAR2(21);   /* Cliente do Parceiro do Vencimento */
V_VALIDAENDLOCAL    NUMBER;         /* Variável para Validar o Endereço */
V_DTINICOMPET       VARCHAR2(30);   /* Data Inicial de Competência do Vencimento */
V_DTFINCOMPET       VARCHAR2(30);   /* Data Final de Competência do Vencimento */
V_DESCRICAOMED      VARCHAR2(4000); /* Descrição da Medição */
V_CDEMPRESA         EMPRESA.CDEMPRESA%TYPE;
V_IDNATUOPEREMPR    EMPRESA.IDNATUOPEREMPR%TYPE;

BEGIN

   /* 1 - RECEBE OS DADOS DE VENCIMENTO */
   IF P_NRVENCPREVCONT IS NOT NULL THEN
     BEGIN
       SELECT NRVENCPREVCONT, NRSEQCONTRATO, NRGRUPOFATURA, NRPARCNEGOCIO, TO_CHAR(DTINICOMPET,'DD/MM/YYYY'), TO_CHAR(DTFINCOMPET, 'DD/MM/YYYY'), NULL AS ESTRUTURAM, NULL AS DESCRICAOMEDICAO
         INTO V_NRVENCPREVCONT, V_NRSEQCONTRATO, V_NRGRUPOFATURA, V_NRPARCNEGOCIO, V_DTINICOMPET, V_DTFINCOMPET,  V_NRESTRUTURAM, V_DESCRICAOMED
         FROM FCT_VENCPREVCONT
        WHERE NRVENCPREVCONT = P_NRVENCPREVCONT
          AND NRORG = P_NRORG;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN BEGIN
          V_NRVENCPREVCONT := NULL;
          V_NRSEQCONTRATO := NULL;
          V_NRGRUPOFATURA := NULL;
          V_NRPARCNEGOCIO := NULL;
          V_DTINICOMPET := NULL;
          V_DTFINCOMPET := NULL;
          V_NRESTRUTURAM := NULL;
          V_DESCRICAOMED := NULL;
       END;
    END;
  ELSE
    BEGIN
      SELECT FCT_MEDICAOAPU.NRMEDICAOAPU, FCT_MEDICAOAPU.NRSEQCONTRATO, NRGRUPOFATURA, FCT_CONTRATO.NRPARCNEGOCIO, TO_CHAR(FCT_MEDICAOAPU.DTINICOMPET,'DD/MM/YYYY'), TO_CHAR(FCT_MEDICAOAPU.DTFINCOMPET, 'DD/MM/YYYY'), FCT_MEDICAOAPU.NRESTRUTURAM, FCT_MEDICAOAPU.DESCRICAOMEDICAO
       INTO V_NRVENCPREVCONT, V_NRSEQCONTRATO, V_NRGRUPOFATURA, V_NRPARCNEGOCIO, V_DTINICOMPET, V_DTFINCOMPET, V_NRESTRUTURAM, V_DESCRICAOMED
       FROM FCT_MEDICAOAPU
       LEFT JOIN FCT_CONTRATO
       ON FCT_MEDICAOAPU.NRSEQCONTRATO = FCT_CONTRATO.NRSEQCONTRATO
       AND FCT_MEDICAOAPU.NRORG = FCT_CONTRATO.NRORG
      WHERE FCT_MEDICAOAPU.NRMEDICAOAPU = P_NRMEDICAOAPU
        AND IDTPMEDIAPU = 'E'
        AND FCT_MEDICAOAPU.NRORG = P_NRORG;
     EXCEPTION
        WHEN NO_DATA_FOUND THEN BEGIN
          V_NRVENCPREVCONT := NULL;
          V_NRSEQCONTRATO := NULL;
          V_NRGRUPOFATURA := NULL;
          V_NRPARCNEGOCIO := NULL;
          V_DTINICOMPET := NULL;
          V_DTFINCOMPET := NULL;
          V_NRESTRUTURAM := NULL;
          V_DESCRICAOMED := NULL;
       END;
    END;
  END IF;
   /* 2 - VALIDA PARCEIRO DE NEGÓCIO.  SE NÃO ESTIVER PREENCHIDO NO VENCIMENTO, PEGA O PARCEIRO DE NEGÓCIO DO CONTRATO. */
   IF V_NRPARCNEGOCIO IS NULL THEN
      BEGIN
         SELECT NRPARCNEGOCIO
           INTO V_NRPARCNEGOCIO
           FROM FCT_CONTRATO
          WHERE NRSEQCONTRATO = V_NRSEQCONTRATO
            AND NRORG = P_NRORG;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_NRPARCNEGOCIO := NULL;
      END;
   END IF;

   /* 3 - RECEBE O LOCAL DE ATENDIMENTO */
   IF V_NRGRUPOFATURA IS NOT NULL THEN
      BEGIN
         SELECT NRESTRUTURAM
           INTO V_NRESTRUTURAM
           FROM FCT_GRUPOFATURA
          WHERE NRGRUPOFATURA = V_NRGRUPOFATURA
            AND NRORG = P_NRORG;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_NRESTRUTURAM := NULL;
      END;
   END IF;

   /* 4 - VALIDA O LOCAL DE ATENDIMENTO */

   IF V_NRESTRUTURAM IS NULL THEN
      BEGIN
         SELECT MAX(NRESTRUTURAM)
           INTO V_NRESTRUTURAM
           FROM FCT_RATEIOITVENCIMENTO
          WHERE NRVENCPREVCONT = P_NRVENCPREVCONT
            AND NRORG = P_NRORG;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_NRESTRUTURAM := NULL;
      END;
   END IF;

    /* 5 - RECEBE O ENDEREÇO */

   IF V_NRESTRUTURAM IS NOT NULL THEN
      BEGIN
         SELECT NRPARCNEGOCIO
           INTO V_LOCALATENDIMENTO
           FROM ESTRUTURAM
          WHERE NRESTRUTURAM = V_NRESTRUTURAM
            AND NRORG = P_NRORG;
      END;

      IF P_NRMEDICAOAPU IS NOT NULL THEN
        BEGIN
           SELECT MAX(NRGRUPOFATURA)
           INTO V_NRGRUPOFATURA
           FROM FCT_GRUPOFATURA
          WHERE NRESTRUTURAM = V_NRESTRUTURAM
            AND NRORG = P_NRORG;
        END;
      END IF;
   ELSE
      V_LOCALATENDIMENTO := NULL;
   END IF;


   /* VALIDA SE EXISTE ENDEREÇO NO LOCAL DE ATENDIMENTO */
   SELECT COUNT(*)
     INTO V_VALIDAENDLOCAL
     FROM ENDERECOPARC
    WHERE NRPARCNEGOCIO = V_LOCALATENDIMENTO
      AND CDTIPOENDERECO = 'PRINCIPAL'
      AND NRORG = P_NRORG;

   IF V_VALIDAENDLOCAL > 0 THEN

      /* 5.1 - TENTA RECEBER O ENDEREÇO DO LOCAL DE ATENDIMENTO */

      BEGIN
         SELECT NRENDERECOPARC, CDTIPOENDERECO, CDPAIS, SGESTADO, CDMUNICIPIO, CDBAIRRO, CDLOGRADOURO,
                NMBAIRROENDERECO, DSCOMPLEENDERECO, NRCEPENDERECO, DSENDERECO, NRIMOVELENDERECO, DSREFERENCIAENDE
           INTO V_NRENDERECOPARC, V_CDTIPOENDERECO, V_CDPAIS, V_SGESTADO, V_CDMUNICIPIO, V_CDBAIRRO, V_CDLOGRADOURO,
                V_NMBAIRROENDERECO, V_DSCOMPLEENDERECO, V_NRCEPENDERECO, V_DSENDERECO, V_NRIMOVELENDERECO, V_DSREFERENCIANOTA
           FROM ENDERECOPARC
          WHERE NRPARCNEGOCIO = V_LOCALATENDIMENTO
            AND CDTIPOENDERECO = 'PRINCIPAL'
            AND NRORG = P_NRORG;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN BEGIN
            V_NRENDERECOPARC := NULL;
            V_CDTIPOENDERECO := NULL;
            V_CDPAIS := NULL;
            V_SGESTADO := NULL;
            V_CDMUNICIPIO := NULL;
            V_CDBAIRRO := NULL;
            V_CDLOGRADOURO := NULL;
            V_NMBAIRROENDERECO := NULL;
            V_DSCOMPLEENDERECO := NULL;
            V_NRCEPENDERECO := NULL;
            V_DSENDERECO := NULL;
            V_NRIMOVELENDERECO := NULL;
            V_DSREFERENCIANOTA := NULL;
         END;
      END;
   ELSE
      /* 5.2 - CASO NÃO CONSEIGA REBECER O ENDEREÇO DO LOCAL DE ATENDIMENTO, PEGA O ENDEREÇO DO REGISTRO DE
                CLIENTE DO PARCEIRO DO VENCIMENTO (ENDEFILI)  */
      BEGIN
         SELECT CDCLIENTE
           INTO V_CDCLIENTE
           FROM CLIENTE
          WHERE NRPARCNEGOCIO = V_NRPARCNEGOCIO
            AND NRORG = P_NRORG
            AND ROWNUM = 1
          ORDER BY DTULTATU DESC;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDCLIENTE := NULL;
      END;

      IF V_CDCLIENTE IS NOT NULL THEN
          BEGIN
             SELECT NRENDERECOPARC, 'PRINCIPAL', CDPAIS, SGESTADO, CDMUNICIPIO, CDBAIRRO, NULL,
                    NMBAIRCLIE, DSCOMPENDCLI, NRCEPCLIE, DSENDECLIE, NULL, NULL
               INTO V_NRENDERECOPARC, V_CDTIPOENDERECO, V_CDPAIS, V_SGESTADO, V_CDMUNICIPIO, V_CDBAIRRO, V_CDLOGRADOURO,
                    V_NMBAIRROENDERECO, V_DSCOMPLEENDERECO, V_NRCEPENDERECO, V_DSENDERECO, V_NRIMOVELENDERECO, V_DSREFERENCIANOTA
               FROM ENDECLIE
              WHERE CDCLIENTE = V_CDCLIENTE
                AND IDTPENDECLIE = 'P'
                AND NRORG = P_NRORG;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN BEGIN
                V_NRENDERECOPARC := NULL;
                V_CDTIPOENDERECO := NULL;
                V_CDPAIS := NULL;
                V_SGESTADO := NULL;
                V_CDMUNICIPIO := NULL;
                V_CDBAIRRO := NULL;
                V_CDLOGRADOURO := NULL;
                V_NMBAIRROENDERECO := NULL;
                V_DSCOMPLEENDERECO := NULL;
                V_NRCEPENDERECO := NULL;
                V_DSENDERECO := NULL;
                V_NRIMOVELENDERECO := NULL;
                V_DSREFERENCIANOTA := NULL;
             END;
          END;
      ELSE
          /* 5.3 - CASO NÃO CONSEIGA REBECER O ENDEREÇO DO LOCAL DE ATENDIMENTO, PEGA O ENDEREÇO DO PARCEIRO DO VENCIMENTO (ENDERECOPARC) */
          BEGIN
             SELECT NRENDERECOPARC, CDTIPOENDERECO, CDPAIS, SGESTADO, CDMUNICIPIO, CDBAIRRO, CDLOGRADOURO,
                    NMBAIRROENDERECO, DSCOMPLEENDERECO, NRCEPENDERECO, DSENDERECO, NRIMOVELENDERECO, DSREFERENCIAENDE
               INTO V_NRENDERECOPARC, V_CDTIPOENDERECO, V_CDPAIS, V_SGESTADO, V_CDMUNICIPIO, V_CDBAIRRO, V_CDLOGRADOURO,
                    V_NMBAIRROENDERECO, V_DSCOMPLEENDERECO, V_NRCEPENDERECO, V_DSENDERECO, V_NRIMOVELENDERECO, V_DSREFERENCIANOTA
               FROM ENDERECOPARC
              WHERE NRPARCNEGOCIO = V_NRPARCNEGOCIO
                AND CDTIPOENDERECO = 'PRINCIPAL'
                AND NRORG = P_NRORG;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN BEGIN
                V_NRENDERECOPARC := NULL;
                V_CDTIPOENDERECO := NULL;
                V_CDPAIS := NULL;
                V_SGESTADO := NULL;
                V_CDMUNICIPIO := NULL;
                V_CDBAIRRO := NULL;
                V_CDLOGRADOURO := NULL;
                V_NMBAIRROENDERECO := NULL;
                V_DSCOMPLEENDERECO := NULL;
                V_NRCEPENDERECO := NULL;
                V_DSENDERECO := NULL;
                V_NRIMOVELENDERECO := NULL;
                V_DSREFERENCIANOTA := NULL;
             END;
          END;
      END IF;
   END IF;

   /* 6 - INSERE OS DADOS NA FCT_DADOSNF */
   IF V_DESCRICAOMED IS NOT NULL THEN

       V_DSREFERENCIANOTA := V_DESCRICAOMED;

   END IF;

   IF V_DSREFERENCIANOTA IS NOT NULL THEN

      V_DSREFERENCIANOTA:= V_DSREFERENCIANOTA||CHR(13)||' PERIODO: '||V_DTINICOMPET||' A '||V_DTFINCOMPET;

   END IF;


   IF V_NRVENCPREVCONT IS NOT NULL THEN

      SELECT E.CDEMPRESA, E.IDNATUOPEREMPR
        INTO V_CDEMPRESA, V_IDNATUOPEREMPR
        FROM EMPRESA E
       INNER JOIN FILIAL F
          ON E.CDEMPRESA = F.CDEMPRESA
         AND E.NRORG     = F.NRORG
       WHERE F.CDFILIAL = P_CDFILIAL
        AND F.NRORG     = P_NRORG;

      IF (V_IDNATUOPEREMPR = '01') THEN
          SELECT CDPAIS, SGESTADO, CDMUNICIPIO
            INTO V_CDPAIS, V_SGESTADO, V_CDMUNICIPIO
            FROM EMPRESA
           WHERE CDEMPRESA = V_CDEMPRESA
             AND NRORG     = P_NRORG;
      END IF;

      NOVO_CODIGO_NT('NRDADOSNF', V_NRDADOSNF, 1, P_NRORG);

      IF V_NRDADOSNF IS NOT NULL THEN
         INSERT INTO FCT_DADOSNF (NRDADOSNF, CDFILIAL, NRLANCTONF, NRSEQCONTRATO, NRPARCNEGOCIO, NRVENCPREVCONT, NRGRUPOFATURA,
                                  NRESTRUTURAM, NRAPURACAO, NRENDERECOPARC, CDTIPOENDERECO, CDPAIS, SGESTADO, CDMUNICIPIO, CDBAIRRO,
                                  CDLOGRADOURO, DSENDERECO, NRIMOVELENDERECO, NMBAIRROENDERECO, DSCOMPLEENDERECO, NRCEPENDERECO,
                                  DSREFERENCIANOTA, NRORG, IDATIVO, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                          VALUES (V_NRDADOSNF, P_CDFILIAL, P_NRLANCTONF, V_NRSEQCONTRATO, V_NRPARCNEGOCIO, V_NRVENCPREVCONT, V_NRGRUPOFATURA,
                                  V_NRESTRUTURAM, NULL, V_NRENDERECOPARC, V_CDTIPOENDERECO, V_CDPAIS, V_SGESTADO, V_CDMUNICIPIO, V_CDBAIRRO,
                                  V_CDLOGRADOURO, V_DSENDERECO, V_NRIMOVELENDERECO, V_NMBAIRROENDERECO, V_DSCOMPLEENDERECO, V_NRCEPENDERECO,
                                  V_DSREFERENCIANOTA, P_NRORG, 'S', SYSDATE, P_NRORG, P_CDOPERINCLUSAO);
      END IF;
   END IF;
END;