epic-ts
[kivitendo-erp.git] / SL / Controller / OrderItem.pm
1 package SL::Controller::OrderItem;
2
3 use strict;
4
5 use parent qw(SL::Controller::Base);
6 use SL::DB::Order;
7 use SL::DB::OrderItem;
8 use SL::DB::Customer;
9 use SL::DB::Part;
10 use SL::Controller::Helper::GetModels;
11 use SL::Controller::Helper::ParseFilter;
12 use SL::Locale::String qw(t8);
13
14 __PACKAGE__->run_before('check_auth');
15
16 use Rose::Object::MakeMethods::Generic (
17   'scalar'                => [ qw(orderitems) ],
18   'scalar --get_set_init' => [ qw(model) ],
19 );
20
21 my %sort_columns = (
22   partnumber        => t8('Part Number'),
23   ordnumber         => t8('Order'),
24   customer          => t8('Customer'),
25   transdate         => t8('Date'),
26 );
27
28 sub action_search {
29
30   my ($self, %params) = @_;
31
32   my $title = t8("Sold order items");
33
34   $::request->layout->use_javascript('client_js.js');
35
36   # The actual loading of orderitems happens in action_order_item_list_dynamic_table
37   # which is processed inside this template and automatically called upon
38   # loading. This causes all filtered orderitems to be displayed,
39   # there is no paginate mechanism or export
40   $self->render('order_items_search/order_items', { layout => 1, process => 1 },
41                                                   title         => $title,
42                );
43 }
44
45
46 sub action_order_item_list_dynamic_table {
47   my ($self) = @_;
48
49   $self->orderitems( $self->model->get );
50
51
52   $self->add_linked_delivery_order_items;
53
54   $self->render('order_items_search/_order_item_list', { layout  => 0 , process => 1 });
55 }
56
57 sub add_linked_delivery_order_items {
58   my ($self) = @_;
59
60   my $qty_round = 2;
61
62   foreach my $orderitem ( @{ $self->orderitems } ) {
63     my $dois = $orderitem->linked_delivery_order_items;
64     $orderitem->{deliveryorders} = join('<br>', map { $_->displayable_delivery_order_info($qty_round) } @{$dois});
65   };
66 };
67
68 sub init_model {
69   my ($self) = @_;
70
71   SL::Controller::Helper::GetModels->new(
72     controller => $self,
73     model      => 'OrderItem',
74     query      => [ SL::DB::Manager::Order->type_filter('sales_order') ],
75     sorted       => {
76       _default     => {
77         by           => 'transdate',
78         dir          => 0,
79       },
80       %sort_columns,
81     } ,
82     with_objects    => [ 'order', 'order.customer', 'part' ],
83   );
84 }
85
86 sub check_auth {
87   $::auth->assert('sales_order_edit');
88 }
89
90 1;
91
92 __END__
93
94 =encoding utf-8
95
96 =head1 NAME
97
98 SL::Controller::OrderItem - Controller for OrderItems
99
100 =head2 OVERVIEW
101
102 Controller for quickly finding orderitems in sales orders. For example the
103 customer phones you, saying he would like to order another one of the green
104 thingies he ordered 2 years ago. You have no idea what he is referring to, but
105 you can quickly filter by customer (a customerpicker) and e.g. part description
106 or partnumber or order date, successively narrowing down the search. The
107 resulting list is updated dynamically after keypresses.
108
109 =head1 Usage
110
111 Certain fields can be preset by passing them as get parameters in the URL, so
112 you could create links to this report:
113
114  controller.pl?action=OrderItem/search&ordnumber=24
115  controller.pl?action=OrderItem/search&customer_id=3455
116
117 =head1 TODO AND CAVEATS
118
119 =over 4
120
121 =item * amount of results is limited
122
123 =back
124
125 =cut