CREATE OR REPLACE PROCEDURE CONTABILIZA_EST_AJUIMPL(
  P_NRLISTA  IN LISTA.NRLISTA%TYPE)
IS
  V_CDSEQUENCIAL VARCHAR2(20);
  V_NRLANCLOTE   VARCHAR2(6);
  V_GERLOTE      VARCHAR2(1);
  V_CDEMPRESA    VARCHAR2(02);
  V_IDCONTCCUS   VARCHAR2(1);
  V_CDHISTPADR   VARCHAR2(4);
  V_DSHISTPADR   VARCHAR2(1000);
  V_CDLOTE       VARCHAR2(20);
  V_IDRETORNA    VARCHAR2(1);
  V_DATAINI      DATE;
  V_DATAFIN      DATE;
  V_RESULT       BOOLEAN;
  V_OLDFILIAL    VARCHAR2(4);
BEGIN
    EXCLUI_LANCCONTABIL('05',P_NRLISTA);
    
    V_OLDFILIAL := ' ';

    FOR C_LISTA IN (
     SELECT CDFILIAL, SUBSTR(L.CDLISTA, 05, 07) AS DTDATA, SUBSTR(L.CDLISTA, 12, 1) AS IDTIPOMOVIEST
       FROM FILIAL F, LISTA L
      WHERE F.CDFILIAL = SUBSTR(L.CDLISTA, 01, 04)
        AND L.NRLISTA = P_NRLISTA
      ORDER BY F.CDFILIAL) LOOP

     V_DATAINI := (TO_DATE('01/'||C_LISTA.DTDATA));
     V_DATAFIN := (LAST_DAY(TO_DATE('01/'||C_LISTA.DTDATA)));
     
     IF NOT(V_OLDFILIAL = C_LISTA.CDFILIAL) THEN 

       NOVO_CODIGO('MOVIESTOQUE', V_CDSEQUENCIAL, 01);
       V_CDSEQUENCIAL := SUBSTR(V_CDSEQUENCIAL, 11, 10);
       MOVIMENTACAO_ESTOQUE(C_LISTA.CDFILIAL, '', '', '', 1, V_DATAINI, V_DATAFIN, '1', 'zzzzzzzzzz', 3, 1, V_CDSEQUENCIAL, 'N');

     END IF;

     V_OLDFILIAL  := C_LISTA.CDFILIAL;
     V_NRLANCLOTE := 0;

        FOR C_EST_AJUIMPL IN (
           SELECT I.CDFILLANCMEST, I.NRLANCMOVIEST, I.IDTIPOMOVIEST,
                  I.CDFILIMOVIEST, I.DTLANCMOVIEST,
                  ROUND(SUM(I.VRDIFECUST), 2) AS VRCUSTPROD,
                  (DECODE(IDTIPOMOVIEST, '0', CONTCTBL_PRODUTO(PD.CDPRODUTO, 'I', I.CDFILIMOVIEST), CONTCTBL_PRODUTO(PD.CDPRODUTO, 'A', I.CDFILIMOVIEST))) AS CDCONTCTBL,
                  CONTCTBL_PRODUTO(PD.CDPRODUTO, 'E', I.CDFILIMOVIEST) AS CDCONTCTBENTR,
                  NVL(NVL(PF.CDCCUSTENTRF,PD.CDCCUSTENTR),F.CDCENTCUST) AS CDCENTCUST
             FROM RELAT_MOVIEST I, PRODUTO PD, PRODFILI PF, FILIAL F
            WHERE (I.NRRELATMOVI   = V_CDSEQUENCIAL)
              AND (I.CDFILIMOVIEST = PF.CDFILIAL(+))
              AND (I.CDPRODMOVIEST = PF.CDPRODUTO(+))
              AND (I.CDPRODMOVIEST = PD.CDARVPROD(+))
              AND (I.CDFILIMOVIEST = F.CDFILIAL)
              AND (I.IDTIPOMOVIEST = C_LISTA.IDTIPOMOVIEST)            
            GROUP BY I.CDFILLANCMEST, I.NRLANCMOVIEST, I.IDTIPOMOVIEST,
                     I.CDFILIMOVIEST, I.DTLANCMOVIEST,
                     (DECODE(IDTIPOMOVIEST, '0', CONTCTBL_PRODUTO(PD.CDPRODUTO, 'I', I.CDFILIMOVIEST), CONTCTBL_PRODUTO(PD.CDPRODUTO, 'A', I.CDFILIMOVIEST))),
                     CONTCTBL_PRODUTO(PD.CDPRODUTO, 'E', I.CDFILIMOVIEST),
                     NVL(NVL(PF.CDCCUSTENTRF, PD.CDCCUSTENTR),F.CDCENTCUST) 
           HAVING (ROUND(SUM(I.VRDIFECUST), 2) <> 0)
            ORDER BY 5, 3, 2, 6, 9, 7) LOOP

             BEGIN
               SELECT CDEMPRESA
                 INTO V_CDEMPRESA
                 FROM FILIAL
                WHERE FILIAL.CDFILIAL = C_EST_AJUIMPL.CDFILIMOVIEST;
             EXCEPTION
              WHEN NO_DATA_FOUND THEN
                V_CDEMPRESA := NULL;
             END;

             GERA_LOTECONTABIL(V_CDEMPRESA, '05', '', C_EST_AJUIMPL.CDFILIMOVIEST, C_EST_AJUIMPL.DTLANCMOVIEST, '', '', V_CDLOTE, V_NRLANCLOTE);

          BEGIN
           SELECT CDHISTPADRAJIMP, DSHISTPADR
             INTO V_CDHISTPADR, V_DSHISTPADR
             FROM PARAMESTOQUE, HISTPADR
            WHERE CDHISTPADRAJIMP = CDHISTPADR;
          EXCEPTION
           WHEN NO_DATA_FOUND THEN
            V_CDHISTPADR := '';
            V_DSHISTPADR := '';
          END;

          IF C_EST_AJUIMPL.IDTIPOMOVIEST = '0' THEN
             V_DSHISTPADR := 'IMPLANTACAO';
          ELSE
             V_DSHISTPADR := 'AJUSTE';
          END IF;

          NOVA_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_EST_AJUIMPL.DTLANCMOVIEST,V_NRLANCLOTE,C_EST_AJUIMPL.CDCONTCTBL,V_CDHISTPADR,
                       V_DSHISTPADR, ROUND(C_EST_AJUIMPL.VRCUSTPROD,2),'','','05', C_EST_AJUIMPL.NRLANCMOVIEST, 'N');

          BEGIN
           SELECT IDCONTCCUS
             INTO V_IDCONTCCUS
             FROM CONTCTBL
            WHERE CDCONTCTBL =  C_EST_AJUIMPL.CDCONTCTBL;
          EXCEPTION
           WHEN NO_DATA_FOUND THEN
            V_IDCONTCCUS := NULL;
          END;

          IF C_EST_AJUIMPL.CDCENTCUST IS NOT NULL THEN
             IF V_IDCONTCCUS <> 'O' THEN
                RATEIO_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_EST_AJUIMPL.DTLANCMOVIEST,V_NRLANCLOTE,C_EST_AJUIMPL.CDFILIMOVIEST,
                               C_EST_AJUIMPL.CDCENTCUST,ROUND(C_EST_AJUIMPL.VRCUSTPROD,2));
             END IF;
          END IF;

          NOVA_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_EST_AJUIMPL.DTLANCMOVIEST,V_NRLANCLOTE,C_EST_AJUIMPL.CDCONTCTBENTR,V_CDHISTPADR,
                       V_DSHISTPADR, ROUND(C_EST_AJUIMPL.VRCUSTPROD * -1,2),'','','05', C_EST_AJUIMPL.NRLANCMOVIEST, 'N');

          BEGIN
           SELECT IDCONTCCUS
             INTO V_IDCONTCCUS
             FROM CONTCTBL
            WHERE CDCONTCTBL =  C_EST_AJUIMPL.CDCONTCTBENTR;
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
             V_IDCONTCCUS := NULL;
          END;

          IF C_EST_AJUIMPL.CDCENTCUST IS NOT NULL THEN
             IF V_IDCONTCCUS <> 'O' THEN
               RATEIO_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_EST_AJUIMPL.DTLANCMOVIEST,V_NRLANCLOTE,C_EST_AJUIMPL.CDFILIMOVIEST,
                               C_EST_AJUIMPL.CDCENTCUST,ROUND(C_EST_AJUIMPL.VRCUSTPROD,2));
             END IF;
          END IF;

          
          IF CONFERE_PARTIDA(V_CDEMPRESA, V_CDLOTE, V_NRLANCLOTE, C_EST_AJUIMPL.DTLANCMOVIEST) THEN
             UPDATE LANCTOESTOQ
                SET IDSTATUSCTBEST = 'C'
              WHERE CDFILIAL = C_EST_AJUIMPL.CDFILLANCMEST
                AND NRLANCESTQ = C_EST_AJUIMPL.NRLANCMOVIEST;
          ELSE
             UPDATE LANCTOESTOQ
                SET IDSTATUSCTBEST = 'E'
              WHERE CDFILIAL = C_EST_AJUIMPL.CDFILLANCMEST
                AND NRLANCESTQ = C_EST_AJUIMPL.NRLANCMOVIEST;
          END IF;
       END LOOP;
    END LOOP;

    DELETE FROM LISTA
     WHERE NRLISTA = P_NRLISTA;  
     
END;
/
