|
package SL::Controller::DeliveryValueReport;
|
|
|
|
use strict;
|
|
use parent qw(SL::Controller::Base);
|
|
|
|
use Clone qw(clone);
|
|
use SL::DB::OrderItem;
|
|
use SL::DB::Order::TypeData qw(:types);
|
|
use SL::DB::Business;
|
|
use SL::Controller::Helper::GetModels;
|
|
use SL::Controller::Helper::ReportGenerator;
|
|
use SL::Locale::String;
|
|
use SL::Helper::ShippedQty;
|
|
use SL::AM;
|
|
use SL::DBUtils qw(selectall_as_map);
|
|
use List::MoreUtils qw(uniq);
|
|
use Carp;
|
|
use Data::Dumper;
|
|
|
|
use Rose::Object::MakeMethods::Generic (
|
|
'scalar --get_set_init' => [ qw(models vc all_employees all_businesses all_partsgroups) ],
|
|
);
|
|
|
|
__PACKAGE__->run_before(sub { $::auth->assert('delivery_value_report'); });
|
|
|
|
my %sort_columns = (
|
|
reqdate => t8('Reqdate'),
|
|
customer => t8('Customer'),
|
|
vendor => t8('Vendor'),
|
|
ordnumber => t8('Order'),
|
|
partnumber => t8('Part Number'),
|
|
description => t8('Description'),
|
|
qty => t8('Qty in Order'),
|
|
unit => t8('Unit'),
|
|
netto_qty => t8('Net value in Order'),
|
|
not_shipped_qty => t8('not shipped'),
|
|
netto_not_shipped_qty => t8('Net value without delivery orders'),
|
|
shipped_qty => t8('Qty in delivery orders'),
|
|
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('Net value in closed delivery orders'),
|
|
);
|
|
|
|
|
|
|
|
|
|
#
|
|
# action
|
|
#
|
|
|
|
sub action_list {
|
|
my ($self) = @_;
|
|
$self->make_filter_summary;
|
|
$self->prepare_report;
|
|
|
|
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);
|
|
}
|
|
|
|
sub prepare_report {
|
|
my ($self) = @_;
|
|
|
|
my $vc = $self->vc;
|
|
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);
|
|
|
|
|
|
my @sortable = qw(reqdate customer vendor ordnumber partnumber description);
|
|
|
|
# if csv report export no units
|
|
my $rp_csv_mod = ($csv_option eq 'CSV') ? 1 : '';
|
|
|
|
my %column_defs = (
|
|
reqdate => { sub => sub { $_[0]->reqdate_as_date || $_[0]->order->reqdate_as_date } },
|
|
description => { sub => sub { $_[0]->description },
|
|
obj_link => sub { $self->link_to($_[0]->part) } },
|
|
partnumber => { sub => sub { $_[0]->part->partnumber },
|
|
obj_link => sub { $self->link_to($_[0]->part) } },
|
|
qty => { sub => sub { _format_qty($_[0], 'qty', $rp_csv_mod) } },
|
|
netto_qty => { sub => sub { _format_val($_[0], 'qty') },},
|
|
unit => { sub => sub { $_[0]->unit },
|
|
visible => $rp_csv_mod },
|
|
shipped_qty => { sub => sub { _format_qty($_[0], 'shipped_qty', $rp_csv_mod) } },
|
|
netto_shipped_qty => { sub => sub { _format_val($_[0], 'shipped_qty') },},
|
|
not_shipped_qty => { sub => sub { _format_qty($_[0], 'not_shipped_qty', $rp_csv_mod) } },
|
|
netto_not_shipped_qty => { sub => sub { _format_val($_[0], 'not_shipped_qty') },},
|
|
delivered_qty => { sub => sub { _format_qty($_[0], 'delivered_qty', $rp_csv_mod) } },
|
|
netto_delivered_qty => { sub => sub { _format_val($_[0], 'delivered_qty') },},
|
|
do_closed_qty => { sub => sub { _format_qty($_[0], 'do_closed_qty', $rp_csv_mod) },},
|
|
netto_do_closed_qty => { sub => sub { _format_val($_[0], 'do_closed_qty') },},
|
|
ordnumber => { sub => sub { $_[0]->order->ordnumber },
|
|
obj_link => sub { $self->link_to($_[0]->order) } },
|
|
vendor => { sub => sub { $_[0]->order->vendor->name },
|
|
visible => $vc eq 'vendor',
|
|
obj_link => sub { $self->link_to($_[0]->order->vendor) } },
|
|
customer => { sub => sub { $_[0]->order->customer->name },
|
|
visible => $vc eq 'customer',
|
|
obj_link => sub { $self->link_to($_[0]->order->customer) } },
|
|
);
|
|
|
|
$column_defs{$_}->{text} = $sort_columns{$_} for keys %column_defs;
|
|
|
|
$report->set_options(
|
|
std_column_visibility => 1,
|
|
controller_class => 'DeliveryValueReport',
|
|
output_format => 'HTML',
|
|
top_info_text => ($vc eq 'customer') ? t8('Delivery Value Report for currently open sales orders') :
|
|
t8('Delivery Value Report for currently outstanding purchase orders'),
|
|
title => $::locale->text('Delivery Value Report'),
|
|
allow_pdf_export => 1,
|
|
allow_csv_export => 1,
|
|
);
|
|
$report->set_columns(%column_defs);
|
|
$report->set_column_order(@columns);
|
|
$report->set_export_options(qw(list filter vc));
|
|
$report->set_options_from_form;
|
|
$self->models->disable_plugin('paginated') if $report->{options}{output_format} =~ /^(pdf|csv)$/i;
|
|
$self->models->finalize; # for filter laundering
|
|
$self->models->set_report_generator_sort_options(report => $report, sortable_columns => \@sortable);
|
|
$report->set_options(
|
|
raw_top_info_text => $self->render('delivery_value_report/report_top', { output => 0 }),
|
|
raw_bottom_info_text => $self->render('delivery_value_report/report_bottom', { output => 0 }, models => $self->models),
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
#
|
|
# filter
|
|
#
|
|
|
|
sub make_filter_summary {
|
|
my ($self) = @_;
|
|
my $vc = $self->vc;
|
|
my ($business, $employee, $partsgroup);
|
|
|
|
my $filter = $::form->{filter} || {};
|
|
my @filter_strings;
|
|
|
|
$business = SL::DB::Business->new(id => $filter->{order}{customer}{"business_id"})->load->description if $filter->{order}{customer}{"business_id"};
|
|
$employee = SL::DB::Employee->new(id => $filter->{order}{employee_id})->load->name if $filter->{order}{employee_id};
|
|
$partsgroup = SL::DB::PartsGroup->new(id => $filter->{part}{partsgroup_id})->load->partsgroup if $filter->{part}{partsgroup_id};
|
|
|
|
my @filters = (
|
|
[ $filter->{order}{"ordnumber:substr::ilike"}, $::locale->text('Number') ],
|
|
[ $filter->{order}{globalproject}{"projectnumber:substr::ilike"}, $::locale->text('Document Project Number') ],
|
|
[ $filter->{part}{"partnumber:substr::ilike"}, $::locale->text('Part Number') ],
|
|
[ $filter->{"description:substr::ilike"}, $::locale->text('Part Description') ],
|
|
[ $filter->{"reqdate:date::ge"}, $::locale->text('Delivery Date') . " " . $::locale->text('From Date') ],
|
|
[ $filter->{"reqdate:date::le"}, $::locale->text('Delivery Date') . " " . $::locale->text('To Date') ],
|
|
[ $filter->{"qty:number"}, $::locale->text('Quantity') ],
|
|
[ $filter->{order}{vendor}{"name:substr::ilike"}, $::locale->text('Vendor') ],
|
|
[ $filter->{order}{vendor}{"vendornumber:substr::ilike"}, $::locale->text('Vendor Number') ],
|
|
[ $filter->{order}{customer}{"name:substr::ilike"}, $::locale->text('Customer') ],
|
|
[ $filter->{order}{customer}{"customernumber:substr::ilike"}, $::locale->text('Customer Number') ],
|
|
[ $business, $::locale->text('Customer type') ],
|
|
[ $employee, $::locale->text('Employee') ],
|
|
[ < |