@fleetbase/fleetops-engine 0.2.5 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/.gitattributes +14 -0
  2. package/.php-cs-fixer.cache +1 -0
  3. package/.php-cs-fixer.php +29 -0
  4. package/LICENSE.md +16 -4
  5. package/README.md +103 -13
  6. package/addon/components/admin/visibility-controls.hbs +12 -0
  7. package/addon/components/admin/visibility-controls.js +82 -0
  8. package/addon/components/fleet-panel.js +13 -4
  9. package/addon/components/fleet-vehicle-listing.hbs +1 -1
  10. package/addon/components/layout/fleet-ops-sidebar.hbs +26 -0
  11. package/addon/components/layout/fleet-ops-sidebar.js +129 -0
  12. package/addon/engine.js +19 -0
  13. package/addon/helpers/is-section-visible.js +5 -0
  14. package/addon/routes/application.js +6 -2
  15. package/addon/routes/virtual.js +10 -0
  16. package/addon/routes.js +1 -0
  17. package/addon/templates/application.hbs +1 -19
  18. package/addon/templates/virtual.hbs +9 -0
  19. package/app/components/admin/visibility-controls.js +1 -0
  20. package/app/components/layout/fleet-ops-sidebar.js +1 -0
  21. package/app/helpers/is-section-visible.js +1 -0
  22. package/app/routes/virtual.js +1 -0
  23. package/app/templates/virtual.js +1 -0
  24. package/composer.json +85 -0
  25. package/extension.json +10 -0
  26. package/package.json +6 -6
  27. package/phpstan.neon.dist +8 -0
  28. package/phpunit.xml.dist +16 -0
  29. package/server/config/api.php +765 -0
  30. package/server/config/cache.stores.php +18 -0
  31. package/server/config/dompdf.php +242 -0
  32. package/server/config/fleetops.php +19 -0
  33. package/server/config/geocoder.php +108 -0
  34. package/server/data/globe.json +261 -0
  35. package/server/migrations/2023_04_27_053456_create_contacts_table.php +49 -0
  36. package/server/migrations/2023_04_27_053456_create_drivers_table.php +62 -0
  37. package/server/migrations/2023_04_27_053456_create_entities_table.php +67 -0
  38. package/server/migrations/2023_04_27_053456_create_fleet_drivers_table.php +39 -0
  39. package/server/migrations/2023_04_27_053456_create_fleets_table.php +47 -0
  40. package/server/migrations/2023_04_27_053456_create_fuel_reports_table.php +50 -0
  41. package/server/migrations/2023_04_27_053456_create_integrated_vendors_table.php +44 -0
  42. package/server/migrations/2023_04_27_053456_create_issues_table.php +53 -0
  43. package/server/migrations/2023_04_27_053456_create_orders_table.php +70 -0
  44. package/server/migrations/2023_04_27_053456_create_payloads_table.php +51 -0
  45. package/server/migrations/2023_04_27_053456_create_places_table.php +62 -0
  46. package/server/migrations/2023_04_27_053456_create_positions_table.php +46 -0
  47. package/server/migrations/2023_04_27_053456_create_proofs_table.php +44 -0
  48. package/server/migrations/2023_04_27_053456_create_purchase_rates_table.php +46 -0
  49. package/server/migrations/2023_04_27_053456_create_routes_table.php +40 -0
  50. package/server/migrations/2023_04_27_053456_create_service_areas_table.php +47 -0
  51. package/server/migrations/2023_04_27_053456_create_service_quote_items_table.php +42 -0
  52. package/server/migrations/2023_04_27_053456_create_service_quotes_table.php +47 -0
  53. package/server/migrations/2023_04_27_053456_create_service_rate_fees_table.php +45 -0
  54. package/server/migrations/2023_04_27_053456_create_service_rate_parcel_fees_table.php +47 -0
  55. package/server/migrations/2023_04_27_053456_create_service_rates_table.php +61 -0
  56. package/server/migrations/2023_04_27_053456_create_tracking_numbers_table.php +46 -0
  57. package/server/migrations/2023_04_27_053456_create_tracking_statuses_table.php +54 -0
  58. package/server/migrations/2023_04_27_053456_create_vehicles_table.php +84 -0
  59. package/server/migrations/2023_04_27_053456_create_vendors_table.php +56 -0
  60. package/server/migrations/2023_04_27_053456_create_waypoints_table.php +45 -0
  61. package/server/migrations/2023_04_27_053456_create_zones_table.php +46 -0
  62. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_companies_table.php +32 -0
  63. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_contacts_table.php +34 -0
  64. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_drivers_table.php +40 -0
  65. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_entities_table.php +40 -0
  66. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleet_drivers_table.php +34 -0
  67. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleets_table.php +36 -0
  68. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fuel_reports_table.php +36 -0
  69. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_integrated_vendors_table.php +34 -0
  70. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_issues_table.php +38 -0
  71. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_orders_table.php +48 -0
  72. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_payloads_table.php +40 -0
  73. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_places_table.php +32 -0
  74. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_positions_table.php +36 -0
  75. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_proofs_table.php +34 -0
  76. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_purchase_rates_table.php +38 -0
  77. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_routes_table.php +34 -0
  78. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_areas_table.php +34 -0
  79. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quote_items_table.php +32 -0
  80. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quotes_table.php +38 -0
  81. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_fees_table.php +32 -0
  82. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_parcel_fees_table.php +32 -0
  83. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rates_table.php +36 -0
  84. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_numbers_table.php +34 -0
  85. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_statuses_table.php +34 -0
  86. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vehicles_table.php +36 -0
  87. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vendors_table.php +40 -0
  88. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_waypoints_table.php +38 -0
  89. package/server/migrations/2023_04_27_053459_add_foreign_keys_to_zones_table.php +34 -0
  90. package/server/migrations/2023_09_14_074512_update_vehicles_table.php +100 -0
  91. package/server/migrations/2023_09_14_074619_create_vehicle_devices_table.php +44 -0
  92. package/server/migrations/2023_09_26_071205_add_online_column_to_vehicles_table.php +32 -0
  93. package/server/migrations/2023_09_26_083957_create_fleet_vehicles_table.php +45 -0
  94. package/server/migrations/2023_09_27_023757_add_column_to_fleets_table.php +46 -0
  95. package/server/migrations/2023_10_05_074811_update_vehicle.php +42 -0
  96. package/server/resources/views/labels/default.php +165 -0
  97. package/server/src/Auth/Schemas/FleetOps.php +75 -0
  98. package/server/src/Casts/MultiPolygon.php +50 -0
  99. package/server/src/Casts/Point.php +109 -0
  100. package/server/src/Casts/Polygon.php +46 -0
  101. package/server/src/Console/Commands/DispatchAdhocOrders.php +137 -0
  102. package/server/src/Console/Commands/DispatchOrders.php +71 -0
  103. package/server/src/Console/Commands/TrackOrderDistanceAndTime.php +62 -0
  104. package/server/src/Events/DriverLocationChanged.php +174 -0
  105. package/server/src/Events/DriverSimulatedLocationChanged.php +183 -0
  106. package/server/src/Events/EntityDriverAssigned.php +36 -0
  107. package/server/src/Events/OrderCanceled.php +15 -0
  108. package/server/src/Events/OrderCompleted.php +15 -0
  109. package/server/src/Events/OrderDispatchFailed.php +42 -0
  110. package/server/src/Events/OrderDispatched.php +15 -0
  111. package/server/src/Events/OrderDriverAssigned.php +15 -0
  112. package/server/src/Events/OrderReady.php +15 -0
  113. package/server/src/Events/OrderStarted.php +15 -0
  114. package/server/src/Exceptions/IntegratedVendorException.php +18 -0
  115. package/server/src/Expansions/UserExpansion.php +63 -0
  116. package/server/src/Exports/ContactExport.php +56 -0
  117. package/server/src/Exports/DriverExport.php +61 -0
  118. package/server/src/Exports/FleetExport.php +53 -0
  119. package/server/src/Exports/PlaceExport.php +55 -0
  120. package/server/src/Exports/ServiceAreaExport.php +58 -0
  121. package/server/src/Exports/VehicleExport.php +57 -0
  122. package/server/src/Exports/VendorExport.php +57 -0
  123. package/server/src/Http/Controllers/Api/v1/ContactController.php +133 -0
  124. package/server/src/Http/Controllers/Api/v1/DriverController.php +691 -0
  125. package/server/src/Http/Controllers/Api/v1/EntityController.php +230 -0
  126. package/server/src/Http/Controllers/Api/v1/FleetController.php +146 -0
  127. package/server/src/Http/Controllers/Api/v1/LabelController.php +63 -0
  128. package/server/src/Http/Controllers/Api/v1/OrderController.php +1114 -0
  129. package/server/src/Http/Controllers/Api/v1/PayloadController.php +195 -0
  130. package/server/src/Http/Controllers/Api/v1/PlaceController.php +333 -0
  131. package/server/src/Http/Controllers/Api/v1/PurchaseRateController.php +199 -0
  132. package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +133 -0
  133. package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +381 -0
  134. package/server/src/Http/Controllers/Api/v1/ServiceRateController.php +223 -0
  135. package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +146 -0
  136. package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +138 -0
  137. package/server/src/Http/Controllers/Api/v1/VehicleController.php +191 -0
  138. package/server/src/Http/Controllers/Api/v1/VendorController.php +159 -0
  139. package/server/src/Http/Controllers/Api/v1/ZoneController.php +146 -0
  140. package/server/src/Http/Controllers/FleetOpsController.php +13 -0
  141. package/server/src/Http/Controllers/Internal/v1/ContactController.php +69 -0
  142. package/server/src/Http/Controllers/Internal/v1/DriverController.php +261 -0
  143. package/server/src/Http/Controllers/Internal/v1/EntityController.php +15 -0
  144. package/server/src/Http/Controllers/Internal/v1/FleetController.php +152 -0
  145. package/server/src/Http/Controllers/Internal/v1/FleetOpsLookupController.php +80 -0
  146. package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +15 -0
  147. package/server/src/Http/Controllers/Internal/v1/GeocoderController.php +96 -0
  148. package/server/src/Http/Controllers/Internal/v1/IntegratedVendorController.php +63 -0
  149. package/server/src/Http/Controllers/Internal/v1/IssueController.php +15 -0
  150. package/server/src/Http/Controllers/Internal/v1/LiveController.php +127 -0
  151. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +75 -0
  152. package/server/src/Http/Controllers/Internal/v1/MorphController.php +77 -0
  153. package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +269 -0
  154. package/server/src/Http/Controllers/Internal/v1/OrderController.php +564 -0
  155. package/server/src/Http/Controllers/Internal/v1/PayloadController.php +15 -0
  156. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +163 -0
  157. package/server/src/Http/Controllers/Internal/v1/ProofController.php +139 -0
  158. package/server/src/Http/Controllers/Internal/v1/PurchaseRateController.php +15 -0
  159. package/server/src/Http/Controllers/Internal/v1/RouteController.php +15 -0
  160. package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +32 -0
  161. package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +345 -0
  162. package/server/src/Http/Controllers/Internal/v1/ServiceRateController.php +47 -0
  163. package/server/src/Http/Controllers/Internal/v1/SettingController.php +30 -0
  164. package/server/src/Http/Controllers/Internal/v1/TrackingNumberController.php +15 -0
  165. package/server/src/Http/Controllers/Internal/v1/TrackingStatusController.php +15 -0
  166. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +65 -0
  167. package/server/src/Http/Controllers/Internal/v1/VehicleDeviceController.php +15 -0
  168. package/server/src/Http/Controllers/Internal/v1/VendorController.php +120 -0
  169. package/server/src/Http/Controllers/Internal/v1/ZoneController.php +15 -0
  170. package/server/src/Http/Filter/ContactFilter.php +86 -0
  171. package/server/src/Http/Filter/DriverFilter.php +148 -0
  172. package/server/src/Http/Filter/FleetFilter.php +108 -0
  173. package/server/src/Http/Filter/IntegratedVendorFilter.php +13 -0
  174. package/server/src/Http/Filter/OrderFilter.php +242 -0
  175. package/server/src/Http/Filter/PlaceFilter.php +111 -0
  176. package/server/src/Http/Filter/ServiceAreaFilter.php +13 -0
  177. package/server/src/Http/Filter/ServiceQuoteFilter.php +13 -0
  178. package/server/src/Http/Filter/ServiceRateFilter.php +33 -0
  179. package/server/src/Http/Filter/TrackingStatusFilter.php +43 -0
  180. package/server/src/Http/Filter/VehicleFilter.php +91 -0
  181. package/server/src/Http/Filter/VendorFilter.php +83 -0
  182. package/server/src/Http/Filter/ZoneFilter.php +13 -0
  183. package/server/src/Http/Requests/CancelOrderRequest.php +31 -0
  184. package/server/src/Http/Requests/CreateContactRequest.php +33 -0
  185. package/server/src/Http/Requests/CreateDriverRequest.php +55 -0
  186. package/server/src/Http/Requests/CreateEntityRequest.php +43 -0
  187. package/server/src/Http/Requests/CreateFleetRequest.php +32 -0
  188. package/server/src/Http/Requests/CreateOrderRequest.php +66 -0
  189. package/server/src/Http/Requests/CreatePayloadRequest.php +37 -0
  190. package/server/src/Http/Requests/CreatePlaceRequest.php +38 -0
  191. package/server/src/Http/Requests/CreatePurchaseRateRequest.php +33 -0
  192. package/server/src/Http/Requests/CreateServiceAreaRequest.php +35 -0
  193. package/server/src/Http/Requests/CreateServiceQuoteRequest.php +29 -0
  194. package/server/src/Http/Requests/CreateServiceRateRequest.php +56 -0
  195. package/server/src/Http/Requests/CreateTrackingNumberRequest.php +34 -0
  196. package/server/src/Http/Requests/CreateTrackingStatusRequest.php +42 -0
  197. package/server/src/Http/Requests/CreateVehicleRequest.php +32 -0
  198. package/server/src/Http/Requests/CreateVendorRequest.php +35 -0
  199. package/server/src/Http/Requests/CreateZoneRequest.php +35 -0
  200. package/server/src/Http/Requests/DecodeTrackingNumberQR.php +30 -0
  201. package/server/src/Http/Requests/DriverSimulationRequest.php +46 -0
  202. package/server/src/Http/Requests/Internal/AssignOrderRequest.php +31 -0
  203. package/server/src/Http/Requests/Internal/CreateDriverRequest.php +42 -0
  204. package/server/src/Http/Requests/Internal/FleetActionRequest.php +32 -0
  205. package/server/src/Http/Requests/Internal/UpdateDriverRequest.php +7 -0
  206. package/server/src/Http/Requests/QueryServiceQuotesRequest.php +41 -0
  207. package/server/src/Http/Requests/UpdateContactRequest.php +20 -0
  208. package/server/src/Http/Requests/UpdateDriverRequest.php +7 -0
  209. package/server/src/Http/Requests/UpdateEntityRequest.php +7 -0
  210. package/server/src/Http/Requests/UpdateFleetRequest.php +7 -0
  211. package/server/src/Http/Requests/UpdateOrderRequest.php +7 -0
  212. package/server/src/Http/Requests/UpdatePayloadRequest.php +7 -0
  213. package/server/src/Http/Requests/UpdatePlaceRequest.php +7 -0
  214. package/server/src/Http/Requests/UpdatePurchaseRateRequest.php +7 -0
  215. package/server/src/Http/Requests/UpdateServiceAreaRequest.php +29 -0
  216. package/server/src/Http/Requests/UpdateServiceQuoteRequest.php +29 -0
  217. package/server/src/Http/Requests/UpdateServiceRateRequest.php +29 -0
  218. package/server/src/Http/Requests/UpdateTrackingNumberRequest.php +7 -0
  219. package/server/src/Http/Requests/UpdateTrackingStatusRequest.php +32 -0
  220. package/server/src/Http/Requests/UpdateVehicleRequest.php +7 -0
  221. package/server/src/Http/Requests/UpdateVendorRequest.php +7 -0
  222. package/server/src/Http/Requests/UpdateZoneRequest.php +7 -0
  223. package/server/src/Http/Resources/Internal/v1/IntegratedVendorFacilitator.php +37 -0
  224. package/server/src/Http/Resources/Internal/v1/Vehicle.php +33 -0
  225. package/server/src/Http/Resources/Internal/v1/Waypoint.php +34 -0
  226. package/server/src/Http/Resources/v1/Contact.php +62 -0
  227. package/server/src/Http/Resources/v1/CurrentJob.php +36 -0
  228. package/server/src/Http/Resources/v1/DeletedResource.php +61 -0
  229. package/server/src/Http/Resources/v1/Driver.php +89 -0
  230. package/server/src/Http/Resources/v1/Entity.php +107 -0
  231. package/server/src/Http/Resources/v1/Fleet.php +60 -0
  232. package/server/src/Http/Resources/v1/FuelReport.php +67 -0
  233. package/server/src/Http/Resources/v1/Order.php +131 -0
  234. package/server/src/Http/Resources/v1/Payload.php +94 -0
  235. package/server/src/Http/Resources/v1/Place.php +84 -0
  236. package/server/src/Http/Resources/v1/Proof.php +36 -0
  237. package/server/src/Http/Resources/v1/PurchaseRate.php +77 -0
  238. package/server/src/Http/Resources/v1/ServiceArea.php +55 -0
  239. package/server/src/Http/Resources/v1/ServiceQuote.php +57 -0
  240. package/server/src/Http/Resources/v1/ServiceRate.php +94 -0
  241. package/server/src/Http/Resources/v1/ServiceRateFee.php +58 -0
  242. package/server/src/Http/Resources/v1/ServiceRateParcelFee.php +48 -0
  243. package/server/src/Http/Resources/v1/TrackingNumber.php +62 -0
  244. package/server/src/Http/Resources/v1/TrackingStatus.php +84 -0
  245. package/server/src/Http/Resources/v1/Vehicle.php +75 -0
  246. package/server/src/Http/Resources/v1/VehicleDevice.php +44 -0
  247. package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +72 -0
  248. package/server/src/Http/Resources/v1/Vendor.php +72 -0
  249. package/server/src/Http/Resources/v1/Zone.php +60 -0
  250. package/server/src/Imports/OrdersImport.php +18 -0
  251. package/server/src/Integrations/Lalamove/Lalamove.php +678 -0
  252. package/server/src/Integrations/Lalamove/LalamoveDeliveryStop.php +97 -0
  253. package/server/src/Integrations/Lalamove/LalamoveMarket.php +123 -0
  254. package/server/src/Integrations/Lalamove/LalamoveServiceType.php +161 -0
  255. package/server/src/Jobs/SimulateDrivingRoute.php +81 -0
  256. package/server/src/Jobs/SimulateWaypointReached.php +79 -0
  257. package/server/src/Listeners/HandleOrderCanceled.php +46 -0
  258. package/server/src/Listeners/HandleOrderCreated.php +23 -0
  259. package/server/src/Listeners/HandleOrderDispatchFailed.php +35 -0
  260. package/server/src/Listeners/HandleOrderDispatched.php +108 -0
  261. package/server/src/Listeners/HandleOrderDriverAssigned.php +42 -0
  262. package/server/src/Listeners/HandleOrderReady.php +27 -0
  263. package/server/src/Listeners/HandleUserRemovedFromCompany.php +31 -0
  264. package/server/src/Models/Contact.php +239 -0
  265. package/server/src/Models/Driver.php +543 -0
  266. package/server/src/Models/Entity.php +416 -0
  267. package/server/src/Models/Fleet.php +203 -0
  268. package/server/src/Models/FleetDriver.php +73 -0
  269. package/server/src/Models/FleetVehicle.php +73 -0
  270. package/server/src/Models/FuelReport.php +125 -0
  271. package/server/src/Models/IntegratedVendor.php +219 -0
  272. package/server/src/Models/Issue.php +111 -0
  273. package/server/src/Models/Order.php +1132 -0
  274. package/server/src/Models/Payload.php +699 -0
  275. package/server/src/Models/Place.php +656 -0
  276. package/server/src/Models/Position.php +119 -0
  277. package/server/src/Models/Proof.php +94 -0
  278. package/server/src/Models/PurchaseRate.php +208 -0
  279. package/server/src/Models/Route.php +128 -0
  280. package/server/src/Models/ServiceArea.php +161 -0
  281. package/server/src/Models/ServiceQuote.php +207 -0
  282. package/server/src/Models/ServiceQuoteItem.php +46 -0
  283. package/server/src/Models/ServiceRate.php +953 -0
  284. package/server/src/Models/ServiceRateFee.php +96 -0
  285. package/server/src/Models/ServiceRateParcelFee.php +116 -0
  286. package/server/src/Models/TrackingNumber.php +310 -0
  287. package/server/src/Models/TrackingStatus.php +177 -0
  288. package/server/src/Models/Vehicle.php +452 -0
  289. package/server/src/Models/VehicleDevice.php +79 -0
  290. package/server/src/Models/Vendor.php +244 -0
  291. package/server/src/Models/Waypoint.php +226 -0
  292. package/server/src/Models/Zone.php +95 -0
  293. package/server/src/Notifications/OrderAssigned.php +140 -0
  294. package/server/src/Notifications/OrderCanceled.php +129 -0
  295. package/server/src/Notifications/OrderDispatchFailed.php +81 -0
  296. package/server/src/Notifications/OrderDispatched.php +173 -0
  297. package/server/src/Notifications/OrderPing.php +162 -0
  298. package/server/src/Notifications/OrderSplit.php +56 -0
  299. package/server/src/Observers/DriverObserver.php +34 -0
  300. package/server/src/Observers/OrderObserver.php +34 -0
  301. package/server/src/Observers/PayloadObserver.php +30 -0
  302. package/server/src/Observers/PlaceObserver.php +26 -0
  303. package/server/src/Observers/PurchaseRateObserver.php +61 -0
  304. package/server/src/Observers/ServiceAreaObserver.php +35 -0
  305. package/server/src/Observers/ServiceRateObserver.php +78 -0
  306. package/server/src/Observers/TrackingNumberObserver.php +44 -0
  307. package/server/src/Observers/UserObserver.php +20 -0
  308. package/server/src/Observers/VehicleObserver.php +66 -0
  309. package/server/src/Providers/EventServiceProvider.php +30 -0
  310. package/server/src/Providers/FleetOpsServiceProvider.php +94 -0
  311. package/server/src/Rules/ResolvablePoint.php +37 -0
  312. package/server/src/Scopes/DriverScope.php +21 -0
  313. package/server/src/Support/Algo.php +55 -0
  314. package/server/src/Support/DistanceMatrix.php +27 -0
  315. package/server/src/Support/Encoding/Polyline.php +168 -0
  316. package/server/src/Support/Flow.php +622 -0
  317. package/server/src/Support/Geocoding.php +216 -0
  318. package/server/src/Support/IntegratedVendors.php +287 -0
  319. package/server/src/Support/Metrics.php +305 -0
  320. package/server/src/Support/OSRM.php +191 -0
  321. package/server/src/Support/ParsePhone.php +21 -0
  322. package/server/src/Support/Utils.php +1145 -0
  323. package/server/src/Traits/HasTrackingNumber.php +185 -0
  324. package/server/src/routes.php +381 -0
  325. package/server/tests/Feature.php +5 -0
@@ -0,0 +1,96 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Models;
4
+
5
+ use Fleetbase\FleetOps\Support\Utils;
6
+ use Fleetbase\Models\Model;
7
+ use Fleetbase\Traits\HasUuid;
8
+ use Fleetbase\Traits\TracksApiCredential;
9
+
10
+ class ServiceRateFee extends Model
11
+ {
12
+ use HasUuid;
13
+ use TracksApiCredential;
14
+
15
+ /**
16
+ * The database table used by the model.
17
+ *
18
+ * @var string
19
+ */
20
+ protected $table = 'service_rate_fees';
21
+
22
+ /**
23
+ * These attributes that can be queried.
24
+ *
25
+ * @var array
26
+ */
27
+ protected $searchableColumns = [];
28
+
29
+ /**
30
+ * The attributes that are mass assignable.
31
+ *
32
+ * @var array
33
+ */
34
+ protected $fillable = ['_key', 'service_rate_uuid', 'distance', 'distance_unit', 'min', 'max', 'unit', 'fee', 'currency'];
35
+
36
+ /**
37
+ * The attributes that should be cast to native types.
38
+ *
39
+ * @var array
40
+ */
41
+ protected $casts = [
42
+ 'min' => 'integer',
43
+ 'max' => 'integer',
44
+ 'fee' => 'integer',
45
+ 'distance' => 'integer',
46
+ ];
47
+
48
+ /**
49
+ * Dynamic attributes that are appended to object.
50
+ *
51
+ * @var array
52
+ */
53
+ protected $appends = [];
54
+
55
+ /**
56
+ * The attributes excluded from the model's JSON form.
57
+ *
58
+ * @var array
59
+ */
60
+ protected $hidden = [];
61
+
62
+ public static function onRowInsert($row)
63
+ {
64
+ $row['fee'] = Utils::numbersOnly($row['fee'] ?? null);
65
+ $row['distance'] = Utils::numbersOnly($row['distance'] ?? null);
66
+ $row['min'] = Utils::numbersOnly($row['min'] ?? null);
67
+ $row['max'] = Utils::numbersOnly($row['max'] ?? null);
68
+
69
+ return $row;
70
+ }
71
+
72
+ /**
73
+ * Set the fee as only numbers.
74
+ *
75
+ * @void
76
+ */
77
+ public function setFeeAttribute($value)
78
+ {
79
+ $this->attributes['fee'] = Utils::numbersOnly($value);
80
+ }
81
+
82
+ /**
83
+ * Set the distance as numbers only.
84
+ *
85
+ * @void
86
+ */
87
+ public function setDistanceAttribute($value)
88
+ {
89
+ $this->attributes['distance'] = Utils::numbersOnly($value);
90
+ }
91
+
92
+ public function isWithinMinMax(int $number = 0): bool
93
+ {
94
+ return $number >= $this->min && $number <= $this->max;
95
+ }
96
+ }
@@ -0,0 +1,116 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Models;
4
+
5
+ use Fleetbase\Casts\Money;
6
+ use Fleetbase\FleetOps\Support\Utils;
7
+ use Fleetbase\Models\Model;
8
+ use Fleetbase\Traits\HasUuid;
9
+ use PhpUnitsOfMeasure\PhysicalQuantity\Length;
10
+ use PhpUnitsOfMeasure\PhysicalQuantity\Mass;
11
+
12
+ class ServiceRateParcelFee extends Model
13
+ {
14
+ use HasUuid;
15
+
16
+ /**
17
+ * The database table used by the model.
18
+ *
19
+ * @var string
20
+ */
21
+ protected $table = 'service_rate_parcel_fees';
22
+
23
+ /**
24
+ * These attributes that can be queried.
25
+ *
26
+ * @var array
27
+ */
28
+ protected $searchableColumns = [];
29
+
30
+ /**
31
+ * The attributes that are mass assignable.
32
+ *
33
+ * @var array
34
+ */
35
+ protected $fillable = ['_key', 'service_rate_uuid', 'size', 'length', 'width', 'height', 'dimensions_unit', 'weight', 'weight_unit', 'fee', 'currency'];
36
+
37
+ /**
38
+ * The attributes that should be cast to native types.
39
+ *
40
+ * @var array
41
+ */
42
+ protected $casts = [
43
+ 'fee' => Money::class,
44
+ ];
45
+
46
+ /**
47
+ * Dynamic attributes that are appended to object.
48
+ *
49
+ * @var array
50
+ */
51
+ protected $appends = [];
52
+
53
+ /**
54
+ * The attributes excluded from the model's JSON form.
55
+ *
56
+ * @var array
57
+ */
58
+ protected $hidden = [];
59
+
60
+ public static function onRowInsert($row)
61
+ {
62
+ $row['fee'] = Utils::numbersOnly($row['fee']);
63
+
64
+ return $row;
65
+ }
66
+
67
+ /**
68
+ * Set the fee as only numbers.
69
+ *
70
+ * @void
71
+ */
72
+ public function setFeeAttribute($value)
73
+ {
74
+ $this->attributes['fee'] = Utils::numbersOnly($value);
75
+ }
76
+
77
+ /**
78
+ * The length the entity belongs to.
79
+ *
80
+ * @var PhpUnitsOfMeasure\PhysicalQuantity\Length
81
+ */
82
+ public function getLengthUnitAttribute()
83
+ {
84
+ return new Length($this->length, $this->dimensions_unit);
85
+ }
86
+
87
+ /**
88
+ * The width the entity belongs to.
89
+ *
90
+ * @var PhpUnitsOfMeasure\PhysicalQuantity\Length
91
+ */
92
+ public function getWidthUnitAttribute()
93
+ {
94
+ return new Length($this->width, $this->dimensions_unit);
95
+ }
96
+
97
+ /**
98
+ * The height the entity belongs to.
99
+ *
100
+ * @var PhpUnitsOfMeasure\PhysicalQuantity\Length
101
+ */
102
+ public function getHeightUnitAttribute()
103
+ {
104
+ return new Length($this->height, $this->dimensions_unit);
105
+ }
106
+
107
+ /**
108
+ * The weight the entity belongs to.
109
+ *
110
+ * @var PhpUnitsOfMeasure\PhysicalQuantity\Mass
111
+ */
112
+ public function getMassUnitAttribute()
113
+ {
114
+ return new Mass($this->weight, $this->weight_unit);
115
+ }
116
+ }
@@ -0,0 +1,310 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Models;
4
+
5
+ use Fleetbase\FleetOps\Casts\Point;
6
+ use Fleetbase\FleetOps\Support\Utils;
7
+ use Fleetbase\Models\Model;
8
+ use Fleetbase\Traits\HasApiModelBehavior;
9
+ use Fleetbase\Traits\HasPublicId;
10
+ use Fleetbase\Traits\HasUuid;
11
+ use Fleetbase\Traits\SendsWebhooks;
12
+ use Fleetbase\Traits\TracksApiCredential;
13
+ use Grimzy\LaravelMysqlSpatial\Eloquent\SpatialTrait;
14
+ use Illuminate\Support\Carbon;
15
+ use Illuminate\Support\Facades\DB;
16
+ use Illuminate\Support\Str;
17
+ use Milon\Barcode\Facades\DNS2DFacade as DNS2D;
18
+
19
+ class TrackingNumber extends Model
20
+ {
21
+ use HasUuid;
22
+ use HasPublicId;
23
+ use HasApiModelBehavior;
24
+ use SendsWebhooks;
25
+ use TracksApiCredential;
26
+ use SpatialTrait;
27
+
28
+ /**
29
+ * The database table used by the model.
30
+ *
31
+ * @var string
32
+ */
33
+ protected $table = 'tracking_numbers';
34
+
35
+ /**
36
+ * The type of public Id to generate.
37
+ *
38
+ * @var string
39
+ */
40
+ protected $publicIdType = 'track';
41
+
42
+ /**
43
+ * These attributes that can be queried.
44
+ *
45
+ * @var array
46
+ */
47
+ protected $searchableColumns = [];
48
+
49
+ /**
50
+ * The attributes that are mass assignable.
51
+ *
52
+ * @var array
53
+ */
54
+ protected $fillable = ['_key', 'company_uuid', 'tracking_number', 'owner_uuid', 'owner_type', 'region', 'qr_code', 'barcode', 'status_uuid'];
55
+
56
+ /**
57
+ * The attributes that are spatial columns.
58
+ *
59
+ * @var array
60
+ */
61
+ protected $spatialFields = ['location'];
62
+
63
+ /**
64
+ * The attributes that should be cast to native types.
65
+ *
66
+ * @var array
67
+ */
68
+ protected $casts = [
69
+ 'location' => Point::class,
70
+ ];
71
+
72
+ /**
73
+ * Dynamic attributes that are appended to object.
74
+ *
75
+ * @var array
76
+ */
77
+ protected $appends = ['last_status', 'last_status_code', 'last_status_updated_at', 'type'];
78
+
79
+ /**
80
+ * The attributes excluded from the model's JSON form.
81
+ *
82
+ * @var array
83
+ */
84
+ protected $hidden = ['status'];
85
+
86
+ /**
87
+ * Tracking number status.
88
+ */
89
+ public function getLastStatusAttribute()
90
+ {
91
+ return $this->status->status;
92
+ }
93
+
94
+ /**
95
+ * Tracking number status code.
96
+ */
97
+ public function getLastStatusCodeAttribute()
98
+ {
99
+ return $this->status->code;
100
+ }
101
+
102
+ /**
103
+ * Datetime of last status update.
104
+ */
105
+ public function getLastStatusUpdatedAtAttribute()
106
+ {
107
+ return $this->status->created_at;
108
+ }
109
+
110
+ /**
111
+ * Get the service details.
112
+ *
113
+ * @var Model
114
+ */
115
+ public function status()
116
+ {
117
+ return $this->hasOne(TrackingStatus::class)->latest()->without(['trackingNumber']);
118
+ }
119
+
120
+ /**
121
+ * Tracking statuses by this tracking number.
122
+ *
123
+ * @var Model
124
+ */
125
+ public function statuses()
126
+ {
127
+ return $this->hasMany(TrackingStatus::class)->without(['trackingNumber']);
128
+ }
129
+
130
+ /**
131
+ * Get the order status belongss to.
132
+ *
133
+ * @var Model
134
+ */
135
+ public function order()
136
+ {
137
+ return $this->belongsTo(Order::class, 'owner_uuid');
138
+ }
139
+
140
+ /**
141
+ * Get the entity tracking number belongss to.
142
+ *
143
+ * @var Model
144
+ */
145
+ public function entity()
146
+ {
147
+ return $this->belongsTo(Entity::class, 'owner_uuid');
148
+ }
149
+
150
+ /**
151
+ * Get the tracking number owner, could be order or entity.
152
+ *
153
+ * @var Model
154
+ */
155
+ public function owner()
156
+ {
157
+ return $this->morphTo(__FUNCTION__, 'owner_type', 'owner_uuid')->withoutGlobalScopes();
158
+ }
159
+
160
+ /**
161
+ * Get the tracking number type.
162
+ *
163
+ * @var Model
164
+ */
165
+ public function getTypeAttribute()
166
+ {
167
+ return Utils::getTypeFromClassName($this->owner_type);
168
+ }
169
+
170
+ /**
171
+ * Generates a fleetbase tracking number.
172
+ *
173
+ * @var array
174
+ */
175
+ public static function generateTrackingNumber($region = 'SG', $length = 10)
176
+ {
177
+ $company = \Fleetbase\Models\Company::where('uuid', session('company'))->withoutGlobalScopes()->first();
178
+ $companyName = $company ? strtoupper(substr($company->name, 0, 3)) : null;
179
+ $number = $companyName ?? 'FLB';
180
+
181
+ for ($i = 0; $i < $length; $i++) {
182
+ $number .= mt_rand(0, 9);
183
+ }
184
+
185
+ return $number . strtoupper($region);
186
+ }
187
+
188
+ /**
189
+ * Generates a unique fleetbase tracking number.
190
+ *
191
+ * @var array
192
+ */
193
+ public static function generateNumber($region = 'SG', $length = 10)
194
+ {
195
+ $n = static::generateTrackingNumber($region, $length);
196
+ $tr = static::where('tracking_number', $n)
197
+ ->withTrashed()
198
+ ->first();
199
+ while (is_object($tr) && $n == $tr->tracking_number) {
200
+ $n = static::generateTrackingNumber($region, $length);
201
+ }
202
+
203
+ return $n;
204
+ }
205
+
206
+ /**
207
+ * Find a model by its public_id key or throw an exception.
208
+ *
209
+ * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static|static[]
210
+ *
211
+ * @throws \Illuminate\Database\Eloquent\ModelNotFoundException
212
+ */
213
+ public static function findTrackingOrFail($id)
214
+ {
215
+ $result = static::query()
216
+ ->select(['*'])
217
+ ->with(['status'])
218
+ ->where(function ($q) use ($id) {
219
+ $q->where('public_id', $id);
220
+ $q->orWhere('tracking_number', $id);
221
+ $q->orWhere('uuid', $id);
222
+ })
223
+ ->first();
224
+
225
+ if (!is_null($result)) {
226
+ return $result;
227
+ }
228
+
229
+ throw (new \Illuminate\Database\Eloquent\ModelNotFoundException())->setModel(static::class, $id);
230
+ }
231
+
232
+ public function updateOwnerStatus(TrackingStatus $trackingStatus = null)
233
+ {
234
+ $trackingStatus = $trackingStatus ?? $this->load(['status'])->getRelationValue('status');
235
+ // update status on owner
236
+ $status = strtolower($trackingStatus->code);
237
+ $owner = $this->load(['owner'])->getRelationValue('owner');
238
+
239
+ if ($owner && $owner->isFillable('status') && $owner->status !== $status) {
240
+ $this->owner->status = $status;
241
+
242
+ $this->owner->save();
243
+ }
244
+
245
+ return $this;
246
+ }
247
+
248
+ public static function insertGetUuid($values = [], Model $owner = null)
249
+ {
250
+ $instance = new static();
251
+ $fillable = $instance->getFillable();
252
+ $insertKeys = array_keys($values);
253
+ // clean insert data
254
+ foreach ($insertKeys as $key) {
255
+ if (!in_array($key, $fillable)) {
256
+ unset($values[$key]);
257
+ }
258
+ }
259
+
260
+ $values['uuid'] = $uuid = static::generateUuid();
261
+ $values['public_id'] = static::generatePublicId('track');
262
+ $values['_key'] = session('api_key') ?? 'console';
263
+ $values['created_at'] = Carbon::now()->toDateTimeString();
264
+ $values['company_uuid'] = session('company');
265
+
266
+ if ($owner) {
267
+ $values['owner_uuid'] = $owner->uuid;
268
+ $values['owner_type'] = Utils::getMutationType($owner);
269
+ }
270
+
271
+ $values['tracking_number'] = TrackingNumber::generateNumber($values['region'] ?? 'SG');
272
+ $values['qr_code'] = DNS2D::getBarcodePNG($values['owner_uuid'], 'QRCODE');
273
+ $values['barcode'] = DNS2D::getBarcodePNG($values['owner_uuid'], 'PDF417');
274
+
275
+ if (isset($values['meta']) && (is_object($values['meta']) || is_array($values['meta']))) {
276
+ $values['meta'] = json_encode($values['meta']);
277
+ }
278
+
279
+ $result = static::insert($values);
280
+
281
+ if (!$result) {
282
+ return false;
283
+ }
284
+
285
+ $ownerTypeName = class_basename($values['owner_type']);
286
+
287
+ // create initial status
288
+ $trackingStatusId = TrackingStatus::insertGetUuid([
289
+ 'tracking_number_uuid' => $uuid,
290
+ 'status' => Str::title($ownerTypeName . ' created'),
291
+ 'details' => 'New ' . Str::lower($ownerTypeName) . ' created.',
292
+ 'location' => $values['location'] ?? Utils::parsePointToWkt(new Point(0, 0)),
293
+ 'code' => 'CREATED',
294
+ ]);
295
+
296
+ // update status of tracking number
297
+ TrackingNumber::where('uuid', $uuid)->update(['status_uuid' => $trackingStatusId]);
298
+
299
+ // update owner status
300
+ if ($owner && $owner instanceof Model && $owner->isFillable('status')) {
301
+ // runs event cycles
302
+ // $model->update([ 'status' => 'created' ]);
303
+
304
+ // silent update
305
+ DB::table($owner->getTable())->where('uuid', $owner->uuid)->update(['status' => 'created']);
306
+ }
307
+
308
+ return $uuid;
309
+ }
310
+ }
@@ -0,0 +1,177 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Models;
4
+
5
+ use Fleetbase\Casts\Json;
6
+ use Fleetbase\Models\Model;
7
+ use Fleetbase\Traits\HasApiModelBehavior;
8
+ use Fleetbase\Traits\HasMetaAttributes;
9
+ use Fleetbase\Traits\HasPublicId;
10
+ use Fleetbase\Traits\HasUuid;
11
+ use Fleetbase\Traits\SendsWebhooks;
12
+ use Fleetbase\Traits\TracksApiCredential;
13
+ use Grimzy\LaravelMysqlSpatial\Eloquent\SpatialTrait;
14
+ use Illuminate\Support\Carbon;
15
+ use Illuminate\Support\Str;
16
+
17
+ class TrackingStatus extends Model
18
+ {
19
+ use HasUuid;
20
+ use HasPublicId;
21
+ use HasApiModelBehavior;
22
+ use HasMetaAttributes;
23
+ use SendsWebhooks;
24
+ use TracksApiCredential;
25
+ use SpatialTrait;
26
+
27
+ /**
28
+ * The database table used by the model.
29
+ *
30
+ * @var string
31
+ */
32
+ protected $table = 'tracking_statuses';
33
+
34
+ /**
35
+ * The type of public Id to generate.
36
+ *
37
+ * @var string
38
+ */
39
+ protected $publicIdType = 'status';
40
+
41
+ /**
42
+ * These attributes that can be queried.
43
+ *
44
+ * @var array
45
+ */
46
+ protected $searchableColumns = [];
47
+
48
+ /**
49
+ * The attributes that are mass assignable.
50
+ *
51
+ * @var array
52
+ */
53
+ protected $fillable = [
54
+ '_key',
55
+ 'company_uuid',
56
+ 'tracking_number_uuid',
57
+ 'proof_uuid',
58
+ 'status',
59
+ 'details',
60
+ 'code',
61
+ 'city',
62
+ 'province',
63
+ 'postal_code',
64
+ 'country',
65
+ 'location',
66
+ ];
67
+
68
+ /**
69
+ * The attributes that are spatial columns.
70
+ *
71
+ * @var array
72
+ */
73
+ protected $spatialFields = [
74
+ 'location',
75
+ ];
76
+
77
+ /**
78
+ * The attributes that should be cast to native types.
79
+ *
80
+ * @var array
81
+ */
82
+ protected $casts = [
83
+ 'meta' => Json::class,
84
+ // 'location' => Point::class,
85
+ ];
86
+
87
+ /**
88
+ * Attributes that is filterable on this model.
89
+ *
90
+ * @var array
91
+ */
92
+ protected $filterParams = [
93
+ 'order',
94
+ 'entity',
95
+ ];
96
+
97
+ /**
98
+ * Dynamic attributes that are appended to object.
99
+ *
100
+ * @var array
101
+ */
102
+ protected $appends = [];
103
+
104
+ /**
105
+ * The attributes excluded from the model's JSON form.
106
+ *
107
+ * @var array
108
+ */
109
+ protected $hidden = [];
110
+
111
+ /**
112
+ * The tracking number.
113
+ *
114
+ * @var Model
115
+ */
116
+ public function trackingNumber()
117
+ {
118
+ return $this->belongsTo(TrackingNumber::class);
119
+ }
120
+
121
+ /**
122
+ * The proof if any.
123
+ *
124
+ * @var Model
125
+ */
126
+ public function proof()
127
+ {
128
+ return $this->belongsTo(Proof::class);
129
+ }
130
+
131
+ public function setCodeAttribute($code)
132
+ {
133
+ $this->attributes['code'] = static::prepareCode($code);
134
+ }
135
+
136
+ public static function prepareCode($string)
137
+ {
138
+ $string = str_replace(' ', '_', $string);
139
+ $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string);
140
+ $string = strtoupper($string);
141
+
142
+ return $string;
143
+ }
144
+
145
+ public static function insertGetUuid($values = [], TrackingNumber $trackingNumber = null)
146
+ {
147
+ $instance = new static();
148
+ $fillable = $instance->getFillable();
149
+ $insertKeys = array_keys($values);
150
+ // clean insert data
151
+ foreach ($insertKeys as $key) {
152
+ if (!in_array($key, $fillable)) {
153
+ unset($values[$key]);
154
+ }
155
+ }
156
+
157
+ $values['uuid'] = $uuid = (string) Str::uuid();
158
+ $values['public_id'] = static::generatePublicId('status');
159
+ $values['_key'] = session('api_key') ?? 'console';
160
+ $values['created_at'] = Carbon::now()->toDateTimeString();
161
+ $values['company_uuid'] = session('company');
162
+
163
+ if ($trackingNumber) {
164
+ $values['tracking_number_uuid'] = $trackingNumber->uuid;
165
+ $values['status'] = Str::title($trackingNumber->type . ' created');
166
+ $values['details'] = 'New ' . Str::lower($trackingNumber->type) . ' created.';
167
+ }
168
+
169
+ if (isset($values['meta']) && (is_object($values['meta']) || is_array($values['meta']))) {
170
+ $values['meta'] = json_encode($values['meta']);
171
+ }
172
+
173
+ $result = static::insert($values);
174
+
175
+ return $result ? $uuid : false;
176
+ }
177
+ }