﻿-- =============================================
-- Author:          ta     
-- Create date: 
-- DatabaseModel:   Metr7
-- Description:     Изменение события МК
-- Use:
--
-- Changes:
--    18.05.2021  Сафонов А.Е.  DATAMODEL70-93 Ссылка на эталон перенесена из EKZMKDH в EKZMK. Отформатирован код.
--    12.05.2021  Сафонов А.Е.  DATAMODEL70-165 Исправления для ролей
--    27.04.2021  Сафонов А.Е.  DATAMODEL70-93 Добавляется ссылка на эталон в доп.сведения события МК, отформатирован код
--	  16.04.2021  Седаков А.В.  DATAMODEL70-145 Если для редактируемого события МК нет записи о дополнительных сведениях, добавить её, используя вызов процедуры на добавление записи дополнительных сведений для @IDEKZMK.
--    29.12.2020  Сафонов А.Е.  Процедура обернута в транзакцию
--    23.12.2020  Седаков А.В.  ASUMS70-376. После изменения события МК выполняется добавление Методик МК по изменяемому событию МК.
--                              Перед изменением события МК удаляются записи из таблицы EKZMKND по изменяемому событию МК.
--    07.12.2020  Сафонов А.Е.  Добавлена проверка прав доступа
--    13.10.2020  Седаков А.В.  ASUMS70-209. Из таблицы EKZMK удалено поле MKPRV и добавлены поля IDSPVDSBMK, PRCHNPGDN. 
--    04.09.2020  Седаков А.В.  ASUMS70-209. Добавлено новое поле MKPRV из таблицы EKZMK.
--    18.03.2020  Седаков А.В.  DATAMODEL70-28. Добавлены 2 новых поля из таблицы EKZMK: DPZNmp, HRTCmp.
--	  13.03.2020  Седаков А.В.  Изменение типа данных для полей NNZVPV, NNNKL и соответствующих входных параметров с INT на NVARCHAR(30).
--    05.02.2020  Сафонов А.Е.  ELMETRO-5 Добавлены входные параметры GUID-ов, добавление выходного параметра GUIDEKZMK
--    03.02.2020  Седаков А.В.  DATAMODEL70-28. Добавлены новые поля из таблицы EKZMK.
-- =============================================

CREATE PROCEDURE dbo.up_EkzmkEdit_ta 
   @idekzmk int = NULL    --	1
  ,@idekz int = NULL      --	2
  ,@idspmu int = NULL     --	3
  ,@idgrsi int            --	4
  ,@idksprl int           --	5
  ,@idspvdmk int          --	6
  ,@idspvdmc int   		    --	7
  ,@idfrpd int = NULL     --	8
  ,@idspmpob int   		    --	9
  ,@idprsn int = NULL     --	10
  ,@idspkmmk int   		    --	11
  ,@idspvdkl int   		    --	12
  ,@idprsnvd int   	    	--	13
  ,@nnzvpv nvarchar(30)   --	14
  ,@shfkl varchar(20)     --	15
  ,@nnnkl nvarchar(30)    --	16
  ,@prmk int              --	17
  ,@dtmkfk datetime      	--	18
  ,@dtmkpl datetime      	--	19
  ,@dtprm datetime   	    --	20
  ,@dtvdm datetime   	    --	21
  ,@gdn bit   		        --	22 
  ,@pzmc int              --	23
  ,@stmk money            --	24
  ,@stmkdp money   	      --	25
  ,@ncsrmk money 		      --	26
  ,@idprsnsd int = NULL   --	27
  ,@idprsnpr int = NULL   --	28
  ,@idprsnvy int = NULL   --	29
  ,@idspssmp int = NULL   --	30
  ,@idsptsmp int = NULL   -- id технического состояния в момент приёмки
  ,@dsekzmk nvarchar(300) = NULL
  ,@dtotm datetime = NULL
  ,@dtvzm datetime = NULL
  ,@idprsnotm int = NULL
  ,@idprsnvzm int = NULL
  ,@nrvrmndmp decimal(6, 2) = NULL
  ,@nrvrmmp decimal(6, 2) = NULL
  ,@dtzvpv datetime = NULL
  ,@vrmkfk decimal(6, 2) = NULL
  ,@idksp int = NULL
  ,@dpznmp nvarchar(50) = NULL
  ,@hrtcmp nvarchar(40) = NULL
  ,@idspvdsbmk int = NULL
  ,@prchnpgdn nvarchar(1024) = NULL
  ,@idekzetl int = NULL
  ,@guidekzmk uniqueidentifier = NULL   -- guid события мк
  ,@guidekz uniqueidentifier = NULL     -- guid экземляра си
  ,@guidspmu uniqueidentifier = NULL    -- guid справочника места установки
  ,@guidfrpd uniqueidentifier = NULL    -- guid повер/калиб орг-ции
  ,@guidprsnisp uniqueidentifier = NULL -- guid персоны поверителя
  ,@guidprsnvd uniqueidentifier = NULL  -- guid персоны получателя
  ,@guidprsnsd uniqueidentifier = NULL  -- guid персоны сдавшего
  ,@guidprsnpr uniqueidentifier = NULL  -- guid персоны принявшего
  ,@guidprsnvy uniqueidentifier = NULL  -- guid персоны выдавшего
AS
BEGIN TRY
  set dateformat dmy
  set nocount on

  BEGIN TRANSACTION

  if LEN(@shfkl) = 0
    set @shfkl = NULL

  if @guidekzmk is NULL
    select
      @guidekzmk = guidekzmk
     ,@idspssmp = COALESCE(@idspssmp, idspssmp)
     ,@idsptsmp = COALESCE(@idsptsmp, idsptsmp)
    from ekzmk
    where idekzmk = @idekzmk
  else if @idekzmk is NULL
    select
      @idekzmk = idekzmk
     ,@idspssmp = COALESCE(@idspssmp, idspssmp)
     ,@idsptsmp = COALESCE(@idsptsmp, idsptsmp)
    from ekzmk
    where guidekzmk = @guidekzmk

  if @guidekz is NULL
    select @guidekz = guidekz
    from ekz
    where idekz = @idekz
  else if @idekz is NULL
    select @idekz = idekz
    from ekz
    where guidekz = @guidekz

  if @idspmu is NULL and @guidspmu is not NULL
    select @idspmu = idspmu
    from spmu
    where guidspmu = @guidspmu

  if @idfrpd is NULL and @guidfrpd is not NULL
    select @idfrpd = idfrpd
    from frpd
    where CAST(frpdguid as uniqueidentifier) = @guidfrpd

  if @idprsn is NULL and @guidprsnisp is not NULL
    select @idprsn = idprsn
    from prsn
    where CAST(guidprsn as uniqueidentifier) = @guidprsnisp

  if @idprsnvd is NULL and @guidprsnvd is not NULL
    select @idprsnvd = idprsn
    from prsn
    where CAST(guidprsn as uniqueidentifier) = @guidprsnvd
  
  if @idprsnsd is NULL and @guidprsnsd is not NULL
    select @idprsnsd = idprsn
    from prsn
    where CAST(guidprsn as uniqueidentifier) = @guidprsnsd
  
  if @idprsnpr is NULL and @guidprsnpr is not NULL
    select @idprsnpr = idprsn
    from prsn
    where CAST(guidprsn as uniqueidentifier) = @guidprsnpr
  
  if @idprsnvy is NULL and @guidprsnvy is not NULL
    select @idprsnvy = idprsn
    from prsn
    where CAST(guidprsn as uniqueidentifier) = @guidprsnvy

  declare @idekz_old int, @idgrsi_old int, @idspvdmk_old int
  
  select @idekz_old = idekz, @idgrsi_old = idgrsi, @idspvdmk_old = idspvdmk
  from ekzmk
  where idekzmk = @idekzmk

  if (@idekz_old <> @idekz) or 
     (ISNULL(@idgrsi_old, 0) <> ISNULL(@idgrsi, 0)) or 
     (ISNULL(@idspvdmk_old, 0) <> ISNULL(@idspvdmk, 0))
  	delete from ekzmknd
  	where idekzmk = @idekzmk

  update ekzmk
  set idekz = @idekz		    --	2
     ,idspmu = @idspmu		  --	3
     ,idgrsi = @idgrsi		  --	4
     ,idksprl = @idksprl	  --	5
     ,idspvdmk = @idspvdmk	--	6
     ,idspvdmc = @idspvdmc	--	7
     ,idfrpd = @idfrpd		  --	8
     ,idspmpob = @idspmpob	--	9
     ,idprsn = @idprsn		  --	10
     ,idspkmmk = @idspkmmk	--	11
     ,idspvdkl = @idspvdkl	--	12
     ,idprsnvd = @idprsnvd	--	13
     ,nnzvpv = @nnzvpv		  --	14
     ,shfkl = @shfkl		    --	15
     ,nnnkl = @nnnkl		    --	16
     ,prmk = @prmk 		      --	17
     ,dtmkfk = @dtmkfk		  --	18
     ,dtmkpl = @dtmkpl		  --	19
     ,dtprm = @dtprm		    --	20
     ,dtvdm = @dtvdm		    --	21
     ,gdn = @gdn  		      --	22
     ,pzmc = @pzmc		      --	23
     ,stmk = @stmk		      --	24
     ,stmkdp = @stmkdp		  --	25
     ,ncsrmk = @ncsrmk		  --	26
     ,idprsnsd = @idprsnsd	--	27
     ,idprsnpr = @idprsnpr	--	28
     ,idprsnvy = @idprsnvy	--	29
     ,idspssmp = @idspssmp	--	не менять поля если указан null
     ,idsptsmp = @idsptsmp	--	не менять поля если указан null
     ,dsekzmk = @dsekzmk
     ,dtotm = @dtotm
     ,dtvzm = @dtvzm
     ,idprsnotm = @idprsnotm
     ,idprsnvzm = @idprsnvzm
     ,nrvrmndmp = @nrvrmndmp
     ,nrvrmmp = @nrvrmmp
     ,dtzvpv = @dtzvpv
     ,vrmkfk = @vrmkfk
     ,idksp = @idksp
     ,dpznmp = @dpznmp
     ,hrtcmp = @hrtcmp
     ,idspvdsbmk = @idspvdsbmk
     ,prchnpgdn = @prchnpgdn
     ,guidekzmk = @guidekzmk
     ,idekzetl = @idekzetl
  where idekzmk = @idekzmk	--  1

  -- проверка прав доступа после изменения объекта
  exec dbo.EKZMK_CheckPermissions @idekzmk, null, 'U' 

  select
    @@ROWCOUNT
  
  -- Добавление Методик МК по событию МК.
  insert into ekzmknd(idekzmk, idnd)
  select distinct ekzmk.idekzmk, ekzndvdmk.idnd
  from ekzmk
    join ekzndvdmk on ekzmk.idekz = ekzndvdmk.idekz and 
                      ISNULL(ekzmk.idgrsi, 0) = ISNULL(ekzndvdmk.idgrsi, 0) and 
                      ISNULL(ekzmk.idspvdmk, 0) = ISNULL(ekzndvdmk.idspvdmk , 0)
    left join ekzmknd on ekzmk.idekzmk = ekzmknd.idekzmk and ekzndvdmk.idnd = ekzmknd.idnd
  where ekzmknd.idekzmknd is NULL and ekzmk.idekzmk = @idekzmk

  -- Если для редактируемого события МК нет записи о дополнительных сведениях, добавить её, используя вызов процедуры на добавление записи дополнительных сведений для @IDEKZMK.
  if (not exists(select 1 from ekzmkdh where idekzmk = @idekzmk))
  	exec dbo.EKZMKDH_Insert @idekzmk

  if @@TRANCOUNT > 0
		COMMIT
END TRY
BEGIN CATCH
	declare @ErrorMessage nvarchar(400);
	declare @ErrorSeverity int;
	declare @ErrorState int;
	select @ErrorMessage = ERROR_MESSAGE();
	select @ErrorSeverity = ERROR_SEVERITY();
	select @ErrorState = ERROR_STATE();
	if @@TRANCOUNT > 0
		ROLLBACK
	RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH


