@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.
- package/.gitattributes +14 -0
- package/.php-cs-fixer.cache +1 -0
- package/.php-cs-fixer.php +29 -0
- package/LICENSE.md +16 -4
- package/README.md +103 -13
- package/addon/components/admin/visibility-controls.hbs +12 -0
- package/addon/components/admin/visibility-controls.js +82 -0
- package/addon/components/fleet-panel.js +13 -4
- package/addon/components/fleet-vehicle-listing.hbs +1 -1
- package/addon/components/layout/fleet-ops-sidebar.hbs +26 -0
- package/addon/components/layout/fleet-ops-sidebar.js +129 -0
- package/addon/engine.js +19 -0
- package/addon/helpers/is-section-visible.js +5 -0
- package/addon/routes/application.js +6 -2
- package/addon/routes/virtual.js +10 -0
- package/addon/routes.js +1 -0
- package/addon/templates/application.hbs +1 -19
- package/addon/templates/virtual.hbs +9 -0
- package/app/components/admin/visibility-controls.js +1 -0
- package/app/components/layout/fleet-ops-sidebar.js +1 -0
- package/app/helpers/is-section-visible.js +1 -0
- package/app/routes/virtual.js +1 -0
- package/app/templates/virtual.js +1 -0
- package/composer.json +85 -0
- package/extension.json +10 -0
- package/package.json +6 -6
- package/phpstan.neon.dist +8 -0
- package/phpunit.xml.dist +16 -0
- package/server/config/api.php +765 -0
- package/server/config/cache.stores.php +18 -0
- package/server/config/dompdf.php +242 -0
- package/server/config/fleetops.php +19 -0
- package/server/config/geocoder.php +108 -0
- package/server/data/globe.json +261 -0
- package/server/migrations/2023_04_27_053456_create_contacts_table.php +49 -0
- package/server/migrations/2023_04_27_053456_create_drivers_table.php +62 -0
- package/server/migrations/2023_04_27_053456_create_entities_table.php +67 -0
- package/server/migrations/2023_04_27_053456_create_fleet_drivers_table.php +39 -0
- package/server/migrations/2023_04_27_053456_create_fleets_table.php +47 -0
- package/server/migrations/2023_04_27_053456_create_fuel_reports_table.php +50 -0
- package/server/migrations/2023_04_27_053456_create_integrated_vendors_table.php +44 -0
- package/server/migrations/2023_04_27_053456_create_issues_table.php +53 -0
- package/server/migrations/2023_04_27_053456_create_orders_table.php +70 -0
- package/server/migrations/2023_04_27_053456_create_payloads_table.php +51 -0
- package/server/migrations/2023_04_27_053456_create_places_table.php +62 -0
- package/server/migrations/2023_04_27_053456_create_positions_table.php +46 -0
- package/server/migrations/2023_04_27_053456_create_proofs_table.php +44 -0
- package/server/migrations/2023_04_27_053456_create_purchase_rates_table.php +46 -0
- package/server/migrations/2023_04_27_053456_create_routes_table.php +40 -0
- package/server/migrations/2023_04_27_053456_create_service_areas_table.php +47 -0
- package/server/migrations/2023_04_27_053456_create_service_quote_items_table.php +42 -0
- package/server/migrations/2023_04_27_053456_create_service_quotes_table.php +47 -0
- package/server/migrations/2023_04_27_053456_create_service_rate_fees_table.php +45 -0
- package/server/migrations/2023_04_27_053456_create_service_rate_parcel_fees_table.php +47 -0
- package/server/migrations/2023_04_27_053456_create_service_rates_table.php +61 -0
- package/server/migrations/2023_04_27_053456_create_tracking_numbers_table.php +46 -0
- package/server/migrations/2023_04_27_053456_create_tracking_statuses_table.php +54 -0
- package/server/migrations/2023_04_27_053456_create_vehicles_table.php +84 -0
- package/server/migrations/2023_04_27_053456_create_vendors_table.php +56 -0
- package/server/migrations/2023_04_27_053456_create_waypoints_table.php +45 -0
- package/server/migrations/2023_04_27_053456_create_zones_table.php +46 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_companies_table.php +32 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_contacts_table.php +34 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_drivers_table.php +40 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_entities_table.php +40 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleet_drivers_table.php +34 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleets_table.php +36 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fuel_reports_table.php +36 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_integrated_vendors_table.php +34 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_issues_table.php +38 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_orders_table.php +48 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_payloads_table.php +40 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_places_table.php +32 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_positions_table.php +36 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_proofs_table.php +34 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_purchase_rates_table.php +38 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_routes_table.php +34 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_areas_table.php +34 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quote_items_table.php +32 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quotes_table.php +38 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_fees_table.php +32 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_parcel_fees_table.php +32 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rates_table.php +36 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_numbers_table.php +34 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_statuses_table.php +34 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vehicles_table.php +36 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vendors_table.php +40 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_waypoints_table.php +38 -0
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_zones_table.php +34 -0
- package/server/migrations/2023_09_14_074512_update_vehicles_table.php +100 -0
- package/server/migrations/2023_09_14_074619_create_vehicle_devices_table.php +44 -0
- package/server/migrations/2023_09_26_071205_add_online_column_to_vehicles_table.php +32 -0
- package/server/migrations/2023_09_26_083957_create_fleet_vehicles_table.php +45 -0
- package/server/migrations/2023_09_27_023757_add_column_to_fleets_table.php +46 -0
- package/server/migrations/2023_10_05_074811_update_vehicle.php +42 -0
- package/server/resources/views/labels/default.php +165 -0
- package/server/src/Auth/Schemas/FleetOps.php +75 -0
- package/server/src/Casts/MultiPolygon.php +50 -0
- package/server/src/Casts/Point.php +109 -0
- package/server/src/Casts/Polygon.php +46 -0
- package/server/src/Console/Commands/DispatchAdhocOrders.php +137 -0
- package/server/src/Console/Commands/DispatchOrders.php +71 -0
- package/server/src/Console/Commands/TrackOrderDistanceAndTime.php +62 -0
- package/server/src/Events/DriverLocationChanged.php +174 -0
- package/server/src/Events/DriverSimulatedLocationChanged.php +183 -0
- package/server/src/Events/EntityDriverAssigned.php +36 -0
- package/server/src/Events/OrderCanceled.php +15 -0
- package/server/src/Events/OrderCompleted.php +15 -0
- package/server/src/Events/OrderDispatchFailed.php +42 -0
- package/server/src/Events/OrderDispatched.php +15 -0
- package/server/src/Events/OrderDriverAssigned.php +15 -0
- package/server/src/Events/OrderReady.php +15 -0
- package/server/src/Events/OrderStarted.php +15 -0
- package/server/src/Exceptions/IntegratedVendorException.php +18 -0
- package/server/src/Expansions/UserExpansion.php +63 -0
- package/server/src/Exports/ContactExport.php +56 -0
- package/server/src/Exports/DriverExport.php +61 -0
- package/server/src/Exports/FleetExport.php +53 -0
- package/server/src/Exports/PlaceExport.php +55 -0
- package/server/src/Exports/ServiceAreaExport.php +58 -0
- package/server/src/Exports/VehicleExport.php +57 -0
- package/server/src/Exports/VendorExport.php +57 -0
- package/server/src/Http/Controllers/Api/v1/ContactController.php +133 -0
- package/server/src/Http/Controllers/Api/v1/DriverController.php +691 -0
- package/server/src/Http/Controllers/Api/v1/EntityController.php +230 -0
- package/server/src/Http/Controllers/Api/v1/FleetController.php +146 -0
- package/server/src/Http/Controllers/Api/v1/LabelController.php +63 -0
- package/server/src/Http/Controllers/Api/v1/OrderController.php +1114 -0
- package/server/src/Http/Controllers/Api/v1/PayloadController.php +195 -0
- package/server/src/Http/Controllers/Api/v1/PlaceController.php +333 -0
- package/server/src/Http/Controllers/Api/v1/PurchaseRateController.php +199 -0
- package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +133 -0
- package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +381 -0
- package/server/src/Http/Controllers/Api/v1/ServiceRateController.php +223 -0
- package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +146 -0
- package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +138 -0
- package/server/src/Http/Controllers/Api/v1/VehicleController.php +191 -0
- package/server/src/Http/Controllers/Api/v1/VendorController.php +159 -0
- package/server/src/Http/Controllers/Api/v1/ZoneController.php +146 -0
- package/server/src/Http/Controllers/FleetOpsController.php +13 -0
- package/server/src/Http/Controllers/Internal/v1/ContactController.php +69 -0
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +261 -0
- package/server/src/Http/Controllers/Internal/v1/EntityController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/FleetController.php +152 -0
- package/server/src/Http/Controllers/Internal/v1/FleetOpsLookupController.php +80 -0
- package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/GeocoderController.php +96 -0
- package/server/src/Http/Controllers/Internal/v1/IntegratedVendorController.php +63 -0
- package/server/src/Http/Controllers/Internal/v1/IssueController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +127 -0
- package/server/src/Http/Controllers/Internal/v1/MetricsController.php +75 -0
- package/server/src/Http/Controllers/Internal/v1/MorphController.php +77 -0
- package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +269 -0
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +564 -0
- package/server/src/Http/Controllers/Internal/v1/PayloadController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/PlaceController.php +163 -0
- package/server/src/Http/Controllers/Internal/v1/ProofController.php +139 -0
- package/server/src/Http/Controllers/Internal/v1/PurchaseRateController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/RouteController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +32 -0
- package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +345 -0
- package/server/src/Http/Controllers/Internal/v1/ServiceRateController.php +47 -0
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +30 -0
- package/server/src/Http/Controllers/Internal/v1/TrackingNumberController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/TrackingStatusController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +65 -0
- package/server/src/Http/Controllers/Internal/v1/VehicleDeviceController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/VendorController.php +120 -0
- package/server/src/Http/Controllers/Internal/v1/ZoneController.php +15 -0
- package/server/src/Http/Filter/ContactFilter.php +86 -0
- package/server/src/Http/Filter/DriverFilter.php +148 -0
- package/server/src/Http/Filter/FleetFilter.php +108 -0
- package/server/src/Http/Filter/IntegratedVendorFilter.php +13 -0
- package/server/src/Http/Filter/OrderFilter.php +242 -0
- package/server/src/Http/Filter/PlaceFilter.php +111 -0
- package/server/src/Http/Filter/ServiceAreaFilter.php +13 -0
- package/server/src/Http/Filter/ServiceQuoteFilter.php +13 -0
- package/server/src/Http/Filter/ServiceRateFilter.php +33 -0
- package/server/src/Http/Filter/TrackingStatusFilter.php +43 -0
- package/server/src/Http/Filter/VehicleFilter.php +91 -0
- package/server/src/Http/Filter/VendorFilter.php +83 -0
- package/server/src/Http/Filter/ZoneFilter.php +13 -0
- package/server/src/Http/Requests/CancelOrderRequest.php +31 -0
- package/server/src/Http/Requests/CreateContactRequest.php +33 -0
- package/server/src/Http/Requests/CreateDriverRequest.php +55 -0
- package/server/src/Http/Requests/CreateEntityRequest.php +43 -0
- package/server/src/Http/Requests/CreateFleetRequest.php +32 -0
- package/server/src/Http/Requests/CreateOrderRequest.php +66 -0
- package/server/src/Http/Requests/CreatePayloadRequest.php +37 -0
- package/server/src/Http/Requests/CreatePlaceRequest.php +38 -0
- package/server/src/Http/Requests/CreatePurchaseRateRequest.php +33 -0
- package/server/src/Http/Requests/CreateServiceAreaRequest.php +35 -0
- package/server/src/Http/Requests/CreateServiceQuoteRequest.php +29 -0
- package/server/src/Http/Requests/CreateServiceRateRequest.php +56 -0
- package/server/src/Http/Requests/CreateTrackingNumberRequest.php +34 -0
- package/server/src/Http/Requests/CreateTrackingStatusRequest.php +42 -0
- package/server/src/Http/Requests/CreateVehicleRequest.php +32 -0
- package/server/src/Http/Requests/CreateVendorRequest.php +35 -0
- package/server/src/Http/Requests/CreateZoneRequest.php +35 -0
- package/server/src/Http/Requests/DecodeTrackingNumberQR.php +30 -0
- package/server/src/Http/Requests/DriverSimulationRequest.php +46 -0
- package/server/src/Http/Requests/Internal/AssignOrderRequest.php +31 -0
- package/server/src/Http/Requests/Internal/CreateDriverRequest.php +42 -0
- package/server/src/Http/Requests/Internal/FleetActionRequest.php +32 -0
- package/server/src/Http/Requests/Internal/UpdateDriverRequest.php +7 -0
- package/server/src/Http/Requests/QueryServiceQuotesRequest.php +41 -0
- package/server/src/Http/Requests/UpdateContactRequest.php +20 -0
- package/server/src/Http/Requests/UpdateDriverRequest.php +7 -0
- package/server/src/Http/Requests/UpdateEntityRequest.php +7 -0
- package/server/src/Http/Requests/UpdateFleetRequest.php +7 -0
- package/server/src/Http/Requests/UpdateOrderRequest.php +7 -0
- package/server/src/Http/Requests/UpdatePayloadRequest.php +7 -0
- package/server/src/Http/Requests/UpdatePlaceRequest.php +7 -0
- package/server/src/Http/Requests/UpdatePurchaseRateRequest.php +7 -0
- package/server/src/Http/Requests/UpdateServiceAreaRequest.php +29 -0
- package/server/src/Http/Requests/UpdateServiceQuoteRequest.php +29 -0
- package/server/src/Http/Requests/UpdateServiceRateRequest.php +29 -0
- package/server/src/Http/Requests/UpdateTrackingNumberRequest.php +7 -0
- package/server/src/Http/Requests/UpdateTrackingStatusRequest.php +32 -0
- package/server/src/Http/Requests/UpdateVehicleRequest.php +7 -0
- package/server/src/Http/Requests/UpdateVendorRequest.php +7 -0
- package/server/src/Http/Requests/UpdateZoneRequest.php +7 -0
- package/server/src/Http/Resources/Internal/v1/IntegratedVendorFacilitator.php +37 -0
- package/server/src/Http/Resources/Internal/v1/Vehicle.php +33 -0
- package/server/src/Http/Resources/Internal/v1/Waypoint.php +34 -0
- package/server/src/Http/Resources/v1/Contact.php +62 -0
- package/server/src/Http/Resources/v1/CurrentJob.php +36 -0
- package/server/src/Http/Resources/v1/DeletedResource.php +61 -0
- package/server/src/Http/Resources/v1/Driver.php +89 -0
- package/server/src/Http/Resources/v1/Entity.php +107 -0
- package/server/src/Http/Resources/v1/Fleet.php +60 -0
- package/server/src/Http/Resources/v1/FuelReport.php +67 -0
- package/server/src/Http/Resources/v1/Order.php +131 -0
- package/server/src/Http/Resources/v1/Payload.php +94 -0
- package/server/src/Http/Resources/v1/Place.php +84 -0
- package/server/src/Http/Resources/v1/Proof.php +36 -0
- package/server/src/Http/Resources/v1/PurchaseRate.php +77 -0
- package/server/src/Http/Resources/v1/ServiceArea.php +55 -0
- package/server/src/Http/Resources/v1/ServiceQuote.php +57 -0
- package/server/src/Http/Resources/v1/ServiceRate.php +94 -0
- package/server/src/Http/Resources/v1/ServiceRateFee.php +58 -0
- package/server/src/Http/Resources/v1/ServiceRateParcelFee.php +48 -0
- package/server/src/Http/Resources/v1/TrackingNumber.php +62 -0
- package/server/src/Http/Resources/v1/TrackingStatus.php +84 -0
- package/server/src/Http/Resources/v1/Vehicle.php +75 -0
- package/server/src/Http/Resources/v1/VehicleDevice.php +44 -0
- package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +72 -0
- package/server/src/Http/Resources/v1/Vendor.php +72 -0
- package/server/src/Http/Resources/v1/Zone.php +60 -0
- package/server/src/Imports/OrdersImport.php +18 -0
- package/server/src/Integrations/Lalamove/Lalamove.php +678 -0
- package/server/src/Integrations/Lalamove/LalamoveDeliveryStop.php +97 -0
- package/server/src/Integrations/Lalamove/LalamoveMarket.php +123 -0
- package/server/src/Integrations/Lalamove/LalamoveServiceType.php +161 -0
- package/server/src/Jobs/SimulateDrivingRoute.php +81 -0
- package/server/src/Jobs/SimulateWaypointReached.php +79 -0
- package/server/src/Listeners/HandleOrderCanceled.php +46 -0
- package/server/src/Listeners/HandleOrderCreated.php +23 -0
- package/server/src/Listeners/HandleOrderDispatchFailed.php +35 -0
- package/server/src/Listeners/HandleOrderDispatched.php +108 -0
- package/server/src/Listeners/HandleOrderDriverAssigned.php +42 -0
- package/server/src/Listeners/HandleOrderReady.php +27 -0
- package/server/src/Listeners/HandleUserRemovedFromCompany.php +31 -0
- package/server/src/Models/Contact.php +239 -0
- package/server/src/Models/Driver.php +543 -0
- package/server/src/Models/Entity.php +416 -0
- package/server/src/Models/Fleet.php +203 -0
- package/server/src/Models/FleetDriver.php +73 -0
- package/server/src/Models/FleetVehicle.php +73 -0
- package/server/src/Models/FuelReport.php +125 -0
- package/server/src/Models/IntegratedVendor.php +219 -0
- package/server/src/Models/Issue.php +111 -0
- package/server/src/Models/Order.php +1132 -0
- package/server/src/Models/Payload.php +699 -0
- package/server/src/Models/Place.php +656 -0
- package/server/src/Models/Position.php +119 -0
- package/server/src/Models/Proof.php +94 -0
- package/server/src/Models/PurchaseRate.php +208 -0
- package/server/src/Models/Route.php +128 -0
- package/server/src/Models/ServiceArea.php +161 -0
- package/server/src/Models/ServiceQuote.php +207 -0
- package/server/src/Models/ServiceQuoteItem.php +46 -0
- package/server/src/Models/ServiceRate.php +953 -0
- package/server/src/Models/ServiceRateFee.php +96 -0
- package/server/src/Models/ServiceRateParcelFee.php +116 -0
- package/server/src/Models/TrackingNumber.php +310 -0
- package/server/src/Models/TrackingStatus.php +177 -0
- package/server/src/Models/Vehicle.php +452 -0
- package/server/src/Models/VehicleDevice.php +79 -0
- package/server/src/Models/Vendor.php +244 -0
- package/server/src/Models/Waypoint.php +226 -0
- package/server/src/Models/Zone.php +95 -0
- package/server/src/Notifications/OrderAssigned.php +140 -0
- package/server/src/Notifications/OrderCanceled.php +129 -0
- package/server/src/Notifications/OrderDispatchFailed.php +81 -0
- package/server/src/Notifications/OrderDispatched.php +173 -0
- package/server/src/Notifications/OrderPing.php +162 -0
- package/server/src/Notifications/OrderSplit.php +56 -0
- package/server/src/Observers/DriverObserver.php +34 -0
- package/server/src/Observers/OrderObserver.php +34 -0
- package/server/src/Observers/PayloadObserver.php +30 -0
- package/server/src/Observers/PlaceObserver.php +26 -0
- package/server/src/Observers/PurchaseRateObserver.php +61 -0
- package/server/src/Observers/ServiceAreaObserver.php +35 -0
- package/server/src/Observers/ServiceRateObserver.php +78 -0
- package/server/src/Observers/TrackingNumberObserver.php +44 -0
- package/server/src/Observers/UserObserver.php +20 -0
- package/server/src/Observers/VehicleObserver.php +66 -0
- package/server/src/Providers/EventServiceProvider.php +30 -0
- package/server/src/Providers/FleetOpsServiceProvider.php +94 -0
- package/server/src/Rules/ResolvablePoint.php +37 -0
- package/server/src/Scopes/DriverScope.php +21 -0
- package/server/src/Support/Algo.php +55 -0
- package/server/src/Support/DistanceMatrix.php +27 -0
- package/server/src/Support/Encoding/Polyline.php +168 -0
- package/server/src/Support/Flow.php +622 -0
- package/server/src/Support/Geocoding.php +216 -0
- package/server/src/Support/IntegratedVendors.php +287 -0
- package/server/src/Support/Metrics.php +305 -0
- package/server/src/Support/OSRM.php +191 -0
- package/server/src/Support/ParsePhone.php +21 -0
- package/server/src/Support/Utils.php +1145 -0
- package/server/src/Traits/HasTrackingNumber.php +185 -0
- package/server/src/routes.php +381 -0
- package/server/tests/Feature.php +5 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Models;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\Casts\Json;
|
|
6
|
+
use Fleetbase\FleetOps\Casts\Point;
|
|
7
|
+
use Fleetbase\FleetOps\Support\Utils;
|
|
8
|
+
use Fleetbase\Models\Model;
|
|
9
|
+
use Fleetbase\Traits\HasApiModelBehavior;
|
|
10
|
+
use Fleetbase\Traits\HasPublicId;
|
|
11
|
+
use Fleetbase\Traits\HasUuid;
|
|
12
|
+
use Fleetbase\Traits\Searchable;
|
|
13
|
+
use Fleetbase\Traits\TracksApiCredential;
|
|
14
|
+
use Grimzy\LaravelMysqlSpatial\Eloquent\SpatialTrait;
|
|
15
|
+
use Illuminate\Support\Str;
|
|
16
|
+
use Spatie\Activitylog\Traits\LogsActivity;
|
|
17
|
+
use Spatie\Sluggable\HasSlug;
|
|
18
|
+
use Spatie\Sluggable\SlugOptions;
|
|
19
|
+
|
|
20
|
+
class Vehicle extends Model
|
|
21
|
+
{
|
|
22
|
+
use HasUuid;
|
|
23
|
+
use HasPublicId;
|
|
24
|
+
use TracksApiCredential;
|
|
25
|
+
use HasApiModelBehavior;
|
|
26
|
+
use SpatialTrait;
|
|
27
|
+
use Searchable;
|
|
28
|
+
use HasSlug;
|
|
29
|
+
use LogsActivity;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The database table used by the model.
|
|
33
|
+
*
|
|
34
|
+
* @var string
|
|
35
|
+
*/
|
|
36
|
+
protected $table = 'vehicles';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The type of public Id to generate.
|
|
40
|
+
*
|
|
41
|
+
* @var string
|
|
42
|
+
*/
|
|
43
|
+
protected $publicIdType = 'vehicle';
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The attributes that can be queried.
|
|
47
|
+
*
|
|
48
|
+
* @var array
|
|
49
|
+
*/
|
|
50
|
+
protected $searchableColumns = ['make', 'model', 'year', 'plate_number', 'internal_id', 'vin', 'public_id'];
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Attributes that is filterable on this model.
|
|
54
|
+
*
|
|
55
|
+
* @var array
|
|
56
|
+
*/
|
|
57
|
+
protected $filterParams = ['vendor'];
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Relationships to auto load with driver.
|
|
61
|
+
*
|
|
62
|
+
* @var array
|
|
63
|
+
*/
|
|
64
|
+
protected $with = [];
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Properties which activity needs to be logged.
|
|
68
|
+
*
|
|
69
|
+
* @var array
|
|
70
|
+
*/
|
|
71
|
+
protected static $logAttributes = '*';
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Do not log empty changed.
|
|
75
|
+
*
|
|
76
|
+
* @var bool
|
|
77
|
+
*/
|
|
78
|
+
protected static $submitEmptyLogs = false;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The name of the subject to log.
|
|
82
|
+
*
|
|
83
|
+
* @var string
|
|
84
|
+
*/
|
|
85
|
+
protected static $logName = 'vehicle';
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get the options for generating the slug.
|
|
89
|
+
*/
|
|
90
|
+
public function getSlugOptions(): SlugOptions
|
|
91
|
+
{
|
|
92
|
+
return SlugOptions::create()
|
|
93
|
+
->generateSlugsFrom(['year', 'make', 'model', 'trim', 'plate_number', 'internal_id'])
|
|
94
|
+
->saveSlugsTo('slug');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The attributes that are mass assignable.
|
|
99
|
+
*
|
|
100
|
+
* @var array
|
|
101
|
+
*/
|
|
102
|
+
protected $fillable = [
|
|
103
|
+
'company_uuid',
|
|
104
|
+
'vendor_uuid',
|
|
105
|
+
'photo_uuid',
|
|
106
|
+
'avatar_url',
|
|
107
|
+
'make',
|
|
108
|
+
'location',
|
|
109
|
+
'speed',
|
|
110
|
+
'heading',
|
|
111
|
+
'altitude',
|
|
112
|
+
'model',
|
|
113
|
+
'year',
|
|
114
|
+
'trim',
|
|
115
|
+
'type',
|
|
116
|
+
'plate_number',
|
|
117
|
+
'vin',
|
|
118
|
+
'vin_data',
|
|
119
|
+
'meta',
|
|
120
|
+
'telematics',
|
|
121
|
+
'status',
|
|
122
|
+
'online',
|
|
123
|
+
'slug',
|
|
124
|
+
];
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Set attributes and defaults.
|
|
128
|
+
*
|
|
129
|
+
* @var array
|
|
130
|
+
*/
|
|
131
|
+
protected $attributes = [
|
|
132
|
+
'avatar_url' => 'https://flb-assets.s3-ap-southeast-1.amazonaws.com/static/vehicle-icons/mini_bus.svg',
|
|
133
|
+
];
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Dynamic attributes that are appended to object.
|
|
137
|
+
*
|
|
138
|
+
* @var array
|
|
139
|
+
*/
|
|
140
|
+
protected $appends = ['display_name', 'photo_url', 'driver_name', 'vendor_name'];
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* The attributes excluded from the model's JSON form.
|
|
144
|
+
*
|
|
145
|
+
* @var array
|
|
146
|
+
*/
|
|
147
|
+
protected $hidden = [
|
|
148
|
+
'driver',
|
|
149
|
+
'vendor',
|
|
150
|
+
];
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* The attributes that are spatial columns.
|
|
154
|
+
*
|
|
155
|
+
* @var array
|
|
156
|
+
*/
|
|
157
|
+
protected $spatialFields = ['location'];
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* The attributes that should be cast to native types.
|
|
161
|
+
*
|
|
162
|
+
* @var array
|
|
163
|
+
*/
|
|
164
|
+
protected $casts = [
|
|
165
|
+
'location' => Point::class,
|
|
166
|
+
'meta' => Json::class,
|
|
167
|
+
'telematics' => Json::class,
|
|
168
|
+
'model' => Json::class,
|
|
169
|
+
'vin_data' => Json::class,
|
|
170
|
+
'online' => 'boolean',
|
|
171
|
+
];
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
|
175
|
+
*/
|
|
176
|
+
public function photo()
|
|
177
|
+
{
|
|
178
|
+
return $this->belongsTo(\Fleetbase\Models\File::class);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @return \Illuminate\Database\Eloquent\Relations\HasOne
|
|
183
|
+
*/
|
|
184
|
+
public function driver()
|
|
185
|
+
{
|
|
186
|
+
return $this->hasOne(Driver::class)->without(['vehicle']);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
|
191
|
+
*/
|
|
192
|
+
public function vendor()
|
|
193
|
+
{
|
|
194
|
+
return $this->belongsTo(Vendor::class);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @return \Illuminate\Database\Eloquent\Relations\HasManyThrough
|
|
199
|
+
*/
|
|
200
|
+
public function fleets()
|
|
201
|
+
{
|
|
202
|
+
return $this->hasManyThrough(Fleet::class, FleetVehicle::class, 'vehicle_uuid', 'uuid', 'uuid', 'fleet_uuid');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* @return \Illuminate\Database\Eloquent\Relations\HasMany
|
|
207
|
+
*/
|
|
208
|
+
public function devices()
|
|
209
|
+
{
|
|
210
|
+
return $this->hasMany(VehicleDevice::class);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Get avatar URL attribute.
|
|
215
|
+
*
|
|
216
|
+
* @return string
|
|
217
|
+
*/
|
|
218
|
+
public function getPhotoUrlAttribute()
|
|
219
|
+
{
|
|
220
|
+
return data_get($this, 'photo.url', 'https://s3.ap-southeast-1.amazonaws.com/flb-assets/static/vehicle-placeholder.png');
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* The name generated from make model and year.
|
|
225
|
+
*
|
|
226
|
+
* @return string
|
|
227
|
+
*/
|
|
228
|
+
public function getDisplayNameAttribute()
|
|
229
|
+
{
|
|
230
|
+
// Initialize an empty array to hold the name segments
|
|
231
|
+
$nameSegments = [];
|
|
232
|
+
|
|
233
|
+
// Populate the nameSegments array with the values of the attributes
|
|
234
|
+
$keys = ['year', 'make', 'model', 'trim', 'plate_number', 'internal_id'];
|
|
235
|
+
foreach ($keys as $key) {
|
|
236
|
+
if (!empty($this->{$key})) {
|
|
237
|
+
$nameSegments[] = $this->{$key};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Join the name segments into a single string, separated by spaces
|
|
242
|
+
$displayName = implode(' ', $nameSegments);
|
|
243
|
+
|
|
244
|
+
// Trim any leading or trailing whitespace
|
|
245
|
+
$displayName = trim($displayName);
|
|
246
|
+
|
|
247
|
+
return $displayName;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Get avatar url.
|
|
252
|
+
*
|
|
253
|
+
* @return string|null
|
|
254
|
+
*/
|
|
255
|
+
public function getAvatarUrlAttribute($value)
|
|
256
|
+
{
|
|
257
|
+
if (!$value) {
|
|
258
|
+
return static::getAvatar();
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return $value;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Get the driver's name assigned to vehicle.
|
|
266
|
+
*
|
|
267
|
+
* @return string|null
|
|
268
|
+
*/
|
|
269
|
+
public function getDriverNameAttribute()
|
|
270
|
+
{
|
|
271
|
+
return data_get($this, 'driver.name');
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Get the driver's public id assigned to vehicle.
|
|
276
|
+
*
|
|
277
|
+
* @return string|null
|
|
278
|
+
*/
|
|
279
|
+
public function getDriverIdAttribute()
|
|
280
|
+
{
|
|
281
|
+
return data_get($this, 'driver.public_id');
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Get the driver's uuid assigned to vehicle.
|
|
286
|
+
*
|
|
287
|
+
* @return string|null
|
|
288
|
+
*/
|
|
289
|
+
public function getDriverUuidAttribute()
|
|
290
|
+
{
|
|
291
|
+
return data_get($this, 'driver.uuid');
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Get drivers vendor ID.
|
|
296
|
+
*
|
|
297
|
+
* @return string|null
|
|
298
|
+
*/
|
|
299
|
+
public function getVendorIdAttribute()
|
|
300
|
+
{
|
|
301
|
+
return data_get($this, 'vendor.public_id');
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Get drivers vendor name.
|
|
306
|
+
*
|
|
307
|
+
* @return string|null
|
|
308
|
+
*/
|
|
309
|
+
public function getVendorNameAttribute()
|
|
310
|
+
{
|
|
311
|
+
return data_get($this, 'vendor.name');
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Get the vehicles model data attributes.
|
|
316
|
+
*/
|
|
317
|
+
public function getModelDataAttribute()
|
|
318
|
+
{
|
|
319
|
+
$attributes = $this->getFillable();
|
|
320
|
+
$modelAttributes = [];
|
|
321
|
+
foreach ($attributes as $attr) {
|
|
322
|
+
if (Str::startsWith($attr, 'model_')) {
|
|
323
|
+
$modelAttributes[str_replace('model_', '', $attr)] = $this->{$attr};
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return $modelAttributes;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Get an avatar url by key.
|
|
332
|
+
*
|
|
333
|
+
* @param string $key
|
|
334
|
+
*
|
|
335
|
+
* @return string
|
|
336
|
+
*/
|
|
337
|
+
public static function getAvatar($key = 'mini_bus')
|
|
338
|
+
{
|
|
339
|
+
return static::getAvatarOptions()->get($key);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Get all avatar options for a vehicle.
|
|
344
|
+
*
|
|
345
|
+
* @return \Illuminate\Support\Collection
|
|
346
|
+
*/
|
|
347
|
+
public static function getAvatarOptions()
|
|
348
|
+
{
|
|
349
|
+
$options = [
|
|
350
|
+
'2_door_truck.svg',
|
|
351
|
+
'3_door_hatchback.svg',
|
|
352
|
+
'4_door_truck.svg',
|
|
353
|
+
'5_door_hatchback.svg',
|
|
354
|
+
'ambulance.svg',
|
|
355
|
+
'convertible.svg',
|
|
356
|
+
'coupe.svg',
|
|
357
|
+
'electric_car.svg',
|
|
358
|
+
'fastback.svg',
|
|
359
|
+
'full_size_suv.svg',
|
|
360
|
+
'hot_hatch.svg',
|
|
361
|
+
'large_ambulance.svg',
|
|
362
|
+
'light_commercial_truck.svg',
|
|
363
|
+
'light_commercial_van.svg',
|
|
364
|
+
'limousine.svg',
|
|
365
|
+
'mid_size_suv.svg',
|
|
366
|
+
'mini_bus.svg',
|
|
367
|
+
'mini_van.svg',
|
|
368
|
+
'muscle_car.svg',
|
|
369
|
+
'police_1.svg',
|
|
370
|
+
'police_2.svg',
|
|
371
|
+
'roadster.svg',
|
|
372
|
+
'sedan.svg',
|
|
373
|
+
'small_3_door_hatchback.svg',
|
|
374
|
+
'small_5_door_hatchback.svg',
|
|
375
|
+
'sportscar.svg',
|
|
376
|
+
'station_wagon.svg',
|
|
377
|
+
'taxi.svg',
|
|
378
|
+
];
|
|
379
|
+
|
|
380
|
+
return collect($options)->mapWithKeys(
|
|
381
|
+
function ($option) {
|
|
382
|
+
$key = str_replace('.svg', '', $option);
|
|
383
|
+
|
|
384
|
+
return [$key => Utils::assetFromS3('static/vehicle-icons/' . $option)];
|
|
385
|
+
}
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Assign a driver to this vehicle.
|
|
391
|
+
*
|
|
392
|
+
* @return void
|
|
393
|
+
*/
|
|
394
|
+
public function assignDriver(Driver $driver)
|
|
395
|
+
{
|
|
396
|
+
$driver->assignVehicle($this);
|
|
397
|
+
|
|
398
|
+
return $this;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Updates the position of the vehicle, creating a new Position record if
|
|
403
|
+
* the driver has moved more than 100 meters or if it's their first recorded position.
|
|
404
|
+
*
|
|
405
|
+
* @param \Fleetbase\FleetOps\Models\Order|null $order The order to consider when updating the position (default: null)
|
|
406
|
+
*
|
|
407
|
+
* @return \Fleetbase\FleetOps\Models\Position|null The created Position object, or null if no new position was created
|
|
408
|
+
*/
|
|
409
|
+
public function updatePositionWithOrderContext(Order $order = null): ?Position
|
|
410
|
+
{
|
|
411
|
+
$position = null;
|
|
412
|
+
$lastPosition = $this->positions()->whereCompanyUuid(session('company'))->latest()->first();
|
|
413
|
+
|
|
414
|
+
// get driver if applicable
|
|
415
|
+
$driver = $this->load('driver')->driver;
|
|
416
|
+
|
|
417
|
+
// get the vehicle's driver's current order
|
|
418
|
+
$currentOrder = $order;
|
|
419
|
+
|
|
420
|
+
if (!$currentOrder && $driver) {
|
|
421
|
+
$currentOrder = $driver->currentOrder()->with(['payload'])->first();
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
$destination = $currentOrder ? $currentOrder->payload->getPickupOrCurrentWaypoint() : null;
|
|
425
|
+
|
|
426
|
+
$positionData = [
|
|
427
|
+
'company_uuid' => session('company', $this->company_uuid),
|
|
428
|
+
'subject_uuid' => $this->uuid,
|
|
429
|
+
'subject_type' => Utils::getMutationType($this),
|
|
430
|
+
'coordinates' => $this->location,
|
|
431
|
+
];
|
|
432
|
+
|
|
433
|
+
if ($currentOrder) {
|
|
434
|
+
$positionData['order_uuid'] = $currentOrder->uuid;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if ($destination) {
|
|
438
|
+
$positionData['destination_uuid'] = $destination->uuid;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
$isFirstPosition = !$lastPosition;
|
|
442
|
+
$isPast50Meters = $lastPosition && Utils::vincentyGreatCircleDistance($this->location, $lastPosition->coordinates) > 50;
|
|
443
|
+
$position = null;
|
|
444
|
+
|
|
445
|
+
// create the first position
|
|
446
|
+
if ($isFirstPosition || $isPast50Meters) {
|
|
447
|
+
$position = Position::create($positionData);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
return $position;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
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\HasUuid;
|
|
9
|
+
use Fleetbase\Traits\TracksApiCredential;
|
|
10
|
+
|
|
11
|
+
class VehicleDevice extends Model
|
|
12
|
+
{
|
|
13
|
+
use HasUuid;
|
|
14
|
+
use TracksApiCredential;
|
|
15
|
+
use HasApiModelBehavior;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The database table used by the model.
|
|
19
|
+
*
|
|
20
|
+
* @var string
|
|
21
|
+
*/
|
|
22
|
+
protected $table = 'vehicle_devices';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Attributes that is filterable on this model.
|
|
26
|
+
*
|
|
27
|
+
* @var array
|
|
28
|
+
*/
|
|
29
|
+
protected $fillable = [
|
|
30
|
+
'uuid',
|
|
31
|
+
'vehicle_uuid',
|
|
32
|
+
'device_type',
|
|
33
|
+
'device_id',
|
|
34
|
+
'device_provider',
|
|
35
|
+
'device_name',
|
|
36
|
+
'device_model',
|
|
37
|
+
'device_location',
|
|
38
|
+
'manufacturer',
|
|
39
|
+
'serial_number',
|
|
40
|
+
'installation_date',
|
|
41
|
+
'last_maintenance_date',
|
|
42
|
+
'meta',
|
|
43
|
+
'data',
|
|
44
|
+
'online',
|
|
45
|
+
'status',
|
|
46
|
+
'data_frequency',
|
|
47
|
+
'notes',
|
|
48
|
+
];
|
|
49
|
+
/**
|
|
50
|
+
* The attributes that should be cast to native types.
|
|
51
|
+
*
|
|
52
|
+
* @var array
|
|
53
|
+
*/
|
|
54
|
+
protected $casts = [
|
|
55
|
+
'meta' => Json::class,
|
|
56
|
+
'data' => Json::class,
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Dynamic attributes that are appended to object.
|
|
61
|
+
*
|
|
62
|
+
* @var array
|
|
63
|
+
*/
|
|
64
|
+
protected $appends = [];
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Filterable params.
|
|
68
|
+
*
|
|
69
|
+
* @var array
|
|
70
|
+
*/
|
|
71
|
+
protected $filterParams = [];
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The attributes excluded from the model's JSON form.
|
|
75
|
+
*
|
|
76
|
+
* @var array
|
|
77
|
+
*/
|
|
78
|
+
protected $hidden = [];
|
|
79
|
+
}
|