@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,146 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
4
+
5
+ use Fleetbase\FleetOps\Http\Requests\CreateZoneRequest;
6
+ use Fleetbase\FleetOps\Http\Requests\UpdateZoneRequest;
7
+ use Fleetbase\FleetOps\Http\Resources\v1\DeletedResource;
8
+ use Fleetbase\FleetOps\Http\Resources\v1\Zone as ZoneResource;
9
+ use Fleetbase\FleetOps\Models\Zone;
10
+ use Fleetbase\FleetOps\Support\Utils;
11
+ use Fleetbase\Http\Controllers\Controller;
12
+ use Illuminate\Http\Request;
13
+
14
+ class ZoneController extends Controller
15
+ {
16
+ /**
17
+ * Creates a new Fleetbase Zone resource.
18
+ *
19
+ * @param \Fleetbase\Http\Requests\CreateZoneRequest $request
20
+ *
21
+ * @return \Fleetbase\Http\Resources\Zone
22
+ */
23
+ public function create(CreateZoneRequest $request)
24
+ {
25
+ // get request input
26
+ $input = $request->only(['name', 'boundary', 'status', 'description', 'color', 'stroke_color']);
27
+
28
+ // make sure company is set
29
+ $input['company_uuid'] = session('company');
30
+
31
+ // service area assignment
32
+ if ($request->has('service_area')) {
33
+ $input['service_area_uuid'] = Utils::getUuid('service_areas', [
34
+ 'public_id' => $request->input('service_area'),
35
+ 'company_uuid' => session('company'),
36
+ ]);
37
+ }
38
+
39
+ // create the zone
40
+ $zone = Zone::create($input);
41
+
42
+ // response the driver resource
43
+ return new ZoneResource($zone);
44
+ }
45
+
46
+ /**
47
+ * Updates a Fleetbase Zone resource.
48
+ *
49
+ * @param string $id
50
+ * @param \Fleetbase\Http\Requests\UpdateZoneRequest $request
51
+ *
52
+ * @return \Fleetbase\Http\Resources\Zone
53
+ */
54
+ public function update($id, UpdateZoneRequest $request)
55
+ {
56
+ // find for the zone
57
+ try {
58
+ $zone = Zone::findRecordOrFail($id);
59
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
60
+ return response()->json(
61
+ [
62
+ 'error' => 'Zone resource not found.',
63
+ ],
64
+ 404
65
+ );
66
+ }
67
+
68
+ // get request input
69
+ $input = $request->only(['name', 'boundary', 'status', 'description', 'color', 'stroke_color']);
70
+
71
+ // service area assignment
72
+ if ($request->has('service_area')) {
73
+ $input['service_area_uuid'] = Utils::getUuid('service_areas', [
74
+ 'public_id' => $request->input('service_area'),
75
+ 'company_uuid' => session('company'),
76
+ ]);
77
+ }
78
+
79
+ // update the zone
80
+ $zone->update($input);
81
+
82
+ // response the zone resource
83
+ return new ZoneResource($zone);
84
+ }
85
+
86
+ /**
87
+ * Query for Fleetbase Zone resources.
88
+ *
89
+ * @return \Fleetbase\Http\Resources\ZoneCollection
90
+ */
91
+ public function query(Request $request)
92
+ {
93
+ $results = Zone::queryWithRequest($request);
94
+
95
+ return ZoneResource::collection($results);
96
+ }
97
+
98
+ /**
99
+ * Finds a single Fleetbase Zone resources.
100
+ *
101
+ * @return \Fleetbase\Http\Resources\ZoneCollection
102
+ */
103
+ public function find($id)
104
+ {
105
+ // find for the zone
106
+ try {
107
+ $zone = Zone::findRecordOrFail($id);
108
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
109
+ return response()->json(
110
+ [
111
+ 'error' => 'Zone resource not found.',
112
+ ],
113
+ 404
114
+ );
115
+ }
116
+
117
+ // response the zone resource
118
+ return new ZoneResource($zone);
119
+ }
120
+
121
+ /**
122
+ * Deletes a Fleetbase Zone resources.
123
+ *
124
+ * @return \Fleetbase\Http\Resources\ZoneCollection
125
+ */
126
+ public function delete($id)
127
+ {
128
+ // find for the driver
129
+ try {
130
+ $zone = Zone::findRecordOrFail($id);
131
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
132
+ return response()->json(
133
+ [
134
+ 'error' => 'Zone resource not found.',
135
+ ],
136
+ 404
137
+ );
138
+ }
139
+
140
+ // delete the zone
141
+ $zone->delete();
142
+
143
+ // response the zone resource
144
+ return new DeletedResource($zone);
145
+ }
146
+ }
@@ -0,0 +1,13 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers;
4
+
5
+ use Fleetbase\Http\Controllers\FleetbaseController;
6
+
7
+ class FleetOpsController extends FleetbaseController
8
+ {
9
+ /**
10
+ * The package namespace used to resolve from.
11
+ */
12
+ public string $namespace = '\\Fleetbase\\FleetOps';
13
+ }
@@ -0,0 +1,69 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\FleetOps\Exports\ContactExport;
6
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
7
+ use Fleetbase\FleetOps\Models\Contact;
8
+ use Fleetbase\Http\Requests\ExportRequest;
9
+ use Illuminate\Support\Str;
10
+ use Maatwebsite\Excel\Facades\Excel;
11
+
12
+ class ContactController extends FleetOpsController
13
+ {
14
+ /**
15
+ * The resource to query.
16
+ *
17
+ * @var string
18
+ */
19
+ public $resource = 'contact';
20
+
21
+ /**
22
+ * Returns the contact as a `facilitator-contact`.
23
+ *
24
+ * @var string id
25
+ */
26
+ public function getAsFacilitator($id)
27
+ {
28
+ $contact = Contact::where('uuid', $id)->withTrashes()->first();
29
+
30
+ if (!$contact) {
31
+ return response()->error('Facilitator not found.');
32
+ }
33
+
34
+ return response()->json([
35
+ 'facilitatorContact' => $contact,
36
+ ]);
37
+ }
38
+
39
+ /**
40
+ * Returns the contact as a `customer-contact`.
41
+ *
42
+ * @var string id
43
+ */
44
+ public function getAsCustomer($id)
45
+ {
46
+ $contact = Contact::where('uuid', $id)->withTrashed()->first();
47
+
48
+ if (!$contact) {
49
+ return response()->error('Customer not found.');
50
+ }
51
+
52
+ return response()->json([
53
+ 'customerContact' => $contact,
54
+ ]);
55
+ }
56
+
57
+ /**
58
+ * Export the contacts to excel or csv.
59
+ *
60
+ * @return \Illuminate\Http\Response
61
+ */
62
+ public static function export(ExportRequest $request)
63
+ {
64
+ $format = $request->input('format', 'xlsx');
65
+ $fileName = trim(Str::slug('contacts-' . date('Y-m-d-H:i')) . '.' . $format);
66
+
67
+ return Excel::download(new ContactExport(), $fileName);
68
+ }
69
+ }
@@ -0,0 +1,261 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\Exceptions\FleetbaseRequestValidationException;
6
+ use Fleetbase\FleetOps\Exports\DriverExport;
7
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
8
+ use Fleetbase\FleetOps\Http\Requests\Internal\CreateDriverRequest;
9
+ use Fleetbase\FleetOps\Http\Requests\Internal\UpdateDriverRequest;
10
+ use Fleetbase\FleetOps\Models\Driver;
11
+ use Fleetbase\FleetOps\Support\Utils;
12
+ use Fleetbase\Http\Requests\ExportRequest;
13
+ use Fleetbase\Models\Invite;
14
+ use Fleetbase\Models\User;
15
+ use Fleetbase\Notifications\UserInvited;
16
+ use Grimzy\LaravelMysqlSpatial\Types\Point;
17
+ use Illuminate\Http\Request;
18
+ use Illuminate\Support\Facades\DB;
19
+ use Illuminate\Support\Facades\Validator;
20
+ use Illuminate\Support\Str;
21
+ use Maatwebsite\Excel\Facades\Excel;
22
+
23
+ class DriverController extends FleetOpsController
24
+ {
25
+ /**
26
+ * The resource to query.
27
+ *
28
+ * @var string
29
+ */
30
+ public $resource = 'driver';
31
+
32
+ /**
33
+ * Creates a record with request payload.
34
+ *
35
+ * @return \Illuminate\Http\Response
36
+ */
37
+ public function createRecord(Request $request)
38
+ {
39
+ $input = $request->input('driver');
40
+
41
+ // create validation request
42
+ $createDriverRequest = CreateDriverRequest::createFrom($request);
43
+ $rules = $createDriverRequest->rules();
44
+
45
+ // manually validate request
46
+ $validator = Validator::make($input, $rules);
47
+
48
+ if ($validator->fails()) {
49
+ // here if the user exists already
50
+ // within organization: offer to create driver record
51
+ // outside organization: invite to join organization AS DRIVER
52
+ if ($validator->errors()->hasAny(['phone', 'email'])) {
53
+ // get existing user
54
+ $existingUser = User::where(
55
+ function ($q) use ($input) {
56
+ if (!empty($input['phone'])) {
57
+ $q->orWhere('phone', $input['phone']);
58
+ }
59
+
60
+ if (!empty($input['email'])) {
61
+ $q->orWhere('email', $input['email']);
62
+ }
63
+ }
64
+ )->first();
65
+
66
+ if ($existingUser) {
67
+ // if exists in organization create driver profile for user
68
+ $isOrganizationMember = $existingUser->companies()->where('company_uuid', session('company'))->exists();
69
+
70
+ // create driver profile for user
71
+ $input = collect($input)
72
+ ->except(['name', 'password', 'email', 'phone', 'location', 'meta'])
73
+ ->filter()
74
+ ->toArray();
75
+
76
+ // set the user
77
+ $input['company_uuid'] = session('company');
78
+ $input['user_uuid'] = $existingUser->uuid;
79
+ $input['slug'] = $existingUser->slug;
80
+
81
+ if ($request->missing('location')) {
82
+ $input['location'] = new Point(0, 0);
83
+ }
84
+
85
+ // create the profile
86
+ $driverProfile = Driver::create($input);
87
+
88
+ if (!$isOrganizationMember) {
89
+ // send invitation to user
90
+ $invitation = Invite::create([
91
+ 'company_uuid' => session('company'),
92
+ 'created_by_uuid' => session('user'),
93
+ 'subject_uuid' => session('company'),
94
+ 'subject_type' => Utils::getMutationType('company'),
95
+ 'protocol' => 'email',
96
+ 'recipients' => [$existingUser->email],
97
+ 'reason' => 'join_company',
98
+ ]);
99
+
100
+ // notify user
101
+ $existingUser->notify(new UserInvited($invitation));
102
+ }
103
+
104
+ return response()->json(['driver' => $driverProfile]);
105
+ }
106
+ }
107
+
108
+ // check from validator object if phone or email is not unique
109
+ return $createDriverRequest->responseWithErrors($validator);
110
+ }
111
+
112
+ try {
113
+ $record = $this->model->createRecordFromRequest(
114
+ $request,
115
+ function (&$request, &$input) {
116
+ $input = collect($input);
117
+
118
+ $userInput = $input
119
+ ->only(['name', 'password', 'email', 'phone', 'status'])
120
+ ->filter()
121
+ ->toArray();
122
+
123
+ $input = $input
124
+ ->except(['name', 'password', 'email', 'phone', 'location', 'meta'])
125
+ ->filter()
126
+ ->toArray();
127
+
128
+ if (!isset($input['password'])) {
129
+ $input['password'] = $userInput['phone'] ?? Str::random(14);
130
+ }
131
+
132
+ $userInput['company_uuid'] = session('company');
133
+ $userInput['type'] = 'driver';
134
+
135
+ $user = User::create($userInput);
136
+
137
+ // send invitation to user
138
+ $invitation = Invite::create([
139
+ 'company_uuid' => session('company'),
140
+ 'created_by_uuid' => session('user'),
141
+ 'subject_uuid' => session('company'),
142
+ 'subject_type' => Utils::getMutationType('company'),
143
+ 'protocol' => 'email',
144
+ 'recipients' => [$user->email],
145
+ 'reason' => 'join_company',
146
+ ]);
147
+
148
+ // notify user
149
+ $user->notify(new UserInvited($invitation));
150
+
151
+ $input['user_uuid'] = $user->uuid;
152
+ $input['slug'] = $user->slug;
153
+
154
+ if ($request->missing('location')) {
155
+ $input['location'] = new Point(0, 0);
156
+ }
157
+ },
158
+ function ($request, &$driver) {
159
+ $driver->load(['user']);
160
+ }
161
+ );
162
+
163
+ return ['driver' => new $this->resource($record)];
164
+ } catch (\Exception $e) {
165
+ return response()->error($e->getMessage());
166
+ } catch (\Illuminate\Database\QueryException $e) {
167
+ return response()->error($e->getMessage());
168
+ } catch (FleetbaseRequestValidationException $e) {
169
+ return response()->error($e->getErrors());
170
+ }
171
+ }
172
+
173
+ /**
174
+ * Updates a record with request payload.
175
+ *
176
+ * @return \Illuminate\Http\Response
177
+ */
178
+ public function updateRecord(Request $request, string $id)
179
+ {
180
+ // get input data
181
+ $input = $request->input('driver');
182
+
183
+ // create validation request
184
+ $updateDriverRequest = UpdateDriverRequest::createFrom($request);
185
+ $rules = $updateDriverRequest->rules();
186
+
187
+ // manually validate request
188
+ $validator = Validator::make($input, $rules);
189
+
190
+ if ($validator->fails()) {
191
+ return $updateDriverRequest->responseWithErrors($validator);
192
+ }
193
+
194
+ try {
195
+ $record = $this->model->updateRecordFromRequest(
196
+ $request,
197
+ $id,
198
+ function (&$request, &$driver, &$input) {
199
+ $driver->load(['user']);
200
+ $input = collect($input);
201
+ $userInput = $input->only(['name', 'password', 'email', 'phone'])->toArray();
202
+ $input = $input->except(['name', 'password', 'email', 'phone', 'location', 'meta'])->toArray();
203
+
204
+ $driver->user->update($userInput);
205
+ $driver->flushAttributesCache();
206
+
207
+ $input['slug'] = $driver->user->slug;
208
+ },
209
+ function ($request, &$driver) {
210
+ $driver->load(['user']);
211
+
212
+ if ($driver->user) {
213
+ $driver->user->setHidden(['driver']);
214
+ }
215
+
216
+ $driver->setHidden(['user']);
217
+ }
218
+ );
219
+
220
+ return ['driver' => new $this->resource($record)];
221
+ } catch (\Exception $e) {
222
+ return response()->error($e->getMessage());
223
+ } catch (\Illuminate\Database\QueryException $e) {
224
+ return response()->error($e->getMessage());
225
+ } catch (FleetbaseRequestValidationException $e) {
226
+ return response()->error($e->getErrors());
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Get all status options for an driver.
232
+ *
233
+ * @return \Illuminate\Http\Response
234
+ */
235
+ public function statuses()
236
+ {
237
+ $statuses = DB::table('drivers')
238
+ ->select('status')
239
+ ->where('company_uuid', session('company'))
240
+ ->distinct()
241
+ ->get()
242
+ ->pluck('status')
243
+ ->filter()
244
+ ->values();
245
+
246
+ return response()->json($statuses);
247
+ }
248
+
249
+ /**
250
+ * Export the drivers to excel or csv.
251
+ *
252
+ * @return \Illuminate\Http\Response
253
+ */
254
+ public static function export(ExportRequest $request)
255
+ {
256
+ $format = $request->input('format', 'xlsx');
257
+ $fileName = trim(Str::slug('drivers-' . date('Y-m-d-H:i')) . '.' . $format);
258
+
259
+ return Excel::download(new DriverExport(), $fileName);
260
+ }
261
+ }
@@ -0,0 +1,15 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
+
7
+ class EntityController extends FleetOpsController
8
+ {
9
+ /**
10
+ * The resource to query.
11
+ *
12
+ * @var string
13
+ */
14
+ public $resource = 'entity';
15
+ }
@@ -0,0 +1,152 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\FleetOps\Exports\FleetExport;
6
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
7
+ use Fleetbase\FleetOps\Http\Requests\Internal\FleetActionRequest;
8
+ use Fleetbase\FleetOps\Models\Driver;
9
+ use Fleetbase\FleetOps\Models\Fleet;
10
+ use Fleetbase\FleetOps\Models\FleetDriver;
11
+ use Fleetbase\FleetOps\Models\FleetVehicle;
12
+ use Fleetbase\FleetOps\Models\Vehicle;
13
+ use Fleetbase\Http\Requests\ExportRequest;
14
+ use Illuminate\Support\Str;
15
+ use Maatwebsite\Excel\Facades\Excel;
16
+
17
+ class FleetController extends FleetOpsController
18
+ {
19
+ /**
20
+ * The resource to query.
21
+ *
22
+ * @var string
23
+ */
24
+ public $resource = 'fleet';
25
+
26
+ /**
27
+ * Export the fleets to excel or csv.
28
+ *
29
+ * @return \Illuminate\Http\Response
30
+ */
31
+ public static function export(ExportRequest $request)
32
+ {
33
+ $format = $request->input('format', 'xlsx');
34
+ $fileName = trim(Str::slug('fleets-' . date('Y-m-d-H:i')) . '.' . $format);
35
+
36
+ return Excel::download(new FleetExport(), $fileName);
37
+ }
38
+
39
+ /**
40
+ * Removes a driver from a fleet.
41
+ *
42
+ * @param \Illuminate\Http\Request $request
43
+ *
44
+ * @return \Illuminate\Http\Response
45
+ */
46
+ public static function removeDriver(FleetActionRequest $request)
47
+ {
48
+ $fleet = Fleet::where('uuid', $request->input('fleet'))->first();
49
+ $driver = Driver::where('uuid', $request->input('driver'))->first();
50
+
51
+ // check if driver is already in this fleet
52
+ $deleted = FleetDriver::where([
53
+ 'fleet_uuid' => $fleet->uuid,
54
+ 'driver_uuid' => $driver->uuid,
55
+ ])->delete();
56
+
57
+ return response()->json([
58
+ 'status' => 'ok',
59
+ 'deleted' => $deleted,
60
+ ]);
61
+ }
62
+
63
+ /**
64
+ * Adds a driver to a fleet.
65
+ *
66
+ * @param \Illuminate\Http\Request $request
67
+ *
68
+ * @return \Illuminate\Http\Response
69
+ */
70
+ public static function assignDriver(FleetActionRequest $request)
71
+ {
72
+ $fleet = Fleet::where('uuid', $request->input('fleet'))->first();
73
+ $driver = Driver::where('uuid', $request->input('driver'))->first();
74
+ $added = false;
75
+
76
+ // check if driver is already in this fleet
77
+ $exists = FleetDriver::where([
78
+ 'fleet_uuid' => $fleet->uuid,
79
+ 'driver_uuid' => $driver->uuid,
80
+ ])->exists();
81
+
82
+ if (!$exists) {
83
+ $added = FleetDriver::create([
84
+ 'fleet_uuid' => $fleet->uuid,
85
+ 'driver_uuid' => $driver->uuid,
86
+ ]);
87
+ }
88
+
89
+ return response()->json([
90
+ 'status' => 'ok',
91
+ 'exists' => $exists,
92
+ 'added' => (bool) $added,
93
+ ]);
94
+ }
95
+
96
+ /**
97
+ * Removes a vehicle from a fleet.
98
+ *
99
+ * @param \Illuminate\Http\Request $request
100
+ *
101
+ * @return \Illuminate\Http\Response
102
+ */
103
+ public static function removeVehicle(FleetActionRequest $request)
104
+ {
105
+ $fleet = Fleet::where('uuid', $request->input('fleet'))->first();
106
+ $vehicle = Vehicle::where('uuid', $request->input('vehicle'))->first();
107
+
108
+ // check if vehicle is already in this fleet
109
+ $deleted = FleetVehicle::where([
110
+ 'fleet_uuid' => $fleet->uuid,
111
+ 'vehicle_uuid' => $vehicle->uuid,
112
+ ])->delete();
113
+
114
+ return response()->json([
115
+ 'status' => 'ok',
116
+ 'deleted' => $deleted,
117
+ ]);
118
+ }
119
+
120
+ /**
121
+ * Adds a vehicle to a fleet.
122
+ *
123
+ * @param \Illuminate\Http\Request $request
124
+ *
125
+ * @return \Illuminate\Http\Response
126
+ */
127
+ public static function assignVehicle(FleetActionRequest $request)
128
+ {
129
+ $fleet = Fleet::where('uuid', $request->input('fleet'))->first();
130
+ $vehicle = Vehicle::where('uuid', $request->input('vehicle'))->first();
131
+ $added = false;
132
+
133
+ // check if vehicle is already in this fleet
134
+ $exists = FleetVehicle::where([
135
+ 'fleet_uuid' => $fleet->uuid,
136
+ 'vehicle_uuid' => $vehicle->uuid,
137
+ ])->exists();
138
+
139
+ if (!$exists) {
140
+ $added = FleetVehicle::create([
141
+ 'fleet_uuid' => $fleet->uuid,
142
+ 'vehicle_uuid' => $vehicle->uuid,
143
+ ]);
144
+ }
145
+
146
+ return response()->json([
147
+ 'status' => 'ok',
148
+ 'exists' => $exists,
149
+ 'added' => (bool) $added,
150
+ ]);
151
+ }
152
+ }