X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FCT.pm;h=8ceab3aa6a31896331bbb9908cac66a73fdd7ea9;hb=2766521474b20c77e62d169a1c99efb41cb1c56f;hp=58a460039f5d709bf1703036e5c65aefd57003e3;hpb=becda06d038cfbcc3b69fbdfa4b89447626e7cab;p=kivitendo-erp.git diff --git a/SL/CT.pm b/SL/CT.pm index 58a460039..8ceab3aa6 100644 --- a/SL/CT.pm +++ b/SL/CT.pm @@ -42,6 +42,7 @@ use Data::Dumper; use SL::Common; use SL::CVar; use SL::DBUtils; +use SL::DB::Default; use SL::FU; use SL::Notes; use SL::TransNumber; @@ -68,8 +69,12 @@ sub get_tuple { my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; - $sth->finish; + + #get name of currency instead of id: + $query = qq|SELECT name AS curr FROM currencies WHERE id=?|; + ($form->{curr}) = selectrow_query($form, $dbh, $query, conv_i($form->{currency_id})); + if ( $form->{salesman_id} ) { my $query = qq|SELECT ct.name AS salesman | . @@ -236,7 +241,7 @@ sub save_customer { $form->{klass} = 0 unless ($form->{klass}); # connect to database - my $dbh = $form->dbconnect_noauto($myconfig); + my $dbh = $form->get_standard_dbh; map( { $form->{"cp_${_}"} = $form->{"selected_cp_${_}"} @@ -272,7 +277,7 @@ sub save_customer { $query = qq|SELECT nextval('id')|; ($form->{id}) = selectrow_query($form, $dbh, $query); - $query = qq|INSERT INTO customer (id, name) VALUES (?, '')|; + $query = qq|INSERT INTO customer (id, name, currency_id) VALUES (?, '', (SELECT currency_id FROM defaults))|; do_query($form, $dbh, $query, $form->{id}); } @@ -315,7 +320,10 @@ sub save_customer { qq|taxzone_id = ?, | . qq|user_password = ?, | . qq|c_vendor_id = ?, | . - qq|klass = ? | . + qq|klass = ?, | . + qq|currency_id = (SELECT id FROM currencies WHERE name = ?), | . + qq|taxincluded_checked = ?, | . + qq|delivery_term_id = ? | . qq|WHERE id = ?|; my @values = ( $form->{customernumber}, @@ -357,80 +365,14 @@ sub save_customer { $form->{user_password}, $form->{c_vendor_id}, conv_i($form->{klass}), + $form->{currency}, + $form->{taxincluded_checked} ne '' ? $form->{taxincluded_checked} : undef, + conv_i($form->{delivery_term_id}), $form->{id} ); do_query( $form, $dbh, $query, @values ); - $query = undef; - if ( $form->{cp_id} ) { - $query = qq|UPDATE contacts SET | . - qq|cp_title = ?, | . - qq|cp_givenname = ?, | . - qq|cp_name = ?, | . - qq|cp_email = ?, | . - qq|cp_phone1 = ?, | . - qq|cp_phone2 = ?, | . - qq|cp_abteilung = ?, | . - qq|cp_fax = ?, | . - qq|cp_mobile1 = ?, | . - qq|cp_mobile2 = ?, | . - qq|cp_satphone = ?, | . - qq|cp_satfax = ?, | . - qq|cp_project = ?, | . - qq|cp_privatphone = ?, | . - qq|cp_privatemail = ?, | . - qq|cp_birthday = ?, | . - qq|cp_gender = ? | . - qq|WHERE cp_id = ?|; - @values = ( - $form->{cp_title}, - $form->{cp_givenname}, - $form->{cp_name}, - $form->{cp_email}, - $form->{cp_phone1}, - $form->{cp_phone2}, - $form->{cp_abteilung}, - $form->{cp_fax}, - $form->{cp_mobile1}, - $form->{cp_mobile2}, - $form->{cp_satphone}, - $form->{cp_satfax}, - $form->{cp_project}, - $form->{cp_privatphone}, - $form->{cp_privatemail}, - $form->{cp_birthday}, - $form->{cp_gender} eq 'f' ? 'f' : 'm', - $form->{cp_id} - ); - } elsif ( $form->{cp_name} || $form->{cp_givenname} ) { - $query = - qq|INSERT INTO contacts ( cp_cv_id, cp_title, cp_givenname, | . - qq| cp_name, cp_email, cp_phone1, cp_phone2, cp_abteilung, cp_fax, cp_mobile1, | . - qq| cp_mobile2, cp_satphone, cp_satfax, cp_project, cp_privatphone, cp_privatemail, | . - qq| cp_birthday, cp_gender) | . - qq|VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)|; - @values = ( - $form->{id}, - $form->{cp_title}, - $form->{cp_givenname}, - $form->{cp_name}, - $form->{cp_email}, - $form->{cp_phone1}, - $form->{cp_phone2}, - $form->{cp_abteilung}, - $form->{cp_fax}, - $form->{cp_mobile1}, - $form->{cp_mobile2}, - $form->{cp_satphone}, - $form->{cp_satfax}, - $form->{cp_project}, - $form->{cp_privatphone}, - $form->{cp_privatemail}, - $form->{cp_birthday}, - $form->{cp_gender} eq 'f' ? 'f' : 'm', - ); - } - do_query( $form, $dbh, $query, @values ) if ($query); + $form->{cp_id} = $self->_save_contact($form, $dbh); # add shipto $form->add_shipto( $dbh, $form->{id}, "CT" ); @@ -443,9 +385,16 @@ sub save_customer { 'trans_id' => $form->{id}, 'variables' => $form, 'always_valid' => 1); + if ($form->{cp_id}) { + CVar->save_custom_variables('dbh' => $dbh, + 'module' => 'Contacts', + 'trans_id' => $form->{cp_id}, + 'variables' => $form, + 'name_prefix' => 'cp', + 'always_valid' => 1); + } my $rc = $dbh->commit(); - $dbh->disconnect(); $main::lxdebug->leave_sub(); return $rc; @@ -458,7 +407,7 @@ sub save_vendor { $form->{taxzone_id} *= 1; # connect to database - my $dbh = $form->dbconnect_noauto($myconfig); + my $dbh = $form->get_standard_dbh; map( { $form->{"cp_${_}"} = $form->{"selected_cp_${_}"} @@ -477,7 +426,7 @@ sub save_vendor { $query = qq|SELECT nextval('id')|; ($form->{id}) = selectrow_query($form, $dbh, $query); - $query = qq|INSERT INTO vendor (id, name) VALUES (?, '')|; + $query = qq|INSERT INTO vendor (id, name, currency_id) VALUES (?, '', (SELECT currency_id FROM defaults))|; do_query($form, $dbh, $query, $form->{id}); my $vendornumber = SL::TransNumber->new(type => 'vendor', @@ -525,7 +474,9 @@ sub save_vendor { qq| language_id = ?, | . qq| username = ?, | . qq| user_password = ?, | . - qq| v_customer_id = ? | . + qq| v_customer_id = ?, | . + qq| currency_id = (SELECT id FROM currencies WHERE name = ?), | . + qq| delivery_term_id = ? | . qq|WHERE id = ?|; my @values = ( $form->{vendornumber}, @@ -565,80 +516,13 @@ sub save_vendor { $form->{username}, $form->{user_password}, $form->{v_customer_id}, + $form->{currency}, + conv_i($form->{delivery_term_id}), $form->{id} ); do_query($form, $dbh, $query, @values); - $query = undef; - if ( $form->{cp_id} ) { - $query = qq|UPDATE contacts SET | . - qq|cp_title = ?, | . - qq|cp_givenname = ?, | . - qq|cp_name = ?, | . - qq|cp_email = ?, | . - qq|cp_phone1 = ?, | . - qq|cp_phone2 = ?, | . - qq|cp_abteilung = ?, | . - qq|cp_fax = ?, | . - qq|cp_mobile1 = ?, | . - qq|cp_mobile2 = ?, | . - qq|cp_satphone = ?, | . - qq|cp_satfax = ?, | . - qq|cp_project = ?, | . - qq|cp_privatphone = ?, | . - qq|cp_privatemail = ?, | . - qq|cp_birthday = ?, | . - qq|cp_gender = ? | . - qq|WHERE cp_id = ?|; - @values = ( - $form->{cp_title}, - $form->{cp_givenname}, - $form->{cp_name}, - $form->{cp_email}, - $form->{cp_phone1}, - $form->{cp_phone2}, - $form->{cp_abteilung}, - $form->{cp_fax}, - $form->{cp_mobile1}, - $form->{cp_mobile2}, - $form->{cp_satphone}, - $form->{cp_satfax}, - $form->{cp_project}, - $form->{cp_privatphone}, - $form->{cp_privatemail}, - $form->{cp_birthday}, - $form->{cp_gender} eq 'f' ? 'f' : 'm', - $form->{cp_id} - ); - } elsif ( $form->{cp_name} || $form->{cp_givenname} ) { - $query = - qq|INSERT INTO contacts ( cp_cv_id, cp_title, cp_givenname, | . - qq| cp_name, cp_email, cp_phone1, cp_phone2, cp_abteilung, cp_fax, cp_mobile1, | . - qq| cp_mobile2, cp_satphone, cp_satfax, cp_project, cp_privatphone, cp_privatemail, | . - qq| cp_birthday, cp_gender) | . - qq|VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)|; - @values = ( - $form->{id}, - $form->{cp_title}, - $form->{cp_givenname}, - $form->{cp_name}, - $form->{cp_email}, - $form->{cp_phone1}, - $form->{cp_phone2}, - $form->{cp_abteilung}, - $form->{cp_fax}, - $form->{cp_mobile1}, - $form->{cp_mobile2}, - $form->{cp_satphone}, - $form->{cp_satfax}, - $form->{cp_project}, - $form->{cp_privatphone}, - $form->{cp_privatemail}, - $form->{cp_birthday}, - $form->{cp_gender} - ); - } - do_query($form, $dbh, $query, @values) if ($query); + $form->{cp_id} = $self->_save_contact($form, $dbh); # add shipto $form->add_shipto( $dbh, $form->{id}, "CT" ); @@ -651,14 +535,60 @@ sub save_vendor { 'trans_id' => $form->{id}, 'variables' => $form, 'always_valid' => 1); + if ($form->{cp_id}) { + CVar->save_custom_variables('dbh' => $dbh, + 'module' => 'Contacts', + 'trans_id' => $form->{cp_id}, + 'variables' => $form, + 'name_prefix' => 'cp', + 'always_valid' => 1); + } my $rc = $dbh->commit(); - $dbh->disconnect(); $main::lxdebug->leave_sub(); return $rc; } +sub _save_contact { + my ($self, $form, $dbh) = @_; + + return undef unless $form->{cp_id} || $form->{cp_name} || $form->{cp_givenname}; + + my @columns = qw(cp_title cp_givenname cp_name cp_email cp_phone1 cp_phone2 cp_abteilung cp_fax + cp_mobile1 cp_mobile2 cp_satphone cp_satfax cp_project cp_privatphone cp_privatemail cp_birthday cp_gender + cp_street cp_zipcode cp_city cp_position); + my @values = map( + { + if ( $_ eq 'cp_gender' ) { + $form->{$_} eq 'f' ? 'f' : 'm'; + } elsif ( $_ eq 'cp_birthday' && $form->{cp_birthday} eq '' ) { + undef; + } else { + $form->{$_}; + } + } + @columns + ); + + my ($query, $cp_id); + if ($form->{cp_id}) { + $query = qq|UPDATE contacts SET | . join(', ', map { "${_} = ?" } @columns) . qq| WHERE cp_id = ?|; + push @values, $form->{cp_id}; + $cp_id = $form->{cp_id}; + + } else { + ($cp_id) = selectrow_query($form, $dbh, qq|SELECT nextval('id')|); + + $query = qq|INSERT INTO contacts (| . join(', ', @columns, 'cp_cv_id', 'cp_id') . qq|) VALUES (| . join(', ', ('?') x (2 + scalar @columns)) . qq|)|; + push @values, $form->{id}, $cp_id; + } + + do_query($form, $dbh, $query, @values); + + return $cp_id; +} + sub delete { $main::lxdebug->enter_sub(); @@ -685,20 +615,46 @@ sub search { my $dbh = $form->dbconnect($myconfig); my $cv = $form->{db} eq "customer" ? "customer" : "vendor"; + my $join_records = $form->{l_invnumber} || $form->{l_ordnumber} || $form->{l_quonumber}; my $where = "1 = 1"; my @values; - my %allowed_sort_columns = - map { $_, 1 } qw( - id customernumber vendornumber name contact phone fax email street - taxnumber business invnumber ordnumber quonumber zipcode city + my %allowed_sort_columns = ( + "id" => "ct.id", + "customernumber" => "ct.customernumber", + "vendornumber" => "ct.vendornumber", + "name" => "ct.name", + "contact" => "ct.contact", + "phone" => "ct.phone", + "fax" => "ct.fax", + "email" => "ct.email", + "street" => "ct.street", + "taxnumber" => "ct.taxnumber", + "business" => "ct.business", + "invnumber" => "ct.invnumber", + "ordnumber" => "ct.ordnumber", + "quonumber" => "ct.quonumber", + "zipcode" => "ct.zipcode", + "city" => "ct.city", + "country" => "ct.country", + "discount" => "ct.discount", + "salesman" => "e.name" ); - my $sortorder = $form->{sort} && $allowed_sort_columns{$form->{sort}} ? $form->{sort} : "name"; - $form->{sort} = $sortorder; + + $form->{sort} ||= "name"; + my $sortorder; + if ( $join_records ) { + # in UNION case order by hash key, e.g. salesman + # the UNION created an implicit select around the result + $sortorder = $allowed_sort_columns{$form->{sort}} ? $form->{sort} : "name"; + } else { + # in not UNION case order by hash value, e.g. e.name + $sortorder = $allowed_sort_columns{$form->{sort}} ? $allowed_sort_columns{$form->{sort}} : "ct.name"; + } my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; - if ($sortorder ne 'id' && 1 >= scalar grep { $form->{$_} } qw(l_ordnumber l_quonumber l_invnumber)) { + if ($sortorder !~ /(business|id|discount)/ && !$join_records) { $sortorder = "lower($sortorder) ${sortdir}"; } else { $sortorder .= " ${sortdir}"; @@ -725,15 +681,28 @@ sub search { $where .= " AND ((lower(ct.city) LIKE lower(?)) OR (ct.id IN ( - SELECT trans_id - FROM shipto - WHERE (module = 'CT') - AND (lower(shiptocity) LIKE lower(?)) + SELECT sc.trans_id + FROM shipto sc + WHERE (sc.module = 'CT') + AND (lower(sc.shiptocity) LIKE lower(?)) )) )"; push @values, ('%' . $form->{addr_city} . '%') x 2; } + if ($form->{addr_country}) { + $where .= " AND ((lower(ct.country) LIKE lower(?)) + OR + (ct.id IN ( + SELECT so.trans_id + FROM shipto so + WHERE (so.module = 'CT') + AND (lower(so.shiptocountry) LIKE lower(?)) + )) + )"; + push @values, ('%' . $form->{addr_country} . '%') x 2; + } + if ( $form->{status} eq 'orphaned' ) { $where .= qq| AND ct.id NOT IN | . @@ -754,16 +723,23 @@ sub search { } if ($form->{obsolete} eq "Y") { - $where .= qq| AND obsolete|; + $where .= qq| AND ct.obsolete|; } elsif ($form->{obsolete} eq "N") { - $where .= qq| AND NOT obsolete|; + $where .= qq| AND NOT ct.obsolete|; } if ($form->{business_id}) { - $where .= qq| AND (business_id = ?)|; + $where .= qq| AND (ct.business_id = ?)|; push(@values, conv_i($form->{business_id})); } + # Nur Kunden finden, bei denen ich selber der Verkäufer bin + # Gilt nicht für Lieferanten + if ($cv eq 'customer' && !$main::auth->assert('customer_vendor_all_edit', 1)) { + $where .= qq| AND ct.salesman_id = (select em.id from employee em where em.login = ?)|; + push(@values, $form->{login}); + } + my ($cvar_where, @cvar_values) = CVar->build_filter_query('module' => 'CT', 'trans_id_field' => 'ct.id', 'filter' => $form); @@ -774,73 +750,70 @@ sub search { } if ($form->{addr_street}) { - $where .= qq| AND (street ILIKE ?)|; + $where .= qq| AND (ct.street ILIKE ?)|; push @values, '%' . $form->{addr_street} . '%'; } if ($form->{addr_zipcode}) { - $where .= qq| AND (zipcode ILIKE ?)|; + $where .= qq| AND (ct.zipcode ILIKE ?)|; push @values, $form->{addr_zipcode} . '%'; } my $query = - qq|SELECT ct.*, b.description AS business | . + qq|SELECT ct.*, b.description AS business, e.name as salesman | . + (qq|, NULL AS invnumber, NULL AS ordnumber, NULL AS quonumber, NULL AS invid, NULL AS module, NULL AS formtype, NULL AS closed | x!! $join_records) . qq|FROM $cv ct | . qq|LEFT JOIN business b ON (ct.business_id = b.id) | . + qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | . qq|WHERE $where|; my @saved_values = @values; # redo for invoices, orders and quotations - if ($form->{l_invnumber} || $form->{l_ordnumber} || $form->{l_quonumber}) { - my ($ar, $union, $module); - $query = ""; + if ($join_records) { + my $union = "UNION"; if ($form->{l_invnumber}) { my $ar = $cv eq 'customer' ? 'ar' : 'ap'; my $module = $ar eq 'ar' ? 'is' : 'ir'; - - $query = - qq|SELECT ct.*, b.description AS business, | . + push(@values, @saved_values); + $query .= + qq| UNION | . + qq|SELECT ct.*, b.description AS business, e.name as salesman, | . qq| a.invnumber, a.ordnumber, a.quonumber, a.id AS invid, | . qq| '$module' AS module, 'invoice' AS formtype, | . qq| (a.amount = a.paid) AS closed | . qq|FROM $cv ct | . qq|JOIN $ar a ON (a.${cv}_id = ct.id) | . qq|LEFT JOIN business b ON (ct.business_id = b.id) | . + qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | . qq|WHERE $where AND (a.invoice = '1')|; - - $union = qq|UNION|; } if ( $form->{l_ordnumber} ) { - if ($union eq "UNION") { - push(@values, @saved_values); - } + push(@values, @saved_values); $query .= - qq| $union | . - qq|SELECT ct.*, b.description AS business,| . + qq| UNION | . + qq|SELECT ct.*, b.description AS business, e.name as salesman, | . qq| ' ' AS invnumber, o.ordnumber, o.quonumber, o.id AS invid, | . qq| 'oe' AS module, 'order' AS formtype, o.closed | . qq|FROM $cv ct | . qq|JOIN oe o ON (o.${cv}_id = ct.id) | . qq|LEFT JOIN business b ON (ct.business_id = b.id) | . + qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | . qq|WHERE $where AND (o.quotation = '0')|; - - $union = qq|UNION|; } if ( $form->{l_quonumber} ) { - if ($union eq "UNION") { - push(@values, @saved_values); - } + push(@values, @saved_values); $query .= - qq| $union | . - qq|SELECT ct.*, b.description AS business, | . + qq| UNION | . + qq|SELECT ct.*, b.description AS business, e.name as salesman, | . qq| ' ' AS invnumber, o.ordnumber, o.quonumber, o.id AS invid, | . qq| 'oe' AS module, 'quotation' AS formtype, o.closed | . qq|FROM $cv ct | . qq|JOIN oe o ON (o.${cv}_id = ct.id) | . qq|LEFT JOIN business b ON (ct.business_id = b.id) | . + qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | . qq|WHERE $where AND (o.quotation = '1')|; } } @@ -856,6 +829,9 @@ sub get_contact { $main::lxdebug->enter_sub(); my ( $self, $myconfig, $form ) = @_; + + die 'Missing argument: cp_id' unless $::form->{cp_id}; + my $dbh = $form->dbconnect($myconfig); my $query = qq|SELECT * FROM contacts c | . @@ -1035,6 +1011,7 @@ sub _delete_selected_notes { $main::lxdebug->leave_sub(); } +# TODO: remove in 2.7.0 stable sub delete_shipto { $main::lxdebug->enter_sub(); @@ -1045,7 +1022,25 @@ sub delete_shipto { my %myconfig = %main::myconfig; my $dbh = $form->get_standard_dbh(\%myconfig); - do_query($form, $dbh, qq|UPDATE contacts SET cp_cv_id = NULL WHERE cp_id = ?|, $shipto_id); + do_query($form, $dbh, qq|UPDATE shipto SET trans_id = NULL WHERE shipto_id = ?|, $shipto_id); + + $dbh->commit(); + + $main::lxdebug->leave_sub(); +} + +# TODO: remove in 2.7.0 stable +sub delete_contact { + $main::lxdebug->enter_sub(); + + my $self = shift; + my $cp_id = shift; + + my $form = $main::form; + my %myconfig = %main::myconfig; + my $dbh = $form->get_standard_dbh(\%myconfig); + + do_query($form, $dbh, qq|UPDATE contacts SET cp_cv_id = NULL WHERE cp_id = ?|, $cp_id); $dbh->commit(); @@ -1091,6 +1086,10 @@ sub parse_excel_file { my ($self, $myconfig, $form) = @_; my $locale = $main::locale; + my $defaults = SL::DB::Default->get; + $form->error($::locale->text('No print templates have been created for this client yet. Please do so in the client configuration.')) if !$defaults->templates; + $form->{templates} = $defaults->templates; + $form->{formname} = 'sales_quotation'; $form->{type} = 'sales_quotation'; $form->{format} = 'excel'; @@ -1133,8 +1132,6 @@ sub parse_excel_file { $form->{notes} =~ s/^\s+//g; - $form->{templates} = $myconfig->{templates}; - delete $form->{printer_command}; $form->get_employee_info($myconfig); @@ -1156,9 +1153,95 @@ sub parse_excel_file { delete $form->{OUT}; - $form->parse_template($myconfig, $main::userspath); + $form->parse_template($myconfig); $main::lxdebug->leave_sub(); } +sub search_contacts { + $::lxdebug->enter_sub; + + my $self = shift; + my %params = @_; + + my $dbh = $params{dbh} || $::form->get_standard_dbh; + + my %sortspecs = ( + 'cp_name' => 'cp_name, cp_givenname', + 'vcname' => 'vcname, cp_name, cp_givenname', + 'vcnumber' => 'vcnumber, cp_name, cp_givenname', + ); + + my %sortcols = map { $_ => 1 } qw(cp_name cp_givenname cp_phone1 cp_phone2 cp_mobile1 cp_email cp_street cp_zipcode cp_city cp_position vcname vcnumber); + + my $order_by = $sortcols{$::form->{sort}} ? $::form->{sort} : 'cp_name'; + $::form->{sort} = $order_by; + $order_by = $sortspecs{$order_by} if ($sortspecs{$order_by}); + + my $sortdir = $::form->{sortdir} ? 'ASC' : 'DESC'; + $order_by =~ s/,/ ${sortdir},/g; + $order_by .= " $sortdir"; + + my @where_tokens = (); + my @values; + + if ($params{search_term}) { + my @tokens; + push @tokens, + 'cp.cp_name ILIKE ?', + 'cp.cp_givenname ILIKE ?', + 'cp.cp_email ILIKE ?'; + push @values, ('%' . $params{search_term} . '%') x 3; + + if (($params{search_term} =~ m/\d/) && ($params{search_term} !~ m/[^\d \(\)+\-]/)) { + my $number = $params{search_term}; + $number =~ s/[^\d]//g; + $number = join '[ /\(\)+\-]*', split(m//, $number); + + push @tokens, map { "($_ ~ '$number')" } qw(cp_phone1 cp_phone2 cp_mobile1 cp_mobile2); + } + + push @where_tokens, map { "($_)" } join ' OR ', @tokens; + } + + my ($cvar_where, @cvar_values) = CVar->build_filter_query('module' => 'Contacts', + 'trans_id_field' => 'cp.cp_id', + 'filter' => $params{filter}); + + if ($cvar_where) { + push @where_tokens, $cvar_where; + push @values, @cvar_values; + } + + if (my $filter = $params{filter}) { + for (qw(name title givenname email project abteilung)) { + next unless $filter->{"cp_$_"}; + add_token(\@where_tokens, \@values, col => "cp.cp_$_", val => $filter->{"cp_$_"}, method => 'ILIKE', esc => 'substr'); + } + + push @where_tokens, 'cp.cp_cv_id IS NOT NULL' if $filter->{status} eq 'active'; + push @where_tokens, 'cp.cp_cv_id IS NULL' if $filter->{status} eq 'orphaned'; + } + + my $where = @where_tokens ? 'WHERE ' . join ' AND ', @where_tokens : ''; + + my $query = qq|SELECT cp.*, + COALESCE(c.id, v.id) AS vcid, + COALESCE(c.name, v.name) AS vcname, + COALESCE(c.customernumber, v.vendornumber) AS vcnumber, + CASE WHEN c.name IS NULL THEN 'vendor' ELSE 'customer' END AS db + FROM contacts cp + LEFT JOIN customer c ON (cp.cp_cv_id = c.id) + LEFT JOIN vendor v ON (cp.cp_cv_id = v.id) + $where + ORDER BY $order_by|; + + my $contacts = selectall_hashref_query($::form, $dbh, $query, @values); + + $::lxdebug->leave_sub; + + return @{ $contacts }; +} + + 1;