Terminplaner: Staff-Aktivierung nur mit Zustimmung in Textform (Modus on), WOMS
Im Dialog "Terminplaner ohne Zahlung aktivieren?" erscheinen, wenn das Portal termine.textformNoetig meldet, der Haken (Leistungsbeschreibung und AVV in der Fassung, Ausschluss Gesundheitsbereich), das Datum der Zustimmung und der Weg (Chat | E-Mail) sowie die Textvorlage fuer den Chat mit Kopierknopf (versionierte Adressen aus dem Portal). "Ja" bleibt gesperrt, bis alles stimmt (canSubmitTextform mit minDate = Fassung); der Rumpf traegt textformDate und textformChannel. News und Abschalten bleiben unveraendert. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
857e001911
commit
45e5dc30dc
4 files changed
+256
-9
No files matched your search
@@ -2,6 +2,7 @@
|
||||
// Einarbeiten der Portal-Antwort. Rein, unter Node testbar.
|
||||
|
||||
import { fmtYmd, fmtBerlin } from './format'
|
||||
import { canSubmitTextform } from './analyseView'
|
||||
|
||||
/** Funktionen in Anzeigereihenfolge; key = Schluessel im Portal (features[key], POST /funktionen/:customerId/:key). */
|
||||
export const FUNKTIONEN = [
|
||||
@@ -162,3 +163,63 @@ export function mergeFunktion(projects, projectId, key, aktualisiert) {
|
||||
if (!view) return projects
|
||||
return projects.map((p) => (p.projectId === projectId ? { ...p, features: { ...p.features, [key]: view } } : p))
|
||||
}
|
||||
|
||||
// --- Aktivieren (ohne Zahlung) mit Zustimmung in Textform (Modus on des Terminplaners; Portal: GET /funktionen/:customerId => termine) ---
|
||||
|
||||
/** true, wenn diese Aktion die Zustimmung in Textform braucht: nur "Aktivieren (ohne Zahlung)" des Terminplaners und nur, wenn das Portal es verlangt (termine.textformNoetig === true). */
|
||||
export const textformNoetig = (key, action, termine) => key === 'termine' && action === 'activate' && termine?.textformNoetig === true
|
||||
|
||||
/** Kaestchentext (wie im Portal-Nachweis, ohne Datum und Weg); die beiden Links setzt die Komponente. */
|
||||
export const termineTextformLabel = (version) => ({
|
||||
before: 'Der Kunde hat der ',
|
||||
lb: 'Leistungsbeschreibung Terminplaner',
|
||||
between: ' und dem ',
|
||||
avv: 'Auftragsverarbeitungsvertrag Terminplaner',
|
||||
after: ` (Fassung ${version}) in Textform zugestimmt und bestätigt, dass sein Angebot nicht im Gesundheitsbereich liegt.`,
|
||||
})
|
||||
|
||||
/** Textvorlage fuer den Chat (Kopierknopf); links = die versionierten Adressen aus dem Portal (termine.links). */
|
||||
export const termineChatTemplate = (version, links) =>
|
||||
`Damit wir den Terminplaner für Dich einschalten können, brauchen wir Deine Zustimmung in Textform. Es gelten die Leistungsbeschreibung Terminplaner und der Auftragsverarbeitungsvertrag Terminplaner in der Fassung ${version}: ${links.lb} · ${links.avv}. Bitte antworte hier mit „Ich stimme zu“ und bestätige, dass Dein Angebot nicht im Gesundheitsbereich liegt.`
|
||||
|
||||
/** Nur geprüfte https-Adressen werden Links; alles andere ''. */
|
||||
const httpsUrl = (wert) => {
|
||||
if (typeof wert !== 'string') return ''
|
||||
try {
|
||||
return new URL(wert).protocol === 'https:' ? wert : ''
|
||||
} catch {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Alles, was der Bestaetigungsdialog zeigt, aus dem Portal-Feld termine: { version, links { lb, avv } (nur https, sonst ''), label, vorlage }.
|
||||
* vorlage nur, wenn Fassung und beide Adressen da sind (eine Vorlage mit leeren Adressen geht nie an den Kunden), sonst ''.
|
||||
*/
|
||||
export function textformAnsicht(termine) {
|
||||
const version = typeof termine?.avvVersion === 'string' ? termine.avvVersion : ''
|
||||
const links = { lb: httpsUrl(termine?.links?.lb), avv: httpsUrl(termine?.links?.avv) }
|
||||
return {
|
||||
version,
|
||||
links,
|
||||
label: termineTextformLabel(version),
|
||||
vorlage: version && links.lb && links.avv ? termineChatTemplate(version, links) : '',
|
||||
}
|
||||
}
|
||||
|
||||
/** Alle drei Pflichtangaben (Haken, Datum zwischen Fassung und heute, Weg); ohne Fassung im Portal-Feld nie bereit. */
|
||||
export function textformBereit({ confirmed, date, channel, today }, termine) {
|
||||
const minDate = typeof termine?.avvVersion === 'string' ? termine.avvVersion : ''
|
||||
if (!minDate) return false
|
||||
return canSubmitTextform({ confirmed, date, channel, today, minDate })
|
||||
}
|
||||
|
||||
/** Rumpf fuer POST /funktionen/:customerId/:key; Datum und Weg der Textform nur beim Aktivieren und nur, wenn beide da sind. */
|
||||
export function featureBody({ projectId, action, note, textformDate, textformChannel }) {
|
||||
const body = { projectId, action, note }
|
||||
if (action === 'activate' && textformDate && textformChannel) {
|
||||
body.textformDate = textformDate
|
||||
body.textformChannel = textformChannel
|
||||
}
|
||||
return body
|
||||
}
|
||||
Reference in new issue
Block a user