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:
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 {statisticsMetric,statisticsChartData,statisticsChartProblem,normalizedChartData} from '../src/statisticsChartData.mjs';
|
||||
const result={splits:['CUSTOMER'],periods:[{interval:{from:'2028-01-01',to:'2028-12-31'},rows:[{period:'2028-01',split0:'A',orders:2,revenue:100,courierRevenue:50},{period:'2028-02',split0:'A',orders:1,revenue:300,courierRevenue:240},{period:'2028-02',split0:'B',orders:1,revenue:-20,courierRevenue:null}]},{interval:{from:'2027-01-01',to:'2027-12-31'},rows:[{period:'2027-01',split0:'B',orders:3,revenue:60,courierRevenue:30}]}]};
|
||||
test('comparison aligns exact groups across independent intervals and includes absent groups as zero',()=>{const data=statisticsChartData(result,'revenue','comparison',{CUSTOMER:'Kunde'});assert.deepEqual(data.series,[{name:'Kunde: A',values:[400,0]},{name:'Kunde: B',values:[-20,60]}]);assert.equal(data.categories.length,2);});
|
||||
test('percentage is recalculated from totals, never summed; unknown remuneration stays unknown',()=>{const data=statisticsChartData(result,'ratio','comparison',{});assert.ok(Math.abs(data.series[0].values[0]-27.5)<1e-9);assert.equal(data.series[1].values[0],null);assert.equal(statisticsMetric({revenue:0,courierRevenue:0},'ratio'),null);});
|
||||
test('single-period rows retain dates, groups and negative values',()=>{const data=statisticsChartData(result,'revenue','0',{CUSTOMER:'Kunde'});assert.deepEqual(data.series[0].values,[100,300,-20]);assert.equal(data.categories[0],'2028-01 · Kunde: A');assert.match(statisticsChartProblem(data,'PIE'),/nichtnegative/);assert.equal(statisticsChartProblem(data,'BAR'),'');});
|
||||
test('normalized values retain zero totals; missing and excessive datasets are explicit',()=>{const data={categories:['A','B'],series:[{name:'X',values:[3,0]},{name:'Y',values:[1,0]}]};assert.deepEqual(normalizedChartData(data).series.map(s=>s.values),[[75,0],[25,0]]);assert.match(statisticsChartProblem({...data,series:[{name:'X',values:[null,1]}]},'NORMALIZED'),/vollständige/);assert.match(statisticsChartProblem({...data,categories:Array(121).fill('A')},'BAR'),/eingrenzen/);});
|
||||
test('surcharge margin uses surcharge values and propagates unknown remuneration across periods',()=>{const data={splits:['CUSTOMER'],periods:[{interval:{from:'2028-01-01',to:'2028-12-31'},rows:[{period:'01',split0:'A',fuelMarkup:20,courierFuelMarkup:15,revenue:999},{period:'02',split0:'A',fuelMarkup:30,courierFuelMarkup:40}]},{interval:{from:'2027-01-01',to:'2027-12-31'},rows:[{period:'01',split0:'A',fuelMarkup:10,courierFuelMarkup:null}]}]};assert.deepEqual(statisticsChartData(data,'fuelMargin','comparison').series[0].values,[-5,null]);assert.equal(statisticsMetric({fuelMarkup:0,courierFuelMarkup:0},'fuelMargin'),0);});
|
||||
Reference in new issue
Block a user