Fixing the date entry that I broke when adding the tables
[koha.git] / C4 / Branch.pm
blobf8edb6a99dffc5708d9acb1c361673f1c7147915
1 package C4::Branch;
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
8 # version.
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
19 use strict;
20 require Exporter;
21 use C4::Context;
22 use C4::Koha;
24 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
26 # set the version for version checking
27 $VERSION = 3.00;
29 =head1 NAME
31 C4::Branch - Koha branch module
33 =head1 SYNOPSIS
35 use C4::Branch;
37 =head1 DESCRIPTION
39 The functions in this module deal with branches.
41 =head1 FUNCTIONS
43 =cut
45 @ISA = qw(Exporter);
46 @EXPORT = qw(
47 &GetBranchCategory
48 &GetBranchName
49 &GetBranch
50 &GetBranches
51 &GetBranchDetail
52 &get_branchinfos_of
53 &ModBranch
54 &CheckBranchCategorycode
55 &GetBranchInfo
56 &GetCategoryTypes
57 &GetBranchCategories
58 &GetBranchesInCategory
59 &ModBranchCategoryInfo
60 &DelBranch
61 &DelBranchCategory
64 =head2 GetBranches
66 $branches = &GetBranches();
67 returns informations about ALL branches.
68 Create a branch selector with the following code
69 IndependantBranches Insensitive...
70 GetBranchInfo() returns the same information without the problems of this function
71 (namespace collision, mainly). You should probably use that, and replace GetBranches()
72 with GetBranchInfo() where you see it in the code.
74 =head3 in PERL SCRIPT
76 my $branches = GetBranches;
77 my @branchloop;
78 foreach my $thisbranch (keys %$branches) {
79 my $selected = 1 if $thisbranch eq $branch;
80 my %row =(value => $thisbranch,
81 selected => $selected,
82 branchname => $branches->{$thisbranch}->{'branchname'},
84 push @branchloop, \%row;
88 =head3 in TEMPLATE
89 <select name="branch">
90 <option value="">Default</option>
91 <!-- TMPL_LOOP name="branchloop" -->
92 <option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="branchname" --></option>
93 <!-- /TMPL_LOOP -->
94 </select>
96 =cut
98 sub GetBranches {
99 my ($onlymine)=@_;
100 # returns a reference to a hash of references to ALL branches...
101 my %branches;
102 my $dbh = C4::Context->dbh;
103 my $sth;
104 my $query="SELECT * from branches";
105 if ($onlymine && C4::Context->userenv && C4::Context->userenv->{branch}){
106 $query .= " WHERE branchcode =".$dbh->quote(C4::Context->userenv->{branch});
108 $query.=" order by branchname";
109 $sth = $dbh->prepare($query);
110 $sth->execute;
111 while ( my $branch = $sth->fetchrow_hashref ) {
112 my $nsth =
113 $dbh->prepare(
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 );
135 =head2 GetBranchName
137 =cut
139 sub GetBranchName {
140 my ($branchcode) = @_;
141 my $dbh = C4::Context->dbh;
142 my $sth;
143 $sth = $dbh->prepare("Select branchname from branches where branchcode=?");
144 $sth->execute($branchcode);
145 my $branchname = $sth->fetchrow_array;
146 $sth->finish;
147 return ($branchname);
150 =head2 ModBranch
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.
158 =cut
160 sub ModBranch {
161 my ($data) = @_;
163 my $dbh = C4::Context->dbh;
164 if ($data->{add}) {
165 my $query = "
166 INSERT INTO branches
167 (branchcode,branchname,branchaddress1,
168 branchaddress2,branchaddress3,branchphone,
169 branchfax,branchemail,branchip,branchprinter)
170 VALUES (?,?,?,?,?,?,?,?,?,?)
172 my $sth = $dbh->prepare($query);
173 $sth->execute(
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'},
180 } else {
181 my $query = "
182 UPDATE branches
183 SET branchname=?,branchaddress1=?,
184 branchaddress2=?,branchaddress3=?,branchphone=?,
185 branchfax=?,branchemail=?,branchip=?,branchprinter=?
186 WHERE branchcode=?
188 my $sth = $dbh->prepare($query);
189 $sth->execute(
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....
199 my @checkedcats;
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'};
211 my @addcats;
212 my @removecats;
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) {
225 my $sth =
226 $dbh->prepare(
227 "insert into branchrelations (branchcode, categorycode) values(?, ?)"
229 $sth->execute( $branchcode, $cat );
230 $sth->finish;
232 foreach my $cat (@removecats) {
233 my $sth =
234 $dbh->prepare(
235 "delete from branchrelations where branchcode=? and categorycode=?"
237 $sth->execute( $branchcode, $cat );
238 $sth->finish;
242 =head2 GetBranchCategory
244 $results = GetBranchCategory($categorycode);
246 C<$results> is an ref to an array.
248 =cut
250 sub GetBranchCategory {
252 # returns a reference to an array of hashes containing branches,
253 my ($catcode) = @_;
254 my $dbh = C4::Context->dbh;
255 my $sth;
257 # print DEBUG "GetBranchCategory: entry: catcode=".cvs($catcode)."\n";
258 if ($catcode) {
259 $sth =
260 $dbh->prepare(
261 "select * from branchcategories where categorycode = ?");
262 $sth->execute($catcode);
264 else {
265 $sth = $dbh->prepare("Select * from branchcategories");
266 $sth->execute();
268 my @results;
269 while ( my $data = $sth->fetchrow_hashref ) {
270 push( @results, $data );
272 $sth->finish;
274 # print DEBUG "GetBranchCategory: exit: returning ".cvs(\@results)."\n";
275 return \@results;
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.
287 =cut
289 sub GetBranchCategories {
290 my ($branchcode,$categorytype) = @_;
291 my $dbh = C4::Context->dbh();
292 my $query = "SELECT c.* FROM branchcategories c";
293 my (@where, @bind);
294 if($branchcode) {
295 $query .= ",branchrelations r, branches b ";
296 push @where, "c.categorycode=r.categorycode and r.branchcode=? ";
297 push @bind , $branchcode;
299 if ($categorytype) {
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({});
309 $sth->finish();
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.
323 =cut
325 #TODO manage category types. rename possibly to 'agency domains' ? as borrowergroups are called categories.
326 sub GetCategoryTypes() {
327 return ( 'searchdomain','properties');
330 =head2 GetBranch
332 $branch = GetBranch( $query, $branches );
334 =cut
336 sub GetBranch ($$) {
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] );
342 return $branch;
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
352 =cut
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();
360 $sth->finish();
361 return $branchname;
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
369 branches table.
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};
376 =cut
378 sub get_branchinfos_of {
379 my @branchcodes = @_;
381 my $query = '
382 SELECT branchcode,
383 branchname
384 FROM branches
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) .
398 =cut
400 sub GetBranchesInCategory($) {
401 my ($categorycode) = @_;
402 my @branches;
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;
410 $sth->finish();
411 return( \@branches );
414 =head2 GetBranchInfo
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.
421 =cut
423 sub GetBranchInfo {
424 my ($branchcode,$categorytype) = @_;
425 my $dbh = C4::Context->dbh;
426 my $sth;
429 if ($branchcode) {
430 $sth =
431 $dbh->prepare(
432 "Select * from branches where branchcode = ? order by branchcode");
433 $sth->execute($branchcode);
435 else {
436 $sth = $dbh->prepare("Select * from branches order by branchcode");
437 $sth->execute();
439 my @results;
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=? ";
445 if($categorytype) {
446 $query .= " and c.categorytype=? and r.categorycode=c.categorycode";
447 push @bind, $categorytype;
449 my $nsth=$dbh->prepare($query);
450 $nsth->execute( @bind );
451 my @cats = ();
452 while ( my ($cat) = $nsth->fetchrow_array ) {
453 push( @cats, $cat );
455 $nsth->finish;
456 $data->{'categories'} = \@cats;
457 push( @results, $data );
459 $sth->finish;
460 return \@results;
463 =head2 DelBranch
465 &DelBranch($branchcode);
467 =cut
469 sub DelBranch {
470 my ($branchcode) = @_;
471 my $dbh = C4::Context->dbh;
472 my $sth = $dbh->prepare("delete from branches where branchcode = ?");
473 $sth->execute($branchcode);
474 $sth->finish;
477 =head2 ModBranchCategoryInfo
479 &ModBranchCategoryInfo($data);
480 sets the data from the editbranch form, and writes to the database...
482 =cut
484 sub ModBranchCategoryInfo {
486 my ($data) = @_;
487 my $dbh = C4::Context->dbh;
488 my $sth = $dbh->prepare("replace branchcategories (categorycode,categoryname,codedescription,categorytype) values (?,?,?,?)");
489 $sth->execute(uc( $data->{'categorycode'} ),$data->{'categoryname'}, $data->{'codedescription'},$data->{'categorytype'} );
490 $sth->finish;
493 =head2 DeleteBranchCategory
495 DeleteBranchCategory($categorycode);
497 =cut
499 sub DelBranchCategory {
500 my ($categorycode) = @_;
501 my $dbh = C4::Context->dbh;
502 my $sth = $dbh->prepare("delete from branchcategories where categorycode = ?");
503 $sth->execute($categorycode);
504 $sth->finish;
507 =head2 CheckBranchCategorycode
509 $number_rows_affected = CheckBranchCategorycode($categorycode);
511 =cut
513 sub CheckBranchCategorycode {
515 # check to see if the branchcode is being used in the database somewhere....
516 my ($categorycode) = @_;
517 my $dbh = C4::Context->dbh;
518 my $sth =
519 $dbh->prepare(
520 "select count(*) from branchrelations where categorycode=?");
521 $sth->execute($categorycode);
522 my ($total) = $sth->fetchrow_array;
523 return $total;
528 =head1 AUTHOR
530 Koha Developement team <info@koha.org>
532 =cut