Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / Controller / OrderItem.pm
diff --git a/SL/Controller/OrderItem.pm b/SL/Controller/OrderItem.pm
new file mode 100644 (file)
index 0000000..7cdfb35
--- /dev/null
@@ -0,0 +1,125 @@
+package SL::Controller::OrderItem;
+
+use strict;
+
+use parent qw(SL::Controller::Base);
+use SL::DB::Order;
+use SL::DB::OrderItem;
+use SL::DB::Customer;
+use SL::DB::Part;
+use SL::Controller::Helper::GetModels;
+use SL::Controller::Helper::ParseFilter;
+use SL::Locale::String qw(t8);
+
+__PACKAGE__->run_before('check_auth');
+
+use Rose::Object::MakeMethods::Generic (
+  'scalar'                => [ qw(orderitems) ],
+  'scalar --get_set_init' => [ qw(model) ],
+);
+
+my %sort_columns = (
+  partnumber        => t8('Part Number'),
+  ordnumber         => t8('Order'),
+  customer          => t8('Customer'),
+  transdate         => t8('Date'),
+);
+
+sub action_search {
+
+  my ($self, %params) = @_;
+
+  my $title = t8("Sold order items");
+
+  $::request->layout->use_javascript('client_js.js');
+
+  # The actual loading of orderitems happens in action_order_item_list_dynamic_table
+  # which is processed inside this template and automatically called upon
+  # loading. This causes all filtered orderitems to be displayed,
+  # there is no paginate mechanism or export
+  $self->render('order_items_search/order_items', { layout => 1, process => 1 },
+                                                  title         => $title,
+               );
+}
+
+
+sub action_order_item_list_dynamic_table {
+  my ($self) = @_;
+
+  $self->orderitems( $self->model->get );
+
+
+  $self->add_linked_delivery_order_items;
+
+  $self->render('order_items_search/_order_item_list', { layout  => 0 , process => 1 });
+}
+
+sub add_linked_delivery_order_items {
+  my ($self) = @_;
+
+  my $qty_round = 2;
+
+  foreach my $orderitem ( @{ $self->orderitems } ) {
+    my $dois = $orderitem->linked_delivery_order_items;
+    $orderitem->{deliveryorders} = join('<br>', map { $_->displayable_delivery_order_info($qty_round) } @{$dois});
+  };
+};
+
+sub init_model {
+  my ($self) = @_;
+
+  SL::Controller::Helper::GetModels->new(
+    controller => $self,
+    model      => 'OrderItem',
+    query      => [ SL::DB::Manager::Order->type_filter('sales_order') ],
+    sorted       => {
+      _default     => {
+        by           => 'transdate',
+        dir          => 0,
+      },
+      %sort_columns,
+    } ,
+    with_objects    => [ 'order', 'order.customer', 'part' ],
+  );
+}
+
+sub check_auth {
+  $::auth->assert('sales_order_edit');
+}
+
+1;
+
+__END__
+
+=encoding utf-8
+
+=head1 NAME
+
+SL::Controller::OrderItem - Controller for OrderItems
+
+=head2 OVERVIEW
+
+Controller for quickly finding orderitems in sales orders. For example the
+customer phones you, saying he would like to order another one of the green
+thingies he ordered 2 years ago. You have no idea what he is referring to, but
+you can quickly filter by customer (a customerpicker) and e.g. part description
+or partnumber or order date, successively narrowing down the search. The
+resulting list is updated dynamically after keypresses.
+
+=head1 Usage
+
+Certain fields can be preset by passing them as get parameters in the URL, so
+you could create links to this report:
+
+ controller.pl?action=OrderItem/search&ordnumber=24
+ controller.pl?action=OrderItem/search&customer_id=3455
+
+=head1 TODO AND CAVEATS
+
+=over 4
+
+=item * amount of results is limited
+
+=back
+
+=cut