Initial revision
[koha.git] / C4 / Circulation / Main.pm
1 package C4::Circulation::Main; #asummes C4/Circulation/Main
2
3 #package to deal with circulation 
4
5 use strict;
6 require Exporter;
7 use DBI;
8 use C4::Database;
9 use C4::Circulation::Issues;
10 use C4::Circulation::Returns;
11 use C4::Circulation::Renewals;
12 use C4::Circulation::Borrower;
13 use C4::Reserves;
14 use C4::Search;
15 use C4::InterfaceCDK;
16 use C4::Security;
17 use C4::Format;
18
19 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
20   
21 # set the version for version checking
22 $VERSION = 0.01;
23     
24 @ISA = qw(Exporter);
25 @EXPORT = qw(&pastitems &checkoverdues &previousissue 
26 &checkreserve &checkwaiting &scanbook &scanborrower &getbranch &getprinter);
27 %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
28                   
29 # your exported package globals go here,
30 # as well as any optionally exported functions
31
32 @EXPORT_OK   = qw($Var1 %Hashit);
33
34
35 # non-exported package globals go here
36 use vars qw(@more $stuff);
37         
38 # initalize package globals, first exported ones
39
40 my $Var1   = '';
41 my %Hashit = ();
42                     
43 # then the others (which are still accessible as $Some::Module::stuff)
44 my $stuff  = '';
45 my @more   = ();
46         
47 # all file-scoped lexicals must be created before
48 # the functions below that use them.
49                 
50 # file-private lexicals go here
51 my $priv_var    = '';
52 my %secret_hash = ();
53                             
54 # here's a file-private function as a closure,
55 # callable as &$priv_func;  it cannot be prototyped.
56 my $priv_func = sub {
57   # stuff goes here.
58 };
59                                                     
60 # make all your functions, whether exported or not;
61
62 sub getbranch {
63   my ($env) = @_;
64   my $dbh = C4Connect;
65   my $query = "select * from branches order by branchcode";
66   my $sth = $dbh->prepare($query);
67   $sth->execute;
68   my @branches;
69   while (my $data = $sth->fetchrow_hashref) {
70     push @branches,$data;
71   }
72   brmenu ($env,\@branches);
73   my $query = "select * from branches  
74     where branchcode = '$env->{'branchcode'}'";
75   $sth = $dbh->prepare($query);
76   $sth->execute;
77   my $data = $sth->fetchrow_hashref;
78   $env->{'brdata'} = $data;
79   $sth->finish;
80   $dbh->disconnect;
81 }
82
83 sub getprinter {
84   my ($env) = @_;
85   my $dbh = C4Connect;
86   my $query = "select * from printers order by printername";
87   my $sth = $dbh->prepare($query);
88   $sth->execute;
89   my @printers;
90   while (my $data = $sth->fetchrow_hashref) {
91     push @printers,$data;
92   }
93   prmenu ($env,\@printers);
94   $sth->finish;
95   $dbh->disconnect;
96   }
97                       
98 sub pastitems{
99   #Get list of all items borrower has currently on issue
100   my ($env,$bornum,$dbh)=@_;
101   my $query1 = "select * from issues  where (borrowernumber=$bornum)
102     and (returndate is null) order by date_due";
103   my $sth=$dbh->prepare($query1);
104   $sth->execute;
105   my $i=0;
106   my @items;
107   my @items2;
108   while (my $data1=$sth->fetchrow_hashref) {
109     my $data = itemnodata($env,$dbh,$data1->{'itemnumber'}); #C4::Search
110     my @date = split("-",$data1->{'date_due'});
111     my $odate = (@date[2]+0)."-".(@date[1]+0)."-".@date[0];
112     my $line = C4::Circulation::Issues::formatitem($env,$data,$odate,"");
113     $items[$i]=$line;
114     $i++;
115   }
116   $sth->finish();
117   return(\@items,\@items2);
118 }
119
120 sub checkoverdues{
121   #checks whether a borrower has overdue items
122   my ($env,$bornum,$dbh)=@_;
123   my @datearr = localtime;
124   my $today = ($datearr[5] + 1900)."-".($datearr[4]+1)."-".$datearr[3];
125   my $query = "Select count(*) from issues where borrowernumber=$bornum and
126         returndate is NULL and date_due < '$today'";
127   my $sth=$dbh->prepare($query);
128   $sth->execute;
129   my $data = $sth->fetchrow_hashref;
130   $sth->finish;
131   return $data->{'count(*)'};
132 }
133
134 sub previousissue {
135   my ($env,$itemnum,$dbh,$bornum)=@_;
136   my $sth=$dbh->prepare("Select 
137      firstname,surname,issues.borrowernumber,cardnumber,returndate
138      from issues,borrowers where 
139      issues.itemnumber='$itemnum' and
140      issues.borrowernumber=borrowers.borrowernumber 
141      and issues.returndate is NULL");
142   $sth->execute;
143   my $borrower=$sth->fetchrow_hashref;
144   my $canissue = "Y";
145   $sth->finish;
146   my $newdate;
147   if ($borrower->{'borrowernumber'} ne ''){
148     if ($bornum eq $borrower->{'borrowernumber'}){
149       # no need to issue
150       my ($renewstatus) = C4::Circulation::Renewals::renewstatus($env,$dbh,$bornum,$itemnum);
151       my ($resbor,$resrec) = checkreserve($env,$dbh,$itemnum);
152       if ($renewstatus == "0") {
153         info_msg($env,"</S>Issued to this borrower - No renewals<!S>");
154         $canissue = "N";
155       } elsif ($resbor ne "") {
156         my $resp = C4::InterfaceCDK::msg_ny($env,"Book is issued to this borrower",
157           "and is reserved - Renew?");
158         if ($resp eq "Y") {
159           $newdate = C4::Circulation::Renewals::renewbook($env,$dbh,$bornum,$itemnum);
160           $canissue = "R";
161         } else {
162           $canissue = "N";
163         }
164       } else {
165         my $resp = C4::InterfaceCDK::msg_yn($env,"Book is issued to this borrower", "Renew?");
166         if ($resp eq "Y") {
167           $newdate = C4::Circulation::Renewals::renewbook($env,$dbh,$bornum,$itemnum);
168           $canissue = "R";
169         } else {
170           $canissue = "N";
171         }
172       }    
173     } else {
174       my $text="Issued to $borrower->{'firstname'} $borrower->{'surname'} ($borrower->{'cardnumber'})";    
175       my $resp = C4::InterfaceCDK::msg_yn($env,$text,"Mark as returned?");
176       if ( $resp eq "Y") {
177         &returnrecord($env,$dbh,$borrower->{'borrowernumber'},$itemnum);
178       } else {
179         $canissue = "N";
180       }
181     }
182   } 
183   return($borrower->{'borrowernumber'},$canissue,$newdate);
184 }
185
186
187 sub checkreserve{
188   # Check for reserves for biblio 
189   my ($env,$dbh,$itemnum)=@_;
190   my $resbor = "";
191   my $query = "select * from reserves,items 
192     where (items.itemnumber = '$itemnum')
193     and (reserves.cancellationdate is NULL)
194     and (items.biblionumber = reserves.biblionumber)
195     and ((reserves.found = 'W')
196     or (reserves.found is null)) 
197     order by priority";
198   my $sth = $dbh->prepare($query);
199   $sth->execute();
200   my $resrec;
201   if (my $data=$sth->fetchrow_hashref) {
202     $resrec=$data;
203     my $const = $data->{'constrainttype'};
204     if ($const eq "a") {
205       $resbor = $data->{'borrowernumber'}; 
206     } else {
207       my $found = 0;
208       my $cquery = "select * from reserveconstraints,items 
209          where (borrowernumber='$data->{'borrowernumber'}') 
210          and reservedate='$data->{'reservedate'}'
211          and reserveconstraints.biblionumber='$data->{'biblionumber'}'
212          and (items.itemnumber=$itemnum and 
213          items.biblioitemnumber = reserveconstraints.biblioitemnumber)";
214       my $csth = $dbh->prepare($cquery);
215       $csth->execute;
216       if (my $cdata=$csth->fetchrow_hashref) {$found = 1;}
217       if ($const eq 'o') {
218         if ($found eq 1) {$resbor = $data->{'borrowernumber'};}
219       } else {
220         if ($found eq 0) {$resbor = $data->{'borrowernumber'};} 
221       }
222       $csth->finish();
223     }     
224   }
225   $sth->finish;
226   return ($resbor,$resrec);
227 }
228
229 sub checkwaiting{
230   # check for reserves waiting
231   my ($env,$dbh,$bornum)=@_;
232   my @itemswaiting;
233   my $query = "select * from reserves
234     where (borrowernumber = '$bornum')
235     and (reserves.found='W') and cancellationdate is NULL";
236   my $sth = $dbh->prepare($query);
237   $sth->execute();
238   my $cnt=0;
239   if (my $data=$sth->fetchrow_hashref) {
240     @itemswaiting[$cnt] =$data;
241     $cnt ++
242   }
243   $sth->finish;
244   return ($cnt,\@itemswaiting);
245 }
246
247 sub scanbook {
248   my ($env,$interface)=@_;
249   #scan barcode
250   my ($number,$reason)=dialog("Book Barcode:");
251   $number=uc $number;
252   return ($number,$reason);
253 }
254
255 sub scanborrower {
256   my ($env,$interface)=@_;
257   #scan barcode
258   my ($number,$reason,$book)=C4::InterfaceCDK::borrower_dialog($env); #C4::InterfaceCDK
259   $number= $number;
260   $book=uc $book;
261   return ($number,$reason,$book);
262 }
263
264
265 END { }       # module clean-up code here (global destructor)