3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 2 of the License, or (at your option) any later
10 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License along with
15 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
16 # Suite 330, Boston, MA 02111-1307 USA
24 use vars
qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
27 # set the version for version checking
38 &CheckBranchCategorycode
42 &GetBranchesInCategory
43 &ModBranchCategoryInfo
51 C4::Branch - Koha branch module
59 The functions in this module deal with branches.
65 $branches = &GetBranches();
66 returns informations about ALL branches.
67 Create a branch selector with the following code
68 IndependantBranches Insensitive...
69 GetBranchInfo() returns the same information without the problems of this function
70 (namespace collision, mainly). You should probably use that, and replace GetBranches()
71 with GetBranchInfo() where you see it in the code.
75 my $branches = GetBranches;
77 foreach my $thisbranch (keys %$branches) {
78 my $selected = 1 if $thisbranch eq $branch;
79 my %row =(value => $thisbranch,
80 selected => $selected,
81 branchname => $branches->{$thisbranch}->{'branchname'},
83 push @branchloop, \%row;
87 <select name="branch">
88 <option value="">Default</option>
89 <!-- TMPL_LOOP name="branchloop" -->
90 <option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="branchname" --></option>
98 # returns a reference to a hash of references to ALL branches...
100 my $dbh = C4
::Context
->dbh;
102 my $query="SELECT * FROM branches";
104 if ($onlymine && C4
::Context
->userenv && C4
::Context
->userenv->{branch
}){
105 $query .= ' WHERE branchcode = ? ';
106 push @bind_parameters, C4
::Context
->userenv->{branch
};
108 $query.=" ORDER BY branchname";
109 $sth = $dbh->prepare($query);
110 $sth->execute( @bind_parameters );
111 while ( my $branch = $sth->fetchrow_hashref ) {
114 "SELECT categorycode FROM branchrelations WHERE branchcode = ?");
115 $nsth->execute( $branch->{'branchcode'} );
116 while ( my ($cat) = $nsth->fetchrow_array ) {
118 # FIXME - This seems wrong. It ought to be
119 # $branch->{categorycodes}{$cat} = 1;
120 # otherwise, there's a namespace collision if there's a
121 # category with the same name as a field in the 'branches'
122 # table (i.e., don't create a category called "issuing").
123 # In addition, the current structure doesn't really allow
124 # you to list the categories that a branch belongs to:
125 # you'd have to list keys %$branch, and remove those keys
126 # that aren't fields in the "branches" table.
127 # $branch->{$cat} = 1;
128 $branch->{category
}{$cat} = 1;
130 $branches{ $branch->{'branchcode'} } = $branch;
132 return ( \
%branches );
140 my ($branchcode) = @_;
141 my $dbh = C4
::Context
->dbh;
143 $sth = $dbh->prepare("Select branchname from branches where branchcode=?");
144 $sth->execute($branchcode);
145 my $branchname = $sth->fetchrow_array;
147 return ($branchname);
152 &ModBranch($newvalue);
154 This function modify an existing branches.
156 C<$newvalue> is a ref to an array wich is containt all the column from branches table.
163 my $dbh = C4
::Context
->dbh;
167 (branchcode,branchname,branchaddress1,
168 branchaddress2,branchaddress3,branchphone,
169 branchfax,branchemail,branchip,branchprinter)
170 VALUES (?,?,?,?,?,?,?,?,?,?)
172 my $sth = $dbh->prepare($query);
174 $data->{'branchcode'}, $data->{'branchname'},
175 $data->{'branchaddress1'}, $data->{'branchaddress2'},
176 $data->{'branchaddress3'}, $data->{'branchphone'},
177 $data->{'branchfax'}, $data->{'branchemail'},
178 $data->{'branchip'}, $data->{'branchprinter'},
183 SET branchname=?,branchaddress1=?,
184 branchaddress2=?,branchaddress3=?,branchphone=?,
185 branchfax=?,branchemail=?,branchip=?,branchprinter=?
188 my $sth = $dbh->prepare($query);
190 $data->{'branchname'},
191 $data->{'branchaddress1'}, $data->{'branchaddress2'},
192 $data->{'branchaddress3'}, $data->{'branchphone'},
193 $data->{'branchfax'}, $data->{'branchemail'},
194 $data->{'branchip'}, $data->{'branchprinter'},
195 $data->{'branchcode'},
198 # sort out the categories....
200 my $cats = GetBranchCategory
();
201 foreach my $cat (@
$cats) {
202 my $code = $cat->{'categorycode'};
203 if ( $data->{$code} ) {
204 push( @checkedcats, $code );
207 my $branchcode = uc( $data->{'branchcode'} );
208 my $branch = GetBranchInfo
($branchcode);
209 $branch = $branch->[0];
210 my $branchcats = $branch->{'categories'};
213 foreach my $bcat (@
$branchcats) {
215 unless ( grep { /^$bcat$/ } @checkedcats ) {
216 push( @removecats, $bcat );
219 foreach my $ccat (@checkedcats) {
220 unless ( grep { /^$ccat$/ } @
$branchcats ) {
221 push( @addcats, $ccat );
224 foreach my $cat (@addcats) {
227 "insert into branchrelations (branchcode, categorycode) values(?, ?)"
229 $sth->execute( $branchcode, $cat );
232 foreach my $cat (@removecats) {
235 "delete from branchrelations where branchcode=? and categorycode=?"
237 $sth->execute( $branchcode, $cat );
242 =head2 GetBranchCategory
244 $results = GetBranchCategory($categorycode);
246 C<$results> is an ref to an array.
250 sub GetBranchCategory
{
252 # returns a reference to an array of hashes containing branches,
254 my $dbh = C4
::Context
->dbh;
257 # print DEBUG "GetBranchCategory: entry: catcode=".cvs($catcode)."\n";
261 "select * from branchcategories where categorycode = ?");
262 $sth->execute($catcode);
265 $sth = $dbh->prepare("Select * from branchcategories");
269 while ( my $data = $sth->fetchrow_hashref ) {
270 push( @results, $data );
274 # print DEBUG "GetBranchCategory: exit: returning ".cvs(\@results)."\n";
278 =head2 GetBranchCategories
280 my $categories = GetBranchCategories($branchcode,$categorytype);
282 Returns a list ref of anon hashrefs with keys eq columns of branchcategories table,
283 i.e. categorycode, categorydescription, categorytype, categoryname.
284 if $branchcode and/or $categorytype are passed, limit set to categories that
285 $branchcode is a member of , and to $categorytype.
289 sub GetBranchCategories
{
290 my ($branchcode,$categorytype) = @_;
291 my $dbh = C4
::Context
->dbh();
292 my $query = "SELECT c.* FROM branchcategories c";
295 $query .= ",branchrelations r, branches b ";
296 push @where, "c.categorycode=r.categorycode and r.branchcode=? ";
297 push @bind , $branchcode;
300 push @where, " c.categorytype=? ";
301 push @bind, $categorytype;
303 $query .= " where " . join(" and ", @where) if(@where);
304 $query .= " order by categorytype,c.categorycode";
305 my $sth=$dbh->prepare( $query);
306 $sth->execute(@bind);
308 my $branchcats = $sth->fetchall_arrayref({});
310 return( $branchcats );
313 =head2 GetCategoryTypes
315 $categorytypes = GetCategoryTypes;
316 returns a list of category types.
317 Currently these types are HARDCODED.
318 type: 'searchdomain' defines a group of agencies that the calling library may search in.
319 Other usage of agency categories falls under type: 'properties'.
320 to allow for other uses of categories.
321 The searchdomain bit may be better implemented as a separate module, but
322 the categories were already here, and minimally used.
325 #TODO manage category types. rename possibly to 'agency domains' ? as borrowergroups are called categories.
326 sub GetCategoryTypes
() {
327 return ( 'searchdomain','properties');
332 $branch = GetBranch( $query, $branches );
337 my ( $query, $branches ) = @_; # get branch for this query from branches
338 my $branch = $query->param('branch');
339 my %cookie = $query->cookie('userenv');
340 ($branch) || ($branch = $cookie{'branchname'});
341 ( $branches->{$branch} ) || ( $branch = ( keys %$branches )[0] );
345 =head2 GetBranchDetail
347 $branchname = &GetBranchDetail($branchcode);
349 Given the branch code, the function returns the corresponding
350 branch name for a comprehensive information display
354 sub GetBranchDetail
{
355 my ($branchcode) = @_;
356 my $dbh = C4
::Context
->dbh;
357 my $sth = $dbh->prepare("SELECT * FROM branches WHERE branchcode = ?");
358 $sth->execute($branchcode);
359 my $branchname = $sth->fetchrow_hashref();
364 =head2 get_branchinfos_of
366 my $branchinfos_of = get_branchinfos_of(@branchcodes);
368 Associates a list of branchcodes to the information of the branch, taken in
371 Returns a href where keys are branchcodes and values are href where keys are
372 branch information key.
374 print 'branchname is ', $branchinfos_of->{$code}->{branchname};
378 sub get_branchinfos_of
{
379 my @branchcodes = @_;
385 WHERE branchcode IN ('
386 . join( ',', map( { "'" . $_ . "'" } @branchcodes ) ) . ')
388 return C4
::Koha
::get_infos_of
( $query, 'branchcode' );
392 =head2 GetBranchesInCategory
394 my $branches = GetBranchesInCategory($categorycode);
396 Returns a href: keys %$branches eq (branchcode,branchname) .
400 sub GetBranchesInCategory
($) {
401 my ($categorycode) = @_;
403 my $dbh = C4
::Context
->dbh();
404 my $sth=$dbh->prepare( "SELECT b.branchcode FROM branchrelations r, branches b
405 where r.branchcode=b.branchcode and r.categorycode=?");
406 $sth->execute($categorycode);
407 while (my $branch = $sth->fetchrow) {
408 push @branches, $branch;
411 return( \
@branches );
416 $results = GetBranchInfo($branchcode);
418 returns C<$results>, a reference to an array of hashes containing branches.
419 if $branchcode, just this branch, with associated categories.
420 if ! $branchcode && $categorytype, all branches in the category.
424 my ($branchcode,$categorytype) = @_;
425 my $dbh = C4
::Context
->dbh;
432 "Select * from branches where branchcode = ? order by branchcode");
433 $sth->execute($branchcode);
436 $sth = $dbh->prepare("Select * from branches order by branchcode");
440 while ( my $data = $sth->fetchrow_hashref ) {
441 my @bind = ($data->{'branchcode'});
442 my $query= "select r.categorycode from branchrelations r";
443 $query .= ", branchcategories c " if($categorytype);
444 $query .= " where branchcode=? ";
446 $query .= " and c.categorytype=? and r.categorycode=c.categorycode";
447 push @bind, $categorytype;
449 my $nsth=$dbh->prepare($query);
450 $nsth->execute( @bind );
452 while ( my ($cat) = $nsth->fetchrow_array ) {
456 $data->{'categories'} = \
@cats;
457 push( @results, $data );
465 &DelBranch($branchcode);
470 my ($branchcode) = @_;
471 my $dbh = C4
::Context
->dbh;
472 my $sth = $dbh->prepare("delete from branches where branchcode = ?");
473 $sth->execute($branchcode);
477 =head2 ModBranchCategoryInfo
479 &ModBranchCategoryInfo($data);
480 sets the data from the editbranch form, and writes to the database...
484 sub ModBranchCategoryInfo
{
486 my $dbh = C4
::Context
->dbh;
488 # we are doing an insert
489 my $sth = $dbh->prepare("INSERT INTO branchcategories (categorycode,categoryname,codedescription,categorytype) VALUES (?,?,?,?)");
490 $sth->execute(uc( $data->{'categorycode'} ),$data->{'categoryname'}, $data->{'codedescription'},$data->{'categorytype'} );
495 my $sth = $dbh->prepare("UPDATE branchcategories SET categoryname=?,codedescription=?,categorytype=? WHERE categorycode=?");
496 $sth->execute($data->{'categoryname'}, $data->{'codedescription'},$data->{'categorytype'},uc( $data->{'categorycode'} ) );
501 =head2 DeleteBranchCategory
503 DeleteBranchCategory($categorycode);
507 sub DelBranchCategory
{
508 my ($categorycode) = @_;
509 my $dbh = C4
::Context
->dbh;
510 my $sth = $dbh->prepare("delete from branchcategories where categorycode = ?");
511 $sth->execute($categorycode);
515 =head2 CheckBranchCategorycode
517 $number_rows_affected = CheckBranchCategorycode($categorycode);
521 sub CheckBranchCategorycode
{
523 # check to see if the branchcode is being used in the database somewhere....
524 my ($categorycode) = @_;
525 my $dbh = C4
::Context
->dbh;
528 "select count(*) from branchrelations where categorycode=?");
529 $sth->execute($categorycode);
530 my ($total) = $sth->fetchrow_array;
539 Koha Developement team <info@koha.org>