@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,67 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Adds columns that are present in the Part model's $fillable / $appends but
|
|
9
|
+
* were omitted from the original create_parts_table migration:
|
|
10
|
+
*
|
|
11
|
+
* - public_id : human-readable unique identifier (e.g. part_xxxxx)
|
|
12
|
+
* - status : stock / lifecycle status string (e.g. 'in_stock', 'out_of_stock')
|
|
13
|
+
* - currency : ISO 4217 currency code for monetary columns
|
|
14
|
+
*/
|
|
15
|
+
return new class extends Migration {
|
|
16
|
+
/**
|
|
17
|
+
* Run the migrations.
|
|
18
|
+
*/
|
|
19
|
+
public function up(): void
|
|
20
|
+
{
|
|
21
|
+
if (!Schema::hasTable('parts')) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
Schema::table('parts', function (Blueprint $table) {
|
|
26
|
+
if (!Schema::hasColumn('parts', 'public_id')) {
|
|
27
|
+
$table->string('public_id')->nullable()->unique()->after('uuid');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!Schema::hasColumn('parts', 'status')) {
|
|
31
|
+
$table->string('status')->nullable()->default('in_stock')->index()->after('type');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (!Schema::hasColumn('parts', 'currency')) {
|
|
35
|
+
$table->string('currency', 3)->nullable()->after('msrp');
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Reverse the migrations.
|
|
42
|
+
*/
|
|
43
|
+
public function down(): void
|
|
44
|
+
{
|
|
45
|
+
if (!Schema::hasTable('parts')) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Schema::table('parts', function (Blueprint $table) {
|
|
50
|
+
$columns = [];
|
|
51
|
+
|
|
52
|
+
if (Schema::hasColumn('parts', 'public_id')) {
|
|
53
|
+
$columns[] = 'public_id';
|
|
54
|
+
}
|
|
55
|
+
if (Schema::hasColumn('parts', 'status')) {
|
|
56
|
+
$columns[] = 'status';
|
|
57
|
+
}
|
|
58
|
+
if (Schema::hasColumn('parts', 'currency')) {
|
|
59
|
+
$columns[] = 'currency';
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (!empty($columns)) {
|
|
63
|
+
$table->dropColumn($columns);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
return new class extends Migration {
|
|
8
|
+
public function up(): void
|
|
9
|
+
{
|
|
10
|
+
// Add reminder_offsets JSON column to maintenance_schedules
|
|
11
|
+
if (Schema::hasTable('maintenance_schedules') && !Schema::hasColumn('maintenance_schedules', 'reminder_offsets')) {
|
|
12
|
+
Schema::table('maintenance_schedules', function (Blueprint $table) {
|
|
13
|
+
$table->json('reminder_offsets')->nullable()->after('instructions')
|
|
14
|
+
->comment('Array of integers: days before next_due_date to send reminder emails, e.g. [15, 7, 3]');
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Create the reminder tracking table
|
|
19
|
+
if (!Schema::hasTable('maintenance_schedule_reminders')) {
|
|
20
|
+
Schema::create('maintenance_schedule_reminders', function (Blueprint $table) {
|
|
21
|
+
$table->id();
|
|
22
|
+
$table->string('schedule_uuid', 191)->index();
|
|
23
|
+
$table->unsignedTinyInteger('offset_days')
|
|
24
|
+
->comment('Which offset fired, e.g. 15 or 3');
|
|
25
|
+
$table->date('due_date_snapshot')
|
|
26
|
+
->comment('The next_due_date at time of sending; advances each cycle so reminders re-fire');
|
|
27
|
+
$table->timestamp('sent_at')->useCurrent();
|
|
28
|
+
|
|
29
|
+
$table->unique(['schedule_uuid', 'offset_days', 'due_date_snapshot'], 'unique_schedule_reminder');
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public function down(): void
|
|
35
|
+
{
|
|
36
|
+
Schema::dropIfExists('maintenance_schedule_reminders');
|
|
37
|
+
|
|
38
|
+
if (Schema::hasTable('maintenance_schedules') && Schema::hasColumn('maintenance_schedules', 'reminder_offsets')) {
|
|
39
|
+
Schema::table('maintenance_schedules', function (Blueprint $table) {
|
|
40
|
+
$table->dropColumn('reminder_offsets');
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Add Orchestrator constraint columns to the vehicles table.
|
|
9
|
+
*
|
|
10
|
+
* New columns:
|
|
11
|
+
* - skills JSON array of vehicle capability flags (e.g. ["tail_lift","refrigerated"])
|
|
12
|
+
* - capacity_weight_kg Maximum payload weight in kilograms
|
|
13
|
+
* - capacity_volume_m3 Maximum cargo volume in cubic metres
|
|
14
|
+
* - capacity_pallets Maximum pallet count
|
|
15
|
+
* - capacity_parcels Maximum parcel/package count
|
|
16
|
+
* - max_tasks Maximum number of stops per route
|
|
17
|
+
* - time_window_start Default shift start time (HH:MM)
|
|
18
|
+
* - time_window_end Default shift end time (HH:MM)
|
|
19
|
+
* - return_to_depot Whether the vehicle must return to its start depot
|
|
20
|
+
*/
|
|
21
|
+
return new class extends Migration {
|
|
22
|
+
public function up(): void
|
|
23
|
+
{
|
|
24
|
+
Schema::table('vehicles', function (Blueprint $table) {
|
|
25
|
+
// Skills / capabilities
|
|
26
|
+
$table->json('skills')->nullable()->after('status');
|
|
27
|
+
|
|
28
|
+
// Multi-dimensional capacity
|
|
29
|
+
$table->unsignedDecimal('capacity_weight_kg', 10, 2)->nullable()->after('skills');
|
|
30
|
+
$table->unsignedDecimal('capacity_volume_m3', 10, 3)->nullable()->after('capacity_weight_kg');
|
|
31
|
+
$table->unsignedInteger('capacity_pallets')->nullable()->after('capacity_volume_m3');
|
|
32
|
+
$table->unsignedInteger('capacity_parcels')->nullable()->after('capacity_pallets');
|
|
33
|
+
|
|
34
|
+
// Route constraints
|
|
35
|
+
$table->unsignedInteger('max_tasks')->nullable()->after('capacity_parcels');
|
|
36
|
+
$table->time('time_window_start')->nullable()->after('max_tasks');
|
|
37
|
+
$table->time('time_window_end')->nullable()->after('time_window_start');
|
|
38
|
+
$table->boolean('return_to_depot')->default(true)->after('time_window_end');
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public function down(): void
|
|
43
|
+
{
|
|
44
|
+
Schema::table('vehicles', function (Blueprint $table) {
|
|
45
|
+
$table->dropColumn([
|
|
46
|
+
'skills',
|
|
47
|
+
'capacity_weight_kg',
|
|
48
|
+
'capacity_volume_m3',
|
|
49
|
+
'capacity_pallets',
|
|
50
|
+
'capacity_parcels',
|
|
51
|
+
'max_tasks',
|
|
52
|
+
'time_window_start',
|
|
53
|
+
'time_window_end',
|
|
54
|
+
'return_to_depot',
|
|
55
|
+
]);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Add Orchestrator constraint columns to the drivers table.
|
|
9
|
+
*
|
|
10
|
+
* New columns:
|
|
11
|
+
* - skills JSON array of driver qualifications/certifications
|
|
12
|
+
* - max_travel_time Maximum driving time per route in seconds
|
|
13
|
+
* - max_distance Maximum driving distance per route in metres
|
|
14
|
+
* - time_window_start Default shift start time (HH:MM)
|
|
15
|
+
* - time_window_end Default shift end time (HH:MM)
|
|
16
|
+
*/
|
|
17
|
+
return new class extends Migration {
|
|
18
|
+
public function up(): void
|
|
19
|
+
{
|
|
20
|
+
Schema::table('drivers', function (Blueprint $table) {
|
|
21
|
+
$table->json('skills')->nullable()->after('status');
|
|
22
|
+
$table->unsignedInteger('max_travel_time')->nullable()->comment('Seconds')->after('skills');
|
|
23
|
+
$table->unsignedInteger('max_distance')->nullable()->comment('Metres')->after('max_travel_time');
|
|
24
|
+
$table->time('time_window_start')->nullable()->after('max_distance');
|
|
25
|
+
$table->time('time_window_end')->nullable()->after('time_window_start');
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public function down(): void
|
|
30
|
+
{
|
|
31
|
+
Schema::table('drivers', function (Blueprint $table) {
|
|
32
|
+
$table->dropColumn([
|
|
33
|
+
'skills',
|
|
34
|
+
'max_travel_time',
|
|
35
|
+
'max_distance',
|
|
36
|
+
'time_window_start',
|
|
37
|
+
'time_window_end',
|
|
38
|
+
]);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Add Orchestrator constraint columns to the orders table.
|
|
9
|
+
*
|
|
10
|
+
* New columns:
|
|
11
|
+
* - orchestrator_priority Integer priority score (10–100) for routing engine
|
|
12
|
+
* - required_skills JSON array of skills required to service this order
|
|
13
|
+
* - time_window_start Earliest acceptable completion datetime
|
|
14
|
+
* - time_window_end Latest acceptable completion datetime
|
|
15
|
+
*/
|
|
16
|
+
return new class extends Migration {
|
|
17
|
+
public function up(): void
|
|
18
|
+
{
|
|
19
|
+
Schema::table('orders', function (Blueprint $table) {
|
|
20
|
+
$table->unsignedTinyInteger('orchestrator_priority')->default(50)->after('status');
|
|
21
|
+
$table->json('required_skills')->nullable()->after('orchestrator_priority');
|
|
22
|
+
$table->dateTime('time_window_start')->nullable()->after('required_skills');
|
|
23
|
+
$table->dateTime('time_window_end')->nullable()->after('time_window_start');
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public function down(): void
|
|
28
|
+
{
|
|
29
|
+
Schema::table('orders', function (Blueprint $table) {
|
|
30
|
+
$table->dropColumn([
|
|
31
|
+
'orchestrator_priority',
|
|
32
|
+
'required_skills',
|
|
33
|
+
'time_window_start',
|
|
34
|
+
'time_window_end',
|
|
35
|
+
]);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Add Orchestrator capacity columns to the payloads table.
|
|
9
|
+
*
|
|
10
|
+
* New columns:
|
|
11
|
+
* - capacity_weight_kg Total payload weight in kilograms (aggregated from entities)
|
|
12
|
+
* - capacity_volume_m3 Total payload volume in cubic metres
|
|
13
|
+
* - capacity_pallets Total pallet count
|
|
14
|
+
* - capacity_parcels Total parcel/package count
|
|
15
|
+
*
|
|
16
|
+
* These columns allow the Orchestrator to quickly compare payload requirements
|
|
17
|
+
* against vehicle capacity without re-aggregating entity dimensions on every run.
|
|
18
|
+
*/
|
|
19
|
+
return new class extends Migration {
|
|
20
|
+
public function up(): void
|
|
21
|
+
{
|
|
22
|
+
Schema::table('payloads', function (Blueprint $table) {
|
|
23
|
+
$table->unsignedDecimal('capacity_weight_kg', 10, 2)->nullable()->after('cod_currency');
|
|
24
|
+
$table->unsignedDecimal('capacity_volume_m3', 10, 3)->nullable()->after('capacity_weight_kg');
|
|
25
|
+
$table->unsignedInteger('capacity_pallets')->nullable()->after('capacity_volume_m3');
|
|
26
|
+
$table->unsignedInteger('capacity_parcels')->nullable()->after('capacity_pallets');
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public function down(): void
|
|
31
|
+
{
|
|
32
|
+
Schema::table('payloads', function (Blueprint $table) {
|
|
33
|
+
$table->dropColumn([
|
|
34
|
+
'capacity_weight_kg',
|
|
35
|
+
'capacity_volume_m3',
|
|
36
|
+
'capacity_pallets',
|
|
37
|
+
'capacity_parcels',
|
|
38
|
+
]);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Add Orchestrator constraint columns to the waypoints table.
|
|
9
|
+
*
|
|
10
|
+
* New columns:
|
|
11
|
+
* - time_window_start Earliest acceptable arrival datetime at this stop
|
|
12
|
+
* - time_window_end Latest acceptable arrival datetime at this stop
|
|
13
|
+
* - service_time Expected dwell time in seconds (loading/unloading/POD)
|
|
14
|
+
*
|
|
15
|
+
* These per-stop constraints are passed directly to the VROOM engine as
|
|
16
|
+
* shipment/job time_windows and service fields.
|
|
17
|
+
*/
|
|
18
|
+
return new class extends Migration {
|
|
19
|
+
public function up(): void
|
|
20
|
+
{
|
|
21
|
+
Schema::table('waypoints', function (Blueprint $table) {
|
|
22
|
+
$table->dateTime('time_window_start')->nullable()->after('type');
|
|
23
|
+
$table->dateTime('time_window_end')->nullable()->after('time_window_start');
|
|
24
|
+
$table->unsignedInteger('service_time')->nullable()->comment('Seconds')->after('time_window_end');
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public function down(): void
|
|
29
|
+
{
|
|
30
|
+
Schema::table('waypoints', function (Blueprint $table) {
|
|
31
|
+
$table->dropColumn([
|
|
32
|
+
'time_window_start',
|
|
33
|
+
'time_window_end',
|
|
34
|
+
'service_time',
|
|
35
|
+
]);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Create the manifests table.
|
|
9
|
+
*
|
|
10
|
+
* A Manifest represents a committed delivery plan for a specific vehicle
|
|
11
|
+
* and (optionally) driver over a given time period. It is the output of
|
|
12
|
+
* an Orchestrator commit and replaces the previous approach of loosely
|
|
13
|
+
* grouping orders by driver_assigned_uuid.
|
|
14
|
+
*/
|
|
15
|
+
return new class extends Migration {
|
|
16
|
+
public function up(): void
|
|
17
|
+
{
|
|
18
|
+
Schema::create('manifests', function (Blueprint $table) {
|
|
19
|
+
$table->uuid('uuid')->primary();
|
|
20
|
+
$table->string('public_id', 23)->unique()->nullable();
|
|
21
|
+
$table->string('internal_id', 100)->nullable()->index();
|
|
22
|
+
$table->char('company_uuid', 36)->nullable()->index();
|
|
23
|
+
$table->char('driver_uuid', 36)->nullable()->index();
|
|
24
|
+
$table->char('vehicle_uuid', 36)->nullable()->index();
|
|
25
|
+
$table->string('status', 50)->default('draft')->index();
|
|
26
|
+
// 'draft' — generated by orchestrator, not yet accepted
|
|
27
|
+
// 'active' — driver accepted in Navigator
|
|
28
|
+
// 'in_progress' — driver departed for first stop
|
|
29
|
+
// 'completed' — all stops completed
|
|
30
|
+
// 'cancelled' — cancelled before completion
|
|
31
|
+
$table->date('scheduled_date')->nullable()->index();
|
|
32
|
+
$table->timestamp('started_at')->nullable();
|
|
33
|
+
$table->timestamp('completed_at')->nullable();
|
|
34
|
+
$table->unsignedInteger('total_distance_m')->default(0);
|
|
35
|
+
$table->unsignedInteger('total_duration_s')->default(0);
|
|
36
|
+
$table->unsignedInteger('stop_count')->default(0);
|
|
37
|
+
$table->text('notes')->nullable();
|
|
38
|
+
$table->json('meta')->nullable();
|
|
39
|
+
$table->timestamps();
|
|
40
|
+
$table->softDeletes();
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public function down(): void
|
|
45
|
+
{
|
|
46
|
+
Schema::dropIfExists('manifests');
|
|
47
|
+
}
|
|
48
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Create the manifest_stops table.
|
|
9
|
+
*
|
|
10
|
+
* A ManifestStop is the ordered join between a Manifest and an Order.
|
|
11
|
+
* Each stop represents a single physical location the driver must visit,
|
|
12
|
+
* with its VROOM-optimised sequence, ETA, and progress status.
|
|
13
|
+
*/
|
|
14
|
+
return new class extends Migration {
|
|
15
|
+
public function up(): void
|
|
16
|
+
{
|
|
17
|
+
Schema::create('manifest_stops', function (Blueprint $table) {
|
|
18
|
+
$table->uuid('uuid')->primary();
|
|
19
|
+
$table->string('public_id', 23)->unique()->nullable();
|
|
20
|
+
$table->char('manifest_uuid', 36)->index();
|
|
21
|
+
$table->char('order_uuid', 36)->index();
|
|
22
|
+
$table->char('place_uuid', 36)->nullable()->index();
|
|
23
|
+
// FK to waypoints if the stop corresponds to a specific payload waypoint
|
|
24
|
+
// (nullable for simple single-dropoff orders where no explicit Waypoint row exists)
|
|
25
|
+
$table->char('waypoint_uuid', 36)->nullable()->index();
|
|
26
|
+
$table->string('status', 50)->default('pending')->index();
|
|
27
|
+
// 'pending' — not yet visited
|
|
28
|
+
// 'arrived' — driver entered geofence / tapped "Arrived"
|
|
29
|
+
// 'completed' — delivery confirmed
|
|
30
|
+
// 'skipped' — dispatcher or driver skipped this stop
|
|
31
|
+
$table->unsignedSmallInteger('sequence')->default(0);
|
|
32
|
+
$table->timestamp('estimated_arrival')->nullable();
|
|
33
|
+
$table->timestamp('actual_arrival')->nullable();
|
|
34
|
+
$table->unsignedInteger('distance_from_prev_m')->default(0);
|
|
35
|
+
$table->unsignedInteger('duration_from_prev_s')->default(0);
|
|
36
|
+
$table->json('meta')->nullable();
|
|
37
|
+
$table->timestamps();
|
|
38
|
+
$table->softDeletes();
|
|
39
|
+
|
|
40
|
+
$table->foreign('manifest_uuid')->references('uuid')->on('manifests')->onDelete('cascade');
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public function down(): void
|
|
45
|
+
{
|
|
46
|
+
Schema::dropIfExists('manifest_stops');
|
|
47
|
+
}
|
|
48
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Add manifest_uuid to the orders table.
|
|
9
|
+
*
|
|
10
|
+
* Links each order to the Manifest it belongs to after an orchestration
|
|
11
|
+
* commit. Nullable — orders that have not been through the orchestrator
|
|
12
|
+
* (or were assigned manually) will have no manifest.
|
|
13
|
+
*/
|
|
14
|
+
return new class extends Migration {
|
|
15
|
+
public function up(): void
|
|
16
|
+
{
|
|
17
|
+
Schema::table('orders', function (Blueprint $table) {
|
|
18
|
+
$table->char('manifest_uuid', 36)->nullable()->after('vehicle_assigned_uuid')->index();
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public function down(): void
|
|
23
|
+
{
|
|
24
|
+
Schema::table('orders', function (Blueprint $table) {
|
|
25
|
+
$table->dropColumn('manifest_uuid');
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Illuminate\Database\Migrations\Migration;
|
|
4
|
+
use Illuminate\Database\Schema\Blueprint;
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Add per-stop POD and notes columns to the waypoints table.
|
|
9
|
+
*
|
|
10
|
+
* New columns mirror the equivalent fields on the orders table so that
|
|
11
|
+
* individual stops can carry their own proof-of-delivery requirements and
|
|
12
|
+
* driver-facing notes independently of the parent order.
|
|
13
|
+
*
|
|
14
|
+
* Until per-waypoint POD is fully implemented in the driver app, the
|
|
15
|
+
* order-level pod_method / pod_required values are used as a fallback.
|
|
16
|
+
*
|
|
17
|
+
* New columns:
|
|
18
|
+
* - notes Free-text driver instructions for this specific stop.
|
|
19
|
+
* - pod_method Proof-of-delivery method (e.g. 'signature', 'photo', 'scan').
|
|
20
|
+
* Mirrors the allowed values from config('fleetops.pod_methods').
|
|
21
|
+
* - pod_required Whether POD must be collected at this stop.
|
|
22
|
+
*/
|
|
23
|
+
return new class extends Migration {
|
|
24
|
+
public function up(): void
|
|
25
|
+
{
|
|
26
|
+
Schema::table('waypoints', function (Blueprint $table) {
|
|
27
|
+
$table->text('notes')->nullable()->after('service_time');
|
|
28
|
+
$table->string('pod_method')->nullable()->after('notes');
|
|
29
|
+
$table->boolean('pod_required')->default(false)->after('pod_method');
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public function down(): void
|
|
34
|
+
{
|
|
35
|
+
Schema::table('waypoints', function (Blueprint $table) {
|
|
36
|
+
$table->dropColumn(['notes', 'pod_method', 'pod_required']);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<x-mail-layout>
|
|
2
|
+
<h2 style="font-size: 18px; font-weight: 600;">
|
|
3
|
+
Maintenance Due Reminder: {{ $schedule->name }}
|
|
4
|
+
</h2>
|
|
5
|
+
@if($assignee && $assignee->name)
|
|
6
|
+
<p>Dear {{ $assignee->name }},</p>
|
|
7
|
+
@endif
|
|
8
|
+
<p>
|
|
9
|
+
This is a reminder that the following maintenance is due
|
|
10
|
+
@if($offsetDays === 1)
|
|
11
|
+
<strong>tomorrow</strong>.
|
|
12
|
+
@else
|
|
13
|
+
in <strong>{{ $offsetDays }} days</strong>.
|
|
14
|
+
@endif
|
|
15
|
+
</p>
|
|
16
|
+
<table style="width: 100%; border-collapse: collapse; margin-top: 16px; margin-bottom: 16px;">
|
|
17
|
+
<tr>
|
|
18
|
+
<td style="padding: 8px 0; font-weight: 600; width: 40%; vertical-align: top;">Schedule</td>
|
|
19
|
+
<td style="padding: 8px 0;">{{ $schedule->name }}</td>
|
|
20
|
+
</tr>
|
|
21
|
+
@if($subject)
|
|
22
|
+
<tr>
|
|
23
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Asset</td>
|
|
24
|
+
<td style="padding: 8px 0;">{{ $subject->name ?? $subject->display_name ?? $subject->public_id }}</td>
|
|
25
|
+
</tr>
|
|
26
|
+
@endif
|
|
27
|
+
<tr>
|
|
28
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Type</td>
|
|
29
|
+
<td style="padding: 8px 0;">{{ ucfirst(str_replace('_', ' ', $schedule->type)) }}</td>
|
|
30
|
+
</tr>
|
|
31
|
+
<tr>
|
|
32
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Due Date</td>
|
|
33
|
+
<td style="padding: 8px 0;">{{ $schedule->next_due_date?->format('d M Y') }}</td>
|
|
34
|
+
</tr>
|
|
35
|
+
<tr>
|
|
36
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Interval</td>
|
|
37
|
+
<td style="padding: 8px 0;">
|
|
38
|
+
@if($schedule->interval_method === 'time')
|
|
39
|
+
Every {{ $schedule->interval_value }} {{ $schedule->interval_unit }}
|
|
40
|
+
@elseif($schedule->interval_method === 'odometer')
|
|
41
|
+
Every {{ number_format($schedule->interval_distance) }} km / miles
|
|
42
|
+
@elseif($schedule->interval_method === 'engine_hours')
|
|
43
|
+
Every {{ number_format($schedule->interval_engine_hours) }} engine hours
|
|
44
|
+
@endif
|
|
45
|
+
</td>
|
|
46
|
+
</tr>
|
|
47
|
+
<tr>
|
|
48
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Priority</td>
|
|
49
|
+
<td style="padding: 8px 0;">{{ ucfirst($schedule->default_priority ?? 'normal') }}</td>
|
|
50
|
+
</tr>
|
|
51
|
+
</table>
|
|
52
|
+
@if($schedule->instructions)
|
|
53
|
+
<p style="font-weight: 600; margin-bottom: 4px;">Instructions:</p>
|
|
54
|
+
<p style="white-space: pre-line;">{{ $schedule->instructions }}</p>
|
|
55
|
+
@endif
|
|
56
|
+
<p style="margin-top: 24px; color: #6b7280; font-size: 13px;">
|
|
57
|
+
Please do not reply directly to this email. Contact the fleet manager if you have any questions.
|
|
58
|
+
</p>
|
|
59
|
+
</x-mail-layout>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<x-mail-layout>
|
|
2
|
+
<h2 style="font-size: 18px; font-weight: 600;">
|
|
3
|
+
Work Order Dispatched: #{{ $workOrder->public_id }}
|
|
4
|
+
</h2>
|
|
5
|
+
|
|
6
|
+
@if($assignee && $assignee->name)
|
|
7
|
+
<p>Dear {{ $assignee->name }},</p>
|
|
8
|
+
@endif
|
|
9
|
+
|
|
10
|
+
<p>
|
|
11
|
+
A work order has been assigned to you. Please review the details below and take the necessary action.
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<table style="width: 100%; border-collapse: collapse; margin-top: 16px; margin-bottom: 16px;">
|
|
15
|
+
<tr>
|
|
16
|
+
<td style="padding: 8px 0; font-weight: 600; width: 40%; vertical-align: top;">Work Order #</td>
|
|
17
|
+
<td style="padding: 8px 0;">{{ $workOrder->public_id }}</td>
|
|
18
|
+
</tr>
|
|
19
|
+
@if($workOrder->subject)
|
|
20
|
+
<tr>
|
|
21
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Subject</td>
|
|
22
|
+
<td style="padding: 8px 0;">{{ $workOrder->subject }}</td>
|
|
23
|
+
</tr>
|
|
24
|
+
@endif
|
|
25
|
+
<tr>
|
|
26
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Status</td>
|
|
27
|
+
<td style="padding: 8px 0;">{{ ucfirst(str_replace('_', ' ', $workOrder->status)) }}</td>
|
|
28
|
+
</tr>
|
|
29
|
+
<tr>
|
|
30
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Priority</td>
|
|
31
|
+
<td style="padding: 8px 0;">{{ ucfirst($workOrder->priority) }}</td>
|
|
32
|
+
</tr>
|
|
33
|
+
@if($target)
|
|
34
|
+
<tr>
|
|
35
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Asset / Vehicle</td>
|
|
36
|
+
<td style="padding: 8px 0;">{{ $target->name ?? $target->display_name ?? $target->public_id }}</td>
|
|
37
|
+
</tr>
|
|
38
|
+
@endif
|
|
39
|
+
@if($workOrder->due_at)
|
|
40
|
+
<tr>
|
|
41
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Due Date</td>
|
|
42
|
+
<td style="padding: 8px 0;">{{ $workOrder->due_at->format('d M Y') }}</td>
|
|
43
|
+
</tr>
|
|
44
|
+
@endif
|
|
45
|
+
@if($workOrder->estimated_cost)
|
|
46
|
+
<tr>
|
|
47
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Estimated Cost</td>
|
|
48
|
+
<td style="padding: 8px 0;">{{ number_format($workOrder->estimated_cost / 100, 2) }} {{ strtoupper($workOrder->currency ?? 'USD') }}</td>
|
|
49
|
+
</tr>
|
|
50
|
+
@endif
|
|
51
|
+
@if($workOrder->approved_budget)
|
|
52
|
+
<tr>
|
|
53
|
+
<td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Approved Budget</td>
|
|
54
|
+
<td style="padding: 8px 0;">{{ number_format($workOrder->approved_budget / 100, 2) }} {{ strtoupper($workOrder->currency ?? 'USD') }}</td>
|
|
55
|
+
</tr>
|
|
56
|
+
@endif
|
|
57
|
+
</table>
|
|
58
|
+
|
|
59
|
+
@if($workOrder->instructions)
|
|
60
|
+
<p style="font-weight: 600; margin-bottom: 4px;">Instructions:</p>
|
|
61
|
+
<p style="white-space: pre-line;">{{ $workOrder->instructions }}</p>
|
|
62
|
+
@endif
|
|
63
|
+
|
|
64
|
+
<p style="margin-top: 24px; color: #6b7280; font-size: 13px;">
|
|
65
|
+
Please do not reply directly to this email. Contact the fleet manager if you have any questions.
|
|
66
|
+
</p>
|
|
67
|
+
</x-mail-layout>
|