-- =============================================
-- Author:      Vitacore (с)
-- Create date: 2017-10-19
-- Description: Формирование приглашений на диспансеризацию
-- =============================================
drop procedure if exists sp_DirectDispancerClinicEx;
CREATE PROCEDURE sp_DirectDispancerClinicEx
(
	"Year" varchar(4) -- Год формирования списка диспансеризации
,	"BranchCode" varchar(16)  --  Код филиала
)
As 
$$
Begin
	insert into AKUZ.T_CLINIC_EXAMINATION_ITEM(ClinicExaminationItemID, Patient, Branch, Status, DateVisited, DatePlannedDisp
											   , CreatePlace, RdsDispPatient, ExaminationType)
	select uuid_generate_v4(), dpt.ID_PAC::UUID, dpt.Branch, 0  -- 0 Назначен на прохождение  -- 1 выслано приглашение на диспансеризацию
	, ("Year" || right('0' || dpt.MonthDISP::VARCHAR(2),2) || '01')::timestamp
	, ("Year" || right('0' || dpt.MonthDISP::VARCHAR(2),2) || '01')::timestamp  -- Дата прохождения (по НАЗНАЧЕННОМУ месяцу)
	, 1, RdsDispPatientID, 2
	from 
	(
		-- Выбрать уникальныx пациентов из плановой диспансеризации, 
		-- прошедших идентификацию ( и в результате -  с установленной страховой компанией) ,
		-- у которых за ПОСЛЕДНЮЮ дату направления на диспансеризацию на заданный период (год)  тип - Добавить, Редактировать
		select pt.FAM, t3.ID_PAC, t3.TimeCreate, pt.STAGE, pt.TYPE, pk.InsuranceCompany, pk.Branch , pt.DR, pt.SMO, pt.YEAR, pt.BranchCode, pt.MonthDISP, pt.RdsDispPatientID
		from  
		(
			select  pt.ID_PAC, max(pk.TimeCreate) TimeCreate  
			from AKUZ.T_RDS_DISP_PATIENT pt
			inner join 
				AKUZ.T_RDS_DISP_PACKAGE pk 
				on pk.RdsdispPackageID = pt.RdsDispPackage
			where pk.YearDisp = "Year"::Int
			and pk.InsuranceCompany is not null   -- с установленной страховой компанией
			group by pt.ID_PAC
		) t3
		inner join
			AKUZ.T_RDS_DISP_PATIENT pt 
			on pt.ID_PAC = t3.ID_PAC 
		inner join 
			AKUZ.T_RDS_DISP_PACKAGE pk 
			on pk.RdsdispPackageID = pt.RdsDispPackage 
			and pk.TimeCreate = t3.TimeCreate
		where pk.YearDisp = "Year"::Int 
		and pk.InsuranceCompany is not null
		and pt.TYPE in (0,1) --   исключаем пациентов, которые были удалены в последнем направлении на диспансеризацию (выберам только- Добавить, Редактировать)			
	) dpt
	where dpt.SMO is not null and dpt.SMO <> ''    --  Определена СМО
	and dpt.YEAR = "Year"::Int
	--and dpt.BranchCode = @BranchCode
	and NOT EXISTS   -- пациент в заданном году ещё не был включен в список диспансеризации
	(
		SELECT* FROM AKUZ.T_CLINIC_EXAMINATION_ITEM cei WHERE cei.Patient = dpt.ID_PAC::UUID and cei.DateVisited between ("Year" || '0101')::timestamp and ("Year" || '1231 23:59:59.997')::timestamp
	)
	and EXISTS  -- ID пациента есть в наличи 
	(
		SELECT *  FROM AKUZ.T_PATIENT p WHERE p.PatientID = dpt.ID_PAC::UUID
	);
End;
$$ Language plpgsql;