SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_CheckRecipeStatus]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[sp_CheckRecipeStatus]
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[rds].[sp_CheckRecipeStatus]') AND type in (N'P', N'PC'))
DROP PROCEDURE [rds].[sp_CheckRecipeStatus]
GO
-- =============================================
-- Author:      Vitacore (с)
-- Create date: 2019-10-29
-- Description: Проверка статуса рецепта
-- =============================================
CREATE PROCEDURE [rds].[sp_CheckRecipeStatus]
    @RecipeID uniqueidentifier,
    @StatusTo int,
    @IsNew bit = 0,
    @dateTime datetime = null,
    @ChangedByPharmacy bit = 0
AS
BEGIN

    SET NOCOUNT ON;

    declare @errorDescription varchar(max),
            @isValid bit
    declare @statusValidation table
        (
            statusFrom int,
            statusTo int,
            valid bit,
            error varchar(max)
        )

    insert into @statusValidation(statusFrom, statusTo, valid, error)
    -- 0:Выписан
          select 0, 0, @IsNew,						'Невозможная операция (0:Выписан -> 0:Выписан)'
    union select 0, 1, 1,							'Невозможная операция (0:Выписан -> 1:Отбракован)'
    union select 0, 2, 1,							'Невозможная операция (0:Выписан -> 2:Реализован)'
    union select 0, 3, 1,							'Невозможная операция (0:Выписан -> 3:На обслуживании)'
    union select 0, 4, 1,							'Невозможная операция (0:Выписан -> 4:Не обработан)'
    union select 0, 5, 1,							'Невозможная операция (0:Выписан -> 5:Отложен)'
    -- 1:Отбракован
    union select 1, 0, 0,							'Невозможная операция (1:Отбракован -> 0:Выписан)'
    union select 1, 1, 0,							'Невозможная операция (1:Отбракован -> 1:Отбракован)'
    union select 1, 2, 0,							'Невозможная операция (1:Отбракован -> 2:Реализован)'
    union select 1, 3, 0,							'Невозможная операция (1:Отбракован -> 3:На обслуживании)'
    union select 1, 4, 0,							'Невозможная операция (1:Отбракован -> 4:Не обработан)'
    union select 1, 5, 0,							'Невозможная операция (1:Отбракован -> 5:Отложен)'
    -- 2:Реализован -- 
    union select 2, 0, 0,							'Невозможная операция (2:Реализован -> 0:Выписан)'
    union select 2, 1, 0,							'Невозможная операция (2:Реализован -> 1:Отбракован)'
    union select 2, 2, @IsNew,						'Невозможная операция (2:Реализован -> 2:Реализован)'
    union select 2, 3, 0,							'Невозможная операция (2:Реализован -> 3:На обслуживании)'
    union select 2, 4, @ChangedByPharmacy,			'Невозможная операция (2:Реализован -> 4:Не обработан)'
    union select 2, 5, 0,							'Невозможная операция (2:Реализован -> 5:Отложен)'
    -- 3:На обслуживании
    union select 3, 0, 0,							'Невозможная операция (3:На обслуживании -> 0:Выписан)'
    union select 3, 1, @ChangedByPharmacy,			'Невозможная операция (3:На обслуживании -> 1:Отбракован)'
    union select 3, 2, @ChangedByPharmacy,			'Невозможная операция (3:На обслуживании -> 2:Реализован)'
    union select 3, 3, 0,							'Невозможная операция (3:На обслуживании -> 3:На обслуживании)'
    union select 3, 4, @ChangedByPharmacy,			'Невозможная операция (3:На обслуживании -> 4:Не обработан)'
    union select 3, 5, @ChangedByPharmacy,			'Невозможная операция (3:На обслуживании -> 5:Отложен)'
    -- 4:Не обработан
    union select 4, 0, 0,							'Невозможная операция (4:Не обработан -> 0:Выписан)'
    union select 4, 1, 1,							'Невозможная операция (4:Не обработан -> 1:Отбракован)'
    union select 4, 2, 1,							'Невозможная операция (4:Не обработан -> 2:Реализован)'
    union select 4, 3, 1,							'Невозможная операция (4:Не обработан -> 3:На обслуживании)'
    union select 4, 4, 0,							'Невозможная операция (4:Не обработан -> 4:Не обработан)'
    union select 4, 5, 1,							'Невозможная операция (4:Не обработан -> 5:Отложен)'
    -- 5:Отложен
    union select 5, 0, 0,							'Невозможная операция (5:Отложен -> 0:Выписан)'
    union select 5, 1, 0,							'Невозможная операция (5:Отложен -> 1:Отбракован)'
    union select 5, 2, @ChangedByPharmacy,			'Невозможная операция (5:Отложен -> 2:Реализован)'
    union select 5, 3, 0,							'Невозможная операция (5:Отложен -> 3:На обслуживании)'
    union select 5, 4, @ChangedByPharmacy,			'Невозможная операция (5:Отложен -> 4:Не обработан)'
    union select 5, 5, 0,							'Невозможная операция (5:Отложен -> 5:Отложен)'

    -- Заполняем необходимые переменные из таблиц, с блокировкой по рецепту
    select @errorDescription = sv.error
          ,@isValid = case
                            when sv.valid is not null then sv.valid
                            -- разрешено, если предыдущее изменение тоже вручную
                            when sv.statusFrom = 3 and sv.statusTo = 4 then 1
                            else 0
                      end
    from [RDS].T_RECIPE r
        join @statusValidation sv on sv.statusFrom = r.[Status]
                and
            sv.statusTo = @StatusTo
    where r.RecipeID = @RecipeID

    -- Если операция невозможна, возвращаем ошибку
    if (@isValid = 0)
        raiserror(@errorDescription, 16, 10)
END
GO
