@fleetbase/fleetops-engine 0.6.68 → 0.6.70

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 (294) hide show
  1. package/RELEASE.md +44 -9
  2. package/addon/components/admin/telematics-settings.hbs +143 -0
  3. package/addon/components/admin/telematics-settings.js +145 -0
  4. package/addon/components/contact/form.hbs +13 -2
  5. package/addon/components/customer/details.hbs +17 -17
  6. package/addon/components/customer/form.hbs +13 -2
  7. package/addon/components/customer/form.js +0 -56
  8. package/addon/components/driver/details.hbs +13 -19
  9. package/addon/components/driver/form.hbs +20 -35
  10. package/addon/components/driver/form.js +0 -58
  11. package/addon/components/fuel-integration/hub.hbs +1 -1
  12. package/addon/components/layout/fleet-ops-sidebar.js +37 -17
  13. package/addon/components/map/leaflet-live-map.hbs +4 -242
  14. package/addon/components/map/leaflet-live-map.js +2 -1
  15. package/addon/components/map/marker-card/driver.hbs +57 -0
  16. package/addon/components/map/marker-card/driver.js +3 -0
  17. package/addon/components/map/marker-card/vehicle.hbs +78 -0
  18. package/addon/components/map/marker-card/vehicle.js +3 -0
  19. package/addon/components/modals/driver-form.hbs +2 -2
  20. package/addon/components/modals/reset-profile-credentials.hbs +23 -0
  21. package/addon/components/modals/reset-profile-credentials.js +70 -0
  22. package/addon/components/profile-identity-hint.hbs +13 -0
  23. package/addon/components/profile-identity-hint.js +49 -0
  24. package/addon/components/telematic/hub.hbs +1 -1
  25. package/addon/components/widget/live-fleet.hbs +8 -40
  26. package/addon/controllers/analytics/reports/index.js +5 -0
  27. package/addon/controllers/connectivity/devices/index.js +4 -0
  28. package/addon/controllers/connectivity/fuel-providers/index.js +6 -4
  29. package/addon/controllers/connectivity/sensors/index.js +4 -0
  30. package/addon/controllers/connectivity/telematics/index.js +4 -0
  31. package/addon/controllers/maintenance/equipment/index.js +11 -4
  32. package/addon/controllers/maintenance/inspection-forms/index.js +2 -2
  33. package/addon/controllers/maintenance/inspection-submissions/index.js +8 -2
  34. package/addon/controllers/maintenance/maintenances/index.js +4 -0
  35. package/addon/controllers/maintenance/parts/index.js +11 -4
  36. package/addon/controllers/maintenance/schedules/index.js +17 -4
  37. package/addon/controllers/maintenance/work-orders/index.js +11 -4
  38. package/addon/controllers/management/contacts/index.js +4 -0
  39. package/addon/controllers/management/drivers/index.js +8 -0
  40. package/addon/controllers/management/fleets/index.js +4 -0
  41. package/addon/controllers/management/fuel-reports/index.js +4 -0
  42. package/addon/controllers/management/fuel-transactions/index.js +9 -7
  43. package/addon/controllers/management/issues/index.js +4 -0
  44. package/addon/controllers/management/places/index.js +4 -0
  45. package/addon/controllers/management/vehicles/index.js +4 -0
  46. package/addon/controllers/management/vendors/index.js +4 -0
  47. package/addon/controllers/operations/orders/index/details.js +30 -1
  48. package/addon/controllers/operations/orders/index.js +7 -0
  49. package/addon/controllers/operations/service-rates/index.js +3 -0
  50. package/addon/controllers/settings/index.js +13 -0
  51. package/addon/controllers/settings/telematics.js +113 -0
  52. package/addon/extension.js +42 -8
  53. package/addon/routes/analytics/index.js +14 -1
  54. package/addon/routes/analytics/reports/index/details.js +1 -1
  55. package/addon/routes/analytics/reports/index/edit.js +1 -1
  56. package/addon/routes/analytics/reports/index/new.js +14 -1
  57. package/addon/routes/analytics/reports.js +14 -1
  58. package/addon/routes/connectivity/devices/index/new.js +14 -1
  59. package/addon/routes/connectivity/devices.js +14 -1
  60. package/addon/routes/connectivity/events.js +14 -1
  61. package/addon/routes/connectivity/fuel-providers/details/transactions.js +12 -0
  62. package/addon/routes/connectivity/fuel-providers/details.js +9 -0
  63. package/addon/routes/connectivity/fuel-providers/edit.js +9 -0
  64. package/addon/routes/connectivity/fuel-providers/new.js +14 -1
  65. package/addon/routes/connectivity/fuel-providers.js +14 -1
  66. package/addon/routes/connectivity/sensors/index/new.js +14 -1
  67. package/addon/routes/connectivity/sensors.js +14 -1
  68. package/addon/routes/connectivity/telematics/new.js +14 -1
  69. package/addon/routes/connectivity/telematics.js +14 -1
  70. package/addon/routes/connectivity/tracking.js +14 -1
  71. package/addon/routes/maintenance/equipment/index/details.js +2 -2
  72. package/addon/routes/maintenance/equipment/index/edit.js +2 -2
  73. package/addon/routes/maintenance/equipment/index/new.js +14 -1
  74. package/addon/routes/maintenance/equipment.js +14 -1
  75. package/addon/routes/maintenance/index.js +14 -1
  76. package/addon/routes/maintenance/inspection-forms/index/details.js +10 -1
  77. package/addon/routes/maintenance/inspection-forms/index/edit.js +10 -1
  78. package/addon/routes/maintenance/inspection-forms/index/new.js +14 -1
  79. package/addon/routes/maintenance/inspection-forms.js +14 -1
  80. package/addon/routes/maintenance/inspection-submissions/index/details.js +10 -1
  81. package/addon/routes/maintenance/inspection-submissions/index/edit.js +10 -1
  82. package/addon/routes/maintenance/inspection-submissions/index/new.js +14 -1
  83. package/addon/routes/maintenance/inspection-submissions.js +14 -1
  84. package/addon/routes/maintenance/maintenances/index/details.js +2 -2
  85. package/addon/routes/maintenance/maintenances/index/edit.js +2 -2
  86. package/addon/routes/maintenance/maintenances/index/new.js +14 -1
  87. package/addon/routes/maintenance/maintenances.js +14 -1
  88. package/addon/routes/maintenance/parts/index/details.js +2 -2
  89. package/addon/routes/maintenance/parts/index/edit.js +2 -2
  90. package/addon/routes/maintenance/parts/index/new.js +14 -1
  91. package/addon/routes/maintenance/parts.js +14 -1
  92. package/addon/routes/maintenance/schedules/index/details.js +2 -2
  93. package/addon/routes/maintenance/schedules/index/edit.js +2 -2
  94. package/addon/routes/maintenance/schedules/index/new.js +15 -1
  95. package/addon/routes/maintenance/schedules.js +15 -1
  96. package/addon/routes/maintenance/work-orders/index/details.js +2 -2
  97. package/addon/routes/maintenance/work-orders/index/edit.js +2 -2
  98. package/addon/routes/maintenance/work-orders/index/new.js +14 -1
  99. package/addon/routes/maintenance/work-orders.js +14 -1
  100. package/addon/routes/management/fuel-transactions/index/details.js +9 -0
  101. package/addon/routes/management/fuel-transactions.js +14 -1
  102. package/addon/routes/management/index.js +13 -0
  103. package/addon/routes/management/trailers.js +16 -0
  104. package/addon/routes/management/vendors/integrated/details.js +14 -1
  105. package/addon/routes/management/vendors/integrated/edit.js +14 -1
  106. package/addon/routes/management/vendors/integrated/new.js +14 -1
  107. package/addon/routes/management/vendors/integrated.js +14 -1
  108. package/addon/routes/operations/orders.js +40 -1
  109. package/addon/routes/operations/routes/index/details.js +14 -1
  110. package/addon/routes/operations/routes/index/new.js +13 -0
  111. package/addon/routes/operations/routes.js +14 -1
  112. package/addon/routes/operations/service-rates/index/new.js +11 -0
  113. package/addon/routes/operations/service-rates.js +14 -1
  114. package/addon/routes/settings/avatars.js +14 -1
  115. package/addon/routes/settings/custom-fields.js +14 -1
  116. package/addon/routes/settings/map.js +14 -1
  117. package/addon/routes/settings/notifications.js +11 -0
  118. package/addon/routes/settings/orchestrator.js +1 -1
  119. package/addon/routes/settings/payments/index.js +1 -1
  120. package/addon/routes/settings/routing.js +14 -1
  121. package/addon/routes/settings/scheduling.js +14 -1
  122. package/addon/routes/settings/telematics.js +21 -0
  123. package/addon/routes/virtual.js +11 -0
  124. package/addon/routes.js +1 -0
  125. package/addon/services/contact-actions.js +50 -89
  126. package/addon/services/driver-actions.js +98 -0
  127. package/addon/templates/settings/telematics.hbs +70 -0
  128. package/addon/utils/profile-login-actions.js +172 -0
  129. package/app/components/admin/telematics-settings.js +1 -0
  130. package/app/components/{modals/reset-customer-credentials.js → map/marker-card/driver.js} +1 -1
  131. package/app/components/map/marker-card/vehicle.js +1 -0
  132. package/app/components/modals/reset-profile-credentials.js +1 -0
  133. package/app/components/profile-identity-hint.js +1 -0
  134. package/app/controllers/settings/telematics.js +1 -0
  135. package/app/routes/settings/telematics.js +1 -0
  136. package/app/templates/settings/telematics.js +1 -0
  137. package/composer.json +2 -2
  138. package/docs/AFAQY.md +1 -1
  139. package/docs/TELEMATICS_QUEUES.md +1 -1
  140. package/docs/TELEMETRY_ARCHITECTURE.md +72 -1
  141. package/extension.json +1 -1
  142. package/package.json +3 -3
  143. package/scripts/pest-bootstrap.php +12 -0
  144. package/server/config/telemetry.php +12 -0
  145. package/server/migrations/2026_09_21_000001_convert_profile_only_users_to_managed_accounts.php +132 -0
  146. package/server/migrations/2026_09_23_000001_add_retention_index_to_device_events.php +40 -0
  147. package/server/migrations/2026_09_23_000002_add_retention_index_to_positions.php +40 -0
  148. package/server/migrations/2026_09_23_000003_add_retention_index_to_telematic_sync_runs.php +40 -0
  149. package/server/resources/views/mail/driver-credentials.blade.php +21 -0
  150. package/server/src/Auth/Schemas/FleetOps.php +104 -5
  151. package/server/src/Console/Commands/DrainTelematicInbox.php +3 -13
  152. package/server/src/Console/Commands/FixCustomerCompanies.php +1 -1
  153. package/server/src/Console/Commands/FixDriverCompanies.php +1 -1
  154. package/server/src/Console/Commands/ProcessOperationalAlerts.php +3 -3
  155. package/server/src/Console/Commands/PruneTelematicsData.php +318 -0
  156. package/server/src/Exceptions/ProfileIdentityConflictException.php +34 -0
  157. package/server/src/Http/Controllers/Api/v1/CustomerController.php +14 -0
  158. package/server/src/Http/Controllers/Api/v1/DriverController.php +56 -39
  159. package/server/src/Http/Controllers/Api/v1/OrchestrationController.php +9 -0
  160. package/server/src/Http/Controllers/FleetOpsController.php +21 -0
  161. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +11 -0
  162. package/server/src/Http/Controllers/Internal/v1/ContactController.php +16 -17
  163. package/server/src/Http/Controllers/Internal/v1/CustomerController.php +54 -4
  164. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +13 -0
  165. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +11 -0
  166. package/server/src/Http/Controllers/Internal/v1/DriverController.php +204 -162
  167. package/server/src/Http/Controllers/Internal/v1/FleetOpsLookupController.php +47 -0
  168. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +13 -0
  169. package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +15 -0
  170. package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +9 -3
  171. package/server/src/Http/Controllers/Internal/v1/InspectionFormController.php +15 -0
  172. package/server/src/Http/Controllers/Internal/v1/LiveController.php +16 -0
  173. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +15 -0
  174. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +15 -0
  175. package/server/src/Http/Controllers/Internal/v1/ManifestController.php +15 -0
  176. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +11 -0
  177. package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +42 -1
  178. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +12 -0
  179. package/server/src/Http/Controllers/Internal/v1/OrderController.php +178 -27
  180. package/server/src/Http/Controllers/Internal/v1/PaymentController.php +13 -0
  181. package/server/src/Http/Controllers/Internal/v1/RadarController.php +19 -0
  182. package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +9 -3
  183. package/server/src/Http/Controllers/Internal/v1/SettingController.php +465 -14
  184. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +21 -0
  185. package/server/src/Http/Controllers/Internal/v1/TrailerController.php +21 -0
  186. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +21 -0
  187. package/server/src/Http/Controllers/Internal/v1/VendorController.php +17 -0
  188. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +11 -0
  189. package/server/src/Http/Requests/CreateDriverRequest.php +6 -2
  190. package/server/src/Http/Requests/Internal/CreateDriverRequest.php +9 -18
  191. package/server/src/Http/Resources/v1/Contact.php +3 -0
  192. package/server/src/Http/Resources/v1/Driver.php +3 -0
  193. package/server/src/Jobs/DispatchTelematicsRetentionJobs.php +70 -0
  194. package/server/src/Jobs/PruneTelematicsDataJob.php +74 -0
  195. package/server/src/Listeners/NotifyDriverOnShiftChange.php +3 -3
  196. package/server/src/Mail/CustomerCredentialsMail.php +1 -1
  197. package/server/src/Mail/DriverCredentialsMail.php +55 -0
  198. package/server/src/Models/Contact.php +55 -90
  199. package/server/src/Models/Sensor.php +3 -5
  200. package/server/src/Observers/ContactObserver.php +2 -22
  201. package/server/src/Observers/DriverObserver.php +5 -6
  202. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +9 -1
  203. package/server/src/Providers/FleetOpsServiceProvider.php +18 -0
  204. package/server/src/Support/Ai/Capabilities/AbstractFleetOpsAICapability.php +62 -5
  205. package/server/src/Support/Ai/Capabilities/AssetStatusCapability.php +24 -5
  206. package/server/src/Support/Ai/Capabilities/CreateOrderPreviewCapability.php +6 -2
  207. package/server/src/Support/Ai/Capabilities/OrderInsightsCapability.php +40 -7
  208. package/server/src/Support/Ai/Capabilities/SearchResourcesCapability.php +86 -24
  209. package/server/src/Support/Ai/FleetOpsAiConsoleCommands.php +122 -0
  210. package/server/src/Support/Ai/Tools/CreateOrderTool.php +86 -0
  211. package/server/src/Support/Ai/Tools/ImportOrdersTool.php +53 -0
  212. package/server/src/Support/Ai/Tools/OptimizeOrderRouteTool.php +70 -0
  213. package/server/src/Support/Ai/Tools/SearchResourcesTool.php +73 -0
  214. package/server/src/Support/Analytics/LiveFleet.php +18 -2
  215. package/server/src/Support/Authorization.php +103 -0
  216. package/server/src/Support/Database/TableIndexes.php +66 -0
  217. package/server/src/Support/OrderTracker.php +2 -2
  218. package/server/src/Support/ProfileAccountManager.php +405 -0
  219. package/server/src/Support/Reporting/FleetOpsReportSchema.php +476 -116
  220. package/server/src/Support/Telematics/Retention/RetentionPolicy.php +300 -0
  221. package/server/src/Support/Telematics/Retention/TelemetryActivity.php +40 -0
  222. package/server/src/Support/Telematics/TelematicService.php +12 -2
  223. package/server/src/Support/Telematics/Telemetry/Ingestor.php +4 -2
  224. package/server/src/Tracking/TrackingIntelligenceService.php +1 -1
  225. package/server/src/Tracking/TrackingOptions.php +2 -2
  226. package/server/src/Traits/AuthorizesMethods.php +37 -0
  227. package/server/src/routes.php +14 -1
  228. package/server/tests/AiOperationalQueryCapabilityTest.php +1 -0
  229. package/server/tests/AnalyticsRoutesTest.php +29 -2
  230. package/server/tests/ApiCustomerControllerContractsTest.php +21 -0
  231. package/server/tests/ApiDriverControllerContractsTest.php +102 -20
  232. package/server/tests/CommandContractsTest.php +4 -4
  233. package/server/tests/ControllerHelperContractsTest.php +3 -11
  234. package/server/tests/Feature/Http/AfaqyRealtimeIngestionTest.php +21 -1
  235. package/server/tests/Feature/Http/Api/DriverControllerAuthFlowsTest.php +36 -0
  236. package/server/tests/Feature/Http/Api/DriverControllerSessionHelpersTest.php +19 -6
  237. package/server/tests/Feature/Http/Api/ProfileOnlyUserConversionMigrationTest.php +201 -0
  238. package/server/tests/Feature/Http/Api/TelematicsRetentionIndexMigrationTest.php +115 -0
  239. package/server/tests/Feature/Http/Internal/ContactControllerEndpointsTest.php +6 -4
  240. package/server/tests/Feature/Http/Internal/CustomerControllerCredentialsTest.php +6 -2
  241. package/server/tests/Feature/Http/Internal/DriverControllerContractsTest.php +23 -0
  242. package/server/tests/Feature/Http/Internal/DriverControllerCreateRecordTest.php +42 -17
  243. package/server/tests/Feature/Http/Internal/DriverControllerExistingUserAdoptionTest.php +168 -277
  244. package/server/tests/Feature/Http/Internal/DriverControllerLoginManagementTest.php +716 -0
  245. package/server/tests/Feature/Http/Internal/OrderControllerContractsTest.php +10 -3
  246. package/server/tests/Feature/Http/Internal/OrderControllerImportFromFilesTest.php +18 -0
  247. package/server/tests/Feature/Http/Internal/OrderControllerTenantScopingTest.php +411 -0
  248. package/server/tests/Feature/Http/Internal/OrderControllerUpstreamNotFoundTest.php +8 -20
  249. package/server/tests/Feature/Http/Internal/SettingControllerHelpersTest.php +71 -0
  250. package/server/tests/Feature/Http/Internal/TelematicsStorageDeadlinesTest.php +119 -0
  251. package/server/tests/InternalCustomerControllerContractsTest.php +32 -1
  252. package/server/tests/InternalImportExportControllerContractsTest.php +5 -8
  253. package/server/tests/ModelAccessorContractsTest.php +82 -20
  254. package/server/tests/NavigatorControllerContractsTest.php +36 -4
  255. package/server/tests/NotificationAndMailContractsTest.php +31 -0
  256. package/server/tests/ObserverContractsTest.php +28 -3
  257. package/server/tests/OrchestratorConsumableApiTest.php +42 -0
  258. package/server/tests/ProviderContractsTest.php +10 -0
  259. package/server/tests/ReportSchemaContractsTest.php +120 -6
  260. package/server/tests/RequestContractsTest.php +19 -11
  261. package/server/tests/SettingControllerContractsTest.php +429 -18
  262. package/server/tests/SmallControllerContractsTest.php +8 -5
  263. package/server/tests/Support/PruneTelematicsDataProbe.php +55 -0
  264. package/server/tests/SupportJobAndAiCoverageTest.php +3 -3
  265. package/server/tests/TelematicControllerContractsTest.php +22 -4
  266. package/server/tests/Unit/Console/Commands/ProcessOperationalAlertsCommandTest.php +2 -2
  267. package/server/tests/Unit/Console/PruneTelematicsDataCommandTest.php +353 -0
  268. package/server/tests/Unit/Jobs/DispatchTelematicsRetentionJobsTest.php +114 -0
  269. package/server/tests/Unit/Jobs/PruneTelematicsDataJobTest.php +60 -0
  270. package/server/tests/Unit/Models/ContactCustomerUserTest.php +90 -14
  271. package/server/tests/Unit/Models/ContactTest.php +48 -5
  272. package/server/tests/Unit/Models/SensorTest.php +2 -2
  273. package/server/tests/Unit/Models/SmallModelSurfacesTest.php +31 -32
  274. package/server/tests/Unit/Observers/ObserverListenerSeamsTest.php +7 -2
  275. package/server/tests/Unit/Orchestration/VroomEngineTransportAndSettingsTest.php +20 -0
  276. package/server/tests/Unit/Providers/FleetOpsAiRegistrationTest.php +15 -2
  277. package/server/tests/Unit/Support/Ai/AssetStatusCapabilityQueriesTest.php +42 -0
  278. package/server/tests/Unit/Support/Ai/Capabilities/OrderInsightsCapabilityTest.php +19 -1
  279. package/server/tests/Unit/Support/Ai/Capabilities/SearchResourcesCapabilityTest.php +85 -1
  280. package/server/tests/Unit/Support/Ai/FleetOpsAiConsoleCommandsTest.php +31 -0
  281. package/server/tests/Unit/Support/Ai/Tools/FleetOpsAiToolsTest.php +246 -0
  282. package/server/tests/Unit/Support/AiCapabilityPermissionsTest.php +3 -3
  283. package/server/tests/Unit/Support/Analytics/LiveFleetTest.php +6 -0
  284. package/server/tests/Unit/Support/AuthorizationTest.php +142 -0
  285. package/server/tests/Unit/Support/MaintainableAndOperationalAlertsTest.php +12 -1
  286. package/server/tests/Unit/Support/MoreQuerySeamsTest.php +11 -2
  287. package/server/tests/Unit/Support/ProfileAccountManagerTest.php +643 -0
  288. package/server/tests/Unit/Support/Telematics/Retention/RetentionPolicyTest.php +190 -0
  289. package/server/tests/Unit/Support/Telematics/Retention/TelemetryActivityTest.php +68 -0
  290. package/server/tests/Unit/Tracking/TrackingOptionsCompanySettingsTest.php +109 -0
  291. package/translations/en-us.yaml +85 -2
  292. package/translations/uk-ua.yaml +3475 -0
  293. package/addon/components/modals/reset-customer-credentials.hbs +0 -18
  294. package/addon/components/modals/reset-customer-credentials.js +0 -55
@@ -0,0 +1,40 @@
1
+ <?php
2
+
3
+ use Fleetbase\FleetOps\Support\Database\TableIndexes;
4
+ use Illuminate\Database\Migrations\Migration;
5
+ use Illuminate\Database\Schema\Blueprint;
6
+ use Illuminate\Support\Facades\Schema;
7
+
8
+ /**
9
+ * Supports the bounded retention sweep in fleetops:prune-telematics-data,
10
+ * which ranges over these columns for every company on every run.
11
+ */
12
+ return new class extends Migration {
13
+ private const TABLE = 'positions';
14
+ private const INDEX = 'positions_company_created_at_index';
15
+ private const COLUMNS = ['company_uuid', 'created_at'];
16
+
17
+ public function up(): void
18
+ {
19
+ if (!Schema::hasTable(self::TABLE) || !Schema::hasColumns(self::TABLE, self::COLUMNS)) {
20
+ return;
21
+ }
22
+
23
+ if (TableIndexes::covers(self::TABLE, self::COLUMNS)) {
24
+ return;
25
+ }
26
+
27
+ Schema::table(self::TABLE, fn (Blueprint $table) => $table->index(self::COLUMNS, self::INDEX));
28
+ }
29
+
30
+ public function down(): void
31
+ {
32
+ if (!Schema::hasTable(self::TABLE)) {
33
+ return;
34
+ }
35
+
36
+ if ((TableIndexes::for(self::TABLE)[self::INDEX] ?? null) === self::COLUMNS) {
37
+ Schema::table(self::TABLE, fn (Blueprint $table) => $table->dropIndex(self::INDEX));
38
+ }
39
+ }
40
+ };
@@ -0,0 +1,40 @@
1
+ <?php
2
+
3
+ use Fleetbase\FleetOps\Support\Database\TableIndexes;
4
+ use Illuminate\Database\Migrations\Migration;
5
+ use Illuminate\Database\Schema\Blueprint;
6
+ use Illuminate\Support\Facades\Schema;
7
+
8
+ /**
9
+ * Supports the bounded retention sweep in fleetops:prune-telematics-data,
10
+ * which ranges over these columns for every company on every run.
11
+ */
12
+ return new class extends Migration {
13
+ private const TABLE = 'telematic_sync_runs';
14
+ private const INDEX = 'telematic_sync_runs_telematic_updated_at_index';
15
+ private const COLUMNS = ['telematic_uuid', 'updated_at'];
16
+
17
+ public function up(): void
18
+ {
19
+ if (!Schema::hasTable(self::TABLE) || !Schema::hasColumns(self::TABLE, self::COLUMNS)) {
20
+ return;
21
+ }
22
+
23
+ if (TableIndexes::covers(self::TABLE, self::COLUMNS)) {
24
+ return;
25
+ }
26
+
27
+ Schema::table(self::TABLE, fn (Blueprint $table) => $table->index(self::COLUMNS, self::INDEX));
28
+ }
29
+
30
+ public function down(): void
31
+ {
32
+ if (!Schema::hasTable(self::TABLE)) {
33
+ return;
34
+ }
35
+
36
+ if ((TableIndexes::for(self::TABLE)[self::INDEX] ?? null) === self::COLUMNS) {
37
+ Schema::table(self::TABLE, fn (Blueprint $table) => $table->dropIndex(self::INDEX));
38
+ }
39
+ }
40
+ };
@@ -0,0 +1,21 @@
1
+ <x-mail-layout>
2
+ <h2 style="font-size: 18px; font-weight: 600;">
3
+ Your driver sign-in details
4
+ </h2>
5
+
6
+ Hi {{ $user->name }},
7
+ <br />
8
+ <br />
9
+ {{ $companyName }} has set up your driver account. Use these details to sign in to the driver app.
10
+ <br />
11
+ <br />
12
+ <strong>Your sign-in details</strong>
13
+ <br />
14
+ Login: {{ $identity }}
15
+ <br />
16
+ Temporary password: {{ $plaintextPassword }}
17
+ <br />
18
+ <br />
19
+ You can change your password after signing in.
20
+
21
+ </x-mail-layout>
@@ -43,7 +43,7 @@ class FleetOps
43
43
  ],
44
44
  [
45
45
  'name' => 'service-rate',
46
- 'actions' => ['import'],
46
+ 'actions' => ['import', 'export'],
47
47
  ],
48
48
  [
49
49
  'name' => 'zone',
@@ -141,6 +141,51 @@ class FleetOps
141
141
  'name' => 'part',
142
142
  'actions' => ['export', 'import'],
143
143
  ],
144
+ [
145
+ 'name' => 'maintenance-schedule',
146
+ 'actions' => ['export', 'import'],
147
+ ],
148
+ [
149
+ 'name' => 'warranty',
150
+ 'actions' => [],
151
+ ],
152
+ [
153
+ 'name' => 'device',
154
+ 'actions' => ['export', 'import'],
155
+ ],
156
+ [
157
+ 'name' => 'sensor',
158
+ 'actions' => ['export', 'import'],
159
+ ],
160
+ [
161
+ 'name' => 'device-event',
162
+ 'actions' => ['export'],
163
+ ],
164
+ [
165
+ 'name' => 'telematic',
166
+ 'actions' => ['export', 'import'],
167
+ ],
168
+ [
169
+ 'name' => 'fuel-provider-connection',
170
+ 'actions' => ['sync'],
171
+ ],
172
+ [
173
+ 'name' => 'fuel-provider-transaction',
174
+ 'actions' => ['review'],
175
+ ],
176
+ [
177
+ 'name' => 'fuel-provider-sync-run',
178
+ 'actions' => [],
179
+ ],
180
+ [
181
+ 'name' => 'purchase-rate',
182
+ 'actions' => [],
183
+ ],
184
+ [
185
+ 'name' => 'analytics', // dashboards, KPI metrics and the live fleet summary
186
+ 'actions' => [],
187
+ 'remove_actions' => ['create', 'update', 'delete', 'export'],
188
+ ],
144
189
  [
145
190
  'name' => 'custom-field',
146
191
  'actions' => [],
@@ -151,26 +196,41 @@ class FleetOps
151
196
  ],
152
197
  [
153
198
  'name' => 'navigator-settings', // the navigator mobile app used by drivers
154
- 'action' => [],
199
+ 'actions' => [],
155
200
  'remove_actions' => ['delete', 'export', 'list', 'create'],
156
201
  ],
157
202
  [
158
203
  'name' => 'payments',
159
- 'action' => ['onboard'],
204
+ 'actions' => ['onboard'],
160
205
  'remove_actions' => ['delete', 'export', 'list', 'create'],
161
206
  ],
162
207
  [
163
208
  'name' => 'notification-settings',
164
- 'action' => [],
209
+ 'actions' => [],
165
210
  'remove_actions' => ['export', 'create'],
166
211
  ],
167
212
  [
168
213
  'name' => 'routing-settings',
169
- 'action' => [],
214
+ 'actions' => [],
170
215
  'remove_actions' => ['export', 'create'],
171
216
  ],
172
217
  [
173
218
  'name' => 'map-settings',
219
+ 'actions' => [],
220
+ 'remove_actions' => ['export', 'create'],
221
+ ],
222
+ [
223
+ 'name' => 'scheduling-settings',
224
+ 'actions' => [],
225
+ 'remove_actions' => ['delete', 'export', 'create'],
226
+ ],
227
+ [
228
+ 'name' => 'tracking-settings',
229
+ 'actions' => [],
230
+ 'remove_actions' => ['delete', 'export', 'create'],
231
+ ],
232
+ [
233
+ 'name' => 'telematics-settings', // organization device event and position history preferences
174
234
  'action' => [],
175
235
  'remove_actions' => ['export', 'create'],
176
236
  ],
@@ -187,6 +247,9 @@ class FleetOps
187
247
  'see extension',
188
248
  '* order',
189
249
  '* route',
250
+ 'see analytics',
251
+ 'list analytics',
252
+ 'view analytics',
190
253
  'see order-config',
191
254
  'list order-config',
192
255
  'view order-config',
@@ -230,6 +293,12 @@ class FleetOps
230
293
  '* driver',
231
294
  '* vehicle',
232
295
  '* trailer',
296
+ '* device',
297
+ '* sensor',
298
+ '* telematic',
299
+ 'see device-event',
300
+ 'list device-event',
301
+ 'view device-event',
233
302
  ],
234
303
  ],
235
304
  [
@@ -277,6 +346,7 @@ class FleetOps
277
346
  'permissions' => [
278
347
  'see extension',
279
348
  '* service-rate',
349
+ '* purchase-rate',
280
350
  'see order',
281
351
  'list order',
282
352
  'see service-area',
@@ -309,6 +379,8 @@ class FleetOps
309
379
  '* inspection-submission',
310
380
  '* equipment',
311
381
  '* part',
382
+ '* maintenance-schedule',
383
+ '* warranty',
312
384
  '* trailer',
313
385
  'see vehicle',
314
386
  'list vehicle',
@@ -336,6 +408,18 @@ class FleetOps
336
408
  '* inspection-submission',
337
409
  '* equipment',
338
410
  '* part',
411
+ '* maintenance-schedule',
412
+ '* warranty',
413
+ '* device',
414
+ '* sensor',
415
+ '* device-event',
416
+ '* telematic',
417
+ '* fuel-provider-connection',
418
+ '* fuel-provider-transaction',
419
+ '* fuel-provider-sync-run',
420
+ 'see analytics',
421
+ 'list analytics',
422
+ 'view analytics',
339
423
  '* trailer',
340
424
  ],
341
425
  ],
@@ -353,6 +437,14 @@ class FleetOps
353
437
  'list vehicle',
354
438
  ],
355
439
  ],
440
+ [
441
+ 'name' => 'TelematicsSettingsManager',
442
+ 'description' => 'Policy for managing organization telematics history preferences.',
443
+ 'permissions' => [
444
+ 'see extension',
445
+ '* telematics-settings',
446
+ ],
447
+ ],
356
448
  [
357
449
  'name' => 'DriverOperations',
358
450
  'description' => 'Policy for drivers to manage their assigned tasks and access necessary information.',
@@ -453,6 +545,13 @@ class FleetOps
453
545
  'NavigatorSettingsManager',
454
546
  ],
455
547
  ],
548
+ [
549
+ 'name' => 'Telematics Settings Manager',
550
+ 'description' => 'Role responsible for managing organization telematics history preferences.',
551
+ 'policies' => [
552
+ 'TelematicsSettingsManager',
553
+ ],
554
+ ],
456
555
  [
457
556
  'name' => 'Driver',
458
557
  'description' => 'Role for drivers with the necessary access to manage their daily tasks, including order management, and vehicle assignment.',
@@ -16,7 +16,7 @@ use Illuminate\Support\Facades\Log;
16
16
  class DrainTelematicInbox extends Command
17
17
  {
18
18
  protected $signature = 'fleetops:drain-telematic-inbox';
19
- protected $description = 'Recover pending telematic deliveries and expire retained payloads.';
19
+ protected $description = 'Recover pending telematic deliveries and finish interrupted sync runs.';
20
20
 
21
21
  public function handle(): int
22
22
  {
@@ -58,24 +58,14 @@ class DrainTelematicInbox extends Command
58
58
  try {
59
59
  Queue::dispatch((new ProcessTelematicDelivery($row->uuid))->onQueue($optionsByConnection[$row->telematic_uuid]['ingestion_queue'] ?? 'default'));
60
60
  } catch (\Throwable) {
61
- // A broker outage must not prevent retention cleanup; retry the next minute.
61
+ // A broker outage must not prevent run recovery; retry the next minute.
62
62
  break;
63
63
  }
64
64
  }
65
- // Bound deletes so retention cleanup cannot monopolize the inbox table.
66
- foreach (['processed' => now()->subHours(config('telematics.telemetry.processed_retention_hours', 24)), 'quarantined' => now()->subDays(config('telematics.telemetry.quarantine_retention_days', 7))] as $status => $cutoff) {
67
- for ($batch = 0; $batch < 20; $batch++) {
68
- $ids = DB::table('telematic_deliveries')->where('status', $status)->where('updated_at', '<', $cutoff)->limit(1000)->pluck('uuid');
69
- if ($ids->isEmpty()) {
70
- break;
71
- }
72
- DB::table('telematic_deliveries')->whereIn('uuid', $ids)->delete();
73
- }
74
- }
65
+ // Retention for deliveries and sync runs is applied by fleetops:prune-telematics-data.
75
66
  DB::table('telematic_sync_runs')->where('status', 'fetching')->where('updated_at', '<', now()->subMinutes(5))
76
67
  ->update(['status' => 'incomplete', 'error' => 'Worker interrupted; next scheduled sweep will recover.']);
77
68
  DB::table('telematic_sync_runs')->where('status', 'ingesting')->get(['uuid'])->each(fn ($run) => Inbox::finishRun($run->uuid));
78
- DB::table('telematic_sync_runs')->where('updated_at', '<', now()->subDays(7))->delete();
79
69
 
80
70
  return self::SUCCESS;
81
71
  }
@@ -68,7 +68,7 @@ class FixCustomerCompanies extends Command
68
68
  $this->line('Found user ' . $user->name . ' (' . $user->email . ') which doesnt have correct company assignment.');
69
69
  $company = $this->companyByUuid($customer->company_uuid);
70
70
  if ($company) {
71
- $user->assignCompany($company);
71
+ $user->assignCompany($company, 'Fleet-Ops Customer');
72
72
  $this->line('User ' . $user->email . ' was assigned to company: ' . $company->name);
73
73
  }
74
74
  }
@@ -49,7 +49,7 @@ class FixDriverCompanies extends Command
49
49
  $this->line('Found driver ' . $user->name . ' (' . $user->email . ') which doesnt have correct company assignment.');
50
50
  $company = $this->companyByUuid($driver->company_uuid);
51
51
  if ($company) {
52
- $user->assignCompany($company);
52
+ $user->assignCompany($company, 'Driver');
53
53
  $this->line('Driver ' . $user->email . ' was assigned to company: ' . $company->name);
54
54
  }
55
55
  }
@@ -60,7 +60,7 @@ class ProcessOperationalAlerts extends Command
60
60
 
61
61
  foreach ($orders as $order) {
62
62
  session(['company' => $order->company_uuid]);
63
- $settings = $this->alertSettings();
63
+ $settings = $this->alertSettings($order);
64
64
 
65
65
  if ($this->processLateDeparture($order, $settings, $dryRun)) {
66
66
  $triggered++;
@@ -256,9 +256,9 @@ class ProcessOperationalAlerts extends Command
256
256
  ->min() ?? 0;
257
257
  }
258
258
 
259
- protected function alertSettings(): array
259
+ protected function alertSettings(Order $order): array
260
260
  {
261
- $settings = Setting::lookupCompany('tracking', []);
261
+ $settings = Setting::lookupForCompany($order->company_uuid, 'tracking', []);
262
262
  $alerts = data_get($settings, 'alerts', []);
263
263
 
264
264
  return [