@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,345 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
+ use Fleetbase\FleetOps\Models\Entity;
7
+ use Fleetbase\FleetOps\Models\IntegratedVendor;
8
+ use Fleetbase\FleetOps\Models\Payload;
9
+ use Fleetbase\FleetOps\Models\Place;
10
+ use Fleetbase\FleetOps\Models\ServiceQuote;
11
+ use Fleetbase\FleetOps\Models\ServiceQuoteItem;
12
+ use Fleetbase\FleetOps\Models\ServiceRate;
13
+ use Fleetbase\FleetOps\Support\Utils;
14
+ use Illuminate\Http\Request;
15
+ use Illuminate\Support\Facades\DB;
16
+ use Illuminate\Support\Str;
17
+
18
+ class ServiceQuoteController extends FleetOpsController
19
+ {
20
+ /**
21
+ * The resource to query.
22
+ *
23
+ * @var string
24
+ */
25
+ public $resource = 'service_quote';
26
+
27
+ /**
28
+ * Query service quotes based on payload from order.
29
+ *
30
+ * @return \Illuminate\Http\Response
31
+ */
32
+ public function queryRecord(Request $request)
33
+ {
34
+ $payload = $request->input('payload');
35
+ $currency = $request->input('currency');
36
+ $facilitator = $request->input('facilitator');
37
+ $scheduledAt = $request->input('scheduled_at');
38
+ $service = $request->input('service', 'all'); // the specific service rate to query - defaults to `all`
39
+ $serviceType = $request->input('service_type'); // the specific type of service rate to query
40
+ $single = $request->boolean('single');
41
+ $isRouteOptimized = $request->boolean('is_route_optimized', true);
42
+
43
+ $requestId = ServiceQuote::generatePublicId('request');
44
+
45
+ if (is_string($payload)) {
46
+ $payload = Payload::with(['pickup', 'dropoff', 'waypoints', 'entities'])
47
+ ->where('public_id', $payload)
48
+ ->orWhere('uuid', $payload)
49
+ ->first();
50
+ }
51
+
52
+ if (!$payload instanceof Payload) {
53
+ return $this->preliminaryQuery($request);
54
+ }
55
+
56
+ // if facilitator is an integrated partner resolve service quotes from bridge
57
+ if ($facilitator && Str::startsWith($facilitator, 'integrated_vendor')) {
58
+ $integratedVendor = IntegratedVendor::where('public_id', $facilitator)->first();
59
+ $serviceQuotes = [];
60
+
61
+ if ($integratedVendor) {
62
+ try {
63
+ $serviceQuotes = $integratedVendor->api()->setRequestId($requestId)->getQuoteFromPayload($payload, $serviceType, $scheduledAt, $isRouteOptimized);
64
+ } catch (\Exception $e) {
65
+ return response()->json([
66
+ 'errors' => [$e->getMessage()],
67
+ ], 400);
68
+ }
69
+ }
70
+
71
+ // send single quote back
72
+ if ($single) {
73
+ return response()->json($serviceQuotes);
74
+ }
75
+
76
+ if (!is_array($serviceQuotes)) {
77
+ $serviceQuotes = [$serviceQuotes];
78
+ }
79
+
80
+ return response()->json($serviceQuotes);
81
+ }
82
+
83
+ // get all waypoints
84
+ $waypoints = $payload->getAllStops()->mapInto(Place::class);
85
+
86
+ // if quote for single service
87
+ if ($service && $service !== 'all') {
88
+ $serviceRate = ServiceRate::where('uuid', $service)->where(function ($q) use ($currency) {
89
+ if ($currency) {
90
+ $q->where(DB::raw('lower(currency)'), strtolower($currency));
91
+ }
92
+ })->first();
93
+ $serviceQuotes = [];
94
+
95
+ if ($serviceRate) {
96
+ [$subTotal, $lines] = $serviceRate->quote($payload);
97
+
98
+ $quote = ServiceQuote::create([
99
+ 'request_id' => $requestId,
100
+ 'company_uuid' => $serviceRate->company_uuid,
101
+ 'service_rate_uuid' => $serviceRate->uuid,
102
+ 'amount' => $subTotal,
103
+ 'currency' => $serviceRate->currency,
104
+ ]);
105
+
106
+ $items = $lines->map(function ($line) use ($quote) {
107
+ return ServiceQuoteItem::create([
108
+ 'service_quote_uuid' => $quote->uuid,
109
+ 'amount' => $line['amount'],
110
+ 'currency' => $line['currency'],
111
+ 'details' => $line['details'],
112
+ 'code' => $line['code'],
113
+ ]);
114
+ });
115
+
116
+ $quote->setRelation('items', $items);
117
+
118
+ // if single quotation requested
119
+ if ($single) {
120
+ return response()->json($quote);
121
+ }
122
+
123
+ $serviceQuotes[] = $quote;
124
+
125
+ return response()->json($serviceQuotes);
126
+ }
127
+ }
128
+
129
+ // get all service rates
130
+ $serviceRates = ServiceRate::getServicableForPlaces(
131
+ $waypoints,
132
+ $serviceType,
133
+ $currency,
134
+ function ($query) use ($request) {
135
+ $query->where('company_uuid', $request->session()->get('company'));
136
+ }
137
+ );
138
+ $serviceQuotes = collect();
139
+
140
+ // calculate quotes
141
+ foreach ($serviceRates as $serviceRate) {
142
+ [$subTotal, $lines] = $serviceRate->quote($payload);
143
+
144
+ $quote = ServiceQuote::create([
145
+ 'request_id' => $requestId,
146
+ 'company_uuid' => $serviceRate->company_uuid,
147
+ 'service_rate_uuid' => $serviceRate->uuid,
148
+ 'amount' => $subTotal,
149
+ 'currency' => $serviceRate->currency,
150
+ ]);
151
+
152
+ $items = $lines->map(function ($line) use ($quote) {
153
+ return ServiceQuoteItem::create([
154
+ 'service_quote_uuid' => $quote->uuid,
155
+ 'amount' => $line['amount'],
156
+ 'currency' => $line['currency'],
157
+ 'details' => $line['details'],
158
+ 'code' => $line['code'],
159
+ ]);
160
+ });
161
+
162
+ $quote->setRelation('items', $items);
163
+ $serviceQuotes->push($quote);
164
+ }
165
+
166
+ // if single quotation requested
167
+ if ($single) {
168
+ // find the best quotation
169
+ $bestQuote = $serviceQuotes->sortBy('amount')->first();
170
+
171
+ return response()->json($bestQuote);
172
+ }
173
+
174
+ return response()->json($serviceQuotes);
175
+ }
176
+
177
+ /**
178
+ * Query service quotes based on preliminary payload from order.
179
+ *
180
+ * @return \Illuminate\Http\Response
181
+ */
182
+ public function preliminaryQuery(Request $request)
183
+ {
184
+ $facilitator = $request->input('facilitator');
185
+ $scheduledAt = $request->input('scheduled_at');
186
+ $service = $request->input('service', 'all'); // the specific service rate to query - defaults to `all`
187
+ $serviceType = $request->input('service_type'); // the specific type of service rate to query
188
+ $isCashOnDelivery = $request->has('cod');
189
+ $currency = $request->has('currency');
190
+ $totalDistance = $request->input('distance');
191
+ $totalTime = $request->input('time');
192
+ $pickup = $request->or(['payload.pickup', 'payload.pickup_uuid', 'pickup']);
193
+ $dropoff = $request->or(['payload.dropoff', 'payload.dropoff_uuid', 'dropoff']);
194
+ $waypoints = $request->or(['payload.waypoints', 'waypoints'], []);
195
+ $entities = $request->or(['payload.entities', 'entities']);
196
+ $single = $request->boolean('single');
197
+ $isRouteOptimized = $request->boolean('is_route_optimized', true);
198
+
199
+ $requestId = ServiceQuote::generatePublicId('request');
200
+ $serviceQuotes = [];
201
+
202
+ if (Utils::isNotScalar($pickup)) {
203
+ $pickup = Place::createFromMixed($pickup);
204
+ }
205
+
206
+ if (Utils::isNotScalar($dropoff)) {
207
+ $dropoff = Place::createFromMixed($dropoff);
208
+ }
209
+
210
+ if (Str::isUuid($pickup)) {
211
+ $pickup = Place::where('uuid', $pickup)->first();
212
+ }
213
+
214
+ if (Str::isUuid($dropoff)) {
215
+ $dropoff = Place::where('uuid', $dropoff)->first();
216
+ }
217
+
218
+ // convert waypoints to place instances
219
+ $waypoints = collect($waypoints)->mapInto(Place::class);
220
+ $entities = collect($entities)->mapInto(Entity::class);
221
+
222
+ // should all be Place like
223
+ $waypoints = collect([$pickup, ...$waypoints, $dropoff])->filter();
224
+
225
+ // if facilitator is an integrated partner resolve service quotes from bridge
226
+ if ($facilitator && Str::startsWith($facilitator, 'integrated_vendor')) {
227
+ $integratedVendor = IntegratedVendor::where('public_id', $facilitator)->orWhere('provider', $facilitator)->first();
228
+
229
+ if ($integratedVendor) {
230
+ try {
231
+ $serviceQuotes = $integratedVendor->api()->setRequestId($requestId)->getQuoteFromPreliminaryPayload($waypoints, $entities, $serviceType, $scheduledAt, $isRouteOptimized);
232
+ } catch (\Exception $e) {
233
+ return response()->json([
234
+ 'errors' => [$e->getMessage()],
235
+ ], 400);
236
+ }
237
+ }
238
+
239
+ // send single quote back
240
+ if ($single) {
241
+ return response()->json($serviceQuotes);
242
+ }
243
+
244
+ if (!is_array($serviceQuotes)) {
245
+ $serviceQuotes = [$serviceQuotes];
246
+ }
247
+
248
+ return response()->json($serviceQuotes);
249
+ }
250
+
251
+ // if no total distance recalculate totalDistance and totalTime based on waypoints collected
252
+ if (!$totalDistance) {
253
+ $matrix = Utils::distanceMatrix([$waypoints->first()], $waypoints->skip(1)->values());
254
+
255
+ // set totalDistance and totalTime
256
+ $totalDistance = $matrix->distance ?? 0;
257
+ $totalTime = $matrix->time ?? 0;
258
+ }
259
+
260
+ // if quote for single service
261
+ if ($service && $service !== 'all') {
262
+ $serviceRate = ServiceRate::where('uuid', $service)->first();
263
+ $serviceQuotes = collect();
264
+
265
+ if ($serviceRate) {
266
+ [$subTotal, $lines] = $serviceRate->quoteFromPreliminaryData($entities, $waypoints, $totalDistance, $totalTime, $isCashOnDelivery);
267
+
268
+ $quote = ServiceQuote::create([
269
+ 'request_id' => $requestId,
270
+ 'company_uuid' => $serviceRate->company_uuid,
271
+ 'service_rate_uuid' => $serviceRate->uuid,
272
+ 'amount' => $subTotal,
273
+ 'currency' => $serviceRate->currency,
274
+ ]);
275
+
276
+ $items = $lines->map(function ($line) use ($quote) {
277
+ return ServiceQuoteItem::create([
278
+ 'service_quote_uuid' => $quote->uuid,
279
+ 'amount' => $line['amount'],
280
+ 'currency' => $line['currency'],
281
+ 'details' => $line['details'],
282
+ 'code' => $line['code'],
283
+ ]);
284
+ });
285
+
286
+ $quote->setRelation('items', $items);
287
+ $serviceQuotes->push($quote);
288
+
289
+ // if requesting single
290
+ if ($single) {
291
+ return response()->json($quote);
292
+ }
293
+
294
+ return response()->json($serviceQuotes);
295
+ }
296
+ }
297
+
298
+ // get all service rates
299
+ $serviceRates = ServiceRate::getServicableForPlaces(
300
+ $waypoints,
301
+ $serviceType,
302
+ $currency,
303
+ function ($query) use ($request) {
304
+ $query->where('company_uuid', $request->session()->get('company'));
305
+ }
306
+ );
307
+ $serviceQuotes = collect();
308
+
309
+ // calculate quotes
310
+ foreach ($serviceRates as $serviceRate) {
311
+ [$subTotal, $lines] = $serviceRate->quoteFromPreliminaryData($entities, $waypoints, $totalDistance, $totalTime, $isCashOnDelivery);
312
+
313
+ $quote = ServiceQuote::create([
314
+ 'request_id' => $requestId,
315
+ 'company_uuid' => $serviceRate->company_uuid,
316
+ 'service_rate_uuid' => $serviceRate->uuid,
317
+ 'amount' => $subTotal,
318
+ 'currency' => $serviceRate->currency,
319
+ ]);
320
+
321
+ $items = $lines->map(function ($line) use ($quote) {
322
+ return ServiceQuoteItem::create([
323
+ 'service_quote_uuid' => $quote->uuid,
324
+ 'amount' => $line['amount'],
325
+ 'currency' => $line['currency'],
326
+ 'details' => $line['details'],
327
+ 'code' => $line['code'],
328
+ ]);
329
+ });
330
+
331
+ $quote->setRelation('items', $items);
332
+ $serviceQuotes->push($quote);
333
+ }
334
+
335
+ // if single quotation requested
336
+ if ($single) {
337
+ // find the best quotation
338
+ $bestQuote = $serviceQuotes->sortBy('amount')->first();
339
+
340
+ return response()->json($bestQuote);
341
+ }
342
+
343
+ return response()->json($serviceQuotes);
344
+ }
345
+ }
@@ -0,0 +1,47 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Brick\Geo\Point;
6
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
7
+ use Fleetbase\FleetOps\Models\ServiceRate;
8
+ use Illuminate\Http\Request;
9
+
10
+ class ServiceRateController extends FleetOpsController
11
+ {
12
+ /**
13
+ * The resource to query.
14
+ *
15
+ * @var string
16
+ */
17
+ public $resource = 'service_rate';
18
+
19
+ /**
20
+ * Creates a record with request payload.
21
+ *
22
+ * @return \Illuminate\Http\Response
23
+ */
24
+ public function getServicesForRoute(Request $request)
25
+ {
26
+ $coordinates = explode(';', $request->input('coordinates')); // ex. 1.3621663,103.8845049;1.353151,103.86458
27
+
28
+ // convert coordinates to points
29
+ $waypoints = collect($coordinates)->map(
30
+ function ($coord) {
31
+ $coord = explode(',', $coord);
32
+ [$latitude, $longitude] = $coord;
33
+
34
+ return Point::fromText("POINT($longitude $latitude)", 4326);
35
+ }
36
+ );
37
+
38
+ $applicableServiceRates = ServiceRate::getServicableForWaypoints(
39
+ $waypoints,
40
+ function ($query) use ($request) {
41
+ $query->where('company_uuid', $request->session()->get('company'));
42
+ }
43
+ );
44
+
45
+ return response()->json($applicableServiceRates);
46
+ }
47
+ }
@@ -0,0 +1,30 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\Http\Controllers\Controller;
6
+ use Fleetbase\Models\Setting;
7
+ use Illuminate\Http\Request;
8
+
9
+ /**
10
+ * Class SettingController.
11
+ */
12
+ class SettingController extends Controller
13
+ {
14
+ public function getVisibilitySettings()
15
+ {
16
+ $visibilitySettings = Setting::where('key', 'fleet-ops.visibility')->value('value');
17
+
18
+ return response()->json(['visibilitySettings' => $visibilitySettings]);
19
+ }
20
+
21
+ public function saveVisibilitySettings(Request $request)
22
+ {
23
+ $visibilitySettings = $request->input('visibilitySettings', []);
24
+
25
+ // save settings
26
+ Setting::configure('fleet-ops.visibility', $visibilitySettings);
27
+
28
+ return response()->json(['visibilitySettings' => $visibilitySettings]);
29
+ }
30
+ }
@@ -0,0 +1,15 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
+
7
+ class TrackingNumberController extends FleetOpsController
8
+ {
9
+ /**
10
+ * The resource to query.
11
+ *
12
+ * @var string
13
+ */
14
+ public $resource = 'tracking_number';
15
+ }
@@ -0,0 +1,15 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
+
7
+ class TrackingStatusController extends FleetOpsController
8
+ {
9
+ /**
10
+ * The resource to query.
11
+ *
12
+ * @var string
13
+ */
14
+ public $resource = 'tracking_status';
15
+ }
@@ -0,0 +1,65 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\FleetOps\Exports\VehicleExport;
6
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
7
+ use Fleetbase\FleetOps\Models\Vehicle;
8
+ use Fleetbase\Http\Requests\ExportRequest;
9
+ use Illuminate\Support\Facades\DB;
10
+ use Illuminate\Support\Str;
11
+ use Maatwebsite\Excel\Facades\Excel;
12
+
13
+ class VehicleController extends FleetOpsController
14
+ {
15
+ /**
16
+ * The resource to query.
17
+ *
18
+ * @var string
19
+ */
20
+ public $resource = 'vehicle';
21
+
22
+ /**
23
+ * Get all status options for an vehicle.
24
+ *
25
+ * @return \Illuminate\Http\Response
26
+ */
27
+ public function statuses()
28
+ {
29
+ $statuses = DB::table('vehicles')
30
+ ->select('status')
31
+ ->where('company_uuid', session('company'))
32
+ ->distinct()
33
+ ->get()
34
+ ->pluck('status')
35
+ ->filter()
36
+ ->values();
37
+
38
+ return response()->json($statuses);
39
+ }
40
+
41
+ /**
42
+ * Get all avatar options for an vehicle.
43
+ *
44
+ * @return \Illuminate\Http\Response
45
+ */
46
+ public function avatars()
47
+ {
48
+ $options = Vehicle::getAvatarOptions();
49
+
50
+ return response()->json($options);
51
+ }
52
+
53
+ /**
54
+ * Export the vehicles to excel or csv.
55
+ *
56
+ * @return \Illuminate\Http\Response
57
+ */
58
+ public static function export(ExportRequest $request)
59
+ {
60
+ $format = $request->input('format', 'xlsx');
61
+ $fileName = trim(Str::slug('vehicles-' . date('Y-m-d-H:i')) . '.' . $format);
62
+
63
+ return Excel::download(new VehicleExport(), $fileName);
64
+ }
65
+ }
@@ -0,0 +1,15 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
+
7
+ class VehicleDeviceController extends FleetOpsController
8
+ {
9
+ /**
10
+ * The resource to query.
11
+ *
12
+ * @var string
13
+ */
14
+ public $resource = 'vehicle_device';
15
+ }
@@ -0,0 +1,120 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\FleetOps\Exports\VendorExport;
6
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
7
+ use Fleetbase\FleetOps\Models\Vendor;
8
+ use Fleetbase\Http\Requests\ExportRequest;
9
+ use Fleetbase\Http\Requests\Internal\BulkDeleteRequest;
10
+ use Illuminate\Support\Facades\DB;
11
+ use Illuminate\Support\Str;
12
+ use Maatwebsite\Excel\Facades\Excel;
13
+
14
+ class VendorController extends FleetOpsController
15
+ {
16
+ /**
17
+ * The resource to query.
18
+ *
19
+ * @var string
20
+ */
21
+ public $resource = 'vendor';
22
+
23
+ /**
24
+ * Returns the vendor as a `facilitator-vendor`.
25
+ *
26
+ * @var string id
27
+ */
28
+ public function getAsFacilitator($id)
29
+ {
30
+ $vendor = Vendor::where('uuid', $id)->withTrashed()->first();
31
+
32
+ if (!$vendor) {
33
+ return response()->error('Facilitator not found.');
34
+ }
35
+
36
+ return response()->json([
37
+ 'facilitatorVendor' => $vendor,
38
+ ]);
39
+ }
40
+
41
+ /**
42
+ * Returns the vendor as a `customer-vendor`.
43
+ *
44
+ * @var string id
45
+ */
46
+ public function getAsCustomer($id)
47
+ {
48
+ $vendor = Vendor::where('uuid', $id)->withTrashed()->first();
49
+
50
+ if (!$vendor) {
51
+ return response()->error('Customer not found.');
52
+ }
53
+
54
+ return response()->json([
55
+ 'customerVendor' => $vendor,
56
+ ]);
57
+ }
58
+
59
+ /**
60
+ * Export the vendors to excel or csv.
61
+ *
62
+ * @return \Illuminate\Http\Response
63
+ */
64
+ public static function export(ExportRequest $request)
65
+ {
66
+ $format = $request->input('format', 'xlsx');
67
+ $fileName = trim(Str::slug('vendors-' . date('Y-m-d-H:i')) . '.' . $format);
68
+
69
+ return Excel::download(new VendorExport(), $fileName);
70
+ }
71
+
72
+ /**
73
+ * Bulk delete resources.
74
+ *
75
+ * @return \Illuminate\Http\Response
76
+ */
77
+ public function bulkDelete(BulkDeleteRequest $request)
78
+ {
79
+ $ids = $request->input('ids', []);
80
+
81
+ if (!$ids) {
82
+ return response()->error('Nothing to delete.');
83
+ }
84
+
85
+ /** @var \Fleetbase\Models\Vendor */
86
+ $count = Vendor::whereIn('uuid', $ids)->count();
87
+ $deleted = Vendor::whereIn('uuid', $ids)->delete();
88
+
89
+ if (!$deleted) {
90
+ return response()->error('Failed to bulk delete vendors.');
91
+ }
92
+
93
+ return response()->json(
94
+ [
95
+ 'status' => 'OK',
96
+ 'message' => 'Deleted ' . $count . ' vendors',
97
+ ],
98
+ 200
99
+ );
100
+ }
101
+
102
+ /**
103
+ * Get all status options for an vehicle.
104
+ *
105
+ * @return \Illuminate\Http\Response
106
+ */
107
+ public function statuses()
108
+ {
109
+ $statuses = DB::table('vendors')
110
+ ->select('status')
111
+ ->where('company_uuid', session('company'))
112
+ ->distinct()
113
+ ->get()
114
+ ->pluck('status')
115
+ ->filter()
116
+ ->values();
117
+
118
+ return response()->json($statuses);
119
+ }
120
+ }
@@ -0,0 +1,15 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
+
5
+ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
+
7
+ class ZoneController extends FleetOpsController
8
+ {
9
+ /**
10
+ * The resource to query.
11
+ *
12
+ * @var string
13
+ */
14
+ public $resource = 'zone';
15
+ }