@@ -, +, @@ * Here you can add fields that can be filled out at the time a new club is created based on the template, or a new enrollment is created for a given club based on the template. --- C4/Auth.pm | 5 +- C4/Members.pm | 17 +- Koha/Club.pm | 92 ++++++++ Koha/Club/Enrollment.pm | 78 +++++++ Koha/Club/Enrollment/Field.pm | 56 +++++ Koha/Club/Enrollment/Fields.pm | 60 +++++ Koha/Club/Enrollments.pm | 60 +++++ Koha/Club/Field.pm | 66 ++++++ Koha/Club/Fields.pm | 60 +++++ Koha/Club/Template.pm | 75 ++++++ Koha/Club/Template/EnrollmentField.pm | 54 +++++ Koha/Club/Template/EnrollmentFields.pm | 60 +++++ Koha/Club/Template/Field.pm | 54 +++++ Koha/Club/Template/Fields.pm | 60 +++++ Koha/Club/Templates.pm | 60 +++++ Koha/Clubs.pm | 92 ++++++++ Koha/Config/SysPref.pm | 3 + Koha/Patron.pm | 61 +++++ Koha/Schema/Result/AuthorisedValue.pm | 4 +- Koha/Schema/Result/Borrower.pm | 15 ++ Koha/Schema/Result/Branch.pm | 49 +++- Koha/Schema/Result/Club.pm | 197 ++++++++++++++++ Koha/Schema/Result/ClubEnrollment.pm | 201 ++++++++++++++++ Koha/Schema/Result/ClubEnrollmentField.pm | 112 +++++++++ Koha/Schema/Result/ClubField.pm | 112 +++++++++ Koha/Schema/Result/ClubTemplate.pm | 195 ++++++++++++++++ Koha/Schema/Result/ClubTemplateEnrollmentField.pm | 119 ++++++++++ Koha/Schema/Result/ClubTemplateField.pm | 119 ++++++++++ Koha/Template/Plugin/AuthorisedValues.pm | 7 + Koha/Template/Plugin/Borrowers.pm | 1 - Koha/Template/Plugin/Branches.pm | 7 + Koha/Template/Plugin/Koha.pm | 5 + circ/circulation.pl | 16 +- clubs/clubs-add-modify.pl | 104 +++++++++ clubs/clubs.pl | 50 ++++ clubs/patron-clubs-tab.pl | 55 +++++ clubs/patron-enroll.pl | 50 ++++ clubs/templates-add-modify.pl | 150 ++++++++++++ installer/data/mysql/atomicupdate/bug_12461.sql | 131 +++++++++++ installer/data/mysql/kohastructure.sql | 124 ++++++++++ installer/data/mysql/userflags.sql | 3 +- installer/data/mysql/userpermissions.sql | 5 +- .../prog/en/modules/circ/circulation.tt | 23 ++ .../prog/en/modules/clubs/clubs-add-modify.tt | 142 ++++++++++++ .../intranet-tmpl/prog/en/modules/clubs/clubs.tt | 206 +++++++++++++++++ .../prog/en/modules/clubs/patron-clubs-tab.tt | 102 ++++++++ .../prog/en/modules/clubs/patron-enroll.tt | 66 ++++++ .../prog/en/modules/clubs/templates-add-modify.tt | 257 +++++++++++++++++++++ .../prog/en/modules/members/moremember.tt | 22 ++ .../prog/en/modules/tools/tools-home.tt | 5 + .../bootstrap/en/modules/clubs/clubs-tab.tt | 102 ++++++++ .../opac-tmpl/bootstrap/en/modules/clubs/enroll.tt | 66 ++++++ .../opac-tmpl/bootstrap/en/modules/opac-user.tt | 22 ++ members/moremember.pl | 2 + opac/clubs/clubs-tab.pl | 52 +++++ opac/clubs/enroll.pl | 49 ++++ opac/opac-user.pl | 3 + opac/svc/club/cancel_enrollment | 47 ++++ opac/svc/club/enroll | 77 ++++++ svc/club/cancel_enrollment | 46 ++++ svc/club/delete | 48 ++++ svc/club/enroll | 74 ++++++ svc/club/template/delete | 49 ++++ 63 files changed, 4277 insertions(+), 27 deletions(-) create mode 100644 Koha/Club.pm create mode 100644 Koha/Club/Enrollment.pm create mode 100644 Koha/Club/Enrollment/Field.pm create mode 100644 Koha/Club/Enrollment/Fields.pm create mode 100644 Koha/Club/Enrollments.pm create mode 100644 Koha/Club/Field.pm create mode 100644 Koha/Club/Fields.pm create mode 100644 Koha/Club/Template.pm create mode 100644 Koha/Club/Template/EnrollmentField.pm create mode 100644 Koha/Club/Template/EnrollmentFields.pm create mode 100644 Koha/Club/Template/Field.pm create mode 100644 Koha/Club/Template/Fields.pm create mode 100644 Koha/Club/Templates.pm create mode 100644 Koha/Clubs.pm create mode 100644 Koha/Schema/Result/Club.pm create mode 100644 Koha/Schema/Result/ClubEnrollment.pm create mode 100644 Koha/Schema/Result/ClubEnrollmentField.pm create mode 100644 Koha/Schema/Result/ClubField.pm create mode 100644 Koha/Schema/Result/ClubTemplate.pm create mode 100644 Koha/Schema/Result/ClubTemplateEnrollmentField.pm create mode 100644 Koha/Schema/Result/ClubTemplateField.pm create mode 100755 clubs/clubs-add-modify.pl create mode 100755 clubs/clubs.pl create mode 100755 clubs/patron-clubs-tab.pl create mode 100755 clubs/patron-enroll.pl create mode 100755 clubs/templates-add-modify.pl create mode 100644 installer/data/mysql/atomicupdate/bug_12461.sql create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs-add-modify.tt create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs.tt create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-clubs-tab.tt create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-enroll.tt create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/clubs/templates-add-modify.tt create mode 100644 koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/clubs-tab.tt create mode 100644 koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/enroll.tt create mode 100755 opac/clubs/clubs-tab.pl create mode 100755 opac/clubs/enroll.pl create mode 100755 opac/svc/club/cancel_enrollment create mode 100755 opac/svc/club/enroll create mode 100755 svc/club/cancel_enrollment create mode 100755 svc/club/delete create mode 100755 svc/club/enroll create mode 100755 svc/club/template/delete --- a/C4/Auth.pm +++ a/C4/Auth.pm @@ -255,7 +255,7 @@ sub get_template_and_user { my $all_perms = get_all_subpermissions(); my @flagroots = qw(circulate catalogue parameters borrowers permissions reserveforothers borrow - editcatalogue updatecharges management tools editauthorities serials reports acquisition); + editcatalogue updatecharges management tools editauthorities serials reports acquisition clubs); # We are going to use the $flags returned by checkauth # to create the template's parameters that will indicate @@ -278,8 +278,9 @@ sub get_template_and_user { $template->param( CAN_user_staffaccess => 1 ); $template->param( CAN_user_plugins => 1 ); $template->param( CAN_user_coursereserves => 1 ); - foreach my $module ( keys %$all_perms ) { + $template->param( CAN_user_clubs => 1 ); + foreach my $module ( keys %$all_perms ) { foreach my $subperm ( keys %{ $all_perms->{$module} } ) { $template->param( "CAN_user_${module}_${subperm}" => 1 ); } --- a/C4/Members.pm +++ a/C4/Members.pm @@ -40,6 +40,7 @@ use Koha::Patron::Debarments qw(IsDebarred); use Text::Unaccent qw( unac_string ); use Koha::AuthUtils qw(hash_password); use Koha::Database; +use Koha::Patrons; our ($VERSION,@ISA,@EXPORT,@EXPORT_OK,$debug); @@ -1256,20 +1257,10 @@ addresses. sub GetFirstValidEmailAddress { my $borrowernumber = shift; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare( "SELECT email, emailpro, B_email FROM borrowers where borrowernumber = ? "); - $sth->execute( $borrowernumber ); - my $data = $sth->fetchrow_hashref; - if ($data->{'email'}) { - return $data->{'email'}; - } elsif ($data->{'emailpro'}) { - return $data->{'emailpro'}; - } elsif ($data->{'B_email'}) { - return $data->{'B_email'}; - } else { - return ''; - } + my $borrower = Koha::Patrons->find( $borrowernumber ); + + return $borrower->FirstValidEmailAddress(); } =head2 GetNoticeEmailAddress --- a/Koha/Club.pm +++ a/Koha/Club.pm @@ -0,0 +1,92 @@ +package Koha::Club; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use Koha::Club::Templates; +use Koha::Club::Fields; +use Koha::Libraries; + +use base qw(Koha::Object); + +=head1 NAME + +Koha::Club - Koha Club Object class + +=head1 API + +=head2 Class Methods + +=cut + +=head3 club_template + +=cut + +sub club_template { + my ($self) = @_; + + return unless $self->club_template_id(); + + return Koha::Club::Templates->find( $self->club_template_id() ); +} + +=head3 club_fields + +=cut + +sub club_fields { + my ($self) = @_; + + return unless $self->id(); + + return Koha::Club::Fields->search( { club_id => $self->id() } ); +} + +=head3 club_fields + +=cut + +sub branch { + my ($self) = @_; + + return unless $self->branchcode(); + + return Koha::Libraries->find( $self->branchcode() ); +} + +=head3 type + +=cut + +sub _type { + return 'Club'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Enrollment.pm +++ a/Koha/Club/Enrollment.pm @@ -0,0 +1,78 @@ +package Koha::Club::Enrollment; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; +use Koha::Clubs; + +use base qw(Koha::Object); + +=head1 NAME + +Koha::Club::Enrollment + +Represents a "pattern" on which many clubs can be created. +In this way we can directly compare different clubs of the same 'template' +for statistical purposes. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 cancel + +=cut + +sub cancel { + my ( $self ) = @_; + + $self->_result()->update( { date_canceled => \'NOW()' } ); + + return $self; +} + +=head3 club + +=cut + +sub club { + my ( $self ) = @_; + return Koha::Clubs->find( $self->club_id() ); +} + +=head3 type + +=cut + +sub _type { + return 'ClubEnrollment'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Enrollment/Field.pm +++ a/Koha/Club/Enrollment/Field.pm @@ -0,0 +1,56 @@ +package Koha::Club::Enrollment::Field; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use base qw(Koha::Object); + +=head1 NAME + +Koha::Club::Enrollment::Field + +Represents a "pattern" on which many clubs can be created. +In this way we can directly compare different clubs of the same 'template' +for statistical purposes. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ClubEnrollmentField'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Enrollment/Fields.pm +++ a/Koha/Club/Enrollment/Fields.pm @@ -0,0 +1,60 @@ +package Koha::Club::Enrollment::Fields; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use Koha::Club::Enrollment::Field; + +use base qw(Koha::Objects); + +=head1 NAME + +Koha::Club::Enrollment::Fields + +This object represents a collection of club enrollemnt fields. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ClubEnrollmentField'; +} + +sub object_class { + return 'Koha::Club::Enrollment::Field'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Enrollments.pm +++ a/Koha/Club/Enrollments.pm @@ -0,0 +1,60 @@ +package Koha::Club::Enrollments; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use Koha::Club::Enrollment; + +use base qw(Koha::Objects); + +=head1 NAME + +Koha::Club::Enrollments + +This object represents a collection of club templates. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ClubEnrollment'; +} + +sub object_class { + return 'Koha::Club::Enrollment'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Field.pm +++ a/Koha/Club/Field.pm @@ -0,0 +1,66 @@ +package Koha::Club::Field; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use Koha::Club::Template::Fields; + +use base qw(Koha::Object); + +=head1 NAME + +Koha::Club::Field + +Represents the value set at creation time for a Koha::Club::Template::Field + +=head1 API + +=head2 Class Methods + +=cut + +=head3 club_template_field + +=cut + +sub club_template_field { + my ( $self ) = @_; + + return Koha::Club::Template::Fields->find( $self->club_template_field_id ); +} + +=head3 type + +=cut + +sub _type { + return 'ClubField'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Fields.pm +++ a/Koha/Club/Fields.pm @@ -0,0 +1,60 @@ +package Koha::Club::Fields; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use Koha::Club::Field; + +use base qw(Koha::Objects); + +=head1 NAME + +Koha::Club::Fields + +Represents a collection of club fields. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ClubField'; +} + +sub object_class { + return 'Koha::Club::Field'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Template.pm +++ a/Koha/Club/Template.pm @@ -0,0 +1,75 @@ +package Koha::Club::Template; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use Koha::Club::Template::Fields; +use Koha::Club::Template::EnrollmentFields; + +use base qw(Koha::Object); + +=head1 NAME + +Koha::Club::Template + +Represents a "pattern" on which many clubs can be created. +In this way we can directly compare different clubs of the same 'template' +for statistical purposes. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 club_template_fields + +=cut + +sub club_template_fields { + my ($self) = @_; + + return Koha::Club::Template::Fields->search( { club_template_id => $self->id() } ); +} + +sub club_template_enrollment_fields { + my ($self) = @_; + + return Koha::Club::Template::EnrollmentFields->search( { club_template_id => $self->id() } ); +} + +=head3 type + +=cut + +sub _type { + return 'ClubTemplate'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Template/EnrollmentField.pm +++ a/Koha/Club/Template/EnrollmentField.pm @@ -0,0 +1,54 @@ +package Koha::Club::Template::EnrollmentField; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use base qw(Koha::Object); + +=head1 NAME + +Koha::Club::Template::EnrollemntField + +Represents a club field that is only set at the time a patron is enrolled + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ClubTemplateEnrollmentField'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Template/EnrollmentFields.pm +++ a/Koha/Club/Template/EnrollmentFields.pm @@ -0,0 +1,60 @@ +package Koha::Club::Template::EnrollmentFields; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use Koha::Club::Template::EnrollmentField; + +use base qw(Koha::Objects); + +=head1 NAME + +Koha::Club::Template::EnrollemntFields + +Represents a colleciton of club fields that are only set at the time a patron is enrolled + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ClubTemplateEnrollmentField'; +} + +sub object_class { + return 'Koha::Club::Template::EnrollmentField'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Template/Field.pm +++ a/Koha/Club/Template/Field.pm @@ -0,0 +1,54 @@ +package Koha::Club::Template::Field; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use base qw(Koha::Object); + +=head1 NAME + +Koha::Club::Template::Field + +Represents a club field that is set when the club is created + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ClubTemplateField'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Template/Fields.pm +++ a/Koha/Club/Template/Fields.pm @@ -0,0 +1,60 @@ +package Koha::Club::Template::Fields; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use Koha::Club::Template::Field; + +use base qw(Koha::Objects); + +=head1 NAME + +Koha::Club::Template::Fields + +Represents a collection of club fields that are set when the club is created + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ClubTemplateField'; +} + +sub object_class { + return 'Koha::Club::Template::Field'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Club/Templates.pm +++ a/Koha/Club/Templates.pm @@ -0,0 +1,60 @@ +package Koha::Club::Templates; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use Koha::Club::Template; + +use base qw(Koha::Objects); + +=head1 NAME + +Koha::Club::Templates + +This object represents a collection of club templates. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ClubTemplate'; +} + +sub object_class { + return 'Koha::Club::Template'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Clubs.pm +++ a/Koha/Clubs.pm @@ -0,0 +1,92 @@ +package Koha::Clubs; + +# Copyright ByWater Solutions 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use Koha::Club; + +use base qw(Koha::Objects); + +=head1 NAME + +Koha::Clubs - Koha Clubs Object class + +This object represents a collection of clubs a patron may enroll in. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 GetEnrollable + +=cut + +sub GetEnrollable { + my ( $self, $params ) = @_; + + # We need to filter out all the already enrolled in clubs + my $borrower = $params->{borrower}; + if ($borrower) { + delete( $params->{borrower} ); + my @enrollments = $borrower->GetClubEnrollments(); + if (@enrollments) { + $params->{'me.id'} = { -not_in => [ map { $_->club()->id() } @enrollments ] }; + } + } + + my $rs = $self->_resultset()->search( $params, { prefetch => 'club_template' } ); + + if (wantarray) { + my $class = ref($self) ? ref($self) : $self; + + return $class->_wrap( $rs->all() ); + + } + else { + my $class = ref($self) ? ref($self) : $self; + + return $class->_new_from_dbic($rs); + } +} + +=head3 type + +=cut + +sub _type { + return 'Club'; +} + +sub object_class { + return 'Koha::Club'; +} + +=head1 AUTHOR + +Kyle M Hall + +=cut + +1; --- a/Koha/Config/SysPref.pm +++ a/Koha/Config/SysPref.pm @@ -23,6 +23,9 @@ use Carp; use Koha::Database; +use Koha::Clubs; +use Koha::Club::Enrollments; + use base qw(Koha::Object); =head1 NAME --- a/Koha/Patron.pm +++ a/Koha/Patron.pm @@ -94,6 +94,67 @@ sub siblings { ); } +=head3 FirstValidEmailAddress + +=cut + +sub FirstValidEmailAddress { + my ($self) = @_; + + return $self->email() || $self->emailpro() || $self->b_email() || q{}; +} + +=head3 GetClubEnrollments + +=cut + +sub GetClubEnrollments { + my ($self) = @_; + + return Koha::Club::Enrollments->search( { borrowernumber => $self->borrowernumber(), date_canceled => undef } ); +} + +=head3 GetClubEnrollmentsCount + +=cut + +sub GetClubEnrollmentsCount { + my ($self) = @_; + + my $e = $self->GetClubEnrollments(); + + return $e->count(); +} + +=head3 GetEnrollableClubs + +=cut + +sub GetEnrollableClubs { + my ( $self, $is_enrollable_from_opac ) = @_; + + my $params; + $params->{is_enrollable_from_opac} = $is_enrollable_from_opac + if $is_enrollable_from_opac; + $params->{is_email_required} = 0 unless $self->FirstValidEmailAddress(); + + $params->{borrower} = $self; + + return Koha::Clubs->GetEnrollable($params); +} + +=head3 GetEnrollableClubsCount + +=cut + +sub GetEnrollableClubsCount { + my ( $self, $is_enrollable_from_opac ) = @_; + + my $e = $self->GetEnrollableClubs($is_enrollable_from_opac); + + return $e->count(); +} + =head3 type =cut --- a/Koha/Schema/Result/AuthorisedValue.pm +++ a/Koha/Schema/Result/AuthorisedValue.pm @@ -123,8 +123,8 @@ __PACKAGE__->has_many( ); -# Created by DBIx::Class::Schema::Loader v0.07039 @ 2015-02-05 15:20:11 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:GS7UBpk66HAhBptwrpKR7Q +# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-01-12 09:54:50 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:IzI/WpMbwvfZ8BpHtRCsiQ # You can replace this text with custom content, and it will be preserved on regeneration --- a/Koha/Schema/Result/Borrower.pm +++ a/Koha/Schema/Result/Borrower.pm @@ -798,6 +798,21 @@ __PACKAGE__->belongs_to( { is_deferrable => 1, on_delete => "RESTRICT", on_update => "RESTRICT" }, ); +=head2 club_enrollments + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_enrollments", + "Koha::Schema::Result::ClubEnrollment", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + =head2 course_instructors Type: has_many --- a/Koha/Schema/Result/Branch.pm +++ a/Koha/Schema/Result/Branch.pm @@ -337,6 +337,51 @@ __PACKAGE__->has_many( { cascade_copy => 0, cascade_delete => 0 }, ); +=head2 club_enrollments + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_enrollments", + "Koha::Schema::Result::ClubEnrollment", + { "foreign.branchcode" => "self.branchcode" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 club_templates + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_templates", + "Koha::Schema::Result::ClubTemplate", + { "foreign.branchcode" => "self.branchcode" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 clubs + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "clubs", + "Koha::Schema::Result::Club", + { "foreign.branchcode" => "self.branchcode" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + =head2 collections Type: has_many @@ -513,8 +558,8 @@ Composing rels: L -> categorycode __PACKAGE__->many_to_many("categorycodes", "branchrelations", "categorycode"); -# Created by DBIx::Class::Schema::Loader v0.07039 @ 2014-11-06 15:26:36 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CGNPB/MkGLOihDThj43/4A +# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-01-12 09:56:17 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:lvjA8x8u5RKeZQ0+uiLm7A # You can replace this text with custom content, and it will be preserved on regeneration --- a/Koha/Schema/Result/Club.pm +++ a/Koha/Schema/Result/Club.pm @@ -0,0 +1,197 @@ +use utf8; +package Koha::Schema::Result::Club; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +=head1 NAME + +Koha::Schema::Result::Club + +=cut + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +=head1 TABLE: C + +=cut + +__PACKAGE__->table("clubs"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_template_id + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 name + + data_type: 'tinytext' + is_nullable: 0 + +=head2 description + + data_type: 'text' + is_nullable: 1 + +=head2 date_start + + data_type: 'date' + datetime_undef_if_invalid: 1 + is_nullable: 1 + +=head2 date_end + + data_type: 'date' + datetime_undef_if_invalid: 1 + is_nullable: 1 + +=head2 branchcode + + data_type: 'varchar' + is_foreign_key: 1 + is_nullable: 1 + size: 11 + +=head2 date_created + + data_type: 'timestamp' + datetime_undef_if_invalid: 1 + default_value: current_timestamp + is_nullable: 0 + +=head2 date_updated + + data_type: 'timestamp' + datetime_undef_if_invalid: 1 + is_nullable: 1 + +=cut + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "club_template_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "name", + { data_type => "tinytext", is_nullable => 0 }, + "description", + { data_type => "text", is_nullable => 1 }, + "date_start", + { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 1 }, + "date_end", + { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 1 }, + "branchcode", + { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 11 }, + "date_created", + { + data_type => "timestamp", + datetime_undef_if_invalid => 1, + default_value => \"current_timestamp", + is_nullable => 0, + }, + "date_updated", + { + data_type => "timestamp", + datetime_undef_if_invalid => 1, + is_nullable => 1, + }, +); + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=head2 branchcode + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "branchcode", + "Koha::Schema::Result::Branch", + { branchcode => "branchcode" }, + { + is_deferrable => 1, + join_type => "LEFT", + on_delete => "RESTRICT", + on_update => "RESTRICT", + }, +); + +=head2 club_enrollments + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_enrollments", + "Koha::Schema::Result::ClubEnrollment", + { "foreign.club_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 club_fields + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_fields", + "Koha::Schema::Result::ClubField", + { "foreign.club_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 club_template + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club_template", + "Koha::Schema::Result::ClubTemplate", + { id => "club_template_id" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-01-12 09:56:17 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nMwJy/qR8aWu12hQq4rORQ + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; --- a/Koha/Schema/Result/ClubEnrollment.pm +++ a/Koha/Schema/Result/ClubEnrollment.pm @@ -0,0 +1,201 @@ +use utf8; +package Koha::Schema::Result::ClubEnrollment; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +=head1 NAME + +Koha::Schema::Result::ClubEnrollment + +=cut + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +=head1 TABLE: C + +=cut + +__PACKAGE__->table("club_enrollments"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_id + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 borrowernumber + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 date_enrolled + + data_type: 'timestamp' + datetime_undef_if_invalid: 1 + default_value: current_timestamp + is_nullable: 0 + +=head2 date_canceled + + data_type: 'timestamp' + datetime_undef_if_invalid: 1 + is_nullable: 1 + +=head2 date_created + + data_type: 'timestamp' + datetime_undef_if_invalid: 1 + default_value: '0000-00-00 00:00:00' + is_nullable: 0 + +=head2 date_updated + + data_type: 'timestamp' + datetime_undef_if_invalid: 1 + is_nullable: 1 + +=head2 branchcode + + data_type: 'varchar' + is_foreign_key: 1 + is_nullable: 1 + size: 11 + +=cut + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "club_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "borrowernumber", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "date_enrolled", + { + data_type => "timestamp", + datetime_undef_if_invalid => 1, + default_value => \"current_timestamp", + is_nullable => 0, + }, + "date_canceled", + { + data_type => "timestamp", + datetime_undef_if_invalid => 1, + is_nullable => 1, + }, + "date_created", + { + data_type => "timestamp", + datetime_undef_if_invalid => 1, + default_value => "0000-00-00 00:00:00", + is_nullable => 0, + }, + "date_updated", + { + data_type => "timestamp", + datetime_undef_if_invalid => 1, + is_nullable => 1, + }, + "branchcode", + { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 11 }, +); + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=head2 borrowernumber + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "borrowernumber", + "Koha::Schema::Result::Borrower", + { borrowernumber => "borrowernumber" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 branchcode + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "branchcode", + "Koha::Schema::Result::Branch", + { branchcode => "branchcode" }, + { + is_deferrable => 1, + join_type => "LEFT", + on_delete => "SET NULL", + on_update => "CASCADE", + }, +); + +=head2 club + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club", + "Koha::Schema::Result::Club", + { id => "club_id" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 club_enrollment_fields + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_enrollment_fields", + "Koha::Schema::Result::ClubEnrollmentField", + { "foreign.club_enrollment_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-01-12 09:56:17 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:9ypc+smG/VlgtWW66PhvHQ + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; --- a/Koha/Schema/Result/ClubEnrollmentField.pm +++ a/Koha/Schema/Result/ClubEnrollmentField.pm @@ -0,0 +1,112 @@ +use utf8; +package Koha::Schema::Result::ClubEnrollmentField; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +=head1 NAME + +Koha::Schema::Result::ClubEnrollmentField + +=cut + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +=head1 TABLE: C + +=cut + +__PACKAGE__->table("club_enrollment_fields"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_enrollment_id + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 club_template_enrollment_field_id + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 value + + data_type: 'text' + is_nullable: 0 + +=cut + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "club_enrollment_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "club_template_enrollment_field_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "value", + { data_type => "text", is_nullable => 0 }, +); + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=head2 club_enrollment + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club_enrollment", + "Koha::Schema::Result::ClubEnrollment", + { id => "club_enrollment_id" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 club_template_enrollment_field + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club_template_enrollment_field", + "Koha::Schema::Result::ClubTemplateEnrollmentField", + { id => "club_template_enrollment_field_id" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-01-12 09:56:17 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:2ANAs3mh3i/kd3Qxrcd5IA + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; --- a/Koha/Schema/Result/ClubField.pm +++ a/Koha/Schema/Result/ClubField.pm @@ -0,0 +1,112 @@ +use utf8; +package Koha::Schema::Result::ClubField; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +=head1 NAME + +Koha::Schema::Result::ClubField + +=cut + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +=head1 TABLE: C + +=cut + +__PACKAGE__->table("club_fields"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_template_field_id + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 club_id + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 value + + data_type: 'text' + is_nullable: 1 + +=cut + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "club_template_field_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "club_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "value", + { data_type => "text", is_nullable => 1 }, +); + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=head2 club + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club", + "Koha::Schema::Result::Club", + { id => "club_id" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 club_template_field + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club_template_field", + "Koha::Schema::Result::ClubTemplateField", + { id => "club_template_field_id" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-01-12 09:56:17 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:m4GLLIVIHgRpRhCGLh12DQ + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; --- a/Koha/Schema/Result/ClubTemplate.pm +++ a/Koha/Schema/Result/ClubTemplate.pm @@ -0,0 +1,195 @@ +use utf8; +package Koha::Schema::Result::ClubTemplate; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +=head1 NAME + +Koha::Schema::Result::ClubTemplate + +=cut + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +=head1 TABLE: C + +=cut + +__PACKAGE__->table("club_templates"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 name + + data_type: 'tinytext' + is_nullable: 0 + +=head2 description + + data_type: 'text' + is_nullable: 1 + +=head2 is_enrollable_from_opac + + data_type: 'tinyint' + default_value: 0 + is_nullable: 0 + +=head2 is_email_required + + data_type: 'tinyint' + default_value: 0 + is_nullable: 0 + +=head2 branchcode + + data_type: 'varchar' + is_foreign_key: 1 + is_nullable: 1 + size: 10 + +=head2 date_created + + data_type: 'timestamp' + datetime_undef_if_invalid: 1 + default_value: current_timestamp + is_nullable: 0 + +=head2 date_updated + + data_type: 'timestamp' + datetime_undef_if_invalid: 1 + is_nullable: 1 + +=head2 is_deletable + + data_type: 'tinyint' + default_value: 1 + is_nullable: 0 + +=cut + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "name", + { data_type => "tinytext", is_nullable => 0 }, + "description", + { data_type => "text", is_nullable => 1 }, + "is_enrollable_from_opac", + { data_type => "tinyint", default_value => 0, is_nullable => 0 }, + "is_email_required", + { data_type => "tinyint", default_value => 0, is_nullable => 0 }, + "branchcode", + { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 10 }, + "date_created", + { + data_type => "timestamp", + datetime_undef_if_invalid => 1, + default_value => \"current_timestamp", + is_nullable => 0, + }, + "date_updated", + { + data_type => "timestamp", + datetime_undef_if_invalid => 1, + is_nullable => 1, + }, + "is_deletable", + { data_type => "tinyint", default_value => 1, is_nullable => 0 }, +); + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=head2 branchcode + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "branchcode", + "Koha::Schema::Result::Branch", + { branchcode => "branchcode" }, + { + is_deferrable => 1, + join_type => "LEFT", + on_delete => "SET NULL", + on_update => "CASCADE", + }, +); + +=head2 club_template_enrollment_fields + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_template_enrollment_fields", + "Koha::Schema::Result::ClubTemplateEnrollmentField", + { "foreign.club_template_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 club_template_fields + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_template_fields", + "Koha::Schema::Result::ClubTemplateField", + { "foreign.club_template_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 clubs + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "clubs", + "Koha::Schema::Result::Club", + { "foreign.club_template_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-01-12 09:56:17 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:j5aiACVUGzrdng4+jt6mfg + +1; --- a/Koha/Schema/Result/ClubTemplateEnrollmentField.pm +++ a/Koha/Schema/Result/ClubTemplateEnrollmentField.pm @@ -0,0 +1,119 @@ +use utf8; +package Koha::Schema::Result::ClubTemplateEnrollmentField; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +=head1 NAME + +Koha::Schema::Result::ClubTemplateEnrollmentField + +=cut + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +=head1 TABLE: C + +=cut + +__PACKAGE__->table("club_template_enrollment_fields"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_template_id + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 name + + data_type: 'tinytext' + is_nullable: 0 + +=head2 description + + data_type: 'text' + is_nullable: 1 + +=head2 authorised_value_category + + data_type: 'varchar' + is_nullable: 1 + size: 16 + +=cut + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "club_template_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "name", + { data_type => "tinytext", is_nullable => 0 }, + "description", + { data_type => "text", is_nullable => 1 }, + "authorised_value_category", + { data_type => "varchar", is_nullable => 1, size => 16 }, +); + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=head2 club_enrollment_fields + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_enrollment_fields", + "Koha::Schema::Result::ClubEnrollmentField", + { "foreign.club_template_enrollment_field_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 club_template + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club_template", + "Koha::Schema::Result::ClubTemplate", + { id => "club_template_id" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-01-12 09:56:17 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:KGo2mEIAkTVYSPsOLoaBCg + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; --- a/Koha/Schema/Result/ClubTemplateField.pm +++ a/Koha/Schema/Result/ClubTemplateField.pm @@ -0,0 +1,119 @@ +use utf8; +package Koha::Schema::Result::ClubTemplateField; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +=head1 NAME + +Koha::Schema::Result::ClubTemplateField + +=cut + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +=head1 TABLE: C + +=cut + +__PACKAGE__->table("club_template_fields"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_template_id + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 name + + data_type: 'tinytext' + is_nullable: 0 + +=head2 description + + data_type: 'text' + is_nullable: 1 + +=head2 authorised_value_category + + data_type: 'varchar' + is_nullable: 1 + size: 16 + +=cut + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "club_template_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "name", + { data_type => "tinytext", is_nullable => 0 }, + "description", + { data_type => "text", is_nullable => 1 }, + "authorised_value_category", + { data_type => "varchar", is_nullable => 1, size => 16 }, +); + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=head2 club_fields + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_fields", + "Koha::Schema::Result::ClubField", + { "foreign.club_template_field_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 club_template + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club_template", + "Koha::Schema::Result::ClubTemplate", + { id => "club_template_id" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-01-12 09:56:17 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:P73ABSn2tzlTYbD3nov21g + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; --- a/Koha/Template/Plugin/AuthorisedValues.pm +++ a/Koha/Template/Plugin/AuthorisedValues.pm @@ -30,6 +30,7 @@ sub GetByCode { sub Get { my ( $self, $category, $selected, $opac ) = @_; + warn "GET( $self, $category, $selected, $opac )"; return GetAuthorisedValues( $category, $selected, $opac ); } @@ -38,6 +39,12 @@ sub GetAuthValueDropbox { return C4::Koha::GetAuthvalueDropbox($category, $default); } +sub Categories { + my ( $self ) = @_; + + return GetAuthorisedValueCategories(); +} + 1; =head1 NAME --- a/Koha/Template/Plugin/Borrowers.pm +++ a/Koha/Template/Plugin/Borrowers.pm @@ -57,5 +57,4 @@ sub HasOverdues { return C4::Members::HasOverdues($borrowernumber); } - 1; --- a/Koha/Template/Plugin/Branches.pm +++ a/Koha/Template/Plugin/Branches.pm @@ -26,6 +26,13 @@ use base qw( Template::Plugin ); use C4::Koha; use C4::Context; +sub GetBranches { + my ($self) = @_; + + my $dbh = C4::Context->dbh; + return $dbh->selectall_arrayref( "SELECT * FROM branches", { Slice => {} } ); +} + sub GetName { my ( $self, $branchcode ) = @_; --- a/Koha/Template/Plugin/Koha.pm +++ a/Koha/Template/Plugin/Koha.pm @@ -57,4 +57,9 @@ sub Version { }; } +sub UserEnv { + my ( $self, $key ) = @_; + my $userenv = C4::Context->userenv; + return $userenv ? $userenv->{$key} : undef; +} 1; --- a/circ/circulation.pl +++ a/circ/circulation.pl @@ -24,9 +24,13 @@ use strict; use warnings; + use CGI qw ( -utf8 ); use DateTime; use DateTime::Duration; +use MARC::Record; +use CGI::Session; + use C4::Output; use C4::Print; use C4::Auth qw/:DEFAULT get_session haspermission/; @@ -37,18 +41,17 @@ use C4::Utils::DataTables::Members; use C4::Members; use C4::Biblio; use C4::Search; -use MARC::Record; use C4::Reserves; -use Koha::Holds; use C4::Context; -use CGI::Session; use C4::Members::Attributes qw(GetBorrowerAttributes); -use Koha::Patron; -use Koha::Patron::Debarments qw(GetDebarments IsDebarred); +use Koha::Holds; use Koha::DateUtils; use Koha::Database; +use Koha::Patron; +use Koha::Patrons; use Koha::Patron::Messages; use Koha::Patron::Images; +use Koha::Patron::Debarments qw(GetDebarments IsDebarred); use Date::Calc qw( Today @@ -653,6 +656,8 @@ $template->param( picture => 1 ) if $patron_image; my $canned_notes = GetAuthorisedValues("BOR_NOTES"); +my $schema = Koha::Database->new()->schema(); + $template->param( debt_confirmed => $debt_confirmed, SpecifyDueDate => $duedatespec_allow, @@ -660,6 +665,7 @@ $template->param( canned_bor_notes_loop => $canned_notes, debarments => GetDebarments({ borrowernumber => $borrowernumber }), todaysdate => output_pref( { dt => dt_from_string()->set(hour => 23)->set(minute => 59), dateformat => 'sql' } ), + borrower => Koha::Patrons->find( $borrowernumber ), ); output_html_with_http_headers $query, $cookie, $template->output; --- a/clubs/clubs-add-modify.pl +++ a/clubs/clubs-add-modify.pl @@ -0,0 +1,104 @@ +#!/usr/bin/perl + +# Copyright 2013 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use CGI; + +use C4::Auth; +use C4::Output; +use Koha::Database; +use Koha::DateUtils qw(dt_from_string); +use Koha::Clubs; +use Koha::Club::Fields; + +my $cgi = new CGI; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => 'clubs/clubs-add-modify.tt', + query => $cgi, + type => 'intranet', + authnotrequired => 0, + flagsrequired => { clubs => 'edit_clubs' }, + } +); + +my $schema = Koha::Database->new()->schema(); + +my $id = $cgi->param('id'); +my $club = $id ? Koha::Clubs->find($id) : Koha::Club->new(); +$template->param( stored => $id ? 'updated' : 'stored' ) if $cgi->param('name'); + +my $club_template_id = $cgi->param('club_template_id'); +my $club_template = $club->club_template() || Koha::Club::Templates->find($club_template_id); +$club_template_id ||= $club_template->id(); + +my $date_start = $cgi->param('date_start'); +$date_start = $date_start ? dt_from_string($date_start) : undef; +my $date_end = $cgi->param('date_end'); +$date_end = $date_end ? dt_from_string($date_end) : undef; + +if ( $cgi->param('name') ) { # Update or create club + $club->set( + { + club_template_id => $cgi->param('club_template_id') || undef, + name => $cgi->param('name') || undef, + description => $cgi->param('description') || undef, + branchcode => $cgi->param('branchcode') || undef, + date_start => $date_start, + date_end => $date_end, + date_updated => dt_from_string(), + } + )->store(); + + my @club_template_field_id = $cgi->param('club_template_field_id'); + my @club_field_id = $cgi->param('club_field_id'); + my @club_field = $cgi->param('club_field'); + + for ( my $i = 0 ; $i < @club_template_field_id ; $i++ ) { + my $club_template_field_id = $club_template_field_id[$i] || undef; + my $club_field_id = $club_field_id[$i] || undef; + my $club_field = $club_field[$i] || undef; + + my $field = + $club_field_id + ? Koha::Club::Fields->find($club_field_id) + : Koha::Club::Field->new(); + + $field->set( + { + club_id => $club->id(), + club_template_field_id => $club_template_field_id, + value => $club_field, + } + )->store(); + } + + $id ||= $club->id(); +} + +$club = Koha::Clubs->find($id); + +$template->param( + club_template => $club_template, + club => $club, +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); --- a/clubs/clubs.pl +++ a/clubs/clubs.pl @@ -0,0 +1,50 @@ +#!/usr/bin/perl + +# Copyright 2013 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use CGI; + +use C4::Auth; +use C4::Output; + +use Koha::Clubs; +use Koha::Club::Templates; + +my $cgi = new CGI; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "clubs/clubs.tt", + query => $cgi, + type => "intranet", + authnotrequired => 0, + flagsrequired => { clubs => '*' }, + } +); + +my @club_templates = Koha::Club::Templates->search(); +my @clubs = Koha::Clubs->search(); + +$template->param( + club_templates => \@club_templates, + clubs => \@clubs, +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); --- a/clubs/patron-clubs-tab.pl +++ a/clubs/patron-clubs-tab.pl @@ -0,0 +1,55 @@ +#!/usr/bin/perl + +# Copyright 2013 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use CGI; + +use C4::Auth; +use C4::Output; + +use Koha::Patrons; +use Koha::Club::Enrollments; + +my $cgi = new CGI; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "clubs/patron-clubs-tab.tt", + query => $cgi, + type => "intranet", + authnotrequired => 0, + flagsrequired => { clubs => '*' }, + } +); + +my $borrowernumber = $cgi->param('borrowernumber'); + +my $borrower = Koha::Patrons->find($borrowernumber); + +my @enrollments = $borrower->GetClubEnrollments(); +my @clubs = $borrower->GetEnrollableClubs(); + +$template->param( + enrollments => \@enrollments, + clubs => \@clubs, + borrowernumber => $borrowernumber +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); --- a/clubs/patron-enroll.pl +++ a/clubs/patron-enroll.pl @@ -0,0 +1,50 @@ +#!/usr/bin/perl + +# Copyright 2013 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use CGI; + +use C4::Auth; +use C4::Output; +use Koha::Clubs; + +my $cgi = new CGI; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "clubs/patron-enroll.tt", + query => $cgi, + type => "intranet", + authnotrequired => 0, + flagsrequired => { clubs => '*' }, + } +); + +my $id = $cgi->param('id'); +my $borrowernumber = $cgi->param('borrowernumber'); + +my $club = Koha::Clubs->find($id); + +$template->param( + club => $club, + borrowernumber => $borrowernumber, +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); --- a/clubs/templates-add-modify.pl +++ a/clubs/templates-add-modify.pl @@ -0,0 +1,150 @@ +#!/usr/bin/perl + +# Copyright 2013 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use CGI; + +use C4::Auth; +use C4::Output; + +use Koha::DateUtils qw(dt_from_string); +use Koha::Club::Templates; +use Koha::Club::Template::Fields; +use Koha::Club::Template::EnrollmentFields; + +use Koha::Database; +my $schema = Koha::Database->new()->schema(); + +my $cgi = new CGI; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => 'clubs/templates-add-modify.tt', + query => $cgi, + type => 'intranet', + authnotrequired => 0, + flagsrequired => { clubs => 'edit_templates' }, + } +); + +my $id = $cgi->param('id'); + +my $club_template; + +if ( $cgi->param('name') ) { # Update or create club + if ($id) { + $club_template = Koha::Club::Templates->find($id); + $template->param( stored => 'updated' ); + } + else { + $club_template = Koha::Club::Template->new(); + $template->param( stored => 'created' ); + } + + $club_template->set( + { + id => $id || undef, + name => $cgi->param('name') || undef, + description => $cgi->param('description') || undef, + branchcode => $cgi->param('branchcode') || undef, + date_updated => dt_from_string(), + is_email_required => $cgi->param('is_email_required') ? 1 : 0, + is_enrollable_from_opac => $cgi->param('is_enrollable_from_opac') + ? 1 + : 0, + } + )->store(); + + $id ||= $club_template->id(); + + # Update club creation fields + my @field_id = $cgi->param('club_template_field_id'); + my @field_name = $cgi->param('club_template_field_name'); + my @field_description = $cgi->param('club_template_field_description'); + my @field_authorised_value_category = $cgi->param('club_template_field_authorised_value_category'); + + my @field_delete = $cgi->param('club_template_field_delete'); + + for ( my $i = 0 ; $i < @field_id ; $i++ ) { + my $field_id = $field_id[$i]; + my $field_name = $field_name[$i]; + my $field_description = $field_description[$i]; + my $field_authorised_value_category = $field_authorised_value_category[$i]; + + my $field = + $field_id + ? Koha::Club::Template::Fields->find($field_id) + : Koha::Club::Template::Field->new(); + + if ( grep( /^$field_id$/, @field_delete ) ) { + $field->delete(); + } + else { + $field->set( + { + club_template_id => $id, + name => $field_name, + description => $field_description, + authorised_value_category => $field_authorised_value_category, + } + )->store(); + } + } + + # Update club enrollment fields + @field_id = $cgi->param('club_template_enrollment_field_id'); + @field_name = $cgi->param('club_template_enrollment_field_name'); + @field_description = $cgi->param('club_template_enrollment_field_description'); + @field_authorised_value_category = $cgi->param('club_template_enrollment_field_authorised_value_category'); + + @field_delete = $cgi->param('club_template_enrollment_field_delete'); + + for ( my $i = 0 ; $i < @field_id ; $i++ ) { + my $field_id = $field_id[$i]; + my $field_name = $field_name[$i]; + my $field_description = $field_description[$i]; + my $field_authorised_value_category = $field_authorised_value_category[$i]; + + my $field = + $field_id + ? Koha::Club::Template::EnrollmentFields->find($field_id) + : Koha::Club::Template::EnrollmentField->new(); + + if ( grep( /^$field_id$/, @field_delete ) ) { + $field->delete(); + } + else { + $field->set( + { + id => $field_id, + club_template_id => $id, + name => $field_name, + description => $field_description, + authorised_value_category => $field_authorised_value_category, + } + )->store(); + } + } +} + +$club_template ||= Koha::Club::Templates->find($id); +$template->param( club_template => $club_template ); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); --- a/installer/data/mysql/atomicupdate/bug_12461.sql +++ a/installer/data/mysql/atomicupdate/bug_12461.sql @@ -0,0 +1,131 @@ +-- +-- Table structure for table 'club_templates' +-- + +CREATE TABLE IF NOT EXISTS club_templates ( + id int(11) NOT NULL AUTO_INCREMENT, + `name` tinytext NOT NULL, + description text, + is_enrollable_from_opac tinyint(1) NOT NULL DEFAULT '0', + is_email_required tinyint(1) NOT NULL DEFAULT '0', + `branchcode` varchar(10) COLLATE utf8_unicode_ci NULL DEFAULT NULL, + date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_updated timestamp NULL DEFAULT NULL, + is_deletable tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (id), + KEY ct_branchcode (branchcode), + CONSTRAINT `club_templates_ibfk_1` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'clubs' +-- + +CREATE TABLE IF NOT EXISTS clubs ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template_id int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + date_start date DEFAULT NULL, + date_end date DEFAULT NULL, + `branchcode` varchar(10) COLLATE utf8_unicode_ci NULL DEFAULT NULL, + date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_updated timestamp NULL DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template_id (club_template_id), + KEY branchcode (branchcode), + CONSTRAINT clubs_ibfk_1 FOREIGN KEY (club_template_id) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT clubs_ibfk_2 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'club_enrollments' +-- + +CREATE TABLE IF NOT EXISTS club_enrollments ( + id int(11) NOT NULL AUTO_INCREMENT, + club_id int(11) NOT NULL, + borrowernumber int(11) NOT NULL, + date_enrolled timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_canceled timestamp NULL DEFAULT NULL, + date_created timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + date_updated timestamp NULL DEFAULT NULL, + `branchcode` varchar(10) COLLATE utf8_unicode_ci NULL DEFAULT NULL, + PRIMARY KEY (id), + KEY club_id (club_id), + KEY borrowernumber (borrowernumber), + KEY branchcode (branchcode), + CONSTRAINT club_enrollments_ibfk_1 FOREIGN KEY (club_id) REFERENCES clubs (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT club_enrollments_ibfk_2 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT club_enrollments_ibfk_3 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'club_template_enrollment_fields' +-- + +CREATE TABLE IF NOT EXISTS club_template_enrollment_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template_id int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + authorised_value_category varchar(16) DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template_id (club_template_id), + CONSTRAINT club_template_enrollment_fields_ibfk_1 FOREIGN KEY (club_template_id) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'club_enrollment_fields' +-- + +CREATE TABLE IF NOT EXISTS club_enrollment_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_enrollment_id int(11) NOT NULL, + club_template_enrollment_field_id int(11) NOT NULL, + `value` text NOT NULL, + PRIMARY KEY (id), + KEY club_enrollment_id (club_enrollment_id), + KEY club_template_enrollment_field_id (club_template_enrollment_field_id), + CONSTRAINT club_enrollment_fields_ibfk_1 FOREIGN KEY (club_enrollment_id) REFERENCES club_enrollments (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT club_enrollment_fields_ibfk_2 FOREIGN KEY (club_template_enrollment_field_id) REFERENCES club_template_enrollment_fields (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'club_template_fields' +-- + +CREATE TABLE IF NOT EXISTS club_template_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template_id int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + authorised_value_category varchar(16) DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template_id (club_template_id), + CONSTRAINT club_template_fields_ibfk_1 FOREIGN KEY (club_template_id) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'club_fields' +-- + +CREATE TABLE IF NOT EXISTS club_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template_field_id int(11) NOT NULL, + club_id int(11) NOT NULL, + `value` text, + PRIMARY KEY (id), + KEY club_template_field_id (club_template_field_id), + KEY club_id (club_id), + CONSTRAINT club_fields_ibfk_3 FOREIGN KEY (club_template_field_id) REFERENCES club_template_fields (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT club_fields_ibfk_4 FOREIGN KEY (club_id) REFERENCES clubs (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +INSERT INTO userflags (bit, flag, flagdesc, defaulton) VALUES (21, 'clubs', 'Patron clubs', '0'); + +INSERT INTO permissions (module_bit, code, description) VALUES + (21, 'edit_templates', 'Create and update club templates'), + (21, 'edit_clubs', 'Create and update clubs'), + (21, 'enroll', 'Enroll patrons in clubs') +; --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -3645,6 +3645,130 @@ CREATE TABLE audio_alerts ( KEY precedence (precedence) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +-- +-- Table structure for table 'club_templates' +-- + +CREATE TABLE IF NOT EXISTS club_templates ( + id int(11) NOT NULL AUTO_INCREMENT, + `name` tinytext NOT NULL, + description text, + is_enrollable_from_opac tinyint(1) NOT NULL DEFAULT '0', + is_email_required tinyint(1) NOT NULL DEFAULT '0', + `branchcode` varchar(10) COLLATE utf8_unicode_ci NULL DEFAULT NULL, + date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_updated timestamp NULL DEFAULT NULL, + is_deletable tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (id), + KEY ct_branchcode (branchcode), + CONSTRAINT `club_templates_ibfk_1` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'clubs' +-- + +CREATE TABLE IF NOT EXISTS clubs ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template_id int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + date_start date DEFAULT NULL, + date_end date DEFAULT NULL, + `branchcode` varchar(10) COLLATE utf8_unicode_ci NULL DEFAULT NULL, + date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_updated timestamp NULL DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template_id (club_template_id), + KEY branchcode (branchcode), + CONSTRAINT clubs_ibfk_1 FOREIGN KEY (club_template_id) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT clubs_ibfk_2 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'club_enrollments' +-- + +CREATE TABLE IF NOT EXISTS club_enrollments ( + id int(11) NOT NULL AUTO_INCREMENT, + club_id int(11) NOT NULL, + borrowernumber int(11) NOT NULL, + date_enrolled timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_canceled timestamp NULL DEFAULT NULL, + date_created timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + date_updated timestamp NULL DEFAULT NULL, + `branchcode` varchar(10) COLLATE utf8_unicode_ci NULL DEFAULT NULL, + PRIMARY KEY (id), + KEY club_id (club_id), + KEY borrowernumber (borrowernumber), + KEY branchcode (branchcode), + CONSTRAINT club_enrollments_ibfk_1 FOREIGN KEY (club_id) REFERENCES clubs (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT club_enrollments_ibfk_2 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT club_enrollments_ibfk_3 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'club_template_enrollment_fields' +-- + +CREATE TABLE IF NOT EXISTS club_template_enrollment_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template_id int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + authorised_value_category varchar(16) DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template_id (club_template_id), + CONSTRAINT club_template_enrollment_fields_ibfk_1 FOREIGN KEY (club_template_id) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'club_enrollment_fields' +-- + +CREATE TABLE IF NOT EXISTS club_enrollment_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_enrollment_id int(11) NOT NULL, + club_template_enrollment_field_id int(11) NOT NULL, + `value` text NOT NULL, + PRIMARY KEY (id), + KEY club_enrollment_id (club_enrollment_id), + KEY club_template_enrollment_field_id (club_template_enrollment_field_id), + CONSTRAINT club_enrollment_fields_ibfk_1 FOREIGN KEY (club_enrollment_id) REFERENCES club_enrollments (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT club_enrollment_fields_ibfk_2 FOREIGN KEY (club_template_enrollment_field_id) REFERENCES club_template_enrollment_fields (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'club_template_fields' +-- + +CREATE TABLE IF NOT EXISTS club_template_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template_id int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + authorised_value_category varchar(16) DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template_id (club_template_id), + CONSTRAINT club_template_fields_ibfk_1 FOREIGN KEY (club_template_id) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- +-- Table structure for table 'club_fields' +-- + +CREATE TABLE IF NOT EXISTS club_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template_field_id int(11) NOT NULL, + club_id int(11) NOT NULL, + `value` text, + PRIMARY KEY (id), + KEY club_template_field_id (club_template_field_id), + KEY club_id (club_id), + CONSTRAINT club_fields_ibfk_3 FOREIGN KEY (club_template_field_id) REFERENCES club_template_fields (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT club_fields_ibfk_4 FOREIGN KEY (club_id) REFERENCES clubs (id) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; --- a/installer/data/mysql/userflags.sql +++ a/installer/data/mysql/userflags.sql @@ -17,5 +17,6 @@ INSERT INTO userflags (bit, flag, flagdesc, defaulton) VALUES (17,'staffaccess','Allow staff members to modify permissions for other staff members',0), (18,'coursereserves','Course reserves',0), (19, 'plugins', 'Koha plugins', '0'), -(20, 'lists', 'Lists', 0) +(20, 'lists', 'Lists', 0), +(21, 'clubs', 'Patron clubs', '0') ; --- a/installer/data/mysql/userpermissions.sql +++ a/installer/data/mysql/userpermissions.sql @@ -74,5 +74,8 @@ INSERT INTO permissions (module_bit, code, description) VALUES (19, 'tool', 'Use tool plugins'), (19, 'report', 'Use report plugins'), (19, 'configure', 'Configure plugins'), - (20, 'delete_public_lists', 'Delete public lists') + (20, 'delete_public_lists', 'Delete public lists'), + (21, 'edit_templates', 'Create and update club templates'), + (21, 'edit_clubs', 'Create and update clubs'), + (21, 'enroll', 'Enroll patrons in clubs') ; --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -89,6 +89,13 @@ $(document).ready(function() { } }); + if ( $('#clubs-tab').length ) { + $('#clubs-tab-link').on('click', function() { + $('#clubs-tab').text(_("Loading...")); + $('#clubs-tab').load('/cgi-bin/koha/clubs/patron-clubs-tab.pl?borrowernumber=[% borrowernumber %]'); + }); + } + [% IF !( CircAutoPrintQuickSlip == 'clear' ) %] // listen submit to trigger qslip on empty checkout $('#mainform').bind('submit',function() { @@ -879,6 +886,16 @@ No patron matched [% message %] [% END %] + [% SET enrollments = borrower.GetClubEnrollmentsCount %] + [% SET enrollable = borrower.GetEnrollableClubsCount %] + [% IF CAN_user_clubs && ( enrollable || enrollments ) %] +
  • + + Clubs ([% enrollments %]/[% enrollable %]) + +
  • + [% END %] + [% IF relatives_issues_count %]
  • Relatives' checkouts
  • [% END %] @@ -920,6 +937,12 @@ No patron matched [% message %] [% END %] +[% IF CAN_user_clubs %] +
    + Loading... +
    +[% END %] + [% INCLUDE borrower_debarments.inc %]
    --- a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs-add-modify.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs-add-modify.tt @@ -0,0 +1,142 @@ +[% USE KohaDates %] +[% USE Branches %] +[% USE AuthorisedValues %] +[% SET AuthorisedValuesCategories = AuthorisedValues.Categories %] +[% INCLUDE 'doc-head-open.inc' %] +Koha › Tools › Patron clubs › Club +[% INCLUDE 'doc-head-close.inc' %] +[% INCLUDE 'calendar.inc' %] + + + + + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'cat-search.inc' %] + + +
    +
    + [% IF stored %] +
    +

    Your club was [% IF stored == 'updated' %] updated [% ELSE %] saved [% END %]

    + Return to patron clubs +
    + [% END %] + +
    + + + +
    + + + [% IF club %] + Modify club [% club.name %] + [% ELSE %] + Create a new [% club_template.name %] club + [% END %] + + +
      +
    1. + + +
    2. + +
    3. + + +
    4. + +
    5. + + +
    6. + +
    7. + + +
    8. + +
    9. + + +
    10. + + [% IF club %] + [% FOREACH f IN club.club_fields %] +
    11. + + + + + [% IF f.club_template_field.authorised_value_category %] + + [% ELSE %] + + [% END %] +
    12. + [% END %] + [% ELSE %] + [% FOREACH f IN club_template.club_template_fields %] +
    13. + + + + [% IF f.authorised_value_category %] + + [% ELSE %] + + [% END %] +
    14. + [% END %] + [% END %] + +
    + +
    + + + + Cancel +
    +
    +
    + +[% INCLUDE 'intranet-bottom.inc' %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs.tt @@ -0,0 +1,206 @@ +[% USE Branches %] +[% USE Koha %] +[% INCLUDE 'doc-head-open.inc' %] +Koha › Tools › Patron clubs +[% INCLUDE 'doc-head-close.inc' %] + + +[% INCLUDE 'datatables.inc' %] + + + + + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'cat-search.inc' %] + + +
    +
    +

    Patron clubs

    + + +

    Club templates

    + + [% IF CAN_user_clubs_edit_templates %] + + [% END %] + + + + + + + + + + + + + + + + [% FOREACH t IN club_templates %] + + + + + + + + + + [% END %] + +
    NameDescriptionPublic enrollmentEmail requiredLibrary  
    [% t.name %][% t.description %] + [% IF t.is_enrollable_from_opac %] + Yes + [% ELSE %] + No + [% END %] + + [% IF t.is_email_required %] + Yes + [% ELSE %] + No + [% END %] + [% Branches.GetName( t.branchcode ) %] + [% IF CAN_user_clubs_edit_templates %] + + Edit + + [% END %] + + [% IF CAN_user_clubs_edit_templates %] + + Delete + + [% END %] +
    + +

    Clubs

    + + [% IF CAN_user_clubs_edit_clubs %] +
    +
    + + +
    +
    + [% END %] + + + + + + + + + + + + + + + + + [% FOREACH c IN clubs %] + + + + + + + + + + + [% END %] + +
    NameTemplateDescriptionPublic enrollmentEmail requiredLibrary  
    [% c.name %][% c.club_template.name %][% c.description %] + [% IF c.club_template.is_enrollable_from_opac %] + Yes + [% ELSE %] + No + [% END %] + + [% IF c.club_template.is_email_required %] + Yes + [% ELSE %] + No + [% END %] + [% Branches.GetName( c.branchcode ) %] + [% IF CAN_user_clubs_edit_clubs %] + + Edit + + [% END %] + + [% IF CAN_user_clubs_edit_clubs %] + + Delete + + [% END %] +
    +
    +
    +[% INCLUDE 'intranet-bottom.inc' %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-clubs-tab.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-clubs-tab.tt @@ -0,0 +1,102 @@ +[% USE KohaDates %] + +[% IF enrollments %] + + + + + + + + + + [% IF CAN_user_clubs_enroll %][% END %] + + + + + [% FOREACH e IN enrollments %] + + + + + [% IF CAN_user_clubs_enroll %] + + [% END %] + + [% END %] + +
    + Clubs currently enrolled in +
    NameDescriptionDate enrolled 
    [% e.club.name %][% e.club.description %][% e.date_enrolled | $KohaDates %] + + Cancel + +
    +[% END %] + +[% IF clubs %] + + + + + + + + + [% IF CAN_user_clubs_enroll %][% END %] + + + + + [% FOREACH c IN clubs %] + + + + [% IF CAN_user_clubs_enroll %] + + [% END %] + + [% END %] + +
    + Clubs not enrolled in +
    NameDescription 
    [% c.name %][% c.description %] + + Enroll + +
    +[% END %] + +[% IF CAN_user_clubs_enroll %] + +[% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-enroll.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-enroll.tt @@ -0,0 +1,66 @@ +[% USE AuthorisedValues %] +[% SET AuthorisedValuesCategories = AuthorisedValues.Categories %] + +

    + Enroll in [% club.name %] +

    + +
    +
    + + +
    +
      + [% FOREACH f IN club.club_template.club_template_enrollment_fields %] +
    1. + + [% IF f.authorised_value_category %] + + [% ELSE %] + + [% END %] + [% f.description %] +
    2. + [% END %] + +
    3. + Enroll + Cancel +
    4. +
    +
    +
    +
    + + --- a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/templates-add-modify.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/templates-add-modify.tt @@ -0,0 +1,257 @@ +[% USE Branches %] +[% USE AuthorisedValues %] +[% SET AuthorisedValuesCategories = AuthorisedValues.Categories %] +[% INCLUDE 'doc-head-open.inc' %] +Koha › Tools › Patron clubs › Club template +[% INCLUDE 'doc-head-close.inc' %] + + + + + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'cat-search.inc' %] + + +
    +
    + [% IF stored %] +
    +

    Your club template was [% IF stored == 'updated' %] updated [% ELSE %] saved [% END %]

    + Return to patron clubs +
    + [% END %] + +
    + + +
    + + + [% IF club_template %] + Modify club template [% club_template.name %] + [% ELSE %] + Create a new club template + [% END %] + + +
      +
    1. + + +
    2. + +
    3. + + +
    4. + +
    5. + + [% IF club_template.is_enrollable_from_opac %] + + [% ELSE %] + + [% END %] + If a template allows public enrollment, patrons can enroll in a club based on this template from the public catalog. +
    6. + +
    7. + + [% IF club_template.is_email_required %] + + [% ELSE %] + + [% END %] + If set, a club based on this template can only be enrolled in by patrons with a valid email address. +
    8. + +
    9. + + + If set, only librarians logged in with this branch will be able to modify this club template. +
    10. + +
    + +

    Club fields:

    + These fields will be used in the creation of clubs based on this template + + [% FOREACH f IN club_template.club_template_fields %] +
      + +
    • + + +
    • + +
    • + + +
    • + +
    • + + +
    • + +
    • + + +
    • + +
      +
    + [% END %] +
    + + Add new field + + +

    Enrollment fields:

    + These fields will be used when enrolling a patron in a club based on this template + + [% FOREACH f IN club_template.club_template_enrollment_fields %] +
      + +
    • + + +
    • + +
    • + + +
    • + +
    • + + +
    • + +
    • + + +
    • + +
      +
    + [% END %] +
    + + Add new field + + +
    + + + + + + Cancel +
    +
    +
    + + + + + +[% INCLUDE 'intranet-bottom.inc' %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt @@ -48,6 +48,13 @@ var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export"); columns_settings = [% ColumnsSettings.GetColumns( 'members', 'moremember', 'issues-table', 'json' ) %] $(document).ready(function() { + if ( $('#clubs-tab').length ) { + $('#clubs-tab-link').on('click', function() { + $('#clubs-tab').text(_("Loading...")); + $('#clubs-tab').load('/cgi-bin/koha/clubs/patron-clubs-tab.pl?borrowernumber=[% borrowernumber %]'); + }); + } + $('#finesholdsissues').tabs({ // Correct table sizing for tables hidden in tabs // http://www.datatables.net/examples/api/tabs_and_scrolling.html @@ -449,6 +456,15 @@ function validate1(date) { [% END %]
  • [% debarments.size %] Restrictions
  • + [% SET enrollments = borrower.GetClubEnrollmentsCount %] + [% SET enrollable = borrower.GetEnrollableClubsCount %] + [% IF CAN_user_clubs && ( enrollments || enrollable ) %] +
  • + + Clubs ([% enrollments %]/[% enrollable %]) + +
  • + [% END %] [% INCLUDE "checkouts-table.inc" %] @@ -484,6 +500,12 @@ function validate1(date) { [% END %]
    +[% IF CAN_user_clubs && ( enrollments || enrollable ) %] +
    + Loading... +
    +[% END %] + [% INCLUDE borrower_debarments.inc %]
    --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt @@ -20,6 +20,11 @@
    Manage lists of patrons.
    [% END %] + [% IF (CAN_user_clubs) %] +
    Patron clubs +
    Manage patron clubs..
    + [% END %] + [% IF ( CAN_user_tools_moderate_comments ) %]
    Comments [% IF ( pendingcomments ) %][% pendingcomments %][% END %]
    Moderate patron comments.
    --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/clubs-tab.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/clubs-tab.tt @@ -0,0 +1,102 @@ +[% USE KohaDates %] + +[% IF enrollments %] + + + + + + + + + + + + + + + [% FOREACH e IN enrollments %] + + + + + [% IF e.club.club_template.is_enrollable_from_opac %] + + [% END %] + + [% END %] + +
    + Clubs you are currently enrolled in +
    NameDescriptionDate enrolled 
    [% e.club.name %][% e.club.description %][% e.date_enrolled | $KohaDates %] + + Cancel + +
    +[% END %] + +[% IF clubs %] + + + + + + + + + + + + + + [% FOREACH c IN clubs %] + + + + + + [% END %] + +
    + Clubs you can enroll in +
    NameDescription 
    [% c.name %][% c.description %] + [% IF !c.club_template.is_email_required || ( c.club_template.is_email_required && borrower.FirstValidEmailAddress ) %] + + Enroll + + [% ELSE %] + You must have an email address to enroll + [% END %] +
    +[% END %] + + --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/enroll.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/enroll.tt @@ -0,0 +1,66 @@ +[% USE AuthorisedValues %] +[% SET AuthorisedValuesCategories = AuthorisedValues.Categories %] + +

    + Enroll in [% club.name %] +

    + +
    +
    + + +
    +
      + [% FOREACH f IN club.club_template.club_template_enrollment_fields %] +
    1. + + [% IF f.authorised_value_category %] + + [% ELSE %] + + [% END %] + [% f.description %] +
    2. + [% END %] + +
    3. + Enroll + Cancel +
    4. +
    +
    +
    +
    + + --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt @@ -118,6 +118,15 @@ [% IF ( BORROWER_INFO.amountoverzero ) %]
  • Fines ([% BORROWER_INFO.amountoutstanding %])
  • [% END %] [% IF ( BORROWER_INFO.amountlessthanzero ) %]
  • Credits ([% BORROWER_INFO.amountoutstanding %])
  • [% END %] [% END %] + + [% IF patron.GetClubEnrollmentsCount || patron.GetEnrollableClubsCount(1) %] +
  • + + Clubs ([% patron.GetClubEnrollmentsCount %]/[% patron.GetEnrollableClubsCount(1) %]) + +
  • + [% END %] + [% IF ( RESERVES.count ) %]
  • Holds ([% RESERVES.count %])
  • [% END %] @@ -290,6 +299,12 @@ [% END # IF issues_count %]
    + [% IF patron.GetClubEnrollmentsCount || patron.GetEnrollableClubsCount(1) %] +
    + Loading... +
    + [% END %] + [% IF ( OPACFinesTab ) %] [% IF BORROWER_INFO.amountoverfive %] @@ -761,6 +776,13 @@ [% END %] $( ".suspend-until" ).datepicker({ minDate: 1 }); // Require that "until date" be in the future + + if ( $('#opac-user-clubs').length ) { + $('#opac-user-clubs-tab-link').on('click', function() { + $('#opac-user-clubs').text(_("Loading...")); + $('#opac-user-clubs').load('/cgi-bin/koha/clubs/clubs-tab.pl?borrowernumber=[% borrowernumber %]'); + }); + } }); //]]> --- a/members/moremember.pl +++ a/members/moremember.pl @@ -62,6 +62,7 @@ if ( C4::Context->preference('NorwegianPatronDBEnable') && C4::Context->preferen use DateTime; use Koha::DateUtils; use Koha::Database; +use Koha::Patrons; use vars qw($debug); @@ -337,6 +338,7 @@ $template->param( PatronsPerPage => C4::Context->preference("PatronsPerPage") || 20, relatives_issues_count => $relatives_issues_count, relatives_borrowernumbers => \@relatives, + borrower => Koha::Patrons->find( $borrowernumber ), ); output_html_with_http_headers $input, $cookie, $template->output; --- a/opac/clubs/clubs-tab.pl +++ a/opac/clubs/clubs-tab.pl @@ -0,0 +1,52 @@ +#!/usr/bin/perl + +# Copyright 2013 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use CGI; + +use C4::Auth; +use C4::Output; +use Koha::Patrons; + +my $cgi = new CGI; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "clubs/clubs-tab.tt", + query => $cgi, + type => "opac", + authnotrequired => 0, + } +); + +my $borrowernumber = $cgi->param('borrowernumber'); + +my $borrower = Koha::Patrons->find($borrowernumber); + +my @enrollments = $borrower->GetClubEnrollments(); +my @clubs = $borrower->GetEnrollableClubs( my $opac = 1 ); + +$template->param( + enrollments => \@enrollments, + clubs => \@clubs, + borrower => $borrower, +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); --- a/opac/clubs/enroll.pl +++ a/opac/clubs/enroll.pl @@ -0,0 +1,49 @@ +#!/usr/bin/perl + +# Copyright 2013 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use CGI; + +use C4::Auth; +use C4::Output; +use Koha::Clubs; + +my $cgi = new CGI; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "clubs/enroll.tt", + query => $cgi, + type => "opac", + authnotrequired => 0, + } +); + +my $id = $cgi->param('id'); +my $borrowernumber = $cgi->param('borrowernumber'); + +my $club = Koha::Clubs->find($id); + +$template->param( + club => $club, + borrowernumber => $borrowernumber, +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); --- a/opac/opac-user.pl +++ a/opac/opac-user.pl @@ -39,6 +39,7 @@ use Koha::Patron::Debarments qw(IsDebarred); use Koha::Holds; use Koha::Database; use Koha::Patron::Messages; +use Koha::Patrons; use constant ATTRIBUTE_SHOW_BARCODE => 'SHOW_BCODE'; @@ -347,6 +348,7 @@ if ( C4::Context->preference('AllowPatronToSetCheckoutsVisibilityForGuarantor' $template->param( borrower => $borr, patron_messages => $patron_messages, + patron => Koha::Patrons->find( $borrowernumber ), patronupdate => $patronupdate, OpacRenewalAllowed => C4::Context->preference("OpacRenewalAllowed"), userview => 1, @@ -354,6 +356,7 @@ $template->param( AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds'), OpacHoldNotes => C4::Context->preference('OpacHoldNotes'), failed_holds => $query->param('failed_holds'), + borrower => Koha::Patrons->find($borrowernumber), ); output_html_with_http_headers $query, $cookie, $template->output, undef, { force_no_caching => 1 }; --- a/opac/svc/club/cancel_enrollment +++ a/opac/svc/club/cancel_enrollment @@ -0,0 +1,47 @@ +#!/usr/bin/perl + +# Copyright 2014 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +use Modern::Perl; + +use CGI; +use JSON qw(to_json); + +use C4::Auth qw(check_cookie_auth); +use Koha::Club::Enrollments; + +my $cgi = new CGI; + +my ( $auth_status, $sessionID ) = + check_cookie_auth( $cgi->cookie('CGISESSID') ); +if ( $auth_status ne "ok" ) { + exit 0; +} + +my $borrowernumber = C4::Context->userenv->{'number'}; + +my $id = $cgi->param('id'); + +my $enrollment = Koha::Club::Enrollments->find($id); +$enrollment->cancel(); + +binmode STDOUT, ':encoding(UTF-8)'; +print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' ); + +print to_json( { success => $enrollment ? 1 : 0 } ); --- a/opac/svc/club/enroll +++ a/opac/svc/club/enroll @@ -0,0 +1,77 @@ +#!/usr/bin/perl + +# Copyright 2014 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +use Modern::Perl; + +use CGI; +use JSON qw(to_json); + +use C4::Auth qw(check_cookie_auth); +use Koha::Club::Enrollment::Field; +use Koha::Club::Enrollment; +use Koha::Clubs; + +my $cgi = new CGI; + +my ( $auth_status, $sessionID ) = + check_cookie_auth( $cgi->cookie('CGISESSID') ); +if ( $auth_status ne "ok" ) { + exit 0; +} + +my $borrowernumber = C4::Context->userenv->{'number'}; + +my $id = $cgi->param('id'); + +my $enrollment; +if ( $borrowernumber && $id ) { + 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 @enrollment_fields = $club->club_template()->club_template_enrollment_fields(); + + foreach my $e (@enrollment_fields) { + Koha::Club::Enrollment::Field->new()->set( + { + club_enrollment_id => $enrollment->id(), + club_template_enrollment_field_id => $e->id(), + value => $cgi->param( $e->id() ), + } + )->store(); + } + } +} + +binmode STDOUT, ':encoding(UTF-8)'; +print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' ); + +print to_json( { success => $enrollment ? 1 : 0 } ); --- a/svc/club/cancel_enrollment +++ a/svc/club/cancel_enrollment @@ -0,0 +1,46 @@ +#!/usr/bin/perl + +# Copyright 2014 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +use Modern::Perl; + +use CGI; +use JSON qw(to_json); + +use C4::Auth qw(check_cookie_auth); + +use Koha::Club::Enrollments; + +my $cgi = new CGI; + +my ( $auth_status, $sessionID ) = + check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'enroll' } ); +if ( $auth_status ne "ok" ) { + exit 0; +} + +my $id = $cgi->param('id'); + +my $enrollment = Koha::Club::Enrollments->find($id); +$enrollment->cancel() if $enrollment; + +binmode STDOUT, ':encoding(UTF-8)'; +print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' ); + +print to_json( { success => $enrollment ? 1 : 0 } ); --- a/svc/club/delete +++ a/svc/club/delete @@ -0,0 +1,48 @@ +#!/usr/bin/perl + +# Copyright 2014 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +use Modern::Perl; + +use CGI; +use JSON qw(to_json); + +use C4::Auth qw(check_cookie_auth); +use Koha::Clubs; + +my $cgi = new CGI; + +my ( $auth_status, $sessionID ) = check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'edit_clubs' } ); +if ( $auth_status ne "ok" ) { + exit 0; +} + +my $success = 0; + +my $id = $cgi->param('id'); + +my $club = Koha::Clubs->find($id); +if ($club) { + $success = $club->delete(); +} + +binmode STDOUT, ':encoding(UTF-8)'; +print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' ); + +print to_json( { success => $success ? 1 : 0 } ); --- a/svc/club/enroll +++ a/svc/club/enroll @@ -0,0 +1,74 @@ +#!/usr/bin/perl + +# Copyright 2014 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +use Modern::Perl; + +use CGI; +use JSON qw(to_json); + +use C4::Auth qw(check_cookie_auth); +use Koha::Club::Enrollment::Fields; +use Koha::Club::Enrollments; +use Koha::Clubs; + +my $cgi = new CGI; + +my ( $auth_status, $sessionID ) = + check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'enroll' } ); +if ( $auth_status ne "ok" ) { + exit 0; +} + +my $id = $cgi->param('id'); +my $borrowernumber = $cgi->param('borrowernumber'); + +my $club = Koha::Clubs->find($id); + +my $enrollment; +if ($club) { + $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(); + + 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 => $cgi->param( $e->id() ), + } + )->store(); + } + } +} + +binmode STDOUT, ':encoding(UTF-8)'; +print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' ); + +print to_json( { success => $enrollment ? 1 : 0 } ); --- a/svc/club/template/delete +++ a/svc/club/template/delete @@ -0,0 +1,49 @@ +#!/usr/bin/perl + +# Copyright 2014 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +use Modern::Perl; + +use CGI; +use JSON qw(to_json); + +use C4::Auth qw(check_cookie_auth); + +use Koha::Club::Templates; + +my $cgi = new CGI; + +my ( $auth_status, $sessionID ) = check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'edit_templates' } ); +if ( $auth_status ne "ok" ) { + exit 0; +} + +my $success = 0; + +my $id = $cgi->param('id'); + +my $club_template = Koha::Club::Templates->find($id); +if ($club_template) { + $success = $club_template->delete(); +} + +binmode STDOUT, ':encoding(UTF-8)'; +print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' ); + +print to_json( { success => $success ? 1 : 0 } ); --