IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_BurDirectionRIACfluoro]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[sp_BurDirectionRIACfluoro]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:      Vitacore (с)
-- Create date: 2017-02-07
-- Description: Передать информацию об услуге ФЛГ  в буряцкий РИАЦ
-- =============================================
CREATE PROCEDURE [dbo].[sp_BurDirectionRIACfluoro]
       @MedicalRecordID  uniqueidentifier
	   ,@IDPatient	 uniqueidentifier
	   ,@User uniqueidentifier = null
	   ,@QueueName varchar(100) = 'Bur.RIACSync' 

AS
BEGIN
	SET NOCOUNT ON;

	declare  
		 @PrEx uniqueidentifier
		,@Result varchar(max)
		,@Type varchar(255)
		,@OwnerID uniqueidentifier
		,@dateTime datetime = null
		,@ContentEncoding varchar(255)
		,@TYPE_WEBSER varchar(16) 
		,@TYPE_OPER varchar(16)  
	    ,@Region  varchar(32)
	    ,@LpuMain uniqueidentifier
		,@EventID uniqueidentifier
		,@PostingDate varchar(10)
		,@EventDate   varchar(10)
		,@CloseDate varchar(10)
		,@oid varchar(128)
		,@Snils varchar(32)
		,@idPlace varchar(16) 
		,@isExtraordinary bit
		,@idReasonExtraCode varchar(16)  
		,@PrgDecision  varchar(255)
		,@AddInfo  varchar(512)
	  
		,@IDAK  uniqueidentifier = null
		,@oid_Pat varchar(128)
		,@AttachDate varchar(10)
		,@Number varchar(64) -- полис
		,@Serial varchar(16)
		,@TypePolis int 
		,@FirstName varchar(64) 
		,@FatherName varchar(64) 
		,@LastName varchar(64) 
		,@Snils_Pat varchar(14) 
		,@Sex int
		,@BirthDate  varchar(10)

		,@DeathDate  varchar(10)
		,@Group varchar(16)
		,@dateStart varchar(10)
		,@dateStartWithoutReg  varchar(10)

		select @dateTime =  GETDATE()
			,@TYPE_WEBSER = 'tuberws'
			,@TYPE_OPER = 'AddFluoroGraphy'  --  операция 
			,@Type = 'fluorograf'
			,@OwnerID =  @MedicalRecordID
			,@ContentEncoding = 'utf-8'		

		
		--  собираем данные для услуги ФЛГ осмотра
		select 
		  @EventID = eb.EventID				-- Идентификатор случая в МИС 

		  ,@PostingDate =convert(varchar(10),acr.PostingDate, 120) 	-- 1..1 Дата события	= Дата открытия случая

	 	  ,@EventDate =	convert(varchar(10),eb.EventDate, 120)		-- 1..1 Дата начала оказания услуги
		  ,@CloseDate =  convert(varchar(10),eb.CloseDate, 120)		-- Дата окончания услуги

		  ,@oid = isnull(erm.oid,'')	    -- Идентификатор МУ. ЛПУ проводившее исследование
		  ,@Snils = IsNull(w.Snils,'')		-- Идентификатор врача. В качестве идентификатора указывается СНИЛС в формате: ЧЧЧ-ЧЧЧ-ЧЧЧ ЧЧ
		  ,@idPlace = 
		   case 
			   when pdev.MobileDevice = 1 then '2'								
			   else '1'
		   end          -- 1..1	Место оказания. Приложение 4   (1-ЛПУ,   2-Передвижная флюороустановка)

		  ,@isExtraordinary =  
		   case 
				when  (isnull(prex.NameShort,'') = '') then 0    
				else 1									
			end								 --  1..1	Проведен ли осмотр во внеочередном порядке

		 ,@idReasonExtraCode = IsNull(prex.Code,'')
		 ,@PrgDecision = te.Name			 --  1..1	Результат осмотра   = Заключение флюорографии
		 ,@AddInfo = pg.AddInfo				 --  0..1	Примечания
		 ,@Group = isnull(ctg.Code,'')		 --	 код контенгента

		 from [AKUZ].T_PRG_DIAGNOSTICS pg
			LEFT JOIN [AKUZ].T_MEDICAL_RECORD mr on mr.MedicalRecordID =  pg.MedicalRecordID
			LEFT JOIN [AKUZ].T_DIAGNOSTICS_RESULTS dr on dr.MedicalRecordID = pg.MedicalRecordID 
			LEFT JOIN [AKUZ].T_AMBULANCE_CARD_RECORD acr on acr.MedicalRecordID = pg.MedicalRecordID 
			LEFT JOIN [AKUZ].T_AMBULANCE_CARD ac on acr.AmbulanceCard = ac.AmbulanceCardID
			JOIN AKUZ.T_LPU_MAIN lm ON lm.LpuID = ac.CardLpu   
			JOIN EHR.T_EHR_RUS er ON er.EhrRusID = lm.EhrRusMdr308
			JOIN EHR.T_EHR_RUS_MDR308 erm ON erm.EhrRusID = er.EhrRusID 

			LEFT JOIN [AKUZ].T_EVENT_BASE eb on eb.EventID = acr.AmbulanceEvent
							 
			LEFT JOIN [AKUZ].T_POST post on  post.ResourceID = mr.Post  
			LEFT JOIN [AKUZ].T_WORKER w on w.WorkerID = post.Worker  -- сотрудник (получаем Идентификатор врача) 
			LEFT JOIN [VCLib].T_ENUMS te on te.EnumID = pg.PrgDecision
		
		
			LEFT JOIN [AKUZ].T_PRG_REASON_EXTRAORDINARY prex on prex.PrgReasonExtraordinaryID = pg.PrgReasonExtraordinary
			LEFT JOIN [AKUZ].T_PRG_DEVICE pdev on pdev.PrgDeviceID = pg.PrgDevice
			LEFT JOIN [AKUZ].T_PRG_CONTINGENT ctg on ctg.PrgContingentID = pg.PrgContingent

		where  pg.MedicalRecordID = @MedicalRecordID



		-- Для случая, когда пациент нигде не зарегистрирован, но диагностику проходит
	    select top 1 
		 @dateStartWithoutReg = convert(varchar(10),ak3.CreationDateTime, 120) from AKUZ.T_AMBULANCE_CARD ak3 where ak3.Patient = @IDPatient  order by ak3.CreationDateTime desc

		--  собираем данные  о  пациенте (чтобы его добавить/изменить, если он отсутствует в базе РИАС)
		SELECT 	top 1
			@IDAK = ac.AmbulanceCardID, 
			@LastName = IsNull(p.LastName,''),
			@FirstName = IsNull(p.FirstName,''), 
			@FatherName = IsNull(p.FatherName, ''), 
			@Snils_Pat = IsNull(REPLACE(REPLACE(p.SNILS,'-',''),' ',''),''),
			
			@BirthDate = convert(varchar(10),p.Birthday, 120),

			@Sex = e.Code,
			@Number = IsNull(pcy.Number, ''),
			@Serial = IsNull(pcy.Serial, ''),
 
			@TypePolis = case		-- перекодировка типа полиса для Бурятии							 
					when pcy3.PolicyForm = 1 then 2
					when pcy3.PolicyForm in (2, 3) then 1
					when pcy3.PolicyForm = 4 then 3
					else null
			end ,			
	    	@DeathDate =  convert(varchar(10),di.DeathDate, 120),   --     дата смерти  
			
			@oid_Pat = IsNull(erm.oid,''),
			@dateStart =    isnull(convert(varchar(10), r.RegistrationDate, 120), @dateStartWithoutReg) ,	--  будем считать за дату включения в контингент - дата регистрации АК 
			@AttachDate =  convert(varchar(10), r.RegistrationDate, 120)				--	0..1	Дата прикрепления пациента к 

			from AKUZ.T_PATIENT p
 			LEFT JOIN AKUZ.T_SOCIAL_STATUS ss on ss.SocialStatusID = p.SocialStatus 
			LEFT JOIN AKUZ.T_SNILS s ON s.Snils = p.SNILS
			LEFT JOIN VCLib.T_ENUMS e ON e.EnumID = p.Sex
			LEFT JOIN AKUZ.T_POLICY pcy ON pcy.PolicyID = 
				(  
					(SELECT TOP 1 case when pcy2.ValidThrough IS NULL OR IsNull(@dateTime,@dateTime)<=pcy2.ValidThrough then pcy2.PolicyID else  NULL end
					FROM AKUZ.T_POLICY pcy2 
					LEFT JOIN AKUZ.T_PATIENT t21 ON t21.PatientID = pcy2.Patient
					WHERE (pcy2.type_ IN (536) AND t21.PatientID=p.PatientID AND IsNull(@dateTime,@dateTime)>=pcy2.IssueDate)
					ORDER BY pcy2.IssueDate DESC,IsNull(pcy2.ValidThrough,dateadd(Year,100,pcy2.IssueDate)) DESC
					)
				)
			LEFT JOIN AKUZ.T_POLICY pcy3  on pcy3.PolicyID = [dbo].fn_GetOmsPolicy(p.PatientID, @dateTime)
			left join AKUZ.T_REGISTRATION r ON p.PatientID = r.Patient   AND r.Status  = 1 
																	AND r.RegistrationDate<=@dateTime
																	AND r.AttachmentStatus > 0 
																	AND r.Profile  in (1,2)
			left JOIN AKUZ.T_LPU_MAIN lm ON lm.LpuID = r.LpuMain
			LEFT JOIN EHR.T_EHR_RUS er ON er.EhrRusID = lm.EhrRusMdr308
			LEFT JOIN EHR.T_EHR_RUS_MDR308 erm ON erm.EhrRusID = er.EhrRusID
			left JOIN AKUZ.T_AMBULANCE_CARD ac  ON 
							ac.CardLpu = r.LpuMain and 
							p.PatientID = ac.Patient
			LEFT JOIN AKUZ.T_PRG_CONTINGENT ctg on ctg.PrgContingentID = p.PrgContingent
			LEFT JOIN AKUZ.T_DEATH_INFO	di on di.AmbulanceCard = ac.AmbulanceCardID
			where p.PatientID = @IDPatient
			ORDER BY r.RegistrationDate DESC	
				
			Select  @Result =  		 
			( 
				select  
					@TYPE_OPER			as 'TYPE_OPER'              -- операция 
					,@TYPE_WEBSER		as 'TYPE_WEBSER'			-- тип веб-сервиса (diabetws или  tuberws)
					,@MedicalRecordID	as 'IDOwner'
					,@MedicalRecordID	as 'IDOwnerForm'
					,@IDPatient         as 'Fluoro/idPatientMIS'	-- Идентификатор пациента в МИС 
					,@EventID			as 'Fluoro/idCaseMIS'		-- Идентификатор случая в МИС 
					,@PostingDate		as 'Fluoro/dateOpen'		-- Дата события	= Дата открытия случая
 
					,@EventDate			as 'Fluoro/dateStart'		-- Дата начала оказания услуги
					,@CloseDate			as 'Fluoro/dateEnd'			-- Дата окончания услуги
					,@oid				as 'Fluoro/idOrg'			-- Идентификатор МУ. ЛПУ проводившее исследование

					,@Snils				as 'Fluoro/idDoctorMIS'		-- Идентификатор врача. В качестве идентификатора указывается СНИЛС в формате: ЧЧЧ-ЧЧЧ-ЧЧЧ ЧЧ
					,@idPlace			as 'Fluoro/idPlace'         -- 1..1	Место оказания. Приложение 4   (1-ЛПУ,   2-Передвижная флюороустановка)

					,@isExtraordinary	as 'Fluoro/isExtraordinary'	-- 1..1	Проведен ли осмотр во внеочередном порядке
					,@idReasonExtraCode as 'Fluoro/idReasonExtraCode'	-- 0..1	Код справочника «Причины внеочередного проведения». Приложение 5	
				
					,@PrgDecision		as 'Fluoro/result'			 -- 1..1	Результат осмотра     -- Заключение флюорографии				
					,@AddInfo			as 'Fluoro/notes'            -- 0..1	Примечания

					--  Данные о пациенте
					,@Number			as  'Patient/InsurancePolicy/Number'
					,@Serial			as  'Patient/InsurancePolicy/Serial'	
					,@TypePolis 		as  'Patient/InsurancePolicy/Type'	
					,@FirstName			as  'Patient/Firstname'		
					,@FatherName		as  'Patient/Middlename'    
					,@LastName			as  'Patient/Familyname'
					,@Snils_Pat			as  'Patient/SNILS'	
					,@Sex				as  'Patient/Sex'	
					,@BirthDate			as  'Patient/BirthDate' 
					,@oid_Pat			as  'Patient/idOrg'
					,@AttachDate		as  'Patient/attachDate'
					,@DeathDate			as  'Patient/deathDate'
					,@IDPatient			as  'Patient/IdPatientMIS'
					,@Group				as  'Patient/TuberGroups/Group'
					,@DateStart			as  'Patient/TuberGroups/DateStart'					
				for xml path(''),
				root('RIAC')
			)
	   
			-- Отправка
			INSERT INTO [AKUZ].[T_RABBIT_SEND_OBJECT]
				([RabbitSendObjectID] ,[QueueName] ,[Content] ,[MessageID] ,[Headers] ,[ContentEncoding] ,[Type] ,[UserID] ,[State] ,[CreateDateTime] ,[OwnerID])
			select NewID()--(<RabbitSendObjectID, uniqueidentifier,>
				  ,@QueueName--,<QueueName, varchar(255),>
				  ,dbo.ConvertTextToBinaryZip(@Result, '')--,<Content, text,>
				  ,null--,<MessageID, varchar(255),>
				  ,null--,<Headers, varchar(255),>
				  ,@ContentEncoding--,<ContentEncoding, varchar(255),>
				  ,@Type--,<Type, varchar(255),>
				  ,@User--,<UserID, varchar(255),>
				  ,0--,<State, int,>)
				  ,@dateTime--,<CreateDateTime, datetime,>)
				  ,@OwnerID--,<OwnerID, varchar(255),>
END