Initial revision
[wip/koha-chris_n.git] / C4 / Circulation.pm
1 package C4::Circulation; #asummes C4/Circulation
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::Interface;
15 use C4::Security;
16
17 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
18   
19 # set the version for version checking
20 $VERSION = 0.01;
21     
22 @ISA = qw(Exporter);
23 @EXPORT = qw(&Start_circ &scanborrower);
24 #@EXPORT = qw(&Start_circ checkoverdues);
25 %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
26                   
27 # your exported package globals go here,
28 # as well as any optionally exported functions
29
30 @EXPORT_OK   = qw($Var1 %Hashit);
31
32
33 # non-exported package globals go here
34 use vars qw(@more $stuff);
35         
36 # initalize package globals, first exported ones
37
38 my $Var1   = '';
39 my %Hashit = ();
40                     
41 # then the others (which are still accessible as $Some::Module::stuff)
42 my $stuff  = '';
43 my @more   = ();
44         
45 # all file-scoped lexicals must be created before
46 # the functions below that use them.
47                 
48 # file-private lexicals go here
49 my $priv_var    = '';
50 my %secret_hash = ();
51                             
52 # here's a file-private function as a closure,
53 # callable as &$priv_func;  it cannot be prototyped.
54 my $priv_func = sub {
55   # stuff goes here.
56 };
57                                                     
58 # make all your functions, whether exported or not;
59
60 sub Start_circ{
61   my ($env)=@_;
62   #connect to database
63   #start interface
64   &startint($env,'Circulation');
65   my $donext = 'Circ';
66   my $reason;
67   my $data;
68   while ($donext ne 'Quit') {
69     if ($donext  eq "Circ") {
70       clearscreen();        
71       ($reason,$data) = menu($env,'console','Circulation', 
72         ('Issues','Returns','Borrower Enquiries','Reserves','Log In'));
73       #debug_msg($env,"data = $data");
74     } else {
75       $data = $donext;
76     }
77     if ($data eq 'Issues') {  
78       $donext=Issue($env); #C4::Circulation::Issues
79       #debug_msg("","do next $donext");
80     } elsif ($data eq 'Returns') {
81       $donext=Returns($env); #C4::Circulation::Returns
82     } elsif ($data eq 'Borrower Enquiries'){
83       $donext=Borenq($env); #C4::Circulation::Borrower
84     } elsif ($data eq 'Reserves'){
85       $donext=EnterReserves($env); #C4::Reserves
86     } elsif ($data eq 'Log In') {
87       &endint($env);
88       &Login($env);   #C4::Security
89       &startint($env,'Circulation');
90     } elsif ($data eq 'Quit') { 
91       $donext = $data;
92     }
93     #debug_msg($env,"donext -  $donext");
94   }
95   &endint($env)  
96 }
97
98 sub pastitems{
99   #Get list of all items borrower has currently on issue
100   my ($env,$bornum,$dbh)=@_;
101   my $sth=$dbh->prepare("Select * from issues,items,biblio
102     where borrowernumber=$bornum and issues.itemnumber=items.itemnumber
103     and items.biblionumber=biblio.biblionumber
104     and returndate is null
105     order by date_due");
106   $sth->execute;
107   my $i=0;
108   my @items;
109   my @items2;
110   #$items[0]=" "x29;
111   #$items2[0]=" "x29;
112   $items[0]=" "x72;
113   $items2[0]=" "x72;
114   while (my $data=$sth->fetchrow_hashref) {
115      my $line = "$data->{'date_due'} $data->{'title'}";
116      # $items[$i]=fmtstr($env,$line,"L29");
117      $items[$i]=fmtstr($env,$line,"L72");
118      $i++;
119   }
120   return(\@items,\@items2);
121   $sth->finish;
122 }
123
124 sub checkoverdues{
125   #checks whether a borrower has overdue items
126   my ($env,$bornum,$dbh)=@_;
127   my $sth=$dbh->prepare("Select * from issues,items,biblio where
128   borrowernumber=$bornum and issues.itemnumber=items.itemnumber and
129   items.biblionumber=biblio.biblionumber");
130   $sth->execute;
131   my $row=1;
132   my $col=40;
133   while (my $data=$sth->fetchrow_hashref){
134     output($row,$col,$data->{'title'});
135     $row++;
136   }
137   $sth->finish;
138 }
139
140 sub previousissue {
141   my ($env,$itemnum,$dbh,$bornum)=@_;
142   my $sth=$dbh->prepare("Select firstname,surname,issues.borrowernumber,cardnumber,returndate
143   from issues,borrowers where 
144   issues.itemnumber='$itemnum' and
145   issues.borrowernumber=borrowers.borrowernumber and issues.returndate is
146 NULL");
147   $sth->execute;
148   my $borrower=$sth->fetchrow_hashref;
149   $sth->finish;
150   if ($borrower->{'borrowernumber'} ne ''){
151     if ($bornum eq $borrower->{'borrowernumber'}){
152       # no need to issue
153       my ($renewstatus) = &renewstatus($env,$dbh,$bornum,$itemnum);
154       my $resp = &msg_yn("Book is issued to this borrower", "Renew?");
155       if ($resp == "y") {
156         &renewbook($env,$dbh,$bornum,$itemnum);
157       }  
158       
159     } else {
160       my $text="Issued to $borrower->{'firstname'} $borrower->{'surname'} ($borrower->{'cardnumber'})";    
161       my $resp = &msg_yn($text,"Mark as returned?");
162       if ($resp == "y") {
163         &returnrecord($env,$dbh,$borrower->{'borrowernumber'},$itemnum);
164         # can issue
165       } else {
166         # can't issue
167       } 
168     }
169   } 
170   return($borrower->{'borrowernumber'});
171   $sth->finish;
172 }
173
174
175 sub checkreserve{
176   # Check for reserves for biblio 
177   # does not look at constraints yet
178   my ($env,$dbh,$itemnum)=@_;
179   my $resbor = "";
180   my $query = "select * from reserves,items 
181   where (items.itemnumber = '$itemnum')
182   and (items.biblionumber = reserves.biblionumber)
183   and (reserves.found is null) order by priority";
184   my $sth = $dbh->prepare($query);
185   $sth->execute();
186   if (my $data=$sth->fetchrow_hashref) {
187     $resbor = $data->{'borrowernumber'}; 
188   }
189   return ($resbor);
190   $sth->finish;
191 }
192
193 sub checkwaiting{
194   # check for reserves waiting
195   my ($env,$dbh,$bornum)=@_;
196   my @itemswaiting="";
197   my $query = "select * from reserves
198   where (borrowernumber = '$bornum')
199   and (reserves.found='W')";
200   my $sth = $dbh->prepare($query);
201   $sth->execute();
202   if (my $data=$sth->fetchrow_hashref) {
203     push @itemswaiting,$data->{'itemnumber'}; 
204   }
205   return (\@itemswaiting);
206   $sth->finish;
207 }
208
209 sub scanbook {
210   my ($env,$interface)=@_;
211   #scan barcode
212   my ($number,$reason)=dialog("Book Barcode:");
213   $number=uc $number;
214   return ($number,$reason);
215 }
216
217 sub scanborrower {
218   my ($env,$interface)=@_;
219   #scan barcode
220   my ($number,$reason,$book)=&borrower_dialog($env); #C4::Interface
221   $number= $number;
222   $book=uc $book;
223   return ($number,$reason,$book);
224 }
225
226
227 END { }       # module clean-up code here (global destructor)