Bug 27324: Use Koha.Preference() for intranetbookbag everywhere
[koha.git] / C4 / NewsChannels.pm
1 package C4::NewsChannels;
2
3 # This file is part of Koha.
4 #
5 # Copyright (C) 2000-2002  Katipo Communications
6 # Copyright (C) 2013       Mark Tompsett
7 #
8 # Koha is free software; you can redistribute it and/or modify it
9 # under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # Koha is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with Koha; if not, see <http://www.gnu.org/licenses>.
20
21 use Modern::Perl;
22 use C4::Context;
23 use Koha::DateUtils;
24
25 use vars qw(@ISA @EXPORT);
26
27 BEGIN { 
28     @ISA = qw(Exporter);
29     @EXPORT = qw(
30         &GetNewsToDisplay
31         &add_opac_new &upd_opac_new &del_opac_new &get_opac_new &get_opac_news
32     );
33 }
34
35 =head1 NAME
36
37 C4::NewsChannels - Functions to manage OPAC and intranet news
38
39 =head1 DESCRIPTION
40
41 This module provides the functions needed to mange OPAC and intranet news.
42
43 =head1 FUNCTIONS
44
45 =cut
46
47 =head2 add_opac_new
48
49     $retval = add_opac_new($hashref);
50
51     $hashref should contains all the fields found in opac_news,
52     except idnew. The idnew field is auto-generated.
53
54 =cut
55
56 sub add_opac_new {
57     my ($href_entry) = @_;
58     my $retval = 0;
59
60     if ($href_entry) {
61         $href_entry->{number} = 0 if $href_entry->{number} !~ /^\d+$/;
62         my @fields = keys %{$href_entry};
63         my @values = values %{$href_entry};
64         my $field_string = join ',', @fields;
65         $field_string = $field_string // q{};
66         my $values_string = join(',', map { '?' } @fields);
67         my $dbh = C4::Context->dbh;
68         my $sth = $dbh->prepare("INSERT INTO opac_news ( $field_string ) VALUES ( $values_string )");
69         $sth->execute(@values);
70         $retval = 1;
71     }
72     return $retval;
73 }
74
75 =head2 upd_opac_new
76
77     $retval = upd_opac_new($hashref);
78
79     $hashref should contains all the fields found in opac_news,
80     including idnew, since it is the key for the SQL UPDATE.
81
82 =cut
83
84 sub upd_opac_new {
85     my ($href_entry) = @_;
86     my $retval = 0;
87
88     if ($href_entry) {
89         $href_entry->{number} = 0 if $href_entry->{number} !~ /^\d+$/;
90         # take the keys of hash entry and make a list, but...
91         my @fields = keys %{$href_entry};
92         my @values;
93         $#values = -1;
94         my $field_string = q{};
95         foreach my $field_name (@fields) {
96             # exclude idnew
97             if ( $field_name ne 'idnew' ) {
98                 $field_string = $field_string . "$field_name = ?,";
99                 push @values,$href_entry->{$field_name};
100             }
101         }
102         # put idnew at the end, so we know which record to update
103         push @values,$href_entry->{'idnew'};
104         chop $field_string; # remove that excess ,
105
106         my $dbh = C4::Context->dbh;
107         my $sth = $dbh->prepare("UPDATE opac_news SET $field_string WHERE idnew = ?;");
108         $sth->execute(@values);
109         $retval = 1;
110     }
111     return $retval;
112 }
113
114 sub del_opac_new {
115     my ($ids) = @_;
116     if ($ids) {
117         my $dbh = C4::Context->dbh;
118         my $sth = $dbh->prepare("DELETE FROM opac_news WHERE idnew IN ($ids)");
119         $sth->execute();
120         return 1;
121     } else {
122         return 0;
123     }
124 }
125
126 sub get_opac_new {
127     my ($idnew) = @_;
128     my $dbh = C4::Context->dbh;
129     my $query = q{
130                   SELECT opac_news.*,branches.branchname
131                   FROM opac_news LEFT JOIN branches
132                       ON opac_news.branchcode=branches.branchcode
133                   WHERE opac_news.idnew = ?;
134                 };
135     my $sth = $dbh->prepare($query);
136     $sth->execute($idnew);
137     my $data = $sth->fetchrow_hashref;
138     $data->{expirationdate} = output_pref({ dt => dt_from_string( $data->{expirationdate} ), dateonly => 1 }) if ( $data->{expirationdate} );
139     $data->{published_on} = output_pref({ dt => dt_from_string( $data->{published_on} ), dateonly => 1 });
140     return $data;
141 }
142
143 sub get_opac_news {
144     my ($limit, $lang, $branchcode) = @_;
145     my @values;
146     my $dbh = C4::Context->dbh;
147     my $query = q{
148                   SELECT opac_news.*, branches.branchname,
149                          published_on AS newdate,
150                          borrowers.title AS author_title,
151                          borrowers.firstname AS author_firstname,
152                          borrowers.surname AS author_surname
153                   FROM opac_news LEFT JOIN branches
154                       ON opac_news.branchcode=branches.branchcode
155                   LEFT JOIN borrowers on borrowers.borrowernumber = opac_news.borrowernumber
156                 };
157     $query .= ' WHERE 1';
158     if ($lang) {
159         $query .= " AND (opac_news.lang='' OR opac_news.lang=?)";
160         push @values,$lang;
161     }
162     if ($branchcode) {
163         $query .= ' AND (opac_news.branchcode IS NULL OR opac_news.branchcode=?)';
164         push @values,$branchcode;
165     }
166     $query.= ' ORDER BY published_on DESC ';
167     #if ($limit) {
168     #    $query.= 'LIMIT 0, ' . $limit;
169     #}
170     my $sth = $dbh->prepare($query);
171     $sth->execute(@values);
172     my @opac_news;
173     my $count = 0;
174     while (my $row = $sth->fetchrow_hashref) {
175         if ((($limit) && ($count < $limit)) || (!$limit)) {
176             push @opac_news, $row;
177         }
178         $count++;
179     }
180     return ($count, \@opac_news);
181 }
182
183 =head2 GetNewsToDisplay
184
185     $news = &GetNewsToDisplay($lang,$branch);
186     C<$news> is a ref to an array which contains
187     all news with expirationdate > today or expirationdate is null
188     that is applicable for a given branch.
189
190 =cut
191
192 sub GetNewsToDisplay {
193     my ($lang,$branch) = @_;
194     my $dbh = C4::Context->dbh;
195     my $query = q{
196      SELECT opac_news.*,published_on AS newdate,
197      borrowers.title AS author_title,
198      borrowers.firstname AS author_firstname,
199      borrowers.surname AS author_surname
200      FROM   opac_news
201      LEFT JOIN borrowers on borrowers.borrowernumber = opac_news.borrowernumber
202      WHERE   (
203         expirationdate >= CURRENT_DATE()
204         OR    expirationdate IS NULL
205      )
206      AND   published_on <= CURDATE()
207      AND   (opac_news.lang = '' OR opac_news.lang = ?)
208      AND   (opac_news.branchcode IS NULL OR opac_news.branchcode = ?)
209      ORDER BY number
210     };
211     my $sth = $dbh->prepare($query);
212     $lang = $lang // q{};
213     $sth->execute($lang,$branch);
214     my @results;
215     while ( my $row = $sth->fetchrow_hashref ){
216         $row->{newdate} = output_pref({ dt => dt_from_string( $row->{newdate} ), dateonly => 1 });
217         push @results, $row;
218     }
219     return \@results;
220 }
221
222 1;
223 __END__
224
225 =head1 AUTHOR
226
227 TG
228
229 =cut