Job-Kalender Termine mit externen Kalendern synchronisieren
Allgemeines
Hier wird beschrieben, wie man Termine aus dem JobKalender mit einem externen System synchronisieren kann.
Dabei wird davon ausgegangen, dass der JobKalender das führende System ist. Das bedeutet:
- Für einen Termin gibt es drei Synchronisations-Momente:
- Termin wurde angelegt
- Termin wurde geändert. Das kann der Zeitraum, die Ressource/Person, der Text usw. sein.
- Termin wurde gelöscht
- Auftrags-Termine werden ausschließlich im JobKalender angelegt, geändert oder gelöscht.
Basis der Beschreibung ist das Zusatz-Modul GooCal, das Termine aus dem JobKalender mit Google©-Kalendern synchronisiert.
Ablauf einer Synchronisation
Zur Erinnerung: Daten werden hier nur in eine Richtung synchronisiert, nämlich vom JobKalender zum externen Kalender!
Termin-Daten aus dem JobKalender (MAufJob) einlesen
Dazu kann dieser SQL-Script verwendet werden:
select MAufJob.LFDNR, MAufJob.AUFTRNR, MAufJob.DATUM, MAufJob.DATUMBIS, MAufJob.UHRZEITVON, MAufJob.UHRZEITBIS, MAufJob.PERSONEN,
MAufJob.text, MAufJob.ORT, MAufJob.ERFDAT, MAufJob.ERFUSER,
MAufJob.BETREFF,MAufJob.ADRKURZNAME, MAufJob.AENDDAT, MAufJob.AENDUSER,
MAufJob.TERMINART, MAufJob.ID_STRING, MAufJob.TERMSTATUS, MAufJob.TERMIN_GANZTAEGIG, MAufJob.Changed, MAufJob.TerminTyp,
MAufJob.Anzahl, MAufJob.OBERGRUPPE, MAufJob.GRUPPE, MAufJob.UNTGRUPPE, MAufJob.ARTNR, MAufJob.MENGENTERMIN,
MAufJob.ZU_MAUFJOB_LFDNR, MAufJob.BeauftragungsArt, MAufJob.JobCalChanged, MAufJob.BemerkungIntern, MAufJob.BemerkungExtern,
MAufJob.VeranstOrt, MAufJob.VeranstRaum, MAufJob.CLOUD_EVENT_ID,
MAUFKO.VERANSTNAME, MAUFKO.BEARBEITER,
Pers.PERSNR, Pers.KURZZEICHEN, Pers.VORNAME, Pers.NACHNAME, Pers.SPRACHE, Pers.SyncStatus, Pers.SyncAddress
from MAufJob MAufJob
left outer join pers Pers on Pers.KURZZEICHEN=MAufJob.PERSONEN
left outer join maufko MAUFKO on MAUFKO.AUFTRNR=MAufJob.AUFTRNR
-- Nur TerminTyp 3=Arbeitszeit-Termine:
where MAufJob.TerminTyp=3
-- Nur Personen/Ressourcen mit Kennzeichen > 0: 1=Google 2=Outlook/Exchange
-- Das wird in den Personen-Stammdaten in REFLEX so festgelegt.
and ( Pers.SyncStatus = 1 or Pers.KURZZEICHEN is null )
-- Nur wenn in den Personen-Stammdaten eine Synch-Adresse steht:
and Pers.SyncAddress >
-- Auch überlappende Termine (wie in der Dispo):
and ( (MAufJob.DATUM <= 'DatumVon'
AND
(MAufJob.DATUMBIS >= 'DatumVon'
)
-- Nur Termine mit diesem Status:
-- 1=Zugesagt, Bestätigt 4=Angefragt 6=Bestellung (Überhang)
and ( MAufJob.TERMSTATUS=1 or MAufJob.TERMSTATUS=4 or MAufJob.TERMSTATUS=6)
order by MAufJob.DATUM
Externe Kalender-Einträge einlesen
Daten aus dem Google-Kalender, Exchange o.ä im Zeitraum von DatumVon bis DatumBis (DatumVon + Anzahl Tage) in den Speicher einlesen und dort untersuchen:
Daten verarbeiten
Kalender-Einträge durchlaufen und ggf. löschen:
- Den Key (z.B. "EventID") des Termins in der Tabelle MAufJob.CLOUD_EVENT_ID suchen.
- Wenn der dort nicht (mehr) gespeichert ist: Kalender-Item löschen!
Tabelle MAufJob durchlaufen und ggf. neu einfügen
- Wenn dort kein Eintrag im Feld MAufJob.CLOUD_EVENT_ID steht: Kalender-Item einfügen!
- Kalender-Eintrag/-Felder:
- Summary: Betreff
- Description: Beschreibung, üblicherweise aus Terminart, VA-Name, VA-Ort, VA-Raum usw.
- Location: Ort
- StartTime (Datum + Uhrzeit)
- EndTime (Datum + Uhrzeit)
- Die API des Kalenders muss dabei die ID des Kalender-Eintrags zurückliefern.
- Diese ID muss das Synch-Programm in MAufJob.CLOUD_EVENT_ID speichern.
- Der Ordner-Name in Outlook/Exchange muss in MAufJob.OrdnerName varchar(255) gespeichert werden.
Tabelle MAufJob durchlaufen, bei Änderungen/Unterschieden Kalender-Item updaten
- MAufJob.CLOUD_EVENT_ID das Kalender-Item einlesen, die Einträge miteinander vergleichen
- Üblicherweise hat ein Kalender-Eintrag diese Felder:
- Summary: Betreff
- Description: Beschreibung, üblicherweise aus Terminart, VA-Name, VA-Ort, VA-Raum usw.
- Location: Ort
- StartTime (Datum + Uhrzeit)
- EndTime (Datum + Uhrzeit)
- Wenn es irgendwo einen Unterschied gibt: Kalender-Item entsprechend updaten!
Voraussetzungen
Die ID des Kalender-Termins darf max. 512 Zeichen groß sein. Sie wird zum Abgleich in der Tabelle MAufJob im Feld CLOUD_EVENT_ID varchar(512) gespeichert. Der Ordner-Name in Outlook/Exchange darf max. 255 Zeichen groß sein. Er wird in MAufJob.OrdnerName varchar(255) gespeichert.