X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FCT.pm;h=082afdf2572d763bfbdb4b0c918695192f997b53;hb=980dc53321ae6c2d3e448b6ca2a0c7d11a65ee8c;hp=7ccccadcc41425e8c5f79c783ee9ec8b87d962c8;hpb=7a7f33b5c1b3531ab761adba1cf19d4ad68cffcd;p=kivitendo-erp.git diff --git a/SL/CT.pm b/SL/CT.pm index 7ccccadcc..082afdf25 100644 --- a/SL/CT.pm +++ b/SL/CT.pm @@ -44,6 +44,9 @@ use SL::CVar; use SL::DBUtils; use SL::FU; use SL::Notes; +use SL::TransNumber; + +use strict; sub get_tuple { $main::lxdebug->enter_sub(); @@ -62,10 +65,13 @@ sub get_tuple { qq|ORDER BY cp.cp_id LIMIT 1|; my $sth = prepare_execute_query($form, $dbh, $query, $form->{id}); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; + # remove any trailing whitespace + $form->{curr} =~ s/\s*$//; + $sth->finish; if ( $form->{salesman_id} ) { my $query = @@ -116,14 +122,21 @@ sub get_tuple { if ($ref) { foreach my $key (keys %{ $ref }) { my $new_key = $key; - $new_key =~ s/^([^_]+)/\U\1\E/; + $new_key =~ s/^([^_]+)/\U$1\E/; $form->{$new_key} = $ref->{$key}; } } } # check if it is orphaned - my $arap = ( $form->{db} eq 'customer' ) ? "ar" : "ap"; + my $arap = ( $form->{db} eq 'customer' ) ? "ar" : "ap"; + my $num_args = 2; + my $makemodel = ''; + if ($form->{db} eq 'vendor') { + $makemodel = qq| UNION SELECT 1 FROM makemodel mm WHERE mm.make = ?|; + $num_args++; + } + $query = qq|SELECT a.id | . qq|FROM $arap a | . @@ -133,8 +146,10 @@ sub get_tuple { qq|SELECT a.id | . qq|FROM oe a | . qq|JOIN $cv ct ON (a.${cv}_id = ct.id) | . - qq|WHERE ct.id = ?|; - my ($dummy) = selectrow_query($form, $dbh, $query, $form->{id}, $form->{id}); + qq|WHERE ct.id = ?| + . $makemodel; + my ($dummy) = selectrow_query($form, $dbh, $query, (conv_i($form->{id})) x $num_args); + $form->{status} = "orphaned" unless ($dummy); $dbh->disconnect; @@ -146,6 +161,7 @@ sub populate_drop_down_boxes { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form, $provided_dbh) = @_; + my $query; my $dbh = $provided_dbh ? $provided_dbh : $form->dbconnect($myconfig); @@ -155,12 +171,13 @@ sub populate_drop_down_boxes { # get shipto address $query = - qq|SELECT shipto_id, shiptoname, shiptodepartment_1 | . - qq|FROM shipto WHERE (trans_id = ?) AND (module = 'CT')|; + qq|SELECT shipto_id, shiptoname, shiptodepartment_1, shiptostreet, shiptocity + FROM shipto + WHERE (trans_id = ?) AND (module = 'CT')|; $form->{SHIPTO} = selectall_hashref_query($form, $dbh, $query, $form->{id}); # get contacts - $query = qq|SELECT cp_id, cp_name FROM contacts WHERE cp_cv_id = ?|; + $query = qq|SELECT cp_id, cp_name, cp_givenname FROM contacts WHERE cp_cv_id = ? ORDER BY cp_name|; $form->{CONTACTS} = selectall_hashref_query($form, $dbh, $query, $form->{id}); # get languages @@ -180,17 +197,10 @@ sub query_titles_and_greetings { $main::lxdebug->enter_sub(); my ( $self, $myconfig, $form ) = @_; - my ( %tmp, $ref ); + my ( %tmp, $ref, $query ); my $dbh = $form->dbconnect($myconfig); - $query = - qq|SELECT DISTINCT(cp_greeting) | . - qq|FROM contacts | . - qq|WHERE cp_greeting ~ '[a-zA-Z]' | . - qq|ORDER BY cp_greeting|; - $form->{GREETINGS} = [ selectall_array_query($form, $dbh, $query) ]; - $query = qq|SELECT DISTINCT(greeting) | . qq|FROM customer | . @@ -200,7 +210,7 @@ sub query_titles_and_greetings { qq|FROM vendor | . qq|WHERE greeting ~ '[a-zA-Z]' | . qq|ORDER BY greeting|; - my %tmp; + map({ $tmp{$_} = 1; } selectall_array_query($form, $dbh, $query)); $form->{COMPANY_GREETINGS} = [ sort(keys(%tmp)) ]; @@ -229,7 +239,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_${_}"} @@ -255,21 +265,12 @@ sub save_customer { } } else { - if (!$form->{customernumber} && $form->{business}) { - $form->{customernumber} = - $form->update_business($myconfig, $form->{business}, $dbh); - } - if (!$form->{customernumber}) { - $form->{customernumber} = - $form->update_defaults($myconfig, "customernumber", $dbh); - } - - $query = qq|SELECT c.id FROM customer c WHERE c.customernumber = ?|; - ($f_id) = selectrow_query($form, $dbh, $query, $form->{customernumber}); - if ($f_id ne "") { - $main::lxdebug->leave_sub(); - return 3; - } + my $customernumber = SL::TransNumber->new(type => 'customer', + dbh => $dbh, + number => $form->{customernumber}, + business_id => $form->{business}, + save => 1); + $form->{customernumber} = $customernumber->create_unique unless $customernumber->is_unique; $query = qq|SELECT nextval('id')|; ($form->{id}) = selectrow_query($form, $dbh, $query); @@ -301,12 +302,14 @@ sub save_customer { qq|terms = ?, | . qq|business_id = ?, | . qq|taxnumber = ?, | . - qq|sic_code = ?, | . qq|language = ?, | . qq|account_number = ?, | . qq|bank_code = ?, | . qq|bank = ?, | . + qq|iban = ?, | . + qq|bic = ?, | . qq|obsolete = ?, | . + qq|direct_debit = ?, | . qq|ustid = ?, | . qq|username = ?, | . qq|salesman_id = ?, | . @@ -315,7 +318,9 @@ sub save_customer { qq|taxzone_id = ?, | . qq|user_password = ?, | . qq|c_vendor_id = ?, | . - qq|klass = ? | . + qq|klass = ?, | . + qq|curr = ?, | . + qq|taxincluded_checked = ? | . qq|WHERE id = ?|; my @values = ( $form->{customernumber}, @@ -340,12 +345,14 @@ sub save_customer { conv_i($form->{terms}), conv_i($form->{business}), $form->{taxnumber}, - $form->{sic}, $form->{language}, $form->{account_number}, $form->{bank_code}, $form->{bank}, + $form->{iban}, + $form->{bic}, $form->{obsolete} ? 't' : 'f', + $form->{direct_debit} ? 't' : 'f', $form->{ustid}, $form->{username}, conv_i($form->{salesman_id}), @@ -355,80 +362,13 @@ sub save_customer { $form->{user_password}, $form->{c_vendor_id}, conv_i($form->{klass}), + substr($form->{currency}, 0, 3), + $form->{taxincluded_checked} ne '' ? $form->{taxincluded_checked} : undef, $form->{id} ); do_query( $form, $dbh, $query, @values ); - $query = undef; - if ( $form->{cp_id} ) { - $query = qq|UPDATE contacts SET | . - qq|cp_greeting = ?, | . - 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|WHERE cp_id = ?|; - @values = ( - $form->{cp_greeting}, - $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_id} - ); - } elsif ( $form->{cp_name} || $form->{cp_givenname} ) { - $query = - qq|INSERT INTO contacts ( cp_cv_id, cp_greeting, 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) | . - qq|VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)|; - @values = ( - $form->{id}, - $form->{cp_greeting}, - $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} - ); - } - 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" ); @@ -439,10 +379,18 @@ sub save_customer { CVar->save_custom_variables('dbh' => $dbh, 'module' => 'CT', 'trans_id' => $form->{id}, - 'variables' => $form); + '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); + } - $rc = $dbh->commit(); - $dbh->disconnect(); + my $rc = $dbh->commit(); $main::lxdebug->leave_sub(); return $rc; @@ -455,7 +403,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_${_}"} @@ -470,20 +418,18 @@ sub save_vendor { my $query; - if ( $form->{id} ) { - $query = qq|DELETE FROM shipto WHERE (trans_id = ?) AND (module = 'CT')|; - do_query($form, $dbh, $query, $form->{id}); - - } else { + if (!$form->{id}) { $query = qq|SELECT nextval('id')|; ($form->{id}) = selectrow_query($form, $dbh, $query); $query = qq|INSERT INTO vendor (id, name) VALUES (?, '')|; do_query($form, $dbh, $query, $form->{id}); - if ( !$form->{vendornumber} ) { - $form->{vendornumber} = $form->update_defaults( $myconfig, "vendornumber", $dbh ); - } + my $vendornumber = SL::TransNumber->new(type => 'vendor', + dbh => $dbh, + number => $form->{vendornumber}, + save => 1); + $form->{vendornumber} = $vendornumber->create_unique unless $vendornumber->is_unique; } $query = @@ -510,21 +456,24 @@ sub save_vendor { qq| creditlimit = ?, | . qq| business_id = ?, | . qq| taxnumber = ?, | . - qq| sic_code = ?, | . qq| language = ?, | . qq| account_number = ?, | . qq| bank_code = ?, | . qq| bank = ?, | . + qq| iban = ?, | . + qq| bic = ?, | . qq| obsolete = ?, | . + qq| direct_debit = ?, | . qq| ustid = ?, | . qq| payment_id = ?, | . qq| taxzone_id = ?, | . qq| language_id = ?, | . qq| username = ?, | . qq| user_password = ?, | . - qq| v_customer_id = ? | . + qq| v_customer_id = ?, | . + qq| curr = ? | . qq|WHERE id = ?|; - @values = ( + my @values = ( $form->{vendornumber}, $form->{name}, $form->{greeting}, @@ -547,12 +496,14 @@ sub save_vendor { $form->{creditlimit}, conv_i($form->{business}), $form->{taxnumber}, - $form->{sic}, $form->{language}, $form->{account_number}, $form->{bank_code}, $form->{bank}, + $form->{iban}, + $form->{bic}, $form->{obsolete} ? 't' : 'f', + $form->{direct_debit} ? 't' : 'f', $form->{ustid}, conv_i($form->{payment_id}), conv_i($form->{taxzone_id}, 0), @@ -560,80 +511,12 @@ sub save_vendor { $form->{username}, $form->{user_password}, $form->{v_customer_id}, + substr($form->{currency}, 0, 3), $form->{id} ); do_query($form, $dbh, $query, @values); - $query = undef; - if ( $form->{cp_id} ) { - $query = qq|UPDATE contacts SET | . - qq|cp_greeting = ?, | . - 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|WHERE cp_id = ?|; - @values = ( - $form->{cp_greeting}, - $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_id} - ); - } elsif ( $form->{cp_name} || $form->{cp_givenname} ) { - $query = - qq|INSERT INTO contacts ( cp_cv_id, cp_greeting, 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) | . - qq|VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)|; - @values = ( - $form->{id}, - $form->{cp_greeting}, - $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} - ); - } - 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" ); @@ -644,15 +527,62 @@ sub save_vendor { CVar->save_custom_variables('dbh' => $dbh, 'module' => 'CT', 'trans_id' => $form->{id}, - 'variables' => $form); + '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); + } - $rc = $dbh->commit(); - $dbh->disconnect(); + my $rc = $dbh->commit(); $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); + 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(); @@ -679,18 +609,25 @@ 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 name address contact phone fax email - taxnumber sic_code business invnumber ordnumber quonumber)); - $sortorder = - $form->{sort} && $allowed_sort_columns{$form->{sort}} ? - $form->{sort} : "name"; + map { $_, 1 } qw( + id customernumber vendornumber name contact phone fax email street + taxnumber business invnumber ordnumber quonumber zipcode city + ); + my $sortorder = $form->{sort} && $allowed_sort_columns{$form->{sort}} ? $form->{sort} : "name"; $form->{sort} = $sortorder; - $sortorder = "country,city,street" if ($sortorder eq "address"); + my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; + + if ($sortorder !~ /(business|id)/ && !$join_records) { + $sortorder = "lower($sortorder) ${sortdir}"; + } else { + $sortorder .= " ${sortdir}"; + } if ($form->{"${cv}number"}) { $where .= " AND ct.${cv}number ILIKE ?"; @@ -704,6 +641,24 @@ sub search { } } + if ($form->{cp_name}) { + $where .= " AND ct.id IN (SELECT cp_cv_id FROM contacts WHERE lower(cp_name) LIKE lower(?))"; + push @values, '%' . $form->{cp_name} . '%'; + } + + if ($form->{addr_city}) { + $where .= " AND ((lower(ct.city) LIKE lower(?)) + OR + (ct.id IN ( + SELECT trans_id + FROM shipto + WHERE (module = 'CT') + AND (lower(shiptocity) LIKE lower(?)) + )) + )"; + push @values, ('%' . $form->{addr_city} . '%') x 2; + } + if ( $form->{status} eq 'orphaned' ) { $where .= qq| AND ct.id NOT IN | . @@ -734,6 +689,13 @@ sub search { 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 id from employee where login= ?)|; + push(@values, $form->{login}); + } + my ($cvar_where, @cvar_values) = CVar->build_filter_query('module' => 'CT', 'trans_id_field' => 'ct.id', 'filter' => $form); @@ -743,23 +705,34 @@ sub search { push @values, @cvar_values; } + if ($form->{addr_street}) { + $where .= qq| AND (street ILIKE ?)|; + push @values, '%' . $form->{addr_street} . '%'; + } + + if ($form->{addr_zipcode}) { + $where .= qq| AND (zipcode ILIKE ?)|; + push @values, $form->{addr_zipcode} . '%'; + } + my $query = qq|SELECT ct.*, b.description AS business | . + (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|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 = + push(@values, @saved_values); + $query .= + qq| UNION | . qq|SELECT ct.*, b.description AS business, | . qq| a.invnumber, a.ordnumber, a.quonumber, a.id AS invid, | . qq| '$module' AS module, 'invoice' AS formtype, | . @@ -768,16 +741,12 @@ sub search { qq|JOIN $ar a ON (a.${cv}_id = ct.id) | . qq|LEFT JOIN business b ON (ct.business_id = b.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| UNION | . qq|SELECT ct.*, b.description AS business,| . qq| ' ' AS invnumber, o.ordnumber, o.quonumber, o.id AS invid, | . qq| 'oe' AS module, 'order' AS formtype, o.closed | . @@ -785,16 +754,12 @@ sub search { qq|JOIN oe o ON (o.${cv}_id = ct.id) | . qq|LEFT JOIN business b ON (ct.business_id = b.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| UNION | . qq|SELECT ct.*, b.description AS business, | . qq| ' ' AS invnumber, o.ordnumber, o.quonumber, o.id AS invid, | . qq| 'oe' AS module, 'quotation' AS formtype, o.closed | . @@ -808,8 +773,6 @@ sub search { $query .= qq| ORDER BY $sortorder|; $form->{CT} = selectall_hashref_query($form, $dbh, $query, @values); - map({ my $ref = $_; $ref->{address} = join(" ", map({ $ref->{$_} } qw(street zipcode city country))); } - @{ $form->{CT} }); $main::lxdebug->leave_sub(); } @@ -818,15 +781,26 @@ 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 | . qq|WHERE cp_id = ? ORDER BY cp_id limit 1|; my $sth = prepare_execute_query($form, $dbh, $query, $form->{cp_id}); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; + $query = qq|SELECT COUNT(cp_id) AS used FROM ( + SELECT cp_id FROM oe UNION + SELECT cp_id FROM ar UNION + SELECT cp_id FROM ap UNION + SELECT cp_id FROM delivery_orders + ) AS cpid WHERE cp_id = ? OR ? = 0|; + ($form->{cp_used}) = selectfirst_array_query($form, $dbh, $query, ($form->{cp_id})x2); + $sth->finish; $dbh->disconnect; @@ -841,10 +815,17 @@ sub get_shipto { my $query = qq|SELECT * FROM shipto WHERE shipto_id = ?|; my $sth = prepare_execute_query($form, $dbh, $query, $form->{shipto_id}); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; + $query = qq|SELECT COUNT(shipto_id) AS used FROM ( + SELECT shipto_id FROM oe UNION + SELECT shipto_id FROM ar UNION + SELECT shipto_id FROM delivery_orders + ) AS stid WHERE shipto_id = ? OR ? = 0|; + ($form->{shiptoused}) = selectfirst_array_query($form, $dbh, $query, ($form->{shipto_id})x2); + $sth->finish; $dbh->disconnect; @@ -859,6 +840,7 @@ sub get_delivery { my $arap = $form->{db} eq "vendor" ? "ap" : "ar"; my $db = $form->{db} eq "customer" ? "customer" : "vendor"; + my $qty_sign = $form->{db} eq 'vendor' ? ' * -1 AS qty' : ''; my $where = " WHERE 1=1 "; my @values; @@ -880,9 +862,10 @@ sub get_delivery { push(@values, conv_date($form->{to})); } my $query = - qq|SELECT s.shiptoname, i.qty, | . - qq| ${arap}.transdate, ${arap}.invnumber, ${arap}.ordnumber, | . - qq| i.description, i.unit, i.sellprice | . + qq|SELECT s.shiptoname, i.qty $qty_sign, | . + qq| ${arap}.id, ${arap}.transdate, ${arap}.invnumber, ${arap}.ordnumber, | . + qq| i.description, i.unit, i.sellprice, | . + qq| oe.id AS oe_id, invoice | . qq|FROM $arap | . qq|LEFT JOIN shipto s ON | . ($arap eq "ar" @@ -890,6 +873,7 @@ sub get_delivery { : qq|(ap.id = s.trans_id) |) . qq|LEFT JOIN invoice i ON (${arap}.id = i.trans_id) | . qq|LEFT join parts p ON (p.id = i.parts_id) | . + qq|LEFT JOIN oe ON (oe.ordnumber = ${arap}.ordnumber AND NOT ${arap}.ordnumber = '') | . $where . qq|ORDER BY ${arap}.transdate DESC LIMIT 15|; @@ -979,4 +963,236 @@ sub _delete_selected_notes { $main::lxdebug->leave_sub(); } +# TODO: remove in 2.7.0 stable +sub delete_shipto { + $main::lxdebug->enter_sub(); + + my $self = shift; + my $shipto_id = shift; + + my $form = $main::form; + my %myconfig = %main::myconfig; + my $dbh = $form->get_standard_dbh(\%myconfig); + + 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(); + + $main::lxdebug->leave_sub(); +} + +sub get_bank_info { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + Common::check_params(\%params, qw(vc id)); + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my $table = $params{vc} eq 'customer' ? 'customer' : 'vendor'; + my @ids = ref $params{id} eq 'ARRAY' ? @{ $params{id} } : ($params{id}); + my $placeholders = join ", ", ('?') x scalar @ids; + my $query = qq|SELECT id, name, account_number, bank, bank_code, iban, bic + FROM ${table} + WHERE id IN (${placeholders})|; + + my $result = selectall_hashref_query($form, $dbh, $query, map { conv_i($_) } @ids); + + if (ref $params{id} eq 'ARRAY') { + $result = { map { $_->{id} => $_ } @{ $result } }; + } else { + $result = $result->[0] || { 'id' => $params{id} }; + } + + $main::lxdebug->leave_sub(); + + return $result; +} + +sub parse_excel_file { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + my $locale = $main::locale; + + $form->{formname} = 'sales_quotation'; + $form->{type} = 'sales_quotation'; + $form->{format} = 'excel'; + $form->{media} = 'screen'; + $form->{quonumber} = 1; + + + # $form->{"notes"} will be overridden by the customer's/vendor's "notes" field. So save it here. + $form->{ $form->{"formname"} . "notes" } = $form->{"notes"}; + + my $inv = "quo"; + my $due = "req"; + $form->{"${inv}date"} = $form->{transdate}; + $form->{label} = $locale->text('Quotation'); + my $numberfld = "sqnumber"; + my $order = 1; + + # assign number + $form->{what_done} = $form->{formname}; + + map({ delete($form->{$_}); } grep(/^cp_/, keys(%{ $form }))); + + my $output_dateformat = $myconfig->{"dateformat"}; + my $output_numberformat = $myconfig->{"numberformat"}; + my $output_longdates = 1; + + # map login user variables + map { $form->{"login_$_"} = $myconfig->{$_} } ("name", "email", "fax", "tel", "company"); + + # format item dates + for my $field (qw(transdate_oe deliverydate_oe)) { + map { + $form->{$field}[$_] = $locale->date($myconfig, $form->{$field}[$_], 1); + } 0 .. $#{ $form->{$field} }; + } + + if ($form->{shipto_id}) { + $form->get_shipto($myconfig); + } + + $form->{notes} =~ s/^\s+//g; + + $form->{templates} = $myconfig->{templates}; + + delete $form->{printer_command}; + + $form->get_employee_info($myconfig); + + my ($cvar_date_fields, $cvar_number_fields) = CVar->get_field_format_list('module' => 'CT', 'prefix' => 'vc_'); + + if (scalar @{ $cvar_date_fields }) { + format_dates($output_dateformat, $output_longdates, @{ $cvar_date_fields }); + } + + while (my ($precision, $field_list) = each %{ $cvar_number_fields }) { + reformat_numbers($output_numberformat, $precision, @{ $field_list }); + } + + $form->{excel} = 1; + my $extension = 'xls'; + + $form->{IN} = "$form->{formname}.${extension}"; + + delete $form->{OUT}; + + $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 $vc = $params{db} eq 'customer' ? 'customer' : 'vendor'; + + 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 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;