@fleetbase/fleetops-engine 0.2.5 → 0.2.7

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 (325) hide show
  1. package/.gitattributes +14 -0
  2. package/.php-cs-fixer.cache +1 -0
  3. package/.php-cs-fixer.php +29 -0
  4. package/LICENSE.md +16 -4
  5. package/README.md +103 -13
  6. package/addon/components/admin/visibility-controls.hbs +12 -0
  7. package/addon/components/admin/visibility-controls.js +82 -0
  8. package/addon/components/fleet-panel.js +13 -4
  9. package/addon/components/fleet-vehicle-listing.hbs +1 -1
  10. package/addon/components/layout/fleet-ops-sidebar.hbs +26 -0
  11. package/addon/components/layout/fleet-ops-sidebar.js +129 -0
  12. package/addon/engine.js +19 -0
  13. package/addon/helpers/is-section-visible.js +5 -0
  14. package/addon/routes/application.js +6 -2
  15. package/addon/routes/virtual.js +10 -0
  16. package/addon/routes.js +1 -0
  17. package/addon/templates/application.hbs +1 -19
  18. package/addon/templates/virtual.hbs +9 -0
  19. package/app/components/admin/visibility-controls.js +1 -0
  20. package/app/components/layout/fleet-ops-sidebar.js +1 -0
  21. package/app/helpers/is-section-visible.js +1 -0
  22. package/app/routes/virtual.js +1 -0
  23. package/app/templates/virtual.js +1 -0
  24. package/composer.json +85 -0
  25. package/extension.json +10 -0
  26. package/package.json +6 -6
  27. package/phpstan.neon.dist +8 -0
  28. package/phpunit.xml.dist +16 -0
  29. package/server/config/api.php +765 -0
  30. package/server/config/cache.stores.php +18 -0
  31. package/server/config/dompdf.php +242 -0
  32. package/server/config/fleetops.php +19 -0
  33. package/server/config/geocoder.php +108 -0
  34. package/server/data/globe.json +261 -0
  35. package/server/migrations/2023_04_27_053456_create_contacts_table.php +49 -0
  36. package/server/migrations/2023_04_27_053456_create_drivers_table.php +62 -0
  37. package/server/migrations/2023_04_27_053456_create_entities_table.php +67 -0
  38. package/server/migrations/2023_04_27_053456_create_fleet_drivers_table.php +39 -0
  39. package/server/migrations/2023_04_27_053456_create_fleets_table.php +47 -0
  40. package/server/migrations/2023_04_27_053456_create_fuel_reports_table.php +50 -0
  41. package/server/migrations/2023_04_27_053456_create_integrated_vendors_table.php +44 -0
  42. package/server/migrations/2023_04_27_053456_create_issues_table.php +53 -0
  43. package/server/migrations/2023_04_27_053456_create_orders_table.php +70 -0
  44. package/server/migrations/2023_04_27_053456_create_payloads_table.php +51 -0
  45. package/server/migrations/2023_04_27_053456_create_places_table.php +62 -0
  46. package/server/migrations/2023_04_27_053456_create_positions_table.php +46 -0
  47. package/server/migrations/2023_04_27_053456_create_proofs_table.php +44 -0
  48. package/server/migrations/2023_04_27_053456_create_purchase_rates_table.php +46 -0
  49. package/server/migrations/2023_04_27_053456_create_routes_table.php +40 -0
  50. package/server/migrations/2023_04_27_053456_create_service_areas_table.php +47 -0
  51. package/server/migrations/2023_04_27_053456_create_service_quote_items_table.php +42 -0
  52. package/server/migrations/2023_04_27_053456_create_service_quotes_table.php +47 -0
  53. package/server/migrations/2023_04_27_053456_create_service_rate_fees_table.php +45 -0
  54. package/server/migrations/2023_04_27_053456_create_service_rate_parcel_fees_table.php +47 -0
  55. package/server/migrations/2023_04_27_053456_create_service_rates_table.php +61 -0
  56. package/server/migrations/2023_04_27_053456_create_tracking_numbers_table.php +46 -0
  57. package/server/migrations/2023_04_27_053456_create_tracking_statuses_table.php +54 -0
  58. package/server/migrations/2023_04_27_053456_create_vehicles_table.php +84 -0
  59. package/server/migrations/2023_04_27_053456_create_vendors_table.php +56 -0
  60. package/server/migrations/2023_04_27_053456_create_waypoints_table.php +45 -0
  61. package/server/migrations/2023_04_27_053456_create_zones_table.php +46 -0
  62. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_companies_table.php +32 -0
  63. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_contacts_table.php +34 -0
  64. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_drivers_table.php +40 -0
  65. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_entities_table.php +40 -0
  66. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleet_drivers_table.php +34 -0
  67. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleets_table.php +36 -0
  68. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fuel_reports_table.php +36 -0
  69. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_integrated_vendors_table.php +34 -0
  70. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_issues_table.php +38 -0
  71. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_orders_table.php +48 -0
  72. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_payloads_table.php +40 -0
  73. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_places_table.php +32 -0
  74. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_positions_table.php +36 -0
  75. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_proofs_table.php +34 -0
  76. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_purchase_rates_table.php +38 -0
  77. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_routes_table.php +34 -0
  78. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_areas_table.php +34 -0
  79. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quote_items_table.php +32 -0
  80. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quotes_table.php +38 -0
  81. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_fees_table.php +32 -0
  82. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_parcel_fees_table.php +32 -0
  83. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rates_table.php +36 -0
  84. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_numbers_table.php +34 -0
  85. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_statuses_table.php +34 -0
  86. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vehicles_table.php +36 -0
  87. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vendors_table.php +40 -0
  88. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_waypoints_table.php +38 -0
  89. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_zones_table.php +34 -0
  90. package/server/migrations/2023_09_14_074512_update_vehicles_table.php +100 -0
  91. package/server/migrations/2023_09_14_074619_create_vehicle_devices_table.php +44 -0
  92. package/server/migrations/2023_09_26_071205_add_online_column_to_vehicles_table.php +32 -0
  93. package/server/migrations/2023_09_26_083957_create_fleet_vehicles_table.php +45 -0
  94. package/server/migrations/2023_09_27_023757_add_column_to_fleets_table.php +46 -0
  95. package/server/migrations/2023_10_05_074811_update_vehicle.php +42 -0
  96. package/server/resources/views/labels/default.php +165 -0
  97. package/server/src/Auth/Schemas/FleetOps.php +75 -0
  98. package/server/src/Casts/MultiPolygon.php +50 -0
  99. package/server/src/Casts/Point.php +109 -0
  100. package/server/src/Casts/Polygon.php +46 -0
  101. package/server/src/Console/Commands/DispatchAdhocOrders.php +137 -0
  102. package/server/src/Console/Commands/DispatchOrders.php +71 -0
  103. package/server/src/Console/Commands/TrackOrderDistanceAndTime.php +62 -0
  104. package/server/src/Events/DriverLocationChanged.php +174 -0
  105. package/server/src/Events/DriverSimulatedLocationChanged.php +183 -0
  106. package/server/src/Events/EntityDriverAssigned.php +36 -0
  107. package/server/src/Events/OrderCanceled.php +15 -0
  108. package/server/src/Events/OrderCompleted.php +15 -0
  109. package/server/src/Events/OrderDispatchFailed.php +42 -0
  110. package/server/src/Events/OrderDispatched.php +15 -0
  111. package/server/src/Events/OrderDriverAssigned.php +15 -0
  112. package/server/src/Events/OrderReady.php +15 -0
  113. package/server/src/Events/OrderStarted.php +15 -0
  114. package/server/src/Exceptions/IntegratedVendorException.php +18 -0
  115. package/server/src/Expansions/UserExpansion.php +63 -0
  116. package/server/src/Exports/ContactExport.php +56 -0
  117. package/server/src/Exports/DriverExport.php +61 -0
  118. package/server/src/Exports/FleetExport.php +53 -0
  119. package/server/src/Exports/PlaceExport.php +55 -0
  120. package/server/src/Exports/ServiceAreaExport.php +58 -0
  121. package/server/src/Exports/VehicleExport.php +57 -0
  122. package/server/src/Exports/VendorExport.php +57 -0
  123. package/server/src/Http/Controllers/Api/v1/ContactController.php +133 -0
  124. package/server/src/Http/Controllers/Api/v1/DriverController.php +691 -0
  125. package/server/src/Http/Controllers/Api/v1/EntityController.php +230 -0
  126. package/server/src/Http/Controllers/Api/v1/FleetController.php +146 -0
  127. package/server/src/Http/Controllers/Api/v1/LabelController.php +63 -0
  128. package/server/src/Http/Controllers/Api/v1/OrderController.php +1114 -0
  129. package/server/src/Http/Controllers/Api/v1/PayloadController.php +195 -0
  130. package/server/src/Http/Controllers/Api/v1/PlaceController.php +333 -0
  131. package/server/src/Http/Controllers/Api/v1/PurchaseRateController.php +199 -0
  132. package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +133 -0
  133. package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +381 -0
  134. package/server/src/Http/Controllers/Api/v1/ServiceRateController.php +223 -0
  135. package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +146 -0
  136. package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +138 -0
  137. package/server/src/Http/Controllers/Api/v1/VehicleController.php +191 -0
  138. package/server/src/Http/Controllers/Api/v1/VendorController.php +159 -0
  139. package/server/src/Http/Controllers/Api/v1/ZoneController.php +146 -0
  140. package/server/src/Http/Controllers/FleetOpsController.php +13 -0
  141. package/server/src/Http/Controllers/Internal/v1/ContactController.php +69 -0
  142. package/server/src/Http/Controllers/Internal/v1/DriverController.php +261 -0
  143. package/server/src/Http/Controllers/Internal/v1/EntityController.php +15 -0
  144. package/server/src/Http/Controllers/Internal/v1/FleetController.php +152 -0
  145. package/server/src/Http/Controllers/Internal/v1/FleetOpsLookupController.php +80 -0
  146. package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +15 -0
  147. package/server/src/Http/Controllers/Internal/v1/GeocoderController.php +96 -0
  148. package/server/src/Http/Controllers/Internal/v1/IntegratedVendorController.php +63 -0
  149. package/server/src/Http/Controllers/Internal/v1/IssueController.php +15 -0
  150. package/server/src/Http/Controllers/Internal/v1/LiveController.php +127 -0
  151. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +75 -0
  152. package/server/src/Http/Controllers/Internal/v1/MorphController.php +77 -0
  153. package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +269 -0
  154. package/server/src/Http/Controllers/Internal/v1/OrderController.php +564 -0
  155. package/server/src/Http/Controllers/Internal/v1/PayloadController.php +15 -0
  156. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +163 -0
  157. package/server/src/Http/Controllers/Internal/v1/ProofController.php +139 -0
  158. package/server/src/Http/Controllers/Internal/v1/PurchaseRateController.php +15 -0
  159. package/server/src/Http/Controllers/Internal/v1/RouteController.php +15 -0
  160. package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +32 -0
  161. package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +345 -0
  162. package/server/src/Http/Controllers/Internal/v1/ServiceRateController.php +47 -0
  163. package/server/src/Http/Controllers/Internal/v1/SettingController.php +30 -0
  164. package/server/src/Http/Controllers/Internal/v1/TrackingNumberController.php +15 -0
  165. package/server/src/Http/Controllers/Internal/v1/TrackingStatusController.php +15 -0
  166. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +65 -0
  167. package/server/src/Http/Controllers/Internal/v1/VehicleDeviceController.php +15 -0
  168. package/server/src/Http/Controllers/Internal/v1/VendorController.php +120 -0
  169. package/server/src/Http/Controllers/Internal/v1/ZoneController.php +15 -0
  170. package/server/src/Http/Filter/ContactFilter.php +86 -0
  171. package/server/src/Http/Filter/DriverFilter.php +148 -0
  172. package/server/src/Http/Filter/FleetFilter.php +108 -0
  173. package/server/src/Http/Filter/IntegratedVendorFilter.php +13 -0
  174. package/server/src/Http/Filter/OrderFilter.php +242 -0
  175. package/server/src/Http/Filter/PlaceFilter.php +111 -0
  176. package/server/src/Http/Filter/ServiceAreaFilter.php +13 -0
  177. package/server/src/Http/Filter/ServiceQuoteFilter.php +13 -0
  178. package/server/src/Http/Filter/ServiceRateFilter.php +33 -0
  179. package/server/src/Http/Filter/TrackingStatusFilter.php +43 -0
  180. package/server/src/Http/Filter/VehicleFilter.php +91 -0
  181. package/server/src/Http/Filter/VendorFilter.php +83 -0
  182. package/server/src/Http/Filter/ZoneFilter.php +13 -0
  183. package/server/src/Http/Requests/CancelOrderRequest.php +31 -0
  184. package/server/src/Http/Requests/CreateContactRequest.php +33 -0
  185. package/server/src/Http/Requests/CreateDriverRequest.php +55 -0
  186. package/server/src/Http/Requests/CreateEntityRequest.php +43 -0
  187. package/server/src/Http/Requests/CreateFleetRequest.php +32 -0
  188. package/server/src/Http/Requests/CreateOrderRequest.php +66 -0
  189. package/server/src/Http/Requests/CreatePayloadRequest.php +37 -0
  190. package/server/src/Http/Requests/CreatePlaceRequest.php +38 -0
  191. package/server/src/Http/Requests/CreatePurchaseRateRequest.php +33 -0
  192. package/server/src/Http/Requests/CreateServiceAreaRequest.php +35 -0
  193. package/server/src/Http/Requests/CreateServiceQuoteRequest.php +29 -0
  194. package/server/src/Http/Requests/CreateServiceRateRequest.php +56 -0
  195. package/server/src/Http/Requests/CreateTrackingNumberRequest.php +34 -0
  196. package/server/src/Http/Requests/CreateTrackingStatusRequest.php +42 -0
  197. package/server/src/Http/Requests/CreateVehicleRequest.php +32 -0
  198. package/server/src/Http/Requests/CreateVendorRequest.php +35 -0
  199. package/server/src/Http/Requests/CreateZoneRequest.php +35 -0
  200. package/server/src/Http/Requests/DecodeTrackingNumberQR.php +30 -0
  201. package/server/src/Http/Requests/DriverSimulationRequest.php +46 -0
  202. package/server/src/Http/Requests/Internal/AssignOrderRequest.php +31 -0
  203. package/server/src/Http/Requests/Internal/CreateDriverRequest.php +42 -0
  204. package/server/src/Http/Requests/Internal/FleetActionRequest.php +32 -0
  205. package/server/src/Http/Requests/Internal/UpdateDriverRequest.php +7 -0
  206. package/server/src/Http/Requests/QueryServiceQuotesRequest.php +41 -0
  207. package/server/src/Http/Requests/UpdateContactRequest.php +20 -0
  208. package/server/src/Http/Requests/UpdateDriverRequest.php +7 -0
  209. package/server/src/Http/Requests/UpdateEntityRequest.php +7 -0
  210. package/server/src/Http/Requests/UpdateFleetRequest.php +7 -0
  211. package/server/src/Http/Requests/UpdateOrderRequest.php +7 -0
  212. package/server/src/Http/Requests/UpdatePayloadRequest.php +7 -0
  213. package/server/src/Http/Requests/UpdatePlaceRequest.php +7 -0
  214. package/server/src/Http/Requests/UpdatePurchaseRateRequest.php +7 -0
  215. package/server/src/Http/Requests/UpdateServiceAreaRequest.php +29 -0
  216. package/server/src/Http/Requests/UpdateServiceQuoteRequest.php +29 -0
  217. package/server/src/Http/Requests/UpdateServiceRateRequest.php +29 -0
  218. package/server/src/Http/Requests/UpdateTrackingNumberRequest.php +7 -0
  219. package/server/src/Http/Requests/UpdateTrackingStatusRequest.php +32 -0
  220. package/server/src/Http/Requests/UpdateVehicleRequest.php +7 -0
  221. package/server/src/Http/Requests/UpdateVendorRequest.php +7 -0
  222. package/server/src/Http/Requests/UpdateZoneRequest.php +7 -0
  223. package/server/src/Http/Resources/Internal/v1/IntegratedVendorFacilitator.php +37 -0
  224. package/server/src/Http/Resources/Internal/v1/Vehicle.php +33 -0
  225. package/server/src/Http/Resources/Internal/v1/Waypoint.php +34 -0
  226. package/server/src/Http/Resources/v1/Contact.php +62 -0
  227. package/server/src/Http/Resources/v1/CurrentJob.php +36 -0
  228. package/server/src/Http/Resources/v1/DeletedResource.php +61 -0
  229. package/server/src/Http/Resources/v1/Driver.php +89 -0
  230. package/server/src/Http/Resources/v1/Entity.php +107 -0
  231. package/server/src/Http/Resources/v1/Fleet.php +60 -0
  232. package/server/src/Http/Resources/v1/FuelReport.php +67 -0
  233. package/server/src/Http/Resources/v1/Order.php +131 -0
  234. package/server/src/Http/Resources/v1/Payload.php +94 -0
  235. package/server/src/Http/Resources/v1/Place.php +84 -0
  236. package/server/src/Http/Resources/v1/Proof.php +36 -0
  237. package/server/src/Http/Resources/v1/PurchaseRate.php +77 -0
  238. package/server/src/Http/Resources/v1/ServiceArea.php +55 -0
  239. package/server/src/Http/Resources/v1/ServiceQuote.php +57 -0
  240. package/server/src/Http/Resources/v1/ServiceRate.php +94 -0
  241. package/server/src/Http/Resources/v1/ServiceRateFee.php +58 -0
  242. package/server/src/Http/Resources/v1/ServiceRateParcelFee.php +48 -0
  243. package/server/src/Http/Resources/v1/TrackingNumber.php +62 -0
  244. package/server/src/Http/Resources/v1/TrackingStatus.php +84 -0
  245. package/server/src/Http/Resources/v1/Vehicle.php +75 -0
  246. package/server/src/Http/Resources/v1/VehicleDevice.php +44 -0
  247. package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +72 -0
  248. package/server/src/Http/Resources/v1/Vendor.php +72 -0
  249. package/server/src/Http/Resources/v1/Zone.php +60 -0
  250. package/server/src/Imports/OrdersImport.php +18 -0
  251. package/server/src/Integrations/Lalamove/Lalamove.php +678 -0
  252. package/server/src/Integrations/Lalamove/LalamoveDeliveryStop.php +97 -0
  253. package/server/src/Integrations/Lalamove/LalamoveMarket.php +123 -0
  254. package/server/src/Integrations/Lalamove/LalamoveServiceType.php +161 -0
  255. package/server/src/Jobs/SimulateDrivingRoute.php +81 -0
  256. package/server/src/Jobs/SimulateWaypointReached.php +79 -0
  257. package/server/src/Listeners/HandleOrderCanceled.php +46 -0
  258. package/server/src/Listeners/HandleOrderCreated.php +23 -0
  259. package/server/src/Listeners/HandleOrderDispatchFailed.php +35 -0
  260. package/server/src/Listeners/HandleOrderDispatched.php +108 -0
  261. package/server/src/Listeners/HandleOrderDriverAssigned.php +42 -0
  262. package/server/src/Listeners/HandleOrderReady.php +27 -0
  263. package/server/src/Listeners/HandleUserRemovedFromCompany.php +31 -0
  264. package/server/src/Models/Contact.php +239 -0
  265. package/server/src/Models/Driver.php +543 -0
  266. package/server/src/Models/Entity.php +416 -0
  267. package/server/src/Models/Fleet.php +203 -0
  268. package/server/src/Models/FleetDriver.php +73 -0
  269. package/server/src/Models/FleetVehicle.php +73 -0
  270. package/server/src/Models/FuelReport.php +125 -0
  271. package/server/src/Models/IntegratedVendor.php +219 -0
  272. package/server/src/Models/Issue.php +111 -0
  273. package/server/src/Models/Order.php +1132 -0
  274. package/server/src/Models/Payload.php +699 -0
  275. package/server/src/Models/Place.php +656 -0
  276. package/server/src/Models/Position.php +119 -0
  277. package/server/src/Models/Proof.php +94 -0
  278. package/server/src/Models/PurchaseRate.php +208 -0
  279. package/server/src/Models/Route.php +128 -0
  280. package/server/src/Models/ServiceArea.php +161 -0
  281. package/server/src/Models/ServiceQuote.php +207 -0
  282. package/server/src/Models/ServiceQuoteItem.php +46 -0
  283. package/server/src/Models/ServiceRate.php +953 -0
  284. package/server/src/Models/ServiceRateFee.php +96 -0
  285. package/server/src/Models/ServiceRateParcelFee.php +116 -0
  286. package/server/src/Models/TrackingNumber.php +310 -0
  287. package/server/src/Models/TrackingStatus.php +177 -0
  288. package/server/src/Models/Vehicle.php +452 -0
  289. package/server/src/Models/VehicleDevice.php +79 -0
  290. package/server/src/Models/Vendor.php +244 -0
  291. package/server/src/Models/Waypoint.php +226 -0
  292. package/server/src/Models/Zone.php +95 -0
  293. package/server/src/Notifications/OrderAssigned.php +140 -0
  294. package/server/src/Notifications/OrderCanceled.php +129 -0
  295. package/server/src/Notifications/OrderDispatchFailed.php +81 -0
  296. package/server/src/Notifications/OrderDispatched.php +173 -0
  297. package/server/src/Notifications/OrderPing.php +162 -0
  298. package/server/src/Notifications/OrderSplit.php +56 -0
  299. package/server/src/Observers/DriverObserver.php +34 -0
  300. package/server/src/Observers/OrderObserver.php +34 -0
  301. package/server/src/Observers/PayloadObserver.php +30 -0
  302. package/server/src/Observers/PlaceObserver.php +26 -0
  303. package/server/src/Observers/PurchaseRateObserver.php +61 -0
  304. package/server/src/Observers/ServiceAreaObserver.php +35 -0
  305. package/server/src/Observers/ServiceRateObserver.php +78 -0
  306. package/server/src/Observers/TrackingNumberObserver.php +44 -0
  307. package/server/src/Observers/UserObserver.php +20 -0
  308. package/server/src/Observers/VehicleObserver.php +66 -0
  309. package/server/src/Providers/EventServiceProvider.php +30 -0
  310. package/server/src/Providers/FleetOpsServiceProvider.php +94 -0
  311. package/server/src/Rules/ResolvablePoint.php +37 -0
  312. package/server/src/Scopes/DriverScope.php +21 -0
  313. package/server/src/Support/Algo.php +55 -0
  314. package/server/src/Support/DistanceMatrix.php +27 -0
  315. package/server/src/Support/Encoding/Polyline.php +168 -0
  316. package/server/src/Support/Flow.php +622 -0
  317. package/server/src/Support/Geocoding.php +216 -0
  318. package/server/src/Support/IntegratedVendors.php +287 -0
  319. package/server/src/Support/Metrics.php +305 -0
  320. package/server/src/Support/OSRM.php +191 -0
  321. package/server/src/Support/ParsePhone.php +21 -0
  322. package/server/src/Support/Utils.php +1145 -0
  323. package/server/src/Traits/HasTrackingNumber.php +185 -0
  324. package/server/src/routes.php +381 -0
  325. package/server/tests/Feature.php +5 -0
@@ -0,0 +1,452 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Models;
4
+
5
+ use Fleetbase\Casts\Json;
6
+ use Fleetbase\FleetOps\Casts\Point;
7
+ use Fleetbase\FleetOps\Support\Utils;
8
+ use Fleetbase\Models\Model;
9
+ use Fleetbase\Traits\HasApiModelBehavior;
10
+ use Fleetbase\Traits\HasPublicId;
11
+ use Fleetbase\Traits\HasUuid;
12
+ use Fleetbase\Traits\Searchable;
13
+ use Fleetbase\Traits\TracksApiCredential;
14
+ use Grimzy\LaravelMysqlSpatial\Eloquent\SpatialTrait;
15
+ use Illuminate\Support\Str;
16
+ use Spatie\Activitylog\Traits\LogsActivity;
17
+ use Spatie\Sluggable\HasSlug;
18
+ use Spatie\Sluggable\SlugOptions;
19
+
20
+ class Vehicle extends Model
21
+ {
22
+ use HasUuid;
23
+ use HasPublicId;
24
+ use TracksApiCredential;
25
+ use HasApiModelBehavior;
26
+ use SpatialTrait;
27
+ use Searchable;
28
+ use HasSlug;
29
+ use LogsActivity;
30
+
31
+ /**
32
+ * The database table used by the model.
33
+ *
34
+ * @var string
35
+ */
36
+ protected $table = 'vehicles';
37
+
38
+ /**
39
+ * The type of public Id to generate.
40
+ *
41
+ * @var string
42
+ */
43
+ protected $publicIdType = 'vehicle';
44
+
45
+ /**
46
+ * The attributes that can be queried.
47
+ *
48
+ * @var array
49
+ */
50
+ protected $searchableColumns = ['make', 'model', 'year', 'plate_number', 'internal_id', 'vin', 'public_id'];
51
+
52
+ /**
53
+ * Attributes that is filterable on this model.
54
+ *
55
+ * @var array
56
+ */
57
+ protected $filterParams = ['vendor'];
58
+
59
+ /**
60
+ * Relationships to auto load with driver.
61
+ *
62
+ * @var array
63
+ */
64
+ protected $with = [];
65
+
66
+ /**
67
+ * Properties which activity needs to be logged.
68
+ *
69
+ * @var array
70
+ */
71
+ protected static $logAttributes = '*';
72
+
73
+ /**
74
+ * Do not log empty changed.
75
+ *
76
+ * @var bool
77
+ */
78
+ protected static $submitEmptyLogs = false;
79
+
80
+ /**
81
+ * The name of the subject to log.
82
+ *
83
+ * @var string
84
+ */
85
+ protected static $logName = 'vehicle';
86
+
87
+ /**
88
+ * Get the options for generating the slug.
89
+ */
90
+ public function getSlugOptions(): SlugOptions
91
+ {
92
+ return SlugOptions::create()
93
+ ->generateSlugsFrom(['year', 'make', 'model', 'trim', 'plate_number', 'internal_id'])
94
+ ->saveSlugsTo('slug');
95
+ }
96
+
97
+ /**
98
+ * The attributes that are mass assignable.
99
+ *
100
+ * @var array
101
+ */
102
+ protected $fillable = [
103
+ 'company_uuid',
104
+ 'vendor_uuid',
105
+ 'photo_uuid',
106
+ 'avatar_url',
107
+ 'make',
108
+ 'location',
109
+ 'speed',
110
+ 'heading',
111
+ 'altitude',
112
+ 'model',
113
+ 'year',
114
+ 'trim',
115
+ 'type',
116
+ 'plate_number',
117
+ 'vin',
118
+ 'vin_data',
119
+ 'meta',
120
+ 'telematics',
121
+ 'status',
122
+ 'online',
123
+ 'slug',
124
+ ];
125
+
126
+ /**
127
+ * Set attributes and defaults.
128
+ *
129
+ * @var array
130
+ */
131
+ protected $attributes = [
132
+ 'avatar_url' => 'https://flb-assets.s3-ap-southeast-1.amazonaws.com/static/vehicle-icons/mini_bus.svg',
133
+ ];
134
+
135
+ /**
136
+ * Dynamic attributes that are appended to object.
137
+ *
138
+ * @var array
139
+ */
140
+ protected $appends = ['display_name', 'photo_url', 'driver_name', 'vendor_name'];
141
+
142
+ /**
143
+ * The attributes excluded from the model's JSON form.
144
+ *
145
+ * @var array
146
+ */
147
+ protected $hidden = [
148
+ 'driver',
149
+ 'vendor',
150
+ ];
151
+
152
+ /**
153
+ * The attributes that are spatial columns.
154
+ *
155
+ * @var array
156
+ */
157
+ protected $spatialFields = ['location'];
158
+
159
+ /**
160
+ * The attributes that should be cast to native types.
161
+ *
162
+ * @var array
163
+ */
164
+ protected $casts = [
165
+ 'location' => Point::class,
166
+ 'meta' => Json::class,
167
+ 'telematics' => Json::class,
168
+ 'model' => Json::class,
169
+ 'vin_data' => Json::class,
170
+ 'online' => 'boolean',
171
+ ];
172
+
173
+ /**
174
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
175
+ */
176
+ public function photo()
177
+ {
178
+ return $this->belongsTo(\Fleetbase\Models\File::class);
179
+ }
180
+
181
+ /**
182
+ * @return \Illuminate\Database\Eloquent\Relations\HasOne
183
+ */
184
+ public function driver()
185
+ {
186
+ return $this->hasOne(Driver::class)->without(['vehicle']);
187
+ }
188
+
189
+ /**
190
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
191
+ */
192
+ public function vendor()
193
+ {
194
+ return $this->belongsTo(Vendor::class);
195
+ }
196
+
197
+ /**
198
+ * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough
199
+ */
200
+ public function fleets()
201
+ {
202
+ return $this->hasManyThrough(Fleet::class, FleetVehicle::class, 'vehicle_uuid', 'uuid', 'uuid', 'fleet_uuid');
203
+ }
204
+
205
+ /**
206
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
207
+ */
208
+ public function devices()
209
+ {
210
+ return $this->hasMany(VehicleDevice::class);
211
+ }
212
+
213
+ /**
214
+ * Get avatar URL attribute.
215
+ *
216
+ * @return string
217
+ */
218
+ public function getPhotoUrlAttribute()
219
+ {
220
+ return data_get($this, 'photo.url', 'https://s3.ap-southeast-1.amazonaws.com/flb-assets/static/vehicle-placeholder.png');
221
+ }
222
+
223
+ /**
224
+ * The name generated from make model and year.
225
+ *
226
+ * @return string
227
+ */
228
+ public function getDisplayNameAttribute()
229
+ {
230
+ // Initialize an empty array to hold the name segments
231
+ $nameSegments = [];
232
+
233
+ // Populate the nameSegments array with the values of the attributes
234
+ $keys = ['year', 'make', 'model', 'trim', 'plate_number', 'internal_id'];
235
+ foreach ($keys as $key) {
236
+ if (!empty($this->{$key})) {
237
+ $nameSegments[] = $this->{$key};
238
+ }
239
+ }
240
+
241
+ // Join the name segments into a single string, separated by spaces
242
+ $displayName = implode(' ', $nameSegments);
243
+
244
+ // Trim any leading or trailing whitespace
245
+ $displayName = trim($displayName);
246
+
247
+ return $displayName;
248
+ }
249
+
250
+ /**
251
+ * Get avatar url.
252
+ *
253
+ * @return string|null
254
+ */
255
+ public function getAvatarUrlAttribute($value)
256
+ {
257
+ if (!$value) {
258
+ return static::getAvatar();
259
+ }
260
+
261
+ return $value;
262
+ }
263
+
264
+ /**
265
+ * Get the driver's name assigned to vehicle.
266
+ *
267
+ * @return string|null
268
+ */
269
+ public function getDriverNameAttribute()
270
+ {
271
+ return data_get($this, 'driver.name');
272
+ }
273
+
274
+ /**
275
+ * Get the driver's public id assigned to vehicle.
276
+ *
277
+ * @return string|null
278
+ */
279
+ public function getDriverIdAttribute()
280
+ {
281
+ return data_get($this, 'driver.public_id');
282
+ }
283
+
284
+ /**
285
+ * Get the driver's uuid assigned to vehicle.
286
+ *
287
+ * @return string|null
288
+ */
289
+ public function getDriverUuidAttribute()
290
+ {
291
+ return data_get($this, 'driver.uuid');
292
+ }
293
+
294
+ /**
295
+ * Get drivers vendor ID.
296
+ *
297
+ * @return string|null
298
+ */
299
+ public function getVendorIdAttribute()
300
+ {
301
+ return data_get($this, 'vendor.public_id');
302
+ }
303
+
304
+ /**
305
+ * Get drivers vendor name.
306
+ *
307
+ * @return string|null
308
+ */
309
+ public function getVendorNameAttribute()
310
+ {
311
+ return data_get($this, 'vendor.name');
312
+ }
313
+
314
+ /**
315
+ * Get the vehicles model data attributes.
316
+ */
317
+ public function getModelDataAttribute()
318
+ {
319
+ $attributes = $this->getFillable();
320
+ $modelAttributes = [];
321
+ foreach ($attributes as $attr) {
322
+ if (Str::startsWith($attr, 'model_')) {
323
+ $modelAttributes[str_replace('model_', '', $attr)] = $this->{$attr};
324
+ }
325
+ }
326
+
327
+ return $modelAttributes;
328
+ }
329
+
330
+ /**
331
+ * Get an avatar url by key.
332
+ *
333
+ * @param string $key
334
+ *
335
+ * @return string
336
+ */
337
+ public static function getAvatar($key = 'mini_bus')
338
+ {
339
+ return static::getAvatarOptions()->get($key);
340
+ }
341
+
342
+ /**
343
+ * Get all avatar options for a vehicle.
344
+ *
345
+ * @return \Illuminate\Support\Collection
346
+ */
347
+ public static function getAvatarOptions()
348
+ {
349
+ $options = [
350
+ '2_door_truck.svg',
351
+ '3_door_hatchback.svg',
352
+ '4_door_truck.svg',
353
+ '5_door_hatchback.svg',
354
+ 'ambulance.svg',
355
+ 'convertible.svg',
356
+ 'coupe.svg',
357
+ 'electric_car.svg',
358
+ 'fastback.svg',
359
+ 'full_size_suv.svg',
360
+ 'hot_hatch.svg',
361
+ 'large_ambulance.svg',
362
+ 'light_commercial_truck.svg',
363
+ 'light_commercial_van.svg',
364
+ 'limousine.svg',
365
+ 'mid_size_suv.svg',
366
+ 'mini_bus.svg',
367
+ 'mini_van.svg',
368
+ 'muscle_car.svg',
369
+ 'police_1.svg',
370
+ 'police_2.svg',
371
+ 'roadster.svg',
372
+ 'sedan.svg',
373
+ 'small_3_door_hatchback.svg',
374
+ 'small_5_door_hatchback.svg',
375
+ 'sportscar.svg',
376
+ 'station_wagon.svg',
377
+ 'taxi.svg',
378
+ ];
379
+
380
+ return collect($options)->mapWithKeys(
381
+ function ($option) {
382
+ $key = str_replace('.svg', '', $option);
383
+
384
+ return [$key => Utils::assetFromS3('static/vehicle-icons/' . $option)];
385
+ }
386
+ );
387
+ }
388
+
389
+ /**
390
+ * Assign a driver to this vehicle.
391
+ *
392
+ * @return void
393
+ */
394
+ public function assignDriver(Driver $driver)
395
+ {
396
+ $driver->assignVehicle($this);
397
+
398
+ return $this;
399
+ }
400
+
401
+ /**
402
+ * Updates the position of the vehicle, creating a new Position record if
403
+ * the driver has moved more than 100 meters or if it's their first recorded position.
404
+ *
405
+ * @param \Fleetbase\FleetOps\Models\Order|null $order The order to consider when updating the position (default: null)
406
+ *
407
+ * @return \Fleetbase\FleetOps\Models\Position|null The created Position object, or null if no new position was created
408
+ */
409
+ public function updatePositionWithOrderContext(Order $order = null): ?Position
410
+ {
411
+ $position = null;
412
+ $lastPosition = $this->positions()->whereCompanyUuid(session('company'))->latest()->first();
413
+
414
+ // get driver if applicable
415
+ $driver = $this->load('driver')->driver;
416
+
417
+ // get the vehicle's driver's current order
418
+ $currentOrder = $order;
419
+
420
+ if (!$currentOrder && $driver) {
421
+ $currentOrder = $driver->currentOrder()->with(['payload'])->first();
422
+ }
423
+
424
+ $destination = $currentOrder ? $currentOrder->payload->getPickupOrCurrentWaypoint() : null;
425
+
426
+ $positionData = [
427
+ 'company_uuid' => session('company', $this->company_uuid),
428
+ 'subject_uuid' => $this->uuid,
429
+ 'subject_type' => Utils::getMutationType($this),
430
+ 'coordinates' => $this->location,
431
+ ];
432
+
433
+ if ($currentOrder) {
434
+ $positionData['order_uuid'] = $currentOrder->uuid;
435
+ }
436
+
437
+ if ($destination) {
438
+ $positionData['destination_uuid'] = $destination->uuid;
439
+ }
440
+
441
+ $isFirstPosition = !$lastPosition;
442
+ $isPast50Meters = $lastPosition && Utils::vincentyGreatCircleDistance($this->location, $lastPosition->coordinates) > 50;
443
+ $position = null;
444
+
445
+ // create the first position
446
+ if ($isFirstPosition || $isPast50Meters) {
447
+ $position = Position::create($positionData);
448
+ }
449
+
450
+ return $position;
451
+ }
452
+ }
@@ -0,0 +1,79 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Models;
4
+
5
+ use Fleetbase\Casts\Json;
6
+ use Fleetbase\Models\Model;
7
+ use Fleetbase\Traits\HasApiModelBehavior;
8
+ use Fleetbase\Traits\HasUuid;
9
+ use Fleetbase\Traits\TracksApiCredential;
10
+
11
+ class VehicleDevice extends Model
12
+ {
13
+ use HasUuid;
14
+ use TracksApiCredential;
15
+ use HasApiModelBehavior;
16
+
17
+ /**
18
+ * The database table used by the model.
19
+ *
20
+ * @var string
21
+ */
22
+ protected $table = 'vehicle_devices';
23
+
24
+ /**
25
+ * Attributes that is filterable on this model.
26
+ *
27
+ * @var array
28
+ */
29
+ protected $fillable = [
30
+ 'uuid',
31
+ 'vehicle_uuid',
32
+ 'device_type',
33
+ 'device_id',
34
+ 'device_provider',
35
+ 'device_name',
36
+ 'device_model',
37
+ 'device_location',
38
+ 'manufacturer',
39
+ 'serial_number',
40
+ 'installation_date',
41
+ 'last_maintenance_date',
42
+ 'meta',
43
+ 'data',
44
+ 'online',
45
+ 'status',
46
+ 'data_frequency',
47
+ 'notes',
48
+ ];
49
+ /**
50
+ * The attributes that should be cast to native types.
51
+ *
52
+ * @var array
53
+ */
54
+ protected $casts = [
55
+ 'meta' => Json::class,
56
+ 'data' => Json::class,
57
+ ];
58
+
59
+ /**
60
+ * Dynamic attributes that are appended to object.
61
+ *
62
+ * @var array
63
+ */
64
+ protected $appends = [];
65
+
66
+ /**
67
+ * Filterable params.
68
+ *
69
+ * @var array
70
+ */
71
+ protected $filterParams = [];
72
+
73
+ /**
74
+ * The attributes excluded from the model's JSON form.
75
+ *
76
+ * @var array
77
+ */
78
+ protected $hidden = [];
79
+ }