11 |
11 |
use SL::Locale::String;
|
12 |
12 |
use SL::Helper::ShippedQty;
|
13 |
13 |
use SL::AM;
|
14 |
|
use SL::DBUtils ();
|
|
14 |
use SL::DBUtils qw(selectall_as_map);
|
|
15 |
use List::MoreUtils qw(uniq);
|
15 |
16 |
use Carp;
|
16 |
17 |
use Data::Dumper;
|
17 |
18 |
|
... | ... | |
38 |
39 |
netto_shipped_qty => t8('Net Value in delivery orders'),
|
39 |
40 |
delivered_qty => t8('transferred in / out'),
|
40 |
41 |
netto_delivered_qty => t8('Net value transferred in / out'),
|
|
42 |
do_closed_qty => t8('Qty in closed delivery orders'),
|
|
43 |
netto_do_closed_qty => t8('Net value in closed delivery orders'),
|
41 |
44 |
);
|
42 |
45 |
|
43 |
46 |
|
... | ... | |
68 |
71 |
|
69 |
72 |
my @columns = qw(reqdate customer vendor ordnumber partnumber description unit qty netto_qty
|
70 |
73 |
not_shipped_qty netto_not_shipped_qty shipped_qty netto_shipped_qty delivered_qty
|
71 |
|
netto_delivered_qty);
|
|
74 |
netto_delivered_qty do_closed_qty netto_do_closed_qty);
|
72 |
75 |
|
73 |
76 |
|
74 |
77 |
my @sortable = qw(reqdate customer vendor ordnumber partnumber description);
|
... | ... | |
82 |
85 |
obj_link => sub { $self->link_to($_[0]->part) } },
|
83 |
86 |
partnumber => { sub => sub { $_[0]->part->partnumber },
|
84 |
87 |
obj_link => sub { $self->link_to($_[0]->part) } },
|
85 |
|
qty => { sub => sub { $_[0]->qty_as_number .
|
86 |
|
($rp_csv_mod ? '' : ' ' . $_[0]->unit) } },
|
87 |
|
netto_qty => { sub => sub { $::form->format_amount(\%::myconfig,
|
88 |
|
($_[0]->qty * $_[0]->sellprice * (1 - $_[0]->discount) /
|
89 |
|
($_[0]->price_factor || 1), 2)) },},
|
90 |
|
unit => { sub => sub { $_[0]->unit },
|
91 |
|
visible => $rp_csv_mod },
|
92 |
|
shipped_qty => { sub => sub { $::form->format_amount(\%::myconfig, $_[0]{shipped_qty}, 2) .
|
93 |
|
($rp_csv_mod ? '' : ' ' . $_[0]->unit) } },
|
94 |
|
netto_shipped_qty => { sub => sub { $::form->format_amount(\%::myconfig, $_[0]{netto_shipped_qty}, 2) },},
|
95 |
|
not_shipped_qty => { sub => sub { $::form->format_amount(\%::myconfig, $_[0]->qty - $_[0]{shipped_qty}
|
96 |
|
- $_[0]{delivered_qty} - $_[0]{do_closed_qty}, 2) .
|
97 |
|
($rp_csv_mod ? '' : ' ' . $_[0]->unit) } },
|
98 |
|
delivered_qty => { sub => sub { $::form->format_amount(\%::myconfig, $_[0]{delivered_qty}, 2) .
|
99 |
|
($rp_csv_mod ? '' : ' ' . $_[0]->unit) } },
|
100 |
|
netto_delivered_qty => { sub => sub { $::form->format_amount(\%::myconfig, $_[0]{netto_delivered_qty}, 2) },},
|
101 |
|
netto_not_shipped_qty => { sub => sub { $::form->format_amount(\%::myconfig,(($_[0]->qty -
|
102 |
|
$_[0]{shipped_qty} - $_[0]{delivered_qty} - $_[0]{do_closed_qty})
|
103 |
|
* ($_[0]->sellprice * (1 - $_[0]->discount) /
|
104 |
|
($_[0]->price_factor || 1)), 2)) },},
|
|
88 |
qty => { sub => sub { _format_qty($_[0], 'qty', $rp_csv_mod) } },
|
|
89 |
netto_qty => { sub => sub { _format_val($_[0], 'qty') },},
|
|
90 |
unit => { sub => sub { $_[0]->unit },
|
|
91 |
visible => $rp_csv_mod },
|
|
92 |
shipped_qty => { sub => sub { _format_qty($_[0], 'shipped_qty', $rp_csv_mod) } },
|
|
93 |
netto_shipped_qty => { sub => sub { _format_val($_[0], 'shipped_qty') },},
|
|
94 |
not_shipped_qty => { sub => sub { _format_qty($_[0], 'not_shipped_qty', $rp_csv_mod) } },
|
|
95 |
netto_not_shipped_qty => { sub => sub { _format_val($_[0], 'not_shipped_qty') },},
|
|
96 |
delivered_qty => { sub => sub { _format_qty($_[0], 'delivered_qty', $rp_csv_mod) } },
|
|
97 |
netto_delivered_qty => { sub => sub { _format_val($_[0], 'delivered_qty') },},
|
|
98 |
do_closed_qty => { sub => sub { _format_qty($_[0], 'do_closed_qty', $rp_csv_mod) },},
|
|
99 |
netto_do_closed_qty => { sub => sub { _format_val($_[0], 'do_closed_qty') },},
|
105 |
100 |
ordnumber => { sub => sub { $_[0]->order->ordnumber },
|
106 |
101 |
obj_link => sub { $self->link_to($_[0]->order) } },
|
107 |
102 |
vendor => { sub => sub { $_[0]->order->vendor->name },
|
... | ... | |
248 |
243 |
}
|
249 |
244 |
}
|
250 |
245 |
|
|
246 |
sub _format_qty {
|
|
247 |
my ($item, $col, $csv_mod) = @_;
|
|
248 |
|
|
249 |
$::form->format_amount(\%::myconfig, $item->{$col}, 2) . ($csv_mod ? '' : ' ' . $item->unit)
|
|
250 |
}
|
|
251 |
|
|
252 |
sub _format_val {
|
|
253 |
my ($item, $col) = @_;
|
|
254 |
|
|
255 |
$::form->format_amount(\%::myconfig, $item->{$col} * $item->sellprice * (1 - $item->discount) / ($item->price_factor || 1), 2)
|
|
256 |
}
|
|
257 |
|
251 |
258 |
|
252 |
259 |
sub calc_qtys_price {
|
253 |
260 |
my ($self, $orderitems) = @_;
|
... | ... | |
261 |
268 |
|
262 |
269 |
$_->{delivered_qty} = delete $_->{shipped_qty} for @$orderitems;
|
263 |
270 |
|
264 |
|
SL::Helper::ShippedQty
|
265 |
|
->new(require_stock_out => 0)
|
|
271 |
my $helper = SL::Helper::ShippedQty
|
|
272 |
->new(require_stock_out => 0, keep_matches => 1)
|
266 |
273 |
->calculate($orderitems)
|
267 |
274 |
->write_to_objects;
|
268 |
275 |
|
269 |
276 |
for my $item (@$orderitems) {
|
270 |
277 |
$item->{not_shipped_qty} = $item->qty - $item->{shipped_qty};
|
|
278 |
$item->{do_closed_qty} = 0;
|
271 |
279 |
|
272 |
280 |
my $price_factor = $item->price_factor || 1;
|
273 |
|
$item->{netto_shipped_qty} = $item->{shipped_qty} * $item->sellprice * (1 - $item->discount) / $price_factor;
|
274 |
|
$item->{netto_delivered_qty} = $item->{delivered_qty} * $item->sellprice * (1 - $item->discount) / $price_factor;
|
|
281 |
}
|
|
282 |
|
|
283 |
if (my @all_doi_ids = uniq map { $_->[1] } @{ $helper->matches }) {
|
|
284 |
my %oi_by_id = map { $_->id => $_ } @$orderitems;
|
|
285 |
my $query = sprintf <<'', join ', ', ("?")x@all_doi_ids;
|
|
286 |
SELECT DISTINCT doi.id, closed FROM delivery_orders
|
|
287 |
LEFT JOIN delivery_order_items doi ON (doi.delivery_order_id = delivery_order.id)
|
|
288 |
WHERE doi.id IN (%s)
|
|
289 |
|
|
290 |
my %doi_is_closed = selectall_as_map($::form, SL::DB->client->dbh, $query, (id => 'closed'), @all_doi_ids);
|
|
291 |
|
|
292 |
for my $match (@{ $helper->matches }) {
|
|
293 |
next unless $doi_is_closed{$match->[1]};
|
|
294 |
$oi_by_id{$match->[0]}->{do_closed_qty} += $match->[2];
|
|
295 |
}
|
275 |
296 |
}
|
276 |
297 |
}
|
277 |
298 |
|
DeliveryValueReport: do_closed_qty wiederhergestellt