-- This file is part of the it-crafts software and is subject to copyright protection.
-- (C) 2023..2024, All rights reserved by Steffen Anders, Elsteraue - Germany
-- Visit also https://www.it-crafts.de.
--

--------------------------------------------------------------------------------------------------------
-- Termindatensatz zur Wartungsmeldung ermitteln
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WMeldung_FindWartungsTerminRec')
  DROP PROCEDURE [dbo].[itcproc_WMeldung_FindWartungsTerminRec]
GO
CREATE PROCEDURE [dbo].[itcproc_WMeldung_FindWartungsTerminRec]
  @Param_RecId   integer
 ,@Param_Select  integer = 0
AS
  DECLARE @WM_AuftragId integer
  DECLARE @WM_AnlagenId integer
  DECLARE @WM_Termin datetime
  DECLARE @WM_LfdNr integer
  SELECT @WM_AuftragId = ISNULL(AuftragId,0), @WM_AnlagenId = ISNULL(AnlagenId,0), @WM_Termin = Termin, @WM_LfdNr = LfdNr  
    FROM ut_WartungsMeldungen WHERE RecId = @Param_RecId

  -- Satznummer des zugehoerigen Wartungstermins ermitteln
  DECLARE @WT_RecId  integer = 0
  IF @WM_AuftragId <> 0
    SELECT @WT_RecId = ISNULL(RecId,0) FROM ut_WartungsTermine WHERE [Type] = 2 AND RefIdent = @WM_AuftragId
  IF @WT_RecId = 0 AND @WM_AnlagenId <> 0
    SELECT @WT_RecId = ISNULL(RecId,0) FROM ut_WartungsTermine WHERE [Type] = 1 AND RefIdent = @WM_AnlagenId AND RefDatum = @WM_Termin AND RefLfdNr = @WM_LfdNr

  -- Ergebnis ausgeben
  IF @Param_Select <> 0
    SELECT @WT_RecId AS RecId
  RETURN @WT_RecId
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsmeldung Termindaten validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WMeldung_UpdateTerminDaten')
  DROP PROCEDURE [dbo].[itcproc_WMeldung_UpdateTerminDaten]
GO
CREATE PROCEDURE [dbo].[itcproc_WMeldung_UpdateTerminDaten]
  @Param_RecId   integer
 ,@Param_Monteur varchar(4)
 ,@Param_Termin  datetime
 ,@Param_Uhrzeit varchar(20)
 ,@Param_AuftragId integer
 ,@Param_PrjNr varchar(8)
AS
  -- PRINT '[dbo].[itcproc_WMeldung_UpdateTerminDaten]'
  UPDATE ut_WartungsMeldungen SET Monteur = @Param_Monteur, Termin = @Param_Termin, Uhrzeit = @Param_Uhrzeit WHERE RecId = @Param_RecId
  IF @Param_AuftragId <> 0 BEGIN
    UPDATE ut_WartungsMeldungen SET AuftragId = @Param_AuftragId WHERE RecId = @Param_RecId
    UPDATE ut_WartungsAuftraege SET Monteur = @Param_Monteur, Termin = @Param_Termin, Uhrzeit = @Param_Uhrzeit WHERE Ident = @Param_AuftragId
  END
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsmeldung Termindaten validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WMeldung_ValidateTerminDaten')
  DROP PROCEDURE [dbo].[itcproc_WMeldung_ValidateTerminDaten]
GO
CREATE PROCEDURE [dbo].[itcproc_WMeldung_ValidateTerminDaten]
  @Param_RecId   integer
 ,@Param_Monteur varchar(4)
 ,@Param_Termin  datetime
 ,@Param_Uhrzeit varchar(20)
AS
  DECLARE @m_Uhrzeit varchar(5) = dbo.itcfunc_formatTime(@Param_Uhrzeit)
  -- PRINT 'itcproc_WMeldung_ValidateTerminDaten ' + STR(@Param_RecId,8) + ', ' + @Param_Monteur + ', ' + CONVERT(char(10),@Param_Uhrzeit,120) + ', ' + @Param_Uhrzeit

  -- Satznummer des zugehoerigen Wartungstermins ermitteln
  DECLARE @WT_RecId  integer = 0
  EXECUTE @WT_RecId = [dbo].[itcproc_WMeldung_FindWartungsTerminRec] @Param_RecId
  -- PRINT '@WT_RecId: ' + STR(@WT_RecId,8)

  -- Satznummer des zugehoerigen Kalendereintrags ermitteln
  DECLARE @RD_RecId    integer = 0
  DECLARE @WT_TerminId char(8) = ''
  IF @WT_RecId <> 0 BEGIN
    SELECT @WT_TerminId = TerminId FROM ut_WartungsTermine WHERE RecId = @WT_RecId
	IF @WT_TerminId <> ''
      SELECT @RD_RecId = ISNULL(RecId,0) FROM ut_ResPlandaten WHERE LfdNr = @WT_TerminId
  END
  -- PRINT '@RD_RecId: ' + STR(@RD_RecId,8)

  -- Ordnungsmerkmale ermitteln
  DECLARE @m_AuftragId  integer
  DECLARE @m_KdNr       varchar(15)
  DECLARE @m_ObjektNr   varchar(20)
  DECLARE @m_PrjNr      varchar(8)
  DECLARE @m_KzStoerung integer 
  DECLARE @m_Dauer	    float 
  DECLARE @m_Status     integer
  SELECT @m_AuftragId  = ISNULL(AuftragId,0)
       , @m_KdNr       = ISNULL(KdNr,'')
	   , @m_ObjektNr   = ISNULL(ObjektNr,'')
	   , @m_PrjNr      = ISNULL(PrjNr,'')
	   , @m_KzStoerung = ISNULL(KzStoerung,1)
	   , @m_Dauer      = ISNULL(Dauer,1)
	   , @m_Status     = ISNULL([Status],0)
    FROM ut_WartungsMeldungen WHERE RecId = @Param_RecId

  -- Projektnummer ermitteln
  IF @m_AuftragId <> 0
    SELECT @m_PrjNr = PrjNr FROM dbo.ut_WartungsAuftraege WHERE Ident = @m_AuftragId

  -- Standardprojektnummer aus Wartungsgrunddaten, wenn leer
  IF @m_KzStoerung = 0 AND RTRIM(@m_PrjNr) = ''
	  SELECT @m_PrjNr = ISNULL(OptDataC,'') FROM dbo.ut_Optionen WHERE OptId = ' 9900'
  ELSE IF @m_KzStoerung = 1 AND RTRIM(@m_PrjNr) = ''
	  SELECT @m_PrjNr = ISNULL(OptDataC,'') FROM dbo.ut_Optionen WHERE OptId = ' 9927'

  -- wenn gar kein Projekt ermittelbar, dann Taglohn
  IF RTRIM(@m_PrjNr) = ''
	SET @m_PrjNr = ' TAGLOHN'

  -- -------------------------------------------------------------- Termin ist nicht mehr gueltig
  IF @Param_Termin <= dbo.itcfunc_datetime(NULL) OR @Param_Monteur = '' BEGIN
    DECLARE @RD_Serie integer = 0
    IF @WT_RecId <> 0
	  DELETE FROM ut_WartungsTermine WHERE RecId = @WT_RecId
    IF @RD_RecId <> 0 BEGIN
	  SELECT @RD_Serie = ISNULL(Serie,0) FROM ut_ResPlandaten WHERE RecId = @RD_RecId
	  IF @RD_Serie <> 0
	    DELETE FROM ut_ResPlandaten WHERE Serie = @RD_Serie
	  ELSE
	    DELETE FROM ut_ResPlandaten WHERE RecId = @RD_RecId
	END
    EXECUTE [dbo].[itcproc_WMeldung_UpdateTerminDaten] @Param_RecId, @Param_Monteur, @Param_Termin, @m_Uhrzeit, @m_AuftragId, @m_PrjNr
    RETURN 1
  END

  -- -------------------------------------------------------------- Termin eintragen
  -- Planungstermin eintragen,wenn nicht vorhanden
  IF @RD_RecId = 0 BEGIN
	SELECT @WT_TerminId = dbo.itcfunc_IncString(ISNULL(MAX(LfdNr),'00000000')) FROM ut_ResPlandaten 
	SET @RD_RecId = dbo.itcfunc_NextRecId_ResPlandaten()
	INSERT INTO dbo.ut_ResPlandaten (RecId,LfdNr,Uebernommen) VALUES (@RD_RecId,@WT_TerminId,'0')
  END

  -- Wartungstermin eintragen oder pflegen
  IF @WT_RecId = 0 BEGIN
	  SET @WT_RecId = dbo.itcfunc_NextRecId_WartungsTermine()
	  IF @m_AuftragId <> 0
		INSERT INTO dbo.ut_WartungsTermine (RecId,[Type],RefIdent,TerminId) VALUES (@WT_RecId,2,@m_AuftragId,@WT_TerminId)
	  ELSE
		INSERT INTO dbo.ut_WartungsTermine (RecId,[Type],RefIdent,TerminId,RefDatum,RefLfdNr)
		       SELECT @WT_RecId, 1, AnlagenId, @WT_TerminId, Datum, LfdNr FROM ut_WartungsMeldungen WHERE RecId = @Param_RecId
  END ELSE BEGIN
	  IF @m_AuftragId <> 0
		UPDATE dbo.ut_WartungsTermine SET [Type] = 2, RefIdent = @m_AuftragId, TerminId = @WT_TerminId WHERE RecId = @WT_RecId
	  ELSE
		UPDATE dbo.ut_WartungsTermine SET TerminId = @WT_TerminId WHERE RecId = @WT_RecId
  END

  -- Anfangs- und Endezeit berechnen
  IF @m_Dauer <= 0
	SET @m_Dauer = 1

  DECLARE @m_Minuten integer    = CONVERT(integer, @m_Dauer * 60)
  DECLARE @m_Beginn  varchar(5) = dbo.itcfunc_formatTime(@m_Uhrzeit)
  DECLARE @m_Ende    varchar(5) = dbo.itcfunc_addMinutesToTime(@m_Beginn, @m_Minuten)
  UPDATE dbo.ut_ResPlandaten SET 
	     ResTyp = ' 4'
		,ResNr = @Param_Monteur
		,PrjNr = @m_PrjNr
	    ,Jahr  = SUBSTRING(CONVERT(char(10),@Param_Termin,120),1,4)
		,Monat = SUBSTRING(CONVERT(char(10),@Param_Termin,120),6,2)
		,Tag   = SUBSTRING(CONVERT(char(10),@Param_Termin,120),9,2)
		,SS    = SUBSTRING(@m_Beginn,1,2)
		,SM    = SUBSTRING(@m_Beginn,4,2)
		,ES    = SUBSTRING(@m_Ende,1,2)
		,EM    = SUBSTRING(@m_Ende,4,2)
		,AbwDauer = 0
		-- , PrjNr, BelArt, BelegNr
		,KurzBezeichnung = 'Kunde: ' + RTRIM(@m_KdNr) + ' Objekt: ' + RTRIM(@m_ObjektNr)
	WHERE RecId = @RD_RecId
	  -- TODO:  BSH.Main.SaveTerminText(recTermin.innerRecord,WMeldung_CalcTerminText(recWMeld));

  -- Status auf terminiert stellen, wenn er vorher kleiner war
  IF @m_Status < 2
    UPDATE ut_WartungsMeldungen SET [Status] = @m_Status  WHERE RecId = @Param_RecId

  EXECUTE [dbo].[itcproc_WMeldung_UpdateTerminDaten] @Param_RecId, @Param_Monteur, @Param_Termin, @m_Uhrzeit, @m_AuftragId, @m_PrjNr
  RETURN 1
GO

-- select * from dbo.ut_ResPlandaten

--------------------------------------------------------------------------------------------------------
-- Wartungsmeldung Monteur validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WMeldung_ValidateMonteur')
  DROP PROCEDURE [dbo].[itcproc_WMeldung_ValidateMonteur]
GO
CREATE PROCEDURE [dbo].[itcproc_WMeldung_ValidateMonteur]
  @Param_RecId   integer
 ,@Param_Monteur varchar(4)
AS
  DECLARE @m_Result  integer = 0
  DECLARE @m_Termin  datetime
  DECLARE @m_Uhrzeit varchar(20)

  IF 0 < (SELECT count(*) FROM ut_Adressen WHERE DESTTYP = ' 4' AND Annr = @Param_Monteur) BEGIN
    SELECT @m_Termin = Termin, @m_Uhrzeit = Uhrzeit FROM ut_WartungsMeldungen WHERE RecId = @Param_RecId
	EXECUTE @m_Result = [dbo].[itcproc_WMeldung_ValidateTerminDaten] @Param_RecId, @Param_Monteur, @m_Termin, @m_Uhrzeit
  END
  RETURN @m_Result
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsmeldung Termnindatum validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WMeldung_ValidateTermin')
  DROP PROCEDURE [dbo].[itcproc_WMeldung_ValidateTermin]
GO
CREATE PROCEDURE [dbo].[itcproc_WMeldung_ValidateTermin]
  @Param_RecId   integer
 ,@Param_Termin  varchar(20)
AS
  DECLARE @m_Termin  datetime = dbo.itcfunc_datetime(@Param_Termin)
  DECLARE @m_Result  integer = 0
  DECLARE @m_Monteur varchar(4)
  DECLARE @m_Uhrzeit varchar(20)

  SELECT @m_Monteur = Monteur, @m_Uhrzeit = Uhrzeit FROM ut_WartungsMeldungen WHERE RecId = @Param_RecId
  EXECUTE @m_Result = [dbo].[itcproc_WMeldung_ValidateTerminDaten] @Param_RecId, @m_Monteur, @m_Termin, @m_Uhrzeit
  RETURN @m_Result
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsmeldung Uhrzeit validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WMeldung_ValidateUhrzeit')
  DROP PROCEDURE [dbo].[itcproc_WMeldung_ValidateUhrzeit]
GO
CREATE PROCEDURE [dbo].[itcproc_WMeldung_ValidateUhrzeit]
  @Param_RecId   integer
 ,@Param_Uhrzeit varchar(20)
AS
  DECLARE @m_Result  integer = 0
  DECLARE @m_Monteur varchar(4)
  DECLARE @m_Termin  datetime

  SELECT @m_Monteur = Monteur, @m_Termin = Termin FROM ut_WartungsMeldungen WHERE RecId = @Param_RecId
  EXECUTE @m_Result = [dbo].[itcproc_WMeldung_ValidateTerminDaten] @Param_RecId, @m_Monteur, @m_Termin, @Param_Uhrzeit
  RETURN @m_Result
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsmeldung Uhrzeit validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WMeldung_ValidateDauer')
  DROP PROCEDURE [dbo].[itcproc_WMeldung_ValidateDauer]
GO
CREATE PROCEDURE [dbo].[itcproc_WMeldung_ValidateDauer]
  @Param_RecId   integer
 ,@Param_Dauer   varchar(20)
AS
  DECLARE @m_Result  integer = 0
  DECLARE @m_Monteur varchar(4)
  DECLARE @m_Termin  datetime
  DECLARE @m_Uhrzeit varchar(20)

  UPDATE ut_WartungsMeldungen SET Dauer = dbo.itcfunc_float(@Param_Dauer) WHERE RecId = @Param_RecId
  SELECT @m_Monteur = Monteur, @m_Termin = Termin, @m_Uhrzeit = Uhrzeit FROM ut_WartungsMeldungen WHERE RecId = @Param_RecId
  EXECUTE @m_Result = [dbo].[itcproc_WMeldung_ValidateTerminDaten] @Param_RecId, @m_Monteur, @m_Termin, @m_Uhrzeit
  RETURN @m_Result
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsauftraege Monteur validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WAuftrag_ValidateMonteur')
  DROP PROCEDURE [dbo].[itcproc_WAuftrag_ValidateMonteur]
GO
CREATE PROCEDURE [dbo].[itcproc_WAuftrag_ValidateMonteur]
  @Param_RecId   integer
 ,@Param_Monteur  varchar(4)
AS
  DECLARE @m_Result integer = 0
  DECLARE @m_RecIdMeldung integer

  SELECT @m_RecIdMeldung = ISNULL(wm.RecId, 0) FROM ut_WartungsAuftraege wa
    INNER JOIN ut_WartungsMeldungen wm on wm.AuftragId = wa.Ident
    WHERE wa.RecId = @Param_RecId

  IF @m_RecIdMeldung <> 0
    EXECUTE @m_Result = [dbo].[itcproc_WMeldung_ValidateMonteur] @m_RecIdMeldung, @Param_Monteur

  RETURN @m_Result
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsauftraege Termin validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WAuftrag_ValidateTermin')
  DROP PROCEDURE [dbo].[itcproc_WAuftrag_ValidateTermin]
GO
CREATE PROCEDURE [dbo].[itcproc_WAuftrag_ValidateTermin]
  @Param_RecId   integer
 ,@Param_Termin  varchar(20)
AS
  DECLARE @m_Result integer = 0
  DECLARE @m_RecIdMeldung integer

  SELECT @m_RecIdMeldung = ISNULL(wm.RecId, 0) FROM ut_WartungsAuftraege wa
    INNER JOIN ut_WartungsMeldungen wm on wm.AuftragId = wa.Ident
    WHERE wa.RecId = @Param_RecId

  IF @m_RecIdMeldung <> 0
    EXECUTE @m_Result = [dbo].[itcproc_WMeldung_ValidateTermin] @m_RecIdMeldung, @Param_Termin

  RETURN @m_Result
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsauftraege Uhrzeit validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WAuftrag_ValidateUhrzeit')
  DROP PROCEDURE [dbo].[itcproc_WAuftrag_ValidateUhrzeit]
GO
CREATE PROCEDURE [dbo].[itcproc_WAuftrag_ValidateUhrzeit]
  @Param_RecId   integer
 ,@Param_Uhrzeit varchar(20)
AS
  DECLARE @m_Result integer = 0
  DECLARE @m_RecIdMeldung integer

  SELECT @m_RecIdMeldung = ISNULL(wm.RecId, 0) FROM ut_WartungsAuftraege wa
    INNER JOIN ut_WartungsMeldungen wm on wm.AuftragId = wa.Ident
    WHERE wa.RecId = @Param_RecId

  IF @m_RecIdMeldung <> 0
    EXECUTE @m_Result = [dbo].[itcproc_WMeldung_ValidateUhrzeit] @m_RecIdMeldung, @Param_Uhrzeit

  RETURN @m_Result
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsauftraege Dauer validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WAuftrag_ValidateDauer')
  DROP PROCEDURE [dbo].[itcproc_WAuftrag_ValidateDauer]
GO
CREATE PROCEDURE [dbo].[itcproc_WAuftrag_ValidateDauer]
  @Param_RecId   integer
 ,@Param_Dauer varchar(20)
AS
  DECLARE @m_Result integer = 0
  DECLARE @m_RecIdMeldung integer

  SELECT @m_RecIdMeldung = ISNULL(wm.RecId, 0) FROM ut_WartungsAuftraege wa
    INNER JOIN ut_WartungsMeldungen wm on wm.AuftragId = wa.Ident
    WHERE wa.RecId = @Param_RecId

  IF @m_RecIdMeldung <> 0
    EXECUTE @m_Result = [dbo].[itcproc_WMeldung_ValidateDauer] @m_RecIdMeldung, @Param_Dauer

  RETURN @m_Result
GO
