use SL::Controller::Helper::GetModels;
use SL::Controller::Helper::ReportGenerator;
use SL::Locale::String;
+use SL::Helper::ShippedQty;
use SL::AM;
use SL::DBUtils ();
use Carp;
'scalar --get_set_init' => [ qw(models vc all_employees all_businesses) ],
);
-
+__PACKAGE__->run_before(sub { $::auth->assert('delivery_value_report'); });
my %sort_columns = (
reqdate => t8('Reqdate'),
netto_shipped_qty => t8('Net Value in delivery orders'),
delivered_qty => t8('transferred in / out'),
netto_delivered_qty => t8('Net value transferred in / out'),
- do_closed_qty => t8('Qty in closed delivery orders'),
- netto_do_closed_qty => t8('Qty in closed delivery orders')
);
my $orderitems = $self->models->get;
$self->calc_qtys_price($orderitems);
+ $self->setup_list_action_bar;
$self->report_generator_list_objects(report => $self->{report}, objects => $orderitems);
}
my ($self) = @_;
my $vc = $self->vc;
- my $mode = 'delivery_value_report';
my $report = SL::ReportGenerator->new(\%::myconfig, $::form);
my $csv_option = $::form->{report_generator_output_format};
$self->{report} = $report;
my @columns = qw(reqdate customer vendor ordnumber partnumber description unit qty netto_qty
not_shipped_qty netto_not_shipped_qty shipped_qty netto_shipped_qty delivered_qty
- netto_delivered_qty do_closed_qty netto_do_closed_qty);
+ netto_delivered_qty);
my @sortable = qw(reqdate customer vendor ordnumber partnumber description);
$_[0]{shipped_qty} - $_[0]{delivered_qty} - $_[0]{do_closed_qty})
* ($_[0]->sellprice * (1 - $_[0]->discount) /
($_[0]->price_factor || 1)), 2)) },},
- do_closed_qty => { sub => sub { $::form->format_amount(\%::myconfig, $_[0]{do_closed_qty}, 2) .
- ($rp_csv_mod ? '' : ' ' . $_[0]->unit) },},
- netto_do_closed_qty => { sub => sub { $::form->format_amount(\%::myconfig, $_[0]{netto_do_closed_qty}, 2) },},
ordnumber => { sub => sub { $_[0]->order->ordnumber },
obj_link => sub { $self->link_to($_[0]->order) } },
vendor => { sub => sub { $_[0]->order->vendor->name },
}
if ($object->isa('SL::DB::Part')) {
my $id = $object->id;
- return "ic.pl?action=$action&id=$id";
+ return "controller.pl?action=Part/$action&part.id=$id";
}
if ($object->isa('SL::DB::Customer')) {
my $id = $object->id;
sub calc_qtys_price {
my ($self, $orderitems) = @_;
- # using $orderitem->shipped_qty 40 times is far too slow. need to do it manually
- # also for calc net values
return unless scalar @$orderitems;
- my %orderitems_by_id = map { $_->id => $_ } @$orderitems;
+ SL::Helper::ShippedQty
+ ->new(require_stock_out => 1)
+ ->calculate($orderitems)
+ ->write_to_objects;
- my $query = <<SQL;
- SELECT oi.id, doi.qty, doi.unit, doe.delivered, doe.closed,
- oi.sellprice, oi.discount, oi.price_factor
- FROM record_links rl
- INNER JOIN delivery_order_items doi ON (doi.id = rl.to_id)
- INNER JOIN orderitems oi ON (oi.id = rl.from_id)
- INNER JOIN delivery_orders doe ON (doe.id = doi.delivery_order_id)
- WHERE rl.from_table = 'orderitems'
- AND rl.to_table = 'delivery_order_items'
- AND oi.id IN (@{[ join ', ', ("?")x @$orderitems ]})
-SQL
-
- my $result = SL::DBUtils::selectall_hashref_query($::form, $::form->get_standard_dbh, $query, map { $_->id } @$orderitems);
-
- for my $row (@$result) {
- my $item = $orderitems_by_id{ $row->{id} };
- $item->{shipped_qty} ||= 0;
- $item->{delivered_qty} ||= 0;
- $item->{do_closed_qty} ||= 0;
- $item->{shipped_qty} += AM->convert_unit($row->{unit} => $item->unit) * $row->{qty} unless ($row->{delivered} || $row->{closed});
- $item->{delivered_qty} += AM->convert_unit($row->{unit} => $item->unit) * $row->{qty} if ($row->{delivered} && !$row->{closed});
- $item->{do_closed_qty} += AM->convert_unit($row->{unit} => $item->unit) * $row->{qty} if ($row->{closed});
- $item->{not_shipped_qty} += AM->convert_unit($row->{unit} => $item->unit) * $row->{qty} unless ($row->{delivered});
-
- my $price_factor = $row->{price_factor} || 1;
- $item->{netto_shipped_qty} = $item->{shipped_qty} * $row->{sellprice} * (1 - $row->{discount} ) / $price_factor;
- $item->{netto_delivered_qty} = $item->{delivered_qty} * $row->{sellprice} * (1 - $row->{discount} ) / $price_factor;
- $item->{netto_do_closed_qty} = $item->{do_closed_qty} * $row->{sellprice} * (1 - $row->{discount} ) / $price_factor;
+ $_->{delivered_qty} = delete $_->{shipped_qty} for @$orderitems;
- }
-}
+ SL::Helper::ShippedQty
+ ->new(require_stock_out => 0)
+ ->calculate($orderitems)
+ ->write_to_objects;
+ for my $item (@$orderitems) {
+ $item->{not_shipped_qty} = $item->qty - $item->{shipped_qty};
+ my $price_factor = $item->price_factor || 1;
+ $item->{netto_shipped_qty} = $item->{shipped_qty} * $item->sellprice * (1 - $item->discount) / $price_factor;
+ $item->{netto_delivered_qty} = $item->{delivered_qty} * $item->sellprice * (1 - $item->discount) / $price_factor;
+ }
+}
+sub setup_list_action_bar {
+ my ($self, %params) = @_;
+
+ for my $bar ($::request->layout->get('actionbar')) {
+ $bar->add(
+ action => [
+ t8('Update'),
+ submit => [ '#filter_form', { action => 'DeliveryValueReport/list' } ],
+ accesskey => 'enter',
+ ],
+ );
+ }
+}
1;
Controller class for Delivery Value Report
-The goal of the record is to determine which goods and at what costs are already delivered, transfered in
+The goal of the report is to determine which goods and at what costs are already delivered, transfered in
relation to open orders, orders in process.
After some arguing we decided to implement persistent ids for all items and link them directly via record_links.
This linking has been secrectly active since version 3.2, therefore this redesign is possible.
Currently the report even works correctly even if the same part has been manually put in another position, renamed or some
- other metadata for the position has been altered. This is due to the fact that a hidden converted_from_previous_document is
+other metadata for the position has been altered. This is due to the fact that a hidden converted_from_previous_document is
used in the position.
The main intelligence is this query (qty_stocked as comments):