CREATE OR REPLACE
PROCEDURE FCT_GERA_PEDIDO
(P_NRSEQCONTRATO IN NUMBER,
 P_NRORG IN NUMBER,
 P_CDOPERADOR IN VARCHAR2,
 P_NRSEQRECUCONT IN VARCHAR2 DEFAULT NULL,
 P_RETORNO OUT VARCHAR2,
 P_RETORIT OUT VARCHAR2)
AS
V_NRPEDIDO  VARCHAR2(20);   /* Sequencial do Pedido */
V_CDCLIENTE VARCHAR2(30);   /* Cliente do Pedido */
V_VENDEDOR  VARCHAR2(05);   /* Vendedor do Pedido */
V_MODPGTO   VARCHAR2(05);   /* Modalidade de Pagamento do pedido */
V_PRECBASE  VARCHAR2(05);   /* Preço Base do Pedido */
V_TPOPER    VARCHAR2(02);   /* Tipo de Operação */
V_PRODUTO   VARCHAR2(10);   /* Produto do Perdido */
V_RETOPED   VARCHAR2(50);   /* Retorno procedure GRAVA_PEDIDO */
V_ERRPED    VARCHAR2(50);   /* Verifica se há erro no Pedido */
V_RETOITPED VARCHAR2(50);   /* Retorno peocedure GRAVA_ITEMPEDIDO */
V_NRITPED   VARCHAR2(50);   /* Retorno Número do Item do Pedido */
V_RETOIT    VARCHAR2(1000); /* Retornos do item concatenados. */
V_ERRITPED  VARCHAR2(50);   /* Verifica se há erro no item do pedido */
V_SITPED    VARCHAR2(01);   /* Situação do item do pedido */
V_RECANTE   VARCHAR2(10);   /* Produto anterior do Perdido para verificação  */

/*

Retornos Procedure GRAVA_PEDIDO:

       CDFILIAL:    Filial não informada.
       CDFILIAL01:  Filial não cadastrada.
       CDTIPOOPER:  Tipo de operação não parametrizado.
       NRPEDIDO:    Número do pedido não informado.
       NRPEDIDO01:  Número do pedido já cadastrado.
       CDCLIENTE:   Cliente não parametrizado.
       CDVENDEDOR:  Vendedor não parametrizado.
       CDMODPGTO:   Modalidade de pagamento não parametrizada.
       CDMODPGTO01: Modalidade de pagamento não cadastrada.
       CDPRECOBASE: Preço base não parametrizado.
       IDSITPEDIDO: Pedido não possui situação. 

Retornos Procedure GRAVA_ITEMPEDIDO:

       PRECOVENC:    Preço do produto fora da validade.
       VRPREUNITPED: Valor do preço unitário do produto deve ser informado.
       IDSITITEMPED: Item do pedido não possui situação.

Retorno da procedure FCT_GERA_PEDIDO
       
       RECURSO: Recurso (Nome) Já faz parte de um pedido.      
*/

BEGIN
  V_ERRPED := 'OK';

   FOR C_CONTPED IN (SELECT CT.NRSEQCONTRATO, CT.CDFILIALORCA, CT.NRPARCNEGOCIO, CT.DTINICIOCONTRATO,
                            OC.CDMODPGTO, OC.NRSEQORCAMENTO, OC.NRTIPOORCAMENTO, OC.NRGRUPOFATURA
                       FROM FCT_CONTRATO CT, FCT_ORCAMENTO OC, FCT_REFEORCACONT RF
                      WHERE CT.NRSEQCONTRATO = P_NRSEQCONTRATO
                        AND CT.NRORG = P_NRORG
                        AND RF.NRSEQCONTRATO(+) = CT.NRSEQCONTRATO
                        AND RF.NRORG(+) = CT.NRORG
                        AND OC.NRSEQORCAMENTO(+) = RF.NRSEQORCAMENTO
                        AND OC.NRORG(+) = RF.NRORG) LOOP
      
      /* Recebe código do cliente */
      BEGIN
        SELECT CL.CDCLIENTE
          INTO V_CDCLIENTE
          FROM PARCNEGOCIO PN, CLIENTE CL
         WHERE PN.NRPARCNEGOCIO = C_CONTPED.NRPARCNEGOCIO
           AND PN.NRORG = P_NRORG
           AND CL.NRPARCNEGOCIO = PN.NRPARCNEGOCIO
           AND CL.NRORG = PN.NRORG;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDCLIENTE := NULL;
      END;
      
      /* 1 - Contratos com  Orçamento.*/
      IF C_CONTPED.NRSEQORCAMENTO IS NOT NULL THEN
         /* Recebe Modalidade de Pagamento */
         IF C_CONTPED.CDMODPGTO IS NOT NULL THEN
            V_MODPGTO := C_CONTPED.CDMODPGTO;   
         ELSE 
            BEGIN
               SELECT CDMODPGTO
                 INTO V_MODPGTO
                 FROM PARAMPEDIDO
                WHERE CDFILIAL = C_CONTPED.CDFILIALORCA
                  AND NRORG = P_NRORG; 
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_MODPGTO := NULL;
            END;
         END IF;
          
         /* Recebe Preço Base */
         IF C_CONTPED.NRTIPOORCAMENTO IS NOT NULL THEN
            BEGIN
               SELECT CDPRECBASEVEND 
                 INTO V_PRECBASE
                 FROM FCT_TIPOORCAMENTO 
                WHERE NRTIPOORCAMENTO = C_CONTPED.NRTIPOORCAMENTO 
                  AND NRORG = P_NRORG;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_PRECBASE := NULL;
            END;
         END IF;
          
         /* Recebe Vendedor */
         BEGIN
           SELECT VD.CDVENDEDOR
             INTO V_VENDEDOR
             FROM FCT_VENDEDORORCA VO, PARCNEGOCIO PN, VENDEDOR VD
            WHERE VO.NRSEQORCAMENTO = C_CONTPED.NRSEQORCAMENTO
              AND VO.NRORG = P_NRORG
              AND VO.IDVENPRIORCA = 'S'
              AND PN.NRPARCNEGOCIO = VO.NRPARCVENDEDOR 
              AND PN.NRORG = VO.NRORG
              AND VD.NRINSJURVEN = PN.NRINSCRICAOPARC
             AND VD.NRORG = PN.NRORG;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_VENDEDOR := NULL;
         END;
         IF V_VENDEDOR IS NULL THEN
            BEGIN 
               SELECT CDVENDEDOR
                 INTO V_VENDEDOR
                 FROM PARAMPEDIDO
                WHERE CDFILIAL = C_CONTPED.CDFILIALORCA
                  AND NRORG = P_NRORG; 
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_VENDEDOR := NULL;
            END;
         END IF;
         /* Recebe tipo de operação */
         IF C_CONTPED.NRGRUPOFATURA IS NOT NULL THEN  
            BEGIN
               SELECT CDTIPOOPER
                 INTO V_TPOPER
                 FROM FCT_GRUPOFATURA
                WHERE NRGRUPOFATURA = C_CONTPED.NRGRUPOFATURA
                  AND NRORG = P_NRORG;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_TPOPER := NULL;
            END;
         END IF;
      
      /* 2 - Contratos sem Orçamento.*/     
      ELSE        
         /* Recebe Modalidade de Pagamento */
         BEGIN
            SELECT CDMODPGTO
              INTO V_MODPGTO
              FROM PARAMPEDIDO
             WHERE CDFILIAL = C_CONTPED.CDFILIALORCA
               AND NRORG = P_NRORG; 
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_MODPGTO := NULL;
         END;
         
         IF V_MODPGTO IS NULL THEN
            BEGIN
               SELECT MAX(CDMODPGTO)
                 INTO V_MODPGTO
                 FROM MODPGTO;
            EXCEPTION
              WHEN NO_DATA_FOUND THEN
                  V_MODPGTO := NULL;
            END;  
         END IF;
         
         /* Recebe Vendedor */
         BEGIN 
            SELECT CDVENDEDOR
              INTO V_VENDEDOR
              FROM PARAMPEDIDO
             WHERE CDFILIAL = C_CONTPED.CDFILIALORCA
               AND NRORG = P_NRORG; 
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
              V_VENDEDOR := NULL;
         END;
         
         IF V_VENDEDOR IS NULL THEN
            SELECT MAX(CDVENDEDOR)
              INTO V_VENDEDOR
              FROM VENDEDOR;
         END IF;
         
         /* Recebe Preço Base */
         BEGIN
            SELECT CDPRECBASEVEND
              INTO V_PRECBASE
              FROM FCT_TIPOORCAMENTO
            WHERE NRTIPOORCAMENTO = (SELECT MAX(NRTIPOORCAMENTO)
                                       FROM FCT_TIPOORCAMENTO
                                      WHERE NRORG = P_NRORG
                                        AND CDPRECBASEVEND IS NOT NULL)
              AND NRORG = P_NRORG;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_PRECBASE := NULL;
         END;
         IF V_PRECBASE IS NULL THEN
            BEGIN
               SELECT CDPRECOBASE
                 INTO V_PRECBASE
                 FROM VENDEDOR
                WHERE CDVENDEDOR = V_VENDEDOR;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_PRECBASE := NULL;
            END;
         END IF;
         /* Recebe Tipo de Operação */
         BEGIN
            SELECT CDTIPOOPER
              INTO V_TPOPER
              FROM FCT_GRUPOFATURA
             WHERE NRGRUPOFATURA = (SELECT MAX(NRGRUPOFATURA)
                                      FROM FCT_GRUPOFATURA 
                                     WHERE NRORG = P_NRORG
                                       AND CDTIPOOPER IS NOT NULL)
               AND NRORG = P_NRORG;   
         EXCEPTION 
            WHEN NO_DATA_FOUND THEN
               V_TPOPER := NULL;
         END;
      END IF;
      
      /* Recebe o sequencial do pedido. */
      NOVO_CODIGO_NT('PEDIDO'||C_CONTPED.CDFILIALORCA, V_NRPEDIDO, 1);
      V_NRPEDIDO := SUBSTR(V_NRPEDIDO, 11, 10);
          
      GRAVA_PEDIDO(C_CONTPED.CDFILIALORCA,V_NRPEDIDO, V_CDCLIENTE, V_MODPGTO, TRUNC(SYSDATE), C_CONTPED.DTINICIOCONTRATO, NULL, NULL, 
                   P_CDOPERADOR, NULL, NULL, V_VENDEDOR, V_TPOPER, V_PRECBASE, NULL, NULL, NULL,  NULL, NULL, NULL,  NULL, 
                   NULL, NULL, C_CONTPED.NRSEQORCAMENTO, V_RETOPED);
      
      IF V_RETOPED = 'OK' THEN
         P_RETORNO := V_RETOPED;
            
         V_ERRITPED := 'OK';
         
         V_RECANTE := NULL;
         /* Recebe os itens do pedido */
         FOR C_ITENS IN (SELECT BA.CDPRODUTO AS CDPRODUTO, SUM(RC.QTITEMCONTRATO) AS QTITEMCONTRATO, SUM(RC.VRUNITITEMCONT) AS VRUNITITEMCONT, RC.DTALOCARECUR,
                                RC.NRSEQRECUCONT, RC.CDFILIALPED, RC.NRPEDIDO, RC.NRITEMPED
                           FROM BEMATIVO BA, FILIAL FL,(SELECT DECODE(RC.CDPRODUTO, NULL, RC.CDBEMATIVO, RC.CDPRODUTO) AS CDITEM,
                                                               DECODE(RC.CDPRODUTO, NULL, 'BEM', 'PRD') AS TPITEM, 
                                                               1 AS QTITEMCONTRATO , RC.VRRECUCONT AS VRUNITITEMCONT, RC.DTALOCARECUR,
                                                               RC.NRSEQRECUCONT, RC.CDFILIALPED, RC.NRPEDIDO, RC.NRITEMPED
                                                          FROM FCT_CONTRATO CT, FCT_RECURSOSCONTR RC
                                                         WHERE CT.NRSEQCONTRATO = P_NRSEQCONTRATO
                                                           AND CT.NRORG = P_NRORG
                                                           AND RC.NRSEQCONTRATO = CT.NRSEQCONTRATO
                                                           AND RC.NRORG = CT.NRORG
                                                           AND ((INSTR(P_NRSEQRECUCONT, '_' || TO_CHAR(RC.NRSEQRECUCONT) || '_') > 0) OR (P_NRSEQRECUCONT IS NULL))) RC
                          WHERE FL.CDFILIAL = C_CONTPED.CDFILIALORCA
                            AND BA.CDEMPRESA = FL.CDEMPRESA
                            AND BA.CDBEMATIVO = RC.CDITEM
                            AND RC.TPITEM = 'BEM'
                         GROUP BY BA.CDPRODUTO, RC.DTALOCARECUR, RC.NRSEQRECUCONT, RC.CDFILIALPED, RC.NRPEDIDO, RC.NRITEMPED
                         UNION ALL
                         SELECT RC.CDITEM AS CDPRODUTO, SUM(IT.QTITEMCONTRATO) AS QTITEMCONTRATO, SUM(RC.VRUNITITEMCONT) AS VRUNITITEMCONT, RC.DTALOCARECUR,
                                RC.NRSEQRECUCONT, RC.CDFILIALPED, RC.NRPEDIDO, RC.NRITEMPED
                           FROM FCT_ITEMCONTRATO IT, (SELECT DECODE(RC.CDPRODUTO, NULL, RC.CDBEMATIVO, RC.CDPRODUTO) AS CDITEM,
                                                             DECODE(RC.CDPRODUTO, NULL, 'BEM', 'PRD') AS TPITEM, 
                                                             1 AS QTITEMCONTRATO , RC.VRRECUCONT AS VRUNITITEMCONT, RC.DTALOCARECUR,
                                                             RC.NRSEQRECUCONT, RC.CDFILIALPED, RC.NRPEDIDO, RC.NRITEMPED, CT.NRSEQCONTRATO, 
                                                             CT.NRORG, RC.NRITEMOCONTRATO
                                                        FROM FCT_CONTRATO CT, FCT_RECURSOSCONTR RC
                                                       WHERE CT.NRSEQCONTRATO = P_NRSEQCONTRATO
                                                         AND CT.NRORG = P_NRORG
                                                         AND RC.NRSEQCONTRATO = CT.NRSEQCONTRATO
                                                         AND RC.NRORG = CT.NRORG
                                                         AND ((INSTR(P_NRSEQRECUCONT, '_' || TO_CHAR(RC.NRSEQRECUCONT) || '_') > 0) OR (P_NRSEQRECUCONT IS NULL))) RC
                          WHERE IT.NRSEQCONTRATO = RC.NRSEQCONTRATO
                            AND IT.NRORG = RC.NRORG
                            AND IT.NRITEMOCONTRATO = RC.NRITEMOCONTRATO
                            AND RC.TPITEM = 'PRD'
                         GROUP BY RC.CDITEM, RC.DTALOCARECUR, RC.NRSEQRECUCONT, RC.CDFILIALPED, RC.NRPEDIDO, RC.NRITEMPED
                         ORDER BY 1) LOOP
                            
             /* Verifica se o recurso já faz parte de algum pedido. Se faz, retorna sua situação, se a situação for igual a 5, 
                significa que o item do pedido está cancelado, então o recurso fazer parte do pedido. */
              IF C_ITENS.NRITEMPED IS NOT NULL THEN
                 SELECT IDSITITEMPED
                   INTO V_SITPED
                   FROM ITEMPEDIDO
                  WHERE CDFILIAL = C_ITENS.CDFILIALPED
                    AND NRPEDIDO = C_ITENS.NRPEDIDO
                    AND NRITEMPED = C_ITENS.NRITEMPED;
              ELSE
                 V_SITPED := '5'; 
              END IF;
              IF V_SITPED = '5' THEN    
          
                    IF (V_RECANTE <> C_ITENS.CDPRODUTO) OR (V_RECANTE IS NULL) THEN
                       /* Grava itens do pedido */
                       GRAVA_ITEMPEDIDO(C_CONTPED.CDFILIALORCA, V_NRPEDIDO, C_ITENS.CDPRODUTO, C_ITENS.QTITEMCONTRATO, C_ITENS.VRUNITITEMCONT,
                                        NULL, NULL, NULL, C_ITENS.VRUNITITEMCONT, NULL, C_ITENS.DTALOCARECUR, C_ITENS.DTALOCARECUR, NULL, V_RETOITPED, 
                                        V_NRITPED);
                  
                       IF V_RETOITPED = 'OK' THEN
                          /* Atualiza Recurso com os dados da tabela ItemPedido */
                          UPDATE FCT_RECURSOSCONTR 
                             SET CDFILIALPED = C_CONTPED.CDFILIALORCA,
                                 NRPEDIDO = V_NRPEDIDO,
                                 NRITEMPED = V_NRITPED
                           WHERE NRSEQRECUCONT = C_ITENS.NRSEQRECUCONT
                             AND NRORG = P_NRORG;
                       ELSE
                         /*retorno de erro da procedure de GRAVA_ITEMPEDIDO */ 
                          V_RETOIT := V_RETOIT||V_RETOITPED;
                          V_ERRITPED := 'ERRO';
                       END IF;
                       
                       V_RECANTE := C_ITENS.CDPRODUTO;
                       
                    ELSE
                       UPDATE ITEMPEDIDO
                          SET QTITEMPED = QTITEMPED+C_ITENS.QTITEMCONTRATO
                        WHERE NRORG = P_NRORG
                          AND CDFILIAL = C_CONTPED.CDFILIALORCA  
                          AND NRPEDIDO = V_NRPEDIDO    
                          AND NRITEMPED = V_NRITPED;
                        
                       UPDATE FCT_RECURSOSCONTR 
                          SET CDFILIALPED = C_CONTPED.CDFILIALORCA,
                              NRPEDIDO = V_NRPEDIDO,
                              NRITEMPED = V_NRITPED
                        WHERE NRSEQRECUCONT = C_ITENS.NRSEQRECUCONT
                          AND NRORG = P_NRORG;
                       
                       V_RECANTE := C_ITENS.CDPRODUTO;
                    END IF;
            
              ELSE
                  /*retorno de erro caso algum recurso já fizer parte de algum pedido.*/
                 V_RETOIT := V_RETOIT|| 'RECURSO_'||TO_CHAR(C_ITENS.NRSEQRECUCONT)||';';
                 V_ERRITPED := 'ERRO';  
              END IF;  
         END LOOP;
      ELSE
         /*retorno de erro da procedure de GRAVA_PEDIDO */
         V_ERRPED := 'ERRO';
         P_RETORNO := V_RETOPED;
      END IF; 
   END LOOP;
   IF (V_ERRITPED = 'OK') AND (V_ERRPED = 'OK') THEN 
       P_RETORIT := 'OK';
   ELSE 
      P_RETORNO := V_RETOPED;
      IF V_RETOIT IS NOT NULL THEN
         P_RETORIT := V_RETOIT;
      ELSE
         P_RETORIT := 'OK';
      END IF;
      ROLLBACK;
   END IF;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('FCT_GERA_PEDIDO','5.70.xxx'); END;
/