Zwei neue Features:
[kivitendo-erp.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::Notes;
10
11 sub save {
12   $main::lxdebug->enter_sub();
13
14   my $self     = shift;
15   my %params   = @_;
16
17   my $myconfig = \%main::myconfig;
18   my $form     = $main::form;
19
20   my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
21   my ($query, @values);
22
23   if (!$params{id}) {
24     ($params{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('follow_up_id')|);
25
26     $query = qq|INSERT INTO follow_ups (created_by, done, note_id, follow_up_date, created_for_user, id)
27                 VALUES ((SELECT id FROM employee WHERE login = ?), ?, ?, ?, ?, ?)|;
28
29     push @values, $form->{login};
30
31   } else {
32     $query = qq|UPDATE follow_ups SET done = ?, note_id = ?, follow_up_date = ?, created_for_user = ? WHERE id = ?|;
33   }
34
35   $params{note_id} = Notes->save('id'           => $params{note_id},
36                                  'trans_id'     => $params{id},
37                                  'trans_module' => 'fu',
38                                  'subject'      => $params{subject},
39                                  'body'         => $params{body});
40
41   $params{done} = 1 if (!defined $params{done});
42
43   do_query($form, $dbh, $query, @values, $params{done} ? 't' : 'f', conv_i($params{note_id}), $params{follow_up_date}, conv_i($params{created_for_user}), conv_i($params{id}));
44
45   do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|, conv_i($params{id}));
46
47   my $query = qq|INSERT INTO follow_up_links (follow_up_id, trans_id, trans_type, trans_info) VALUES (?, ?, ?, ?)|;
48   my $sth   = prepare_query($form, $dbh, $query);
49
50   foreach my $link (@{ $params{LINKS} }) {
51     do_statement($form, $sth, $query, conv_i($params{id}), conv_i($link->{trans_id}), $link->{trans_type}, $link->{trans_info});
52   }
53
54   $sth->finish();
55
56   $dbh->commit() unless ($params{dbh});
57
58   $main::lxdebug->leave_sub();
59 }
60
61 sub finish {
62   $main::lxdebug->enter_sub();
63
64   my $self     = shift;
65   my %params   = @_;
66
67   Common::check_params(\%params, 'id');
68
69   my $myconfig = \%main::myconfig;
70   my $form     = $main::form;
71
72   my $dbh      = $form->get_standard_dbh($myconfig);
73
74   do_query($form, $dbh, qq|UPDATE follow_ups SET done = TRUE WHERE id = ?|, conv_i($params{id}));
75
76   $dbh->commit();
77
78   $main::lxdebug->leave_sub();
79 }
80
81 sub delete {
82   $main::lxdebug->enter_sub();
83
84   my $self     = shift;
85   my %params   = @_;
86
87   Common::check_params(\%params, 'id');
88
89   my $myconfig = \%main::myconfig;
90   my $form     = $main::form;
91
92   my $dbh      = $form->get_standard_dbh($myconfig);
93
94   my $id       = conv_i($params{id});
95
96   do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|,                         $id);
97   do_query($form, $dbh, qq|DELETE FROM follow_ups      WHERE id = ?|,                                   $id);
98   do_query($form, $dbh, qq|DELETE FROM notes           WHERE (trans_id = ?) AND (trans_module = 'fu')|, $id);
99
100   $dbh->commit();
101
102   $main::lxdebug->leave_sub();
103 }
104
105 sub retrieve {
106   $main::lxdebug->enter_sub();
107
108   my $self     = shift;
109   my %params   = @_;
110
111   Common::check_params(\%params, 'id');
112
113   my $myconfig = \%main::myconfig;
114   my $form     = $main::form;
115
116   my $dbh      = $form->get_standard_dbh($myconfig);
117   my ($query, @values);
118
119   my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $form->{login});
120   $query            = qq|SELECT fu.*, n.subject, n.body, n.created_by
121                          FROM follow_ups fu
122                          LEFT JOIN notes n ON (fu.note_id = n.id)
123                          WHERE (fu.id = ?)
124                            AND (   (fu.created_by = ?) OR (fu.created_for_user = ?)
125                                 OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?)))|;
126   my $ref           = selectfirst_hashref_query($form, $dbh, $query, conv_i($params{id}), $employee_id, $employee_id, $employee_id);
127
128   if (!$ref) {
129     $main::lxdebug->leave_sub();
130     return undef;
131   }
132
133   $ref->{LINKS} = $self->retrieve_links(%{ $ref });
134
135   $main::lxdebug->leave_sub();
136
137   return $ref;
138 }
139
140 sub retrieve_links {
141   $main::lxdebug->enter_sub();
142
143   my $self     = shift;
144   my %params   = @_;
145
146   Common::check_params(\%params, qw(id));
147
148   my $myconfig = \%main::myconfig;
149   my $form     = $main::form;
150
151   my $dbh      = $form->get_standard_dbh($myconfig);
152
153   my $query    = qq|SELECT ful.trans_id, ful.trans_type, ful.trans_info, fu.note_id
154                     FROM follow_up_links ful
155                     LEFT JOIN follow_ups fu ON (ful.follow_up_id = fu.id)
156                     WHERE ful.follow_up_id = ?
157                     ORDER BY ful.itime|;
158
159   my $links    = selectall_hashref_query($form, $dbh, $query, conv_i($params{id}));
160
161   foreach my $link_ref (@{ $links }) {
162     my $link_details = FU->link_details(%{ $link_ref });
163     map { $link_ref->{$_} = $link_details->{$_} } keys %{ $link_details} if ($link_details);
164   }
165
166   $main::lxdebug->leave_sub();
167
168   return $links;
169 }
170
171 sub follow_ups {
172   $main::lxdebug->enter_sub();
173
174   my $self     = shift;
175   my %params   = @_;
176
177   my $myconfig = \%main::myconfig;
178   my $form     = $main::form;
179
180   my $dbh      = $form->get_standard_dbh($myconfig);
181   my ($query, $where, $where_user);
182
183   my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $form->{login});
184   my @values        = ($employee_id, $employee_id);
185
186   if ($params{trans_id}) {
187     $where .= qq| AND EXISTS (SELECT * FROM follow_up_links ful
188                               WHERE (ful.follow_up_id = fu.id) AND (ful.trans_id = ?))|;
189     push @values, conv_i($params{trans_id});
190   }
191
192   if ($params{due_only}) {
193     $where .= qq| AND (fu.follow_up_date <= current_date)|;
194   }
195
196   if ($params{done} ne $params{not_done}) {
197     my $not  = $params{not_done} ? 'NOT' : '';
198     $where  .= qq| AND $not COALESCE(fu.done, FALSE)|;
199   }
200
201   if ($params{not_id}) {
202     $where .= qq| AND (fu.id <> ?)|;
203     push @values, conv_i($params{not_id});
204   }
205
206   foreach my $item (qw(subject body)) {
207     next unless ($params{$item});
208     $where .= qq| AND (n.${item} ILIKE ?)|;
209     push @values, '%' . $params{$item} . '%';
210   }
211
212   if ($params{reference}) {
213     $where .= qq| AND EXISTS (SELECT ful.follow_up_id
214                               FROM follow_up_links ful
215                               WHERE (ful.follow_up_id = fu.id)
216                                 AND (ful.trans_info ILIKE ?)
217                               LIMIT 1)|;
218     push @values, '%' . $params{reference} . '%';
219   }
220
221   if ($params{follow_up_date_from}) {
222     $where .= qq| AND (fu.follow_up_date >= ?)|;
223     push @values, conv_date($params{follow_up_date_from});
224   }
225   if ($params{follow_up_date_to}) {
226     $where .= qq| AND (fu.follow_up_date <= ?)|;
227     push @values, conv_date($params{follow_up_date_to});
228   }
229
230   if ($params{itime_from}) {
231     $where .= qq| AND (date_trunc('DAY', fu.itime) >= ?)|;
232     push @values, conv_date($params{itime_from});
233   }
234   if ($params{itime_to}) {
235     $where .= qq| AND (date_trunc('DAY', fu.itime) <= ?)|;
236     push @values, conv_date($params{itime_to});
237   }
238
239   if ($params{all_users}) {
240     $where_user = qq|OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?))|;
241     push @values, $employee_id;
242   }
243
244   $query  = qq|SELECT fu.*, n.subject, n.body, n.created_by,
245                  fu.follow_up_date <= current_date AS due,
246                  fu.itime::DATE                    AS created_on,
247                  COALESCE(eby.name,  eby.login)    AS created_by_name,
248                  COALESCE(efor.name, efor.login)   AS created_for_user_name
249                FROM follow_ups fu
250                LEFT JOIN notes    n    ON (fu.note_id          = n.id)
251                LEFT JOIN employee eby  ON (n.created_by        = eby.id)
252                LEFT JOIN employee efor ON (fu.created_for_user = efor.id)
253                WHERE ((fu.created_by = ?) OR (fu.created_for_user = ?)
254                       $where_user)
255                  $where
256                ORDER BY fu.follow_up_date DESC, fu.id ASC|;
257
258   my $follow_ups = selectall_hashref_query($form, $dbh, $query, @values);
259
260   if (!scalar @{ $follow_ups }) {
261     $main::lxdebug->leave_sub();
262     return $follow_ups;
263   }
264
265   foreach my $fu (@{ $follow_ups }) {
266     $fu->{LINKS} = $self->retrieve_links(%{ $fu });
267   }
268
269   $main::lxdebug->leave_sub();
270
271   return $follow_ups;
272 }
273
274 sub link_details {
275   $main::lxdebug->enter_sub();
276
277   my $self     = shift;
278   my %params   = @_;
279
280   Common::check_params(\%params, qw(trans_id trans_type));
281
282   my $myconfig = \%main::myconfig;
283   my $form     = $main::form;
284   my $locale   = $main::locale;
285
286   my $q_id     = $form->quote($params{trans_id});
287   my $link;
288
289   if ($params{trans_type} eq 'customer') {
290     $link = {
291       'url'   => 'ct.pl?action=edit&db=customer&id=' . $form->quote($params{trans_id}) . '&edit_note_id=' . $form->quote($params{note_id}),
292       'title' => $locale->text('Customer') . " '$params{trans_info}'",
293     };
294
295   } elsif ($params{trans_type} eq 'vendor') {
296     $link = {
297       'url'   => 'ct.pl?action=edit&type=sales_quotation&id=' . $params{trans_id} . '&edit_note_id=' . $form->quote($params{note_id}),
298       'title' => $locale->text('Vendor') . " '$params{trans_info}'",
299     };
300
301   } elsif ($params{trans_type} eq 'sales_quotation') {
302     $link = {
303       'url'   => 'oe.pl?action=edit&type=sales_quotation&id=' . $params{trans_id},
304       'title' => $locale->text('Sales quotation') . " $params{trans_info}",
305     };
306
307   } elsif ($params{trans_type} eq 'sales_order') {
308     $link = {
309       'url'   => 'oe.pl?action=edit&type=sales_order&id=' . $params{trans_id},
310       'title' => $locale->text('Sales Order') . " $params{trans_info}",
311     };
312
313   } elsif ($params{trans_type} eq 'sales_invoice') {
314     $link = {
315       'url'   => 'is.pl?action=edit&type=invoice&id=' . $params{trans_id},
316       'title' => $locale->text('Sales Invoice') . " $params{trans_info}",
317     };
318
319   } elsif ($params{trans_type} eq 'credit_note') {
320     $link = {
321       'url'   => 'is.pl?action=edit&type=credit_note&id=' . $params{trans_id},
322       'title' => $locale->text('Credit Note') . " $params{trans_info}",
323     };
324
325   } elsif ($params{trans_type} eq 'dunning') {
326     $link = {
327       'url'   => 'dn.pl?action=print_dunning&format=pdf&media=screen&dunning_id=' . $params{trans_id},
328       'title' => $locale->text('Dunning') . " $params{trans_info}",
329     };
330
331   } elsif ($params{trans_type} eq 'request_quotation') {
332     $link = {
333       'url'   => 'oe.pl?action=edit&type=request_quotation&id=' . $params{trans_id},
334       'title' => $locale->text('Request quotation') . " $params{trans_info}",
335     };
336
337   } elsif ($params{trans_type} eq 'purchase_order') {
338     $link = {
339       'url'   => 'oe.pl?action=edit&type=purchase_order&id=' . $params{trans_id},
340       'title' => $locale->text('Purchase Order') . " $params{trans_info}",
341     };
342
343   } elsif ($params{trans_type} eq 'vendor_invoice') {
344     $link = {
345       'url'   => 'ir.pl?action=edit&type=invoice&id=' . $params{trans_id},
346       'title' => $locale->text('Vendor Invoice') . " $params{trans_info}",
347     };
348
349   } elsif ($params{trans_type} eq 'ar_transaction') {
350     $link = {
351       'url'   => 'ar.pl?action=editid=' . $params{trans_id},
352       'title' => $locale->text('AR Transaction') . " $params{trans_info}",
353     };
354
355   } elsif ($params{trans_type} eq 'ap_transaction') {
356     $link = {
357       'url'   => 'ap.pl?action=editid=' . $params{trans_id},
358       'title' => $locale->text('AP Transaction') . " $params{trans_info}",
359     };
360
361   } elsif ($params{trans_type} eq 'gl_transaction') {
362     $link = {
363       'url'   => 'gl.pl?action=edit&id=' . $params{trans_id},
364       'title' => $locale->text('GL Transaction') . " $params{trans_info}",
365     };
366
367   }
368
369   $main::lxdebug->leave_sub();
370
371   return $link || { };
372 }
373
374 sub save_access_rights {
375   $main::lxdebug->enter_sub();
376
377   my $self     = shift;
378   my %params   = @_;
379
380   Common::check_params(\%params, 'access');
381
382   my $myconfig = \%main::myconfig;
383   my $form     = $main::form;
384
385   my $dbh      = $form->get_standard_dbh($myconfig);
386
387   my ($id)     = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $form->{login});
388
389   my $query    = qq|INSERT INTO follow_up_access (who, what) VALUES (?, ?)|;
390   my $sth      = prepare_query($form, $dbh, $query);
391
392   do_query($form, $dbh, qq|DELETE FROM follow_up_access WHERE what = ?|, $id);
393
394   while (my ($who, $access_allowed) = each %{ $params{access} }) {
395     next unless ($access_allowed);
396
397     do_statement($form, $sth, $query, conv_i($who), $id);
398   }
399
400   $sth->finish();
401
402   $dbh->commit();
403
404   $main::lxdebug->leave_sub();
405 }
406
407 sub retrieve_access_rights {
408   $main::lxdebug->enter_sub();
409
410   my $self     = shift;
411   my %params   = @_;
412
413   my $myconfig = \%main::myconfig;
414   my $form     = $main::form;
415
416   my $dbh      = $form->get_standard_dbh($myconfig);
417
418   my $sth      = prepare_execute_query($form, $dbh, qq|SELECT who FROM follow_up_access WHERE what = (SELECT id FROM employee WHERE login = ?)|, $form->{login});
419   my $access   = {};
420
421   while (my $ref = $sth->fetchrow_hashref()) {
422     $access->{$ref->{who}} = 1;
423   }
424
425   $sth->finish();
426
427   $main::lxdebug->leave_sub();
428
429   return $access;
430 }
431
432 1;