From 1d2e35ab1add9dae2fde5414ad50c20e4a44b0bc Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Fri, 23 May 2014 11:54:26 -0400 Subject: [PATCH] Bug 12461 - Add patron clubs feature This features would add the ability to create clubs which patrons may be enrolled in. It would be particularly useful for tracking summer reading programs, book clubs and other such clubs. Test Plan: 1) Apply this patch 2) Run updatedatabase.pl 3) Ensure your staff user has the new 'Patron clubs' permissions 4) Under the tools menu, click the "Patron clubs" link 5) Create a new club template * 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. 6) Create a new club based on that template 7) Attempt to enroll a patron in that club 8) Create a club with email required set 9) Attempt to enroll a patron without an email address in that club 10) Create a club that is enrollable from the OPAC 11) Attempt to enroll a patron in that club 12) Attempt to cancel a club enrollment from the OPAC 13) Attempt to cancel a club enrollment from the staff interface --- C4/Members.pm | 16 +- Koha/Schema/Result/Borrower.pm | 634 ++++++++++++++++---- Koha/Schema/Result/Club.pm | 168 ++++++ Koha/Schema/Result/ClubEnrollment.pm | 167 +++++ Koha/Schema/Result/ClubEnrollmentField.pm | 97 +++ Koha/Schema/Result/ClubField.pm | 127 ++++ Koha/Schema/Result/ClubTemplate.pm | 168 ++++++ Koha/Schema/Result/ClubTemplateEnrollmentField.pm | 104 ++++ Koha/Schema/Result/ClubTemplateField.pm | 104 ++++ Koha/Template/Plugin/AuthorisedValues.pm | 6 + Koha/Template/Plugin/Borrowers.pm | 4 + Koha/Template/Plugin/Branches.pm | 7 + Koha/Template/Plugin/Koha.pm | 5 + circ/circulation.pl | 3 + clubs/clubs-add-modify.pl | 125 ++++ clubs/clubs.pl | 50 ++ clubs/patron-clubs-tab.pl | 59 ++ clubs/patron-enroll.pl | 52 ++ clubs/templates-add-modify.pl | 139 +++++ installer/data/mysql/en/mandatory/userflags.sql | 1 + .../data/mysql/en/mandatory/userpermissions.sql | 3 + installer/data/mysql/kohastructure.sql | 174 ++++++ installer/data/mysql/updatedatabase.pl | 149 +++++ .../prog/en/modules/circ/circulation.tt | 19 + .../prog/en/modules/clubs/clubs-add-modify.tt | 136 +++++ .../intranet-tmpl/prog/en/modules/clubs/clubs.tt | 206 +++++++ .../prog/en/modules/clubs/patron-clubs-tab.tt | 103 ++++ .../prog/en/modules/clubs/patron-enroll.tt | 67 ++ .../prog/en/modules/clubs/templates-add-modify.tt | 252 ++++++++ .../prog/en/modules/members/moremember.tt | 16 + .../prog/en/modules/tools/tools-home.tt | 5 + .../bootstrap/en/modules/clubs/clubs-tab.tt | 103 ++++ .../opac-tmpl/bootstrap/en/modules/clubs/enroll.tt | 67 ++ .../opac-tmpl/bootstrap/en/modules/opac-user.tt | 17 + members/moremember.pl | 3 + opac/clubs/clubs-tab.pl | 67 ++ opac/clubs/enroll.pl | 51 ++ opac/opac-user.pl | 7 +- opac/svc/club/cancel_enrollment | 52 ++ opac/svc/club/enroll | 79 +++ svc/club/cancel_enrollment | 48 ++ svc/club/delete | 50 ++ svc/club/enroll | 78 +++ svc/club/template/delete | 50 ++ 44 files changed, 3716 insertions(+), 122 deletions(-) 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 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 diff --git a/C4/Members.pm b/C4/Members.pm index ff34c8f..8cf08da 100644 --- a/C4/Members.pm +++ b/C4/Members.pm @@ -1521,20 +1521,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::Database->new()->schema()->resultset('Borrower')->find( $borrowernumber ); + + return $borrower->FirstValidEmailAddress(); } =head2 GetNoticeEmailAddress diff --git a/Koha/Schema/Result/Borrower.pm b/Koha/Schema/Result/Borrower.pm index 4dbd0ce..f3880a2 100644 --- a/Koha/Schema/Result/Borrower.pm +++ b/Koha/Schema/Result/Borrower.pm @@ -1,21 +1,17 @@ -use utf8; package Koha::Schema::Result::Borrower; # Created by DBIx::Class::Schema::Loader # DO NOT MODIFY THE FIRST PART OF THIS FILE -=head1 NAME - -Koha::Schema::Result::Borrower - -=cut - use strict; use warnings; use base 'DBIx::Class::Core'; -=head1 TABLE: C + +=head1 NAME + +Koha::Schema::Result::Borrower =cut @@ -201,7 +197,6 @@ __PACKAGE__->table("borrowers"); =head2 dateofbirth data_type: 'date' - datetime_undef_if_invalid: 1 is_nullable: 1 =head2 branchcode @@ -223,13 +218,11 @@ __PACKAGE__->table("borrowers"); =head2 dateenrolled data_type: 'date' - datetime_undef_if_invalid: 1 is_nullable: 1 =head2 dateexpiry data_type: 'date' - datetime_undef_if_invalid: 1 is_nullable: 1 =head2 gonenoaddress @@ -245,7 +238,6 @@ __PACKAGE__->table("borrowers"); =head2 debarred data_type: 'date' - datetime_undef_if_invalid: 1 is_nullable: 1 =head2 debarredcomment @@ -493,7 +485,7 @@ __PACKAGE__->add_columns( "B_phone", { accessor => "b_phone", data_type => "mediumtext", is_nullable => 1 }, "dateofbirth", - { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 1 }, + { data_type => "date", is_nullable => 1 }, "branchcode", { data_type => "varchar", @@ -511,15 +503,15 @@ __PACKAGE__->add_columns( size => 10, }, "dateenrolled", - { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 1 }, + { data_type => "date", is_nullable => 1 }, "dateexpiry", - { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 1 }, + { data_type => "date", is_nullable => 1 }, "gonenoaddress", { data_type => "tinyint", is_nullable => 1 }, "lost", { data_type => "tinyint", is_nullable => 1 }, "debarred", - { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 1 }, + { data_type => "date", is_nullable => 1 }, "debarredcomment", { data_type => "varchar", is_nullable => 1, size => 255 }, "contactname", @@ -577,28 +569,31 @@ __PACKAGE__->add_columns( "privacy", { data_type => "integer", default_value => 1, is_nullable => 0 }, ); +__PACKAGE__->set_primary_key("borrowernumber"); +__PACKAGE__->add_unique_constraint("cardnumber", ["cardnumber"]); -=head1 PRIMARY KEY +=head1 RELATIONS -=over 4 +=head2 accountlines_borrowernumbers -=item * L +Type: has_many -=back +Related object: L =cut -__PACKAGE__->set_primary_key("borrowernumber"); - -=head1 UNIQUE CONSTRAINTS - -=head2 C +__PACKAGE__->has_many( + "accountlines_borrowernumbers", + "Koha::Schema::Result::Accountline", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); -=over 4 +=head2 accountlines_borrowernumbers -=item * L +Type: has_many -=back +Related object: L =cut @@ -618,22 +613,22 @@ __PACKAGE__->add_unique_constraint("userid", ["userid"]); =head1 RELATIONS -=head2 accountlines +=head2 accountoffsets_borrowernumbers Type: has_many -Related object: L +Related object: L =cut __PACKAGE__->has_many( - "accountlines", - "Koha::Schema::Result::Accountline", + "accountoffsets_borrowernumbers", + "Koha::Schema::Result::Accountoffset", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 accountoffsets +=head2 accountoffsets_borrowernumbers Type: has_many @@ -642,13 +637,13 @@ Related object: L =cut __PACKAGE__->has_many( - "accountoffsets", + "accountoffsets_borrowernumbers", "Koha::Schema::Result::Accountoffset", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 aqbasketusers +=head2 aqbasketusers_borrowernumbers Type: has_many @@ -657,13 +652,43 @@ Related object: L =cut __PACKAGE__->has_many( - "aqbasketusers", + "aqbasketusers_borrowernumbers", "Koha::Schema::Result::Aqbasketuser", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 aqbudgetborrowers +=head2 aqbasketusers_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "aqbasketusers_borrowernumbers", + "Koha::Schema::Result::Aqbasketuser", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 aqbudgetborrowers_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "aqbudgetborrowers_borrowernumbers", + "Koha::Schema::Result::Aqbudgetborrower", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 aqbudgetborrowers_borrowernumbers Type: has_many @@ -672,13 +697,28 @@ Related object: L =cut __PACKAGE__->has_many( - "aqbudgetborrowers", + "aqbudgetborrowers_borrowernumbers", "Koha::Schema::Result::Aqbudgetborrower", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 borrower_attributes +=head2 borrower_attributes_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "borrower_attributes_borrowernumbers", + "Koha::Schema::Result::BorrowerAttribute", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 borrower_attributes_borrowernumbers Type: has_many @@ -687,13 +727,13 @@ Related object: L =cut __PACKAGE__->has_many( - "borrower_attributes", + "borrower_attributes_borrowernumbers", "Koha::Schema::Result::BorrowerAttribute", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 borrower_debarments +=head2 borrower_debarments_borrowernumbers Type: has_many @@ -702,13 +742,28 @@ Related object: L =cut __PACKAGE__->has_many( - "borrower_debarments", + "borrower_debarments_borrowernumbers", "Koha::Schema::Result::BorrowerDebarment", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 borrower_files +=head2 borrower_debarments_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "borrower_debarments_borrowernumbers", + "Koha::Schema::Result::BorrowerDebarment", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 borrower_files_borrowernumbers Type: has_many @@ -717,13 +772,28 @@ Related object: L =cut __PACKAGE__->has_many( - "borrower_files", + "borrower_files_borrowernumbers", "Koha::Schema::Result::BorrowerFile", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 borrower_message_preferences +=head2 borrower_files_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "borrower_files_borrowernumbers", + "Koha::Schema::Result::BorrowerFile", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 borrower_message_preferences_borrowernumbers Type: has_many @@ -732,7 +802,22 @@ Related object: L =cut __PACKAGE__->has_many( - "borrower_message_preferences", + "borrower_message_preferences_borrowernumbers", + "Koha::Schema::Result::BorrowerMessagePreference", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 borrower_message_preferences_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "borrower_message_preferences_borrowernumbers", "Koha::Schema::Result::BorrowerMessagePreference", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, @@ -783,7 +868,37 @@ __PACKAGE__->belongs_to( { is_deferrable => 1, on_delete => "RESTRICT", on_update => "RESTRICT" }, ); -=head2 course_instructors +=head2 branchcode + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "branchcode", + "Koha::Schema::Result::Branch", + { branchcode => "branchcode" }, + { on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 club_enrollments + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_enrollments", + "Koha::Schema::Result::ClubEnrollment", + { "foreign.borrower" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 course_instructors_borrowernumbers Type: has_many @@ -792,13 +907,28 @@ Related object: L =cut __PACKAGE__->has_many( - "course_instructors", + "course_instructors_borrowernumbers", "Koha::Schema::Result::CourseInstructor", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 creator_batches +=head2 course_instructors_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "course_instructors_borrowernumbers", + "Koha::Schema::Result::CourseInstructor", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 creator_batches_borrower_numbers Type: has_many @@ -807,13 +937,28 @@ Related object: L =cut __PACKAGE__->has_many( - "creator_batches", + "creator_batches_borrower_numbers", "Koha::Schema::Result::CreatorBatch", { "foreign.borrower_number" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 hold_fill_targets +=head2 creator_batches_borrower_numbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "creator_batches_borrower_numbers", + "Koha::Schema::Result::CreatorBatch", + { "foreign.borrower_number" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 hold_fill_targets_borrowernumbers Type: has_many @@ -822,13 +967,43 @@ Related object: L =cut __PACKAGE__->has_many( - "hold_fill_targets", + "hold_fill_targets_borrowernumbers", "Koha::Schema::Result::HoldFillTarget", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 issues +=head2 hold_fill_targets_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "hold_fill_targets_borrowernumbers", + "Koha::Schema::Result::HoldFillTarget", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 issues_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "issues_borrowernumbers", + "Koha::Schema::Result::Issue", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 issues_borrowernumbers Type: has_many @@ -837,13 +1012,13 @@ Related object: L =cut __PACKAGE__->has_many( - "issues", + "issues_borrowernumbers", "Koha::Schema::Result::Issue", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 message_queues +=head2 message_queue_borrowernumbers Type: has_many @@ -852,13 +1027,43 @@ Related object: L =cut __PACKAGE__->has_many( - "message_queues", + "message_queue_borrowernumbers", "Koha::Schema::Result::MessageQueue", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 old_issues +=head2 message_queue_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "message_queue_borrowernumbers", + "Koha::Schema::Result::MessageQueue", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 old_issues_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "old_issues_borrowernumbers", + "Koha::Schema::Result::OldIssue", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 old_issues_borrowernumbers Type: has_many @@ -867,13 +1072,28 @@ Related object: L =cut __PACKAGE__->has_many( - "old_issues", + "old_issues_borrowernumbers", "Koha::Schema::Result::OldIssue", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 old_reserves +=head2 old_reserves_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "old_reserves_borrowernumbers", + "Koha::Schema::Result::OldReserve", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 old_reserves_borrowernumbers Type: has_many @@ -882,13 +1102,13 @@ Related object: L =cut __PACKAGE__->has_many( - "old_reserves", + "old_reserves_borrowernumbers", "Koha::Schema::Result::OldReserve", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 patron_list_patrons +=head2 patron_list_patrons_borrowernumbers Type: has_many @@ -897,13 +1117,28 @@ Related object: L =cut __PACKAGE__->has_many( - "patron_list_patrons", + "patron_list_patrons_borrowernumbers", "Koha::Schema::Result::PatronListPatron", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 patron_lists +=head2 patron_list_patrons_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "patron_list_patrons_borrowernumbers", + "Koha::Schema::Result::PatronListPatron", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 patron_lists_owners Type: has_many @@ -912,13 +1147,43 @@ Related object: L =cut __PACKAGE__->has_many( - "patron_lists", + "patron_lists_owners", "Koha::Schema::Result::PatronList", { "foreign.owner" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 patroncards +=head2 patron_lists_owners + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "patron_lists_owners", + "Koha::Schema::Result::PatronList", + { "foreign.owner" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 patroncards_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "patroncards_borrowernumbers", + "Koha::Schema::Result::Patroncard", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 patroncards_borrowernumbers Type: has_many @@ -927,13 +1192,28 @@ Related object: L =cut __PACKAGE__->has_many( - "patroncards", + "patroncards_borrowernumbers", "Koha::Schema::Result::Patroncard", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 patronimage +=head2 patronimage_borrowernumber + +Type: might_have + +Related object: L + +=cut + +__PACKAGE__->might_have( + "patronimage_borrowernumber", + "Koha::Schema::Result::Patronimage", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 patronimage_borrowernumber Type: might_have @@ -942,13 +1222,13 @@ Related object: L =cut __PACKAGE__->might_have( - "patronimage", + "patronimage_borrowernumber", "Koha::Schema::Result::Patronimage", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 ratings +=head2 ratings_borrowernumbers Type: has_many @@ -957,13 +1237,28 @@ Related object: L =cut __PACKAGE__->has_many( - "ratings", + "ratings_borrowernumbers", "Koha::Schema::Result::Rating", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 reserves +=head2 ratings_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "ratings_borrowernumbers", + "Koha::Schema::Result::Rating", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 reserves_borrowernumbers Type: has_many @@ -972,13 +1267,28 @@ Related object: L =cut __PACKAGE__->has_many( - "reserves", + "reserves_borrowernumbers", "Koha::Schema::Result::Reserve", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 reviews +=head2 reserves_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "reserves_borrowernumbers", + "Koha::Schema::Result::Reserve", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 reviews_borrowernumbers Type: has_many @@ -987,13 +1297,43 @@ Related object: L =cut __PACKAGE__->has_many( - "reviews", + "reviews_borrowernumbers", "Koha::Schema::Result::Review", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 subscriptionroutinglists +=head2 reviews_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "reviews_borrowernumbers", + "Koha::Schema::Result::Review", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 subscriptionroutinglist_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "subscriptionroutinglist_borrowernumbers", + "Koha::Schema::Result::Subscriptionroutinglist", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 subscriptionroutinglist_borrowernumbers Type: has_many @@ -1002,13 +1342,13 @@ Related object: L =cut __PACKAGE__->has_many( - "subscriptionroutinglists", + "subscriptionroutinglist_borrowernumbers", "Koha::Schema::Result::Subscriptionroutinglist", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 tags_all +=head2 tags_all_borrowernumbers Type: has_many @@ -1017,13 +1357,43 @@ Related object: L =cut __PACKAGE__->has_many( - "tags_all", + "tags_all_borrowernumbers", "Koha::Schema::Result::TagAll", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 tags_approvals +=head2 tags_all_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "tags_all_borrowernumbers", + "Koha::Schema::Result::TagAll", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 tags_approvals_approved_by + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "tags_approvals_approved_by", + "Koha::Schema::Result::TagsApproval", + { "foreign.approved_by" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 tags_approvals_approved_by Type: has_many @@ -1032,13 +1402,13 @@ Related object: L =cut __PACKAGE__->has_many( - "tags_approvals", + "tags_approvals_approved_by", "Koha::Schema::Result::TagsApproval", { "foreign.approved_by" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 user_permissions +=head2 user_permissions_borrowernumbers Type: has_many @@ -1047,13 +1417,28 @@ Related object: L =cut __PACKAGE__->has_many( - "user_permissions", + "user_permissions_borrowernumbers", "Koha::Schema::Result::UserPermission", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 virtualshelfcontents +=head2 user_permissions_borrowernumbers + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "user_permissions_borrowernumbers", + "Koha::Schema::Result::UserPermission", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 virtualshelfcontents_borrowernumbers Type: has_many @@ -1062,76 +1447,113 @@ Related object: L =cut __PACKAGE__->has_many( - "virtualshelfcontents", + "virtualshelfcontents_borrowernumbers", "Koha::Schema::Result::Virtualshelfcontent", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 virtualshelfshares +=head2 virtualshelfcontents_borrowernumbers Type: has_many -Related object: L +Related object: L =cut __PACKAGE__->has_many( - "virtualshelfshares", - "Koha::Schema::Result::Virtualshelfshare", + "virtualshelfcontents_borrowernumbers", + "Koha::Schema::Result::Virtualshelfcontent", { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 virtualshelves +=head2 virtualshelfshares_borrowernumbers Type: has_many -Related object: L +Related object: L =cut __PACKAGE__->has_many( - "virtualshelves", - "Koha::Schema::Result::Virtualshelve", - { "foreign.owner" => "self.borrowernumber" }, + "virtualshelfshares_borrowernumbers", + "Koha::Schema::Result::Virtualshelfshare", + { "foreign.borrowernumber" => "self.borrowernumber" }, { cascade_copy => 0, cascade_delete => 0 }, ); -=head2 basketnoes +=head2 virtualshelfshares_borrowernumbers -Type: many_to_many +Type: has_many -Composing rels: L -> basketno +Related object: L =cut -__PACKAGE__->many_to_many("basketnoes", "aqbasketusers", "basketno"); +__PACKAGE__->has_many( + "virtualshelfshares_borrowernumbers", + "Koha::Schema::Result::Virtualshelfshare", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); -=head2 budgets +=head2 virtualshelves_owners -Type: many_to_many +Type: has_many -Composing rels: L -> budget +Related object: L =cut -__PACKAGE__->many_to_many("budgets", "aqbudgetborrowers", "budget"); +__PACKAGE__->has_many( + "virtualshelves_owners", + "Koha::Schema::Result::Virtualshelve", + { "foreign.owner" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); -=head2 courses +=head2 virtualshelves_owners -Type: many_to_many +Type: has_many -Composing rels: L -> course +Related object: L =cut -__PACKAGE__->many_to_many("courses", "course_instructors", "course"); +__PACKAGE__->has_many( + "virtualshelves_owners", + "Koha::Schema::Result::Virtualshelve", + { "foreign.owner" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); # Created by DBIx::Class::Schema::Loader v0.07039 @ 2014-12-31 14:08:18 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:mOTD/GsDpo3RPjUjTHrLRQ +sub FirstValidEmailAddress { + my ( $self ) = @_; + + return $self->email() || $self->emailpro() || $self->b_email() || q{}; +} + +sub ClubsEnrolledCount { + my ( $self ) = @_; + + return $self->club_enrollments({ date_canceled => undef })->count(); +} + +sub ClubsEnrollableCount { + 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(); + + return $self->result_source->schema->resultset('Club') + ->search( $params, { prefetch => 'club_template' } )->count(); +} -# You can replace this text with custom content, and it will be preserved on regeneration 1; diff --git a/Koha/Schema/Result/Club.pm b/Koha/Schema/Result/Club.pm new file mode 100644 index 0000000..0462d00 --- /dev/null +++ b/Koha/Schema/Result/Club.pm @@ -0,0 +1,168 @@ +package Koha::Schema::Result::Club; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + + +=head1 NAME + +Koha::Schema::Result::Club + +=cut + +__PACKAGE__->table("clubs"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_template + + 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' + is_nullable: 0 + +=head2 date_end + + data_type: 'date' + is_nullable: 1 + +=head2 branch + + data_type: 'varchar' + is_foreign_key: 1 + is_nullable: 1 + size: 11 + +=head2 date_created + + data_type: 'timestamp' + default_value: current_timestamp + is_nullable: 0 + +=head2 date_updated + + data_type: 'timestamp' + is_nullable: 1 + +=cut + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "club_template", + { 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", is_nullable => 0 }, + "date_end", + { data_type => "date", is_nullable => 1 }, + "branch", + { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 11 }, + "date_created", + { + data_type => "timestamp", + default_value => \"current_timestamp", + is_nullable => 0, + }, + "date_updated", + { data_type => "timestamp", is_nullable => 1 }, +); +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=head2 club_enrollments + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "club_enrollments", + "Koha::Schema::Result::ClubEnrollment", + { "foreign.club" => "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" => "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" }, + { on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 branch + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "branch", + "Koha::Schema::Result::Branch", + { branchcode => "branch" }, + { join_type => "LEFT", on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07000 @ 2014-05-30 09:55:12 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Y6kcTQulxM9XeOpDV+TiiQ + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; diff --git a/Koha/Schema/Result/ClubEnrollment.pm b/Koha/Schema/Result/ClubEnrollment.pm new file mode 100644 index 0000000..e456905 --- /dev/null +++ b/Koha/Schema/Result/ClubEnrollment.pm @@ -0,0 +1,167 @@ +package Koha::Schema::Result::ClubEnrollment; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + + +=head1 NAME + +Koha::Schema::Result::ClubEnrollment + +=cut + +__PACKAGE__->table("club_enrollments"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 borrower + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 date_enrolled + + data_type: 'timestamp' + default_value: current_timestamp + is_nullable: 0 + +=head2 date_canceled + + data_type: 'timestamp' + is_nullable: 1 + +=head2 date_created + + data_type: 'timestamp' + default_value: '0000-00-00 00:00:00' + is_nullable: 0 + +=head2 date_updated + + data_type: 'timestamp' + is_nullable: 1 + +=head2 branch + + 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", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "borrower", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "date_enrolled", + { + data_type => "timestamp", + default_value => \"current_timestamp", + is_nullable => 0, + }, + "date_canceled", + { data_type => "timestamp", is_nullable => 1 }, + "date_created", + { + data_type => "timestamp", + default_value => "0000-00-00 00:00:00", + is_nullable => 0, + }, + "date_updated", + { data_type => "timestamp", is_nullable => 1 }, + "branch", + { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 11 }, +); +__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_enrollment" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 club + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club", + "Koha::Schema::Result::Club", + { id => "club" }, + { on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 borrower + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "borrower", + "Koha::Schema::Result::Borrower", + { borrowernumber => "borrower" }, + { on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 branch + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "branch", + "Koha::Schema::Result::Branch", + { branchcode => "branch" }, + { join_type => "LEFT", on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07000 @ 2014-05-30 09:55:12 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:mfTpVLaQhTKJ//QnRm2f5A + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; diff --git a/Koha/Schema/Result/ClubEnrollmentField.pm b/Koha/Schema/Result/ClubEnrollmentField.pm new file mode 100644 index 0000000..73c6c41 --- /dev/null +++ b/Koha/Schema/Result/ClubEnrollmentField.pm @@ -0,0 +1,97 @@ +package Koha::Schema::Result::ClubEnrollmentField; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + + +=head1 NAME + +Koha::Schema::Result::ClubEnrollmentField + +=cut + +__PACKAGE__->table("club_enrollment_fields"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_enrollment + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 club_template_enrollment_field + + 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", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "club_template_enrollment_field", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "value", + { data_type => "text", is_nullable => 0 }, +); +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=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" }, + { on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 club_enrollment + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club_enrollment", + "Koha::Schema::Result::ClubEnrollment", + { id => "club_enrollment" }, + { on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07000 @ 2014-05-30 09:55:12 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:bOPkyazyrsDwUKKS4oHHdQ + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; diff --git a/Koha/Schema/Result/ClubField.pm b/Koha/Schema/Result/ClubField.pm new file mode 100644 index 0000000..047ff09 --- /dev/null +++ b/Koha/Schema/Result/ClubField.pm @@ -0,0 +1,127 @@ +package Koha::Schema::Result::ClubField; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + + +=head1 NAME + +Koha::Schema::Result::ClubField + +=cut + +__PACKAGE__->table("club_fields"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_template_field + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 0 + +=head2 club + + 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", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "club", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "value", + { data_type => "text", is_nullable => 1 }, +); +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=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" }, + { on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 club + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "club", + "Koha::Schema::Result::Club", + { id => "club" }, + { on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 z_clubs_rewrite_clubs + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "z_clubs_rewrite_clubs", + "Koha::Schema::Result::ZClubRewrite", + { "foreign.club" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 z_clubs_rewrite_club_template_fields + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "z_clubs_rewrite_club_template_fields", + "Koha::Schema::Result::ZClubRewrite", + { "foreign.club_template_field" => "self.club_template_field" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07000 @ 2014-05-30 09:55:12 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:B5i1BInvl7L9Mjor17Okrw + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; diff --git a/Koha/Schema/Result/ClubTemplate.pm b/Koha/Schema/Result/ClubTemplate.pm new file mode 100644 index 0000000..85f3d36 --- /dev/null +++ b/Koha/Schema/Result/ClubTemplate.pm @@ -0,0 +1,168 @@ +package Koha::Schema::Result::ClubTemplate; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + + +=head1 NAME + +Koha::Schema::Result::ClubTemplate + +=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 branch + + data_type: 'varchar' + is_foreign_key: 1 + is_nullable: 1 + size: 10 + +=head2 date_created + + data_type: 'timestamp' + default_value: current_timestamp + is_nullable: 0 + +=head2 date_updated + + data_type: 'timestamp' + 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 }, + "branch", + { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 10 }, + "date_created", + { + data_type => "timestamp", + default_value => \"current_timestamp", + is_nullable => 0, + }, + "date_updated", + { data_type => "timestamp", is_nullable => 1 }, + "is_deletable", + { data_type => "tinyint", default_value => 1, is_nullable => 0 }, +); +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=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" => "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" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +=head2 branch + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "branch", + "Koha::Schema::Result::Branch", + { branchcode => "branch" }, + { join_type => "LEFT", on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 clubs + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "clubs", + "Koha::Schema::Result::Club", + { "foreign.club_template" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07000 @ 2014-05-23 10:30:48 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:XhoCAiWRvHG5FBNhr7JEkg + +1; diff --git a/Koha/Schema/Result/ClubTemplateEnrollmentField.pm b/Koha/Schema/Result/ClubTemplateEnrollmentField.pm new file mode 100644 index 0000000..c6aa838 --- /dev/null +++ b/Koha/Schema/Result/ClubTemplateEnrollmentField.pm @@ -0,0 +1,104 @@ +package Koha::Schema::Result::ClubTemplateEnrollmentField; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + + +=head1 NAME + +Koha::Schema::Result::ClubTemplateEnrollmentField + +=cut + +__PACKAGE__->table("club_template_enrollment_fields"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_template + + 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", + { 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 }, +); +__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" => "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" }, + { on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07000 @ 2014-05-30 09:55:12 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:FO/5gEcTgdIYma9hmhXdNw + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; diff --git a/Koha/Schema/Result/ClubTemplateField.pm b/Koha/Schema/Result/ClubTemplateField.pm new file mode 100644 index 0000000..ebffa71 --- /dev/null +++ b/Koha/Schema/Result/ClubTemplateField.pm @@ -0,0 +1,104 @@ +package Koha::Schema::Result::ClubTemplateField; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + + +=head1 NAME + +Koha::Schema::Result::ClubTemplateField + +=cut + +__PACKAGE__->table("club_template_fields"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 club_template + + 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", + { 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 }, +); +__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" => "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" }, + { on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07000 @ 2014-05-23 11:09:48 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:rm9181l4mTPyIpDBQTERBQ + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; diff --git a/Koha/Template/Plugin/AuthorisedValues.pm b/Koha/Template/Plugin/AuthorisedValues.pm index 65abac7..4475b6c 100644 --- a/Koha/Template/Plugin/AuthorisedValues.pm +++ b/Koha/Template/Plugin/AuthorisedValues.pm @@ -40,6 +40,12 @@ sub GetAuthValueDropbox { return C4::Koha::GetAuthvalueDropbox($category, $default); } +sub Categories { + my ( $self ) = @_; + + return GetAuthorisedValueCategories(); +} + 1; =head1 NAME diff --git a/Koha/Template/Plugin/Borrowers.pm b/Koha/Template/Plugin/Borrowers.pm index b8f3de5..39112f7 100644 --- a/Koha/Template/Plugin/Borrowers.pm +++ b/Koha/Template/Plugin/Borrowers.pm @@ -48,4 +48,8 @@ sub IsDebarred { return Koha::Borrower::Debarments::IsDebarred($borrower->{borrowernumber}); } +sub HasValidEmailAddress { + +} + 1; diff --git a/Koha/Template/Plugin/Branches.pm b/Koha/Template/Plugin/Branches.pm index ff43a38..8d67a2f 100644 --- a/Koha/Template/Plugin/Branches.pm +++ b/Koha/Template/Plugin/Branches.pm @@ -26,6 +26,13 @@ use Encode qw{encode decode}; 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 ) = @_; diff --git a/Koha/Template/Plugin/Koha.pm b/Koha/Template/Plugin/Koha.pm index f5898b5..2e6b6cf 100644 --- a/Koha/Template/Plugin/Koha.pm +++ b/Koha/Template/Plugin/Koha.pm @@ -59,4 +59,9 @@ sub Version { }; } +sub UserEnv { + my ( $self, $key ) = @_; + my $userenv = C4::Context->userenv; + return $userenv ? $userenv->{$key} : undef; +} 1; diff --git a/circ/circulation.pl b/circ/circulation.pl index 50936d7..dd01e19 100755 --- a/circ/circulation.pl +++ b/circ/circulation.pl @@ -617,6 +617,8 @@ $template->param( picture => 1 ) if $picture; my $canned_notes = GetAuthorisedValues("BOR_NOTES"); +my $schema = Koha::Database->new()->schema(); + $template->param( debt_confirmed => $debt_confirmed, SpecifyDueDate => $duedatespec_allow, @@ -625,6 +627,7 @@ $template->param( canned_bor_notes_loop => $canned_notes, debarments => GetDebarments({ borrowernumber => $borrowernumber }), todaysdate => dt_from_string()->set(hour => 23)->set(minute => 59), + borrower => $schema->resultset('Borrower')->find( $borrowernumber ), ); output_html_with_http_headers $query, $cookie, $template->output; diff --git a/clubs/clubs-add-modify.pl b/clubs/clubs-add-modify.pl new file mode 100755 index 0000000..fefe46a --- /dev/null +++ b/clubs/clubs-add-modify.pl @@ -0,0 +1,125 @@ +#!/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); + +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 = $schema->resultset('Club')->find($id); + +my $club_template_id = + $club ? $club->club_template()->id() : $cgi->param('club_template_id'); +my $club_template = $schema->resultset('ClubTemplate')->find($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 + if ($club) { + $club->update( + { + id => $id || undef, + club_template => $cgi->param('club_template_id') || undef, + name => $cgi->param('name') || undef, + description => $cgi->param('description') || undef, + branch => $cgi->param('branchcode') || undef, + date_start => $date_start, + date_end => $date_end, + date_updated => dt_from_string(), + } + ); + } + else { + $club = $schema->resultset('Club')->create( + { + id => $id || undef, + club_template => $cgi->param('club_template_id') || undef, + name => $cgi->param('name') || undef, + description => $cgi->param('description') || undef, + branch => $cgi->param('branchcode') || undef, + date_start => $date_start, + date_end => $date_end, + date_updated => dt_from_string(), + } + ); + + } + + 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; + + if ($club_field_id) { + $schema->resultset('ClubField')->find($club_field_id)->update( + { + club => $club->id(), + club_template_field => $club_template_field_id, + value => $club_field, + } + ); + } + else { + $schema->resultset('ClubField')->create( + { + club => $club->id(), + club_template_field => $club_template_field_id, + value => $club_field, + } + ); + } + } + + $id ||= $club->id(); +} + +$club = $schema->resultset('Club')->find($id); + +$template->param( + club_template => $club_template, + club => $club, +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); diff --git a/clubs/clubs.pl b/clubs/clubs.pl new file mode 100755 index 0000000..6e68231 --- /dev/null +++ b/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::Database; + +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 $schema = Koha::Database->new()->schema(); + +my @club_templates = $schema->resultset("ClubTemplate")->all(); +my @clubs = $schema->resultset("Club")->all(); + +$template->param( + club_templates => \@club_templates, + clubs => \@clubs +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); diff --git a/clubs/patron-clubs-tab.pl b/clubs/patron-clubs-tab.pl new file mode 100755 index 0000000..2029ca9 --- /dev/null +++ b/clubs/patron-clubs-tab.pl @@ -0,0 +1,59 @@ +#!/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; + +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 $schema = Koha::Database->new()->schema(); + +my @enrollments = + $schema->resultset("ClubEnrollment") + ->search( { borrower => $borrowernumber, date_canceled => undef } ); + +my @clubs = + $schema->resultset("Club") + ->search( + { id => { -not_in => [ map { $_->club()->id() } @enrollments ] } } ); + +$template->param( + enrollments => \@enrollments, + clubs => \@clubs, + borrowernumber => $borrowernumber +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); diff --git a/clubs/patron-enroll.pl b/clubs/patron-enroll.pl new file mode 100755 index 0000000..41e7a34 --- /dev/null +++ b/clubs/patron-enroll.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::Database; + +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 $schema = Koha::Database->new()->schema(); + +my $club = $schema->resultset("Club")->find($id); + +$template->param( + club => $club, + borrowernumber => $borrowernumber, +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); diff --git a/clubs/templates-add-modify.pl b/clubs/templates-add-modify.pl new file mode 100755 index 0000000..4133257 --- /dev/null +++ b/clubs/templates-add-modify.pl @@ -0,0 +1,139 @@ +#!/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); + +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 $schema = Koha::Database->new()->schema(); + +my $club_template; + +if ( $cgi->param('name') ) { # Update or create club + $club_template = $schema->resultset('ClubTemplate')->update_or_create( + { + id => $id || undef, + name => $cgi->param('name') || undef, + description => $cgi->param('description') || undef, + branch => $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, + } + ); + + $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]; + + if ( grep( /^$field_id$/, @field_delete ) ) { + $schema->resultset('ClubTemplateField')->find($field_id)->delete(); + } + else { + $club_template = + $schema->resultset('ClubTemplateField')->update_or_create( + { + id => $field_id, + club_template => $id, + name => $field_name, + description => $field_description, + authorised_value_category => + $field_authorised_value_category, + } + ); + } + } + + # 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]; + + if ( grep( /^$field_id$/, @field_delete ) ) { + $schema->resultset('ClubTemplateEnrollmentField')->find($field_id) + ->delete(); + } + else { + $club_template = + $schema->resultset('ClubTemplateEnrollmentField') + ->update_or_create( + { + id => $field_id, + club_template => $id, + name => $field_name, + description => $field_description, + authorised_value_category => + $field_authorised_value_category, + } + ); + } + } +} + +$club_template = $schema->resultset('ClubTemplate')->find($id); +$template->param( club_template => $club_template ); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); diff --git a/installer/data/mysql/en/mandatory/userflags.sql b/installer/data/mysql/en/mandatory/userflags.sql index e727f9e..8bc2bdf 100644 --- a/installer/data/mysql/en/mandatory/userflags.sql +++ b/installer/data/mysql/en/mandatory/userflags.sql @@ -18,3 +18,4 @@ 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, 'clubs', 'Patron clubs', '0'); diff --git a/installer/data/mysql/en/mandatory/userpermissions.sql b/installer/data/mysql/en/mandatory/userpermissions.sql index 65c4bb8..f242db4 100644 --- a/installer/data/mysql/en/mandatory/userpermissions.sql +++ b/installer/data/mysql/en/mandatory/userpermissions.sql @@ -72,4 +72,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES (19, 'tool', 'Use tool plugins'), (19, 'report', 'Use report plugins'), (19, 'configure', 'Configure plugins') + (20, 'edit_templates', 'Create and update club templates'), + (20, 'edit_clubs', 'Create and update clubs'), + (20, 'enroll', 'Enroll patrons in clubs') ; diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 1f22106..493c671 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -3502,6 +3502,180 @@ CREATE TABLE items_search_fields ( ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- +-- Table structure for table 'clubs' +-- + +CREATE TABLE clubs ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + date_start date DEFAULT NULL, + date_end date DEFAULT NULL, + branch varchar(11) DEFAULT NULL, + date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_updated timestamp NULL DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template (club_template), + KEY branch (branch) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table 'club_enrollments' +-- + +CREATE TABLE club_enrollments ( + id int(11) NOT NULL AUTO_INCREMENT, + club int(11) NOT NULL, + borrower 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, + branch varchar(11) DEFAULT NULL, + PRIMARY KEY (id), + KEY club (club), + KEY borrower (borrower), + KEY branch (branch) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table 'club_enrollment_fields' +-- + +CREATE TABLE club_enrollment_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_enrollment int(11) NOT NULL, + club_template_enrollment_field int(11) NOT NULL, + `value` text NOT NULL, + PRIMARY KEY (id), + KEY club_enrollment (club_enrollment), + KEY club_template_enrollment_field (club_template_enrollment_field), + KEY club_template_enrollment_field_2 (club_template_enrollment_field) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table 'club_fields' +-- + +CREATE TABLE club_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template_field int(11) NOT NULL, + club int(11) NOT NULL, + `value` text, + PRIMARY KEY (id), + KEY club_template_field (club_template_field,club), + KEY club (club) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table 'club_templates' +-- + +CREATE TABLE 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', + branch varchar(10) CHARACTER SET utf8 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 branch (branch) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table 'club_template_enrollment_fields' +-- + +CREATE TABLE club_template_enrollment_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + authorised_value_category varchar(16) DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template (club_template), + KEY club_template_2 (club_template) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table 'club_template_fields' +-- + +CREATE TABLE club_template_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + authorised_value_category varchar(16) DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template (club_template) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Constraints for table `clubs` +-- +ALTER TABLE `clubs` +ADD CONSTRAINT clubs_ibfk_1 FOREIGN KEY (club_template) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE, +ADD CONSTRAINT clubs_ibfk_2 FOREIGN KEY (branch) REFERENCES branches (branchcode); + +-- +-- Constraints for table `club_enrollments` +-- +ALTER TABLE `club_enrollments` +ADD CONSTRAINT club_enrollments_ibfk_1 FOREIGN KEY (club) REFERENCES clubs (id) ON DELETE CASCADE ON UPDATE CASCADE, +ADD CONSTRAINT club_enrollments_ibfk_2 FOREIGN KEY (borrower) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE, +ADD CONSTRAINT club_enrollments_ibfk_3 FOREIGN KEY (branch) REFERENCES branches (branchcode) ON DELETE SET NULL ON UPDATE CASCADE; + +-- +-- Constraints for table `club_enrollment_fields` +-- +ALTER TABLE `club_enrollment_fields` +ADD CONSTRAINT club_enrollment_fields_ibfk_1 FOREIGN KEY (club_enrollment) REFERENCES club_enrollments (id) ON DELETE CASCADE ON UPDATE CASCADE, +ADD CONSTRAINT club_enrollment_fields_ibfk_2 FOREIGN KEY (club_template_enrollment_field) REFERENCES club_template_enrollment_fields (id) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Constraints for table `club_fields` +-- +ALTER TABLE `club_fields` +ADD CONSTRAINT club_fields_ibfk_3 FOREIGN KEY (club_template_field) REFERENCES club_template_fields (id) ON DELETE CASCADE ON UPDATE CASCADE, +ADD CONSTRAINT club_fields_ibfk_4 FOREIGN KEY (club) REFERENCES clubs (id) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Constraints for table `club_templates` +-- +ALTER TABLE `club_templates` +ADD CONSTRAINT club_templates_ibfk_1 FOREIGN KEY (branch) REFERENCES branches (branchcode) ON DELETE SET NULL ON UPDATE CASCADE; + +-- +-- Constraints for table `club_template_enrollment_fields` +-- +ALTER TABLE `club_template_enrollment_fields` +ADD CONSTRAINT club_template_enrollment_fields_ibfk_1 FOREIGN KEY (club_template) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Constraints for table `club_template_fields` +-- +ALTER TABLE `club_template_fields` +ADD CONSTRAINT club_template_fields_ibfk_1 FOREIGN KEY (club_template) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE; + +>>>>>>> Bug 12461 - Add patron clubs feature /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index d2b03c3..bb42432 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -9656,6 +9656,155 @@ if(CheckVersion($DBversion)) { SetVersion($DBversion); } +$DBversion = "3.19.00.XXX"; +if ( CheckVersion($DBversion) ) { + $dbh->do("INSERT INTO userflags (bit, flag, flagdesc, defaulton) VALUES ('20', 'clubs', 'Patron clubs', '0')"); + + $dbh->do(" + CREATE TABLE clubs ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + date_start date DEFAULT NULL, + date_end date DEFAULT NULL, + branch varchar(11) DEFAULT NULL, + date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + date_updated timestamp NULL DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template (club_template), + KEY branch (branch) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + "); + + $dbh->do(" + CREATE TABLE club_enrollments ( + id int(11) NOT NULL AUTO_INCREMENT, + club int(11) NOT NULL, + borrower 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, + branch varchar(11) DEFAULT NULL, + PRIMARY KEY (id), + KEY club (club), + KEY borrower (borrower), + KEY branch (branch) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + "); + + $dbh->do(" + CREATE TABLE club_enrollment_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_enrollment int(11) NOT NULL, + club_template_enrollment_field int(11) NOT NULL, + `value` text NOT NULL, + PRIMARY KEY (id), + KEY club_enrollment (club_enrollment), + KEY club_template_enrollment_field (club_template_enrollment_field), + KEY club_template_enrollment_field_2 (club_template_enrollment_field) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + "); + + $dbh->do(" + CREATE TABLE club_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template_field int(11) NOT NULL, + club int(11) NOT NULL, + `value` text, + PRIMARY KEY (id), + KEY club_template_field (club_template_field,club), + KEY club (club) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + "); + + $dbh->do(" + CREATE TABLE 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', + branch varchar(10) CHARACTER SET utf8 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 branch (branch) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT; + "); + + $dbh->do(" + CREATE TABLE club_template_enrollment_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + authorised_value_category varchar(16) DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template (club_template), + KEY club_template_2 (club_template) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + "); + + $dbh->do(" + CREATE TABLE club_template_fields ( + id int(11) NOT NULL AUTO_INCREMENT, + club_template int(11) NOT NULL, + `name` tinytext NOT NULL, + description text, + authorised_value_category varchar(16) DEFAULT NULL, + PRIMARY KEY (id), + KEY club_template (club_template) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + "); + + $dbh->do(" + ALTER TABLE `clubs` + ADD CONSTRAINT clubs_ibfk_1 FOREIGN KEY (club_template) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT clubs_ibfk_2 FOREIGN KEY (branch) REFERENCES branches (branchcode); + "); + + $dbh->do(" + ALTER TABLE `club_enrollments` + ADD CONSTRAINT club_enrollments_ibfk_1 FOREIGN KEY (club) REFERENCES clubs (id) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT club_enrollments_ibfk_2 FOREIGN KEY (borrower) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT club_enrollments_ibfk_3 FOREIGN KEY (branch) REFERENCES branches (branchcode) ON DELETE SET NULL ON UPDATE CASCADE; + "); + + $dbh->do(" + ALTER TABLE `club_enrollment_fields` + ADD CONSTRAINT club_enrollment_fields_ibfk_1 FOREIGN KEY (club_enrollment) REFERENCES club_enrollments (id) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT club_enrollment_fields_ibfk_2 FOREIGN KEY (club_template_enrollment_field) REFERENCES club_template_enrollment_fields (id) ON DELETE CASCADE ON UPDATE CASCADE; + "); + + $dbh->do(" + ALTER TABLE `club_fields` + ADD CONSTRAINT club_fields_ibfk_3 FOREIGN KEY (club_template_field) REFERENCES club_template_fields (id) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT club_fields_ibfk_4 FOREIGN KEY (club) REFERENCES clubs (id) ON DELETE CASCADE ON UPDATE CASCADE; + "); + + $dbh->do(" + ALTER TABLE `club_templates` + ADD CONSTRAINT club_templates_ibfk_1 FOREIGN KEY (branch) REFERENCES branches (branchcode) ON DELETE SET NULL ON UPDATE CASCADE; + "); + + $dbh->do(" + ALTER TABLE `club_template_enrollment_fields` + ADD CONSTRAINT club_template_enrollment_fields_ibfk_1 FOREIGN KEY (club_template) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE; + "); + + $dbh->do(" + ALTER TABLE `club_template_fields` + ADD CONSTRAINT club_template_fields_ibfk_1 FOREIGN KEY (club_template) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE; + "); + + print "Upgrade to $DBversion done (Bug 12461 - Add patron clubs feature)\n"; + SetVersion ($DBversion); +>>>>>>> Bug 12461 - Add patron clubs feature +} + =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt index 6963c90..67c4e93 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -69,6 +69,11 @@ $(document).ready(function() { [% IF !( CircAutoPrintQuickSlip == 'clear' ) %] + $('#clubs-tab-link').on('click', function() { + $('#clubs-tab').text(_("Loading...")); + $('#clubs-tab').load('/cgi-bin/koha/clubs/patron-clubs-tab.pl?borrowernumber=[% borrowernumber %]'); + }); + // listen submit to trigger qslip on empty checkout $('#mainform').bind('submit',function() { if ($('#barcode').val() == '') { @@ -772,6 +777,14 @@ No patron matched [% message %] [% END %] + [% IF CAN_user_clubs && ( borrower.ClubsEnrolledCount || borrower.ClubsEnrollableCount ) %] +
  • + + Clubs ([% borrower.ClubsEnrolledCount %]/[% borrower.ClubsEnrollableCount %]) + +
  • + [% END %] + [% IF relatives_issues_count %]
  • Relatives' checkouts
  • [% END %] @@ -812,6 +825,12 @@ No patron matched [% message %] [% END %] +[% IF CAN_user_clubs %] +
    + Loading... +
    +[% END %] + [% INCLUDE borrower_debarments.inc %]
    diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs-add-modify.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs-add-modify.tt new file mode 100644 index 0000000..a0fa8f3 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs-add-modify.tt @@ -0,0 +1,136 @@ +[% USE KohaDates %] +[% USE EncodeUTF8 %] +[% 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 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' %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs.tt new file mode 100644 index 0000000..31eecf2 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs.tt @@ -0,0 +1,206 @@ +[% USE EncodeUTF8 %] +[% 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 requiredBranch  
    [% t.name | $EncodeUTF8 %][% t.description | $EncodeUTF8 %] + [% IF t.is_enrollable_from_opac %] + Yes + [% ELSE %] + No + [% END %] + + [% IF t.is_email_required %] + Yes + [% ELSE %] + No + [% END %] + [% t.branch.branchname | $EncodeUTF8 %] + [% IF CAN_user_clubs_edit_templates && t.is_deletable && ( CAN_user_superlibrarian || t.branch.branchcode == Koha.UserEnv('branch') ) %] + + Edit + + [% END %] + + [% IF CAN_user_clubs_edit_templates && t.is_deletable && ( CAN_user_superlibrarian || t.branch.branchcode == Koha.UserEnv('branch') ) %] + + Delete + + [% END %] +
    + +

    Clubs

    + + [% IF CAN_user_clubs_edit_clubs %] +
    +
    + + +
    +
    + [% END %] + + + + + + + + + + + + + + + + + [% FOREACH c IN clubs %] + + + + + + + + + + + [% END %] + +
    NameTemplateDescriptionPublic enrollmentEmail requiredBranch  
    [% c.name | $EncodeUTF8 %][% c.club_template.name | $EncodeUTF8 %][% c.description | $EncodeUTF8 %] + [% IF c.club_template.is_enrollable_from_opac %] + Yes + [% ELSE %] + No + [% END %] + + [% IF c.club_template.is_email_required %] + Yes + [% ELSE %] + No + [% END %] + [% c.branch.branchname | $EncodeUTF8 %] + [% IF CAN_user_clubs_edit_clubs && ( CAN_user_superlibrarian || c.branch.branchcode == Koha.UserEnv('branch') ) %] + + Edit + + [% END %] + + [% IF CAN_user_clubs_edit_clubs && ( CAN_user_superlibrarian || c.branch.branchcode == Koha.UserEnv('branch') ) %] + + Delete + + [% END %] +
    +
    +
    +[% INCLUDE 'intranet-bottom.inc' %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-clubs-tab.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-clubs-tab.tt new file mode 100644 index 0000000..6365728 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-clubs-tab.tt @@ -0,0 +1,103 @@ +[% USE EncodeUTF8 %] +[% 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 | $EncodeUTF8 %][% e.club.description | $EncodeUTF8 %][% 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 | $EncodeUTF8 %][% c.description | $EncodeUTF8 %] + + Enroll + +
    +[% END %] + +[% IF CAN_user_clubs_enroll %] + +[% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-enroll.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-enroll.tt new file mode 100644 index 0000000..cd105b8 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-enroll.tt @@ -0,0 +1,67 @@ +[% USE EncodeUTF8 %] +[% USE AuthorisedValues %] +[% SET AuthorisedValuesCategories = AuthorisedValues.Categories %] + +

    + Enroll in [% club.name | $EncodeUTF8 %] +

    + +
    +
    + + +
    +
      + [% 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. +
    +
    +
    +
    + + diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/templates-add-modify.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/templates-add-modify.tt new file mode 100644 index 0000000..46df57d --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/templates-add-modify.tt @@ -0,0 +1,252 @@ +[% USE EncodeUTF8 %] +[% 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 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' %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt index 8ebd31f..a5ec833 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt @@ -42,6 +42,11 @@ var MSG_ADD_MESSAGE = _("Add a new message"); var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export"); $(document).ready(function() { + $('#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 @@ -424,6 +429,13 @@ function validate1(date) { [% END %]
  • [% debarments.size %] Restrictions
  • + [% IF CAN_user_clubs && ( borrower.ClubsEnrolledCount || borrower.ClubsEnrollableCount ) %] +
  • + + Clubs ([% borrower.ClubsEnrolledCount %]/[% borrower.ClubsEnrollableCount %]) + +
  • + [% END %] [% INCLUDE "checkouts-table.inc" %] @@ -456,6 +468,10 @@ function validate1(date) { [% END %]
    +
    + Loading... +
    + [% INCLUDE borrower_debarments.inc %]
    diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt index a87857c..e69ad03 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt @@ -15,6 +15,11 @@

    Patrons and circulation

    + [% IF CAN_user_clubs_edit_clubs || CAN_user_clubs_edit_templates %] +
    Patron clubs +
    Manage patrons clubs.
    + [% END %] + [% IF (CAN_user_tools_manage_patron_lists) %]
    Patron lists
    Manage lists of patrons.
    diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/clubs-tab.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/clubs-tab.tt new file mode 100644 index 0000000..ef9f600 --- /dev/null +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/clubs-tab.tt @@ -0,0 +1,103 @@ +[% USE EncodeUTF8 %] +[% 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 | $EncodeUTF8 %][% e.club.description | $EncodeUTF8 %][% e.date_enrolled | $KohaDates %] + + Cancel + +
    +[% END %] + +[% IF clubs %] + + + + + + + + + + + + + + [% FOREACH c IN clubs %] + + + + + + [% END %] + +
    + Clubs you can enroll in +
    NameDescription 
    [% c.name | $EncodeUTF8 %][% c.description | $EncodeUTF8 %] + [% IF borrower.FirstValidEmailAddress %] + + Enroll + + [% ELSE %] + You must have an email address to enroll + [% END %] +
    +[% END %] + + diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/enroll.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/enroll.tt new file mode 100644 index 0000000..bcdf610 --- /dev/null +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/enroll.tt @@ -0,0 +1,67 @@ +[% USE EncodeUTF8 %] +[% USE AuthorisedValues %] +[% SET AuthorisedValuesCategories = AuthorisedValues.Categories %] + +

    + Enroll in [% club.name | $EncodeUTF8 %] +

    + +
    +
    + + +
    +
      + [% 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. +
    +
    +
    +
    + + diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt index f4cbddb..c25b47b 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt @@ -111,6 +111,14 @@ [% IF ( BORROWER_INF.amountlessthanzero ) %]
  • Credits ([% BORROWER_INF.amountoutstanding %])
  • [% END %] [% END %] [% IF ( waiting_count ) %][% IF ( BORROWER_INF.atdestination ) %]
  • Waiting ([% waiting_count %])
  • [% END %][% END %] + [% IF borrower.ClubsEnrolledCount || borrower.ClubsEnrollableCount %] +
  • + + Clubs ([% borrower.ClubsEnrolledCount %]/[% borrower.ClubsEnrollableCount %]) + +
  • + [% END %] + [% IF ( reserves_count ) %]
  • Holds ([% reserves_count %])
  • [% END %] @@ -280,6 +288,10 @@ [% END # IF issues_count %]
    +
    + Loading... +
    + [% IF ( OPACFinesTab ) %] [% IF ( BORROWER_INF.amountoverfive ) %] @@ -727,6 +739,11 @@ [% END %] $( ".suspend-until" ).datepicker({ minDate: 1 }); // Require that "until date" be in the future + + $('#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 %]'); + }); }); //]]> diff --git a/members/moremember.pl b/members/moremember.pl index 1735e02..e3802cc 100755 --- a/members/moremember.pl +++ b/members/moremember.pl @@ -355,6 +355,8 @@ if (C4::Context->preference('EnhancedMessagingPreferences')) { # Computes full borrower address my $address = $data->{'streetnumber'} . " $roadtype " . $data->{'address'}; +my $schema = Koha::Database->new()->schema(); + # in template => instutitional (A for Adult, C for children) $template->param( $data->{'categorycode'} => 1 ); $template->param( @@ -385,6 +387,7 @@ $template->param( relatives_issues_count => $relatives_issues_count, relatives_borrowernumbers => \@relatives, address => $address + borrower => $schema->resultset('Borrower')->find( $borrowernumber ), ); output_html_with_http_headers $input, $cookie, $template->output; diff --git a/opac/clubs/clubs-tab.pl b/opac/clubs/clubs-tab.pl new file mode 100755 index 0000000..812fbf4 --- /dev/null +++ b/opac/clubs/clubs-tab.pl @@ -0,0 +1,67 @@ +#!/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; + +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 $schema = Koha::Database->new()->schema(); + +my $borrower = $schema->resultset('Borrower')->find($borrowernumber); + +my @enrollments = $schema->resultset("ClubEnrollment")->search( + { + borrower => $borrowernumber, + date_canceled => undef, + }, + { prefetch => 'club' } +); + +my @clubs = $schema->resultset("Club")->search( + { + 'me.id' => { -not_in => [ map { $_->club()->id() } @enrollments ] }, + 'club_template.is_enrollable_from_opac' => 1, + }, + { prefetch => 'club_template' } +); + +$template->param( + enrollments => \@enrollments, + clubs => \@clubs, + borrower => $borrower, +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); diff --git a/opac/clubs/enroll.pl b/opac/clubs/enroll.pl new file mode 100755 index 0000000..cebd9d6 --- /dev/null +++ b/opac/clubs/enroll.pl @@ -0,0 +1,51 @@ +#!/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; + +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 $schema = Koha::Database->new()->schema(); + +my $club = $schema->resultset("Club")->find($id); + +$template->param( + club => $club, + borrowernumber => $borrowernumber, +); + +output_html_with_http_headers( $cgi, $cookie, $template->output ); diff --git a/opac/opac-user.pl b/opac/opac-user.pl index ad4f339..9c000b9 100755 --- a/opac/opac-user.pl +++ b/opac/opac-user.pl @@ -36,6 +36,9 @@ use C4::Letters; use C4::Branch; # GetBranches use Koha::DateUtils; use Koha::Borrower::Debarments qw(IsDebarred); +use Koha::Database; + +my $schema = Koha::Database->new()->schema(); use constant ATTRIBUTE_SHOW_BARCODE => 'SHOW_BCODE'; @@ -388,12 +391,10 @@ $template->param( patronupdate => $patronupdate, OpacRenewalAllowed => C4::Context->preference("OpacRenewalAllowed"), userview => 1, -); - -$template->param( SuspendHoldsOpac => C4::Context->preference('SuspendHoldsOpac'), AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds'), OpacHoldNotes => C4::Context->preference('OpacHoldNotes'), + borrower => $schema->resultset('Borrower')->find($borrowernumber), ); output_html_with_http_headers $query, $cookie, $template->output; diff --git a/opac/svc/club/cancel_enrollment b/opac/svc/club/cancel_enrollment new file mode 100755 index 0000000..4f11559 --- /dev/null +++ b/opac/svc/club/cancel_enrollment @@ -0,0 +1,52 @@ +#!/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::Database; + +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 $schema = Koha::Database->new()->schema(); + +my $enrollment = $schema->resultset('ClubEnrollment')->find($id); + +if ( $enrollment && $enrollment->get_column('borrower') == $borrowernumber ) { + $enrollment->update( { date_canceled => \'NOW()' } ); +} + +binmode STDOUT, ':encoding(UTF-8)'; +print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' ); + +print to_json( { success => $enrollment ? 1 : 0 } ); diff --git a/opac/svc/club/enroll b/opac/svc/club/enroll new file mode 100755 index 0000000..0569872 --- /dev/null +++ b/opac/svc/club/enroll @@ -0,0 +1,79 @@ +#!/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::Database; + +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 $schema = Koha::Database->new()->schema(); + + my $club = $schema->resultset('Club')->find($id); + + if ( $club->club_template()->is_enrollable_from_opac() ) { + $enrollment = $schema->resultset('ClubEnrollment')->create( + { + club => $club->id(), + borrower => $borrowernumber, + date_enrolled => \'NOW()', + date_created => \'NOW()', + branch => C4::Context->userenv + ? C4::Context->userenv->{'branch'} + : undef, + } + ); + + my @enrollment_fields = + $club->club_template()->club_template_enrollment_fields(); + + foreach my $e (@enrollment_fields) { + my $club_enrollment_field = + $schema->resultset('ClubEnrollmentField')->create( + { + club_enrollment => $enrollment->id(), + club_template_enrollment_field => $e->id(), + value => $cgi->param( $e->id() ), + } + ); + } + } +} + +binmode STDOUT, ':encoding(UTF-8)'; +print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' ); + +print to_json( { success => $enrollment ? 1 : 0 } ); diff --git a/svc/club/cancel_enrollment b/svc/club/cancel_enrollment new file mode 100755 index 0000000..9b9326c --- /dev/null +++ b/svc/club/cancel_enrollment @@ -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::Database; + +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 $schema = Koha::Database->new()->schema(); + +my $enrollment = + $schema->resultset('ClubEnrollment')->find($id) + ->update( { date_canceled => \'NOW()' } ); + +binmode STDOUT, ':encoding(UTF-8)'; +print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' ); + +print to_json( { success => $enrollment ? 1 : 0 } ); diff --git a/svc/club/delete b/svc/club/delete new file mode 100755 index 0000000..6c3f882 --- /dev/null +++ b/svc/club/delete @@ -0,0 +1,50 @@ +#!/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::Database; + +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::Database->new()->schema()->resultset('Club')->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 } ); diff --git a/svc/club/enroll b/svc/club/enroll new file mode 100755 index 0000000..7c67031 --- /dev/null +++ b/svc/club/enroll @@ -0,0 +1,78 @@ +#!/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::Database; + +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 $schema = Koha::Database->new()->schema(); + +my $club = $schema->resultset('Club')->find($id); + +my $enrollment; +if ($club) { + $enrollment = $schema->resultset('ClubEnrollment')->create( + { + club => $club->id(), + borrower => $borrowernumber, + date_enrolled => \'NOW()', + date_created => \'NOW()', + branch => C4::Context->userenv + ? C4::Context->userenv->{'branch'} + : undef, + } + ); + + if ($enrollment) { + my @enrollment_fields = + $club->club_template()->club_template_enrollment_fields(); + + foreach my $e (@enrollment_fields) { + my $club_enrollment_field = + $schema->resultset('ClubEnrollmentField')->create( + { + club_enrollment => $enrollment->id(), + club_template_enrollment_field => $e->id(), + value => $cgi->param( $e->id() ), + } + ); + } + } +} + +binmode STDOUT, ':encoding(UTF-8)'; +print $cgi->header( -type => 'text/plain', -charset => 'UTF-8' ); + +print to_json( { success => $enrollment ? 1 : 0 } ); diff --git a/svc/club/template/delete b/svc/club/template/delete new file mode 100755 index 0000000..2b0ab20 --- /dev/null +++ b/svc/club/template/delete @@ -0,0 +1,50 @@ +#!/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::Database; + +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::Database->new()->schema()->resultset('ClubTemplate')->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 } ); -- 1.7.2.5