Bugzilla – Attachment 8939 Details for
Bug 7919
Display of values depending on the connexion library (authorised values, patron categories, extended attributes)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 7919 : Display of values depending on the connexion librairy
0001-Bug-7919-Display-of-values-depending-on-the-connexio.patch (text/plain), 43.72 KB, created by
Jonathan Druart
on 2012-04-06 10:18:04 UTC
(
hide
)
Description:
Bug 7919 : Display of values depending on the connexion librairy
Filename:
MIME Type:
Creator:
Jonathan Druart
Created:
2012-04-06 10:18:04 UTC
Size:
43.72 KB
patch
obsolete
>From ce3a1f4d67e2034b89fdf7634fc3f34cdb8aa27f Mon Sep 17 00:00:00 2001 >From: Jonathan Druart <jonathan.druart@biblibre.com> >Date: Thu, 5 Apr 2012 16:37:24 +0200 >Subject: [PATCH 1/1] Bug 7919 : Display of values depending on the connexion > librairy > >In a librairies network, we would like to declare specific values just >for one (or more) librairy. >Here we implement the ability to associate categories, patron attributes >types and/or authorised_values with librairies (branches). > >This patch adds 3 new association tables: >- categories_branches ( association table between categories and branches ) >- authorised_values_branches ( association table between > authorised_values and branches ) >- borrower_attribute_types_branches (association table between > borrower_attribute_types and branches ) > >Plan test: > - Create (or modify) categories, patron attributes and > authorised_values and link it with one (or more) library. > - Set one of these librairies > - Go to one of the multiple pages where this specific value must be displayed > and check that it does appear. > - Set a librairy not concerned. > - Check on the same pages this value is doest not appear. > >A page list: >cataloguing/addbiblio.pl >cataloguing/additems.pl >members/members-home.pl >members/memberentry.pl >acqui/neworderempty.pl >tools/import_borrowers.pl >and others :) > >Please say me if filters don't work on some pages. >--- > C4/Budgets.pm | 23 +++++-- > C4/Category.pm | 25 +++++-- > C4/Input.pm | 67 ++++++++++++-------- > C4/Koha.pm | 54 +++++++++++----- > C4/Members.pm | 63 ++++++++++++------ > C4/Members/AttributeTypes.pm | 62 +++++++++++++++++- > C4/Members/Attributes.pm | 2 + > admin/authorised_values.pl | 58 ++++++++++++++++- > admin/categorie.pl | 46 ++++++++++++-- > admin/patron-attr-types.pl | 36 +++++++++- > cataloguing/addbiblio.pl | 21 ++++-- > cataloguing/additem.pl | 13 ++-- > installer/data/mysql/kohastructure.sql | 38 +++++++++++ > installer/data/mysql/updatedatabase.pl | 17 +++++ > .../prog/en/modules/admin/authorised_values.tt | 20 ++++++- > .../prog/en/modules/admin/categorie.tt | 21 ++++++- > .../prog/en/modules/admin/patron-attr-types.tt | 19 ++++++ > members/member.pl | 4 +- > tools/batchMod.pl | 12 +++- > tools/import_borrowers.pl | 2 +- > 20 files changed, 489 insertions(+), 114 deletions(-) > >diff --git a/C4/Budgets.pm b/C4/Budgets.pm >index 7c867e0..8399b5b 100644 >--- a/C4/Budgets.pm >+++ b/C4/Budgets.pm >@@ -354,12 +354,25 @@ sub GetBudgetAuthCats { > # ------------------------------------------------------------------- > sub GetAuthvalueDropbox { > my ( $authcat, $default ) = @_; >+ my $branch_limit = C4::Context->userenv ? C4::Context->userenv->{"branch"} : ""; > my $dbh = C4::Context->dbh; >- my $sth = $dbh->prepare( >- 'SELECT authorised_value,lib FROM authorised_values >- WHERE category = ? ORDER BY lib' >- ); >- $sth->execute( $authcat ); >+ >+ my $query = qq{ >+ SELECT * >+ FROM authorised_values >+ }; >+ $query .= qq{ >+ LEFT JOIN authorised_values_branches ON ( id = av_id ) >+ } if $branch_limit; >+ $query .= qq{ >+ WHERE category = ? >+ }; >+ $query .= " AND ( branchcode = ? OR branchcode IS NULL )" if $branch_limit; >+ $query .= " GROUP BY lib ORDER BY category, lib, lib_opac"; >+ my $sth = $dbh->prepare($query); >+ $sth->execute( $authcat, $branch_limit ? $branch_limit : () ); >+ >+ > my $option_list = []; > my @authorised_values = ( q{} ); > while (my ($value, $lib) = $sth->fetchrow_array) { >diff --git a/C4/Category.pm b/C4/Category.pm >index 8536128..f12b52f 100644 >--- a/C4/Category.pm >+++ b/C4/Category.pm >@@ -71,13 +71,24 @@ C<description>. > =cut > > sub all { >- my $class = shift; >- map { >- utf8::encode($_->{description}); >- $class->new($_); >- } @{C4::Context->dbh->selectall_arrayref( >- "SELECT * FROM categories ORDER BY description", { Slice => {} } >- )}; >+ my ( $class ) = @_; >+ my $branch_limit = C4::Context->userenv ? C4::Context->userenv->{"branch"} : ""; >+ my $dbh = C4::Context->dbh; >+ # The categories table is small enough for >+ # `SELECT *` to be harmless. >+ my $query = "SELECT * FROM categories"; >+ $query .= qq{ >+ LEFT JOIN categories_branches ON categories_branches.categorycode = categories.categorycode >+ WHERE categories_branches.branchcode = ? OR categories_branches.branchcode IS NULL >+ } if $branch_limit; >+ $query .= " ORDER BY description"; >+ return map { $class->new($_) } @{ >+ $dbh->selectall_arrayref( >+ $query, >+ { Slice => {} }, >+ $branch_limit ? $branch_limit : () >+ ) >+ }; > } > > >diff --git a/C4/Input.pm b/C4/Input.pm >index 2ee07f3..6ba5ceb 100644 >--- a/C4/Input.pm >+++ b/C4/Input.pm >@@ -119,33 +119,48 @@ Returns NULL if no authorised values found > =cut > > sub buildCGIsort { >- my ($name,$input_name,$data) = @_; >- my $dbh=C4::Context->dbh; >- my $query=qq{SELECT * FROM authorised_values WHERE category=? order by lib}; >- my $sth=$dbh->prepare($query); >- $sth->execute($name); >- my $CGISort; >- if ($sth->rows>0){ >- my @values; >- my %labels; >- >- for (my $i =0;$i<$sth->rows;$i++){ >- my $results = $sth->fetchrow_hashref; >- push @values, $results->{authorised_value}; >- $labels{$results->{authorised_value}}=$results->{lib}; >- } >- $CGISort= CGI::scrolling_list( >- -name => $input_name, >- -id => $input_name, >- -values => \@values, >- -labels => \%labels, >- -default=> $data, >- -size => 1, >- -multiple => 0); >- } >- $sth->finish; >- return $CGISort; >+ my ( $name, $input_name, $data ) = @_; >+ my $branch_limit = C4::Context->userenv ? C4::Context->userenv->{"branch"} : ""; >+ >+ my $dbh=C4::Context->dbh; >+ my $query = qq{ >+ SELECT * >+ FROM authorised_values >+ }; >+ $query .= qq{ >+ LEFT JOIN authorised_values_branches ON ( id = av_id ) >+ } if $branch_limit; >+ $query .= qq{ >+ WHERE category = ? >+ }; >+ $query .= qq{ AND ( branchcode = ? OR branchcode IS NULL )} if $branch_limit; >+ $query .= qq{ GROUP BY lib ORDER BY lib}; >+ >+ my $sth=$dbh->prepare($query); >+ $sth->execute( $branch_limit ? $branch_limit : (), $name ); >+ my $CGISort; >+ if ($sth->rows>0){ >+ my @values; >+ my %labels; >+ >+ for (my $i =0;$i<$sth->rows;$i++){ >+ my $results = $sth->fetchrow_hashref; >+ push @values, $results->{authorised_value}; >+ $labels{$results->{authorised_value}}=$results->{lib}; >+ } >+ $CGISort= CGI::scrolling_list( >+ -name => $input_name, >+ -id => $input_name, >+ -values => \@values, >+ -labels => \%labels, >+ -default=> $data, >+ -size => 1, >+ -multiple => 0); >+ } >+ $sth->finish; >+ return $CGISort; > } >+ > END { } # module clean-up code here (global destructor) > > 1; >diff --git a/C4/Koha.pm b/C4/Koha.pm >index 0192989..050e8ae 100644 >--- a/C4/Koha.pm >+++ b/C4/Koha.pm >@@ -1007,25 +1007,45 @@ C<$opac> If set to a true value, displays OPAC descriptions rather than normal o > =cut > > sub GetAuthorisedValues { >- my ($category,$selected,$opac) = @_; >- my @results; >+ my ( $category, $selected, $opac ) = @_; >+ my $branch_limit = C4::Context->userenv ? C4::Context->userenv->{"branch"} : ""; >+ my @results; > my $dbh = C4::Context->dbh; >- my $query = "SELECT * FROM authorised_values"; >- $query .= " WHERE category = '" . $category . "'" if $category; >- $query .= " ORDER BY category, lib, lib_opac"; >+ my $query = qq{ >+ SELECT * >+ FROM authorised_values >+ }; >+ $query .= qq{ >+ LEFT JOIN authorised_values_branches ON ( id = av_id ) >+ } if $branch_limit; >+ my @where_strings; >+ my @where_args; >+ if($category) { >+ push @where_strings, "category = ?"; >+ push @where_args, $category; >+ } >+ if($branch_limit) { >+ push @where_strings, "( branchcode = ? OR branchcode IS NULL )"; >+ push @where_args, $branch_limit; >+ } >+ if(@where_strings > 0) { >+ $query .= " WHERE " . join(" AND ", @where_strings); >+ } >+ $query .= " GROUP BY lib ORDER BY category, lib, lib_opac"; >+ > my $sth = $dbh->prepare($query); >- $sth->execute; >- while (my $data=$sth->fetchrow_hashref) { >- if ($selected && $selected eq $data->{'authorised_value'} ) { >- $data->{'selected'} = 1; >- } >- if ($opac && $data->{'lib_opac'}) { >- $data->{'lib'} = $data->{'lib_opac'}; >- } >- push @results, $data; >- } >- #my $data = $sth->fetchall_arrayref({}); >- return \@results; #$data; >+ $sth->execute( @where_args ); >+ while (my $data=$sth->fetchrow_hashref) { >+ if ($selected && $selected eq $data->{'authorised_value'} ) { >+ $data->{'selected'} = 1; >+ } >+ if ($opac && $data->{'lib_opac'}) { >+ $data->{'lib'} = $data->{'lib_opac'}; >+ } >+ push @results, $data; >+ } >+ $sth->finish; >+ return \@results; > } > > =head2 GetAuthorisedValueCategories >diff --git a/C4/Members.pm b/C4/Members.pm >index 056f7e4..2d50ef4 100644 >--- a/C4/Members.pm >+++ b/C4/Members.pm >@@ -1373,20 +1373,35 @@ to category descriptions. > > #' > sub GetborCatFromCatType { >- my ( $category_type, $action ) = @_; >- # FIXME - This API seems both limited and dangerous. >+ my ( $category_type, $action, $no_branch_limit ) = @_; >+ >+ my $branch_limit = $no_branch_limit >+ ? 0 >+ : C4::Context->userenv ? C4::Context->userenv->{"branch"} : ""; >+ >+ # FIXME - This API seems both limited and dangerous. > my $dbh = C4::Context->dbh; >- my $request = qq| SELECT categorycode,description >- FROM categories >- $action >- ORDER BY categorycode|; >- my $sth = $dbh->prepare($request); >- if ($action) { >- $sth->execute($category_type); >- } >- else { >- $sth->execute(); >+ >+ my $request = qq{ >+ SELECT categories.categorycode, categories.description >+ FROM categories >+ }; >+ $request .= qq{ >+ LEFT JOIN categories_branches ON categories.categorycode = categories_branches.categorycode >+ } if $branch_limit; >+ if($action) { >+ $request .= " $action "; >+ $request .= " AND (branchcode = ? OR branchcode IS NULL) GROUP BY description" if $branch_limit; >+ } else { >+ $request .= " WHERE branchcode = ? OR branchcode IS NULL GROUP BY description" if $branch_limit; > } >+ $request .= " ORDER BY categorycode"; >+ >+ my $sth = $dbh->prepare($request); >+ $sth->execute( >+ $action ? $category_type : (), >+ $branch_limit ? $branch_limit : () >+ ); > > my %labels; > my @codes; >@@ -1395,6 +1410,7 @@ sub GetborCatFromCatType { > push @codes, $data->{'categorycode'}; > $labels{ $data->{'categorycode'} } = $data->{'description'}; > } >+ $sth->finish; > return ( \@codes, \%labels ); > } > >@@ -1437,16 +1453,21 @@ If no category code provided, the function returns all the categories. > =cut > > sub GetBorrowercategoryList { >+ my $no_branch_limit = @_ ? shift : 0; >+ my $branch_limit = $no_branch_limit >+ ? 0 >+ : C4::Context->userenv ? C4::Context->userenv->{"branch"} : ""; > my $dbh = C4::Context->dbh; >- my $sth = >- $dbh->prepare( >- "SELECT * >- FROM categories >- ORDER BY description" >- ); >- $sth->execute; >- my $data = >- $sth->fetchall_arrayref({}); >+ my $query = "SELECT * FROM categories"; >+ $query .= qq{ >+ LEFT JOIN categories_branches ON categories.categorycode = categories_branches.categorycode >+ WHERE branchcode = ? OR branchcode IS NULL GROUP BY description >+ } if $branch_limit; >+ $query .= " ORDER BY description"; >+ my $sth = $dbh->prepare( $query ); >+ $sth->execute( $branch_limit ? $branch_limit : () ); >+ my $data = $sth->fetchall_arrayref( {} ); >+ $sth->finish; > return $data; > } # sub getborrowercategory > >diff --git a/C4/Members/AttributeTypes.pm b/C4/Members/AttributeTypes.pm >index 8c96e54..eb48883 100644 >--- a/C4/Members/AttributeTypes.pm >+++ b/C4/Members/AttributeTypes.pm >@@ -69,12 +69,24 @@ If $all_fields is true, then each hashref also contains the other fields from bo > =cut > > sub GetAttributeTypes { >- my ($all) = @_; >- my $select = $all ? '*' : 'code, description, class'; >+ my $all = @_ ? shift : 0; >+ my $no_branch_limit = @_ ? shift : 0; >+ my $branch_limit = $no_branch_limit >+ ? 0 >+ : C4::Context->userenv ? C4::Context->userenv->{"branch"} : 0; >+ my $select = $all ? '*' : 'DISTINCT(code), description'; >+ > my $dbh = C4::Context->dbh; >- my $sth = $dbh->prepare("SELECT $select FROM borrower_attribute_types ORDER by code"); >- $sth->execute(); >+ my $query = "SELECT $select FROM borrower_attribute_types"; >+ $query .= qq{ >+ LEFT JOIN borrower_attribute_types_branches ON bat_code = code >+ WHERE b_branchcode = ? OR b_branchcode IS NULL >+ } if $branch_limit; >+ $query .= " ORDER BY code"; >+ my $sth = $dbh->prepare($query); >+ $sth->execute( $branch_limit ? $branch_limit : () ); > my $results = $sth->fetchall_arrayref({}); >+ $sth->finish; > return @$results; > } > >@@ -166,6 +178,13 @@ sub fetch { > $self->{'category_description'} = $row->{'category_description'}; > $self->{'class'} = $row->{'class'}; > >+ $sth = $dbh->prepare("SELECT branchcode, branchname FROM borrower_attribute_types_branches, branches WHERE b_branchcode = branchcode AND bat_code = ?;"); >+ $sth->execute( $code ); >+ while ( my $data = $sth->fetchrow_hashref ) { >+ push @{ $self->{branches} }, $data; >+ } >+ $sth->finish(); >+ > bless $self, $class; > return $self; > } >@@ -219,6 +238,22 @@ sub store { > $sth->bind_param(11, $self->{'code'}); > $sth->execute; > >+ if ( defined $$self{branches} ) { >+ $sth = $dbh->prepare("DELETE FROM borrower_attribute_types_branches WHERE bat_code = ?"); >+ $sth->execute( $$self{code} ); >+ $sth = $dbh->prepare( >+ "INSERT INTO borrower_attribute_types_branches >+ ( bat_code, b_branchcode ) >+ VALUES ( ?, ? )" >+ ); >+ for my $branchcode ( @{$$self{branches}} ) { >+ next if not $branchcode; >+ $sth->bind_param( 1, $$self{code} ); >+ $sth->bind_param( 2, $branchcode ); >+ $sth->execute; >+ } >+ } >+ $sth->finish; > } > > =head2 code >@@ -250,6 +285,24 @@ sub description { > @_ ? $self->{'description'} = shift : $self->{'description'}; > } > >+=head2 branches >+ >+=over 4 >+ >+my $branches = $attr_type->branches(); >+$attr_type->branches($branches); >+ >+=back >+ >+Accessor. >+ >+=cut >+ >+sub branches { >+ my $self = shift; >+ @_ ? $self->{branches} = shift : $self->{branches}; >+} >+ > =head2 repeatable > > my $repeatable = $attr_type->repeatable(); >@@ -432,6 +485,7 @@ sub delete { > my $dbh = C4::Context->dbh; > my $sth = $dbh->prepare_cached("DELETE FROM borrower_attribute_types WHERE code = ?"); > $sth->execute($code); >+ $sth->finish; > } > > =head2 num_patrons >diff --git a/C4/Members/Attributes.pm b/C4/Members/Attributes.pm >index 33d2407..cecb630 100644 >--- a/C4/Members/Attributes.pm >+++ b/C4/Members/Attributes.pm >@@ -70,6 +70,7 @@ marked for OPAC display are returned. > sub GetBorrowerAttributes { > my $borrowernumber = shift; > my $opac_only = @_ ? shift : 0; >+ my $branch_limit = @_ ? shift : 0; > > my $dbh = C4::Context->dbh(); > my $query = "SELECT code, description, attribute, lib, password, display_checkout, category_code, class >@@ -94,6 +95,7 @@ sub GetBorrowerAttributes { > class => $row->{'class'}, > } > } >+ $sth->finish; > return \@results; > } > >diff --git a/admin/authorised_values.pl b/admin/authorised_values.pl >index 1545f0e..e808e1d 100755 >--- a/admin/authorised_values.pl >+++ b/admin/authorised_values.pl >@@ -22,6 +22,7 @@ use warnings; > > use CGI; > use C4::Auth; >+use C4::Branch; > use C4::Context; > use C4::Koha; > use C4::Output; >@@ -67,13 +68,32 @@ $template->param( script_name => $script_name, > # called by default. Used to create form to add or modify a record > if ($op eq 'add_form') { > my $data; >+ my @selected_branches; > if ($id) { > my $sth=$dbh->prepare("select id, category, authorised_value, lib, lib_opac, imageurl from authorised_values where id=?"); > $sth->execute($id); > $data=$sth->fetchrow_hashref; >+ $sth = $dbh->prepare("SELECT b.branchcode, b.branchname FROM authorised_values_branches AS avb, branches AS b WHERE avb.branchcode = b.branchcode AND avb.av_id = ?;"); >+ $sth->execute( $id ); >+ while ( my $branch = $sth->fetchrow_hashref ) { >+ push @selected_branches, $branch; >+ } > } else { > $data->{'category'} = $input->param('category'); > } >+ >+ my $branches = GetBranches; >+ my @branches_loop; >+ >+ foreach my $branch (sort keys %$branches) { >+ my $selected = ( grep {$_->{branchcode} eq $branch} @selected_branches ) ? 1 : 0; >+ push @branches_loop, { >+ branchcode => $branches->{$branch}{branchcode}, >+ branchname => $branches->{$branch}{branchname}, >+ selected => $selected, >+ }; >+ } >+ > if ($id) { > $template->param(action_modify => 1); > $template->param('heading_modify_authorized_value_p' => 1); >@@ -92,6 +112,7 @@ if ($op eq 'add_form') { > id => $data->{'id'}, > imagesets => C4::Koha::getImageSets( checked => $data->{'imageurl'} ), > offset => $offset, >+ branches_loop => \@branches_loop, > ); > > ################## ADD_VALIDATE ################################## >@@ -102,6 +123,7 @@ if ($op eq 'add_form') { > my $imageurl = $input->param( 'imageurl' ) || ''; > $imageurl = '' if $imageurl =~ /removeImage/; > my $duplicate_entry = 0; >+ my @branches = $input->param('branches'); > > if ( $id ) { # Update > my $sth = $dbh->prepare( "SELECT category, authorised_value FROM authorised_values WHERE id = ? "); >@@ -125,7 +147,21 @@ if ($op eq 'add_form') { > my $lib_opac = $input->param('lib_opac'); > undef $lib if ($lib eq ""); # to insert NULL instead of a blank string > undef $lib_opac if ($lib_opac eq ""); # to insert NULL instead of a blank string >- $sth->execute($new_category, $new_authorised_value, $lib, $lib_opac, $imageurl, $id); >+ $sth->execute($new_category, $new_authorised_value, $lib, $lib_opac, $imageurl, $id); >+ if ( @branches ) { >+ $sth = $dbh->prepare("DELETE FROM authorised_values_branches WHERE av_id = ?"); >+ $sth->execute( $id ); >+ $sth = $dbh->prepare( >+ "INSERT INTO authorised_values_branches >+ ( av_id, branchcode ) >+ VALUES ( ?, ? )" >+ ); >+ for my $branchcode ( @branches ) { >+ next if not $branchcode; >+ $sth->execute($id, $branchcode); >+ } >+ } >+ $sth->finish; > print "Content-Type: text/html\n\n<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=authorised_values.pl?searchfield=".$new_category."&offset=$offset\"></html>"; > exit; > } >@@ -137,13 +173,25 @@ if ($op eq 'add_form') { > ($duplicate_entry) = $sth->fetchrow_array(); > unless ( $duplicate_entry ) { > my $sth=$dbh->prepare( 'INSERT INTO authorised_values >- ( id, category, authorised_value, lib, lib_opac, imageurl ) >- values (?, ?, ?, ?, ?, ?)' ); >+ ( category, authorised_value, lib, lib_opac, imageurl ) >+ values (?, ?, ?, ?, ?)' ); > my $lib = $input->param('lib'); > my $lib_opac = $input->param('lib_opac'); > undef $lib if ($lib eq ""); # to insert NULL instead of a blank string > undef $lib_opac if ($lib_opac eq ""); # to insert NULL instead of a blank string >- $sth->execute($id, $new_category, $new_authorised_value, $lib, $lib_opac, $imageurl ); >+ $sth->execute( $new_category, $new_authorised_value, $lib, $lib_opac, $imageurl ); >+ $id = $dbh->{'mysql_insertid'}; >+ if ( @branches ) { >+ $sth = $dbh->prepare( >+ "INSERT INTO authorised_values_branches >+ ( av_id, branchcode ) >+ VALUES ( ?, ? )" >+ ); >+ for my $branchcode ( @branches ) { >+ next if not $branchcode; >+ $sth->execute($id, $branchcode); >+ } >+ } > print "Content-Type: text/html\n\n<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=authorised_values.pl?searchfield=".$input->param('category')."&offset=$offset\"></html>"; > exit; > } >@@ -176,6 +224,8 @@ if ($op eq 'add_form') { > my $id = $input->param('id'); > my $sth=$dbh->prepare("delete from authorised_values where id=?"); > $sth->execute($id); >+ $sth = $dbh->prepare("DELETE FROM authorised_values_branches WHERE id = ?"); >+ $sth->execute($id); > print "Content-Type: text/html\n\n<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=authorised_values.pl?searchfield=$searchfield&offset=$offset\"></html>"; > exit; > # END $OP eq DELETE_CONFIRMED >diff --git a/admin/categorie.pl b/admin/categorie.pl >index 521346b..e93d0b3 100755 >--- a/admin/categorie.pl >+++ b/admin/categorie.pl >@@ -36,11 +36,12 @@ > # with Koha; if not, write to the Free Software Foundation, Inc., > # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > >-use strict; >-#use warnings; FIXME - Bug 2505 >+use Modern::Perl; >+ > use CGI; > use C4::Context; > use C4::Auth; >+use C4::Branch; > use C4::Output; > use C4::Dates; > use C4::Form::MessagingPreferences; >@@ -90,16 +91,34 @@ if ($op eq 'add_form') { > > #---- if primkey exists, it's a modify action, so read values to modify... > my $data; >+ 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=?"); > $sth->execute($categorycode); > $data=$sth->fetchrow_hashref; >- $sth->finish; >- } >+ >+ $sth = $dbh->prepare("SELECT b.branchcode, b.branchname FROM categories_branches AS cb, branches AS b WHERE cb.branchcode = b.branchcode AND cb.categorycode = ?"); >+ $sth->execute( $categorycode ); >+ while ( my $branch = $sth->fetchrow_hashref ) { >+ push @selected_branches, $branch; >+ } >+ $sth->finish; >+ } > > $data->{'enrolmentperioddate'} = undef if ($data->{'enrolmentperioddate'} eq '0000-00-00'); > >+ my $branches = GetBranches; >+ my @branches_loop; >+ foreach my $branch (sort keys %$branches) { >+ my $selected = ( grep {$$_{branchcode} eq $branch} @selected_branches ) ? 1 : 0; >+ push @branches_loop, { >+ branchcode => $$branches{$branch}{branchcode}, >+ branchname => $$branches{$branch}{branchname}, >+ selected => $selected, >+ }; >+ } >+ > $template->param(description => $data->{'description'}, > enrolmentperiod => $data->{'enrolmentperiod'}, > enrolmentperioddate => C4::Dates::format_date($data->{'enrolmentperioddate'}), >@@ -113,7 +132,8 @@ if ($op eq 'add_form') { > category_type => $data->{'category_type'}, > DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(), > "type_".$data->{'category_type'} => 1, >- SMSSendDriver => C4::Context->preference("SMSSendDriver") >+ SMSSendDriver => C4::Context->preference("SMSSendDriver"), >+ branches_loop => \@branches_loop, > ); > if (C4::Context->preference('EnhancedMessagingPreferences')) { > C4::Form::MessagingPreferences::set_form_values({ categorycode => $categorycode } , $template); >@@ -132,6 +152,22 @@ 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 @branches = $input->param("branches"); >+ if ( @branches ) { >+ $sth = $dbh->prepare("DELETE FROM categories_branches WHERE categorycode = ?"); >+ $sth->execute( $input->param( "categorycode" ) ); >+ $sth = $dbh->prepare( >+ "INSERT INTO categories_branches >+ ( categorycode, branchcode ) >+ VALUES ( ?, ? )" >+ ); >+ for my $branchcode ( @branches ) { >+ next if not $branchcode; >+ $sth->bind_param( 1, $input->param( "categorycode" ) ); >+ $sth->bind_param( 2, $branchcode ); >+ $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 (?,?,?,?,?,?,?,?,?,?,?)"); >diff --git a/admin/patron-attr-types.pl b/admin/patron-attr-types.pl >index 638456e..108b6a4 100755 >--- a/admin/patron-attr-types.pl >+++ b/admin/patron-attr-types.pl >@@ -19,12 +19,13 @@ > # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > # > >-use strict; >-use warnings; >+use Modern::Perl; >+ > use CGI; > use List::MoreUtils qw/uniq/; > > use C4::Auth; >+use C4::Branch; > use C4::Context; > use C4::Output; > use C4::Koha; >@@ -82,10 +83,20 @@ exit 0; > sub add_attribute_type_form { > my $template = shift; > >+ my $branches = GetBranches; >+ my @branches_loop; >+ foreach my $branch (sort keys %$branches) { >+ push @branches_loop, { >+ branchcode => $$branches{$branch}{branchcode}, >+ branchname => $$branches{$branch}{branchname}, >+ }; >+ } >+ > $template->param( > attribute_type_form => 1, > confirm_op => 'add_attribute_type_confirmed', > categories => GetBorrowercategoryList, >+ branches_loop => \@branches_loop, > ); > authorised_value_category_list($template); > pa_classes($template); >@@ -162,6 +173,8 @@ sub add_update_attribute_type { > $attr_type->display_checkout($display_checkout); > $attr_type->category_code($input->param('category_code')); > $attr_type->class($input->param('class')); >+ my @branches = $input->param('branches'); >+ $attr_type->branches( \@branches ); > > if ($op eq 'edit') { > $template->param(edited_attribute_type => $attr_type->code()); >@@ -244,6 +257,20 @@ sub edit_attribute_type_form { > authorised_value_category_list($template, $attr_type->authorised_value_category()); > pa_classes( $template, $attr_type->class ); > >+ >+ my $branches = GetBranches; >+ my @branches_loop; >+ my $selected_branches = $attr_type->branches; >+ foreach my $branch (sort keys %$branches) { >+ my $selected = ( grep {$$_{branchcode} eq $branch} @$selected_branches ) ? 1 : 0; >+ push @branches_loop, { >+ branchcode => $branches->{$branch}{branchcode}, >+ branchname => $branches->{$branch}{branchname}, >+ selected => $selected, >+ }; >+ } >+ $template->param( branches_loop => \@branches_loop ); >+ > $template->param ( category_code => $attr_type->category_code ); > $template->param ( category_description => $attr_type->category_description ); > >@@ -259,8 +286,9 @@ sub edit_attribute_type_form { > sub patron_attribute_type_list { > my $template = shift; > >- my @attr_types = C4::Members::AttributeTypes::GetAttributeTypes(); >- my @classes = uniq( map {$_->{class}} @attr_types ); >+ my @attr_types = C4::Members::AttributeTypes::GetAttributeTypes( 1, 1 ); >+ >+ my @classes = uniq( map { $_->{class} } @attr_types ); > @classes = sort @classes; > > my @attributes_loop; >diff --git a/cataloguing/addbiblio.pl b/cataloguing/addbiblio.pl >index d5778a4..b9581f1 100755 >--- a/cataloguing/addbiblio.pl >+++ b/cataloguing/addbiblio.pl >@@ -221,8 +221,11 @@ sub build_authorized_values_list { > #---- "true" authorised value > } > else { >+ my $branch_limit = C4::Context->userenv ? C4::Context->userenv->{"branch"} : ""; > $authorised_values_sth->execute( >- $tagslib->{$tag}->{$subfield}->{authorised_value} ); >+ $branch_limit ? $branch_limit : (), >+ $tagslib->{$tag}->{$subfield}->{authorised_value} >+ ); > > push @authorised_values, "" > unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); >@@ -232,6 +235,7 @@ sub build_authorized_values_list { > $authorised_lib{$value} = $lib; > } > } >+ $authorised_values_sth->finish; > return CGI::scrolling_list( > -name => "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield, > -values => \@authorised_values, >@@ -523,12 +527,14 @@ sub build_tabs { > my @loop_data = (); > my $tag; > >- my $authorised_values_sth = $dbh->prepare( >- "select authorised_value,lib >- from authorised_values >- where category=? order by lib" >- ); >- >+ my $branch_limit = C4::Context->userenv ? C4::Context->userenv->{"branch"} : ""; >+ my $query = "SELECT authorised_value, lib >+ FROM authorised_values"; >+ $query .= qq{ JOIN authorised_values_branches ON ( id = av_id AND ( branchcode = ? OR branchcode IS NULL ) )} if $branch_limit; >+ $query .= " WHERE category = ?"; >+ $query .= " GROUP BY lib ORDER BY lib, lib_opac"; >+ my $authorised_values_sth = $dbh->prepare( $query ); >+ > # in this array, we will push all the 10 tabs > # to avoid having 10 tabs in the template : they will all be in the same BIG_LOOP > my @BIG_LOOP; >@@ -713,6 +719,7 @@ sub build_tabs { > }; > } > } >+ $authorised_values_sth->finish; > $template->param( BIG_LOOP => \@BIG_LOOP ); > } > >diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl >index 9c8120e..847434c 100755 >--- a/cataloguing/additem.pl >+++ b/cataloguing/additem.pl >@@ -104,8 +104,7 @@ sub generate_subfield_form { > > my $frameworkcode = &GetFrameworkCode($biblionumber); > my %subfield_data; >- my $dbh = C4::Context->dbh; >- my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY lib"); >+ my $dbh = C4::Context->dbh; > > my $index_subfield = int(rand(1000000)); > if ($subfieldtag eq '@'){ >@@ -200,11 +199,11 @@ sub generate_subfield_form { > #---- "true" authorised value > } > else { >- push @authorised_values, "" unless ( $subfieldlib->{mandatory} ); >- $authorised_values_sth->execute( $subfieldlib->{authorised_value} ); >- while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) { >- push @authorised_values, $value; >- $authorised_lib{$value} = $lib; >+ push @authorised_values, qq{} unless ( $subfieldlib->{mandatory} ); >+ my $av = GetAuthorisedValues( $subfieldlib->{authorised_value} ); >+ for my $r ( @$av ) { >+ push @authorised_values, $r->{authorised_value}; >+ $authorised_lib{$r->{authorised_value}} = $r->{lib}; > } > } > >diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql >index 4912e19..f921ce8 100644 >--- a/installer/data/mysql/kohastructure.sql >+++ b/installer/data/mysql/kohastructure.sql >@@ -2810,6 +2810,44 @@ CREATE TABLE IF NOT EXISTS `social_data` ( > PRIMARY KEY (`isbn`) > ) ENGINE=InnoDB DEFAULT CHARSET=utf8; > >+-- >+-- Table structure for table categories_branches >+-- >+ >+DROP TABLE IF EXISTS categories_branches; >+CREATE TABLE categories_branches( -- association table between categories and branches >+ categorycode VARCHAR(10), >+ branchcode VARCHAR(10), >+ FOREIGN KEY (categorycode) REFERENCES categories(categorycode) ON DELETE CASCADE, >+ FOREIGN KEY (branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE >+) ENGINE=INNODB DEFAULT CHARSET=utf8; >+ >+-- >+-- Table structure for table authorised_values_branches >+-- >+ >+DROP TABLE IF EXISTS authorised_values_branches; >+CREATE TABLE authorised_values_branches( -- association table between authorised_values and branches >+ av_id INTEGER, >+ branchcode VARCHAR(10), >+ FOREIGN KEY (av_id) REFERENCES authorised_values(id) ON DELETE CASCADE, >+ FOREIGN KEY (branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE >+) ENGINE=INNODB DEFAULT CHARSET=utf8; >+ >+ >+-- >+-- Table structure for table borrower_attribute_types_branches >+-- >+ >+DROP TABLE IF EXISTS borrower_attribute_types_branches; >+CREATE TABLE borrower_attribute_types_branches( -- association table between borrower_attribute_types and branches >+ bat_code VARCHAR(10), >+ b_branchcode VARCHAR(10), >+ FOREIGN KEY (bat_code) REFERENCES borrower_attribute_types(code) ON DELETE CASCADE, >+ FOREIGN KEY (b_branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE >+) ENGINE=INNODB DEFAULT CHARSET=utf8; >+ >+ > /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; > /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; > /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; >diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl >index 503c8ee..f9e287e 100755 >--- a/installer/data/mysql/updatedatabase.pl >+++ b/installer/data/mysql/updatedatabase.pl >@@ -5146,6 +5146,23 @@ if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { > SetVersion($DBversion); > } > >+ >+ >+ >+ >+ >+$DBversion = "3.06.00.XXX"; >+if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { >+ $dbh->do(qq{CREATE TABLE borrower_attribute_types_branches(bat_code VARCHAR(10), b_branchcode VARCHAR(10),FOREIGN KEY (bat_code) REFERENCES borrower_attribute_types(code) ON DELETE CASCADE,FOREIGN KEY (b_branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE ) ENGINE=INNODB DEFAULT CHARSET=utf8;}); >+ >+ $dbh->do(qq{CREATE TABLE categories_branches(categorycode VARCHAR(10), branchcode VARCHAR(10), FOREIGN KEY (categorycode) REFERENCES categories(categorycode) ON DELETE CASCADE, FOREIGN KEY (branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE ) ENGINE=INNODB DEFAULT CHARSET=utf8;}); >+ >+ $dbh->do(qq{CREATE TABLE authorised_values_branches(av_id INTEGER, branchcode VARCHAR(10), FOREIGN KEY (av_id) REFERENCES authorised_values(id) ON DELETE CASCADE, FOREIGN KEY (branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE ) ENGINE=INNODB DEFAULT CHARSET=utf8;}); >+ >+ print "Upgrade to $DBversion done (Add 3 associations tables with branches)\n"; >+ SetVersion($DBversion); >+} >+ > =head1 FUNCTIONS > > =head2 DropAllForeignKeys($table) >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/authorised_values.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/authorised_values.tt >index 0c806ce..728615a 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/authorised_values.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/authorised_values.tt >@@ -13,7 +13,10 @@ > sortList: [[1,0]], > headers: { 4: { sorter: false}, 5: { sorter: false}} > }).tablesorterPager({container: $("#pagertable_authorized_values"),positionFixed: false,size: 50}); >- >+ >+ if ( $("#branches option:selected").length < 1 ) { >+ $("#branches option:first").attr("selected", "selected"); >+ } > }); </script> > > <script type="text/JavaScript" language="JavaScript"> >@@ -77,6 +80,21 @@ > <label for="lib_opac">Description (OPAC)</label> > <input type="text" name="lib_opac" id="lib_opac" value="[% lib_opac %]" maxlength="80" /> > </li> >+ <li><label for="branches">Branches limitation: </label> >+ <select id="branches" name="branches" multiple size="10"> >+ <option value="">All branches</option> >+ [% FOREACH branch IN branches_loop %] >+ [% IF ( branch.selected ) %] >+ <option selected="selected" value="[% branch.branchcode %]">[% branch.branchname %]</option> >+ [% ELSE %] >+ <option value="[% branch.branchcode %]">[% branch.branchname %]</option> >+ [% END %] >+ [% END %] >+ </select> >+ <span>Select All if this authorised value must to be displayed all the time. Otherwise select librairies you want to associate with this value. >+ </span> >+ </li> >+ > </ol> > <div id="icons" class="toptabs"> > <h5 style="margin-left:10px;">Choose an Icon:</h5> >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 d2c353e..881f545 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt >@@ -12,6 +12,10 @@ > widgets: ['zebra'], > headers: { 11: { sorter: false}} > }).tablesorterPager({container: $("#pagertable_categorie"),positionFixed: false,size: 20}); >+ >+ if ( $("#branches option:selected").length < 1 ) { >+ $("#branches option:first").attr("selected", "selected"); >+ } > }); </script> > [% INCLUDE 'calendar.inc' %] > <script type="text/javascript"> >@@ -179,7 +183,22 @@ > [% IF ( type_P ) %]<option value="P" selected="selected">Professional</option>[% ELSE %]<option value="P">Professional</option>[% END %] > [% IF ( type_X ) %]<option value="X" selected="selected">Statistical</option>[% ELSE %]<option value="X">Statistical</option>[% END %] > </select> >- </li></ol> >+ </li> >+ <li><label for="branches">Branches limitation: </label> >+ <select id="branches" name="branches" multiple size="10"> >+ <option value="">All branches</option> >+ [% FOREACH branch IN branches_loop %] >+ [% IF ( branch.selected ) %] >+ <option selected="selected" value="[% branch.branchcode %]">[% branch.branchname %]</option> >+ [% ELSE %] >+ <option value="[% branch.branchcode %]">[% branch.branchname %]</option> >+ [% END %] >+ [% END %] >+ </select> >+ <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> >+ </ol> > </fieldset> > > [% IF ( EnhancedMessagingPreferences ) %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/patron-attr-types.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/patron-attr-types.tt >index 54bd8f2..3c61a98 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/patron-attr-types.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/patron-attr-types.tt >@@ -15,6 +15,11 @@ > > <script type="text/javascript"> > //<![CDATA[ >+$(document).ready(function() { >+ if ( $("#branches option:selected").length < 1 ) { >+ $("#branches option:first").attr("selected", "selected"); >+ } >+} ); > > function DoCancel(f) { > f.op.value=''; >@@ -186,6 +191,20 @@ function CheckAttributeTypeForm(f) { > to be chosen from the authorized value list. However, an authorized value list is not > enforced during batch patron import.</span> > </li> >+ <li><label for="branches">Branches limitation: </label> >+ <select id="branches" name="branches" multiple size="10"> >+ <option value="">All branches</option> >+ [% FOREACH branch IN branches_loop %] >+ [% IF ( branch.selected ) %] >+ <option selected="selected" value="[% branch.branchcode %]">[% branch.branchname %]</option> >+ [% ELSE %] >+ <option value="[% branch.branchcode %]">[% branch.branchname %]</option> >+ [% END %] >+ [% END %] >+ </select> >+ <span>Select All if this attribute type must to be displayed all the time. Otherwise select librairies you want to associate with this value. >+ </span> >+ </li> > <li> > <label for="category">Category: </label> > <select name="category_code" id="category"> >diff --git a/members/member.pl b/members/member.pl >index 9b793f4..0b4a4c9 100755 >--- a/members/member.pl >+++ b/members/member.pl >@@ -134,8 +134,8 @@ foreach my $borrower(@$results[$from..$to-1]){ > > my %row = ( > count => $index++, >- %$borrower, >- %{$categories_dislay{$$borrower{categorycode}}}, >+ %$borrower, >+ (defined $categories_dislay{ $borrower->{categorycode} }? %{ $categories_dislay{ $borrower->{categorycode} } }:()), > overdues => $od, > issues => $issue, > odissue => "$od/$issue", >diff --git a/tools/batchMod.pl b/tools/batchMod.pl >index 9d59e3a..e1f5627 100755 >--- a/tools/batchMod.pl >+++ b/tools/batchMod.pl >@@ -259,7 +259,13 @@ if ($op eq "show"){ > # now, build the item form for entering a new item > my @loop_data =(); > my $i=0; >-my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY lib"); >+my $query = qq{ >+ SELECT authorised_value, lib FROM authorised_values >+ JOIN authorised_values_branches ON ( id = av_id AND ( branchcode = ? OR branchcode IS NULL ) ) >+ WHERE category = ? >+ GROUP BY lib ORDER BY lib, lib_opac >+}; >+my $authorised_values_sth = $dbh->prepare( $query ); > > my $branches = GetBranchesLoop(); # build once ahead of time, instead of multiple times later. > >@@ -352,7 +358,7 @@ foreach my $tag (sort keys %{$tagslib}) { > } > else { > push @authorised_values, ""; # unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); >- $authorised_values_sth->execute( $tagslib->{$tag}->{$subfield}->{authorised_value} ); >+ $authorised_values_sth->execute( C4::Context->userenv ? C4::Context->userenv->{"branch"} : "", $tagslib->{$tag}->{$subfield}->{authorised_value} ); > while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) { > push @authorised_values, $value; > $authorised_lib{$value} = $lib; >@@ -420,6 +426,8 @@ foreach my $tag (sort keys %{$tagslib}) { > $i++ > } > } # -- End foreach tag >+$authorised_values_sth->finish; >+ > > > # what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit. >diff --git a/tools/import_borrowers.pl b/tools/import_borrowers.pl >index 83db522..78353c9 100755 >--- a/tools/import_borrowers.pl >+++ b/tools/import_borrowers.pl >@@ -304,7 +304,7 @@ if ( $uploadborrowers && length($uploadborrowers) > 0 ) { > } else { > if ($extended) { > my @matchpoints = (); >- my @attr_types = C4::Members::AttributeTypes::GetAttributeTypes(); >+ my @attr_types = C4::Members::AttributeTypes::GetAttributeTypes(undef, 1); > foreach my $type (@attr_types) { > my $attr_type = C4::Members::AttributeTypes->fetch($type->{code}); > if ($attr_type->unique_id()) { >-- >1.7.7.3 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 7919
:
8939
|
9170
|
9973
|
9984
|
10424
|
11163
|
11168
|
11373
|
11751
|
13736
|
13862
|
13867
|
13868
|
13891
|
13901
|
13952
|
13953
|
14162
|
14163
|
14184
|
14287
|
14350
|
14372
|
14377