5 use List::Util qw(first);
15 my ($self, %params) = @_;
16 $main::lxdebug->enter_sub();
18 my $rc = SL::DB->client->with_transaction(\&_save, $self, %params);
20 $::lxdebug->leave_sub;
28 my $myconfig = \%main::myconfig;
29 my $form = $main::form;
31 my $dbh = $params{dbh} || SL::DB->client->dbh;
35 ($params{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('follow_up_id')|);
37 $query = qq|INSERT INTO follow_ups (created_by, done, note_id, follow_up_date, created_for_user, id)
38 VALUES ((SELECT id FROM employee WHERE login = ?), ?, ?, ?, ?, ?)|;
40 push @values, $::myconfig{login};
43 $query = qq|UPDATE follow_ups SET done = ?, note_id = ?, follow_up_date = ?, created_for_user = ? WHERE id = ?|;
46 $params{note_id} = Notes->save('id' => $params{note_id},
47 'trans_id' => $params{id},
48 'trans_module' => 'fu',
49 'subject' => $params{subject},
50 'body' => $params{body},
53 $params{done} = 1 if (!defined $params{done});
55 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}));
57 do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|, conv_i($params{id}));
59 $query = qq|INSERT INTO follow_up_links (follow_up_id, trans_id, trans_type, trans_info) VALUES (?, ?, ?, ?)|;
60 my $sth = prepare_query($form, $dbh, $query);
62 foreach my $link (@{ $params{LINKS} }) {
63 do_statement($form, $sth, $query, conv_i($params{id}), conv_i($link->{trans_id}), $link->{trans_type}, $link->{trans_info});
72 $main::lxdebug->enter_sub();
77 Common::check_params(\%params, 'id');
79 my $myconfig = \%main::myconfig;
80 my $form = $main::form;
82 SL::DB->client->with_transaction(sub {
83 do_query($form, SL::DB->client->dbh, qq|UPDATE follow_ups SET done = TRUE WHERE id = ?|, conv_i($params{id}));
85 }) or do { die SL::DB->client->error };
87 $main::lxdebug->leave_sub();
91 $main::lxdebug->enter_sub();
96 Common::check_params(\%params, 'id');
98 my $myconfig = \%main::myconfig;
99 my $form = $main::form;
101 SL::DB->client->with_transaction(sub {
102 my $dbh = SL::DB->client->dbh;
104 my $id = conv_i($params{id});
106 do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|, $id);
107 do_query($form, $dbh, qq|DELETE FROM follow_ups WHERE id = ?|, $id);
108 do_query($form, $dbh, qq|DELETE FROM notes WHERE (trans_id = ?) AND (trans_module = 'fu')|, $id);
110 }) or do { die SL::DB->client->error };
112 $main::lxdebug->leave_sub();
116 $main::lxdebug->enter_sub();
121 Common::check_params(\%params, 'id');
123 my $myconfig = \%main::myconfig;
124 my $form = $main::form;
126 my $dbh = $form->get_standard_dbh($myconfig);
127 my ($query, @values);
129 my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $::myconfig{login});
130 $query = qq|SELECT fu.*, n.subject, n.body, n.created_by
132 LEFT JOIN notes n ON (fu.note_id = n.id)
134 AND ( (fu.created_by = ?) OR (fu.created_for_user = ?)
135 OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?)))|;
136 my $ref = selectfirst_hashref_query($form, $dbh, $query, conv_i($params{id}), $employee_id, $employee_id, $employee_id);
139 $main::lxdebug->leave_sub();
143 $ref->{LINKS} = $self->retrieve_links(%{ $ref });
145 $main::lxdebug->leave_sub();
151 $main::lxdebug->enter_sub();
156 Common::check_params(\%params, qw(id));
158 my $myconfig = \%main::myconfig;
159 my $form = $main::form;
161 my $dbh = $form->get_standard_dbh($myconfig);
163 my $query = qq|SELECT ful.trans_id, ful.trans_type, ful.trans_info, fu.note_id
164 FROM follow_up_links ful
165 LEFT JOIN follow_ups fu ON (ful.follow_up_id = fu.id)
166 WHERE ful.follow_up_id = ?
169 my $links = selectall_hashref_query($form, $dbh, $query, conv_i($params{id}));
171 foreach my $link_ref (@{ $links }) {
172 my $link_details = FU->link_details(%{ $link_ref });
173 map { $link_ref->{$_} = $link_details->{$_} } keys %{ $link_details} if ($link_details);
176 $main::lxdebug->leave_sub();
182 $main::lxdebug->enter_sub();
187 my $myconfig = \%main::myconfig;
188 my $form = $main::form;
190 my $dbh = $form->get_standard_dbh($myconfig);
191 my ($query, $where, $where_user);
193 my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $::myconfig{login});
195 my @values_user = ();
197 if ($params{trans_id}) {
198 $where .= qq| AND fu.id IN (select follow_up_id from follow_up_links where trans_id = ?)|;
199 # $where .= qq| AND (ful.follow_up_id = fu.id) AND (ful.trans_id = ?))|;
200 # $where .= qq| AND EXISTS (SELECT * FROM follow_up_links ful
201 # WHERE (ful.follow_up_id = fu.id) AND (ful.trans_id = ?))|;
202 push @values, conv_i($params{trans_id});
205 if ($params{due_only}) {
206 $where .= qq| AND (fu.follow_up_date <= current_date)|;
209 if ($params{done} ne $params{not_done}) {
210 my $not = $params{not_done} ? 'NOT' : '';
211 $where .= qq| AND $not COALESCE(fu.done, FALSE)|;
214 if ($params{not_id}) {
215 $where .= qq| AND (fu.id <> ?)|;
216 push @values, conv_i($params{not_id});
219 foreach my $item (qw(subject body)) {
220 next unless ($params{$item});
221 $where .= qq| AND (n.${item} ILIKE ?)|;
222 push @values, like($params{$item});
225 if ($params{reference}) {
226 $where .= qq| AND EXISTS (SELECT ful.follow_up_id
227 FROM follow_up_links ful
228 WHERE (ful.follow_up_id = fu.id)
229 AND (ful.trans_info ILIKE ?)
231 push @values, like($params{reference});
234 if ($params{follow_up_date_from}) {
235 $where .= qq| AND (fu.follow_up_date >= ?)|;
236 push @values, conv_date($params{follow_up_date_from});
238 if ($params{follow_up_date_to}) {
239 $where .= qq| AND (fu.follow_up_date <= ?)|;
240 push @values, conv_date($params{follow_up_date_to});
243 if ($params{itime_from}) {
244 $where .= qq| AND (date_trunc('DAY', fu.itime) >= ?)|;
245 push @values, conv_date($params{itime_from});
247 if ($params{itime_to}) {
248 $where .= qq| AND (date_trunc('DAY', fu.itime) <= ?)|;
249 push @values, conv_date($params{itime_to});
251 if ($params{created_for}) {
252 $where .= qq| AND fu.created_for_user = ?|;
253 push @values, conv_i($params{created_for});
256 if ($params{all_users} || $params{trans_id}) { # trans_id only for documents?
257 $where_user = qq|OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?))|;
258 push @values_user, $employee_id;
263 if ($form->{sort} ne 'title') {
265 'follow_up_date' => [ qw(fu.follow_up_date fu.id) ],
266 'created_on' => [ qw(created_on fu.id) ],
267 'subject' => [ qw(lower(n.subject)) ],
270 my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC';
271 my $sortkey = $sort_columns{$form->{sort}} ? $form->{sort} : 'follow_up_date';
272 $order_by = 'ORDER BY ' . join(', ', map { "$_ $sortdir" } @{ $sort_columns{$sortkey} });
275 $query = qq|SELECT fu.*, n.subject, n.body, n.created_by,
276 fu.follow_up_date <= current_date AS due,
277 fu.itime::DATE AS created_on,
278 COALESCE(eby.name, eby.login) AS created_by_name,
279 COALESCE(efor.name, efor.login) AS created_for_user_name
281 LEFT JOIN notes n ON (fu.note_id = n.id)
282 LEFT JOIN employee eby ON (n.created_by = eby.id)
283 LEFT JOIN employee efor ON (fu.created_for_user = efor.id)
284 WHERE ((fu.created_by = ?) OR (fu.created_for_user = ?)
289 my $follow_ups = selectall_hashref_query($form, $dbh, $query, $employee_id, $employee_id, @values_user, @values);
291 if (!scalar @{ $follow_ups }) {
292 $main::lxdebug->leave_sub();
296 foreach my $fu (@{ $follow_ups }) {
297 $fu->{LINKS} = $self->retrieve_links(%{ $fu });
300 if ($form->{sort} eq 'title') {
301 my $dir_factor = !defined $form->{sortdir} ? 1 : $form->{sortdir} ? 1 : -1;
302 $follow_ups = [ map { $_->[1] }
303 sort { ($a->[0] cmp $b->[0]) * $dir_factor }
304 map { my $fu = $follow_ups->[$_]; [ @{ $fu->{LINKS} } ? lc($fu->{LINKS}->[0]->{title}) : '', $fu ] }
305 (0 .. scalar(@{ $follow_ups }) - 1) ];
308 $main::lxdebug->leave_sub();
314 $main::lxdebug->enter_sub();
319 Common::check_params(\%params, qw(trans_id trans_type));
321 my $myconfig = \%main::myconfig;
322 my $form = $main::form;
323 my $locale = $main::locale;
325 my $q_id = $form->quote($params{trans_id});
328 if ($params{trans_type} eq 'customer') {
330 'url' => 'controller.pl?action=CustomerVendor/edit&db=customer&id=' . $form->quote($params{trans_id}) . '¬e_id=' . $form->quote($params{note_id}),
331 'title' => $locale->text('Customer') . " '$params{trans_info}'",
334 } elsif ($params{trans_type} eq 'vendor') {
336 'url' => 'controller.pl?action=CustomerVendor/edit&db=vendor&id=' . $params{trans_id} . '¬e_id=' . $form->quote($params{note_id}),
337 'title' => $locale->text('Vendor') . " '$params{trans_info}'",
340 } elsif ($params{trans_type} eq 'sales_quotation') {
341 my $script = 'oe.pl';
343 if ($::instance_conf->get_feature_experimental_order) {
344 $script = 'controller.pl';
345 $action = 'Order/edit';
348 'url' => $script . '?action=' . $action . '&type=sales_quotation&id=' . $params{trans_id},
349 'title' => $locale->text('Sales quotation') . " $params{trans_info}",
352 } elsif ($params{trans_type} eq 'sales_delivery_order') {
355 'url' => 'do.pl?action=edit&type=sales_delivery_order&id=' . $params{trans_id} . '&edit_note_id=' . $form->quote($params{note_id}),
356 'title' => $locale->text('Sales delivery order') .' '. $params{trans_info},
359 } elsif ($params{trans_type} eq 'purchase_delivery_order') {
362 'url' => 'do.pl?action=edit&type=purchase_delivery_order&id=' . $params{trans_id} . '&edit_note_id=' . $form->quote($params{note_id}),
363 'title' => $locale->text('Purchase delivery order') .' '. $params{trans_info},
366 } elsif ($params{trans_type} eq 'sales_order') {
367 my $script = 'oe.pl';
369 if ($::instance_conf->get_feature_experimental_order) {
370 $script = 'controller.pl';
371 $action = 'Order/edit';
374 'url' => $script . '?action=' . $action . '&type=sales_order&id=' . $params{trans_id},
375 'title' => $locale->text('Sales Order') . " $params{trans_info}",
378 } elsif ($params{trans_type} eq 'sales_invoice') {
380 'url' => 'is.pl?action=edit&type=invoice&id=' . $params{trans_id},
381 'title' => $locale->text('Sales Invoice') . " $params{trans_info}",
384 } elsif ($params{trans_type} eq 'purchase_invoice') {
386 'url' => 'ir.pl?action=edit&type=purchase_invoice&id=' . $params{trans_id},
387 'title' => $locale->text('Purchase Invoice') . " $params{trans_info}",
390 } elsif ($params{trans_type} eq 'credit_note') {
392 'url' => 'is.pl?action=edit&type=credit_note&id=' . $params{trans_id},
393 'title' => $locale->text('Credit Note') . " $params{trans_info}",
396 } elsif ($params{trans_type} eq 'dunning') {
398 'url' => 'dn.pl?action=print_dunning&format=pdf&media=screen&dunning_id=' . $params{trans_id},
399 'title' => $locale->text('Dunning') . " $params{trans_info}",
402 } elsif ($params{trans_type} eq 'request_quotation') {
403 my $script = 'oe.pl';
405 if ($::instance_conf->get_feature_experimental_order) {
406 $script = 'controller.pl';
407 $action = 'Order/edit';
410 'url' => $script . '?action=' . $action . '&type=request_quotation&id=' . $params{trans_id},
411 'title' => $locale->text('Request quotation') . " $params{trans_info}",
414 } elsif ($params{trans_type} eq 'purchase_order') {
415 my $script = 'oe.pl';
417 if ($::instance_conf->get_feature_experimental_order) {
418 $script = 'controller.pl';
419 $action = 'Order/edit';
422 'url' => $script . '?action=' . $action . '&type=purchase_order&id=' . $params{trans_id},
423 'title' => $locale->text('Purchase Order') . " $params{trans_info}",
426 } elsif ($params{trans_type} eq 'vendor_invoice') {
428 'url' => 'ir.pl?action=edit&type=invoice&id=' . $params{trans_id},
429 'title' => $locale->text('Vendor Invoice') . " $params{trans_info}",
432 } elsif ($params{trans_type} eq 'ar_transaction') {
434 'url' => 'ar.pl?action=edit&id=' . $params{trans_id},
435 'title' => $locale->text('AR Transaction') . " $params{trans_info}",
438 } elsif ($params{trans_type} eq 'ap_transaction') {
440 'url' => 'ap.pl?action=edit&id=' . $params{trans_id},
441 'title' => $locale->text('AP Transaction') . " $params{trans_info}",
444 } elsif ($params{trans_type} eq 'gl_transaction') {
446 'url' => 'gl.pl?action=edit&id=' . $params{trans_id},
447 'title' => $locale->text('GL Transaction') . " $params{trans_info}",
452 $main::lxdebug->leave_sub();
457 sub save_access_rights {
458 $main::lxdebug->enter_sub();
463 Common::check_params(\%params, 'access');
465 my $myconfig = \%main::myconfig;
466 my $form = $main::form;
468 SL::DB->client->with_transaction(sub {
469 my $dbh = SL::DB->client->dbh;
471 my ($id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $::myconfig{login});
473 do_query($form, $dbh, qq|DELETE FROM follow_up_access WHERE what = ?|, $id);
475 my $query = qq|INSERT INTO follow_up_access (who, what) VALUES (?, ?)|;
476 my $sth = prepare_query($form, $dbh, $query);
478 while (my ($who, $access_allowed) = each %{ $params{access} }) {
479 next unless ($access_allowed);
481 do_statement($form, $sth, $query, conv_i($who), $id);
486 }) or do { die SL::DB->client->error };
488 $main::lxdebug->leave_sub();
491 sub retrieve_access_rights {
492 $main::lxdebug->enter_sub();
497 my $myconfig = \%main::myconfig;
498 my $form = $main::form;
500 my $dbh = $form->get_standard_dbh($myconfig);
502 my $sth = prepare_execute_query($form, $dbh, qq|SELECT who FROM follow_up_access WHERE what = (SELECT id FROM employee WHERE login = ?)|, $::myconfig{login});
505 while (my $ref = $sth->fetchrow_hashref()) {
506 $access->{$ref->{who}} = 1;
511 $main::lxdebug->leave_sub();