====== Schnittstelle 6001: Urlaubsanspruch — aktuelles Jahr und Folgejahr berechnen ====== Dokumentation ins Wiki übernommen am **02.10.2026**. Das ist keine Laufzeitabnahme. Diese technische Referenz beschreibt die Eingänge, Datenwirkung und Ausgänge dieser Kennung im statisch geprüften Desktop-Quellenstand. Nutzerprüfung offen. Dokumentiert / statisch geprüft: **2026-10-02**. Statisch dokumentiert; Nutzerprüfung offen. Keine Schnittstelle ausgeführt. ===== Identität und Quellenstand ===== ''eProgramm.CalcUrlaub = 6001''. Aktive feste Registrierung → ''cProgramme.CalcUrlaub'' (E,P). Projekteinschluss der genannten VB-Quellen geprüft (PRJ). Active=True, InAutomatik=true, ManuellerAufruf=true, NurAufServer=false. Kennzeichen beschreiben Registrierung/Defaults, nicht eingerichtete Jobs; Run selbst prüft keine Serverbindung. ''seegerstefan/pep4desktop'', master, Commit ''f1d82a003b62f2658f06eaa943dc685ab219bdf3''. Lokale .DS_Store-/cPep/PEP-Abweichungen nicht vermischt; Fachquellen cSchnittstellen/ZW/Sqlfiles unverändert. Kein Remote-/Installationsabgleich. ===== Zweck und Parameter ===== Keine fachlichen Laufparameter oder Dateien. cProgramme ruft cCalcUrlaub.CalcUrlaub(Settings,heute.Jahr,-1) und dasselbe für Jahr+1 auf. Direkte Meldungen, keine BASE-Mail/API. Äußerer Fehler False, sonst Erfolg True. Keine gemeinsame Transaktion über Personen/Jahre. ===== Eingänge und Berechnung ===== RMUrlaub(ID,Rundung,Art,BasisTage,VollNachSechsMonaten,BefristungBeachten) und RMUrlaubAlter(RMUrlaub,BeschaeftigungJahre,AlterJahre,Urlaub) füllen die Anspruchsmatrix. VollNachSechsMonaten wird geladen, **nicht** bei dieser Berechnung angewendet. Personen mit RMUrlaub nichtNULL: PersonID/GebDat/Eintritt/Austritt/EndeBefristung/RMUrlaub. Vorhandener Art1-Anspruch desselben Jahres kann über MAX(RMUrlaub) den Personenstandard überschreiben. ITZeit-RMAZPlanID am jüngsten von<=Jahresende bestimmt Verhältnis der im ReMo-Cache aus RMAZPlan.TageUrlaub geladenen Urlaubstage zu RMUrlaub.BasisTage; fehlendes Modell oder BasisTage0 → Faktor1. Urlaubberechtigte ITZeit-Zeiträume (HatUrlaubsanspruch1) bilden Tagesmaske; Eintritt/Austritt und optional Befristung begrenzen. CALC_URLAUB_TAGEMONAT: −1 anteiliger Monat, −2 zweite Monatshälfte komplett,0 ganzer Monat, sonst Mindesttage. Aktive Tage und Monate werden aufs Jahr verteilt. Alter am01.01.Jahr; Betriebszugehörigkeit Variante1 volleJahre am01.01., Variante2 Jahresdifferenz; Bereich0..120. Tarifmatrix × Wochenfaktor × Monate/12. ITSonderurlaub(von/bis/Sonderurlaub) tagegewichtet über dieselbe Maske, anschließend ebenfalls Faktor. Rundung je RMUrlaub.Rundung:1 auf,2 kaufmännisch,3 ab mit CALC_URLAUB_RUNDUNG Nachkommastellen;4 halbe Tage; sonst unverändert. Rundungshelpers im cFn, keine DB-Wirkung. ===== Ausgang und SQL ===== Direkte parametrisierte UPDATE/INSERT-Befehle, keine Fach-SP. SELECT verwendet dbo.fnVarcharToList('-1') **oder** Liste='-1': hier wirklich alle Personen; UDF schreibt nur lokale Rückgabetabelle. Je Person/Jahr Art1 Tarif und Art2 Sonderurlaub: UPDATE UrlaubsAnspruch.Anspruch bei Person/GültigVon01.01.Jahr/Art; nur wenn keine Zeile und Anspruch>0 INSERT(GültigVon,Person,Anspruch,Art,TypU,KommentarUrlaub,RMUrlaub). Bestehender Nullanspruch bleibt Zeile mit0, alte RMUrlaub/Kommentar/Typ werden im UPDATE nicht verändert. GültigBis wird nicht gesetzt, computed GültigBis2 fällt auf2099 zurück. Defaults beim INSERT: tsGETDATE,AbtragungZ/P0,UserIDNULL nach0550; **keine aktuelle ID/Jahr-Spalte** nach0743. Kein allgemeiner Calc-ZW/PEP-Lauf gestartet. ===== Befunde ===== ⚠ Sonderurlaub-nur-Art2-Zweig ist innerhalb des äußeren Art=1-Blocks und dadurch unerreichbar; RMUrlaub.Art2 erhält hier keine Berechnung. VollNachSechsMonaten ungenutzt. Index120 wird für Alter120 nicht berechnet (Alter<120). Zwei Jahre/Teilfehler ohne Transaktion, überlappende ITZeit-Modellzeilen können scalar SELECT scheitern. Synthetische Anspruchs-/Befristungs-/Rundungsabnahme Q19; Code nicht korrigiert. ===== Einstellungen und gemeinsame Nebenwirkungen ===== Gemeinsames Profil: LEGACY (interne Referenz). ^ Beziehung ^ Schlüssel / Variable ^ Default ^ Einflussweg ^ Wirkung ^ Beleg ^ | 6001-S001 | ''CALC_URLAUB_TAGEMONAT'' / ''CALCUrlaubTageMonat'' | 0 | cPerson.Monate | Monatsanteilsregel anhand ITZeit-Tagesmaske | U,SET | | 6001-S002 | ''CALC_URLAUB_RUNDUNG'' / ''CALC_UrlaubRundung'' | 0 | Rundungshelpers | Nachkommastellen bei RM-Rundung1/2/3 | U,SET | | 6001-S003 | ''CALC_UrlaubsKontingent_Betriebzugehörigkeit_Art'' / ''CALC_UrlaubsKontingent_Betriebzugehörigkeit_Art'' | 1 | Anspruchsmatrix | 1 volle Jahre am01.01.,2 Jahresdifferenz | U,SET | Defaults sind keine Livewerte. Melde-/Datei-/DB-Wirkungen sind nicht atomar. ===== Feldbeziehungen ===== DB-Rolle PEP4-Anmeldedatenbank, soweit nicht ausdrücklich Aprocon oder Import angegeben. Unqualifizierte Objektschemata nicht als Live-dbo-Vertrag behaupten. INSERT-Defaults/Computed-Spalten sind gesonderte Schemawirkung, kein explizites UPDATE. ^ Beziehung ^ Tabelle.Feld ^ Operation ^ Datenfluss / Verwendung ^ Bedingung ^ Beleg ^ | 6001-D001 | ''RMUrlaub.ID'' | SELECT | Urlaubsmodell; VollNachSechsMonaten nur geladen, ungenutzt | Beide Jahre | U | | 6001-D002 | ''RMUrlaub.Rundung'' | SELECT | Urlaubsmodell; VollNachSechsMonaten nur geladen, ungenutzt | Beide Jahre | U | | 6001-D003 | ''RMUrlaub.Art'' | SELECT | Urlaubsmodell; VollNachSechsMonaten nur geladen, ungenutzt | Beide Jahre | U | | 6001-D004 | ''RMUrlaub.BasisTage'' | SELECT | Urlaubsmodell; VollNachSechsMonaten nur geladen, ungenutzt | Beide Jahre | U | | 6001-D005 | ''RMUrlaub.BefristungBeachten'' | SELECT | Urlaubsmodell; VollNachSechsMonaten nur geladen, ungenutzt | Beide Jahre | U | | 6001-D006 | ''RMUrlaub.VollNachSechsMonaten'' | SELECT | Urlaubsmodell; VollNachSechsMonaten nur geladen, ungenutzt | Beide Jahre | U | | 6001-D007 | ''RMUrlaubAlter.RMUrlaub'' | SELECT | Matrix vonAlter/Betriebszugehörigkeit | Beide Jahre | U | | 6001-D008 | ''RMUrlaubAlter.BeschaeftigungJahre'' | SELECT | Matrix vonAlter/Betriebszugehörigkeit | Beide Jahre | U | | 6001-D009 | ''RMUrlaubAlter.AlterJahre'' | SELECT | Matrix vonAlter/Betriebszugehörigkeit | Beide Jahre | U | | 6001-D010 | ''RMUrlaubAlter.Urlaub'' | SELECT | Matrix vonAlter/Betriebszugehörigkeit | Beide Jahre | U | | 6001-D011 | ''Personen.PersonID'' | SELECT | Anspruchsberechtigte Stammdaten, allePersonen mitRMUrlaub | Liste=-1 Sonderfall ist korrekt umgesetzt | U | | 6001-D012 | ''Personen.GebDat'' | SELECT | Anspruchsberechtigte Stammdaten, allePersonen mitRMUrlaub | Liste=-1 Sonderfall ist korrekt umgesetzt | U | | 6001-D013 | ''Personen.Eintritt'' | SELECT | Anspruchsberechtigte Stammdaten, allePersonen mitRMUrlaub | Liste=-1 Sonderfall ist korrekt umgesetzt | U | | 6001-D014 | ''Personen.Austritt'' | SELECT | Anspruchsberechtigte Stammdaten, allePersonen mitRMUrlaub | Liste=-1 Sonderfall ist korrekt umgesetzt | U | | 6001-D015 | ''Personen.EndeBefristung'' | SELECT | Anspruchsberechtigte Stammdaten, allePersonen mitRMUrlaub | Liste=-1 Sonderfall ist korrekt umgesetzt | U | | 6001-D016 | ''Personen.RMUrlaub'' | SELECT | Anspruchsberechtigte Stammdaten, allePersonen mitRMUrlaub | Liste=-1 Sonderfall ist korrekt umgesetzt | U | | 6001-D017 | ''Urlaubsanspruch.Person'' | SELECT | VorhandenesModell Art1 imJahr / UPDATE-Match | MAX(RMUrlaub) | U | | 6001-D018 | ''Urlaubsanspruch.GültigVon'' | SELECT | VorhandenesModell Art1 imJahr / UPDATE-Match | MAX(RMUrlaub) | U | | 6001-D019 | ''Urlaubsanspruch.Art'' | SELECT | VorhandenesModell Art1 imJahr / UPDATE-Match | MAX(RMUrlaub) | U | | 6001-D020 | ''Urlaubsanspruch.RMUrlaub'' | SELECT | VorhandenesModell Art1 imJahr / UPDATE-Match | MAX(RMUrlaub) | U | | 6001-D021 | ''ITZeit.PersonenStammID'' | SELECT | Stichtagsmodell und Urlaubberechtigungsmaske | Jahresgrenzen | U | | 6001-D022 | ''ITZeit.von'' | SELECT | Stichtagsmodell und Urlaubberechtigungsmaske | Jahresgrenzen | U | | 6001-D023 | ''ITZeit.bis'' | SELECT | Stichtagsmodell und Urlaubberechtigungsmaske | Jahresgrenzen | U | | 6001-D024 | ''ITZeit.RMAZPlanID'' | SELECT | Stichtagsmodell und Urlaubberechtigungsmaske | Jahresgrenzen | U | | 6001-D025 | ''ITZeit.HatUrlaubsanspruch'' | SELECT | Stichtagsmodell und Urlaubberechtigungsmaske | Jahresgrenzen | U | | 6001-D026 | ''RMAZPlan.ID'' | SELECT | Vorhandener ReMo-Cache: TageJeWocheUrlaub; kein frischer SQL-Ladevorgang im Programm | Cache laden separat; Herkunft belegt | RM | | 6001-D027 | ''RMAZPlan.TageUrlaub'' | SELECT | Vorhandener ReMo-Cache: TageJeWocheUrlaub; kein frischer SQL-Ladevorgang im Programm | Cache laden separat; Herkunft belegt | RM | | 6001-D028 | ''ITSonderurlaub.PersonenStammID'' | SELECT | Tagegewichteter Sonderurlaub | Ein-/Austritts-/Jahresgrenzen | U | | 6001-D029 | ''ITSonderurlaub.von'' | SELECT | Tagegewichteter Sonderurlaub | Ein-/Austritts-/Jahresgrenzen | U | | 6001-D030 | ''ITSonderurlaub.bis'' | SELECT | Tagegewichteter Sonderurlaub | Ein-/Austritts-/Jahresgrenzen | U | | 6001-D031 | ''ITSonderurlaub.Sonderurlaub'' | SELECT | Tagegewichteter Sonderurlaub | Ein-/Austritts-/Jahresgrenzen | U | | 6001-D032 | ''Urlaubsanspruch.Anspruch'' | UPDATE | TarifArt1/SonderArt2 | VorhandenerPerson/01.01.Jahr/Art | U | | 6001-D033 | ''Urlaubsanspruch.GültigVon'' | INSERT | 01.01.Jahr/Tarif oderSonder/U/Urlaub/Modell | Nurfehlend undAnspruch>0 | U | | 6001-D034 | ''Urlaubsanspruch.Person'' | INSERT | 01.01.Jahr/Tarif oderSonder/U/Urlaub/Modell | Nurfehlend undAnspruch>0 | U | | 6001-D035 | ''Urlaubsanspruch.Anspruch'' | INSERT | 01.01.Jahr/Tarif oderSonder/U/Urlaub/Modell | Nurfehlend undAnspruch>0 | U | | 6001-D036 | ''Urlaubsanspruch.Art'' | INSERT | 01.01.Jahr/Tarif oderSonder/U/Urlaub/Modell | Nurfehlend undAnspruch>0 | U | | 6001-D037 | ''Urlaubsanspruch.Typ'' | INSERT | 01.01.Jahr/Tarif oderSonder/U/Urlaub/Modell | Nurfehlend undAnspruch>0 | U | | 6001-D038 | ''Urlaubsanspruch.Kommentar'' | INSERT | 01.01.Jahr/Tarif oderSonder/U/Urlaub/Modell | Nurfehlend undAnspruch>0 | U | | 6001-D039 | ''Urlaubsanspruch.RMUrlaub'' | INSERT | 01.01.Jahr/Tarif oderSonder/U/Urlaub/Modell | Nurfehlend undAnspruch>0 | U | | 6001-D040 | ''Urlaubsanspruch.ts'' | DEFAULT | GETDATE/0/0 | INSERT nachSchema | D100,D743 | | 6001-D041 | ''Urlaubsanspruch.AbtragungZ'' | DEFAULT | GETDATE/0/0 | INSERT nachSchema | D100,D743 | | 6001-D042 | ''Urlaubsanspruch.AbtragungP'' | DEFAULT | GETDATE/0/0 | INSERT nachSchema | D100,D743 | | 6001-D043 | ''Urlaubsanspruch.GültigBis2'' | COMPUTED | ISNULL(GültigBis,31.12.2099) | GültigBis nicht gesetzt | D744 | ===== Teststatus und Pflege ===== Keine Laufzeit-/Live-Schema-/Lieferformat-Abnahme, keine Codekorrektur. Q02 gilt für kundenspezifische Trigger/Constraints/DLLs/Jobs; weitere Grenzen siehe oben und Fragen (interne Referenz). Nicht indizierte Folgefelder einer Teilanalyse sind unbekannt, nicht wirkungslos. ===== Gemeinsame Nebenwirkungen LEGACY ===== ==== Einstellungen ==== ^ Beziehung ^ Schlüssel / Variable ^ Default ^ Einfluss ^ Wirkung ^ Beleg ^ | LEGACY-S001 | ''GLOBAL_LOGLEVEL'' / ''GLOBAL_LOGLEVEL'' | 50 | Init → Info.LogLevel | Meldung ab einschließlich Grenzwert in Datei/DB; verändert keine Fachdaten | LEGACY:SET, LEGACY:INIT, LEGACY:INFO | | LEGACY-S002 | ''GLOBAL_LOGLEVELEVLOG'' / ''GLOBAL_LOGLEVELEVENTLOG'' | 0 | Init → Info.LogLevelEvLog | Windows-Ereignisprotokoll nur bei Level > Grenze, Grenze > 0 und Level < 200 | LEGACY:SET, LEGACY:INIT, LEGACY:INFO | Beide gezeigten Settings-Konstruktoren setzen AlwaysToFile=True. Oberhalb LogLevel werden Datei UND DB versucht; bei False nur DB, Datei als Fehlerfallback. Datei unter ApplicationData/PEP/LogFiles/yyyyMMdd_peplog.txt (Append). DB-Fehler werden als False abgefangen, verhindern nicht zwingend den Import. EventLog-Fehler werden geschluckt. Direkte Fachcommands des Block 07 setzen kein Timeout; SQL_TIMEOUT ist in diesen zehn Pfaden nicht gelesen. Keine zusätzliche fachliche ZW-Einstellung nachgewiesen, auch nicht in spCalcUmsatzPlan. ==== Datenbeziehungen ==== DB-Rolle PEP4-Anmeldedatenbank. Log schreibt über eigene Verbindung; nicht atomar mit Fachoperationen. fnUserId liest minimalen UserID zum rechten 25-Zeichen-Teil von SUSER_NAME(), sonst 0. ^ Beziehung ^ Tabelle.Feld ^ Operation ^ Datenfluss / Verwendung ^ Bedingung ^ Beleg ^ | LEGACY-D001 | ''Pep3Log.UserID'' | INSERT | dbo.fnUserId() | Meldungslevel erreicht DB-Log | LEGACY:INFO, LEGACY:FN | | LEGACY-D002 | ''Pep3Log.Datum'' | INSERT | getdate() | Meldungslevel erreicht DB-Log | LEGACY:INFO | | LEGACY-D003 | ''Pep3Log.Kurz'' | INSERT | Kurztext, maximal 255 Zeichen | Meldungslevel erreicht DB-Log | LEGACY:INFO | | LEGACY-D004 | ''Pep3Log.LogText'' | INSERT | Detailtext einschließlich Pfad/ggf. Exception | Meldungslevel erreicht DB-Log | LEGACY:INFO | | LEGACY-D005 | ''Pep3Log.Modul'' | INSERT | Modulbezeichnung, maximal 50 Zeichen | Meldungslevel erreicht DB-Log | LEGACY:INFO | | LEGACY-D006 | ''Pep3Log.InfoLevel'' | INSERT | 51, 102 oder 105 je Meldung | Meldungslevel erreicht DB-Log | LEGACY:INFO | | LEGACY-D007 | ''tblUser.Name'' | SELECT | Abgleich RIGHT(SUSER_NAME(),25) | fnUserId bei Log-INSERT | LEGACY:FN | | LEGACY-D008 | ''tblUser.UserID'' | SELECT | MIN(UserID), fehlend → 0 | fnUserId bei Log-INSERT | LEGACY:FN | ===== Quellenverzeichnis ===== ^ Kürzel ^ Quelldatei am geprüften Commit ^ | E | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/ZW/Allgemein.vb|PEP4/ZW/Allgemein.vb]] | | P, LEGACY:P | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/cSchnittstellen/Programme/cProgramme.vb|PEP4/cSchnittstellen/Programme/cProgramme.vb]] | | PRJ | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/cSchnittstellen/cSchnittstellen.vbproj|PEP4/cSchnittstellen/cSchnittstellen.vbproj]] | | B | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/cSchnittstellen/Programme/Programme/cProgramme.vb|PEP4/cSchnittstellen/Programme/Programme/cProgramme.vb]] | | U | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/ZW/cCalcUrlaub.vb|PEP4/ZW/cCalcUrlaub.vb]] | | SET, LEGACY:SET | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/ZW/Einstellungen/cEinstellungenZw.vb|PEP4/ZW/Einstellungen/cEinstellungenZw.vb]] | | RM | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/ZW/cRechenmodell.vb|PEP4/ZW/cRechenmodell.vb]] | | FN | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Functions/fnVarcharToList.sql|Sqlfiles/PEP4Functions/fnVarcharToList.sql]] | | ROUND | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/cTools/cFn.vb|PEP4/cTools/cFn.vb]] | | D100 | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Update/update_0100.sql|Sqlfiles/PEP4Update/update_0100.sql]] | | D743 | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Update/update_0743.sql|Sqlfiles/PEP4Update/update_0743.sql]] | | D744 | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Update/update_0744.sql|Sqlfiles/PEP4Update/update_0744.sql]] | | D550 | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Update/update_0550.sql|Sqlfiles/PEP4Update/update_0550.sql]] | | D090 | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Update/update_0090.sql|Sqlfiles/PEP4Update/update_0090.sql]] | | LEGACY:INFO | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/cTools/cInfoTools.vb|PEP4/cTools/cInfoTools.vb]] | | LEGACY:INIT | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/ZW/Einstellungen/cSetting.vb|PEP4/ZW/Einstellungen/cSetting.vb]] | | LEGACY:FN | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Functions/fnUserId.sql|Sqlfiles/PEP4Functions/fnUserId.sql]] | Siehe auch: [[schnittstellen:schnittstellen|Übersicht der Schnittstellen]]. Keine Ausführung oder Codekorrektur.