1 #=====================================================================
4 # Based on SQL-Ledger Version 2.1.9
5 # Web http://www.lx-office.org
7 #=====================================================================
8 # SQL-Ledger Accounting
11 # Author: Dieter Simader
12 # Email: dsimader@sql-ledger.org
13 # Web: http://www.sql-ledger.org
17 # This program is free software; you can redistribute it and/or modify
18 # it under the terms of the GNU General Public License as published by
19 # the Free Software Foundation; either version 2 of the License, or
20 # (at your option) any later version.
22 # This program is distributed in the hope that it will be useful,
23 # but WITHOUT ANY WARRANTY; without even the implied warranty of
24 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 # GNU General Public License for more details.
26 # You should have received a copy of the GNU General Public License
27 # along with this program; if not, write to the Free Software
28 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 #======================================================================
31 # backend code for customers and vendors
34 # DS. 2000-07-04 Created
36 #======================================================================
52 $main::lxdebug->enter_sub();
54 my ( $self, $myconfig, $form ) = @_;
56 my $cv = $form->{db} eq "customer" ? "customer" : "vendor";
58 my $dbh = $form->dbconnect($myconfig);
60 qq|SELECT ct.*, b.id AS business, cp.* | .
62 qq|LEFT JOIN business b ON (ct.business_id = b.id) | .
63 qq|LEFT JOIN contacts cp ON (ct.id = cp.cp_cv_id) | .
64 qq|WHERE (ct.id = ?) | .
65 qq|ORDER BY cp.cp_id LIMIT 1|;
66 my $sth = prepare_execute_query($form, $dbh, $query, $form->{id});
68 my $ref = $sth->fetchrow_hashref("NAME_lc");
70 map { $form->{$_} = $ref->{$_} } keys %$ref;
72 # remove any trailing whitespace
73 $form->{curr} =~ s/\s*$//;
76 if ( $form->{salesman_id} ) {
78 qq|SELECT ct.name AS salesman | .
82 selectrow_query($form, $dbh, $query, $form->{salesman_id});
85 my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $form->{login});
87 qq|SELECT n.*, n.itime::DATE AS created_on,
88 e.name AS created_by_name, e.login AS created_by_login
90 LEFT JOIN employee e ON (n.created_by = e.id)
91 WHERE (n.trans_id = ?) AND (n.trans_module = 'ct')|;
92 $form->{NOTES} = selectall_hashref_query($form, $dbh, $query, conv_i($form->{id}));
95 qq|SELECT fu.follow_up_date, fu.done AS follow_up_done, e.name AS created_for_name, e.name AS created_for_login
97 LEFT JOIN employee e ON (fu.created_for_user = e.id)
98 WHERE (fu.note_id = ?)
99 AND NOT COALESCE(fu.done, FALSE)
100 AND ( (fu.created_by = ?)
101 OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?)))|;
102 $sth = prepare_query($form, $dbh, $query);
104 foreach my $note (@{ $form->{NOTES} }) {
105 do_statement($form, $sth, $query, conv_i($note->{id}), conv_i($note->{created_by}), conv_i($employee_id));
106 $ref = $sth->fetchrow_hashref();
108 map { $note->{$_} = $ref->{$_} } keys %{ $ref } if ($ref);
113 if ($form->{edit_note_id}) {
115 qq|SELECT n.id AS NOTE_id, n.subject AS NOTE_subject, n.body AS NOTE_body,
116 fu.id AS FU_id, fu.follow_up_date AS FU_date, fu.done AS FU_done, fu.created_for_user AS FU_created_for_user
118 LEFT JOIN follow_ups fu ON ((n.id = fu.note_id) AND NOT COALESCE(fu.done, FALSE))
120 $ref = selectfirst_hashref_query($form, $dbh, $query, conv_i($form->{edit_note_id}));
123 foreach my $key (keys %{ $ref }) {
125 $new_key =~ s/^([^_]+)/\U$1\E/;
126 $form->{$new_key} = $ref->{$key};
131 # check if it is orphaned
132 my $arap = ( $form->{db} eq 'customer' ) ? "ar" : "ap";
135 if ($form->{db} eq 'vendor') {
136 $makemodel = qq| UNION SELECT 1 FROM makemodel mm WHERE mm.make = ?|;
143 qq|JOIN $cv ct ON (a.${cv}_id = ct.id) | .
144 qq|WHERE ct.id = ? | .
148 qq|JOIN $cv ct ON (a.${cv}_id = ct.id) | .
151 my ($dummy) = selectrow_query($form, $dbh, $query, (conv_i($form->{id})) x $num_args);
153 $form->{status} = "orphaned" unless ($dummy);
157 $main::lxdebug->leave_sub();
160 sub populate_drop_down_boxes {
161 $main::lxdebug->enter_sub();
163 my ($self, $myconfig, $form, $provided_dbh) = @_;
166 my $dbh = $provided_dbh ? $provided_dbh : $form->dbconnect($myconfig);
169 $query = qq|SELECT id, description FROM business ORDER BY id|;
170 $form->{all_business} = selectall_hashref_query($form, $dbh, $query);
174 qq|SELECT shipto_id, shiptoname, shiptodepartment_1, shiptostreet, shiptocity
176 WHERE (trans_id = ?) AND (module = 'CT')|;
177 $form->{SHIPTO} = selectall_hashref_query($form, $dbh, $query, $form->{id});
180 $query = qq|SELECT cp_id, cp_name, cp_givenname FROM contacts WHERE cp_cv_id = ? ORDER BY cp_name|;
181 $form->{CONTACTS} = selectall_hashref_query($form, $dbh, $query, $form->{id});
184 $query = qq|SELECT id, description FROM language ORDER BY id|;
185 $form->{languages} = selectall_hashref_query($form, $dbh, $query);
188 $query = qq|SELECT id, description FROM payment_terms ORDER BY sortkey|;
189 $form->{payment_terms} = selectall_hashref_query($form, $dbh, $query);
191 $dbh->disconnect() unless ($provided_dbh);
193 $main::lxdebug->leave_sub();
196 sub query_titles_and_greetings {
197 $main::lxdebug->enter_sub();
199 my ( $self, $myconfig, $form ) = @_;
200 my ( %tmp, $ref, $query );
202 my $dbh = $form->dbconnect($myconfig);
205 qq|SELECT DISTINCT(greeting) | .
207 qq|WHERE greeting ~ '[a-zA-Z]' | .
209 qq|SELECT DISTINCT(greeting) | .
211 qq|WHERE greeting ~ '[a-zA-Z]' | .
212 qq|ORDER BY greeting|;
214 map({ $tmp{$_} = 1; } selectall_array_query($form, $dbh, $query));
215 $form->{COMPANY_GREETINGS} = [ sort(keys(%tmp)) ];
218 qq|SELECT DISTINCT(cp_title) | .
220 qq|WHERE cp_title ~ '[a-zA-Z]'|;
221 $form->{TITLES} = [ selectall_array_query($form, $dbh, $query) ];
224 qq|SELECT DISTINCT(cp_abteilung) | .
226 qq|WHERE cp_abteilung ~ '[a-zA-Z]'|;
227 $form->{DEPARTMENT} = [ selectall_array_query($form, $dbh, $query) ];
230 $main::lxdebug->leave_sub();
234 $main::lxdebug->enter_sub();
236 my ( $self, $myconfig, $form ) = @_;
238 # set pricegroup to default
239 $form->{klass} = 0 unless ($form->{klass});
241 # connect to database
242 my $dbh = $form->get_standard_dbh;
245 $form->{"cp_${_}"} = $form->{"selected_cp_${_}"}
246 if ( $form->{"selected_cp_${_}"} );
247 } qw(title greeting abteilung) );
248 $form->{"greeting"} = $form->{"selected_company_greeting"}
249 if ( $form->{"selected_company_greeting"} );
251 # assign value discount, terms, creditlimit
252 $form->{discount} = $form->parse_amount( $myconfig, $form->{discount} );
253 $form->{discount} /= 100;
254 $form->{creditlimit} = $form->parse_amount( $myconfig, $form->{creditlimit} );
256 my ( $query, $sth, $f_id );
259 $query = qq|SELECT id FROM customer WHERE customernumber = ?|;
260 ($f_id) = selectrow_query($form, $dbh, $query, $form->{customernumber});
262 if (($f_id ne $form->{id}) && ($f_id ne "")) {
263 $main::lxdebug->leave_sub();
268 my $customernumber = SL::TransNumber->new(type => 'customer',
270 number => $form->{customernumber},
271 business_id => $form->{business},
273 $form->{customernumber} = $customernumber->create_unique unless $customernumber->is_unique;
275 $query = qq|SELECT nextval('id')|;
276 ($form->{id}) = selectrow_query($form, $dbh, $query);
278 $query = qq|INSERT INTO customer (id, name) VALUES (?, '')|;
279 do_query($form, $dbh, $query, $form->{id});
282 $query = qq|UPDATE customer SET | .
283 qq|customernumber = ?, | .
286 qq|department_1 = ?, | .
287 qq|department_2 = ?, | .
301 qq|creditlimit = ?, | .
303 qq|business_id = ?, | .
304 qq|taxnumber = ?, | .
306 qq|account_number = ?, | .
307 qq|bank_code = ?, | .
312 qq|direct_debit = ?, | .
315 qq|salesman_id = ?, | .
316 qq|language_id = ?, | .
317 qq|payment_id = ?, | .
318 qq|taxzone_id = ?, | .
319 qq|user_password = ?, | .
320 qq|c_vendor_id = ?, | .
323 qq|taxincluded_checked = ? | .
326 $form->{customernumber},
329 $form->{department_1},
330 $form->{department_2},
344 $form->{creditlimit},
345 conv_i($form->{terms}),
346 conv_i($form->{business}),
349 $form->{account_number},
354 $form->{obsolete} ? 't' : 'f',
355 $form->{direct_debit} ? 't' : 'f',
358 conv_i($form->{salesman_id}),
359 conv_i($form->{language_id}),
360 conv_i($form->{payment_id}),
361 conv_i($form->{taxzone_id}, 0),
362 $form->{user_password},
363 $form->{c_vendor_id},
364 conv_i($form->{klass}),
365 substr($form->{currency}, 0, 3),
366 $form->{taxincluded_checked} ne '' ? $form->{taxincluded_checked} : undef,
369 do_query( $form, $dbh, $query, @values );
371 $form->{cp_id} = $self->_save_contact($form, $dbh);
374 $form->add_shipto( $dbh, $form->{id}, "CT" );
376 $self->_save_note('dbh' => $dbh);
377 $self->_delete_selected_notes('dbh' => $dbh);
379 CVar->save_custom_variables('dbh' => $dbh,
381 'trans_id' => $form->{id},
382 'variables' => $form,
383 'always_valid' => 1);
384 if ($form->{cp_id}) {
385 CVar->save_custom_variables('dbh' => $dbh,
386 'module' => 'Contacts',
387 'trans_id' => $form->{cp_id},
388 'variables' => $form,
389 'name_prefix' => 'cp',
390 'always_valid' => 1);
393 my $rc = $dbh->commit();
395 $main::lxdebug->leave_sub();
400 $main::lxdebug->enter_sub();
402 my ( $self, $myconfig, $form ) = @_;
404 $form->{taxzone_id} *= 1;
405 # connect to database
406 my $dbh = $form->get_standard_dbh;
409 $form->{"cp_${_}"} = $form->{"selected_cp_${_}"}
410 if ( $form->{"selected_cp_${_}"} );
411 } qw(title greeting abteilung) );
412 $form->{"greeting"} = $form->{"selected_company_greeting"}
413 if ( $form->{"selected_company_greeting"} );
415 $form->{discount} = $form->parse_amount( $myconfig, $form->{discount} );
416 $form->{discount} /= 100;
417 $form->{creditlimit} = $form->parse_amount( $myconfig, $form->{creditlimit} );
422 $query = qq|SELECT nextval('id')|;
423 ($form->{id}) = selectrow_query($form, $dbh, $query);
425 $query = qq|INSERT INTO vendor (id, name) VALUES (?, '')|;
426 do_query($form, $dbh, $query, $form->{id});
428 my $vendornumber = SL::TransNumber->new(type => 'vendor',
430 number => $form->{vendornumber},
432 $form->{vendornumber} = $vendornumber->create_unique unless $vendornumber->is_unique;
436 qq|UPDATE vendor SET | .
437 qq| vendornumber = ?, | .
439 qq| greeting = ?, | .
440 qq| department_1 = ?, | .
441 qq| department_2 = ?, | .
446 qq| homepage = ?, | .
455 qq| discount = ?, | .
456 qq| creditlimit = ?, | .
457 qq| business_id = ?, | .
458 qq| taxnumber = ?, | .
459 qq| language = ?, | .
460 qq| account_number = ?, | .
461 qq| bank_code = ?, | .
465 qq| obsolete = ?, | .
466 qq| direct_debit = ?, | .
468 qq| payment_id = ?, | .
469 qq| taxzone_id = ?, | .
470 qq| language_id = ?, | .
471 qq| username = ?, | .
472 qq| user_password = ?, | .
473 qq| v_customer_id = ?, | .
477 $form->{vendornumber},
480 $form->{department_1},
481 $form->{department_2},
494 conv_i($form->{terms}),
496 $form->{creditlimit},
497 conv_i($form->{business}),
500 $form->{account_number},
505 $form->{obsolete} ? 't' : 'f',
506 $form->{direct_debit} ? 't' : 'f',
508 conv_i($form->{payment_id}),
509 conv_i($form->{taxzone_id}, 0),
510 conv_i( $form->{language_id}),
512 $form->{user_password},
513 $form->{v_customer_id},
514 substr($form->{currency}, 0, 3),
517 do_query($form, $dbh, $query, @values);
519 $form->{cp_id} = $self->_save_contact($form, $dbh);
522 $form->add_shipto( $dbh, $form->{id}, "CT" );
524 $self->_save_note('dbh' => $dbh);
525 $self->_delete_selected_notes('dbh' => $dbh);
527 CVar->save_custom_variables('dbh' => $dbh,
529 'trans_id' => $form->{id},
530 'variables' => $form,
531 'always_valid' => 1);
532 if ($form->{cp_id}) {
533 CVar->save_custom_variables('dbh' => $dbh,
534 'module' => 'Contacts',
535 'trans_id' => $form->{cp_id},
536 'variables' => $form,
537 'name_prefix' => 'cp',
538 'always_valid' => 1);
541 my $rc = $dbh->commit();
543 $main::lxdebug->leave_sub();
548 my ($self, $form, $dbh) = @_;
550 return undef unless $form->{cp_id} || $form->{cp_name} || $form->{cp_givenname};
552 my @columns = qw(cp_title cp_givenname cp_name cp_email cp_phone1 cp_phone2 cp_abteilung cp_fax
553 cp_mobile1 cp_mobile2 cp_satphone cp_satfax cp_project cp_privatphone cp_privatemail cp_birthday cp_gender
554 cp_street cp_zipcode cp_city);
555 my @values = map { $_ eq 'cp_gender' ? ($form->{$_} eq 'f' ? 'f' : 'm') : $form->{$_} } @columns;
558 if ($form->{cp_id}) {
559 $query = qq|UPDATE contacts SET | . join(', ', map { "${_} = ?" } @columns) . qq| WHERE cp_id = ?|;
560 push @values, $form->{cp_id};
561 $cp_id = $form->{cp_id};
564 ($cp_id) = selectrow_query($form, $dbh, qq|SELECT nextval('id')|);
566 $query = qq|INSERT INTO contacts (| . join(', ', @columns, 'cp_cv_id', 'cp_id') . qq|) VALUES (| . join(', ', ('?') x (2 + scalar @columns)) . qq|)|;
567 push @values, $form->{id}, $cp_id;
570 do_query($form, $dbh, $query, @values);
576 $main::lxdebug->enter_sub();
578 my ( $self, $myconfig, $form ) = @_;
579 # connect to database
580 my $dbh = $form->dbconnect($myconfig);
583 my $cv = $form->{db} eq "customer" ? "customer" : "vendor";
584 my $query = qq|DELETE FROM $cv WHERE id = ?|;
585 do_query($form, $dbh, $query, $form->{id});
589 $main::lxdebug->leave_sub();
593 $main::lxdebug->enter_sub();
595 my ( $self, $myconfig, $form ) = @_;
597 # connect to database
598 my $dbh = $form->dbconnect($myconfig);
600 my $cv = $form->{db} eq "customer" ? "customer" : "vendor";
605 my %allowed_sort_columns =
607 id customernumber vendornumber name contact phone fax email street
608 taxnumber business invnumber ordnumber quonumber zipcode city
610 my $sortorder = $form->{sort} && $allowed_sort_columns{$form->{sort}} ? $form->{sort} : "name";
611 $form->{sort} = $sortorder;
612 my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC';
614 if ($sortorder !~ /(business|id)/ && 1 >= scalar grep { $form->{$_} } qw(l_ordnumber l_quonumber l_invnumber )) {
615 $sortorder = "lower($sortorder) ${sortdir}";
617 $sortorder .= " ${sortdir}";
620 if ($form->{"${cv}number"}) {
621 $where .= " AND ct.${cv}number ILIKE ?";
622 push(@values, '%' . $form->{"${cv}number"} . '%');
625 foreach my $key (qw(name contact email)) {
627 $where .= " AND ct.$key ILIKE ?";
628 push(@values, '%' . $form->{$key} . '%');
632 if ($form->{cp_name}) {
633 $where .= " AND ct.id IN (SELECT cp_cv_id FROM contacts WHERE lower(cp_name) LIKE lower(?))";
634 push @values, '%' . $form->{cp_name} . '%';
637 if ($form->{addr_city}) {
638 $where .= " AND ((lower(ct.city) LIKE lower(?))
643 WHERE (module = 'CT')
644 AND (lower(shiptocity) LIKE lower(?))
647 push @values, ('%' . $form->{addr_city} . '%') x 2;
650 if ( $form->{status} eq 'orphaned' ) {
652 qq| AND ct.id NOT IN | .
653 qq| (SELECT o.${cv}_id FROM oe o, $cv cv WHERE cv.id = o.${cv}_id)|;
654 if ($cv eq 'customer') {
656 qq| AND ct.id NOT IN | .
657 qq| (SELECT a.customer_id FROM ar a, customer cv | .
658 qq| WHERE cv.id = a.customer_id)|;
660 if ($cv eq 'vendor') {
662 qq| AND ct.id NOT IN | .
663 qq| (SELECT a.vendor_id FROM ap a, vendor cv | .
664 qq| WHERE cv.id = a.vendor_id)|;
666 $form->{l_invnumber} = $form->{l_ordnumber} = $form->{l_quonumber} = "";
669 if ($form->{obsolete} eq "Y") {
670 $where .= qq| AND obsolete|;
671 } elsif ($form->{obsolete} eq "N") {
672 $where .= qq| AND NOT obsolete|;
675 if ($form->{business_id}) {
676 $where .= qq| AND (business_id = ?)|;
677 push(@values, conv_i($form->{business_id}));
680 # Nur Kunden finden, bei denen ich selber der Verkäufer bin
681 # Gilt nicht für Lieferanten
682 if ($cv eq 'customer' && !$main::auth->assert('customer_vendor_all_edit', 1)) {
683 $where .= qq| AND ct.salesman_id = (select id from employee where login= ?)|;
684 push(@values, $form->{login});
687 my ($cvar_where, @cvar_values) = CVar->build_filter_query('module' => 'CT',
688 'trans_id_field' => 'ct.id',
692 $where .= qq| AND ($cvar_where)|;
693 push @values, @cvar_values;
696 if ($form->{addr_street}) {
697 $where .= qq| AND (street ILIKE ?)|;
698 push @values, '%' . $form->{addr_street} . '%';
701 if ($form->{addr_zipcode}) {
702 $where .= qq| AND (zipcode ILIKE ?)|;
703 push @values, $form->{addr_zipcode} . '%';
707 qq|SELECT ct.*, b.description AS business | .
709 qq|LEFT JOIN business b ON (ct.business_id = b.id) | .
712 my @saved_values = @values;
713 # redo for invoices, orders and quotations
714 if ($form->{l_invnumber} || $form->{l_ordnumber} || $form->{l_quonumber}) {
715 my ($ar, $union, $module);
718 if ($form->{l_invnumber}) {
719 my $ar = $cv eq 'customer' ? 'ar' : 'ap';
720 my $module = $ar eq 'ar' ? 'is' : 'ir';
723 qq|SELECT ct.*, b.description AS business, | .
724 qq| a.invnumber, a.ordnumber, a.quonumber, a.id AS invid, | .
725 qq| '$module' AS module, 'invoice' AS formtype, | .
726 qq| (a.amount = a.paid) AS closed | .
728 qq|JOIN $ar a ON (a.${cv}_id = ct.id) | .
729 qq|LEFT JOIN business b ON (ct.business_id = b.id) | .
730 qq|WHERE $where AND (a.invoice = '1')|;
735 if ( $form->{l_ordnumber} ) {
736 if ($union eq "UNION") {
737 push(@values, @saved_values);
741 qq|SELECT ct.*, b.description AS business,| .
742 qq| ' ' AS invnumber, o.ordnumber, o.quonumber, o.id AS invid, | .
743 qq| 'oe' AS module, 'order' AS formtype, o.closed | .
745 qq|JOIN oe o ON (o.${cv}_id = ct.id) | .
746 qq|LEFT JOIN business b ON (ct.business_id = b.id) | .
747 qq|WHERE $where AND (o.quotation = '0')|;
752 if ( $form->{l_quonumber} ) {
753 if ($union eq "UNION") {
754 push(@values, @saved_values);
758 qq|SELECT ct.*, b.description AS business, | .
759 qq| ' ' AS invnumber, o.ordnumber, o.quonumber, o.id AS invid, | .
760 qq| 'oe' AS module, 'quotation' AS formtype, o.closed | .
762 qq|JOIN oe o ON (o.${cv}_id = ct.id) | .
763 qq|LEFT JOIN business b ON (ct.business_id = b.id) | .
764 qq|WHERE $where AND (o.quotation = '1')|;
768 $query .= qq| ORDER BY $sortorder|;
770 $form->{CT} = selectall_hashref_query($form, $dbh, $query, @values);
772 $main::lxdebug->leave_sub();
776 $main::lxdebug->enter_sub();
778 my ( $self, $myconfig, $form ) = @_;
780 die 'Missing argument: cp_id' unless $::form->{cp_id};
782 my $dbh = $form->dbconnect($myconfig);
784 qq|SELECT * FROM contacts c | .
785 qq|WHERE cp_id = ? ORDER BY cp_id limit 1|;
786 my $sth = prepare_execute_query($form, $dbh, $query, $form->{cp_id});
787 my $ref = $sth->fetchrow_hashref("NAME_lc");
789 map { $form->{$_} = $ref->{$_} } keys %$ref;
791 $query = qq|SELECT COUNT(cp_id) AS used FROM (
792 SELECT cp_id FROM oe UNION
793 SELECT cp_id FROM ar UNION
794 SELECT cp_id FROM ap UNION
795 SELECT cp_id FROM delivery_orders
796 ) AS cpid WHERE cp_id = ? OR ? = 0|;
797 ($form->{cp_used}) = selectfirst_array_query($form, $dbh, $query, ($form->{cp_id})x2);
802 $main::lxdebug->leave_sub();
806 $main::lxdebug->enter_sub();
808 my ( $self, $myconfig, $form ) = @_;
809 my $dbh = $form->dbconnect($myconfig);
810 my $query = qq|SELECT * FROM shipto WHERE shipto_id = ?|;
811 my $sth = prepare_execute_query($form, $dbh, $query, $form->{shipto_id});
813 my $ref = $sth->fetchrow_hashref("NAME_lc");
815 map { $form->{$_} = $ref->{$_} } keys %$ref;
817 $query = qq|SELECT COUNT(shipto_id) AS used FROM (
818 SELECT shipto_id FROM oe UNION
819 SELECT shipto_id FROM ar UNION
820 SELECT shipto_id FROM delivery_orders
821 ) AS stid WHERE shipto_id = ? OR ? = 0|;
822 ($form->{shiptoused}) = selectfirst_array_query($form, $dbh, $query, ($form->{shipto_id})x2);
827 $main::lxdebug->leave_sub();
831 $main::lxdebug->enter_sub();
833 my ( $self, $myconfig, $form ) = @_;
834 my $dbh = $form->dbconnect($myconfig);
836 my $arap = $form->{db} eq "vendor" ? "ap" : "ar";
837 my $db = $form->{db} eq "customer" ? "customer" : "vendor";
838 my $qty_sign = $form->{db} eq 'vendor' ? ' * -1 AS qty' : '';
840 my $where = " WHERE 1=1 ";
843 if ($form->{shipto_id} && ($arap eq "ar")) {
844 $where .= "AND ${arap}.shipto_id = ?";
845 push(@values, $form->{shipto_id});
847 $where .= "AND ${arap}.${db}_id = ?";
848 push(@values, $form->{id});
852 $where .= "AND ${arap}.transdate >= ?";
853 push(@values, conv_date($form->{from}));
856 $where .= "AND ${arap}.transdate <= ?";
857 push(@values, conv_date($form->{to}));
860 qq|SELECT s.shiptoname, i.qty $qty_sign, | .
861 qq| ${arap}.id, ${arap}.transdate, ${arap}.invnumber, ${arap}.ordnumber, | .
862 qq| i.description, i.unit, i.sellprice, | .
863 qq| oe.id AS oe_id, invoice | .
865 qq|LEFT JOIN shipto s ON | .
867 ? qq|(ar.shipto_id = s.shipto_id) |
868 : qq|(ap.id = s.trans_id) |) .
869 qq|LEFT JOIN invoice i ON (${arap}.id = i.trans_id) | .
870 qq|LEFT join parts p ON (p.id = i.parts_id) | .
871 qq|LEFT JOIN oe ON (oe.ordnumber = ${arap}.ordnumber AND NOT ${arap}.ordnumber = '') | .
873 qq|ORDER BY ${arap}.transdate DESC LIMIT 15|;
875 $form->{DELIVERY} = selectall_hashref_query($form, $dbh, $query, @values);
879 $main::lxdebug->leave_sub();
883 $main::lxdebug->enter_sub();
888 my $form = $main::form;
890 Common::check_params(\%params, 'dbh');
892 if (!$form->{NOTE_subject}) {
893 $main::lxdebug->leave_sub();
897 my $dbh = $params{dbh};
901 'id' => $form->{NOTE_id},
902 'subject' => $form->{NOTE_subject},
903 'body' => $form->{NOTE_body},
904 'trans_id' => $form->{id},
905 'trans_module' => 'ct',
908 $note{id} = Notes->save(%note);
910 if ($form->{FU_date}) {
912 'id' => $form->{FU_id},
913 'note_id' => $note{id},
914 'follow_up_date' => $form->{FU_date},
915 'created_for_user' => $form->{FU_created_for_user},
916 'done' => $form->{FU_done} ? 1 : 0,
917 'subject' => $form->{NOTE_subject},
918 'body' => $form->{NOTE_body},
921 'trans_id' => $form->{id},
922 'trans_type' => $form->{db} eq 'customer' ? 'customer' : 'vendor',
923 'trans_info' => $form->{name},
928 $follow_up{id} = FU->save(%follow_up);
930 } elsif ($form->{FU_id}) {
931 do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|, conv_i($form->{FU_id}));
932 do_query($form, $dbh, qq|DELETE FROM follow_ups WHERE id = ?|, conv_i($form->{FU_id}));
935 delete @{$form}{grep { /^NOTE_|^FU_/ } keys %{ $form }};
937 $main::lxdebug->leave_sub();
940 sub _delete_selected_notes {
941 $main::lxdebug->enter_sub();
946 Common::check_params(\%params, 'dbh');
948 my $form = $main::form;
949 my $dbh = $params{dbh};
951 foreach my $i (1 .. $form->{NOTES_rowcount}) {
952 next unless ($form->{"NOTE_delete_$i"} && $form->{"NOTE_id_$i"});
954 Notes->delete('dbh' => $params{dbh},
955 'id' => $form->{"NOTE_id_$i"});
958 $main::lxdebug->leave_sub();
961 # TODO: remove in 2.7.0 stable
963 $main::lxdebug->enter_sub();
966 my $shipto_id = shift;
968 my $form = $main::form;
969 my %myconfig = %main::myconfig;
970 my $dbh = $form->get_standard_dbh(\%myconfig);
972 do_query($form, $dbh, qq|UPDATE shipto SET trans_id = NULL WHERE shipto_id = ?|, $shipto_id);
976 $main::lxdebug->leave_sub();
979 # TODO: remove in 2.7.0 stable
981 $main::lxdebug->enter_sub();
986 my $form = $main::form;
987 my %myconfig = %main::myconfig;
988 my $dbh = $form->get_standard_dbh(\%myconfig);
990 do_query($form, $dbh, qq|UPDATE contacts SET cp_cv_id = NULL WHERE cp_id = ?|, $cp_id);
994 $main::lxdebug->leave_sub();
998 $main::lxdebug->enter_sub();
1003 Common::check_params(\%params, qw(vc id));
1005 my $myconfig = \%main::myconfig;
1006 my $form = $main::form;
1008 my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);
1010 my $table = $params{vc} eq 'customer' ? 'customer' : 'vendor';
1011 my @ids = ref $params{id} eq 'ARRAY' ? @{ $params{id} } : ($params{id});
1012 my $placeholders = join ", ", ('?') x scalar @ids;
1013 my $query = qq|SELECT id, name, account_number, bank, bank_code, iban, bic
1015 WHERE id IN (${placeholders})|;
1017 my $result = selectall_hashref_query($form, $dbh, $query, map { conv_i($_) } @ids);
1019 if (ref $params{id} eq 'ARRAY') {
1020 $result = { map { $_->{id} => $_ } @{ $result } };
1022 $result = $result->[0] || { 'id' => $params{id} };
1025 $main::lxdebug->leave_sub();
1030 sub parse_excel_file {
1031 $main::lxdebug->enter_sub();
1033 my ($self, $myconfig, $form) = @_;
1034 my $locale = $main::locale;
1036 $form->{formname} = 'sales_quotation';
1037 $form->{type} = 'sales_quotation';
1038 $form->{format} = 'excel';
1039 $form->{media} = 'screen';
1040 $form->{quonumber} = 1;
1043 # $form->{"notes"} will be overridden by the customer's/vendor's "notes" field. So save it here.
1044 $form->{ $form->{"formname"} . "notes" } = $form->{"notes"};
1048 $form->{"${inv}date"} = $form->{transdate};
1049 $form->{label} = $locale->text('Quotation');
1050 my $numberfld = "sqnumber";
1054 $form->{what_done} = $form->{formname};
1056 map({ delete($form->{$_}); } grep(/^cp_/, keys(%{ $form })));
1058 my $output_dateformat = $myconfig->{"dateformat"};
1059 my $output_numberformat = $myconfig->{"numberformat"};
1060 my $output_longdates = 1;
1062 # map login user variables
1063 map { $form->{"login_$_"} = $myconfig->{$_} } ("name", "email", "fax", "tel", "company");
1066 for my $field (qw(transdate_oe deliverydate_oe)) {
1068 $form->{$field}[$_] = $locale->date($myconfig, $form->{$field}[$_], 1);
1069 } 0 .. $#{ $form->{$field} };
1072 if ($form->{shipto_id}) {
1073 $form->get_shipto($myconfig);
1076 $form->{notes} =~ s/^\s+//g;
1078 $form->{templates} = $myconfig->{templates};
1080 delete $form->{printer_command};
1082 $form->get_employee_info($myconfig);
1084 my ($cvar_date_fields, $cvar_number_fields) = CVar->get_field_format_list('module' => 'CT', 'prefix' => 'vc_');
1086 if (scalar @{ $cvar_date_fields }) {
1087 format_dates($output_dateformat, $output_longdates, @{ $cvar_date_fields });
1090 while (my ($precision, $field_list) = each %{ $cvar_number_fields }) {
1091 reformat_numbers($output_numberformat, $precision, @{ $field_list });
1095 my $extension = 'xls';
1097 $form->{IN} = "$form->{formname}.${extension}";
1099 delete $form->{OUT};
1101 $form->parse_template($myconfig);
1103 $main::lxdebug->leave_sub();
1106 sub search_contacts {
1107 $::lxdebug->enter_sub;
1112 my $dbh = $params{dbh} || $::form->get_standard_dbh;
1113 my $vc = $params{db} eq 'customer' ? 'customer' : 'vendor';
1116 'cp_name' => 'cp_name, cp_givenname',
1117 'vcname' => 'vcname, cp_name, cp_givenname',
1118 'vcnumber' => 'vcnumber, cp_name, cp_givenname',
1121 my %sortcols = map { $_ => 1 } qw(cp_name cp_givenname cp_phone1 cp_phone2 cp_mobile1 cp_email cp_street cp_zipcode cp_city vcname vcnumber);
1123 my $order_by = $sortcols{$::form->{sort}} ? $::form->{sort} : 'cp_name';
1124 $::form->{sort} = $order_by;
1125 $order_by = $sortspecs{$order_by} if ($sortspecs{$order_by});
1127 my $sortdir = $::form->{sortdir} ? 'ASC' : 'DESC';
1128 $order_by =~ s/,/ ${sortdir},/g;
1129 $order_by .= " $sortdir";
1131 my @where_tokens = ();
1134 if ($params{search_term}) {
1137 'cp.cp_name ILIKE ?',
1138 'cp.cp_givenname ILIKE ?',
1139 'cp.cp_email ILIKE ?';
1140 push @values, ('%' . $params{search_term} . '%') x 3;
1142 if (($params{search_term} =~ m/\d/) && ($params{search_term} !~ m/[^\d \(\)+\-]/)) {
1143 my $number = $params{search_term};
1144 $number =~ s/[^\d]//g;
1145 $number = join '[ /\(\)+\-]*', split(m//, $number);
1147 push @tokens, map { "($_ ~ '$number')" } qw(cp_phone1 cp_phone2 cp_mobile1 cp_mobile2);
1150 push @where_tokens, map { "($_)" } join ' OR ', @tokens;
1153 my ($cvar_where, @cvar_values) = CVar->build_filter_query('module' => 'Contacts',
1154 'trans_id_field' => 'cp.cp_id',
1155 'filter' => $params{filter});
1158 push @where_tokens, $cvar_where;
1159 push @values, @cvar_values;
1162 if (my $filter = $params{filter}) {
1163 for (qw(name title givenname email project abteilung)) {
1164 next unless $filter->{"cp_$_"};
1165 add_token(\@where_tokens, \@values, col => "cp.cp_$_", val => $filter->{"cp_$_"}, method => 'ILIKE', esc => 'substr');
1168 push @where_tokens, 'cp.cp_cv_id IS NOT NULL' if $filter->{status} eq 'active';
1169 push @where_tokens, 'cp.cp_cv_id IS NULL' if $filter->{status} eq 'orphaned';
1172 my $where = @where_tokens ? 'WHERE ' . join ' AND ', @where_tokens : '';
1174 my $query = qq|SELECT cp.*,
1175 COALESCE(c.id, v.id) AS vcid,
1176 COALESCE(c.name, v.name) AS vcname,
1177 COALESCE(c.customernumber, v.vendornumber) AS vcnumber,
1178 CASE WHEN c.name IS NULL THEN 'vendor' ELSE 'customer' END AS db
1180 LEFT JOIN customer c ON (cp.cp_cv_id = c.id)
1181 LEFT JOIN vendor v ON (cp.cp_cv_id = v.id)
1183 ORDER BY $order_by|;
1185 my $contacts = selectall_hashref_query($::form, $dbh, $query, @values);
1187 $::lxdebug->leave_sub;
1189 return @{ $contacts };