lsa-planer
LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.
/ tests domain baustellenHinweis.test.ts
| 1 | import { describe, expect, it } from 'vitest'; |
| 2 | import { loadProject } from '@/domain/model/migrate'; |
| 3 | |
| 4 | /* |
| 5 | * Befunde 25 und 48, behoben in Fassung 5.10.0. |
| 6 | * |
| 7 | * Die Uebernahme meldete: "Angaben zur Baustellenampel (Mietkosten, |
| 8 | * Bauzeitplan) wurden in die Projektbeschreibung übernommen." Die Beschreibung |
| 9 | * entsteht aber ausschliesslich aus `bemerkungen`, `besonderheiten`, |
| 10 | * `anordnungsgrund` und `anordnungsnummer`; Mietkosten, Bauzeitplan und |
| 11 | * Baustellenzeitraum stehen danach nirgends. Der Bearbeiter hatte schwarz auf |
| 12 | * weiss, die Angaben seien da - und trug sie deshalb nicht nach, waehrend die |
| 13 | * Altdatei nach dem Speichern in aller Regel nicht mehr im Zugriff ist. |
| 14 | * |
| 15 | * Dazu kam die Ausloesung: `truthy` kennt nur true/'true'/1, im Altformat steht |
| 16 | * unter `baustellenVon` aber ein Datumstext - der Zweig lief ins Leere. Ein |
| 17 | * Altprojekt mit blossem Bauzeitplan verlor die Angabe ganz ohne Meldung. |
| 18 | */ |
| 19 | const DATUM = new Date('2026-09-05T08:00:00Z'); |
| 20 | |
| 21 | function altprojekt(projektdaten: Record<string, unknown>): Record<string, unknown> { |
| 22 | return { |
| 23 | metadata: { version: '4.3.3' }, |
| 24 | projektdaten: { projektBezeichnung: 'Übernahme', ...projektdaten }, |
| 25 | signalgruppen: [{ id: 'SG-1', nummer: 'K1', typ: 'kfz', richtung: 'geradeaus' }], |
| 26 | }; |
| 27 | } |
| 28 | |
| 29 | function baustellenhinweis(projektdaten: Record<string, unknown>) { |
| 30 | const { project, issues } = loadProject(altprojekt(projektdaten), DATUM); |
| 31 | return { |
| 32 | beschreibung: project.meta.description, |
| 33 | hinweis: issues.find((i) => i.path === 'projektdaten'), |
| 34 | }; |
| 35 | } |
| 36 | |
| 37 | /** Die sechs Vorbelegungen, die 4.3.3 in jedes Projekt schreibt. */ |
| 38 | const MIETKOSTEN_VORBELEGUNG = { |
| 39 | lsaGeraet: 150, |
| 40 | aufbau: 800, |
| 41 | abbau: 600, |
| 42 | wartung: 120, |
| 43 | transport: 300, |
| 44 | beschilderung: 500, |
| 45 | }; |
| 46 | |
| 47 | describe('Befunde 25 und 48: Baustellenangaben bei der Uebernahme', () => { |
| 48 | it('sagt, dass die Angaben nicht übernommen werden, und nennt sie nicht als übernommen', () => { |
| 49 | const { beschreibung, hinweis } = baustellenhinweis({ |
| 50 | mietkosten: MIETKOSTEN_VORBELEGUNG, |
| 51 | bauzeitplan: 'Zwei Bauabschnitte', |
| 52 | baustellenVon: '2026-03-01', |
| 53 | baustellenVerantwortlicher: 'Fa. Muster', |
| 54 | bemerkungen: 'Meine Bemerkung', |
| 55 | }); |
| 56 | |
| 57 | expect(hinweis).toBeDefined(); |
| 58 | expect(hinweis!.message).toContain('nicht übernommen'); |
| 59 | expect(hinweis!.message).not.toContain('in die Projektbeschreibung übernommen'); |
| 60 | // Der Bearbeiter braucht den einen Satz, der ihn handeln laesst. |
| 61 | expect(hinweis!.message).toContain('Altdatei'); |
| 62 | |
| 63 | // Und die Beschreibung ist genau das, was sie war: die Bemerkung. |
| 64 | expect(beschreibung).toBe('Meine Bemerkung'); |
| 65 | }); |
| 66 | |
| 67 | it('meldet auch ein Altprojekt mit blossem Bauzeitplan', () => { |
| 68 | const { hinweis } = baustellenhinweis({ bauzeitplan: 'Zwei Bauabschnitte' }); |
| 69 | expect(hinweis).toBeDefined(); |
| 70 | }); |
| 71 | |
| 72 | it('meldet den Baustellenzeitraum, der im Altformat als Datumstext steht', () => { |
| 73 | expect(baustellenhinweis({ baustellenVon: '2026-03-01' }).hinweis).toBeDefined(); |
| 74 | expect(baustellenhinweis({ baustellenBis: '2026-05-31' }).hinweis).toBeDefined(); |
| 75 | }); |
| 76 | |
| 77 | it('schweigt, wenn das Altprojekt keine Baustellenangaben führt', () => { |
| 78 | expect(baustellenhinweis({ bemerkungen: 'Nur eine Bemerkung' }).hinweis).toBeUndefined(); |
| 79 | expect(baustellenhinweis({ mietkosten: {}, baustellenVon: '' }).hinweis).toBeUndefined(); |
| 80 | }); |
| 81 | }); |