create or replace PROCEDURE REPLICA_PEDIDO (P_CDFILIAL        IN VARCHAR2,
                                            P_NRPEDIDONEW     IN VARCHAR2,
                                            P_CDCLIENTE       IN VARCHAR2,
                                            P_CDFILIDEST      IN VARCHAR2,
                                            P_DATAPEDIDO      IN DATE,
                                            P_DATAENTREGA     IN DATE,
                                            P_DATAVALIDADE    IN DATE,
                                            P_NRORDCOMPRA     IN VARCHAR2,
                                            P_CDFILIALPEDORIG IN VARCHAR2,
                                            P_NRPEDIDO        IN VARCHAR2,
                                            P_CDOPERADOR      IN VARCHAR2,
                                            P_CDMENSERRO  OUT VARCHAR2)

AS
   V_CTREGISTRO      NUMBER;
   V_DTENTPED        DATE;
   V_DTPEDIDO        DATE;
   V_SEQUENCIAL      VARCHAR2(20);
   V_NRDIASENTPED    VARCHAR2(4);
   V_CDVENDEDOR      PARAMPEDIDO.CDVENDEDOR%TYPE;
   V_IDLANCPED       PARAMPEDIDO.IDLANCPED%TYPE;
   V_IDUTRESELOTE    PARAMPEDIDO.IDUTRESELOTE%TYPE;
   V_CDTIPOOPER      PARAMPEDIDO.CDTIPOOPER%TYPE;
   V_IDEXIBIMPITPED  PARAMPEDIDO.IDEXIBIMPITPED%TYPE;
   V_IDSITPEDIDO     PEDIDO.IDSITPEDIDO%TYPE;
   V_IDTPFORPGTOMOD  MODPGTO.IDTPFORPGTOMOD%TYPE;
   V_NRDIAPGFIXMOD   MODPGTO.NRDIAPGFIXMOD%TYPE;
   V_NRPARCPGTOMOD   MODPGTO.NRPARCPGTOMOD%TYPE;
   V_CDFORMPGTO      MODPGTO.CDFORMPGTO%TYPE;
   V_ERRO            VARCHAR2(400);
   V_IDOBRTPOPPED    PARAMPEDIDO.IDOBRTPOPPED%TYPE;
   V_CDOPERPED       PARAMPEDIDO.CDTIPOOPER%TYPE;
   V_CDCLIENTEORIG   PEDIDO.CDCLIENTE%TYPE;
   V_CDMODPGTOORIG   PEDIDO.CDMODPGTO%TYPE;
   V_CDVENDEDORORIG  PEDIDO.CDVENDEDOR%TYPE;
   V_CDCLIENTEDEST   PEDIDO.CDCLIENTE%TYPE;
   V_CDMODPGTODEST   PEDIDO.CDMODPGTO%TYPE;
   V_CDVENDEDORDEST  PEDIDO.CDVENDEDOR%TYPE;
   V_DTVALIPED       PEDIDO.DTVALIPED%TYPE;
   V_IDUTVALIPED     PARAMPEDIDO.IDUTVALIPED%TYPE;
   V_QTDIAVALIPED    PARAMPEDIDO.QTDIAVALIPED%TYPE;
   V_CDROTATRANSPED  VARCHAR2(6);
   V_IDORIGDESTOP    VARCHAR2(1);
   V_NRINSJURTRAN    VARCHAR2(20);
   V_CDTIPTRANS      VARCHAR2(4);
   V_IDPGFRETTRA     VARCHAR2(1);
   V_CDPRECOBASE     VARCHAR2(02);
   V_IDTABPRECO      VARCHAR2(01);
   V_RETOITPED       VARCHAR2(50);
   V_NRITPED         VARCHAR2(50);
   V_CDPRECOBASEORIG VARCHAR2(02);
   V_IDPEDINDUSTRIA  VARCHAR2(01);
   V_VRPARCELATOT    FLOAT;
   V_VRTOTAL         FLOAT;
   V_NRDIASPGTOPED   NUMBER(3);
   V_IDATUESTTPOP    VARCHAR2(01);
   V_TXOBSPED        BLOB;
   V_IDITPEDDIFER    VARCHAR2(1);

BEGIN
   P_CDMENSERRO := 'OK';
   V_ERRO := NULL;
   V_CDROTATRANSPED := NULL;
   V_CDPRECOBASE    := NULL;

   BEGIN
      SELECT COUNT(*)
        INTO V_CTREGISTRO
        FROM PARAMPEDIDO
       WHERE CDFILIAL = P_CDFILIAL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CTREGISTRO := 0;
   END;

   IF V_CTREGISTRO = 0 THEN
      P_CDMENSERRO := 'FILIAL_N_PARAM';
   END IF;

   IF V_CTREGISTRO > 0 THEN
      SELECT CDCLIENTE, CDMODPGTO, CDVENDEDOR, NRDIASENTPED,
             DECODE(IDLANCPED, '3', '2', IDLANCPED), CDTIPOOPER, IDOBRTPOPPED,
             IDUTVALIPED, QTDIAVALIPED
      INTO   V_CDCLIENTEORIG, V_CDMODPGTOORIG, V_CDVENDEDORORIG, V_NRDIASENTPED,
             V_IDSITPEDIDO,  V_CDTIPOOPER, V_IDOBRTPOPPED, V_IDUTVALIPED, V_QTDIAVALIPED
      FROM PARAMPEDIDO
      WHERE CDFILIAL = P_CDFILIAL;

      SELECT MAX(PC.CDPRECOBASE)
        INTO V_CDPRECOBASE
        FROM PRECOBASECLI PC
       WHERE (PC.CDCLIENTE    = P_CDCLIENTE)
         AND (PC.IDPRBASEPRIN = 'S');

         BEGIN
          SELECT CDVENDEDOR, IDLANCPED, IDUTRESELOTE, CDTIPOOPER, NVL(IDEXIBIMPITPED, 'N'), IDTABPRECO
            INTO V_CDVENDEDOR, V_IDLANCPED, V_IDUTRESELOTE, V_CDTIPOOPER, V_IDEXIBIMPITPED, V_IDTABPRECO
            FROM PARAMPEDIDO
           WHERE CDFILIAL = P_CDFILIAL;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN
             V_CDVENDEDOR     := NULL;
             V_IDLANCPED      := NULL;
             V_IDUTRESELOTE   := NULL;
             V_CDTIPOOPER     := NULL;
             V_IDEXIBIMPITPED := NULL;
             V_IDTABPRECO     := NULL;
       END;

       IF V_CDVENDEDOR IS NULL THEN
          P_CDMENSERRO := 'VENDEDOR_INF';
       ELSE
          IF ((V_CDTIPOOPER IS NULL) AND (V_IDEXIBIMPITPED = 'S')) THEN
             P_CDMENSERRO := 'TIPOOPER_INF';
          END IF;
          IF V_CDMODPGTOORIG IS NULL THEN
             P_CDMENSERRO := 'MOD_PAGAMENTO';
          END IF;
       END IF;
   END IF;

   IF P_CDMENSERRO = 'OK' THEN

      SELECT NVL(V_CDPRECOBASE, MAX(CDPRECOBASE)), MAX(IDPEDINDUSTRIA)
        INTO V_CDPRECOBASEORIG, V_IDPEDINDUSTRIA
        FROM PEDIDO
       WHERE CDFILIAL = P_CDFILIALPEDORIG AND
             NRPEDIDO = P_NRPEDIDO;
      --INSERCAO DO PEDIDO
      INSERT INTO PEDIDO
            (CDFILIAL,     NRPEDIDO,     IDSITPEDIDO,   CDCLIENTE,   IDPRIOPED,     DTPEDIDO,
             DTENTPED,     CDMODPGTO,    IDTPFORPGTPED, CDFORMPGTO,  NRDIAPGFIXPED, NRPARCPGTOPED,
             IDTPIJURTRAN, NRINSJURTRAN, CDTIPTRANS, IDPGFRETTRAN, DTHRLANPED,    CDOPELANPED, CDFILIALPED,   CDTIPORECE,
             CDVENDEDOR,   IDENTRSAIDOP, CDTIPOOPER,    CDPRECOBASE, DTVALIPED, CDFILLANCA, CDFILSOLI,
             NRSOLICMP,    CDTIPOEDITAL, CDFILIALORC,   NRORCAEVENTO,  NRSEQORCAEVE,
             CDDEPTO, NREMPENHO, NRSEQDIAPROD, CDROTATRANSPED, NRSEQORCAMENTO, IDPEDREPLICA, NRPEDREPLICA, IDPEDINDUSTRIA,
             NRORDEMCMPPED)
      SELECT P_CDFILIAL,   P_NRPEDIDONEW, V_IDSITPEDIDO,   P_CDCLIENTE, IDPRIOPED,     P_DATAPEDIDO,
             P_DATAENTREGA,V_CDMODPGTOORIG,    IDTPFORPGTPED, CDFORMPGTO,  NRDIAPGFIXPED, NRPARCPGTOPED,
             IDTPIJURTRAN, NRINSJURTRAN, CDTIPTRANS,  IDPGFRETTRAN,   SYSDATE,      P_CDOPERADOR, P_CDFILIDEST,   CDTIPORECE,
             V_CDVENDEDOR, IDENTRSAIDOP, V_CDTIPOOPER,NVL(V_CDPRECOBASE, CDPRECOBASE), P_DATAVALIDADE, CDFILLANCA, '',
             '',    CDTIPOEDITAL, '',   '',  '',
             CDDEPTO, NREMPENHO, NRSEQDIAPROD, CDROTATRANSPED, NRSEQORCAMENTO, 'S', P_NRPEDIDO, IDPEDINDUSTRIA,
             P_NRORDCOMPRA
        FROM PEDIDO
       WHERE CDFILIAL = P_CDFILIALPEDORIG AND
             NRPEDIDO = P_NRPEDIDO;

        BEGIN
            SELECT TXOBSPED
              INTO V_TXOBSPED
            FROM
               OBSPEDIDO
            WHERE
               (NRPEDIDO = P_NRPEDIDO) AND
               (CDFILIAL = P_CDFILIALPEDORIG);
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
            V_TXOBSPED := NULL;
        END;

        IF NOT V_TXOBSPED IS NULL THEN
            Insert into OBSPEDIDO (CDFILIAL,NRPEDIDO,TXOBSPED) values (P_CDFILIAL,P_NRPEDIDONEW,V_TXOBSPED);
        END IF;

       --INSERCAO DOS ITENS
       FOR C_ITEM IN (SELECT I.CDPRODUTO, I.NRITEMPED, I.QTITEMPED, NVL(I.IDITEMPEDTERC, 'N') IDITEMPEDTERC,  I.CDFATPRECO,
                             BUSCA_PRECO_PED(P_CDFILIAL,P.CDARVPROD, P_CDCLIENTE,V_CDPRECOBASEORIG, P_DATAPEDIDO, V_CDMODPGTOORIG) AS VRPREUNITPED
                        FROM ITEMPEDIDO I, PRODUTO P
                       WHERE I.CDFILIAL = P_CDFILIALPEDORIG
                         AND I.NRPEDIDO = P_NRPEDIDO
                         AND I.CDPRODUTO =P.CDPRODUTO
                      ORDER BY I.NRITEMPED)
       LOOP
          IF V_IDTABPRECO = '1' THEN

             GRAVA_ITEMPEDIDO(P_CDFILIAL,P_NRPEDIDONEW,C_ITEM.CDPRODUTO,C_ITEM.QTITEMPED, C_ITEM.VRPREUNITPED, NULL,
                              NULL, NULL, NULL,NULL, P_DATAENTREGA, P_DATAPEDIDO,NULL,V_RETOITPED,
                              V_NRITPED);
          ELSE
             GRAVA_ITEMPEDIDO(P_CDFILIAL,P_NRPEDIDONEW,C_ITEM.CDPRODUTO,C_ITEM.QTITEMPED, NULL, C_ITEM.CDFATPRECO,
                              NULL, NULL, NULL,NULL, P_DATAENTREGA, P_DATAPEDIDO,NULL,V_RETOITPED,
                              V_NRITPED);
          END IF;

          IF V_RETOITPED = 'OK' THEN

             --TIPO DO PRECO DO ITEM (NORMAL, OUTROS ...)
             SELECT MAX(IDITPEDDIFER)
              INTO V_IDITPEDDIFER
              FROM ITEMPEDIDO
             WHERE CDFILIAL  = P_CDFILIALPEDORIG
               AND NRPEDIDO  = P_NRPEDIDO
               AND NRITEMPED = C_ITEM.NRITEMPED;

             UPDATE ITEMPEDIDO SET IDITPEDDIFER = V_IDITPEDDIFER
             WHERE CDFILIAL  = P_CDFILIAL
               AND NRPEDIDO  = P_NRPEDIDONEW
               AND NRITEMPED = V_NRITPED;

             --COMPOSICAO DOS ITENS
             INSERT INTO COMPITEMPED
             (CDFILIAL, NRPEDIDO, NRITEMPED, CDPRODCOMPED, QTITCOMPPROD, VRPREUNICOMP,
              CDFATPRECOMP, VRPERCMARKUP, VRPESOBRUCOM, CDPRODUTO, CDGRUPOCOMP, NRSEQPROD)
             SELECT P_CDFILIAL, P_NRPEDIDONEW, V_NRITPED, CDPRODCOMPED, QTITCOMPPROD, VRPREUNICOMP,
                    CDFATPRECOMP, VRPERCMARKUP, VRPESOBRUCOM, CDPRODUTO, CDGRUPOCOMP, NRSEQPROD
               FROM COMPITEMPED
              WHERE CDFILIAL = P_CDFILIALPEDORIG
                AND NRPEDIDO = P_NRPEDIDO
                AND NRITEMPED = C_ITEM.NRITEMPED;

             --RESERVA DOS ITENS
             V_IDATUESTTPOP := 'S';
             SELECT NVL(MAX(IDATUESTTPOP), 'S') IDATUESTTPOP
               INTO V_IDATUESTTPOP
               FROM TIPOOPERAC
              WHERE IDENTRSAIDOP = 'S'
                AND CDTIPOOPER = V_CDTIPOOPER;

             IF (V_IDUTRESELOTE = 'S') AND (V_IDATUESTTPOP = 'S') THEN
                INSERE_RESERPRODPED(P_CDFILIAL, P_NRPEDIDONEW, V_NRITPED,'N');
             END IF;
             --ITENS DE INDUSTRIALIZACAO
             IF V_IDPEDINDUSTRIA = 'S' THEN
                UPDATE ITEMPEDIDO
                   SET IDITEMPEDTERC = C_ITEM.IDITEMPEDTERC
                 WHERE CDFILIAL  = P_CDFILIAL
                   AND NRPEDIDO  = P_NRPEDIDONEW
                   AND NRITEMPED = V_NRITPED
                   AND CDPRODUTO = C_ITEM.CDPRODUTO;

                INSERT INTO ITEMPEDTERC (CDFILIAL, NRPEDIDO, NRITEMPED, CDPRODUTO, QTPRODTERC)
                SELECT P_CDFILIAL, P_NRPEDIDONEW, V_NRITPED, I.CDPRODUTO, I.QTPRODTERC
                  FROM ITEMPEDTERC I
                 WHERE (I.CDFILIAL   = P_CDFILIAL )
                   AND (I.NRPEDIDO   = P_NRPEDIDO )
                   AND (I.NRITEMPED  = C_ITEM.NRITEMPED);

             END IF;
          ELSE
             P_CDMENSERRO := V_RETOITPED;
             EXIT;
          END IF;
       END LOOP;
       IF P_CDMENSERRO = 'OK' THEN
          --PESO DO PEDIDO
          UPDATE PEDIDO
             SET VRPBRUVOLPED = PESOPRODUTO_PEDIDO(P_CDFILIAL,P_NRPEDIDONEW),
                 VRPLIQVOLPED = PESOLIQUIDO_PEDIDO(P_CDFILIAL,P_NRPEDIDONEW)
           WHERE NRPEDIDO = P_NRPEDIDO
             AND CDFILIAL = P_NRPEDIDONEW;

          --IMPOSTOS DO PEDIDO
          IMPOSTO_PEDIDO(P_CDFILIAL, P_NRPEDIDONEW);

          --ENCARGO DO PEDIDO
          INSERT INTO ENCARGOPED
          (CDFILIAL,NRPEDIDO,CDENCARGO,VRENCARGOPED)
          SELECT P_CDFILIAL, P_NRPEDIDONEW, E.CDENCARGO, NVL(EP.VRENCARGOPED,0)
            FROM ENCARGOPED EP, ENCARGO E
           WHERE EP.CDENCARGO(+) = E.CDENCARGO
             AND EP.CDFILIAL(+)  = P_CDFILIALPEDORIG
             AND EP.NRPEDIDO(+)  = P_NRPEDIDO;


          --DADOS ADCIONAIS
          INSERT INTO DADOSADICPED
          (CDFILIAL, NRPEDIDO, NRDADOADICPED, CDMENSAGEM, DSDADOADICPED)
          SELECT P_CDFILIAL, P_NRPEDIDONEW, NRDADOADICPED, CDMENSAGEM, DSDADOADICPED
            FROM DADOSADICPED
           WHERE CDFILIAL = P_CDFILIALPEDORIG
             AND NRPEDIDO = P_NRPEDIDO;

          --VENCIMENTO
          FOR C_PARCELA IN (SELECT M.NRDIASMODPGTO, M.CDMODPGTO, M.VRPERCMODPGTO, VALOR_PEDIDO(P.CDFILIAL, P.NRPEDIDO) AS VRTOTAL
                              FROM PRAZOMODPGTO M, PEDIDO P
                             WHERE M.CDMODPGTO = P.CDMODPGTO
                               AND P.CDFILIAL = P_CDFILIAL
                               AND P.NRPEDIDO = P_NRPEDIDONEW)
          LOOP
             insert into PRAZOPGTOPED
            (CDFILIAL, NRPEDIDO, NRDIASPGTOPED, VRPERCPGTOPED, VRPARCELA)
             values
            (P_CDFILIAL, P_NRPEDIDONEW, C_PARCELA.NRDIASMODPGTO, C_PARCELA.VRPERCMODPGTO, ROUND(((C_PARCELA.VRTOTAL* C_PARCELA.VRPERCMODPGTO) / 100),2));
          END LOOP;

          BEGIN
            SELECT SUM(P.VRPARCELA) VRPARCELATOT, VALOR_PEDIDO(P_CDFILIAL, P_NRPEDIDONEW) AS VRTOTAL
              INTO V_VRPARCELATOT, V_VRTOTAL
              FROM PRAZOPGTOPED P
             WHERE P.CDFILIAL = P_CDFILIAL
               AND P.NRPEDIDO = P_NRPEDIDONEW
             GROUP BY P.CDFILIAL, P.NRPEDIDO;
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
                V_VRPARCELATOT := 0;
                V_VRTOTAL      := 0;
          END;

          IF (ABS(V_VRTOTAL - V_VRPARCELATOT) > 0) THEN
             SELECT MAX(P.NRDIASPGTOPED)
               INTO V_NRDIASPGTOPED
               FROM PRAZOPGTOPED P
              WHERE (CDFILIAL = P_CDFILIAL)
                AND (NRPEDIDO = P_NRPEDIDONEW)
                AND VRPARCELA = (SELECT MAX(A.VRPARCELA)
                                   FROM PRAZOPGTOPED A
                                  WHERE (CDFILIAL = P_CDFILIAL)
                                    AND (NRPEDIDO = P_NRPEDIDONEW));

             UPDATE PRAZOPGTOPED
                SET VRPARCELA = (VRPARCELA + (V_VRTOTAL - V_VRPARCELATOT))
              WHERE CDFILIAL = P_CDFILIAL
                AND NRPEDIDO = P_NRPEDIDONEW
                AND NRDIASPGTOPED = V_NRDIASPGTOPED;

          END IF;
       END IF;
   END IF;
END;
/