@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,137 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Console\Commands;
4
+
5
+ use Fleetbase\FleetOps\Models\Driver;
6
+ use Fleetbase\FleetOps\Models\Order;
7
+ use Fleetbase\FleetOps\Support\Utils;
8
+ use Grimzy\LaravelMysqlSpatial\Types\Point;
9
+ use Illuminate\Console\Command;
10
+ use Illuminate\Support\Carbon;
11
+
12
+ class DispatchAdhocOrders extends Command
13
+ {
14
+ /**
15
+ * The name and signature of the console command.
16
+ *
17
+ * @var string
18
+ */
19
+ protected $signature = 'fleetops:dispatch-adhoc {--sandbox} {--testing}';
20
+
21
+ /**
22
+ * The console command description.
23
+ *
24
+ * @var string
25
+ */
26
+ protected $description = 'Dispatch & ping adhoc orders where no driver is assigned, only if order isn\'t assigned after 2 minutes';
27
+
28
+ /**
29
+ * Execute the console command.
30
+ *
31
+ * This method is responsible for the main logic of the command.
32
+ * It fetches dispatchable orders, notifies about the current time and number of orders,
33
+ * and then dispatches each order if there are nearby drivers.
34
+ *
35
+ * @return int
36
+ */
37
+ public function handle()
38
+ {
39
+ // Set UTC as default timezone
40
+ date_default_timezone_set('UTC');
41
+
42
+ // Get all dispatchable orders
43
+ $orders = $this->getDispatchableOrders();
44
+
45
+ // Notify Current Time and # of Orders in Alera
46
+ $this->alert('Found (' . $orders->count() . ') Orders to be Dispatched -- Current Time: ' . Carbon::now()->toDateTimeString());
47
+
48
+ // Iterate for each order
49
+ $orders->each(
50
+ function ($order) {
51
+ $pickup = $order->getPickupLocation();
52
+ $distance = $order->getAdhocPingDistance();
53
+
54
+ if (!Utils::isPoint($pickup)) {
55
+ return;
56
+ }
57
+
58
+ // Get nearby drivers for this order
59
+ $drivers = $this->getNearbyDriversForOrder($order, $pickup, $distance);
60
+
61
+ // Inform
62
+ $this->alert('Found (' . $drivers->count() . ') driver within ' . $distance . ' meters of the pickup location for order ' . $order->public_id);
63
+
64
+ // Dispatch if there is nearby drivers
65
+ if ($drivers->count()) {
66
+ $order->dispatch(true);
67
+ $this->info('Order ' . $order->public_id . ' dispatched!');
68
+ }
69
+ }
70
+ );
71
+ }
72
+
73
+ /**
74
+ * Fetches dispatchable orders based on certain criteria.
75
+ */
76
+ public function getDispatchableOrders(): \Illuminate\Database\Eloquent\Collection
77
+ {
78
+ $sandbox = Utils::castBoolean($this->option('sandbox'));
79
+ $interval = 4;
80
+
81
+ return Order::on($sandbox ? 'sandbox' : 'mysql')
82
+ ->withoutGlobalScopes()
83
+ ->where(['adhoc' => 1, 'dispatched' => 1, 'started' => 0])
84
+ ->whereDate('dispatched_at', '<=', Carbon::now()->subMinutes($interval)->toDateTimeString())
85
+ ->whereNull('driver_assigned_uuid')
86
+ ->whereNull('deleted_at')
87
+ ->where('status', '!=', 'canceled')
88
+ ->whereHas('company', function ($q) {
89
+ $q->whereHas('users', function ($q) {
90
+ $q->whereHas('driver', function ($q) {
91
+ $q->where(['status' => 'active', 'online' => 1]);
92
+ $q->whereNull('deleted_at');
93
+ });
94
+ });
95
+ })
96
+ ->whereHas('payload')
97
+ ->with(['company', 'payload'])
98
+ ->get();
99
+ }
100
+
101
+ /**
102
+ * Fetches nearby drivers for a given order based on the pickup location and distance.
103
+ */
104
+ public function getNearbyDriversForOrder(Order $order, Point $pickup, int $distance): \Illuminate\Database\Eloquent\Collection
105
+ {
106
+ $testing = Utils::castBoolean($this->option('testing'));
107
+
108
+ if ($testing) {
109
+ // one for testing when cannoty be geospatially accurate
110
+ $drivers = Driver::where(['status' => 'active', 'online' => 1])
111
+ ->where(function ($q) use ($order) {
112
+ $q->where('company_uuid', $order->company_uuid);
113
+ $q->orWhereHas('user', function ($q) use ($order) {
114
+ $q->where('company_uuid', $order->company_uuid);
115
+ });
116
+ })
117
+ ->whereNull('deleted_at')
118
+ ->withoutGlobalScopes()
119
+ ->get();
120
+ } else {
121
+ $drivers = Driver::where(['status' => 'active', 'online' => 1])
122
+ ->where(function ($q) use ($order) {
123
+ $q->where('company_uuid', $order->company_uuid);
124
+ $q->orWhereHas('user', function ($q) use ($order) {
125
+ $q->where('company_uuid', $order->company_uuid);
126
+ });
127
+ })
128
+ ->whereNull('deleted_at')
129
+ ->distanceSphere('location', $pickup, $distance)
130
+ ->distanceSphereValue('location', $pickup)
131
+ ->withoutGlobalScopes()
132
+ ->get();
133
+ }
134
+
135
+ return $drivers;
136
+ }
137
+ }
@@ -0,0 +1,71 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Console\Commands;
4
+
5
+ use Fleetbase\FleetOps\Models\Order;
6
+ use Fleetbase\FleetOps\Support\Utils;
7
+ use Illuminate\Console\Command;
8
+ use Illuminate\Support\Carbon;
9
+
10
+ class DispatchOrders extends Command
11
+ {
12
+ /**
13
+ * The name and signature of the console command.
14
+ *
15
+ * @var string
16
+ */
17
+ protected $signature = 'fleetops:dispatch-orders {--sandbox=false}';
18
+
19
+ /**
20
+ * The console command description.
21
+ *
22
+ * @var string
23
+ */
24
+ protected $description = 'Dispatches scheduled orders.';
25
+
26
+ /**
27
+ * Execute the console command.
28
+ *
29
+ * @return int
30
+ */
31
+ public function handle()
32
+ {
33
+ // Set UTC as default timezone
34
+ date_default_timezone_set('UTC');
35
+
36
+ // Get all scheduled dispatchable orders
37
+ $orders = $this->getScheduledOrders();
38
+
39
+ // Notify Current Time and # of Orders in Alera
40
+ $this->alert('Found (' . $orders->count() . ') Orders Scheduled for Dispatched -- Current Time: ' . Carbon::now()->toDateTimeString());
41
+
42
+ // Dispatch each order
43
+ $orders->each(
44
+ function ($order) {
45
+ if ($order->shouldDispatch()) {
46
+ $order->dispatch();
47
+
48
+ $this->info('Order ' . $order->public_id . ' dispatched! (' . $order->scheduled_at . ')');
49
+ } else {
50
+ $this->warn('Order ' . $order->public_id . ' will be dispatched today today AT ' . $order->scheduled_at);
51
+ }
52
+ }
53
+ );
54
+ }
55
+
56
+ /**
57
+ * Fetches scheduled dispatchable orders based on certain criteria.
58
+ */
59
+ public function getScheduledOrders(): \Illuminate\Database\Eloquent\Collection
60
+ {
61
+ $sandbox = Utils::castBoolean($this->option('sandbox'));
62
+
63
+ return Order::on($sandbox ? 'sandbox' : 'mysql')
64
+ ->withoutGlobalScopes()
65
+ ->where('dispatched', 0)
66
+ ->whereIn('status', ['pending', 'created'])
67
+ ->whereDate('scheduled_at', Carbon::today())
68
+ ->whereNull('deleted_at')
69
+ ->get();
70
+ }
71
+ }
@@ -0,0 +1,62 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Console\Commands;
4
+
5
+ use Fleetbase\FleetOps\Models\Order;
6
+ use Illuminate\Console\Command;
7
+ use Illuminate\Support\Carbon;
8
+
9
+ class TrackOrderDistanceAndTime extends Command
10
+ {
11
+ /**
12
+ * The name and signature of the console command.
13
+ *
14
+ * @var string
15
+ */
16
+ protected $signature = 'fleetops:update-estimations';
17
+
18
+ /**
19
+ * The console command description.
20
+ *
21
+ * @var string
22
+ */
23
+ protected $description = 'Track and update order distance and time estimations';
24
+
25
+ /**
26
+ * Execute the console command.
27
+ *
28
+ * @return int
29
+ */
30
+ public function handle()
31
+ {
32
+ // Set UTC as default timezone
33
+ date_default_timezone_set('UTC');
34
+
35
+ // Get all active/ready order
36
+ $orders = $this->getActiveOrders();
37
+
38
+ // Track updated orders
39
+ $updated = [];
40
+
41
+ // Notify Current Time and # of Orders in Alera
42
+ $this->alert('Found (' . $orders->count() . ') Orders to update Tracking Estimation -- Current Time: ' . Carbon::now()->toDateTimeString());
43
+
44
+ // Update for each order
45
+ $orders->each(
46
+ function ($order) use (&$updated) {
47
+ $updated[] = $order->setDistanceAndTime()->id;
48
+ }
49
+ );
50
+
51
+ // Update info
52
+ $this->info('Updated ' . count($updated) . '/' . $orders->count() . ' orders Distance & Time Estimations.');
53
+ }
54
+
55
+ /**
56
+ * Fetches active orders.
57
+ */
58
+ public function getActiveOrders(): \Illuminate\Database\Eloquent\Collection
59
+ {
60
+ return Order::whereNotIn('status', ['completed', 'canceled'])->whereNull(['deleted_at'])->whereNotNull('company_uuid')->whereHas('payload')->with(['payload', 'payload.waypoints', 'payload.pickup', 'payload.dropoff'])->withoutGlobalScopes()->get();
61
+ }
62
+ }
@@ -0,0 +1,174 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Events;
4
+
5
+ use Fleetbase\FleetOps\Models\Driver;
6
+ use Illuminate\Broadcasting\Channel;
7
+ use Illuminate\Broadcasting\InteractsWithSockets;
8
+ use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
9
+ use Illuminate\Foundation\Events\Dispatchable;
10
+ use Illuminate\Queue\SerializesModels;
11
+ use Illuminate\Support\Carbon;
12
+
13
+ class DriverLocationChanged implements ShouldBroadcast
14
+ {
15
+ use Dispatchable;
16
+ use InteractsWithSockets;
17
+ use SerializesModels;
18
+
19
+ /**
20
+ * The event id.
21
+ *
22
+ * @var string
23
+ */
24
+ public $eventId;
25
+
26
+ /**
27
+ * The datetime instance the broadcast ws triggered.
28
+ *
29
+ * @var string
30
+ */
31
+ public $sentAt;
32
+
33
+ /**
34
+ * The uuid of the driver.
35
+ *
36
+ * @var string
37
+ */
38
+ public $driverUuid;
39
+
40
+ /**
41
+ * The public id of the driver.
42
+ *
43
+ * @var string
44
+ */
45
+ public $driverId;
46
+
47
+ /**
48
+ * The internal id of the driver.
49
+ *
50
+ * @var string
51
+ */
52
+ public $driverInternalId;
53
+
54
+ /**
55
+ * The name of the driver.
56
+ *
57
+ * @var string
58
+ */
59
+ public $driverName;
60
+
61
+ /**
62
+ * The phone of the driver.
63
+ *
64
+ * @var string
65
+ */
66
+ public $driverPhone;
67
+
68
+ /**
69
+ * The new driver location.
70
+ *
71
+ * @var string
72
+ */
73
+ public $location;
74
+
75
+ /**
76
+ * The driver altitude.
77
+ *
78
+ * @var string
79
+ */
80
+ public $altitude;
81
+
82
+ /**
83
+ * The ndriver heading.
84
+ *
85
+ * @var string
86
+ */
87
+ public $heading;
88
+
89
+ /**
90
+ * The driver speed.
91
+ *
92
+ * @var string
93
+ */
94
+ public $speed;
95
+
96
+ /**
97
+ * Optional, additional data.
98
+ *
99
+ * @var array
100
+ */
101
+ public $additionalData = [];
102
+
103
+ /**
104
+ * Create a new event instance.
105
+ *
106
+ * @return void
107
+ */
108
+ public function __construct(Driver $driver, array $additionalData = [])
109
+ {
110
+ $this->eventId = uniqid('event_');
111
+ $this->sentAt = Carbon::now()->toDateTimeString();
112
+ $this->additionalData = $additionalData;
113
+ $this->driverUuid = $driver->uuid;
114
+ $this->driverId = $driver->public_id;
115
+ $this->driverInternalId = $driver->internal_id;
116
+ $this->driverName = $driver->name;
117
+ $this->driverPhone = $driver->phone;
118
+ $this->location = $driver->location;
119
+ $this->altitude = $driver->altitude;
120
+ $this->heading = $driver->heading;
121
+ $this->speed = $driver->speed;
122
+ }
123
+
124
+ /**
125
+ * Get the channels the event should broadcast on.
126
+ *
127
+ * @return \Illuminate\Broadcasting\Channel|array
128
+ */
129
+ public function broadcastOn()
130
+ {
131
+ return [
132
+ new Channel('company.' . session('company')),
133
+ new Channel('api.' . session('api_credential')),
134
+ new Channel('driver.' . $this->driverId),
135
+ new Channel('driver.' . $this->driverUuid),
136
+ ];
137
+ }
138
+
139
+ /**
140
+ * The event's broadcast name.
141
+ *
142
+ * @return string
143
+ */
144
+ public function broadcastAs()
145
+ {
146
+ return 'driver.location_changed';
147
+ }
148
+
149
+ /**
150
+ * Get the data to broadcast.
151
+ *
152
+ * @return array
153
+ */
154
+ public function broadcastWith()
155
+ {
156
+ return [
157
+ 'id' => $this->eventId,
158
+ 'api_version' => config('api.version'),
159
+ 'event' => $this->broadcastAs(),
160
+ 'created_at' => $this->sentAt,
161
+ 'data' => [
162
+ 'id' => $this->driverId,
163
+ 'internal_id' => $this->driverInternalId,
164
+ 'name' => $this->driverName,
165
+ 'phone' => $this->driverPhone,
166
+ 'location' => $this->location,
167
+ 'altitude' => $this->altitude,
168
+ 'heading' => $this->heading,
169
+ 'speed' => $this->speed,
170
+ 'additionalData' => $this->additionalData,
171
+ ],
172
+ ];
173
+ }
174
+ }
@@ -0,0 +1,183 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Events;
4
+
5
+ use Fleetbase\FleetOps\Models\Driver;
6
+ use Grimzy\LaravelMysqlSpatial\Types\Point;
7
+ use Illuminate\Broadcasting\Channel;
8
+ use Illuminate\Broadcasting\InteractsWithSockets;
9
+ use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
10
+ use Illuminate\Foundation\Events\Dispatchable;
11
+ use Illuminate\Queue\SerializesModels;
12
+ use Illuminate\Support\Carbon;
13
+
14
+ /**
15
+ * Event class for when a driver's simulated location changes.
16
+ *
17
+ * This event is broadcasted to multiple channels and includes details
18
+ * about the driver's location, speed, heading, and other attributes.
19
+ */
20
+ class DriverSimulatedLocationChanged implements ShouldBroadcast
21
+ {
22
+ use Dispatchable;
23
+ use InteractsWithSockets;
24
+ use SerializesModels;
25
+
26
+ /**
27
+ * The event id.
28
+ *
29
+ * @var string
30
+ */
31
+ public $eventId;
32
+
33
+ /**
34
+ * The datetime instance the broadcast ws triggered.
35
+ *
36
+ * @var string
37
+ */
38
+ public $sentAt;
39
+
40
+ /**
41
+ * The uuid of the driver.
42
+ *
43
+ * @var string
44
+ */
45
+ public $driverUuid;
46
+
47
+ /**
48
+ * The public id of the driver.
49
+ *
50
+ * @var string
51
+ */
52
+ public $driverId;
53
+
54
+ /**
55
+ * The internal id of the driver.
56
+ *
57
+ * @var string
58
+ */
59
+ public $driverInternalId;
60
+
61
+ /**
62
+ * The name of the driver.
63
+ *
64
+ * @var string
65
+ */
66
+ public $driverName;
67
+
68
+ /**
69
+ * The phone of the driver.
70
+ *
71
+ * @var string
72
+ */
73
+ public $driverPhone;
74
+
75
+ /**
76
+ * The new driver location.
77
+ *
78
+ * @var string
79
+ */
80
+ public $location;
81
+
82
+ /**
83
+ * The driver altitude.
84
+ *
85
+ * @var string
86
+ */
87
+ public $altitude;
88
+
89
+ /**
90
+ * The ndriver heading.
91
+ *
92
+ * @var string
93
+ */
94
+ public $heading;
95
+
96
+ /**
97
+ * The driver speed.
98
+ *
99
+ * @var string
100
+ */
101
+ public $speed;
102
+
103
+ /**
104
+ * Optional, additional data.
105
+ *
106
+ * @var array
107
+ */
108
+ public $additionalData = [];
109
+
110
+ /**
111
+ * Create a new event instance.
112
+ *
113
+ * @return void
114
+ */
115
+ public function __construct(Driver $driver, Point $location, array $additionalData = [])
116
+ {
117
+ $this->eventId = uniqid('event_');
118
+ $this->sentAt = Carbon::now()->toDateTimeString();
119
+ $this->driverUuid = $driver->uuid;
120
+ $this->driverId = $driver->public_id;
121
+ $this->driverInternalId = $driver->internal_id;
122
+ $this->driverName = $driver->name;
123
+ $this->driverPhone = $driver->phone;
124
+ $this->altitude = $driver->altitude;
125
+
126
+ // can be set in simulation
127
+ $this->heading = data_get($additionalData, 'heading', $driver->heading);
128
+ $this->speed = data_get($additionalData, 'speed', $driver->speed);
129
+ $this->location = $location;
130
+ $this->additionalData = $additionalData;
131
+ }
132
+
133
+ /**
134
+ * Get the channels the event should broadcast on.
135
+ *
136
+ * @return \Illuminate\Broadcasting\Channel|array
137
+ */
138
+ public function broadcastOn()
139
+ {
140
+ return [
141
+ new Channel('company.' . session('company')),
142
+ new Channel('api.' . session('api_credential')),
143
+ new Channel('driver.' . $this->driverId),
144
+ new Channel('driver.' . $this->driverUuid),
145
+ ];
146
+ }
147
+
148
+ /**
149
+ * The event's broadcast name.
150
+ *
151
+ * @return string
152
+ */
153
+ public function broadcastAs()
154
+ {
155
+ return 'driver.simulated_location_changed';
156
+ }
157
+
158
+ /**
159
+ * Get the data to broadcast.
160
+ *
161
+ * @return array
162
+ */
163
+ public function broadcastWith()
164
+ {
165
+ return [
166
+ 'id' => $this->eventId,
167
+ 'api_version' => config('api.version'),
168
+ 'event' => $this->broadcastAs(),
169
+ 'created_at' => $this->sentAt,
170
+ 'data' => [
171
+ 'id' => $this->driverId,
172
+ 'internal_id' => $this->driverInternalId,
173
+ 'name' => $this->driverName,
174
+ 'phone' => $this->driverPhone,
175
+ 'location' => $this->location,
176
+ 'altitude' => $this->altitude,
177
+ 'heading' => $this->heading,
178
+ 'speed' => $this->speed,
179
+ 'additionalData' => $this->additionalData,
180
+ ],
181
+ ];
182
+ }
183
+ }
@@ -0,0 +1,36 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Events;
4
+
5
+ use Illuminate\Broadcasting\InteractsWithSockets;
6
+ use Illuminate\Broadcasting\PrivateChannel;
7
+ use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
8
+ use Illuminate\Foundation\Events\Dispatchable;
9
+ use Illuminate\Queue\SerializesModels;
10
+
11
+ class EntityDriverAssigned implements ShouldBroadcast
12
+ {
13
+ use Dispatchable;
14
+ use InteractsWithSockets;
15
+ use SerializesModels;
16
+
17
+ /**
18
+ * Create a new event instance.
19
+ *
20
+ * @return void
21
+ */
22
+ public function __construct()
23
+ {
24
+ // @todo
25
+ }
26
+
27
+ /**
28
+ * Get the channels the event should broadcast on.
29
+ *
30
+ * @return \Illuminate\Broadcasting\Channel|array
31
+ */
32
+ public function broadcastOn()
33
+ {
34
+ return new PrivateChannel('channel-name');
35
+ }
36
+ }
@@ -0,0 +1,15 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Events;
4
+
5
+ use Fleetbase\Events\ResourceLifecycleEvent;
6
+
7
+ class OrderCanceled extends ResourceLifecycleEvent
8
+ {
9
+ /**
10
+ * The event name.
11
+ *
12
+ * @var string
13
+ */
14
+ public $eventName = 'canceled';
15
+ }
@@ -0,0 +1,15 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Events;
4
+
5
+ use Fleetbase\Events\ResourceLifecycleEvent;
6
+
7
+ class OrderCompleted extends ResourceLifecycleEvent
8
+ {
9
+ /**
10
+ * The event name.
11
+ *
12
+ * @var string
13
+ */
14
+ public $eventName = 'completed';
15
+ }