Sortindicator für SellPriceInformation
[kivitendo-erp.git] / SL / Controller / SellPriceInformation.pm
1 package SL::Controller::SellPriceInformation;
2
3 use strict;
4 use parent qw(SL::Controller::Base);
5
6 use Clone qw(clone);
7 use SL::DB::OrderItem;
8 use SL::Controller::Helper::ParseFilter;
9 use SL::Controller::Helper::ReportGenerator;
10
11 sub action_list {
12   my ($self) = @_;
13   $self->{action} = 'list';
14
15   my %list_params = (
16     sort_by  => $::form->{sort_by} || 'reqdate',
17     sort_dir => $::form->{sort_dir},
18     filter   => $::form->{filter},
19     page     => $::form->{page},
20   );
21
22   my $db_args = $self->setup_for_list(%list_params);
23   $self->{pages} = SL::DB::Manager::OrderItem->paginate(%list_params, args => $db_args, per_page => 10);
24
25   my $bottom = $::form->parse_html_template('price_information/report_bottom', { SELF => $self });
26
27   $self->prepare_report(
28     report_generator_options => {
29       raw_bottom_info_text => $bottom,
30       controller_class     => 'SellPriceInformation',
31     },
32     db_args => $db_args,
33   );
34
35   $self->{orderitems} = SL::DB::Manager::OrderItem->get_all(%$db_args);
36
37   $self->list_objects;
38 }
39
40 # private functions
41
42 sub setup_for_list {
43   my ($self, %params) = @_;
44   $self->{filter} = _pre_parse_filter($params{filter});
45
46   my %args = (
47     parse_filter($self->{filter},
48       with_objects => [ 'order', 'order.customer', 'part' ],
49     ),
50     sort_by => $self->set_sort_params(%params),
51     page    => $params{page},
52   );
53
54   return \%args;
55 }
56
57 sub set_sort_params {
58   my ($self, %params) = @_;
59   my $sort_str;
60   ($self->{sort_by}, $self->{sort_dir}, $sort_str) =
61     SL::DB::Manager::OrderItem->make_sort_string(%params);
62   return $sort_str;
63 }
64
65 sub column_defs {
66   my ($self) = @_;
67   return {
68     transdate   => { text => $::locale->text('Date'),
69                       sub => sub { $_[0]->order->transdate_as_date }},
70     ordnumber   => { text => $::locale->text('Number'),
71                       sub => sub { $_[0]->order->number },
72                  obj_link => sub { $self->link_to($_[0]->order) }},
73     customer    => { text => $::locale->text('Customer'),
74                       sub => sub { $_[0]->order->customer->name },
75                  obj_link => sub { $self->link_to($_[0]->order->customer) }},
76     customer    => { text => $::locale->text('Customer'),
77                       sub => sub { $_[0]->order->customer->name },
78                  obj_link => sub { $self->link_to($_[0]->order->customer) }},
79     ship        => { text => $::locale->text('Delivered'),
80                       sub => sub { $::form->format_amount(\%::myconfig, $_[0]->shipped_qty) . ' ' . $_[0]->unit }},
81     qty         => { text => $::locale->text('Qty'),
82                       sub => sub { $_[0]->qty_as_number . ' ' . $_[0]->unit }},
83     sellprice   => { text => $::locale->text('Sell Price'),
84                       sub => sub { $_[0]->sellprice_as_number }},
85     discount    => { text => $::locale->text('Discount'),
86                       sub => sub { $_[0]->discount_as_percent . "%" }},
87     amount      => { text => $::locale->text('Amount'),
88                       sub => sub { $::form->format_amount(\%::myconfig, $_[0]->qty * $_[0]->sellprice * (1 - $_[0]->discount), 2) }},
89   };
90 }
91
92 sub prepare_report {
93   my ($self, %params) = @_;
94
95   my $objects  = $params{objects} || [];
96   my $report = SL::ReportGenerator->new(\%::myconfig, $::form);
97   $self->{report} = $report;
98
99   my @columns  = qw(transdate ordnumber customer ship qty sellprice discount amount);
100   my @visible  = qw(transdate ordnumber customer ship qty sellprice discount amount);
101   my @sortable = qw(transdate ordnumber customer          sellprice discount       );
102
103   my $column_defs = $self->column_defs;
104
105   for my $col (@sortable) {
106     $column_defs->{$col}{link} = $self->self_url(
107       sort_by  => $col,
108       sort_dir => ($self->{sort_by} eq $col ? 1 - $self->{sort_dir} : $self->{sort_dir}),
109       page     => $self->{pages}{cur},
110     );
111   }
112
113   map { $column_defs->{$_}{visible} = 1 } @visible;
114
115   $report->set_columns(%$column_defs);
116   $report->set_column_order(@columns);
117   $report->set_options(allow_pdf_export => 0, allow_csv_export => 0);
118   $report->set_sort_indicator($self->{sort_by}, $self->{sort_dir});
119   $report->set_export_options(@{ $params{report_generator_export_options} || [] });
120   $report->set_options(
121     %{ $params{report_generator_options} || {} },
122     output_format        => 'HTML',
123     top_info_text        => $self->displayable_filter($::form->{filter}),
124     title                => $::locale->text('Sales Price information'),
125   );
126   $report->set_options_from_form;
127
128   $self->{report_data} = {
129     column_defs => $column_defs,
130     columns     => \@columns,
131     visible     => \@visible,
132     sortable    => \@sortable,
133   };
134 }
135
136 sub list_objects {
137   my ($self) = @_;
138   my $column_defs = $self->{report_data}{column_defs};
139   for my $obj (@{ $self->{orderitems} || [] }) {
140     $self->{report}->add_data({
141       map {
142         $_ => {
143           data => $column_defs->{$_}{sub} ? $column_defs->{$_}{sub}->($obj)
144                 : $obj->can($_)           ? $obj->$_
145                 :                           $obj->{$_},
146           link => $column_defs->{$_}{obj_link} ? $column_defs->{$_}{obj_link}->($obj) : '',
147         },
148       } @{ $self->{report_data}{columns} || {} }
149     });
150   }
151
152   return $self->{report}->generate_with_headers(no_layout => 1);
153 }
154
155 sub link_to {
156   my ($self, $object, %params) = @_;
157
158   return unless $object;
159   my $action = $params{action} || 'edit';
160
161   if ($object->isa('SL::DB::Order')) {
162     my $type   = $object->type;
163     my $vc     = $object->is_sales ? 'customer' : 'vendor';
164     my $id     = $object->id;
165
166     return "oe.pl?action=$action&type=$type&vc=$vc&id=$id";
167   }
168   if ($object->isa('SL::DB::Customer')) {
169     my $id     = $object->id;
170     return "ct.pl?action=$action&id=$id&db=customer";
171   }
172 }
173
174 sub _pre_parse_filter {
175   my $filter = clone(shift);
176
177   if (  exists $filter->{order}
178      && exists $filter->{order}{type}) {
179      push @{ $filter->{and} }, SL::DB::Manager::Order->type_filter(delete $filter->{order}{type}, "order."),
180   }
181
182   return $filter;
183 }
184
185 sub displayable_filter {
186   my ($self, $filter) = @_;
187
188   my $column_defs = $self->column_defs;
189   my @texts;
190
191   push @texts, [ $::locale->text('Type'),    $::locale->text($filter->{order}{type}) ] if $filter->{order}{type};
192   push @texts, [ $::locale->text('Sort By'), $column_defs->{$self->{sort_by}}{text}  ] if $column_defs->{$self->{sort_by}}{text};
193   push @texts, [ $::locale->text('Page'),    $::locale->text($self->{pages}{cur})    ] if $self->{pages}{cur} != 1;
194
195   return join '; ', map { "$_->[0]: $_->[1]" } @texts;
196 }
197
198 sub self_url {
199   my ($self, %params) = @_;
200   %params = (
201     action   => $self->{action},
202     sort_by  => $self->{sort_by},
203     sort_dir => $self->{sort_dir},
204     page     => $self->{pages}{cur},
205     filter   => $::form->{filter},
206     %params,
207   );
208
209   return $self->url_for(%params);
210 }
211
212 1;