Bug 41229: Fix desk and register session persistence on library change

When changing library in circ/set-library.pl, desk and register values
were not being properly cleared from the session. This caused stale
desk/register data from the previous library to persist, resulting in:
- Incorrect cashup displays showing wrong library's register
- POS defaulting to registers from different libraries
- Session state inconsistent with visual UI

Three issues fixed:
1. Template: Changed register "None" option ID from "set-library-noregister"
   to "noregister" to match JavaScript expectations (consistent with desk handling)
2. Desk logic: Changed condition to use defined() and explicitly clear session
   when "No desk" is selected
3. Register logic: Added session clearing when "No register" is selected and
   fixed condition to handle empty initial state

Test plan:
1. Select Library A with Register 5
2. Change to Library B without selecting a register
3. Verify register is cleared from session (check POS page)
4. Repeat for desk selection
5. Verify explicit "-- None --" selection clears session values

Signed-off-by: Jason Robb <jrobb@sekls.org>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
This commit is contained in:
Martin Renvoize 2025-11-07 14:10:09 +00:00 committed by Lucas Gass
parent 46bfbfee2d
commit 92d6fcf2bd
No known key found for this signature in database
GPG Key ID: 60B447398B0D36CA
2 changed files with 24 additions and 13 deletions

View File

@ -71,26 +71,37 @@ if (
$branch = $userenv_branch; # fallback value
}
if ( $desk_id && ( !$userenv_desk or $userenv_desk ne $desk_id ) ) {
my $desk = Koha::Desks->find( { desk_id => $desk_id } );
my $old_desk_name = '';
if ($userenv_desk) {
$old_desk_name = Koha::Desks->find( { desk_id => $userenv_desk } )->desk_name;
if ( defined($desk_id) && ( !$userenv_desk || $userenv_desk ne $desk_id ) ) {
if ($desk_id) {
# A desk was selected
my $desk = Koha::Desks->find( { desk_id => $desk_id } );
$session->param( desk_name => $desk->desk_name );
$session->param( desk_id => $desk->desk_id );
} else {
# "No desk" was explicitly selected - clear desk from session
$session->clear( [ 'desk_name', 'desk_id' ] );
}
$session->param( desk_name => $desk->desk_name );
$session->param( desk_id => $desk->desk_id );
$updated = 1;
} else {
$desk_id = $userenv_desk;
}
if ( defined($register_id)
&& ( $userenv_register_id ne $register_id ) )
&& ( !$userenv_register_id || $userenv_register_id ne $register_id ) )
{
my $old_register_name = C4::Context->userenv->{'register_name'} || '';
my $register = Koha::Cash::Registers->find($register_id);
$session->param( 'register_id', $register_id );
$session->param( 'register_name', $register ? $register->name : '' );
if ($register_id) {
# A register was selected
my $register = Koha::Cash::Registers->find($register_id);
$session->param( 'register_id', $register_id );
$session->param( 'register_name', $register ? $register->name : '' );
} else {
# "No register" was explicitly selected - clear register from session
$session->clear( [ 'register_id', 'register_name' ] );
}
$updated = 1;
} else {
$register_id = $userenv_register_id;

View File

@ -87,7 +87,7 @@
<li>
<label for="set-library-register_id">Choose cash register:</label>
<select name="register_id" id="set-library-register_id">
<option id="set-library-noregister" selected="selected" value="">-- None --</option>
<option id="noregister" selected="selected" value="">-- None --</option>
[% PROCESS options_for_registers registers => Registers.all() %]
</select>
</li>