====== Schnittstelle 3521: WebZerf2 — Benutzer und persönliche Daten veröffentlichen ====== Dokumentiert / statisch geprüft: **2026-10-02**. Teilweise dokumentiert: lokaler Benutzer-/SQL-Datenfluss belegt; cWebData-Ausgabeformat aus externer DLL nicht aufgelöst (Q17); Nutzerprüfung offen. Keine Schnittstelle ausgeführt. ===== Identität und Quellenstand ===== ''eProgramm.ExportWebZerfUser = 3521''. Aktive feste Registrierung → ''cSchnittWebZerf2.Export_User'' (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 Ablauf ===== Kein Eingangsfile/PFAD. Multi-Start → ResetDaten → ExportStammJSON → ExportPersonData → Multi-Ende. Reset fehlgeschlagen → beide Exporte entfallen. Nach fehlgeschlagenem Stammexport **läuft Datenupload dennoch**. Shared Export_User hat keinen normalen Boolean-Return und ignoriert ExportPersonen-Ergebnis → False auch nach Erfolg. Jede Stufe BASE-Start/Ende, Server-/Dbguard wenn beide Schutzsettings gesetzt, nichtleere Kunde/Key. Synchrone HTTP-Aufrufe am sharedClient mit ersetzten AppKey/Key/Command/User-Agent-Headern. RESET_DATEN per GET /api.php?type=P&art= verlangt AntwortbeginnOK; **kann entfernte Daten vor misslungenem Neuaufbau zurücksetzen**, Serverwirkung nicht lokal beweisbar. HTTPstatus hier und bei den Uploads nicht ausdrücklich geprüft; OK-Text entscheidet. Keine atomare Gesamtübertragung, keine hier gesetzten SQL_TIMEOUT/HTTPtimeoutwerte (SQLdefault30s). ===== Benutzervertrag — UPLOAD_USERJ ===== Personen aktiv=1,AustrittNULL oder>GETDATE,WebZerf2=1. Kein zusätzlicher Eintritt-/InZW-/StartZW-Filter; alte unaufgerufene ExportStamm-Routine nicht als aktuellen Filtervertrag verwenden. Pro Benutzer eine kompakte JSON-Zeile mit PersonID,PinHash,WildCard,Mail und fünf WebZerf_buchung_* Flags (erstellen/listen/edit/manuell/abwesend). PinHash **SHA256/UTF8**, fester Salt, URL-Base64; keine Roh-PIN/Salt kopiert. Wildcard NzLong,Mail NzStr,Flags NzBoolean. Serializer ignoriertNULL, Flags werden zuvor bereits auf Boolean umgesetzt (kein globaler ZW-Rechtefallback im aktiven JSONpfad). POST /api.php, UPLOAD_USERJ, text/plain, gzip, UTF-8 ohneBOM. Keine lokale Personen-UPDATE/INSERT-Fachwirkung aus diesem Export. ===== Persönliche Daten — UPLOAD_USERDATA ===== Drei SQL-Prozeduren, nurSELECT in lokale Temp-/Ergebnistabellen: * webzerf_saldo: aktive, nichtausgetretene WebZerf2-Personen mit WebZerf_info_saldo=1; BerechneteZeiten bisheute → maximalerDatum-Stichtag, SUM(Tagessaldo),SUM(Urlaub). PersonID/Bezeichnung/Wert → SAL-Block. * webzerf_planung(@DatVon,@DatBis): Personen mit Pep2-Daten im Zeitraum und ISNULL(WebZerf_info_planung,globaler Webzerf_PlanungListen)=1; Kalendercrossjoin Tage. JeTag MIN(Kommen)/MAX(Gehen), ein einzelner GanzTag-Kennzeichenstatus→Bezeichnung statt Uhrzeiten; sonst HH:mm-HH:mm, ISO-Kalenderwoche als Gruppe. **Kein zusätzlicher Aktiv-/WebZerf2-Filter** der Personen in dieser SP. Datum(Anzeige)/Planung → PLAN-Tabellen. * webzerf_provision_01(@QDatVon,@QDatBis): Client schickt aktuellen Monatsbeginn/heute; SP überschreibt Ende mit Monatsultimo und ergänzt **Vormonat**. UmsatzVK.VKWert/VKWertNetto jePerson; PepBerechnet-Sollzeit/Feiertags-/Urlaubsabzug, Pep2-Status310/311/320 für Schule/Betriebsrat, gültige ITProvision (Kennzeichen1/3), ITORGA/ITProvisionBereiche, ProdZiel. Ziel bei Kennzeichen1=SUM(Faktor*(Sollzeit+Abzug)*0.8*Produktivitaet), sonst Faktor*32*Produktivitaet; Bruttofaktor1.19 fest. Export nur WebZerf_info_prov=1 und WebZerf2=1, **kein Aktiv-/Austrittsfilter**. PersonID/Gruppe/Art/Wert → PROV-Tabelle. cWebData baut personbezogene SAL/PLAN/PROV-Blöcke, Gruppen und Spaltenformate auf. ''Data.GetData'' → UTF-8 ohneBOM, gzip, text/plain, POST UPLOAD_USERDATA. **Genauer Wire-Formatter nicht im VB-Quellpaket**, Projektreferenz SubProjekte/dll/cWebData.dll; Suchumfang Dateiliste+Klassensuche, keine Implementierung gefunden. Keine erfundene JSON-/CSV-Struktur für diesen zweiten Upload. Q17 benötigt Bibliotheksquelltext/Formatvertrag und API-Vertrag. ===== Befunde und Grenzen ===== ⚠ Remote-Reset vor ungesichertem Ersatz, False-Sharedreturn, unterschiedliche Personenfilter je Nutzdatenblock und Provisionszeitraum bis Monatsende statt bisheute. Null-/mehrfachpassende Historiendaten und konstante Steuer-/Schulregeln fachlich testen. Lokaler SQL-Leserindex unten vollständig für die drei SPs; externe Aufnahme-/Speicherfelder und cWebData-Format unbekannt, nicht als lokale Fach-UPDATEs indizieren. ===== Einstellungen und gemeinsame Nebenwirkungen ===== Gemeinsames Profil: BASE (interne Referenz). ^ Beziehung ^ Schlüssel / Variable ^ Default ^ Einflussweg ^ Wirkung ^ Beleg ^ | 3521-S001 | ''TERMINAL_Zerf_Kunde'' / ''WebZerf_ZerfKunde'' | leer | Clientguard | Nichtleer erforderlich; keine Zugangswerte dokumentiert | SET,B | | 3521-S002 | ''TERMINAL_Zerf_Key'' / ''WebZerf_ZerfKey'' | leer | HTTP X-API-KEY | Nichtleer erforderlich; Geheimnis nur als Settingname | SET,B | | 3521-S003 | ''Terminal_ZerfServer'' / ''Webzerf_ZerfServer'' | fest codierte URL mit Leerzeichen nach https: | HTTP-Basisadresse | RESET_DATEN/UPLOAD_USERJ/UPLOAD_USERDATA | SET,B | | 3521-S004 | ''SCHNITT_SEC_Server'' / ''SCHNITT_SEC_Server'' | leer | Serverguard | Servernameprüfung nur wenn Server UND Db nichtleer | SET,B | | 3521-S005 | ''SCHNITT_SEC_Db'' / ''SCHNITT_SEC_Db'' | leer | DBguard | Datenbankprüfung nur mit beiden Schutzsettings | SET,B | | 3521-S006 | ''Webzerf_PlanungVon'' / ''Webzerf_PlanungVon'' | 1.m.j | cDatumMuster → webzerf_planung | Untergrenze Planung | SET,B,PLAN | | 3521-S007 | ''Webzerf_PlanungBis'' / ''Webzerf_PlanungBis'' | lt.m+1.j | cDatumMuster → webzerf_planung | Obergrenze Planung; tatsächlich lt, nicht lt.m-Schreibfehler erfinden | SET,B,PLAN | | 3521-S008 | ''Webzerf_PlanungListen'' / ''WebZerf_PlanungListen'' | 0 in Client; SQL NULL→0 | GetEinstellungZw(EinstellungenZw.Wert) | Fallback für Personen.WebZerf_info_planung beiNULL | SET,PLAN,ES | 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 ^ | 3521-D001 | ''Personen.PersonID'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D002 | ''Personen.Pin'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D003 | ''Personen.WebZerf2WildCard'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D004 | ''Personen.Mail'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D005 | ''Personen.WebZerf_buchung_erstellen'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D006 | ''Personen.WebZerf_buchung_listen'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D007 | ''Personen.WebZerf_buchung_edit'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D008 | ''Personen.WebZerf_buchung_manuell'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D009 | ''Personen.WebZerf_buchung_abwesend'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D010 | ''Personen.aktiv'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D011 | ''Personen.Austritt'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D012 | ''Personen.WebZerf2'' | SELECT | Benutzerliste→JSON/PinHash | aktiv1,AustrittNULL/zukünftig,WebZerf2=1 | B | | 3521-D013 | ''Personen.PersonID'' | SELECT | Saldenfreigabe | InfoSaldo1 und aktuelleWebZerf2Person | SAL | | 3521-D014 | ''Personen.aktiv'' | SELECT | Saldenfreigabe | InfoSaldo1 und aktuelleWebZerf2Person | SAL | | 3521-D015 | ''Personen.Austritt'' | SELECT | Saldenfreigabe | InfoSaldo1 und aktuelleWebZerf2Person | SAL | | 3521-D016 | ''Personen.WebZerf2'' | SELECT | Saldenfreigabe | InfoSaldo1 und aktuelleWebZerf2Person | SAL | | 3521-D017 | ''Personen.WebZerf_info_saldo'' | SELECT | Saldenfreigabe | InfoSaldo1 und aktuelleWebZerf2Person | SAL | | 3521-D018 | ''BerechneteZeiten.Person'' | SELECT | MAXDatum,SUMTagessaldo,SUMUrlaub→SAL | Datum<=GETDATE | SAL | | 3521-D019 | ''BerechneteZeiten.Datum'' | SELECT | MAXDatum,SUMTagessaldo,SUMUrlaub→SAL | Datum<=GETDATE | SAL | | 3521-D020 | ''BerechneteZeiten.Tagessaldo'' | SELECT | MAXDatum,SUMTagessaldo,SUMUrlaub→SAL | Datum<=GETDATE | SAL | | 3521-D021 | ''BerechneteZeiten.Urlaub'' | SELECT | MAXDatum,SUMTagessaldo,SUMUrlaub→SAL | Datum<=GETDATE | SAL | | 3521-D022 | ''Personen.PersonID'' | SELECT | Planungsfreigabe, globalerFallback | keineAktiv-/WebZerf2-Bedingung | PLAN | | 3521-D023 | ''Personen.WebZerf_info_planung'' | SELECT | Planungsfreigabe, globalerFallback | keineAktiv-/WebZerf2-Bedingung | PLAN | | 3521-D024 | ''Pep2.Name'' | SELECT | Personenzeitraum/Tagesspanne/GanzTagstatus | Planungszeitraum | PLAN | | 3521-D025 | ''Pep2.Datum'' | SELECT | Personenzeitraum/Tagesspanne/GanzTagstatus | Planungszeitraum | PLAN | | 3521-D026 | ''Pep2.Kommen'' | SELECT | Personenzeitraum/Tagesspanne/GanzTagstatus | Planungszeitraum | PLAN | | 3521-D027 | ''Pep2.Gehen'' | SELECT | Personenzeitraum/Tagesspanne/GanzTagstatus | Planungszeitraum | PLAN | | 3521-D028 | ''Pep2.Status'' | SELECT | Personenzeitraum/Tagesspanne/GanzTagstatus | Planungszeitraum | PLAN | | 3521-D029 | ''Tage.Datum'' | SELECT | Kalendertage auch ohne Planzeile | Planungszeitraum | PLAN | | 3521-D030 | ''Kennzeichen.Kennzeichen'' | SELECT | Einzelner Ganztagstatus statt Zeitspanne | Pep2.Status match,GanzTag1 | PLAN | | 3521-D031 | ''Kennzeichen.GanzTag'' | SELECT | Einzelner Ganztagstatus statt Zeitspanne | Pep2.Status match,GanzTag1 | PLAN | | 3521-D032 | ''Kennzeichen.Bezeichnung'' | SELECT | Einzelner Ganztagstatus statt Zeitspanne | Pep2.Status match,GanzTag1 | PLAN | | 3521-D033 | ''EinstellungenZw.Einstellung'' | SELECT | GetEinstellungZw('Webzerf_PlanungListen') | Planungsfallback | PLAN,ES | | 3521-D034 | ''EinstellungenZw.Wert'' | SELECT | GetEinstellungZw('Webzerf_PlanungListen') | Planungsfallback | PLAN,ES | | 3521-D035 | ''UmsatzVK.PersonID'' | SELECT | Istumsatz jePerson, Brutto/Netto | aktuell ganzerMonat plusVormonat | PROV | | 3521-D036 | ''UmsatzVK.Datum'' | SELECT | Istumsatz jePerson, Brutto/Netto | aktuell ganzerMonat plusVormonat | PROV | | 3521-D037 | ''UmsatzVK.VKWert'' | SELECT | Istumsatz jePerson, Brutto/Netto | aktuell ganzerMonat plusVormonat | PROV | | 3521-D038 | ''UmsatzVK.VKWertNetto'' | SELECT | Istumsatz jePerson, Brutto/Netto | aktuell ganzerMonat plusVormonat | PROV | | 3521-D039 | ''PepBerechnet.PersonID'' | SELECT | Zielumsatz/Sollzeit und Abzüge | Monats-/gültigeHistorien | PROV | | 3521-D040 | ''PepBerechnet.Datum'' | SELECT | Zielumsatz/Sollzeit und Abzüge | Monats-/gültigeHistorien | PROV | | 3521-D041 | ''PepBerechnet.Sollzeit'' | SELECT | Zielumsatz/Sollzeit und Abzüge | Monats-/gültigeHistorien | PROV | | 3521-D042 | ''PepBerechnet.GutschriftFeiertag'' | SELECT | Zielumsatz/Sollzeit und Abzüge | Monats-/gültigeHistorien | PROV | | 3521-D043 | ''PepBerechnet.GutschriftUrlaub'' | SELECT | Zielumsatz/Sollzeit und Abzüge | Monats-/gültigeHistorien | PROV | | 3521-D044 | ''PepBerechnet.Urlaub'' | SELECT | Zielumsatz/Sollzeit und Abzüge | Monats-/gültigeHistorien | PROV | | 3521-D045 | ''Pep2.Name'' | SELECT | 310SchuleZeit,311SchuleSoll,320BetriebsratZeit | person-/taggleich | PROV | | 3521-D046 | ''Pep2.Datum'' | SELECT | 310SchuleZeit,311SchuleSoll,320BetriebsratZeit | person-/taggleich | PROV | | 3521-D047 | ''Pep2.Status'' | SELECT | 310SchuleZeit,311SchuleSoll,320BetriebsratZeit | person-/taggleich | PROV | | 3521-D048 | ''Pep2.Kommen'' | SELECT | 310SchuleZeit,311SchuleSoll,320BetriebsratZeit | person-/taggleich | PROV | | 3521-D049 | ''Pep2.Gehen'' | SELECT | 310SchuleZeit,311SchuleSoll,320BetriebsratZeit | person-/taggleich | PROV | | 3521-D050 | ''ITProvision.PersonenStammID'' | SELECT | Provisionsart1/3 | gültigeHistorie | PROV | | 3521-D051 | ''ITProvision.von'' | SELECT | Provisionsart1/3 | gültigeHistorie | PROV | | 3521-D052 | ''ITProvision.bis2'' | SELECT | Provisionsart1/3 | gültigeHistorie | PROV | | 3521-D053 | ''ITProvision.Kennzeichen'' | SELECT | Provisionsart1/3 | gültigeHistorie | PROV | | 3521-D054 | ''ITORGA.PersonenStammID'' | SELECT | FallbackZielgruppe | gültigeHistorie | PROV | | 3521-D055 | ''ITORGA.von'' | SELECT | FallbackZielgruppe | gültigeHistorie | PROV | | 3521-D056 | ''ITORGA.bis2'' | SELECT | FallbackZielgruppe | gültigeHistorie | PROV | | 3521-D057 | ''ITORGA.Abteilung'' | SELECT | FallbackZielgruppe | gültigeHistorie | PROV | | 3521-D058 | ''ITProvisionBereiche.PersonID'' | SELECT | Gruppen-/Faktoroverride | gültigeHistorie | PROV | | 3521-D059 | ''ITProvisionBereiche.von'' | SELECT | Gruppen-/Faktoroverride | gültigeHistorie | PROV | | 3521-D060 | ''ITProvisionBereiche.bis2'' | SELECT | Gruppen-/Faktoroverride | gültigeHistorie | PROV | | 3521-D061 | ''ITProvisionBereiche.PepGruppe'' | SELECT | Gruppen-/Faktoroverride | gültigeHistorie | PROV | | 3521-D062 | ''ITProvisionBereiche.Faktor'' | SELECT | Gruppen-/Faktoroverride | gültigeHistorie | PROV | | 3521-D063 | ''ProdZiel.PepGruppenID'' | SELECT | Gruppenproduktivität fürZiel | gültigeHistorie | PROV | | 3521-D064 | ''ProdZiel.von'' | SELECT | Gruppenproduktivität fürZiel | gültigeHistorie | PROV | | 3521-D065 | ''ProdZiel.bis2'' | SELECT | Gruppenproduktivität fürZiel | gültigeHistorie | PROV | | 3521-D066 | ''ProdZiel.Produktivitaet'' | SELECT | Gruppenproduktivität fürZiel | gültigeHistorie | PROV | | 3521-D067 | ''Personen.PersonID'' | SELECT | Provisionsausgabe freigegeben | beide1,keinAktivfilter | PROV | | 3521-D068 | ''Personen.WebZerf_info_prov'' | SELECT | Provisionsausgabe freigegeben | beide1,keinAktivfilter | PROV | | 3521-D069 | ''Personen.WebZerf2'' | SELECT | Provisionsausgabe freigegeben | beide1,keinAktivfilter | PROV | ===== 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 BASE ===== Block17 ergänzt explizit5314/5315/5316/5317/5318/5319/5323/5324/5325/5326/5327/5328/6000/6006/6007/6008/6009. Alle nutzen BASE-Start/Ende;6001/6002/6003/6004/6005 verwenden LEGACY statt BASE. Fachverträge jeID, keine automatische gemeinsame Kunden-/Dateiwirkung. Stand: 2026-10-02 · Commit ''f1d82a003b62f2658f06eaa943dc685ab219bdf3''. Gilt ausdrücklich für Block 01: 1012, 1013, 1016, 1017, 1018, 1019, 1079, 1080, 1082, 2016 sowie Block 02: 2011, 2012, 2014, 2015, 2017, 2018, 2019, 2033, 2034, 2041 sowie Block 03: 1057, 1058, 1059, 1060, 2030, 2035, 2040, 2042, 2044 sowie Block 04: 2053, 2054, 1081, 2031, 2052 sowie Block 05: 2045, 2050 sowie Block 06: 3044, Block 08: 1010, 1011, 1015 und Block 10: 1047, 1051 sowie Block 12: 1064. 2024, 1020, 1030, 1048, 1049, 1050, 1052, 1053, 1054, 1061, 1062 und 1063 verwenden diese Basis nicht. 1078 enthält die gleichversionierten Beziehungen weiterhin in seiner Einzelbeschreibung; keine Doppelzählung für 1078. Kein Test-/Deploymentnachweis. Block 13 ergänzt ausdrücklich 1065,1066,1068,1069,1071,1072,1074: aktive Implementierungen bzw. Hilfsinstanzen erben BASE und rufen Start/Ende auf. Bei 1074 ist AusführungEnde nur bei unbehelligtem Abschluss erreichbar; Ressourcen-/DB-/SP-Fehler können es überspringen. 1067/1070/1073 verwenden direkte LEGACY-Meldungen. Block14 ergänzt ausdrücklich 1104,1105,1106,1108,1109,1150,1210,1214,1215,1222. Aktive Klassen/Instanzen erben BASE und starten/beenden den Lauf; ungefangene Fehler können das Ende überspringen. Nur gemeinsame Rückmeldung, keine Gesamttransaktion oder erfolgreiche Fachwirkung. 1203 hat keinen BASE-/LEGACY-Pfad. Block15 ergänzt ausdrücklich 2025/2026/2027/2049 mit erreichbarem Instanz-Start/Ende. Die aktiven Veraltet-Stubs 2028/2029/2032/2046/2047/2048 nutzen trotz Klassenvererbung nur den direkten LEGACY-Meldepfad; keine BASE-Ausführung. 2022 hat keinen Delegate. ==== Reichweite und Wiederverwendung ==== Block16 ergänzt ausdrücklich 2051/2055/3043/3512/3513/3520/3521/3522. WebZerf2 nutzt Multi-Start/Ende mit BASE je Teilstufe; IsMultiSchnitt reduziert Dialoge, nicht Mail-/API-Wirkungen. Nach Fehlern können weitere Teilstufen starten. 3011 ohne Delegate;3031/3032/3041/3042/3060/3500 nur LEGACY. Die ausdrücklich zugeordneten Programmregistrierungen mit ihren Implementierungen erben cSchnitt_Basis und rufen AusführungStart/AusführungEnde auf. Gemeinsam geprüfte Basisklasse/Registrierung; Mail-/Logging-/API-Details aus der dokumentierten Pilotprüfung desselben Commits wiederverwendet. Nicht automatisch auf jede zukünftige Schnittstelle übertragen: Erreichbarkeit, Overrides, Sonderpfade und Quellenstand jeweils prüfen. Start setzt Status/Protokoll zurück. Fehlerstatus steigt nur (0→1→2). Fehlerfrei() ist True nur bei Status 0. SILENT unterdrückt die Startanzeige und beendet AusführungEnde sofort. MANUELL wird über Schlüsselinzidenz erkannt, unterdrückt direkte Mail und API-sendmail, nicht die API-Meldung selbst. MAILTO leer → MAIL_SCHNITTSTELLETO. Bei nicht lokal gefangener Exception kann der Abschluss ausfallen (besonders 1079/1082); 2016 hat einen getrennten Rückgabe-/Fehlerstatusbefund; 2017 reicht ebenfalls den Instanzstatus nicht als Shared-Rückgabe durch. 1057–1060 besitzen untypisierte Shared-Einstiege ohne Return (Nothing) und übernehmen Modul nicht; Instanz-Abschluss separat betrachten. Die acht Exporte aus Block 02/03 verwenden cSchnittExport mit Start/Ende. Erfolg: OnSuccess; Fehlerstatus 1: OnSuccess ODER OnError; Stoppstatus 2: OnError. Mail nur nicht MANUELL und nicht SILENT; API wird sonst unabhängig vom sendmail-Schalter aufgerufen. Direkte Mail speichert Body/Outbox in eigener Transaktion (keine Fachimporttransaktion). SendOutbox(5) kann ältere fällige Schnittstellenmails versenden und deren Anhänge lesen; diese Fachpfade erzeugen selbst keine Anhänge. SMTP-Testadresse kann Zieladresse ersetzen. Mail-/API-Ergebnis ist kein verlässlicher Bestandteil von Fehlerfrei(). ==== Einstellungen ==== ^ Beziehung ^ Schlüssel / Variable ^ Default ^ Einfluss ^ Wirkung ^ Beleg ^ | BASE-S001 | ''MAIL_SCHNITTSTELLEONSUCCESS'' / ''MAIL_SchnittstelleOnSuccess'' | False | Basis | Direkte Mail bei Result 0 oder1, nicht MANUELL/SILENT | BASE:BASE, BASE:SET | | BASE-S002 | ''MAIL_SCHNITTSTELLEONERROR'' / ''MAIL_SchnittstelleOnError'' | False | Basis | Direkte Mail bei Result 1 oder2, nicht MANUELL/SILENT | BASE:BASE, BASE:SET | | BASE-S003 | ''SCHNITT_MELDUNG_SchnittstelleOnSuccess'' / ''SCHNITT_MELDUNG_SchnittstelleOnSuccess'' | False | Basis/API | sendmail=1 bei Result 0 oder1, nicht MANUELL/SILENT; API-Meldung sonst weiterhin sendmail=0 | BASE:BASE, BASE:SET | | BASE-S004 | ''SCHNITT_MELDUNG_SchnittstelleOnError'' / ''SCHNITT_MELDUNG_SchnittstelleOnError'' | True | Basis/API | sendmail=1 bei Result 1 oder2, nicht MANUELL/SILENT | BASE:BASE, BASE:SET | | BASE-S005 | ''MAIL_SCHNITTSTELLETO'' / ''MAIL_SchnittstelleTo'' | leer | Mail | Ersatz bei leerem MAILTO; Semikolonliste | BASE:MAIL, BASE:SET | | BASE-S006 | ''MAIL_SMTP_SERVER'' / ''MAIL_SMTPServer'' | leer | SMTP | Server für direkten Versand | BASE:MAIL, BASE:SET | | BASE-S007 | ''MAIL_USER'' / ''MAIL_User'' | leer | SMTP | Nichtleer setzt NetworkCredential und überschreibt Defaultcredentials | BASE:MAIL, BASE:SET | | BASE-S008 | ''MAIL_PASS'' / ''MAIL_Pass'' | leer; verschlüsselte Einstellung | SMTP | Passwort für explizite Credentials; kein Geheimnis dokumentiert | BASE:MAIL, BASE:SET | | BASE-S009 | ''MAIL_USEDEFAULTCREDENTIALS'' / ''MAIL_UseDefaultCredentials'' | False | SMTP | SmtpClient.UseDefaultCredentials; ggf. durch MAIL_USER überschrieben | BASE:MAIL, BASE:SET | | BASE-S010 | ''MAIL_SSL'' / ''MAIL_SSL'' | True | SMTP | SmtpClient.EnableSsl | BASE:MAIL, BASE:SET | | BASE-S011 | ''MAIL_TESTADRESSE'' / ''MAIL_TestAdresse'' | nichtleere Testadresse im Quellcode (Wert bewusst nicht kopiert) | SMTP | Nichtleer ersetzt tatsächlichen To-Empfänger, auch wenn MAILTO gesetzt | BASE:MAIL, BASE:SET | | BASE-S012 | ''MAIL_FROM'' / ''MAIL_From'' | leer | SMTP | Absenderadresse | BASE:MAIL, BASE:SET | | BASE-S013 | ''MAIL_FROM_NAME'' / ''MAIL_FromName'' | leer | SMTP | Absendername | BASE:MAIL, BASE:SET | | BASE-S014 | ''GLOBAL_LOGLEVEL'' / ''GLOBAL_LOGLEVEL'' | 50 | Logging | Persistenz bei InfoLevel>=Schwelle; Start/Erfolg51, ImportError102 | BASE:INIT, BASE:LOG, BASE:SET | | BASE-S015 | ''GLOBAL_LOGLEVELEVLOG'' / ''GLOBAL_LOGLEVELEVENTLOG'' | 0 | Logging | Eventlog bei Level>Schwelle, Schwelle>0 und Level<200 | BASE:INIT, BASE:LOG, BASE:SET | ==== Datenbeziehungen ==== DB-Rolle Anmeldung; Logging über cInfoTools-Verbindung. Keine Geheimnisse/Livewerte. Indizes verknüpfen jede Mitglieds-ID mit diesen Beziehungen, auch wenn die Details nur einmal stehen. ^ Beziehung ^ Tabelle.Feld ^ Operation ^ Datenfluss / Verwendung ^ Bedingung ^ Beleg ^ | BASE-D001 | ''Dokumente.oFilename'' | INSERT | MAIL_BODY | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D002 | ''Dokumente.oFilesize'' | INSERT | Byteanzahl Body | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D003 | ''Dokumente.Daten'' | INSERT | cFn.StringToByteArray(MailBody) | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D004 | ''Dokumente.UserID'' | INSERT | dbo.fnUserId() | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D005 | ''Dokumente.ts'' | INSERT | getdate() | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D006 | ''Outbox.mTo'' | INSERT | MAILTO oder MAIL_SCHNITTSTELLETO; je Semikolonadresse | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D007 | ''Outbox.mCc'' | INSERT | leer | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D008 | ''Outbox.mFrom'' | INSERT | leer | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D009 | ''Outbox.mSubject'' | INSERT | Statusabhängiger Betreff | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D010 | ''Outbox.mBodyID'' | INSERT | ID des gespeicherten Bodys | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D011 | ''Outbox.mBodyHtml'' | INSERT | False | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D012 | ''Outbox.mDelayUntil'' | INSERT | getdate() | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D013 | ''Outbox.mStatus'' | INSERT | 1 | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D014 | ''Outbox.mSize'' | INSERT | Bodyzeichenanzahl (ohne Anhänge) | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D015 | ''Outbox.refArt'' | INSERT | 0 | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D016 | ''Outbox.RefID'' | INSERT | 0 | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D017 | ''Outbox.MailArt'' | INSERT | 5 (SchnittstellenMeldung) | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D018 | ''Outbox.UserID'' | INSERT | fnUserId() | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D019 | ''Outbox.ts'' | INSERT | getdate() | Direkte Rückmeldung aktiviert | BASE:MAIL | | BASE-D020 | ''Outbox.ID'' | SELECT | SendOutbox(5): fällige Mails; auch frühere Outbox-Einträge derselben MailArt | Versandpfad | BASE:MAIL | | BASE-D021 | ''Outbox.mFrom'' | SELECT | SendOutbox(5): fällige Mails; auch frühere Outbox-Einträge derselben MailArt | Versandpfad | BASE:MAIL | | BASE-D022 | ''Outbox.mTo'' | SELECT | SendOutbox(5): fällige Mails; auch frühere Outbox-Einträge derselben MailArt | Versandpfad | BASE:MAIL | | BASE-D023 | ''Outbox.mCc'' | SELECT | SendOutbox(5): fällige Mails; auch frühere Outbox-Einträge derselben MailArt | Versandpfad | BASE:MAIL | | BASE-D024 | ''Outbox.mBodyID'' | SELECT | SendOutbox(5): fällige Mails; auch frühere Outbox-Einträge derselben MailArt | Versandpfad | BASE:MAIL | | BASE-D025 | ''Outbox.mSubject'' | SELECT | SendOutbox(5): fällige Mails; auch frühere Outbox-Einträge derselben MailArt | Versandpfad | BASE:MAIL | | BASE-D026 | ''Outbox.mBodyHtml'' | SELECT | SendOutbox(5): fällige Mails; auch frühere Outbox-Einträge derselben MailArt | Versandpfad | BASE:MAIL | | BASE-D027 | ''Outbox.mStatus'' | SELECT | SendOutbox(5): fällige Mails; auch frühere Outbox-Einträge derselben MailArt | Versandpfad | BASE:MAIL | | BASE-D028 | ''Outbox.mDelayUntil'' | SELECT | SendOutbox(5): fällige Mails; auch frühere Outbox-Einträge derselben MailArt | Versandpfad | BASE:MAIL | | BASE-D029 | ''Outbox.MailArt'' | SELECT | SendOutbox(5): fällige Mails; auch frühere Outbox-Einträge derselben MailArt | Versandpfad | BASE:MAIL | | BASE-D030 | ''Outbox.mSent'' | UPDATE | Erfolg → getdate() | Versandpfad | BASE:MAIL | | BASE-D031 | ''Outbox.mStatus'' | UPDATE | Erfolg → 0; Fehler → +1, bei Status 20 pauschal -1 ohne WHERE | Versandpfad | BASE:MAIL | | BASE-D032 | ''Outbox.mDelayUntil'' | UPDATE | Fehler → Staffel 2/5/10/30 Minuten; ab Status 12 CASE ohne ELSE → NULL | Versandpfad | BASE:MAIL | | BASE-D033 | ''Dokumente.ID'' | SELECT | Body/Anhänge laden | Versandpfad | BASE:MAIL, BASE:DOC | | BASE-D034 | ''Dokumente.oFilename'' | SELECT | Body/Anhänge laden | Versandpfad | BASE:MAIL, BASE:DOC | | BASE-D035 | ''Dokumente.Daten'' | SELECT | Body/Anhänge laden | Versandpfad | BASE:MAIL, BASE:DOC | | BASE-D036 | ''OutboxAttachment.OutBoxID'' | SELECT | Anhangszuordnung; diese Basisaufrufe erstellt selbst keine Anhänge | SendOutbox kann ältere Mailart-5-Einträge versenden | BASE:MAIL | | BASE-D037 | ''OutboxAttachment.DokumenteID'' | SELECT | Anhangszuordnung; diese Basisaufrufe erstellt selbst keine Anhänge | SendOutbox kann ältere Mailart-5-Einträge versenden | BASE:MAIL | | BASE-D038 | ''Pep3Log.UserID'' | INSERT | fnUserId() | InfoLevel >= GLOBAL_LOGLEVEL, DB-Logging möglich | BASE:LOG | | BASE-D039 | ''Pep3Log.Datum'' | INSERT | getdate() | InfoLevel >= GLOBAL_LOGLEVEL, DB-Logging möglich | BASE:LOG | | BASE-D040 | ''Pep3Log.Kurz'' | INSERT | Kurztext max255 | InfoLevel >= GLOBAL_LOGLEVEL, DB-Logging möglich | BASE:LOG | | BASE-D041 | ''Pep3Log.LogText'' | INSERT | Protokoll | InfoLevel >= GLOBAL_LOGLEVEL, DB-Logging möglich | BASE:LOG | | BASE-D042 | ''Pep3Log.Modul'' | INSERT | Modulname max50 | InfoLevel >= GLOBAL_LOGLEVEL, DB-Logging möglich | BASE:LOG | | BASE-D043 | ''Pep3Log.InfoLevel'' | INSERT | Start/Erfolg=51; Importfehler=102; weitere Mail-Meldungen | InfoLevel >= GLOBAL_LOGLEVEL, DB-Logging möglich | BASE:LOG | | BASE-D044 | ''tblUser.Name'' | SELECT | fnUserId: min(UserID) WHERE Name=RIGHT(SUSER_NAME(),25), sonst 0 | Mail-/Logpersistenz | BASE:USER | | BASE-D045 | ''tblUser.UserID'' | SELECT | fnUserId: min(UserID) WHERE Name=RIGHT(SUSER_NAME(),25), sonst 0 | Mail-/Logpersistenz | BASE:USER | ==== Weitere Ausgänge und Grenzen ==== Logdateien unter ApplicationData/PEP/LogFiles; kontextabhängig Windows-Eventlog. Start/Erfolg InfoLevel 51, Importfehler 102; Schwellen beeinflussen Persistenz. SQL-fnUserId liest tblUser anhand RIGHT(SUSER_NAME(),25). API Send(MELDUNG) nutzt Anmeldungskontext und fest codierten Endpoint; dessen Serverimplementierung fehlt in dieser Quellenbasis (Q01). Bekannte gemeinsame Befunde aus Pilot: Outbox-Retry bei Status 20 setzt mStatus=-1 ohne WHERE; Retry-CASE ab Status 12 ohne ELSE → NULL. Nicht korrigiert. Keine Kundendaten oder Zugangswerte übertragen. ===== 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 | [[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/Schnittstellen/cSchnittWebZerf2.vb|PEP4/cSchnittstellen/Programme/Schnittstellen/cSchnittWebZerf2.vb]] | | SAL | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Functions/webzerf_saldo.sql|Sqlfiles/PEP4Functions/webzerf_saldo.sql]] | | PLAN | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Functions/webzerf_planung.sql|Sqlfiles/PEP4Functions/webzerf_planung.sql]] | | PROV | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Functions/webzerf_provision_01.sql|Sqlfiles/PEP4Functions/webzerf_provision_01.sql]] | | ES | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Functions/GetEinstellungZw.sql|Sqlfiles/PEP4Functions/GetEinstellungZw.sql]] | | SET, BASE:SET | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/ZW/Einstellungen/cEinstellungenZw.vb|PEP4/ZW/Einstellungen/cEinstellungenZw.vb]] | | BASE:BASE | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/cSchnittstellen/Programme/Schnittstellen/cSchnitt_Basis.vb|PEP4/cSchnittstellen/Programme/Schnittstellen/cSchnitt_Basis.vb]] | | BASE:MAIL | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/cKommunikation/cMail.vb|PEP4/cKommunikation/cMail.vb]] | | BASE:API | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/cSchnittstellen/cApiCall.vb|PEP4/cSchnittstellen/cApiCall.vb]] | | BASE:LOG | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/cTools/cInfoTools.vb|PEP4/cTools/cInfoTools.vb]] | | BASE:INIT | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/ZW/Einstellungen/cSetting.vb|PEP4/ZW/Einstellungen/cSetting.vb]] | | BASE:USER | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/Sqlfiles/PEP4Functions/fnUserId.sql|Sqlfiles/PEP4Functions/fnUserId.sql]] | | BASE:DOC | [[https://github.com/seegerstefan/pep4desktop/blob/f1d82a003b62f2658f06eaa943dc685ab219bdf3/PEP4/cHilfsprogramme/cDocument.vb|PEP4/cHilfsprogramme/cDocument.vb]] | Siehe auch: [[schnittstellen:schnittstellen|Übersicht der Schnittstellen]]. Keine Ausführung oder Codekorrektur.