Add StopTurnsOffRelayTest to verify machine relay behavior during STOP with self-serve enabled

- Introduce a minimal, self-contained test to ensure the relay turns off when STOP is executed.
- Enhance `selfserve_lane_command_t` to handle relay shutdown based on department configuration.
- Include `isDepartmentSelfServeEnabled` method for testing override and I/O avoidance.
This commit is contained in:
Jeppe Bundgaard
2026-02-18 16:14:33 +01:00
parent 9881e57698
commit 28a4a9d8e6
2 changed files with 116 additions and 0 deletions
@@ -7,6 +7,7 @@ require_once WD . '/modules/selfserve/helpers/selfserve_lane_command.php';
require_once WD . '/modules/selfserve/helpers/selfserve_lane_mode.php';
require_once WD . '/modules/selfserve/helpers/selfserve_lane_port.php';
require_once WD . '/modules/selfserve/helpers/selfserve_lane_state.php';
require_once WD . '/modules/selfserve/helpers/selfserve_lane_relay.php';
require_once WD . '/modules/selfserve/classes/selfserve_lane_command_arguments.php';
use Exception;
@@ -18,10 +19,32 @@ use modules\selfserve\helpers\selfserve_lane_mode;
use modules\selfserve\helpers\selfserve_lane_port;
use modules\selfserve\helpers\selfserve_lane_state;
use modules\selfserve\helpers\selfserve_lane_status;
use modules\selfserve\helpers\selfserve_lane_relay;
use objects\users_o;
use objects\department_variables_o;
trait selfserve_lane_command_t
{
/**
* Determine if the lane's department has self-serve enabled.
* This method is intentionally protected to allow tests to override
* and avoid I/O when needed.
*/
protected function isDepartmentSelfServeEnabled(): bool
{
try {
if (empty($this->department_lane) || empty($this->department_lane->department)) {
return false;
}
$departmentId = (int)$this->department_lane->department->value();
if ($departmentId <= 0) return false;
$vars = (new department_variables_o())->selectDepartment($departmentId);
return $vars->getVariable('selfserve_enabled') === true;
} catch (\Throwable $e) {
// If anything goes wrong, default to not enabled
return false;
}
}
/**
* Execute a command on a self-serve lane
* @param selfserve_lane_command $command The command to execute
@@ -97,6 +120,17 @@ trait selfserve_lane_command_t
$this->invoice();
// Open the exit port
$this->open(selfserve_lane_port::EXIT);
// If department has enabled self-serve, turn off the machine relay when stopping
try {
if ($this->isDepartmentSelfServeEnabled()) {
// Only attempt if a machine relay is configured for this lane
if (!empty($this->department_lane) && !empty($this->department_lane->relay_machine_id) && !empty($this->department_lane->relay_machine_id->value())) {
$this->turnOffRelay(selfserve_lane_relay::MACHINE);
}
}
} catch (\Throwable $e) {
// Swallow relay control errors to not block STOP flow
}
// Log the lane stop event
$this->logLaneAction(selfserve_lane_log_action::STOP_WASH);
// Reset the lane