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.
9 lines
2.7 KiB
JavaScript
9 lines
2.7 KiB
JavaScript
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);});
|