[Koha-patches] [PATCH 15/55] Adding C4/IssuingRules

Henri-Damien LAURENT henridamien.laurent at biblibre.com
Wed Mar 10 22:25:57 CET 2010


This adds a new module for IssuingRules Management
---
 C4/IssuingRules.pm |  261 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 261 insertions(+), 0 deletions(-)
 create mode 100644 C4/IssuingRules.pm

diff --git a/C4/IssuingRules.pm b/C4/IssuingRules.pm
new file mode 100644
index 0000000..b64b817
--- /dev/null
+++ b/C4/IssuingRules.pm
@@ -0,0 +1,261 @@
+package C4::IssuingRules;
+
+# Copyright 2009 BibLibre SARL
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+
+use strict;
+use warnings;
+use C4::Context;
+use C4::Koha;
+use C4::SQLHelper qw( SearchInTable InsertInTable UpdateInTable DeleteInTable );
+use Memoize;
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+
+BEGIN {
+	# set the version for version checking
+	$VERSION = 3.0.5;
+	@ISA    = qw(Exporter);
+	@EXPORT = qw(
+	    &GetIssuingRule
+		&GetIssuingRulesByBranchCode
+		&GetIssuingRules
+		&AddIssuingRule
+		&ModIssuingRule
+		&DelIssuingRule
+	);
+}
+
+=head1 NAME
+
+C4::IssuingRules - Koha issuing rules module
+
+=head1 SYNOPSIS
+
+use C4::IssuingRules;
+
+=head1 DESCRIPTION
+
+The functions in this module deal with issuing rules.
+
+=head1 FUNCTIONS
+
+=head2 GetIssuingRule
+
+Compute the issuing rule for an itemtype, a borrower category and a branch.
+Returns a hashref from the issuingrules table.
+
+my $rule = &GetIssuingRule($categorycode, $itemtype, $branchcode);
+
+The rules are applied from most specific to less specific, using the first found in this order:
+    * same library, same patron type, same item type
+    * same library, same patron type, default item type
+    * same library, default patron type, same item type
+    * same library, default patron type, default item type
+    * default library, same patron type, same item type
+    * default library, same patron type, default item type
+    * default library, default patron type, same item type
+    * default library, default patron type, default item type
+
+The values in the returned hashref are inherited from a more generic rules if undef.
+
+=cut
+#Caching GetIssuingRule
+memoize('GetIssuingRule');
+
+sub GetIssuingRule {
+    my ( $categorycode, $itemtype, $branchcode ) = @_;
+    $categorycode||="*";
+    $itemtype||="*";
+    $branchcode||="*";
+
+    # This configuration table defines the order of inheritance. We'll loop over it.
+    my @attempts = (
+        [ "*"          , "*"      , "*"         ],
+        [ "*"          , $itemtype, "*"         ],
+        [ $categorycode, "*"      , "*"         ],
+        [ $categorycode, $itemtype, "*"         ],
+        [ "*"          , "*"      , $branchcode ],
+        [ "*"          , $itemtype, $branchcode ],
+        [ $categorycode, "*"      , $branchcode ],
+        [ $categorycode, $itemtype, $branchcode ],
+    );
+
+    # This complex query returns a nested hashref, so we can access a rule using :
+    # my $rule = $$rules{$categorycode}{$itemtype}{$branchcode};
+    # this will be usefull in the inheritance computation code
+    my $dbh = C4::Context->dbh;
+    my $rules = $dbh->selectall_hashref(
+        "SELECT * FROM issuingrules where branchcode IN ('*',?) and itemtype IN ('*', ?) and categorycode IN ('*',?)",
+        ["branchcode", "itemtype", "categorycode"],
+        undef,
+        ( $branchcode, $itemtype, $categorycode )
+    );
+
+    # This block is for inheritance. It loops over rules returned by the 
+    # previous query. If a value is found in a more specific rule, it replaces 
+    # the old value from the more generic rule.
+    my $oldrule;
+    for my $attempt ( @attempts ) {
+        if ( my $rule = $$rules{@$attempt[2]}{@$attempt[1]}{@$attempt[0]} ) {
+            if ( $oldrule ) {
+                for ( keys %$oldrule ) {
+                    if ( defined $rule->{$_} ) {
+                        $oldrule->{$_} = $rule->{$_};
+                    }
+                }
+            } else {
+                $oldrule = $rule;
+            }
+        }
+    }
+    if($oldrule){
+        return $oldrule;
+    }else{
+        return {
+            'itemtype'          => $itemtype,
+            'categorycode'      => $categorycode,
+            'branchcode'        => $branchcode,
+            'holdspickupdelay'  => 0,
+       #     'maxissueqty'       => 0,
+            'renewalsallowed'   => 0,
+            'firstremind'       => 0,
+            'accountsent'       => 0,
+            'reservecharge'     => 0,
+            'fine'              => 0,
+            'restrictedtype'    => 0,
+            'rentaldiscount'    => 0,
+            'chargename'        => 0,
+            'finedays'          => 0,
+            'holdrestricted'    => 0,
+            'allowonshelfholds' => 0,
+            'reservesallowed'   => 0,
+            'chargeperiod'      => 0,
+       #     'issuelength'       => 0,
+            'renewalperiod'     => 0,
+        };
+    }
+}
+
+=head2 GetIssuingRulesByBranchCode
+  
+  my @issuingrules = &GetIssuingRulesByBranchCode($branchcode);
+
+  Retruns a list of hashref from the issuingrules Koha table for a given 
+  branchcode.
+  Each hashref will contain data from issuingrules plus human readable names of 
+  patron and item categories.
+
+=cut
+
+sub GetIssuingRulesByBranchCode {
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare("
+        SELECT issuingrules.*, itemtypes.description AS humanitemtype, categories.description AS humancategorycode
+        FROM issuingrules
+        LEFT JOIN itemtypes
+            ON (itemtypes.itemtype = issuingrules.itemtype)
+        LEFT JOIN categories
+            ON (categories.categorycode = issuingrules.categorycode)
+        WHERE issuingrules.branchcode = ?
+        ORDER BY humancategorycode, humanitemtype
+    ");
+    $sth->execute(shift);
+    
+    my $res = $sth->fetchall_arrayref({});
+    
+    return @$res;
+}
+
+=head2 GetIssuingRules
+  
+  my @issuingrules = &GetIssuingRules({
+      branchcode   => $branch, 
+      categorycode => $input->param('categorycode'), 
+      itemtype     => $input->param('itemtype'),
+  });
+
+  Get an issuing rule from Koha database.
+  An alias for SearchInTable, see C4::SQLHelper for more help.
+
+=cut
+
+sub GetIssuingRules {
+    my $res = SearchInTable('issuingrules', shift);
+    return @$res;
+}
+
+=head2 AddIssuingRule
+
+  my $issuingrule = {
+      branchcode      => $branch,
+      categorycode    => $input->param('categorycode'),
+      itemtype        => $input->param('itemtype'),
+      maxissueqty     => $maxissueqty,
+      renewalsallowed => $input->param('renewalsallowed'),
+      reservesallowed => $input->param('reservesallowed'),
+      issuelength     => $input->param('issuelength'),
+      fine            => $input->param('fine'),
+      finedays        => $input->param('finedays'),
+      firstremind     => $input->param('firstremind'),
+      chargeperiod    => $input->param('chargeperiod'),
+  };
+  
+  &AddIssuingRule( $issuingrule );
+
+  Adds an issuing rule to Koha database.
+  An alias for InsertInTable, see C4::SQLHelper for more help.
+
+=cut
+
+sub AddIssuingRule { InsertInTable('issuingrules',shift); }
+
+=head2 ModIssuingRule
+  
+  &ModIssuingRule( $issuingrule );
+
+  Update an issuing rule of the Koha database.
+  An alias for UpdateInTable, see C4::SQLHelper for more help.
+
+=cut
+
+sub ModIssuingRule { UpdateInTable('issuingrules',shift); }
+
+=head2 DelIssuingRule
+  
+  DelIssuingRule({
+      branchcode   => $branch, 
+      categorycode => $input->param('categorycode'), 
+      itemtype     => $input->param('itemtype'),
+  });
+
+  Delete an issuing rule from Koha database.
+  An alias for DeleteInTable, see C4::SQLHelper for more help.
+
+=cut
+
+sub DelIssuingRule { DeleteInTable('issuingrules',shift); }
+
+1;
+
+=head1 AUTHOR
+
+Koha Developement team <info at koha.org>
+
+Jean-André Santoni <jeanandre.santoni at biblibre.com>
+
+=cut
-- 
1.6.3.3




More information about the Koha-patches mailing list