Terminplaner TP2: Fragebogen-Attribut, Branchen, Schritte, Normalisierung

termineConfig bekommt das Attribut fragebogen (Text 20000, Inhalt bis
FRAGEBOGEN_MAX 16000). fragebogen.js: SCHRITTE, BRANCHEN (Vorlagen plus
Gesundheitsbereich), leerFragebogen und normalisiereFragebogen.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-04 18:49:06 +00:00
1 parent 36b36bcc4d
commit ab47fabcb2
4 files changed
+416 -1

No files matched your search

+26 -1
View File
@@ -75,7 +75,7 @@ const expectedIndexes = NAMES.flatMap((name) => TERMINE_COLLECTIONS[name].indexe
test('Schema: Attribute je Collection wie in der Spezifikation', () => {
assert.deepEqual(Object.keys(TERMINE_COLLECTIONS), NAMES)
assert.deepEqual(keysOf('termineConfig'), ['customerId', 'projectId', 'einstellung', 'version', 'updatedAt', 'updatedBy'])
assert.deepEqual(keysOf('termineConfig'), ['customerId', 'projectId', 'einstellung', 'version', 'updatedAt', 'updatedBy', 'fragebogen'])
assert.deepEqual(keysOf('termineBookings'), [
'featureId', 'customerId', 'projectId', 'leistungId', 'leistungName', 'ressourceId', 'ressourceName',
'startsAt', 'endsAt', 'blockEndsAt', 'status', 'quelle',
@@ -101,6 +101,8 @@ test('Schema: Typen und Groessen', () => {
assert.equal(settings.updatedAt.type, 'datetime')
assert.equal(settings.updatedBy.size, 100)
assert.equal(settings.projectId.size, 64)
// TP2: Fragebogen als JSON-Text; der Inhalt ist auf 16000 Zeichen begrenzt (FRAGEBOGEN_MAX), die Spalte ist groesser
assert.deepEqual(settings.fragebogen, { key: 'fragebogen', type: 'string', size: 20000, required: false })
const bookings = byKey('termineBookings')
const sizes = {
@@ -313,6 +315,29 @@ test('main: legt idx_booking der Mail-Warteschlange an; eine vorhandene termineO
assert.deepEqual(client.calls.attrs.filter((k) => k.startsWith('termineOutbox.')), [])
})
test('main --check meldet in einer vorhandenen termineConfig ohne fragebogen genau dieses Attribut; der Lauf ohne --check legt es an, der zweite nichts', async () => {
const ohneFragebogen = keysOf('termineConfig').filter((key) => key !== 'fragebogen')
const vorhanden = () => fakeClient({ termineConfig: { attrs: ohneFragebogen } })
const lines = []
const pruefung = vorhanden()
const offen = await main({ check: true, client: pruefung, log: (line) => lines.push(line) })
assert.ok(lines.some((line) => line.includes('termineConfig.fragebogen FEHLT')), lines.join('\n'))
assert.deepEqual(offen.missing.filter((a) => a.collection === 'termineConfig').map((a) => a.key), ['fragebogen'])
assert.deepEqual(offen.missingCollections.includes('termineConfig'), false)
assert.deepEqual(pruefung.calls.attrs, [], '--check legt nichts an')
const client = vorhanden()
await main({ client, log: quiet })
assert.deepEqual(client.calls.attrs.filter((k) => k.startsWith('termineConfig.')), ['termineConfig.fragebogen'])
assert.deepEqual(client.state.get('termineConfig').attrs.get('fragebogen'), { key: 'fragebogen', type: 'string', size: 20000, required: false })
assert.ok(!client.calls.collections.some((c) => c.id === 'termineConfig'), 'vorhandene Collection wird nicht neu angelegt')
client.calls.attrs.length = 0
await main({ client, log: quiet })
assert.deepEqual(client.calls.attrs, [], 'der zweite Lauf legt nichts an')
})
test('main --check legt nichts an und meldet Fehlendes', async () => {
const client = fakeClient()
const lines = []