Projekt

Allgemein

Profil

Herunterladen (46,9 KB) Statistiken
| Zweig: | Markierung: | Revision:
d707f7ac 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) 1999-2003
#
# 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.
#======================================================================
#
# Delivery Order entry module
#======================================================================

package DO;

d520cde9 Geoffrey Richardson
use List::Util qw(max);
d707f7ac Moritz Bunkus
use YAML;

use SL::AM;
use SL::Common;
d12e02e0 Moritz Bunkus
use SL::CVar;
3b9c2119 Moritz Bunkus
use SL::DB::DeliveryOrder;
use SL::DB::Status;
d707f7ac Moritz Bunkus
use SL::DBUtils;
5f6d6d4e Moritz Bunkus
use SL::HTML::Restrict;
5df2b57a Moritz Bunkus
use SL::RecordLinks;
c35e1e2f Moritz Bunkus
use SL::IC;
a74b677c Moritz Bunkus
use SL::TransNumber;
d707f7ac Moritz Bunkus
80f6efd0 Sven Schöling
use strict;

d707f7ac Moritz Bunkus
sub transactions {
$main::lxdebug->enter_sub();

my ($self) = @_;

my $myconfig = \%main::myconfig;
my $form = $main::form;

# connect to database
my $dbh = $form->get_standard_dbh($myconfig);

my (@where, @values, $where);

my $vc = $form->{vc} eq "customer" ? "customer" : "vendor";

80f6efd0 Sven Schöling
my $query =
65e5f16a Peter Schulgin
qq|SELECT dord.id, dord.donumber, dord.ordnumber, dord.cusordnumber,
253a9323 Bernd Bleßmann
dord.transdate, dord.reqdate,
7d026c7c Niclas Zimmermann
ct.${vc}number, ct.name, dord.${vc}_id, dord.globalproject_id,
d707f7ac Moritz Bunkus
dord.closed, dord.delivered, dord.shippingpoint, dord.shipvia,
e8966d20 Bernd Bleßmann
dord.transaction_description, dord.itime::DATE AS insertdate,
d707f7ac Moritz Bunkus
pr.projectnumber AS globalprojectnumber,
ed14204d Moritz Bunkus
dep.description AS department,
d707f7ac Moritz Bunkus
e.name AS employee,
330cfa6d Moritz Bunkus
sm.name AS salesman
d707f7ac Moritz Bunkus
FROM delivery_orders dord
LEFT JOIN $vc ct ON (dord.${vc}_id = ct.id)
b98b8e3f Sven Schöling
LEFT JOIN contacts cp ON (dord.cp_id = cp.cp_id)
d707f7ac Moritz Bunkus
LEFT JOIN employee e ON (dord.employee_id = e.id)
LEFT JOIN employee sm ON (dord.salesman_id = sm.id)
ed14204d Moritz Bunkus
LEFT JOIN project pr ON (dord.globalproject_id = pr.id)
LEFT JOIN department dep ON (dord.department_id = dep.id)
|;
d707f7ac Moritz Bunkus
push @where, ($form->{type} eq 'sales_delivery_order' ? '' : 'NOT ') . qq|COALESCE(dord.is_sales, FALSE)|;

1a0c73d3 Jan Büren
if ($form->{department_id}) {
d707f7ac Moritz Bunkus
push @where, qq|dord.department_id = ?|;
1a0c73d3 Jan Büren
push @values, conv_i($form->{department_id});
d707f7ac Moritz Bunkus
}

if ($form->{project_id}) {
62ec5a10 Geoffrey Richardson
push @where,
d707f7ac Moritz Bunkus
qq|(dord.globalproject_id = ?) OR EXISTS
(SELECT * FROM delivery_order_items doi
62ec5a10 Geoffrey Richardson
WHERE (doi.project_id = ?) AND (doi.delivery_order_id = dord.id))|;
d707f7ac Moritz Bunkus
push @values, conv_i($form->{project_id}), conv_i($form->{project_id});
}

if ($form->{"${vc}_id"}) {
push @where, qq|dord.${vc}_id = ?|;
push @values, $form->{"${vc}_id"};

} elsif ($form->{$vc}) {
push @where, qq|ct.name ILIKE ?|;
push @values, '%' . $form->{$vc} . '%';
}

b98b8e3f Sven Schöling
if ($form->{"cp_name"}) {
push @where, "(cp.cp_name ILIKE ? OR cp.cp_givenname ILIKE ?)";
push @values, ('%' . $form->{"cp_name"} . '%')x2;
}

d707f7ac Moritz Bunkus
foreach my $item (qw(employee_id salesman_id)) {
next unless ($form->{$item});
push @where, "dord.$item = ?";
push @values, conv_i($form->{$item});
}
c9e93ded Jan Büren
if (!$main::auth->assert('sales_all_edit', 1)) {
push @where, qq|dord.employee_id = (select id from employee where login= ?)|;
4bd1e2f8 Sven Schöling
push @values, $::myconfig{login};
c9e93ded Jan Büren
}
d707f7ac Moritz Bunkus
foreach my $item (qw(donumber ordnumber cusordnumber transaction_description)) {
next unless ($form->{$item});
push @where, qq|dord.$item ILIKE ?|;
push @values, '%' . $form->{$item} . '%';
}

566d2e3d Sven Schöling
if (($form->{open} || $form->{closed}) &&
($form->{open} ne $form->{closed})) {
d707f7ac Moritz Bunkus
push @where, ($form->{open} ? "NOT " : "") . "COALESCE(dord.closed, FALSE)";
}

if (($form->{notdelivered} || $form->{delivered}) &&
($form->{notdelivered} ne $form->{delivered})) {
push @where, ($form->{delivered} ? "" : "NOT ") . "COALESCE(dord.delivered, FALSE)";
}

2e4e2ba9 Moritz Bunkus
if ($form->{serialnumber}) {
push @where, 'dord.id IN (SELECT doi.delivery_order_id FROM delivery_order_items doi WHERE doi.serialnumber LIKE ?)';
push @values, '%' . $form->{serialnumber} . '%';
}

d707f7ac Moritz Bunkus
if($form->{transdatefrom}) {
push @where, qq|dord.transdate >= ?|;
push @values, conv_date($form->{transdatefrom});
}

if($form->{transdateto}) {
push @where, qq|dord.transdate <= ?|;
push @values, conv_date($form->{transdateto});
}

30645d2c Bernd Bleßmann
if($form->{reqdatefrom}) {
push @where, qq|dord.reqdate >= ?|;
push @values, conv_date($form->{reqdatefrom});
}

if($form->{reqdateto}) {
push @where, qq|dord.reqdate <= ?|;
push @values, conv_date($form->{reqdateto});
}

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

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

d707f7ac Moritz Bunkus
if (@where) {
$query .= " WHERE " . join(" AND ", map { "($_)" } @where);
}

my %allowed_sort_columns = (
"transdate" => "dord.transdate",
253a9323 Bernd Bleßmann
"reqdate" => "dord.reqdate",
d707f7ac Moritz Bunkus
"id" => "dord.id",
"donumber" => "dord.donumber",
"ordnumber" => "dord.ordnumber",
"name" => "ct.name",
"employee" => "e.name",
"salesman" => "sm.name",
"shipvia" => "dord.shipvia",
ed14204d Moritz Bunkus
"transaction_description" => "dord.transaction_description",
"department" => "lower(dep.description)",
e8966d20 Bernd Bleßmann
"insertdate" => "dord.itime",
d707f7ac Moritz Bunkus
);

c654c46b Moritz Bunkus
my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC';
23c7245a Moritz Bunkus
my $sortorder = "dord.id";
d707f7ac Moritz Bunkus
if ($form->{sort} && grep($form->{sort}, keys(%allowed_sort_columns))) {
$sortorder = $allowed_sort_columns{$form->{sort}};
}

23c7245a Moritz Bunkus
$query .= qq| ORDER by | . $sortorder . " $sortdir";
d707f7ac Moritz Bunkus
$form->{DO} = selectall_hashref_query($form, $dbh, $query, @values);

330cfa6d Moritz Bunkus
if (scalar @{ $form->{DO} }) {
$query =
qq|SELECT id
FROM oe
WHERE NOT COALESCE(quotation, FALSE)
AND (ordnumber = ?)
AND (COALESCE(${vc}_id, 0) != 0)|;

my $sth = prepare_query($form, $dbh, $query);

foreach my $dord (@{ $form->{DO} }) {
480d9a56 Moritz Bunkus
next unless ($dord->{ordnumber});
330cfa6d Moritz Bunkus
do_statement($form, $sth, $query, $dord->{ordnumber});
($dord->{oe_id}) = $sth->fetchrow_array();
}

$sth->finish();
}
d707f7ac Moritz Bunkus
$main::lxdebug->leave_sub();
}

sub save {
$main::lxdebug->enter_sub();

my ($self) = @_;

my $myconfig = \%main::myconfig;
my $form = $main::form;

# connect to database, turn off autocommit
my $dbh = $form->get_standard_dbh($myconfig);
5f6d6d4e Moritz Bunkus
my $restricter = SL::HTML::Restrict->create;
d707f7ac Moritz Bunkus
my ($query, @values, $sth, $null);

my $all_units = AM->retrieve_units($myconfig, $form);
$form->{all_units} = $all_units;

d12e02e0 Moritz Bunkus
my $ic_cvar_configs = CVar->get_configs(module => 'IC',
dbh => $dbh);

a74b677c Moritz Bunkus
my $trans_number = SL::TransNumber->new(type => $form->{type}, dbh => $dbh, number => $form->{donumber}, id => $form->{id});
$form->{donumber} ||= $trans_number->create_unique;
d707f7ac Moritz Bunkus
$form->{employee_id} = (split /--/, $form->{employee})[1] if !$form->{employee_id};
$form->get_employee($dbh) unless ($form->{employee_id});

my $ml = ($form->{type} eq 'sales_delivery_order') ? 1 : -1;

286dc87c Jan Büren
my (@processed_doi, @processed_dois);
d707f7ac Moritz Bunkus
286dc87c Jan Büren
if ($form->{id}) {
d707f7ac Moritz Bunkus
286dc87c Jan Büren
# only delete shipto complete
d707f7ac Moritz Bunkus
$query = qq|DELETE FROM shipto WHERE trans_id = ? AND module = 'DO'|;
do_query($form, $dbh, $query, conv_i($form->{id}));

} else {

$query = qq|SELECT nextval('id')|;
($form->{id}) = selectrow_query($form, $dbh, $query);

ea14cfa5 Moritz Bunkus
$query = qq|INSERT INTO delivery_orders (id, donumber, employee_id, currency_id, taxzone_id) VALUES (?, '', ?, (SELECT currency_id FROM defaults LIMIT 1), ?)|;
do_query($form, $dbh, $query, $form->{id}, conv_i($form->{employee_id}), $form->{taxzone_id});
d707f7ac Moritz Bunkus
}

my $project_id;
cc8edd18 Niclas Zimmermann
my $items_reqdate;
d707f7ac Moritz Bunkus
$form->get_lists('price_factors' => 'ALL_PRICE_FACTORS');
my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} };
my $price_factor;

my %part_id_map = map { $_ => 1 } grep { $_ } map { $form->{"id_$_"} } (1 .. $form->{rowcount});
my @part_ids = keys %part_id_map;
my %part_unit_map;

if (@part_ids) {
$query = qq|SELECT id, unit FROM parts WHERE id IN (| . join(', ', map { '?' } @part_ids) . qq|)|;
%part_unit_map = selectall_as_map($form, $dbh, $query, 'id', 'unit', @part_ids);
}
286dc87c Jan Büren
my $q_item = <<SQL;
UPDATE delivery_order_items SET
340fd435 Bernd Bleßmann
delivery_order_id = ?, position = ?, parts_id = ?, description = ?, longdescription = ?, qty = ?, base_qty = ?,
286dc87c Jan Büren
sellprice = ?, discount = ?, unit = ?, reqdate = ?, project_id = ?, serialnumber = ?,
ordnumber = ?, transdate = ?, cusordnumber = ?,
lastcost = ? , price_factor_id = ?, price_factor = (SELECT factor FROM price_factors where id = ?),
marge_price_factor = ?, pricegroup_id = ?, active_price_source = ?, active_discount_source = ?
WHERE id = ?
SQL
d707f7ac Moritz Bunkus
my $h_item = prepare_query($form, $dbh, $q_item);

286dc87c Jan Büren
my $q_item_stock = <<SQL;
UPDATE delivery_order_items_stock SET
delivery_order_item_id = ?, qty = ?, unit = ?, warehouse_id = ?,
bin_id = ?, chargenumber = ?, bestbefore = ?
WHERE id = ?
SQL
d707f7ac Moritz Bunkus
my $h_item_stock = prepare_query($form, $dbh, $q_item_stock);

my $in_out = $form->{type} =~ /^sales/ ? 'out' : 'in';

for my $i (1 .. $form->{rowcount}) {
next if (!$form->{"id_$i"});

be42a450 Bernd Bleßmann
CVar->get_non_editable_ic_cvars(form => $form,
dbh => $dbh,
b8f55e88 Jan Büren
row => $i,
be42a450 Bernd Bleßmann
sub_module => 'delivery_order_items',
b8125c17 Bernd Bleßmann
may_converted_from => ['orderitems', 'delivery_order_items']);
be42a450 Bernd Bleßmann
340fd435 Bernd Bleßmann
my $position = $i;

286dc87c Jan Büren
if (!$form->{"delivery_order_items_id_$i"}) {
# there is no persistent id, therefore create one with all necessary constraints
my $q_item_id = qq|SELECT nextval('delivery_order_items_id')|;
my $h_item_id = prepare_query($form, $dbh, $q_item_id);
do_statement($form, $h_item_id, $q_item_id);
$form->{"delivery_order_items_id_$i"} = $h_item_id->fetchrow_array();
340fd435 Bernd Bleßmann
$query = qq|INSERT INTO delivery_order_items (id, delivery_order_id, position, parts_id) VALUES (?, ?, ?, ?)|;
286dc87c Jan Büren
do_query($form, $dbh, $query, conv_i($form->{"delivery_order_items_id_$i"}),
340fd435 Bernd Bleßmann
conv_i($form->{"id"}), conv_i($position), conv_i($form->{"id_$i"}));
286dc87c Jan Büren
$h_item_id->finish();
}
6b4a71ff Bernd Bleßmann
d707f7ac Moritz Bunkus
$form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"});

my $item_unit = $part_unit_map{$form->{"id_$i"}};

my $basefactor = 1;
if (defined($all_units->{$item_unit}->{factor}) && (($all_units->{$item_unit}->{factor} * 1) != 0)) {
$basefactor = $all_units->{$form->{"unit_$i"}}->{factor} / $all_units->{$item_unit}->{factor};
}
my $baseqty = $form->{"qty_$i"} * $basefactor;

# set values to 0 if nothing entered
2b88ba77 Jan Büren
$form->{"discount_$i"} = $form->parse_amount($myconfig, $form->{"discount_$i"});
d707f7ac Moritz Bunkus
$form->{"sellprice_$i"} = $form->parse_amount($myconfig, $form->{"sellprice_$i"});
da804bf2 Geoffrey Richardson
$form->{"lastcost_$i"} = $form->parse_amount($myconfig, $form->{"lastcost_$i"});
d707f7ac Moritz Bunkus
$price_factor = $price_factors{ $form->{"price_factor_id_$i"} } || 1;
80f6efd0 Sven Schöling
my $linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"} / $price_factor, 2);
d707f7ac Moritz Bunkus
cc8edd18 Niclas Zimmermann
$items_reqdate = ($form->{"reqdate_$i"}) ? $form->{"reqdate_$i"} : undef;
d707f7ac Moritz Bunkus

b632cee8 Moritz Bunkus
# Get pricegroup_id and save it. Unfortunately the interface
# also uses ID "0" for signalling that none is selected, but "0"
# must not be stored in the database. Therefore we cannot simply
# use conv_i().
my $pricegroup_id = $form->{"pricegroup_id_$i"} * 1;
$pricegroup_id = undef if !$pricegroup_id;

d707f7ac Moritz Bunkus
# save detail record in delivery_order_items table
340fd435 Bernd Bleßmann
@values = (conv_i($form->{id}), conv_i($position), conv_i($form->{"id_$i"}),
5f6d6d4e Moritz Bunkus
$form->{"description_$i"}, $restricter->process($form->{"longdescription_$i"}),
d707f7ac Moritz Bunkus
$form->{"qty_$i"}, $baseqty,
2b88ba77 Jan Büren
$form->{"sellprice_$i"}, $form->{"discount_$i"} / 100,
cc8edd18 Niclas Zimmermann
$form->{"unit_$i"}, conv_date($items_reqdate), conv_i($form->{"project_id_$i"}),
d707f7ac Moritz Bunkus
$form->{"serialnumber_$i"},
$form->{"ordnumber_$i"}, conv_date($form->{"transdate_$i"}),
$form->{"cusordnumber_$i"},
$form->{"lastcost_$i"},
conv_i($form->{"price_factor_id_$i"}), conv_i($form->{"price_factor_id_$i"}),
34f5531f Bernd Bleßmann
conv_i($form->{"marge_price_factor_$i"}),
eebe8e90 Sven Schöling
$pricegroup_id,
286dc87c Jan Büren
$form->{"active_price_source_$i"}, $form->{"active_discount_source_$i"},
conv_i($form->{"delivery_order_items_id_$i"}));
d707f7ac Moritz Bunkus
do_statement($form, $h_item, $q_item, @values);
286dc87c Jan Büren
push @processed_doi, $form->{"delivery_order_items_id_$i"}; # transaction safe?
d707f7ac Moritz Bunkus
my $stock_info = DO->unpack_stock_information('packed' => $form->{"stock_${in_out}_$i"});

foreach my $sinfo (@{ $stock_info }) {
286dc87c Jan Büren
# if we have stock_info, we have to check for persistents entries
if (!$sinfo->{"delivery_order_items_stock_id"}) {
my $q_item_stock_id = qq|SELECT nextval('id')|;
my $h_item_stock_id = prepare_query($form, $dbh, $q_item_stock_id);
do_statement($form, $h_item_stock_id, $q_item_stock_id);
$sinfo->{"delivery_order_items_stock_id"} = $h_item_stock_id->fetchrow_array();
$query = qq|INSERT INTO delivery_order_items_stock (id, delivery_order_item_id, qty, unit, warehouse_id, bin_id)
VALUES (?, ?, ?, ?, ?, ?)|;
do_query($form, $dbh, $query, conv_i($sinfo->{"delivery_order_items_stock_id"}),
conv_i($form->{"delivery_order_items_id_$i"}), $sinfo->{qty}, $sinfo->{unit}, conv_i($sinfo->{warehouse_id}),
conv_i($sinfo->{bin_id}));
$h_item_stock_id->finish();
6934a717 Jan Büren
# write back the id to the form (important if only transfer was clicked (id fk for invoice)
$form->{"stock_${in_out}_$i"} = YAML::Dump($stock_info);
286dc87c Jan Büren
}
@values = ($form->{"delivery_order_items_id_$i"}, $sinfo->{qty}, $sinfo->{unit}, conv_i($sinfo->{warehouse_id}),
conv_i($sinfo->{bin_id}), $sinfo->{chargenumber}, conv_date($sinfo->{bestbefore}),
conv_i($sinfo->{"delivery_order_items_stock_id"}));
d707f7ac Moritz Bunkus
do_statement($form, $h_item_stock, $q_item_stock, @values);
2b32359d Jan Büren
push @processed_dois, $sinfo->{"delivery_order_items_stock_id"};
d707f7ac Moritz Bunkus
}
d12e02e0 Moritz Bunkus
CVar->save_custom_variables(module => 'IC',
sub_module => 'delivery_order_items',
286dc87c Jan Büren
trans_id => $form->{"delivery_order_items_id_$i"},
d12e02e0 Moritz Bunkus
configs => $ic_cvar_configs,
variables => $form,
name_prefix => 'ic_',
name_postfix => "_$i",
dbh => $dbh);
b8125c17 Bernd Bleßmann
6934a717 Jan Büren
# link order items with doi, for future extension look at foreach IS.pm
b8125c17 Bernd Bleßmann
if (!$form->{saveasnew} && $form->{"converted_from_orderitems_id_$i"}) {
0b6157e2 Jan Büren
RecordLinks->create_links('dbh' => $dbh,
'mode' => 'ids',
'from_table' => 'orderitems',
f0ad2143 Jan Büren
'from_ids' => $form->{"converted_from_orderitems_id_$i"},
0b6157e2 Jan Büren
'to_table' => 'delivery_order_items',
'to_id' => $form->{"delivery_order_items_id_$i"},
);
}
b8125c17 Bernd Bleßmann
delete $form->{"converted_from_orderitems_id_$i"};
d707f7ac Moritz Bunkus
}

5f7cab51 Jan Büren
# 1. search for orphaned dois; processed_dois may be empty (no transfer) TODO: be supersafe and alter same statement for doi and oi
2b32359d Jan Büren
$query = sprintf 'SELECT id FROM delivery_order_items_stock WHERE delivery_order_item_id in
5f7cab51 Jan Büren
(select id from delivery_order_items where delivery_order_id = ?)';
$query .= sprintf ' AND NOT id IN (%s)', join ', ', ("?") x scalar @processed_dois if (scalar @processed_dois);
2b32359d Jan Büren
@values = (conv_i($form->{id}), map { conv_i($_) } @processed_dois);
my @orphaned_dois_ids = map { $_->{id} } selectall_hashref_query($form, $dbh, $query, @values);
if (scalar @orphaned_dois_ids) {
# clean up delivery_order_items_stock
$query = sprintf 'DELETE FROM delivery_order_items_stock WHERE id IN (%s)', join ', ', ("?") x scalar @orphaned_dois_ids;
do_query($form, $dbh, $query, @orphaned_dois_ids);
}
5f7cab51 Jan Büren
# 2. search for orphaned doi
$query = sprintf 'SELECT id FROM delivery_order_items WHERE delivery_order_id = ? AND NOT id IN (%s)', join ', ', ("?") x scalar @processed_doi;
@values = (conv_i($form->{id}), map { conv_i($_) } @processed_doi);
my @orphaned_ids = map { $_->{id} } selectall_hashref_query($form, $dbh, $query, @values);
if (scalar @orphaned_ids) {
# clean up delivery_order_items
$query = sprintf 'DELETE FROM delivery_order_items WHERE id IN (%s)', join ', ', ("?") x scalar @orphaned_ids;
do_query($form, $dbh, $query, @orphaned_ids);
}
d707f7ac Moritz Bunkus
$h_item->finish();
$h_item_stock->finish();


cc8edd18 Niclas Zimmermann
# reqdate is last items reqdate (?: old behaviour) if not already set
$form->{reqdate} ||= $items_reqdate;
d707f7ac Moritz Bunkus
# save DO record
$query =
qq|UPDATE delivery_orders SET
ce2e13e6 Moritz Bunkus
donumber = ?, ordnumber = ?, cusordnumber = ?, transdate = ?, vendor_id = ?,
d707f7ac Moritz Bunkus
customer_id = ?, reqdate = ?,
shippingpoint = ?, shipvia = ?, notes = ?, intnotes = ?, closed = ?,
delivered = ?, department_id = ?, language_id = ?, shipto_id = ?,
globalproject_id = ?, employee_id = ?, salesman_id = ?, cp_id = ?, transaction_description = ?,
03d3d025 Bernd Bleßmann
is_sales = ?, taxzone_id = ?, taxincluded = ?, terms = ?, currency_id = (SELECT id FROM currencies WHERE name = ?),
delivery_term_id = ?
d707f7ac Moritz Bunkus
WHERE id = ?|;

@values = ($form->{donumber}, $form->{ordnumber},
ce2e13e6 Moritz Bunkus
$form->{cusordnumber}, conv_date($form->{transdate}),
d707f7ac Moritz Bunkus
conv_i($form->{vendor_id}), conv_i($form->{customer_id}),
cc8edd18 Niclas Zimmermann
conv_date($form->{reqdate}), $form->{shippingpoint}, $form->{shipvia},
a34c05f3 Moritz Bunkus
$restricter->process($form->{notes}), $form->{intnotes},
d707f7ac Moritz Bunkus
$form->{closed} ? 't' : 'f', $form->{delivered} ? "t" : "f",
conv_i($form->{department_id}), conv_i($form->{language_id}), conv_i($form->{shipto_id}),
conv_i($form->{globalproject_id}), conv_i($form->{employee_id}),
conv_i($form->{salesman_id}), conv_i($form->{cp_id}),
$form->{transaction_description},
$form->{type} =~ /^sales/ ? 't' : 'f',
aa0fece0 Niclas Zimmermann
conv_i($form->{taxzone_id}), $form->{taxincluded} ? 't' : 'f', conv_i($form->{terms}), $form->{currency},
03d3d025 Bernd Bleßmann
conv_i($form->{delivery_term_id}),
d707f7ac Moritz Bunkus
conv_i($form->{id}));
do_query($form, $dbh, $query, @values);

$form->{name} = $form->{ $form->{vc} };
$form->{name} =~ s/--$form->{"$form->{vc}_id"}//;

b6213d35 Moritz Bunkus
# add shipto
d707f7ac Moritz Bunkus
if (!$form->{shipto_id}) {
$form->add_shipto($dbh, $form->{id}, "DO");
}

# save printed, emailed, queued
$form->save_status($dbh);

5df2b57a Moritz Bunkus
# Link this delivery order to the quotations it was created from.
00738f6f Moritz Bunkus
RecordLinks->create_links('dbh' => $dbh,
94e11003 Moritz Bunkus
'mode' => 'ids',
00738f6f Moritz Bunkus
'from_table' => 'oe',
'from_ids' => $form->{convert_from_oe_ids},
'to_table' => 'delivery_orders',
'to_id' => $form->{id},
);
delete $form->{convert_from_oe_ids};
5df2b57a Moritz Bunkus
$self->mark_orders_if_delivered('do_id' => $form->{id},
'type' => $form->{type} eq 'sales_delivery_order' ? 'sales' : 'purchase',
'dbh' => $dbh,);
e73b17d6 Moritz Bunkus
d707f7ac Moritz Bunkus
my $rc = $dbh->commit();

$form->{saved_donumber} = $form->{donumber};
65e5f16a Peter Schulgin
$form->{saved_ordnumber} = $form->{ordnumber};
$form->{saved_cusordnumber} = $form->{cusordnumber};
2f6a11fb Bernd Bleßmann
be6f6cfd Moritz Bunkus
Common::webdav_folder($form);
d707f7ac Moritz Bunkus
$main::lxdebug->leave_sub();

return $rc;
}

5df2b57a Moritz Bunkus
sub mark_orders_if_delivered {
d707f7ac Moritz Bunkus
$main::lxdebug->enter_sub();

e73b17d6 Moritz Bunkus
my $self = shift;
my %params = @_;
d707f7ac Moritz Bunkus
e73b17d6 Moritz Bunkus
Common::check_params(\%params, qw(do_id type));
d707f7ac Moritz Bunkus
5df2b57a Moritz Bunkus
my $myconfig = \%main::myconfig;
my $form = $main::form;
e73b17d6 Moritz Bunkus
5df2b57a Moritz Bunkus
my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);
e73b17d6 Moritz Bunkus
5df2b57a Moritz Bunkus
my @links = RecordLinks->get_links('dbh' => $dbh,
'from_table' => 'oe',
'to_table' => 'delivery_orders',
'to_id' => $params{do_id});
e73b17d6 Moritz Bunkus
74fca575 Sven Schöling
my $oe_id = @links ? $links[0]->{from_id} : undef;
e73b17d6 Moritz Bunkus
return $main::lxdebug->leave_sub() if (!$oe_id);

my $all_units = AM->retrieve_all_units();

b90f03e4 Moritz Bunkus
my $query = qq|SELECT oi.parts_id, oi.qty, oi.unit, p.unit AS partunit
e73b17d6 Moritz Bunkus
FROM orderitems oi
LEFT JOIN parts p ON (oi.parts_id = p.id)
WHERE (oi.trans_id = ?)|;
my $sth = prepare_execute_query($form, $dbh, $query, $oe_id);

5df2b57a Moritz Bunkus
my %shipped = $self->get_shipped_qty('type' => $params{type},
'oe_id' => $oe_id,);
my %ordered = ();

e73b17d6 Moritz Bunkus
while (my $ref = $sth->fetchrow_hashref()) {
$ref->{baseqty} = $ref->{qty} * $all_units->{$ref->{unit}}->{factor} / $all_units->{$ref->{partunit}}->{factor};

if ($ordered{$ref->{parts_id}}) {
$ordered{$ref->{parts_id}}->{baseqty} += $ref->{baseqty};
} else {
$ordered{$ref->{parts_id}} = $ref;
}
}

$sth->finish();

map { $_->{baseqty} = $_->{qty} * $all_units->{$_->{unit}}->{factor} / $all_units->{$_->{partunit}}->{factor} } values %shipped;

my $delivered = 1;
foreach my $part (values %ordered) {
if (!$shipped{$part->{parts_id}} || ($shipped{$part->{parts_id}}->{baseqty} < $part->{baseqty})) {
$delivered = 0;
last;
}
}

if ($delivered) {
$query = qq|UPDATE oe
5df2b57a Moritz Bunkus
SET delivered = TRUE
e73b17d6 Moritz Bunkus
WHERE id = ?|;
do_query($form, $dbh, $query, $oe_id);
$dbh->commit() if (!$params{dbh});
}
d707f7ac Moritz Bunkus
$main::lxdebug->leave_sub();
}

3c1ceacd Moritz Bunkus
sub close_orders {
$main::lxdebug->enter_sub();

my $self = shift;
my %params = @_;

Common::check_params(\%params, qw(ids));

if (('ARRAY' ne ref $params{ids}) || !scalar @{ $params{ids} }) {
$main::lxdebug->leave_sub();
return;
}

my $myconfig = \%main::myconfig;
my $form = $main::form;

my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);

my $query = qq|UPDATE delivery_orders SET closed = TRUE WHERE id IN (| . join(', ', ('?') x scalar(@{ $params{ids} })) . qq|)|;

do_query($form, $dbh, $query, map { conv_i($_) } @{ $params{ids} });

$dbh->commit() unless ($params{dbh});

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

d707f7ac Moritz Bunkus
sub delete {
$main::lxdebug->enter_sub();

my ($self) = @_;

my $myconfig = \%main::myconfig;
my $form = $main::form;
8cd05ad6 Moritz Bunkus
my $spool = $::lx_office_conf{paths}->{spool};
d707f7ac Moritz Bunkus
3b9c2119 Moritz Bunkus
my $rc = SL::DB::Order->new->db->with_transaction(sub {
my @spoolfiles = grep { $_ } map { $_->spoolfile } @{ SL::DB::Manager::Status->get_all(where => [ trans_id => $form->{id} ]) };
d707f7ac Moritz Bunkus
3b9c2119 Moritz Bunkus
SL::DB::DeliveryOrder->new(id => $form->{id})->delete;
d707f7ac Moritz Bunkus
3b9c2119 Moritz Bunkus
my $spool = $::lx_office_conf{paths}->{spool};
unlink map { "$spool/$_" } @spoolfiles if $spool;
d707f7ac Moritz Bunkus
3b9c2119 Moritz Bunkus
1;
});
d707f7ac Moritz Bunkus
$main::lxdebug->leave_sub();

return $rc;
}

sub retrieve {
$main::lxdebug->enter_sub();

454df69e Moritz Bunkus
my $self = shift;
my %params = @_;
d707f7ac Moritz Bunkus
my $myconfig = \%main::myconfig;
my $form = $main::form;

# connect to database
my $dbh = $form->get_standard_dbh($myconfig);

my ($query, $query_add, @values, $sth, $ref);

d12e02e0 Moritz Bunkus
my $ic_cvar_configs = CVar->get_configs(module => 'IC',
dbh => $dbh);

454df69e Moritz Bunkus
my $vc = $params{vc} eq 'customer' ? 'customer' : 'vendor';

my $mode = !$params{ids} ? 'default' : ref $params{ids} eq 'ARRAY' ? 'multi' : 'single';

if ($mode eq 'default') {
cc8edd18 Niclas Zimmermann
$ref = selectfirst_hashref_query($form, $dbh, qq|SELECT current_date AS transdate|);
d707f7ac Moritz Bunkus
map { $form->{$_} = $ref->{$_} } keys %$ref;
454df69e Moritz Bunkus
cc8edd18 Niclas Zimmermann
# if reqdate is not set from oe-workflow, set it to transdate (which is current date)
$form->{reqdate} ||= $form->{transdate};

454df69e Moritz Bunkus
# get last name used
$form->lastname_used($dbh, $myconfig, $vc) unless $form->{"${vc}_id"};

$main::lxdebug->leave_sub();

return 1;
d707f7ac Moritz Bunkus
}

454df69e Moritz Bunkus
my @do_ids = map { conv_i($_) } ($mode eq 'multi' ? @{ $params{ids} } : ($params{ids}));
my $do_ids_placeholders = join(', ', ('?') x scalar(@do_ids));
d707f7ac Moritz Bunkus
454df69e Moritz Bunkus
# retrieve order for single id
# NOTE: this query is intended to fetch all information only ONCE.
# so if any of these infos is important (or even different) for any item,
# it will be killed out and then has to be fetched from the item scope query further down
$query =
qq|SELECT dord.cp_id, dord.donumber, dord.ordnumber, dord.transdate, dord.reqdate,
dord.shippingpoint, dord.shipvia, dord.notes, dord.intnotes,
e.name AS employee, dord.employee_id, dord.salesman_id,
dord.${vc}_id, cv.name AS ${vc},
dord.closed, dord.reqdate, dord.department_id, dord.cusordnumber,
d.description AS department, dord.language_id,
dord.shipto_id,
a6161998 Moritz Bunkus
dord.globalproject_id, dord.delivered, dord.transaction_description,
03d3d025 Bernd Bleßmann
dord.taxzone_id, dord.taxincluded, dord.terms, (SELECT cu.name FROM currencies cu WHERE cu.id=dord.currency_id) AS currency,
e8966d20 Bernd Bleßmann
dord.delivery_term_id, dord.itime::DATE AS insertdate
454df69e Moritz Bunkus
FROM delivery_orders dord
JOIN ${vc} cv ON (dord.${vc}_id = cv.id)
LEFT JOIN employee e ON (dord.employee_id = e.id)
LEFT JOIN department d ON (dord.department_id = d.id)
WHERE dord.id IN ($do_ids_placeholders)|;
$sth = prepare_execute_query($form, $dbh, $query, @do_ids);
d707f7ac Moritz Bunkus
454df69e Moritz Bunkus
delete $form->{"${vc}_id"};
65e5f16a Peter Schulgin
my $pos = 0;
$form->{ordnumber_array} = ' ';
$form->{cusordnumber_array} = ' ';
80f6efd0 Sven Schöling
while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
454df69e Moritz Bunkus
if ($form->{"${vc}_id"} && ($ref->{"${vc}_id"} != $form->{"${vc}_id"})) {
$sth->finish();
$main::lxdebug->leave_sub();

return 0;
}
d707f7ac Moritz Bunkus
map { $form->{$_} = $ref->{$_} } keys %$ref if ($ref);
015f7118 Geoffrey Richardson
$form->{donumber_array} .= $form->{donumber} . ' ';
65e5f16a Peter Schulgin
$pos = index($form->{ordnumber_array},' ' . $form->{ordnumber} . ' ');
if ($pos == -1) {
$form->{ordnumber_array} .= $form->{ordnumber} . ' ';
}
$pos = index($form->{cusordnumber_array},' ' . $form->{cusordnumber} . ' ');
if ($pos == -1) {
$form->{cusordnumber_array} .= $form->{cusordnumber} . ' ';
}
454df69e Moritz Bunkus
}
$sth->finish();
d707f7ac Moritz Bunkus
5052b6f9 Bernd Bleßmann
$form->{donumber_array} =~ s/\s*$//g;
65e5f16a Peter Schulgin
$form->{ordnumber_array} =~ s/ //;
$form->{ordnumber_array} =~ s/\s*$//g;
$form->{cusordnumber_array} =~ s/ //;
$form->{cusordnumber_array} =~ s/\s*$//g;
5052b6f9 Bernd Bleßmann
454df69e Moritz Bunkus
$form->{saved_donumber} = $form->{donumber};
65e5f16a Peter Schulgin
$form->{saved_ordnumber} = $form->{ordnumber};
$form->{saved_cusordnumber} = $form->{cusordnumber};
d707f7ac Moritz Bunkus
454df69e Moritz Bunkus
# if not given, fill transdate with current_date
$form->{transdate} = $form->current_date($myconfig) unless $form->{transdate};
d707f7ac Moritz Bunkus
454df69e Moritz Bunkus
if ($mode eq 'single') {
d707f7ac Moritz Bunkus
$query = qq|SELECT s.* FROM shipto s WHERE s.trans_id = ? AND s.module = 'DO'|;
454df69e Moritz Bunkus
$sth = prepare_execute_query($form, $dbh, $query, $form->{id});
d707f7ac Moritz Bunkus
80f6efd0 Sven Schöling
$ref = $sth->fetchrow_hashref("NAME_lc");
454df69e Moritz Bunkus
delete $ref->{id};
d707f7ac Moritz Bunkus
map { $form->{$_} = $ref->{$_} } keys %$ref;
454df69e Moritz Bunkus
$sth->finish();
d707f7ac Moritz Bunkus
# get printed, emailed and queued
$query = qq|SELECT s.printed, s.emailed, s.spoolfile, s.formname FROM status s WHERE s.trans_id = ?|;
454df69e Moritz Bunkus
$sth = prepare_execute_query($form, $dbh, $query, conv_i($form->{id}));
d707f7ac Moritz Bunkus
80f6efd0 Sven Schöling
while ($ref = $sth->fetchrow_hashref("NAME_lc")) {
d707f7ac Moritz Bunkus
$form->{printed} .= "$ref->{formname} " if $ref->{printed};
$form->{emailed} .= "$ref->{formname} " if $ref->{emailed};
$form->{queued} .= "$ref->{formname} $ref->{spoolfile} " if $ref->{spoolfile};
}
454df69e Moritz Bunkus
$sth->finish();
d707f7ac Moritz Bunkus
map { $form->{$_} =~ s/ +$//g } qw(printed emailed queued);

454df69e Moritz Bunkus
} else {
delete $form->{id};
}
d707f7ac Moritz Bunkus
454df69e Moritz Bunkus
# retrieve individual items
# this query looks up all information about the items
# stuff different from the whole will not be overwritten, but saved with a suffix.
$query =
qq|SELECT doi.id AS delivery_order_items_id,
64515aa9 Bernd Bleßmann
p.partnumber, p.assembly, p.listprice, doi.description, doi.qty,
82c4717d Jan Büren
doi.sellprice, doi.parts_id AS id, doi.unit, doi.discount, p.notes AS partnotes,
454df69e Moritz Bunkus
doi.reqdate, doi.project_id, doi.serialnumber, doi.lastcost,
doi.ordnumber, doi.transdate, doi.cusordnumber, doi.longdescription,
34f5531f Bernd Bleßmann
doi.price_factor_id, doi.price_factor, doi.marge_price_factor, doi.pricegroup_id,
89b26688 Sven Schöling
doi.active_price_source, doi.active_discount_source,
bb7e2e85 Moritz Bunkus
pr.projectnumber, dord.transdate AS dord_transdate, dord.donumber,
454df69e Moritz Bunkus
pg.partsgroup
FROM delivery_order_items doi
JOIN parts p ON (doi.parts_id = p.id)
JOIN delivery_orders dord ON (doi.delivery_order_id = dord.id)
LEFT JOIN project pr ON (doi.project_id = pr.id)
LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id)
WHERE doi.delivery_order_id IN ($do_ids_placeholders)
340fd435 Bernd Bleßmann
ORDER BY doi.delivery_order_id, doi.position|;
454df69e Moritz Bunkus
$form->{form_details} = selectall_hashref_query($form, $dbh, $query, @do_ids);

d12e02e0 Moritz Bunkus
# Retrieve custom variables.
foreach my $doi (@{ $form->{form_details} }) {
my $cvars = CVar->get_custom_variables(dbh => $dbh,
module => 'IC',
sub_module => 'delivery_order_items',
trans_id => $doi->{delivery_order_items_id},
);
map { $doi->{"ic_cvar_$_->{name}"} = $_->{value} } @{ $cvars };
}

454df69e Moritz Bunkus
if ($mode eq 'single') {
d707f7ac Moritz Bunkus
my $in_out = $form->{type} =~ /^sales/ ? 'out' : 'in';

$query =
286dc87c Jan Büren
qq|SELECT id as delivery_order_items_stock_id, qty, unit, bin_id,
warehouse_id, chargenumber, bestbefore
454df69e Moritz Bunkus
FROM delivery_order_items_stock
WHERE delivery_order_item_id = ?|;
d707f7ac Moritz Bunkus
my $sth = prepare_query($form, $dbh, $query);

foreach my $doi (@{ $form->{form_details} }) {
do_statement($form, $sth, $query, conv_i($doi->{delivery_order_items_id}));
my $requests = [];
while (my $ref = $sth->fetchrow_hashref()) {
push @{ $requests }, $ref;
}

$doi->{"stock_${in_out}"} = YAML::Dump($requests);
}

$sth->finish();
}

be6f6cfd Moritz Bunkus
Common::webdav_folder($form);
d707f7ac Moritz Bunkus
$main::lxdebug->leave_sub();
454df69e Moritz Bunkus
return 1;
d707f7ac Moritz Bunkus
}

sub order_details {
$main::lxdebug->enter_sub();

c5651754 Bernd Bleßmann
my ($self, $myconfig, $form) = @_;
d707f7ac Moritz Bunkus
# connect to database
my $dbh = $form->get_standard_dbh($myconfig);
my $query;
my @values = ();
my $sth;
my $item;
my $i;
my @partsgroup = ();
my $partsgroup;
my $position = 0;
56a48a84 Sven Schöling
my $subtotal_header = 0;
my $subposition = 0;
75957fe8 Bernd Bleßmann
my $si_position = 0;
d707f7ac Moritz Bunkus
fde1df0b Sven Schöling
my (@project_ids);
d707f7ac Moritz Bunkus
push(@project_ids, $form->{"globalproject_id"}) if ($form->{"globalproject_id"});

# sort items by partsgroup
for $i (1 .. $form->{rowcount}) {
$partsgroup = "";
if ($form->{"partsgroup_$i"} && $form->{groupitems}) {
$partsgroup = $form->{"partsgroup_$i"};
}
push @partsgroup, [$i, $partsgroup];
push(@project_ids, $form->{"project_id_$i"}) if ($form->{"project_id_$i"});
}

fde1df0b Sven Schöling
my $projects = [];
my %projects_by_id;
d707f7ac Moritz Bunkus
if (@project_ids) {
fde1df0b Sven Schöling
$projects = SL::DB::Manager::Project->get_all(query => [ id => \@project_ids ]);
%projects_by_id = map { $_->id => $_ } @$projects;
d707f7ac Moritz Bunkus
}

fde1df0b Sven Schöling
if ($projects_by_id{$form->{"globalproject_id"}}) {
896ef9aa Sven Schöling
$form->{globalprojectnumber} = $projects_by_id{$form->{"globalproject_id"}}->projectnumber;
$form->{globalprojectdescription} = $projects_by_id{$form->{"globalproject_id"}}->description;

fde1df0b Sven Schöling
for (@{ $projects_by_id{$form->{"globalproject_id"}}->cvars_by_config }) {
$form->{"project_cvar_" . $_->config->name} = $_->value_as_text;
}
}
d707f7ac Moritz Bunkus
my $q_pg = qq|SELECT p.partnumber, p.description, p.unit, a.qty, pg.partsgroup
FROM assembly a
JOIN parts p ON (a.parts_id = p.id)
LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id)
WHERE a.bom = '1'
80f6efd0 Sven Schöling
AND a.id = ?|;
d707f7ac Moritz Bunkus
my $h_pg = prepare_query($form, $dbh, $q_pg);

my $q_bin_wh = qq|SELECT (SELECT description FROM bin WHERE id = ?) AS bin,
(SELECT description FROM warehouse WHERE id = ?) AS warehouse|;
my $h_bin_wh = prepare_query($form, $dbh, $q_bin_wh);

my $in_out = $form->{type} =~ /^sales/ ? 'out' : 'in';

my $num_si = 0;

d12e02e0 Moritz Bunkus
my $ic_cvar_configs = CVar->get_configs(module => 'IC');
fde1df0b Sven Schöling
my $project_cvar_configs = CVar->get_configs(module => 'Projects');
d12e02e0 Moritz Bunkus
c35e1e2f Moritz Bunkus
$form->{TEMPLATE_ARRAYS} = { };
c5651754 Bernd Bleßmann
IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form);
c35e1e2f Moritz Bunkus
d707f7ac Moritz Bunkus
my @arrays =
qw(runningnumber number description longdescription qty unit
c6867c46 Bernd Bleßmann
partnotes serialnumber reqdate projectnumber projectdescription
75957fe8 Bernd Bleßmann
weight lineweight
d707f7ac Moritz Bunkus
si_runningnumber si_number si_description
75957fe8 Bernd Bleßmann
si_warehouse si_bin si_chargenumber si_bestbefore
si_qty si_qty_nofmt si_unit);
d707f7ac Moritz Bunkus
80f6efd0 Sven Schöling
map { $form->{TEMPLATE_ARRAYS}->{$_} = [] } (@arrays);
c35e1e2f Moritz Bunkus
d12e02e0 Moritz Bunkus
push @arrays, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs };
fde1df0b Sven Schöling
push @arrays, map { "project_cvar_$_->{name}" } @{ $project_cvar_configs };
d12e02e0 Moritz Bunkus
80f6efd0 Sven Schöling
$form->get_lists('price_factors' => 'ALL_PRICE_FACTORS');
my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} };

79c048aa Niclas Zimmermann
my $totalweight = 0;
d707f7ac Moritz Bunkus
my $sameitem = "";
foreach $item (sort { $a->[1] cmp $b->[1] } @partsgroup) {
$i = $item->[0];

next if (!$form->{"id_$i"});

if ($item->[1] ne $sameitem) {
2247150c Bernd Bleßmann
push(@{ $form->{TEMPLATE_ARRAYS}->{description} }, qq|$item->[1]|);
d707f7ac Moritz Bunkus
$sameitem = $item->[1];

2247150c Bernd Bleßmann
map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" && $_ !~ /^si_/} @arrays));
map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, []) } grep({ $_ =~ /^si_/} @arrays));
$si_position++;
d707f7ac Moritz Bunkus
}

$form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"});

# add number, description and qty to $form->{number}, ....
56a48a84 Sven Schöling
if ($form->{"subtotal_$i"} && !$subtotal_header) {
$subtotal_header = $i;
$position = int($position);
$subposition = 0;
$position++;
} elsif ($subtotal_header) {
$subposition += 1;
$position = int($position);
$position = $position.".".$subposition;
} else {
$position = int($position);
$position++;
}
d707f7ac Moritz Bunkus
75957fe8 Bernd Bleßmann
$si_position++;

d707f7ac Moritz Bunkus
my $price_factor = $price_factors{$form->{"price_factor_id_$i"}} || { 'factor' => 1 };
fde1df0b Sven Schöling
my $project = $projects_by_id{$form->{"project_id_$i"}} || SL::DB::Project->new;
d707f7ac Moritz Bunkus
02475b7f Sven Schöling
push @{ $form->{TEMPLATE_ARRAYS}{runningnumber} }, $position;
push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"};
push @{ $form->{TEMPLATE_ARRAYS}{description} }, $form->{"description_$i"};
push @{ $form->{TEMPLATE_ARRAYS}{longdescription} }, $form->{"longdescription_$i"};
push @{ $form->{TEMPLATE_ARRAYS}{qty} }, $form->format_amount($myconfig, $form->{"qty_$i"});
8461199d Moritz Bunkus
push @{ $form->{TEMPLATE_ARRAYS}{qty_nofmt} }, $form->{"qty_$i"};
02475b7f Sven Schöling
push @{ $form->{TEMPLATE_ARRAYS}{unit} }, $form->{"unit_$i"};
push @{ $form->{TEMPLATE_ARRAYS}{partnotes} }, $form->{"partnotes_$i"};
push @{ $form->{TEMPLATE_ARRAYS}{serialnumber} }, $form->{"serialnumber_$i"};
push @{ $form->{TEMPLATE_ARRAYS}{reqdate} }, $form->{"reqdate_$i"};
fde1df0b Sven Schöling
push @{ $form->{TEMPLATE_ARRAYS}{projectnumber} }, $project->projectnumber;
push @{ $form->{TEMPLATE_ARRAYS}{projectdescription} }, $project->description;
d707f7ac Moritz Bunkus
56a48a84 Sven Schöling
if ($form->{"subtotal_$i"} && $subtotal_header && ($subtotal_header != $i)) {
$subtotal_header = 0;
}

79c048aa Niclas Zimmermann
my $lineweight = $form->{"qty_$i"} * $form->{"weight_$i"};
$totalweight += $lineweight;
push @{ $form->{TEMPLATE_ARRAYS}->{weight} }, $form->format_amount($myconfig, $form->{"weight_$i"}, 3);
push @{ $form->{TEMPLATE_ARRAYS}->{weight_nofmt} }, $form->{"weight_$i"};
push @{ $form->{TEMPLATE_ARRAYS}->{lineweight} }, $form->format_amount($myconfig, $lineweight, 3);
push @{ $form->{TEMPLATE_ARRAYS}->{lineweight_nofmt} }, $lineweight;

75957fe8 Bernd Bleßmann
my $stock_info = DO->unpack_stock_information('packed' => $form->{"stock_${in_out}_$i"});

foreach my $si (@{ $stock_info }) {
$num_si++;

do_statement($form, $h_bin_wh, $q_bin_wh, conv_i($si->{bin_id}), conv_i($si->{warehouse_id}));
my $bin_wh = $h_bin_wh->fetchrow_hashref();

push @{ $form->{TEMPLATE_ARRAYS}{si_runningnumber}[$si_position-1] }, $num_si;
push @{ $form->{TEMPLATE_ARRAYS}{si_number}[$si_position-1] }, $form->{"partnumber_$i"};
push @{ $form->{TEMPLATE_ARRAYS}{si_description}[$si_position-1] }, $form->{"description_$i"};
push @{ $form->{TEMPLATE_ARRAYS}{si_warehouse}[$si_position-1] }, $bin_wh->{warehouse};
push @{ $form->{TEMPLATE_ARRAYS}{si_bin}[$si_position-1] }, $bin_wh->{bin};
push @{ $form->{TEMPLATE_ARRAYS}{si_chargenumber}[$si_position-1] }, $si->{chargenumber};
push @{ $form->{TEMPLATE_ARRAYS}{si_bestbefore}[$si_position-1] }, $si->{bestbefore};
push @{ $form->{TEMPLATE_ARRAYS}{si_qty}[$si_position-1] }, $form->format_amount($myconfig, $si->{qty} * 1);
push @{ $form->{TEMPLATE_ARRAYS}{si_qty_nofmt}[$si_position-1] }, $si->{qty} * 1;
push @{ $form->{TEMPLATE_ARRAYS}{si_unit}[$si_position-1] }, $si->{unit};
}

d707f7ac Moritz Bunkus
if ($form->{"assembly_$i"}) {
$sameitem = "";

# get parts and push them onto the stack
my $sortorder = "";
if ($form->{groupitems}) {
$sortorder =
90bb521a Moritz Bunkus
qq|ORDER BY pg.partsgroup, a.oid|;
d707f7ac Moritz Bunkus
} else {
90bb521a Moritz Bunkus
$sortorder = qq|ORDER BY a.oid|;
d707f7ac Moritz Bunkus
}

do_statement($form, $h_pg, $q_pg, conv_i($form->{"id_$i"}));

80f6efd0 Sven Schöling
while (my $ref = $h_pg->fetchrow_hashref("NAME_lc")) {
d707f7ac Moritz Bunkus
if ($form->{groupitems} && $ref->{partsgroup} ne $sameitem) {
75957fe8 Bernd Bleßmann
map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" && $_ !~ /^si_/} @arrays));
map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, []) } grep({ $_ =~ /^si_/} @arrays));
d707f7ac Moritz Bunkus
$sameitem = ($ref->{partsgroup}) ? $ref->{partsgroup} : "--";
61813c8c Jan Büren
push(@{ $form->{TEMPLATE_ARRAYS}->{description} }, $sameitem);
75957fe8 Bernd Bleßmann
$si_position++;
d707f7ac Moritz Bunkus
}

75957fe8 Bernd Bleßmann
push(@{ $form->{TEMPLATE_ARRAYS}->{"description"} }, $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"}) . qq| -- $ref->{partnumber}, $ref->{description}|);
map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" && $_ !~ /^si_/} @arrays));
map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, []) } grep({ $_ =~ /^si_/} @arrays));
$si_position++;
d707f7ac Moritz Bunkus
}
}
d12e02e0 Moritz Bunkus
be42a450 Bernd Bleßmann
CVar->get_non_editable_ic_cvars(form => $form,
dbh => $dbh,
b8f55e88 Jan Büren
row => $i,
be42a450 Bernd Bleßmann
sub_module => 'delivery_order_items',
b8125c17 Bernd Bleßmann
may_converted_from => ['orderitems', 'delivery_order_items']);
6b4a71ff Bernd Bleßmann
d729e328 Sven Schöling
push @{ $form->{TEMPLATE_ARRAYS}->{"ic_cvar_$_->{name}"} },
CVar->format_to_template(CVar->parse($form->{"ic_cvar_$_->{name}_$i"}, $_), $_)
for @{ $ic_cvar_configs };
fde1df0b Sven Schöling
push @{ $form->{TEMPLATE_ARRAYS}->{"project_cvar_" . $_->config->name} }, $_->value_as_text for @{ $project->cvars_by_config };
d707f7ac Moritz Bunkus
}

79c048aa Niclas Zimmermann
$form->{totalweight} = $form->format_amount($myconfig, $totalweight, 3);
$form->{totalweight_nofmt} = $totalweight;
fe6275f8 Niclas Zimmermann
my $defaults = AM->get_defaults();
$form->{weightunit} = $defaults->{weightunit};
79c048aa Niclas Zimmermann
d707f7ac Moritz Bunkus
$h_pg->finish();
$h_bin_wh->finish();

03d3d025 Bernd Bleßmann
$form->{delivery_term} = SL::DB::Manager::DeliveryTerm->find_by(id => $form->{delivery_term_id} || undef);
002517b4 Bernd Bleßmann
$form->{delivery_term}->description_long($form->{delivery_term}->translated_attribute('description_long', $form->{language_id})) if $form->{delivery_term} && $form->{language_id};
03d3d025 Bernd Bleßmann
d707f7ac Moritz Bunkus
$form->{username} = $myconfig->{name};

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

sub project_description {
$main::lxdebug->enter_sub();

my ($self, $dbh, $id) = @_;

80f6efd0 Sven Schöling
my $form = $main::form;

d707f7ac Moritz Bunkus
my $query = qq|SELECT description FROM project WHERE id = ?|;
my ($value) = selectrow_query($form, $dbh, $query, $id);

$main::lxdebug->leave_sub();

return $value;
}

sub unpack_stock_information {
$main::lxdebug->enter_sub();

my $self = shift;
my %params = @_;

Common::check_params_x(\%params, qw(packed));

my $unpacked;

eval { $unpacked = $params{packed} ? YAML::Load($params{packed}) : []; };

$unpacked = [] if (!$unpacked || ('ARRAY' ne ref $unpacked));

foreach my $entry (@{ $unpacked }) {
next if ('HASH' eq ref $entry);
$unpacked = [];
last;
}

$main::lxdebug->leave_sub();

return $unpacked;
}

sub get_item_availability {
6a262293 Sven Schöling
$::lxdebug->enter_sub;
d707f7ac Moritz Bunkus
my $self = shift;
my %params = @_;

Common::check_params(\%params, qw(parts_id));

my @parts_ids = 'ARRAY' eq ref $params{parts_id} ? @{ $params{parts_id} } : ($params{parts_id});

my $query =
096f9e3e Bernd Bleßmann
qq|SELECT i.warehouse_id, i.bin_id, i.chargenumber, i.bestbefore, SUM(qty) AS qty, i.parts_id,
d707f7ac Moritz Bunkus
w.description AS warehousedescription,
b.description AS bindescription
FROM inventory i
LEFT JOIN warehouse w ON (i.warehouse_id = w.id)
LEFT JOIN bin b ON (i.bin_id = b.id)
4e07e589 Moritz Bunkus
WHERE (i.parts_id IN (| . join(', ', ('?') x scalar(@parts_ids)) . qq|))
096f9e3e Bernd Bleßmann
GROUP BY i.warehouse_id, i.bin_id, i.chargenumber, i.bestbefore, i.parts_id, w.description, b.description
4e07e589 Moritz Bunkus
HAVING SUM(qty) > 0
096f9e3e Bernd Bleßmann
ORDER BY LOWER(w.description), LOWER(b.description), LOWER(i.chargenumber), i.bestbefore
4e07e589 Moritz Bunkus
|;
6a262293 Sven Schöling
my $contents = selectall_hashref_query($::form, $::form->get_standard_dbh, $query, @parts_ids);
d707f7ac Moritz Bunkus
6a262293 Sven Schöling
$::lxdebug->leave_sub;
d707f7ac Moritz Bunkus
return @{ $contents };
}


sub check_stock_availability {
$main::lxdebug->enter_sub();

my $self = shift;
my %params = @_;

Common::check_params(\%params, qw(requests parts_id));

my $myconfig = \%main::myconfig;
my $form = $main::form;

my $dbh = $form->get_standard_dbh($myconfig);

07948c34 Moritz Bunkus
my $units = AM->retrieve_units($myconfig, $form);
d707f7ac Moritz Bunkus
my ($partunit) = selectrow_query($form, $dbh, qq|SELECT unit FROM parts WHERE id = ?|, conv_i($params{parts_id}));
my $unit_factor = $units->{$partunit}->{factor} || 1;

my @contents = $self->get_item_availability(%params);

my @errors;

foreach my $sinfo (@{ $params{requests} }) {
my $found = 0;

foreach my $row (@contents) {
next if (($row->{bin_id} != $sinfo->{bin_id}) ||
($row->{warehouse_id} != $sinfo->{warehouse_id}) ||
096f9e3e Bernd Bleßmann
($row->{chargenumber} ne $sinfo->{chargenumber}) ||
($row->{bestbefore} ne $sinfo->{bestbefore}));
d707f7ac Moritz Bunkus
$found = 1;

my $base_qty = $sinfo->{qty} * $units->{$sinfo->{unit}}->{factor} / $unit_factor;

if ($base_qty > $row->{qty}) {
$sinfo->{error} = 1;
push @errors, $sinfo;

last;
}
}

push @errors, $sinfo if (!$found);
}

$main::lxdebug->leave_sub();

return @errors;
}

sub transfer_in_out {
$main::lxdebug->enter_sub();

my $self = shift;
my %params = @_;

Common::check_params(\%params, qw(direction requests));

if (!@{ $params{requests} }) {
$main::lxdebug->leave_sub();
return;
}

my $myconfig = \%main::myconfig;
my $form = $main::form;

my $prefix = $params{direction} eq 'in' ? 'dst' : 'src';

my @transfers;

foreach my $request (@{ $params{requests} }) {
push @transfers, {
6934a717 Jan Büren
'parts_id' => $request->{parts_id},
"${prefix}_warehouse_id" => $request->{warehouse_id},
"${prefix}_bin_id" => $request->{bin_id},
'chargenumber' => $request->{chargenumber},
'bestbefore' => $request->{bestbefore},
'qty' => $request->{qty},
'unit' => $request->{unit},
'oe_id' => $form->{id},
'shippingdate' => 'current_date',
'transfer_type' => $params{direction} eq 'in' ? 'stock' : 'shipped',
'project_id' => $request->{project_id},
'delivery_order_items_stock_id' => $request->{delivery_order_items_stock_id},
b8f55e88 Jan Büren
'comment' => $request->{comment},
d707f7ac Moritz Bunkus
};
}

WH->transfer(@transfers);

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

480d9a56 Moritz Bunkus
sub get_shipped_qty {
$main::lxdebug->enter_sub();

my $self = shift;
my %params = @_;

5df2b57a Moritz Bunkus
Common::check_params(\%params, qw(type oe_id));
480d9a56 Moritz Bunkus
my $myconfig = \%main::myconfig;
my $form = $main::form;

my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);

5df2b57a Moritz Bunkus
my @links = RecordLinks->get_links('dbh' => $dbh,
'from_table' => 'oe',
'from_id' => $params{oe_id},
'to_table' => 'delivery_orders');
my @values = map { $_->{to_id} } @links;

if (!scalar @values) {
$main::lxdebug->leave_sub();
return ();
}
480d9a56 Moritz Bunkus
5df2b57a Moritz Bunkus
my $query =
480d9a56 Moritz Bunkus
qq|SELECT doi.parts_id, doi.qty, doi.unit, p.unit AS partunit
FROM delivery_order_items doi
LEFT JOIN delivery_orders o ON (doi.delivery_order_id = o.id)
LEFT JOIN parts p ON (doi.parts_id = p.id)
5df2b57a Moritz Bunkus
WHERE o.id IN (| . join(', ', ('?') x scalar @values) . qq|)|;
480d9a56 Moritz Bunkus
my %ship = ();
5df2b57a Moritz Bunkus
my $entries = selectall_hashref_query($form, $dbh, $query, @values);
480d9a56 Moritz Bunkus
my $all_units = AM->retrieve_all_units();

foreach my $entry (@{ $entries }) {
9e9a940e Sven Schöling
$entry->{qty} *= AM->convert_unit($entry->{unit}, $entry->{partunit}, $all_units);
480d9a56 Moritz Bunkus
if (!$ship{$entry->{parts_id}}) {
$ship{$entry->{parts_id}} = $entry;
} else {
$ship{$entry->{parts_id}}->{qty} += $entry->{qty};
}
}

$main::lxdebug->leave_sub();

return %ship;
}

4a9b86a5 Moritz Bunkus
sub is_marked_as_delivered {
$main::lxdebug->enter_sub();

my $self = shift;
my %params = @_;

Common::check_params(\%params, qw(id));

my $myconfig = \%main::myconfig;
my $form = $main::form;

my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);

my ($delivered) = selectfirst_array_query($form, $dbh, qq|SELECT delivered FROM delivery_orders WHERE id = ?|, conv_i($params{id}));

$main::lxdebug->leave_sub();

return $delivered ? 1 : 0;
}

d707f7ac Moritz Bunkus
1;