From a3db039d415f36b57e7434e9375558b4a6cfea4b Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Tue, 30 Jan 2024 10:58:02 -0500 Subject: [PATCH] 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 Signed-off-by: Martin Renvoize Signed-off-by: Katrin Fischer (cherry picked from commit c735c027fabbd91fad2a3208fb0a80c8e2f1eaf3) Signed-off-by: Lucas Gass --- opac/svc/club/enroll | 51 ++++++++++++++++++++-------------- svc/club/enroll | 65 ++++++++++++++++++++++++++------------------ 2 files changed, 69 insertions(+), 47 deletions(-) diff --git a/opac/svc/club/enroll b/opac/svc/club/enroll index 97449e6a85..33394f6ebe 100755 --- a/opac/svc/club/enroll +++ b/opac/svc/club/enroll @@ -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(); + } } } } diff --git a/svc/club/enroll b/svc/club/enroll index cb71eb3ffb..4a49a8f8a9 100755 --- a/svc/club/enroll +++ b/svc/club/enroll @@ -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; } @@ -49,42 +49,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(); + } } } } @@ -92,9 +104,8 @@ elsif ($club) { binmode STDOUT, ':encoding(UTF-8)'; print $cgi->header( -type => 'application/json', -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 } ); }