-- 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.
--

----------------------------------------------------------------------------------------------
--
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'V' and [name] = 'itcview_WartungsAuftraege')
  DROP VIEW [dbo].[itcview_WartungsAuftraege]
GO
CREATE VIEW [dbo].[itcview_WartungsAuftraege] AS
	select wa.RecId, wa.Ident, wa.Nr, wa.Datum,  wa.Art, wa.[Status], wa.Locked, wa.ObjektId, wa.AnlagenId, wa.Monteur, wa.PrjNr, wa.BelArt, wa.BelNr, wa.Termin, wa.Uhrzeit, wa.Betreff
		,obj.RecId as ObjRecId, obj.Nr as ObjNr, obj.Bez1 as ObjBez1, obj.Bez2 as ObjBez2, obj.KdNr, obj.Standort, obj.HausMstr
		,anl.RecId as AnlRecId, anl.Nr as AnlNr, anl.Bez1 as AnlBez1, anl.Bez2 as AnlBez2
		,adrKd.Name1 as KdName1, adrKd.Name2 as KdName2 ,adrKd.Strasse as KdStrasse, SUBSTRING(adrKd.Plz,1,8) as KdPlz, adrKd.Ort as KdOrt, adrKd.Telefon1 as KdTelefon1, adrKd.Telefon2 as KdTelefon2, adrKd.EMail as KdEMail
		,adrSo.Name1 as SoName1, adrSo.Name2 as SoName2, adrSo.Strasse as SoStrasse, SUBSTRING(adrSo.Plz,1,8) as SoPlz, adrSo.Ort as SoOrt, adrSo.Telefon1 as SoTelefon1, adrSo.Telefon2 as SoTelefon2, adrSo.EMail as SoEMail
		,ISNULL(wv.Aktiv,0) as VertStatus
		,(select count(*) from ut_WartungsAnhang wd1 WITH(INDEX(Ik_Key00)) where wd1.AuftragId = wa.Ident and wd1.OrgName = 'Unterschrift-Kunde.jpg' and wd1.Stamp <> '') as KdSignum
		,(select count(*) from ut_WartungsAnhang wd2 WITH(INDEX(Ik_Key00)) where wd2.AuftragId = wa.Ident and wd2.OrgName = 'Unterschrift-Monteur.jpg' and wd2.Stamp <> '') as MaSignum
	  from ut_WartungsAuftraege wa
	  left join ut_WartungsObjekte obj WITH(INDEX(Ik_Key00)) on obj.Ident = wa.ObjektId
	  left join ut_WartungsAnlagen anl WITH(INDEX(Ik_Key00)) on anl.Ident = wa.AnlagenId
	  left join ut_Adressen adrKd WITH(INDEX(Ik_Key0)) on adrKd.DESTDEBNR = obj.KdNr
	  left join ut_Adressen adrSo WITH(INDEX(Ik_Key0)) on adrSo.DESTDEBNR = obj.Standort
	  left join ut_WartungsVertraege wv WITH(INDEX(Ik_Key03)) on wv.KdNr = obj.KdNr and wv.Aktiv = 1
GO

--------------------------------------------------------------------------------------------------------
-- Test, on ein Auftrag noch editiert werden darf
IF OBJECT_ID (N'itcfunc_WartungsAuftraege_editable', N'FN') IS NOT NULL
  DROP FUNCTION dbo.itcfunc_WartungsAuftraege_editable
GO
CREATE FUNCTION dbo.itcfunc_WartungsAuftraege_editable(@Param_Ident integer) RETURNS integer
AS
BEGIN
  DECLARE @m_Status integer
  DECLARE @m_KdSignum integer
  DECLARE @m_MaSignum integer
  DECLARE @m_Result integer = 0

  SELECT @m_Status = ISNULL([Status],2), @m_KdSignum = ISNULL(KdSignum,0), @m_KdSignum = ISNULL(MaSignum,1) from [dbo].[itcview_WartungsAuftraege] where Ident = @Param_Ident
  IF @m_Status < 2 AND @m_KdSignum = 0 -- AND @m_MaSignum = 0
    SET @m_Result = 1
  RETURN @m_Result
END
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsauftraege abrufen
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WartungsAuftraege_list')
  DROP PROCEDURE [dbo].[itcproc_WartungsAuftraege_list]
GO
CREATE PROCEDURE [dbo].[itcproc_WartungsAuftraege_list]
  @Parm_Knr varchar(20)
 ,@Parm_Uid varchar(30)
 ,@Parm_Status varchar(20) = '1'
AS
  DECLARE @m_Annr varchar(4) = ''
  DECLARE @m_AlleAnnr integer = 0
  DECLARE @m_Status integer = dbo.itcfunc_integer(@Parm_Status)

  SELECT @m_Annr = Annr, @m_AlleAnnr = AlleAnnr FROM ut_WebUser WHERE Knr = @Parm_Knr AND [Uid] = @Parm_Uid
  SELECT * FROM [dbo].[itcview_WartungsAuftraege] 
    WHERE [Status] = @m_Status AND (Monteur = @m_Annr OR Monteur = '' OR @m_AlleAnnr = 1) 
    ORDER BY Termin, Uhrzeit, Nr
GO
-- EXECUTE itcproc_WartungsAuftraege_list '59998', 'User2'

--------------------------------------------------------------------------------------------------------
-- einzelnen Wartungsauftraeg abrufen
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WartungsAuftraege_get')
  DROP PROCEDURE [dbo].[itcproc_WartungsAuftraege_get]
GO
CREATE PROCEDURE [dbo].[itcproc_WartungsAuftraege_get]
  @Param_RecId varchar(20)
AS
  DECLARE @m_RecId integer = dbo.itcfunc_integer(@Param_RecId)
  SELECT * FROM [dbo].[itcview_WartungsAuftraege] WHERE [RecId] = @m_RecId
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsauftraege Feld nach Name validieren
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WartungsAuftraege_validate')
  DROP PROCEDURE [dbo].[itcproc_WartungsAuftraege_validate]
GO
CREATE PROCEDURE [dbo].[itcproc_WartungsAuftraege_validate]
  @Parm_RecId      varchar(10)
 ,@Parm_FieldName  varchar(30)
 ,@Parm_Value      varchar(200) = ''
 ,@Parm_WithResult varchar(10)  = '1'
AS
  DECLARE @m_RecId      integer = dbo.itcfunc_integer(@Parm_RecId)
  DECLARE @m_Success    integer = 0
  DECLARE @m_intValue   integer

  ------------------------------------------------------------------------------------
  IF @Parm_FieldName = 'Status' BEGIN
    SET @m_intValue = dbo.itcfunc_integer(@Parm_Value)
	UPDATE dbo.ut_WartungsAuftraege SET [Status] = @m_intValue WHERE RecId = @m_RecId
	SET @m_Success = 1
  END ELSE IF @Parm_FieldName = 'Monteur' BEGIN
    EXECUTE @m_Success = [dbo].[itcproc_WAuftrag_ValidateMonteur] @m_RecId, @Parm_Value 
  END ELSE IF @Parm_FieldName = 'Termin' BEGIN
    EXECUTE @m_Success = [dbo].[itcproc_WAuftrag_ValidateTermin] @m_RecId, @Parm_Value 
  END ELSE IF @Parm_FieldName = 'Uhrzeit' BEGIN
    EXECUTE @m_Success = [dbo].[itcproc_WAuftrag_ValidateUhrzeit] @m_RecId, @Parm_Value 
  END ELSE IF @Parm_FieldName = 'Dauer' BEGIN
    EXECUTE @m_Success = [dbo].[itcproc_WAuftrag_ValidateDauer] @m_RecId, @Parm_Value 
  END

  IF dbo.itcfunc_integer(@Parm_WithResult) <> 0 BEGIN
    IF @m_Success <> 0 
      SELECT * FROM [dbo].[itcview_WartungsAuftraege] WHERE [RecId] = @m_RecId
	ELSE
      SELECT 'Der Wert "' + @Parm_Value + '" ist hier im Feld [' + @Parm_FieldName + '] nicht erlaubt.' AS error
  END
  RETURN @m_Success
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsauftraege Feld nach Name validieren, mit Uebergabe der Login-Parameter
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WartungsAuftraege_validate2')
  DROP PROCEDURE [dbo].[itcproc_WartungsAuftraege_validate2]
GO
CREATE PROCEDURE [dbo].[itcproc_WartungsAuftraege_validate2]
  @Parm_Knr varchar(20)
 ,@Parm_Uid varchar(30)
 ,@Parm_RecId      varchar(10)
 ,@Parm_FieldName  varchar(30)
 ,@Parm_Value      varchar(200) = ''
 ,@Parm_WithResult varchar(10)  = '1'
AS
  DECLARE @m_Success    integer = 0

  IF @Parm_FieldName = 'MonteurFromUid' BEGIN
    DECLARE @m_Annr varchar(4) = ''
    SELECT @m_Annr = Annr FROM ut_WebUser WHERE Knr = @Parm_Knr AND [Uid] = @Parm_Uid
    EXECUTE @m_Success = [dbo].[itcproc_WartungsAuftraege_validate] @Parm_RecId, 'Monteur', @m_Annr, @Parm_WithResult
  END ELSE
    EXECUTE @m_Success = [dbo].[itcproc_WartungsAuftraege_validate] @Parm_RecId, @Parm_FieldName, @Parm_Value, @Parm_WithResult

  RETURN @m_Success
GO

--------------------------------------------------------------------------------------------------------
-- Wartungsauftrag anlegen
IF 0 < (SELECT count(*) from [sysobjects] where [xtype] = 'P' and [name] = 'itcproc_WartungsAuftraege_add')
  DROP PROCEDURE [dbo].[itcproc_WartungsAuftraege_add]
GO
CREATE PROCEDURE [dbo].[itcproc_WartungsAuftraege_add]
  @Param_Knr varchar(20)
 ,@Param_Uid varchar(30)
 ,@Param_AnlagenId varchar(10)
 ,@Param_KdNr      varchar(15)
 -- Art: 0..1 Wartung,  2 Service
 ,@Param_Art       varchar(10) = 2
AS
  SET NOCOUNT ON

  DECLARE @m_AnlagenId integer = dbo.itcfunc_integer(@Param_AnlagenId)
  DECLARE @m_ObjektId  integer = 0
  DECLARE @m_Art       integer = dbo.itcfunc_integer(@Param_Art)

  -- Sicherstellen, das Objekt und Anlage vorhanden sind
  IF @m_AnlagenId <= 0 BEGIN
    -- leere Anlage und leeres Objekt (ohne Nummer) anlegen
	-- wird gebraucht fuer die Verknuepfungen der Crystal-Reports
	SELECT @m_ObjektId = ISNULL(MAX(Ident),0) + 1 FROM dbo.ut_WartungsObjekte
	INSERT dbo.ut_WartungsObjekte (RecId, Ident, KdNr) VALUES (dbo.itcfunc_NextRecId_WartungsObjekte(), @m_ObjektId, @Param_KdNr)
	SELECT @m_AnlagenId = ISNULL(MAX(Ident),0) + 1 FROM dbo.ut_WartungsAnlagen
	INSERT dbo.ut_WartungsAnlagen (RecId, Ident, ObjektId) VALUES (dbo.itcfunc_NextRecId_WartungsAnlagen(), @m_AnlagenId, @m_ObjektId)
  END ELSE
    SELECT @m_ObjektId = ObjektId FROM dbo.ut_WartungsAnlagen WHERE Ident = @m_AnlagenId

  -- Tagesdatum ermitteln
  DECLARE @m_Datum datetime = dbo.itcfunc_datetime('H')

  -- Projektnummer ermitteln
  DECLARE @m_PrjNr varchar(8) = ISNULL((SELECT OptDataC FROM dbo.ut_Optionen WHERE OptId = ' 9927'),'SERVICE')

  -- Monteur ermitteln
  DECLARE @m_Monteur  varchar(4)
  DECLARE @m_AlleAnnr integer
  SELECT @m_Monteur = Annr, @m_AlleAnnr = AlleAnnr FROM dbo.ut_WebUser WHERE Knr = @Param_Knr AND [Uid] = @Param_Uid
  IF @m_AlleAnnr IS NULL
    SET @m_AlleAnnr = 1
  IF @m_AlleAnnr = 1
    SET @m_Monteur = ''

  -- Neue Auftragsnummer ermitteln und reservieren
  DECLARE @m_AuftragNr varchar(20)
  IF @m_Art = 2
    SELECT @m_AuftragNr = OptDataC FROM dbo.ut_Optionen WHERE OptId = ' 9928'
  ELSE
    SELECT @m_AuftragNr = OptDataC FROM dbo.ut_Optionen WHERE OptId = ' 9902'

  IF @m_AuftragNr IS NULL BEGIN
    SELECT 'Die Auftragsnummer kann nicht ermittelt werden.' AS error
    RETURN
  END
  IF dbo.itcfunc_IncString(@m_AuftragNr) = @m_AuftragNr BEGIN
    SELECT 'Die Auftragsnummer kann nicht weitergezaehlt werden.' AS error
    RETURN
  END
  SET @m_AuftragNr = dbo.itcfunc_IncString(@m_AuftragNr)
  IF @m_Art = 2
    UPDATE dbo.ut_Optionen SET OptDataC = @m_AuftragNr WHERE OptId = ' 9928'
  ELSE
    UPDATE dbo.ut_Optionen SET OptDataC = @m_AuftragNr WHERE OptId = ' 9902'

  -- Neue Auftrags-Id ermitteln und Auftragsdatensatz anlegen
  DECLARE @m_AuftragId integer
  SELECT @m_AuftragId = ISNULL(MAX(Ident),0) + 1 FROM dbo.ut_WartungsAuftraege
  INSERT dbo.ut_WartungsAuftraege (RecId, Ident, Nr, ObjektId, AnlagenId, Datum, Art, [Status], KdNr, PrjNr, Betreff, Monteur)
  VALUES(dbo.itcfunc_NextRecId_WartungsAuftraege(), @m_AuftragId, @m_AuftragNr, @m_ObjektId, @m_AnlagenId, @m_Datum, @m_Art, 1, @Param_KdNr, @m_PrjNr, 'neuer Auftrag', @m_Monteur)

  -- Meldungszeile anlegen
  DECLARE @m_RecIdMeldung integer = dbo.itcfunc_NextRecId_WartungsMeldungen()
  INSERT dbo.ut_WartungsMeldungen (RecId, AnlagenId, Datum, KzStoerung, PrjNr, AuftragId, [Status], LfdNr, Monteur)
  VALUES (@m_RecIdMeldung, @m_AnlagenId, @m_Datum, 1, @m_PrjNr, @m_AuftragId, 3, 1, @m_Monteur)

  -- Meldungsdaten aktualisieren
  UPDATE m
    SET AnlagenNr = a.Nr, AnlagenBez = a.Bez1, ObjektNr = o.Nr, ObjektBez = o.Bez1,
	    KdNr = o.KdNr, KdName = ISNULL(kd.Name1, ''),
		Standort = o.Standort, SoName = ISNULL(so.Name1, ''), SoStrasse = ISNULL(so.Strasse, ''), SoPlz = SUBSTRING(ISNULL(so.Plz,''),1,8), SoOrt = ISNULL(so.Ort, ''),
		HausMstr = o.HausMstr, Mieter = o.Mieter
    FROM dbo.ut_WartungsMeldungen AS m
    left join dbo.ut_WartungsAnlagen AS a ON a.Ident = m.AnlagenId
    left join dbo.ut_WartungsObjekte AS o ON o.Ident = a.ObjektId
    left join dbo.ut_Adressen AS kd ON kd.DESTDEBNR = o.KdNr
    left join dbo.ut_Adressen AS so ON so.DESTDEBNR = o.Standort
    WHERE m.RecId = @m_RecIdMeldung
  SELECT * FROM [dbo].[itcview_WartungsAuftraege] WHERE Ident = @m_AuftragId 
GO

-- EXECUTE [dbo].[itcproc_WartungsAuftraege_add] '','',0,'10113'
-- SELECT * FROM dbo.ut_Optionen WHERE OptId = ' 9928'
