Bug 35942: OPAC user can enroll several times to the same club

Test Plan:

1) Create 3 clubs, 1 limited to library A, 1 limited to library B and one not limited
2) Use a patron with home library A.
3) Go to the opac-user page, "Clubs" tab show 0/2 (the one from library B is not listed)
4) Browse to /cgi-bin/koha/svc/club/enroll?id=1
5) Reload that page a couple times
6) Note the patron is now enrolled in the same club multiple times
7) Delete those enrollments
8) Apply this patch
9) Restart all the things!
10) Repeat steps 2-7, note the lack of duplicate enrollments!
11) Repeat steps 2-10 for the staff interface

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
(cherry picked from commit affb8929fe7451a7dfec9498c55a97bac56129b3)
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
This commit is contained in:
Kyle M Hall 2024-01-30 10:58:02 -05:00 committed by Fridolin Somers
parent 7ca0614808
commit 5e3ea9440e
2 changed files with 70 additions and 48 deletions

View File

@ -30,8 +30,8 @@ use Koha::Clubs;
my $cgi = CGI->new;
my ( $auth_status ) =
check_cookie_auth( $cgi->cookie('CGISESSID') );
my ($auth_status) =
check_cookie_auth( $cgi->cookie('CGISESSID') );
if ( $auth_status ne "ok" ) {
exit 0;
}
@ -42,31 +42,42 @@ my $id = $cgi->param('id');
my $enrollment;
if ( $borrowernumber && $id ) {
my $already_enrolled = Koha::Club::Enrollments->search(
{
club_id => $id,
borrowernumber => $borrowernumber,
date_canceled => undef,
}
)->count();
my $club = Koha::Clubs->find($id);
if ( $club->club_template()->is_enrollable_from_opac() ) {
$enrollment = Koha::Club::Enrollment->new()->set(
{
club_id => $club->id(),
borrowernumber => $borrowernumber,
date_enrolled => \'NOW()',
date_created => \'NOW()',
branchcode => C4::Context->userenv
? C4::Context->userenv->{'branch'}
: undef,
}
)->store();
my $wrong_branch = $club->branchcode && C4::Context->userenv && C4::Context->userenv->{branch} ne $club->branchcode;
my @enrollment_fields = $club->club_template()->club_template_enrollment_fields->as_list;
unless ( $already_enrolled || $wrong_branch ) {
foreach my $e (@enrollment_fields) {
Koha::Club::Enrollment::Field->new()->set(
if ( $club->club_template()->is_enrollable_from_opac() ) {
$enrollment = Koha::Club::Enrollment->new(
{
club_enrollment_id => $enrollment->id(),
club_template_enrollment_field_id => $e->id(),
value => scalar $cgi->param( $e->id() ),
club_id => $club->id(),
borrowernumber => $borrowernumber,
date_enrolled => \'NOW()',
date_created => \'NOW()',
branchcode => C4::Context->userenv ? C4::Context->userenv->{branch} : undef,
}
)->store();
my @enrollment_fields = $club->club_template()->club_template_enrollment_fields->as_list;
foreach my $e (@enrollment_fields) {
Koha::Club::Enrollment::Field->new()->set(
{
club_enrollment_id => $enrollment->id(),
club_template_enrollment_field_id => $e->id(),
value => scalar $cgi->param( $e->id() ),
}
)->store();
}
}
}
}

View File

@ -30,8 +30,8 @@ use Koha::Clubs;
my $cgi = CGI->new;
my ( $auth_status ) =
check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'enroll' } );
my ($auth_status) =
check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'enroll' } );
if ( $auth_status ne "ok" ) {
exit 0;
}
@ -46,42 +46,54 @@ my $enrollment;
my @club_enrollment_fields;
if($enrollent_id){
if ($enrollent_id) {
my @enrollment_fields = $club->club_template()->club_template_enrollment_fields()->as_list;
@club_enrollment_fields = Koha::Club::Enrollment::Fields->search({'club_enrollment_id'=> $enrollent_id})->as_list;
@club_enrollment_fields =
Koha::Club::Enrollment::Fields->search( { 'club_enrollment_id' => $enrollent_id } )->as_list;
foreach my $club_enrollment_field (@club_enrollment_fields){
foreach my $e (@enrollment_fields){
if($e->id()==$club_enrollment_field->club_template_enrollment_field_id){
foreach my $club_enrollment_field (@club_enrollment_fields) {
foreach my $e (@enrollment_fields) {
if ( $e->id() == $club_enrollment_field->club_template_enrollment_field_id ) {
my $value = $cgi->param( $e->id() );
$club_enrollment_field->value($value);
$club_enrollment_field->update();
}
}
}
}
elsif ($club) {
$enrollment = Koha::Club::Enrollment->new(
} elsif ($club) {
my $already_enrolled = Koha::Club::Entrollments->search(
{
club_id => $club->id(),
borrowernumber => $borrowernumber,
date_enrolled => \'NOW()',
date_created => \'NOW()',
branchcode => C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef,
date_canceled => undef,
}
)->store();
)->count();
if ($enrollment) {
my @enrollment_fields = $club->club_template()->club_template_enrollment_fields->as_list;
my $wrong_branch = $club->branchcode && C4::Context->userenv && C4::Context->userenv->{branch} ne $club->branchcode;
foreach my $e (@enrollment_fields) {
my $club_enrollment_field = Koha::Club::Enrollment::Field->new(
{
club_enrollment_id => $enrollment->id(),
club_template_enrollment_field_id => $e->id(),
value => scalar $cgi->param( $e->id() ),
}
)->store();
unless ( $already_enrolled || $wrong_branch ) {
$enrollment = Koha::Club::Enrollment->new(
{
club_id => $club->id(),
borrowernumber => $borrowernumber,
date_enrolled => \'NOW()',
date_created => \'NOW()',
branchcode => C4::Context->userenv ? C4::Context->userenv->{branch} : undef,
}
)->store();
if ($enrollment) {
my @enrollment_fields = $club->club_template()->club_template_enrollment_fields->as_list;
foreach my $e (@enrollment_fields) {
my $club_enrollment_field = Koha::Club::Enrollment::Field->new(
{
club_enrollment_id => $enrollment->id(),
club_template_enrollment_field_id => $e->id(),
value => scalar $cgi->param( $e->id() ),
}
)->store();
}
}
}
}
@ -89,9 +101,8 @@ elsif ($club) {
binmode STDOUT, ':encoding(UTF-8)';
print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' );
if($enrollent_id){
if ($enrollent_id) {
print to_json( { success => @club_enrollment_fields ? 1 : 0 } );
}
else{
} else {
print to_json( { success => $enrollment ? 1 : 0 } );
}
}