@fleetbase/fleetops-engine 0.6.37 → 0.6.39
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/addon/components/activity/form.hbs +2 -12
- package/addon/components/activity/logic-builder.hbs +1 -1
- package/addon/components/custom-entity/form.hbs +4 -20
- package/addon/components/device/form.hbs +3 -15
- package/addon/components/device/panel-header.hbs +13 -2
- package/addon/components/driver/details.hbs +33 -2
- package/addon/components/driver/form.hbs +42 -0
- package/addon/components/driver/panel-header.hbs +8 -1
- package/addon/components/driver/schedule.hbs +115 -76
- package/addon/components/driver/schedule.js +349 -157
- package/addon/components/driver-onboard-settings.hbs +2 -8
- package/addon/components/entity-field-editing-settings.hbs +2 -5
- package/addon/components/equipment/card.hbs +49 -0
- package/addon/components/equipment/card.js +6 -0
- package/addon/components/equipment/details.hbs +83 -44
- package/addon/components/equipment/form.hbs +111 -41
- package/addon/components/equipment/form.js +78 -10
- package/addon/components/equipment/panel-header.hbs +36 -0
- package/addon/components/equipment/panel-header.js +2 -0
- package/addon/components/fleet/driver-listing.hbs +3 -1
- package/addon/components/fleet/vehicle-listing.hbs +4 -7
- package/addon/components/fleet-panel/vehicle-listing.hbs +1 -6
- package/addon/components/fuel-report/form.hbs +1 -5
- package/addon/components/layout/fleet-ops-sidebar.hbs +40 -36
- package/addon/components/layout/fleet-ops-sidebar.js +61 -10
- package/addon/components/maintenance/cost-panel.hbs +176 -0
- package/addon/components/maintenance/cost-panel.js +241 -0
- package/addon/components/maintenance/details.hbs +123 -60
- package/addon/components/maintenance/form.hbs +138 -78
- package/addon/components/maintenance/form.js +131 -6
- package/addon/components/maintenance/panel-header.hbs +31 -0
- package/addon/components/maintenance/panel-header.js +2 -0
- package/addon/components/maintenance-schedule/details.hbs +260 -0
- package/addon/components/maintenance-schedule/details.js +158 -0
- package/addon/components/maintenance-schedule/form.hbs +287 -0
- package/addon/components/maintenance-schedule/form.js +199 -0
- package/addon/components/map/container.hbs +1 -1
- package/addon/components/map/drawer/device-event-listing.hbs +1 -1
- package/addon/components/map/drawer/driver-listing.hbs +1 -6
- package/addon/components/map/drawer/place-listing.hbs +1 -6
- package/addon/components/map/drawer/vehicle-listing.hbs +1 -6
- package/addon/components/map/drawer.hbs +8 -1
- package/addon/components/map/leaflet-live-map.hbs +2 -1
- package/addon/components/map/toolbar/visibility-control-panel.hbs +1 -1
- package/addon/components/map/toolbar.hbs +4 -29
- package/addon/components/modals/add-driver-shift.hbs +155 -0
- package/addon/components/modals/add-driver-shift.js +210 -0
- package/addon/components/modals/bulk-assign-orders.hbs +67 -0
- package/addon/components/modals/driver-shift.hbs +43 -0
- package/addon/components/modals/driver-shift.js +56 -0
- package/addon/components/modals/entity-form.hbs +5 -28
- package/addon/components/modals/orchestrator-import.hbs +351 -0
- package/addon/components/modals/orchestrator-import.js +807 -0
- package/addon/components/modals/order-config-new-status.hbs +1 -5
- package/addon/components/modals/scheduling-conflict.hbs +47 -0
- package/addon/components/modals/scheduling-conflict.js +53 -0
- package/addon/components/modals/send-work-order.hbs +91 -0
- package/addon/components/modals/send-work-order.js +3 -0
- package/addon/components/modals/service-area-form.hbs +1 -6
- package/addon/components/modals/set-driver-availability.hbs +50 -0
- package/addon/components/modals/set-driver-availability.js +57 -0
- package/addon/components/modals/update-order-activity.hbs +13 -9
- package/addon/components/modals/user-form.hbs +1 -5
- package/addon/components/modals/vehicle-form.hbs +17 -102
- package/addon/components/modals/vendor-form.hbs +15 -82
- package/addon/components/orchestrator/card-fields-settings.hbs +76 -0
- package/addon/components/orchestrator/card-fields-settings.js +134 -0
- package/addon/components/orchestrator/order-pool.hbs +264 -0
- package/addon/components/orchestrator/order-pool.js +394 -0
- package/addon/components/orchestrator/phase-builder.hbs +162 -0
- package/addon/components/orchestrator/phase-builder.js +162 -0
- package/addon/components/orchestrator/plan-viewer.hbs +278 -0
- package/addon/components/orchestrator/plan-viewer.js +342 -0
- package/addon/components/orchestrator/resource-panel.hbs +301 -0
- package/addon/components/orchestrator/resource-panel.js +106 -0
- package/addon/components/orchestrator-workbench.hbs +318 -0
- package/addon/components/orchestrator-workbench.js +1087 -0
- package/addon/components/order/details/custom-fields.hbs +10 -1
- package/addon/components/order/details/detail.hbs +37 -2
- package/addon/components/order/details/detail.js +0 -1
- package/addon/components/order/details/integrated-vendor-details.hbs +4 -4
- package/addon/components/order/details/notes.hbs +1 -7
- package/addon/components/order/details/route.hbs +1 -5
- package/addon/components/order/form/details.hbs +44 -10
- package/addon/components/order/form/details.js +57 -0
- package/addon/components/order/form/notes.hbs +1 -7
- package/addon/components/order/form/payload.hbs +1 -7
- package/addon/components/order/form/route.hbs +3 -15
- package/addon/components/order/header.hbs +1 -7
- package/addon/components/order/route-editor.hbs +4 -25
- package/addon/components/order/schedule-card.hbs +102 -95
- package/addon/components/order/schedule-card.js +8 -3
- package/addon/components/order-config-manager/details.hbs +2 -10
- package/addon/components/order-config-manager/entities.hbs +1 -7
- package/addon/components/order-config-manager.hbs +1 -6
- package/addon/components/part/card.hbs +49 -0
- package/addon/components/part/card.js +6 -0
- package/addon/components/part/details.hbs +102 -56
- package/addon/components/part/form.hbs +131 -56
- package/addon/components/part/form.js +78 -11
- package/addon/components/part/panel-header.hbs +36 -0
- package/addon/components/part/panel-header.js +2 -0
- package/addon/components/place/form.hbs +1 -7
- package/addon/components/sensor/details.hbs +1 -1
- package/addon/components/sensor/form.hbs +5 -3
- package/addon/components/sensor/panel-header.hbs +8 -1
- package/addon/components/service-area/form.hbs +1 -6
- package/addon/components/service-rate/form.hbs +12 -60
- package/addon/components/telematic/form.hbs +6 -2
- package/addon/components/vehicle/details/maintenance-history.hbs +42 -0
- package/addon/components/vehicle/details/maintenance-history.js +32 -0
- package/addon/components/vehicle/details/schedules.hbs +40 -0
- package/addon/components/vehicle/details/schedules.js +32 -0
- package/addon/components/vehicle/details/work-orders.hbs +42 -0
- package/addon/components/vehicle/details/work-orders.js +32 -0
- package/addon/components/vehicle/details.hbs +30 -0
- package/addon/components/vehicle/form.hbs +39 -0
- package/addon/components/vehicle/panel-header.hbs +19 -49
- package/addon/components/warranty/details.hbs +3 -2
- package/addon/components/warranty/form.hbs +3 -17
- package/addon/components/work-order/details.hbs +135 -40
- package/addon/components/work-order/form.hbs +178 -45
- package/addon/components/work-order/form.js +197 -4
- package/addon/components/work-order/panel-header.hbs +31 -0
- package/addon/components/work-order/panel-header.js +2 -0
- package/addon/controllers/connectivity/devices/index/details.js +1 -1
- package/addon/controllers/maintenance/equipment/index/details/index.js +0 -1
- package/addon/controllers/maintenance/equipment/index/details.js +36 -1
- package/addon/controllers/maintenance/equipment/index/edit.js +56 -1
- package/addon/controllers/maintenance/equipment/index/new.js +32 -1
- package/addon/controllers/maintenance/equipment/index.js +127 -113
- package/addon/controllers/maintenance/maintenances/index/details/index.js +3 -0
- package/addon/controllers/maintenance/maintenances/index/details.js +54 -0
- package/addon/controllers/maintenance/maintenances/index/edit.js +68 -0
- package/addon/controllers/maintenance/maintenances/index/new.js +34 -0
- package/addon/controllers/maintenance/maintenances/index.js +191 -0
- package/addon/controllers/maintenance/parts/index/details/index.js +0 -1
- package/addon/controllers/maintenance/parts/index/details.js +36 -1
- package/addon/controllers/maintenance/parts/index/edit.js +56 -1
- package/addon/controllers/maintenance/parts/index/new.js +32 -1
- package/addon/controllers/maintenance/parts/index.js +135 -113
- package/addon/controllers/maintenance/schedules/index/details.js +115 -0
- package/addon/controllers/maintenance/schedules/index/edit.js +41 -0
- package/addon/controllers/maintenance/schedules/index/new.js +33 -0
- package/addon/controllers/maintenance/schedules/index.js +280 -0
- package/addon/controllers/maintenance/work-orders/index/details.js +41 -1
- package/addon/controllers/maintenance/work-orders/index/edit.js +67 -1
- package/addon/controllers/maintenance/work-orders/index/new.js +43 -1
- package/addon/controllers/maintenance/work-orders/index.js +105 -113
- package/addon/controllers/management/drivers/index/details.js +6 -1
- package/addon/controllers/management/vehicles/index/details.js +65 -0
- package/addon/controllers/management/vehicles/index.js +18 -0
- package/addon/controllers/operations/orchestrator.js +10 -0
- package/addon/controllers/operations/orders/index/details.js +5 -0
- package/addon/controllers/operations/orders/index.js +6 -0
- package/addon/controllers/operations/scheduler/fleet-schedule.js +341 -0
- package/addon/controllers/operations/scheduler/index.js +799 -275
- package/addon/controllers/operations/scheduler.js +21 -0
- package/addon/controllers/settings/orchestrator.js +70 -0
- package/addon/controllers/settings/scheduling.js +155 -0
- package/addon/extension.js +74 -1
- package/addon/instance-initializers/register-vroom-allocation.js +27 -0
- package/addon/models/maintenance-schedule.js +61 -0
- package/addon/routes/maintenance/equipment/index/details.js +27 -1
- package/addon/routes/maintenance/equipment/index/edit.js +27 -1
- package/addon/routes/maintenance/maintenances/index/details/index.js +3 -0
- package/addon/routes/maintenance/maintenances/index/details.js +29 -0
- package/addon/routes/maintenance/maintenances/index/edit.js +29 -0
- package/addon/routes/maintenance/maintenances/index/new.js +3 -0
- package/addon/routes/maintenance/maintenances/index.js +23 -0
- package/addon/routes/maintenance/maintenances.js +3 -0
- package/addon/routes/maintenance/parts/index/details.js +27 -1
- package/addon/routes/maintenance/parts/index/edit.js +27 -1
- package/addon/routes/maintenance/schedules/index/details/index.js +2 -0
- package/addon/routes/maintenance/schedules/index/details/work-orders.js +11 -0
- package/addon/routes/maintenance/schedules/index/details.js +25 -0
- package/addon/routes/maintenance/schedules/index/edit.js +25 -0
- package/addon/routes/maintenance/schedules/index/new.js +2 -0
- package/addon/routes/maintenance/schedules/index.js +21 -0
- package/addon/routes/maintenance/schedules.js +2 -0
- package/addon/routes/maintenance/work-orders/index/details.js +27 -1
- package/addon/routes/maintenance/work-orders/index/edit.js +27 -1
- package/addon/routes/management/vehicles/index/details/maintenance-history.js +3 -0
- package/addon/routes/management/vehicles/index/details/schedules.js +3 -0
- package/addon/routes/management/vehicles/index/details/work-orders.js +3 -0
- package/addon/routes/operations/orchestrator.js +23 -0
- package/addon/routes/operations/orders/index/details/virtual.js +23 -0
- package/addon/routes/operations/scheduler/fleet-schedule.js +28 -0
- package/addon/routes/operations/scheduler/index.js +48 -26
- package/addon/routes/operations/scheduler.js +14 -1
- package/addon/routes/settings/orchestrator.js +27 -0
- package/addon/routes/settings/scheduling.js +3 -0
- package/addon/routes.js +33 -1
- package/addon/services/driver-actions.js +40 -7
- package/addon/services/driver-scheduling.js +4 -1
- package/addon/services/equipment-actions.js +15 -5
- package/addon/services/leaflet-map-manager.js +14 -6
- package/addon/services/maintenance-actions.js +17 -14
- package/addon/services/maintenance-schedule-actions.js +118 -0
- package/addon/services/orchestration-engine-interface.js +49 -0
- package/addon/services/orchestration-engine.js +74 -0
- package/addon/services/order-actions.js +15 -0
- package/addon/services/order-allocation.js +116 -0
- package/addon/services/part-actions.js +12 -2
- package/addon/services/scheduling.js +316 -0
- package/addon/services/vehicle-actions.js +70 -7
- package/addon/services/vroom-allocation-engine.js +45 -0
- package/addon/services/work-order-actions.js +80 -0
- package/addon/styles/fleetops-engine.css +1658 -0
- package/addon/templates/analytics/reports/index/edit.hbs +1 -1
- package/addon/templates/analytics/reports/index/new.hbs +1 -1
- package/addon/templates/application.hbs +6 -1
- package/addon/templates/connectivity/devices/index/details/events.hbs +0 -1
- package/addon/templates/connectivity/devices.hbs +0 -1
- package/addon/templates/connectivity/events/index/details.hbs +0 -1
- package/addon/templates/connectivity/events.hbs +0 -1
- package/addon/templates/connectivity/sensors.hbs +0 -1
- 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.hbs +0 -1
- package/addon/templates/connectivity/tracking.hbs +0 -1
- package/addon/templates/connectivity.hbs +0 -1
- package/addon/templates/maintenance/equipment/index/details/index.hbs +1 -2
- package/addon/templates/maintenance/equipment/index/details.hbs +15 -2
- package/addon/templates/maintenance/equipment/index/edit.hbs +12 -2
- package/addon/templates/maintenance/equipment/index/new.hbs +1 -2
- package/addon/templates/maintenance/equipment/index.hbs +48 -13
- package/addon/templates/maintenance/equipment.hbs +0 -1
- package/addon/templates/maintenance/maintenances/index/details/index.hbs +1 -0
- package/addon/templates/maintenance/maintenances/index/details.hbs +15 -0
- package/addon/templates/maintenance/maintenances/index/edit.hbs +12 -0
- package/addon/templates/maintenance/maintenances/index/new.hbs +11 -0
- package/addon/templates/maintenance/maintenances/index.hbs +14 -0
- package/addon/templates/maintenance/maintenances.hbs +1 -0
- package/addon/templates/maintenance/parts/index/details/index.hbs +1 -2
- package/addon/templates/maintenance/parts/index/details.hbs +15 -2
- package/addon/templates/maintenance/parts/index/edit.hbs +12 -2
- package/addon/templates/maintenance/parts/index/new.hbs +1 -2
- package/addon/templates/maintenance/parts/index.hbs +48 -13
- package/addon/templates/maintenance/parts.hbs +0 -1
- package/addon/templates/maintenance/schedules/index/details/index.hbs +1 -0
- package/addon/templates/maintenance/schedules/index/details/work-orders.hbs +39 -0
- package/addon/templates/maintenance/schedules/index/details.hbs +14 -0
- package/addon/templates/maintenance/schedules/index/edit.hbs +12 -0
- package/addon/templates/maintenance/schedules/index/new.hbs +11 -0
- package/addon/templates/maintenance/schedules/index.hbs +40 -0
- package/addon/templates/maintenance/schedules.hbs +1 -0
- package/addon/templates/maintenance/work-orders/index/details.hbs +2 -1
- package/addon/templates/maintenance/work-orders/index/edit.hbs +2 -4
- package/addon/templates/maintenance/work-orders/index/new.hbs +1 -2
- package/addon/templates/maintenance/work-orders.hbs +0 -1
- package/addon/templates/management/contacts/customers/edit.hbs +1 -2
- package/addon/templates/management/contacts/customers/new.hbs +1 -2
- package/addon/templates/management/contacts/customers.hbs +1 -1
- package/addon/templates/management/contacts/index/edit.hbs +1 -2
- package/addon/templates/management/contacts/index/new.hbs +1 -2
- package/addon/templates/management/drivers/index/details/orders.hbs +0 -1
- package/addon/templates/management/drivers/index/edit.hbs +1 -2
- package/addon/templates/management/drivers/index/new.hbs +1 -2
- package/addon/templates/management/fleets/index/edit.hbs +1 -2
- package/addon/templates/management/fleets/index/new.hbs +1 -2
- package/addon/templates/management/fleets/index.hbs +1 -2
- package/addon/templates/management/fuel-reports/index/edit.hbs +1 -2
- package/addon/templates/management/fuel-reports/index/new.hbs +1 -2
- package/addon/templates/management/fuel-reports/index.hbs +1 -2
- package/addon/templates/management/issues/index/edit.hbs +1 -2
- package/addon/templates/management/issues/index/new.hbs +1 -2
- package/addon/templates/management/issues/index.hbs +1 -2
- package/addon/templates/management/places/index/details/activity.hbs +0 -1
- package/addon/templates/management/places/index/details/comments.hbs +0 -1
- package/addon/templates/management/places/index/details/documents.hbs +0 -1
- package/addon/templates/management/places/index/details/map.hbs +0 -1
- package/addon/templates/management/places/index/details/operations.hbs +0 -1
- package/addon/templates/management/places/index/details/performance.hbs +0 -1
- package/addon/templates/management/places/index/details/rules.hbs +0 -1
- package/addon/templates/management/vehicles/index/details/equipment.hbs +0 -1
- package/addon/templates/management/vehicles/index/details/maintenance-history.hbs +2 -0
- package/addon/templates/management/vehicles/index/details/schedules.hbs +2 -0
- package/addon/templates/management/vehicles/index/details/work-orders.hbs +2 -0
- package/addon/templates/management/vehicles/index/details.hbs +1 -1
- package/addon/templates/management/vehicles/index/edit.hbs +1 -2
- package/addon/templates/management/vehicles/index/new.hbs +1 -2
- package/addon/templates/management/vendors/index/edit.hbs +1 -2
- package/addon/templates/management/vendors/index/new.hbs +1 -2
- package/addon/templates/management/vendors/index.hbs +1 -2
- package/addon/templates/management/vendors/integrated.hbs +1 -2
- package/addon/templates/operations/orchestrator.hbs +1 -0
- package/addon/templates/operations/orders/index/details/virtual.hbs +1 -0
- package/addon/templates/operations/orders/index.hbs +6 -1
- package/addon/templates/operations/scheduler/fleet-schedule.hbs +41 -0
- package/addon/templates/operations/scheduler/index.hbs +147 -88
- package/addon/templates/operations/scheduler.hbs +7 -1
- package/addon/templates/settings/avatars.hbs +1 -1
- package/addon/templates/settings/orchestrator.hbs +65 -0
- package/addon/templates/settings/payments/index.hbs +1 -5
- package/addon/templates/settings/scheduling.hbs +82 -0
- package/addon/utils/create-full-calendar-event-from-order.js +52 -14
- package/addon/utils/create-full-calendar-event-from-schedule-item.js +50 -0
- package/addon/utils/fleet-ops-options.js +254 -0
- package/addon/utils/route-colors.js +99 -0
- package/addon/utils/to-calendar-date.js +70 -0
- package/app/components/driver/schedule.js +1 -0
- package/app/components/maintenance/cost-panel.js +1 -0
- package/app/components/maintenance/panel-header.js +1 -0
- package/app/components/maintenance-schedule/details.js +1 -0
- package/app/components/maintenance-schedule/form.js +1 -0
- package/app/components/modals/add-driver-shift.js +1 -0
- package/app/components/modals/bulk-assign-orders.js +1 -0
- package/app/components/modals/driver-shift.js +1 -0
- package/app/components/modals/orchestrator-import.js +1 -0
- package/app/components/modals/scheduling-conflict.js +1 -0
- package/app/components/modals/send-work-order.js +1 -0
- package/app/components/modals/set-driver-availability.js +1 -0
- package/app/components/orchestrator/card-fields-settings.js +1 -0
- package/app/components/orchestrator/order-pool.js +1 -0
- package/app/components/orchestrator/phase-builder.js +1 -0
- package/app/components/orchestrator/plan-viewer.js +1 -0
- package/app/components/orchestrator/resource-panel.js +1 -0
- package/app/components/orchestrator-workbench.js +1 -0
- package/app/components/vehicle/details/maintenance-history.js +1 -0
- package/app/components/vehicle/details/schedules.js +1 -0
- package/app/components/vehicle/details/work-orders.js +1 -0
- package/app/controllers/operations/orchestrator.js +1 -0
- package/app/controllers/settings/orchestrator.js +1 -0
- package/app/controllers/settings/scheduling.js +1 -0
- package/app/routes/operations/orchestrator.js +1 -0
- package/app/routes/operations/orders/index/details/virtual.js +1 -0
- package/app/routes/settings/orchestrator.js +1 -0
- package/app/routes/settings/scheduling.js +1 -0
- package/app/services/maintenance-schedule-actions.js +1 -0
- package/app/services/orchestration-engine-interface.js +1 -0
- package/app/services/orchestration-engine.js +1 -0
- package/app/services/order-allocation.js +1 -0
- package/app/services/scheduling.js +1 -0
- package/app/services/vroom-allocation-engine.js +1 -0
- package/app/templates/operations/orders/index/details/virtual.js +1 -0
- package/app/templates/settings/scheduling.js +1 -0
- package/app/utils/create-full-calendar-event-from-schedule-item.js +1 -0
- package/app/utils/route-colors.js +1 -0
- package/composer.json +5 -3
- package/extension.json +1 -1
- package/package.json +6 -5
- package/server/config/fleetops.php +20 -1
- package/server/migrations/2025_08_28_054927_create_parts_table.php +2 -2
- package/server/migrations/2025_08_28_054932_add_public_id_to_maintenance_tables.php +45 -0
- package/server/migrations/2025_09_01_000001_create_maintenance_schedules_table.php +88 -0
- package/server/migrations/2026_04_01_000001_fix_monetary_columns_in_parts_table.php +48 -0
- package/server/migrations/2026_04_01_000003_add_photo_uuid_to_equipment_and_parts_tables.php +61 -0
- package/server/migrations/2026_04_01_000004_add_public_id_to_equipments_table.php +38 -0
- package/server/migrations/2026_04_01_000005_add_missing_columns_to_parts_table.php +67 -0
- package/server/migrations/2026_04_04_000001_add_reminder_offsets_to_maintenance_schedules.php +44 -0
- package/server/migrations/2026_04_08_000001_add_orchestrator_columns_to_vehicles_table.php +58 -0
- package/server/migrations/2026_04_08_000002_add_orchestrator_columns_to_drivers_table.php +41 -0
- package/server/migrations/2026_04_08_000003_add_orchestrator_columns_to_orders_table.php +38 -0
- package/server/migrations/2026_04_08_000004_add_orchestrator_columns_to_payloads_table.php +41 -0
- package/server/migrations/2026_04_08_000005_add_orchestrator_columns_to_waypoints_table.php +38 -0
- package/server/migrations/2026_04_09_000001_create_manifests_table.php +48 -0
- package/server/migrations/2026_04_09_000002_create_manifest_stops_table.php +48 -0
- package/server/migrations/2026_04_09_000003_add_manifest_uuid_to_orders_table.php +28 -0
- package/server/migrations/2026_04_13_000001_add_pod_notes_columns_to_waypoints_table.php +39 -0
- package/server/resources/views/mail/maintenance-schedule-reminder.blade.php +59 -0
- package/server/resources/views/mail/work-order-dispatched.blade.php +67 -0
- package/server/src/Auth/Schemas/FleetOps.php +44 -0
- package/server/src/Console/Commands/ProcessMaintenanceTriggers.php +150 -0
- package/server/src/Console/Commands/SendMaintenanceReminders.php +128 -0
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +1 -0
- package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +27 -0
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +9 -2
- package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +165 -0
- package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +304 -0
- package/server/src/Http/Controllers/Internal/v1/ManifestController.php +138 -0
- package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +975 -0
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +42 -0
- package/server/src/Http/Controllers/Internal/v1/PartController.php +27 -0
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +118 -0
- package/server/src/Http/Controllers/Internal/v1/Traits/DriverSchedulingTrait.php +214 -0
- package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +68 -0
- package/server/src/Http/Resources/v1/Driver.php +1 -0
- package/server/src/Http/Resources/v1/Maintenance.php +138 -0
- package/server/src/Http/Resources/v1/MaintenanceSchedule.php +137 -0
- package/server/src/Http/Resources/v1/Orchestrator/Order.php +116 -0
- package/server/src/Http/Resources/v1/Order.php +7 -4
- package/server/src/Http/Resources/v1/Waypoint.php +7 -0
- package/server/src/Http/Resources/v1/WorkOrder.php +136 -0
- package/server/src/Imports/EquipmentImport.php +32 -0
- package/server/src/Imports/MaintenanceImport.php +32 -0
- package/server/src/Imports/MaintenanceScheduleImport.php +32 -0
- package/server/src/Imports/PartImport.php +32 -0
- package/server/src/Imports/WorkOrderImport.php +32 -0
- package/server/src/Jobs/ProcessAllocationJob.php +119 -0
- package/server/src/Listeners/HandleDeliveryCompletion.php +47 -0
- package/server/src/Listeners/NotifyDriverOnShiftChange.php +63 -0
- package/server/src/Mail/MaintenanceScheduleReminder.php +68 -0
- package/server/src/Mail/WorkOrderDispatched.php +58 -0
- package/server/src/Models/Asset.php +2 -2
- package/server/src/Models/Device.php +1 -1
- package/server/src/Models/Driver.php +82 -4
- package/server/src/Models/Equipment.php +62 -2
- package/server/src/Models/Maintenance.php +127 -9
- package/server/src/Models/MaintenanceSchedule.php +353 -0
- package/server/src/Models/Manifest.php +214 -0
- package/server/src/Models/ManifestStop.php +162 -0
- package/server/src/Models/Order.php +70 -0
- package/server/src/Models/OrderConfig.php +5 -2
- package/server/src/Models/Part.php +69 -3
- package/server/src/Models/Payload.php +7 -2
- package/server/src/Models/Place.php +1 -1
- package/server/src/Models/Sensor.php +1 -1
- package/server/src/Models/ServiceQuote.php +1 -1
- package/server/src/Models/Vehicle.php +20 -1
- package/server/src/Models/Warranty.php +1 -1
- package/server/src/Models/Waypoint.php +7 -1
- package/server/src/Models/WorkOrder.php +122 -12
- package/server/src/Notifications/DriverShiftChanged.php +110 -0
- package/server/src/Observers/WorkOrderObserver.php +107 -0
- package/server/src/Orchestration/Contracts/OrchestrationEngineInterface.php +63 -0
- package/server/src/Orchestration/Engines/DriverAssignmentEngine.php +265 -0
- package/server/src/Orchestration/Engines/GreedyOrchestrationEngine.php +155 -0
- package/server/src/Orchestration/Engines/RouteSequencingEngine.php +272 -0
- package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +192 -0
- package/server/src/Orchestration/OrchestrationEngineRegistry.php +83 -0
- package/server/src/Orchestration/Support/OrchestrationPayloadBuilder.php +290 -0
- package/server/src/Providers/EventServiceProvider.php +7 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +42 -15
- package/server/src/routes.php +65 -4
- package/translations/ar-ae.yml +44 -12
- package/translations/bg-bg.yaml +51 -10
- package/translations/en-us.yaml +444 -1
- package/translations/fr-fr.yaml +51 -10
- package/translations/mn-mn.yaml +51 -10
- package/translations/pt-br.yaml +51 -10
- package/translations/ru-ru.yaml +51 -10
- package/translations/vi-vn.yaml +48 -12
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import Controller from '@ember/controller';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
|
|
4
|
+
export default class OperationsSchedulerController extends Controller {
|
|
5
|
+
@service intl;
|
|
6
|
+
|
|
7
|
+
get tabs() {
|
|
8
|
+
return [
|
|
9
|
+
{
|
|
10
|
+
route: 'operations.scheduler.index',
|
|
11
|
+
label: this.intl.t('scheduler.orders-tab'),
|
|
12
|
+
icon: 'box',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
route: 'operations.scheduler.fleet-schedule',
|
|
16
|
+
label: this.intl.t('scheduler.fleet-schedule-tab'),
|
|
17
|
+
icon: 'calendar-week',
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import Controller from '@ember/controller';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
import { tracked } from '@glimmer/tracking';
|
|
4
|
+
import { action } from '@ember/object';
|
|
5
|
+
import { task } from 'ember-concurrency';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Settings::OrchestratorController
|
|
9
|
+
*
|
|
10
|
+
* Manages the Orchestrator settings page at /settings/orchestrator.
|
|
11
|
+
* Loads current settings, presents the engine selector dropdown (populated
|
|
12
|
+
* from the allocation-engine registry), and saves changes.
|
|
13
|
+
*/
|
|
14
|
+
export default class SettingsOrchestratorController extends Controller {
|
|
15
|
+
@service fetch;
|
|
16
|
+
@service notifications;
|
|
17
|
+
@service intl;
|
|
18
|
+
@service('orchestration-engine') engineRegistry;
|
|
19
|
+
|
|
20
|
+
@tracked allocationEngine = 'vroom';
|
|
21
|
+
@tracked autoAllocateOnCreate = false;
|
|
22
|
+
@tracked autoReallocateOnComplete = false;
|
|
23
|
+
@tracked maxTravelTimeSeconds = 3600;
|
|
24
|
+
@tracked balanceWorkload = false;
|
|
25
|
+
@tracked isLoading = false;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Engine options for the selector dropdown.
|
|
29
|
+
* Populated from the allocation-engine registry so new engines appear
|
|
30
|
+
* automatically without modifying this controller.
|
|
31
|
+
*/
|
|
32
|
+
get engineOptions() {
|
|
33
|
+
return this.engineRegistry.availableEngines;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@task *loadSettings() {
|
|
37
|
+
this.isLoading = true;
|
|
38
|
+
try {
|
|
39
|
+
const settings = yield this.fetch.get('fleet-ops/settings/orchestrator-settings');
|
|
40
|
+
this.allocationEngine = settings.allocation_engine ?? 'vroom';
|
|
41
|
+
this.autoAllocateOnCreate = settings.auto_allocate_on_create ?? false;
|
|
42
|
+
this.autoReallocateOnComplete = settings.auto_reallocate_on_complete ?? false;
|
|
43
|
+
this.maxTravelTimeSeconds = settings.max_travel_time_seconds ?? 3600;
|
|
44
|
+
this.balanceWorkload = settings.balance_workload ?? false;
|
|
45
|
+
} catch (error) {
|
|
46
|
+
this.notifications.serverError(error);
|
|
47
|
+
} finally {
|
|
48
|
+
this.isLoading = false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@task *saveSettings() {
|
|
53
|
+
try {
|
|
54
|
+
yield this.fetch.post('fleet-ops/settings/orchestrator-settings', {
|
|
55
|
+
allocation_engine: this.allocationEngine,
|
|
56
|
+
auto_allocate_on_create: this.autoAllocateOnCreate,
|
|
57
|
+
auto_reallocate_on_complete: this.autoReallocateOnComplete,
|
|
58
|
+
max_travel_time_seconds: this.maxTravelTimeSeconds,
|
|
59
|
+
balance_workload: this.balanceWorkload,
|
|
60
|
+
});
|
|
61
|
+
this.notifications.success(this.intl.t('orchestrator.settings-saved'));
|
|
62
|
+
} catch (error) {
|
|
63
|
+
this.notifications.serverError(error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@action selectEngine(engine) {
|
|
68
|
+
this.allocationEngine = engine.id;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import Controller from '@ember/controller';
|
|
2
|
+
import { tracked } from '@glimmer/tracking';
|
|
3
|
+
import { inject as service } from '@ember/service';
|
|
4
|
+
import { action } from '@ember/object';
|
|
5
|
+
import { task } from 'ember-concurrency';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Settings::SchedulingController
|
|
9
|
+
*
|
|
10
|
+
* Manages global scheduling settings for Fleet-Ops:
|
|
11
|
+
* - Default schedule horizon (how many days ahead to materialise shifts)
|
|
12
|
+
* - Default shift duration
|
|
13
|
+
* - HOS (Hours of Service) daily/weekly limits
|
|
14
|
+
* - Whether to auto-activate schedules on first shift creation
|
|
15
|
+
* - Whether to notify drivers of new/changed shifts
|
|
16
|
+
* - Reusable schedule templates library
|
|
17
|
+
*/
|
|
18
|
+
export default class SettingsSchedulingController extends Controller {
|
|
19
|
+
@service fetch;
|
|
20
|
+
@service notifications;
|
|
21
|
+
@service intl;
|
|
22
|
+
@service store;
|
|
23
|
+
@service modalsManager;
|
|
24
|
+
|
|
25
|
+
/** How many days ahead to materialise schedule items (default 60) */
|
|
26
|
+
@tracked horizonDays = 60;
|
|
27
|
+
|
|
28
|
+
/** Default shift duration in hours (default 8) */
|
|
29
|
+
@tracked defaultShiftDuration = 8;
|
|
30
|
+
|
|
31
|
+
/** HOS daily driving limit in hours (default 11) */
|
|
32
|
+
@tracked hosDailyLimit = 11;
|
|
33
|
+
|
|
34
|
+
/** HOS weekly driving limit in hours (default 70) */
|
|
35
|
+
@tracked hosWeeklyLimit = 70;
|
|
36
|
+
|
|
37
|
+
/** Whether to auto-activate a draft schedule when the first shift is added */
|
|
38
|
+
@tracked autoActivateSchedule = true;
|
|
39
|
+
|
|
40
|
+
/** Whether to notify drivers when shifts are created or modified */
|
|
41
|
+
@tracked notifyDriversOnShiftChange = false;
|
|
42
|
+
|
|
43
|
+
/** Reusable (library) schedule templates */
|
|
44
|
+
@tracked scheduleTemplates = [];
|
|
45
|
+
|
|
46
|
+
get templateActionButtons() {
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
type: 'primary',
|
|
50
|
+
icon: 'plus',
|
|
51
|
+
iconPrefix: 'fas',
|
|
52
|
+
text: this.intl.t('settings.scheduling.new-template'),
|
|
53
|
+
onClick: this.createTemplate,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
constructor() {
|
|
59
|
+
super(...arguments);
|
|
60
|
+
this.getSettings.perform();
|
|
61
|
+
this.loadTemplates.perform();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Load scheduling settings from the backend.
|
|
66
|
+
*/
|
|
67
|
+
@task *getSettings() {
|
|
68
|
+
try {
|
|
69
|
+
const settings = yield this.fetch.get('fleet-ops/settings/scheduling-settings');
|
|
70
|
+
if (settings) {
|
|
71
|
+
this.horizonDays = settings.horizon_days ?? 60;
|
|
72
|
+
this.defaultShiftDuration = settings.default_shift_duration ?? 8;
|
|
73
|
+
this.hosDailyLimit = settings.hos_daily_limit ?? 11;
|
|
74
|
+
this.hosWeeklyLimit = settings.hos_weekly_limit ?? 70;
|
|
75
|
+
this.autoActivateSchedule = settings.auto_activate_schedule ?? true;
|
|
76
|
+
this.notifyDriversOnShiftChange = settings.notify_drivers_on_shift_change ?? false;
|
|
77
|
+
}
|
|
78
|
+
} catch {
|
|
79
|
+
// Settings may not exist yet — use defaults silently
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Save scheduling settings to the backend.
|
|
85
|
+
*/
|
|
86
|
+
@task *saveSettings() {
|
|
87
|
+
try {
|
|
88
|
+
yield this.fetch.post('fleet-ops/settings/scheduling-settings', {
|
|
89
|
+
horizon_days: this.horizonDays,
|
|
90
|
+
default_shift_duration: this.defaultShiftDuration,
|
|
91
|
+
hos_daily_limit: this.hosDailyLimit,
|
|
92
|
+
hos_weekly_limit: this.hosWeeklyLimit,
|
|
93
|
+
auto_activate_schedule: this.autoActivateSchedule,
|
|
94
|
+
notify_drivers_on_shift_change: this.notifyDriversOnShiftChange,
|
|
95
|
+
});
|
|
96
|
+
this.notifications.success(this.intl.t('settings.scheduling.settings-saved'));
|
|
97
|
+
} catch (error) {
|
|
98
|
+
this.notifications.serverError(error);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Load reusable (library) schedule templates — those without a subject_uuid.
|
|
104
|
+
*/
|
|
105
|
+
@task *loadTemplates() {
|
|
106
|
+
try {
|
|
107
|
+
const templates = yield this.store.query('schedule-template', { is_library: true });
|
|
108
|
+
this.scheduleTemplates = templates.toArray();
|
|
109
|
+
} catch {
|
|
110
|
+
this.scheduleTemplates = [];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Open the create-template modal.
|
|
116
|
+
*/
|
|
117
|
+
@action createTemplate() {
|
|
118
|
+
this.modalsManager.show('modals/add-driver-shift', {
|
|
119
|
+
title: this.intl.t('settings.scheduling.new-template'),
|
|
120
|
+
isLibraryTemplate: true,
|
|
121
|
+
onConfirm: () => this.loadTemplates.perform(),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Open the edit-template modal.
|
|
127
|
+
*/
|
|
128
|
+
@action editTemplate(template) {
|
|
129
|
+
this.modalsManager.show('modals/add-driver-shift', {
|
|
130
|
+
title: this.intl.t('settings.scheduling.edit-template'),
|
|
131
|
+
isLibraryTemplate: true,
|
|
132
|
+
template,
|
|
133
|
+
onConfirm: () => this.loadTemplates.perform(),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Delete a schedule template after confirmation.
|
|
139
|
+
*/
|
|
140
|
+
@action async deleteTemplate(template) {
|
|
141
|
+
await this.modalsManager.confirm({
|
|
142
|
+
title: this.intl.t('settings.scheduling.delete-template'),
|
|
143
|
+
body: this.intl.t('settings.scheduling.delete-template-confirm', { name: template.name }),
|
|
144
|
+
onConfirm: async () => {
|
|
145
|
+
try {
|
|
146
|
+
await template.destroyRecord();
|
|
147
|
+
this.scheduleTemplates = this.scheduleTemplates.filter((t) => t.id !== template.id);
|
|
148
|
+
this.notifications.success(this.intl.t('settings.scheduling.template-deleted'));
|
|
149
|
+
} catch (error) {
|
|
150
|
+
this.notifications.serverError(error);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
package/addon/extension.js
CHANGED
|
@@ -7,7 +7,67 @@ export default {
|
|
|
7
7
|
const widgetService = universe.getService('widget');
|
|
8
8
|
|
|
9
9
|
// Register header navigation
|
|
10
|
-
menuService.registerHeaderMenuItem('Fleet-Ops', 'console.fleet-ops', {
|
|
10
|
+
menuService.registerHeaderMenuItem('Fleet-Ops', 'console.fleet-ops', {
|
|
11
|
+
icon: 'route',
|
|
12
|
+
priority: 0,
|
|
13
|
+
description: 'Dispatch, fleet management, driver tracking, and logistics operations.',
|
|
14
|
+
shortcuts: [
|
|
15
|
+
{
|
|
16
|
+
title: 'Orders',
|
|
17
|
+
description: 'Create, dispatch, and track delivery orders in real time.',
|
|
18
|
+
icon: 'boxes-stacked',
|
|
19
|
+
route: 'console.fleet-ops.operations.orders',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
title: 'Places',
|
|
23
|
+
description: 'Manage saved locations, addresses, and points of interest.',
|
|
24
|
+
icon: 'location-dot',
|
|
25
|
+
route: 'console.fleet-ops.management.places',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
title: 'Drivers',
|
|
29
|
+
description: 'Manage driver profiles, assignments, and live locations.',
|
|
30
|
+
icon: 'id-card',
|
|
31
|
+
route: 'console.fleet-ops.management.drivers',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
title: 'Vehicles',
|
|
35
|
+
description: 'View and manage your vehicle fleet and telematics.',
|
|
36
|
+
icon: 'truck',
|
|
37
|
+
route: 'console.fleet-ops.management.vehicles',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
title: 'Fleets',
|
|
41
|
+
description: 'Organise drivers and vehicles into operational fleets.',
|
|
42
|
+
icon: 'layer-group',
|
|
43
|
+
route: 'console.fleet-ops.management.fleets',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
title: 'Service Rates',
|
|
47
|
+
description: 'Configure pricing rules and service rate cards.',
|
|
48
|
+
icon: 'tags',
|
|
49
|
+
route: 'console.fleet-ops.operations.service-rates',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
title: 'Devices',
|
|
53
|
+
description: 'Manage connected telematics devices and their sensor data.',
|
|
54
|
+
icon: 'microchip',
|
|
55
|
+
route: 'console.fleet-ops.connectivity.devices',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
title: 'Reports',
|
|
59
|
+
description: 'Generate and review operational analytics reports.',
|
|
60
|
+
icon: 'chart-bar',
|
|
61
|
+
route: 'console.fleet-ops.analytics.reports',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
title: 'Orchestrator',
|
|
65
|
+
description: 'Intelligently allocate and dispatch orders to available drivers.',
|
|
66
|
+
icon: 'diagram-project',
|
|
67
|
+
route: 'console.fleet-ops.operations.orchestrator',
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
});
|
|
11
71
|
|
|
12
72
|
// Register admin sections
|
|
13
73
|
menuService.registerAdminMenuPanel(
|
|
@@ -99,6 +159,18 @@ export default {
|
|
|
99
159
|
'fleet-ops:component:issue:form:details',
|
|
100
160
|
'fleet-ops:component:fuel-report:form',
|
|
101
161
|
'fleet-ops:component:fuel-report:form:details',
|
|
162
|
+
'fleet-ops:component:maintenance:form',
|
|
163
|
+
'fleet-ops:component:maintenance:form:details',
|
|
164
|
+
'fleet-ops:component:maintenance:details',
|
|
165
|
+
'fleet-ops:component:work-order:form',
|
|
166
|
+
'fleet-ops:component:work-order:form:details',
|
|
167
|
+
'fleet-ops:component:work-order:details',
|
|
168
|
+
'fleet-ops:component:equipment:form',
|
|
169
|
+
'fleet-ops:component:equipment:form:details',
|
|
170
|
+
'fleet-ops:component:equipment:details',
|
|
171
|
+
'fleet-ops:component:part:form',
|
|
172
|
+
'fleet-ops:component:part:form:details',
|
|
173
|
+
'fleet-ops:component:part:details',
|
|
102
174
|
'fleet-ops:contextmenu:vehicle',
|
|
103
175
|
'fleet-ops:contextmenu:driver',
|
|
104
176
|
'fleet-ops:component:order:details',
|
|
@@ -106,6 +178,7 @@ export default {
|
|
|
106
178
|
'fleet-ops:component:order:form:payload:entity',
|
|
107
179
|
'fleet-ops:component:order:form:payload:entity:form',
|
|
108
180
|
'fleet-ops:template:settings:routing',
|
|
181
|
+
'fleet-ops:template:settings:orchestrator',
|
|
109
182
|
]);
|
|
110
183
|
},
|
|
111
184
|
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* register-vroom-allocation
|
|
3
|
+
*
|
|
4
|
+
* Instance initializer that registers the VROOM orchestration engine adapter
|
|
5
|
+
* into the orchestration-engine registry service.
|
|
6
|
+
*
|
|
7
|
+
* This pattern is identical to how register-osrm.js registers the OSRM
|
|
8
|
+
* routing engine into the route-optimization registry.
|
|
9
|
+
*
|
|
10
|
+
* Third-party orchestration engines follow the same pattern:
|
|
11
|
+
* 1. Create a service extending OrchestrationEngineInterfaceService
|
|
12
|
+
* 2. Create an instance initializer that calls orchestrationEngine.register()
|
|
13
|
+
* 3. The engine will appear in the FleetOps orchestrator settings dropdown
|
|
14
|
+
*/
|
|
15
|
+
export function initialize(appInstance) {
|
|
16
|
+
const orchestrationEngine = appInstance.lookup('service:orchestration-engine');
|
|
17
|
+
const vroomEngine = appInstance.lookup('service:vroom-allocation-engine');
|
|
18
|
+
|
|
19
|
+
if (orchestrationEngine && vroomEngine && !orchestrationEngine.has('vroom')) {
|
|
20
|
+
orchestrationEngine.register('vroom', vroomEngine);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default {
|
|
25
|
+
name: 'register-vroom-allocation',
|
|
26
|
+
initialize,
|
|
27
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import Model, { attr, belongsTo } from '@ember-data/model';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Local maintenance-schedule model used by the fleetops engine.
|
|
5
|
+
* The canonical model with full computed properties lives in fleetops-data.
|
|
6
|
+
* This local copy adds the polymorphic @belongsTo relationships so the
|
|
7
|
+
* engine's form and details components can use relationship accessors
|
|
8
|
+
* directly instead of raw _type / _uuid attrs.
|
|
9
|
+
*/
|
|
10
|
+
export default class MaintenanceScheduleModel extends Model {
|
|
11
|
+
// Identification
|
|
12
|
+
@attr('string') public_id;
|
|
13
|
+
@attr('string') name;
|
|
14
|
+
@attr('string') type;
|
|
15
|
+
@attr('string') status;
|
|
16
|
+
|
|
17
|
+
// Polymorphic subject (the asset this schedule applies to)
|
|
18
|
+
@belongsTo('maintenance-subject', { polymorphic: true, async: false }) subject;
|
|
19
|
+
|
|
20
|
+
// Polymorphic default_assignee (who should be assigned to generated work orders)
|
|
21
|
+
@belongsTo('facilitator', { polymorphic: true, async: false }) default_assignee;
|
|
22
|
+
|
|
23
|
+
// Interval definition
|
|
24
|
+
@attr('string') interval_method;
|
|
25
|
+
@attr('string') interval_type;
|
|
26
|
+
@attr('number') interval_value;
|
|
27
|
+
@attr('string') interval_unit;
|
|
28
|
+
@attr('number') interval_distance;
|
|
29
|
+
@attr('number') interval_engine_hours;
|
|
30
|
+
|
|
31
|
+
// Baseline readings
|
|
32
|
+
@attr('number') last_service_odometer;
|
|
33
|
+
@attr('number') last_service_engine_hours;
|
|
34
|
+
@attr('date') last_service_date;
|
|
35
|
+
|
|
36
|
+
// Next-due thresholds
|
|
37
|
+
@attr('date') next_due_date;
|
|
38
|
+
@attr('number') next_due_odometer;
|
|
39
|
+
@attr('number') next_due_engine_hours;
|
|
40
|
+
|
|
41
|
+
// Work order defaults
|
|
42
|
+
@attr('string') default_priority;
|
|
43
|
+
@attr('string') instructions;
|
|
44
|
+
@attr() meta;
|
|
45
|
+
|
|
46
|
+
@attr('date') created_at;
|
|
47
|
+
@attr('date') updated_at;
|
|
48
|
+
|
|
49
|
+
// Computed display helpers
|
|
50
|
+
get nextDueDate() {
|
|
51
|
+
return this.next_due_date;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
get isActive() {
|
|
55
|
+
return this.status === 'active';
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
get isPaused() {
|
|
59
|
+
return this.status === 'paused';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -1,3 +1,29 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
import { action } from '@ember/object';
|
|
2
4
|
|
|
3
|
-
export default class MaintenanceEquipmentIndexDetailsRoute extends Route {
|
|
5
|
+
export default class MaintenanceEquipmentIndexDetailsRoute extends Route {
|
|
6
|
+
@service store;
|
|
7
|
+
@service notifications;
|
|
8
|
+
@service hostRouter;
|
|
9
|
+
@service abilities;
|
|
10
|
+
@service intl;
|
|
11
|
+
|
|
12
|
+
@action error(error) {
|
|
13
|
+
this.notifications.serverError(error);
|
|
14
|
+
if (typeof error.message === 'string' && error.message.endsWith('not found')) {
|
|
15
|
+
return this.hostRouter.transitionTo('maintenance.equipment.index');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
beforeModel() {
|
|
20
|
+
if (this.abilities.cannot('fleet-ops view equipment')) {
|
|
21
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
22
|
+
return this.hostRouter.transitionTo('maintenance.equipment.index');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
model({ public_id }) {
|
|
27
|
+
return this.store.findRecord('equipment', public_id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,3 +1,29 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
import { action } from '@ember/object';
|
|
2
4
|
|
|
3
|
-
export default class MaintenanceEquipmentIndexEditRoute extends Route {
|
|
5
|
+
export default class MaintenanceEquipmentIndexEditRoute extends Route {
|
|
6
|
+
@service store;
|
|
7
|
+
@service notifications;
|
|
8
|
+
@service hostRouter;
|
|
9
|
+
@service abilities;
|
|
10
|
+
@service intl;
|
|
11
|
+
|
|
12
|
+
@action error(error) {
|
|
13
|
+
this.notifications.serverError(error);
|
|
14
|
+
if (typeof error.message === 'string' && error.message.endsWith('not found')) {
|
|
15
|
+
return this.hostRouter.transitionTo('maintenance.equipment.index');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
beforeModel() {
|
|
20
|
+
if (this.abilities.cannot('fleet-ops update equipment')) {
|
|
21
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
22
|
+
return this.hostRouter.transitionTo('maintenance.equipment.index');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
model({ public_id }) {
|
|
27
|
+
return this.store.findRecord('equipment', public_id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
import { action } from '@ember/object';
|
|
4
|
+
|
|
5
|
+
export default class MaintenanceMaintenancesIndexDetailsRoute extends Route {
|
|
6
|
+
@service store;
|
|
7
|
+
@service notifications;
|
|
8
|
+
@service hostRouter;
|
|
9
|
+
@service abilities;
|
|
10
|
+
@service intl;
|
|
11
|
+
|
|
12
|
+
@action error(error) {
|
|
13
|
+
this.notifications.serverError(error);
|
|
14
|
+
if (typeof error.message === 'string' && error.message.endsWith('not found')) {
|
|
15
|
+
return this.hostRouter.transitionTo('maintenance.maintenances.index');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
beforeModel() {
|
|
20
|
+
if (this.abilities.cannot('fleet-ops view maintenance')) {
|
|
21
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
22
|
+
return this.hostRouter.transitionTo('maintenance.maintenances.index');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
model({ public_id }) {
|
|
27
|
+
return this.store.findRecord('maintenance', public_id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
import { action } from '@ember/object';
|
|
4
|
+
|
|
5
|
+
export default class MaintenanceMaintenancesIndexEditRoute extends Route {
|
|
6
|
+
@service store;
|
|
7
|
+
@service notifications;
|
|
8
|
+
@service hostRouter;
|
|
9
|
+
@service abilities;
|
|
10
|
+
@service intl;
|
|
11
|
+
|
|
12
|
+
@action error(error) {
|
|
13
|
+
this.notifications.serverError(error);
|
|
14
|
+
if (typeof error.message === 'string' && error.message.endsWith('not found')) {
|
|
15
|
+
return this.hostRouter.transitionTo('maintenance.maintenances.index');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
beforeModel() {
|
|
20
|
+
if (this.abilities.cannot('fleet-ops update maintenance')) {
|
|
21
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
22
|
+
return this.hostRouter.transitionTo('maintenance.maintenances.index');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
model({ public_id }) {
|
|
27
|
+
return this.store.findRecord('maintenance', public_id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
|
|
4
|
+
export default class MaintenanceMaintenancesIndexRoute extends Route {
|
|
5
|
+
@service store;
|
|
6
|
+
|
|
7
|
+
queryParams = {
|
|
8
|
+
page: { refreshModel: true },
|
|
9
|
+
limit: { refreshModel: true },
|
|
10
|
+
sort: { refreshModel: true },
|
|
11
|
+
query: { refreshModel: true },
|
|
12
|
+
type: { refreshModel: true },
|
|
13
|
+
status: { refreshModel: true },
|
|
14
|
+
priority: { refreshModel: true },
|
|
15
|
+
public_id: { refreshModel: true },
|
|
16
|
+
created_at: { refreshModel: true },
|
|
17
|
+
updated_at: { refreshModel: true },
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
model(params) {
|
|
21
|
+
return this.store.query('maintenance', { ...params });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -1,3 +1,29 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
import { action } from '@ember/object';
|
|
2
4
|
|
|
3
|
-
export default class MaintenancePartsIndexDetailsRoute extends Route {
|
|
5
|
+
export default class MaintenancePartsIndexDetailsRoute extends Route {
|
|
6
|
+
@service store;
|
|
7
|
+
@service notifications;
|
|
8
|
+
@service hostRouter;
|
|
9
|
+
@service abilities;
|
|
10
|
+
@service intl;
|
|
11
|
+
|
|
12
|
+
@action error(error) {
|
|
13
|
+
this.notifications.serverError(error);
|
|
14
|
+
if (typeof error.message === 'string' && error.message.endsWith('not found')) {
|
|
15
|
+
return this.hostRouter.transitionTo('maintenance.parts.index');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
beforeModel() {
|
|
20
|
+
if (this.abilities.cannot('fleet-ops view part')) {
|
|
21
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
22
|
+
return this.hostRouter.transitionTo('maintenance.parts.index');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
model({ public_id }) {
|
|
27
|
+
return this.store.findRecord('part', public_id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,3 +1,29 @@
|
|
|
1
1
|
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
import { action } from '@ember/object';
|
|
2
4
|
|
|
3
|
-
export default class MaintenancePartsIndexEditRoute extends Route {
|
|
5
|
+
export default class MaintenancePartsIndexEditRoute extends Route {
|
|
6
|
+
@service store;
|
|
7
|
+
@service notifications;
|
|
8
|
+
@service hostRouter;
|
|
9
|
+
@service abilities;
|
|
10
|
+
@service intl;
|
|
11
|
+
|
|
12
|
+
@action error(error) {
|
|
13
|
+
this.notifications.serverError(error);
|
|
14
|
+
if (typeof error.message === 'string' && error.message.endsWith('not found')) {
|
|
15
|
+
return this.hostRouter.transitionTo('maintenance.parts.index');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
beforeModel() {
|
|
20
|
+
if (this.abilities.cannot('fleet-ops update part')) {
|
|
21
|
+
this.notifications.warning(this.intl.t('common.unauthorized-access'));
|
|
22
|
+
return this.hostRouter.transitionTo('maintenance.parts.index');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
model({ public_id }) {
|
|
27
|
+
return this.store.findRecord('part', public_id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import Route from '@ember/routing/route';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
|
|
4
|
+
export default class MaintenanceSchedulesIndexDetailsWorkOrdersRoute extends Route {
|
|
5
|
+
@service store;
|
|
6
|
+
|
|
7
|
+
model() {
|
|
8
|
+
const schedule = this.modelFor('maintenance.schedules.index.details');
|
|
9
|
+
return this.store.query('work-order', { schedule_uuid: schedule.id });
|
|
10
|
+
}
|
|
11
|
+
}
|