Erweitere VoTiAn NG um Fachfunktionen und verbessere die Listenoberfläche

Ergänze Auftragsbearbeitung, Disposition, Stammdaten, Kunden- und
Transporteurportale, Lagerverwaltung, Abrechnung, Exporte und Statistik.
Füge Kontoeinstellungen, Mitteilungen, Automatikdienste und Betriebsstatus
sowie die zugehörigen Tests und PHP-Abgleichsdokumentation hinzu.

Vergrößere die persönlichen Auftragslisten auf einheitliche Höhen und
richte Statusanzeigen sowie die Ranking-Vorschau-Steuerelemente bündig aus.

Validierung: 44 Frontendtests und Produktionsbuild erfolgreich.
Backend funktional unverändert gegenüber dem vollständigen Lauf mit 1.624
erfolgreichen und drei übersprungenen Tests. Layout im Browser und lokale
Bereitstellung geprüft.
This commit is contained in:
Sven committed 2026-10-20 11:19:43 +02:00
1 parent 363bc27c26
commit 781a2b82dc
1165 files changed
+74986 -1028

No files matched your search

@@ -0,0 +1,8 @@
import test from 'node:test';import assert from 'node:assert/strict';
import {timelineWindow,visibleTimelineSegment,timelineGrabOffset,timelineDropSlot,timelineHourTicks} from '../src/dispositionTimelineRange.mjs';
const range={startHour:8,endHourExclusive:19,configured:true,warning:''},display=timelineWindow(range);
test('configured hours and full-day switch share the unchanged24hour domain',()=>{assert.deepEqual(display,{start:8,end:19,hours:11});assert.deepEqual(timelineWindow(range,true),{start:0,end:24,hours:24});assert.deepEqual(timelineWindow({startHour:20,endHourExclusive:8}),timelineWindow());});
test('segments crossing the visible boundaries are clipped without changing their original bounds',()=>{const job={start:6*6,end:10*6};const clip=visibleTimelineSegment(job,display,6);assert.equal(clip.start,48);assert.equal(clip.end,60);assert.equal(clip.left,0);assert.equal(clip.width,100*2/11);assert.deepEqual(job,{start:36,end:60});assert.equal(visibleTimelineSegment({start:0,end:48},display,6),null);assert.equal(visibleTimelineSegment({start:114,end:120},display,6),null);});
test('grab offset includes the hidden beginning of a clipped job',()=>{const job={start:36,end:60};assert.equal(timelineGrabOffset(job,display,6,0),12);assert.equal(timelineGrabOffset(job,display,6,.5),18);assert.equal(timelineDropSlot(display,6,3/11,18),48);});
test('drop time follows displayed hours and remains bounded by actual day',()=>{assert.equal(timelineDropSlot(display,6,1/11,0),54);assert.equal(timelineDropSlot(display,6,1,0),114);assert.equal(timelineDropSlot(display,6,0,100),0);assert.equal(timelineDropSlot(timelineWindow(),6,1,0),143);});
test('hour labels include both display boundaries without a distorted last interval',()=>{assert.deepEqual(timelineHourTicks(display),[8,10,12,14,16,18,19]);assert.deepEqual(timelineHourTicks({start:23,end:24,hours:1}),[23,24]);});