From d795d7c7518f3acccbaaf378ad59fb111d199bcb Mon Sep 17 00:00:00 2001
From: Kyle M Hall <kyle@bywatersolutions.com>
Date: Thu, 5 Dec 2013 07:35:00 -0500
Subject: [PATCH] Bug 6254 - can't set patron privacy by default

There is currently no way to set the privacy setting for newly created
patrons. This patch adds a new field "default privacy" to the patron
categories such that each patron category may have a different default
privacy setting.

Test Plan:
1) Apply this patch
2) Edit a patron category, change the default privacy to "forever"
3) Create a new patron of that category
4) Log into the catalog as that patron, verify the privacy setting
   is set to "forever"
5) Repeat steps 2-4 with the settings "never" and "default"
---
 C4/Members.pm                                      |   10 ++++
 Koha/Schema/Result/Category.pm                     |   44 ++++++++---------
 admin/categorie.pl                                 |   49 ++++++++++---------
 installer/data/mysql/kohastructure.sql             |    1 +
 installer/data/mysql/updatedatabase.pl             |    7 +++
 .../prog/en/modules/admin/categorie.tt             |   20 ++++++++
 6 files changed, 85 insertions(+), 46 deletions(-)

diff --git a/C4/Members.pm b/C4/Members.pm
index b04cc64..06e5c34 100644
--- a/C4/Members.pm
+++ b/C4/Members.pm
@@ -41,6 +41,7 @@ use Koha::DateUtils;
 use Koha::Borrower::Debarments qw(IsDebarred);
 use Text::Unaccent qw( unac_string );
 use Koha::AuthUtils qw(hash_password);
+use Koha::Database;
 
 our ($VERSION,@ISA,@EXPORT,@EXPORT_OK,$debug);
 
@@ -807,6 +808,15 @@ sub AddMember {
         $data{'dateenrolled'} = C4::Dates->new()->output("iso");
     }
 
+    my $patron_category =
+      Koha::Database->new()->schema()->resultset('Category')
+      ->find( $data{'categorycode'} );
+    $data{'privacy'} =
+        $patron_category->default_privacy() eq 'default' ? 1
+      : $patron_category->default_privacy() eq 'never'   ? 2
+      : $patron_category->default_privacy() eq 'forever' ? 0
+      :                                                    undef;
+
     # create a disabled account if no password provided
     $data{'password'} = ($data{'password'})? hash_password($data{'password'}) : '!';
     $data{'borrowernumber'}=InsertInTable("borrowers",\%data);
diff --git a/Koha/Schema/Result/Category.pm b/Koha/Schema/Result/Category.pm
index 12ac12f..b6de4b9 100644
--- a/Koha/Schema/Result/Category.pm
+++ b/Koha/Schema/Result/Category.pm
@@ -1,21 +1,17 @@
-use utf8;
 package Koha::Schema::Result::Category;
 
 # Created by DBIx::Class::Schema::Loader
 # DO NOT MODIFY THE FIRST PART OF THIS FILE
 
-=head1 NAME
-
-Koha::Schema::Result::Category
-
-=cut
-
 use strict;
 use warnings;
 
 use base 'DBIx::Class::Core';
 
-=head1 TABLE: C<categories>
+
+=head1 NAME
+
+Koha::Schema::Result::Category
 
 =cut
 
@@ -43,7 +39,6 @@ __PACKAGE__->table("categories");
 =head2 enrolmentperioddate
 
   data_type: 'date'
-  datetime_undef_if_invalid: 1
   is_nullable: 1
 
 =head2 upperagelimit
@@ -102,6 +97,13 @@ __PACKAGE__->table("categories");
   is_nullable: 0
   size: 1
 
+=head2 default_privacy
+
+  data_type: 'enum'
+  default_value: 'default'
+  extra: {list => ["default","never","forever"]}
+  is_nullable: 0
+
 =cut
 
 __PACKAGE__->add_columns(
@@ -112,7 +114,7 @@ __PACKAGE__->add_columns(
   "enrolmentperiod",
   { data_type => "smallint", is_nullable => 1 },
   "enrolmentperioddate",
-  { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 1 },
+  { data_type => "date", is_nullable => 1 },
   "upperagelimit",
   { data_type => "smallint", is_nullable => 1 },
   "dateofbirthrequired",
@@ -133,18 +135,14 @@ __PACKAGE__->add_columns(
   { data_type => "tinyint", default_value => 0, is_nullable => 0 },
   "category_type",
   { data_type => "varchar", default_value => "A", is_nullable => 0, size => 1 },
+  "default_privacy",
+  {
+    data_type => "enum",
+    default_value => "default",
+    extra => { list => ["default", "never", "forever"] },
+    is_nullable => 0,
+  },
 );
-
-=head1 PRIMARY KEY
-
-=over 4
-
-=item * L</categorycode>
-
-=back
-
-=cut
-
 __PACKAGE__->set_primary_key("categorycode");
 
 =head1 RELATIONS
@@ -225,8 +223,8 @@ __PACKAGE__->might_have(
 );
 
 
-# Created by DBIx::Class::Schema::Loader v0.07025 @ 2013-10-14 20:56:21
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:lert5/PnaztNZ9rmoGc2Gg
+# Created by DBIx::Class::Schema::Loader v0.07000 @ 2013-12-05 08:14:03
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:fQEm4xRLHEY1L2/KqCzi0Q
 
 
 # You can replace this text with custom content, and it will be preserved on regeneration
diff --git a/admin/categorie.pl b/admin/categorie.pl
index 952ef7a..abd73f8 100755
--- a/admin/categorie.pl
+++ b/admin/categorie.pl
@@ -94,7 +94,7 @@ if ($op eq 'add_form') {
     my @selected_branches;
 	if ($categorycode) {
 		my $dbh = C4::Context->dbh;
-		my $sth=$dbh->prepare("select categorycode,description,enrolmentperiod,enrolmentperioddate,upperagelimit,dateofbirthrequired,enrolmentfee,issuelimit,reservefee,hidelostitems,overduenoticerequired,category_type from categories where categorycode=?");
+        my $sth=$dbh->prepare("SELECT * FROM categories WHERE categorycode = ?");
 		$sth->execute($categorycode);
 		$data=$sth->fetchrow_hashref;
 
@@ -119,22 +119,27 @@ if ($op eq 'add_form') {
         };
     }
 
-	$template->param(description        => $data->{'description'},
-				enrolmentperiod         => $data->{'enrolmentperiod'},
-				enrolmentperioddate     => C4::Dates::format_date($data->{'enrolmentperioddate'}),
-				upperagelimit           => $data->{'upperagelimit'},
-				dateofbirthrequired     => $data->{'dateofbirthrequired'},
-				enrolmentfee            => sprintf("%.2f",$data->{'enrolmentfee'}),
-				overduenoticerequired   => $data->{'overduenoticerequired'},
-				issuelimit              => $data->{'issuelimit'},
-				reservefee              => sprintf("%.2f",$data->{'reservefee'}),
-                                hidelostitems           => $data->{'hidelostitems'},
-				category_type           => $data->{'category_type'},
-                SMSSendDriver => C4::Context->preference("SMSSendDriver"),
-                TalkingTechItivaPhone => C4::Context->preference("TalkingTechItivaPhoneNotification"),
-				"type_".$data->{'category_type'} => 1,
-                branches_loop           => \@branches_loop,
-				);
+    $template->param(
+        description           => $data->{'description'},
+        upperagelimit         => $data->{'upperagelimit'},
+        dateofbirthrequired   => $data->{'dateofbirthrequired'},
+        enrolmentfee          => sprintf( "%.2f", $data->{'enrolmentfee'} ),
+        overduenoticerequired => $data->{'overduenoticerequired'},
+        issuelimit            => $data->{'issuelimit'},
+        reservefee            => sprintf( "%.2f", $data->{'reservefee'} ),
+        hidelostitems         => $data->{'hidelostitems'},
+        category_type         => $data->{'category_type'},
+        SMSSendDriver         => C4::Context->preference("SMSSendDriver"),
+        branches_loop         => \@branches_loop,
+        default_privacy       => $data->{'default_privacy'},
+        enrolmentperiod       => $data->{'enrolmentperiod'},
+        enrolmentperioddate =>
+          C4::Dates::format_date( $data->{'enrolmentperioddate'} ),
+        TalkingTechItivaPhone =>
+          C4::Context->preference("TalkingTechItivaPhoneNotification"),
+        "type_" . $data->{'category_type'} => 1,
+    );
+
     if (C4::Context->preference('EnhancedMessagingPreferences')) {
         C4::Form::MessagingPreferences::set_form_values({ categorycode => $categorycode } , $template);
     }
@@ -150,8 +155,8 @@ if ($op eq 'add_form') {
 	}
 	
 	if ($is_a_modif) {
-            my $sth=$dbh->prepare("UPDATE categories SET description=?,enrolmentperiod=?, enrolmentperioddate=?,upperagelimit=?,dateofbirthrequired=?,enrolmentfee=?,reservefee=?,hidelostitems=?,overduenoticerequired=?,category_type=? WHERE categorycode=?");
-            $sth->execute(map { $input->param($_) } ('description','enrolmentperiod','enrolmentperioddate','upperagelimit','dateofbirthrequired','enrolmentfee','reservefee','hidelostitems','overduenoticerequired','category_type','categorycode'));
+            my $sth=$dbh->prepare("UPDATE categories SET description=?,enrolmentperiod=?, enrolmentperioddate=?,upperagelimit=?,dateofbirthrequired=?,enrolmentfee=?,reservefee=?,hidelostitems=?,overduenoticerequired=?,category_type=?, default_privacy=? WHERE categorycode=?");
+            $sth->execute(map { $input->param($_) } ('description','enrolmentperiod','enrolmentperioddate','upperagelimit','dateofbirthrequired','enrolmentfee','reservefee','hidelostitems','overduenoticerequired','category_type','default_privacy','categorycode'));
             my @branches = $input->param("branches");
             if ( @branches ) {
                 $sth = $dbh->prepare("DELETE FROM categories_branches WHERE categorycode = ?");
@@ -168,11 +173,9 @@ if ($op eq 'add_form') {
                     $sth->execute;
                 }
             }
-            $sth->finish;
         } else {
-            my $sth=$dbh->prepare("INSERT INTO categories  (categorycode,description,enrolmentperiod,enrolmentperioddate,upperagelimit,dateofbirthrequired,enrolmentfee,reservefee,hidelostitems,overduenoticerequired,category_type) values (?,?,?,?,?,?,?,?,?,?,?)");
-            $sth->execute(map { $input->param($_) } ('categorycode','description','enrolmentperiod','enrolmentperioddate','upperagelimit','dateofbirthrequired','enrolmentfee','reservefee','hidelostitems','overduenoticerequired','category_type'));
-            $sth->finish;
+            my $sth=$dbh->prepare("INSERT INTO categories  (categorycode,description,enrolmentperiod,enrolmentperioddate,upperagelimit,dateofbirthrequired,enrolmentfee,reservefee,hidelostitems,overduenoticerequired,category_type,default_privacy) values (?,?,?,?,?,?,?,?,?,?,?,?)");
+            $sth->execute(map { $input->param($_) } ('categorycode','description','enrolmentperiod','enrolmentperioddate','upperagelimit','dateofbirthrequired','enrolmentfee','reservefee','hidelostitems','overduenoticerequired','category_type', 'default_privacy'));
         }
     if (C4::Context->preference('EnhancedMessagingPreferences')) {
         C4::Form::MessagingPreferences::handle_form_action($input, 
diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql
index 07160c8..31bf032 100644
--- a/installer/data/mysql/kohastructure.sql
+++ b/installer/data/mysql/kohastructure.sql
@@ -463,6 +463,7 @@ CREATE TABLE `categories` ( -- this table shows information related to Koha patr
   `reservefee` decimal(28,6) default NULL, -- cost to place holds
   `hidelostitems` tinyint(1) NOT NULL default '0', -- are lost items shown to this category (1 for yes, 0 for no)
   `category_type` varchar(1) NOT NULL default 'A', -- type of Koha patron (Adult, Child, Professional, Organizational, Statistical, Staff)
+  `default_privacy` ENUM( 'default', 'never', 'forever' ) NOT NULL DEFAULT 'default', -- Default privacy setting for this patron category
   PRIMARY KEY  (`categorycode`),
   UNIQUE KEY `categorycode` (`categorycode`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index a9bfbbf..d9fe2c2 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -7778,6 +7778,13 @@ if(CheckVersion($DBversion)) {
     SetVersion($DBversion);
 }
 
+$DBversion = "3.15.00.XXX";
+if(CheckVersion($DBversion)) {
+    $dbh->do("ALTER TABLE categories ADD default_privacy ENUM( 'default', 'never', 'forever' ) NOT NULL DEFAULT 'default'");
+    print "Upgrade to $DBversion done (Bug 6254 - can't set patron privacy by default)\n";
+    SetVersion($DBversion);
+}
+
 =head1 FUNCTIONS
 
 =head2 TableExists($table)
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt
index d1c2e4c..56b667a 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt
@@ -203,6 +203,26 @@
         <span>Select All if this category type must to be displayed all the time. Otherwise select librairies you want to associate with this value.
         </span>
     </li>
+    <li>
+        <label for="default_privacy">Default privacy: </label>
+        <select id="default_privacy" name="default_privacy">
+            [% SWITCH default_privacy %]
+            [% CASE 'forever' %]
+                <option value="default">Default</option>
+                <option value="never">Never</option>
+                <option value="forever" selected="selected">Forever</option>
+            [% CASE 'never' %]
+                <option value="default">Default</option>
+                <option value="never" selected="selected">Never</option>
+                <option value="forever">Forever</option>
+            [% CASE %]
+                <option value="default" selected="selected">Default</option>
+                <option value="never">Never</option>
+                <option value="forever">Forever</option>
+            [% END %]
+        </select>
+        <span>Controls how long a patrons checkout history is kept for new patrons of this category. "Default" lets the library decide, "Never" anonymizes checkouts on return, and "Forever" keeps a patron's checkout history indefinitely.</span>
+    </li>
     </ol>
 </fieldset>
 
-- 
1.7.2.5