@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,543 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Models;
4
+
5
+ use Fleetbase\Casts\Json;
6
+ use Fleetbase\FleetOps\Casts\Point;
7
+ use Fleetbase\FleetOps\Scopes\DriverScope;
8
+ use Fleetbase\FleetOps\Support\Utils;
9
+ use Fleetbase\FleetOps\Support\Utils as FleetOpsUtils;
10
+ use Fleetbase\Models\Model;
11
+ use Fleetbase\Traits\HasApiModelBehavior;
12
+ use Fleetbase\Traits\HasInternalId;
13
+ use Fleetbase\Traits\HasPublicId;
14
+ use Fleetbase\Traits\HasUuid;
15
+ use Fleetbase\Traits\SendsWebhooks;
16
+ use Fleetbase\Traits\TracksApiCredential;
17
+ use Grimzy\LaravelMysqlSpatial\Eloquent\SpatialTrait;
18
+ use Illuminate\Broadcasting\Channel;
19
+ use Illuminate\Notifications\Notifiable;
20
+ use Illuminate\Support\Facades\DB;
21
+ use Spatie\Activitylog\Traits\CausesActivity;
22
+ use Spatie\Activitylog\Traits\LogsActivity;
23
+ use Spatie\Sluggable\HasSlug;
24
+ use Spatie\Sluggable\SlugOptions;
25
+
26
+ class Driver extends Model
27
+ {
28
+ use HasUuid;
29
+ use HasPublicId;
30
+ use HasInternalId;
31
+ use TracksApiCredential;
32
+ use HasApiModelBehavior;
33
+ use Notifiable;
34
+ use SendsWebhooks;
35
+ use SpatialTrait;
36
+ use HasSlug;
37
+ use LogsActivity;
38
+ use CausesActivity;
39
+
40
+ /**
41
+ * The database table used by the model.
42
+ *
43
+ * @var string
44
+ */
45
+ protected $table = 'drivers';
46
+
47
+ /**
48
+ * The type of public Id to generate.
49
+ *
50
+ * @var string
51
+ */
52
+ protected $publicIdType = 'driver';
53
+
54
+ /**
55
+ * The attributes that can be queried.
56
+ *
57
+ * @var array
58
+ */
59
+ protected $searchableColumns = ['drivers_license_number', 'user.name', 'user.email', 'user.phone'];
60
+
61
+ /**
62
+ * The attributes that are mass assignable.
63
+ *
64
+ * @var array
65
+ */
66
+ protected $fillable = [
67
+ '_key',
68
+ 'public_id',
69
+ 'internal_id',
70
+ 'user_uuid',
71
+ 'company_uuid',
72
+ 'vehicle_uuid',
73
+ 'vendor_uuid',
74
+ 'current_job_uuid',
75
+ 'auth_token',
76
+ 'signup_token_used',
77
+ 'drivers_license_number',
78
+ 'location',
79
+ 'heading',
80
+ 'bearing',
81
+ 'altitude',
82
+ 'speed',
83
+ 'country',
84
+ 'currency',
85
+ 'city',
86
+ 'online',
87
+ 'slug',
88
+ 'status',
89
+ ];
90
+
91
+ /**
92
+ * The attributes that are spatial columns.
93
+ *
94
+ * @var array
95
+ */
96
+ protected $spatialFields = ['location'];
97
+
98
+ /**
99
+ * The attributes that should be cast to native types.
100
+ *
101
+ * @var array
102
+ */
103
+ protected $casts = [
104
+ 'meta' => Json::class,
105
+ 'location' => Point::class,
106
+ 'online' => 'boolean',
107
+ ];
108
+
109
+ /**
110
+ * Relationships to auto load with driver.
111
+ *
112
+ * @var array
113
+ */
114
+ protected $with = [];
115
+
116
+ /**
117
+ * Dynamic attributes that are appended to object.
118
+ *
119
+ * @var array
120
+ */
121
+ protected $appends = [
122
+ 'current_job_id',
123
+ 'vehicle_id',
124
+ 'vendor_id',
125
+ 'photo_url',
126
+ 'name',
127
+ 'phone',
128
+ 'email',
129
+ 'rotation',
130
+ 'vehicle_name',
131
+ 'vehicle_avatar',
132
+ 'vendor_name',
133
+ ];
134
+
135
+ /**
136
+ * The attributes excluded from the model's JSON form.
137
+ *
138
+ * @var array
139
+ */
140
+ protected $hidden = ['currentJob', 'vendor', 'vehicle', 'user', 'latitude', 'longitude', 'auth_token'];
141
+
142
+ /**
143
+ * Attributes that is filterable on this model.
144
+ *
145
+ * @var array
146
+ */
147
+ protected $filterParams = ['vendor', 'facilitator', 'customer', 'fleet'];
148
+
149
+ /**
150
+ * Properties which activity needs to be logged.
151
+ *
152
+ * @var array
153
+ */
154
+ protected static $logAttributes = '*';
155
+
156
+ /**
157
+ * Do not log empty changed.
158
+ *
159
+ * @var bool
160
+ */
161
+ protected static $submitEmptyLogs = false;
162
+
163
+ /**
164
+ * The name of the subject to log.
165
+ *
166
+ * @var string
167
+ */
168
+ protected static $logName = 'driver';
169
+
170
+ /**
171
+ * Get the options for generating the slug.
172
+ */
173
+ public function getSlugOptions(): SlugOptions
174
+ {
175
+ return SlugOptions::create()
176
+ ->generateSlugsFrom('drivers_license_number')
177
+ ->saveSlugsTo('slug');
178
+ }
179
+
180
+ /**
181
+ * The "booting" method of the model.
182
+ *
183
+ * @return void
184
+ */
185
+ protected static function boot()
186
+ {
187
+ parent::boot();
188
+ static::addGlobalScope(new DriverScope());
189
+ }
190
+
191
+ /**
192
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
193
+ */
194
+ public function user()
195
+ {
196
+ return $this->belongsTo(\Fleetbase\Models\User::class)->select(['uuid', 'avatar_uuid', 'name', 'phone', 'email'])->without(['driver'])->withTrashed();
197
+ }
198
+
199
+ /**
200
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
201
+ */
202
+ public function company()
203
+ {
204
+ return $this->belongsTo(\Fleetbase\Models\Company::class);
205
+ }
206
+
207
+ /**
208
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
209
+ */
210
+ public function vehicle()
211
+ {
212
+ return $this->belongsTo(Vehicle::class)->select([
213
+ 'uuid',
214
+ 'public_id',
215
+ 'year',
216
+ 'make',
217
+ 'model',
218
+ 'model_data',
219
+ 'vin_data',
220
+ 'telematics',
221
+ 'meta',
222
+ 'trim',
223
+ 'plate_number',
224
+ DB::raw("CONCAT(vehicles.year, ' ', vehicles.make, ' ', vehicles.model, ' ', vehicles.trim, ' ', vehicles.plate_number) AS display_name"),
225
+ ]);
226
+ }
227
+
228
+ /**
229
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
230
+ */
231
+ public function vendor()
232
+ {
233
+ return $this->belongsTo(Vendor::class)->select(['id', 'uuid', 'public_id', 'name']);
234
+ }
235
+
236
+ /**
237
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
238
+ */
239
+ public function currentJob()
240
+ {
241
+ return $this->belongsTo(Order::class)->select(['id', 'uuid', 'public_id', 'payload_uuid', 'driver_assigned_uuid'])->without(['driver']);
242
+ }
243
+
244
+ /**
245
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
246
+ */
247
+ public function currentOrder()
248
+ {
249
+ return $this->belongsTo(Order::class, 'current_job_uuid')->select(['id', 'uuid', 'public_id', 'payload_uuid', 'driver_assigned_uuid'])->without(['driver']);
250
+ }
251
+
252
+ /**
253
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
254
+ */
255
+ public function jobs()
256
+ {
257
+ return $this->hasMany(Order::class, 'driver_assigned_uuid')->without(['driver']);
258
+ }
259
+
260
+ /**
261
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
262
+ */
263
+ public function orders()
264
+ {
265
+ return $this->hasMany(Order::class, 'driver_assigned_uuid')->without(['driver']);
266
+ }
267
+
268
+ /**
269
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
270
+ */
271
+ public function pings()
272
+ {
273
+ return $this->hasMany(Ping::class);
274
+ }
275
+
276
+ /**
277
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
278
+ */
279
+ public function positions()
280
+ {
281
+ return $this->hasMany(Position::class, 'subject_uuid');
282
+ }
283
+
284
+ /**
285
+ * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough
286
+ */
287
+ public function fleets()
288
+ {
289
+ return $this->hasManyThrough(Fleet::class, FleetDriver::class, 'driver_uuid', 'uuid', 'uuid', 'fleet_uuid');
290
+ }
291
+
292
+ /**
293
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
294
+ */
295
+ public function devices()
296
+ {
297
+ return $this->hasMany(\Fleetbase\Models\UserDevice::class, 'user_uuid', 'user_uuid');
298
+ }
299
+
300
+ /**
301
+ * Specifies the user's FCM tokens.
302
+ *
303
+ * @return array
304
+ */
305
+ public function routeNotificationForFcm()
306
+ {
307
+ return $this->devices
308
+ ->where('platform', 'android')->map(
309
+ function ($userDevice) {
310
+ return $userDevice->token;
311
+ }
312
+ )
313
+ ->toArray();
314
+ }
315
+
316
+ /**
317
+ * Specifies the user's APNS tokens.
318
+ *
319
+ * @return array
320
+ */
321
+ public function routeNotificationForApn()
322
+ {
323
+ return $this->devices
324
+ ->where('platform', 'ios')->map(
325
+ function ($userDevice) {
326
+ return $userDevice->token;
327
+ }
328
+ )->toArray();
329
+ }
330
+
331
+ /**
332
+ * The channels the driver receives notification broadcasts on.
333
+ *
334
+ * @param \Illuminate\Notifications\Notification $notification
335
+ *
336
+ * @return array
337
+ */
338
+ public function receivesBroadcastNotificationsOn($notification)
339
+ {
340
+ return new Channel('driver.' . $this->public_id);
341
+ }
342
+
343
+ /**
344
+ * Get the drivers rotation.
345
+ */
346
+ public function getRotationAttribute()
347
+ {
348
+ return round($this->heading / 360 + 180);
349
+ }
350
+
351
+ /**
352
+ * Get assigned vehicle assigned name.
353
+ */
354
+ public function getCurrentJobIdAttribute()
355
+ {
356
+ return data_get($this, 'currentJob.public_id');
357
+ }
358
+
359
+ /**
360
+ * Get assigned vehicle assigned name.
361
+ */
362
+ public function getVehicleNameAttribute()
363
+ {
364
+ return data_get($this, 'vehicle.display_name');
365
+ }
366
+
367
+ /**
368
+ * Get assigned vehicles public ID.
369
+ */
370
+ public function getVehicleIdAttribute()
371
+ {
372
+ return data_get($this, 'vehicle.public_id');
373
+ }
374
+
375
+ /**
376
+ * Get assigned vehicles public ID.
377
+ */
378
+ public function getVehicleAvatarAttribute()
379
+ {
380
+ if ($this->isVehicleNotAssigned()) {
381
+ return Vehicle::getAvatar();
382
+ }
383
+
384
+ return data_get($this, 'vehicle.avatar_url');
385
+ }
386
+
387
+ /**
388
+ * Get drivers vendor ID.
389
+ */
390
+ public function getVendorIdAttribute()
391
+ {
392
+ return data_get($this, 'vendor.public_id');
393
+ }
394
+
395
+ /**
396
+ * Get drivers vendor name.
397
+ */
398
+ public function getVendorNameAttribute()
399
+ {
400
+ return data_get($this, 'vendor.name');
401
+ }
402
+
403
+ /**
404
+ * Get drivers photo URL attribute.
405
+ */
406
+ public function getPhotoAttribute()
407
+ {
408
+ return data_get($this, 'user.avatar');
409
+ }
410
+
411
+ /**
412
+ * Get drivers photo URL attribute.
413
+ */
414
+ public function getPhotoUrlAttribute()
415
+ {
416
+ return data_get($this, 'user.avatarUrl');
417
+ }
418
+
419
+ /**
420
+ * Get drivers name.
421
+ */
422
+ public function getNameAttribute()
423
+ {
424
+ return data_get($this, 'user.name');
425
+ }
426
+
427
+ /**
428
+ * Get drivers phone number.
429
+ */
430
+ public function getPhoneAttribute()
431
+ {
432
+ return data_get($this, 'user.phone');
433
+ }
434
+
435
+ /**
436
+ * Get drivers email.
437
+ */
438
+ public function getEmailAttribute()
439
+ {
440
+ return data_get($this, 'user.email');
441
+ }
442
+
443
+ /**
444
+ * Unassigns the current order from the driver if a driver is assigned.
445
+ *
446
+ * @return bool True if the driver was unassigned and the changes were saved, false otherwise
447
+ */
448
+ public function unassignCurrentOrder()
449
+ {
450
+ if (!empty($this->driver_assigned_uuid)) {
451
+ $this->driver_assigned_uuid = null;
452
+
453
+ return $this->save();
454
+ }
455
+
456
+ return false;
457
+ }
458
+
459
+ /**
460
+ * Assign a vehicle to driver.
461
+ *
462
+ * @return void
463
+ */
464
+ public function assignVehicle(Vehicle $vehicle)
465
+ {
466
+ // auto: unassign vehicle from other drivers
467
+ static::where('vehicle_uuid', $vehicle->uuid)->update(['vehicle_uuid' => null]);
468
+
469
+ // set this vehicle
470
+ $this->vehicle_uuid = $vehicle->uuid;
471
+ $this->setRelation('vehicle', $vehicle);
472
+ $this->save();
473
+
474
+ return $this;
475
+ }
476
+
477
+ /**
478
+ * Checks if the vehicle is assigned to the driver.
479
+ *
480
+ * @return bool True if the vehicle is assigned, false otherwise
481
+ */
482
+ public function isVehicleAssigned()
483
+ {
484
+ return $this->isVehicleNotAssigned() === false;
485
+ }
486
+
487
+ /**
488
+ * Checks if the vehicle is not assigned to the driver.
489
+ *
490
+ * @return bool True if the vehicle is not assigned, false otherwise
491
+ */
492
+ public function isVehicleNotAssigned()
493
+ {
494
+ return !$this->vehicle_uuid;
495
+ }
496
+
497
+ /**
498
+ * Updates the position of the driver, creating a new Position record if
499
+ * the driver has moved more than 100 meters or if it's their first recorded position.
500
+ *
501
+ * @param Order|null $order The order to consider when updating the position (default: null)
502
+ *
503
+ * @return \Fleetbase\FleetOps\Models\Position|null The created Position object, or null if no new position was created
504
+ */
505
+ public function updatePosition(Order $order = null): ?Position
506
+ {
507
+ $position = null;
508
+ $lastPosition = $this->positions()->whereCompanyUuid(session('company'))->latest()->first();
509
+
510
+ // get the drivers current order
511
+ $currentOrder = $order ?? $this->currentOrder()->with(['payload'])->first();
512
+ $destination = $currentOrder ? $currentOrder->payload->getPickupOrCurrentWaypoint() : null;
513
+
514
+ $positionData = [
515
+ 'company_uuid' => session('company', $this->company_uuid),
516
+ 'subject_uuid' => $this->uuid,
517
+ 'subject_type' => Utils::getMutationType($this),
518
+ 'coordinates' => $this->location,
519
+ 'altitude' => $this->altitude,
520
+ 'heading' => $this->heading,
521
+ 'speed' => $this->speed,
522
+ ];
523
+
524
+ if ($currentOrder) {
525
+ $positionData['order_uuid'] = $currentOrder->uuid;
526
+ }
527
+
528
+ if ($destination) {
529
+ $positionData['destination_uuid'] = $destination->uuid;
530
+ }
531
+
532
+ $isFirstPosition = !$lastPosition;
533
+ $isPast50Meters = $lastPosition && FleetOpsUtils::vincentyGreatCircleDistance($this->location, $lastPosition->coordinates) > 50;
534
+ $position = null;
535
+
536
+ // create the first position
537
+ if ($isFirstPosition || $isPast50Meters) {
538
+ $position = Position::create($positionData);
539
+ }
540
+
541
+ return $position;
542
+ }
543
+ }