@fleetbase/fleetops-engine 0.6.38 → 0.6.40
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 +43 -38
- package/addon/components/layout/fleet-ops-sidebar.js +103 -24
- 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 +1088 -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 +52 -0
- package/addon/components/vehicle/form.hbs +51 -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.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 +19 -0
- 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/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 +31 -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 +79 -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.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/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/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 +4 -2
- 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 +53 -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 +38 -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/migrations/2026_04_14_000001_drop_redundant_capacity_columns_from_payloads_table.php +42 -0
- package/server/migrations/2026_04_14_000002_rename_capacity_columns_on_vehicles_table.php +48 -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/Api/v1/OrderController.php +15 -2
- package/server/src/Http/Controllers/Api/v1/VehicleController.php +18 -2
- 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/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 +18 -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 +380 -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
|
@@ -51,7 +51,7 @@ class Waypoint extends Model
|
|
|
51
51
|
*
|
|
52
52
|
* @var array
|
|
53
53
|
*/
|
|
54
|
-
protected $fillable = ['_key', '_import_id', 'company_uuid', 'payload_uuid', 'place_uuid', 'tracking_number_uuid', 'customer_uuid', 'customer_type', 'type', 'order'];
|
|
54
|
+
protected $fillable = ['_key', '_import_id', 'company_uuid', 'payload_uuid', 'place_uuid', 'tracking_number_uuid', 'customer_uuid', 'customer_type', 'type', 'order', 'time_window_start', 'time_window_end', 'service_time', 'notes', 'pod_method', 'pod_required'];
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
57
|
* Dynamic attributes that are appended to object.
|
|
@@ -81,6 +81,12 @@ class Waypoint extends Model
|
|
|
81
81
|
*/
|
|
82
82
|
protected $casts = [
|
|
83
83
|
'customer_type' => PolymorphicType::class,
|
|
84
|
+
// Orchestrator
|
|
85
|
+
'time_window_start' => 'datetime',
|
|
86
|
+
'time_window_end' => 'datetime',
|
|
87
|
+
'service_time' => 'integer',
|
|
88
|
+
// Per-stop POD and notes (mirrors order-level fields)
|
|
89
|
+
'pod_required' => 'boolean',
|
|
84
90
|
];
|
|
85
91
|
|
|
86
92
|
/**
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Models;
|
|
4
4
|
|
|
5
5
|
use Fleetbase\Casts\Json;
|
|
6
|
+
use Fleetbase\Casts\Money;
|
|
6
7
|
use Fleetbase\Casts\PolymorphicType;
|
|
8
|
+
use Fleetbase\FleetOps\Support\Utils;
|
|
7
9
|
use Fleetbase\Models\File;
|
|
8
10
|
use Fleetbase\Models\Model;
|
|
9
11
|
use Fleetbase\Models\User;
|
|
@@ -17,6 +19,7 @@ use Fleetbase\Traits\TracksApiCredential;
|
|
|
17
19
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
18
20
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
19
21
|
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
|
22
|
+
use Illuminate\Support\Str;
|
|
20
23
|
use Spatie\Activitylog\LogOptions;
|
|
21
24
|
use Spatie\Activitylog\Traits\LogsActivity;
|
|
22
25
|
|
|
@@ -85,10 +88,30 @@ class WorkOrder extends Model
|
|
|
85
88
|
'closed_at',
|
|
86
89
|
'instructions',
|
|
87
90
|
'checklist',
|
|
91
|
+
'estimated_cost',
|
|
92
|
+
'approved_budget',
|
|
93
|
+
'actual_cost',
|
|
94
|
+
'currency',
|
|
95
|
+
'cost_breakdown',
|
|
96
|
+
'cost_center',
|
|
97
|
+
'budget_code',
|
|
88
98
|
'meta',
|
|
89
|
-
'slug',
|
|
90
99
|
];
|
|
91
100
|
|
|
101
|
+
/**
|
|
102
|
+
* Boot the model.
|
|
103
|
+
*/
|
|
104
|
+
public static function boot(): void
|
|
105
|
+
{
|
|
106
|
+
parent::boot();
|
|
107
|
+
|
|
108
|
+
static::creating(function ($model) {
|
|
109
|
+
if (empty($model->code)) {
|
|
110
|
+
$model->code = 'WO-' . strtoupper(Str::random(8));
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
92
115
|
/**
|
|
93
116
|
* Dynamic attributes that are appended to object.
|
|
94
117
|
*
|
|
@@ -104,11 +127,11 @@ class WorkOrder extends Model
|
|
|
104
127
|
];
|
|
105
128
|
|
|
106
129
|
/**
|
|
107
|
-
*
|
|
130
|
+
* Relationships to always eager load.
|
|
108
131
|
*
|
|
109
132
|
* @var array
|
|
110
133
|
*/
|
|
111
|
-
protected $
|
|
134
|
+
protected $with = ['target', 'assignee'];
|
|
112
135
|
|
|
113
136
|
/**
|
|
114
137
|
* The attributes that should be cast to native types.
|
|
@@ -116,13 +139,18 @@ class WorkOrder extends Model
|
|
|
116
139
|
* @var array
|
|
117
140
|
*/
|
|
118
141
|
protected $casts = [
|
|
119
|
-
'opened_at'
|
|
120
|
-
'due_at'
|
|
121
|
-
'closed_at'
|
|
122
|
-
'checklist'
|
|
123
|
-
'
|
|
124
|
-
'
|
|
125
|
-
'
|
|
142
|
+
'opened_at' => 'datetime',
|
|
143
|
+
'due_at' => 'datetime',
|
|
144
|
+
'closed_at' => 'datetime',
|
|
145
|
+
'checklist' => Json::class,
|
|
146
|
+
'cost_breakdown' => Json::class,
|
|
147
|
+
'meta' => Json::class,
|
|
148
|
+
'target_type' => PolymorphicType::class,
|
|
149
|
+
'assignee_type' => PolymorphicType::class,
|
|
150
|
+
// Money values
|
|
151
|
+
'estimated_cost' => Money::class,
|
|
152
|
+
'approved_budget' => Money::class,
|
|
153
|
+
'actual_cost' => Money::class,
|
|
126
154
|
];
|
|
127
155
|
|
|
128
156
|
/**
|
|
@@ -166,12 +194,12 @@ class WorkOrder extends Model
|
|
|
166
194
|
|
|
167
195
|
public function target(): MorphTo
|
|
168
196
|
{
|
|
169
|
-
return $this->morphTo();
|
|
197
|
+
return $this->morphTo(__FUNCTION__, 'target_type', 'target_uuid');
|
|
170
198
|
}
|
|
171
199
|
|
|
172
200
|
public function assignee(): MorphTo
|
|
173
201
|
{
|
|
174
|
-
return $this->morphTo();
|
|
202
|
+
return $this->morphTo(__FUNCTION__, 'assignee_type', 'assignee_uuid');
|
|
175
203
|
}
|
|
176
204
|
|
|
177
205
|
public function maintenances(): HasMany
|
|
@@ -532,4 +560,86 @@ class WorkOrder extends Model
|
|
|
532
560
|
return 1;
|
|
533
561
|
}
|
|
534
562
|
}
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* Create a WorkOrder instance from an import row.
|
|
566
|
+
*
|
|
567
|
+
* Monetary values (estimated_cost, approved_budget, actual_cost) must be supplied in cents.
|
|
568
|
+
* The Money cast will strip non-numeric characters before storage.
|
|
569
|
+
*
|
|
570
|
+
* @param array $row Associative array from the import spreadsheet
|
|
571
|
+
* @param bool $saveInstance Whether to persist the record immediately
|
|
572
|
+
*/
|
|
573
|
+
public static function createFromImport(array $row, bool $saveInstance = false): WorkOrder
|
|
574
|
+
{
|
|
575
|
+
$row = array_filter($row);
|
|
576
|
+
|
|
577
|
+
$subject = Utils::or($row, ['subject', 'title', 'name']);
|
|
578
|
+
$status = Utils::or($row, ['status'], 'open');
|
|
579
|
+
$priority = Utils::or($row, ['priority'], 'normal');
|
|
580
|
+
$instructions = Utils::or($row, ['instructions', 'description', 'notes']);
|
|
581
|
+
$openedAt = Utils::or($row, ['opened_at', 'open_date']);
|
|
582
|
+
$dueAt = Utils::or($row, ['due_at', 'due_date']);
|
|
583
|
+
$estimatedCost = Utils::or($row, ['estimated_cost']);
|
|
584
|
+
$approvedBudget = Utils::or($row, ['approved_budget', 'budget']);
|
|
585
|
+
$actualCost = Utils::or($row, ['actual_cost']);
|
|
586
|
+
$currency = Utils::or($row, ['currency'], 'USD');
|
|
587
|
+
$costCenter = Utils::or($row, ['cost_center']);
|
|
588
|
+
$budgetCode = Utils::or($row, ['budget_code']);
|
|
589
|
+
$vehicleName = Utils::or($row, ['vehicle', 'vehicle_name', 'asset', 'target']);
|
|
590
|
+
$vendorName = Utils::or($row, ['vendor', 'vendor_name', 'assignee']);
|
|
591
|
+
|
|
592
|
+
$workOrder = new static([
|
|
593
|
+
'company_uuid' => session('company'),
|
|
594
|
+
'subject' => $subject,
|
|
595
|
+
'status' => $status,
|
|
596
|
+
'priority' => $priority,
|
|
597
|
+
'instructions' => $instructions,
|
|
598
|
+
'opened_at' => $openedAt ? \Carbon\Carbon::parse($openedAt) : now(),
|
|
599
|
+
'due_at' => $dueAt ? \Carbon\Carbon::parse($dueAt) : null,
|
|
600
|
+
'estimated_cost' => $estimatedCost,
|
|
601
|
+
'approved_budget' => $approvedBudget,
|
|
602
|
+
'actual_cost' => $actualCost,
|
|
603
|
+
'currency' => strtoupper($currency ?? 'USD'),
|
|
604
|
+
'cost_center' => $costCenter,
|
|
605
|
+
'budget_code' => $budgetCode,
|
|
606
|
+
]);
|
|
607
|
+
|
|
608
|
+
// Attempt to resolve the target (vehicle or equipment) by identifier
|
|
609
|
+
if ($vehicleName) {
|
|
610
|
+
$vehicle = Vehicle::findByName($vehicleName);
|
|
611
|
+
if ($vehicle) {
|
|
612
|
+
$workOrder->target_type = Vehicle::class;
|
|
613
|
+
$workOrder->target_uuid = $vehicle->uuid;
|
|
614
|
+
} else {
|
|
615
|
+
$equipment = Equipment::where('company_uuid', session('company'))
|
|
616
|
+
->where(function ($q) use ($vehicleName) {
|
|
617
|
+
$q->where('name', 'like', '%' . $vehicleName . '%')
|
|
618
|
+
->orWhere('public_id', $vehicleName)
|
|
619
|
+
->orWhere('serial_number', $vehicleName);
|
|
620
|
+
})->first();
|
|
621
|
+
if ($equipment) {
|
|
622
|
+
$workOrder->target_type = Equipment::class;
|
|
623
|
+
$workOrder->target_uuid = $equipment->uuid;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// Attempt to resolve assignee (vendor) by name
|
|
629
|
+
if ($vendorName) {
|
|
630
|
+
$vendor = Vendor::where('company_uuid', session('company'))
|
|
631
|
+
->where('name', 'like', '%' . $vendorName . '%')
|
|
632
|
+
->first();
|
|
633
|
+
if ($vendor) {
|
|
634
|
+
$workOrder->assignee_type = Vendor::class;
|
|
635
|
+
$workOrder->assignee_uuid = $vendor->uuid;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
if ($saveInstance === true) {
|
|
640
|
+
$workOrder->save();
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
return $workOrder;
|
|
644
|
+
}
|
|
535
645
|
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Notifications;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\Models\ScheduleItem;
|
|
6
|
+
use Fleetbase\Support\Utils;
|
|
7
|
+
use Illuminate\Bus\Queueable;
|
|
8
|
+
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
9
|
+
use Illuminate\Notifications\Messages\MailMessage;
|
|
10
|
+
use Illuminate\Notifications\Notification;
|
|
11
|
+
|
|
12
|
+
class DriverShiftChanged extends Notification implements ShouldQueue
|
|
13
|
+
{
|
|
14
|
+
use Queueable;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The schedule item that was created or updated.
|
|
18
|
+
*/
|
|
19
|
+
public ScheduleItem $scheduleItem;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Whether this is a new shift (created) or an update to an existing one.
|
|
23
|
+
*/
|
|
24
|
+
public bool $isNew;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Notification name.
|
|
28
|
+
*/
|
|
29
|
+
public static string $name = 'Driver Shift Changed';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Notification description.
|
|
33
|
+
*/
|
|
34
|
+
public static string $description = 'Notify a driver when their shift schedule is created or updated.';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Notification package.
|
|
38
|
+
*/
|
|
39
|
+
public static string $package = 'fleet-ops';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The notification title.
|
|
43
|
+
*/
|
|
44
|
+
public string $title;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The notification body.
|
|
48
|
+
*/
|
|
49
|
+
public string $message;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Create a new notification instance.
|
|
53
|
+
*/
|
|
54
|
+
public function __construct(ScheduleItem $scheduleItem, bool $isNew = true)
|
|
55
|
+
{
|
|
56
|
+
$this->scheduleItem = $scheduleItem;
|
|
57
|
+
$this->isNew = $isNew;
|
|
58
|
+
|
|
59
|
+
$start = $scheduleItem->start_at ? $scheduleItem->start_at->format('D, M j g:ia') : '—';
|
|
60
|
+
$end = $scheduleItem->end_at ? $scheduleItem->end_at->format('g:ia') : '—';
|
|
61
|
+
|
|
62
|
+
if ($isNew) {
|
|
63
|
+
$this->title = 'New shift scheduled';
|
|
64
|
+
$this->message = "A new shift has been added to your schedule: {$start} – {$end}.";
|
|
65
|
+
} else {
|
|
66
|
+
$this->title = 'Your shift has been updated';
|
|
67
|
+
$this->message = "Your shift has been updated: {$start} – {$end}.";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Get the notification's delivery channels.
|
|
73
|
+
*/
|
|
74
|
+
public function via($notifiable): array
|
|
75
|
+
{
|
|
76
|
+
return ['mail'];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Build the mail representation of the notification.
|
|
81
|
+
*/
|
|
82
|
+
public function toMail($notifiable): MailMessage
|
|
83
|
+
{
|
|
84
|
+
$message = (new MailMessage())
|
|
85
|
+
->subject($this->title)
|
|
86
|
+
->line($this->message);
|
|
87
|
+
|
|
88
|
+
if ($this->scheduleItem->notes) {
|
|
89
|
+
$message->line('Notes: ' . $this->scheduleItem->notes);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
$message->action('View Schedule', Utils::consoleUrl('fleet-ops/operations/scheduler'));
|
|
93
|
+
|
|
94
|
+
return $message;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get the array representation of the notification.
|
|
99
|
+
*/
|
|
100
|
+
public function toArray($notifiable): array
|
|
101
|
+
{
|
|
102
|
+
return [
|
|
103
|
+
'id' => $this->scheduleItem->public_id,
|
|
104
|
+
'type' => 'driver_shift_changed',
|
|
105
|
+
'is_new' => $this->isNew,
|
|
106
|
+
'start_at' => $this->scheduleItem->start_at,
|
|
107
|
+
'end_at' => $this->scheduleItem->end_at,
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Observers;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\FleetOps\Models\Maintenance;
|
|
6
|
+
use Fleetbase\FleetOps\Models\MaintenanceSchedule;
|
|
7
|
+
use Fleetbase\FleetOps\Models\WorkOrder;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* WorkOrderObserver.
|
|
11
|
+
*
|
|
12
|
+
* Listens for status transitions on WorkOrder records. When a work order is
|
|
13
|
+
* closed (completed), this observer:
|
|
14
|
+
*
|
|
15
|
+
* 1. Automatically creates a Maintenance (history) record from the work order's
|
|
16
|
+
* data and any completion metadata captured in the work order's meta field.
|
|
17
|
+
* 2. Resets the linked MaintenanceSchedule's next-due thresholds so the cycle
|
|
18
|
+
* restarts from the completion point.
|
|
19
|
+
* 3. Dispatches a `work_order.completed` event for downstream integrations.
|
|
20
|
+
*/
|
|
21
|
+
class WorkOrderObserver
|
|
22
|
+
{
|
|
23
|
+
/**
|
|
24
|
+
* Handle the WorkOrder "updated" event.
|
|
25
|
+
* We intercept the status transition to "closed" here rather than in a
|
|
26
|
+
* dedicated "closed" event because Eloquent does not have a per-value event.
|
|
27
|
+
*/
|
|
28
|
+
public function updated(WorkOrder $workOrder): void
|
|
29
|
+
{
|
|
30
|
+
// Only act when the status has just changed to "closed"
|
|
31
|
+
if (!$workOrder->wasChanged('status') || $workOrder->status !== 'closed') {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
$this->createMaintenanceRecord($workOrder);
|
|
36
|
+
$this->resetSchedule($workOrder);
|
|
37
|
+
|
|
38
|
+
event('work_order.completed', $workOrder);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// -------------------------------------------------------------------------
|
|
42
|
+
// Private helpers
|
|
43
|
+
// -------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Create a Maintenance history record from the completed work order.
|
|
47
|
+
*/
|
|
48
|
+
private function createMaintenanceRecord(WorkOrder $workOrder): void
|
|
49
|
+
{
|
|
50
|
+
// Avoid duplicate records if one was already manually created for this WO
|
|
51
|
+
if (Maintenance::where('work_order_uuid', $workOrder->uuid)->exists()) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
$meta = $workOrder->meta ?? [];
|
|
56
|
+
$completionData = $meta['completion_data'] ?? [];
|
|
57
|
+
|
|
58
|
+
Maintenance::create([
|
|
59
|
+
'company_uuid' => $workOrder->company_uuid,
|
|
60
|
+
'work_order_uuid' => $workOrder->uuid,
|
|
61
|
+
'maintainable_type' => $workOrder->target_type,
|
|
62
|
+
'maintainable_uuid' => $workOrder->target_uuid,
|
|
63
|
+
'type' => 'scheduled',
|
|
64
|
+
'status' => 'done',
|
|
65
|
+
'priority' => $workOrder->priority,
|
|
66
|
+
'scheduled_at' => $workOrder->opened_at,
|
|
67
|
+
'completed_at' => $workOrder->closed_at ?? now(),
|
|
68
|
+
'performed_by_type' => $workOrder->assignee_type,
|
|
69
|
+
'performed_by_uuid' => $workOrder->assignee_uuid,
|
|
70
|
+
'summary' => $workOrder->subject,
|
|
71
|
+
'notes' => $completionData['notes'] ?? null,
|
|
72
|
+
'odometer' => $completionData['odometer'] ?? null,
|
|
73
|
+
'engine_hours' => $completionData['engine_hours'] ?? null,
|
|
74
|
+
'labor_cost' => $completionData['labor_cost'] ?? null,
|
|
75
|
+
'parts_cost' => $completionData['parts_cost'] ?? null,
|
|
76
|
+
'tax' => $completionData['tax'] ?? null,
|
|
77
|
+
'total_cost' => $completionData['total_cost'] ?? null,
|
|
78
|
+
'currency' => $completionData['currency'] ?? null,
|
|
79
|
+
'line_items' => $completionData['line_items'] ?? null,
|
|
80
|
+
'created_by_uuid' => $workOrder->created_by_uuid,
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Reset the linked schedule's next-due thresholds after completion.
|
|
86
|
+
*/
|
|
87
|
+
private function resetSchedule(WorkOrder $workOrder): void
|
|
88
|
+
{
|
|
89
|
+
if (!$workOrder->schedule_uuid) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
$schedule = MaintenanceSchedule::where('uuid', $workOrder->schedule_uuid)->first();
|
|
94
|
+
if (!$schedule) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
$meta = $workOrder->meta ?? [];
|
|
99
|
+
$completionData = $meta['completion_data'] ?? [];
|
|
100
|
+
|
|
101
|
+
$schedule->resetAfterCompletion(
|
|
102
|
+
odometer: isset($completionData['odometer']) ? (int) $completionData['odometer'] : null,
|
|
103
|
+
completedEngineHours: isset($completionData['engine_hours']) ? (int) $completionData['engine_hours'] : null,
|
|
104
|
+
completedAt: $workOrder->closed_at ?? now()
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Orchestration\Contracts;
|
|
4
|
+
|
|
5
|
+
use Illuminate\Support\Collection;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* OrchestrationEngineInterface.
|
|
9
|
+
*
|
|
10
|
+
* Defines the single contract that every orchestration/optimization engine must
|
|
11
|
+
* implement. The interface is intentionally minimal — engines receive a
|
|
12
|
+
* normalized set of jobs and vehicles and return a normalized result array.
|
|
13
|
+
* All engine-specific payload construction and response parsing is handled
|
|
14
|
+
* inside the concrete engine implementation, not by the caller.
|
|
15
|
+
*
|
|
16
|
+
* Third-party engines can be registered into the OrchestrationEngineRegistry
|
|
17
|
+
* from any Laravel service provider:
|
|
18
|
+
*
|
|
19
|
+
* app(OrchestrationEngineRegistry::class)->register(new MyEngine());
|
|
20
|
+
*
|
|
21
|
+
* The registered engine will then appear in the FleetOps orchestrator settings
|
|
22
|
+
* dropdown automatically.
|
|
23
|
+
*/
|
|
24
|
+
interface OrchestrationEngineInterface
|
|
25
|
+
{
|
|
26
|
+
/**
|
|
27
|
+
* Run the allocation/optimization algorithm.
|
|
28
|
+
*
|
|
29
|
+
* @param Collection $orders collection of Order models to allocate
|
|
30
|
+
* @param Collection $vehicles collection of Vehicle models (with loaded driver)
|
|
31
|
+
* @param array $options Engine-specific options (e.g. max_travel_time,
|
|
32
|
+
* balance_workload, geometry). Keys are defined
|
|
33
|
+
* per-engine; unknown keys MUST be silently ignored.
|
|
34
|
+
*
|
|
35
|
+
* @return array{
|
|
36
|
+
* assignments: array<array{order_id: string, vehicle_id: string, driver_id: string, sequence: int}>,
|
|
37
|
+
* unassigned: array<string>,
|
|
38
|
+
* summary: array<string, mixed>
|
|
39
|
+
* }
|
|
40
|
+
*
|
|
41
|
+
* The returned array MUST contain:
|
|
42
|
+
* - assignments: ordered list of {order_id, vehicle_id, driver_id, sequence}
|
|
43
|
+
* - unassigned: list of order public_ids that could not be assigned
|
|
44
|
+
* - summary: engine-specific metadata (duration, distance, cost, etc.)
|
|
45
|
+
*/
|
|
46
|
+
public function allocate(Collection $orders, Collection $vehicles, array $options = []): array;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Return the human-readable display name for this engine.
|
|
50
|
+
* Used in the settings UI dropdown.
|
|
51
|
+
*
|
|
52
|
+
* @return string e.g. "VROOM", "Google OR-Tools", "Custom Solver"
|
|
53
|
+
*/
|
|
54
|
+
public function getName(): string;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Return the machine-readable identifier for this engine.
|
|
58
|
+
* Must be unique across all registered engines.
|
|
59
|
+
*
|
|
60
|
+
* @return string e.g. "vroom", "or-tools", "custom"
|
|
61
|
+
*/
|
|
62
|
+
public function getIdentifier(): string;
|
|
63
|
+
}
|