]> wagnertech.de Git - mfinanz.git/blob - SL/FU.pm
restart apache2 in postinst
[mfinanz.git] / SL / FU.pm
1 # Follow-Ups
2
3 package FU;
4
5 use List::Util qw(first);
6
7 use SL::Common;
8 use SL::DBUtils;
9 use SL::DB;
10 use SL::DB::FollowUpCreatedForEmployee;
11 use SL::Mailer;
12 use SL::Notes;
13 use SL::Template;
14 use SL::Template::PlainText;
15
16 use strict;
17
18 sub save {
19   my ($self, %params) = @_;
20   $main::lxdebug->enter_sub();
21
22   my $is_new   = !$params{id};
23
24   my $rc = SL::DB->client->with_transaction(\&_save, $self, %params);
25
26   FU->send_email_notification(%params) if ($is_new);
27
28   $::lxdebug->leave_sub;
29   return $rc;
30 }
31
32 sub _save {
33   my $self     = shift;
34   my %params   = @_;
35
36   my $myconfig = \%main::myconfig;
37   my $form     = $main::form;
38
39   my $dbh      = $params{dbh} || SL::DB->client->dbh;
40   my ($query, @values);
41
42   if (!$params{id}) {
43     ($params{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('follow_up_id')|);
44
45     $query = qq|INSERT INTO follow_ups (created_by, note_id, follow_up_date, id)
46                 VALUES ((SELECT id FROM employee WHERE login = ?), ?, ?, ?)|;
47
48     push @values, $::myconfig{login};
49
50   } else {
51     $query = qq|UPDATE follow_ups SET note_id = ?, follow_up_date = ? WHERE id = ?|;
52   }
53
54   $params{note_id} = Notes->save('id'           => $params{note_id},
55                                  'trans_id'     => $params{id},
56                                  'trans_module' => 'fu',
57                                  'subject'      => $params{subject},
58                                  'body'         => $params{body},
59                                  'dbh'          => $dbh,);
60
61   do_query($form, $dbh, $query, @values, conv_i($params{note_id}), $params{follow_up_date}, conv_i($params{id}));
62
63   $params{done} = 1 if (!defined $params{done});
64   if ($params{done}) {
65     do_query($form, $dbh, qq|INSERT INTO follow_up_done (follow_up_id, employee_id) VALUES (?, (SELECT id FROM employee WHERE login = ?))|,
66              conv_i($params{id}), $::myconfig{login});
67   } else {
68     do_query($form, $dbh, qq|DELETE FROM follow_up_done WHERE follow_up_id = ?|, conv_i($params{id}));
69   }
70
71   do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|, conv_i($params{id}));
72
73   $query = qq|INSERT INTO follow_up_links (follow_up_id, trans_id, trans_type, trans_info) VALUES (?, ?, ?, ?)|;
74   my $sth   = prepare_query($form, $dbh, $query);
75
76   foreach my $link (@{ $params{LINKS} }) {
77     do_statement($form, $sth, $query, conv_i($params{id}), conv_i($link->{trans_id}), $link->{trans_type}, $link->{trans_info});
78   }
79
80   $sth->finish();
81
82   do_query($form, $dbh, qq|DELETE FROM follow_up_created_for_employees WHERE follow_up_id = ?|, conv_i($params{id}));
83
84   $query = qq|INSERT INTO follow_up_created_for_employees (follow_up_id, employee_id) VALUES (?, ?)|;
85   $sth   = prepare_query($form, $dbh, $query);
86
87   foreach my $employee_id (@{ $params{created_for_employees} }) {
88     do_statement($form, $sth, $query, conv_i($params{id}), $employee_id);
89   }
90
91   return 1;
92 }
93
94 sub finish {
95   $main::lxdebug->enter_sub();
96
97   my $self     = shift;
98   my %params   = @_;
99
100   Common::check_params(\%params, 'id');
101
102   my $myconfig = \%main::myconfig;
103   my $form     = $main::form;
104
105   my ($done)   = selectrow_query($::form, SL::DB->client->dbh, qq|SELECT id FROM follow_up_done WHERE follow_up_id = ?|, conv_i($params{id}));
106   if (!$done) {
107     SL::DB->client->with_transaction(sub {
108       do_query($form, SL::DB->client->dbh, qq|INSERT INTO follow_up_done (follow_up_id, employee_id) VALUES (?, (SELECT id FROM employee WHERE login = ?))|,
109                conv_i($params{id}), $myconfig->{login});
110       1;
111     }) or do { die SL::DB->client->error };
112   }
113
114   $main::lxdebug->leave_sub();
115 }
116
117 sub delete {
118   $main::lxdebug->enter_sub();
119
120   my $self     = shift;
121   my %params   = @_;
122
123   Common::check_params(\%params, 'id');
124
125   my $myconfig = \%main::myconfig;
126   my $form     = $main::form;
127
128   SL::DB->client->with_transaction(sub {
129     my $dbh      = SL::DB->client->dbh;
130
131     my $id       = conv_i($params{id});
132
133     do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|,                         $id);
134     do_query($form, $dbh, qq|DELETE FROM follow_ups      WHERE id = ?|,                                   $id);
135     do_query($form, $dbh, qq|DELETE FROM notes           WHERE (trans_id = ?) AND (trans_module = 'fu')|, $id);
136     1;
137   }) or do { die SL::DB->client->error };
138
139   $main::lxdebug->leave_sub();
140 }
141
142 sub retrieve {
143   $main::lxdebug->enter_sub();
144
145   my $self     = shift;
146   my %params   = @_;
147
148   Common::check_params(\%params, 'id');
149
150   my $myconfig = \%main::myconfig;
151   my $form     = $main::form;
152
153   my $dbh      = $form->get_standard_dbh($myconfig);
154   my ($query, @values);
155
156   my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $::myconfig{login});
157   $query            = qq|SELECT fu.*, n.subject, n.body, n.created_by,
158                          follow_up_done.follow_up_id AS done,
159                          date_trunc('second', follow_up_done.done_at) AS done_at,
160                          COALESCE(done_by.name, done_by.login) AS done_by_employee_name
161                          FROM follow_ups fu
162                          LEFT JOIN notes n ON (fu.note_id = n.id)
163                          LEFT JOIN follow_up_created_for_employees ON (follow_up_created_for_employees.follow_up_id = fu.id)
164                          LEFT JOIN follow_up_done ON (follow_up_done.follow_up_id = fu.id)
165                          LEFT JOIN employee done_by ON (follow_up_done.employee_id = done_by.id)
166                          WHERE (fu.id = ?)
167                            AND (   (fu.created_by = ?) OR (follow_up_created_for_employees.employee_id = ?)
168                                 OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?)))|;
169   my $ref           = selectfirst_hashref_query($form, $dbh, $query, conv_i($params{id}), $employee_id, $employee_id, $employee_id);
170
171   if (!$ref) {
172     $main::lxdebug->leave_sub();
173     return undef;
174   }
175
176   $ref->{LINKS} = $self->retrieve_links(%{ $ref });
177
178   $main::lxdebug->leave_sub();
179
180   return $ref;
181 }
182
183 sub retrieve_links {
184   $main::lxdebug->enter_sub();
185
186   my $self     = shift;
187   my %params   = @_;
188
189   Common::check_params(\%params, qw(id));
190
191   my $myconfig = \%main::myconfig;
192   my $form     = $main::form;
193
194   my $dbh      = $form->get_standard_dbh($myconfig);
195
196   my $query    = qq|SELECT ful.trans_id, ful.trans_type, ful.trans_info, fu.note_id
197                     FROM follow_up_links ful
198                     LEFT JOIN follow_ups fu ON (ful.follow_up_id = fu.id)
199                     WHERE ful.follow_up_id = ?
200                     ORDER BY ful.itime|;
201
202   my $links    = selectall_hashref_query($form, $dbh, $query, conv_i($params{id}));
203
204   foreach my $link_ref (@{ $links }) {
205     my $link_details = FU->link_details(%{ $link_ref });
206     map { $link_ref->{$_} = $link_details->{$_} } keys %{ $link_details} if ($link_details);
207   }
208
209   $main::lxdebug->leave_sub();
210
211   return $links;
212 }
213
214 sub follow_ups {
215   $main::lxdebug->enter_sub();
216
217   my $self     = shift;
218   my %params   = @_;
219
220   my $myconfig = \%main::myconfig;
221   my $form     = $main::form;
222
223   my $dbh      = $form->get_standard_dbh($myconfig);
224   my ($query, $where, $where_user);
225
226   my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $::myconfig{login});
227   my @values        = ();
228   my @values_user   = ();
229
230   if ($params{trans_id}) {
231     $where .= qq| AND fu.id IN (select follow_up_id from follow_up_links where trans_id = ?)|;
232    # $where .= qq| AND (ful.follow_up_id = fu.id) AND (ful.trans_id = ?))|;
233    # $where .= qq| AND EXISTS (SELECT * FROM follow_up_links ful
234    #                           WHERE (ful.follow_up_id = fu.id) AND (ful.trans_id = ?))|;
235     push @values, conv_i($params{trans_id});
236   }
237
238   if ($params{due_only}) {
239     $where .= qq| AND (fu.follow_up_date <= current_date)|;
240   }
241
242   if ($params{done} ne $params{not_done}) {
243     my $not  = $params{not_done} ? 'NOT' : '';
244     $where  .= qq| AND $not EXISTS (SELECT id FROM follow_up_done WHERE follow_up_id = fu.id)|;
245   }
246
247   if ($params{not_id}) {
248     $where .= qq| AND (fu.id <> ?)|;
249     push @values, conv_i($params{not_id});
250   }
251
252   foreach my $item (qw(subject body)) {
253     next unless ($params{$item});
254     $where .= qq| AND (n.${item} ILIKE ?)|;
255     push @values, like($params{$item});
256   }
257
258   if ($params{reference}) {
259     $where .= qq| AND EXISTS (SELECT ful.follow_up_id
260                               FROM follow_up_links ful
261                               WHERE (ful.follow_up_id = fu.id)
262                                 AND (ful.trans_info ILIKE ?)
263                               LIMIT 1)|;
264     push @values, like($params{reference});
265   }
266
267   if ($params{follow_up_date_from}) {
268     $where .= qq| AND (fu.follow_up_date >= ?)|;
269     push @values, conv_date($params{follow_up_date_from});
270   }
271   if ($params{follow_up_date_to}) {
272     $where .= qq| AND (fu.follow_up_date <= ?)|;
273     push @values, conv_date($params{follow_up_date_to});
274   }
275
276   if ($params{itime_from}) {
277     $where .= qq| AND (date_trunc('DAY', fu.itime) >= ?)|;
278     push @values, conv_date($params{itime_from});
279   }
280   if ($params{itime_to}) {
281     $where .= qq| AND (date_trunc('DAY', fu.itime) <= ?)|;
282     push @values, conv_date($params{itime_to});
283   }
284   if ($params{created_for}) {
285     $where .= qq| AND follow_up_created_for_employees.employee_id = ?|;
286     push @values, conv_i($params{created_for});
287   }
288
289   if ($params{all_users} || $params{trans_id}) {  # trans_id only for documents?
290     $where_user = qq|OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?))|;
291     push @values_user, $employee_id;
292   }
293
294   my $order_by = '';
295
296   if ($form->{sort} ne 'title') {
297     my %sort_columns = (
298       'follow_up_date' => [ qw(fu.follow_up_date fu.id) ],
299       'created_on'     => [ qw(created_on fu.id) ],
300       'subject'        => [ qw(n.subject) ],
301       );
302
303     my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC';
304     my $sortkey = $sort_columns{$form->{sort}} ? $form->{sort} : 'follow_up_date';
305     $order_by   = 'ORDER BY ' . join(', ', map { "$_ $sortdir" } @{ $sort_columns{$sortkey} });
306   }
307
308   $query  = qq|SELECT DISTINCT fu.*, n.subject, n.body, n.created_by,
309                  fu.follow_up_date <= current_date AS due,
310                  fu.itime::DATE                    AS created_on,
311                  COALESCE(eby.name,  eby.login)    AS created_by_name,
312                  follow_up_done.follow_up_id       AS done
313                FROM follow_ups fu
314                LEFT JOIN notes    n    ON (fu.note_id          = n.id)
315                LEFT JOIN employee eby  ON (n.created_by        = eby.id)
316                LEFT JOIN follow_up_created_for_employees ON (follow_up_created_for_employees.follow_up_id = fu.id)
317                LEFT JOIN follow_up_done ON (follow_up_done.follow_up_id = fu.id)
318                WHERE ((fu.created_by = ?) OR (follow_up_created_for_employees.employee_id = ?)
319                       $where_user)
320                  $where
321                $order_by|;
322
323   my $follow_ups = selectall_hashref_query($form, $dbh, $query, $employee_id, $employee_id, @values_user, @values);
324
325   if (!scalar @{ $follow_ups }) {
326     $main::lxdebug->leave_sub();
327     return $follow_ups;
328   }
329
330   foreach my $fu (@{ $follow_ups }) {
331     $fu->{LINKS} = $self->retrieve_links(%{ $fu });
332
333     my $fu_created_for_employees = SL::DB::Manager::FollowUpCreatedForEmployee->get_all(
334       where       => [follow_up_id => $fu->{id}],
335       with_obects => ['employee']);
336     $fu->{created_for_user_name} = join "\n", map { $_->employee->safe_name } @{$fu_created_for_employees};
337   }
338
339   if ($form->{sort} eq 'title') {
340     my $dir_factor = !defined $form->{sortdir} ? 1 : $form->{sortdir} ? 1 : -1;
341     $follow_ups    = [ map  { $_->[1] }
342                        sort { ($a->[0] cmp $b->[0]) * $dir_factor }
343                        map  { my $fu = $follow_ups->[$_]; [ @{ $fu->{LINKS} } ? lc($fu->{LINKS}->[0]->{title}) : '', $fu ] }
344                        (0 .. scalar(@{ $follow_ups }) - 1) ];
345   }
346
347   $main::lxdebug->leave_sub();
348
349   return $follow_ups;
350 }
351
352 sub link_details {
353   $main::lxdebug->enter_sub();
354
355   my $self     = shift;
356   my %params   = @_;
357
358   Common::check_params(\%params, qw(trans_id trans_type));
359
360   my $myconfig = \%main::myconfig;
361   my $form     = $main::form;
362   my $locale   = $main::locale;
363
364   my $q_id     = $form->quote($params{trans_id});
365   my $link;
366
367   if ($params{trans_type} eq 'customer') {
368     $link = {
369       'url'   => 'controller.pl?action=CustomerVendor/edit&db=customer&id=' . $form->quote($params{trans_id}) . '&note_id=' . $form->quote($params{note_id}),
370       'title' => $locale->text('Customer') . " '$params{trans_info}'",
371     };
372
373   } elsif ($params{trans_type} eq 'vendor') {
374     $link = {
375       'url'   => 'controller.pl?action=CustomerVendor/edit&db=vendor&id=' . $params{trans_id} . '&note_id=' . $form->quote($params{note_id}),
376       'title' => $locale->text('Vendor') . " '$params{trans_info}'",
377     };
378
379   } elsif ($params{trans_type} eq 'sales_quotation') {
380     $link = {
381       'url'   => 'controller.pl?action=Order/edit&type=sales_quotation&id=' . $params{trans_id},
382       'title' => $locale->text('Sales quotation') . " $params{trans_info}",
383     };
384
385   } elsif ($params{trans_type} eq 'sales_order_intake') {
386       my $script = 'controller.pl';
387       my $action = 'Order/edit';
388       $link = {
389         'url'   => $script . '?action=' . $action . '&type=sales_quotation_intake&id=' . $params{trans_id},
390         'title' => $locale->text('Order Intake') . " $params{trans_info}",
391       };
392
393   } elsif ($params{trans_type} eq 'sales_delivery_order') {
394
395     $link = {
396       'url'   => 'controller.pl?action=DeliveryOrder/edit&id=' . $params{trans_id} . '&edit_note_id=' . $form->quote($params{note_id}),
397       'title' => $locale->text('Sales delivery order') .' '. $params{trans_info},
398     };
399
400   } elsif ($params{trans_type} eq 'purchase_delivery_order') {
401
402     $link = {
403       'url'   => 'controller.pl?action=DeliveryOrder/edit&id=' . $params{trans_id} . '&edit_note_id=' . $form->quote($params{note_id}),
404       'title' => $locale->text('Purchase delivery order') .' '. $params{trans_info},
405     };
406
407   } elsif ($params{trans_type} eq 'sales_order') {
408     $link = {
409       'url'   => 'controller.pl?action=Order/edit&type=sales_order&id=' . $params{trans_id},
410       'title' => $locale->text('Sales Order') . " $params{trans_info}",
411     };
412
413   } elsif ($params{trans_type} eq 'sales_reclamation') {
414       my $script = 'controller.pl';
415       my $action = 'Reclamation/edit';
416       $link = {
417         'url'   => $script . '?action=' . $action . '&type=sales_reclamation&id=' . $params{trans_id},
418         'title' => $locale->text('Sales Reclamation') . " $params{trans_info}",
419       };
420
421   } elsif ($params{trans_type} eq 'sales_invoice') {
422     $link = {
423       'url'   => 'is.pl?action=edit&type=invoice&id=' . $params{trans_id},
424       'title' => $locale->text('Sales Invoice') . " $params{trans_info}",
425     };
426
427   } elsif ($params{trans_type} eq 'purchase_invoice') {
428     $link = {
429       'url'   => 'ir.pl?action=edit&type=purchase_invoice&id=' . $params{trans_id},
430       'title' => $locale->text('Purchase Invoice') . " $params{trans_info}",
431     };
432
433   } elsif ($params{trans_type} eq 'credit_note') {
434     $link = {
435       'url'   => 'is.pl?action=edit&type=credit_note&id=' . $params{trans_id},
436       'title' => $locale->text('Credit Note') . " $params{trans_info}",
437     };
438
439   } elsif ($params{trans_type} eq 'dunning') {
440     $link = {
441       'url'   => 'dn.pl?action=print_dunning&format=pdf&media=screen&dunning_id=' . $params{trans_id},
442       'title' => $locale->text('Dunning') . " $params{trans_info}",
443     };
444
445   } elsif ($params{trans_type} eq 'request_quotation') {
446     $link = {
447       'url'   => 'controller.pl?action=Order/edit&type=request_quotation&id=' . $params{trans_id},
448       'title' => $locale->text('Request quotation') . " $params{trans_info}",
449     };
450
451   } elsif ($params{trans_type} eq 'purchase_quotation_intake') {
452       my $script = 'controller.pl';
453       my $action = 'Order/edit';
454       $link = {
455         'url'   => $script . '?action=' . $action . '&type=purchase_quotation_intake&id=' . $params{trans_id},
456         'title' => $locale->text('Quotation Intake') . " $params{trans_info}",
457       };
458
459   } elsif ($params{trans_type} eq 'purchase_order') {
460     $link = {
461       'url'   => 'controller.pl?action=Order/edit&type=purchase_order&id=' . $params{trans_id},
462       'title' => $locale->text('Purchase Order') . " $params{trans_info}",
463     };
464
465   } elsif ($params{trans_type} eq 'purchase_reclamation') {
466       my $script = 'controller.pl';
467       my $action = 'Reclamation/edit';
468       $link = {
469         'url'   => $script . '?action=' . $action . '&type=purchase_reclamation&id=' . $params{trans_id},
470         'title' => $locale->text('Purchase Reclamation') . " $params{trans_info}",
471       };
472
473   } elsif ($params{trans_type} eq 'vendor_invoice') {
474     $link = {
475       'url'   => 'ir.pl?action=edit&type=invoice&id=' . $params{trans_id},
476       'title' => $locale->text('Vendor Invoice') . " $params{trans_info}",
477     };
478
479   } elsif ($params{trans_type} eq 'ar_transaction') {
480     $link = {
481       'url'   => 'ar.pl?action=edit&id=' . $params{trans_id},
482       'title' => $locale->text('AR Transaction') . " $params{trans_info}",
483     };
484
485   } elsif ($params{trans_type} eq 'ap_transaction') {
486     $link = {
487       'url'   => 'ap.pl?action=edit&id=' . $params{trans_id},
488       'title' => $locale->text('AP Transaction') . " $params{trans_info}",
489     };
490
491   } elsif ($params{trans_type} eq 'gl_transaction') {
492     $link = {
493       'url'   => 'gl.pl?action=edit&id=' . $params{trans_id},
494       'title' => $locale->text('GL Transaction') . " $params{trans_info}",
495     };
496
497   }
498
499   $main::lxdebug->leave_sub();
500
501   return $link || { };
502 }
503
504 sub save_access_rights {
505   $main::lxdebug->enter_sub();
506
507   my $self     = shift;
508   my %params   = @_;
509
510   Common::check_params(\%params, 'access');
511
512   my $myconfig = \%main::myconfig;
513   my $form     = $main::form;
514
515   SL::DB->client->with_transaction(sub {
516     my $dbh      = SL::DB->client->dbh;
517
518     my ($id)     = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $::myconfig{login});
519
520     do_query($form, $dbh, qq|DELETE FROM follow_up_access WHERE what = ?|, $id);
521
522     my $query    = qq|INSERT INTO follow_up_access (who, what) VALUES (?, ?)|;
523     my $sth      = prepare_query($form, $dbh, $query);
524
525     while (my ($who, $access_allowed) = each %{ $params{access} }) {
526       next unless ($access_allowed);
527
528       do_statement($form, $sth, $query, conv_i($who), $id);
529     }
530
531     $sth->finish();
532     1;
533   }) or do { die SL::DB->client->error };
534
535   $main::lxdebug->leave_sub();
536 }
537
538 sub retrieve_access_rights {
539   $main::lxdebug->enter_sub();
540
541   my $self     = shift;
542   my %params   = @_;
543
544   my $myconfig = \%main::myconfig;
545   my $form     = $main::form;
546
547   my $dbh      = $form->get_standard_dbh($myconfig);
548
549   my $sth      = prepare_execute_query($form, $dbh, qq|SELECT who FROM follow_up_access WHERE what = (SELECT id FROM employee WHERE login = ?)|, $::myconfig{login});
550   my $access   = {};
551
552   while (my $ref = $sth->fetchrow_hashref()) {
553     $access->{$ref->{who}} = 1;
554   }
555
556   $sth->finish();
557
558   $main::lxdebug->leave_sub();
559
560   return $access;
561 }
562
563 sub send_email_notification {
564   $main::lxdebug->enter_sub();
565   my ($self, %params) = @_;
566
567   my $notify_cfg = $main::lx_office_conf{follow_up_notify};
568   if (!$notify_cfg
569    || !$notify_cfg->{email_subject}
570    || !$notify_cfg->{email_from}
571    || !$notify_cfg->{email_template}) {
572     $main::lxdebug->leave_sub();
573     return;
574   }
575
576   my $employee = SL::DB::Manager::Employee->current;
577
578   my @for_employees_ids = @{$params{created_for_employees}};
579
580   my $placeholders = join ', ', map {'?'} @for_employees_ids;
581   my $query = <<SQL;
582   SELECT login
583   FROM employee
584   WHERE id in ($placeholders)
585 SQL
586
587   my $dbh = $employee->dbh;
588   my $hash_key = 'login';
589   my $hashref = $dbh->selectall_hashref(
590     $query, $hash_key, undef, @for_employees_ids
591   );
592   my @logins = keys %$hashref;
593
594   foreach my $login (@logins) {
595     my %recipient  = $main::auth->read_user(
596       login => $login,
597     );
598
599     if (!$recipient{follow_up_notify_by_email} || !$recipient{email}) {
600       next;
601     }
602
603     my %template_params = (
604       follow_up_subject => $params{subject},
605       follow_up_body    => $params{body},
606       follow_up_date    => $params{follow_up_date},
607       creator_name      => $employee->name  || $::form->{login},
608       recipient_name    => $recipient{name} || $recipient{login},
609     );
610
611     my $template = Template->new({ENCODING    => 'utf8'});
612
613     my $body_file = $notify_cfg->{email_template};
614     my $content_type   = $body_file =~ m/.html$/ ? 'text/html' : 'text/plain';
615
616     my $message;
617     $template->process($body_file, \%template_params, \$message)
618     || die $template->error;
619
620     my $param_form = Form->new();
621     $param_form->{$_} = $template_params{$_} for keys %template_params;
622
623     my $mail              = Mailer->new();
624     $mail->{from}         = $notify_cfg->{email_from};
625     $mail->{to}           = $recipient{email};
626     $mail->{subject}      = SL::Template::PlainText->new(form => $param_form)
627                               ->substitute_vars($notify_cfg->{email_subject});
628     $mail->{content_type} = $content_type;
629     $mail->{message}      = $message;
630     $mail->{charset}      = 'UTF-8';
631
632     $mail->send();
633   }
634
635   $main::lxdebug->leave_sub();
636 }
637
638 1;