IF EXISTS (SELECT O.NAME
             FROM SYSOBJECTS O, SYSUSERS U
            WHERE O.NAME = 'CUSTO_MEDIO_CTBL'
              AND TYPE = 'P'
              AND U.UID = O.UID
              AND U.NAME = USER)
   DROP PROCEDURE CUSTO_MEDIO_CTBL
GO

CREATE PROCEDURE CUSTO_MEDIO_CTBL
   @P_CDFILIAL   VARCHAR(4),
   @P_DTREFEMES  DATETIME,
   @P_CDPRODINI  VARCHAR(20),
   @P_CDPRODFIN  VARCHAR(20)

AS

   DECLARE @V_TAMARV                 DOUBLE PRECISION;
   DECLARE @V_QTSALDOINI             DOUBLE PRECISION;
   DECLARE @V_VRSALDOINI             DOUBLE PRECISION;
   DECLARE @V_QTTOTENTRCUS           DOUBLE PRECISION;
   DECLARE @V_QTTOTALENTR            DOUBLE PRECISION;
   DECLARE @V_VRTOTENTRCUS           DOUBLE PRECISION;
   DECLARE @V_VRTOTALENTR            DOUBLE PRECISION;
   DECLARE @V_QTTOTALAUX             DOUBLE PRECISION;
   DECLARE @V_VRTOTALAUX             DOUBLE PRECISION;
   DECLARE @V_VRCUSTOCTBL            DOUBLE PRECISION;
   DECLARE @V_QTTOTALSAID            DOUBLE PRECISION;
   DECLARE @V_QTSALDOFIN             DOUBLE PRECISION;
   DECLARE @V_VRSALDOFIN             DOUBLE PRECISION;
   DECLARE @V_VRCUSTENTR             DOUBLE PRECISION;
   DECLARE @V_QTDEVOLUCAO            DOUBLE PRECISION;
   DECLARE @V_VRDEVOLUCAO            DOUBLE PRECISION;
   DECLARE @V_DTCUSTENTR             DATETIME;
   DECLARE @V_CDSEQUENCIAL           VARCHAR(20);
   DECLARE @V_NRNOTAFISC             VARCHAR(20);
   DECLARE @V_COUNT                  INTEGER;
   DECLARE @V_DTFIMPERIODO           DATETIME;

   DECLARE @C_PRODUTO_CDPRODUTO      VARCHAR(10);
   DECLARE @C_PRODUTO_CDPRODTOTAMOVI VARCHAR(20);
   DECLARE @C_PRODUTO_CDFILLANCMEST  VARCHAR(04);
   DECLARE @C_PRODUTO_NRLANCMOVIEST  VARCHAR(10);
   DECLARE @C_PRODUTO_NRSEQUMOVIEST  VARCHAR(4);
   DECLARE @C_PRODUTO_IDTIPOMOVIEST  VARCHAR(1);
   DECLARE @C_PRODUTO_CDTIPOOPERME   VARCHAR(2);
   DECLARE @C_PRODUTO_CDTIPORETIME   VARCHAR(2);
   DECLARE @C_PRODUTO_QTLANCAMENTO   DOUBLE PRECISION;
   DECLARE @C_PRODUTO_VRMOVIMENTO    DOUBLE PRECISION;
   DECLARE @C_PRODUTO_QTTOTALANT     DOUBLE PRECISION;
   DECLARE @C_PRODUTO_QTDEMOVIEST    DOUBLE PRECISION;
   DECLARE @C_PRODUTO_DTLANCESTQCM   DATETIME;
   DECLARE @C_PRODUTO_IDORDEMCLCCM   VARCHAR(01);

BEGIN

   SELECT @V_TAMARV = LEN(MAX(CDARVPROD))
   FROM PRODUTO;

   EXEC NOVO_CODIGO 'MOVIESTOQUE', @P_SEQUENCIAL = @V_CDSEQUENCIAL OUTPUT;
   SET @V_CDSEQUENCIAL = SUBSTRING(@V_CDSEQUENCIAL,11,10);

   SET @V_DTFIMPERIODO = DATEADD(MM, 1, @P_DTREFEMES) - DAY(DATEADD(MM, 1, @P_DTREFEMES));
   EXEC MOVIMENTACAO_ESTOQUE @P_CDFILIAL, NULL, NULL, NULL, @V_TAMARV, @P_DTREFEMES, @V_DTFIMPERIODO, @P_CDPRODINI, @P_CDPRODFIN, 3, '1', @V_CDSEQUENCIAL, 'N';

   DELETE
     FROM CUSTMEDCTBL
    WHERE CDFILIAL = @P_CDFILIAL
      AND DTCOMPCTBL = @P_DTREFEMES
      AND EXISTS (SELECT 1
                    FROM PRODUTO P
                   WHERE CUSTMEDCTBL.CDPRODUTO = P.CDPRODUTO
                     AND P.CDARVPROD BETWEEN @P_CDPRODINI AND @P_CDPRODFIN);

   DELETE
     FROM DESCLANCCMCTBL
    WHERE CDFILIAL = @P_CDFILIAL
      AND DTCOMPCTBL = @P_DTREFEMES
      AND EXISTS (SELECT 1
                    FROM PRODUTO P
                   WHERE DESCLANCCMCTBL.CDPRODUTO = P.CDPRODUTO
                     AND P.CDARVPROD BETWEEN @P_CDPRODINI AND @P_CDPRODFIN);

   SELECT @V_COUNT = COUNT(*)
     FROM CUSTMEDCTBL
    WHERE CDFILIAL = @P_CDFILIAL
      AND DTCOMPCTBL = DATEADD(MM, -1, @P_DTREFEMES);

   DECLARE C_PRODUTO CURSOR FOR
   SELECT DISTINCT PR.CDPRODTOTAMOVI, P.CDPRODUTO
     FROM RELAT_TOTAMOVI PR, PRODUTO P
    WHERE NRRELATTOTA = @V_CDSEQUENCIAL
      AND IDTIPOTOTAMOVI = 'P'
      AND P.CDARVPROD = PR.CDPRODTOTAMOVI
   OPEN C_PRODUTO;
   FETCH NEXT FROM C_PRODUTO INTO @C_PRODUTO_CDPRODTOTAMOVI, @C_PRODUTO_CDPRODUTO;

   WHILE (@@FETCH_STATUS = 0) BEGIN
      IF @V_COUNT = 0 BEGIN
         SELECT @V_QTSALDOINI = ISNULL(SUM(VRQTDEPINIME),0),
                @V_VRSALDOINI = ISNULL(SUM(VRSOMPINI),0)
           FROM RELAT_TOTAMOVI R
          WHERE CDPRODTOTAMOVI = @C_PRODUTO_CDPRODTOTAMOVI
            AND NRRELATTOTA = @V_CDSEQUENCIAL
            AND IDTIPOTOTAMOVI = 'P';

         SELECT @V_DTCUSTENTR = MIN(DTLANCMOVIEST)
           FROM RELAT_MOVIEST
          WHERE NRRELATMOVI = @V_CDSEQUENCIAL
            AND CDPRODMOVIEST = @C_PRODUTO_CDPRODTOTAMOVI
            AND IDTIPOMOVIEST = '2';

         IF @V_DTCUSTENTR IS NOT NULL BEGIN
            SELECT @V_VRCUSTENTR = ISNULL(MAX(VRLANCMOVIEST),0)
              FROM RELAT_MOVIEST
             WHERE NRRELATMOVI = @V_CDSEQUENCIAL
               AND CDPRODMOVIEST = @C_PRODUTO_CDPRODTOTAMOVI
               AND DTLANCMOVIEST = @V_DTCUSTENTR
               AND IDTIPOMOVIEST = '2';

            IF @V_VRCUSTENTR IS NOT NULL BEGIN
               SET @V_VRSALDOINI = ISNULL(@V_QTSALDOINI,0) * ISNULL(@V_VRCUSTENTR,0);
            END;
         END;
      END
      ELSE BEGIN
         SELECT @V_QTSALDOINI = ISNULL(SUM(QTSALDOFIN),0),
                @V_VRSALDOINI = ISNULL(SUM(VRSALDOFIN),0)
           FROM CUSTMEDCTBL
          WHERE CDFILIAL = @P_CDFILIAL
            AND DTCOMPCTBL = DATEADD(MM, -1, @P_DTREFEMES)
            AND CDPRODUTO = @C_PRODUTO_CDPRODUTO;
      END;

      SELECT @V_QTTOTENTRCUS = ISNULL(SUM(CASE IDTIPOMOVIEST WHEN '2' THEN (CASE CDTIPOOPERME WHEN '01' THEN QTLANCAMENTO ELSE 0 END) ELSE 0 END),0),

             @V_QTTOTALENTR = ISNULL(SUM(CASE IDTIPOMOVIEST WHEN '0' THEN (CASE QTLANCAMENTO WHEN ABS(QTLANCAMENTO) THEN QTLANCAMENTO ELSE 0 END)
                                                            WHEN '1' THEN (CASE QTLANCAMENTO WHEN ABS(QTLANCAMENTO) THEN QTLANCAMENTO ELSE 0 END) ELSE 0 END),0) +
                              ISNULL(SUM(CASE IDTIPOMOVIEST WHEN '2' THEN (CASE CDTIPOOPERME WHEN '01' THEN 0 ELSE QTLANCAMENTO END) ELSE 0 END),0),

             @V_VRTOTENTRCUS = ISNULL(SUM(CASE IDTIPOMOVIEST WHEN '2' THEN (CASE CDTIPOOPERME WHEN '01' THEN VRCUSTENTRME ELSE 0 END) ELSE 0 END),0),

             @V_QTTOTALSAID = ISNULL(SUM(CASE IDTIPOMOVIEST WHEN '0' THEN (CASE QTLANCAMENTO WHEN ABS(QTLANCAMENTO) THEN 0 ELSE ABS(QTLANCAMENTO) END)
                                                            WHEN '1' THEN (CASE QTLANCAMENTO WHEN ABS(QTLANCAMENTO) THEN 0 ELSE ABS(QTLANCAMENTO) END) ELSE 0 END),0) +
                              ISNULL(SUM(CASE IDTIPOMOVIEST WHEN '0' THEN 0 WHEN '1' THEN 0 WHEN '5' THEN 0 WHEN '2' THEN 0 ELSE ABS(QTLANCAMENTO) END),0),

             @V_QTDEVOLUCAO = ISNULL(SUM(CASE IDTIPOMOVIEST WHEN '5' THEN QTLANCAMENTO ELSE 0 END),0),

             @V_VRDEVOLUCAO = ISNULL(SUM(CASE IDTIPOMOVIEST WHEN '5' THEN VRLANCMOVIEST * QTLANCAMENTO ELSE 0 END),0)
        FROM RELAT_MOVIEST
       WHERE CDPRODMOVIEST = @C_PRODUTO_CDPRODTOTAMOVI
         AND NRRELATMOVI = @V_CDSEQUENCIAL
         AND IDTIPOMOVIEST <> '-';

      SET @V_QTTOTALAUX = @V_QTSALDOINI + @V_QTTOTENTRCUS - @V_QTDEVOLUCAO;
      SET @V_VRTOTALAUX = @V_VRSALDOINI + @V_VRTOTENTRCUS - @V_VRDEVOLUCAO;

      IF @V_VRTOTALAUX = 0 BEGIN
         SELECT @V_DTCUSTENTR = MIN(DTLANCMOVIEST)
           FROM RELAT_MOVIEST
          WHERE NRRELATMOVI = @V_CDSEQUENCIAL
            AND CDPRODMOVIEST = @C_PRODUTO_CDPRODTOTAMOVI
            AND IDTIPOMOVIEST = '0';

         IF @V_DTCUSTENTR IS NOT NULL BEGIN
            SELECT @V_VRCUSTENTR = ISNULL(MAX(VRCUSTMEDI),0)
              FROM RELAT_MOVIEST
             WHERE NRRELATMOVI = @V_CDSEQUENCIAL
               AND CDPRODMOVIEST = @C_PRODUTO_CDPRODTOTAMOVI
               AND DTLANCMOVIEST = @V_DTCUSTENTR
               AND IDTIPOMOVIEST = '0';

            IF @V_VRCUSTENTR > 0 BEGIN
               SET @V_VRTOTALAUX = @V_VRCUSTENTR * @V_QTTOTALAUX;
               SET @V_VRCUSTOCTBL = @V_VRCUSTENTR;
            END
            ELSE BEGIN
               SET @V_VRCUSTENTR = TEKNISA.CUSTO_PRODUTO(@P_CDFILIAL, @C_PRODUTO_CDPRODUTO, 3, DATEADD(MM, 1, @P_DTREFEMES) - 1, DATEADD(MM, 1, @P_DTREFEMES) - 1);
               SET @V_VRTOTALAUX = @V_VRCUSTENTR * @V_QTTOTALAUX;
               SET @V_VRCUSTOCTBL = @V_VRCUSTENTR;
            END;
         END;
      END
      ELSE BEGIN
         IF @V_QTTOTALAUX <> 0 BEGIN
            SET @V_VRCUSTOCTBL = @V_VRTOTALAUX/@V_QTTOTALAUX;
         END
         ELSE BEGIN
            SET @V_VRCUSTOCTBL = 0;
         END;
      END;

      SET @V_QTSALDOFIN = @V_QTTOTALAUX - @V_QTTOTALSAID + @V_QTTOTALENTR;
      SET @V_VRSALDOFIN = @V_QTSALDOFIN * @V_VRCUSTOCTBL;
      SET @V_VRTOTALENTR = @V_QTTOTALENTR * @V_VRCUSTOCTBL;

      INSERT INTO CUSTMEDCTBL
         (CDFILIAL, CDPRODUTO, DTCOMPCTBL, QTSALDOINI, VRSALDOINI,
          QTTOTALENTRCP, VRTOTALENTRCP, QTTOTALENTR, VRTOTALENTR,
          QTTOTALAUX, VRTOTALAUX, VRCUSTOCTBL, QTTOTALSAID, QTTOTALDEV,
          VRTOTALDEV, QTSALDOFIN, VRSALDOFIN)
      VALUES
         (@P_CDFILIAL, @C_PRODUTO_CDPRODUTO, @P_DTREFEMES, ISNULL(@V_QTSALDOINI,0), ISNULL(@V_VRSALDOINI,0),
          ISNULL(@V_QTTOTENTRCUS,0), ISNULL(@V_VRTOTENTRCUS,0), ISNULL(@V_QTTOTALENTR,0), ISNULL(@V_VRTOTALENTR,0),
          ISNULL(@V_QTTOTALAUX,0), ISNULL(@V_VRTOTALAUX,0), ISNULL(@V_VRCUSTOCTBL,0), ISNULL(@V_QTTOTALSAID,0), ISNULL(@V_QTDEVOLUCAO,0),
          ISNULL(@V_VRDEVOLUCAO,0), ISNULL(@V_QTSALDOFIN,0), ISNULL(@V_VRSALDOFIN,0));

      DECLARE C_DESCRICAO CURSOR FOR
      SELECT CDFILLANCMEST, NRLANCMOVIEST, NRSEQUMOVIEST, IDTIPOMOVIEST, CDTIPOOPERME, CDTIPORETIME,
             SUM(QTLANCAMENTO) AS QTLANCAMENTO,
             ISNULL(CASE IDTIPOMOVIEST WHEN '2' THEN (CASE CDTIPOOPERME WHEN '01' THEN VRLANCMOVIEST ELSE @V_VRCUSTOCTBL END)
                                       WHEN '5' THEN VRLANCMOVIEST ELSE @V_VRCUSTOCTBL END,0) AS VRMOVIMENTO,
             SUM(CASE QTTOTALANT WHEN '0' THEN QTTOTALANT WHEN '1' THEN QTTOTALANT ELSE 0 END) AS QTTOTALANT,
             SUM(CASE QTDEMOVIEST WHEN '0' THEN QTDEMOVIEST WHEN '1' THEN QTDEMOVIEST ELSE 0 END) AS QTDEMOVIEST,
             DTLANCMOVIEST, IDORDEMCALC
        FROM RELAT_MOVIEST
       WHERE CDPRODMOVIEST = @C_PRODUTO_CDPRODTOTAMOVI
         AND NRRELATMOVI = @V_CDSEQUENCIAL
         AND IDTIPOMOVIEST <> '-'
       GROUP BY CDFILLANCMEST, NRLANCMOVIEST, NRSEQUMOVIEST, IDTIPOMOVIEST, CDTIPOOPERME, CDTIPORETIME,
                ISNULL(CASE IDTIPOMOVIEST WHEN '2' THEN (CASE CDTIPOOPERME WHEN '01' THEN VRLANCMOVIEST ELSE @V_VRCUSTOCTBL END)
                                          WHEN '5' THEN VRLANCMOVIEST ELSE @V_VRCUSTOCTBL END,0),
                DTLANCMOVIEST, IDORDEMCALC

      OPEN C_DESCRICAO;

      FETCH NEXT FROM C_DESCRICAO INTO @C_PRODUTO_CDFILLANCMEST, @C_PRODUTO_NRLANCMOVIEST, @C_PRODUTO_NRSEQUMOVIEST,
                                       @C_PRODUTO_IDTIPOMOVIEST, @C_PRODUTO_CDTIPOOPERME, @C_PRODUTO_CDTIPORETIME,
                                       @C_PRODUTO_QTLANCAMENTO, @C_PRODUTO_VRMOVIMENTO, @C_PRODUTO_QTTOTALANT, @C_PRODUTO_QTDEMOVIEST,
                                       @C_PRODUTO_DTLANCESTQCM, @C_PRODUTO_IDORDEMCLCCM;

      WHILE (@@FETCH_STATUS = 0) BEGIN
         IF (@C_PRODUTO_IDTIPOMOVIEST = '2') OR (@C_PRODUTO_IDTIPOMOVIEST = '4') OR (@C_PRODUTO_IDTIPOMOVIEST = '5') BEGIN
            SELECT @V_NRNOTAFISC = MAX(NRNOTAFISC)
              FROM NOTAFISCAL N, LANCTOESTOQ LE
             WHERE LE.CDFILIAL = @C_PRODUTO_CDFILLANCMEST
               AND LE.NRLANCESTQ = @C_PRODUTO_NRLANCMOVIEST
               AND N.CDFILIAL = LE.CDFILIAL
               AND N.NRLANCTONF = LE.NRLANCTONF;
         END
         ELSE BEGIN
            SET @V_NRNOTAFISC = NULL;
         END;

         INSERT INTO DESCLANCCMCTBL
            (CDFILIAL, CDPRODUTO, DTCOMPCTBL, CDFILILANCCM, NRLANCESTQCM, NRSEQUITEMCM, NRNOTAFISCCM,
             IDTIPOMOVICM, CDTIPOOPERCM, CDTIPORETICM, QTMOVIMENTOCM, VRMOVIMENTOCM,
             DTLANCESTQCM, IDORDEMCLCCM)
         VALUES
            (@P_CDFILIAL, @C_PRODUTO_CDPRODUTO, @P_DTREFEMES, @C_PRODUTO_CDFILLANCMEST, @C_PRODUTO_NRLANCMOVIEST, @C_PRODUTO_NRSEQUMOVIEST, @V_NRNOTAFISC,
             @C_PRODUTO_IDTIPOMOVIEST, @C_PRODUTO_CDTIPOOPERME, @C_PRODUTO_CDTIPORETIME, @C_PRODUTO_QTLANCAMENTO, @C_PRODUTO_VRMOVIMENTO,
             @C_PRODUTO_DTLANCESTQCM, @C_PRODUTO_IDORDEMCLCCM);

         FETCH NEXT FROM C_DESCRICAO INTO @C_PRODUTO_CDFILLANCMEST, @C_PRODUTO_NRLANCMOVIEST, @C_PRODUTO_NRSEQUMOVIEST,
                                          @C_PRODUTO_IDTIPOMOVIEST, @C_PRODUTO_CDTIPOOPERME, @C_PRODUTO_CDTIPORETIME,
                                          @C_PRODUTO_QTLANCAMENTO, @C_PRODUTO_VRMOVIMENTO, @C_PRODUTO_QTTOTALANT, @C_PRODUTO_QTDEMOVIEST,
                                          @C_PRODUTO_DTLANCESTQCM, @C_PRODUTO_IDORDEMCLCCM;
      END;
      CLOSE C_DESCRICAO;
      DEALLOCATE C_DESCRICAO;

      FETCH NEXT FROM C_PRODUTO INTO @C_PRODUTO_CDPRODTOTAMOVI, @C_PRODUTO_CDPRODUTO;
   END;
   CLOSE C_PRODUTO;
   DEALLOCATE C_PRODUTO;
END;
GO

