/****** Object:  StoredProcedure [dbo].[P_ATUALIZA_AGENDA_SUPRIMENTO]    Script Date: 12/02/2015 07:08:55 ******/
IF EXISTS(SELECT * FROM sys.objects
			WHERE object_id = OBJECT_ID(N'[dbo].[P_ATUALIZA_AGENDA_SUPRIMENTO]') AND type IN(N'P', N'PC')
)
    DROP PROCEDURE [dbo].[P_ATUALIZA_AGENDA_SUPRIMENTO];
GO
GO
GO
/*
agendado para data futura ou atrasado dentro do permitido, deixa a data atual
atrasado fora do limite, calcula a data que encaixa dentro do permitido
*/
CREATE PROCEDURE [dbo].[P_ATUALIZA_AGENDA_SUPRIMENTO]
WITH ENCRYPTION
AS
 SET NOCOUNT ON
 DECLARE @ajuste TABLE(CD_EMP    INT
                         , CD_FABRIC INT
                         , FREQ_REV  INT
                         , DT_PROX   DATETIME);
	
	PRINT 'Gerar movimento financeira de comprador'
	EXEC P_EST_COMPRADOR_MOVIMENTACAO_EXECUTAR_EXEC_ALL 1;

     DECLARE @hoje DATETIME;
     SET @hoje = dbo.F_DIA(GETDATE());
     WITH ENTREGA
          AS ( /* Para entregas sem periodo fechado (8,12), ha o calculo do dia da semana */ 
          SELECT
                 CD_FABRIC
               , DIA_SEMANA = 2
          FROM
               EST_PROD_FABRIC
          WHERE SEGUNDA = 1
                AND FREQ_REV IN(8, 12)
          AND FLAG_GERAR_AGENDA = 0
          UNION ALL
          SELECT
                 CD_FABRIC
               , DIA_SEMANA = 3
          FROM
               EST_PROD_FABRIC
          WHERE TERCA = 1
                AND FREQ_REV IN(8, 12)
          AND FLAG_GERAR_AGENDA = 0
          UNION ALL
          SELECT
                 CD_FABRIC
               , DIA_SEMANA = 4
          FROM
               EST_PROD_FABRIC
          WHERE QUARTA = 1
                AND FREQ_REV IN(8, 12)
          AND FLAG_GERAR_AGENDA = 0
          UNION ALL
          SELECT
                 CD_FABRIC
               , DIA_SEMANA = 5
          FROM
               EST_PROD_FABRIC
          WHERE QUINTA = 1
                AND FREQ_REV IN(8, 12)
          AND FLAG_GERAR_AGENDA = 0
          UNION ALL
          SELECT
                 CD_FABRIC
               , DIA_SEMANA = 6
          FROM
               EST_PROD_FABRIC
          WHERE SEXTA = 1
                AND FREQ_REV IN(8, 12)
          AND FLAG_GERAR_AGENDA = 0),
          ENTREGA2
          AS (--se nao houve dia de entrega prevista na semana, pega no semana anterior
          SELECT
                 CD_FABRIC
               , DIA_SEMANA
          FROM
               ENTREGA
          UNION ALL --semana atual: seg=2, ter=3, ..., sex=6; semana_anterior:seg=-5, ter=-4, ..., sex=-1
          SELECT
                 CD_FABRIC
               , DIA_SEMANA = DIA_SEMANA - 7
          FROM
               ENTREGA),
          BASE1
          AS (--calcula o periodo se frequencia e 1,2,4 ou 28
          SELECT
                 CD_EMP = 1
               , f.CD_FABRIC
               , f.FREQ_REV
               , DIA_SEMANA = DATEPART(WEEKDAY, @hoje)
               , DT_BASE = CASE
                               WHEN FREQ_REV IN(1, 2, 4) THEN a.DT_AGENDAMENTO
                               WHEN a.DT_AGENDAMENTO > f.DT_AGENDAMENTO_DEFAULT THEN a.DT_AGENDAMENTO
                               ELSE f.DT_AGENDAMENTO_DEFAULT
                           END
               , PERIODO = CASE
                               WHEN FREQ_REV IN(1, 2, 4, 28) THEN 28 / FREQ_REV
                           END
          FROM
               EST_PROD_FABRIC f
               INNER JOIN EST_PROD_FABRIC_AGENDA A ON f.CD_FABRIC = a.CD_FABRIC
          WHERE F.INDICADOR_SUPRIMENTO = 1
                AND f.FLAG_GERAR_AGENDA = 0),
          BASE2
          AS (--calcula o atraso, se existir; para fequencias 8,12, calcula o dia da semana da ultima entrega prevista
          SELECT
                 CD_EMP
               , CD_FABRIC
               , PERIODO
               , DIA_SEMANA
               , FREQ_REV
               , DT_BASE
               , ATRASO = DATEDIFF(DAY, DT_BASE, @hoje)
               , ATRASO_PERMITIDO = ISNULL(PERIODO - 1, 0)
               , ULT_DIA =(SELECT MAX(DIA_SEMANA) FROM
								ENTREGA2  --Ultima entrega passada (dia da semana)
								WHERE CD_FABRIC = b.CD_FABRIC
										AND DIA_SEMANA <= b.DIA_SEMANA
							)
          FROM
               BASE1 b),
          BASE3
          AS (
          SELECT
                 CD_EMP
               , CD_FABRIC
               , FREQ_REV
               , ATRASO
               , DT_BASE
               , QT_DIAS = CASE
                               WHEN ATRASO <= ATRASO_PERMITIDO THEN NULL	--sem atraso ou dentro do permitido, mantem data
                               WHEN PERIODO IS NOT NULL THEN-ATRASO % PERIODO	--dias para a proxima entrega prevista
                               ELSE ULT_DIA - DIA_SEMANA
                           END						--idem 
          FROM
               BASE2)
          INSERT INTO @ajuste(CD_EMP
							, CD_FABRIC
							, FREQ_REV
							, DT_PROX
							)
            SELECT
                CD_EMP
                , CD_FABRIC
                , FREQ_REV
                , DT_PROX = ISNULL(DATEADD(DAY, QT_DIAS, @hoje), DT_BASE)
            FROM
                BASE3;
/*******************************************************************************************************************************/

	BEGIN TRANSACTION;

		UPDATE b
		SET
			STATUS = 1
		FROM @ajuste a
			JOIN EST_PED_ELTR_SUPRIMENTO_AGENDA b ON b.CD_EMP = a.CD_EMP
													AND b.CD_FABRIC = a.CD_FABRIC
		WHERE
			b.DT_AGENDA <> a.DT_PROX
			AND STATUS = 0;

		INSERT INTO EST_PED_ELTR_SUPRIMENTO_AGENDA (
										CD_EMP
										, CD_AGENDA
										, CD_FABRIC
										, DT_AGENDA
										, STATUS
										)
		SELECT
			CD_EMP
			, CD_AGENDA = ISNULL((SELECT MAX(CD_AGENDA)
									FROM
											EST_PED_ELTR_SUPRIMENTO_AGENDA WITH (XLOCK)
									WHERE CD_EMP = a.CD_EMP
								), 0) + ROW_NUMBER() OVER(PARTITION BY CD_EMP ORDER BY CD_FABRIC)
			, CD_FABRIC
			, DT_AGENDA = DT_PROX
			, STATUS = 0
		FROM
			@ajuste a
		WHERE NOT EXISTS (SELECT * FROM
									EST_PED_ELTR_SUPRIMENTO_AGENDA
							WHERE CD_EMP = a.CD_EMP
									AND CD_FABRIC = a.CD_FABRIC
									AND STATUS = 0 );


		INSERT INTO EST_PED_ELTR_SUPRIMENTO_AUDITORIA_AGENDA (
														CD_EMP
														, CD_CTR
														, CD_OCORRENCIA
														, CD_EVENTO
														, CD_TP_EVENTO
														, CD_FABRIC
														, CD_AGENDA
														, QTDE
														, DT_PREV_CP
														, CD_COMPRADOR
														, DT_CAD
														)
		SELECT
				a.CD_EMP
				, CD_CTR = ISNULL((SELECT MAX(CD_CTR)
									FROM
											EST_PED_ELTR_SUPRIMENTO_AUDITORIA_AGENDA WITH (XLOCK)
									WHERE CD_EMP = a.CD_EMP
								), 0) + ROW_NUMBER() OVER(PARTITION BY a.CD_EMP ORDER BY a.CD_FABRIC)
			, CD_OCORRENCIA = ISNULL( ( SELECT MAX(CD_OCORRENCIA) FROM
												EST_PED_ELTR_SUPRIMENTO_AUDITORIA_AGENDA WITH (XLOCK)
										WHERE CD_EMP = a.CD_EMP
										AND CD_AGENDA = a.CD_AGENDA
										), 0) + ROW_NUMBER() OVER(PARTITION BY a.CD_EMP, a.CD_AGENDA ORDER BY a.CD_FABRIC)
				, CD_EVENTO = 3 --ATRASO
				, CD_TP_EVENTO = 1 --ATRASO
				, CD_FABRIC = a.CD_FABRIC
				, CD_AGENDA = a.CD_AGENDA
				, QTDE = DATEDIFF(day, a.DT_AGENDA, @hoje)
				, DT_PREV_CP = a.DT_AGENDA + f.LEAD_TIME
				, f.CD_COMPRADOR
				, DT_CAD = GETDATE()
		FROM
				EST_PED_ELTR_SUPRIMENTO_AGENDA a
				JOIN EST_PROD_FABRIC f ON f.CD_FABRIC = a.CD_FABRIC
		WHERE a.STATUS = 0
				AND a.DT_AGENDA < @hoje
				AND f.FLAG_GERAR_AGENDA = 0
				AND F.INDICADOR_SUPRIMENTO = 1
				AND NOT EXISTS --agenda atual, data com atraso e nao cadastrou hoje
						( SELECT * FROM EST_PED_ELTR_SUPRIMENTO_AUDITORIA_AGENDA --Nao registra mais de uma vez por dia
						WHERE CD_EMP = a.CD_EMP
								AND CD_FABRIC = a.CD_FABRIC
								AND DT_CAD >= @hoje
						);

	--Alterando data agendamento Default para controle do cadastro
	UPDATE EST_PROD_FABRIC
	SET
		DT_AGENDAMENTO_DEFAULT = EST_PED_ELTR_SUPRIMENTO_AGENDA.DT_AGENDA
	FROM EST_PED_ELTR_SUPRIMENTO_AGENDA
		INNER JOIN EST_PROD_FABRIC ON EST_PED_ELTR_SUPRIMENTO_AGENDA.CD_FABRIC = EST_PROD_FABRIC.CD_FABRIC
	WHERE
		EST_PED_ELTR_SUPRIMENTO_AGENDA.STATUS = 0
		AND DT_AGENDAMENTO_DEFAULT <> EST_PED_ELTR_SUPRIMENTO_AGENDA.DT_AGENDA;

COMMIT TRANSACTION;