create or replace 
PROCEDURE IMPORTA_INVENT_STOCK(P_CDOPERADOR IN VARCHAR2)
IS
   V_CDFILIAL VARCHAR2(4);
   V_PRODUTO  VARCHAR2(20);
   V_DATAINI  DATE;
   V_QTDEESTO FLOAT;
   V_VALRESTO FLOAT;
   V_VALRBRUT FLOAT;
   V_NOVOCOD  VARCHAR2(20);
   V_CDALMOX  VARCHAR2(6);
   V_CDLOCEST VARCHAR2(6);
   V_ORDIMPL  VARCHAR2(1);
   V_NOVOREGE BOOLEAN;
   V_VRTOTLAN FLOAT;
   V_CONTADOR INTEGER;
   V_NOVAFILI BOOLEAN;
   V_MENSERRO VARCHAR2(300);
   V_SITESAP  VARCHAR2(4);
   C_SITESAP  VARCHAR2(4);
   C_PRODUTO  VARCHAR2(10);
   C_DTINVENT DATE;
   C_QUANTID  FLOAT;
   C_VRUNIT   FLOAT;
   C_PRODSAP  VARCHAR2(18);
   V_EXSTINV  INTEGER;
   
   CURSOR C_INVESTOCK IS
       SELECT CDSITESAP, CDPRODESTO, DTINVENT, QUANTIDADE, VRUNITARIO, CDPRODSAP
         FROM (SELECT U.CDSITESAP, P.CDPRODESTO, U.DTINVENT, SUM(U.QUANTIDADE * P.VRFATOCONV) QUANTIDADE,
                      SUM(U.VRUNITARIO / P.VRFATOCONV) VRUNITARIO, P.CDPRODSAP
                 FROM USR_SAP_INVENTESTOQ U, 
                      (SELECT P.CDPRODUTO, P.CDPRODESTO, P.VRFATOCONV, P.SGUNIDADE, M.CDPRODSAP
                        FROM MARCPROD M, PRODUTO P
                       WHERE M.CDPRODUTO = P.CDPRODUTO
                         AND M.CDPRODSAP IS NOT NULL) P
                WHERE U.CDPRODUTO = P.CDPRODSAP
                  AND U.SGUNIDADE = P.SGUNIDADE
                  AND U.DTINTERFACEDEST IS NULL
                  AND U.STATUS <> 2
                GROUP BY U.CDSITESAP, P.CDPRODESTO, U.DTINVENT, P.CDPRODSAP)
        ORDER BY CDSITESAP, DTINVENT;
BEGIN
   V_CDFILIAL := '  ';
   V_DATAINI  := '31/12/1899';
   V_SITESAP  := '  ';
   
   OPEN C_INVESTOCK;
   LOOP
      FETCH C_INVESTOCK INTO C_SITESAP, C_PRODUTO, C_DTINVENT, C_QUANTID, C_VRUNIT, C_PRODSAP;
      
      EXIT WHEN C_INVESTOCK%NOTFOUND;
      
      V_PRODUTO := C_PRODUTO;
      IF V_SITESAP <> C_SITESAP THEN
         V_NOVAFILI := TRUE;
         V_SITESAP  := C_SITESAP;
         BEGIN
            SELECT F.CDFILIAL, NVL(P.CDALMOXARIFE, ' ') CDALMOXARIFE, NVL(P.CDLOCALESTOQ, ' ') CDLOCALESTOQ, 
                   P.IDORDIMPLANT
              INTO V_CDFILIAL, V_CDALMOX, V_CDLOCEST,
                   V_ORDIMPL
              FROM FILIAL F, PARAMFILIAL P
             WHERE F.CDFILIAL = P.CDFILIAL
               AND P.CDEXFILIAL = V_SITESAP;
         EXCEPTION
            WHEN OTHERS THEN
               V_CDFILIAL := NULL;
               V_NOVAFILI := FALSE;
               V_CDALMOX  := NULL;
               V_CDLOCEST := NULL;
               V_ORDIMPL  := NULL;
               
               UPDATE USR_SAP_INVENTESTOQ 
                  SET STATUS = 2
                WHERE CDSITESAP = V_SITESAP;
               
               FOR C_FIL_INVAL IN (SELECT IDINTERFACE
                                     FROM USR_SAP_INVENTESTOQ
                                    WHERE CDSITESAP = V_SITESAP)
               LOOP
                  INSERT INTO USR_SAP_LOG(IDINTERFACE, IDSEQLOG, IDPROCESSO, DTLOG, STATUS, OBSSTATUS)
                  VALUES(C_FIL_INVAL.IDINTERFACE, 'I', 6, SYSDATE, 1, 'Site '||V_SITESAP||' no registrado.');
               END LOOP;
               
               COMMIT;
         END;
      END IF;
      
      IF (V_CDFILIAL IS NOT NULL)  THEN
         IF ((V_DATAINI <> C_DTINVENT) AND (V_NOVAFILI)) THEN
            V_NOVAFILI := FALSE;
            V_DATAINI  := C_DTINVENT;
            V_NOVOREGE := TRUE;
            V_CONTADOR := 1;
            
            NOVO_CODIGO('LANCTOEST'||V_CDFILIAL, V_NOVOCOD);
            V_NOVOCOD := SUBSTR(V_NOVOCOD, -10);
            
            CASE NVL(TRIM(V_ORDIMPL), 'P')
                WHEN ('P') THEN V_ORDIMPL := 'O';
                ELSE V_ORDIMPL := 'U';
             END CASE;
         END IF;
         
         BEGIN
            POSICAO_ESTOQUE(V_CDFILIAL, V_PRODUTO, V_DATAINI, V_QTDEESTO, V_VALRESTO, V_VALRBRUT);
            
            IF V_VALRESTO <> 0.0 THEN
               SELECT COUNT(1)
                 INTO V_EXSTINV
                 FROM INVEROTA
                WHERE CDFILIAL     = V_CDFILIAL
                  AND CDALMOXARIFE = V_CDALMOX
                  AND CDLOCALESTOQ = V_CDLOCEST
                  AND DTINVEROTA   = V_DATAINI
                  AND CDPRODUTO    = V_PRODUTO;
               
               IF (V_EXSTINV = 0) THEN
                  INSERT INTO INVEROTA(CDFILIAL, CDALMOXARIFE, CDLOCALESTOQ, DTINVEROTA, CDPRODUTO, QTINVEROTA, QTESTOQUE)
                  VALUES(V_CDFILIAL, V_CDALMOX, V_CDLOCEST, V_DATAINI, V_PRODUTO, C_QUANTID, V_QTDEESTO);
               ELSE
                  UPDATE INVEROTA
                     SET QTINVEROTA   = C_QUANTID,
                         QTESTOQUE    = V_QTDEESTO
                   WHERE CDFILIAL     = V_CDFILIAL
                     AND CDALMOXARIFE = V_CDALMOX
                     AND CDLOCALESTOQ = V_CDLOCEST
                     AND DTINVEROTA   = V_DATAINI
                     AND CDPRODUTO    = V_PRODUTO;
               END IF;
            ELSE
               IF (V_NOVOREGE) THEN
                  INSERT INTO LANCTOESTOQ
                    (CDFILIAL, NRLANCESTQ, IDTPLANCTO, DTLANCESTQ, DSLANCESTQ, CDOPERADOR, CDFILIMOVI,
                     CDALMOXARIFE, CDLOCALESTOQ)
                  VALUES
                    (V_CDFILIAL, V_NOVOCOD, '0', V_DATAINI, 'Descripci'||CHR(243)||'n de la implantaci'||CHR(243)||'n', P_CDOPERADOR, V_CDFILIAL, 
                     V_CDALMOX, V_CDLOCEST);
                  
                  V_NOVOREGE := FALSE;
               END IF;
               
               V_VRTOTLAN := (C_VRUNIT * C_QUANTID);
               
               INSERT INTO ITLANCTOEST
                  (CDFILIAL, NRLANCESTQ, NRSEQUITEM, CDPRODUTO, QTLANCTOEST, QTTOTLANCTO,
                   CDPRODMOVI, CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE, 
                   IDTIPOMOVI, IDEVOLESTOQ, IDORDEMCLC, DTLANCMOVI, VRUNILANCTO,
                   VRTOTLANCTO, VRLANCTOEST)
               VALUES
                  (V_CDFILIAL, V_NOVOCOD, V_CONTADOR, V_PRODUTO, C_QUANTID, C_QUANTID,
                   V_PRODUTO, V_CDFILIAL, V_CDALMOX, V_CDLOCEST, ' ', ' ', 
                   '0', 'N', V_ORDIMPL, V_DATAINI, C_VRUNIT,
                   V_VRTOTLAN, V_VRTOTLAN);
               
               V_CONTADOR := V_CONTADOR + 1;
            END IF;
            
            FOR C_INVENTOK IN (SELECT IDINTERFACE
                                 FROM USR_SAP_INVENTESTOQ
                                WHERE CDSITESAP = V_SITESAP
                                  AND DTINVENT  = V_DATAINI
                                  AND CDPRODUTO = C_PRODSAP)
            LOOP
               INSERT INTO USR_SAP_LOG(IDINTERFACE, IDSEQLOG, IDPROCESSO, DTLOG, STATUS, OBSSTATUS)
               VALUES(C_INVENTOK.IDINTERFACE, 'I', 6, SYSDATE, 1, 'Importaci'||CHR(243)||'n de inventario del Stock realizado con suceso.');
               
               UPDATE USR_SAP_INVENTESTOQ 
                  SET DTINTERFACEDEST = SYSDATE, 
                      STATUS = 0
                WHERE IDINTERFACE = C_INVENTOK.IDINTERFACE;
            END LOOP;
         EXCEPTION
            WHEN OTHERS THEN
               ROLLBACK;
               V_MENSERRO := SQLERRM(SQLCODE);
               
               FOR C_ERROR IN (SELECT IDINTERFACE
                                 FROM USR_SAP_INVENTESTOQ
                                WHERE CDSITESAP = V_SITESAP
                                  AND DTINVENT  = V_DATAINI
                                  AND CDPRODUTO = C_PRODSAP)
               LOOP
                  INSERT INTO USR_SAP_LOG(IDINTERFACE, IDSEQLOG, IDPROCESSO, DTLOG, STATUS, OBSSTATUS)
                  VALUES(C_ERROR.IDINTERFACE, 'I', 6, SYSDATE, 1, 'Error en la importaci'||CHR(243)||'n de inventario del Stock. Error: '||V_MENSERRO);
                  
                  UPDATE USR_SAP_INVENTESTOQ 
                     SET STATUS = 2
                   WHERE IDINTERFACE = C_ERROR.IDINTERFACE;
               END LOOP;
               
               COMMIT;
         END;
      END IF;
   END LOOP;
   CLOSE C_INVESTOCK;
   
   FOR C_PRODINV IN (SELECT IDINTERFACE, CDPRODUTO
                       FROM USR_SAP_INVENTESTOQ
                      WHERE STATUS <> 2
                        AND DTINTERFACEDEST IS NULL)
   LOOP
      INSERT INTO USR_SAP_LOG(IDINTERFACE, IDSEQLOG, IDPROCESSO, DTLOG, STATUS, OBSSTATUS)
      VALUES(C_PRODINV.IDINTERFACE, 'I', 6, SYSDATE, 1, 'Producto SAP '||C_PRODINV.CDPRODUTO||' no registrado en Tecfood');
      
      UPDATE USR_SAP_INVENTESTOQ 
         SET STATUS = 2
       WHERE IDINTERFACE = C_PRODINV.IDINTERFACE;
   END LOOP;
   
   COMMIT;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('IMPORTA_INVENT_STOCK','6.05.xxx'); END;
/