X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FCommon.pm;h=4cd1d35ed5d3b2543b5c9c807af68a9b376edcbe;hb=41a039692bf1d655df629fd833fd6d6d428eb29b;hp=de1735ffed018cd49175014d5aa1132ba6faf6a3;hpb=54e4131e091831e00a861fe2c4f53e344b87ddca;p=kivitendo-erp.git diff --git a/SL/Common.pm b/SL/Common.pm index de1735ffe..4cd1d35ed 100644 --- a/SL/Common.pm +++ b/SL/Common.pm @@ -8,6 +8,39 @@ package Common; +use Time::HiRes qw(gettimeofday); + +use SL::DBUtils; + +use vars qw(@db_encodings %db_encoding_to_charset); + +@db_encodings = ( + { "label" => "ASCII", "dbencoding" => "SQL_ASCII", "charset" => "ASCII" }, + { "label" => "UTF-8 Unicode", "dbencoding" => "UNICODE", "charset" => "UTF-8" }, + { "label" => "ISO 8859-1", "dbencoding" => "LATIN1", "charset" => "ISO-8859-1" }, + { "label" => "ISO 8859-2", "dbencoding" => "LATIN2", "charset" => "ISO-8859-2" }, + { "label" => "ISO 8859-3", "dbencoding" => "LATIN3", "charset" => "ISO-8859-3" }, + { "label" => "ISO 8859-4", "dbencoding" => "LATIN4", "charset" => "ISO-8859-4" }, + { "label" => "ISO 8859-5", "dbencoding" => "LATIN5", "charset" => "ISO-8859-5" }, + { "label" => "ISO 8859-15", "dbencoding" => "LATIN9", "charset" => "ISO-8859-15" }, + { "label" => "KOI8-R", "dbencoding" => "KOI8", "charset" => "KOI8-R" }, + { "label" => "Windows CP1251", "dbencoding" => "WIN", "charset" => "CP1251" }, + { "label" => "Windows CP866", "dbencoding" => "ALT", "charset" => "CP866" }, +); + +%db_encoding_to_charset = map { $_->{dbencoding}, $_->{charset} } @db_encodings; + +use constant DEFAULT_CHARSET => 'ISO-8859-15'; + +sub unique_id { + my ($a, $b) = gettimeofday(); + return "${a}-${b}-${$}"; +} + +sub tmpname { + return "/tmp/lx-office-tmp-" . unique_id(); +} + sub retrieve_parts { $main::lxdebug->enter_sub(); @@ -17,11 +50,11 @@ sub retrieve_parts { my (@filter_values, $filter); if ($form->{"partnumber"}) { - $filter .= " AND (partnumber ILIKE ?)"; + $filter .= qq| AND (partnumber ILIKE ?)|; push(@filter_values, '%' . $form->{"partnumber"} . '%'); } if ($form->{"description"}) { - $filter .= " AND (description ILIKE ?)"; + $filter .= qq| AND (description ILIKE ?)|; push(@filter_values, '%' . $form->{"description"} . '%'); } substr($filter, 1, 3) = "WHERE" if ($filter); @@ -29,7 +62,10 @@ sub retrieve_parts { $order_by =~ s/[^a-zA-Z_]//g; $order_dir = $order_dir ? "ASC" : "DESC"; - my $query = "SELECT id, partnumber, description FROM parts $filter ORDER BY $order_by $order_dir"; + my $query = + qq|SELECT id, partnumber, description | . + qq|FROM parts $filter | . + qq|ORDER BY $order_by $order_dir|; my $sth = $dbh->prepare($query); $sth->execute(@filter_values) || $form->dberror($query . " (" . join(", ", @filter_values) . ")"); my $parts = []; @@ -53,11 +89,11 @@ sub retrieve_projects { my (@filter_values, $filter); if ($form->{"projectnumber"}) { - $filter .= " AND (projectnumber ILIKE ?)"; + $filter .= qq| AND (projectnumber ILIKE ?)|; push(@filter_values, '%' . $form->{"projectnumber"} . '%'); } if ($form->{"description"}) { - $filter .= " AND (description ILIKE ?)"; + $filter .= qq| AND (description ILIKE ?)|; push(@filter_values, '%' . $form->{"description"} . '%'); } substr($filter, 1, 3) = "WHERE" if ($filter); @@ -65,7 +101,10 @@ sub retrieve_projects { $order_by =~ s/[^a-zA-Z_]//g; $order_dir = $order_dir ? "ASC" : "DESC"; - my $query = "SELECT id, projectnumber, description FROM project $filter ORDER BY $order_by $order_dir"; + my $query = + qq|SELECT id, projectnumber, description | . + qq|FROM project $filter | . + qq|ORDER BY $order_by $order_dir|; my $sth = $dbh->prepare($query); $sth->execute(@filter_values) || $form->dberror($query . " (" . join(", ", @filter_values) . ")"); my $projects = []; @@ -89,7 +128,7 @@ sub retrieve_employees { my (@filter_values, $filter); if ($form->{"name"}) { - $filter .= " AND (name ILIKE ?)"; + $filter .= qq| AND (name ILIKE ?)|; push(@filter_values, '%' . $form->{"name"} . '%'); } substr($filter, 1, 3) = "WHERE" if ($filter); @@ -97,7 +136,10 @@ sub retrieve_employees { $order_by =~ s/[^a-zA-Z_]//g; $order_dir = $order_dir ? "ASC" : "DESC"; - my $query = "SELECT id, name FROM employee $filter ORDER BY $order_by $order_dir"; + my $query = + qq|SELECT id, name | . + qq|FROM employee $filter | . + qq|ORDER BY $order_by $order_dir|; my $sth = $dbh->prepare($query); $sth->execute(@filter_values) || $form->dberror($query . " (" . join(", ", @filter_values) . ")"); my $employees = []; @@ -121,17 +163,21 @@ sub retrieve_delivery_customer { my (@filter_values, $filter); if ($form->{"name"}) { - $filter .= " (name ILIKE '%$form->{name}%') AND"; + $filter .= qq| (name ILIKE ?) AND|; push(@filter_values, '%' . $form->{"name"} . '%'); } - #substr($filter, 1, 3) = "WHERE" if ($filter); $order_by =~ s/[^a-zA-Z_]//g; $order_dir = $order_dir ? "ASC" : "DESC"; - my $query = "SELECT id, name, customernumber, (street || ', ' || zipcode || city) as address FROM customer WHERE $filter business_id=(SELECT id from business WHERE description='Endkunde') ORDER BY $order_by $order_dir"; + my $query = + qq!SELECT id, name, customernumber, (street || ', ' || zipcode || city) AS address ! . + qq!FROM customer ! . + qq!WHERE $filter business_id = (SELECT id FROM business WHERE description = 'Endkunde') ! . + qq!ORDER BY $order_by $order_dir!; my $sth = $dbh->prepare($query); - $sth->execute() || $form->dberror($query . " (" . join(", ", @filter_values) . ")"); + $sth->execute(@filter_values) || + $form->dberror($query . " (" . join(", ", @filter_values) . ")"); my $delivery_customers = []; while (my $ref = $sth->fetchrow_hashref()) { push(@{$delivery_customers}, $ref); @@ -153,17 +199,20 @@ sub retrieve_vendor { my (@filter_values, $filter); if ($form->{"name"}) { - $filter .= " (name ILIKE '%$form->{name}%') AND"; + $filter .= qq| (name ILIKE ?) AND|; push(@filter_values, '%' . $form->{"name"} . '%'); } - #substr($filter, 1, 3) = "WHERE" if ($filter); $order_by =~ s/[^a-zA-Z_]//g; $order_dir = $order_dir ? "ASC" : "DESC"; - my $query = "SELECT id, name, customernumber, (street || ', ' || zipcode || city) as address FROM customer WHERE $filter business_id=(SELECT id from business WHERE description='Händler') ORDER BY $order_by $order_dir"; + my $query = + qq!SELECT id, name, customernumber, (street || ', ' || zipcode || city) AS address FROM customer ! . + qq!WHERE $filter business_id = (SELECT id FROM business WHERE description = 'Händler') ! . + qq!ORDER BY $order_by $order_dir!; my $sth = $dbh->prepare($query); - $sth->execute() || $form->dberror($query . " (" . join(", ", @filter_values) . ")"); + $sth->execute(@filter_values) || + $form->dberror($query . " (" . join(", ", @filter_values) . ")"); my $vendors = []; while (my $ref = $sth->fetchrow_hashref()) { push(@{$vendors}, $ref); @@ -176,4 +225,127 @@ sub retrieve_vendor { return $vendors; } +sub mkdir_with_parents { + $main::lxdebug->enter_sub(); + + my ($full_path) = @_; + + my $path = ""; + + $full_path =~ s|/+|/|; + + foreach my $part (split(m|/|, $full_path)) { + $path .= "/" if ($path); + $path .= $part; + + die("Could not create directory '$path' because a file exists with " . + "the same name.\n") if (-f $path); + + if (! -d $path) { + mkdir($path, 0770) || die("Could not create the directory '$path'. " . + "OS error: $!\n"); + } + } + + $main::lxdebug->leave_sub(); +} + +sub webdav_folder { + $main::lxdebug->enter_sub(); + + my ($form) = @_; + + return $main::lxdebug->leave_sub() + unless ($main::webdav && $form->{id}); + + my ($path, $number); + + $form->{WEBDAV} = {}; + + if ($form->{type} eq "sales_quotation") { + ($path, $number) = ("angebote", $form->{quonumber}); + } elsif ($form->{type} eq "sales_order") { + ($path, $number) = ("bestellungen", $form->{ordnumber}); + } elsif ($form->{type} eq "request_quotation") { + ($path, $number) = ("anfragen", $form->{quonumber}); + } elsif ($form->{type} eq "purchase_order") { + ($path, $number) = ("lieferantenbestellungen", $form->{ordnumber}); + } elsif ($form->{type} eq "credit_note") { + ($path, $number) = ("gutschriften", $form->{invnumber}); + } elsif ($form->{vc} eq "customer") { + ($path, $number) = ("rechnungen", $form->{invnumber}); + } else { + ($path, $number) = ("einkaufsrechnungen", $form->{invnumber}); + } + + return $main::lxdebug->leave_sub() unless ($path && $number); + + $path = "webdav/${path}/${number}"; + + if (!-d $path) { + mkdir_with_parents($path); + + } else { + my $base_path = substr($ENV{'SCRIPT_NAME'}, 1); + $base_path =~ s|[^/]+$||; + + foreach my $file (<$path/*>) { + my $fname = $file; + $fname =~ s|.*/||; + $form->{WEBDAV}{$fname} = + ($ENV{"HTTPS"} ? "https://" : "http://") . + $ENV{'SERVER_NAME'} . "/" . $base_path . $file; + } + } + + $main::lxdebug->leave_sub(); +} + +sub get_vc_details { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form, $vc, $vc_id) = @_; + + $vc = $vc eq "customer" ? "customer" : "vendor"; + + my $dbh = $form->dbconnect($myconfig); + + my $query; + + $query = + qq|SELECT + vc.*, + pt.description AS payment_terms, + b.description AS business, + l.description AS language + FROM ${vc} vc + LEFT JOIN payment_terms pt ON (vc.payment_id = pt.id) + LEFT JOIN business b ON (vc.business_id = b.id) + LEFT JOIN language l ON (vc.language_id = l.id) + WHERE vc.id = ?|; + my $ref = selectfirst_hashref_query($form, $dbh, $query, $vc_id); + + if (!$ref) { + $dbh->disconnect(); + $main::lxdebug->leave_sub(); + return 0; + } + + map { $form->{$_} = $ref->{$_} } keys %{ $ref }; + + map { $form->{$_} = $form->format_amount($myconfig, $form->{$_} * 1) } qw(discount creditlimit); + + $query = qq|SELECT * FROM shipto WHERE (trans_id = ?)|; + $form->{SHIPTO} = selectall_hashref_query($form, $dbh, $query, $vc_id); + + $query = qq|SELECT * FROM contacts WHERE (cp_cv_id = ?)|; + $form->{CONTACTS} = selectall_hashref_query($form, $dbh, $query, $vc_id); + + $dbh->disconnect(); + + $main::lxdebug->leave_sub(); + + return 1; +} + 1;