@@ -, +, @@ * Here you can add fields that can be filled out at the time a new club is created based on the template, or a new enrollment is created for a given club based on the template. --- C4/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 --- a/C4/Members.pm +++ a/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 --- a/Koha/Schema/Result/Borrower.pm +++ a/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; --- a/Koha/Schema/Result/Club.pm +++ a/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; --- a/Koha/Schema/Result/ClubEnrollment.pm +++ a/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; --- a/Koha/Schema/Result/ClubEnrollmentField.pm +++ a/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; --- a/Koha/Schema/Result/ClubField.pm +++ a/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; --- a/Koha/Schema/Result/ClubTemplate.pm +++ a/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; --- a/Koha/Schema/Result/ClubTemplateEnrollmentField.pm +++ a/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; --- a/Koha/Schema/Result/ClubTemplateField.pm +++ a/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; --- a/Koha/Template/Plugin/AuthorisedValues.pm +++ a/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 --- a/Koha/Template/Plugin/Borrowers.pm +++ a/Koha/Template/Plugin/Borrowers.pm @@ -48,4 +48,8 @@ sub IsDebarred { return Koha::Borrower::Debarments::IsDebarred($borrower->{borrowernumber}); } +sub HasValidEmailAddress { + +} + 1; --- a/Koha/Template/Plugin/Branches.pm +++ a/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 ) = @_; --- a/Koha/Template/Plugin/Koha.pm +++ a/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; --- a/circ/circulation.pl +++ a/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; --- a/clubs/clubs-add-modify.pl +++ a/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 ); --- a/clubs/clubs.pl +++ a/clubs/clubs.pl @@ -0,0 +1,50 @@ +#!/usr/bin/perl + +# Copyright 2013 ByWater Solutions +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use CGI; + +use C4::Auth; +use C4::Output; +use Koha::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 ); --- a/clubs/patron-clubs-tab.pl +++ a/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 ); --- a/clubs/patron-enroll.pl +++ a/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 ); --- a/clubs/templates-add-modify.pl +++ a/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 ); --- a/installer/data/mysql/en/mandatory/userflags.sql +++ a/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'); --- a/installer/data/mysql/en/mandatory/userpermissions.sql +++ a/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') ; --- a/installer/data/mysql/kohastructure.sql +++ a/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 */; --- a/installer/data/mysql/updatedatabase.pl +++ a/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) --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ a/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 %]
    --- a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs-add-modify.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs-add-modify.tt @@ -0,0 +1,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' %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/clubs.tt @@ -0,0 +1,206 @@ +[% USE 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' %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-clubs-tab.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-clubs-tab.tt @@ -0,0 +1,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 %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-enroll.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/patron-enroll.tt @@ -0,0 +1,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. +
    +
    +
    +
    + + --- a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/templates-add-modify.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/clubs/templates-add-modify.tt @@ -0,0 +1,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' %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt +++ a/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 %]
    --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt +++ a/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.
    --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/clubs-tab.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/clubs-tab.tt @@ -0,0 +1,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 %] + + --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/enroll.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/clubs/enroll.tt @@ -0,0 +1,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. +
    +
    +
    +
    + + --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt +++ a/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 %]'); + }); }); //]]> --- a/members/moremember.pl +++ a/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; --- a/opac/clubs/clubs-tab.pl +++ a/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 ); --- a/opac/clubs/enroll.pl +++ a/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 ); --- a/opac/opac-user.pl +++ a/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; --- a/opac/svc/club/cancel_enrollment +++ a/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 } ); --- a/opac/svc/club/enroll +++ a/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 } ); --- a/svc/club/cancel_enrollment +++ a/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 } ); --- a/svc/club/delete +++ a/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 } ); --- a/svc/club/enroll +++ a/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 } ); --- a/svc/club/template/delete +++ a/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 } ); --