@fleetbase/fleetops-engine 0.6.64 → 0.6.66

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 (1247) hide show
  1. package/RELEASE.md +12 -5
  2. package/addon/components/ai/create-order-preview.hbs +10 -5
  3. package/addon/components/asset/pill.hbs +24 -0
  4. package/addon/components/asset/summary.hbs +1 -0
  5. package/addon/components/asset-connection/pill.hbs +24 -0
  6. package/addon/components/asset-connection/summary.hbs +1 -0
  7. package/addon/components/attachable/pill.hbs +24 -0
  8. package/addon/components/attachable/summary.hbs +1 -0
  9. package/addon/components/attachment-list.hbs +65 -0
  10. package/addon/components/attachment-list.js +8 -0
  11. package/addon/components/cell/asset-connection-identity.hbs +1 -0
  12. package/addon/components/cell/asset-identity.hbs +1 -0
  13. package/addon/components/cell/attachable-identity.hbs +1 -0
  14. package/addon/components/cell/contact-identity.hbs +1 -0
  15. package/addon/components/cell/customer-identity.hbs +1 -0
  16. package/addon/components/cell/device-event-identity.hbs +1 -0
  17. package/addon/components/cell/device-identity.hbs +1 -24
  18. package/addon/components/cell/driver-identity.hbs +1 -33
  19. package/addon/components/cell/entity-identity.hbs +1 -0
  20. package/addon/components/cell/equipment-identity.hbs +1 -5
  21. package/addon/components/cell/facilitator-identity.hbs +1 -0
  22. package/addon/components/cell/fleet-driver-identity.hbs +1 -0
  23. package/addon/components/cell/fleet-identity.hbs +1 -0
  24. package/addon/components/cell/fuel-provider-connection-identity.hbs +1 -0
  25. package/addon/components/cell/fuel-provider-transaction-identity.hbs +1 -0
  26. package/addon/components/cell/fuel-report-identity.hbs +1 -0
  27. package/addon/components/cell/inspection-form-identity.hbs +1 -0
  28. package/addon/components/cell/inspection-item-result-identity.hbs +1 -0
  29. package/addon/components/cell/inspection-submission-identity.hbs +1 -0
  30. package/addon/components/cell/integrated-vendor-identity.hbs +1 -0
  31. package/addon/components/cell/issue-identity.hbs +1 -0
  32. package/addon/components/cell/maintenance-identity.hbs +1 -0
  33. package/addon/components/cell/maintenance-schedule-identity.hbs +1 -0
  34. package/addon/components/cell/maintenance-subject-identity.hbs +1 -0
  35. package/addon/components/cell/manifest-identity.hbs +1 -0
  36. package/addon/components/cell/manifest-stop-identity.hbs +1 -0
  37. package/addon/components/cell/order-config-identity.hbs +1 -0
  38. package/addon/components/cell/order-identity.hbs +1 -0
  39. package/addon/components/cell/part-identity.hbs +1 -5
  40. package/addon/components/cell/payload-identity.hbs +1 -0
  41. package/addon/components/cell/place-identity.hbs +1 -0
  42. package/addon/components/cell/position-identity.hbs +1 -0
  43. package/addon/components/cell/purchase-rate-identity.hbs +1 -0
  44. package/addon/components/cell/recurring-order-schedule-identity.hbs +1 -0
  45. package/addon/components/cell/resource-list.hbs +10 -0
  46. package/addon/components/cell/resource-list.js +28 -0
  47. package/addon/components/cell/route-identity.hbs +1 -0
  48. package/addon/components/cell/sensor-identity.hbs +1 -0
  49. package/addon/components/cell/service-area-identity.hbs +1 -0
  50. package/addon/components/cell/service-quote-identity.hbs +1 -0
  51. package/addon/components/cell/service-quote-item-identity.hbs +1 -0
  52. package/addon/components/cell/service-rate-fee-identity.hbs +1 -0
  53. package/addon/components/cell/service-rate-identity.hbs +1 -0
  54. package/addon/components/cell/service-rate-parcel-fee-identity.hbs +1 -0
  55. package/addon/components/cell/telematic-identity.hbs +1 -0
  56. package/addon/components/cell/tracking-number-identity.hbs +1 -0
  57. package/addon/components/cell/tracking-status-identity.hbs +1 -0
  58. package/addon/components/cell/trailer-identity.hbs +1 -0
  59. package/addon/components/cell/translated-value.hbs +9 -0
  60. package/addon/components/cell/translated-value.js +57 -0
  61. package/addon/components/cell/vehicle-device-identity.hbs +1 -0
  62. package/addon/components/cell/vehicle-identity.hbs +1 -33
  63. package/addon/components/cell/vendor-identity.hbs +1 -0
  64. package/addon/components/cell/warranty-identity.hbs +1 -0
  65. package/addon/components/cell/waypoint-identity.hbs +1 -0
  66. package/addon/components/cell/work-order-identity.hbs +1 -0
  67. package/addon/components/cell/zone-identity.hbs +1 -0
  68. package/addon/components/contact/card.hbs +58 -0
  69. package/addon/components/contact/card.js +19 -0
  70. package/addon/components/contact/form.hbs +3 -5
  71. package/addon/components/contact/panel-header.hbs +1 -1
  72. package/addon/components/contact/pill.hbs +24 -0
  73. package/addon/components/contact/summary.hbs +1 -0
  74. package/addon/components/customer/create-order-form.hbs +8 -4
  75. package/addon/components/customer/form.hbs +4 -6
  76. package/addon/components/customer/order-form.hbs +10 -8
  77. package/addon/components/customer/pill.hbs +24 -0
  78. package/addon/components/customer/summary.hbs +1 -0
  79. package/addon/components/device/details.hbs +3 -1
  80. package/addon/components/device/form.hbs +4 -13
  81. package/addon/components/device/manager.hbs +26 -28
  82. package/addon/components/device/manager.js +28 -2
  83. package/addon/components/device/panel-header.hbs +3 -2
  84. package/addon/components/device/panel-header.js +1 -5
  85. package/addon/components/device/panel-tabs/vehicle.hbs +15 -15
  86. package/addon/components/device/panel-tabs/vehicle.js +8 -0
  87. package/addon/components/device/pill.hbs +24 -16
  88. package/addon/components/device/summary.hbs +1 -0
  89. package/addon/components/device/telemetry.hbs +17 -0
  90. package/addon/components/device/telemetry.js +117 -0
  91. package/addon/components/device-event/details.hbs +6 -24
  92. package/addon/components/device-event/pill.hbs +24 -0
  93. package/addon/components/device-event/summary.hbs +1 -0
  94. package/addon/components/driver/card.hbs +24 -13
  95. package/addon/components/driver/card.js +20 -6
  96. package/addon/components/driver/details.hbs +9 -1
  97. package/addon/components/driver/form.hbs +8 -20
  98. package/addon/components/driver/panel-header.hbs +5 -6
  99. package/addon/components/driver/panel-header.js +8 -1
  100. package/addon/components/driver/pill.hbs +16 -8
  101. package/addon/components/driver/summary.hbs +1 -0
  102. package/addon/components/entity/pill.hbs +24 -0
  103. package/addon/components/entity/summary.hbs +1 -0
  104. package/addon/components/equipment/details.hbs +6 -2
  105. package/addon/components/equipment/form.hbs +10 -4
  106. package/addon/components/equipment/form.js +11 -4
  107. package/addon/components/equipment/pill.hbs +24 -0
  108. package/addon/components/equipment/summary.hbs +1 -0
  109. package/addon/components/facilitator/pill.hbs +24 -0
  110. package/addon/components/facilitator/summary.hbs +1 -0
  111. package/addon/components/fleet/details.hbs +6 -2
  112. package/addon/components/fleet/driver-listing.hbs +3 -12
  113. package/addon/components/fleet/form.hbs +8 -4
  114. package/addon/components/fleet/pill.hbs +24 -0
  115. package/addon/components/fleet/summary.hbs +1 -0
  116. package/addon/components/fleet/vehicle-listing.hbs +3 -12
  117. package/addon/components/fleet-driver/pill.hbs +24 -0
  118. package/addon/components/fleet-driver/summary.hbs +1 -0
  119. package/addon/components/fleet-driver-listing.hbs +2 -1
  120. package/addon/components/fleet-panel/details.hbs +6 -2
  121. package/addon/components/fleet-panel/driver-listing.hbs +3 -2
  122. package/addon/components/fleet-panel/vehicle-listing.hbs +3 -2
  123. package/addon/components/fleet-vehicle-listing.hbs +2 -1
  124. package/addon/components/fuel-integration/form.hbs +125 -25
  125. package/addon/components/fuel-integration/form.js +74 -19
  126. package/addon/components/fuel-integration/hub.hbs +68 -65
  127. package/addon/components/fuel-integration/hub.js +15 -19
  128. package/addon/components/fuel-provider-connection/pill.hbs +24 -0
  129. package/addon/components/fuel-provider-connection/summary.hbs +1 -0
  130. package/addon/components/fuel-provider-transaction/pill.hbs +24 -0
  131. package/addon/components/fuel-provider-transaction/summary.hbs +1 -0
  132. package/addon/components/fuel-report/details.hbs +9 -3
  133. package/addon/components/fuel-report/form.hbs +6 -3
  134. package/addon/components/fuel-report/pill.hbs +24 -0
  135. package/addon/components/fuel-report/summary.hbs +1 -0
  136. package/addon/components/fuel-transaction-status.hbs +1 -0
  137. package/addon/components/fuel-transaction-status.js +8 -0
  138. package/addon/components/geofence-map.hbs +19 -0
  139. package/addon/components/geofence-map.js +83 -0
  140. package/addon/components/inspection-field/form.hbs +103 -0
  141. package/addon/components/inspection-field/form.js +211 -0
  142. package/addon/components/inspection-field/input.hbs +270 -0
  143. package/addon/components/inspection-field/input.js +472 -0
  144. package/addon/components/inspection-field/value.hbs +90 -0
  145. package/addon/components/inspection-field/value.js +158 -0
  146. package/addon/components/inspection-flyout.hbs +34 -0
  147. package/addon/components/inspection-flyout.js +66 -0
  148. package/addon/components/inspection-form/builder.hbs +88 -0
  149. package/addon/components/inspection-form/builder.js +211 -0
  150. package/addon/components/inspection-form/details/submissions.hbs +48 -0
  151. package/addon/components/inspection-form/details/submissions.js +42 -0
  152. package/addon/components/inspection-form/details.hbs +97 -0
  153. package/addon/components/inspection-form/details.js +57 -0
  154. package/addon/components/inspection-form/form.hbs +93 -0
  155. package/addon/components/inspection-form/form.js +79 -0
  156. package/addon/components/inspection-form/pill.hbs +24 -0
  157. package/addon/components/inspection-form/summary.hbs +1 -0
  158. package/addon/components/inspection-item-result/pill.hbs +24 -0
  159. package/addon/components/inspection-item-result/summary.hbs +1 -0
  160. package/addon/components/inspection-link/list.hbs +94 -0
  161. package/addon/components/inspection-link/list.js +129 -0
  162. package/addon/components/inspection-sheet/group.hbs +45 -0
  163. package/addon/components/inspection-sheet/group.js +75 -0
  164. package/addon/components/inspection-sheet.hbs +77 -0
  165. package/addon/components/inspection-sheet.js +152 -0
  166. package/addon/components/inspection-submission/details.hbs +149 -0
  167. package/addon/components/inspection-submission/details.js +130 -0
  168. package/addon/components/inspection-submission/form.hbs +114 -0
  169. package/addon/components/inspection-submission/form.js +129 -0
  170. package/addon/components/inspection-submission/photos.hbs +20 -0
  171. package/addon/components/inspection-submission/photos.js +57 -0
  172. package/addon/components/inspection-submission/pill.hbs +24 -0
  173. package/addon/components/inspection-submission/summary.hbs +1 -0
  174. package/addon/components/integrated-vendor/pill.hbs +24 -0
  175. package/addon/components/integrated-vendor/summary.hbs +1 -0
  176. package/addon/components/issue/details.hbs +12 -0
  177. package/addon/components/issue/details.js +36 -0
  178. package/addon/components/issue/form.hbs +10 -5
  179. package/addon/components/issue/pill.hbs +24 -0
  180. package/addon/components/issue/summary.hbs +1 -0
  181. package/addon/components/layout/fleet-ops-sidebar.js +23 -10
  182. package/addon/components/maintenance/details.hbs +9 -3
  183. package/addon/components/maintenance/form.hbs +22 -3
  184. package/addon/components/maintenance/form.js +16 -8
  185. package/addon/components/maintenance/panel-header.hbs +14 -12
  186. package/addon/components/maintenance/pill.hbs +24 -0
  187. package/addon/components/maintenance/summary.hbs +1 -0
  188. package/addon/components/maintenance-schedule/details.hbs +7 -3
  189. package/addon/components/maintenance-schedule/form.hbs +20 -2
  190. package/addon/components/maintenance-schedule/form.js +19 -13
  191. package/addon/components/maintenance-schedule/pill.hbs +24 -0
  192. package/addon/components/maintenance-schedule/summary.hbs +1 -0
  193. package/addon/components/maintenance-schedule/work-orders.hbs +39 -0
  194. package/addon/components/maintenance-schedule/work-orders.js +37 -0
  195. package/addon/components/maintenance-subject/pill.hbs +24 -0
  196. package/addon/components/maintenance-subject/summary.hbs +1 -0
  197. package/addon/components/manifest/pill.hbs +24 -0
  198. package/addon/components/manifest/summary.hbs +1 -0
  199. package/addon/components/manifest-stop/pill.hbs +24 -0
  200. package/addon/components/manifest-stop/summary.hbs +1 -0
  201. package/addon/components/map/drawer/device-event-listing.hbs +4 -14
  202. package/addon/components/map/drawer/device-event-listing.js +3 -1
  203. package/addon/components/map/drawer/driver-listing.js +6 -2
  204. package/addon/components/map/drawer/position-listing.hbs +2 -16
  205. package/addon/components/map/drawer/vehicle-listing.js +1 -2
  206. package/addon/components/map/leaflet-live-map.hbs +52 -0
  207. package/addon/components/map/order-list-overlay/order.hbs +4 -4
  208. package/addon/components/modals/add-driver-shift.hbs +2 -1
  209. package/addon/components/modals/assign-driver.hbs +2 -16
  210. package/addon/components/modals/attach-device.hbs +2 -1
  211. package/addon/components/modals/attach-equipment.hbs +20 -0
  212. package/addon/components/modals/attach-equipment.js +3 -0
  213. package/addon/components/modals/attach-telematic-device.hbs +20 -8
  214. package/addon/components/modals/attach-telematic-device.js +11 -1
  215. package/addon/components/modals/attach-trailer.hbs +31 -0
  216. package/addon/components/modals/attach-trailer.js +3 -0
  217. package/addon/components/modals/bulk-assign-driver.hbs +2 -9
  218. package/addon/components/modals/bulk-assign-orders.hbs +2 -9
  219. package/addon/components/modals/contact-form.hbs +2 -2
  220. package/addon/components/modals/convert-customer-to-vendor.hbs +1 -1
  221. package/addon/components/modals/driver-assign-order.hbs +2 -6
  222. package/addon/components/modals/driver-assign-vehicle.hbs +4 -12
  223. package/addon/components/modals/driver-assign-vehicle.js +30 -0
  224. package/addon/components/modals/driver-assign-vendor.hbs +2 -1
  225. package/addon/components/modals/driver-form.hbs +6 -4
  226. package/addon/components/modals/fleet-assign-driver.hbs +2 -1
  227. package/addon/components/modals/fleet-assign-vehicle.hbs +2 -1
  228. package/addon/components/modals/fleet-form.hbs +4 -2
  229. package/addon/components/modals/fuel-connection-diagnostics.hbs +35 -0
  230. package/addon/components/modals/fuel-connection-diagnostics.js +87 -0
  231. package/addon/components/modals/fuel-report-form.hbs +4 -2
  232. package/addon/components/modals/fuel-transaction-action.hbs +48 -0
  233. package/addon/components/modals/fuel-transaction-action.js +98 -0
  234. package/addon/components/modals/group-form.hbs +2 -1
  235. package/addon/components/modals/inspection-follow-up.hbs +31 -0
  236. package/addon/components/modals/inspection-follow-up.js +39 -0
  237. package/addon/components/modals/inspection-link.hbs +100 -0
  238. package/addon/components/modals/inspection-link.js +83 -0
  239. package/addon/components/modals/issue-assign.hbs +2 -1
  240. package/addon/components/modals/issue-from.hbs +8 -4
  241. package/addon/components/modals/map-layer-form.hbs +2 -1
  242. package/addon/components/modals/order-assign-driver.hbs +2 -16
  243. package/addon/components/modals/order-form.hbs +8 -46
  244. package/addon/components/modals/order-route-form.hbs +8 -4
  245. package/addon/components/modals/place-assign-vendor.hbs +3 -2
  246. package/addon/components/modals/place-details.hbs +1 -1
  247. package/addon/components/modals/point-map.hbs +1 -1
  248. package/addon/components/modals/radar-notice.hbs +24 -0
  249. package/addon/components/modals/radar-notice.js +8 -0
  250. package/addon/components/modals/radar-save-view.hbs +7 -0
  251. package/addon/components/modals/radar-select-resource.hbs +35 -0
  252. package/addon/components/modals/radar-send-pin.hbs +20 -0
  253. package/addon/components/modals/radar-send-pin.js +8 -0
  254. package/addon/components/modals/select-trailer.hbs +33 -0
  255. package/addon/components/modals/select-trailer.js +3 -0
  256. package/addon/components/modals/vehicle-form.hbs +4 -3
  257. package/addon/components/modals/vendor-form.hbs +2 -3
  258. package/addon/components/orchestrator/resource-panel.hbs +2 -2
  259. package/addon/components/order/customer-avatar-stack.hbs +2 -2
  260. package/addon/components/order/details/activity.js +9 -0
  261. package/addon/components/order/details/detail.hbs +2 -32
  262. package/addon/components/order/details/payload.hbs +2 -2
  263. package/addon/components/order/form/details.hbs +10 -48
  264. package/addon/components/order/form/route.hbs +10 -12
  265. package/addon/components/order/form/service-rate.hbs +2 -3
  266. package/addon/components/order/kanban-card.hbs +4 -4
  267. package/addon/components/order/pill.hbs +24 -34
  268. package/addon/components/order/route-editor.hbs +8 -4
  269. package/addon/components/order/schedule-card.hbs +2 -1
  270. package/addon/components/order/summary.hbs +1 -0
  271. package/addon/components/order-config/pill.hbs +24 -0
  272. package/addon/components/order-config/summary.hbs +1 -0
  273. package/addon/components/order-list-overlay/order.hbs +4 -4
  274. package/addon/components/part/details.hbs +15 -3
  275. package/addon/components/part/details.js +37 -1
  276. package/addon/components/part/form.hbs +12 -5
  277. package/addon/components/part/pill.hbs +24 -0
  278. package/addon/components/part/summary.hbs +1 -0
  279. package/addon/components/payload/pill.hbs +24 -0
  280. package/addon/components/payload/summary.hbs +1 -0
  281. package/addon/components/place/details.hbs +1 -1
  282. package/addon/components/place/pill.hbs +24 -0
  283. package/addon/components/place/summary.hbs +1 -0
  284. package/addon/components/position/pill.hbs +24 -0
  285. package/addon/components/position/summary.hbs +1 -0
  286. package/addon/components/positions-replay.hbs +2 -4
  287. package/addon/components/public-inspection.hbs +174 -0
  288. package/addon/components/public-inspection.js +279 -0
  289. package/addon/components/purchase-rate/pill.hbs +24 -0
  290. package/addon/components/purchase-rate/summary.hbs +1 -0
  291. package/addon/components/radar/agenda/entry.hbs +17 -0
  292. package/addon/components/radar/agenda/entry.js +26 -0
  293. package/addon/components/radar/agenda/lane.hbs +33 -0
  294. package/addon/components/radar/agenda/lane.js +80 -0
  295. package/addon/components/radar/agenda.hbs +69 -0
  296. package/addon/components/radar/agenda.js +29 -0
  297. package/addon/components/radar/briefing.hbs +108 -0
  298. package/addon/components/radar/briefing.js +43 -0
  299. package/addon/components/radar/bulk-bar.hbs +41 -0
  300. package/addon/components/radar/bulk-bar.js +32 -0
  301. package/addon/components/radar/decision-card.hbs +28 -0
  302. package/addon/components/radar/decision-card.js +7 -0
  303. package/addon/components/radar/empty-state.hbs +30 -0
  304. package/addon/components/radar/empty-state.js +27 -0
  305. package/addon/components/radar/filter-pills.hbs +22 -0
  306. package/addon/components/radar/filter-pills.js +3 -0
  307. package/addon/components/radar/handover-card.hbs +62 -0
  308. package/addon/components/radar/handover-card.js +14 -0
  309. package/addon/components/radar/header.hbs +28 -0
  310. package/addon/components/radar/header.js +12 -0
  311. package/addon/components/radar/item-drawer.hbs +92 -0
  312. package/addon/components/radar/item-drawer.js +37 -0
  313. package/addon/components/radar/item-list.hbs +20 -0
  314. package/addon/components/radar/item-list.js +3 -0
  315. package/addon/components/radar/item-row.hbs +90 -0
  316. package/addon/components/radar/item-row.js +43 -0
  317. package/addon/components/radar/keyboard-hints.hbs +8 -0
  318. package/addon/components/radar/keyboard-hints.js +3 -0
  319. package/addon/components/radar/subject.hbs +14 -0
  320. package/addon/components/radar/subject.js +26 -0
  321. package/addon/components/radar/view-bar.hbs +27 -0
  322. package/addon/components/radar/view-bar.js +16 -0
  323. package/addon/components/recurring-order-schedule/pill.hbs +24 -0
  324. package/addon/components/recurring-order-schedule/summary.hbs +1 -0
  325. package/addon/components/resource-activity.hbs +1 -0
  326. package/addon/components/resource-activity.js +4 -0
  327. package/addon/components/route/pill.hbs +24 -0
  328. package/addon/components/route/summary.hbs +1 -0
  329. package/addon/components/select-option/asset-connection.hbs +12 -0
  330. package/addon/components/select-option/asset.hbs +12 -0
  331. package/addon/components/select-option/attachable.hbs +12 -0
  332. package/addon/components/select-option/contact.hbs +12 -0
  333. package/addon/components/select-option/customer.hbs +12 -0
  334. package/addon/components/select-option/device-event.hbs +12 -0
  335. package/addon/components/select-option/device.hbs +12 -0
  336. package/addon/components/select-option/driver.hbs +12 -0
  337. package/addon/components/select-option/entity.hbs +12 -0
  338. package/addon/components/select-option/equipment.hbs +12 -0
  339. package/addon/components/select-option/facilitator.hbs +12 -0
  340. package/addon/components/select-option/fleet-driver.hbs +12 -0
  341. package/addon/components/select-option/fleet.hbs +12 -0
  342. package/addon/components/select-option/fuel-provider-connection.hbs +12 -0
  343. package/addon/components/select-option/fuel-provider-transaction.hbs +12 -0
  344. package/addon/components/select-option/fuel-report.hbs +12 -0
  345. package/addon/components/select-option/inspection-form.hbs +12 -0
  346. package/addon/components/select-option/inspection-item-result.hbs +12 -0
  347. package/addon/components/select-option/inspection-submission.hbs +12 -0
  348. package/addon/components/select-option/integrated-vendor.hbs +12 -0
  349. package/addon/components/select-option/issue.hbs +12 -0
  350. package/addon/components/select-option/maintenance-schedule.hbs +12 -0
  351. package/addon/components/select-option/maintenance-subject.hbs +12 -0
  352. package/addon/components/select-option/maintenance.hbs +12 -0
  353. package/addon/components/select-option/manifest-stop.hbs +12 -0
  354. package/addon/components/select-option/manifest.hbs +12 -0
  355. package/addon/components/select-option/order-config.hbs +12 -0
  356. package/addon/components/select-option/order.hbs +12 -0
  357. package/addon/components/select-option/part.hbs +12 -0
  358. package/addon/components/select-option/payload.hbs +12 -0
  359. package/addon/components/select-option/place.hbs +12 -0
  360. package/addon/components/select-option/position.hbs +12 -0
  361. package/addon/components/select-option/purchase-rate.hbs +12 -0
  362. package/addon/components/select-option/recurring-order-schedule.hbs +12 -0
  363. package/addon/components/select-option/route.hbs +12 -0
  364. package/addon/components/select-option/sensor.hbs +12 -0
  365. package/addon/components/select-option/service-area.hbs +12 -0
  366. package/addon/components/select-option/service-quote-item.hbs +12 -0
  367. package/addon/components/select-option/service-quote.hbs +12 -0
  368. package/addon/components/select-option/service-rate-fee.hbs +12 -0
  369. package/addon/components/select-option/service-rate-parcel-fee.hbs +12 -0
  370. package/addon/components/select-option/service-rate.hbs +12 -0
  371. package/addon/components/select-option/telematic.hbs +12 -0
  372. package/addon/components/select-option/trackable.hbs +8 -0
  373. package/addon/components/select-option/tracking-number.hbs +12 -0
  374. package/addon/components/select-option/tracking-status.hbs +12 -0
  375. package/addon/components/select-option/trailer.hbs +12 -0
  376. package/addon/components/select-option/vehicle-device.hbs +12 -0
  377. package/addon/components/select-option/vehicle.hbs +12 -0
  378. package/addon/components/select-option/vendor.hbs +12 -0
  379. package/addon/components/select-option/warranty.hbs +12 -0
  380. package/addon/components/select-option/waypoint.hbs +12 -0
  381. package/addon/components/select-option/work-order.hbs +12 -0
  382. package/addon/components/select-option/zone.hbs +12 -0
  383. package/addon/components/sensor/details.hbs +6 -2
  384. package/addon/components/sensor/form.hbs +6 -17
  385. package/addon/components/sensor/panel-header.hbs +1 -1
  386. package/addon/components/sensor/pill.hbs +24 -0
  387. package/addon/components/sensor/summary.hbs +1 -0
  388. package/addon/components/service-area/details.hbs +1 -20
  389. package/addon/components/service-area/pill.hbs +24 -0
  390. package/addon/components/service-area/summary.hbs +1 -0
  391. package/addon/components/service-quote/pill.hbs +24 -0
  392. package/addon/components/service-quote/summary.hbs +1 -0
  393. package/addon/components/service-quote-item/pill.hbs +24 -0
  394. package/addon/components/service-quote-item/summary.hbs +1 -0
  395. package/addon/components/service-rate/details.hbs +12 -6
  396. package/addon/components/service-rate/form.hbs +10 -8
  397. package/addon/components/service-rate/pill.hbs +24 -0
  398. package/addon/components/service-rate/summary.hbs +1 -0
  399. package/addon/components/service-rate-fee/pill.hbs +24 -0
  400. package/addon/components/service-rate-fee/summary.hbs +1 -0
  401. package/addon/components/service-rate-parcel-fee/pill.hbs +24 -0
  402. package/addon/components/service-rate-parcel-fee/summary.hbs +1 -0
  403. package/addon/components/table/cell/fleet-ops-option.hbs +20 -0
  404. package/addon/components/telematic/details.hbs +4 -1
  405. package/addon/components/telematic/details.js +1 -0
  406. package/addon/components/telematic/form.hbs +6 -1
  407. package/addon/components/telematic/form.js +1 -0
  408. package/addon/components/telematic/pill.hbs +24 -0
  409. package/addon/components/telematic/settings.hbs +6 -1
  410. package/addon/components/telematic/settings.js +1 -0
  411. package/addon/components/telematic/summary.hbs +1 -0
  412. package/addon/components/telematic/telemetry-status.hbs +43 -0
  413. package/addon/components/telematic/telemetry-status.js +95 -0
  414. package/addon/components/tracking-number/pill.hbs +24 -0
  415. package/addon/components/tracking-number/summary.hbs +1 -0
  416. package/addon/components/tracking-status/pill.hbs +24 -0
  417. package/addon/components/tracking-status/summary.hbs +1 -0
  418. package/addon/components/trailer/card.hbs +65 -0
  419. package/addon/components/trailer/card.js +22 -0
  420. package/addon/components/trailer/details/connections.hbs +57 -0
  421. package/addon/components/trailer/details/connections.js +59 -0
  422. package/addon/components/trailer/details/equipment.hbs +25 -0
  423. package/addon/components/trailer/details/equipment.js +52 -0
  424. package/addon/components/trailer/details/maintenance-history.hbs +47 -0
  425. package/addon/components/trailer/details/maintenance-history.js +40 -0
  426. package/addon/components/trailer/details/schedules.hbs +45 -0
  427. package/addon/components/trailer/details/schedules.js +40 -0
  428. package/addon/components/trailer/details/work-orders.hbs +47 -0
  429. package/addon/components/trailer/details/work-orders.js +40 -0
  430. package/addon/components/trailer/details.hbs +405 -0
  431. package/addon/components/trailer/details.js +122 -0
  432. package/addon/components/trailer/form.hbs +450 -0
  433. package/addon/components/trailer/form.js +165 -0
  434. package/addon/components/trailer/panel-header.hbs +45 -0
  435. package/addon/components/trailer/panel-header.js +3 -0
  436. package/addon/components/trailer/pill.hbs +24 -0
  437. package/addon/components/trailer/summary.hbs +1 -0
  438. package/addon/components/vehicle/card.hbs +38 -11
  439. package/addon/components/vehicle/card.js +31 -0
  440. package/addon/components/vehicle/details/equipment.hbs +25 -0
  441. package/addon/components/vehicle/details/equipment.js +55 -0
  442. package/addon/components/vehicle/details/inspections.hbs +49 -0
  443. package/addon/components/vehicle/details/inspections.js +44 -0
  444. package/addon/components/vehicle/details/maintenance-history.hbs +1 -1
  445. package/addon/components/vehicle/details/schedules.hbs +2 -2
  446. package/addon/components/vehicle/details/trailers.hbs +35 -0
  447. package/addon/components/vehicle/details/trailers.js +55 -0
  448. package/addon/components/vehicle/details/work-orders.hbs +1 -1
  449. package/addon/components/vehicle/details.hbs +18 -1
  450. package/addon/components/vehicle/form.hbs +4 -3
  451. package/addon/components/vehicle/panel-header.hbs +5 -6
  452. package/addon/components/vehicle/panel-header.js +8 -1
  453. package/addon/components/vehicle/pill.hbs +15 -24
  454. package/addon/components/vehicle/summary.hbs +1 -0
  455. package/addon/components/vehicle-device/pill.hbs +24 -0
  456. package/addon/components/vehicle-device/summary.hbs +1 -0
  457. package/addon/components/vendor/card.hbs +58 -0
  458. package/addon/components/vendor/card.js +6 -0
  459. package/addon/components/vendor/form.hbs +2 -4
  460. package/addon/components/vendor/panel-header.hbs +2 -2
  461. package/addon/components/vendor/personnel-manager.hbs +3 -10
  462. package/addon/components/vendor/personnel-tab.hbs +1 -0
  463. package/addon/components/vendor/personnel-tab.js +4 -0
  464. package/addon/components/vendor/pill.hbs +24 -0
  465. package/addon/components/vendor/summary.hbs +1 -0
  466. package/addon/components/warranty/details.hbs +3 -1
  467. package/addon/components/warranty/form.hbs +2 -1
  468. package/addon/components/warranty/pill.hbs +24 -0
  469. package/addon/components/warranty/summary.hbs +1 -0
  470. package/addon/components/waypoint/pill.hbs +24 -0
  471. package/addon/components/waypoint/summary.hbs +1 -0
  472. package/addon/components/widget/radar.hbs +28 -0
  473. package/addon/components/widget/radar.js +44 -0
  474. package/addon/components/work-order/details.hbs +20 -4
  475. package/addon/components/work-order/details.js +64 -1
  476. package/addon/components/work-order/form.hbs +20 -2
  477. package/addon/components/work-order/form.js +22 -14
  478. package/addon/components/work-order/panel-header.hbs +15 -13
  479. package/addon/components/work-order/pill.hbs +24 -0
  480. package/addon/components/work-order/summary.hbs +1 -0
  481. package/addon/components/zone/details.hbs +2 -21
  482. package/addon/components/zone/pill.hbs +24 -0
  483. package/addon/components/zone/summary.hbs +1 -0
  484. package/addon/controllers/connectivity/devices/index/details/sensors.js +4 -0
  485. package/addon/controllers/connectivity/devices/index/details/vehicle.js +11 -0
  486. package/addon/controllers/connectivity/devices/index/details.js +2 -19
  487. package/addon/controllers/connectivity/devices/index.js +1 -0
  488. package/addon/controllers/connectivity/events/index.js +1 -4
  489. package/addon/controllers/connectivity/fuel-providers/details/index.js +6 -0
  490. package/addon/controllers/connectivity/fuel-providers/details/matching.js +13 -0
  491. package/addon/controllers/connectivity/fuel-providers/details/sync.js +21 -10
  492. package/addon/controllers/connectivity/fuel-providers/details/transactions.js +5 -16
  493. package/addon/controllers/connectivity/fuel-providers/details.js +76 -13
  494. package/addon/controllers/connectivity/fuel-providers/index.js +22 -17
  495. package/addon/controllers/connectivity/sensors/index.js +1 -3
  496. package/addon/controllers/connectivity/telematics/details/attachments.js +28 -47
  497. package/addon/controllers/connectivity/telematics/details/devices.js +1 -0
  498. package/addon/controllers/connectivity/telematics/details/events.js +8 -0
  499. package/addon/controllers/connectivity/telematics/details/sensors.js +3 -2
  500. package/addon/controllers/connectivity/telematics/index.js +3 -1
  501. package/addon/controllers/maintenance/inspection-forms/index/details.js +29 -0
  502. package/addon/controllers/maintenance/inspection-forms/index/edit.js +39 -0
  503. package/addon/controllers/maintenance/inspection-forms/index/new.js +48 -0
  504. package/addon/controllers/maintenance/inspection-forms/index.js +90 -0
  505. package/addon/controllers/maintenance/inspection-submissions/index/details.js +53 -0
  506. package/addon/controllers/maintenance/inspection-submissions/index/edit.js +39 -0
  507. package/addon/controllers/maintenance/inspection-submissions/index/new.js +48 -0
  508. package/addon/controllers/maintenance/inspection-submissions/index.js +142 -0
  509. package/addon/controllers/maintenance/maintenances/index.js +6 -2
  510. package/addon/controllers/maintenance/schedules/index/details.js +4 -86
  511. package/addon/controllers/maintenance/schedules/index.js +15 -0
  512. package/addon/controllers/maintenance/work-orders/index.js +19 -1
  513. package/addon/controllers/management/contacts/customers.js +10 -4
  514. package/addon/controllers/management/contacts/index.js +38 -3
  515. package/addon/controllers/management/drivers/index/details.js +1 -66
  516. package/addon/controllers/management/drivers/index.js +9 -34
  517. package/addon/controllers/management/fleets/index/details.js +2 -15
  518. package/addon/controllers/management/fleets/index.js +12 -20
  519. package/addon/controllers/management/fuel-reports/index.js +9 -59
  520. package/addon/controllers/management/fuel-transactions/index/details.js +51 -48
  521. package/addon/controllers/management/fuel-transactions/index.js +32 -32
  522. package/addon/controllers/management/index.js +1367 -49
  523. package/addon/controllers/management/issues/index/details.js +1 -33
  524. package/addon/controllers/management/issues/index.js +10 -59
  525. package/addon/controllers/management/trailers/index/details.js +45 -0
  526. package/addon/controllers/management/trailers/index/edit.js +67 -0
  527. package/addon/controllers/management/trailers/index/new.js +43 -0
  528. package/addon/controllers/management/trailers/index.js +597 -0
  529. package/addon/controllers/management/vehicles/index/details.js +25 -77
  530. package/addon/controllers/management/vehicles/index.js +95 -43
  531. package/addon/controllers/management/vendors/index.js +38 -3
  532. package/addon/controllers/operations/orders/index.js +41 -12
  533. package/addon/controllers/operations/service-rates/index.js +10 -2
  534. package/addon/controllers/settings/custom-fields.js +8 -0
  535. package/addon/controllers/settings/payments/index.js +11 -2
  536. package/addon/extension.js +43 -0
  537. package/addon/helpers/initials.js +6 -0
  538. package/addon/helpers/leaflet-tile-url.js +6 -1
  539. package/addon/helpers/placeholder-image.js +6 -0
  540. package/addon/helpers/resource-image.js +10 -0
  541. package/addon/helpers/trailer-placeholder-image.js +6 -0
  542. package/addon/instance-initializers/register-fleetops-resource-descriptors.js +29 -0
  543. package/addon/modifiers/inspection-flyout.js +237 -0
  544. package/addon/modifiers/radar-keyboard.js +78 -0
  545. package/addon/modifiers/sync-value.js +26 -0
  546. package/addon/modifiers/when-changed.js +25 -0
  547. package/addon/routes/connectivity/fuel-providers/details/settings.js +5 -2
  548. package/addon/routes/connectivity/fuel-providers/details/sync.js +6 -13
  549. package/addon/routes/connectivity/fuel-providers/details/transactions.js +8 -7
  550. package/addon/routes/connectivity/fuel-providers/details.js +15 -2
  551. package/addon/routes/connectivity/fuel-providers/edit.js +2 -1
  552. package/addon/routes/connectivity/fuel-providers/index.js +5 -0
  553. package/addon/routes/maintenance/inspection-forms/index/details/index.js +3 -0
  554. package/addon/routes/maintenance/inspection-forms/index/details/submissions.js +3 -0
  555. package/addon/routes/maintenance/inspection-forms/index/details.js +18 -0
  556. package/addon/routes/maintenance/inspection-forms/index/edit.js +18 -0
  557. package/addon/routes/maintenance/inspection-forms/index/new.js +3 -0
  558. package/addon/routes/maintenance/inspection-forms/index.js +22 -0
  559. package/addon/routes/maintenance/inspection-forms.js +3 -0
  560. package/addon/routes/maintenance/inspection-submissions/index/details/audit.js +8 -0
  561. package/addon/routes/maintenance/inspection-submissions/index/details/index.js +3 -0
  562. package/addon/routes/maintenance/inspection-submissions/index/details/photos.js +8 -0
  563. package/addon/routes/maintenance/inspection-submissions/index/details.js +18 -0
  564. package/addon/routes/maintenance/inspection-submissions/index/edit.js +18 -0
  565. package/addon/routes/maintenance/inspection-submissions/index/new.js +3 -0
  566. package/addon/routes/maintenance/inspection-submissions/index.js +25 -0
  567. package/addon/routes/maintenance/inspection-submissions.js +3 -0
  568. package/addon/routes/management/fuel-transactions/index/details.js +12 -2
  569. package/addon/routes/management/fuel-transactions/index.js +6 -0
  570. package/addon/routes/management/index.js +17 -1
  571. package/addon/routes/management/trailers/index/details/connections.js +2 -0
  572. package/addon/routes/management/trailers/index/details/devices.js +2 -0
  573. package/addon/routes/management/trailers/index/details/equipment.js +2 -0
  574. package/addon/routes/management/trailers/index/details/index.js +2 -0
  575. package/addon/routes/management/trailers/index/details/maintenance-history.js +2 -0
  576. package/addon/routes/management/trailers/index/details/positions.js +2 -0
  577. package/addon/routes/management/trailers/index/details/schedules.js +2 -0
  578. package/addon/routes/management/trailers/index/details/work-orders.js +2 -0
  579. package/addon/routes/management/trailers/index/details.js +30 -0
  580. package/addon/routes/management/trailers/index/edit.js +23 -0
  581. package/addon/routes/management/trailers/index/new.js +14 -0
  582. package/addon/routes/management/trailers/index.js +42 -0
  583. package/addon/routes/management/vehicles/index/details/inspections.js +3 -0
  584. package/addon/routes/management/vehicles/index/details/trailers.js +2 -0
  585. package/addon/routes/management/vehicles/index.js +7 -1
  586. package/addon/routes.js +41 -0
  587. package/addon/services/contact-actions.js +22 -4
  588. package/addon/services/customer-actions.js +7 -4
  589. package/addon/services/device-actions.js +54 -16
  590. package/addon/services/driver-actions.js +79 -16
  591. package/addon/services/equipment-actions.js +15 -6
  592. package/addon/services/fleet-actions.js +20 -4
  593. package/addon/services/fuel-report-actions.js +7 -7
  594. package/addon/services/inspection-form-actions.js +236 -0
  595. package/addon/services/inspection-submission-actions.js +273 -0
  596. package/addon/services/issue-actions.js +58 -7
  597. package/addon/services/maintenance-actions.js +22 -3
  598. package/addon/services/maintenance-schedule-actions.js +70 -5
  599. package/addon/services/movement-tracker.js +52 -1
  600. package/addon/services/part-actions.js +13 -7
  601. package/addon/services/place-actions.js +8 -7
  602. package/addon/services/service-area-actions.js +27 -4
  603. package/addon/services/trailer-actions.js +447 -0
  604. package/addon/services/vehicle-actions.js +169 -3
  605. package/addon/services/vendor-actions.js +8 -7
  606. package/addon/services/work-order-actions.js +14 -5
  607. package/addon/services/zone-actions.js +27 -4
  608. package/addon/styles/fleetops-engine.css +3908 -13
  609. package/addon/templates/connectivity/devices/index/details/vehicle.hbs +21 -21
  610. package/addon/templates/connectivity/events/details.hbs +2 -2
  611. package/addon/templates/connectivity/fuel-providers/details/index.hbs +65 -35
  612. package/addon/templates/connectivity/fuel-providers/details/matching.hbs +2 -2
  613. package/addon/templates/connectivity/fuel-providers/details/sync.hbs +54 -43
  614. package/addon/templates/connectivity/fuel-providers/details/transactions.hbs +10 -5
  615. package/addon/templates/connectivity/fuel-providers/details.hbs +38 -13
  616. package/addon/templates/connectivity/fuel-providers/edit.hbs +1 -0
  617. package/addon/templates/connectivity/fuel-providers/index.hbs +2 -1
  618. package/addon/templates/connectivity/fuel-providers/new.hbs +1 -1
  619. package/addon/templates/connectivity/telematics/details/attachments.hbs +17 -16
  620. package/addon/templates/maintenance/inspection-forms/index/details/index.hbs +1 -0
  621. package/addon/templates/maintenance/inspection-forms/index/details/submissions.hbs +2 -0
  622. package/addon/templates/maintenance/inspection-forms/index/details.hbs +14 -0
  623. package/addon/templates/maintenance/inspection-forms/index/edit.hbs +11 -0
  624. package/addon/templates/maintenance/inspection-forms/index/new.hbs +11 -0
  625. package/addon/templates/maintenance/inspection-forms/index.hbs +28 -0
  626. package/addon/templates/maintenance/inspection-forms.hbs +1 -0
  627. package/addon/templates/maintenance/inspection-submissions/index/details/audit.hbs +1 -0
  628. package/addon/templates/maintenance/inspection-submissions/index/details/index.hbs +1 -0
  629. package/addon/templates/maintenance/inspection-submissions/index/details/photos.hbs +1 -0
  630. package/addon/templates/maintenance/inspection-submissions/index/details.hbs +14 -0
  631. package/addon/templates/maintenance/inspection-submissions/index/edit.hbs +11 -0
  632. package/addon/templates/maintenance/inspection-submissions/index/new.hbs +11 -0
  633. package/addon/templates/maintenance/inspection-submissions/index.hbs +28 -0
  634. package/addon/templates/maintenance/inspection-submissions.hbs +1 -0
  635. package/addon/templates/management/contacts/customers.hbs +48 -29
  636. package/addon/templates/management/contacts/index.hbs +52 -33
  637. package/addon/templates/management/fuel-transactions/index/details.hbs +64 -62
  638. package/addon/templates/management/fuel-transactions/index.hbs +9 -31
  639. package/addon/templates/management/index.hbs +110 -102
  640. package/addon/templates/management/trailers/index/details/connections.hbs +1 -0
  641. package/addon/templates/management/trailers/index/details/devices.hbs +1 -0
  642. package/addon/templates/management/trailers/index/details/equipment.hbs +1 -0
  643. package/addon/templates/management/trailers/index/details/index.hbs +1 -0
  644. package/addon/templates/management/trailers/index/details/maintenance-history.hbs +1 -0
  645. package/addon/templates/management/trailers/index/details/positions.hbs +1 -0
  646. package/addon/templates/management/trailers/index/details/schedules.hbs +1 -0
  647. package/addon/templates/management/trailers/index/details/work-orders.hbs +1 -0
  648. package/addon/templates/management/trailers/index/details.hbs +15 -0
  649. package/addon/templates/management/trailers/index/edit.hbs +12 -0
  650. package/addon/templates/management/trailers/index/new.hbs +11 -0
  651. package/addon/templates/management/trailers/index.hbs +67 -0
  652. package/addon/templates/management/vehicles/index/details/equipment.hbs +1 -1
  653. package/addon/templates/management/vehicles/index/details/inspections.hbs +2 -0
  654. package/addon/templates/management/vehicles/index/details/trailers.hbs +1 -0
  655. package/addon/templates/management/vehicles/index/details.hbs +1 -1
  656. package/addon/templates/management/vendors/index.hbs +66 -32
  657. package/addon/templates/operations/orders/index.hbs +2 -4
  658. package/addon/utils/context-panel.js +34 -0
  659. package/addon/utils/device-table-columns.js +24 -29
  660. package/addon/utils/fleet-ops-options.js +40 -0
  661. package/addon/utils/fuel-integration-format.js +43 -0
  662. package/addon/utils/fuel-transaction.js +115 -0
  663. package/addon/utils/identity-cell-resource.js +56 -0
  664. package/addon/utils/inspection-answers.js +283 -0
  665. package/addon/utils/inspection-field-types.js +74 -0
  666. package/addon/utils/inspection-form-structure.js +161 -0
  667. package/addon/utils/live-map-card-content.js +56 -0
  668. package/addon/utils/placeholder-images.js +71 -0
  669. package/addon/utils/radar.js +212 -0
  670. package/addon/utils/relation-value.js +37 -0
  671. package/addon/utils/resource-descriptors/assets.js +246 -0
  672. package/addon/utils/resource-descriptors/connectivity.js +146 -0
  673. package/addon/utils/resource-descriptors/fuel.js +75 -0
  674. package/addon/utils/resource-descriptors/helpers.js +191 -0
  675. package/addon/utils/resource-descriptors/index.js +35 -0
  676. package/addon/utils/resource-descriptors/maintenance.js +175 -0
  677. package/addon/utils/resource-descriptors/operations.js +215 -0
  678. package/addon/utils/resource-descriptors/people.js +173 -0
  679. package/addon/utils/resource-descriptors/polymorphic.js +123 -0
  680. package/addon/utils/resource-descriptors/sub-records.js +297 -0
  681. package/addon/utils/telemetry-timestamp.js +6 -0
  682. package/addon/utils/trailer-placeholder-image.js +11 -0
  683. package/app/components/asset/pill.js +1 -0
  684. package/app/components/asset/summary.js +1 -0
  685. package/app/components/asset-connection/pill.js +1 -0
  686. package/app/components/asset-connection/summary.js +1 -0
  687. package/app/components/attachable/pill.js +1 -0
  688. package/app/components/attachable/summary.js +1 -0
  689. package/app/components/attachment-list.js +1 -0
  690. package/app/components/cell/asset-connection-identity.js +1 -0
  691. package/app/components/cell/{attached-vehicle.js → asset-identity.js} +1 -1
  692. package/app/components/cell/attachable-identity.js +1 -0
  693. package/app/components/cell/{telematic-device.js → contact-identity.js} +1 -1
  694. package/app/components/cell/customer-identity.js +1 -0
  695. package/app/components/cell/device-event-identity.js +1 -0
  696. package/app/components/cell/entity-identity.js +1 -0
  697. package/app/components/cell/facilitator-identity.js +1 -0
  698. package/app/components/cell/fleet-driver-identity.js +1 -0
  699. package/app/components/cell/fleet-identity.js +1 -0
  700. package/app/components/cell/fuel-provider-connection-identity.js +1 -0
  701. package/app/components/cell/fuel-provider-transaction-identity.js +1 -0
  702. package/app/components/cell/fuel-report-identity.js +1 -0
  703. package/app/components/cell/inspection-form-identity.js +1 -0
  704. package/app/components/cell/inspection-item-result-identity.js +1 -0
  705. package/app/components/cell/inspection-submission-identity.js +1 -0
  706. package/app/components/cell/integrated-vendor-identity.js +1 -0
  707. package/app/components/cell/issue-identity.js +1 -0
  708. package/app/components/cell/maintenance-identity.js +1 -0
  709. package/app/components/cell/maintenance-schedule-identity.js +1 -0
  710. package/app/components/cell/maintenance-subject-identity.js +1 -0
  711. package/app/components/cell/manifest-identity.js +1 -0
  712. package/app/components/cell/manifest-stop-identity.js +1 -0
  713. package/app/components/cell/order-config-identity.js +1 -0
  714. package/app/components/cell/order-identity.js +1 -0
  715. package/app/components/cell/payload-identity.js +1 -0
  716. package/app/components/cell/place-identity.js +1 -0
  717. package/app/components/cell/position-identity.js +1 -0
  718. package/app/components/cell/purchase-rate-identity.js +1 -0
  719. package/app/components/cell/recurring-order-schedule-identity.js +1 -0
  720. package/app/components/cell/resource-list.js +1 -0
  721. package/app/components/cell/route-identity.js +1 -0
  722. package/app/components/cell/sensor-identity.js +1 -0
  723. package/app/components/cell/service-area-identity.js +1 -0
  724. package/app/components/cell/service-quote-identity.js +1 -0
  725. package/app/components/cell/service-quote-item-identity.js +1 -0
  726. package/app/components/cell/service-rate-fee-identity.js +1 -0
  727. package/app/components/cell/service-rate-identity.js +1 -0
  728. package/app/components/cell/service-rate-parcel-fee-identity.js +1 -0
  729. package/app/components/cell/{telematic-provider.js → telematic-identity.js} +1 -1
  730. package/app/components/cell/tracking-number-identity.js +1 -0
  731. package/app/components/cell/tracking-status-identity.js +1 -0
  732. package/app/components/cell/trailer-identity.js +1 -0
  733. package/app/components/cell/translated-value.js +1 -0
  734. package/app/components/cell/vehicle-device-identity.js +1 -0
  735. package/app/components/cell/vendor-identity.js +1 -0
  736. package/app/components/cell/warranty-identity.js +1 -0
  737. package/app/components/cell/waypoint-identity.js +1 -0
  738. package/app/components/cell/work-order-identity.js +1 -0
  739. package/app/components/cell/zone-identity.js +1 -0
  740. package/app/components/{cell/driver-name.js → contact/card.js} +1 -1
  741. package/app/components/{cell/vehicle-name.js → contact/pill.js} +1 -1
  742. package/app/components/contact/summary.js +1 -0
  743. package/app/components/customer/pill.js +1 -0
  744. package/app/components/customer/summary.js +1 -0
  745. package/app/components/device/summary.js +1 -0
  746. package/app/components/device/telemetry.js +1 -0
  747. package/app/components/device-event/pill.js +1 -0
  748. package/app/components/device-event/summary.js +1 -0
  749. package/app/components/driver/summary.js +1 -0
  750. package/app/components/entity/pill.js +1 -0
  751. package/app/components/entity/summary.js +1 -0
  752. package/app/components/equipment/card.js +1 -0
  753. package/app/components/equipment/panel-header.js +1 -0
  754. package/app/components/equipment/pill.js +1 -0
  755. package/app/components/equipment/summary.js +1 -0
  756. package/app/components/facilitator/pill.js +1 -0
  757. package/app/components/facilitator/summary.js +1 -0
  758. package/app/components/fleet/pill.js +1 -0
  759. package/app/components/fleet/summary.js +1 -0
  760. package/app/components/fleet-driver/pill.js +1 -0
  761. package/app/components/fleet-driver/summary.js +1 -0
  762. package/app/components/fuel-provider-connection/pill.js +1 -0
  763. package/app/components/fuel-provider-connection/summary.js +1 -0
  764. package/app/components/fuel-provider-transaction/pill.js +1 -0
  765. package/app/components/fuel-provider-transaction/summary.js +1 -0
  766. package/app/components/fuel-report/pill.js +1 -0
  767. package/app/components/fuel-report/summary.js +1 -0
  768. package/app/components/fuel-transaction-status.js +1 -0
  769. package/app/components/geofence-map.js +1 -0
  770. package/app/components/inspection-field/form.js +1 -0
  771. package/app/components/inspection-field/input.js +1 -0
  772. package/app/components/inspection-field/value.js +1 -0
  773. package/app/components/inspection-flyout.js +1 -0
  774. package/app/components/inspection-form/builder.js +1 -0
  775. package/app/components/inspection-form/details/submissions.js +1 -0
  776. package/app/components/inspection-form/details.js +1 -0
  777. package/app/components/inspection-form/form.js +1 -0
  778. package/app/components/inspection-form/pill.js +1 -0
  779. package/app/components/inspection-form/summary.js +1 -0
  780. package/app/components/inspection-item-result/pill.js +1 -0
  781. package/app/components/inspection-item-result/summary.js +1 -0
  782. package/app/components/inspection-link/list.js +1 -0
  783. package/app/components/inspection-sheet/group.js +1 -0
  784. package/app/components/inspection-sheet.js +1 -0
  785. package/app/components/inspection-submission/details.js +1 -0
  786. package/app/components/inspection-submission/form.js +1 -0
  787. package/app/components/inspection-submission/photos.js +1 -0
  788. package/app/components/inspection-submission/pill.js +1 -0
  789. package/app/components/inspection-submission/summary.js +1 -0
  790. package/app/components/integrated-vendor/pill.js +1 -0
  791. package/app/components/integrated-vendor/summary.js +1 -0
  792. package/app/components/issue/pill.js +1 -0
  793. package/app/components/issue/summary.js +1 -0
  794. package/app/components/issue/timeline.js +1 -0
  795. package/app/components/layout/fleet-ops-sidebar/operations-monitor.js +1 -0
  796. package/app/components/maintenance/pill.js +1 -0
  797. package/app/components/maintenance/summary.js +1 -0
  798. package/app/components/maintenance-schedule/pill.js +1 -0
  799. package/app/components/maintenance-schedule/summary.js +1 -0
  800. package/app/components/maintenance-schedule/work-orders.js +1 -0
  801. package/app/components/maintenance-subject/pill.js +1 -0
  802. package/app/components/maintenance-subject/summary.js +1 -0
  803. package/app/components/manifest/pill.js +1 -0
  804. package/app/components/manifest/summary.js +1 -0
  805. package/app/components/manifest-stop/pill.js +1 -0
  806. package/app/components/manifest-stop/summary.js +1 -0
  807. package/app/components/modals/attach-equipment.js +1 -0
  808. package/app/components/modals/attach-trailer.js +1 -0
  809. package/app/components/modals/fuel-connection-diagnostics.js +1 -0
  810. package/app/components/modals/fuel-transaction-action.js +1 -0
  811. package/app/components/modals/inspection-follow-up.js +1 -0
  812. package/app/components/modals/inspection-link.js +1 -0
  813. package/app/components/modals/radar-notice.js +1 -0
  814. package/app/components/modals/radar-save-view.js +1 -0
  815. package/app/components/modals/radar-select-resource.js +1 -0
  816. package/app/components/modals/radar-send-pin.js +1 -0
  817. package/app/components/modals/select-trailer.js +1 -0
  818. package/app/components/order/summary.js +1 -0
  819. package/app/components/order-config/pill.js +1 -0
  820. package/app/components/order-config/summary.js +1 -0
  821. package/app/components/part/card.js +1 -0
  822. package/app/components/part/panel-header.js +1 -0
  823. package/app/components/part/pill.js +1 -0
  824. package/app/components/part/summary.js +1 -0
  825. package/app/components/payload/pill.js +1 -0
  826. package/app/components/payload/summary.js +1 -0
  827. package/app/components/place/pill.js +1 -0
  828. package/app/components/place/summary.js +1 -0
  829. package/app/components/position/pill.js +1 -0
  830. package/app/components/position/summary.js +1 -0
  831. package/app/components/public-inspection.js +1 -0
  832. package/app/components/purchase-rate/pill.js +1 -0
  833. package/app/components/purchase-rate/summary.js +1 -0
  834. package/app/components/radar/agenda/entry.js +1 -0
  835. package/app/components/radar/agenda/lane.js +1 -0
  836. package/app/components/radar/agenda.js +1 -0
  837. package/app/components/radar/briefing.js +1 -0
  838. package/app/components/radar/bulk-bar.js +1 -0
  839. package/app/components/radar/decision-card.js +1 -0
  840. package/app/components/radar/empty-state.js +1 -0
  841. package/app/components/radar/filter-pills.js +1 -0
  842. package/app/components/radar/handover-card.js +1 -0
  843. package/app/components/radar/header.js +1 -0
  844. package/app/components/radar/item-drawer.js +1 -0
  845. package/app/components/radar/item-list.js +1 -0
  846. package/app/components/radar/item-row.js +1 -0
  847. package/app/components/radar/keyboard-hints.js +1 -0
  848. package/app/components/radar/subject.js +1 -0
  849. package/app/components/radar/view-bar.js +1 -0
  850. package/app/components/recurring-order-schedule/pill.js +1 -0
  851. package/app/components/recurring-order-schedule/summary.js +1 -0
  852. package/app/components/resource-activity.js +1 -0
  853. package/app/components/route/pill.js +1 -0
  854. package/app/components/route/summary.js +1 -0
  855. package/app/components/select-option/asset-connection.js +1 -0
  856. package/app/components/select-option/asset.js +1 -0
  857. package/app/components/select-option/attachable.js +1 -0
  858. package/app/components/select-option/contact.js +1 -0
  859. package/app/components/select-option/customer.js +1 -0
  860. package/app/components/select-option/device-event.js +1 -0
  861. package/app/components/select-option/device.js +1 -0
  862. package/app/components/select-option/driver.js +1 -0
  863. package/app/components/select-option/entity.js +1 -0
  864. package/app/components/select-option/equipment.js +1 -0
  865. package/app/components/select-option/facilitator.js +1 -0
  866. package/app/components/select-option/fleet-driver.js +1 -0
  867. package/app/components/select-option/fleet.js +1 -0
  868. package/app/components/select-option/fuel-provider-connection.js +1 -0
  869. package/app/components/select-option/fuel-provider-transaction.js +1 -0
  870. package/app/components/select-option/fuel-report.js +1 -0
  871. package/app/components/select-option/inspection-form.js +1 -0
  872. package/app/components/select-option/inspection-item-result.js +1 -0
  873. package/app/components/select-option/inspection-submission.js +1 -0
  874. package/app/components/select-option/integrated-vendor.js +1 -0
  875. package/app/components/select-option/issue.js +1 -0
  876. package/app/components/select-option/maintenance-schedule.js +1 -0
  877. package/app/components/select-option/maintenance-subject.js +1 -0
  878. package/app/components/select-option/maintenance.js +1 -0
  879. package/app/components/select-option/manifest-stop.js +1 -0
  880. package/app/components/select-option/manifest.js +1 -0
  881. package/app/components/select-option/order-config.js +1 -0
  882. package/app/components/select-option/order.js +1 -0
  883. package/app/components/select-option/part.js +1 -0
  884. package/app/components/select-option/payload.js +1 -0
  885. package/app/components/select-option/place.js +1 -0
  886. package/app/components/select-option/position.js +1 -0
  887. package/app/components/select-option/purchase-rate.js +1 -0
  888. package/app/components/select-option/recurring-order-schedule.js +1 -0
  889. package/app/components/select-option/route.js +1 -0
  890. package/app/components/select-option/sensor.js +1 -0
  891. package/app/components/select-option/service-area.js +1 -0
  892. package/app/components/select-option/service-quote-item.js +1 -0
  893. package/app/components/select-option/service-quote.js +1 -0
  894. package/app/components/select-option/service-rate-fee.js +1 -0
  895. package/app/components/select-option/service-rate-parcel-fee.js +1 -0
  896. package/app/components/select-option/service-rate.js +1 -0
  897. package/app/components/select-option/telematic.js +1 -0
  898. package/app/components/select-option/trackable.js +1 -0
  899. package/app/components/select-option/tracking-number.js +1 -0
  900. package/app/components/select-option/tracking-status.js +1 -0
  901. package/app/components/select-option/trailer.js +1 -0
  902. package/app/components/select-option/vehicle-device.js +1 -0
  903. package/app/components/select-option/vehicle.js +1 -0
  904. package/app/components/select-option/vendor.js +1 -0
  905. package/app/components/select-option/warranty.js +1 -0
  906. package/app/components/select-option/waypoint.js +1 -0
  907. package/app/components/select-option/work-order.js +1 -0
  908. package/app/components/select-option/zone.js +1 -0
  909. package/app/components/sensor/pill.js +1 -0
  910. package/app/components/sensor/summary.js +1 -0
  911. package/app/components/service-area/pill.js +1 -0
  912. package/app/components/service-area/summary.js +1 -0
  913. package/app/components/service-quote/pill.js +1 -0
  914. package/app/components/service-quote/summary.js +1 -0
  915. package/app/components/service-quote-item/pill.js +1 -0
  916. package/app/components/service-quote-item/summary.js +1 -0
  917. package/app/components/service-rate/pill.js +1 -0
  918. package/app/components/service-rate/summary.js +1 -0
  919. package/app/components/service-rate-fee/pill.js +1 -0
  920. package/app/components/service-rate-fee/summary.js +1 -0
  921. package/app/components/service-rate-parcel-fee/pill.js +1 -0
  922. package/app/components/service-rate-parcel-fee/summary.js +1 -0
  923. package/app/components/table/cell/fleet-ops-option.js +1 -0
  924. package/app/components/telematic/pill.js +1 -0
  925. package/app/components/telematic/summary.js +1 -0
  926. package/app/components/telematic/telemetry-status.js +1 -0
  927. package/app/components/tracking-number/pill.js +1 -0
  928. package/app/components/tracking-number/summary.js +1 -0
  929. package/app/components/tracking-status/pill.js +1 -0
  930. package/app/components/tracking-status/summary.js +1 -0
  931. package/app/components/trailer/card.js +1 -0
  932. package/app/components/trailer/details/connections.js +1 -0
  933. package/app/components/trailer/details/equipment.js +1 -0
  934. package/app/components/trailer/details/maintenance-history.js +1 -0
  935. package/app/components/trailer/details/schedules.js +1 -0
  936. package/app/components/trailer/details/work-orders.js +1 -0
  937. package/app/components/trailer/details.js +1 -0
  938. package/app/components/trailer/form.js +1 -0
  939. package/app/components/trailer/panel-header.js +1 -0
  940. package/app/components/trailer/pill.js +1 -0
  941. package/app/components/trailer/summary.js +1 -0
  942. package/app/components/vehicle/details/equipment.js +1 -0
  943. package/app/components/vehicle/details/inspections.js +1 -0
  944. package/app/components/vehicle/details/trailers.js +1 -0
  945. package/app/components/vehicle/summary.js +1 -0
  946. package/app/components/vehicle-device/pill.js +1 -0
  947. package/app/components/vehicle-device/summary.js +1 -0
  948. package/app/components/vendor/card.js +1 -0
  949. package/app/components/vendor/personnel-tab.js +1 -0
  950. package/app/components/vendor/pill.js +1 -0
  951. package/app/components/vendor/summary.js +1 -0
  952. package/app/components/warranty/pill.js +1 -0
  953. package/app/components/warranty/summary.js +1 -0
  954. package/app/components/waypoint/pill.js +1 -0
  955. package/app/components/waypoint/summary.js +1 -0
  956. package/app/components/widget/radar.js +1 -0
  957. package/app/components/work-order/panel-header.js +1 -0
  958. package/app/components/work-order/pill.js +1 -0
  959. package/app/components/work-order/summary.js +1 -0
  960. package/app/components/zone/pill.js +1 -0
  961. package/app/components/zone/summary.js +1 -0
  962. package/app/controllers/maintenance/inspection-forms/index/details.js +1 -0
  963. package/app/controllers/maintenance/inspection-forms/index/edit.js +1 -0
  964. package/app/controllers/maintenance/inspection-forms/index/new.js +1 -0
  965. package/app/controllers/maintenance/inspection-forms/index.js +1 -0
  966. package/app/controllers/maintenance/inspection-submissions/index/details.js +1 -0
  967. package/app/controllers/maintenance/inspection-submissions/index/edit.js +1 -0
  968. package/app/controllers/maintenance/inspection-submissions/index/new.js +1 -0
  969. package/app/controllers/maintenance/inspection-submissions/index.js +1 -0
  970. package/app/controllers/management/trailers/index/details.js +1 -0
  971. package/app/controllers/management/trailers/index/edit.js +1 -0
  972. package/app/controllers/management/trailers/index/new.js +1 -0
  973. package/app/controllers/management/trailers/index.js +1 -0
  974. package/app/helpers/initials.js +1 -0
  975. package/app/helpers/placeholder-image.js +1 -0
  976. package/app/helpers/resource-image.js +1 -0
  977. package/app/helpers/trailer-placeholder-image.js +1 -0
  978. package/app/modifiers/inspection-flyout.js +1 -0
  979. package/app/modifiers/radar-keyboard.js +1 -0
  980. package/app/modifiers/sync-value.js +1 -0
  981. package/app/modifiers/when-changed.js +1 -0
  982. package/app/routes/maintenance/inspection-forms/index/details/index.js +1 -0
  983. package/app/routes/maintenance/inspection-forms/index/details/submissions.js +1 -0
  984. package/app/routes/maintenance/inspection-forms/index/details.js +1 -0
  985. package/app/routes/maintenance/inspection-forms/index/edit.js +1 -0
  986. package/app/routes/maintenance/inspection-forms/index/new.js +1 -0
  987. package/app/routes/maintenance/inspection-forms/index.js +1 -0
  988. package/app/routes/maintenance/inspection-forms.js +1 -0
  989. package/app/routes/maintenance/inspection-submissions/index/details/audit.js +1 -0
  990. package/app/routes/maintenance/inspection-submissions/index/details/index.js +1 -0
  991. package/app/routes/maintenance/inspection-submissions/index/details/photos.js +1 -0
  992. package/app/routes/maintenance/inspection-submissions/index/details.js +1 -0
  993. package/app/routes/maintenance/inspection-submissions/index/edit.js +1 -0
  994. package/app/routes/maintenance/inspection-submissions/index/new.js +1 -0
  995. package/app/routes/maintenance/inspection-submissions/index.js +1 -0
  996. package/app/routes/maintenance/inspection-submissions.js +1 -0
  997. package/app/routes/management/trailers/index/details/connections.js +1 -0
  998. package/app/routes/management/trailers/index/details/devices.js +1 -0
  999. package/app/routes/management/trailers/index/details/equipment.js +1 -0
  1000. package/app/routes/management/trailers/index/details/index.js +1 -0
  1001. package/app/routes/management/trailers/index/details/maintenance-history.js +1 -0
  1002. package/app/routes/management/trailers/index/details/positions.js +1 -0
  1003. package/app/routes/management/trailers/index/details/schedules.js +1 -0
  1004. package/app/routes/management/trailers/index/details/work-orders.js +1 -0
  1005. package/app/routes/management/trailers/index/details.js +1 -0
  1006. package/app/routes/management/trailers/index/edit.js +1 -0
  1007. package/app/routes/management/trailers/index/new.js +1 -0
  1008. package/app/routes/management/trailers/index.js +1 -0
  1009. package/app/routes/management/vehicles/index/details/inspections.js +1 -0
  1010. package/app/routes/management/vehicles/index/details/trailers.js +1 -0
  1011. package/app/services/inspection-form-actions.js +1 -0
  1012. package/app/services/inspection-submission-actions.js +1 -0
  1013. package/app/services/trailer-actions.js +1 -0
  1014. package/app/templates/maintenance/inspection-forms/index/details/index.js +1 -0
  1015. package/app/templates/maintenance/inspection-forms/index/details/submissions.js +1 -0
  1016. package/app/templates/maintenance/inspection-forms/index/details.js +1 -0
  1017. package/app/templates/maintenance/inspection-forms/index/edit.js +1 -0
  1018. package/app/templates/maintenance/inspection-forms/index/new.js +1 -0
  1019. package/app/templates/maintenance/inspection-forms/index.js +1 -0
  1020. package/app/templates/maintenance/inspection-forms.js +1 -0
  1021. package/app/templates/maintenance/inspection-submissions/index/details/audit.js +1 -0
  1022. package/app/templates/maintenance/inspection-submissions/index/details/index.js +1 -0
  1023. package/app/templates/maintenance/inspection-submissions/index/details/photos.js +1 -0
  1024. package/app/templates/maintenance/inspection-submissions/index/details.js +1 -0
  1025. package/app/templates/maintenance/inspection-submissions/index/edit.js +1 -0
  1026. package/app/templates/maintenance/inspection-submissions/index/new.js +1 -0
  1027. package/app/templates/maintenance/inspection-submissions/index.js +1 -0
  1028. package/app/templates/maintenance/inspection-submissions.js +1 -0
  1029. package/app/templates/management/trailers/index/details/connections.js +1 -0
  1030. package/app/templates/management/trailers/index/details/devices.js +1 -0
  1031. package/app/templates/management/trailers/index/details/equipment.js +1 -0
  1032. package/app/templates/management/trailers/index/details/index.js +1 -0
  1033. package/app/templates/management/trailers/index/details/maintenance-history.js +1 -0
  1034. package/app/templates/management/trailers/index/details/positions.js +1 -0
  1035. package/app/templates/management/trailers/index/details/schedules.js +1 -0
  1036. package/app/templates/management/trailers/index/details/work-orders.js +1 -0
  1037. package/app/templates/management/trailers/index/details.js +1 -0
  1038. package/app/templates/management/trailers/index/edit.js +1 -0
  1039. package/app/templates/management/trailers/index/new.js +1 -0
  1040. package/app/templates/management/trailers/index.js +1 -0
  1041. package/app/templates/management/vehicles/index/details/inspections.js +1 -0
  1042. package/app/templates/management/vehicles/index/details/trailers.js +1 -0
  1043. package/app/utils/inspection-field-types.js +2 -0
  1044. package/app/utils/inspection-form-structure.js +1 -0
  1045. package/app/utils/radar.js +1 -0
  1046. package/composer.json +1 -1
  1047. package/docs/AFAQY.md +91 -0
  1048. package/docs/TELEMETRY_ARCHITECTURE.md +115 -0
  1049. package/extension.json +1 -1
  1050. package/package.json +3 -3
  1051. package/scripts/coverage-summary.php +11 -0
  1052. package/scripts/pest-bootstrap.php +1 -1
  1053. package/server/config/afaqy.php +8 -0
  1054. package/server/config/fuel-providers.php +28 -7
  1055. package/server/config/telematics.php +8 -1
  1056. package/server/config/telemetry.php +17 -0
  1057. package/server/migrations/2026_09_03_000001_add_first_class_trailer_columns_to_assets_table.php +58 -0
  1058. package/server/migrations/2026_09_03_000002_create_asset_connections_table.php +43 -0
  1059. package/server/migrations/2026_09_03_000003_create_device_installations_table.php +33 -0
  1060. package/server/migrations/2026_09_09_000001_create_inspection_tables.php +152 -0
  1061. package/server/migrations/2026_09_10_000001_convert_inspection_form_items_to_field_groups.php +44 -0
  1062. package/server/migrations/2026_09_10_000002_add_token_to_inspection_links.php +39 -0
  1063. package/server/migrations/2026_09_11_000001_add_assignee_and_pin_to_inspection_links.php +39 -0
  1064. package/server/migrations/2026_09_15_000001_create_telematic_telemetry_tables.php +62 -0
  1065. package/server/migrations/2026_09_15_000002_scope_fuel_transactions_to_connection.php +25 -0
  1066. package/server/migrations/2026_09_16_000001_add_public_id_to_alerts_table.php +45 -0
  1067. package/server/resources/views/mail/inspection-link-pin.blade.php +34 -0
  1068. package/server/src/Auth/Schemas/FleetOps.php +19 -0
  1069. package/server/src/Console/Commands/DrainTelematicInbox.php +82 -0
  1070. package/server/src/Console/Commands/ProcessMaintenanceTriggers.php +4 -1
  1071. package/server/src/Console/Commands/SyncTelematics.php +32 -2
  1072. package/server/src/Contracts/TelemetryProviderInterface.php +27 -0
  1073. package/server/src/Events/DeviceTelemetryUpdated.php +37 -0
  1074. package/server/src/Events/TrailerLocationChanged.php +70 -0
  1075. package/server/src/Events/VehicleLocationChanged.php +8 -4
  1076. package/server/src/Exceptions/DeviceAlreadyAttachedException.php +18 -0
  1077. package/server/src/Exports/InspectionExport.php +125 -0
  1078. package/server/src/Exports/TrailerExport.php +31 -0
  1079. package/server/src/Http/Controllers/Api/v1/Concerns/ResolvesFleetOpsApiResources.php +8 -2
  1080. package/server/src/Http/Controllers/Api/v1/DeviceController.php +22 -15
  1081. package/server/src/Http/Controllers/Api/v1/EquipmentController.php +47 -0
  1082. package/server/src/Http/Controllers/Api/v1/GeofenceController.php +1 -1
  1083. package/server/src/Http/Controllers/Api/v1/InspectionController.php +300 -0
  1084. package/server/src/Http/Controllers/Api/v1/TrailerController.php +362 -0
  1085. package/server/src/Http/Controllers/Api/v1/VehicleController.php +1 -0
  1086. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +3 -0
  1087. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +40 -8
  1088. package/server/src/Http/Controllers/Internal/v1/HubController.php +36 -11
  1089. package/server/src/Http/Controllers/Internal/v1/InspectionFormController.php +326 -0
  1090. package/server/src/Http/Controllers/Internal/v1/InspectionSubmissionController.php +229 -0
  1091. package/server/src/Http/Controllers/Internal/v1/LiveController.php +1 -1
  1092. package/server/src/Http/Controllers/Internal/v1/RadarController.php +1117 -0
  1093. package/server/src/Http/Controllers/Internal/v1/SearchController.php +16 -0
  1094. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +67 -0
  1095. package/server/src/Http/Controllers/Internal/v1/TrailerController.php +360 -0
  1096. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +74 -0
  1097. package/server/src/Http/Controllers/Public/PublicInspectionController.php +243 -0
  1098. package/server/src/Http/Controllers/TelematicPositionWebhookController.php +60 -0
  1099. package/server/src/Http/Controllers/TelematicWebhookController.php +3 -0
  1100. package/server/src/Http/Filter/EquipmentFilter.php +51 -0
  1101. package/server/src/Http/Filter/FuelProviderConnectionFilter.php +1 -1
  1102. package/server/src/Http/Filter/OrderFilter.php +15 -0
  1103. package/server/src/Http/Filter/TrailerFilter.php +269 -0
  1104. package/server/src/Http/Filter/VehicleFilter.php +70 -3
  1105. package/server/src/Http/Middleware/ForceJsonResponse.php +25 -0
  1106. package/server/src/Http/Requests/CreateDeviceRequest.php +1 -1
  1107. package/server/src/Http/Requests/CreateEquipmentRequest.php +1 -1
  1108. package/server/src/Http/Requests/CreateTrailerRequest.php +54 -0
  1109. package/server/src/Http/Requests/UpdateTrailerRequest.php +7 -0
  1110. package/server/src/Http/Resources/v1/AssetConnection.php +90 -0
  1111. package/server/src/Http/Resources/v1/Device.php +3 -1
  1112. package/server/src/Http/Resources/v1/Equipment.php +3 -1
  1113. package/server/src/Http/Resources/v1/Index/Vehicle.php +10 -0
  1114. package/server/src/Http/Resources/v1/InspectionForm.php +153 -0
  1115. package/server/src/Http/Resources/v1/InspectionItemResult.php +77 -0
  1116. package/server/src/Http/Resources/v1/InspectionLink.php +84 -0
  1117. package/server/src/Http/Resources/v1/InspectionSubmission.php +173 -0
  1118. package/server/src/Http/Resources/v1/Trailer.php +199 -0
  1119. package/server/src/Http/Resources/v1/Vehicle.php +2 -0
  1120. package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +3 -0
  1121. package/server/src/Imports/TrailerImport.php +33 -0
  1122. package/server/src/Jobs/PollTelematicTelemetry.php +118 -0
  1123. package/server/src/Jobs/ProcessTelematicDelivery.php +122 -0
  1124. package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +21 -4
  1125. package/server/src/Mail/InspectionLinkPinMail.php +57 -0
  1126. package/server/src/Models/Asset.php +39 -10
  1127. package/server/src/Models/AssetConnection.php +43 -0
  1128. package/server/src/Models/Device.php +39 -8
  1129. package/server/src/Models/DeviceInstallation.php +27 -0
  1130. package/server/src/Models/Driver.php +8 -2
  1131. package/server/src/Models/Equipment.php +2 -0
  1132. package/server/src/Models/FuelProviderTransaction.php +1 -0
  1133. package/server/src/Models/InspectionForm.php +240 -0
  1134. package/server/src/Models/InspectionItemResult.php +90 -0
  1135. package/server/src/Models/InspectionLink.php +284 -0
  1136. package/server/src/Models/InspectionSubmission.php +440 -0
  1137. package/server/src/Models/Part.php +9 -2
  1138. package/server/src/Models/Trailer.php +181 -0
  1139. package/server/src/Models/Vehicle.php +13 -0
  1140. package/server/src/Models/WorkOrder.php +3 -0
  1141. package/server/src/Observers/WorkOrderObserver.php +1 -1
  1142. package/server/src/Providers/FleetOpsServiceProvider.php +13 -2
  1143. package/server/src/Rules/Base64OrUrl.php +54 -0
  1144. package/server/src/Support/Ai/FleetOpsAiQueryResources.php +22 -0
  1145. package/server/src/Support/FuelProviders/FuelProviderService.php +64 -27
  1146. package/server/src/Support/FuelProviders/Providers/PetroAppFuelProvider.php +81 -15
  1147. package/server/src/Support/InspectionFileStore.php +268 -0
  1148. package/server/src/Support/InspectionFormSync.php +231 -0
  1149. package/server/src/Support/InspectionLinkPin.php +150 -0
  1150. package/server/src/Support/InspectionSubmitter.php +297 -0
  1151. package/server/src/Support/Radar/RadarAgenda.php +375 -0
  1152. package/server/src/Support/Radar/RadarBriefing.php +504 -0
  1153. package/server/src/Support/Radar/RadarItemState.php +435 -0
  1154. package/server/src/Support/Radar/RadarRules.php +1424 -0
  1155. package/server/src/Support/Reporting/FleetOpsReportSchema.php +216 -0
  1156. package/server/src/Support/Telematics/Afaqy/Payload.php +49 -0
  1157. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +179 -61
  1158. package/server/src/Support/Telematics/TelematicService.php +71 -5
  1159. package/server/src/Support/Telematics/Telemetry/Configuration.php +30 -0
  1160. package/server/src/Support/Telematics/Telemetry/Inbox.php +61 -0
  1161. package/server/src/Support/Telematics/Telemetry/Ingestor.php +112 -0
  1162. package/server/src/Support/Telematics/Telemetry/Queue.php +28 -0
  1163. package/server/src/Support/Telematics/Telemetry/Sample.php +54 -0
  1164. package/server/src/Support/TrailerSummary.php +35 -0
  1165. package/server/src/routes.php +105 -0
  1166. package/server/tests/ApiManifestControllerContractsTest.php +9 -9
  1167. package/server/tests/CompactResourceSerializationTest.php +36 -0
  1168. package/server/tests/ControllerFilterContractsTest.php +30 -1
  1169. package/server/tests/EventContractsTest.php +2 -1
  1170. package/server/tests/Feature/Http/AfaqyRealtimeIngestionTest.php +792 -0
  1171. package/server/tests/Feature/Http/Api/DeviceControllerContractsTest.php +30 -13
  1172. package/server/tests/Feature/Http/Api/GeofenceControllerContractsTest.php +4 -4
  1173. package/server/tests/Feature/Http/Api/TrailerControllerLifecycleTest.php +640 -0
  1174. package/server/tests/Feature/Http/Internal/DeviceControllerContractsTest.php +20 -5
  1175. package/server/tests/Feature/Http/Internal/DriverControllerCreateRecordTest.php +1 -1
  1176. package/server/tests/Feature/Http/Internal/DriverControllerExistingUserAdoptionTest.php +1 -1
  1177. package/server/tests/Feature/Http/Internal/HubControllerTest.php +28 -2
  1178. package/server/tests/Feature/Http/Internal/LiveControllerEndpointsTest.php +19 -0
  1179. package/server/tests/Feature/Http/Internal/OrderControllerCreateRecordTest.php +1 -1
  1180. package/server/tests/Feature/Http/Internal/RadarControllerDatabaseTest.php +415 -0
  1181. package/server/tests/Feature/Http/Internal/RadarControllerTest.php +594 -0
  1182. package/server/tests/FuelProviderConnectionControllerContractsTest.php +83 -3
  1183. package/server/tests/FuelProviderImplementationTest.php +10 -2
  1184. package/server/tests/HubAndGettingStartedContractsTest.php +26 -3
  1185. package/server/tests/InspectionControllerContractsTest.php +1329 -0
  1186. package/server/tests/InspectionFieldContractsTest.php +1019 -0
  1187. package/server/tests/InspectionModelContractsTest.php +728 -0
  1188. package/server/tests/InspectionSubmitterRulesTest.php +47 -0
  1189. package/server/tests/ModelAccessorContractsTest.php +10 -0
  1190. package/server/tests/ObserverContractsTest.php +1 -1
  1191. package/server/tests/OrderFilterExecutionTest.php +5 -0
  1192. package/server/tests/PublicApiControllerInputContractsTest.php +11 -0
  1193. package/server/tests/PublicFleetOpsRestEndpointsTest.php +15 -3
  1194. package/server/tests/QueueJobContractsTest.php +3 -4
  1195. package/server/tests/RadarRoutesTest.php +35 -0
  1196. package/server/tests/ReportSchemaContractsTest.php +19 -1
  1197. package/server/tests/RouteRegistrationExecutionTest.php +109 -18
  1198. package/server/tests/Support/AfaqyTestCrypto.php +27 -0
  1199. package/server/tests/Support/ExampleTelemetryProvider.php +82 -0
  1200. package/server/tests/Support/TelemetryTestEnvironment.php +53 -0
  1201. package/server/tests/TelematicsHardeningTest.php +21 -19
  1202. package/server/tests/TrailerSupportCoverageTest.php +524 -0
  1203. package/server/tests/Unit/Http/Resources/IndexVehicleResourceTest.php +35 -0
  1204. package/server/tests/Unit/Http/Resources/ManifestResourceTest.php +3 -3
  1205. package/server/tests/Unit/Models/EquipmentTest.php +22 -0
  1206. package/server/tests/Unit/Models/ModelLookupFallbackSeamsTest.php +7 -3
  1207. package/server/tests/Unit/Models/TrailerTest.php +204 -0
  1208. package/server/tests/Unit/Support/FuelProviderServiceMatchingTest.php +127 -0
  1209. package/server/tests/Unit/Support/PetroAppFuelProviderTest.php +126 -1
  1210. package/server/tests/Unit/Support/RadarAgendaTest.php +200 -0
  1211. package/server/tests/Unit/Support/RadarBriefingTest.php +214 -0
  1212. package/server/tests/Unit/Support/RadarItemStateTest.php +260 -0
  1213. package/server/tests/Unit/Support/RadarRulesTest.php +523 -0
  1214. package/server/tests/Unit/Support/Telematics/Providers/AfaqyProviderTest.php +9 -1
  1215. package/server/tests/Unit/Support/Telematics/Providers/AfaqyProviderTransportTest.php +8 -0
  1216. package/server/tests/Unit/Support/Telematics/Providers/AfaqyRealtimeContractTest.php +188 -0
  1217. package/server/tests/Unit/Support/Telematics/TelematicServiceTelemetryTest.php +94 -0
  1218. package/server/tests/VehicleControllerHelperContractsTest.php +14 -0
  1219. package/translations/ar-ae.yml +398 -0
  1220. package/translations/bg-bg.yaml +426 -0
  1221. package/translations/en-us.yaml +1146 -0
  1222. package/translations/es-pa.yaml +427 -0
  1223. package/translations/fr-fr.yaml +426 -0
  1224. package/translations/mn-mn.yaml +426 -0
  1225. package/translations/pt-br.yaml +426 -0
  1226. package/translations/ru-ru.yaml +426 -0
  1227. package/translations/vi-vn.yaml +437 -0
  1228. package/addon/components/cell/attached-vehicle.hbs +0 -10
  1229. package/addon/components/cell/attached-vehicle.js +0 -58
  1230. package/addon/components/cell/device-identity.js +0 -129
  1231. package/addon/components/cell/driver-identity.js +0 -143
  1232. package/addon/components/cell/driver-name.hbs +0 -26
  1233. package/addon/components/cell/driver-name.js +0 -30
  1234. package/addon/components/cell/equipment-identity.js +0 -48
  1235. package/addon/components/cell/part-identity.js +0 -63
  1236. package/addon/components/cell/telematic-device.hbs +0 -38
  1237. package/addon/components/cell/telematic-device.js +0 -44
  1238. package/addon/components/cell/telematic-provider.hbs +0 -33
  1239. package/addon/components/cell/telematic-provider.js +0 -78
  1240. package/addon/components/cell/vehicle-identity.js +0 -138
  1241. package/addon/components/cell/vehicle-name.hbs +0 -23
  1242. package/addon/components/cell/vehicle-name.js +0 -3
  1243. package/addon/components/device/pill.js +0 -3
  1244. package/addon/components/driver/pill.js +0 -7
  1245. package/addon/components/order/pill.js +0 -3
  1246. package/addon/components/vehicle/pill.js +0 -7
  1247. package/addon/templates/connectivity/fuel-providers/details/settings.hbs +0 -11
@@ -0,0 +1,243 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Public;
4
+
5
+ use Fleetbase\FleetOps\Http\Resources\v1\InspectionForm as InspectionFormResource;
6
+ use Fleetbase\FleetOps\Http\Resources\v1\InspectionSubmission as InspectionSubmissionResource;
7
+ use Fleetbase\FleetOps\Models\InspectionForm;
8
+ use Fleetbase\FleetOps\Models\InspectionLink;
9
+ use Fleetbase\FleetOps\Support\InspectionFileStore;
10
+ use Fleetbase\FleetOps\Support\InspectionLinkPin;
11
+ use Fleetbase\FleetOps\Support\InspectionSubmitter;
12
+ use Fleetbase\Models\File;
13
+ use Illuminate\Http\JsonResponse;
14
+ use Illuminate\Http\Request;
15
+ use Illuminate\Routing\Controller;
16
+ use Illuminate\Support\Facades\DB;
17
+
18
+ class PublicInspectionController extends Controller
19
+ {
20
+ /** The largest photo a link will take, in kilobytes: a phone camera's JPEG, with room. */
21
+ public const MAX_UPLOAD_KB = 10240;
22
+
23
+ /** How many files one link may upload, so a leaked link cannot fill the bucket. */
24
+ public const MAX_UPLOADS_PER_LINK = 40;
25
+
26
+ /** What a locked link says, wherever the lock is found. */
27
+ protected const LOCKED_MESSAGE = 'This link is locked after too many incorrect PINs. Ask whoever sent it for a new one.';
28
+
29
+ /** The extension each accepted image type is stored under. */
30
+ protected const EXTENSIONS = [
31
+ 'image/jpeg' => 'jpg',
32
+ 'image/png' => 'png',
33
+ 'image/webp' => 'webp',
34
+ 'image/gif' => 'gif',
35
+ 'image/heic' => 'heic',
36
+ 'image/heif' => 'heif',
37
+ ];
38
+
39
+ public function show(Request $request, string $id): JsonResponse
40
+ {
41
+ [$form, $link] = $this->resolvePublishedFormAndLink($request, $id);
42
+
43
+ $link->markViewed();
44
+
45
+ return response()->json([
46
+ 'form' => (new InspectionFormResource($form))->resolve(),
47
+ 'identity' => $this->identityPayload($link),
48
+ ]);
49
+ }
50
+
51
+ public function submit(Request $request, string $id): JsonResponse
52
+ {
53
+ [$form, $link] = $this->resolvePublishedFormAndLink($request, $id);
54
+
55
+ $validated = $request->validate(InspectionSubmitter::rules());
56
+
57
+ // A link submits through its form's fields. The older flat checklist
58
+ // stores photo URLs exactly as given, which on a public link would let
59
+ // anyone put an arbitrary outside image on the record.
60
+ if (!empty($validated['item_results']) && empty($validated['custom_field_values'])) {
61
+ abort(response()->json(['error' => 'Submit this inspection through its form fields.'], 422));
62
+ }
63
+
64
+ // A single-use link is claimed before anything is written, inside the
65
+ // same transaction as the submission: a second submit at the same
66
+ // moment finds it already taken and writes nothing, and a submission
67
+ // that fails to save gives the link back.
68
+ $submission = DB::connection($link->getConnectionName())->transaction(function () use ($form, $link, $validated, $request) {
69
+ if ($link->single_use && !$link->claim($request->ip(), (string) $request->userAgent())) {
70
+ abort(response()->json(['error' => 'This inspection link has already been used.'], 409));
71
+ }
72
+
73
+ $submission = InspectionSubmitter::submit($form, $validated, [
74
+ 'vehicle_uuid' => $link->vehicle_uuid,
75
+ 'driver_uuid' => $link->driver_uuid,
76
+ // The person the link is for: its assignee, or the driver's
77
+ // account. What they typed as their name is kept beside it,
78
+ // with whether a PIN stood between the link and the form.
79
+ 'submitted_by_uuid' => InspectionLinkPin::recipientFor($link)?->uuid,
80
+ 'source' => 'public_link',
81
+ 'meta' => [
82
+ 'inspection_link_uuid' => $link->uuid,
83
+ 'inspection_link_id' => $link->public_id,
84
+ 'completed_by_name' => data_get($validated, 'signature.name'),
85
+ 'pin_verified' => $link->hasPin(),
86
+ ],
87
+ ]);
88
+
89
+ if (!$link->single_use) {
90
+ $link->markUsed($request->ip(), (string) $request->userAgent());
91
+ }
92
+
93
+ return $submission;
94
+ });
95
+
96
+ return response()->json([
97
+ 'message' => 'Inspection submitted.',
98
+ 'submission' => (new InspectionSubmissionResource($submission->fresh(['form', 'vehicle', 'driver', 'itemResults', 'issue', 'workOrder'])))->resolve(),
99
+ ]);
100
+ }
101
+
102
+ /**
103
+ * Upload a photo or a signature through the link, before submitting.
104
+ *
105
+ * The console uploads through the platform's file endpoint, which needs a
106
+ * session; a link has none, so this is the link's own. It checks the link
107
+ * exactly as submitting does, takes images only, caps how many one link
108
+ * may send, and tags each file with the link it came through — a
109
+ * submission through a link may only reference files uploaded through
110
+ * that same link.
111
+ */
112
+ public function upload(Request $request, string $id): JsonResponse
113
+ {
114
+ [, $link] = $this->resolvePublishedFormAndLink($request, $id);
115
+
116
+ $request->validate([
117
+ 'file' => 'required|file|mimetypes:image/jpeg,image/png,image/webp,image/gif,image/heic,image/heif|max:' . static::MAX_UPLOAD_KB,
118
+ 'type' => 'nullable|in:' . InspectionFileStore::TYPE_PHOTO . ',' . InspectionFileStore::TYPE_SIGNATURE,
119
+ ]);
120
+
121
+ $already = File::query()
122
+ ->where('company_uuid', $link->company_uuid)
123
+ ->where('meta->inspection_link_uuid', $link->uuid)
124
+ ->count();
125
+
126
+ if ($already >= static::MAX_UPLOADS_PER_LINK) {
127
+ abort(response()->json(['error' => 'This inspection link has reached its upload limit.'], 422));
128
+ }
129
+
130
+ $upload = $request->file('file');
131
+ $disk = config('filesystems.default');
132
+ $bucket = config('filesystems.disks.' . $disk . '.bucket', config('filesystems.disks.s3.bucket'));
133
+ // The stored name's extension comes from the type the server found in
134
+ // the bytes, never from the name the device sent. Validation checks the
135
+ // content, so an image that is also valid PHP, uploaded as `photo.php`,
136
+ // would pass it — and stored under that extension on a web-served local
137
+ // disk, it would be an invitation to run it.
138
+ $extension = static::EXTENSIONS[$upload->getMimeType()] ?? 'jpg';
139
+ $stored = $upload->storeAs('inspections/links/' . $link->uuid, File::randomFileNameFromRequest($request, 'file', $extension), ['disk' => $disk]);
140
+
141
+ if ($stored === false) {
142
+ abort(response()->json(['error' => 'This photo could not be stored.'], 500));
143
+ }
144
+
145
+ // Built here rather than through File::createFromUpload(), which takes
146
+ // the company and uploader from the session — and a link has none.
147
+ // The type comes from the bytes the server received, not from the
148
+ // name the device gave the file.
149
+ $file = File::create([
150
+ 'company_uuid' => $link->company_uuid,
151
+ 'uploader_uuid' => InspectionLinkPin::recipientFor($link)?->uuid,
152
+ 'original_filename' => $upload->getClientOriginalName(),
153
+ 'content_type' => $upload->getMimeType(),
154
+ 'disk' => $disk,
155
+ 'path' => $stored,
156
+ 'bucket' => $bucket,
157
+ 'type' => $request->input('type', InspectionFileStore::TYPE_PHOTO),
158
+ 'file_size' => $upload->getSize(),
159
+ 'meta' => ['inspection_link_uuid' => $link->uuid],
160
+ ]);
161
+
162
+ return response()->json([
163
+ 'file' => [
164
+ 'id' => $file->public_id,
165
+ 'url' => $file->url,
166
+ 'filename' => $file->original_filename,
167
+ 'content_type' => $file->content_type,
168
+ ],
169
+ ]);
170
+ }
171
+
172
+ protected function resolvePublishedFormAndLink(Request $request, string $id): array
173
+ {
174
+ $token = (string) $request->query('token', $request->input('token'));
175
+ if (empty($token)) {
176
+ abort(response()->json(['error' => 'Inspection token is required.'], 403));
177
+ }
178
+
179
+ $form = InspectionForm::where('uuid', $id)
180
+ ->orWhere('public_id', $id)
181
+ ->firstOrFail();
182
+
183
+ if (!$form->is_published) {
184
+ abort(response()->json(['error' => 'This inspection form is not available.'], 403));
185
+ }
186
+
187
+ $link = InspectionLink::where('inspection_form_uuid', $form->uuid)
188
+ ->where('token_hash', InspectionLink::hashToken($token))
189
+ ->first();
190
+
191
+ if (!$link) {
192
+ abort(response()->json(['error' => 'Inspection link is invalid.'], 403));
193
+ }
194
+
195
+ if ($link->status === 'locked') {
196
+ abort(response()->json(['error' => static::LOCKED_MESSAGE, 'locked' => true], 403));
197
+ }
198
+
199
+ if (!$link->isUsable()) {
200
+ abort(response()->json(['error' => 'Inspection link is expired, revoked, or already used.'], 403));
201
+ }
202
+
203
+ // A link with a PIN answers nothing, not even the form's name, until
204
+ // the PIN is given. Wrong guesses count against the link and lock it.
205
+ // Every refusal here is a 403, so the page handles them all one way.
206
+ // The page sends it as a header, so it stays out of URLs and the
207
+ // access logs that record them; a `pin` field is accepted as well.
208
+ switch ($link->verifyPin($request->header('X-Inspection-Pin') ?: $request->input('pin'))) {
209
+ case 'missing':
210
+ abort(response()->json(['error' => 'Enter the PIN you were given with this link.', 'pin_required' => true], 403));
211
+ // no break
212
+ case 'wrong':
213
+ abort(response()->json(['error' => 'That PIN is not right.', 'pin_required' => true, 'attempts_left' => $link->pinAttemptsLeft()], 403));
214
+ // no break
215
+ case 'locked':
216
+ abort(response()->json(['error' => static::LOCKED_MESSAGE, 'locked' => true], 403));
217
+ }
218
+
219
+ return [$form, $link];
220
+ }
221
+
222
+ protected function identityPayload(InspectionLink $link): array
223
+ {
224
+ return [
225
+ 'assignee' => $link->assignee ? [
226
+ 'id' => $link->assignee->public_id,
227
+ 'name' => $link->assignee->name,
228
+ ] : null,
229
+ // Name, not phone number: whoever holds the link needs to know who
230
+ // it is for, not how to reach them.
231
+ 'driver' => $link->driver ? [
232
+ 'id' => $link->driver->public_id,
233
+ 'name' => $link->driver->name,
234
+ ] : null,
235
+ 'vehicle' => $link->vehicle ? [
236
+ 'id' => $link->vehicle->public_id,
237
+ 'name' => $link->vehicle->display_name ?? $link->vehicle->name,
238
+ 'plate_number' => $link->vehicle->plate_number,
239
+ ] : null,
240
+ 'expires_at' => $link->expires_at,
241
+ ];
242
+ }
243
+ }
@@ -0,0 +1,60 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers;
4
+
5
+ use Fleetbase\FleetOps\Models\Telematic;
6
+ use Fleetbase\FleetOps\Support\Telematics\Telemetry\Configuration;
7
+ use Fleetbase\FleetOps\Support\Telematics\Telemetry\Inbox;
8
+ use Illuminate\Http\JsonResponse;
9
+ use Illuminate\Http\Request;
10
+ use Illuminate\Routing\Controller;
11
+ use Illuminate\Support\Facades\Crypt;
12
+ use Illuminate\Support\Facades\DB;
13
+
14
+ class TelematicPositionWebhookController extends Controller
15
+ {
16
+ public function handle(Request $request, Inbox $inbox, string $providerKey): JsonResponse
17
+ {
18
+ if (!$request->isMethod('post')) {
19
+ return response()->json(['error' => 'POST required.'], 405);
20
+ }
21
+ $id = $request->query('telematic');
22
+ $token = $request->query('key');
23
+ if (!is_string($id) || !is_string($token)) {
24
+ return response()->json(['error' => 'Invalid webhook credentials.'], 403);
25
+ }
26
+ $telematic = Telematic::withoutGlobalScopes()->where('provider', $providerKey)->where('public_id', $id)->first();
27
+ $stored = $telematic ? DB::table('telematic_webhook_credentials')->where('telematic_uuid', $telematic->uuid)->value('token') : null;
28
+ if (!$stored || !hash_equals(Crypt::decryptString($stored), $token) || !Inbox::enabled($telematic)) {
29
+ return response()->json(['error' => 'Invalid webhook credentials.'], 403);
30
+ }
31
+ $options = Configuration::forConnection($telematic);
32
+ if (!($options['webhooks_enabled'] ?? false)) {
33
+ return response()->json(['error' => 'Webhook processing is disabled.'], 503);
34
+ }
35
+ $body = $request->getContent();
36
+ if (strlen($body) > ($options['max_payload_bytes'] ?? 2097152)) {
37
+ return response()->json(['error' => 'Payload too large.'], 413);
38
+ }
39
+ try {
40
+ $payload = json_decode($body, true, 64, JSON_THROW_ON_ERROR);
41
+ if (!is_array($payload)) {
42
+ throw new \InvalidArgumentException();
43
+ }
44
+ } catch (\Throwable) {
45
+ return response()->json(['error' => 'JSON object or array required.'], 422);
46
+ }
47
+ try {
48
+ // Per-connection pressure protection; The provider can retry after capacity recovers.
49
+ $pending = DB::table('telematic_deliveries')->where('telematic_uuid', $telematic->uuid)->whereIn('status', ['pending', 'processing', 'retry'])->count();
50
+ if ($pending >= ($options['max_pending_deliveries'] ?? 10000)) {
51
+ return response()->json(['error' => 'Ingestion capacity exceeded.'], 503);
52
+ }
53
+ $delivery = $inbox->accept($telematic, $payload, 'webhook');
54
+
55
+ return response()->json(['status' => 'accepted', 'delivery_id' => $delivery], 200);
56
+ } catch (\Throwable) {
57
+ return response()->json(['error' => 'Unable to persist delivery; retry required.'], 503);
58
+ }
59
+ }
60
+ }
@@ -38,6 +38,9 @@ class TelematicWebhookController extends Controller
38
38
  */
39
39
  public function handle(Request $request, string $providerKey): JsonResponse
40
40
  {
41
+ if ($this->registry->resolve($providerKey) instanceof \Fleetbase\FleetOps\Contracts\TelemetryProviderInterface) {
42
+ return app(TelematicPositionWebhookController::class)->handle($request, app(\Fleetbase\FleetOps\Support\Telematics\Telemetry\Inbox::class), $providerKey);
43
+ }
41
44
  $correlationId = Str::uuid()->toString();
42
45
 
43
46
  Log::info('Webhook received', [
@@ -2,7 +2,11 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Filter;
4
4
 
5
+ use Fleetbase\FleetOps\Models\Driver;
6
+ use Fleetbase\FleetOps\Models\Trailer;
7
+ use Fleetbase\FleetOps\Models\Vehicle;
5
8
  use Fleetbase\Http\Filter\Filter;
9
+ use Fleetbase\Support\Http;
6
10
 
7
11
  class EquipmentFilter extends Filter
8
12
  {
@@ -20,4 +24,51 @@ class EquipmentFilter extends Filter
20
24
  {
21
25
  $this->builder->search($searchQuery);
22
26
  }
27
+
28
+ public function attachmentState(?string $state)
29
+ {
30
+ $state === 'attached' ? $this->builder->whereNotNull('equipable_uuid') : $this->builder->whereNull('equipable_uuid');
31
+ }
32
+
33
+ public function equipableType(?string $type)
34
+ {
35
+ $class = match ($type) {
36
+ 'vehicle', 'fleet-ops:vehicle' => Vehicle::class, 'trailer', 'fleet-ops:trailer' => Trailer::class, default => null,
37
+ };
38
+ $class ? $this->builder->where('equipable_type', $class) : $this->builder->whereRaw('0 = 1');
39
+ }
40
+
41
+ /**
42
+ * Filter by the asset the equipment is equipped to. `equipable` is a morphTo relation,
43
+ * which `whereHas` cannot traverse, so the identifier is resolved to the asset UUID
44
+ * across every equipable model first. The public API filters by public id; the
45
+ * console may also pass the asset UUID.
46
+ */
47
+ public function equipable($id)
48
+ {
49
+ $identifiers = array_values(array_filter(array_map('strval', (array) $id), 'strlen'));
50
+
51
+ if (empty($identifiers)) {
52
+ return;
53
+ }
54
+
55
+ $allowUuid = Http::isInternalRequest($this->request);
56
+ $uuids = [];
57
+
58
+ foreach ([Vehicle::class, Trailer::class, Driver::class] as $modelClass) {
59
+ $uuids = array_merge($uuids, $modelClass::query()
60
+ ->where('company_uuid', $this->session->get('company'))
61
+ ->where(function ($query) use ($identifiers, $allowUuid) {
62
+ $query->whereIn('public_id', $identifiers);
63
+
64
+ if ($allowUuid) {
65
+ $query->orWhereIn('uuid', $identifiers);
66
+ }
67
+ })
68
+ ->pluck('uuid')
69
+ ->all());
70
+ }
71
+
72
+ $this->builder->whereIn('equipable_uuid', $uuids);
73
+ }
23
74
  }
@@ -23,7 +23,7 @@ class FuelProviderConnectionFilter extends Filter
23
23
 
24
24
  public function status(?string $status)
25
25
  {
26
- $this->builder->where('status', $status);
26
+ $this->builder->whereIn('status', explode(',', $status ?? ''));
27
27
  }
28
28
 
29
29
  public function environment(?string $environment)
@@ -366,6 +366,21 @@ class OrderFilter extends Filter
366
366
  }
367
367
  }
368
368
 
369
+ /**
370
+ * Exact match on one or many operator-side ids. The console's tag-input filter
371
+ * joins scanned or pasted ids with commas so a batch of labels resolves in one query.
372
+ */
373
+ public function internalId($internalId)
374
+ {
375
+ $ids = array_values(array_filter(array_map('trim', explode(',', (string) $internalId)), 'strlen'));
376
+
377
+ if ($ids === []) {
378
+ return;
379
+ }
380
+
381
+ $this->builder->whereIn('internal_id', $ids);
382
+ }
383
+
369
384
  public function bulkQuery($ids)
370
385
  {
371
386
  $ids = Utils::arrayFrom($ids);
@@ -0,0 +1,269 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Filter;
4
+
5
+ use Fleetbase\FleetOps\Models\Device;
6
+ use Fleetbase\FleetOps\Models\Vehicle;
7
+ use Fleetbase\FleetOps\Models\Vendor;
8
+ use Fleetbase\FleetOps\Support\Utils;
9
+ use Fleetbase\Http\Filter\Filter;
10
+ use Fleetbase\Models\Category;
11
+ use Fleetbase\Support\Http;
12
+
13
+ class TrailerFilter extends Filter
14
+ {
15
+ public function queryForInternal()
16
+ {
17
+ $this->builder->where('company_uuid', $this->session->get('company'));
18
+ }
19
+
20
+ public function queryForPublic()
21
+ {
22
+ $this->queryForInternal();
23
+ }
24
+
25
+ public function query(?string $value)
26
+ {
27
+ $this->builder->search($value);
28
+ }
29
+
30
+ public function publicId(?string $value)
31
+ {
32
+ $this->builder->searchWhere('public_id', $value);
33
+ }
34
+
35
+ public function name(?string $value)
36
+ {
37
+ $this->builder->searchWhere('name', $value);
38
+ }
39
+
40
+ public function code(?string $value)
41
+ {
42
+ $this->builder->searchWhere('code', $value);
43
+ }
44
+
45
+ public function trailerType($value)
46
+ {
47
+ $this->whereOneOf('type', $value);
48
+ }
49
+
50
+ public function status($value)
51
+ {
52
+ $this->whereOneOf('status', $value);
53
+ }
54
+
55
+ public function trailerMake(?string $value)
56
+ {
57
+ $this->builder->searchWhere('make', $value);
58
+ }
59
+
60
+ public function trailerModel(?string $value)
61
+ {
62
+ $this->builder->searchWhere('model', $value);
63
+ }
64
+
65
+ public function trailerYear($value)
66
+ {
67
+ $this->whereOneOf('year', $value);
68
+ }
69
+
70
+ public function plateNumber(?string $value)
71
+ {
72
+ $this->builder->searchWhere('plate_number', $value);
73
+ }
74
+
75
+ public function vin(?string $value)
76
+ {
77
+ $this->builder->searchWhere('vin', $value);
78
+ }
79
+
80
+ public function serialNumber(?string $value)
81
+ {
82
+ $this->builder->searchWhere('serial_number', $value);
83
+ }
84
+
85
+ public function bodyType(?string $value)
86
+ {
87
+ $this->builder->searchWhere('body_type', $value);
88
+ }
89
+
90
+ public function length($value)
91
+ {
92
+ $this->whereOneOf('length', $value);
93
+ }
94
+
95
+ public function axleCount($value)
96
+ {
97
+ $this->whereOneOf('axle_count', $value);
98
+ }
99
+
100
+ public function gvwr($value)
101
+ {
102
+ $this->whereOneOf('gvwr', $value);
103
+ }
104
+
105
+ public function payloadCapacity($value)
106
+ {
107
+ $this->whereOneOf('payload_capacity', $value);
108
+ }
109
+
110
+ public function ownershipType($value)
111
+ {
112
+ $this->whereOneOf('ownership_type', $value);
113
+ }
114
+
115
+ public function refrigerated($value)
116
+ {
117
+ $this->builder->where('refrigerated', filter_var($value, FILTER_VALIDATE_BOOLEAN));
118
+ }
119
+
120
+ public function devicesCount($value)
121
+ {
122
+ $this->builder->has('devices', '=', (int) $value);
123
+ }
124
+
125
+ public function equipmentCount($value)
126
+ {
127
+ $this->builder->has('equipments', '=', (int) $value);
128
+ }
129
+
130
+ /**
131
+ * Connectivity is derived from `last_online_at`, mirroring
132
+ * Trailer::getConnectivityStatusAttribute(). Multiple states combine with OR.
133
+ */
134
+ public function connectivityStatus($value)
135
+ {
136
+ $states = array_values(array_filter(array_map('strval', (array) $value), 'strlen'));
137
+
138
+ if (empty($states)) {
139
+ return;
140
+ }
141
+
142
+ $this->builder->where(function ($query) use ($states) {
143
+ foreach ($states as $state) {
144
+ $query->orWhere(function ($query) use ($state) {
145
+ match ($state) {
146
+ 'never_connected' => $query->whereNull('last_online_at'),
147
+ 'online' => $query->where('last_online_at', '>=', now()->subMinutes(10)),
148
+ 'recently_offline' => $query->whereBetween('last_online_at', [now()->subDay(), now()->subMinutes(10)]),
149
+ 'offline' => $query->where('last_online_at', '<', now()->subDay()),
150
+ default => $query->whereRaw('0 = 1'),
151
+ };
152
+ });
153
+ }
154
+ });
155
+ }
156
+
157
+ public function attachmentState($value)
158
+ {
159
+ $states = array_unique(array_values(array_filter(array_map('strval', (array) $value), 'strlen')));
160
+
161
+ // Asking for both states is the same as not filtering.
162
+ if (empty($states) || count($states) > 1) {
163
+ return;
164
+ }
165
+
166
+ $method = $states[0] === 'attached' ? 'whereHas' : 'whereDoesntHave';
167
+ $this->builder->{$method}('currentConnection');
168
+ }
169
+
170
+ public function vehicle($value)
171
+ {
172
+ $uuids = $this->resolveRelationUuids(Vehicle::class, $value);
173
+
174
+ $this->builder->whereHas('currentConnection', fn ($query) => $query->whereIn('connector_uuid', $uuids));
175
+ }
176
+
177
+ public function vendor($value)
178
+ {
179
+ $this->builder->whereIn('vendor_uuid', $this->resolveRelationUuids(Vendor::class, $value));
180
+ }
181
+
182
+ /**
183
+ * Trailers with any of the given devices installed.
184
+ */
185
+ public function device($value)
186
+ {
187
+ $uuids = $this->resolveRelationUuids(Device::class, $value);
188
+
189
+ $this->builder->whereHas('devices', fn ($query) => $query->whereIn('uuid', $uuids));
190
+ }
191
+
192
+ public function category($value)
193
+ {
194
+ $this->builder->whereIn('category_uuid', $this->resolveRelationUuids(Category::class, $value, false));
195
+ }
196
+
197
+ public function createdAt($value)
198
+ {
199
+ $this->dateFilter('created_at', $value);
200
+ }
201
+
202
+ public function updatedAt($value)
203
+ {
204
+ $this->dateFilter('updated_at', $value);
205
+ }
206
+
207
+ public function lastOnlineAt($value)
208
+ {
209
+ $this->dateFilter('last_online_at', $value);
210
+ }
211
+
212
+ public function purchasedAt($value)
213
+ {
214
+ $this->dateFilter('purchased_at', $value);
215
+ }
216
+
217
+ /**
218
+ * Console multi-option filters submit arrays; the public API submits scalars.
219
+ */
220
+ private function whereOneOf(string $column, $value): void
221
+ {
222
+ $values = array_values(array_filter(array_map('strval', (array) $value), 'strlen'));
223
+
224
+ if (empty($values)) {
225
+ return;
226
+ }
227
+
228
+ count($values) === 1 ? $this->builder->where($column, $values[0]) : $this->builder->whereIn($column, $values);
229
+ }
230
+
231
+ /**
232
+ * Resolve related record identifiers to UUIDs. The console filters by the record's
233
+ * UUID; the public API filters by public id (or a vehicle's internal id).
234
+ */
235
+ private function resolveRelationUuids(string $modelClass, $identifiers, bool $scopeToCompany = true): array
236
+ {
237
+ $identifiers = array_values(array_filter(array_map('strval', (array) $identifiers), 'strlen'));
238
+
239
+ if (empty($identifiers)) {
240
+ return [];
241
+ }
242
+
243
+ $instance = new $modelClass();
244
+ $query = $modelClass::query()->where(function ($query) use ($identifiers, $instance) {
245
+ $query->whereIn('public_id', $identifiers);
246
+
247
+ if (in_array('internal_id', $instance->getFillable(), true)) {
248
+ $query->orWhereIn('internal_id', $identifiers);
249
+ }
250
+
251
+ if (Http::isInternalRequest($this->request)) {
252
+ $query->orWhereIn('uuid', $identifiers);
253
+ }
254
+ });
255
+
256
+ if ($scopeToCompany) {
257
+ $query->where('company_uuid', $this->session->get('company'));
258
+ }
259
+
260
+ return $query->pluck('uuid')->all();
261
+ }
262
+
263
+ private function dateFilter(string $column, $value): void
264
+ {
265
+ $range = Utils::dateRange($value);
266
+
267
+ is_array($range) ? $this->builder->whereBetween($column, $range) : $this->builder->whereDate($column, $range);
268
+ }
269
+ }