@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,216 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Support;
4
+
5
+ use Fleetbase\FleetOps\Models\Place;
6
+ use Geocoder\Provider\GoogleMaps\GoogleMaps;
7
+ use Geocoder\Provider\GoogleMapsPlaces\GoogleMapsPlaces;
8
+ use Geocoder\Query\GeocodeQuery;
9
+ use Geocoder\Query\ReverseQuery;
10
+ use Geocoder\StatefulGeocoder;
11
+ use GuzzleHttp\Client;
12
+ use Illuminate\Support\Collection;
13
+
14
+ /**
15
+ * Class Geocoding.
16
+ *
17
+ * Provides geocoding functionalities using Google Maps API.
18
+ */
19
+ class Geocoding
20
+ {
21
+ /**
22
+ * Search radius in meters.
23
+ */
24
+ public const SEARCH_RADIUS = 2000;
25
+
26
+ /**
27
+ * Geocode a search query to get places.
28
+ *
29
+ * @param string $searchQuery the query to search for
30
+ * @param float|null $latitude optional latitude for location-based search
31
+ * @param float|null $longitude optional longitude for location-based search
32
+ *
33
+ * @return Collection a collection of places
34
+ *
35
+ * @throws \Exception
36
+ */
37
+ public static function geocode(string $searchQuery, $latitude = null, $longitude = null): Collection
38
+ {
39
+ $httpClient = new Client();
40
+ $provider = new GoogleMaps($httpClient, null, config('services.google_maps.api_key', env('GOOGLE_MAPS_API_KEY')));
41
+ $geocoder = new StatefulGeocoder($provider, 'en');
42
+
43
+ try {
44
+ if ($latitude && $longitude) {
45
+ $geoResults = $geocoder->geocodeQuery(
46
+ GeocodeQuery::create($searchQuery)
47
+ ->withData('mode', GoogleMapsPlaces::GEOCODE_MODE_SEARCH)
48
+ ->withData('location', "$latitude, $longitude")
49
+ ->withData('radius', self::SEARCH_RADIUS)
50
+ );
51
+ } else {
52
+ $geoResults = $geocoder->geocodeQuery(
53
+ GeocodeQuery::create($searchQuery)
54
+ ->withData('mode', GoogleMapsPlaces::GEOCODE_MODE_SEARCH)
55
+ );
56
+ }
57
+
58
+ return collect($geoResults->all())->map(
59
+ function ($googleAddress) {
60
+ return Place::createFromGoogleAddress($googleAddress);
61
+ }
62
+ )->values();
63
+ } catch (\Exception $e) {
64
+ // Handle exceptions here or re-throw them to be handled elsewhere
65
+ throw $e;
66
+ }
67
+
68
+ return collect();
69
+ }
70
+
71
+ /**
72
+ * Perform a reverse geocoding query based on a search query and coordinates.
73
+ *
74
+ * @param string $searchQuery the query to search for
75
+ * @param float $latitude latitude of the location
76
+ * @param float $longitude longitude of the location
77
+ *
78
+ * @return Collection a collection of places
79
+ *
80
+ * @throws \Exception
81
+ */
82
+ public static function reverseFromQuery(string $searchQuery, $latitude, $longitude): Collection
83
+ {
84
+ $httpClient = new Client();
85
+ $provider = new GoogleMaps($httpClient, null, config('services.google_maps.api_key', env('GOOGLE_MAPS_API_KEY')));
86
+ $geocoder = new StatefulGeocoder($provider, 'en');
87
+
88
+ if (empty($searchQuery)) {
89
+ return collect();
90
+ }
91
+
92
+ if (empty($latitude) && empty($longitude)) {
93
+ return collect();
94
+ }
95
+
96
+ try {
97
+ $geoResults = $geocoder->reverseQuery(
98
+ ReverseQuery::fromCoordinates($latitude, $longitude)
99
+ ->withData('mode', GoogleMapsPlaces::GEOCODE_MODE_NEARBY)
100
+ ->withData('keyword', $searchQuery)
101
+ ->withData('radius', self::SEARCH_RADIUS)
102
+ );
103
+
104
+ return collect($geoResults->all())->map(
105
+ function ($googleAddress) {
106
+ return Place::createFromGoogleAddress($googleAddress);
107
+ }
108
+ )->values();
109
+ } catch (\Exception $e) {
110
+ // Handle exceptions here or re-throw them to be handled elsewhere
111
+ throw $e;
112
+ }
113
+
114
+ return collect();
115
+ }
116
+
117
+ /**
118
+ * Perform a reverse geocoding query based on coordinates.
119
+ *
120
+ * @param float $latitude latitude of the location
121
+ * @param float $longitude longitude of the location
122
+ * @param string|null $searchQuery optional query to refine the search
123
+ *
124
+ * @return Collection a collection of places
125
+ *
126
+ * @throws \Exception
127
+ */
128
+ public static function reverseFromCoordinates($latitude, $longitude, string $searchQuery = null): Collection
129
+ {
130
+ $httpClient = new Client();
131
+ $provider = new GoogleMaps($httpClient, null, config('services.google_maps.api_key', env('GOOGLE_MAPS_API_KEY')));
132
+ $geocoder = new StatefulGeocoder($provider, 'en');
133
+
134
+ if (empty($latitude) && empty($longitude)) {
135
+ return collect();
136
+ }
137
+
138
+ try {
139
+ if ($searchQuery) {
140
+ $geoResults = $geocoder->reverseQuery(
141
+ ReverseQuery::fromCoordinates($latitude, $longitude)
142
+ ->withData('mode', GoogleMapsPlaces::GEOCODE_MODE_NEARBY)
143
+ ->withData('keyword', $searchQuery)
144
+ ->withData('radius', self::SEARCH_RADIUS)
145
+ );
146
+ } else {
147
+ $geoResults = $geocoder->reverseQuery(
148
+ ReverseQuery::fromCoordinates($latitude, $longitude)
149
+ ->withData('mode', GoogleMapsPlaces::GEOCODE_MODE_NEARBY)
150
+ ->withData('radius', self::SEARCH_RADIUS)
151
+ );
152
+ }
153
+
154
+ return collect($geoResults->all())->map(
155
+ function ($googleAddress) {
156
+ return Place::createFromGoogleAddress($googleAddress);
157
+ }
158
+ )->values();
159
+ } catch (\Exception $e) {
160
+ // Handle exceptions here or re-throw them to be handled elsewhere
161
+ throw $e;
162
+ }
163
+
164
+ return collect();
165
+ }
166
+
167
+ /**
168
+ * Locate places based on a search query and coordinates.
169
+ *
170
+ * @param string $searchQuery the query to search for
171
+ * @param float $latitude latitude of the location
172
+ * @param float $longitude longitude of the location
173
+ *
174
+ * @return Collection a unique collection of places
175
+ *
176
+ * @throws \Exception
177
+ */
178
+ public static function locate(string $searchQuery, $latitude, $longitude): Collection
179
+ {
180
+ try {
181
+ $reverseQueryResults = static::reverseFromCoordinates($latitude, $longitude, $searchQuery);
182
+ $geodingQueryResults = static::geocode($searchQuery, $latitude, $longitude);
183
+ } catch (\Exception $e) {
184
+ // Handle exceptions here or re-throw them to be handled elsewhere
185
+ throw $e;
186
+ }
187
+
188
+ return $reverseQueryResults->merge($geodingQueryResults)->unique('street1');
189
+ }
190
+
191
+ /**
192
+ * Query places based on a search query and coordinates.
193
+ *
194
+ * @param string $searchQuery the query to search for
195
+ * @param float $latitude latitude of the location
196
+ * @param float $longitude longitude of the location
197
+ *
198
+ * @return Collection A unique collection
199
+ *
200
+ * @throws \Exception
201
+ */
202
+ public static function query(string $searchQuery, $latitude, $longitude): Collection
203
+ {
204
+ try {
205
+ $reverseQueryResults = static::reverseFromQuery($searchQuery, $latitude, $longitude);
206
+ $geodingQueryResults = static::geocode($searchQuery, $latitude, $longitude);
207
+ } catch (\Exception $e) {
208
+ // Handle exceptions here or re-throw them to be handled elsewhere
209
+ throw $e;
210
+ }
211
+
212
+ // dd($reverseQueryResults, $geodingQueryResults);
213
+
214
+ return $reverseQueryResults->merge($geodingQueryResults)->unique('street1');
215
+ }
216
+ }
@@ -0,0 +1,287 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Support;
4
+
5
+ use Fleetbase\FleetOps\Integrations\Lalamove\Lalamove;
6
+ use Fleetbase\FleetOps\Integrations\Lalamove\LalamoveMarket;
7
+ use Fleetbase\FleetOps\Integrations\Lalamove\LalamoveServiceType;
8
+ use Fleetbase\FleetOps\Models\IntegratedVendor;
9
+ use Illuminate\Support\Str;
10
+
11
+ class ResolvedIntegratedVendor
12
+ {
13
+ private IntegratedVendor $vendor;
14
+
15
+ public function __construct(array $config)
16
+ {
17
+ foreach ($config as $key => $value) {
18
+ $this->{$key} = $value;
19
+ }
20
+
21
+ $this->logo = static::logo($config['code']);
22
+ }
23
+
24
+ public function __get(string $key)
25
+ {
26
+ $key = strtolower($key);
27
+
28
+ if (isset($this->{$key})) {
29
+ return $this->{$key};
30
+ }
31
+
32
+ return null;
33
+ }
34
+
35
+ public function __call(string $key, $arguments)
36
+ {
37
+ if (Str::startsWith($key, 'get')) {
38
+ $property = strtolower(Str::replaceFirst('get', '', $key));
39
+
40
+ if (isset($this->{$property})) {
41
+ return $this->{$property};
42
+ }
43
+ }
44
+
45
+ if (Str::startsWith($key, 'set')) {
46
+ $property = strtolower(Str::replaceFirst('set', '', $key));
47
+
48
+ $this->{$property} = $arguments[0];
49
+
50
+ return $this;
51
+ }
52
+
53
+ return null;
54
+ }
55
+
56
+ public static function logo(string $code): string
57
+ {
58
+ return Utils::assetFromFleetbase('integrated-vendors/' . $code . '.png');
59
+ }
60
+
61
+ public function setIntegratedVendor(IntegratedVendor $vendor)
62
+ {
63
+ $this->vendor = $vendor;
64
+
65
+ return $this;
66
+ }
67
+
68
+ public function getBridgeParams()
69
+ {
70
+ return $this->bridgeParams;
71
+ }
72
+
73
+ public function resolveBridgeParams()
74
+ {
75
+ $bridgeParams = $this->getBridgeParams();
76
+ $resolvedParams = $this->resolveIntegratedVendorParams($bridgeParams);
77
+
78
+ return $resolvedParams;
79
+ }
80
+
81
+ public function resolveIntegratedVendorParams($params = [])
82
+ {
83
+ $resolvedParams = [];
84
+
85
+ foreach ($params as $key => $path) {
86
+ if (!$this->vendor || !Utils::isset($this->vendor, $path)) {
87
+ continue;
88
+ }
89
+
90
+ if ($key === 'sandbox') {
91
+ $resolvedParams[$key] = Utils::castBoolean(data_get($this->vendor, $path));
92
+ continue;
93
+ }
94
+
95
+ $resolvedParams[$key] = data_get($this->vendor, $path);
96
+ }
97
+
98
+ return $resolvedParams;
99
+ }
100
+
101
+ public function getBridgeInstance()
102
+ {
103
+ if (!$this->bridge) {
104
+ return null;
105
+ }
106
+
107
+ $params = $this->resolveBridgeParams();
108
+
109
+ return app($this->bridge, $params);
110
+ }
111
+
112
+ public function getServiceBridgeInstance()
113
+ {
114
+ if (!$this->svc_bridge) {
115
+ return null;
116
+ }
117
+
118
+ return app($this->svc_bridge);
119
+ }
120
+
121
+ public function getServiceTypes()
122
+ {
123
+ if ($this->svc_bridge) {
124
+ return $this->svc_bridge::all();
125
+ }
126
+
127
+ return [];
128
+ }
129
+
130
+ public function geIso2ccBridgeInstance()
131
+ {
132
+ if (!$this->iso2cc_bridge) {
133
+ return null;
134
+ }
135
+
136
+ return app($this->iso2cc_bridge);
137
+ }
138
+
139
+ public function getCountries()
140
+ {
141
+ if ($this->iso2cc_bridge) {
142
+ return $this->iso2cc_bridge::codes();
143
+ }
144
+
145
+ return [];
146
+ }
147
+
148
+ public function getLogo()
149
+ {
150
+ return static::logo($this->code);
151
+ }
152
+
153
+ public function toArray()
154
+ {
155
+ return [
156
+ 'name' => $this->name,
157
+ 'code' => $this->code,
158
+ 'logo' => $this->getLogo(),
159
+ 'host' => $this->host,
160
+ 'sandbox' => $this->sandbox,
161
+ 'namespace' => $this->namespace,
162
+ 'credential_params' => $this->credentialParams,
163
+ 'option_params' => $this->optionParams,
164
+ ];
165
+ }
166
+
167
+ public function toJson()
168
+ {
169
+ return json_encode($this->toArray());
170
+ }
171
+
172
+ public function callback(string $callback = null, ...$callbackParams)
173
+ {
174
+ if (!is_string($callback)) {
175
+ return;
176
+ }
177
+
178
+ $callbacks = data_get($this->callbacks, $callback, []);
179
+ $api = $this->getBridgeInstance();
180
+
181
+ if (is_array($callbacks)) {
182
+ foreach ($callbacks as $callback => $params) {
183
+ $resolvedParams = $this->resolveIntegratedVendorParams($params);
184
+ $resolvedParams = array_filter(array_merge($callbackParams, $resolvedParams));
185
+
186
+ if (method_exists($api, $callback)) {
187
+ $api->{$callback}(...$resolvedParams);
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }
193
+
194
+ class IntegratedVendors
195
+ {
196
+ public static array $supported = [
197
+ [
198
+ 'name' => 'Lalamove',
199
+ 'code' => 'lalamove',
200
+ 'host' => 'https://rest.lalamove.com/',
201
+ 'sandbox' => 'https://rest.sandbox.lalamove.com/',
202
+ 'namespace' => 'v3',
203
+ 'bridge' => Lalamove::class,
204
+ 'svc_bridge' => LalamoveServiceType::class,
205
+ 'iso2cc_bridge' => LalamoveMarket::class,
206
+ 'credentialParams' => [
207
+ ['key' => 'api_key'],
208
+ ['key' => 'api_secret'],
209
+ ],
210
+ 'optionParams' => [
211
+ ['key' => 'market', 'options' => LalamoveMarket::markets, 'optionValue' => 'code', 'optionLabel' => 'key'],
212
+ ],
213
+ 'bridgeParams' => [
214
+ 'apiKey' => 'credentials.api_key',
215
+ 'apiSecret' => 'credentials.api_secret',
216
+ 'sandbox' => 'sandbox',
217
+ 'market' => 'options.market',
218
+ ],
219
+ 'callbacks' => [
220
+ 'onCreated' => [
221
+ 'setWebhook' => ['webhook_url'],
222
+ ],
223
+ 'onUpdated' => [
224
+ 'setWebhook' => ['webhook_url'],
225
+ ],
226
+ 'onDeleted' => [
227
+ 'cancelFromFleetbaseOrder' => [],
228
+ ],
229
+ 'onCanceled' => [
230
+ 'cancelFromFleetbaseOrder' => [],
231
+ ],
232
+ ],
233
+ ],
234
+ ];
235
+
236
+ public static function all()
237
+ {
238
+ return collect(static::$supported)->mapInto(ResolvedIntegratedVendor::class);
239
+ }
240
+
241
+ public static function find($code)
242
+ {
243
+ if (is_callable($code)) {
244
+ return static::all()->first($code);
245
+ }
246
+
247
+ if (is_string($code)) {
248
+ return static::all()->first(
249
+ function ($detail) use ($code) {
250
+ return isset($detail->code) && strtolower($detail->code) === strtolower($code);
251
+ }
252
+ );
253
+ }
254
+
255
+ return null;
256
+ }
257
+
258
+ public static function resolverFromIntegratedVendor(IntegratedVendor $vendor): ?ResolvedIntegratedVendor
259
+ {
260
+ return static::find($vendor->provider)->setIntegratedVendor($vendor);
261
+ }
262
+
263
+ public static function bridgeFromIntegratedVendor(IntegratedVendor $vendor)
264
+ {
265
+ $resolver = static::resolverFromIntegratedVendor($vendor);
266
+ $params = $resolver->resolveBridgeParams();
267
+
268
+ $api = app($resolver->bridge, $params);
269
+
270
+ if (method_exists($api, 'setIntegratedVendor')) {
271
+ $api->setIntegratedVendor($vendor);
272
+ }
273
+
274
+ return $api;
275
+ }
276
+
277
+ public static function getServiceTypes(IntegratedVendor $vendor)
278
+ {
279
+ $resolver = static::resolverFromIntegratedVendor($vendor);
280
+
281
+ if ($resolver->svc_bridge) {
282
+ return $resolver->svc_bridge::all();
283
+ }
284
+
285
+ return [];
286
+ }
287
+ }