Bug Fixing : 1st Step Bookfund has become Budgets
[koha.git] / C4 / Suggestions.pm
1 package C4::Suggestions;
2
3 # Copyright 2000-2002 Katipo Communications
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
10 # version.
11 #
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along with
17 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
18 # Suite 330, Boston, MA  02111-1307 USA
19
20
21 use strict;
22 use CGI;
23
24 use C4::Context;
25 use C4::Output;
26 use C4::Dates qw(format_date);
27 use C4::SQLHelper qw(:all);
28 use C4::Debug;
29 use C4::Letters;
30 use List::MoreUtils qw<any>;
31 use base 'Exporter';  # parent would be better there
32 our $VERSION = 3.01;
33 our @EXPORT  = qw<
34     &ConnectSuggestionAndBiblio
35     &CountSuggestion
36     &DelSuggestion
37     &GetSuggestion
38     &GetSuggestionByStatus
39     &GetSuggestionFromBiblionumber
40     &ModStatus
41     &ModSuggestion
42     &NewSuggestion
43     &SearchSuggestion
44 >;
45 use C4::Dates qw(format_date_in_iso);
46 use vars qw($VERSION @ISA @EXPORT);
47
48 BEGIN {
49         # set the version for version checking
50         $VERSION = 3.01;
51         require Exporter;
52         @ISA = qw(Exporter);
53         @EXPORT = qw(
54                 &NewSuggestion
55                 &SearchSuggestion
56                 &GetSuggestion
57                 &GetSuggestionByStatus
58                 &DelSuggestion
59                 &CountSuggestion
60                 &ModSuggestion
61                 &ConnectSuggestionAndBiblio
62                 &GetSuggestionFromBiblionumber
63     &ConnectSuggestionAndBiblio
64     &CountSuggestion
65     &DelSuggestion
66     &GetSuggestion
67     &GetSuggestionByStatus
68     &GetSuggestionFromBiblionumber
69     &ModStatus
70     &ModSuggestion
71     &NewSuggestion
72         );
73 }
74
75 =head1 NAME
76
77 C4::Suggestions - Some useful functions for dealings with aqorders.
78
79 =head1 SYNOPSIS
80
81 use C4::Suggestions;
82
83 =head1 DESCRIPTION
84
85 The functions in this module deal with the aqorders in OPAC and in librarian interface
86
87 A suggestion is done in the OPAC. It has the status "ASKED"
88
89 When a librarian manages the suggestion, he can set the status to "REJECTED" or "ACCEPTED".
90
91 When the book is ordered, the suggestion status becomes "ORDERED"
92
93 When a book is ordered and arrived in the library, the status becomes "AVAILABLE"
94
95 All aqorders of a borrower can be seen by the borrower itself.
96 Suggestions done by other borrowers can be seen when not "AVAILABLE"
97
98 =head1 FUNCTIONS
99
100 =head2 SearchSuggestion
101
102 (\@array) = &SearchSuggestion($suggestionhashref_to_search)
103
104 searches for a suggestion
105
106 return :
107 C<\@array> : the aqorders found. Array of hash.
108 Note the status is stored twice :
109 * in the status field
110 * as parameter ( for example ASKED => 1, or REJECTED => 1) . This is for template & translation purposes.
111
112 =cut
113
114 sub SearchSuggestion  {
115     my ($suggestion)=@_;
116     my $dbh = C4::Context->dbh;
117         my @sql_params;
118     my @query =(q{ 
119     SELECT suggestions.*,
120         U1.branchcode   AS branchcodesuggestedby,
121         B1.branchname AS branchnamesuggestedby,
122         U1.surname   AS surnamesuggestedby,
123         U1.firstname AS firstnamesuggestedby,
124         U1.borrowernumber AS borrnumsuggestedby,
125         U1.categorycode AS categorycodesuggestedby,
126         C1.description AS categorydescriptionsuggestedby,
127         U2.branchcode AS branchcodemanagedby,
128         B2.branchname AS branchnamemanagedby,
129         U2.surname   AS surnamemanagedby,
130         U2.firstname AS firstnamemanagedby,
131         U2.borrowernumber AS borrnummanagedby
132     FROM suggestions
133     LEFT JOIN borrowers AS U1 ON suggestedby=U1.borrowernumber
134     LEFT JOIN borrowers AS U2 ON managedby=U2.borrowernumber
135     LEFT JOIN categories AS C1 ON C1.categorycode = U1.categorycode
136     LEFT JOIN branches AS B1 ON B1.branchcode = U1.branchcode
137     LEFT JOIN branches AS B2 ON B2.branchcode = U2.branchcode
138         WHERE STATUS NOT IN ('CLAIMED')
139         } , map {
140             if ( my $s = $$suggestion{$_} ) {
141                 push @sql_params,'%'.$s.'%'; 
142                 " and suggestions.$_ like ? ";
143             } else { () }
144         } qw( title author isbn publishercode collectiontitle )
145         );
146
147         my $userenv = C4::Context->userenv;
148     if (C4::Context->preference('IndependantBranches')) {
149                         if ($userenv) {
150                                 if (($userenv->{flags} % 2) != 1 && !$$suggestion{branchcode}){
151                                    push @sql_params,$$userenv{branch};
152                                    push @query,q{ and (branchcode = ? or branchcode ='')};
153                                 }
154                         }
155     }
156
157     foreach my $field (grep { my $fieldname=$_;
158                 any {$fieldname eq $_ } qw<
159         STATUS branchcode itemtype suggestedby managedby acceptedby
160         bookfundid biblionumber
161         >} keys %$suggestion
162     ) {
163                 if ($$suggestion{$field}){
164                         push @sql_params,$$suggestion{$field};
165                         push @query, " and suggestions.$field=?";
166                 } 
167                 else {
168                         push @query, " and (suggestions.$field='' OR suggestions.$field IS NULL)";
169                 }
170     }
171
172         $debug && warn "@query";
173     my $sth=$dbh->prepare("@query");
174     $sth->execute(@sql_params);
175         return ($sth->fetchall_arrayref({}));
176 }
177
178 =head2 GetSuggestion
179
180 \%sth = &GetSuggestion($ordernumber)
181
182 this function get the detail of the suggestion $ordernumber (input arg)
183
184 return :
185     the result of the SQL query as a hash : $sth->fetchrow_hashref.
186
187 =cut
188
189 sub GetSuggestion {
190     my ($ordernumber) = @_;
191     my $dbh = C4::Context->dbh;
192     my $query = "
193         SELECT *
194         FROM   suggestions
195         WHERE  suggestionid=?
196     ";
197     my $sth = $dbh->prepare($query);
198     $sth->execute($ordernumber);
199     return($sth->fetchrow_hashref);
200 }
201
202 =head2 GetSuggestionFromBiblionumber
203
204 $ordernumber = &GetSuggestionFromBiblionumber($biblionumber)
205
206 Get a suggestion from it's biblionumber.
207
208 return :
209 the id of the suggestion which is related to the biblionumber given on input args.
210
211 =cut
212
213 sub GetSuggestionFromBiblionumber {
214     my ($biblionumber) = @_;
215     my $query = q{
216         SELECT suggestionid
217         FROM   suggestions
218         WHERE  biblionumber=?
219         };
220         my $dbh=C4::Context->dbh;
221     my $sth = $dbh->prepare($query);
222     $sth->execute($biblionumber);
223     my ($ordernumber) = $sth->fetchrow;
224     return $ordernumber;
225 }
226
227 =head2 GetSuggestionByStatus
228
229 $aqorders = &GetSuggestionByStatus($status,[$branchcode])
230
231 Get a suggestion from it's status
232
233 return :
234 all the suggestion with C<$status>
235
236 =cut
237
238 sub GetSuggestionByStatus {
239     my $status = shift;
240     my $branchcode = shift;
241     my $dbh = C4::Context->dbh;
242     my @sql_params=($status);  
243     my $query = qq(SELECT suggestions.*,
244                         U1.surname   AS surnamesuggestedby,
245                         U1.firstname AS firstnamesuggestedby,
246                         U1.branchcode AS branchcodesuggestedby,
247                         B1.branchname AS branchnamesuggestedby,
248                                                 U1.borrowernumber AS borrnumsuggestedby,
249                                                 U1.categorycode AS categorycodesuggestedby,
250                         C1.description AS categorydescriptionsuggestedby,
251                         U2.surname   AS surnamemanagedby,
252                         U2.firstname AS firstnamemanagedby,
253                         U2.borrowernumber AS borrnummanagedby
254                         FROM suggestions
255                         LEFT JOIN borrowers AS U1 ON suggestedby=U1.borrowernumber
256                         LEFT JOIN borrowers AS U2 ON managedby=U2.borrowernumber
257                         LEFT JOIN categories AS C1 ON C1.categorycode=U1.categorycode
258                         LEFT JOIN branches AS B1 on B1.branchcode = U1.branchcode
259                         WHERE status = ?);
260     if (C4::Context->preference("IndependantBranches") || $branchcode) {
261         my $userenv = C4::Context->userenv;
262         if ($userenv) {
263             unless ($userenv->{flags} % 2 == 1){
264                 push @sql_params,$userenv->{branch};
265                 $query .= " and (U1.branchcode = ? or U1.branchcode ='')";
266             }
267         }
268         if ($branchcode) {
269             push @sql_params,$branchcode;
270             $query .= " and (U1.branchcode = ? or U1.branchcode ='')";
271         }
272     }
273     
274     my $sth = $dbh->prepare($query);
275     $sth->execute(@sql_params);
276     
277     my $results;
278     $results=  $sth->fetchall_arrayref({});
279     return $results;
280 }
281
282 =head2 CountSuggestion
283
284 &CountSuggestion($status)
285
286 Count the number of aqorders with the status given on input argument.
287 the arg status can be :
288
289 =over 2
290
291 =item * ASKED : asked by the user, not dealed by the librarian
292
293 =item * ACCEPTED : accepted by the librarian, but not yet ordered
294
295 =item * REJECTED : rejected by the librarian (definitive status)
296
297 =item * ORDERED : ordered by the librarian (acquisition module)
298
299 =back
300
301 return :
302 the number of suggestion with this status.
303
304 =cut
305
306 sub CountSuggestion {
307     my ($status) = @_;
308     my $dbh = C4::Context->dbh;
309     my $sth;
310     if (C4::Context->preference("IndependantBranches")){
311         my $userenv = C4::Context->userenv;
312         if ($userenv->{flags} % 2 == 1){
313             my $query = qq |
314                 SELECT count(*)
315                 FROM   suggestions
316                 WHERE  STATUS=?
317             |;
318             $sth = $dbh->prepare($query);
319             $sth->execute($status);
320         }
321         else {
322             my $query = qq |
323                 SELECT count(*)
324                 FROM suggestions LEFT JOIN borrowers ON borrowers.borrowernumber=suggestions.suggestedby
325                 WHERE STATUS=?
326                 AND (borrowers.branchcode='' OR borrowers.branchcode =?)
327             |;
328             $sth = $dbh->prepare($query);
329             $sth->execute($status,$userenv->{branch});
330         }
331     }
332     else {
333         my $query = qq |
334             SELECT count(*)
335             FROM suggestions
336             WHERE STATUS=?
337         |;
338          $sth = $dbh->prepare($query);
339         $sth->execute($status);
340     }
341     my ($result) = $sth->fetchrow;
342     return $result;
343 }
344
345 =head2 NewSuggestion
346
347
348 &NewSuggestion($suggestion);
349
350 Insert a new suggestion on database with value given on input arg.
351
352 =cut
353
354 sub NewSuggestion {
355     my ($suggestion) = @_;
356         $suggestion->{STATUS}="ASKED" unless $suggestion->{STATUS};
357         return InsertInTable("suggestions",$suggestion); 
358 }
359
360 =head2 ModSuggestion
361
362 &ModSuggestion($suggestion)
363
364 Modify the suggestion according to the hash passed by ref.
365 The hash HAS to contain suggestionid
366 Data not defined is not updated unless it is a note or sort1 
367 Send a mail to notify the user that did the suggestion.
368
369 Note that there is no function to modify a suggestion. 
370
371 =cut
372
373 sub ModSuggestion {
374     my ($suggestion)=@_;
375         my $status_update_table=UpdateInTable("suggestions", $suggestion);
376     # check mail sending.
377     if ($$suggestion{STATUS}){
378         my $letter=C4::Letters::getletter('suggestions',$$suggestion{STATUS});
379         if ($letter){
380         my $enqueued = C4::Letters::EnqueueLetter({
381             letter=>$letter,
382             borrowernumber=>$$suggestion{suggestedby},
383             suggestionid=>$$suggestion{suggestionid},
384             msg_transport_type=>'email'
385             });
386         if (!$enqueued){warn "can't enqueue letter $letter";}
387         }
388     }
389         return $status_update_table;
390 }
391
392 =head2 ConnectSuggestionAndBiblio
393
394 &ConnectSuggestionAndBiblio($ordernumber,$biblionumber)
395
396 connect a suggestion to an existing biblio
397
398 =cut
399
400 sub ConnectSuggestionAndBiblio {
401     my ($ordernumber,$biblionumber) = @_;
402     my $dbh=C4::Context->dbh;
403     my $query = "
404         UPDATE suggestions
405         SET    biblionumber=?
406         WHERE  suggestionid=?
407     ";
408     my $sth = $dbh->prepare($query);
409     $sth->execute($biblionumber,$suggestionid);
410 }
411
412 =head2 DelSuggestion
413
414 &DelSuggestion($borrowernumber,$ordernumber)
415
416 Delete a suggestion. A borrower can delete a suggestion only if he is its owner.
417
418 =cut
419
420 sub DelSuggestion {
421     my ($borrowernumber,$ordernumber,$type) = @_;
422     my $dbh = C4::Context->dbh;
423     # check that the suggestion comes from the suggestor
424     my $query = "
425         SELECT suggestedby
426         FROM   suggestions
427         WHERE  suggestionid=?
428     ";
429     my $sth = $dbh->prepare($query);
430     $sth->execute($ordernumber);
431     my ($suggestedby) = $sth->fetchrow;
432     if ($type eq "intranet" || $suggestedby eq $borrowernumber ) {
433         my $queryDelete = "
434             DELETE FROM suggestions
435             WHERE suggestionid=?
436         ";
437         $sth = $dbh->prepare($queryDelete);
438         my $suggestiondeleted=$sth->execute($suggestionid);
439         return $suggestiondeleted;  
440     }
441 }
442
443 1;
444 __END__
445
446
447 =head1 AUTHOR
448
449 Koha Developement team <info@koha.org>
450
451 =cut
452