@fleetbase/fleetops-engine 0.6.48 → 0.6.50

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.
Files changed (266) hide show
  1. package/addon/components/customer/create-order-form.hbs +2 -2
  2. package/addon/components/customer/form.hbs +2 -2
  3. package/addon/components/customer/order-form.hbs +2 -2
  4. package/addon/components/customer/orders.hbs +2 -2
  5. package/addon/components/display-place.hbs +2 -2
  6. package/addon/components/driver/details.hbs +5 -1
  7. package/addon/components/driver/form.hbs +11 -1
  8. package/addon/components/fleet-listing-panel.hbs +2 -2
  9. package/addon/components/fleet-listing-panel.js +10 -0
  10. package/addon/components/map/google-live-map.js +18 -75
  11. package/addon/components/map/leaflet-live-map.hbs +187 -37
  12. package/addon/components/map/leaflet-live-map.js +184 -20
  13. package/addon/components/modals/order-change-destination.hbs +46 -0
  14. package/addon/components/modals/order-change-destination.js +106 -0
  15. package/addon/components/modals/stop-activity.hbs +28 -0
  16. package/addon/components/modals/stop-activity.js +52 -0
  17. package/addon/components/modals/update-order-activity.hbs +45 -3
  18. package/addon/components/modals/update-order-activity.js +143 -5
  19. package/addon/components/orchestrator/phase-builder.hbs +21 -0
  20. package/addon/components/orchestrator/phase-builder.js +13 -0
  21. package/addon/components/orchestrator/resource-panel.hbs +0 -10
  22. package/addon/components/orchestrator/resource-panel.js +2 -4
  23. package/addon/components/orchestrator-workbench.js +1 -0
  24. package/addon/components/order/activity-list.hbs +2 -2
  25. package/addon/components/order/activity-timeline.hbs +31 -29
  26. package/addon/components/order/details/activity.hbs +3 -3
  27. package/addon/components/order/details/activity.js +11 -0
  28. package/addon/components/order/details/documents.js +2 -0
  29. package/addon/components/order/details/purchase-rate.hbs +2 -2
  30. package/addon/components/order/details/route.hbs +11 -3
  31. package/addon/components/order/details/route.js +91 -14
  32. package/addon/components/order/details/tracking.hbs +101 -72
  33. package/addon/components/order/details/tracking.js +149 -2
  34. package/addon/components/order/form/details.hbs +3 -3
  35. package/addon/components/order/form/documents.js +11 -4
  36. package/addon/components/order/form/route.hbs +108 -104
  37. package/addon/components/order/form/route.js +37 -1
  38. package/addon/components/order/form/service-rate.hbs +2 -2
  39. package/addon/components/order/form.hbs +2 -2
  40. package/addon/components/order-config-manager/activity-flow.hbs +4 -1
  41. package/addon/components/order-config-manager/activity-flow.js +178 -12
  42. package/addon/components/place/address.js +1 -1
  43. package/addon/components/route-list.hbs +17 -17
  44. package/addon/components/route-list.js +42 -10
  45. package/addon/components/service-rate/details.hbs +41 -0
  46. package/addon/components/service-rate/form.hbs +118 -0
  47. package/addon/components/service-rate/form.js +55 -0
  48. package/addon/components/vehicle/form.js +1 -1
  49. package/addon/components/vehicle/pill.hbs +1 -1
  50. package/addon/components/widget/fleet-ops-key-metrics.hbs +19 -17
  51. package/addon/components/widget/fleet-ops-key-metrics.js +26 -0
  52. package/addon/components/widget/fuel-efficiency.hbs +26 -0
  53. package/addon/components/widget/fuel-efficiency.js +43 -0
  54. package/addon/components/widget/geofence-violations.hbs +44 -0
  55. package/addon/components/widget/geofence-violations.js +55 -0
  56. package/addon/components/widget/issues-insights.hbs +43 -0
  57. package/addon/components/widget/issues-insights.js +62 -0
  58. package/addon/components/widget/kpi-active-orders.hbs +10 -0
  59. package/addon/components/widget/kpi-active-orders.js +5 -0
  60. package/addon/components/widget/kpi-aov.hbs +10 -0
  61. package/addon/components/widget/kpi-aov.js +5 -0
  62. package/addon/components/widget/kpi-distance.hbs +10 -0
  63. package/addon/components/widget/kpi-distance.js +5 -0
  64. package/addon/components/widget/kpi-drivers-online.hbs +10 -0
  65. package/addon/components/widget/kpi-drivers-online.js +5 -0
  66. package/addon/components/widget/kpi-earnings.hbs +10 -0
  67. package/addon/components/widget/kpi-earnings.js +5 -0
  68. package/addon/components/widget/kpi-open-issues.hbs +11 -0
  69. package/addon/components/widget/kpi-open-issues.js +5 -0
  70. package/addon/components/widget/kpi-tile.hbs +59 -0
  71. package/addon/components/widget/kpi-tile.js +168 -0
  72. package/addon/components/widget/live-fleet.hbs +122 -0
  73. package/addon/components/widget/live-fleet.js +365 -0
  74. package/addon/components/widget/maintenance-overview.hbs +45 -0
  75. package/addon/components/widget/maintenance-overview.js +40 -0
  76. package/addon/components/widget/on-time-delivery.hbs +27 -0
  77. package/addon/components/widget/on-time-delivery.js +73 -0
  78. package/addon/components/widget/operations-pulse.hbs +51 -0
  79. package/addon/components/widget/operations-pulse.js +173 -0
  80. package/addon/components/widget/orders-by-status.hbs +26 -0
  81. package/addon/components/widget/orders-by-status.js +54 -0
  82. package/addon/components/widget/revenue-trend.hbs +34 -0
  83. package/addon/components/widget/revenue-trend.js +67 -0
  84. package/addon/components/widget/top-drivers.hbs +44 -0
  85. package/addon/components/widget/top-drivers.js +54 -0
  86. package/addon/controllers/management/vehicles/index/new.js +1 -1
  87. package/addon/controllers/operations/orders/index/details.js +4 -4
  88. package/addon/controllers/operations/orders/index.js +14 -0
  89. package/addon/controllers/settings/routing.js +26 -0
  90. package/addon/extension.js +172 -3
  91. package/addon/helpers/place-address-html.js +2 -2
  92. package/addon/routes/operations/service-rates/index.js +1 -1
  93. package/addon/services/geofence.js +163 -19
  94. package/addon/services/leaflet-contextmenu-manager.js +27 -0
  95. package/addon/services/map-adapter/google.js +13 -2
  96. package/addon/services/vehicle-actions.js +1 -1
  97. package/addon/styles/fleetops-engine.css +205 -88
  98. package/addon/templates/maintenance/equipment/index.hbs +1 -1
  99. package/addon/templates/maintenance/parts/index.hbs +1 -1
  100. package/addon/templates/maintenance/schedules/index.hbs +1 -1
  101. package/addon/templates/management/vehicles/index.hbs +1 -1
  102. package/addon/templates/settings/avatars.hbs +1 -1
  103. package/addon/templates/settings/custom-fields.hbs +1 -1
  104. package/addon/templates/settings/map.hbs +1 -1
  105. package/addon/templates/settings/navigator-app.hbs +1 -1
  106. package/addon/templates/settings/notifications.hbs +1 -1
  107. package/addon/templates/settings/orchestrator.hbs +1 -1
  108. package/addon/templates/settings/payments/index.hbs +1 -1
  109. package/addon/templates/settings/payments/onboard.hbs +1 -1
  110. package/addon/templates/settings/routing.hbs +22 -2
  111. package/addon/templates/settings/scheduling.hbs +1 -1
  112. package/addon/utils/fleet-ops-options.js +2 -1
  113. package/addon/utils/live-map-card-content.js +171 -0
  114. package/addon/utils/normalize-order-config-flow.js +41 -0
  115. package/addon/utils/place-address-html.js +3 -2
  116. package/addon/utils/route-visualization.js +54 -7
  117. package/app/components/modals/order-change-destination.js +1 -0
  118. package/app/components/modals/stop-activity.js +1 -0
  119. package/app/components/widget/fuel-efficiency.js +1 -0
  120. package/app/components/widget/geofence-violations.js +1 -0
  121. package/app/components/widget/issues-insights.js +1 -0
  122. package/app/components/widget/kpi-active-orders.js +1 -0
  123. package/app/components/widget/kpi-aov.js +1 -0
  124. package/app/components/widget/kpi-distance.js +1 -0
  125. package/app/components/widget/kpi-drivers-online.js +1 -0
  126. package/app/components/widget/kpi-earnings.js +1 -0
  127. package/app/components/widget/kpi-open-issues.js +1 -0
  128. package/app/components/widget/kpi-tile.js +1 -0
  129. package/app/components/widget/live-fleet.js +1 -0
  130. package/app/components/widget/maintenance-overview.js +1 -0
  131. package/app/components/widget/on-time-delivery.js +1 -0
  132. package/app/components/widget/operations-pulse.js +1 -0
  133. package/app/components/widget/orders-by-status.js +1 -0
  134. package/app/components/widget/revenue-trend.js +1 -0
  135. package/app/components/widget/top-drivers.js +1 -0
  136. package/app/utils/live-map-card-content.js +1 -0
  137. package/composer.json +1 -1
  138. package/extension.json +1 -1
  139. package/package.json +3 -3
  140. package/pnpm-workspace.yaml +1 -0
  141. package/server/config/telematics.php +111 -1
  142. package/server/migrations/2026_05_18_000001_add_license_expiry_to_drivers_table.php +25 -0
  143. package/server/migrations/2026_05_21_000001_add_geographic_rules_to_service_rate_fees_table.php +37 -0
  144. package/server/migrations/2026_05_25_000001_add_endpoint_tracking_refs_to_payloads_table.php +50 -0
  145. package/server/migrations/2026_05_27_000001_default_driver_vehicle_statuses_to_available.php +48 -0
  146. package/server/resources/views/labels/default.php +57 -49
  147. package/server/resources/views/labels/waypoint-label.php +27 -20
  148. package/server/seeders/Testing/Concerns/SeedsTestingData.php +183 -0
  149. package/server/seeders/Testing/ConnectivitySeeder.php +213 -0
  150. package/server/seeders/Testing/FleetSeeder.php +341 -0
  151. package/server/seeders/Testing/MaintenanceSeeder.php +238 -0
  152. package/server/seeders/Testing/NetworkSeeder.php +250 -0
  153. package/server/seeders/Testing/OrdersSeeder.php +198 -0
  154. package/server/seeders/Testing/TestingSeeder.php +40 -0
  155. package/server/seeders/{VroomOrchestrationSeeder.php → Testing/VroomOrchestrationSeeder.php} +29 -22
  156. package/server/src/Console/Commands/AuditCustomerUserConflicts.php +75 -0
  157. package/server/src/Console/Commands/ProcessOperationalAlerts.php +279 -0
  158. package/server/src/Exceptions/CustomerUserConflictException.php +13 -0
  159. package/server/src/Http/Controllers/Api/v1/ContactController.php +17 -2
  160. package/server/src/Http/Controllers/Api/v1/CustomerController.php +876 -0
  161. package/server/src/Http/Controllers/Api/v1/DriverController.php +1 -1
  162. package/server/src/Http/Controllers/Api/v1/OrderConfigController.php +54 -0
  163. package/server/src/Http/Controllers/Api/v1/OrderController.php +98 -70
  164. package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +2 -2
  165. package/server/src/Http/Controllers/Api/v1/VehicleController.php +20 -3
  166. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +119 -0
  167. package/server/src/Http/Controllers/Internal/v1/ContactController.php +19 -0
  168. package/server/src/Http/Controllers/Internal/v1/LiveController.php +101 -66
  169. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +82 -3
  170. package/server/src/Http/Controllers/Internal/v1/OrderController.php +441 -32
  171. package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +1 -1
  172. package/server/src/Http/Controllers/Internal/v1/SettingController.php +46 -1
  173. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +54 -1
  174. package/server/src/Http/Middleware/AuthenticateCustomerToken.php +34 -0
  175. package/server/src/Http/Requests/CreateCustomerOrderRequest.php +63 -0
  176. package/server/src/Http/Requests/CreateCustomerRequest.php +48 -0
  177. package/server/src/Http/Requests/CreateDriverRequest.php +1 -1
  178. package/server/src/Http/Requests/CreateVehicleRequest.php +25 -1
  179. package/server/src/Http/Requests/Internal/CreateDriverRequest.php +1 -1
  180. package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +29 -0
  181. package/server/src/Http/Resources/Internal/v1/OrderConfig.php +41 -0
  182. package/server/src/Http/Resources/v1/Customer.php +79 -0
  183. package/server/src/Http/Resources/v1/Driver.php +2 -0
  184. package/server/src/Http/Resources/v1/Fleet.php +4 -0
  185. package/server/src/Http/Resources/v1/Index/Driver.php +48 -0
  186. package/server/src/Http/Resources/v1/Index/Vehicle.php +74 -1
  187. package/server/src/Http/Resources/v1/OrderConfig.php +74 -0
  188. package/server/src/Http/Resources/v1/Payload.php +23 -20
  189. package/server/src/Http/Resources/v1/ServiceArea.php +33 -19
  190. package/server/src/Http/Resources/v1/ServiceRateFee.php +7 -0
  191. package/server/src/Listeners/HandleOrderDispatched.php +2 -2
  192. package/server/src/Models/Contact.php +92 -15
  193. package/server/src/Models/Customer.php +64 -0
  194. package/server/src/Models/Driver.php +14 -3
  195. package/server/src/Models/Entity.php +2 -2
  196. package/server/src/Models/Order.php +29 -4
  197. package/server/src/Models/OrderConfig.php +14 -11
  198. package/server/src/Models/Payload.php +17 -1
  199. package/server/src/Models/ServiceRate.php +273 -1
  200. package/server/src/Models/ServiceRateFee.php +39 -9
  201. package/server/src/Models/TrackingNumber.php +8 -2
  202. package/server/src/Models/Vehicle.php +18 -2
  203. package/server/src/Models/Waypoint.php +2 -2
  204. package/server/src/Notifications/LateDeparture.php +48 -0
  205. package/server/src/Notifications/ProlongedStoppage.php +48 -0
  206. package/server/src/Notifications/RouteDeviation.php +48 -0
  207. package/server/src/Observers/ContactObserver.php +2 -0
  208. package/server/src/Observers/ServiceRateObserver.php +6 -6
  209. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +29 -2
  210. package/server/src/Providers/FleetOpsServiceProvider.php +6 -0
  211. package/server/src/Providers/NotificationServiceProvider.php +3 -0
  212. package/server/src/Support/Analytics/AbstractAnalytics.php +77 -0
  213. package/server/src/Support/Analytics/FuelEfficiency.php +83 -0
  214. package/server/src/Support/Analytics/GeofenceViolations.php +63 -0
  215. package/server/src/Support/Analytics/IssuesInsights.php +67 -0
  216. package/server/src/Support/Analytics/LiveFleet.php +127 -0
  217. package/server/src/Support/Analytics/MaintenanceOverview.php +70 -0
  218. package/server/src/Support/Analytics/OnTimeDelivery.php +75 -0
  219. package/server/src/Support/Analytics/OperationsPulse.php +86 -0
  220. package/server/src/Support/Analytics/OrdersByStatus.php +64 -0
  221. package/server/src/Support/Analytics/RevenueTrend.php +78 -0
  222. package/server/src/Support/Analytics/TopDrivers.php +92 -0
  223. package/server/src/Support/CustomerAuth.php +98 -0
  224. package/server/src/Support/LabelPdf.php +52 -0
  225. package/server/src/Support/Metrics/AbstractMetric.php +170 -0
  226. package/server/src/Support/Metrics/ActiveLiveOrdersMetric.php +28 -0
  227. package/server/src/Support/Metrics/AvgOrderValueMetric.php +53 -0
  228. package/server/src/Support/Metrics/DriversOnlineMetric.php +30 -0
  229. package/server/src/Support/Metrics/EarningsMetric.php +30 -0
  230. package/server/src/Support/Metrics/FuelCostsMetric.php +30 -0
  231. package/server/src/Support/Metrics/MoneyMetric.php +30 -0
  232. package/server/src/Support/Metrics/OpenIssuesMetric.php +35 -0
  233. package/server/src/Support/Metrics/OrdersCanceledMetric.php +35 -0
  234. package/server/src/Support/Metrics/OrdersCompletedMetric.php +35 -0
  235. package/server/src/Support/Metrics/OrdersInProgressMetric.php +51 -0
  236. package/server/src/Support/Metrics/OrdersScheduledMetric.php +37 -0
  237. package/server/src/Support/Metrics/Registry.php +46 -0
  238. package/server/src/Support/Metrics/ResolvedIssuesMetric.php +35 -0
  239. package/server/src/Support/Metrics/TotalCustomersMetric.php +29 -0
  240. package/server/src/Support/Metrics/TotalDistanceTraveledMetric.php +35 -0
  241. package/server/src/Support/Metrics/TotalDriversMetric.php +28 -0
  242. package/server/src/Support/Metrics/TotalTimeTraveledMetric.php +35 -0
  243. package/server/src/Support/Metrics.php +46 -249
  244. package/server/src/Support/ResolvesOrderServiceStops.php +512 -0
  245. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +290 -0
  246. package/server/src/Support/Telematics/Providers/SafeeProvider.php +333 -0
  247. package/server/src/Tracking/TrackingContextBuilder.php +41 -38
  248. package/server/src/Tracking/TrackingIntelligenceService.php +109 -9
  249. package/server/src/Tracking/TrackingStop.php +13 -11
  250. package/server/src/routes.php +50 -0
  251. package/server/tests/AnalyticsRoutesTest.php +41 -0
  252. package/server/tests/CapacityAllocationEngineTest.php +10 -10
  253. package/server/tests/CustomerContactIdentitySafetyTest.php +54 -0
  254. package/server/tests/CustomerEndpointTest.php +199 -0
  255. package/server/tests/DriverVehicleStatusDefaultTest.php +39 -0
  256. package/server/tests/LabelPdfRenderingTest.php +23 -0
  257. package/server/tests/LiveControllerViewportTest.php +60 -0
  258. package/server/tests/MetricsRegistryTest.php +84 -0
  259. package/server/tests/OrchestrationPayloadBuilderTest.php +2 -2
  260. package/server/tests/OrderConfigEndpointTest.php +86 -0
  261. package/server/tests/OrderFileAttachmentTest.php +20 -0
  262. package/server/tests/ServiceAreaZoneApiShapeTest.php +34 -0
  263. package/server/tests/VehicleDriverAssignmentTest.php +18 -0
  264. package/server/tests/VroomOrchestrationEngineTest.php +91 -0
  265. package/translations/en-us.yaml +38 -0
  266. package/server/migrations/2026_05_13_000001_repair_customer_contact_user_types.php +0 -86
@@ -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
+ });
@@ -8,6 +8,7 @@ common:
8
8
  dispatch-orders: Dispatch Orders
9
9
  dispatch-order: Dispatch Order
10
10
  assign-driver: Assign Driver
11
+ unassign-driver: Unassign Driver
11
12
  assign-drivers: Assign Drivers
12
13
  no-driver-assigned: No driver assigned
13
14
  details: Details
@@ -435,6 +436,7 @@ driver:
435
436
  vendor: Vendor
436
437
  select-vendor: Select Vendor
437
438
  driver-license: Drivers License
439
+ license-expiry: License Expiry
438
440
  no-vehicle-assigned: No Vehicle Assigned
439
441
  actions:
440
442
  assign-order: Assign Order to Driver
@@ -1653,6 +1655,39 @@ modals:
1653
1655
  description-zone: Description of Zone
1654
1656
 
1655
1657
  widget:
1658
+ refresh: Refresh
1659
+ kpi-earnings:
1660
+ title: Earnings
1661
+ kpi-distance:
1662
+ title: Distance Travelled
1663
+ kpi-aov:
1664
+ title: Avg Order Value
1665
+ kpi-active-orders:
1666
+ title: Active Orders
1667
+ kpi-drivers-online:
1668
+ title: Drivers Online
1669
+ kpi-open-issues:
1670
+ title: Open Issues
1671
+ operations-pulse:
1672
+ title: Operations Pulse
1673
+ revenue-trend:
1674
+ title: Revenue Trend
1675
+ orders-by-status:
1676
+ title: Order Volume by Status
1677
+ on-time-delivery:
1678
+ title: On-Time Delivery
1679
+ top-drivers:
1680
+ title: Top Drivers
1681
+ fuel-efficiency:
1682
+ title: Fuel Cost & Efficiency
1683
+ issues-insights:
1684
+ title: Issues Insights
1685
+ maintenance-overview:
1686
+ title: Maintenance Overview
1687
+ geofence-violations:
1688
+ title: Geofence Violations
1689
+ live-fleet:
1690
+ title: Live Fleet Map
1656
1691
  fleet-ops-quickstart:
1657
1692
  message: Let's see what you can do to jumpstart operations...
1658
1693
  start-task: Start Task
@@ -1992,6 +2027,9 @@ orchestrator:
1992
2027
  allocation-strategy: Allocation Strategy
1993
2028
  allocation-strategy-route-aware: Route + Capacity
1994
2029
  allocation-strategy-capacity-only: Capacity Only
2030
+ vehicle-packing: Vehicle Packing
2031
+ vehicle-packing-minimize-vehicles: Minimize Vehicles
2032
+ vehicle-packing-balanced: Balanced
1995
2033
  respect-skills: Respect Skills
1996
2034
  respect-capacity: Respect Capacity
1997
2035
  return-to-depot: Return to Depot
@@ -1,86 +0,0 @@
1
- <?php
2
-
3
- use Fleetbase\FleetOps\Models\Contact;
4
- use Fleetbase\Models\CompanyUser;
5
- use Illuminate\Database\Migrations\Migration;
6
- use Illuminate\Support\Facades\DB;
7
- use Illuminate\Support\Facades\Schema;
8
-
9
- return new class extends Migration {
10
- /**
11
- * Run the migrations.
12
- *
13
- * @return void
14
- */
15
- public function up()
16
- {
17
- Contact::withoutGlobalScopes()
18
- ->where('type', 'customer')
19
- ->whereNull('deleted_at')
20
- ->chunkById(100, function ($contacts) {
21
- foreach ($contacts as $contact) {
22
- try {
23
- $contact->repairCustomerTypeInvariant(true);
24
- } catch (Throwable $e) {
25
- // Skip ambiguous or unrecoverable records; runtime invariants handle new writes.
26
- }
27
- }
28
- });
29
-
30
- if (!$this->canUseCustomerRoleHint()) {
31
- return;
32
- }
33
-
34
- DB::table('contacts')
35
- ->select('contacts.id')
36
- ->join('company_users', function ($join) {
37
- $join->on('company_users.user_uuid', '=', 'contacts.user_uuid');
38
- $join->on('company_users.company_uuid', '=', 'contacts.company_uuid');
39
- })
40
- ->join('model_has_roles', function ($join) {
41
- $join->on('model_has_roles.model_uuid', '=', 'company_users.uuid');
42
- $join->where('model_has_roles.model_type', CompanyUser::class);
43
- })
44
- ->join('roles', 'roles.id', '=', 'model_has_roles.role_id')
45
- ->where('roles.name', 'Fleet-Ops Customer')
46
- ->whereNull('contacts.deleted_at')
47
- ->where(function ($query) {
48
- $query->whereNull('contacts.type');
49
- $query->orWhere('contacts.type', '!=', 'customer');
50
- })
51
- ->distinct()
52
- ->orderBy('contacts.id')
53
- ->chunk(100, function ($rows) {
54
- foreach ($rows as $row) {
55
- $contact = Contact::withoutGlobalScopes()->find($row->id);
56
- if (!$contact) {
57
- continue;
58
- }
59
-
60
- try {
61
- $contact->repairCustomerTypeInvariant(true);
62
- } catch (Throwable $e) {
63
- // Skip ambiguous or unrecoverable records; role is only a recovery hint.
64
- }
65
- }
66
- });
67
- }
68
-
69
- /**
70
- * Reverse the migrations.
71
- *
72
- * @return void
73
- */
74
- public function down()
75
- {
76
- // Data repair is intentionally not reversible.
77
- }
78
-
79
- private function canUseCustomerRoleHint(): bool
80
- {
81
- return Schema::hasTable('contacts')
82
- && Schema::hasTable('company_users')
83
- && Schema::hasTable('model_has_roles')
84
- && Schema::hasTable('roles');
85
- }
86
- };