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

-- =============================================
-- Author:      Vitacore (с)
-- Create date: 2017-01-10
-- Description: Отправка информации в РИАС (Бурятия) об услуге вакцинации БЦЖ
-- =============================================
CREATE PROCEDURE [dbo].[sp_BurDirectionRIACbcg] 
        @MedicalRecordID  uniqueidentifier	
	   ,@IDPatient uniqueidentifier
	   ,@QueueName varchar(100) = 'Bur.RIACSync' 
	   ,@User uniqueidentifier = null	
	
AS
BEGIN
	SET NOCOUNT ON;

    declare  
		 @Result varchar(max)
		,@Type varchar(255)
		,@dateTime datetime = null
		,@ContentEncoding varchar(255)
		,@TYPE_WEBSER varchar(16) 
		,@TYPE_OPER varchar(16)  
		,@OwnerID uniqueidentifier

		,@LpuMain uniqueidentifier
		,@EventID uniqueidentifier
		,@PostingDate varchar(10)
		,@ResultDate varchar(10)
		,@vaccinationDate varchar(10)

		,@birthIdPlace varchar(16)  -- Поле Id из справочника мест вакцинации (Приложение 11)
		,@Snils varchar(32)
		,@ResultT varchar(16)
		,@vaccinationType varchar(8)
		,@revaccination bit

	    --,@StatusRegCansel int = 2 
		--,@p19 int = 0
		--,@p22 int = 100

		,@IDAK  uniqueidentifier = null
		,@oid varchar(128)
		,@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) 
		,@StartInGroup datetime

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

		select @dateTime =  GETDATE()
			,@TYPE_WEBSER = 'tuberws'
			,@TYPE_OPER = 'AddBCG'    --  операция для обработки шлюза
			,@Type = 'bcg'            -- Тип пакета, передаваетый через rabbit
			,@ContentEncoding = 'utf-8'	
			,@OwnerID =  @MedicalRecordID


		--  собираем данные  о услуге  вакцинирование БЦЖ 
		select 
			@PostingDate =convert(varchar(10),acr.PostingDate, 120)				-- Дата открытия случая 
			,@ResultDate = convert(varchar(10),acr.PostingDate, 120)				-- Дата оказания услуги
			,@birthIdPlace =   lm.Code						--  Поле Id из справочника мест вакцинации (Приложение 11)
			,@oid = isnull(erm.oid,'')	
			,@Snils =  IsNull(w.Snils,'')					-- Идентификатор врача
			,@vaccinationDate =  convert(varchar(10),acr.PostingDate, 120)				-- Дата вакцинации или отказа 
			
			,@vaccinationType = 
				case
				   when db.Code = 23 then '1'
				   when db.Code = 24 then '2'
				   else '1'
				end		-- 'bcg/vaccinationType'	   	Integer	0..1	Тип вакцины. Приложение 8 :  1-БЦЖ    2-БЦЖ-М

			 -- Не может быть предоставлена эта инфа - особенность работы формы и действия по изменению объекта
			 --,@revaccination = 
				--case
				--	when  vlib.Code  = '0101' then 0
				--	else 1
				--end   --   'bcg/revaccination'   -- -- revaccination	Boolean	0..1	Является ли ревакцинацией      0101 вакцинация,  0102 ревакцинация,  0103  ревакцинация
			,@Group = ctg.Code 					--	код контенгента
  
		from [AKUZ].T_VACCINATION_ACCEPT va
			JOIN [AKUZ].T_PRG_CONTINGENT ctg on ctg.PrgContingentID = va.PrgContingent
			JOIN [AKUZ].T_VACCINATION_CARD_RECORD vcr on vcr.MedicalRecordID = va.MedicalRecordID
			JOIN [AKUZ].T_AMBULANCE_CARD_RECORD acr on acr.MedicalRecordID = vcr.MedicalRecordID
			JOIN [AKUZ].T_MEDICAL_RECORD mr on mr.MedicalRecordID =  va.MedicalRecordID
			
			JOIN [AKUZ].T_AMBULANCE_CARD ac on ac.AmbulanceCardID = acr.AmbulanceCard
			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_VACCINE_DRUG vd on vd.DictionaryID = va.VaccineDrug
			left join [AKUZ].T_DICTIONARY_BASE db on db.DictionaryID = vd.DictionaryID

			left JOIN [AKUZ].T_POST post on  post.ResourceID = mr.Post  
			left JOIN [AKUZ].T_WORKER w on w.WorkerID = post.Worker  -- сотрудник (получаем Идентификатор врача) 
			where mr.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 'BCG/idPatientMIS'				-- Идентификатор пациента в МИС 
				,@MedicalRecordID	as 'BCG/idCaseMIS'					-- Идентификатор случая в МИС 
				,@PostingDate       as 'BCG/openDate'					-- Дата оказания услуги
				,@ResultDate		as 'BCG/dateStart'					-- Дата оказания услуги
				,@Snils				as 'BCG/idDoctorMIS'				-- Идентификатор врача. В качестве идентификатора указывается СНИЛС в формате: ЧЧЧ-ЧЧЧ-ЧЧЧ ЧЧ
				,@birthIdPlace      as 'BCG/idPlace'     				-- 1..1  Поле Id из справочника мест вакцинации (Приложение 11)
				,@oid				as 'BCG/idOrg'						-- Идентификатор МУ. ЛПУ проводившее исследование
				,@vaccinationDate   as 'BCG/vaccinationDate'			-- Дата вакцинации или отказа 
				,@vaccinationType   as 'BCG/vaccinationType'			-- 0..1	Тип вакцины. Приложение 8 :  1-БЦЖ    2-БЦЖ-М
				--,@revaccination     as 'BCG/revaccination'			-- 0..1	Является ли ревакцинацией      0101 вакцинация,  0102 ревакцинация,  0103  ревакцинация
			
				--  Данные о пациенте
				,@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