5 use List::Util qw(first);
12 $main::lxdebug->enter_sub();
17 my $myconfig = \%main::myconfig;
18 my $form = $main::form;
20 my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);
24 ($params{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('follow_up_id')|);
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 = ?), ?, ?, ?, ?, ?)|;
29 push @values, $form->{login};
32 $query = qq|UPDATE follow_ups SET done = ?, note_id = ?, follow_up_date = ?, created_for_user = ? WHERE id = ?|;
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});
41 $params{done} = 1 if (!defined $params{done});
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}));
45 do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|, conv_i($params{id}));
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);
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});
56 $dbh->commit() unless ($params{dbh});
58 $main::lxdebug->leave_sub();
62 $main::lxdebug->enter_sub();
67 Common::check_params(\%params, 'id');
69 my $myconfig = \%main::myconfig;
70 my $form = $main::form;
72 my $dbh = $form->get_standard_dbh($myconfig);
74 do_query($form, $dbh, qq|UPDATE follow_ups SET done = TRUE WHERE id = ?|, conv_i($params{id}));
78 $main::lxdebug->leave_sub();
82 $main::lxdebug->enter_sub();
87 Common::check_params(\%params, 'id');
89 my $myconfig = \%main::myconfig;
90 my $form = $main::form;
92 my $dbh = $form->get_standard_dbh($myconfig);
94 my $id = conv_i($params{id});
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);
102 $main::lxdebug->leave_sub();
106 $main::lxdebug->enter_sub();
111 Common::check_params(\%params, 'id');
113 my $myconfig = \%main::myconfig;
114 my $form = $main::form;
116 my $dbh = $form->get_standard_dbh($myconfig);
117 my ($query, @values);
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
122 LEFT JOIN notes n ON (fu.note_id = n.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);
129 $main::lxdebug->leave_sub();
133 $ref->{LINKS} = $self->retrieve_links(%{ $ref });
135 $main::lxdebug->leave_sub();
141 $main::lxdebug->enter_sub();
146 Common::check_params(\%params, qw(id));
148 my $myconfig = \%main::myconfig;
149 my $form = $main::form;
151 my $dbh = $form->get_standard_dbh($myconfig);
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 = ?
159 my $links = selectall_hashref_query($form, $dbh, $query, conv_i($params{id}));
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);
166 $main::lxdebug->leave_sub();
172 $main::lxdebug->enter_sub();
177 my $myconfig = \%main::myconfig;
178 my $form = $main::form;
180 my $dbh = $form->get_standard_dbh($myconfig);
181 my ($query, $where, $where_user);
183 my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $form->{login});
184 my @values = ($employee_id, $employee_id);
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});
192 if ($params{due_only}) {
193 $where .= qq| AND (fu.follow_up_date <= current_date)|;
196 if ($params{done} ne $params{not_done}) {
197 my $not = $params{not_done} ? 'NOT' : '';
198 $where .= qq| AND $not COALESCE(fu.done, FALSE)|;
201 if ($params{not_id}) {
202 $where .= qq| AND (fu.id <> ?)|;
203 push @values, conv_i($params{not_id});
206 foreach my $item (qw(subject body)) {
207 next unless ($params{$item});
208 $where .= qq| AND (n.${item} ILIKE ?)|;
209 push @values, '%' . $params{$item} . '%';
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 ?)
218 push @values, '%' . $params{reference} . '%';
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});
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});
230 if ($params{itime_from}) {
231 $where .= qq| AND (date_trunc('DAY', fu.itime) >= ?)|;
232 push @values, conv_date($params{itime_from});
234 if ($params{itime_to}) {
235 $where .= qq| AND (date_trunc('DAY', fu.itime) <= ?)|;
236 push @values, conv_date($params{itime_to});
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;
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
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 = ?)
256 ORDER BY fu.follow_up_date DESC, fu.id ASC|;
258 my $follow_ups = selectall_hashref_query($form, $dbh, $query, @values);
260 if (!scalar @{ $follow_ups }) {
261 $main::lxdebug->leave_sub();
265 foreach my $fu (@{ $follow_ups }) {
266 $fu->{LINKS} = $self->retrieve_links(%{ $fu });
269 $main::lxdebug->leave_sub();
275 $main::lxdebug->enter_sub();
280 Common::check_params(\%params, qw(trans_id trans_type));
282 my $myconfig = \%main::myconfig;
283 my $form = $main::form;
284 my $locale = $main::locale;
286 my $q_id = $form->quote($params{trans_id});
289 if ($params{trans_type} eq 'customer') {
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}'",
295 } elsif ($params{trans_type} eq 'vendor') {
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}'",
301 } elsif ($params{trans_type} eq 'sales_quotation') {
303 'url' => 'oe.pl?action=edit&type=sales_quotation&id=' . $params{trans_id},
304 'title' => $locale->text('Sales quotation') . " $params{trans_info}",
307 } elsif ($params{trans_type} eq 'sales_order') {
309 'url' => 'oe.pl?action=edit&type=sales_order&id=' . $params{trans_id},
310 'title' => $locale->text('Sales Order') . " $params{trans_info}",
313 } elsif ($params{trans_type} eq 'sales_invoice') {
315 'url' => 'is.pl?action=edit&type=invoice&id=' . $params{trans_id},
316 'title' => $locale->text('Sales Invoice') . " $params{trans_info}",
319 } elsif ($params{trans_type} eq 'credit_note') {
321 'url' => 'is.pl?action=edit&type=credit_note&id=' . $params{trans_id},
322 'title' => $locale->text('Credit Note') . " $params{trans_info}",
325 } elsif ($params{trans_type} eq 'dunning') {
327 'url' => 'dn.pl?action=print_dunning&format=pdf&media=screen&dunning_id=' . $params{trans_id},
328 'title' => $locale->text('Dunning') . " $params{trans_info}",
331 } elsif ($params{trans_type} eq 'request_quotation') {
333 'url' => 'oe.pl?action=edit&type=request_quotation&id=' . $params{trans_id},
334 'title' => $locale->text('Request quotation') . " $params{trans_info}",
337 } elsif ($params{trans_type} eq 'purchase_order') {
339 'url' => 'oe.pl?action=edit&type=purchase_order&id=' . $params{trans_id},
340 'title' => $locale->text('Purchase Order') . " $params{trans_info}",
343 } elsif ($params{trans_type} eq 'vendor_invoice') {
345 'url' => 'ir.pl?action=edit&type=invoice&id=' . $params{trans_id},
346 'title' => $locale->text('Vendor Invoice') . " $params{trans_info}",
349 } elsif ($params{trans_type} eq 'ar_transaction') {
351 'url' => 'ar.pl?action=editid=' . $params{trans_id},
352 'title' => $locale->text('AR Transaction') . " $params{trans_info}",
355 } elsif ($params{trans_type} eq 'ap_transaction') {
357 'url' => 'ap.pl?action=editid=' . $params{trans_id},
358 'title' => $locale->text('AP Transaction') . " $params{trans_info}",
361 } elsif ($params{trans_type} eq 'gl_transaction') {
363 'url' => 'gl.pl?action=edit&id=' . $params{trans_id},
364 'title' => $locale->text('GL Transaction') . " $params{trans_info}",
369 $main::lxdebug->leave_sub();
374 sub save_access_rights {
375 $main::lxdebug->enter_sub();
380 Common::check_params(\%params, 'access');
382 my $myconfig = \%main::myconfig;
383 my $form = $main::form;
385 my $dbh = $form->get_standard_dbh($myconfig);
387 my ($id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $form->{login});
389 my $query = qq|INSERT INTO follow_up_access (who, what) VALUES (?, ?)|;
390 my $sth = prepare_query($form, $dbh, $query);
392 do_query($form, $dbh, qq|DELETE FROM follow_up_access WHERE what = ?|, $id);
394 while (my ($who, $access_allowed) = each %{ $params{access} }) {
395 next unless ($access_allowed);
397 do_statement($form, $sth, $query, conv_i($who), $id);
404 $main::lxdebug->leave_sub();
407 sub retrieve_access_rights {
408 $main::lxdebug->enter_sub();
413 my $myconfig = \%main::myconfig;
414 my $form = $main::form;
416 my $dbh = $form->get_standard_dbh($myconfig);
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});
421 while (my $ref = $sth->fetchrow_hashref()) {
422 $access->{$ref->{who}} = 1;
427 $main::lxdebug->leave_sub();