@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.
- package/.gitattributes +14 -0
- package/.php-cs-fixer.php +29 -0
- package/LICENSE.md +16 -4
- package/README.md +103 -13
- package/composer.json +85 -0
- package/extension.json +10 -0
- package/package.json +3 -3
- 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,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
|
+
}
|