@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,97 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Integrations\Lalamove;
4
+
5
+ use Fleetbase\FleetOps\Models\Place;
6
+ use Grimzy\LaravelMysqlSpatial\Eloquent\SpatialExpression;
7
+ use Grimzy\LaravelMysqlSpatial\Types\Point;
8
+ use Illuminate\Support\Str;
9
+
10
+ class LalamoveDeliveryStop
11
+ {
12
+ public $latitude;
13
+ public $longitude;
14
+ public $address;
15
+ public $stopId;
16
+
17
+ public function __construct($latitude, $longitude = null, ?string $address = '')
18
+ {
19
+ $this->stopId = (string) Str::uuid();
20
+
21
+ if ($latitude instanceof Place) {
22
+ $place = $latitude;
23
+
24
+ $this->address = $place->address;
25
+
26
+ if ($place->location instanceof SpatialExpression) {
27
+ $wkt = $place->location->getSpatialValue();
28
+ $point = Point::fromWKT($wkt);
29
+
30
+ $this->latitude = $point->getLat();
31
+ $this->longitude = $point->getLng();
32
+ } else {
33
+ $this->latitude = $place->location->getLat();
34
+ $this->longitude = $place->location->getLng();
35
+ }
36
+ } elseif ($latitude instanceof Point) {
37
+ $point = $latitude;
38
+
39
+ $this->latitude = $point->getLat();
40
+ $this->longitude = $point->getLng();
41
+ $this->address = $address ?? '';
42
+ } else {
43
+ $this->latitude = $latitude;
44
+ $this->longitude = $longitude;
45
+ $this->address = $address;
46
+ }
47
+ }
48
+
49
+ public function __get(string $key)
50
+ {
51
+ $key = strtolower($key);
52
+
53
+ if (isset($this->{$key})) {
54
+ return $this->{$key};
55
+ }
56
+
57
+ return null;
58
+ }
59
+
60
+ public static function createFromPlace(Place $place)
61
+ {
62
+ $latitude = $place->location->getLat();
63
+ $longitude = $place->location->getLng();
64
+ $address = $place->address;
65
+
66
+ return new static($latitude, $longitude, $address);
67
+ }
68
+
69
+ public static function createFromPoint(Point $point, string $address = '')
70
+ {
71
+ $latitude = $point->getLat();
72
+ $longitude = $point->getLng();
73
+
74
+ return new static($latitude, $longitude, $address);
75
+ }
76
+
77
+ public function toPoint()
78
+ {
79
+ return new Point($this->latitude, $this->longitude);
80
+ }
81
+
82
+ public function toJson()
83
+ {
84
+ return json_encode($this->toArray());
85
+ }
86
+
87
+ public function toArray()
88
+ {
89
+ return [
90
+ 'coordinates' => [
91
+ 'lat' => (string) $this->latitude,
92
+ 'lng' => (string) $this->longitude,
93
+ ],
94
+ 'address' => $this->address,
95
+ ];
96
+ }
97
+ }
@@ -0,0 +1,123 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Integrations\Lalamove;
4
+
5
+ use Fleetbase\FleetOps\Support\Utils;
6
+
7
+ class LalamoveMarket
8
+ {
9
+ /**
10
+ * Available Markets for Lalamove.
11
+ *
12
+ * @var array
13
+ */
14
+ public const markets = [
15
+ [
16
+ 'key' => 'brazil',
17
+ 'code' => 'BR',
18
+ 'languages' => ['en_BR', 'pr_BR'],
19
+ ],
20
+ [
21
+ 'key' => 'hong_kong',
22
+ 'code' => 'HK',
23
+ 'languages' => ['en_HK', 'zh_HK'],
24
+ ],
25
+ [
26
+ 'key' => 'indonesia',
27
+ 'code' => 'ID',
28
+ 'languages' => ['en_ID', 'id_ID'],
29
+ ],
30
+ [
31
+ 'key' => 'malaysia',
32
+ 'code' => 'MY',
33
+ 'languages' => ['en_MY', 'ms_MY'],
34
+ ],
35
+ [
36
+ 'key' => 'mexico',
37
+ 'code' => 'MX',
38
+ 'languages' => ['en_MX', 'es_MX'],
39
+ ],
40
+ [
41
+ 'key' => 'philippines',
42
+ 'code' => 'PH',
43
+ 'languages' => ['en_PH'],
44
+ ],
45
+ [
46
+ 'key' => 'singapore',
47
+ 'code' => 'SG',
48
+ 'languages' => ['en_SG'],
49
+ ],
50
+ [
51
+ 'key' => 'taiwan',
52
+ 'code' => 'TW',
53
+ 'languages' => ['zh_TW'],
54
+ ],
55
+ [
56
+ 'key' => 'thailand',
57
+ 'code' => 'TH',
58
+ 'languages' => ['th_TH', 'en_TH'],
59
+ ],
60
+ [
61
+ 'key' => 'vietnam',
62
+ 'code' => 'VN',
63
+ 'languages' => ['en_VN', 'vi_VN'],
64
+ ],
65
+ ];
66
+
67
+ public function __construct(array $details)
68
+ {
69
+ foreach ($details as $key => $value) {
70
+ $this->{$key} = $value;
71
+ }
72
+ }
73
+
74
+ public function __get(string $key)
75
+ {
76
+ $key = strtolower($key);
77
+
78
+ if (isset($this->{$key})) {
79
+ return $this->{$key};
80
+ }
81
+
82
+ return null;
83
+ }
84
+
85
+ public function getCode()
86
+ {
87
+ return $this->code;
88
+ }
89
+
90
+ public function getLanguages()
91
+ {
92
+ return $this->languages;
93
+ }
94
+
95
+ public static function all()
96
+ {
97
+ return collect(static::markets)->mapInto(LalamoveMarket::class);
98
+ }
99
+
100
+ public static function find($key)
101
+ {
102
+ if (is_callable($key)) {
103
+ return static::all()->first($key);
104
+ }
105
+
106
+ if (is_string($key)) {
107
+ return static::all()->first(
108
+ function ($detail) use ($key) {
109
+ return isset($detail->key) && strtolower($detail->key) === strtolower($key) || isset($detail->code) && strtolower($detail->code) === strtolower($key);
110
+ }
111
+ );
112
+ }
113
+ }
114
+
115
+ public static function codes()
116
+ {
117
+ return static::all()->map(
118
+ function ($market) {
119
+ return Utils::get($market, 'code');
120
+ }
121
+ );
122
+ }
123
+ }
@@ -0,0 +1,161 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Integrations\Lalamove;
4
+
5
+ class LalamoveServiceType
6
+ {
7
+ /**
8
+ * Available Service types for Lalamove.
9
+ */
10
+ private static array $serviceTypes = [
11
+ // [
12
+ // 'key' => 'WALKER',
13
+ // 'description' => 'Walker',
14
+ // 'restrictions' => [
15
+ // 'length' => '40cm',
16
+ // 'width' => '40cm',
17
+ // 'height' => '40cm',
18
+ // 'weight' => '10kg',
19
+ // ],
20
+ // ],
21
+ [
22
+ 'key' => 'MOTORCYCLE',
23
+ 'description' => 'Motorcycle',
24
+ 'restrictions' => [
25
+ 'length' => '40cm',
26
+ 'width' => '40cm',
27
+ 'height' => '40cm',
28
+ 'weight' => '10kg',
29
+ ],
30
+ ],
31
+ [
32
+ 'key' => 'CAR',
33
+ 'description' => 'Car',
34
+ 'restrictions' => [
35
+ 'length' => '70cm',
36
+ 'width' => '50cm',
37
+ 'height' => '50cm',
38
+ 'weight' => '20kg',
39
+ ],
40
+ ],
41
+ // [
42
+ // 'key' => 'SEDAN',
43
+ // 'description' => 'Sedan',
44
+ // 'restrictions' => [
45
+ // 'length' => '150cm',
46
+ // 'width' => '80cm',
47
+ // 'height' => '80cm',
48
+ // 'weight' => '100kg',
49
+ // ],
50
+ // ],
51
+ [
52
+ 'key' => 'VAN',
53
+ 'description' => 'Van',
54
+ 'restrictions' => [
55
+ 'length' => '182cm',
56
+ 'width' => '121cm',
57
+ 'height' => '121cm',
58
+ 'weight' => '800kg',
59
+ ],
60
+ ],
61
+ [
62
+ 'key' => 'SUV',
63
+ 'description' => 'SUV',
64
+ 'restrictions' => [
65
+ 'length' => '182cm',
66
+ 'width' => '121cm',
67
+ 'height' => '121cm',
68
+ 'weight' => '800kg',
69
+ ],
70
+ ],
71
+ // [
72
+ // 'key' => 'TRUCK175',
73
+ // 'description' => 'Pickup Truck',
74
+ // 'restrictions' => [
75
+ // 'length' => '200cm',
76
+ // 'width' => '160cm',
77
+ // 'height' => '120cm',
78
+ // 'weight' => '800kg',
79
+ // ],
80
+ // ],
81
+ [
82
+ 'key' => 'TRUCK330',
83
+ 'description' => '1-Ton Lorry / Lori 1-Tan',
84
+ 'restrictions' => [
85
+ 'length' => '275cm',
86
+ 'width' => '152cm',
87
+ 'height' => '152cm',
88
+ 'weight' => '1000kg',
89
+ ],
90
+ ],
91
+ [
92
+ 'key' => 'TRUCK550',
93
+ 'description' => '5.5 Ton',
94
+ 'restrictions' => [
95
+ 'length' => '450cm',
96
+ 'width' => '195cm',
97
+ 'height' => '195cm',
98
+ 'weight' => '1200kg',
99
+ ],
100
+ ],
101
+ ];
102
+
103
+ public function __construct(array $details)
104
+ {
105
+ foreach ($details as $key => $value) {
106
+ $this->{$key} = $value;
107
+ }
108
+ }
109
+
110
+ public function __get(string $key)
111
+ {
112
+ $restrictions = ['length', 'width', 'height', 'weight'];
113
+ $key = strtolower($key);
114
+
115
+ if (isset($this->{$key})) {
116
+ return $this->{$key};
117
+ }
118
+
119
+ if (in_array($key, $restrictions)) {
120
+ return $this->restrictions[$key];
121
+ }
122
+
123
+ return null;
124
+ }
125
+
126
+ public function __call(string $key, $arguments)
127
+ {
128
+ if ($key === 'all') {
129
+ return collect(static::$serviceTypes)->mapInto(LalamoveServiceType::class);
130
+ }
131
+
132
+ if (method_exists($this, $key)) {
133
+ $this->{$key}(...$arguments);
134
+ }
135
+
136
+ return null;
137
+ }
138
+
139
+ public function getKey()
140
+ {
141
+ return $this->key;
142
+ }
143
+
144
+ public static function all()
145
+ {
146
+ return collect(static::$serviceTypes)->mapInto(LalamoveServiceType::class);
147
+ }
148
+
149
+ public static function find($key)
150
+ {
151
+ if (is_callable($key)) {
152
+ return static::all()->first($key);
153
+ }
154
+
155
+ if (is_string($key)) {
156
+ return static::all()->first(function ($detail) use ($key) {
157
+ return isset($detail->key) && strtolower($detail->key) === strtolower($key);
158
+ });
159
+ }
160
+ }
161
+ }
@@ -0,0 +1,81 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Jobs;
4
+
5
+ use Fleetbase\FleetOps\Models\Driver;
6
+ use Illuminate\Bus\Queueable;
7
+ use Illuminate\Contracts\Queue\ShouldQueue;
8
+ use Illuminate\Foundation\Bus\Dispatchable;
9
+ use Illuminate\Queue\InteractsWithQueue;
10
+ use Illuminate\Queue\SerializesModels;
11
+ use Illuminate\Support\Arr;
12
+
13
+ /**
14
+ * Class SimulateDrivingRoute
15
+ * Simulates a driving route for a given driver by dispatching events at each waypoint.
16
+ */
17
+ class SimulateDrivingRoute implements ShouldQueue
18
+ {
19
+ use Dispatchable;
20
+ use InteractsWithQueue;
21
+ use Queueable;
22
+ use SerializesModels;
23
+
24
+ /**
25
+ * @var Driver the driver for whom the route is being simulated
26
+ */
27
+ public Driver $driver;
28
+
29
+ /**
30
+ * @var array the waypoints that make up the route
31
+ */
32
+ public array $waypoints = [];
33
+
34
+ /**
35
+ * The number of seconds the job can run before timing out.
36
+ *
37
+ * @var int
38
+ */
39
+ public $timeout = 60 * 15;
40
+
41
+ /**
42
+ * The number of times the job may be attempted.
43
+ *
44
+ * @var int
45
+ */
46
+ public $tries = 20;
47
+
48
+ /**
49
+ * Create a new job instance.
50
+ *
51
+ * @param \Fleetbase\FleetOps\Models\Driver $driver the driver for whom the route is being simulated
52
+ * @param array $waypoints the waypoints that make up the route
53
+ */
54
+ public function __construct(Driver $driver, array $waypoints = [])
55
+ {
56
+ $this->driver = $driver->withoutRelations();
57
+ $this->waypoints = $waypoints;
58
+ }
59
+
60
+ /**
61
+ * Execute the job.
62
+ * Dispatches an event for each waypoint, simulating the driver's movement along the route.
63
+ */
64
+ public function handle(): void
65
+ {
66
+ ini_set('memory_limit', '-1');
67
+ ini_set('max_execution_time', 0);
68
+
69
+ $firstWaypoint = reset($this->waypoints);
70
+ $remainingWaypoints = array_slice($this->waypoints, 1, null, true);
71
+
72
+ SimulateWaypointReached::withChain(
73
+ Arr::map(
74
+ $remainingWaypoints,
75
+ function ($waypoint, $index) {
76
+ return new SimulateWaypointReached($this->driver, $waypoint, ['index' => $index]);
77
+ }
78
+ )
79
+ )->dispatch($this->driver, $firstWaypoint, ['index' => 0]);
80
+ }
81
+ }
@@ -0,0 +1,79 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Jobs;
4
+
5
+ use Fleetbase\FleetOps\Events\DriverSimulatedLocationChanged;
6
+ use Fleetbase\FleetOps\Models\Driver;
7
+ use Grimzy\LaravelMysqlSpatial\Types\Point;
8
+ use Illuminate\Bus\Queueable;
9
+ use Illuminate\Contracts\Queue\ShouldQueue;
10
+ use Illuminate\Foundation\Bus\Dispatchable;
11
+ use Illuminate\Queue\InteractsWithQueue;
12
+ use Illuminate\Queue\SerializesModels;
13
+
14
+ /**
15
+ * Class SimulateWaypointReached
16
+ * Simulates the reaching of a waypoint for a given driver by dispatching an event.
17
+ */
18
+ class SimulateWaypointReached implements ShouldQueue
19
+ {
20
+ use Dispatchable;
21
+ use InteractsWithQueue;
22
+ use Queueable;
23
+ use SerializesModels;
24
+
25
+ /**
26
+ * @var \Fleetbase\FleetOps\Models\Driver the driver for whom the waypoint is being simulated
27
+ */
28
+ public Driver $driver;
29
+
30
+ /**
31
+ * @var \Grimzy\LaravelMysqlSpatial\Types\Point the waypoint that the driver is simulated to have reached
32
+ */
33
+ public Point $waypoint;
34
+
35
+ /**
36
+ * @var array additional data
37
+ */
38
+ public array $additionalData = [];
39
+
40
+ /**
41
+ * The number of seconds the job can run before timing out.
42
+ *
43
+ * @var int
44
+ */
45
+ public $timeout = 60 * 15;
46
+
47
+ /**
48
+ * The number of times the job may be attempted.
49
+ *
50
+ * @var int
51
+ */
52
+ public $tries = 20;
53
+
54
+ /**
55
+ * Create a new job instance.
56
+ *
57
+ * @param Driver $driver the driver for whom the waypoint is being simulated
58
+ * @param mixed $waypoint the waypoint that the driver is simulated to have reached
59
+ */
60
+ public function __construct(Driver $driver, Point $waypoint, array $additionalData = [])
61
+ {
62
+ $this->driver = $driver;
63
+ $this->waypoint = $waypoint;
64
+ $this->additionalData = $additionalData;
65
+ }
66
+
67
+ /**
68
+ * Execute the job.
69
+ * Dispatches an event to notify that the driver has reached the simulated waypoint.
70
+ */
71
+ public function handle(): void
72
+ {
73
+ if (data_get($this->waypoint, 'heading')) {
74
+ $this->additionalData['heading'] = data_get($this->waypoint, 'heading');
75
+ }
76
+
77
+ event(new DriverSimulatedLocationChanged($this->driver, $this->waypoint, $this->additionalData));
78
+ }
79
+ }
@@ -0,0 +1,46 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Listeners;
4
+
5
+ use Fleetbase\FleetOps\Events\OrderCanceled;
6
+ use Fleetbase\FleetOps\Models\Driver;
7
+ use Fleetbase\FleetOps\Notifications\OrderCanceled as OrderCanceledNotification;
8
+ use Illuminate\Contracts\Queue\ShouldQueue;
9
+ use Illuminate\Queue\InteractsWithQueue;
10
+
11
+ class HandleOrderCanceled implements ShouldQueue
12
+ {
13
+ use InteractsWithQueue;
14
+
15
+ /**
16
+ * Handle the event.
17
+ *
18
+ * @param object $event
19
+ *
20
+ * @return void
21
+ */
22
+ public function handle(OrderCanceled $event)
23
+ {
24
+ /** @var \Fleetbase\FleetOps\Models\Order $order */
25
+ $order = $event->getModelRecord();
26
+ $location = $order->getLastLocation();
27
+
28
+ // update order activity
29
+ $order->setStatus('canceled');
30
+ $order->createActivity('Order canceled', 'Order was canceled', $location, $order->status);
31
+
32
+ if ($order->isIntegratedVendorOrder()) {
33
+ $order->facilitator->provider()->callback('onCanceled', $order);
34
+ }
35
+
36
+ // notify driver assigned order was canceled
37
+ if ($order->hasDriverAssigned) {
38
+ /** @var \Fleetbase\Models\Driver */
39
+ $driver = Driver::where('uuid', $order->driver_assigned_uuid)->withoutGlobalScopes()->first();
40
+
41
+ if ($driver) {
42
+ $driver->notify(new OrderCanceledNotification($order));
43
+ }
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,23 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Listeners;
4
+
5
+ use Fleetbase\FleetOps\Models\Order;
6
+ use Illuminate\Contracts\Queue\ShouldQueue;
7
+ use Illuminate\Queue\InteractsWithQueue;
8
+
9
+ class HandleOrderCreated implements ShouldQueue
10
+ {
11
+ use InteractsWithQueue;
12
+
13
+ /**
14
+ * Handle the event.
15
+ *
16
+ * @return void
17
+ */
18
+ public function handle(Order $order)
19
+ {
20
+ // set google matrix based distance and time
21
+ $order->setDistanceAndTime();
22
+ }
23
+ }
@@ -0,0 +1,35 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Listeners;
4
+
5
+ use Fleetbase\FleetOps\Events\OrderDispatchFailed;
6
+ use Fleetbase\FleetOps\Notifications\OrderDispatchFailed as OrderDispatchFailedNotification;
7
+ use Fleetbase\Models\User;
8
+ use Illuminate\Contracts\Queue\ShouldQueue;
9
+ use Illuminate\Queue\InteractsWithQueue;
10
+
11
+ class HandleOrderDispatchFailed implements ShouldQueue
12
+ {
13
+ use InteractsWithQueue;
14
+
15
+ /**
16
+ * Handle the event.
17
+ *
18
+ * @param object $event
19
+ *
20
+ * @return void
21
+ */
22
+ public function handle(OrderDispatchFailed $event)
23
+ {
24
+ /** @var \Fleetbase\FleetOps\Models\Order $order */
25
+ $order = $event->getModelRecord();
26
+
27
+ /** @var \Fleetbase\Models\User */
28
+ $createdBy = User::where('uuid', $order->created_by_uuid)->first();
29
+
30
+ // notify driver assigned order was canceled
31
+ if ($createdBy) {
32
+ $createdBy->notify(new OrderDispatchFailedNotification($order, $event));
33
+ }
34
+ }
35
+ }