@fleetbase/fleetops-engine 0.6.48 → 0.6.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/addon/components/driver/details.hbs +5 -1
- package/addon/components/driver/form.hbs +11 -1
- package/addon/components/fleet-listing-panel.hbs +2 -2
- package/addon/components/fleet-listing-panel.js +10 -0
- package/addon/components/map/google-live-map.js +12 -73
- package/addon/components/map/leaflet-live-map.hbs +149 -33
- package/addon/components/orchestrator/phase-builder.hbs +21 -0
- package/addon/components/orchestrator/phase-builder.js +13 -0
- package/addon/components/orchestrator-workbench.js +1 -0
- package/addon/components/order/form.hbs +2 -2
- package/addon/components/widget/fleet-ops-key-metrics.hbs +19 -17
- package/addon/components/widget/fleet-ops-key-metrics.js +26 -0
- package/addon/components/widget/fuel-efficiency.hbs +26 -0
- package/addon/components/widget/fuel-efficiency.js +43 -0
- package/addon/components/widget/geofence-violations.hbs +44 -0
- package/addon/components/widget/geofence-violations.js +55 -0
- package/addon/components/widget/issues-insights.hbs +43 -0
- package/addon/components/widget/issues-insights.js +62 -0
- package/addon/components/widget/kpi-active-orders.hbs +10 -0
- package/addon/components/widget/kpi-active-orders.js +5 -0
- package/addon/components/widget/kpi-aov.hbs +10 -0
- package/addon/components/widget/kpi-aov.js +5 -0
- package/addon/components/widget/kpi-distance.hbs +10 -0
- package/addon/components/widget/kpi-distance.js +5 -0
- package/addon/components/widget/kpi-drivers-online.hbs +10 -0
- package/addon/components/widget/kpi-drivers-online.js +5 -0
- package/addon/components/widget/kpi-earnings.hbs +10 -0
- package/addon/components/widget/kpi-earnings.js +5 -0
- package/addon/components/widget/kpi-open-issues.hbs +11 -0
- package/addon/components/widget/kpi-open-issues.js +5 -0
- package/addon/components/widget/kpi-tile.hbs +59 -0
- package/addon/components/widget/kpi-tile.js +168 -0
- package/addon/components/widget/live-fleet.hbs +122 -0
- package/addon/components/widget/live-fleet.js +365 -0
- package/addon/components/widget/maintenance-overview.hbs +45 -0
- package/addon/components/widget/maintenance-overview.js +40 -0
- package/addon/components/widget/on-time-delivery.hbs +27 -0
- package/addon/components/widget/on-time-delivery.js +73 -0
- package/addon/components/widget/operations-pulse.hbs +51 -0
- package/addon/components/widget/operations-pulse.js +173 -0
- package/addon/components/widget/orders-by-status.hbs +26 -0
- package/addon/components/widget/orders-by-status.js +54 -0
- package/addon/components/widget/revenue-trend.hbs +34 -0
- package/addon/components/widget/revenue-trend.js +67 -0
- package/addon/components/widget/top-drivers.hbs +44 -0
- package/addon/components/widget/top-drivers.js +54 -0
- package/addon/controllers/settings/routing.js +26 -0
- package/addon/extension.js +172 -3
- package/addon/services/map-adapter/google.js +13 -2
- package/addon/styles/fleetops-engine.css +114 -87
- package/addon/templates/maintenance/equipment/index.hbs +1 -1
- package/addon/templates/maintenance/parts/index.hbs +1 -1
- package/addon/templates/maintenance/schedules/index.hbs +1 -1
- package/addon/templates/management/vehicles/index.hbs +1 -1
- package/addon/templates/settings/avatars.hbs +1 -1
- package/addon/templates/settings/custom-fields.hbs +1 -1
- package/addon/templates/settings/map.hbs +1 -1
- package/addon/templates/settings/navigator-app.hbs +1 -1
- package/addon/templates/settings/notifications.hbs +1 -1
- package/addon/templates/settings/orchestrator.hbs +1 -1
- package/addon/templates/settings/payments/index.hbs +1 -1
- package/addon/templates/settings/payments/onboard.hbs +1 -1
- package/addon/templates/settings/routing.hbs +22 -2
- package/addon/templates/settings/scheduling.hbs +1 -1
- package/addon/utils/live-map-card-content.js +171 -0
- package/app/components/widget/fuel-efficiency.js +1 -0
- package/app/components/widget/geofence-violations.js +1 -0
- package/app/components/widget/issues-insights.js +1 -0
- package/app/components/widget/kpi-active-orders.js +1 -0
- package/app/components/widget/kpi-aov.js +1 -0
- package/app/components/widget/kpi-distance.js +1 -0
- package/app/components/widget/kpi-drivers-online.js +1 -0
- package/app/components/widget/kpi-earnings.js +1 -0
- package/app/components/widget/kpi-open-issues.js +1 -0
- package/app/components/widget/kpi-tile.js +1 -0
- package/app/components/widget/live-fleet.js +1 -0
- package/app/components/widget/maintenance-overview.js +1 -0
- package/app/components/widget/on-time-delivery.js +1 -0
- package/app/components/widget/operations-pulse.js +1 -0
- package/app/components/widget/orders-by-status.js +1 -0
- package/app/components/widget/revenue-trend.js +1 -0
- package/app/components/widget/top-drivers.js +1 -0
- package/app/utils/live-map-card-content.js +1 -0
- package/composer.json +1 -1
- package/extension.json +1 -1
- package/package.json +3 -3
- package/pnpm-workspace.yaml +1 -0
- package/server/config/telematics.php +111 -1
- package/server/migrations/2026_05_18_000001_add_license_expiry_to_drivers_table.php +25 -0
- package/server/seeders/Testing/Concerns/SeedsTestingData.php +183 -0
- package/server/seeders/Testing/ConnectivitySeeder.php +212 -0
- package/server/seeders/Testing/FleetSeeder.php +341 -0
- package/server/seeders/Testing/MaintenanceSeeder.php +238 -0
- package/server/seeders/Testing/NetworkSeeder.php +250 -0
- package/server/seeders/Testing/OrdersSeeder.php +214 -0
- package/server/seeders/Testing/TestingSeeder.php +40 -0
- package/server/seeders/{VroomOrchestrationSeeder.php → Testing/VroomOrchestrationSeeder.php} +8 -1
- package/server/src/Console/Commands/ProcessOperationalAlerts.php +279 -0
- package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +119 -0
- package/server/src/Http/Controllers/Internal/v1/MetricsController.php +82 -3
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +12 -6
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +46 -1
- package/server/src/Http/Resources/v1/Driver.php +2 -0
- package/server/src/Http/Resources/v1/Fleet.php +4 -0
- package/server/src/Http/Resources/v1/Index/Driver.php +48 -0
- package/server/src/Http/Resources/v1/Index/Vehicle.php +74 -1
- package/server/src/Models/Driver.php +2 -0
- package/server/src/Models/OrderConfig.php +14 -11
- package/server/src/Notifications/LateDeparture.php +48 -0
- package/server/src/Notifications/ProlongedStoppage.php +48 -0
- package/server/src/Notifications/RouteDeviation.php +48 -0
- package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +28 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +5 -0
- package/server/src/Providers/NotificationServiceProvider.php +3 -0
- package/server/src/Support/Analytics/AbstractAnalytics.php +77 -0
- package/server/src/Support/Analytics/FuelEfficiency.php +83 -0
- package/server/src/Support/Analytics/GeofenceViolations.php +63 -0
- package/server/src/Support/Analytics/IssuesInsights.php +67 -0
- package/server/src/Support/Analytics/LiveFleet.php +127 -0
- package/server/src/Support/Analytics/MaintenanceOverview.php +70 -0
- package/server/src/Support/Analytics/OnTimeDelivery.php +75 -0
- package/server/src/Support/Analytics/OperationsPulse.php +86 -0
- package/server/src/Support/Analytics/OrdersByStatus.php +64 -0
- package/server/src/Support/Analytics/RevenueTrend.php +79 -0
- package/server/src/Support/Analytics/TopDrivers.php +92 -0
- package/server/src/Support/Metrics/AbstractMetric.php +170 -0
- package/server/src/Support/Metrics/ActiveLiveOrdersMetric.php +28 -0
- package/server/src/Support/Metrics/AvgOrderValueMetric.php +53 -0
- package/server/src/Support/Metrics/DriversOnlineMetric.php +30 -0
- package/server/src/Support/Metrics/EarningsMetric.php +30 -0
- package/server/src/Support/Metrics/FuelCostsMetric.php +30 -0
- package/server/src/Support/Metrics/MoneyMetric.php +30 -0
- package/server/src/Support/Metrics/OpenIssuesMetric.php +35 -0
- package/server/src/Support/Metrics/OrdersCanceledMetric.php +35 -0
- package/server/src/Support/Metrics/OrdersCompletedMetric.php +35 -0
- package/server/src/Support/Metrics/OrdersInProgressMetric.php +51 -0
- package/server/src/Support/Metrics/OrdersScheduledMetric.php +37 -0
- package/server/src/Support/Metrics/Registry.php +46 -0
- package/server/src/Support/Metrics/ResolvedIssuesMetric.php +35 -0
- package/server/src/Support/Metrics/TotalCustomersMetric.php +29 -0
- package/server/src/Support/Metrics/TotalDistanceTraveledMetric.php +35 -0
- package/server/src/Support/Metrics/TotalDriversMetric.php +28 -0
- package/server/src/Support/Metrics/TotalTimeTraveledMetric.php +35 -0
- package/server/src/Support/Metrics.php +46 -249
- package/server/src/Support/Telematics/Providers/AfaqyProvider.php +290 -0
- package/server/src/Support/Telematics/Providers/SafeeProvider.php +333 -0
- package/server/src/routes.php +16 -0
- package/server/tests/AnalyticsRoutesTest.php +41 -0
- package/server/tests/MetricsRegistryTest.php +88 -0
- package/server/tests/VroomOrchestrationEngineTest.php +91 -0
- package/translations/en-us.yaml +37 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
test('analytics routes are registered alongside metrics routes', function () {
|
|
4
|
+
$routes = file_get_contents(dirname(__DIR__) . '/src/routes.php');
|
|
5
|
+
|
|
6
|
+
expect($routes)->toContain("['prefix' => 'analytics']");
|
|
7
|
+
expect($routes)->toContain("'AnalyticsController@operationsPulse'");
|
|
8
|
+
expect($routes)->toContain("'AnalyticsController@revenueTrend'");
|
|
9
|
+
expect($routes)->toContain("'AnalyticsController@ordersByStatus'");
|
|
10
|
+
expect($routes)->toContain("'AnalyticsController@onTimeDelivery'");
|
|
11
|
+
expect($routes)->toContain("'AnalyticsController@topDrivers'");
|
|
12
|
+
expect($routes)->toContain("'AnalyticsController@fuelEfficiency'");
|
|
13
|
+
expect($routes)->toContain("'AnalyticsController@issuesInsights'");
|
|
14
|
+
expect($routes)->toContain("'AnalyticsController@maintenanceOverview'");
|
|
15
|
+
expect($routes)->toContain("'AnalyticsController@geofenceViolations'");
|
|
16
|
+
expect($routes)->toContain("'AnalyticsController@liveFleet'");
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('per-slug metrics endpoint is registered', function () {
|
|
20
|
+
$routes = file_get_contents(dirname(__DIR__) . '/src/routes.php');
|
|
21
|
+
|
|
22
|
+
expect($routes)->toContain("\$router->get('{slug}', 'MetricsController@show');");
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('legacy metrics endpoint is preserved for backward compat', function () {
|
|
26
|
+
$routes = file_get_contents(dirname(__DIR__) . '/src/routes.php');
|
|
27
|
+
|
|
28
|
+
expect($routes)->toContain("\$router->get('/', 'MetricsController@all');");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('analytics controller has one method per widget', function () {
|
|
32
|
+
$controller = file_get_contents(dirname(__DIR__) . '/src/Http/Controllers/Internal/v1/AnalyticsController.php');
|
|
33
|
+
|
|
34
|
+
foreach ([
|
|
35
|
+
'operationsPulse', 'revenueTrend', 'ordersByStatus', 'onTimeDelivery',
|
|
36
|
+
'topDrivers', 'fuelEfficiency', 'issuesInsights', 'maintenanceOverview',
|
|
37
|
+
'geofenceViolations', 'liveFleet',
|
|
38
|
+
] as $method) {
|
|
39
|
+
expect($controller)->toContain("public function {$method}(");
|
|
40
|
+
}
|
|
41
|
+
});
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Fleetbase\FleetOps\Support\Metrics\AbstractMetric;
|
|
4
|
+
use Fleetbase\FleetOps\Support\Metrics\AvgOrderValueMetric;
|
|
5
|
+
use Fleetbase\FleetOps\Support\Metrics\EarningsMetric;
|
|
6
|
+
use Fleetbase\FleetOps\Support\Metrics\OpenIssuesMetric;
|
|
7
|
+
use Fleetbase\FleetOps\Support\Metrics\OrdersInProgressMetric;
|
|
8
|
+
use Fleetbase\FleetOps\Support\Metrics\Registry;
|
|
9
|
+
use Fleetbase\FleetOps\Support\Metrics\ResolvedIssuesMetric;
|
|
10
|
+
use Fleetbase\FleetOps\Support\Metrics\TotalTimeTraveledMetric;
|
|
11
|
+
|
|
12
|
+
test('registry exposes every known metric slug', function () {
|
|
13
|
+
$slugs = Registry::slugs();
|
|
14
|
+
|
|
15
|
+
expect($slugs)->toContain('earnings');
|
|
16
|
+
expect($slugs)->toContain('fuel_costs');
|
|
17
|
+
expect($slugs)->toContain('total_distance_traveled');
|
|
18
|
+
expect($slugs)->toContain('total_time_traveled');
|
|
19
|
+
expect($slugs)->toContain('orders_completed');
|
|
20
|
+
expect($slugs)->toContain('orders_canceled');
|
|
21
|
+
expect($slugs)->toContain('orders_in_progress');
|
|
22
|
+
expect($slugs)->toContain('orders_scheduled');
|
|
23
|
+
expect($slugs)->toContain('active_live_orders');
|
|
24
|
+
expect($slugs)->toContain('drivers_online');
|
|
25
|
+
expect($slugs)->toContain('total_drivers');
|
|
26
|
+
expect($slugs)->toContain('total_customers');
|
|
27
|
+
expect($slugs)->toContain('open_issues');
|
|
28
|
+
expect($slugs)->toContain('resolved_issues');
|
|
29
|
+
expect($slugs)->toContain('avg_order_value');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('registry resolves unknown slugs to null', function () {
|
|
33
|
+
expect(Registry::resolve('does_not_exist'))->toBeNull();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('every registered metric extends the abstract base', function () {
|
|
37
|
+
foreach (Registry::all() as $slug => $class) {
|
|
38
|
+
expect(is_subclass_of($class, AbstractMetric::class))
|
|
39
|
+
->toBeTrue("Metric class for slug '{$slug}' must extend AbstractMetric");
|
|
40
|
+
expect($class::slug())->toBe($slug);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('open and resolved issue metrics scope to the constructor company (not session)', function () {
|
|
45
|
+
$sourceOpen = file_get_contents(dirname(__DIR__) . '/src/Support/Metrics/OpenIssuesMetric.php');
|
|
46
|
+
$sourceResolved = file_get_contents(dirname(__DIR__) . '/src/Support/Metrics/ResolvedIssuesMetric.php');
|
|
47
|
+
|
|
48
|
+
expect($sourceOpen)->not->toContain("session('company')");
|
|
49
|
+
expect($sourceOpen)->toContain('$this->company->uuid');
|
|
50
|
+
expect($sourceResolved)->not->toContain("session('company')");
|
|
51
|
+
expect($sourceResolved)->toContain('$this->company->uuid');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('total_time_traveled metric sums the time column, not distance', function () {
|
|
55
|
+
$source = file_get_contents(dirname(__DIR__) . '/src/Support/Metrics/TotalTimeTraveledMetric.php');
|
|
56
|
+
|
|
57
|
+
expect($source)->toContain("\$query->sum('time')");
|
|
58
|
+
expect($source)->not->toContain("\$query->sum('distance')");
|
|
59
|
+
expect(TotalTimeTraveledMetric::slug())->toBe('total_time_traveled');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('money metrics return float values to preserve cents', function () {
|
|
63
|
+
$earnings = file_get_contents(dirname(__DIR__) . '/src/Support/Metrics/EarningsMetric.php');
|
|
64
|
+
$fuelCosts = file_get_contents(dirname(__DIR__) . '/src/Support/Metrics/FuelCostsMetric.php');
|
|
65
|
+
|
|
66
|
+
expect($earnings)->toContain('(float) $query->sum');
|
|
67
|
+
expect($earnings)->not->toMatch('/\(int\)\s*\$query->sum/');
|
|
68
|
+
expect($fuelCosts)->toContain('(float) $query->sum');
|
|
69
|
+
expect($fuelCosts)->not->toMatch('/\(int\)\s*\$query->sum/');
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('money metrics filter by currency to avoid mixed-currency sums', function () {
|
|
73
|
+
$earnings = file_get_contents(dirname(__DIR__) . '/src/Support/Metrics/EarningsMetric.php');
|
|
74
|
+
$fuelCosts = file_get_contents(dirname(__DIR__) . '/src/Support/Metrics/FuelCostsMetric.php');
|
|
75
|
+
$aov = file_get_contents(dirname(__DIR__) . '/src/Support/Metrics/AvgOrderValueMetric.php');
|
|
76
|
+
|
|
77
|
+
expect($earnings)->toContain("->where('currency'");
|
|
78
|
+
expect($fuelCosts)->toContain("->where('currency'");
|
|
79
|
+
expect($aov)->toContain("->where('currency'");
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test('ordersInProgress uses an explicit allowlist rather than an exclusion list', function () {
|
|
83
|
+
$statuses = OrdersInProgressMetric::IN_PROGRESS_STATUSES;
|
|
84
|
+
expect($statuses)->toBeArray();
|
|
85
|
+
expect($statuses)->not->toBeEmpty();
|
|
86
|
+
expect($statuses)->toContain('dispatched');
|
|
87
|
+
expect($statuses)->toContain('started');
|
|
88
|
+
});
|
|
@@ -157,3 +157,94 @@ test('vroom capacity-only payload uses matrix indexes instead of coordinates', f
|
|
|
157
157
|
expect($payload['matrices']['capacity_only']['durations'])->toHaveCount(2);
|
|
158
158
|
expect(array_values($reverse))->toBe(['order_capacity']);
|
|
159
159
|
});
|
|
160
|
+
|
|
161
|
+
test('vroom capacity-only payload minimizes vehicles by default', function () {
|
|
162
|
+
$engine = new VroomOrchestrationEngine();
|
|
163
|
+
$method = new ReflectionMethod($engine, 'buildCapacityOnlyPayload');
|
|
164
|
+
$reverse = [];
|
|
165
|
+
|
|
166
|
+
$method->setAccessible(true);
|
|
167
|
+
|
|
168
|
+
$payload = $method->invokeArgs($engine, [[
|
|
169
|
+
['id' => 'order_a', 'description' => 'order_a', 'amount' => [100, 250, 1, 2]],
|
|
170
|
+
['id' => 'order_b', 'description' => 'order_b', 'amount' => [80, 100, 0, 1]],
|
|
171
|
+
], [
|
|
172
|
+
['id' => 'vehicle_large', 'driver_id' => null, 'capacity' => [500, 1000, 4, 20]],
|
|
173
|
+
['id' => 'vehicle_spare', 'driver_id' => null, 'capacity' => [500, 1000, 4, 20]],
|
|
174
|
+
], [], &$reverse]);
|
|
175
|
+
|
|
176
|
+
expect($payload['vehicles'][0]['costs'])->toBe(['fixed' => 100000]);
|
|
177
|
+
expect($payload['vehicles'][1]['costs'])->toBe(['fixed' => 100000]);
|
|
178
|
+
expect($payload['jobs'])->toHaveCount(2);
|
|
179
|
+
expect($payload['jobs'][0]['delivery'])->toBe([100, 250, 1, 2]);
|
|
180
|
+
expect($payload['jobs'][1]['delivery'])->toBe([80, 100, 0, 1]);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test('vroom capacity-only payload accepts custom minimize vehicles fixed cost', function () {
|
|
184
|
+
$engine = new VroomOrchestrationEngine();
|
|
185
|
+
$method = new ReflectionMethod($engine, 'buildCapacityOnlyPayload');
|
|
186
|
+
$reverse = [];
|
|
187
|
+
|
|
188
|
+
$method->setAccessible(true);
|
|
189
|
+
|
|
190
|
+
$payload = $method->invokeArgs($engine, [[
|
|
191
|
+
['id' => 'order_a', 'description' => 'order_a', 'amount' => [100, 250, 1, 2]],
|
|
192
|
+
], [
|
|
193
|
+
['id' => 'vehicle_large', 'driver_id' => null, 'capacity' => [500, 1000, 4, 20]],
|
|
194
|
+
], [
|
|
195
|
+
'vehicle_packing' => 'minimize_vehicles',
|
|
196
|
+
'vehicle_fixed_cost' => 50000,
|
|
197
|
+
], &$reverse]);
|
|
198
|
+
|
|
199
|
+
expect($payload['vehicles'][0]['costs'])->toBe(['fixed' => 50000]);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test('vroom capacity-only payload can disable vehicle packing bias', function (string $packing) {
|
|
203
|
+
$engine = new VroomOrchestrationEngine();
|
|
204
|
+
$method = new ReflectionMethod($engine, 'buildCapacityOnlyPayload');
|
|
205
|
+
$reverse = [];
|
|
206
|
+
|
|
207
|
+
$method->setAccessible(true);
|
|
208
|
+
|
|
209
|
+
$payload = $method->invokeArgs($engine, [[
|
|
210
|
+
['id' => 'order_a', 'description' => 'order_a', 'amount' => [100, 250, 1, 2]],
|
|
211
|
+
], [
|
|
212
|
+
['id' => 'vehicle_large', 'driver_id' => null, 'capacity' => [500, 1000, 4, 20]],
|
|
213
|
+
], [
|
|
214
|
+
'vehicle_packing' => $packing,
|
|
215
|
+
], &$reverse]);
|
|
216
|
+
|
|
217
|
+
expect($payload['vehicles'][0])->not->toHaveKey('costs');
|
|
218
|
+
})->with(['balanced', 'none']);
|
|
219
|
+
|
|
220
|
+
test('vroom capacity-only response can assign multiple orders to one large vehicle', function () {
|
|
221
|
+
$engine = new VroomOrchestrationEngine();
|
|
222
|
+
$method = new ReflectionMethod($engine, 'mapVroomResponse');
|
|
223
|
+
|
|
224
|
+
$method->setAccessible(true);
|
|
225
|
+
|
|
226
|
+
$result = $method->invoke($engine, [
|
|
227
|
+
'routes' => [
|
|
228
|
+
[
|
|
229
|
+
'description' => json_encode(['vehicle_id' => 'vehicle_large', 'driver_id' => null]),
|
|
230
|
+
'steps' => [
|
|
231
|
+
['type' => 'start'],
|
|
232
|
+
['type' => 'job', 'id' => 1001],
|
|
233
|
+
['type' => 'job', 'id' => 1002],
|
|
234
|
+
['type' => 'job', 'id' => 1003],
|
|
235
|
+
['type' => 'end'],
|
|
236
|
+
],
|
|
237
|
+
],
|
|
238
|
+
],
|
|
239
|
+
'unassigned' => [],
|
|
240
|
+
'summary' => ['routes' => 1],
|
|
241
|
+
], [
|
|
242
|
+
1001 => 'order_a',
|
|
243
|
+
1002 => 'order_b',
|
|
244
|
+
1003 => 'order_c',
|
|
245
|
+
]);
|
|
246
|
+
|
|
247
|
+
expect($result['assignments'])->toHaveCount(3);
|
|
248
|
+
expect(collect($result['assignments'])->pluck('vehicle_id')->unique()->values()->all())->toBe(['vehicle_large']);
|
|
249
|
+
expect(collect($result['assignments'])->pluck('order_id')->all())->toBe(['order_a', 'order_b', 'order_c']);
|
|
250
|
+
});
|
package/translations/en-us.yaml
CHANGED
|
@@ -435,6 +435,7 @@ driver:
|
|
|
435
435
|
vendor: Vendor
|
|
436
436
|
select-vendor: Select Vendor
|
|
437
437
|
driver-license: Drivers License
|
|
438
|
+
license-expiry: License Expiry
|
|
438
439
|
no-vehicle-assigned: No Vehicle Assigned
|
|
439
440
|
actions:
|
|
440
441
|
assign-order: Assign Order to Driver
|
|
@@ -1653,6 +1654,39 @@ modals:
|
|
|
1653
1654
|
description-zone: Description of Zone
|
|
1654
1655
|
|
|
1655
1656
|
widget:
|
|
1657
|
+
refresh: Refresh
|
|
1658
|
+
kpi-earnings:
|
|
1659
|
+
title: Earnings
|
|
1660
|
+
kpi-distance:
|
|
1661
|
+
title: Distance Travelled
|
|
1662
|
+
kpi-aov:
|
|
1663
|
+
title: Avg Order Value
|
|
1664
|
+
kpi-active-orders:
|
|
1665
|
+
title: Active Orders
|
|
1666
|
+
kpi-drivers-online:
|
|
1667
|
+
title: Drivers Online
|
|
1668
|
+
kpi-open-issues:
|
|
1669
|
+
title: Open Issues
|
|
1670
|
+
operations-pulse:
|
|
1671
|
+
title: Operations Pulse
|
|
1672
|
+
revenue-trend:
|
|
1673
|
+
title: Revenue Trend
|
|
1674
|
+
orders-by-status:
|
|
1675
|
+
title: Order Volume by Status
|
|
1676
|
+
on-time-delivery:
|
|
1677
|
+
title: On-Time Delivery
|
|
1678
|
+
top-drivers:
|
|
1679
|
+
title: Top Drivers
|
|
1680
|
+
fuel-efficiency:
|
|
1681
|
+
title: Fuel Cost & Efficiency
|
|
1682
|
+
issues-insights:
|
|
1683
|
+
title: Issues Insights
|
|
1684
|
+
maintenance-overview:
|
|
1685
|
+
title: Maintenance Overview
|
|
1686
|
+
geofence-violations:
|
|
1687
|
+
title: Geofence Violations
|
|
1688
|
+
live-fleet:
|
|
1689
|
+
title: Live Fleet Map
|
|
1656
1690
|
fleet-ops-quickstart:
|
|
1657
1691
|
message: Let's see what you can do to jumpstart operations...
|
|
1658
1692
|
start-task: Start Task
|
|
@@ -1992,6 +2026,9 @@ orchestrator:
|
|
|
1992
2026
|
allocation-strategy: Allocation Strategy
|
|
1993
2027
|
allocation-strategy-route-aware: Route + Capacity
|
|
1994
2028
|
allocation-strategy-capacity-only: Capacity Only
|
|
2029
|
+
vehicle-packing: Vehicle Packing
|
|
2030
|
+
vehicle-packing-minimize-vehicles: Minimize Vehicles
|
|
2031
|
+
vehicle-packing-balanced: Balanced
|
|
1995
2032
|
respect-skills: Respect Skills
|
|
1996
2033
|
respect-capacity: Respect Capacity
|
|
1997
2034
|
return-to-depot: Return to Depot
|