X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FBranch.pm;h=7bd03264b7228a12d7a5683802265452d346ae8a;hb=d63691d3f196b86db49dc6f7c6c1e27cc53d0326;hp=561ec2c9d662964be47981902b096e33d8b52316;hpb=b9c20fa9cf37f5bb16202c400e92bad74f141390;p=koha.git diff --git a/C4/Branch.pm b/C4/Branch.pm index 561ec2c9d6..7bd03264b7 100644 --- a/C4/Branch.pm +++ b/C4/Branch.pm @@ -17,14 +17,38 @@ package C4::Branch; use strict; +#use warnings; FIXME - Bug 2505 require Exporter; use C4::Context; -use C4::Koha; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); -# set the version for version checking -$VERSION = 3.00; +BEGIN { + # set the version for version checking + $VERSION = 3.02; + @ISA = qw(Exporter); + @EXPORT = qw( + &GetBranchCategory + &GetBranchName + &GetBranch + &GetBranches + &GetBranchesLoop + &GetBranchDetail + &get_branchinfos_of + &ModBranch + &CheckBranchCategorycode + &GetBranchInfo + &GetCategoryTypes + &GetBranchCategories + &GetBranchesInCategory + &ModBranchCategoryInfo + &DelBranch + &DelBranchCategory + &CheckCategoryUnique + &mybranch + ); + @EXPORT_OK = qw( &onlymine &mybranch get_branch_code_from_name ); +} =head1 NAME @@ -40,52 +64,39 @@ The functions in this module deal with branches. =head1 FUNCTIONS -=cut - -@ISA = qw(Exporter); -@EXPORT = qw( - &GetBranchCategory - &GetBranchName - &GetBranch - &GetBranches - &GetBranchDetail - &get_branchinfos_of - &ModBranch - &CheckBranchCategorycode - &GetBranchInfo - &ModBranchCategoryInfo - &DelBranch - &DelBranchCategory -); - =head2 GetBranches $branches = &GetBranches(); - returns informations about ALL branches. - Create a branch selector with the following code - IndependantBranches Insensitive... - -=head3 in PERL SCRIPT -my $branches = GetBranches; -my @branchloop; -foreach my $thisbranch (keys %$branches) { - my $selected = 1 if $thisbranch eq $branch; - my %row =(value => $thisbranch, - selected => $selected, - branchname => $branches->{$thisbranch}->{'branchname'}, - ); - push @branchloop, \%row; -} +Returns informations about ALL branches, IndependantBranches Insensitive. +GetBranchInfo() returns the same information without the problems of this function +(namespace collision, mainly). + +Create a branch selector with the following code. +=head3 in PERL SCRIPT + + my $branches = GetBranches; + my @branchloop; + foreach my $thisbranch (sort keys %$branches) { + my $selected = 1 if $thisbranch eq $branch; + my %row =(value => $thisbranch, + selected => $selected, + branchname => $branches->{$thisbranch}->{branchname}, + ); + push @branchloop, \%row; + } =head3 in TEMPLATE - + + + +=head4 Note that you often will want to just use GetBranchesLoop, for exactly the example above. =cut @@ -95,20 +106,23 @@ sub GetBranches { my %branches; my $dbh = C4::Context->dbh; my $sth; - my $query="SELECT * from branches"; + my $query="SELECT * FROM branches"; + my @bind_parameters; if ($onlymine && C4::Context->userenv && C4::Context->userenv->{branch}){ - $query .= " WHERE branchcode =".$dbh->quote(C4::Context->userenv->{branch}); + $query .= ' WHERE branchcode = ? '; + push @bind_parameters, C4::Context->userenv->{branch}; } - $query.=" order by branchname"; + $query.=" ORDER BY branchname"; $sth = $dbh->prepare($query); - $sth->execute; + $sth->execute( @bind_parameters ); + + my $nsth = $dbh->prepare( + "SELECT categorycode FROM branchrelations WHERE branchcode = ?" + ); # prepare once, outside while loop + while ( my $branch = $sth->fetchrow_hashref ) { - my $nsth = - $dbh->prepare( - "select categorycode from branchrelations where branchcode = ?"); $nsth->execute( $branch->{'branchcode'} ); while ( my ($cat) = $nsth->fetchrow_array ) { - # FIXME - This seems wrong. It ought to be # $branch->{categorycodes}{$cat} = 1; # otherwise, there's a namespace collision if there's a @@ -118,13 +132,43 @@ sub GetBranches { # you to list the categories that a branch belongs to: # you'd have to list keys %$branch, and remove those keys # that aren't fields in the "branches" table. - $branch->{$cat} = 1; + # $branch->{$cat} = 1; + $branch->{category}{$cat} = 1; } $branches{ $branch->{'branchcode'} } = $branch; } return ( \%branches ); } +sub onlymine { + return + C4::Context->preference('IndependantBranches') && + C4::Context->userenv && + C4::Context->userenv->{flags} %2 != 1 && + C4::Context->userenv->{branch} ; +} + +# always returns a string for OK comparison via "eq" or "ne" +sub mybranch { + C4::Context->userenv or return ''; + return C4::Context->userenv->{branch} || ''; +} + +sub GetBranchesLoop (;$$) { # since this is what most pages want anyway + my $branch = @_ ? shift : mybranch(); # optional first argument is branchcode of "my branch", if preselection is wanted. + my $onlymine = @_ ? shift : onlymine(); + my $branches = GetBranches($onlymine); + my @loop; + foreach ( sort { uc($branches->{$a}->{branchname}) cmp uc($branches->{$b}->{branchname}) } keys %$branches ) { + push @loop, { + value => $_, + selected => ($_ eq $branch) ? 1 : 0, + branchname => $branches->{$_}->{branchname}, + }; + } + return \@loop; +} + =head2 GetBranchName =cut @@ -142,9 +186,9 @@ sub GetBranchName { =head2 ModBranch -&ModBranch($newvalue); +$error = &ModBranch($newvalue); -This function modify an existing branches. +This function modify an existing branch C<$newvalue> is a ref to an array wich is containt all the column from branches table. @@ -158,33 +202,45 @@ sub ModBranch { my $query = " INSERT INTO branches (branchcode,branchname,branchaddress1, - branchaddress2,branchaddress3,branchphone, - branchfax,branchemail,branchip,branchprinter) - VALUES (?,?,?,?,?,?,?,?,?,?) + branchaddress2,branchaddress3,branchzip,branchcity,branchstate, + branchcountry,branchphone,branchfax,branchemail, + branchurl,branchip,branchprinter,branchnotes) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) "; my $sth = $dbh->prepare($query); $sth->execute( $data->{'branchcode'}, $data->{'branchname'}, $data->{'branchaddress1'}, $data->{'branchaddress2'}, - $data->{'branchaddress3'}, $data->{'branchphone'}, - $data->{'branchfax'}, $data->{'branchemail'}, + $data->{'branchaddress3'}, $data->{'branchzip'}, + $data->{'branchcity'}, $data->{'branchstate'}, + $data->{'branchcountry'}, + $data->{'branchphone'}, $data->{'branchfax'}, + $data->{'branchemail'}, $data->{'branchurl'}, $data->{'branchip'}, $data->{'branchprinter'}, + $data->{'branchnotes'}, ); + return 1 if $dbh->err; } else { my $query = " UPDATE branches SET branchname=?,branchaddress1=?, - branchaddress2=?,branchaddress3=?,branchphone=?, - branchfax=?,branchemail=?,branchip=?,branchprinter=? + branchaddress2=?,branchaddress3=?,branchzip=?, + branchcity=?,branchstate=?,branchcountry=?,branchphone=?, + branchfax=?,branchemail=?,branchurl=?,branchip=?, + branchprinter=?,branchnotes=? WHERE branchcode=? "; my $sth = $dbh->prepare($query); $sth->execute( $data->{'branchname'}, $data->{'branchaddress1'}, $data->{'branchaddress2'}, - $data->{'branchaddress3'}, $data->{'branchphone'}, - $data->{'branchfax'}, $data->{'branchemail'}, + $data->{'branchaddress3'}, $data->{'branchzip'}, + $data->{'branchcity'}, $data->{'branchstate'}, + $data->{'branchcountry'}, + $data->{'branchphone'}, $data->{'branchfax'}, + $data->{'branchemail'}, $data->{'branchurl'}, $data->{'branchip'}, $data->{'branchprinter'}, + $data->{'branchnotes'}, $data->{'branchcode'}, ); } @@ -268,6 +324,58 @@ sub GetBranchCategory { return \@results; } +=head2 GetBranchCategories + + my $categories = GetBranchCategories($branchcode,$categorytype); + +Returns a list ref of anon hashrefs with keys eq columns of branchcategories table, +i.e. categorycode, categorydescription, categorytype, categoryname. +if $branchcode and/or $categorytype are passed, limit set to categories that +$branchcode is a member of , and to $categorytype. + +=cut + +sub GetBranchCategories { + my ($branchcode,$categorytype) = @_; + my $dbh = C4::Context->dbh(); + my $query = "SELECT c.* FROM branchcategories c"; + my (@where, @bind); + if($branchcode) { + $query .= ",branchrelations r, branches b "; + push @where, "c.categorycode=r.categorycode and r.branchcode=? "; + push @bind , $branchcode; + } + if ($categorytype) { + push @where, " c.categorytype=? "; + push @bind, $categorytype; + } + $query .= " where " . join(" and ", @where) if(@where); + $query .= " order by categorytype,c.categorycode"; + my $sth=$dbh->prepare( $query); + $sth->execute(@bind); + + my $branchcats = $sth->fetchall_arrayref({}); + $sth->finish(); + return( $branchcats ); +} + +=head2 GetCategoryTypes + +$categorytypes = GetCategoryTypes; +returns a list of category types. +Currently these types are HARDCODED. +type: 'searchdomain' defines a group of agencies that the calling library may search in. +Other usage of agency categories falls under type: 'properties'. + to allow for other uses of categories. +The searchdomain bit may be better implemented as a separate module, but +the categories were already here, and minimally used. +=cut + + #TODO manage category types. rename possibly to 'agency domains' ? as borrowergroups are called categories. +sub GetCategoryTypes() { + return ( 'searchdomain','properties'); +} + =head2 GetBranch $branch = GetBranch( $query, $branches ); @@ -285,49 +393,40 @@ sub GetBranch ($$) { =head2 GetBranchDetail - $branchname = &GetBranchDetail($branchcode); + $branch = &GetBranchDetail($branchcode); -Given the branch code, the function returns the corresponding -branch name for a comprehensive information display +Given the branch code, the function returns a +hashref for the corresponding row in the branches table. =cut sub GetBranchDetail { - my ($branchcode) = @_; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("SELECT * FROM branches WHERE branchcode = ?"); + my ($branchcode) = shift or return; + my $sth = C4::Context->dbh->prepare("SELECT * FROM branches WHERE branchcode = ?"); $sth->execute($branchcode); - my $branchname = $sth->fetchrow_hashref(); - $sth->finish(); - return $branchname; + return $sth->fetchrow_hashref(); } +=head2 GetBranchesInCategory -=head2 get_branchinfos_of + my $branches = GetBranchesInCategory($categorycode); - my $branchinfos_of = get_branchinfos_of(@branchcodes); - -Associates a list of branchcodes to the information of the branch, taken in -branches table. - -Returns a href where keys are branchcodes and values are href where keys are -branch information key. - - print 'branchname is ', $branchinfos_of->{$code}->{branchname}; +Returns a href: keys %$branches eq (branchcode,branchname) . =cut -sub get_branchinfos_of { - my @branchcodes = @_; - - my $query = ' - SELECT branchcode, - branchname - FROM branches - WHERE branchcode IN (' - . join( ',', map( { "'" . $_ . "'" } @branchcodes ) ) . ') -'; - return C4::Koha::get_infos_of( $query, 'branchcode' ); +sub GetBranchesInCategory($) { + my ($categorycode) = @_; + my @branches; + my $dbh = C4::Context->dbh(); + my $sth=$dbh->prepare( "SELECT b.branchcode FROM branchrelations r, branches b + where r.branchcode=b.branchcode and r.categorycode=?"); + $sth->execute($categorycode); + while (my $branch = $sth->fetchrow) { + push @branches, $branch; + } + $sth->finish(); + return( \@branches ); } =head2 GetBranchInfo @@ -335,14 +434,17 @@ sub get_branchinfos_of { $results = GetBranchInfo($branchcode); returns C<$results>, a reference to an array of hashes containing branches. - +if $branchcode, just this branch, with associated categories. +if ! $branchcode && $categorytype, all branches in the category. =cut sub GetBranchInfo { - my ($branchcode) = @_; + my ($branchcode,$categorytype) = @_; my $dbh = C4::Context->dbh; my $sth; - if ($branchcode) { + + + if ($branchcode) { $sth = $dbh->prepare( "Select * from branches where branchcode = ? order by branchcode"); @@ -354,10 +456,16 @@ sub GetBranchInfo { } my @results; while ( my $data = $sth->fetchrow_hashref ) { - my $nsth = - $dbh->prepare( - "select categorycode from branchrelations where branchcode = ?"); - $nsth->execute( $data->{'branchcode'} ); + my @bind = ($data->{'branchcode'}); + my $query= "select r.categorycode from branchrelations r"; + $query .= ", branchcategories c " if($categorytype); + $query .= " where branchcode=? "; + if($categorytype) { + $query .= " and c.categorytype=? and r.categorycode=c.categorycode"; + push @bind, $categorytype; + } + my $nsth=$dbh->prepare($query); + $nsth->execute( @bind ); my @cats = (); while ( my ($cat) = $nsth->fetchrow_array ) { push( @cats, $cat ); @@ -392,14 +500,44 @@ sets the data from the editbranch form, and writes to the database... =cut sub ModBranchCategoryInfo { - my ($data) = @_; my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("replace branchcategories (categorycode,categoryname,codedescription) values (?,?,?)"); - $sth->execute(uc( $data->{'categorycode'} ),$data->{'categoryname'}, $data->{'codedescription'} ); - $sth->finish; + if ($data->{'add'}){ + # we are doing an insert + my $sth = $dbh->prepare("INSERT INTO branchcategories (categorycode,categoryname,codedescription,categorytype) VALUES (?,?,?,?)"); + $sth->execute(uc( $data->{'categorycode'} ),$data->{'categoryname'}, $data->{'codedescription'},$data->{'categorytype'} ); + $sth->finish(); + } + else { + # modifying + my $sth = $dbh->prepare("UPDATE branchcategories SET categoryname=?,codedescription=?,categorytype=? WHERE categorycode=?"); + $sth->execute($data->{'categoryname'}, $data->{'codedescription'},$data->{'categorytype'},uc( $data->{'categorycode'} ) ); + $sth->finish(); + } +} + +=head2 CheckCategoryUnique + +if (CheckCategoryUnique($categorycode)){ + # do something +} + +=cut + +sub CheckCategoryUnique { + my $categorycode = shift; + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("SELECT categorycode FROM branchcategories WHERE categorycode = ?"); + $sth->execute(uc( $categorycode) ); + if (my $data = $sth->fetchrow_hashref){ + return 0; + } + else { + return 1; + } } + =head2 DeleteBranchCategory DeleteBranchCategory($categorycode); @@ -433,10 +571,20 @@ sub CheckBranchCategorycode { return $total; } +sub get_branch_code_from_name { + my @branch_name = @_; + my $query = "SELECT branchcode FROM branches WHERE branchname=?;"; + my $dbh = C4::Context->dbh(); + my $sth = $dbh->prepare($query); + $sth->execute(@branch_name); + return $sth->fetchrow_array; +} +1; +__END__ =head1 AUTHOR -Koha Developement team +Koha Development Team =cut