added autocomplete="off"
[koha.git] / C4 / Branch.pm
index 615ca06..7bd0326 100644 (file)
@@ -15,17 +15,40 @@ package C4::Branch;
 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
 # Suite 330, Boston, MA  02111-1307 USA
 
-# $Id$
 
 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 = do { my @v = '$Revision$' =~ /\d+/g; shift(@v).".".join( "_", map { sprintf "%03d", $_ } @v ); };
+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
 
@@ -41,75 +64,65 @@ 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
-);
-
 =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
-            <select name="branch">
-                <option value="">Default</option>
-            <!-- TMPL_LOOP name="branchloop" -->
-                <option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="branchname" --></option>
-            <!-- /TMPL_LOOP -->
-            </select>
+
+    <select name="branch">
+        <option value="">Default</option>
+        <!-- TMPL_LOOP name="branchloop" -->
+        <option value="<!-- TMPL_VAR name="value" -->" <!-- TMPL_IF name="selected" -->selected<!-- /TMPL_IF -->><!-- TMPL_VAR name="branchname" --></option>
+        <!-- /TMPL_LOOP -->
+    </select>
+
+=head4 Note that you often will want to just use GetBranchesLoop, for exactly the example above.
 
 =cut
 
 sub GetBranches {
-
-    my $onlymine=@_;
+    my ($onlymine)=@_;
     # returns a reference to a hash of references to ALL branches...
     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
@@ -119,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
@@ -143,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.
 
@@ -159,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'},
         );
     }
@@ -269,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 );
@@ -286,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
@@ -336,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");
@@ -355,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 );
@@ -393,21 +500,51 @@ 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);
 
 =cut
 
-sub DeleteBranchCategory {
+sub DelBranchCategory {
     my ($categorycode) = @_;
     my $dbh = C4::Context->dbh;
     my $sth = $dbh->prepare("delete from branchcategories where categorycode = ?");
@@ -434,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 <info@koha.org>
+Koha Development Team <http://koha-community.org/>
 
 =cut