CREATE OR REPLACE PROCEDURE EFETIVA_SERVICOPROPCOM
(
   P_NRSERVICOPROPCOM IN NUMBER,
   P_CDFILIAL IN VARCHAR2,
   P_CDSERVFILI IN VARCHAR2,
   P_DTINICARD IN DATE,
   P_NUM_MESES IN NUMBER,
   P_CDOPERADOR IN VARCHAR2,
   P_NRORG IN NUMBER,
   P_CDFILIALLOGADA IN VARCHAR2,   
   P_LISTAERROS OUT VARCHAR2
)
AS
   V_QTDE NUMBER;
   V_IDVERSAOPROPCOM VARCHAR2(30);
   V_IDSERVICOPROPCOM VARCHAR2(30);
   V_NRCARDAPIOTRAB NUMBER;   
   V_INSERE_POR_SERVICO VARCHAR2(1);
   V_CDFILAUXPRAT VARCHAR2(4);
   V_SEQ NUMBER;
   V_PAG NUMBER;
   V_NRPORCIONAMENTO NUMBER;
   V_NRGRAMATURACARDBASE NUMBER;
   V_NRDETALHESERVPROPCOM NUMBER;
   V_NRTIPOCONTRATO NUMBER;
   V_NRTIPOPUBLICO NUMBER;
   V_NRPADRAOQUALIDADE NUMBER;
   V_VRCUSTO FLOAT;
   V_I NUMBER;
   V_J NUMBER;
   V_NUM_CARD NUMBER;
   V_NUM_DIAS_CARD NUMBER;
   V_NUM_DIAS_MES NUMBER;
   V_DATA DATE;   
   V_MAX_SEMANA NUMBER;
   V_MAX_DIASEMANA NUMBER;
   V_DIA NUMBER;
   V_SEMANA NUMBER;
   V_DTCUSTO DATE;
   V_NRDIACARDTRAB NUMBER; 
   V_QTCOMENSAIS FLOAT;
   V_NRCARDAPIO VARCHAR2(10);   
   V_IDCARDIAUTIL VARCHAR2(1);
   V_CONTFERIFILI NUMBER;
   V_IDTIPOSERV VARCHAR2(1);
   V_QTCOMESTISEG FLOAT;
   V_QTCOMESTITER FLOAT;
   V_QTCOMESTIQUA FLOAT;
   V_QTCOMESTIQUI FLOAT;
   V_QTCOMESTISEX FLOAT;
   V_QTCOMESTISAB FLOAT;
   V_QTCOMESTIDOM FLOAT;
   V_QTCOMESTIFER FLOAT;

BEGIN
--=========================================================
--=== Validação inicial
--=========================================================
   SELECT COUNT(1), MAX(IDTIPOSERV)
     INTO V_QTDE, V_IDTIPOSERV
     FROM SERVICO S          
    WHERE S.CDFILIAL = P_CDFILIAL
      AND S.CDSERVFILI = P_CDSERVFILI;

   IF V_QTDE = 0 THEN
      -- Operação bloqueada. Serviço de planejamento informado não existe na filial de destino.
      RAISE_APPLICATION_ERROR(-20000, MSG('TCOPROC_SERVICOPLAN_N_EXISTE'));
   ELSIF V_IDTIPOSERV <> 'N' THEN
      -- Operação bloqueada. Serviço de planejamento informado não é do tipo Corporativo(Restaurante).
      RAISE_APPLICATION_ERROR(-20000, MSG('TCOPROC_SERVICOPLAN_N_VALIDO'));
   END IF;

   SELECT MAX(V.IDVERSAOPROPCOM), MAX(S.IDSERVICOPROPCOM), MAX(D.NRCARDAPIOTRAB), MAX(S.NRDETALHESERVPROPCOM),
          MAX(P.NRTIPOCONTRATO), MAX(S.NRTIPOPUBLICO), MAX(S.NRPADRAOQUALIDADE),
          MAX(CUSTO_PERC_CARDTRAB(C.NRCARDAPIOTRAB)), MAX(C.DTCUSTO)
     INTO V_IDVERSAOPROPCOM, V_IDSERVICOPROPCOM, V_NRCARDAPIOTRAB, V_NRDETALHESERVPROPCOM,
          V_NRTIPOCONTRATO, V_NRTIPOPUBLICO, V_NRPADRAOQUALIDADE, 
          V_VRCUSTO, V_DTCUSTO
     FROM SERVICOPROPCOM S
          INNER JOIN VERSAOPROPCOM V ON V.NRVERSAOPROPCOM = S.NRVERSAOPROPCOM
          INNER JOIN PROPOSTACOMERCIAL P ON P.NRPROPOSTACOMERCIAL = V.NRPROPOSTACOMERCIAL
          INNER JOIN DETALHESERVPROPCOM D ON D.NRDETALHESERVPROPCOM = S.NRDETALHESERVPROPCOM
          INNER JOIN CARDAPIOTRAB C ON C.NRCARDAPIOTRAB = D.NRCARDAPIOTRAB
    WHERE S.NRSERVICOPROPCOM = P_NRSERVICOPROPCOM;

    IF V_NRCARDAPIOTRAB IS NULL THEN
       -- Operação bloqueada. Serviço da proposta informado não é existe ou não foi calculado.
       RAISE_APPLICATION_ERROR(-20000, MSG('TCOPROC_SERVICOPROP_N_EXISTE_OU_N_CALC'));
    END IF;

   IF V_IDVERSAOPROPCOM <> 'APROVADA' THEN
      -- Operação bloqueada. Simulação vinculada ao serviço não está aprovada.
      RAISE_APPLICATION_ERROR(-20000, MSG('TCOPROC_VERSAO_SERV_N_APROVADA'));
   END IF;

   IF V_IDSERVICOPROPCOM = 'EFETIVADO' THEN
      -- Operação bloqueada. Serviço da proposta já foi efetivado.
      RAISE_APPLICATION_ERROR(-20000, MSG('TCOPROC_SERVICOPROP_JA_EFETIVADO'));
   END IF;

   SELECT COUNT(1)
     INTO V_QTDE
     FROM CARDADIA
    WHERE CDFILIAL = P_CDFILIAL
      AND CDSERVFILI = P_CDSERVFILI
      AND DTCARDAPIO BETWEEN P_DTINICARD AND LAST_DAY(ADD_MONTHS(P_DTINICARD, (NVL(P_NUM_MESES, 1) - 1)));

   IF V_QTDE > 0 THEN
      -- Operação bloqueada. Serviço de planejamento informado já possui cardápio cadastrado no sistema para data informada.
      RAISE_APPLICATION_ERROR(-20000, MSG('TCOPROC_SERVPLAN_JA_POSSUI_CARD'));
   END IF;

   -- Valida informações do cardápio conforme
   VALIDA_CARDTRAB(V_NRCARDAPIOTRAB,P_NRORG, P_CDOPERADOR, P_CDFILIALLOGADA, P_LISTAERROS);
   IF P_LISTAERROS IS NOT NULL THEN
      RETURN;
   END IF;

   /* Verifica se o parâmetro "Verifica custo padrão na Montagem do Cardapio" está marcado */
   SELECT MAX(IDCARDIAUTIL)
     INTO V_IDCARDIAUTIL
     FROM PARAMPLANEJA
    WHERE CDFILIAL = P_CDFILIAL;   
--=========================================================
--=== Revisão dos pratos na filial
--=========================================================
   FOR C_PRATOS IN
   (
      SELECT DISTINCT P.CDFILAUXPRAT, P.CDPRATO, P.IDATIVO
        FROM RECEPRATCARDTRAB R
             INNER JOIN PRATO P ON P.CDFILAUXPRAT = R.CDFILAUXPRAT AND
                                   P.CDPRATO = R.CDPRATO
             INNER JOIN PRODUTO PT ON PT.CDPRODUTO = R.CDPRODUTO
       WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
   ) LOOP
      V_INSERE_POR_SERVICO := 'N';

      V_CDFILAUXPRAT := 'P';
      IF C_PRATOS.CDFILAUXPRAT <> 'P' THEN
         V_CDFILAUXPRAT := P_CDFILIAL;
      END IF;
      -- Verifica se : Existe receita na filial
      SELECT COUNT(1)
        INTO V_QTDE
        FROM RECEFILI
       WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
         AND CDPRATO = C_PRATOS.CDPRATO
         AND CDFILIAL = P_CDFILIAL;

      IF V_QTDE > 0 THEN
         SELECT COUNT(1)
           INTO V_QTDE
           FROM (
                  SELECT R.CDPRODUTO,
                         R.QTPRODRECCARDTRAB AS QTPRONTA,
                         R.VRPEFATCOCCARDTRAB AS VRPEFATCOC,
                         R.VRPEFATCORCARDTRAB AS VRPEFATCOR,
                         R.SGUNIDADE,                         
                         R.QTBRUTACARDTRABUNR AS QTBRUTA,
                         R.IDPRODBASECARDTRAB AS IDPRODBASE,
                         R.IDQTDEFIXCARDTRAB AS IDQTDEFIX
                    FROM RECEPRATCARDTRAB R 
                   WHERE R.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                     AND R.CDFILAUXPRAT = V_CDFILAUXPRAT
                     AND R.CDPRATO = C_PRATOS.CDPRATO
                ) RC
                FULL OUTER JOIN
                (
                  SELECT R.CDPRODUTO,
                         NVL(R.QTPRODRECLOC, 0.00) AS QTPRONTA,
                         NVL(R.VRPEFATCOCLO, 0.00) AS VRPEFATCOC,
                         NVL(R.VRPEFATCORLO, 0.00) AS VRPEFATCOR,
                         NVL(R.SGUNIDADE, P.SGUNIDADE) AS SGUNIDADE,
                         NVL(R.QTBRUTALOUNR, 0.00) AS QTBRUTA,
                         NVL(R.IDPRODBASELO, 'N') AS IDPRODBASE,
                         NVL(R.IDQTDEFIXLO, 'N') AS IDQTDEFIX
                    FROM RECEFILI R
                         INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                   WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                     AND R.CDPRATO = C_PRATOS.CDPRATO
                     AND R.CDFILIAL = P_CDFILIAL
                ) RF ON RF.CDPRODUTO = RC.CDPRODUTO
          WHERE RC.CDPRODUTO IS NULL OR
                RF.CDPRODUTO IS NULL OR
                RC.QTPRONTA <> RF.QTPRONTA OR
                --RC.VRPEFATCOC <> RF.VRPEFATCOC OR
                --RC.VRPEFATCOR <> RF.VRPEFATCOR OR
                RC.SGUNIDADE <> RF.SGUNIDADE OR
                RC.QTBRUTA <> RF.QTBRUTA OR
                RC.IDPRODBASE <> RF.IDPRODBASE OR
                RC.IDQTDEFIX <> RF.IDQTDEFIX;
         IF V_QTDE > 0 THEN
            V_INSERE_POR_SERVICO := 'S';
         ELSE
            /* Se o prato na filial já possui receita, e ela é idêntica, 
               segue para a inclusão de outro prato*/
            CONTINUE;
         END IF;
      END IF;

      FOR C_RECEITA IN
      (
         SELECT R.CDPRODUTO,
                R.QTPRODRECCARDTRAB AS QTPRONTA,
                R.VRPEFATCOCCARDTRAB AS VRPEFATCOC,
                R.VRPEFATCORCARDTRAB AS VRPEFATCOR,
                R.SGUNIDADE,                         
                R.QTBRUTACARDTRABUNR AS QTBRUTA,
                R.IDPRODBASECARDTRAB AS IDPRODBASE,
                R.IDQTDEFIXCARDTRAB AS IDQTDEFIX
           FROM RECEPRATCARDTRAB R 
          WHERE R.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
            AND R.CDFILAUXPRAT = V_CDFILAUXPRAT
            AND R.CDPRATO = C_PRATOS.CDPRATO
      ) LOOP
         IF V_INSERE_POR_SERVICO = 'N' THEN
            -- Insere receita na filial
            INSERT INTO RECEFILI
            (CDFILAUXPRAT, CDPRATO, 
             CDFILIAL, CDPRODUTO,
             QTPRODRECLOC, SGUNIDADE,
             VRPEFATCOCLO, VRPEFATCORLO,
             QTBRUTALOUNR, QTBRUTALO, 
             IDPRODBASELO, IDQTDEFIXLO,
             VRPEFATNUTLO, QTCALCNUTRLO)
            VALUES
            (V_CDFILAUXPRAT, C_PRATOS.CDPRATO,
             P_CDFILIAL, C_RECEITA.CDPRODUTO,
             C_RECEITA.QTBRUTA, C_RECEITA.SGUNIDADE,
             0, 0,
             C_RECEITA.QTBRUTA, C_RECEITA.QTBRUTA,
             C_RECEITA.IDPRODBASE, C_RECEITA.IDQTDEFIX,
             100, C_RECEITA.QTPRONTA);
         ELSE
            -- Insere receita no serviço da filial
            DELETE FROM RECESERV WHERE CDFILAUXPRAT = V_CDFILAUXPRAT AND
                                       CDPRATO = C_PRATOS.CDPRATO AND
                                       CDFILIAL = P_CDFILIAL AND
                                       CDSERVFILI = P_CDSERVFILI;
            INSERT INTO RECESERV
            (CDFILAUXPRAT, CDPRATO, 
             CDFILIAL, CDSERVFILI, CDPRODUTO,
             QTPRODRECSER, SGUNIDADE,
             VRPEFATCOCSE, VRPEFATCORSE,
             QTBRUTASEUNR, QTBRUTASE, 
             IDPRODBASESE, IDQTDEFIXSE,
             VRPEFATNUTSE, QTCALCNUTRSE)
            VALUES
            (V_CDFILAUXPRAT, C_PRATOS.CDPRATO,
             P_CDFILIAL, P_CDSERVFILI, C_RECEITA.CDPRODUTO,
             C_RECEITA.QTBRUTA, C_RECEITA.SGUNIDADE,
             0, 0,
             C_RECEITA.QTBRUTA, C_RECEITA.QTBRUTA,
             C_RECEITA.IDPRODBASE, C_RECEITA.IDQTDEFIX,
             100, C_RECEITA.QTPRONTA);
         END IF;
      END LOOP;

   END LOOP;
--=========================================================
--=== Substituição da configuração do serviço de destino
--=========================================================
   -- Apagar configuração atual
   DELETE FROM CONFCARD WHERE CDFILIAL = P_CDFILIAL AND
                              CDSERVFILI = P_CDSERVFILI;
   -- Inserir configuração do serviço
   V_SEQ := 1;
   V_PAG := 1;
   FOR C_CONFIGURACAO IN
   (
      SELECT C.CDTIPOPRAT, C.DSCOMPLEMENTO, C.IDCLASSIFICACAO, C.IDTEMPERATURA, T.CDGRTIPOPR
        FROM CONFIGCARDTRAB C
             INNER JOIN TIPOPRAT T ON T.CDTIPOPRAT = C.CDTIPOPRAT
       WHERE C.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
       ORDER BY C.NRORDEM
   ) LOOP
      SELECT MAX(NRPORCIONAMENTO), MAX(NRGRAMATURACARDBASE)
        INTO V_NRPORCIONAMENTO, V_NRGRAMATURACARDBASE
        FROM CONFGRUPOTPPROPCOM
       WHERE NRDETALHESERVPROPCOM = V_NRDETALHESERVPROPCOM
         AND CDGRTIPOPR = C_CONFIGURACAO.CDGRTIPOPR;

      INSERT INTO CONFCARD
      (CDFILIAL, CDSERVFILI, NRSEQCNFCARD,
       CDTIPOPRAT, IDOPCCNFCARD, 
       IDIMPCNFCARD, NRPAGCNFCARD, 
       VRPERCOMCARD, NRORDCNFCARD,
       DSCOMPLTP, NRPORCIONAMENTO,
       NRGRAMATURACARDBASE, IDCLASSIFICACAO,
       IDTEMPERATURA)
      VALUES
      (P_CDFILIAL, P_CDSERVFILI, V_SEQ,
       C_CONFIGURACAO.CDTIPOPRAT, 'N',
       'S', V_PAG,
       0, V_SEQ,
       SUBSTR(C_CONFIGURACAO.DSCOMPLEMENTO, 1, 15), V_NRPORCIONAMENTO,
       V_NRGRAMATURACARDBASE, C_CONFIGURACAO.IDCLASSIFICACAO,
       C_CONFIGURACAO.IDTEMPERATURA);

      V_SEQ := V_SEQ + 1;
      IF MOD(V_SEQ, 2) = 0 THEN
         V_PAG := 1;
      ELSE
         V_PAG := V_PAG + 1;
      END IF;
   END LOOP;

--=========================================================
--=== Informações no serviço de planejamento
--=========================================================
   --Determina o número de comensais dia
   V_QTCOMESTIDOM := NULL;
   V_QTCOMESTISEG := NULL;
   V_QTCOMESTITER := NULL;
   V_QTCOMESTIQUA := NULL;
   V_QTCOMESTIQUI := NULL;
   V_QTCOMESTISEX := NULL;
   V_QTCOMESTISAB := NULL;
   V_QTCOMESTIFER := NULL;
   FOR C_COMENSAIS IN
   (
      SELECT NRDIASEMANA, MAX(QTCOMENSAIS) AS QTCOMENSAIS
        FROM DIACARDTRAB
       WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
       GROUP BY NRDIASEMANA
   ) LOOP
      IF C_COMENSAIS.NRDIASEMANA = 1 THEN
         V_QTCOMESTIDOM := C_COMENSAIS.QTCOMENSAIS;
         V_QTCOMESTIFER := V_QTCOMESTIDOM;
      ELSIF C_COMENSAIS.NRDIASEMANA = 2 THEN
         V_QTCOMESTISEG := C_COMENSAIS.QTCOMENSAIS;
      ELSIF C_COMENSAIS.NRDIASEMANA = 3 THEN
         V_QTCOMESTITER := C_COMENSAIS.QTCOMENSAIS;
      ELSIF C_COMENSAIS.NRDIASEMANA = 4 THEN
         V_QTCOMESTIQUA := C_COMENSAIS.QTCOMENSAIS;
      ELSIF C_COMENSAIS.NRDIASEMANA = 5 THEN
         V_QTCOMESTIQUI := C_COMENSAIS.QTCOMENSAIS;
      ELSIF C_COMENSAIS.NRDIASEMANA = 6 THEN
      V_QTCOMESTISEX := C_COMENSAIS.QTCOMENSAIS;
      ELSIF C_COMENSAIS.NRDIASEMANA = 7 THEN
         V_QTCOMESTISAB := C_COMENSAIS.QTCOMENSAIS;
      END IF;
   END LOOP;

   UPDATE SERVICO
      SET NRTIPOCONTRATO = V_NRTIPOCONTRATO,
          NRTIPOPUBLICO = V_NRTIPOPUBLICO,
          NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE,
          NRSERVICOPROPCOM = P_NRSERVICOPROPCOM,
          QTCOMESTIDOM = V_QTCOMESTIDOM,
          QTCLIESTIDOM = V_QTCOMESTIDOM,
          QTCOMESTISEG = V_QTCOMESTISEG,
          QTCLIESTISEG = V_QTCOMESTISEG,
          QTCOMESTITER = V_QTCOMESTITER,
          QTCLIESTITER = V_QTCOMESTITER,
          QTCOMESTIQUA = V_QTCOMESTIQUA,
          QTCLIESTIQUA = V_QTCOMESTIQUA,
          QTCOMESTIQUI = V_QTCOMESTIQUI,
          QTCLIESTIQUI = V_QTCOMESTIQUI,
          QTCOMESTISEX = V_QTCOMESTISEX,
          QTCLIESTISEX = V_QTCOMESTISEX,
          QTCOMESTISAB = V_QTCOMESTISAB,
          QTCLIESTISAB = V_QTCOMESTISAB,
          QTCOMESTIFER = V_QTCOMESTIFER,
          QTCLIESTIFER = V_QTCOMESTIFER
    WHERE CDFILIAL = P_CDFILIAL
      AND CDSERVFILI = P_CDSERVFILI;   
--=========================================================
--=== Criação do cardápio do serviço (1 ou mais)
--=========================================================
   SELECT COUNT(1), MAX(NRSEMANA)
     INTO V_NUM_DIAS_CARD, V_MAX_SEMANA
     FROM DIACARDTRAB
    WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB;

   SELECT MAX(NRDIASEMANA)
     INTO V_MAX_DIASEMANA
     FROM DIACARDTRAB
    WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
      AND NRSEMANA = V_MAX_SEMANA;

   V_NUM_CARD := P_NUM_MESES;
   IF V_NUM_CARD IS NULL THEN
      V_NUM_CARD := 1;
   END IF;

   FOR V_I IN 1..V_NUM_CARD LOOP
      V_DATA := ADD_MONTHS(P_DTINICARD, (V_I - 1));
      -- Obtém número de dias do mês
      V_NUM_DIAS_MES := 1+TRUNC(LAST_DAY(V_DATA))-TRUNC(V_DATA,'MM');   
      V_SEMANA := 1;
      V_DIA := TO_NUMBER(TO_CHAR(V_DATA, 'D'));

    --=========================================================
    --=== Definição do custo padrão
    --=========================================================
         
      -- Apaga custo existente para o mês
      DELETE FROM CUSTPADR
       WHERE CDFILIAL = P_CDFILIAL
         AND CDSERVFILI = P_CDSERVFILI
         AND DTREFCUSPADR = V_DATA;         
      

      -- Insere o custo percapita do cardápio de trabalho para o mês atual
      INSERT INTO CUSTPADR
      (CDFILIAL, CDSERVFILI, DTREFCUSPADR,
       VRCUSTPADR)
      VALUES
      (P_CDFILIAL, P_CDSERVFILI, V_DATA,
       V_VRCUSTO);

      -- Insere o custo per capita por tipo de prato
      DELETE FROM CUSTPADRTP
       WHERE CDFILIAL = P_CDFILIAL
         AND CDSERVFILI = P_CDSERVFILI
         AND DTREFCUSPADR = V_DATA;


      FOR C_TIPOPRAT IN
      (
            SELECT C.CDTIPOPRAT, SUM( CUSTO_PERC_COL_CARDTRAB (C.NRCARDAPIOTRAB, C.NRCONFIGCARDTRAB) ) AS VRCUSTO
              FROM CONFIGCARDTRAB C
             WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
             GROUP BY C.CDTIPOPRAT
             ORDER BY C.CDTIPOPRAT
      ) LOOP
        INSERT INTO CUSTPADRTP
        (CDFILIAL, CDSERVFILI, CDTIPOPRAT, 
         VRCUSTPADRTP, DTREFCUSPADR)
        VALUES
        (P_CDFILIAL, P_CDSERVFILI, C_TIPOPRAT.CDTIPOPRAT, 
         C_TIPOPRAT.VRCUSTO, V_DATA);
      END LOOP;

    --=========================================================
    --=== Cabeçalho do Cardápio
    --=========================================================
      SELECT COUNT(1)
        INTO V_QTDE
        FROM CARDAMES
       WHERE CDFILIAL = P_CDFILIAL
         AND CDSERVFILI = P_CDSERVFILI
         AND DTMESCARDAPIO = V_DATA;

      IF V_QTDE = 0 THEN
         -- Insere CARDAMES
         INSERT INTO CARDAMES
         (CDFILIAL, CDSERVFILI, DTMESCARDAPIO,
          DTREFECUSTMES)
         VALUES
         (P_CDFILIAL, P_CDSERVFILI, V_DATA,
          V_DTCUSTO);
      ELSE
         UPDATE CARDAMES
            SET DTREFECUSTMES = V_DTCUSTO
          WHERE CDFILIAL = P_CDFILIAL
            AND CDSERVFILI = P_CDSERVFILI
            AND DTMESCARDAPIO = V_DATA;
      END IF;
      
      -- Insere configuração do cardápio
      V_SEQ := 1;
      V_PAG := 1;

      DELETE FROM CNFCAMES 
       WHERE CDFILIAL = P_CDFILIAL
         AND CDSERVFILI = P_CDSERVFILI
         AND DTREFECNFMES = V_DATA;
      FOR C_CONFIGURACAO IN
      (
         SELECT C.CDTIPOPRAT, C.DSCOMPLEMENTO, C.IDCLASSIFICACAO, C.IDTEMPERATURA, T.CDGRTIPOPR
           FROM CONFIGCARDTRAB C
                INNER JOIN TIPOPRAT T ON T.CDTIPOPRAT = C.CDTIPOPRAT
          WHERE C.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
          ORDER BY C.NRORDEM
      ) LOOP         

         INSERT INTO CNFCAMES
         (CDFILIAL, CDSERVFILI, NRSEQCNFMES,
          DTREFECNFMES, CDTIPOPRAT, 
          IDOPCCNFMES, IDIMPCNFMES, 
          NRPAGCNFMES, VRPERCOMMES,
          NRORDCNFMES, DSCOMPLTPMES)
         VALUES
         (P_CDFILIAL, P_CDSERVFILI, V_SEQ,
          V_DATA, C_CONFIGURACAO.CDTIPOPRAT, 
          'N', 'S', 
          V_PAG, 0, 
          V_SEQ, SUBSTR(C_CONFIGURACAO.DSCOMPLEMENTO, 1, 15));

         V_SEQ := V_SEQ + 1;
         IF MOD(V_SEQ, 2) = 0 THEN
            V_PAG := 1;
         ELSE
            V_PAG := V_PAG + 1;
         END IF;
      END LOOP;
    
    --=========================================================
    --=== Insere na COMPCARD
    --=========================================================
      WHILE(V_NUM_DIAS_MES > 0) LOOP
         SELECT COUNT(1)
           INTO V_CONTFERIFILI
           FROM FERIFILI
          WHERE CDFILIAL = P_CDFILIAL AND
                DTFERIFILI = V_DATA;

         SELECT MAX(NRDIACARDTRAB), MAX(QTCOMENSAIS)
           INTO V_NRDIACARDTRAB, V_QTCOMENSAIS
              FROM DIACARDTRAB D
          WHERE D.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
            AND NRSEMANA = V_SEMANA
            AND NRDIASEMANA = V_DIA;

         /* Somente inclui no cardápio se o dia posuir comensais e
         não restringe cardápios a dia útil ou restringe e é um dia útil*/
         IF (V_QTCOMENSAIS > 0) AND 
            (NVL(V_IDCARDIAUTIL, 'N') = 'N' OR (V_IDCARDIAUTIL = 'S' AND V_CONTFERIFILI = 0)) THEN            
            -- Insere na CARDADIA
            V_NRCARDAPIO := RETORNA_NOVO_CODIGO('CARDAPIO'|| P_CDFILIAL, 1, 10);
            INSERT INTO CARDADIA
            (CDFILIAL, CDSERVFILI, NRCARDAPIO,
             CDOPERADOR, DTCARDAPIO,
             QTCOMESTICAR, QTCLIESTICAR, 
             QTFUNESTICAR, QTDOAESTICAR,
             DTMESCARD, DTREFECUST)
            VALUES
            (P_CDFILIAL, P_CDSERVFILI, V_NRCARDAPIO,
             P_CDOPERADOR, V_DATA,
             V_QTCOMENSAIS, V_QTCOMENSAIS,
             0.00, 0.00,
             TRUNC(V_DATA, 'MM'), V_DTCUSTO);

            FOR C_COMPOSICAO IN
            (
               SELECT ROW_NUMBER() OVER (ORDER BY CNF.NRORDEM) AS NRSEQCNFMES,
                      C.CDFILAUXPRAT,
                      C.CDPRATO,
                      CNF.CDTIPOPRAT,
                      C.VRPECONSCARDTRAB
                 FROM CONFIGCARDTRAB CNF
                      LEFT JOIN COMPCARDTRAB C ON C.NRCARDAPIOTRAB = CNF.NRCARDAPIOTRAB AND
                                                  C.NRCONFIGCARDTRAB = CNF.NRCONFIGCARDTRAB AND
                                                  C.NRDIACARDTRAB = V_NRDIACARDTRAB
                WHERE CNF.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB                  
                ORDER BY CNF.NRORDEM
            ) LOOP
               IF C_COMPOSICAO.CDPRATO IS NOT NULL THEN
                  INSERT INTO COMPCARD 
                  (CDFILIAL, NRCARDAPIO, NRSEQPRATCAR, CDFILAUXPRAT, CDPRATO,
                   VRPECONSCARD, CDTIPOPRAT, NRORDPRATCAR)
                  VALUES
                  (P_CDFILIAL, V_NRCARDAPIO, C_COMPOSICAO.NRSEQCNFMES, C_COMPOSICAO.CDFILAUXPRAT, C_COMPOSICAO.CDPRATO,
                   C_COMPOSICAO.VRPECONSCARDTRAB, C_COMPOSICAO.CDTIPOPRAT, C_COMPOSICAO.NRSEQCNFMES);
               END IF;
            END LOOP;
         END IF;        
         
         -- Controle cíclico para o cardápio de trabalho
         IF (V_SEMANA = V_MAX_SEMANA AND V_DIA = V_MAX_DIASEMANA) THEN
            V_SEMANA := 1;
         ELSIF V_DIA = 7 THEN            
            V_SEMANA := V_SEMANA + 1;
            IF (V_SEMANA > V_MAX_SEMANA) THEN
               V_SEMANA := 1;
            END IF;
         END IF;

         V_DATA := V_DATA + 1;         
         V_DIA := TO_NUMBER(TO_CHAR(V_DATA, 'D'));
         -- Indica mais um dia do mês preenchido
         V_NUM_DIAS_MES := V_NUM_DIAS_MES - 1;         
      END LOOP;
      
   END LOOP;
--=========================================================
--=== Indica efetivação do serviço da proposta
--=========================================================
   UPDATE SERVICOPROPCOM
      SET IDSERVICOPROPCOM = 'EFETIVADO',
          NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_CDOPERADOR,
          DTULTATU = SYSDATE
    WHERE NRSERVICOPROPCOM = P_NRSERVICOPROPCOM;
END;