DROP PROCEDURE IF EXISTS sp_CheckRecipeStatus;
DROP PROCEDURE IF EXISTS public.sp_CheckRecipeStatus;

CREATE PROCEDURE public.sp_CheckRecipeStatus
(
	"RecipeID" uuid
,	"StatusTo" int
,	"IsNew" boolean DEFAULT '0'::boolean
,	"dateTime" timestamp without time zone DEFAULT NULL::timestamp without time zone	
,	"ChangedByPharmacy" boolean DEFAULT '0'::boolean
)
    language plpgsql
as
$$
Begin

	declare _errorDescription text;
			_isValid boolean;
	Begin
		-- Заполняем необходимые переменные из таблиц, с блокировкой по рецепту
		with sv(statusFrom, statusTo, valid, error)
		as
		(
		    -- 0:В работе
		    select 0, 0, "IsNew",		                'Невозможная операция (0:В работе -> 0:В работе)'
			union all select 0, 1, '1',		                'Невозможная операция (0:В работе -> 1:Выписан)'
			union all select 0, 2, '0',			            'Невозможная операция (0:В работе -> 2:На обслуживании)'
			union all select 0, 3, '1',			            'Невозможная операция (0:В работе -> 3:Отбракован)'
			union all select 0, 4, '0',			            'Невозможная операция (0:В работе -> 4:Не обработан)'
			union all select 0, 5, '0',			            'Невозможная операция (0:В работе -> 5:Отложен)'
			union all select 0, 6, '0',			            'Невозможная операция (0:В работе -> 6:Реализован)'
			-- 1:Выписан
			union all select 1, 0, '0',			                'Невозможная операция (1:Выписан -> 0:В работе)'
			union all select 1, 1, '0',		                    'Невозможная операция (1:Выписан -> 1:Выписан)'
			union all select 1, 2, '1',			                'Невозможная операция (1:Выписан -> 2:На обслуживании)'
			union all select 1, 3, '1',			                'Невозможная операция (1:Выписан -> 3:Отбракован)'
			union all select 1, 4, '1',			                'Невозможная операция (1:Выписан -> 4:Не обработан)'
			union all select 1, 5, '1',			                'Невозможная операция (1:Выписан -> 5:Отложен)'
			union all select 1, 6, '1',			                'Невозможная операция (1:Выписан -> 6:Реализован)'
			-- 2:На обслуживании
			union all select 2, 0, '0',			                'Невозможная операция (2:На обслуживании -> 0:В работе)'
			union all select 2, 1, '0',		                    'Невозможная операция (2:На обслуживании -> 1:Выписан)'
			union all select 2, 2, '0',			                'Невозможная операция (2:На обслуживании -> 2:На обслуживании)'
			union all select 2, 3, "ChangedByPharmacy",			'Невозможная операция (2:На обслуживании -> 3:Отбракован)'
			union all select 2, 4, "ChangedByPharmacy",			'Невозможная операция (2:На обслуживании -> 4:Не обработан)'
			union all select 2, 5, "ChangedByPharmacy",		    'Невозможная операция (2:На обслуживании -> 5:Отложен)'
			union all select 2, 6, "ChangedByPharmacy",			'Невозможная операция (2:На обслуживании -> 6:Реализован)'
			-- 3:Отбракован
			union all select 3, 0, '0',			                'Невозможная операция (3:Отбракован -> 0:В работе)'
			union all select 3, 1, '0',			                'Невозможная операция (3:Отбракован -> 1:Выписан)'
			union all select 3, 2, '0',			                'Невозможная операция (3:Отбракован -> 2:На обслуживании)'
			union all select 3, 3, '0',			                'Невозможная операция (3:Отбракован -> 3:Отбракован)'
			union all select 3, 4, '0',			                'Невозможная операция (3:Отбракован -> 4:Не обработан)'
			union all select 3, 5, '0',			                'Невозможная операция (3:Отбракован -> 5:Отложен)'
			union all select 3, 6, '0',			                'Невозможная операция (3:Отбракован -> 6:Реализован)'
			-- 4:Не обработан'
			union all select 4, 0, '0',			                'Невозможная операция (4:Не обработан -> 0:В работе)'
			union all select 4, 1, '0',			                'Невозможная операция (4:Не обработан -> 1:Выписан)'
			union all select 4, 2, "ChangedByPharmacy",			'Невозможная операция (4:Не обработан -> 2:На обслуживании)'
			union all select 4, 3, '1',			                'Невозможная операция (4:Не обработан -> 3:Отбракован)'
			union all select 4, 4, '0',			                'Невозможная операция (4:Не обработан -> 4:Не обработан)'
			union all select 4, 5, "ChangedByPharmacy",			'Невозможная операция (4:Не обработан -> 5:Отложен)'
			union all select 4, 6, "ChangedByPharmacy",			'Невозможная операция (4:Не обработан -> 6:Реализован)'
			-- 5:Отложен
			union all select 5, 0, '0',			                'Невозможная операция (5:Отложен -> 0:В работе)'
			union all select 5, 1, '0',			                'Невозможная операция (5:Отложен -> 1:Выписан)'
			union all select 5, 2, '0',			                'Невозможная операция (5:Отложен -> 2:На обслуживании)'
			union all select 5, 3, '0',			                'Невозможная операция (5:Отложен -> 3:Отбракован)'
			union all select 5, 4, "ChangedByPharmacy",			'Невозможная операция (5:Отложен -> 4:Не обработан)'
			union all select 5, 5, '0',			                'Невозможная операция (5:Отложен -> 5:Отложен)'
			union all select 5, 6, "ChangedByPharmacy",			'Невозможная операция (5:Отложен -> 6:Реализован)'
	
			-- 6:Реализован --
			union all select 6, 0, '0',			                'Невозможная операция (6:Реализован -> 0:В работе)'
			union all select 6, 1, '0',			                'Невозможная операция (6:Реализован -> 1:Выписан)'
			union all select 6, 2, '0',			                'Невозможная операция (6:Реализован -> 2:На обслуживании)'
			union all select 6, 3, '0',			                'Невозможная операция (6:Реализован -> 3:Отбракован)'
			union all select 6, 4, "ChangedByPharmacy",		    'Невозможная операция (6:Реализован -> 4:Не обработан)'
			union all select 6, 5, '0',			                'Невозможная операция (6:Реализован -> 5:Отложен)'
			union all select 6, 6, '0',			                'Невозможная операция (6:Реализован -> 6:Реализован)'
	    )
		select into
			_errorDescription, _isValid
			sv.error, case when sv.valid is not null then sv.valid else '0' end
		from AKUZ.T_RECIPE r
		inner join sv
			on sv.statusFrom = r.Status
			and sv.statusTo = "StatusTo"
		where r.MedicalRecordID = "RecipeID"
		for update;
	
		-- Если операция невозможна, возвращаем ошибку
		if _isValid = '0'
		then
			Raise Exception Using Message = _errorDescription;
			return;
		end if;
	end;
End;
$$;
