From f09b359cb7d04001e2c13c194fe4324d5faf1837 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 [23.05.x] MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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: Lucas Gass (cherry picked from commit 9bdab108e22768b018b017ed7c0e0016270f2570) Signed-off-by: Frédéric Demians --- opac/svc/club/enroll | 51 +++++++++++++++++++++++++++----------------- svc/club/enroll | 18 ++++++++++------ 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/opac/svc/club/enroll b/opac/svc/club/enroll index aff1d51fb9..249a2bdd09 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 => $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 9c88c54717..87c6cddfdc 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; } @@ -43,15 +43,21 @@ my $club = Koha::Clubs->find($id); my $enrollment; if ($club) { + my $already_enrolled = Koha::Club::Enrollments->search( + { + club_id => $id, + borrowernumber => $borrowernumber, + date_canceled => undef, + } + )->count(); + $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, + date_canceled => undef, } - )->store(); + )->store() unless $already_enrolled; if ($enrollment) { my @enrollment_fields = $club->club_template()->club_template_enrollment_fields->as_list; -- 2.39.5