/* TEKNISA

Nome: 7602_PMESTPS_PREVISAO_CONSUMO_PME.SQL

Descri��o:
C�lculo da Previs�o de Consumo atrav�s da stored procedure CONSUMO_PLANEJADO e
grava��o na tabela PREVCONS.

P_CDFILCENTPME - Codigo da Filial Central de Merenda
P_CDFILIAL     - Codigo da filial
P_CDTIPOCARD   - Codigo do Tipo de Card�pio
P_SERVFILI     - String contendo sequ�ncia de servi�os a serem calculados
P_DTINICIAL    - Data inicial de c�lculo
P_DTFINAL      - Data final de c�lculo
P_PEACRESCIMO  - Percentual de acr�scimo
P_CDPRODUTOINI - C�digo do produto inicial (CDARVPROD)
P_CDPRODUTOFIN - C�digo do produto final   (CDARVPROD)
P_CDOPERADOR   - C�digo do operador que solicitou o c�lculo
P_DTHRCALCPC   - Data/hora do c�lculo
P_NRCONSPLAN   - N�mero sequencial a ser utilizado para grava��o dos dados na
                 tabela CONSPLAN (tabela de trabalho)
P_STDTINICIAL  - Lista de data inicial (em string) por servi�o
P_STDTFINAL    - Lista de data final (em string) por servi�o

Observa��o: o formato das strings de data inicial e de data final deve ser
"_YYYYMMDD_YYYYMMDD_YYYYMMDD_"
"_YYYYMMDD_YYYYMMDD_YYYYMMDD_"


Para aplicar e debugar
-- @C:\Web_Evol\Sql\End_Conv\Oracle\7602_PMESTPO_PREVISAO_CONSUMO_PME.SQL
-- START H:\WORKDIR\Ederson\BACKUP\MANUTEN��O\7130_PLASTP_PREVISAO_DE_CONSUMO_PLA.SQL;
-- SET SERVEROUTPUT ON
-- DBMS_OUTPUT.PUT_LINE('xx');

Cria��o:
15/02/2006 - Rafael Christopher de Souza e Silva

*/

IF EXISTS(SELECT name FROM sysobjects
          WHERE name = 'PREVISAO_CONSUMO_PME' AND type = 'P')
  DROP PROCEDURE PREVISAO_CONSUMO_PME
  GO

CREATE PROCEDURE PREVISAO_CONSUMO_PME
   @P_CDFILCENTPME VARCHAR(4),
   @P_CDTIPOCARD   VARCHAR(2000), /*LISTA*/
   @P_CDFILIAL     VARCHAR(2000), /*LISTA*/
   @P_CDSERVFILI   VARCHAR(2000), /*LISTA*/
   @P_DTINICIAL    DATETIME,
   @P_DTFINAL      DATETIME,
   @P_PEACRESCIMO  NUMERIC(15,6),
   @P_CDPRODUTOINI VARCHAR(10),
   @P_CDPRODUTOFIN VARCHAR(10),
   @P_CDOPERADOR   VARCHAR(12),
   @P_DTHRCALCPC   DATETIME,
   @P_NRCONSPLAN   VARCHAR(10),
   @P_IDARREDOND   VARCHAR(1),
   @P_STDTINICIAL  VARCHAR(2000) = NULL,
   @P_STDTFINAL    VARCHAR(2000) = NULL
AS
   DECLARE @V_CUR_CDFILIAL     VARCHAR(2000);
   DECLARE @V_CUR_CDTIPOCARD   VARCHAR(2000);
   DECLARE @V_CUR_CDSERVFILI   VARCHAR(2000);
   DECLARE @V_CDARVINI         VARCHAR(20);
   DECLARE @V_CDARVFIN         VARCHAR(20);
   DECLARE @V_IDCOMCUSPERC     VARCHAR(1);
   DECLARE @V_IDCALPADCMP      VARCHAR(1);
   DECLARE @V_CDTPCUSTCMP      VARCHAR(2);
   DECLARE @V_INTPCUSTCMP      NUMERIC(15, 5);
   DECLARE @V_VRINDCALCMP      NUMERIC(15, 5);
   DECLARE @V_QTCOMES          NUMERIC(15, 5);
   DECLARE @V_VRCUSTO          NUMERIC(15, 5);
   DECLARE @V_VRCUSTOPERC      NUMERIC(15, 5);
   DECLARE @V_VRCUSTOPADR      NUMERIC(15, 5);
BEGIN
   SET @V_CDARVINI = @P_CDPRODUTOINI;
   SET @V_CDARVFIN = SUBSTRING(@P_CDPRODUTOFIN + REPLICATE('z', 10), 1, 10);

   /* - EXCLUS�O DOS REGISTROS ANTERIORES DA PREVCONS ----- */

   DELETE FROM PREVCONSPME
   WHERE
      (CDFILCENTPME = @P_CDFILCENTPME) AND
      (CHARINDEX(CDTIPOCARD, ISNULL(@P_CDTIPOCARD, CDTIPOCARD)) > 0) AND
      (CHARINDEX(CDFILIAL,   ISNULL(@P_CDFILIAL,   CDFILIAL  )) > 0) AND
      (CHARINDEX(CDSERVFILI, ISNULL(@P_CDSERVFILI, CDSERVFILI)) > 0) AND
      (DTPREVCONPME BETWEEN @P_DTINICIAL AND @P_DTFINAL ) AND
      (EXISTS (SELECT CDPRODUTO
                      FROM PRODUTO
                      WHERE CDARVPROD BETWEEN @V_CDARVINI AND @V_CDARVFIN
                        AND PRODUTO.CDPRODUTO = PREVCONSPME.CDPRODUTO));

   /* CALCULA OS DADOS ATRAV�S DA STORED PROCEDURE CONSUMO PLANEJADO */

   EXEC CONSUMO_PLANEJADO_PME  @P_CDFILCENTPME,
                               @P_CDTIPOCARD,
                               @P_CDFILIAL,
                               @P_CDSERVFILI,
                               @P_DTINICIAL,
                               @P_DTFINAL,
                               'C',   /* GRAVA��O NA TABELA CONSPLAN */
                               'CFP', /* CARD�PIO, CONSUMO FIXO E PERCAPITA */
                               'N',   /* N�O SEPARAR POR SETOR */
                               @P_PEACRESCIMO,
                               @P_IDARREDOND,
                               @P_NRCONSPLAN,
                               @V_CDARVINI,
                               @V_CDARVFIN,
                               @P_CDOPERADOR;

   SELECT
      @V_IDCALPADCMP = MAX(IDCALPADCMP),
      @V_CDTPCUSTCMP = MAX(CDTPCUSTCMP),
      @V_VRINDCALCMP = MAX(VRINDCALCMP)
   FROM
      PARAMPLANEJA
   WHERE
      (CDFILIAL = @P_CDFILCENTPME);

   SET @V_INTPCUSTCMP = CONVERT(INTEGER, @V_CDTPCUSTCMP);

   SELECT
      @V_IDCOMCUSPERC = MAX(IDCOMCUSPERC)
   FROM
      PARAMFILIAL
   WHERE
      (CDFILIAL = @P_CDFILCENTPME);

   IF (@V_IDCALPADCMP = 'S') BEGIN
      DECLARE CUR_SERVICO CURSOR FOR
         SELECT
            C.CDFILICPLA AS CDFILIAL,
            C.CDSERVCPLA AS CDSERVFILI,
            C.CDTPCARDPME AS CDTIPOCARD
         FROM
            CONSPLAN C,
            FILIAL F
         WHERE
            (C.NRCONSPLAN   = @P_NRCONSPLAN   ) AND
            (F.CDFILCENTPME = @P_CDFILCENTPME ) AND
            (C.CDFILICPLA   = F.CDFILIAL      )
          GROUP BY
             C.CDFILICPLA,
             C.CDSERVCPLA,
             C.CDTPCARDPME;

      OPEN CUR_SERVICO;
      FETCH NEXT FROM CUR_SERVICO INTO @V_CUR_CDFILIAL,
                                       @V_CUR_CDSERVFILI,
                                       @V_CUR_CDTIPOCARD;


      SET @V_VRCUSTO = 0.0;

      WHILE (@@FETCH_STATUS = 0) BEGIN
         SELECT @V_VRCUSTO = SUM(TEKNISA.CUSTO_PRODUTO(@P_CDFILCENTPME,
                                                       CONSPLAN.CDPRODCPLA,
                                                       @V_INTPCUSTCMP,
                                                       CONSPLAN.DTCONSPLAN,
                                                       GETDATE()) * CONSPLAN.QTCONSPLAN)
         FROM CONSPLAN
         WHERE (CONSPLAN.NRCONSPLAN  = @P_NRCONSPLAN    ) AND
               (CONSPLAN.CDFILICPLA  = @V_CUR_CDFILIAL  ) AND
               (CONSPLAN.CDSERVCPLA  = @V_CUR_CDSERVFILI) AND
               (CONSPLAN.CDTPCARDPME = @V_CUR_CDTIPOCARD);

         IF (@V_VRCUSTO IS NULL) BEGIN
            SET @V_VRCUSTO = 0.0;
         END;

         SELECT
            @V_VRCUSTOPADR = SUM(ISNULL(VRCUSPADTCAR * @V_VRINDCALCMP, 0.0))
         FROM
            CUSTPADTCARD C,
            (SELECT
                CDFILCENTPME,
                CDTIPOCARD,
                CDSERVFILI,
                MAX(DTREFCUSTCAR) AS DTREFCUSTCAR
             FROM
                CUSTPADTCARD
             WHERE
                (CDFILCENTPME = @P_CDFILCENTPME ) AND
                (CDTIPOCARD   = @V_CUR_CDTIPOCARD   ) AND
                (CDSERVFILI   = @V_CUR_CDSERVFILI   ) AND
                (DTREFCUSTCAR <= @P_DTFINAL         )
             GROUP BY
                CDFILCENTPME,
                CDTIPOCARD,
                CDSERVFILI
            ) D
         WHERE
            (C.CDFILCENTPME = D.CDFILCENTPME ) AND
            (C.CDTIPOCARD   = D.CDTIPOCARD   ) AND
            (C.CDSERVFILI   = D.CDSERVFILI   ) AND
            (C.DTREFCUSTCAR = D.DTREFCUSTCAR );

         SELECT
            @V_QTCOMES = SUM(CASE @V_IDCOMCUSPERC
                                WHEN 'C' THEN
                                   QTCLIESTCPME
                                ELSE
                                   QTCOMESTCPME
                             END)
         FROM
            CARDAPIOPME C,
            CARDIAPME CD
         WHERE
            (C.CDFILCENTPME = @P_CDFILCENTPME  ) AND
            (C.CDTIPOCARD   = @V_CUR_CDTIPOCARD) AND
            (CD.CDFILIAL    = @V_CUR_CDFILIAL  ) AND
            (C.CDFILCENTPME = CD.CDFILCENTPME  ) AND
            (C.NRCARDPME    = CD.NRCARDPME     ) AND
            (CD.CDFILIAL    <> CD.CDFILCENTPME ) AND
            (CD.CDSERVFILI  = @V_CUR_CDSERVFILI) AND
            (CD.DTCARDIAPME BETWEEN @P_DTINICIAL AND @P_DTFINAL);

         SET @V_VRCUSTOPERC = 0;

         IF (@V_QTCOMES <> 0.0) AND (@V_VRCUSTO <> 0.0) BEGIN
            SET @V_VRCUSTOPERC = (@V_VRCUSTO/@V_QTCOMES);
         END;

         IF (@V_VRCUSTOPADR > @V_VRCUSTOPERC) BEGIN
            /* INSERE NA TABELA PREVCONS AS INFORMA��ES CALCULADAS NA CONSPLAN */

            INSERT INTO PREVCONSPME
               (CDFILCENTPME,
                CDTIPOCARD,
                CDFILIAL,
                CDSERVFILI,
                CDPRODUTO,
                DTPREVCONPME,
                QTPREVCONPME)
            SELECT
               @P_CDFILCENTPME AS CDFILCENTPME,
               CDTPCARDPME,
               CDFILICPLA,
               CDSERVCPLA,
               CDPRODCPLA,
               DTCONSPLAN,
               SUM(QTCONSPLAN)
            FROM CONSPLAN
            WHERE
               (NRCONSPLAN  = @P_NRCONSPLAN    ) AND
               (CDFILICPLA  = @V_CUR_CDFILIAL  ) AND
               (CDTPCARDPME = @V_CUR_CDTIPOCARD) AND
               (CDSERVCPLA  = @V_CUR_CDSERVFILI)
            GROUP BY
               CDFILCENTPME,
               CDTPCARDPME,
               CDFILICPLA,
               CDSERVCPLA,
               CDPRODCPLA,
               DTCONSPLAN;
         END;
         FETCH NEXT FROM CUR_SERVICO INTO @V_CUR_CDFILIAL,
                                          @V_CUR_CDSERVFILI,
                                          @V_CUR_CDTIPOCARD;
      END;
      CLOSE CUR_SERVICO;
      DEALLOCATE CUR_SERVICO;
   END
   ELSE BEGIN
      /* INSERE NA TABELA PREVCONS AS INFORMA��ES CALCULADAS NA CONSPLAN */
      INSERT INTO PREVCONSPME
        (CDFILCENTPME, CDTIPOCARD, CDFILIAL, CDSERVFILI, CDPRODUTO, DTPREVCONPME, QTPREVCONPME)
        (SELECT
            @P_CDFILCENTPME AS CDFILCENTPME, CDTPCARDPME, CDFILICPLA,
            CDSERVCPLA, CDPRODCPLA, DTCONSPLAN, SUM(QTCONSPLAN)
         FROM CONSPLAN
         WHERE
            (NRCONSPLAN   = @P_NRCONSPLAN  ) AND
            (CDFILCENTPME = @P_CDFILCENTPME) AND
            (CHARINDEX(CDTPCARDPME, ISNULL(@P_CDTIPOCARD, CDTPCARDPME)) > 0) AND
            (CHARINDEX(CDFILICPLA, ISNULL(@P_CDFILIAL,   CDFILICPLA  )) > 0) AND
            (CHARINDEX(CDSERVCPLA, ISNULL(@P_CDSERVFILI, CDSERVCPLA  )) > 0) AND
            (DTCONSPLAN BETWEEN @P_DTINICIAL AND @P_DTFINAL)
         GROUP BY
            CDFILCENTPME, CDTPCARDPME, CDFILICPLA,
            CDSERVCPLA, CDPRODCPLA, DTCONSPLAN);
   END;

   /* APAGA OS DADOS DA TABELA DE TRABALHO UTILIZADA NO C�LCULO*/
   DELETE FROM CONSPLAN
   WHERE
      NRCONSPLAN   = @P_NRCONSPLAN AND
      CDFILCENTPME = @P_CDFILCENTPME ;
END;
GO



-- VERSAO --
EXEC ATUVEROBJ 'PREVISAO_CONSUMO_PME','6.49.022';
GO

