@fleetbase/fleetops-engine 0.6.51 → 0.6.52
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/README.md +0 -2
- package/addon/components/cell/telematic-provider.hbs +16 -0
- package/addon/components/cell/telematic-provider.js +36 -0
- package/addon/components/cell/telematic-status.hbs +1 -0
- package/addon/components/cell/telematic-status.js +39 -0
- package/addon/components/device/manager.hbs +5 -6
- package/addon/components/device/manager.js +12 -15
- package/addon/components/driver/details.hbs +1 -1
- package/addon/components/fleet/vehicle-listing.js +1 -0
- package/addon/components/fuel-integration/form.hbs +200 -0
- package/addon/components/fuel-integration/form.js +242 -0
- package/addon/components/fuel-integration/hub.hbs +154 -0
- package/addon/components/fuel-integration/hub.js +165 -0
- package/addon/components/fuel-integration/matching-priority.hbs +76 -0
- package/addon/components/fuel-integration/matching-priority.js +145 -0
- package/addon/components/fuel-report/details.hbs +13 -1
- package/addon/components/issue/details.hbs +3 -57
- package/addon/components/issue/details.js +0 -96
- package/addon/components/layout/fleet-ops-sidebar.js +20 -2
- package/addon/components/map/drawer/device-event-listing.hbs +12 -2
- package/addon/components/map/drawer/driver-listing.hbs +14 -1
- package/addon/components/map/drawer/place-listing.hbs +14 -1
- package/addon/components/map/drawer/position-listing.hbs +12 -2
- package/addon/components/map/drawer/vehicle-listing.hbs +14 -1
- package/addon/components/modals/assigned-orders.hbs +40 -0
- package/addon/components/modals/attach-device.hbs +4 -3
- package/addon/components/modals/attach-telematic-device.hbs +25 -0
- package/addon/components/modals/attach-telematic-device.js +3 -0
- package/addon/components/modals/driver-assign-order.hbs +7 -58
- package/addon/components/modals/driver-assign-vehicle.hbs +10 -2
- package/addon/components/modals/fleet-assign-driver.hbs +18 -0
- package/addon/components/modals/fleet-assign-driver.js +3 -0
- package/addon/components/modals/fleet-assign-vehicle.hbs +18 -0
- package/addon/components/modals/fleet-assign-vehicle.js +3 -0
- package/addon/components/modals/telematic-connection-diagnostics.hbs +75 -0
- package/addon/components/modals/telematic-connection-diagnostics.js +287 -0
- package/addon/components/modals/vehicle-details.hbs +6 -1
- package/addon/components/modals/vehicle-form.hbs +8 -1
- package/addon/components/order/card.hbs +106 -0
- package/addon/components/order/card.js +257 -0
- package/addon/components/order/form/service-rate.hbs +2 -0
- package/addon/components/service-rate/form.hbs +3 -2
- package/addon/components/telematic/details.hbs +98 -87
- package/addon/components/telematic/details.js +230 -1
- package/addon/components/telematic/form.hbs +303 -72
- package/addon/components/telematic/form.js +519 -3
- package/addon/components/telematic/hub.hbs +149 -0
- package/addon/components/telematic/hub.js +142 -0
- package/addon/components/telematic/settings.hbs +152 -0
- package/addon/components/telematic/settings.js +45 -0
- package/addon/components/telematic/tab-empty-state.hbs +29 -0
- package/addon/components/telematic/tab-empty-state.js +33 -0
- package/addon/components/vehicle/details.hbs +6 -1
- package/addon/components/vehicle/form.hbs +2 -1
- package/addon/components/widget/fuel-providers.hbs +43 -0
- package/addon/components/widget/fuel-providers.js +27 -0
- package/addon/controllers/connectivity/devices/index/details.js +27 -1
- package/addon/controllers/connectivity/devices/index.js +14 -0
- package/addon/controllers/connectivity/fuel-providers/details/sync.js +18 -0
- package/addon/controllers/connectivity/fuel-providers/details/transactions.js +24 -0
- package/addon/controllers/connectivity/fuel-providers/details.js +69 -0
- package/addon/controllers/connectivity/fuel-providers/edit.js +24 -0
- package/addon/controllers/connectivity/fuel-providers/index.js +177 -0
- package/addon/controllers/connectivity/fuel-providers/new.js +37 -0
- package/addon/controllers/connectivity/telematics/details/attachments.js +247 -0
- package/addon/controllers/connectivity/telematics/details/devices.js +368 -0
- package/addon/controllers/connectivity/telematics/details/events.js +244 -0
- package/addon/controllers/connectivity/telematics/details/index.js +3 -0
- package/addon/controllers/connectivity/telematics/details/logs.js +43 -0
- package/addon/controllers/connectivity/telematics/details/sensors.js +270 -0
- package/addon/controllers/connectivity/telematics/details.js +149 -0
- package/addon/controllers/connectivity/telematics/{index/edit.js → edit.js} +15 -4
- package/addon/controllers/connectivity/telematics/index.js +25 -5
- package/addon/controllers/connectivity/telematics/{index/new.js → new.js} +8 -2
- package/addon/controllers/management/drivers/index/details.js +78 -1
- package/addon/controllers/management/drivers/index.js +39 -0
- package/addon/controllers/management/fleets/index/details.js +23 -1
- package/addon/controllers/management/fleets/index.js +6 -1
- package/addon/controllers/management/fuel-reports/index.js +37 -1
- package/addon/controllers/management/fuel-transactions/index/details.js +70 -0
- package/addon/controllers/management/fuel-transactions/index.js +240 -0
- package/addon/controllers/management/vehicles/index/details.js +32 -0
- package/addon/controllers/management/vehicles/index.js +26 -0
- package/addon/controllers/operations/orders/index.js +4 -0
- package/addon/controllers/settings/payments/index.js +5 -0
- package/addon/extension.js +10 -0
- package/addon/routes/connectivity/fuel-providers/details/index.js +7 -0
- package/addon/routes/connectivity/fuel-providers/details/matching.js +7 -0
- package/addon/routes/connectivity/fuel-providers/details/settings.js +7 -0
- package/addon/routes/connectivity/fuel-providers/details/sync.js +18 -0
- package/addon/routes/connectivity/fuel-providers/details/transactions.js +14 -0
- package/addon/routes/connectivity/fuel-providers/details.js +18 -0
- package/addon/routes/connectivity/fuel-providers/edit.js +18 -0
- package/addon/routes/connectivity/fuel-providers/index.js +20 -0
- package/addon/routes/connectivity/fuel-providers/new.js +3 -0
- package/addon/routes/connectivity/fuel-providers.js +3 -0
- package/addon/routes/connectivity/telematics/details/attachments.js +28 -0
- package/addon/routes/connectivity/telematics/details/devices.js +30 -0
- package/addon/routes/connectivity/telematics/details/events.js +33 -0
- package/addon/routes/connectivity/telematics/details/index.js +3 -0
- package/addon/routes/connectivity/telematics/details/logs.js +17 -0
- package/addon/routes/connectivity/telematics/details/sensors.js +29 -0
- package/addon/routes/connectivity/telematics/{index/details.js → details.js} +1 -1
- package/addon/routes/connectivity/telematics/{index/edit.js → edit.js} +1 -1
- package/addon/routes/connectivity/telematics/new.js +3 -0
- package/addon/routes/management/drivers/index/details/activity.js +3 -0
- package/addon/routes/management/fuel-reports/index.js +2 -0
- package/addon/routes/management/fuel-transactions/index/details.js +18 -0
- package/addon/routes/management/fuel-transactions/index.js +21 -0
- package/addon/routes/management/fuel-transactions.js +3 -0
- package/addon/routes.js +28 -9
- package/addon/services/device-actions.js +64 -1
- package/addon/services/device-event-actions.js +12 -1
- package/addon/services/driver-actions.js +147 -11
- package/addon/services/fleet-actions.js +66 -1
- package/addon/services/fuel-integration-actions.js +31 -0
- package/addon/services/issue-actions.js +1 -1
- package/addon/services/telematic-actions.js +9 -3
- package/addon/services/vehicle-actions.js +125 -0
- package/addon/styles/fleetops-engine.css +310 -34
- package/addon/templates/analytics/reports/index.hbs +19 -1
- package/addon/templates/connectivity/devices/index.hbs +19 -1
- package/addon/templates/connectivity/events/index.hbs +16 -1
- package/addon/templates/connectivity/fuel-providers/details/index.hbs +38 -0
- package/addon/templates/connectivity/fuel-providers/details/matching.hbs +13 -0
- package/addon/templates/connectivity/fuel-providers/details/settings.hbs +11 -0
- package/addon/templates/connectivity/fuel-providers/details/sync.hbs +48 -0
- package/addon/templates/connectivity/fuel-providers/details/transactions.hbs +21 -0
- package/addon/templates/connectivity/fuel-providers/details.hbs +51 -0
- package/addon/templates/connectivity/fuel-providers/edit.hbs +24 -0
- package/addon/templates/connectivity/fuel-providers/index.hbs +12 -0
- package/addon/templates/connectivity/fuel-providers/new.hbs +22 -0
- package/addon/templates/connectivity/fuel-providers.hbs +1 -0
- package/addon/templates/connectivity/sensors/index.hbs +19 -1
- package/addon/templates/connectivity/telematics/details/attachments.hbs +163 -0
- package/addon/templates/connectivity/telematics/details/devices.hbs +88 -0
- package/addon/templates/connectivity/telematics/details/events.hbs +101 -0
- package/addon/templates/connectivity/telematics/{index/details → details}/index.hbs +0 -1
- package/addon/templates/connectivity/telematics/details/logs.hbs +69 -0
- package/addon/templates/connectivity/telematics/details/sensors.hbs +88 -0
- package/addon/templates/connectivity/telematics/details.hbs +53 -0
- package/addon/templates/connectivity/telematics/edit.hbs +27 -0
- package/addon/templates/connectivity/telematics/index.hbs +6 -8
- package/addon/templates/connectivity/telematics/new.hbs +24 -0
- package/addon/templates/maintenance/equipment/index.hbs +19 -1
- package/addon/templates/maintenance/maintenances/index.hbs +15 -1
- package/addon/templates/maintenance/parts/index.hbs +19 -1
- package/addon/templates/maintenance/schedules/index.hbs +19 -1
- package/addon/templates/maintenance/work-orders/index.hbs +19 -1
- package/addon/templates/management/contacts/customers.hbs +15 -1
- package/addon/templates/management/contacts/index.hbs +19 -1
- package/addon/templates/management/drivers/index/details/activity.hbs +1 -0
- package/addon/templates/management/drivers/index.hbs +19 -1
- package/addon/templates/management/fleets/index.hbs +19 -1
- package/addon/templates/management/fuel-reports/index.hbs +19 -1
- package/addon/templates/management/fuel-transactions/index/details.hbs +73 -0
- package/addon/templates/management/fuel-transactions/index.hbs +58 -0
- package/addon/templates/management/fuel-transactions.hbs +1 -0
- package/addon/templates/management/issues/index.hbs +19 -1
- package/addon/templates/management/places/index.hbs +19 -1
- package/addon/templates/management/vehicles/index.hbs +19 -1
- package/addon/templates/management/vendors/index.hbs +19 -1
- package/addon/templates/management/vendors/integrated.hbs +13 -1
- package/addon/templates/operations/orders/index.hbs +19 -1
- package/addon/templates/operations/service-rates/index.hbs +19 -1
- package/addon/templates/settings/payments/index.hbs +15 -1
- package/addon/utils/fleet-ops-options.js +3 -0
- package/app/components/cell/telematic-provider.js +1 -0
- package/app/components/cell/telematic-status.js +1 -0
- package/app/components/fuel-integration/form.js +1 -0
- package/app/components/fuel-integration/hub.js +1 -0
- package/app/components/fuel-integration/matching-priority.js +1 -0
- package/app/components/modals/assigned-orders.js +1 -0
- package/app/components/modals/attach-telematic-device.js +1 -0
- package/app/components/modals/fleet-assign-driver.js +1 -0
- package/app/components/modals/fleet-assign-vehicle.js +1 -0
- package/app/components/modals/telematic-connection-diagnostics.js +1 -0
- package/app/components/order/card.js +1 -0
- package/app/components/telematic/hub.js +1 -0
- package/app/components/telematic/settings.js +1 -0
- package/app/components/telematic/tab-empty-state.js +1 -0
- package/app/components/widget/fuel-providers.js +1 -0
- package/app/controllers/connectivity/fuel-providers/details/sync.js +1 -0
- package/app/controllers/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
- package/app/controllers/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
- package/app/controllers/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
- package/app/controllers/connectivity/{telematics/index/details → fuel-providers}/index.js +1 -1
- package/app/controllers/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
- package/app/controllers/connectivity/telematics/details/attachments.js +1 -0
- package/app/controllers/connectivity/telematics/details/devices.js +1 -0
- package/app/controllers/connectivity/telematics/details/events.js +1 -0
- package/app/controllers/connectivity/telematics/details/index.js +1 -0
- package/app/controllers/connectivity/telematics/details/logs.js +1 -0
- package/app/controllers/connectivity/telematics/details/sensors.js +1 -0
- package/app/controllers/connectivity/telematics/details.js +1 -0
- package/app/controllers/connectivity/telematics/edit.js +1 -0
- package/app/controllers/connectivity/telematics/new.js +1 -0
- package/app/controllers/management/fuel-transactions/index/details.js +1 -0
- package/app/controllers/management/fuel-transactions/index.js +1 -0
- package/app/routes/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
- package/app/routes/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
- package/app/routes/connectivity/fuel-providers/details/settings.js +1 -0
- package/app/routes/connectivity/fuel-providers/details/sync.js +1 -0
- package/app/routes/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
- package/app/routes/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
- package/app/routes/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
- package/app/routes/connectivity/fuel-providers/index.js +1 -0
- package/app/routes/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
- package/app/routes/connectivity/fuel-providers.js +1 -0
- package/app/routes/connectivity/telematics/details/attachments.js +1 -0
- package/app/routes/connectivity/telematics/details/devices.js +1 -0
- package/app/routes/connectivity/telematics/details/events.js +1 -0
- package/app/routes/connectivity/telematics/details/index.js +1 -0
- package/app/routes/connectivity/telematics/details/logs.js +1 -0
- package/app/routes/connectivity/telematics/details/sensors.js +1 -0
- package/app/routes/connectivity/telematics/details.js +1 -0
- package/app/routes/connectivity/telematics/edit.js +1 -0
- package/app/routes/connectivity/telematics/new.js +1 -0
- package/app/routes/management/drivers/index/details/activity.js +1 -0
- package/app/routes/management/fuel-transactions/index/details.js +1 -0
- package/app/routes/management/fuel-transactions/index.js +1 -0
- package/app/routes/management/fuel-transactions.js +1 -0
- package/app/services/fuel-integration-actions.js +1 -0
- package/app/templates/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
- package/app/templates/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
- package/app/templates/connectivity/fuel-providers/details/settings.js +1 -0
- package/app/templates/connectivity/fuel-providers/details/sync.js +1 -0
- package/app/templates/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
- package/app/templates/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
- package/app/templates/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
- package/app/templates/connectivity/fuel-providers/index.js +1 -0
- package/app/templates/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
- package/app/templates/connectivity/fuel-providers.js +1 -0
- package/app/templates/connectivity/telematics/details/attachments.js +1 -0
- package/app/templates/connectivity/telematics/details/devices.js +1 -0
- package/app/templates/connectivity/telematics/details/events.js +1 -0
- package/app/templates/connectivity/telematics/details/index.js +1 -0
- package/app/templates/connectivity/telematics/details/logs.js +1 -0
- package/app/templates/connectivity/telematics/details/sensors.js +1 -0
- package/app/templates/connectivity/telematics/details.js +1 -0
- package/app/templates/connectivity/telematics/edit.js +1 -0
- package/app/templates/connectivity/telematics/new.js +1 -0
- package/app/templates/management/drivers/index/details/activity.js +1 -0
- package/app/templates/management/fuel-transactions/index/details.js +1 -0
- package/app/templates/management/fuel-transactions/index.js +1 -0
- package/app/templates/management/fuel-transactions.js +1 -0
- package/assets/images/telematics/providers/afaqy.webp +0 -0
- package/assets/images/telematics/providers/default.webp +0 -0
- package/assets/images/telematics/providers/flespi.webp +0 -0
- package/assets/images/telematics/providers/geotab.webp +0 -0
- package/assets/images/telematics/providers/safee.webp +0 -0
- package/assets/images/telematics/providers/samsara.webp +0 -0
- package/composer.json +1 -1
- package/extension.json +1 -1
- package/package.json +4 -4
- package/server/config/fuel-providers.php +42 -0
- package/server/config/telematics.php +139 -130
- package/server/migrations/2026_06_06_000001_harden_device_events_telematics_contract.php +59 -0
- package/server/migrations/2026_06_08_000001_create_fuel_provider_connections_table.php +37 -0
- package/server/migrations/2026_06_08_000002_create_fuel_provider_transactions_table.php +53 -0
- package/server/migrations/2026_06_08_000003_create_fuel_provider_sync_runs_table.php +40 -0
- package/server/migrations/2026_06_10_000001_add_fuel_card_number_to_vehicles_table.php +25 -0
- package/server/migrations/2026_06_10_000002_add_vehicle_identity_columns_to_fuel_provider_transactions_table.php +39 -0
- package/server/src/Contracts/FuelProvider.php +30 -0
- package/server/src/Contracts/TelematicProviderDescriptor.php +3 -1
- package/server/src/Events/FuelProviderTransactionImported.php +17 -0
- package/server/src/Events/FuelProviderTransactionMatched.php +17 -0
- package/server/src/Events/FuelProviderTransactionUnmatched.php +17 -0
- package/server/src/Events/FuelReportCreatedFromProvider.php +18 -0
- package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +6 -0
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +76 -2
- package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +44 -0
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +158 -7
- package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +124 -0
- package/server/src/Http/Controllers/Internal/v1/FuelProviderSyncRunController.php +10 -0
- package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +76 -0
- package/server/src/Http/Controllers/Internal/v1/SensorController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +178 -15
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +165 -0
- package/server/src/Http/Controllers/TelematicWebhookController.php +103 -19
- package/server/src/Http/Filter/FuelProviderConnectionFilter.php +33 -0
- package/server/src/Http/Filter/FuelProviderSyncRunFilter.php +28 -0
- package/server/src/Http/Filter/FuelProviderTransactionFilter.php +59 -0
- package/server/src/Http/Filter/FuelReportFilter.php +10 -0
- package/server/src/Http/Resources/v1/Driver.php +15 -0
- package/server/src/Http/Resources/v1/FuelProviderConnection.php +30 -0
- package/server/src/Http/Resources/v1/FuelProviderSyncRun.php +36 -0
- package/server/src/Http/Resources/v1/FuelProviderTransaction.php +54 -0
- package/server/src/Http/Resources/v1/FuelReport.php +28 -22
- package/server/src/Http/Resources/v1/Index/Driver.php +26 -20
- package/server/src/Http/Resources/v1/Index/Vehicle.php +29 -22
- package/server/src/Http/Resources/v1/Vehicle.php +17 -0
- package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +2 -0
- package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +57 -0
- package/server/src/Jobs/SyncTelematicDevicesJob.php +36 -6
- package/server/src/Jobs/TestTelematicConnectionJob.php +9 -22
- package/server/src/Models/Asset.php +2 -1
- package/server/src/Models/Contact.php +2 -1
- package/server/src/Models/Device.php +27 -4
- package/server/src/Models/DeviceEvent.php +40 -3
- package/server/src/Models/Driver.php +2 -1
- package/server/src/Models/Equipment.php +2 -1
- package/server/src/Models/Fleet.php +2 -1
- package/server/src/Models/FuelProviderConnection.php +60 -0
- package/server/src/Models/FuelProviderSyncRun.php +58 -0
- package/server/src/Models/FuelProviderTransaction.php +119 -0
- package/server/src/Models/FuelReport.php +16 -1
- package/server/src/Models/Part.php +2 -1
- package/server/src/Models/Sensor.php +21 -4
- package/server/src/Models/ServiceRate.php +39 -2
- package/server/src/Models/Vehicle.php +14 -2
- package/server/src/Models/Vendor.php +2 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +10 -0
- package/server/src/Support/Analytics/FuelProviderSummary.php +42 -0
- package/server/src/Support/FuelProviders/FuelProviderDescriptor.php +55 -0
- package/server/src/Support/FuelProviders/FuelProviderRegistry.php +75 -0
- package/server/src/Support/FuelProviders/FuelProviderService.php +447 -0
- package/server/src/Support/FuelProviders/Providers/AbstractFuelProvider.php +98 -0
- package/server/src/Support/FuelProviders/Providers/PetroAppFuelProvider.php +167 -0
- package/server/src/Support/Telematics/Providers/AbstractProvider.php +27 -6
- package/server/src/Support/Telematics/Providers/AfaqyProvider.php +55 -26
- package/server/src/Support/Telematics/Providers/FlespiProvider.php +1 -0
- package/server/src/Support/Telematics/Providers/GeotabProvider.php +1 -0
- package/server/src/Support/Telematics/Providers/SafeeProvider.php +32 -22
- package/server/src/Support/Telematics/Providers/SamsaraProvider.php +3 -1
- package/server/src/Support/Telematics/TelematicService.php +340 -21
- package/server/src/routes.php +41 -4
- package/server/tests/FuelProviderRegistryTest.php +416 -0
- package/server/tests/ServiceRateAlgorithmWeightVariablesTest.php +44 -0
- package/server/tests/TelematicsHardeningTest.php +268 -0
- package/server/tests/VehicleDriverAssignmentTest.php +51 -0
- package/translations/ar-ae.yml +22 -0
- package/translations/bg-bg.yaml +72 -0
- package/translations/en-us.yaml +83 -0
- package/translations/es-pa.yaml +72 -0
- package/translations/fr-fr.yaml +72 -0
- package/translations/mn-mn.yaml +72 -0
- package/translations/pt-br.yaml +72 -0
- package/translations/ru-ru.yaml +72 -0
- package/translations/vi-vn.yaml +97 -0
- package/addon/controllers/connectivity/telematics/index/details/devices.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details/events.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details/index.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details/sensors.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details.js +0 -24
- package/addon/routes/connectivity/telematics/index/details/devices.js +0 -3
- package/addon/routes/connectivity/telematics/index/details/events.js +0 -3
- package/addon/routes/connectivity/telematics/index/details/index.js +0 -3
- package/addon/routes/connectivity/telematics/index/details/sensors.js +0 -3
- package/addon/routes/connectivity/telematics/index/new.js +0 -3
- package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details.hbs +0 -14
- package/addon/templates/connectivity/telematics/index/edit.hbs +0 -12
- package/addon/templates/connectivity/telematics/index/new.hbs +0 -12
- package/app/controllers/connectivity/telematics/index/details/events.js +0 -1
- package/app/controllers/connectivity/telematics/index/details/sensors.js +0 -1
- package/app/routes/connectivity/telematics/index/details/sensors.js +0 -1
- package/app/templates/connectivity/telematics/index/details/sensors.js +0 -1
|
@@ -1130,8 +1130,9 @@ class ServiceRate extends Model
|
|
|
1130
1130
|
$stopCount = collect($stops)->filter()->count();
|
|
1131
1131
|
$endpointCount = max(0, min($endpointCount, $stopCount));
|
|
1132
1132
|
$waypointCount = max($stopCount - $endpointCount, 0);
|
|
1133
|
+
$weightVariables = $this->buildAlgorithmWeightVariables($entityCollection);
|
|
1133
1134
|
|
|
1134
|
-
return Algo::normalizeVariables([
|
|
1135
|
+
return Algo::normalizeVariables(array_merge([
|
|
1135
1136
|
'distance_m' => $totalDistance ?? 0,
|
|
1136
1137
|
'time_s' => $totalTime ?? 0,
|
|
1137
1138
|
'stops' => $stopCount,
|
|
@@ -1139,7 +1140,43 @@ class ServiceRate extends Model
|
|
|
1139
1140
|
'parcels' => $entityCollection->where('type', 'parcel')->count(),
|
|
1140
1141
|
'entities' => $entityCollection->count(),
|
|
1141
1142
|
'base_fee' => Utils::numbersOnly($this->base_fee ?? 0),
|
|
1142
|
-
]);
|
|
1143
|
+
], $weightVariables));
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
protected function buildAlgorithmWeightVariables($entities): array
|
|
1147
|
+
{
|
|
1148
|
+
$weightKg = collect($entities)->sum(fn ($entity) => $this->normalizeEntityWeightToKilograms($entity));
|
|
1149
|
+
|
|
1150
|
+
return [
|
|
1151
|
+
'weight' => $weightKg,
|
|
1152
|
+
'weight_kg' => $weightKg,
|
|
1153
|
+
'weight_g' => $weightKg * 1000,
|
|
1154
|
+
'weight_lb' => $weightKg / 0.45359237,
|
|
1155
|
+
'weight_oz' => $weightKg / 0.028349523125,
|
|
1156
|
+
'weight_tonne' => $weightKg / 1000,
|
|
1157
|
+
'weight_t' => $weightKg / 1000,
|
|
1158
|
+
];
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
protected function normalizeEntityWeightToKilograms($entity): float
|
|
1162
|
+
{
|
|
1163
|
+
$weight = data_get($entity, 'weight');
|
|
1164
|
+
|
|
1165
|
+
if ($weight === null || $weight === '' || !is_numeric($weight)) {
|
|
1166
|
+
return 0;
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
$weight = (float) $weight;
|
|
1170
|
+
$unit = strtolower(trim((string) data_get($entity, 'weight_unit', 'kg')));
|
|
1171
|
+
|
|
1172
|
+
return match ($unit) {
|
|
1173
|
+
'g', 'gram', 'grams' => $weight / 1000,
|
|
1174
|
+
'oz', 'ounce', 'ounces' => $weight * 0.028349523125,
|
|
1175
|
+
'lb', 'lbs', 'pound', 'pounds' => $weight * 0.45359237,
|
|
1176
|
+
't', 'mt', 'tonne', 'tonnes', 'metric_ton',
|
|
1177
|
+
'metric_tons' => $weight * 1000,
|
|
1178
|
+
default => $weight,
|
|
1179
|
+
};
|
|
1143
1180
|
}
|
|
1144
1181
|
|
|
1145
1182
|
protected function inferEndpointCountFromStops($stops = []): int
|
|
@@ -65,7 +65,7 @@ class Vehicle extends Model
|
|
|
65
65
|
*
|
|
66
66
|
* @var array
|
|
67
67
|
*/
|
|
68
|
-
protected $searchableColumns = ['name', 'description', 'make', 'model', 'trim', 'model_type', 'body_type', 'body_sub_type', 'year', 'plate_number', 'vin', 'call_sign', 'public_id'];
|
|
68
|
+
protected $searchableColumns = ['name', 'description', 'make', 'model', 'trim', 'model_type', 'body_type', 'body_sub_type', 'year', 'internal_id', 'plate_number', 'vin', 'serial_number', 'call_sign', 'fuel_card_number', 'public_id'];
|
|
69
69
|
|
|
70
70
|
/**
|
|
71
71
|
* Attributes that is filterable on this model.
|
|
@@ -96,7 +96,8 @@ class Vehicle extends Model
|
|
|
96
96
|
{
|
|
97
97
|
return SlugOptions::create()
|
|
98
98
|
->generateSlugsFrom(['year', 'make', 'model', 'trim', 'plate_number'])
|
|
99
|
-
->saveSlugsTo('slug')
|
|
99
|
+
->saveSlugsTo('slug')
|
|
100
|
+
->doNotGenerateSlugsOnUpdate();
|
|
100
101
|
}
|
|
101
102
|
|
|
102
103
|
/**
|
|
@@ -142,6 +143,7 @@ class Vehicle extends Model
|
|
|
142
143
|
'internal_id',
|
|
143
144
|
'plate_number',
|
|
144
145
|
'call_sign',
|
|
146
|
+
'fuel_card_number',
|
|
145
147
|
'serial_number',
|
|
146
148
|
'vin',
|
|
147
149
|
'vin_data',
|
|
@@ -701,8 +703,12 @@ class Vehicle extends Model
|
|
|
701
703
|
$year = Utils::or($row, ['year', 'vehicle_year', 'build_year', 'release_year']);
|
|
702
704
|
$trim = Utils::or($row, ['trim', 'vehicle_trim', 'brand_trim']);
|
|
703
705
|
$type = Utils::or($row, ['type', 'vehicle_type'], 'vehicle');
|
|
706
|
+
$internalId = Utils::or($row, ['internal_id', 'internal_number', 'fleet_number', 'vehicle_number']);
|
|
704
707
|
$plateNumber = Utils::or($row, ['plate_number', 'license_plate', 'license_place_number', 'vehicle_plate', 'registration_plate', 'tag_number', 'tail_number', 'head_number']);
|
|
705
708
|
$vin = Utils::or($row, ['vin', 'vin_number', 'vin_id', 'vehicle_identification_number', 'serial_number']);
|
|
709
|
+
$serialNumber = Utils::or($row, ['serial_number', 'serial', 'vehicle_serial_number']);
|
|
710
|
+
$callSign = Utils::or($row, ['call_sign', 'callsign', 'call_number']);
|
|
711
|
+
$fuelCardNumber = Utils::or($row, ['fuel_card_number', 'fuel_card', 'fuel_card_id', 'vehicle_card_id', 'card_number']);
|
|
706
712
|
$driverAssigned = Utils::or($row, ['driver', 'driver_name', 'driver_assigned', 'driver_assignee']);
|
|
707
713
|
|
|
708
714
|
// Handle when only a vehicle name is provided
|
|
@@ -741,8 +747,12 @@ class Vehicle extends Model
|
|
|
741
747
|
'model' => $model,
|
|
742
748
|
'year' => $year,
|
|
743
749
|
'trim' => $trim,
|
|
750
|
+
'internal_id' => $internalId,
|
|
744
751
|
'plate_number' => $plateNumber,
|
|
745
752
|
'vin' => $vin,
|
|
753
|
+
'serial_number' => $serialNumber,
|
|
754
|
+
'call_sign' => $callSign,
|
|
755
|
+
'fuel_card_number' => $fuelCardNumber,
|
|
746
756
|
'type' => $type,
|
|
747
757
|
'status' => 'available',
|
|
748
758
|
'online' => 0,
|
|
@@ -769,10 +779,12 @@ class Vehicle extends Model
|
|
|
769
779
|
|
|
770
780
|
return static::where(function ($query) use ($vehicleName) {
|
|
771
781
|
$query->where('public_id', $vehicleName)
|
|
782
|
+
->orWhere('internal_id', $vehicleName)
|
|
772
783
|
->orWhere('plate_number', $vehicleName)
|
|
773
784
|
->orWhere('vin', $vehicleName)
|
|
774
785
|
->orWhere('serial_number', $vehicleName)
|
|
775
786
|
->orWhere('call_sign', $vehicleName)
|
|
787
|
+
->orWhere('fuel_card_number', $vehicleName)
|
|
776
788
|
->orWhereRaw("CONCAT(make, ' ', model, ' ', year) LIKE ?", ["%{$vehicleName}%"])
|
|
777
789
|
->orWhereRaw("CONCAT(year, ' ', make, ' ', model) LIKE ?", ["%{$vehicleName}%"]);
|
|
778
790
|
})->first();
|
|
@@ -109,6 +109,15 @@ class FleetOpsServiceProvider extends CoreServiceProvider
|
|
|
109
109
|
\Fleetbase\FleetOps\Tracking\TrackingProviderRegistry::class,
|
|
110
110
|
fn () => new \Fleetbase\FleetOps\Tracking\TrackingProviderRegistry()
|
|
111
111
|
);
|
|
112
|
+
|
|
113
|
+
// Register the fuel provider registry as a singleton so FleetOps core
|
|
114
|
+
// and third-party extensions can share fuel card and fuel billing
|
|
115
|
+
// providers. Extensions can register providers from their own service
|
|
116
|
+
// providers with callAfterResolving(FuelProviderRegistry::class, ...).
|
|
117
|
+
$this->app->singleton(
|
|
118
|
+
\Fleetbase\FleetOps\Support\FuelProviders\FuelProviderRegistry::class,
|
|
119
|
+
fn () => new \Fleetbase\FleetOps\Support\FuelProviders\FuelProviderRegistry()
|
|
120
|
+
);
|
|
112
121
|
}
|
|
113
122
|
|
|
114
123
|
/**
|
|
@@ -173,6 +182,7 @@ class FleetOpsServiceProvider extends CoreServiceProvider
|
|
|
173
182
|
$this->loadViewsFrom(__DIR__ . '/../../resources/views', 'fleetops');
|
|
174
183
|
$this->mergeConfigFrom(__DIR__ . '/../../config/fleetops.php', 'fleetops');
|
|
175
184
|
$this->mergeConfigFrom(__DIR__ . '/../../config/telematics.php', 'telematics');
|
|
185
|
+
$this->mergeConfigFrom(__DIR__ . '/../../config/fuel-providers.php', 'fuel-providers');
|
|
176
186
|
$this->mergeConfigFrom(__DIR__ . '/../../config/api.php', 'api');
|
|
177
187
|
$this->mergeConfigFrom(__DIR__ . '/../../config/cache.stores.php', 'cache.stores');
|
|
178
188
|
$this->mergeConfigFrom(__DIR__ . '/../../config/geocoder.php', 'geocoder');
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Support\Analytics;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\FleetOps\Models\FuelProviderConnection;
|
|
6
|
+
use Fleetbase\FleetOps\Models\FuelProviderTransaction;
|
|
7
|
+
|
|
8
|
+
class FuelProviderSummary extends AbstractAnalytics
|
|
9
|
+
{
|
|
10
|
+
public function get(): array
|
|
11
|
+
{
|
|
12
|
+
$transactions = FuelProviderTransaction::where('company_uuid', $this->company->uuid)
|
|
13
|
+
->whereBetween('transaction_at', [$this->start, $this->end])
|
|
14
|
+
->get();
|
|
15
|
+
|
|
16
|
+
$connections = FuelProviderConnection::where('company_uuid', $this->company->uuid)->get();
|
|
17
|
+
|
|
18
|
+
$byProvider = $transactions
|
|
19
|
+
->groupBy('provider')
|
|
20
|
+
->map(fn ($rows, $provider) => [
|
|
21
|
+
'provider' => $provider,
|
|
22
|
+
'transactions' => $rows->count(),
|
|
23
|
+
'spend' => (int) $rows->sum('amount'),
|
|
24
|
+
'volume' => (float) $rows->sum('volume'),
|
|
25
|
+
'unmatched' => $rows->where('sync_status', 'unmatched')->count(),
|
|
26
|
+
])
|
|
27
|
+
->values();
|
|
28
|
+
|
|
29
|
+
return [
|
|
30
|
+
'summary' => [
|
|
31
|
+
'connections' => $connections->count(),
|
|
32
|
+
'active_connections' => $connections->whereIn('status', ['connected', 'active'])->count(),
|
|
33
|
+
'transactions' => $transactions->count(),
|
|
34
|
+
'unmatched' => $transactions->where('sync_status', 'unmatched')->count(),
|
|
35
|
+
'spend' => (int) $transactions->sum('amount'),
|
|
36
|
+
'volume' => (float) $transactions->sum('volume'),
|
|
37
|
+
'currency' => $transactions->first()?->currency ?? $this->companyCurrency(),
|
|
38
|
+
],
|
|
39
|
+
'providers' => $byProvider,
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Support\FuelProviders;
|
|
4
|
+
|
|
5
|
+
class FuelProviderDescriptor
|
|
6
|
+
{
|
|
7
|
+
public string $key;
|
|
8
|
+
public string $label;
|
|
9
|
+
public string $type;
|
|
10
|
+
public ?string $driverClass;
|
|
11
|
+
public ?string $description;
|
|
12
|
+
public ?string $docsUrl;
|
|
13
|
+
public ?string $category;
|
|
14
|
+
public ?string $icon;
|
|
15
|
+
public array $requiredFields;
|
|
16
|
+
public array $capabilities;
|
|
17
|
+
public array $syncDefaults;
|
|
18
|
+
public array $setupInstructions;
|
|
19
|
+
public array $metadata;
|
|
20
|
+
|
|
21
|
+
public function __construct(array $config)
|
|
22
|
+
{
|
|
23
|
+
$this->key = $config['key'];
|
|
24
|
+
$this->label = $config['label'] ?? $config['key'];
|
|
25
|
+
$this->type = $config['type'] ?? 'native';
|
|
26
|
+
$this->driverClass = $config['driver_class'] ?? null;
|
|
27
|
+
$this->description = $config['description'] ?? null;
|
|
28
|
+
$this->docsUrl = $config['docs_url'] ?? null;
|
|
29
|
+
$this->category = $config['category'] ?? null;
|
|
30
|
+
$this->icon = $config['icon'] ?? 'gas-pump';
|
|
31
|
+
$this->requiredFields = $config['required_fields'] ?? [];
|
|
32
|
+
$this->capabilities = $config['capabilities'] ?? [];
|
|
33
|
+
$this->syncDefaults = $config['sync_defaults'] ?? [];
|
|
34
|
+
$this->setupInstructions = $config['setup_instructions'] ?? [];
|
|
35
|
+
$this->metadata = $config['metadata'] ?? [];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public function toArray(): array
|
|
39
|
+
{
|
|
40
|
+
return [
|
|
41
|
+
'key' => $this->key,
|
|
42
|
+
'label' => $this->label,
|
|
43
|
+
'type' => $this->type,
|
|
44
|
+
'description' => $this->description,
|
|
45
|
+
'docs_url' => $this->docsUrl,
|
|
46
|
+
'category' => $this->category,
|
|
47
|
+
'icon' => $this->icon,
|
|
48
|
+
'required_fields' => $this->requiredFields,
|
|
49
|
+
'capabilities' => $this->capabilities,
|
|
50
|
+
'sync_defaults' => $this->syncDefaults,
|
|
51
|
+
'setup_instructions' => $this->setupInstructions,
|
|
52
|
+
'metadata' => $this->metadata,
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Support\FuelProviders;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\FleetOps\Contracts\FuelProvider;
|
|
6
|
+
use Illuminate\Support\Collection;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Registry for native and extension-provided fuel provider adapters.
|
|
10
|
+
*
|
|
11
|
+
* Third-party Fleetbase packages can register providers from their service
|
|
12
|
+
* providers with:
|
|
13
|
+
*
|
|
14
|
+
* $this->callAfterResolving(FuelProviderRegistry::class, function ($registry) {
|
|
15
|
+
* $registry->register(new FuelProviderDescriptor([...]));
|
|
16
|
+
* });
|
|
17
|
+
*/
|
|
18
|
+
class FuelProviderRegistry
|
|
19
|
+
{
|
|
20
|
+
protected Collection $providers;
|
|
21
|
+
|
|
22
|
+
public function __construct()
|
|
23
|
+
{
|
|
24
|
+
$this->providers = collect();
|
|
25
|
+
$this->loadNativeProviders();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
protected function loadNativeProviders(): void
|
|
29
|
+
{
|
|
30
|
+
foreach (config('fuel-providers.providers', []) as $providerConfig) {
|
|
31
|
+
$this->register(new FuelProviderDescriptor($providerConfig));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public function register(FuelProviderDescriptor $descriptor): void
|
|
36
|
+
{
|
|
37
|
+
$this->providers->put($descriptor->key, $descriptor);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public function has(string $key): bool
|
|
41
|
+
{
|
|
42
|
+
return $this->providers->has($key);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public function all(): Collection
|
|
46
|
+
{
|
|
47
|
+
return $this->providers;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public function findByKey(string $key): ?FuelProviderDescriptor
|
|
51
|
+
{
|
|
52
|
+
return $this->providers->get($key);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public function resolve(string $key): FuelProvider
|
|
56
|
+
{
|
|
57
|
+
$descriptor = $this->findByKey($key);
|
|
58
|
+
|
|
59
|
+
if (!$descriptor || !$descriptor->driverClass) {
|
|
60
|
+
throw new \InvalidArgumentException("Fuel provider '{$key}' is not registered.");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!class_exists($descriptor->driverClass)) {
|
|
64
|
+
throw new \InvalidArgumentException("Fuel provider driver '{$descriptor->driverClass}' does not exist.");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
$provider = app($descriptor->driverClass);
|
|
68
|
+
|
|
69
|
+
if (!$provider instanceof FuelProvider) {
|
|
70
|
+
throw new \InvalidArgumentException('Fuel provider driver must implement FuelProvider.');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return $provider;
|
|
74
|
+
}
|
|
75
|
+
}
|