bug 2848 [1/2]: Send notifications to patrons when hold is received
[koha.git] / C4 / Members / Messaging.pm
1 package C4::Members::Messaging;
2
3 # Copyright (C) 2008 LibLime
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 use strict;
21 use warnings;
22 use C4::Context;
23
24 use vars qw($VERSION);
25
26 BEGIN {
27     # set the version for version checking
28     $VERSION = 3.00;
29 }
30
31 =head1 NAME
32
33 C4::Members::Messaging - manage patron messaging preferences
34
35 =head1 SYNOPSIS
36
37 =over 4
38
39 =back
40
41 =head1 FUNCTIONS
42
43
44 =head2 GetMessagingPreferences
45
46 =over 4
47
48 my $preferences = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrower->{'borrowernumber'},
49                                                                      message_name   => 'DUE' } );
50
51 returns: a hashref of messaging preferences for this borrower for a particlar message_name
52
53 =back
54
55 =cut
56
57 sub GetMessagingPreferences {
58     my $params = shift;
59
60     foreach my $required ( qw( borrowernumber message_name ) ) {
61         if ( ! exists $params->{ $required } ) {
62             return;
63         }
64     }
65
66     my $sql = <<'END_SQL';
67 SELECT borrower_message_preferences.*,
68        borrower_message_transport_preferences.message_transport_type,
69        message_attributes.*,
70        message_transports.*
71   FROM borrower_message_preferences
72   LEFT JOIN borrower_message_transport_preferences
73     ON borrower_message_transport_preferences.borrower_message_preference_id = borrower_message_preferences.borrower_message_preference_id
74   LEFT JOIN message_attributes
75     ON message_attributes.message_attribute_id = borrower_message_preferences.message_attribute_id
76   LEFT JOIN message_transports
77     ON message_transports.message_attribute_id = message_attributes.message_attribute_id
78     AND message_transports.message_transport_type = borrower_message_transport_preferences.message_transport_type
79   WHERE borrower_message_preferences.borrowernumber = ?
80    AND message_attributes.message_name = ?
81 END_SQL
82
83     my @bind_params = ( $params->{'borrowernumber'}, $params->{'message_name'} );
84
85     my $sth = C4::Context->dbh->prepare($sql);
86     $sth->execute(@bind_params);
87     my $return;
88     my %transports; # helps build a list of unique message_transport_types
89     ROW: while ( my $row = $sth->fetchrow_hashref() ) {
90         next ROW unless $row->{'message_attribute_id'};
91         # warn( Data::Dumper->Dump( [ $row ], [ 'row' ] ) );
92         $return->{'days_in_advance'} = $row->{'days_in_advance'} if defined $row->{'days_in_advance'};
93         $return->{'wants_digest'}    = $row->{'wants_digest'}    if defined $row->{'wants_digest'};
94                 $return->{'letter_code'}     = $row->{'letter_code'};
95         $transports{$row->{'message_transport_type'}} = 1;
96     }
97     @{$return->{'transports'}} = keys %transports;
98     return $return;
99 }
100
101 =head2 SetMessagingPreferences
102
103 =over 4
104
105
106 C4::Members::Messaging::SetMessagingPreference( { borrowernumber          => $borrower->{'borrowernumber'}
107                                                   message_attribute_id    => $message_attribute_id,
108                                                   message_transport_types => [ qw( email sms ) ],
109                                                   days_in_advance         => 5
110                                                   wants_digest            => 1 } )
111
112 returns nothing useful.
113
114 =back
115
116 =cut
117
118 sub SetMessagingPreference {
119     my $params = shift;
120
121     foreach my $required ( qw( borrowernumber message_attribute_id message_transport_types ) ) {
122         if ( ! exists $params->{ $required } ) {
123             warn "SetMessagingPreference called without required parameter: $required";
124             return;
125         }
126     }
127     $params->{'days_in_advance'} = undef unless exists ( $params->{'days_in_advance'} );
128     $params->{'wants_digest'}    = 0     unless exists ( $params->{'wants_digest'} );
129
130     my $dbh = C4::Context->dbh();
131     
132     my $delete_sql = <<'END_SQL';
133 DELETE FROM borrower_message_preferences
134   WHERE borrowernumber = ?
135     AND message_attribute_id = ?
136 END_SQL
137     my $sth = $dbh->prepare( $delete_sql );
138     my $deleted = $sth->execute( $params->{'borrowernumber'}, $params->{'message_attribute_id'} );
139
140     if ( $params->{'message_transport_types'} ) {
141         my $insert_bmp = <<'END_SQL';
142 INSERT INTO borrower_message_preferences
143 (borrower_message_preference_id, borrowernumber, message_attribute_id, days_in_advance, wants_digest)
144 VALUES
145 (NULL, ?, ?, ?, ?)
146 END_SQL
147         
148         $sth = C4::Context->dbh()->prepare($insert_bmp);
149         my $success = $sth->execute( $params->{'borrowernumber'},
150                                      $params->{'message_attribute_id'},
151                                      $params->{'days_in_advance'},
152                                      $params->{'wants_digest'} );
153         
154         # my $borrower_message_preference_id = $dbh->last_insert_id();
155         my $borrower_message_preference_id = $dbh->{'mysql_insertid'};
156         
157         my $insert_bmtp = <<'END_SQL';
158 INSERT INTO borrower_message_transport_preferences
159 (borrower_message_preference_id, message_transport_type)
160 VALUES
161 (?, ?)
162 END_SQL
163         $sth = C4::Context->dbh()->prepare($insert_bmtp);
164         foreach my $transport ( @{$params->{'message_transport_types'}}) {
165             my $success = $sth->execute( $borrower_message_preference_id, $transport );
166         }
167     }
168     return;    
169 }
170
171 =head2 GetMessagingOptions
172
173 =over 4
174
175 my $messaging_options = C4::Members::Messaging::SetMessagingPreference()
176
177 returns a hashref of messaing options available.
178
179 =back
180
181 =cut
182
183 sub GetMessagingOptions {
184
185     my $sql = <<'END_SQL';
186 select message_attributes.message_attribute_id, takes_days, message_name, message_transport_type, is_digest
187   FROM message_attributes
188   LEFT JOIN message_transports
189     ON message_attributes.message_attribute_id = message_transports.message_attribute_id
190 END_SQL
191
192     my $sth = C4::Context->dbh->prepare($sql);
193     $sth->execute();
194     my $choices;
195     while ( my $row = $sth->fetchrow_hashref() ) {
196         $choices->{ $row->{'message_name'} }->{'message_attribute_id'} = $row->{'message_attribute_id'};
197         $choices->{ $row->{'message_name'} }->{'message_name'}         = $row->{'message_name'};
198         $choices->{ $row->{'message_name'} }->{'takes_days'}           = $row->{'takes_days'};
199         $choices->{ $row->{'message_name'} }->{'has_digest'}           = 1 if $row->{'is_digest'};
200         $choices->{ $row->{'message_name'} }->{'transport-' . $row->{'message_transport_type'}} = ' ';
201     }
202
203     my @return = values %$choices;
204     # warn( Data::Dumper->Dump( [ \@return ], [ 'return' ] ) );
205     return \@return;
206 }
207
208 =head1 AUTHOR
209
210 Koha Development Team <info@koha.org>
211
212 Andrew Moore <andrew.moore@liblime.com>
213
214 =cut
215
216 1;