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
-- =============================================
-- Author:      Vitacore (с)
-- Create date: 2019-10-29
-- Description: Проверка статуса рецепта
-- =============================================
CREATE PROCEDURE [dbo].[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, 0,			                'Невозможная операция (0:В работе -> 2:На обслуживании)'
    union select 0, 3, 1,			                'Невозможная операция (0:В работе -> 3:Отбракован)'
    union select 0, 4, 0,			                'Невозможная операция (0:В работе -> 4:Не обработан)'
    union select 0, 5, 0,			                'Невозможная операция (0:В работе -> 5:Отложен)'
    union select 0, 6, 0,			                'Невозможная операция (0:В работе -> 6:Реализован)'
    -- 1:Выписан
    union select 1, 0, 0,			                'Невозможная операция (1:Выписан -> 0:В работе)'
    union select 1, 1, 0,		                    'Невозможная операция (1:Выписан -> 1:Выписан)'
    union select 1, 2, 1,			                'Невозможная операция (1:Выписан -> 2:На обслуживании)'
    union select 1, 3, 1,			                'Невозможная операция (1:Выписан -> 3:Отбракован)'
    union select 1, 4, 1,			                'Невозможная операция (1:Выписан -> 4:Не обработан)'
    union select 1, 5, 1,			                'Невозможная операция (1:Выписан -> 5:Отложен)'
    union select 1, 6, 1,			                'Невозможная операция (1:Выписан -> 6:Реализован)'
    -- 2:На обслуживании
    union select 2, 0, 0,			                'Невозможная операция (2:На обслуживании -> 0:В работе)'
    union select 2, 1, 0,		                    'Невозможная операция (2:На обслуживании -> 1:Выписан)'
    union select 2, 2, 0,			                'Невозможная операция (2:На обслуживании -> 2:На обслуживании)'
    union select 2, 3, @ChangedByPharmacy,			'Невозможная операция (2:На обслуживании -> 3:Отбракован)'
    union select 2, 4, @ChangedByPharmacy,			'Невозможная операция (2:На обслуживании -> 4:Не обработан)'
    union select 2, 5, @ChangedByPharmacy,		    'Невозможная операция (2:На обслуживании -> 5:Отложен)'
    union select 2, 6, @ChangedByPharmacy,			'Невозможная операция (2:На обслуживании -> 6:Реализован)'
    -- 3:Отбракован
    union select 3, 0, 0,			                'Невозможная операция (3:Отбракован -> 0:В работе)'
    union select 3, 1, 0,			                'Невозможная операция (3:Отбракован -> 1:Выписан)'
    union select 3, 2, 0,			                'Невозможная операция (3:Отбракован -> 2:На обслуживании)'
    union select 3, 3, 0,			                'Невозможная операция (3:Отбракован -> 3:Отбракован)'
    union select 3, 4, 0,			                'Невозможная операция (3:Отбракован -> 4:Не обработан)'
    union select 3, 5, 0,			                'Невозможная операция (3:Отбракован -> 5:Отложен)'
    union select 3, 6, 0,			                'Невозможная операция (3:Отбракован -> 6:Реализован)'
    -- 4:Не обработан
    union select 4, 0, 0,			                'Невозможная операция (4:Не обработан -> 0:В работе)'
    union select 4, 1, 0,			                'Невозможная операция (4:Не обработан -> 1:Выписан)'
    union select 4, 2, @ChangedByPharmacy,			'Невозможная операция (4:Не обработан -> 2:На обслуживании)'
    union select 4, 3, 1,			                'Невозможная операция (4:Не обработан -> 3:Отбракован)'
    union select 4, 4, 0,			                'Невозможная операция (4:Не обработан -> 4:Не обработан)'
    union select 4, 5, @ChangedByPharmacy,			'Невозможная операция (4:Не обработан -> 5:Отложен)'
    union select 4, 6, @ChangedByPharmacy,			'Невозможная операция (4:Не обработан -> 6:Реализован)'
    -- 5:Отложен
    union select 5, 0, 0,			                'Невозможная операция (5:Отложен -> 0:В работе)'
    union select 5, 1, 0,			                'Невозможная операция (5:Отложен -> 1:Выписан)'
    union select 5, 2, 0,			                'Невозможная операция (5:Отложен -> 2:На обслуживании)'
    union select 5, 3, 0,			                'Невозможная операция (5:Отложен -> 3:Отбракован)'
    union select 5, 4, @ChangedByPharmacy,			'Невозможная операция (5:Отложен -> 4:Не обработан)'
    union select 5, 5, 0,			                'Невозможная операция (5:Отложен -> 5:Отложен)'
    union select 5, 6, @ChangedByPharmacy,			'Невозможная операция (5:Отложен -> 6:Реализован)'
	
    -- 6:Реализован -- 
    union select 6, 0, 0,			                'Невозможная операция (6:Реализован -> 0:В работе)'
    union select 6, 1, 0,			                'Невозможная операция (6:Реализован -> 1:Выписан)'
    union select 6, 2, 0,			                'Невозможная операция (6:Реализован -> 2:На обслуживании)'
    union select 6, 3, 0,			                'Невозможная операция (6:Реализован -> 3:Отбракован)'
    union select 6, 4, @ChangedByPharmacy,		    'Невозможная операция (6:Реализован -> 4:Не обработан)'
    union select 6, 5, 0,			                'Невозможная операция (6:Реализован -> 5:Отложен)'
    union select 6, 6, 0,			                'Невозможная операция (6:Реализован -> 6:Реализован)'

    -- Заполняем необходимые переменные из таблиц, с блокировкой по рецепту
    select @errorDescription = sv.error
          ,@isValid = case
                            when sv.valid is not null then sv.valid
                            else 0
                      end
    from [AKUZ].T_RECIPE r with(rowlock,xlock)
        join @statusValidation sv on sv.statusFrom = r.[Status]
                and
            sv.statusTo = @StatusTo
    where r.MedicalRecordID = @RecipeID

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