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 $branch = $userenv_branch; # fallback value
} }
if ( $desk_id && ( !$userenv_desk or $userenv_desk ne $desk_id ) ) { if ( defined($desk_id) && ( !$userenv_desk || $userenv_desk ne $desk_id ) ) {
my $desk = Koha::Desks->find( { desk_id => $desk_id } ); if ($desk_id) {
my $old_desk_name = '';
if ($userenv_desk) { # A desk was selected
$old_desk_name = Koha::Desks->find( { desk_id => $userenv_desk } )->desk_name; 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; $updated = 1;
} else { } else {
$desk_id = $userenv_desk; $desk_id = $userenv_desk;
} }
if ( defined($register_id) 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'} || ''; if ($register_id) {
my $register = Koha::Cash::Registers->find($register_id);
$session->param( 'register_id', $register_id ); # A register was selected
$session->param( 'register_name', $register ? $register->name : '' ); 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; $updated = 1;
} else { } else {
$register_id = $userenv_register_id; $register_id = $userenv_register_id;

View File

@ -87,7 +87,7 @@
<li> <li>
<label for="set-library-register_id">Choose cash register:</label> <label for="set-library-register_id">Choose cash register:</label>
<select name="register_id" id="set-library-register_id"> <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() %] [% PROCESS options_for_registers registers => Registers.all() %]
</select> </select>
</li> </li>