Skip to content

Commit 11c7922

Browse files
committed
wip
1 parent 3d8248f commit 11c7922

File tree

2 files changed

+26
-80
lines changed

2 files changed

+26
-80
lines changed

src/lib/ui/SortableScrollableTable.svelte

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
</script>
3131

3232
<sortableScrollableTable>
33-
<div class="h-[50vh] min-w-[130vh] overflow-x-auto overflow-y-auto">
33+
<div class="h-[60vh] min-w-[130vh] overflow-x-auto overflow-y-auto">
3434
<Table.Root>
3535
<Table.Header>
3636
<Table.Row>

src/routes/admin/accounting/getCompanyCosts.ts

+25-79
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,6 @@ import { DAY, HOUR } from '$lib/util/time';
88
import type { UnixtimeMs } from '$lib/util/UnixtimeMs';
99

1010
export async function getCompanyCosts() {
11-
const iterateIntervalArrays = <T, U>(
12-
arr1: Interval[],
13-
arr2: T[],
14-
toInterval: (t: T) => Interval,
15-
onOverlap: (idx1: number, v2: T, maps: Map<VehicleId, U>[]) => void
16-
) => {
17-
const maps = new Array<Map<VehicleId, U>>(arr1.length);
18-
if (arr1.length === 0 || arr2.length === 0) {
19-
return maps;
20-
}
21-
let idx1 = 0;
22-
let idx2 = 0;
23-
let v1 = arr1[0];
24-
let v2 = arr2[0];
25-
let interval = toInterval(v2);
26-
maps[0] = new Map<VehicleId, U>();
27-
while (idx1 < arr1.length && idx2 < arr2.length) {
28-
if (v1.overlaps(interval)) {
29-
onOverlap(idx1, v2, maps);
30-
}
31-
if (v1.endTime < interval.endTime) {
32-
v1 = arr1[++idx1];
33-
if (idx1 < arr1.length) {
34-
maps[idx1] = new Map<VehicleId, U>();
35-
}
36-
} else {
37-
v2 = arr2[++idx2];
38-
if (idx2 < arr2.length) {
39-
interval = toInterval(v2);
40-
}
41-
}
42-
}
43-
return maps;
44-
};
45-
4611
const tours: (TourWithRequests & { interval: Interval })[] = (
4712
await getToursWithRequests(false)
4813
).map((t) => {
@@ -71,6 +36,7 @@ export async function getCompanyCosts() {
7136
.where('availability.endTime', '>=', earliestTime)
7237
.where('availability.startTime', '<=', today)
7338
.select(['availability.vehicle as vehicleId', 'availability.startTime', 'availability.endTime'])
39+
.orderBy('availability.endTime', 'asc')
7440
.execute();
7541

7642
// create an array of intervals representing the individual days in the two relevant years
@@ -89,53 +55,33 @@ export async function getCompanyCosts() {
8955
availabilitiesPerVehicle.forEach((availabilities, vehicle) =>
9056
availabilitiesPerVehicle.set(vehicle, Interval.merge(availabilities))
9157
);
92-
93-
// get list of all merged availabilities
94-
const allAvailabilities = Array.from(availabilitiesPerVehicle).flatMap(([vehicleId, intervals]) =>
95-
intervals.map((interval) => ({ vehicleId, interval }))
96-
);
97-
98-
allAvailabilities.sort((a1, a2) => a1.interval.startTime - a2.interval.startTime);
9958
// cumulate the total duration of availability on every relevant day for each vehicle
100-
const availabilitiesPerDayAndVehicle = iterateIntervalArrays(
101-
days,
102-
allAvailabilities,
103-
(a) => a.interval,
104-
(
105-
dayIdx: number,
106-
availability: {
107-
vehicleId: number;
108-
interval: Interval;
109-
},
110-
maps: Map<VehicleId, number>[]
111-
) =>
112-
maps[dayIdx].set(
113-
availability.vehicleId,
114-
(maps[dayIdx].get(availability.vehicleId) ?? 0) +
115-
(days[dayIdx].intersect(availability.interval)?.getDurationMs() ?? 0)
116-
)
117-
);
59+
const availabilitiesPerDayAndVehicle = new Array<Map<number, number>>(days.length);
60+
days.forEach((day, dayIdx) => {
61+
availabilitiesPerDayAndVehicle[dayIdx] = new Map<number, number>();
62+
availabilitiesPerVehicle.forEach((availabilities, vehicle) => availabilities.forEach((availability) => {
63+
if(day.overlaps(availability)){
64+
availabilitiesPerDayAndVehicle[dayIdx].set(vehicle, (availabilitiesPerDayAndVehicle[dayIdx].get(vehicle) ?? 0) + availability.getDurationMs());
65+
}
66+
}));
67+
});
11868

11969
// cumulate the total taxameter readings on every relevant day for each vehicle
120-
const taxameterPerDayAndVehicle = iterateIntervalArrays(
121-
days,
122-
tours,
123-
(t: TourWithRequests & { interval: Interval }) => t.interval,
124-
(
125-
idx1,
126-
v2,
127-
maps: Map<VehicleId, { taxameter: number; customerCount: number; timestamp: UnixtimeMs }>[]
128-
) => {
129-
maps[idx1].set(v2.vehicleId, {
130-
taxameter: (maps[idx1].get(v2.vehicleId)?.taxameter ?? 0) + (v2.fare ?? 0),
131-
customerCount:
132-
(maps[idx1].get(v2.vehicleId)?.customerCount ?? 0) +
133-
v2.requests.reduce((acc, current) => current.passengers + acc, 0),
134-
timestamp: v2.startTime
135-
});
136-
}
137-
);
138-
70+
const taxameterPerDayAndVehicle = new Array<Map<number, { taxameter: number; customerCount: number; timestamp: UnixtimeMs }>>(days.length);
71+
days.forEach((day, dayIdx) => {
72+
taxameterPerDayAndVehicle[dayIdx] = new Map<number, { taxameter: number; customerCount: number; timestamp: UnixtimeMs }>
73+
tours.forEach((tour) => {
74+
if(day.overlaps(tour.interval)) {
75+
taxameterPerDayAndVehicle[dayIdx].set(tour.vehicleId, {
76+
taxameter: (taxameterPerDayAndVehicle[dayIdx].get(tour.vehicleId)?.taxameter ?? 0) + (tour.fare ?? 0),
77+
customerCount:
78+
(taxameterPerDayAndVehicle[dayIdx].get(tour.vehicleId)?.customerCount ?? 0) +
79+
tour.requests.reduce((acc, current) => current.passengers + acc, 0),
80+
timestamp: tour.startTime
81+
})
82+
}
83+
})
84+
})
13985
const costPerDayAndVehicle = new Array<
14086
Map<
14187
VehicleId,

0 commit comments

Comments
 (0)