kivitendo/SL/CT.pm @ 4f152ed2
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",
|
||||
880122f8 | Bernd Bleßmann | "discount" => "ct.discount",
|
||
a9325fe9 | Bernd Bleßmann | "salesman" => "e.name",
|
||
"payment" => "pt.description"
|
||||
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 | |||
880122f8 | Bernd Bleßmann | if ($sortorder !~ /(business|id|discount)/ && !$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;
|
||||
}
|
||||
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}));
|
||
}
|
||||
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 = ?)|;
|
||
4f50aaa5 | Jan Büren | push(@values, $form->{login});
|
||
}
|
||||
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} . '%';
|
||
}
|
||||
93a4e424 | Moritz Bunkus | my $query =
|
||
a9325fe9 | Bernd Bleßmann | qq|SELECT ct.*, b.description AS business, e.name as salesman, |.
|
||
qq| pt.description as payment | .
|
||||
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) | .
|
||
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 | .
|
||||
a9325fe9 | Bernd Bleßmann | qq|SELECT ct.*, b.description AS business, e.name as salesman, |.
|
||
qq| pt.description as payment, | .
|
||||
93a4e424 | Moritz Bunkus | 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) | .
|
||||
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) | .
|
||
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 | .
|
||
a9325fe9 | Bernd Bleßmann | qq|SELECT ct.*, b.description AS business, e.name as salesman, |.
|
||
qq| pt.description as payment, | .
|
||||
93a4e424 | Moritz Bunkus | 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) | .
|
||||
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) | .
|
||
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 | .
|
||
2def6461 | Geoffrey Richardson | qq|SELECT ct.*, b.description AS business, e.name as salesman, | .
|
||
a9325fe9 | Bernd Bleßmann | qq| pt.description as payment, | .
|
||
93a4e424 | Moritz Bunkus | 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) | .
|
||||
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) | .
|
||
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;
|