@fleetbase/fleetops-engine 0.2.6 → 0.2.8

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 (306) hide show
  1. package/.gitattributes +14 -0
  2. package/.php-cs-fixer.php +29 -0
  3. package/LICENSE.md +16 -4
  4. package/README.md +103 -13
  5. package/composer.json +85 -0
  6. package/extension.json +10 -0
  7. package/package.json +3 -3
  8. package/phpstan.neon.dist +8 -0
  9. package/phpunit.xml.dist +16 -0
  10. package/server/config/api.php +765 -0
  11. package/server/config/cache.stores.php +18 -0
  12. package/server/config/dompdf.php +242 -0
  13. package/server/config/fleetops.php +19 -0
  14. package/server/config/geocoder.php +108 -0
  15. package/server/data/globe.json +261 -0
  16. package/server/migrations/2023_04_27_053456_create_contacts_table.php +49 -0
  17. package/server/migrations/2023_04_27_053456_create_drivers_table.php +62 -0
  18. package/server/migrations/2023_04_27_053456_create_entities_table.php +67 -0
  19. package/server/migrations/2023_04_27_053456_create_fleet_drivers_table.php +39 -0
  20. package/server/migrations/2023_04_27_053456_create_fleets_table.php +47 -0
  21. package/server/migrations/2023_04_27_053456_create_fuel_reports_table.php +50 -0
  22. package/server/migrations/2023_04_27_053456_create_integrated_vendors_table.php +44 -0
  23. package/server/migrations/2023_04_27_053456_create_issues_table.php +53 -0
  24. package/server/migrations/2023_04_27_053456_create_orders_table.php +70 -0
  25. package/server/migrations/2023_04_27_053456_create_payloads_table.php +51 -0
  26. package/server/migrations/2023_04_27_053456_create_places_table.php +62 -0
  27. package/server/migrations/2023_04_27_053456_create_positions_table.php +46 -0
  28. package/server/migrations/2023_04_27_053456_create_proofs_table.php +44 -0
  29. package/server/migrations/2023_04_27_053456_create_purchase_rates_table.php +46 -0
  30. package/server/migrations/2023_04_27_053456_create_routes_table.php +40 -0
  31. package/server/migrations/2023_04_27_053456_create_service_areas_table.php +47 -0
  32. package/server/migrations/2023_04_27_053456_create_service_quote_items_table.php +42 -0
  33. package/server/migrations/2023_04_27_053456_create_service_quotes_table.php +47 -0
  34. package/server/migrations/2023_04_27_053456_create_service_rate_fees_table.php +45 -0
  35. package/server/migrations/2023_04_27_053456_create_service_rate_parcel_fees_table.php +47 -0
  36. package/server/migrations/2023_04_27_053456_create_service_rates_table.php +61 -0
  37. package/server/migrations/2023_04_27_053456_create_tracking_numbers_table.php +46 -0
  38. package/server/migrations/2023_04_27_053456_create_tracking_statuses_table.php +54 -0
  39. package/server/migrations/2023_04_27_053456_create_vehicles_table.php +84 -0
  40. package/server/migrations/2023_04_27_053456_create_vendors_table.php +56 -0
  41. package/server/migrations/2023_04_27_053456_create_waypoints_table.php +45 -0
  42. package/server/migrations/2023_04_27_053456_create_zones_table.php +46 -0
  43. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_companies_table.php +32 -0
  44. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_contacts_table.php +34 -0
  45. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_drivers_table.php +40 -0
  46. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_entities_table.php +40 -0
  47. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleet_drivers_table.php +34 -0
  48. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleets_table.php +36 -0
  49. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fuel_reports_table.php +36 -0
  50. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_integrated_vendors_table.php +34 -0
  51. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_issues_table.php +38 -0
  52. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_orders_table.php +48 -0
  53. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_payloads_table.php +40 -0
  54. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_places_table.php +32 -0
  55. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_positions_table.php +36 -0
  56. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_proofs_table.php +34 -0
  57. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_purchase_rates_table.php +38 -0
  58. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_routes_table.php +34 -0
  59. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_areas_table.php +34 -0
  60. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quote_items_table.php +32 -0
  61. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quotes_table.php +38 -0
  62. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_fees_table.php +32 -0
  63. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_parcel_fees_table.php +32 -0
  64. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rates_table.php +36 -0
  65. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_numbers_table.php +34 -0
  66. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_statuses_table.php +34 -0
  67. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vehicles_table.php +36 -0
  68. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vendors_table.php +40 -0
  69. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_waypoints_table.php +38 -0
  70. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_zones_table.php +34 -0
  71. package/server/migrations/2023_09_14_074512_update_vehicles_table.php +100 -0
  72. package/server/migrations/2023_09_14_074619_create_vehicle_devices_table.php +44 -0
  73. package/server/migrations/2023_09_26_071205_add_online_column_to_vehicles_table.php +32 -0
  74. package/server/migrations/2023_09_26_083957_create_fleet_vehicles_table.php +45 -0
  75. package/server/migrations/2023_09_27_023757_add_column_to_fleets_table.php +46 -0
  76. package/server/migrations/2023_10_05_074811_update_vehicle.php +42 -0
  77. package/server/resources/views/labels/default.php +165 -0
  78. package/server/src/Auth/Schemas/FleetOps.php +75 -0
  79. package/server/src/Casts/MultiPolygon.php +50 -0
  80. package/server/src/Casts/Point.php +109 -0
  81. package/server/src/Casts/Polygon.php +46 -0
  82. package/server/src/Console/Commands/DispatchAdhocOrders.php +137 -0
  83. package/server/src/Console/Commands/DispatchOrders.php +71 -0
  84. package/server/src/Console/Commands/TrackOrderDistanceAndTime.php +62 -0
  85. package/server/src/Events/DriverLocationChanged.php +174 -0
  86. package/server/src/Events/DriverSimulatedLocationChanged.php +183 -0
  87. package/server/src/Events/EntityDriverAssigned.php +36 -0
  88. package/server/src/Events/OrderCanceled.php +15 -0
  89. package/server/src/Events/OrderCompleted.php +15 -0
  90. package/server/src/Events/OrderDispatchFailed.php +42 -0
  91. package/server/src/Events/OrderDispatched.php +15 -0
  92. package/server/src/Events/OrderDriverAssigned.php +15 -0
  93. package/server/src/Events/OrderReady.php +15 -0
  94. package/server/src/Events/OrderStarted.php +15 -0
  95. package/server/src/Exceptions/IntegratedVendorException.php +18 -0
  96. package/server/src/Expansions/UserExpansion.php +63 -0
  97. package/server/src/Exports/ContactExport.php +56 -0
  98. package/server/src/Exports/DriverExport.php +61 -0
  99. package/server/src/Exports/FleetExport.php +53 -0
  100. package/server/src/Exports/PlaceExport.php +55 -0
  101. package/server/src/Exports/ServiceAreaExport.php +58 -0
  102. package/server/src/Exports/VehicleExport.php +57 -0
  103. package/server/src/Exports/VendorExport.php +57 -0
  104. package/server/src/Http/Controllers/Api/v1/ContactController.php +133 -0
  105. package/server/src/Http/Controllers/Api/v1/DriverController.php +691 -0
  106. package/server/src/Http/Controllers/Api/v1/EntityController.php +230 -0
  107. package/server/src/Http/Controllers/Api/v1/FleetController.php +146 -0
  108. package/server/src/Http/Controllers/Api/v1/LabelController.php +63 -0
  109. package/server/src/Http/Controllers/Api/v1/OrderController.php +1114 -0
  110. package/server/src/Http/Controllers/Api/v1/PayloadController.php +195 -0
  111. package/server/src/Http/Controllers/Api/v1/PlaceController.php +333 -0
  112. package/server/src/Http/Controllers/Api/v1/PurchaseRateController.php +199 -0
  113. package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +133 -0
  114. package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +381 -0
  115. package/server/src/Http/Controllers/Api/v1/ServiceRateController.php +223 -0
  116. package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +146 -0
  117. package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +138 -0
  118. package/server/src/Http/Controllers/Api/v1/VehicleController.php +191 -0
  119. package/server/src/Http/Controllers/Api/v1/VendorController.php +159 -0
  120. package/server/src/Http/Controllers/Api/v1/ZoneController.php +146 -0
  121. package/server/src/Http/Controllers/FleetOpsController.php +13 -0
  122. package/server/src/Http/Controllers/Internal/v1/ContactController.php +69 -0
  123. package/server/src/Http/Controllers/Internal/v1/DriverController.php +261 -0
  124. package/server/src/Http/Controllers/Internal/v1/EntityController.php +15 -0
  125. package/server/src/Http/Controllers/Internal/v1/FleetController.php +152 -0
  126. package/server/src/Http/Controllers/Internal/v1/FleetOpsLookupController.php +80 -0
  127. package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +15 -0
  128. package/server/src/Http/Controllers/Internal/v1/GeocoderController.php +96 -0
  129. package/server/src/Http/Controllers/Internal/v1/IntegratedVendorController.php +63 -0
  130. package/server/src/Http/Controllers/Internal/v1/IssueController.php +15 -0
  131. package/server/src/Http/Controllers/Internal/v1/LiveController.php +127 -0
  132. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +75 -0
  133. package/server/src/Http/Controllers/Internal/v1/MorphController.php +77 -0
  134. package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +269 -0
  135. package/server/src/Http/Controllers/Internal/v1/OrderController.php +564 -0
  136. package/server/src/Http/Controllers/Internal/v1/PayloadController.php +15 -0
  137. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +163 -0
  138. package/server/src/Http/Controllers/Internal/v1/ProofController.php +139 -0
  139. package/server/src/Http/Controllers/Internal/v1/PurchaseRateController.php +15 -0
  140. package/server/src/Http/Controllers/Internal/v1/RouteController.php +15 -0
  141. package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +32 -0
  142. package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +345 -0
  143. package/server/src/Http/Controllers/Internal/v1/ServiceRateController.php +47 -0
  144. package/server/src/Http/Controllers/Internal/v1/SettingController.php +30 -0
  145. package/server/src/Http/Controllers/Internal/v1/TrackingNumberController.php +15 -0
  146. package/server/src/Http/Controllers/Internal/v1/TrackingStatusController.php +15 -0
  147. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +65 -0
  148. package/server/src/Http/Controllers/Internal/v1/VehicleDeviceController.php +15 -0
  149. package/server/src/Http/Controllers/Internal/v1/VendorController.php +120 -0
  150. package/server/src/Http/Controllers/Internal/v1/ZoneController.php +15 -0
  151. package/server/src/Http/Filter/ContactFilter.php +86 -0
  152. package/server/src/Http/Filter/DriverFilter.php +148 -0
  153. package/server/src/Http/Filter/FleetFilter.php +108 -0
  154. package/server/src/Http/Filter/IntegratedVendorFilter.php +13 -0
  155. package/server/src/Http/Filter/OrderFilter.php +242 -0
  156. package/server/src/Http/Filter/PlaceFilter.php +111 -0
  157. package/server/src/Http/Filter/ServiceAreaFilter.php +13 -0
  158. package/server/src/Http/Filter/ServiceQuoteFilter.php +13 -0
  159. package/server/src/Http/Filter/ServiceRateFilter.php +33 -0
  160. package/server/src/Http/Filter/TrackingStatusFilter.php +43 -0
  161. package/server/src/Http/Filter/VehicleFilter.php +91 -0
  162. package/server/src/Http/Filter/VendorFilter.php +83 -0
  163. package/server/src/Http/Filter/ZoneFilter.php +13 -0
  164. package/server/src/Http/Requests/CancelOrderRequest.php +31 -0
  165. package/server/src/Http/Requests/CreateContactRequest.php +33 -0
  166. package/server/src/Http/Requests/CreateDriverRequest.php +55 -0
  167. package/server/src/Http/Requests/CreateEntityRequest.php +43 -0
  168. package/server/src/Http/Requests/CreateFleetRequest.php +32 -0
  169. package/server/src/Http/Requests/CreateOrderRequest.php +66 -0
  170. package/server/src/Http/Requests/CreatePayloadRequest.php +37 -0
  171. package/server/src/Http/Requests/CreatePlaceRequest.php +38 -0
  172. package/server/src/Http/Requests/CreatePurchaseRateRequest.php +33 -0
  173. package/server/src/Http/Requests/CreateServiceAreaRequest.php +35 -0
  174. package/server/src/Http/Requests/CreateServiceQuoteRequest.php +29 -0
  175. package/server/src/Http/Requests/CreateServiceRateRequest.php +56 -0
  176. package/server/src/Http/Requests/CreateTrackingNumberRequest.php +34 -0
  177. package/server/src/Http/Requests/CreateTrackingStatusRequest.php +42 -0
  178. package/server/src/Http/Requests/CreateVehicleRequest.php +32 -0
  179. package/server/src/Http/Requests/CreateVendorRequest.php +35 -0
  180. package/server/src/Http/Requests/CreateZoneRequest.php +35 -0
  181. package/server/src/Http/Requests/DecodeTrackingNumberQR.php +30 -0
  182. package/server/src/Http/Requests/DriverSimulationRequest.php +46 -0
  183. package/server/src/Http/Requests/Internal/AssignOrderRequest.php +31 -0
  184. package/server/src/Http/Requests/Internal/CreateDriverRequest.php +42 -0
  185. package/server/src/Http/Requests/Internal/FleetActionRequest.php +32 -0
  186. package/server/src/Http/Requests/Internal/UpdateDriverRequest.php +7 -0
  187. package/server/src/Http/Requests/QueryServiceQuotesRequest.php +41 -0
  188. package/server/src/Http/Requests/UpdateContactRequest.php +20 -0
  189. package/server/src/Http/Requests/UpdateDriverRequest.php +7 -0
  190. package/server/src/Http/Requests/UpdateEntityRequest.php +7 -0
  191. package/server/src/Http/Requests/UpdateFleetRequest.php +7 -0
  192. package/server/src/Http/Requests/UpdateOrderRequest.php +7 -0
  193. package/server/src/Http/Requests/UpdatePayloadRequest.php +7 -0
  194. package/server/src/Http/Requests/UpdatePlaceRequest.php +7 -0
  195. package/server/src/Http/Requests/UpdatePurchaseRateRequest.php +7 -0
  196. package/server/src/Http/Requests/UpdateServiceAreaRequest.php +29 -0
  197. package/server/src/Http/Requests/UpdateServiceQuoteRequest.php +29 -0
  198. package/server/src/Http/Requests/UpdateServiceRateRequest.php +29 -0
  199. package/server/src/Http/Requests/UpdateTrackingNumberRequest.php +7 -0
  200. package/server/src/Http/Requests/UpdateTrackingStatusRequest.php +32 -0
  201. package/server/src/Http/Requests/UpdateVehicleRequest.php +7 -0
  202. package/server/src/Http/Requests/UpdateVendorRequest.php +7 -0
  203. package/server/src/Http/Requests/UpdateZoneRequest.php +7 -0
  204. package/server/src/Http/Resources/Internal/v1/IntegratedVendorFacilitator.php +37 -0
  205. package/server/src/Http/Resources/Internal/v1/Vehicle.php +33 -0
  206. package/server/src/Http/Resources/Internal/v1/Waypoint.php +34 -0
  207. package/server/src/Http/Resources/v1/Contact.php +62 -0
  208. package/server/src/Http/Resources/v1/CurrentJob.php +36 -0
  209. package/server/src/Http/Resources/v1/DeletedResource.php +61 -0
  210. package/server/src/Http/Resources/v1/Driver.php +89 -0
  211. package/server/src/Http/Resources/v1/Entity.php +107 -0
  212. package/server/src/Http/Resources/v1/Fleet.php +60 -0
  213. package/server/src/Http/Resources/v1/FuelReport.php +67 -0
  214. package/server/src/Http/Resources/v1/Order.php +131 -0
  215. package/server/src/Http/Resources/v1/Payload.php +94 -0
  216. package/server/src/Http/Resources/v1/Place.php +84 -0
  217. package/server/src/Http/Resources/v1/Proof.php +36 -0
  218. package/server/src/Http/Resources/v1/PurchaseRate.php +77 -0
  219. package/server/src/Http/Resources/v1/ServiceArea.php +55 -0
  220. package/server/src/Http/Resources/v1/ServiceQuote.php +57 -0
  221. package/server/src/Http/Resources/v1/ServiceRate.php +94 -0
  222. package/server/src/Http/Resources/v1/ServiceRateFee.php +58 -0
  223. package/server/src/Http/Resources/v1/ServiceRateParcelFee.php +48 -0
  224. package/server/src/Http/Resources/v1/TrackingNumber.php +62 -0
  225. package/server/src/Http/Resources/v1/TrackingStatus.php +84 -0
  226. package/server/src/Http/Resources/v1/Vehicle.php +75 -0
  227. package/server/src/Http/Resources/v1/VehicleDevice.php +44 -0
  228. package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +72 -0
  229. package/server/src/Http/Resources/v1/Vendor.php +72 -0
  230. package/server/src/Http/Resources/v1/Zone.php +60 -0
  231. package/server/src/Imports/OrdersImport.php +18 -0
  232. package/server/src/Integrations/Lalamove/Lalamove.php +678 -0
  233. package/server/src/Integrations/Lalamove/LalamoveDeliveryStop.php +97 -0
  234. package/server/src/Integrations/Lalamove/LalamoveMarket.php +123 -0
  235. package/server/src/Integrations/Lalamove/LalamoveServiceType.php +161 -0
  236. package/server/src/Jobs/SimulateDrivingRoute.php +81 -0
  237. package/server/src/Jobs/SimulateWaypointReached.php +79 -0
  238. package/server/src/Listeners/HandleOrderCanceled.php +46 -0
  239. package/server/src/Listeners/HandleOrderCreated.php +23 -0
  240. package/server/src/Listeners/HandleOrderDispatchFailed.php +35 -0
  241. package/server/src/Listeners/HandleOrderDispatched.php +108 -0
  242. package/server/src/Listeners/HandleOrderDriverAssigned.php +42 -0
  243. package/server/src/Listeners/HandleOrderReady.php +27 -0
  244. package/server/src/Listeners/HandleUserRemovedFromCompany.php +31 -0
  245. package/server/src/Models/Contact.php +239 -0
  246. package/server/src/Models/Driver.php +543 -0
  247. package/server/src/Models/Entity.php +416 -0
  248. package/server/src/Models/Fleet.php +203 -0
  249. package/server/src/Models/FleetDriver.php +73 -0
  250. package/server/src/Models/FleetVehicle.php +73 -0
  251. package/server/src/Models/FuelReport.php +125 -0
  252. package/server/src/Models/IntegratedVendor.php +219 -0
  253. package/server/src/Models/Issue.php +111 -0
  254. package/server/src/Models/Order.php +1132 -0
  255. package/server/src/Models/Payload.php +699 -0
  256. package/server/src/Models/Place.php +656 -0
  257. package/server/src/Models/Position.php +119 -0
  258. package/server/src/Models/Proof.php +94 -0
  259. package/server/src/Models/PurchaseRate.php +208 -0
  260. package/server/src/Models/Route.php +128 -0
  261. package/server/src/Models/ServiceArea.php +161 -0
  262. package/server/src/Models/ServiceQuote.php +207 -0
  263. package/server/src/Models/ServiceQuoteItem.php +46 -0
  264. package/server/src/Models/ServiceRate.php +953 -0
  265. package/server/src/Models/ServiceRateFee.php +96 -0
  266. package/server/src/Models/ServiceRateParcelFee.php +116 -0
  267. package/server/src/Models/TrackingNumber.php +310 -0
  268. package/server/src/Models/TrackingStatus.php +177 -0
  269. package/server/src/Models/Vehicle.php +452 -0
  270. package/server/src/Models/VehicleDevice.php +79 -0
  271. package/server/src/Models/Vendor.php +244 -0
  272. package/server/src/Models/Waypoint.php +226 -0
  273. package/server/src/Models/Zone.php +95 -0
  274. package/server/src/Notifications/OrderAssigned.php +140 -0
  275. package/server/src/Notifications/OrderCanceled.php +129 -0
  276. package/server/src/Notifications/OrderDispatchFailed.php +81 -0
  277. package/server/src/Notifications/OrderDispatched.php +173 -0
  278. package/server/src/Notifications/OrderPing.php +162 -0
  279. package/server/src/Notifications/OrderSplit.php +56 -0
  280. package/server/src/Observers/DriverObserver.php +34 -0
  281. package/server/src/Observers/OrderObserver.php +34 -0
  282. package/server/src/Observers/PayloadObserver.php +30 -0
  283. package/server/src/Observers/PlaceObserver.php +26 -0
  284. package/server/src/Observers/PurchaseRateObserver.php +61 -0
  285. package/server/src/Observers/ServiceAreaObserver.php +35 -0
  286. package/server/src/Observers/ServiceRateObserver.php +78 -0
  287. package/server/src/Observers/TrackingNumberObserver.php +44 -0
  288. package/server/src/Observers/UserObserver.php +20 -0
  289. package/server/src/Observers/VehicleObserver.php +66 -0
  290. package/server/src/Providers/EventServiceProvider.php +30 -0
  291. package/server/src/Providers/FleetOpsServiceProvider.php +94 -0
  292. package/server/src/Rules/ResolvablePoint.php +37 -0
  293. package/server/src/Scopes/DriverScope.php +21 -0
  294. package/server/src/Support/Algo.php +55 -0
  295. package/server/src/Support/DistanceMatrix.php +27 -0
  296. package/server/src/Support/Encoding/Polyline.php +168 -0
  297. package/server/src/Support/Flow.php +622 -0
  298. package/server/src/Support/Geocoding.php +216 -0
  299. package/server/src/Support/IntegratedVendors.php +287 -0
  300. package/server/src/Support/Metrics.php +305 -0
  301. package/server/src/Support/OSRM.php +191 -0
  302. package/server/src/Support/ParsePhone.php +21 -0
  303. package/server/src/Support/Utils.php +1145 -0
  304. package/server/src/Traits/HasTrackingNumber.php +185 -0
  305. package/server/src/routes.php +381 -0
  306. package/server/tests/Feature.php +5 -0
@@ -0,0 +1,305 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Support;
4
+
5
+ use Fleetbase\FleetOps\Models\Contact;
6
+ use Fleetbase\FleetOps\Models\Driver;
7
+ use Fleetbase\FleetOps\Models\FuelReport;
8
+ use Fleetbase\FleetOps\Models\Issue;
9
+ use Fleetbase\FleetOps\Models\Order;
10
+ use Fleetbase\Models\Company;
11
+ use Fleetbase\Models\Transaction;
12
+ use Illuminate\Support\Carbon;
13
+ use Illuminate\Support\Str;
14
+
15
+ /**
16
+ * Metrics service to pull analyitcs and metrics from FleetOps.
17
+ *
18
+ * Ex:
19
+ * $metrics = Metrics::new($company)->withEarnings()->withFuelCosts()->get();
20
+ */
21
+ class Metrics
22
+ {
23
+ protected \DateTime $start;
24
+ protected \DateTime $end;
25
+ protected Company $company;
26
+ protected array $metrics = [];
27
+
28
+ public static function new(Company $company, \DateTime $start = null, \DateTime $end = null): Metrics
29
+ {
30
+ $start = $start === null ? Carbon::create(1900)->toDateTime() : $start;
31
+ $end = $end === null ? Carbon::tomorrow()->toDateTime() : $end;
32
+
33
+ return (new static())->setCompany($company)->between($start, $end);
34
+ }
35
+
36
+ public static function forCompany(Company $company, \DateTime $start = null, \DateTime $end = null): Metrics
37
+ {
38
+ return static::new($company, $start, $end);
39
+ }
40
+
41
+ public function start(\DateTime $start): Metrics
42
+ {
43
+ $this->start = $start;
44
+
45
+ return $this;
46
+ }
47
+
48
+ public function end(\DateTime $end): Metrics
49
+ {
50
+ $this->end = $end;
51
+
52
+ return $this;
53
+ }
54
+
55
+ public function between(\DateTime $start, \DateTime $end): Metrics
56
+ {
57
+ return $this->start($start)->end($end);
58
+ }
59
+
60
+ private function setCompany(Company $company): Metrics
61
+ {
62
+ $this->company = $company;
63
+
64
+ return $this;
65
+ }
66
+
67
+ private function set($key, $value = null): Metrics
68
+ {
69
+ if (is_array($key)) {
70
+ foreach ($key as $k => $v) {
71
+ $this->set($k, $v);
72
+ }
73
+
74
+ return $this;
75
+ }
76
+
77
+ $this->metrics = data_set($this->metrics, $key, $value);
78
+
79
+ return $this;
80
+ }
81
+
82
+ public function get()
83
+ {
84
+ return $this->metrics;
85
+ }
86
+
87
+ public function with(?array $metrics = [])
88
+ {
89
+ if (empty($metrics)) {
90
+ $metrics = array_slice(get_class_methods($this), 9);
91
+ }
92
+
93
+ $metrics = array_map(
94
+ function ($metric) {
95
+ return Str::camel($metric);
96
+ },
97
+ $metrics
98
+ );
99
+
100
+ foreach ($metrics as $metric) {
101
+ if (method_exists($this, $metric)) {
102
+ $this->{$metric}();
103
+ }
104
+ }
105
+
106
+ return $this;
107
+ }
108
+
109
+ public function earnings(callable $callback = null): Metrics
110
+ {
111
+ $query = Transaction::where('company_uuid', $this->company->uuid)->whereBetween('created_at', [$this->start, $this->end]);
112
+
113
+ if (is_callable($callback)) {
114
+ $callback($query);
115
+ }
116
+
117
+ $data = $query->sum('amount');
118
+
119
+ return $this->set('earnings', (int) $data);
120
+ }
121
+
122
+ public function fuelCosts(callable $callback = null): Metrics
123
+ {
124
+ $query = FuelReport::where('company_uuid', $this->company->uuid)->whereBetween('created_at', [$this->start, $this->end]);
125
+
126
+ if (is_callable($callback)) {
127
+ $callback($query);
128
+ }
129
+
130
+ $data = $query->sum('amount');
131
+
132
+ return $this->set('fuel_costs', (int) $data);
133
+ }
134
+
135
+ public function totalDistanceTraveled(callable $callback = null): Metrics
136
+ {
137
+ $query = Order::where(
138
+ [
139
+ 'company_uuid' => $this->company->uuid,
140
+ 'status' => 'completed',
141
+ ]
142
+ )
143
+ ->whereBetween('created_at', [$this->start, $this->end]);
144
+
145
+ if (is_callable($callback)) {
146
+ $callback($query);
147
+ }
148
+
149
+ $data = $query->sum('distance');
150
+
151
+ return $this->set('total_distance_traveled', (int) $data);
152
+ }
153
+
154
+ public function totalTimeTraveled(callable $callback = null): Metrics
155
+ {
156
+ $query = Order::where(
157
+ [
158
+ 'company_uuid' => $this->company->uuid,
159
+ 'status' => 'completed',
160
+ ]
161
+ )
162
+ ->whereBetween('created_at', [$this->start, $this->end]);
163
+
164
+ if (is_callable($callback)) {
165
+ $callback($query);
166
+ }
167
+
168
+ $data = $query->sum('distance');
169
+
170
+ return $this->set('total_distance_traveled', (int) $data);
171
+ }
172
+
173
+ public function ordersCanceled(callable $callback = null): Metrics
174
+ {
175
+ $query = Order::where('company_uuid', $this->company->uuid)
176
+ ->whereBetween('created_at', [$this->start, $this->end])
177
+ ->where('status', 'canceled');
178
+
179
+ if (is_callable($callback)) {
180
+ $callback($query);
181
+ }
182
+
183
+ $data = $query->count();
184
+
185
+ return $this->set('orders_canceled', $data);
186
+ }
187
+
188
+ public function ordersCompleted(callable $callback = null): Metrics
189
+ {
190
+ $query = Order::where('company_uuid', $this->company->uuid)
191
+ ->whereBetween('created_at', [$this->start, $this->end])
192
+ ->where('status', 'completed');
193
+
194
+ if (is_callable($callback)) {
195
+ $callback($query);
196
+ }
197
+
198
+ $data = $query->count();
199
+
200
+ return $this->set('orders_completed', $data);
201
+ }
202
+
203
+ public function ordersInProgress(callable $callback = null): Metrics
204
+ {
205
+ $query = Order::where('company_uuid', $this->company->uuid)
206
+ ->whereBetween('created_at', [$this->start, $this->end])
207
+ ->whereNotIn('status', ['completed', 'created', 'pending', 'canceled']);
208
+
209
+ if (is_callable($callback)) {
210
+ $callback($query);
211
+ }
212
+
213
+ $data = $query->count();
214
+
215
+ return $this->set('orders_in_progress', $data);
216
+ }
217
+
218
+ public function ordersScheduled(callable $callback = null): Metrics
219
+ {
220
+ $query = Order::where('company_uuid', $this->company->uuid)
221
+ ->whereBetween('created_at', [$this->start, $this->end])
222
+ ->where('status', 'created')
223
+ ->whereDate('scheduled_at', '>', Carbon::now());
224
+
225
+ if (is_callable($callback)) {
226
+ $callback($query);
227
+ }
228
+
229
+ $data = $query->count();
230
+
231
+ return $this->set('orders_scheduled', $data);
232
+ }
233
+
234
+ public function driversOnline(callable $callback = null): Metrics
235
+ {
236
+ $query = Driver::where('company_uuid', $this->company->uuid)
237
+ ->where('online', true)
238
+ ->whereNotNull('current_job_uuid');
239
+
240
+ if (is_callable($callback)) {
241
+ $callback($query);
242
+ }
243
+
244
+ $data = $query->count();
245
+
246
+ return $this->set('drivers_online', $data);
247
+ }
248
+
249
+ public function totalDrivers(callable $callback = null): Metrics
250
+ {
251
+ $query = Driver::where('company_uuid', $this->company->uuid);
252
+
253
+ if (is_callable($callback)) {
254
+ $callback($query);
255
+ }
256
+
257
+ $data = $query->count();
258
+
259
+ return $this->set('total_drivers', $data);
260
+ }
261
+
262
+ public function totalCustomers(callable $callback = null): Metrics
263
+ {
264
+ $query = Contact::where('company_uuid', $this->company->uuid)
265
+ ->where('type', 'customer');
266
+
267
+ if (is_callable($callback)) {
268
+ $callback($query);
269
+ }
270
+
271
+ $data = $query->count();
272
+
273
+ return $this->set('total_customers', $data);
274
+ }
275
+
276
+ public function openIssues(callable $callback = null): Metrics
277
+ {
278
+ $query = Issue::where('company_uuid', session('company'))
279
+ ->whereBetween('created_at', [$this->start, $this->end])
280
+ ->where('status', 'pending');
281
+
282
+ if (is_callable($callback)) {
283
+ $callback($query);
284
+ }
285
+
286
+ $data = $query->count();
287
+
288
+ return $this->set('open_issues', $data);
289
+ }
290
+
291
+ public function resolvedIssues(callable $callback = null): Metrics
292
+ {
293
+ $query = Issue::where('company_uuid', session('company'))
294
+ ->whereBetween('created_at', [$this->start, $this->end])
295
+ ->whereNotNull('resolved_at');
296
+
297
+ if (is_callable($callback)) {
298
+ $callback($query);
299
+ }
300
+
301
+ $data = $query->count();
302
+
303
+ return $this->set('resolved_issues', $data);
304
+ }
305
+ }
@@ -0,0 +1,191 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Support;
4
+
5
+ use Fleetbase\FleetOps\Support\Encoding\Polyline;
6
+ use Grimzy\LaravelMysqlSpatial\Types\Point;
7
+ use Illuminate\Support\Facades\Cache;
8
+ use Illuminate\Support\Facades\Http;
9
+
10
+ /**
11
+ * Class OSRM
12
+ * A support class to interact with the Open Source Routing Machine (OSRM) API.
13
+ */
14
+ class OSRM
15
+ {
16
+ protected static $baseUrl = 'https://bundle.routing.fleetbase.io';
17
+
18
+ /**
19
+ * Get the route between two points.
20
+ *
21
+ * @param Point $start starting point
22
+ * @param Point $end ending point
23
+ * @param array $queryParameters additional query parameters
24
+ *
25
+ * @return array response from the OSRM API
26
+ */
27
+ public static function getRoute(Point $start, Point $end, array $queryParameters = [])
28
+ {
29
+ // Generate a unique cache key based on the method parameters
30
+ $cacheKey = 'getRoute:' . md5($start . $end . serialize($queryParameters));
31
+
32
+ // Return the cached result if it exists
33
+ if (Cache::has($cacheKey)) {
34
+ return Cache::get($cacheKey);
35
+ }
36
+
37
+ $coordinates = "{$start->getLng()},{$start->getLat()};{$end->getLng()},{$end->getLat()}";
38
+ $url = self::$baseUrl . "/route/v1/driving/{$coordinates}";
39
+ $response = Http::get($url, $queryParameters);
40
+ $data = $response->json();
41
+
42
+ // Check for the presence of the encoded polyline in each route and decode it if found
43
+ if (isset($data['routes']) && is_array($data['routes'])) {
44
+ foreach ($data['routes'] as &$route) {
45
+ if (isset($route['geometry'])) {
46
+ $route['waypoints'] = self::decodePolyline($route['geometry']);
47
+ }
48
+ }
49
+ }
50
+
51
+ // Store the result in the cache for 60 minutes
52
+ Cache::put($cacheKey, $data, 60 * 60);
53
+
54
+ return $data;
55
+ }
56
+
57
+ /**
58
+ * Get the nearest point on a road to a given location.
59
+ *
60
+ * @param Point $location location point
61
+ * @param array $queryParameters additional query parameters
62
+ *
63
+ * @return array response from the OSRM API
64
+ */
65
+ public static function getNearest(Point $location, array $queryParameters = [])
66
+ {
67
+ $cacheKey = 'getNearest:' . md5($location . serialize($queryParameters));
68
+
69
+ if (Cache::has($cacheKey)) {
70
+ return Cache::get($cacheKey);
71
+ }
72
+
73
+ $coordinates = "{$location->getLng()},{$location->getLat()}";
74
+ $url = self::$baseUrl . "/nearest/v1/driving/{$coordinates}";
75
+ $response = Http::get($url, $queryParameters);
76
+ $result = $response->json();
77
+
78
+ Cache::put($cacheKey, $result, 60 * 60);
79
+
80
+ return $result;
81
+ }
82
+
83
+ /**
84
+ * Get a table of travel times or distances between multiple points.
85
+ *
86
+ * @param array $points array of Point objects
87
+ * @param array $queryParameters additional query parameters
88
+ *
89
+ * @return array response from the OSRM API
90
+ */
91
+ public static function getTable(array $points, array $queryParameters = [])
92
+ {
93
+ $cacheKey = 'getTable:' . md5(serialize($points) . serialize($queryParameters));
94
+
95
+ if (Cache::has($cacheKey)) {
96
+ return Cache::get($cacheKey);
97
+ }
98
+
99
+ $coordinates = implode(';', array_map(function (Point $point) {
100
+ return "{$point->getLng()},{$point->getLat()}";
101
+ }, $points));
102
+
103
+ $url = self::$baseUrl . "/table/v1/driving/{$coordinates}";
104
+ $response = Http::get($url, $queryParameters);
105
+ $result = $response->json();
106
+
107
+ Cache::put($cacheKey, $result, 60 * 60);
108
+
109
+ return $result;
110
+ }
111
+
112
+ /**
113
+ * Get a trip between multiple points.
114
+ *
115
+ * @param array $points array of Point objects
116
+ * @param array $queryParameters additional query parameters
117
+ *
118
+ * @return array response from the OSRM API
119
+ */
120
+ public static function getTrip(array $points, array $queryParameters = [])
121
+ {
122
+ $cacheKey = 'getTrip:' . md5(serialize($points) . serialize($queryParameters));
123
+
124
+ if (Cache::has($cacheKey)) {
125
+ return Cache::get($cacheKey);
126
+ }
127
+
128
+ $coordinates = implode(';', array_map(function (Point $point) {
129
+ return "{$point->getLng()},{$point->getLat()}";
130
+ }, $points));
131
+
132
+ $url = self::$baseUrl . "/trip/v1/driving/{$coordinates}";
133
+ $response = Http::get($url, $queryParameters);
134
+ $data = $response->json();
135
+
136
+ Cache::put($cacheKey, $data, 60 * 60);
137
+
138
+ return $data;
139
+ }
140
+
141
+ /**
142
+ * Get a match between GPS points and roads.
143
+ *
144
+ * @param array $points array of Point objects
145
+ * @param array $queryParameters additional query parameters
146
+ *
147
+ * @return array response from the OSRM API
148
+ */
149
+ public static function getMatch(array $points, array $queryParameters = [])
150
+ {
151
+ $coordinates = implode(';', array_map(function (Point $point) {
152
+ return "{$point->getLng()},{$point->getLat()}";
153
+ }, $points));
154
+ $url = self::$baseUrl . "/match/v1/driving/{$coordinates}";
155
+
156
+ $response = Http::get($url, $queryParameters);
157
+
158
+ return $response->json();
159
+ }
160
+
161
+ /**
162
+ * Get a tile for a specific zoom level and coordinates.
163
+ *
164
+ * @param int $z zoom level
165
+ * @param int $x x coordinate
166
+ * @param int $y y coordinate
167
+ * @param array $queryParameters additional query parameters
168
+ *
169
+ * @return string response from the OSRM API
170
+ */
171
+ public static function getTile(int $z, int $x, int $y, array $queryParameters = [])
172
+ {
173
+ $url = self::$baseUrl . "/tile/v1/car/{$z}/{$x}/{$y}.mvt";
174
+
175
+ $response = Http::get($url, $queryParameters);
176
+
177
+ return $response->body();
178
+ }
179
+
180
+ /**
181
+ * Decodes an encoded polyline string into an array of coordinates.
182
+ *
183
+ * @param string $polyline the encoded polyline string
184
+ *
185
+ * @return array an array of Point's
186
+ */
187
+ public static function decodePolyline($polyline)
188
+ {
189
+ return Polyline::decode($polyline);
190
+ }
191
+ }
@@ -0,0 +1,21 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Support;
4
+
5
+ use Fleetbase\FleetOps\Models\Contact;
6
+ use Fleetbase\FleetOps\Models\Place;
7
+ use Fleetbase\Support\ParsePhone as ParsePhoneUtil;
8
+ use libphonenumber\PhoneNumberFormat;
9
+
10
+ class ParsePhone extends ParsePhoneUtil
11
+ {
12
+ public static function fromContact(Contact $contact, $options = [], $format = PhoneNumberFormat::E164)
13
+ {
14
+ return static::fromModel($contact, $options, $format);
15
+ }
16
+
17
+ public static function fromPlace(Place $place, $options = [], $format = PhoneNumberFormat::E164)
18
+ {
19
+ return static::fromModel($place, $options, $format);
20
+ }
21
+ }