Bug 5404: Move the test to a new IsMarcStructureInternal sub
[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($VERSION @ISA @EXPORT);
26
27 BEGIN { 
28     $VERSION = 3.07.00.049;    # set the version for version checking
29     @ISA = qw(Exporter);
30     @EXPORT = qw(
31         &GetNewsToDisplay
32         &add_opac_new &upd_opac_new &del_opac_new &get_opac_new &get_opac_news
33     );
34 }
35
36 =head1 NAME
37
38 C4::NewsChannels - Functions to manage OPAC and intranet news
39
40 =head1 DESCRIPTION
41
42 This module provides the functions needed to mange OPAC and intranet news.
43
44 =head1 FUNCTIONS
45
46 =cut
47
48 =head2 add_opac_new
49
50     $retval = add_opac_new($hashref);
51
52     $hashref should contains all the fields found in opac_news,
53     except idnew. The idnew field is auto-generated.
54
55 =cut
56
57 sub add_opac_new {
58     my ($href_entry) = @_;
59     my $retval = 0;
60
61     if ($href_entry) {
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         # take the keys of hash entry and make a list, but...
90         my @fields = keys %{$href_entry};
91         my @values;
92         $#values = -1;
93         my $field_string = q{};
94         foreach my $field_name (@fields) {
95             # exclude idnew
96             if ( $field_name ne 'idnew' ) {
97                 $field_string = $field_string . "$field_name = ?,";
98                 push @values,$href_entry->{$field_name};
99             }
100         }
101         # put idnew at the end, so we know which record to update
102         push @values,$href_entry->{'idnew'};
103         chop $field_string; # remove that excess ,
104
105         my $dbh = C4::Context->dbh;
106         my $sth = $dbh->prepare("UPDATE opac_news SET $field_string WHERE idnew = ?;");
107         $sth->execute(@values);
108         $retval = 1;
109     }
110     return $retval;
111 }
112
113 sub del_opac_new {
114     my ($ids) = @_;
115     if ($ids) {
116         my $dbh = C4::Context->dbh;
117         my $sth = $dbh->prepare("DELETE FROM opac_news WHERE idnew IN ($ids)");
118         $sth->execute();
119         return 1;
120     } else {
121         return 0;
122     }
123 }
124
125 sub get_opac_new {
126     my ($idnew) = @_;
127     my $dbh = C4::Context->dbh;
128     my $query = q{
129                   SELECT opac_news.*,branches.branchname
130                   FROM opac_news LEFT JOIN branches
131                       ON opac_news.branchcode=branches.branchcode
132                   WHERE opac_news.idnew = ?;
133                 };
134     my $sth = $dbh->prepare($query);
135     $sth->execute($idnew);
136     my $data = $sth->fetchrow_hashref;
137     $data->{$data->{'lang'}} = 1 if defined $data->{lang};
138     $data->{expirationdate} = output_pref({ dt => dt_from_string( $data->{expirationdate} ), dateonly => 1 });
139     $data->{timestamp}      = output_pref({ dt => dt_from_string( $data->{timestamp} ), 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                          timestamp 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 timestamp 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 containts
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     # SELECT *,DATE_FORMAT(timestamp, '%d/%m/%Y') AS newdate
196     my $query = q{
197      SELECT opac_news.*,timestamp AS newdate,
198      borrowers.title AS author_title,
199      borrowers.firstname AS author_firstname,
200      borrowers.surname AS author_surname
201      FROM   opac_news
202      LEFT JOIN borrowers on borrowers.borrowernumber = opac_news.borrowernumber
203      WHERE   (
204         expirationdate >= CURRENT_DATE()
205         OR    expirationdate IS NULL
206         OR    expirationdate = '00-00-0000'
207      )
208      AND   DATE(timestamp) < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
209      AND   (lang = '' OR lang = ?)
210      AND   (opac_news.branchcode IS NULL OR opac_news.branchcode = ?)
211      ORDER BY number
212     }; # expirationdate field is NOT in ISO format?
213        # timestamp has HH:mm:ss, CURRENT_DATE generates 00:00:00
214        #           by adding 1, that captures today correctly.
215     my $sth = $dbh->prepare($query);
216     $lang = $lang // q{};
217     $sth->execute($lang,$branch);
218     my @results;
219     while ( my $row = $sth->fetchrow_hashref ){
220         $row->{newdate} = output_pref({ dt => dt_from_string( $row->{newdate} ), dateonly => 1 });
221         push @results, $row;
222     }
223     return \@results;
224 }
225
226 1;
227 __END__
228
229 =head1 AUTHOR
230
231 TG
232
233 =cut