Projekt

Allgemein

Profil

Herunterladen (15,6 KB) Statistiken
| Zweig: | Markierung: | Revision:
d319704a Moritz Bunkus
#=====================================================================
# LX-Office ERP
# Copyright (C) 2004
# Based on SQL-Ledger Version 2.1.9
# Web http://www.lx-office.org
#
#=====================================================================
# SQL-Ledger Accounting
# Copyright (C) 2001
#
# Author: Dieter Simader
# Email: dsimader@sql-ledger.org
# Web: http://www.sql-ledger.org
#
# Contributors:
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#======================================================================
#
# backend code for customers and vendors
#
# CHANGE LOG:
# DS. 2000-07-04 Created
#
#======================================================================

package CT;
8688e71e Moritz Bunkus
7a7f33b5 Moritz Bunkus
use SL::Common;
8688e71e Moritz Bunkus
use SL::CVar;
af853490 Moritz Bunkus
use SL::DBUtils;
d319704a Moritz Bunkus
c510d88b Sven Schöling
use strict;

d319704a Moritz Bunkus
sub search {
$main::lxdebug->enter_sub();

93a4e424 Moritz Bunkus
my ( $self, $myconfig, $form ) = @_;
d319704a Moritz Bunkus
# connect to database
my $dbh = $form->dbconnect($myconfig);

93a4e424 Moritz Bunkus
my $cv = $form->{db} eq "customer" ? "customer" : "vendor";
09306b9f Sven Schöling
my $join_records = $form->{l_invnumber} || $form->{l_ordnumber} || $form->{l_quonumber};
93a4e424 Moritz Bunkus
d319704a Moritz Bunkus
my $where = "1 = 1";
93a4e424 Moritz Bunkus
my @values;
d319704a Moritz Bunkus
e5e2493f Geoffrey Richardson
my %allowed_sort_columns = (
0497b9cd Moritz Bunkus
"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",
c5daa6b4 Bernd Bleßmann
"business" => "b.description",
0497b9cd Moritz Bunkus
"invnumber" => "ct.invnumber",
"ordnumber" => "ct.ordnumber",
"quonumber" => "ct.quonumber",
"zipcode" => "ct.zipcode",
"city" => "ct.city",
"country" => "ct.country",
030cf0d5 Bernd Bleßmann
"gln" => "ct.gln",
880122f8 Bernd Bleßmann
"discount" => "ct.discount",
8dc4cef2 Bernd Bleßmann
"insertdate" => "ct.itime",
a9325fe9 Bernd Bleßmann
"salesman" => "e.name",
32e816b5 Bernd Bleßmann
"payment" => "pt.description",
"pricegroup" => "pg.pricegroup",
63e0f606 Sven Schöling
);
e5e2493f Geoffrey Richardson
1ade8550 Bernd Bleßmann
$form->{sort} ||= "name";
e5e2493f Geoffrey Richardson
my $sortorder;
if ( $join_records ) {
# in UNION case order by hash key, e.g. salesman
c2796317 Bernd Bleßmann
# the UNION created an implicit select around the result
1ade8550 Bernd Bleßmann
$sortorder = $allowed_sort_columns{$form->{sort}} ? $form->{sort} : "name";
e5e2493f Geoffrey Richardson
} else {
# in not UNION case order by hash value, e.g. e.name
1ade8550 Bernd Bleßmann
$sortorder = $allowed_sort_columns{$form->{sort}} ? $allowed_sort_columns{$form->{sort}} : "ct.name";
fc55beb4 Bernd Bleßmann
}
a2aca2e1 Moritz Bunkus
my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC';
1f14e3b9 Moritz Bunkus
8dc4cef2 Bernd Bleßmann
if ($sortorder !~ /(business|id|discount|itime)/ && !$join_records) {
aa589686 Moritz Bunkus
$sortorder = "lower($sortorder) ${sortdir}";
a2aca2e1 Moritz Bunkus
} else {
$sortorder .= " ${sortdir}";
1f14e3b9 Moritz Bunkus
}
93a4e424 Moritz Bunkus
if ($form->{"${cv}number"}) {
$where .= " AND ct.${cv}number ILIKE ?";
push(@values, '%' . $form->{"${cv}number"} . '%');
d319704a Moritz Bunkus
}
93a4e424 Moritz Bunkus
foreach my $key (qw(name contact email)) {
if ($form->{$key}) {
$where .= " AND ct.$key ILIKE ?";
push(@values, '%' . $form->{$key} . '%');
}
d319704a Moritz Bunkus
}

87e190b4 Geoffrey Richardson
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 (
0497b9cd Moritz Bunkus
SELECT sc.trans_id
FROM shipto sc
WHERE (sc.module = 'CT')
AND (lower(sc.shiptocity) LIKE lower(?))
87e190b4 Geoffrey Richardson
))
)";
push @values, ('%' . $form->{addr_city} . '%') x 2;
}

2def6461 Geoffrey Richardson
if ($form->{addr_country}) {
$where .= " AND ((lower(ct.country) LIKE lower(?))
OR
(ct.id IN (
0497b9cd Moritz Bunkus
SELECT so.trans_id
FROM shipto so
WHERE (so.module = 'CT')
AND (lower(so.shiptocountry) LIKE lower(?))
2def6461 Geoffrey Richardson
))
)";
push @values, ('%' . $form->{addr_country} . '%') x 2;
}

030cf0d5 Bernd Bleßmann
if ($form->{addr_gln}) {
$where .= " AND ((lower(ct.gln) LIKE lower(?))
OR
(ct.id IN (
SELECT so.trans_id
FROM shipto so
WHERE (so.module = 'CT')
AND (lower(so.shiptogln) LIKE lower(?))
))
)";
push @values, ('%' . $form->{addr_gln} . '%') x 2;
}

93a4e424 Moritz Bunkus
if ( $form->{status} eq 'orphaned' ) {
$where .=
qq| AND ct.id NOT IN | .
qq| (SELECT o.${cv}_id FROM oe o, $cv cv WHERE cv.id = o.${cv}_id)|;
if ($cv eq 'customer') {
$where .=
qq| AND ct.id NOT IN | .
qq| (SELECT a.customer_id FROM ar a, customer cv | .
qq| WHERE cv.id = a.customer_id)|;
d319704a Moritz Bunkus
}
93a4e424 Moritz Bunkus
if ($cv eq 'vendor') {
$where .=
qq| AND ct.id NOT IN | .
qq| (SELECT a.vendor_id FROM ap a, vendor cv | .
qq| WHERE cv.id = a.vendor_id)|;
d319704a Moritz Bunkus
}
$form->{l_invnumber} = $form->{l_ordnumber} = $form->{l_quonumber} = "";
fc55beb4 Bernd Bleßmann
}
d319704a Moritz Bunkus
c7bffefd Moritz Bunkus
if ($form->{obsolete} eq "Y") {
0497b9cd Moritz Bunkus
$where .= qq| AND ct.obsolete|;
c7bffefd Moritz Bunkus
} elsif ($form->{obsolete} eq "N") {
0497b9cd Moritz Bunkus
$where .= qq| AND NOT ct.obsolete|;
c7bffefd Moritz Bunkus
}

0c472ce6 Moritz Bunkus
if ($form->{business_id}) {
0497b9cd Moritz Bunkus
$where .= qq| AND (ct.business_id = ?)|;
0c472ce6 Moritz Bunkus
push(@values, conv_i($form->{business_id}));
}

b1c40d4d Bernd Bleßmann
if ($form->{salesman_id}) {
$where .= qq| AND (ct.salesman_id = ?)|;
push(@values, conv_i($form->{salesman_id}));
}

8dc4cef2 Bernd Bleßmann
if($form->{insertdatefrom}) {
$where .= qq| AND (ct.itime::DATE >= ?)|;
push@values, conv_date($form->{insertdatefrom});
}

if($form->{insertdateto}) {
$where .= qq| AND (ct.itime::DATE <= ?)|;
push @values, conv_date($form->{insertdateto});
}

4f50aaa5 Jan Büren
# 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)) {
0497b9cd Moritz Bunkus
$where .= qq| AND ct.salesman_id = (select em.id from employee em where em.login = ?)|;
4bd1e2f8 Sven Schöling
push(@values, $::myconfig{login});
4f50aaa5 Jan Büren
}

8688e71e Moritz Bunkus
my ($cvar_where, @cvar_values) = CVar->build_filter_query('module' => 'CT',
'trans_id_field' => 'ct.id',
'filter' => $form);

if ($cvar_where) {
$where .= qq| AND ($cvar_where)|;
push @values, @cvar_values;
}
4f19857e Sven Schöling
if ($form->{addr_street}) {
0497b9cd Moritz Bunkus
$where .= qq| AND (ct.street ILIKE ?)|;
4f19857e Sven Schöling
push @values, '%' . $form->{addr_street} . '%';
}

if ($form->{addr_zipcode}) {
0497b9cd Moritz Bunkus
$where .= qq| AND (ct.zipcode ILIKE ?)|;
4f19857e Sven Schöling
push @values, $form->{addr_zipcode} . '%';
}

32e816b5 Bernd Bleßmann
my $pg_select = $form->{l_pricegroup} ? qq|, pg.pricegroup as pricegroup | : '';
my $pg_join = $form->{l_pricegroup} ? qq|LEFT JOIN pricegroup pg ON (ct.klass = pg.id) | : '';
93a4e424 Moritz Bunkus
my $query =
8dc4cef2 Bernd Bleßmann
qq|SELECT ct.*, ct.itime::DATE AS insertdate, b.description AS business, e.name as salesman, | .
a9325fe9 Bernd Bleßmann
qq| pt.description as payment | .
32e816b5 Bernd Bleßmann
$pg_select .
09306b9f Sven Schöling
(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) .
93a4e424 Moritz Bunkus
qq|FROM $cv ct | .
qq|LEFT JOIN business b ON (ct.business_id = b.id) | .
2def6461 Geoffrey Richardson
qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | .
a9325fe9 Bernd Bleßmann
qq|LEFT JOIN payment_terms pt ON (ct.payment_id = pt.id) | .
32e816b5 Bernd Bleßmann
$pg_join .
93a4e424 Moritz Bunkus
qq|WHERE $where|;
d319704a Moritz Bunkus
52c9a08d Philip Reetz
my @saved_values = @values;
d319704a Moritz Bunkus
# redo for invoices, orders and quotations
09306b9f Sven Schöling
if ($join_records) {
my $union = "UNION";
d319704a Moritz Bunkus
if ($form->{l_invnumber}) {
93a4e424 Moritz Bunkus
my $ar = $cv eq 'customer' ? 'ar' : 'ap';
my $module = $ar eq 'ar' ? 'is' : 'ir';
09306b9f Sven Schöling
push(@values, @saved_values);
$query .=
qq| UNION | .
8dc4cef2 Bernd Bleßmann
qq|SELECT ct.*, ct.itime::DATE AS insertdate, b.description AS business, e.name as salesman, | .
59ab5cb4 Bernd Bleßmann
qq| pt.description as payment | .
$pg_select .
qq|, a.invnumber, a.ordnumber, a.quonumber, a.id AS invid, | .
93a4e424 Moritz Bunkus
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) | .
2def6461 Geoffrey Richardson
qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | .
a9325fe9 Bernd Bleßmann
qq|LEFT JOIN payment_terms pt ON (ct.payment_id = pt.id) | .
59ab5cb4 Bernd Bleßmann
$pg_join .
93a4e424 Moritz Bunkus
qq|WHERE $where AND (a.invoice = '1')|;
d319704a Moritz Bunkus
}

93a4e424 Moritz Bunkus
if ( $form->{l_ordnumber} ) {
09306b9f Sven Schöling
push(@values, @saved_values);
93a4e424 Moritz Bunkus
$query .=
09306b9f Sven Schöling
qq| UNION | .
8dc4cef2 Bernd Bleßmann
qq|SELECT ct.*, ct.itime::DATE AS insertdate, b.description AS business, e.name as salesman, | .
59ab5cb4 Bernd Bleßmann
qq| pt.description as payment | .
$pg_select .
qq|, ' ' AS invnumber, o.ordnumber, o.quonumber, o.id AS invid, | .
93a4e424 Moritz Bunkus
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) | .
2def6461 Geoffrey Richardson
qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | .
a9325fe9 Bernd Bleßmann
qq|LEFT JOIN payment_terms pt ON (ct.payment_id = pt.id) | .
59ab5cb4 Bernd Bleßmann
$pg_join .
93a4e424 Moritz Bunkus
qq|WHERE $where AND (o.quotation = '0')|;
d319704a Moritz Bunkus
}

93a4e424 Moritz Bunkus
if ( $form->{l_quonumber} ) {
09306b9f Sven Schöling
push(@values, @saved_values);
93a4e424 Moritz Bunkus
$query .=
09306b9f Sven Schöling
qq| UNION | .
8dc4cef2 Bernd Bleßmann
qq|SELECT ct.*, ct.itime::DATE AS insertdate, b.description AS business, e.name as salesman, | .
59ab5cb4 Bernd Bleßmann
qq| pt.description as payment | .
$pg_select .
qq|, ' ' AS invnumber, o.ordnumber, o.quonumber, o.id AS invid, | .
93a4e424 Moritz Bunkus
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) | .
2def6461 Geoffrey Richardson
qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | .
a9325fe9 Bernd Bleßmann
qq|LEFT JOIN payment_terms pt ON (ct.payment_id = pt.id) | .
59ab5cb4 Bernd Bleßmann
$pg_join .
93a4e424 Moritz Bunkus
qq|WHERE $where AND (o.quotation = '1')|;
d319704a Moritz Bunkus
}
}

93a4e424 Moritz Bunkus
$query .= qq| ORDER BY $sortorder|;
c2796317 Bernd Bleßmann
93a4e424 Moritz Bunkus
$form->{CT} = selectall_hashref_query($form, $dbh, $query, @values);
d319704a Moritz Bunkus
$main::lxdebug->leave_sub();
}

54e4131e Moritz Bunkus
sub get_contact {
$main::lxdebug->enter_sub();

93a4e424 Moritz Bunkus
my ( $self, $myconfig, $form ) = @_;
5c1fb49c Sven Schöling
die 'Missing argument: cp_id' unless $::form->{cp_id};

54e4131e Moritz Bunkus
my $dbh = $form->dbconnect($myconfig);
93a4e424 Moritz Bunkus
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});
d744e4f2 Sven Schöling
my $ref = $sth->fetchrow_hashref("NAME_lc");
54e4131e Moritz Bunkus
map { $form->{$_} = $ref->{$_} } keys %$ref;

6c1536aa Sven Schöling
$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);

54e4131e Moritz Bunkus
$sth->finish;
$dbh->disconnect;

$main::lxdebug->leave_sub();
}

0ce1b04e Geoffrey Richardson
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});
9e159031 Sven Schöling
my $placeholders = join ", ", ('?') x scalar @ids;
0e36c22a Moritz Bunkus
my $c_mandate = $params{vc} eq 'customer' ? ', mandator_id, mandate_date_of_signature' : '';
my $query = qq|SELECT id, name, account_number, bank, bank_code, iban, bic ${c_mandate}
0ce1b04e Geoffrey Richardson
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;
}

4070dbf3 Sven Schöling
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',
);

604765d5 Moritz Bunkus
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);
4070dbf3 Sven Schöling
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;
}

cc78d935 Sven Schöling
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;
}

4070dbf3 Sven Schöling
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 };
}


d319704a Moritz Bunkus
1;