@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
package/.gitattributes ADDED
@@ -0,0 +1,14 @@
1
+ /art export-ignore
2
+ /docs export-ignore
3
+ /tests export-ignore
4
+ /scripts export-ignore
5
+ /.github export-ignore
6
+ /.php_cs export-ignore
7
+ .editorconfig export-ignore
8
+ .gitattributes export-ignore
9
+ .gitignore export-ignore
10
+ phpstan.neon.dist export-ignore
11
+ phpunit.xml.dist export-ignore
12
+ CHANGELOG.md export-ignore
13
+ CONTRIBUTING.md export-ignore
14
+ README.md export-ignore
@@ -0,0 +1 @@
1
+ {"php":"7.4.33","version":"3.34.1:v3.34.1#98bf1b1068b4ceddbbc2a2b70b67a5e380add9e3","indent":" ","lineEnding":"\n","rules":{"align_multiline_comment":true,"array_syntax":{"syntax":"short"},"backtick_to_shell_exec":true,"binary_operator_spaces":{"operators":{"=>":"align","=":"align"}},"blank_line_before_statement":{"statements":["return"]},"braces_position":{"allow_single_line_anonymous_functions":true,"allow_single_line_empty_anonymous_classes":true},"cast_spaces":true,"class_attributes_separation":{"elements":{"method":"one"}},"class_definition":{"single_line":true},"class_reference_name_casing":true,"clean_namespace":true,"concat_space":{"spacing":"one"},"declare_parentheses":true,"echo_tag_syntax":true,"empty_loop_body":{"style":"braces"},"empty_loop_condition":true,"fully_qualified_strict_types":true,"general_phpdoc_tag_rename":{"replacements":{"inheritDocs":"inheritDoc"}},"global_namespace_import":{"import_classes":false,"import_constants":false,"import_functions":false},"include":true,"increment_style":{"style":"post"},"integer_literal_case":true,"lambda_not_used_import":true,"linebreak_after_opening_tag":true,"long_to_shorthand_operator":true,"magic_constant_casing":true,"magic_method_casing":true,"method_argument_space":{"on_multiline":"ignore"},"native_function_casing":true,"native_type_declaration_casing":true,"no_alias_language_construct_call":true,"no_alternative_syntax":true,"no_binary_string":true,"no_blank_lines_after_phpdoc":true,"no_empty_comment":true,"no_empty_phpdoc":true,"no_empty_statement":true,"no_extra_blank_lines":{"tokens":["attribute","case","continue","curly_brace_block","default","extra","parenthesis_brace_block","square_brace_block","switch","throw","use"]},"no_leading_namespace_whitespace":true,"no_mixed_echo_print":true,"no_multiline_whitespace_around_double_arrow":true,"no_null_property_initialization":true,"no_short_bool_cast":true,"no_singleline_whitespace_before_semicolons":true,"no_spaces_around_offset":true,"no_superfluous_phpdoc_tags":{"remove_inheritdoc":true},"no_trailing_comma_in_singleline":true,"no_unneeded_braces":{"namespaces":true},"no_unneeded_control_parentheses":{"statements":["break","clone","continue","echo_print","others","return","switch_case","yield","yield_from"]},"no_unneeded_import_alias":true,"no_unset_cast":true,"no_unused_imports":true,"no_useless_concat_operator":true,"no_useless_nullsafe_operator":true,"no_whitespace_before_comma_in_array":true,"normalize_index_brace":true,"nullable_type_declaration_for_default_null_value":{"use_nullable_type_declaration":false},"object_operator_without_whitespace":true,"operator_linebreak":{"only_booleans":true},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"alpha"},"php_unit_fqcn_annotation":true,"php_unit_method_casing":true,"phpdoc_align":true,"phpdoc_annotation_without_dot":true,"phpdoc_indent":true,"phpdoc_inline_tag_normalizer":true,"phpdoc_no_access":true,"phpdoc_no_alias_tag":true,"phpdoc_no_package":true,"phpdoc_no_useless_inheritdoc":true,"phpdoc_order":{"order":["param","return","throws"]},"phpdoc_return_self_reference":true,"phpdoc_scalar":true,"phpdoc_separation":true,"phpdoc_single_line_var_spacing":true,"phpdoc_summary":true,"phpdoc_tag_type":{"tags":{"inheritDoc":"inline"}},"phpdoc_to_comment":true,"phpdoc_trim":true,"phpdoc_trim_consecutive_blank_line_separation":true,"phpdoc_types":true,"phpdoc_types_order":{"null_adjustment":"always_last","sort_algorithm":"none"},"phpdoc_var_without_name":true,"semicolon_after_instruction":true,"simple_to_complex_string_variable":true,"single_class_element_per_statement":true,"single_import_per_statement":true,"single_line_comment_spacing":true,"single_line_comment_style":{"comment_types":["hash"]},"single_line_throw":true,"single_quote":true,"single_space_around_construct":true,"space_after_semicolon":{"remove_in_empty_for_expressions":true},"standardize_increment":true,"standardize_not_equals":true,"switch_continue_to_break":true,"trailing_comma_in_multiline":true,"trim_array_spaces":true,"type_declaration_spaces":true,"types_spaces":true,"unary_operator_spaces":true,"whitespace_after_comma_in_array":true,"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"compact_nullable_type_declaration":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_parentheses":true,"no_blank_lines_after_class_opening":true,"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"return_type_declaration":true,"short_scalar_cast":true,"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"visibility_required":true,"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_line_after_imports":true,"spaces_inside_parentheses":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true},"hashes":{"server\/tests\/Feature.php":"9c85d3fc3571920ba5e59e6d460c5220","server\/src\/Auth\/Schemas\/FleetOps.php":"bb5dadf8cb0fffa0505ce017c318014c","server\/src\/Casts\/MultiPolygon.php":"961fff6a78ccd4cd4d8cf7d2ee59adb9","server\/src\/Casts\/Point.php":"e188bce3838c4f5d6bead242caf3d34b","server\/src\/Casts\/Polygon.php":"d1ec89a15e397274abaf8846c773e7ef","server\/src\/Console\/Commands\/DispatchAdhocOrders.php":"a5f92cc8e6b04e494e720a612b155801","server\/src\/Console\/Commands\/DispatchOrders.php":"6ad26baa662e0cd5457931834c3e7b07","server\/src\/Console\/Commands\/TrackOrderDistanceAndTime.php":"0e065ce250d75dce3559f7a037137910","server\/src\/Events\/DriverLocationChanged.php":"23b5ef056b4bbff75a40f62943a1f9cf","server\/src\/Events\/DriverSimulatedLocationChanged.php":"10e85931cc52635281320e95deeecb7c","server\/src\/Events\/EntityDriverAssigned.php":"efb4a97ea7b92025276223a384d23923","server\/src\/Events\/OrderCanceled.php":"0324d68597737f491548e83e6d3a6af8","server\/src\/Events\/OrderCompleted.php":"6077e0f076f54c11d03d64b40a047407","server\/src\/Events\/OrderDispatchFailed.php":"3042f6bb6f1fb4dccd6ec26d49794961","server\/src\/Events\/OrderDispatched.php":"881423b317722291a9de1c84172247bf","server\/src\/Events\/OrderDriverAssigned.php":"cc17ad971da0365d4196d35cf58d5f48","server\/src\/Events\/OrderReady.php":"4788715888cfd34384f67fc11d3c41ff","server\/src\/Events\/OrderStarted.php":"ccaa89925d7919c8b4fde7b5f1a34fd0","server\/src\/Exceptions\/IntegratedVendorException.php":"eb0bf42cd549f51bccb4e29efac79d08","server\/src\/Expansions\/UserExpansion.php":"4ff53579e24ec9485556a1d3d279ed36","server\/src\/Exports\/ContactExport.php":"9a3204f675eb6e55261b9da2dc2b3e05","server\/src\/Exports\/DriverExport.php":"c2f2e88a5f1b9e9df1e19754bda0a619","server\/src\/Exports\/FleetExport.php":"969a75492e3ece283fb3815591f1e54c","server\/src\/Exports\/PlaceExport.php":"b242fbc8c98cd6c4c6444aa76edb7990","server\/src\/Exports\/ServiceAreaExport.php":"eb39062da3459d3c7d4a6ceb8ce1fcea","server\/src\/Exports\/VehicleExport.php":"dd767667c3e486f1ef36e92fe5e7c1d5","server\/src\/Exports\/VendorExport.php":"f05347e1db7b3a7641f0888ab81ef06f","server\/src\/Http\/Controllers\/Api\/v1\/ContactController.php":"49e9de435ca71989805cab366c6986c3","server\/src\/Http\/Controllers\/Api\/v1\/DriverController.php":"0a5286a603ea49d6ad4eeb551ee47370","server\/src\/Http\/Controllers\/Api\/v1\/EntityController.php":"095dfb6a17a98441313a7d86c8b4a2dc","server\/src\/Http\/Controllers\/Api\/v1\/FleetController.php":"b6f5caae1923bdd5151fa1f409549c3d","server\/src\/Http\/Controllers\/Api\/v1\/LabelController.php":"e3590c8859b2bad6d46de166385b1905","server\/src\/Http\/Controllers\/Api\/v1\/OrderController.php":"0ee5f29d369bf8903e9767702b824ce8","server\/src\/Http\/Controllers\/Api\/v1\/PayloadController.php":"85b05d8ead1f893edfc435c447f6d7b1","server\/src\/Http\/Controllers\/Api\/v1\/PlaceController.php":"254eb834662a57ca116459d14b019074","server\/src\/Http\/Controllers\/Api\/v1\/PurchaseRateController.php":"8d157f5fe559c903e6923a25e24975c6","server\/src\/Http\/Controllers\/Api\/v1\/ServiceAreaController.php":"6cfc3a9bb942a6ff75f05066ce89c63b","server\/src\/Http\/Controllers\/Api\/v1\/ServiceQuoteController.php":"5454844d96efb1b1870a8affff074ad9","server\/src\/Http\/Controllers\/Api\/v1\/ServiceRateController.php":"16e21952f2ab75b6dceea38a15c63708","server\/src\/Http\/Controllers\/Api\/v1\/TrackingNumberController.php":"28e47cca8cefd54ab9ae07964ca24ba0","server\/src\/Http\/Controllers\/Api\/v1\/TrackingStatusController.php":"927aeebd5eb9a7915e35092851a216b7","server\/src\/Http\/Controllers\/Api\/v1\/VehicleController.php":"8429fec35026aa728d73f514e95eaf1e","server\/src\/Http\/Controllers\/Api\/v1\/VendorController.php":"3bc94a56869f6d8f15eca682faac9f1c","server\/src\/Http\/Controllers\/Api\/v1\/ZoneController.php":"19915a76ff0fc16b99e29f44daee4686","server\/src\/Http\/Controllers\/FleetOpsController.php":"df0a0c0671f8aa9f8454a40d5035c2f0","server\/src\/Http\/Controllers\/Internal\/v1\/ContactController.php":"255b8177a512ae6a028ef8c4e5e8d21c","server\/src\/Http\/Controllers\/Internal\/v1\/DriverController.php":"c116347ff38f0ca0749d007a530a5af2","server\/src\/Http\/Controllers\/Internal\/v1\/EntityController.php":"ca345cd27cb2785c6395fc468797d81e","server\/src\/Http\/Controllers\/Internal\/v1\/FleetController.php":"990855aeb01e0051e9e9e651494351c6","server\/src\/Http\/Controllers\/Internal\/v1\/FleetOpsLookupController.php":"d1f60741df87e6e0b20ab2e03c962263","server\/src\/Http\/Controllers\/Internal\/v1\/FuelReportController.php":"26d370fae8057c1a7f7877794dfbeffb","server\/src\/Http\/Controllers\/Internal\/v1\/GeocoderController.php":"e115e0934da014aad6af3a9f83e3e952","server\/src\/Http\/Controllers\/Internal\/v1\/IntegratedVendorController.php":"45475498050adf1b345f34e9951bb2c2","server\/src\/Http\/Controllers\/Internal\/v1\/IssueController.php":"0273e14b841bdb35e3ede1d51f35346b","server\/src\/Http\/Controllers\/Internal\/v1\/LiveController.php":"d13bfa94ace9d8f53472d112be01389a","server\/src\/Http\/Controllers\/Internal\/v1\/MetricsController.php":"28d9587562250205a3881fe03a030810","server\/src\/Http\/Controllers\/Internal\/v1\/MorphController.php":"2f51b33bbb80ca735e34b506396ffe6f","server\/src\/Http\/Controllers\/Internal\/v1\/OrderConfigController.php":"1b893553e91cf80df411a5ee83b0b8f3","server\/src\/Http\/Controllers\/Internal\/v1\/OrderController.php":"b8b4036d530a0333e7710f35997f7baa","server\/src\/Http\/Controllers\/Internal\/v1\/PayloadController.php":"508bb666e4e1b8c7f61bfb0f74a15b5e","server\/src\/Http\/Controllers\/Internal\/v1\/PlaceController.php":"ac824ab939a996ae85f21d19c91c30c5","server\/src\/Http\/Controllers\/Internal\/v1\/ProofController.php":"720967e252e571a40278b48e86c65f33","server\/src\/Http\/Controllers\/Internal\/v1\/PurchaseRateController.php":"1bf1a997bffef6add6b078a3ff85c4c4","server\/src\/Http\/Controllers\/Internal\/v1\/RouteController.php":"63f06a92416bf20147fe87ef622f1980","server\/src\/Http\/Controllers\/Internal\/v1\/ServiceAreaController.php":"897caa9512634b496e72ef39cef664e1","server\/src\/Http\/Controllers\/Internal\/v1\/ServiceQuoteController.php":"a1b5358f2b2901239a437760005cc15d","server\/src\/Http\/Controllers\/Internal\/v1\/ServiceRateController.php":"1ecc9080dae83f7b596eb65f10a0ce77","server\/src\/Http\/Controllers\/Internal\/v1\/SettingController.php":"5ac7539521e2b3627a47baeda172b6c7","server\/src\/Http\/Controllers\/Internal\/v1\/TrackingNumberController.php":"8ce51737577da90f7383453785ac89dd","server\/src\/Http\/Controllers\/Internal\/v1\/TrackingStatusController.php":"e0a62db1ecac9bfc05f47f5cee0c55a3","server\/src\/Http\/Controllers\/Internal\/v1\/VehicleController.php":"cfdff585069b182ae00c7af28b582a1e","server\/src\/Http\/Controllers\/Internal\/v1\/VehicleDeviceController.php":"f346ff56d4ef0c398033a430207d9861","server\/src\/Http\/Controllers\/Internal\/v1\/VendorController.php":"c11e5a900487792c62705f74a030d0a5","server\/src\/Http\/Controllers\/Internal\/v1\/ZoneController.php":"a42475b59af5945dcc640a7c9cd3f2cc","server\/src\/Http\/Filter\/ContactFilter.php":"03259ce736f8bc37dfdad52f5576a89b","server\/src\/Http\/Filter\/DriverFilter.php":"13c7a6f9b671c5742e005d71d70e2ba6","server\/src\/Http\/Filter\/FleetFilter.php":"2edf85a370e23dfb0a46df842f22e567","server\/src\/Http\/Filter\/IntegratedVendorFilter.php":"53fd86aed2f07f27262f6f8a57f7e754","server\/src\/Http\/Filter\/OrderFilter.php":"75d23a90a20108e41f993a274e63fc94","server\/src\/Http\/Filter\/PlaceFilter.php":"c9a7ea7705a792ecfaca6cf331f63756","server\/src\/Http\/Filter\/ServiceAreaFilter.php":"e7cd14bd28b603c7660cb88f2196d524","server\/src\/Http\/Filter\/ServiceQuoteFilter.php":"8ad99521f3816f0730b7dc3cd1d859dc","server\/src\/Http\/Filter\/ServiceRateFilter.php":"b7c758916e5e640fbcd02a8ffaa7888e","server\/src\/Http\/Filter\/TrackingStatusFilter.php":"f89a88208e3d9c510e32f0194633703f","server\/src\/Http\/Filter\/VehicleFilter.php":"291f7edd3161de0267166ad364ef8a18","server\/src\/Http\/Filter\/VendorFilter.php":"85af82bb29726deb1fa76ceae8fc7583","server\/src\/Http\/Filter\/ZoneFilter.php":"e262158b0c8f73efc906e540965afa61","server\/src\/Http\/Requests\/CancelOrderRequest.php":"30fd2ca51a34be85313698af296d2bff","server\/src\/Http\/Requests\/CreateContactRequest.php":"6994395781320beed5287d596249a241","server\/src\/Http\/Requests\/CreateDriverRequest.php":"669c371cf010f8032e81c7ea2d5e2858","server\/src\/Http\/Requests\/CreateEntityRequest.php":"129b28f69e44eb10ca5bbc01bb1a803c","server\/src\/Http\/Requests\/CreateFleetRequest.php":"a0d8729f29bb2673bb19da654e9322b6","server\/src\/Http\/Requests\/CreateOrderRequest.php":"9a301c4dc8a50b9824c49ef8dd343734","server\/src\/Http\/Requests\/CreatePayloadRequest.php":"693500caa9a5fbf0fc52073831afa56a","server\/src\/Http\/Requests\/CreatePlaceRequest.php":"67d586e5d16e2ca2bf178574a41bfb58","server\/src\/Http\/Requests\/CreatePurchaseRateRequest.php":"c135faffb7958d58312473b85b3ffb6b","server\/src\/Http\/Requests\/CreateServiceAreaRequest.php":"78f44e0cb56368ba6cf1dd2484984d82","server\/src\/Http\/Requests\/CreateServiceQuoteRequest.php":"834896b31fce6e9bccd7bd6d49eeafe7","server\/src\/Http\/Requests\/CreateServiceRateRequest.php":"ae1283ec5f93ab4e40e6595f4f094f00","server\/src\/Http\/Requests\/CreateTrackingNumberRequest.php":"1029618dda606495a69194f24dbae736","server\/src\/Http\/Requests\/CreateTrackingStatusRequest.php":"5ffad2d4a7c286f25a9c2cd1141bceda","server\/src\/Http\/Requests\/CreateVehicleRequest.php":"33ef6aef0fc901be56be89ce8b720ddc","server\/src\/Http\/Requests\/CreateVendorRequest.php":"b043235163c43c4220bbd1daca3d15d8","server\/src\/Http\/Requests\/CreateZoneRequest.php":"4025494c15a341245aa623869a9cf647","server\/src\/Http\/Requests\/DecodeTrackingNumberQR.php":"c035c092faeafd81ef34354e55ed706c","server\/src\/Http\/Requests\/DriverSimulationRequest.php":"dd7b6027397bebac7590e27c33316847","server\/src\/Http\/Requests\/Internal\/AssignOrderRequest.php":"9d8d58ef7ce89fae3ca7bab536b83410","server\/src\/Http\/Requests\/Internal\/CreateDriverRequest.php":"9502b591cdafb457b5ec88f98e8f966c","server\/src\/Http\/Requests\/Internal\/FleetActionRequest.php":"843b7286299e6708b96de67852776e03","server\/src\/Http\/Requests\/Internal\/UpdateDriverRequest.php":"98dc67a0e6d2f0a959eccb748e8dc073","server\/src\/Http\/Requests\/QueryServiceQuotesRequest.php":"dd1a3b19e50b7061ac770b70055a1a51","server\/src\/Http\/Requests\/UpdateContactRequest.php":"abcfd3804aa88911aa2c879957472636","server\/src\/Http\/Requests\/UpdateDriverRequest.php":"e9153e1b2fd91343ff6250ee86a0fa12","server\/src\/Http\/Requests\/UpdateEntityRequest.php":"9184246e2cb7af61961d8981d8dd42d9","server\/src\/Http\/Requests\/UpdateFleetRequest.php":"6b54402080f8a673e30e2badb02d6c9f","server\/src\/Http\/Requests\/UpdateOrderRequest.php":"1214b8a268a0b46e408aa9a2c6755e7a","server\/src\/Http\/Requests\/UpdatePayloadRequest.php":"22638b0617e45be64cfb3f983a9162d4","server\/src\/Http\/Requests\/UpdatePlaceRequest.php":"40ca77913d5fb5224171c5ecf044b384","server\/src\/Http\/Requests\/UpdatePurchaseRateRequest.php":"c19fe57a052b37bbffd4a72578127fd7","server\/src\/Http\/Requests\/UpdateServiceAreaRequest.php":"c3980842d556327c4b2c4b70e477129d","server\/src\/Http\/Requests\/UpdateServiceQuoteRequest.php":"4bbf675e908b71396b9918e49cc144d4","server\/src\/Http\/Requests\/UpdateServiceRateRequest.php":"64f085a9252bfe88295ef351c817e108","server\/src\/Http\/Requests\/UpdateTrackingNumberRequest.php":"27a44d43609b0bff7eed4d6dc5c3a133","server\/src\/Http\/Requests\/UpdateTrackingStatusRequest.php":"2ab7575762fa0b8e632d2821e667e08a","server\/src\/Http\/Requests\/UpdateVehicleRequest.php":"ba204da78914ce570e91d541280199f4","server\/src\/Http\/Requests\/UpdateVendorRequest.php":"d184c8508e8da4a8a9399967588d329c","server\/src\/Http\/Requests\/UpdateZoneRequest.php":"a5fbd55d859a8b770aa523bb263495bf","server\/src\/Http\/Resources\/Internal\/v1\/IntegratedVendorFacilitator.php":"db8931ceb9b38ffdb0b81af69ac5dd88","server\/src\/Http\/Resources\/Internal\/v1\/Vehicle.php":"a2d6df634ffada14f6e5507f4e31b471","server\/src\/Http\/Resources\/Internal\/v1\/Waypoint.php":"0bef4e52ce6ab351bbf1c15e0b9e8cf1","server\/src\/Http\/Resources\/v1\/Contact.php":"a3ec1a6ea8b4546f3318fbfc623988cc","server\/src\/Http\/Resources\/v1\/CurrentJob.php":"04123eabe5d931769d85ab0b166c06c1","server\/src\/Http\/Resources\/v1\/DeletedResource.php":"fa54de53967ff96f9c51173db69db43e","server\/src\/Http\/Resources\/v1\/Driver.php":"14bb9f421023aba98ddc85f080397360","server\/src\/Http\/Resources\/v1\/Entity.php":"2a1a04d14120e2fc37f99c58a06cbff5","server\/src\/Http\/Resources\/v1\/Fleet.php":"344f5ef007db8b602321de2674728f9d","server\/src\/Http\/Resources\/v1\/FuelReport.php":"1e3bc70a08646ebd18236d988d328866","server\/src\/Http\/Resources\/v1\/Order.php":"0a5cd65ef879fc840e1a43ca0cf3a087","server\/src\/Http\/Resources\/v1\/Payload.php":"7b2f570cbbbbaeab35b66b522aeb940b","server\/src\/Http\/Resources\/v1\/Place.php":"cc65582c774fd068084d7debb56f1d9c","server\/src\/Http\/Resources\/v1\/Proof.php":"791ff315d266c1f81c4765affc71d919","server\/src\/Http\/Resources\/v1\/PurchaseRate.php":"9fbda3e3ade28969d066427fbf9e9ce7","server\/src\/Http\/Resources\/v1\/ServiceArea.php":"fda686e47da8add1343ddd1dbe0c558d","server\/src\/Http\/Resources\/v1\/ServiceQuote.php":"ba058cc1099bdac763a882e4880a2288","server\/src\/Http\/Resources\/v1\/ServiceRate.php":"040144b27c38eda60d6dc4bb19d2d587","server\/src\/Http\/Resources\/v1\/ServiceRateFee.php":"35ab9d7d1423cd03918a06b6771c764c","server\/src\/Http\/Resources\/v1\/ServiceRateParcelFee.php":"175c5d23ef9e788aff083d373d0eeda6","server\/src\/Http\/Resources\/v1\/TrackingNumber.php":"1e19bf22f7865befee7d742cc5f0cf98","server\/src\/Http\/Resources\/v1\/TrackingStatus.php":"c2e24be67d3108d0090fb69064053c23","server\/src\/Http\/Resources\/v1\/Vehicle.php":"ec0f8650bb469bcc4bfa688334a433dd","server\/src\/Http\/Resources\/v1\/VehicleDevice.php":"995fbb448133d645d1527e8051367090","server\/src\/Http\/Resources\/v1\/VehicleWithoutDriver.php":"4836acc533c14911b3c40d635f01d0aa","server\/src\/Http\/Resources\/v1\/Vendor.php":"4b6b04001b915c9d2b4bf2f3b7f27683","server\/src\/Http\/Resources\/v1\/Zone.php":"ee400437a7b1a217609029827787ca3c","server\/src\/Imports\/OrdersImport.php":"d452258ecbf26e9cc9d15b293385986e","server\/src\/Integrations\/Lalamove\/Lalamove.php":"c4f7948abdc94a5734916ba35f91493e","server\/src\/Integrations\/Lalamove\/LalamoveDeliveryStop.php":"fc21ef0ade2eced6f9b3de7ba938a0e0","server\/src\/Integrations\/Lalamove\/LalamoveMarket.php":"5c28861544f3831aaccbb62076fe0dac","server\/src\/Integrations\/Lalamove\/LalamoveServiceType.php":"4ff37c7eaa1a35b4f93aa4fc6a056d90","server\/src\/Jobs\/SimulateDrivingRoute.php":"f5f993787bd010fee074190b030495aa","server\/src\/Jobs\/SimulateWaypointReached.php":"5b0eeabba0a05d0260b9003e08e2ec94","server\/src\/Listeners\/HandleOrderCanceled.php":"9f6f493e9f95a3323adcaf17db93366b","server\/src\/Listeners\/HandleOrderCreated.php":"b61fd8c33341e88473ce6c88efdc9609","server\/src\/Listeners\/HandleOrderDispatchFailed.php":"c5dbe8de974983516aedd0b6b652e126","server\/src\/Listeners\/HandleOrderDispatched.php":"7acc9183c7551710bb9dae9aa2936bab","server\/src\/Listeners\/HandleOrderDriverAssigned.php":"f5fe2f9572e8226bc8b7173db30374b9","server\/src\/Listeners\/HandleOrderReady.php":"c5f3c97a0d58b375c0a3d8d30dad2706","server\/src\/Listeners\/HandleUserRemovedFromCompany.php":"fd6cf16654c31530e81713ababd9cf2e","server\/src\/Models\/Contact.php":"ab09e2cf4c43057ec4c0f37c41a02981","server\/src\/Models\/Driver.php":"4353207e51d90e8154fa70b8199df513","server\/src\/Models\/Entity.php":"12f472f06a2a5dc58f2eda2a86803ff0","server\/src\/Models\/Fleet.php":"7d4d2e3317a959d94fc5eb1b283d83f6","server\/src\/Models\/FleetDriver.php":"46cc4e90b90c0f1e9828f66c2a0be487","server\/src\/Models\/FleetVehicle.php":"08ddc3698e7423570a4e4b7f21116046","server\/src\/Models\/FuelReport.php":"4db6bee1fdeaa19b8e7b5143d255f7ec","server\/src\/Models\/IntegratedVendor.php":"875ca14f395892245346985cbe93ba43","server\/src\/Models\/Issue.php":"e3c61eb4cd36e5adfc8827c5a1db90fd","server\/src\/Models\/Order.php":"66912dd3ba848c5c0c6b87c7b52b9952","server\/src\/Models\/Payload.php":"dbcdcddcc3241e152484254b7796d6f7","server\/src\/Models\/Place.php":"fd68fd5f8af4cd8b2d47e92d1bbb0d8b","server\/src\/Models\/Position.php":"7b58977f6922c6e7469515760756e829","server\/src\/Models\/Proof.php":"49ed6e125536d54e97c29523b58547d6","server\/src\/Models\/PurchaseRate.php":"53ca67fd48c5dfc5e51a267759e1df37","server\/src\/Models\/Route.php":"a90f920bf2e7b606ed9df07e00ef7f10","server\/src\/Models\/ServiceArea.php":"174d064379f534df3fee36da549e0636","server\/src\/Models\/ServiceQuote.php":"924bc76e55a1bb9e890710c5c94f9d99","server\/src\/Models\/ServiceQuoteItem.php":"3f27bb5b80249181874591411c946f42","server\/src\/Models\/ServiceRate.php":"a465d7b6bed4099678322747935f1ee6","server\/src\/Models\/ServiceRateFee.php":"925ed246c6a325aff83d8919c374985d","server\/src\/Models\/ServiceRateParcelFee.php":"48681a6341e5e1b25d04b773daf5bd52","server\/src\/Models\/TrackingNumber.php":"eb4d7d9f728c449d05c53f9b3c0f288c","server\/src\/Models\/TrackingStatus.php":"ccd5713b20bb0e26f080d79de4557743","server\/src\/Models\/Vehicle.php":"5135bd79f85b0688d0f6edcd87c96a80","server\/src\/Models\/VehicleDevice.php":"2794158563a8f1a8af010b2286d2f73e","server\/src\/Models\/Vendor.php":"321ecb0c145dfb514247a4f96c37741c","server\/src\/Models\/Waypoint.php":"00f317df1eb1101254b831e8c82b9aeb","server\/src\/Models\/Zone.php":"ed09ca0f4865496a32d8240a0e28c1c4","server\/src\/Notifications\/OrderAssigned.php":"a72864bf608bc82bf7ba5b2c3bb9028e","server\/src\/Notifications\/OrderCanceled.php":"da52e1f72cbec406d6afcf87194df079","server\/src\/Notifications\/OrderDispatchFailed.php":"f5576853d850481697d7e751a975b5e5","server\/src\/Notifications\/OrderDispatched.php":"7e2ff9676a455c9df978c2c20a841209","server\/src\/Notifications\/OrderPing.php":"c084d005538ff3efa9a605522ad49778","server\/src\/Notifications\/OrderSplit.php":"977e36036ffa5a07f205301e76f2f7e9","server\/src\/Observers\/DriverObserver.php":"e9552b316e6edf26dee1943ac9ec2b0e","server\/src\/Observers\/OrderObserver.php":"3d7515e9b13cb194276ce90768d2c81d","server\/src\/Observers\/PayloadObserver.php":"90f8982f0e7a308755339bb299d6b918","server\/src\/Observers\/PlaceObserver.php":"af70b1462a9ebec53a247ba53609027e","server\/src\/Observers\/PurchaseRateObserver.php":"ae72dc17fd923a1ce0a66f2b272a1cea","server\/src\/Observers\/ServiceAreaObserver.php":"e3b8d7bfa9e60f792f0ef69ef7314f3c","server\/src\/Observers\/ServiceRateObserver.php":"2ddb88d66478da65abff59a9c99f2d59","server\/src\/Observers\/TrackingNumberObserver.php":"da8d0ced2474adc404e960e67c255c4f","server\/src\/Observers\/UserObserver.php":"361569be035dce4e6150256221d37c2b","server\/src\/Observers\/VehicleObserver.php":"40d60fac7d4389ac97f91eb8e73193cd","server\/src\/Providers\/EventServiceProvider.php":"4f1de31729dfb4ee92767ecf7f3a7453","server\/src\/Providers\/FleetOpsServiceProvider.php":"40c991a01691363666f72624f0104c67","server\/src\/Rules\/ResolvablePoint.php":"8cb3dbd26af7bad30d34efde34850591","server\/src\/Scopes\/DriverScope.php":"a0eef7e2e1e2a800ca57fd46508a592c","server\/src\/Support\/Algo.php":"388c4355a5a8683ff153393304622fc6","server\/src\/Support\/DistanceMatrix.php":"99f60475548651651fb3534c512f4396","server\/src\/Support\/Encoding\/Polyline.php":"611bb9642ec239bc7b90e56dd64257f7","server\/src\/Support\/Flow.php":"027df53b10377346fcdd0c95753052ba","server\/src\/Support\/Geocoding.php":"7be23ff5b5aed94b812bc509a38b8c13","server\/src\/Support\/IntegratedVendors.php":"a4a2866f3d25215170f30312dbf898e3","server\/src\/Support\/Metrics.php":"2b6fa44fe95b5bd7a6e5be1f999381a7","server\/src\/Support\/OSRM.php":"076625020670219b2effbe80a6eca8a7","server\/src\/Support\/ParsePhone.php":"1175df80d8cc93eaf4549af7f022c921","server\/src\/Support\/Utils.php":"5c22ced8541bef521113cf2528133aa0","server\/src\/Traits\/HasTrackingNumber.php":"5cc14345844cee74c0a9089ebc80f442","server\/src\/routes.php":"126804b870d25a5f346f79222ed3170c",".php-cs-fixer.php":"97d0e7d944ae71fb5a3344df8ae2cd44"}}
@@ -0,0 +1,29 @@
1
+ <?php
2
+
3
+ $finder = PhpCsFixer\Finder::create()
4
+ ->in(__DIR__ . DIRECTORY_SEPARATOR . 'server' . DIRECTORY_SEPARATOR . 'tests')
5
+ ->in(__DIR__ . DIRECTORY_SEPARATOR . 'server' . DIRECTORY_SEPARATOR . 'src')
6
+ ->append(['.php-cs-fixer.php']);
7
+
8
+ $rules = [
9
+ '@Symfony' => true,
10
+ 'phpdoc_no_empty_return' => false,
11
+ 'array_syntax' => ['syntax' => 'short'],
12
+ 'yoda_style' => false,
13
+ 'binary_operator_spaces' => [
14
+ 'operators' => [
15
+ '=>' => 'align',
16
+ '=' => 'align',
17
+ ],
18
+ ],
19
+ 'concat_space' => ['spacing' => 'one'],
20
+ 'not_operator_with_space' => false,
21
+ 'increment_style' => ['style' => 'post'],
22
+ 'indentation_type' => true,
23
+ 'single_quote' => true,
24
+ ];
25
+
26
+ return (new PhpCsFixer\Config())
27
+ ->setUsingCache(true)
28
+ ->setRules($rules)
29
+ ->setFinder($finder);
package/LICENSE.md CHANGED
@@ -1,9 +1,21 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2022
3
+ Copyright (c) 2023 Fleetbase
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
6
11
 
7
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
8
14
 
9
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,32 +1,122 @@
1
- # @fleetbase/fleetops-engine
1
+ <p align="center">
2
+ <img src="https://flb-assets.s3.ap-southeast-1.amazonaws.com/static/fleetbase-logo-svg.svg" width="380" height="100" />
3
+ </p>
4
+ <p align="center">
5
+ Open-source Fleet & Transport Management Extension for Fleetbase
6
+ </p>
2
7
 
3
- FleetOps extension for Fleetbase.
8
+ ---
4
9
 
10
+ ## Overview
5
11
 
6
- ## Compatibility
12
+ This monorepo contains both the frontend and backend components of the FleetOps extension for Fleetbase. The frontend is built using Ember.js and the backend is implemented in PHP.
7
13
 
8
- * Ember.js v3.24 or above
9
- * Ember CLI v3.24 or above
10
- * Node.js v14 or above
14
+ ### Requirements
11
15
 
16
+ - PHP 7.3.0 or above
17
+ - Ember.js v3.24 or above
18
+ - Ember CLI v3.24 or above
19
+ - Node.js v14 or above
12
20
 
13
- ## Installation
21
+ ## Structure
14
22
 
15
23
  ```
16
- ember install @fleetbase/fleetops-engine
24
+ ├── addon
25
+ ├── app
26
+ ├── assets
27
+ ├── translations
28
+ ├── config
29
+ ├── node_modules
30
+ ├── server
31
+ │ ├── config
32
+ │ ├── data
33
+ │ ├── migrations
34
+ │ ├── resources
35
+ │ ├── src
36
+ │ ├── tests
37
+ │ └── vendor
38
+ ├── tests
39
+ ├── testem.js
40
+ ├── index.js
41
+ ├── package.json
42
+ ├── phpstan.neon.dist
43
+ ├── phpunit.xml.dist
44
+ ├── pnpm-lock.yaml
45
+ ├── ember-cli-build.js
46
+ ├── composer.json
47
+ ├── CONTRIBUTING.md
48
+ ├── LICENSE.md
49
+ ├── README.md
50
+ ```
51
+
52
+ ## Installation
53
+
54
+ ### Backend
55
+
56
+ Install the PHP packages using Composer:
57
+
58
+ ```bash
59
+ composer require fleetbase/core-api
60
+ composer require fleetbase/fleetops
17
61
  ```
62
+ ### Frontend
18
63
 
64
+ Install the Ember.js Engine/Addon:
65
+
66
+ ```bash
67
+ pnpm install @fleetbase/fleetops
68
+ ```
19
69
 
20
70
  ## Usage
21
71
 
22
- [Longer description of how to use the addon in apps.]
72
+ ### Backend
73
+
74
+ 🧹 Keep a modern codebase with **PHP CS Fixer**:
75
+ ```bash
76
+ composer lint
77
+ ```
23
78
 
79
+ ⚗️ Run static analysis using **PHPStan**:
80
+ ```bash
81
+ composer test:types
82
+ ```
24
83
 
25
- ## Contributing
84
+ ✅ Run unit tests using **PEST**
85
+ ```bash
86
+ composer test:unit
87
+ ```
26
88
 
27
- See the [Contributing](CONTRIBUTING.md) guide for details.
89
+ 🚀 Run the entire test suite:
90
+ ```bash
91
+ composer test
92
+ ```
28
93
 
94
+ ### Frontend
29
95
 
30
- ## License
96
+ 🧹 Keep a modern codebase with **ESLint**:
97
+ ```bash
98
+ pnpm lint
99
+ ```
31
100
 
32
- This project is licensed under the [MIT License](LICENSE.md).
101
+ ✅ Run unit tests using **Ember/QUnit**
102
+ ```bash
103
+ pnpm test
104
+ pnpm test:ember
105
+ pnpm test:ember-compatibility
106
+ ```
107
+
108
+ 🚀 Start the Ember Addon/Engine
109
+ ```bash
110
+ pnpm start
111
+ ```
112
+
113
+ 🔨 Build the Ember Addon/Engine
114
+ ```bash
115
+ pnpm build
116
+ ```
117
+
118
+ ## Contributing
119
+ See the Contributing Guide for details on how to contribute to this project.
120
+
121
+ ## License
122
+ This project is licensed under the MIT License.
@@ -0,0 +1,12 @@
1
+ <ContentPanel @title="Visibility Controls" @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-800">
2
+ <p class="mb-4 dark:text-white text-gray-800">Visibility controls allow you to disable sections of Fleet-Ops. Toggle the checkbox to enable or disable sections to hide in Fleet-ops.</p>
3
+ {{#each this.visibilitySettings as |visibilityControl|}}
4
+ <InputGroup @wrapperClass="mb-1i">
5
+ <Checkbox @value={{visibilityControl.visible}} @label={{concat visibilityControl.name " Visible"}} @onToggle={{fn (mut visibilityControl.visible)}} @helpText="Enable or disable visibility for this section in Fleet-Ops." />
6
+ </InputGroup>
7
+ {{/each}}
8
+ </ContentPanel>
9
+
10
+ <div class="mt-3 flex items-center justify-end">
11
+ <Button @type="primary" @size="lg" @icon="save" @text="Save Changes" @onClick={{this.saveVisibilitySettings}} @disabled={{this.isLoading}} @isLoading={{this.isLoading}} />
12
+ </div>
@@ -0,0 +1,82 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+ import { isArray } from '@ember/array';
6
+
7
+ export default class AdminVisibilityControlsComponent extends Component {
8
+ @service fetch;
9
+ @tracked visibilitySettings = [
10
+ { name: 'Dashboard', route: 'operations.orders', visible: true },
11
+ { name: 'Service Rates', route: 'operations.service-rates', visible: true },
12
+ { name: 'Drivers', route: 'management.drivers', visible: true },
13
+ { name: 'Vehicles', route: 'management.vehicles', visible: true },
14
+ { name: 'Fleets', route: 'management.fleets', visible: true },
15
+ { name: 'Vendors', route: 'management.vendors', visible: true },
16
+ { name: 'Contacts', route: 'management.contacts', visible: true },
17
+ { name: 'Places', route: 'management.places', visible: true },
18
+ { name: 'Fuel Reports', route: 'management.fuel-reports', visible: true },
19
+ { name: 'Issues', route: 'management.issues', visible: true },
20
+ ];
21
+ @tracked isLoading = false;
22
+
23
+ constructor() {
24
+ super(...arguments);
25
+ this.loadVisibilitySettings();
26
+ }
27
+
28
+ @action mutateVisibility(route, visible) {
29
+ this.visibilitySettings = [...this.visibilitySettings].map((visibilityControl) => {
30
+ if (visibilityControl.route === route) {
31
+ return {
32
+ ...visibilityControl,
33
+ visible,
34
+ };
35
+ }
36
+
37
+ return visibilityControl;
38
+ });
39
+ }
40
+
41
+ @action loadVisibilitySettings() {
42
+ this.isLoading = true;
43
+
44
+ this.fetch
45
+ .get('fleet-ops/settings/visibility')
46
+ .then(({ visibilitySettings }) => {
47
+ if (isArray(visibilitySettings)) {
48
+ for (let i = 0; i < visibilitySettings.length; i++) {
49
+ const visibilityControl = visibilitySettings.objectAt(i);
50
+ this.mutateVisibility(visibilityControl.route, visibilityControl.visible);
51
+ }
52
+ }
53
+ })
54
+ .catch((error) => {
55
+ this.notifications.serverError(error);
56
+ })
57
+ .finally(() => {
58
+ this.isLoading = false;
59
+ });
60
+ }
61
+
62
+ @action saveVisibilitySettings() {
63
+ this.isLoading = true;
64
+
65
+ this.fetch
66
+ .post('fleet-ops/settings/visibility', { visibilitySettings: this.visibilitySettings })
67
+ .then(({ visibilitySettings }) => {
68
+ if (isArray(visibilitySettings)) {
69
+ for (let i = 0; i < visibilitySettings.length; i++) {
70
+ const visibilityControl = visibilitySettings.objectAt(i);
71
+ this.mutateVisibility(visibilityControl.route, visibilityControl.visible);
72
+ }
73
+ }
74
+ })
75
+ .catch((error) => {
76
+ this.notifications.serverError(error);
77
+ })
78
+ .finally(() => {
79
+ this.isLoading = false;
80
+ });
81
+ }
82
+ }
@@ -6,6 +6,7 @@ import { inject as service } from '@ember/service';
6
6
  export default class FleetPanelComponent extends Component {
7
7
  @service fetch;
8
8
  @service modalsManager;
9
+ @service universe;
9
10
  @service store;
10
11
  @service fetch;
11
12
  @tracked currentTab;
@@ -26,18 +27,26 @@ export default class FleetPanelComponent extends Component {
26
27
  }
27
28
 
28
29
  @action addDriver(driver) {
29
- this.fetch.post('fleets/assign-driver', { driver: driver.id, fleet: this.fleet.id });
30
+ this.fetch.post('fleets/assign-driver', { driver: driver.id, fleet: this.fleet.id }).then(() => {
31
+ this.universe.trigger('fleet.driver.assigned', this.fleet, driver);
32
+ });
30
33
  }
31
34
 
32
35
  @action removeDriver(driver) {
33
- this.fetch.post('fleets/remove-driver', { driver: driver.id, fleet: this.fleet.id });
36
+ this.fetch.post('fleets/remove-driver', { driver: driver.id, fleet: this.fleet.id }).then(() => {
37
+ this.universe.trigger('fleet.driver.unassigned', this.fleet, driver);
38
+ });
34
39
  }
35
40
 
36
41
  @action addVehicle(vehicle) {
37
- this.fetch.post('fleets/assign-vehicle', { vehicle: vehicle.id, fleet: this.fleet.id });
42
+ this.fetch.post('fleets/assign-vehicle', { vehicle: vehicle.id, fleet: this.fleet.id }).then(() => {
43
+ this.universe.trigger('fleet.vehicle.assigned', this.fleet, vehicle);
44
+ });
38
45
  }
39
46
 
40
47
  @action removeVehicle(vehicle) {
41
- this.fetch.post('fleets/remove-vehicle', { vehicle: vehicle.id, fleet: this.fleet.id });
48
+ this.fetch.post('fleets/remove-vehicle', { vehicle: vehicle.id, fleet: this.fleet.id }).then(() => {
49
+ this.universe.trigger('fleet.vehicle.unassigned', this.fleet, vehicle);
50
+ });
42
51
  }
43
52
  }
@@ -1,4 +1,4 @@
1
- {{yield}}<div class="fleet-vehicle-listing" {{did-insert this.setupComponent}} ...attributes>
1
+ <div class="fleet-vehicle-listing" {{did-insert this.setupComponent}} ...attributes>
2
2
  <div class="mb-2 flex items-center justify-between">
3
3
  <div class="flex items-center">
4
4
  <div class="fleet-vehicle-listing-search">
@@ -0,0 +1,26 @@
1
+ <div class="mb-2">
2
+ <Button @text="Create new order" @type="primary" @size="xs" @icon="paper-plane" @iconPrefix="fas" @iconSize="sm" @wrapperClass="w-full" class="w-full" @onClick={{this.onClickCreateOrder}} />
3
+ </div>
4
+ {{#each this.universeMenuItems as |menuItem|}}
5
+ {{#if menuItem.renderComponentInPlace}}
6
+ {{component menuItem.component}}
7
+ {{else}}
8
+ <Layout::Sidebar::Item @onClick={{fn this.universe.transitionMenuItem (concat this.routePrefix "virtual") menuItem}} @item={{menuItem}} @icon={{menuItem.icon}}>{{menuItem.title}}</Layout::Sidebar::Item>
9
+ {{/if}}
10
+ {{/each}}
11
+ {{#each this.menuPanels as |menuPanel|}}
12
+ <Layout::Sidebar::Panel @open={{menuPanel.open}} @title={{menuPanel.title}}>
13
+ {{#each menuPanel.items as |item|}}
14
+ <Layout::Sidebar::Item @route={{concat this.routePrefix item.route}} @icon={{item.icon}}>{{item.title}}</Layout::Sidebar::Item>
15
+ {{/each}}
16
+ </Layout::Sidebar::Panel>
17
+ {{/each}}
18
+ {{#each this.universeMenuPanels as |menuPanel|}}
19
+ <Layout::Sidebar::Panel @open={{menuPanel.open}} @title={{menuPanel.title}}>
20
+ {{#each menuPanel.items as |menuItem|}}
21
+ <Layout::Sidebar::Item @onClick={{fn this.universe.transitionMenuItem (concat this.routePrefix "virtual") menuItem}} @item={{menuItem}} @icon={{menuItem.icon}}>{{menuItem.title}}</Layout::Sidebar::Item>
22
+ {{/each}}
23
+ </Layout::Sidebar::Panel>
24
+ {{/each}}
25
+ <Layout::Sidebar::Item @onClick={{this.onClickSettings}} @icon="cogs">Settings</Layout::Sidebar::Item>
26
+ {{yield}}
@@ -0,0 +1,129 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+ import { isArray } from '@ember/array';
6
+
7
+ /**
8
+ * LayoutFleetOpsSidebarComponent
9
+ *
10
+ * This component manages the sidebar layout for Fleet Ops, including visibility and actions.
11
+ */
12
+ export default class LayoutFleetOpsSidebarComponent extends Component {
13
+ @service universe;
14
+ @tracked routePrefix = 'console.fleet-ops.';
15
+ @tracked menuPanels = [];
16
+ @tracked universeMenuItems = [];
17
+ @tracked universeMenuPanels = [];
18
+
19
+ constructor() {
20
+ super(...arguments);
21
+ this.createMenuItemsFromUniverseRegistry();
22
+ this.createMenuPanels();
23
+ }
24
+
25
+ createMenuItemsFromUniverseRegistry() {
26
+ this.universeMenuItems = this.universe.getMenuItemsFromRegistry('engine:fleet-ops');
27
+ this.universeMenuPanels = this.universe.getMenuPanelsFromRegistry('engine:fleet-ops');
28
+ }
29
+
30
+ /**
31
+ * Initialize menu panels with visibility settings.
32
+ */
33
+ createMenuPanels() {
34
+ const operationsItems = [
35
+ { title: 'Dashboard', icon: 'home', route: 'operations.orders' },
36
+ { title: 'Service Rates', icon: 'file-invoice-dollar', route: 'operations.service-rates' },
37
+ ];
38
+
39
+ const resourcesItems = [
40
+ { title: 'Drivers', icon: 'route', route: 'management.drivers' },
41
+ { title: 'Vehicles', icon: 'truck', route: 'management.vehicles' },
42
+ { title: 'Fleets', icon: 'user-group', route: 'management.fleets' },
43
+ { title: 'Vendors', icon: 'warehouse', route: 'management.vendors' },
44
+ { title: 'Contacts', icon: 'address-book', route: 'management.contacts' },
45
+ { title: 'Places', icon: 'location-dot', route: 'management.places' },
46
+ { title: 'Fuel Reports', icon: 'gas-pump', route: 'management.fuel-reports' },
47
+ { title: 'Issues', icon: 'triangle-exclamation', route: 'management.issues' },
48
+ ];
49
+
50
+ const createPanel = (title, routePrefix, items = []) => ({
51
+ title,
52
+ open: true,
53
+ visible: this.isPanelVisible(routePrefix),
54
+ items: items
55
+ .map((item) => ({
56
+ ...item,
57
+ visible: this.isItemVisible(item.route),
58
+ }))
59
+ .filter((item) => item.visible),
60
+ });
61
+
62
+ this.menuPanels = [createPanel('Operations', 'operations', operationsItems), createPanel('Resources', 'management', resourcesItems)].filter((panel) => {
63
+ const isVisible = panel.visible && panel.items.length > 0;
64
+ return isVisible;
65
+ });
66
+ }
67
+
68
+ /**
69
+ * Check if a panel should be visible based on visibility settings.
70
+ *
71
+ * @param {string} routePrefix - The route prefix to check for visibility.
72
+ * @returns {boolean} - Whether the panel should be visible.
73
+ */
74
+ isPanelVisible(routePrefix) {
75
+ return this.isVisible(routePrefix, false);
76
+ }
77
+
78
+ /**
79
+ * Check if a menu item should be visible based on visibility settings.
80
+ *
81
+ * @param {string} routePrefix - The route prefix to check for visibility.
82
+ * @returns {boolean} - Whether the menu item should be visible.
83
+ */
84
+ isItemVisible(routePrefix) {
85
+ return this.isVisible(routePrefix, true);
86
+ }
87
+
88
+ /**
89
+ * Utility function to check visibility based on route prefix.
90
+ *
91
+ * @param {string} routePrefix - The route prefix to check for visibility.
92
+ * @param {boolean} exactMatch - Whether to match the route exactly or just the prefix.
93
+ * @returns {boolean} - Whether the item should be visible.
94
+ */
95
+ isVisible(routePrefix, exactMatch) {
96
+ const { visibilitySettings } = this.args;
97
+
98
+ if (!isArray(visibilitySettings)) {
99
+ return true;
100
+ }
101
+
102
+ return visibilitySettings.some((visibilityControl) => {
103
+ const match = exactMatch ? visibilityControl.route === routePrefix : visibilityControl.route.startsWith(routePrefix);
104
+ return match && visibilityControl.visible;
105
+ });
106
+ }
107
+
108
+ /**
109
+ * Action handler for creating an order.
110
+ */
111
+ @action onClickCreateOrder() {
112
+ const { onClickCreateOrder } = this.args;
113
+
114
+ if (typeof onClickCreateOrder === 'function') {
115
+ onClickCreateOrder();
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Action handler for opening settings.
121
+ */
122
+ @action onClickSettings() {
123
+ const { onClickSettings } = this.args;
124
+
125
+ if (typeof onClickSettings === 'function') {
126
+ onClickSettings();
127
+ }
128
+ }
129
+ }
package/addon/engine.js CHANGED
@@ -3,6 +3,7 @@ import loadInitializers from 'ember-load-initializers';
3
3
  import Resolver from 'ember-resolver';
4
4
  import config from './config/environment';
5
5
  import services from '@fleetbase/ember-core/exports/services';
6
+ import AdminVisibilityControlsComponent from './components/admin/visibility-controls';
6
7
 
7
8
  const { modulePrefix } = config;
8
9
  const externalRoutes = ['console', 'extensions'];
@@ -18,6 +19,24 @@ export default class FleetOpsEngine extends Engine {
18
19
  // register menu item in header
19
20
  universe.registerHeaderMenuItem('Fleet-Ops', 'console.fleet-ops', { icon: 'route', priority: 0 });
20
21
 
22
+ // register admin settings -- create a fleet-ops menu panel with it's own setting options
23
+ universe.registerAdminMenuPanel(
24
+ 'Fleet-Ops Config',
25
+ [
26
+ {
27
+ title: 'Visibility Controls',
28
+ icon: 'eye',
29
+ component: AdminVisibilityControlsComponent,
30
+ },
31
+ ],
32
+ {
33
+ slug: 'fleet-ops',
34
+ }
35
+ );
36
+
37
+ // create primary registry for engine
38
+ universe.createRegistry('engine:fleet-ops');
39
+
21
40
  // register the vehicle panel
22
41
  universe.createRegistry('component:vehicle-panel');
23
42
 
@@ -0,0 +1,5 @@
1
+ import { helper } from '@ember/component/helper';
2
+
3
+ export default helper(function isSectionVisible(positional /*, named*/) {
4
+ return positional;
5
+ });
@@ -1,15 +1,19 @@
1
1
  import Route from '@ember/routing/route';
2
2
  import { inject as service } from '@ember/service';
3
- import { action } from '@ember/object';
4
3
 
5
4
  export default class ApplicationRoute extends Route {
6
5
  @service loader;
6
+ @service fetch;
7
7
 
8
- @action loading(transition) {
8
+ loading(transition) {
9
9
  const resourceName = this.getResouceName(transition);
10
10
  this.loader.showOnInitialTransition(transition, 'section.next-view-section', resourceName ? `Loading ${resourceName}...` : `Loading...`);
11
11
  }
12
12
 
13
+ model() {
14
+ return this.fetch.get('fleet-ops/settings/visibility');
15
+ }
16
+
13
17
  getResouceName(transition) {
14
18
  const { to } = transition;
15
19