@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,26 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Observers;
4
+
5
+ use Fleetbase\FleetOps\Models\Place;
6
+
7
+ class PlaceObserver
8
+ {
9
+ /**
10
+ * Handle the Place "creating" event.
11
+ *
12
+ * @return void
13
+ */
14
+ public function creating(Place $place)
15
+ {
16
+ // uppercase all address attributes
17
+ $toUppercase = ['name', 'street1', 'street2', 'city', 'province', 'postal_code', 'neighborhood', 'district', 'building', 'country'];
18
+
19
+ // uppercase all attributes above
20
+ foreach ($toUppercase as $attribute) {
21
+ if (isset($place->{$attribute}) && is_string($place->{$attribute})) {
22
+ $place->{$attribute} = strtoupper($place->{$attribute});
23
+ }
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,61 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Observers;
4
+
5
+ use Fleetbase\FleetOps\Models\Order;
6
+ use Fleetbase\FleetOps\Models\PurchaseRate;
7
+ use Fleetbase\FleetOps\Support\Utils;
8
+ use Fleetbase\Models\Company;
9
+ use Fleetbase\Models\Transaction;
10
+ use Fleetbase\Models\TransactionItem;
11
+
12
+ class PurchaseRateObserver
13
+ {
14
+ /**
15
+ * Handle the PurchaseRate "creating" event.
16
+ * Create transactions accordingly.
17
+ *
18
+ * @return void
19
+ */
20
+ public function creating(PurchaseRate $purchaseRate)
21
+ {
22
+ $purchaseRate->load(['serviceQuote.items', 'serviceQuote.serviceRate']);
23
+
24
+ // get company
25
+ $company = Company::where('uuid', session('company', $purchaseRate->company_uuid))->first();
26
+
27
+ // get currency to use
28
+ $currency = data_get($purchaseRate, 'serviceQuote.currency', $company->country ? Utils::getCurrenyFromCountryCode($company->country) : 'SGD');
29
+
30
+ // create transaction and transaction items
31
+ $transaction = Transaction::create([
32
+ 'company_uuid' => session('company', $purchaseRate->company_uuid),
33
+ 'customer_uuid' => $purchaseRate->customer_uuid,
34
+ 'customer_type' => $purchaseRate->customer_type,
35
+ 'gateway_transaction_id' => $purchaseRate->getMeta('transaction_id', Transaction::generateNumber()),
36
+ 'gateway' => 'internal',
37
+ 'amount' => data_get($purchaseRate, 'serviceQuote.amount', 0),
38
+ 'currency' => $currency,
39
+ 'description' => 'Dispatch order',
40
+ 'type' => 'dispatch',
41
+ 'status' => 'success',
42
+ ]);
43
+
44
+ // Update order with transaction id
45
+ Order::where('payload_uuid', $purchaseRate->payload_uuid)->update(['transaction_uuid' => $transaction->uuid]);
46
+
47
+ if (isset($purchaseRate->serviceQuote)) {
48
+ $purchaseRate->serviceQuote->items->each(function ($serviceQuoteItem) use ($transaction, $currency) {
49
+ TransactionItem::create([
50
+ 'transaction_uuid' => $transaction->uuid,
51
+ 'amount' => $serviceQuoteItem->amount ?? 0,
52
+ 'currency' => $currency,
53
+ 'details' => data_get($serviceQuoteItem, 'details', 'Internal dispatch'),
54
+ 'code' => data_get($serviceQuoteItem, 'code', 'internal'),
55
+ ]);
56
+ });
57
+ }
58
+
59
+ $purchaseRate->transaction_uuid = $transaction->uuid;
60
+ }
61
+ }
@@ -0,0 +1,35 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Observers;
4
+
5
+ use Fleetbase\FleetOps\Models\ServiceArea;
6
+ use Fleetbase\FleetOps\Support\Utils;
7
+ use Fleetbase\FleetOps\Support\Utils as FleetOpsUtils;
8
+
9
+ class ServiceAreaObserver
10
+ {
11
+ /**
12
+ * Handle the ServiceArea "creating" event.
13
+ *
14
+ * @return void
15
+ */
16
+ public function creating(ServiceArea $serviceArea)
17
+ {
18
+ // if no border is set but country is, create the border from the country
19
+ if (empty($serviceArea->border) && isset($serviceArea->country)) {
20
+ $serviceArea->border = FleetOpsUtils::createPolygonFromCountry($serviceArea->country);
21
+ }
22
+ }
23
+
24
+ /**
25
+ * Handle the ServiceArea "deleted" event.
26
+ *
27
+ * @return void
28
+ */
29
+ public function deleted(ServiceArea $serviceArea)
30
+ {
31
+ $serviceArea->load(['zones']);
32
+
33
+ Utils::deleteModels($serviceArea->zones);
34
+ }
35
+ }
@@ -0,0 +1,78 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Observers;
4
+
5
+ use Fleetbase\FleetOps\Models\ServiceRate;
6
+ use Fleetbase\FleetOps\Support\Utils;
7
+
8
+ class ServiceRateObserver
9
+ {
10
+ /**
11
+ * Handle the ServiceRate "creating" event.
12
+ *
13
+ * @return void
14
+ */
15
+ public function creating(ServiceRate $serviceRate)
16
+ {
17
+ // convert these attributes to numbers only
18
+ $toNumbers = ['base_fee', 'per_km_flat_rate_fee', 'peak_hours_flat_fee', 'peak_hours_percent', 'cod_flat_fee', 'cod_percent'];
19
+
20
+ // convert to numbers for all attributes above
21
+ foreach ($toNumbers as $attribute) {
22
+ if (isset($serviceRate->{$attribute})) {
23
+ $serviceRate->{$attribute} = Utils::numbersOnly($serviceRate->{$attribute});
24
+ }
25
+ }
26
+ }
27
+
28
+ /**
29
+ * Handle the ServiceRate "created" event.
30
+ *
31
+ * @return void
32
+ */
33
+ public function created(ServiceRate $serviceRate)
34
+ {
35
+ $serviceRateFees = request()->input('serviceRate.rate_fees');
36
+ $serviceRateParcelFees = request()->input('serviceRate.parcel_fees');
37
+
38
+ if ($serviceRate->isFixedMeter() || $serviceRate->isPerDrop()) {
39
+ $serviceRate->setServiceRateFees($serviceRateFees);
40
+ }
41
+
42
+ if ($serviceRate->isParcelService()) {
43
+ $serviceRate->setServiceRateParcelFees($serviceRateParcelFees);
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Handle the ServiceRate "updated" event.
49
+ *
50
+ * @return void
51
+ */
52
+ public function updated(ServiceRate $serviceRate)
53
+ {
54
+ $serviceRateFees = request()->input('serviceRate.rate_fees');
55
+ $serviceRateParcelFees = request()->input('serviceRate.parcel_fees');
56
+
57
+ if ($serviceRate->isFixedMeter() || $serviceRate->isPerDrop()) {
58
+ $serviceRate->setServiceRateFees($serviceRateFees);
59
+ }
60
+
61
+ if ($serviceRate->isParcelService()) {
62
+ $serviceRate->setServiceRateParcelFees($serviceRateParcelFees);
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Handle the ServiceRate "creating" event.
68
+ *
69
+ * @return void
70
+ */
71
+ public function deleted(ServiceRate $serviceRate)
72
+ {
73
+ $serviceRate->load(['parcelFees', 'rateFees']);
74
+
75
+ Utils::deleteModels($serviceRate->parcelFees);
76
+ Utils::deleteModels($serviceRate->rateFees);
77
+ }
78
+ }
@@ -0,0 +1,44 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Observers;
4
+
5
+ use Fleetbase\FleetOps\Models\TrackingNumber;
6
+ use Fleetbase\FleetOps\Models\TrackingStatus;
7
+ use Grimzy\LaravelMysqlSpatial\Types\Point;
8
+ use Illuminate\Support\Str;
9
+ use Milon\Barcode\Facades\DNS2DFacade as DNS2D;
10
+
11
+ class TrackingNumberObserver
12
+ {
13
+ /**
14
+ * Listen to the TrackingNumber creating event.
15
+ *
16
+ * @return void
17
+ */
18
+ public function creating(TrackingNumber $trackingNumber)
19
+ {
20
+ // generate a barcode annd qr code
21
+ $trackingNumber->tracking_number = TrackingNumber::generateNumber($trackingNumber->region);
22
+ $trackingNumber->qr_code = DNS2D::getBarcodePNG($trackingNumber->owner_uuid, 'QRCODE');
23
+ $trackingNumber->barcode = DNS2D::getBarcodePNG($trackingNumber->owner_uuid, 'PDF417');
24
+ }
25
+
26
+ /**
27
+ * Listen to the TrackingNumber created event.
28
+ *
29
+ * @return void
30
+ */
31
+ public function created(TrackingNumber $trackingNumber)
32
+ {
33
+ $trackingStatus = TrackingStatus::create([
34
+ 'company_uuid' => session('company'),
35
+ 'tracking_number_uuid' => $trackingNumber->uuid,
36
+ 'status' => Str::title($trackingNumber->type . ' created'),
37
+ 'details' => 'New ' . Str::lower($trackingNumber->type) . ' created.',
38
+ 'location' => new Point(0.0, 0.0, 4326),
39
+ 'code' => 'CREATED',
40
+ ]);
41
+
42
+ $trackingNumber->updateOwnerStatus($trackingStatus);
43
+ }
44
+ }
@@ -0,0 +1,20 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Observers;
4
+
5
+ use Fleetbase\FleetOps\Models\Driver;
6
+ use Fleetbase\Models\User;
7
+
8
+ class UserObserver
9
+ {
10
+ /**
11
+ * Handle the User "deleted" event.
12
+ *
13
+ * @return void
14
+ */
15
+ public function deleted(User $user)
16
+ {
17
+ // if the user deleted is a driver, delete their driver record to
18
+ Driver::where('user_uuid', $user->uuid)->delete();
19
+ }
20
+ }
@@ -0,0 +1,66 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Observers;
4
+
5
+ use Fleetbase\FleetOps\Models\Driver;
6
+ use Fleetbase\FleetOps\Models\Vehicle;
7
+
8
+ class VehicleObserver
9
+ {
10
+ /**
11
+ * Handle the Vehicle "created" event.
12
+ *
13
+ * @return void
14
+ */
15
+ public function created(Vehicle $vehicle)
16
+ {
17
+ // assign this vehicle to a driver if the driver has been set
18
+ $identifier = request()->or(['driver_uuid', 'vehicle.driver_uuid', 'vehicle.driver.uuid']);
19
+
20
+ if ($identifier) {
21
+ $driver = Driver::where('uuid', $identifier)->whereNull('deleted_at')->withoutGlobalScopes()->first();
22
+
23
+ if ($driver) {
24
+ // assign this vehicle to driver
25
+ $driver->assignVehicle($vehicle);
26
+
27
+ // set driver to vehicle
28
+ $vehicle->setRelation('driver', $driver);
29
+ }
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Handle the Vehicle "updated" event.
35
+ *
36
+ * @return void
37
+ */
38
+ public function updated(Vehicle $vehicle)
39
+ {
40
+ // assign this vehicle to a driver if the driver has been set
41
+ $identifier = request()->or(['driver_uuid', 'vehicle.driver_uuid', 'vehicle.driver.uuid']);
42
+
43
+ if ($identifier) {
44
+ $driver = Driver::where('uuid', $identifier)->whereNull('deleted_at')->withoutGlobalScopes()->first();
45
+
46
+ if ($driver) {
47
+ // assign this vehicle to driver
48
+ $driver->assignVehicle($vehicle);
49
+
50
+ // set driver to vehicle
51
+ $vehicle->setRelation('driver', $driver);
52
+ }
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Handle the Vehicle "deleted" event.
58
+ *
59
+ * @return void
60
+ */
61
+ public function deleted(Vehicle $vehicle)
62
+ {
63
+ // Unassign the deleted vehicle from matching driver/(s)
64
+ Driver::where(['vehicle_uuid' => $vehicle->uuid])->delete();
65
+ }
66
+ }
@@ -0,0 +1,30 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Providers;
4
+
5
+ use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
6
+
7
+ class EventServiceProvider extends ServiceProvider
8
+ {
9
+ /**
10
+ * The event listener mappings for the application.
11
+ *
12
+ * @var array
13
+ */
14
+ protected $listen = [
15
+ /*
16
+ * Order Events
17
+ */
18
+ \Fleetbase\FleetOps\Events\OrderCanceled::class => [\Fleetbase\FleetOps\Listeners\HandleOrderCanceled::class, \Fleetbase\Listeners\SendResourceLifecycleWebhook::class],
19
+ \Fleetbase\FleetOps\Events\OrderDispatched::class => [\Fleetbase\FleetOps\Listeners\HandleOrderDispatched::class, \Fleetbase\Listeners\SendResourceLifecycleWebhook::class],
20
+ \Fleetbase\FleetOps\Events\OrderDispatchFailed::class => [\Fleetbase\FleetOps\Listeners\HandleOrderDispatchFailed::class, \Fleetbase\Listeners\SendResourceLifecycleWebhook::class],
21
+ \Fleetbase\FleetOps\Events\OrderDriverAssigned::class => [\Fleetbase\FleetOps\Listeners\HandleOrderDriverAssigned::class, \Fleetbase\Listeners\SendResourceLifecycleWebhook::class],
22
+ \Fleetbase\FleetOps\Events\OrderCompleted::class => [\Fleetbase\Listeners\SendResourceLifecycleWebhook::class],
23
+ \Fleetbase\FleetOps\Events\OrderReady::class => [\Fleetbase\FleetOps\Listeners\HandleOrderReady::class],
24
+
25
+ /*
26
+ * Core Events
27
+ */
28
+ \Fleetbase\Events\UserRemovedFromCompany::class => [\Fleetbase\FleetOps\Listeners\HandleUserRemovedFromCompany::class],
29
+ ];
30
+ }
@@ -0,0 +1,94 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Providers;
4
+
5
+ use Brick\Geo\Engine\GeometryEngineRegistry;
6
+ use Brick\Geo\Engine\GEOSEngine;
7
+ use Fleetbase\Providers\CoreServiceProvider;
8
+
9
+ if (!class_exists(CoreServiceProvider::class)) {
10
+ throw new \Exception('FleetOps cannot be loaded without `fleetbase/core-api` installed!');
11
+ }
12
+
13
+ /**
14
+ * FleetOps service provider.
15
+ */
16
+ class FleetOpsServiceProvider extends CoreServiceProvider
17
+ {
18
+ /**
19
+ * The observers registered with the service provider.
20
+ *
21
+ * @var array
22
+ */
23
+ public $observers = [
24
+ \Fleetbase\FleetOps\Models\Order::class => \Fleetbase\FleetOps\Observers\OrderObserver::class,
25
+ \Fleetbase\FleetOps\Models\Payload::class => \Fleetbase\FleetOps\Observers\PayloadObserver::class,
26
+ \Fleetbase\FleetOps\Models\Place::class => \Fleetbase\FleetOps\Observers\PlaceObserver::class,
27
+ \Fleetbase\FleetOps\Models\ServiceRate::class => \Fleetbase\FleetOps\Observers\ServiceRateObserver::class,
28
+ \Fleetbase\FleetOps\Models\PurchaseRate::class => \Fleetbase\FleetOps\Observers\PurchaseRateObserver::class,
29
+ \Fleetbase\FleetOps\Models\ServiceArea::class => \Fleetbase\FleetOps\Observers\ServiceAreaObserver::class,
30
+ \Fleetbase\FleetOps\Models\TrackingNumber::class => \Fleetbase\FleetOps\Observers\TrackingNumberObserver::class,
31
+ \Fleetbase\FleetOps\Models\Driver::class => \Fleetbase\FleetOps\Observers\DriverObserver::class,
32
+ \Fleetbase\FleetOps\Models\Vehicle::class => \Fleetbase\FleetOps\Observers\VehicleObserver::class,
33
+ \Fleetbase\Models\User::class => \Fleetbase\FleetOps\Observers\UserObserver::class,
34
+ ];
35
+
36
+ /**
37
+ * The console commands registered with the service provider.
38
+ *
39
+ * @var array
40
+ */
41
+ public $commands = [
42
+ \Fleetbase\FleetOps\Console\Commands\DispatchAdhocOrders::class,
43
+ \Fleetbase\FleetOps\Console\Commands\DispatchOrders::class,
44
+ \Fleetbase\FleetOps\Console\Commands\TrackOrderDistanceAndTime::class,
45
+ ];
46
+
47
+ /**
48
+ * Register any application services.
49
+ *
50
+ * Within the register method, you should only bind things into the
51
+ * service container. You should never attempt to register any event
52
+ * listeners, routes, or any other piece of functionality within the
53
+ * register method.
54
+ *
55
+ * More information on this can be found in the Laravel documentation:
56
+ * https://laravel.com/docs/8.x/providers
57
+ *
58
+ * @return void
59
+ */
60
+ public function register()
61
+ {
62
+ $this->app->register(CoreServiceProvider::class);
63
+ }
64
+
65
+ /**
66
+ * Bootstrap any package services.
67
+ *
68
+ * @return void
69
+ *
70
+ * @throws \Exception if the `fleetbase/core-api` package is not installed
71
+ */
72
+ public function boot()
73
+ {
74
+ $this->registerObservers();
75
+ $this->registerCommands();
76
+ $this->scheduleCommands(function ($schedule) {
77
+ $schedule->command('fleetops:dispatch-orders')->everyMinute();
78
+ $schedule->command('fleetops:dispatch-adhoc')->everyMinute();
79
+ $schedule->command('fleetops:update-estimations')->everyFifteenMinutes();
80
+ });
81
+ $this->registerExpansionsFrom(__DIR__ . '/../Expansions');
82
+ $this->loadRoutesFrom(__DIR__ . '/../routes.php');
83
+ $this->loadMigrationsFrom(__DIR__ . '/../../migrations');
84
+ $this->loadViewsFrom(__DIR__ . '/../../resources/views', 'fleetops');
85
+ $this->mergeConfigFrom(__DIR__ . '/../../config/fleetops.php', 'fleetops');
86
+ $this->mergeConfigFrom(__DIR__ . '/../../config/api.php', 'api');
87
+ $this->mergeConfigFrom(__DIR__ . '/../../config/cache.stores.php', 'cache.stores');
88
+ $this->mergeConfigFrom(__DIR__ . '/../../config/geocoder.php', 'geocoder');
89
+ $this->mergeConfigFrom(__DIR__ . '/../../config/dompdf.php', 'dompdf');
90
+
91
+ // Register the GeometryEngine for GEOSEngine
92
+ GeometryEngineRegistry::set(new GEOSEngine());
93
+ }
94
+ }
@@ -0,0 +1,37 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Rules;
4
+
5
+ use Fleetbase\FleetOps\Support\Utils;
6
+ use Illuminate\Contracts\Validation\Rule;
7
+
8
+ class ResolvablePoint implements Rule
9
+ {
10
+ /**
11
+ * Determine if the validation rule passes.
12
+ *
13
+ * @param string $attribute
14
+ *
15
+ * @return bool
16
+ */
17
+ public function passes($attribute, $value)
18
+ {
19
+ try {
20
+ $point = Utils::getPointFromMixed($value);
21
+
22
+ return $point instanceof \Grimzy\LaravelMysqlSpatial\Types\Point;
23
+ } catch (\Exception $e) {
24
+ return false;
25
+ }
26
+ }
27
+
28
+ /**
29
+ * Get the validation error message.
30
+ *
31
+ * @return string
32
+ */
33
+ public function message()
34
+ {
35
+ return 'The :attribute must be a valid GeoJSON Point or a type (Place ID) that can be resolved to a Point.';
36
+ }
37
+ }
@@ -0,0 +1,21 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Scopes;
4
+
5
+ use Illuminate\Database\Eloquent\Builder;
6
+ use Illuminate\Database\Eloquent\Model;
7
+ use Illuminate\Database\Eloquent\Scope;
8
+
9
+ class DriverScope implements Scope
10
+ {
11
+ /**
12
+ * Apply the scope to a given Eloquent query builder.
13
+ *
14
+ * @return void
15
+ */
16
+ public function apply(Builder $builder, Model $model)
17
+ {
18
+ // make sure the user of the driver isn't deleted
19
+ $builder->whereHas('user');
20
+ }
21
+ }
@@ -0,0 +1,55 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Support;
4
+
5
+ use Webit\Util\EvalMath\EvalMath;
6
+
7
+ class Algo
8
+ {
9
+ /**
10
+ * Execute an algorithm strig.
11
+ *
12
+ * @return int
13
+ */
14
+ public static function exec($algorithm, $variables = [], $round = false)
15
+ {
16
+ $m = new EvalMath();
17
+ $m->suppress_errors = true;
18
+
19
+ foreach ($variables as $key => $value) {
20
+ $algorithm = str_replace('{' . $key . '}', $value, $algorithm);
21
+ }
22
+
23
+ $result = $m->evaluate($algorithm);
24
+
25
+ if ($round) {
26
+ return round($result, 2); // precision 2 cuz most likely dealing with $
27
+ }
28
+
29
+ return $result;
30
+ }
31
+
32
+ /**
33
+ * Calculates driving distance and time using Google distance matric.
34
+ *
35
+ * @return array
36
+ */
37
+ public static function calculateDrivingDistanceAndTime($lat1, $long1, $lat2, $long2)
38
+ {
39
+ $url =
40
+ 'https://maps.googleapis.com/maps/api/distancematrix/json?origins=' . $lat1 . ',' . $long1 . '&destinations=' . $lat2 . ',' . $long2 . '&mode=driving&key=' . config('services.google.key');
41
+ $ch = curl_init();
42
+ curl_setopt($ch, CURLOPT_URL, $url);
43
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
44
+ curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
45
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
46
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
47
+ $response = curl_exec($ch);
48
+ curl_close($ch);
49
+ $response_a = json_decode($response, true);
50
+ $dist = $response_a['rows'][0]['elements'][0]['distance']['value'];
51
+ $time = $response_a['rows'][0]['elements'][0]['duration']['value'];
52
+
53
+ return ['distance' => $dist, 'time' => $time];
54
+ }
55
+ }
@@ -0,0 +1,27 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Support;
4
+
5
+ /**
6
+ * A utility class for calculating driving distances and times using the Google Distance Matrix API.
7
+ *
8
+ * This class provides methods for calculating the driving distance and time between two points, as well
9
+ * as between multiple points using the Google Distance Matrix API. The results are returned in meters
10
+ * for distance and seconds for time.
11
+ *
12
+ * @category Utility
13
+ *
14
+ * @license https://opensource.org/licenses/MIT MIT License
15
+ * @author Ronald A. Richardson
16
+ */
17
+ class DistanceMatrix
18
+ {
19
+ public ?float $distance;
20
+ public ?int $time;
21
+
22
+ public function __construct(?float $distance, ?int $time)
23
+ {
24
+ $this->distance = $distance;
25
+ $this->time = $time;
26
+ }
27
+ }