Artikel-Klassifizierung
[kivitendo-erp.git] / bin / mozilla / wh.pl
index 15f58fc..66594ff 100644 (file)
@@ -67,6 +67,7 @@ use strict;
 #  $locale->text('used')
 #  $locale->text('return_material')
 #  $locale->text('release_material')
+#  $locale->text('assembled')
 
 # --------------------------------------------------------------------
 # Transfer
@@ -289,7 +290,7 @@ sub transfer_parts {
 
   if (!scalar @transfers) {
     $form->show_generic_information($locale->text('Nothing has been selected for transfer.'));
-    ::end_of_request();
+    $::dispatcher->end_request;
   }
 
   WH->transfer(@transfers);
@@ -455,7 +456,7 @@ sub create_assembly {
   # Anm. jb 18.3. vielleicht auch nur meine unwissenheit in perl-datenstrukturen
   my %TRANSFER = (
     'transfer_type'    => 'assembly',
-    'login'            => $form->{login},
+    'login'            => $::myconfig{login},
     'dst_warehouse_id' => $form->{warehouse_id},
     'dst_bin_id'       => $form->{bin_id},
     'chargenumber'     => $form->{chargenumber},
@@ -623,7 +624,7 @@ sub remove_parts {
 
   if (!scalar @transfers) {
     $form->show_generic_information($locale->text('Nothing has been selected for removal.'));
-    ::end_of_request();
+    $::dispatcher->end_request;
   }
 
   WH->transfer(@transfers);
@@ -673,11 +674,13 @@ sub generate_journal {
   $form->{title}   = $locale->text("WHJournal");
   $form->{sort}  ||= 'date';
 
+  $form->{report_generator_output_format} = 'HTML' if !$form->{report_generator_output_format};
+
   my %filter;
-  my @columns = qw(trans_id date warehouse_from bin_from warehouse_to bin_to partnumber partdescription chargenumber bestbefore trans_type comment qty employee oe_id projectnumber);
+  my @columns = qw(trans_id date warehouse_from bin_from warehouse_to bin_to partnumber type_and_classific partdescription chargenumber bestbefore trans_type comment qty unit partunit employee oe_id projectnumber);
 
   # filter stuff
-  map { $filter{$_} = $form->{$_} if ($form->{$_}) } qw(warehouse_id bin_id partnumber description chargenumber bestbefore);
+  map { $filter{$_} = $form->{$_} if ($form->{$_}) } qw(warehouse_id bin_id classification_id partnumber description chargenumber bestbefore);
 
   $filter{qty_op} = WH->convert_qty_op($form->{qty_op});
   if ($filter{qty_op}) {
@@ -693,6 +696,7 @@ sub generate_journal {
 
   my @hidden_variables = map { "l_${_}" } @columns;
   push @hidden_variables, qw(warehouse_id bin_id partnumber description chargenumber bestbefore qty_op qty qty_unit fromdate todate);
+  push @hidden_variables, qw(classification_id);
 
   my %column_defs = (
     'date'            => { 'text' => $locale->text('Date'), },
@@ -704,21 +708,28 @@ sub generate_journal {
     'bin_from'        => { 'text' => $locale->text('Bin From'), },
     'bin_to'          => { 'text' => $locale->text('Bin To'), },
     'partnumber'      => { 'text' => $locale->text('Part Number'), },
+    'type_and_classific'
+                      => { 'text' => $locale->text('Type'), },
     'partdescription' => { 'text' => $locale->text('Part Description'), },
     'chargenumber'    => { 'text' => $locale->text('Charge Number'), },
     'bestbefore'      => { 'text' => $locale->text('Best Before'), },
     'qty'             => { 'text' => $locale->text('Qty'), },
+    'unit'            => { 'text' => $locale->text('Part Unit'), },
+    'partunit'        => { 'text' => $locale->text('Unit'), },
     'employee'        => { 'text' => $locale->text('Employee'), },
     'projectnumber'   => { 'text' => $locale->text('Project Number'), },
     'oe_id'           => { 'text' => $locale->text('Document'), },
   );
 
   my $href = build_std_url('action=generate_journal', grep { $form->{$_} } @hidden_variables);
-  map { $column_defs{$_}->{link} = $href . "&sort=${_}&order=" . Q($_ eq $form->{sort} ? 1 - $form->{order} : $form->{order}) } @columns;
+  my $page = $::form->{page} || 1;
+  map { $column_defs{$_}->{link} = $href ."&page=".$page. "&sort=${_}&order=" . Q($_ eq $form->{sort} ? 1 - $form->{order} : $form->{order}) } @columns;
 
   my %column_alignment = map { $_ => 'right' } qw(qty);
 
   map { $column_defs{$_}->{visible} = $form->{"l_${_}"} ? 1 : 0 } @columns;
+  $column_defs{type_and_classific}->{visible} = 1;
+  $column_defs{type_and_classific}->{link} ='';
 
   $report->set_columns(%column_defs);
   $report->set_column_order(@columns);
@@ -746,7 +757,20 @@ sub generate_journal {
                     'purchase_invoice'        => { script => 'ir', title => $locale->text('Purchase Invoice') },
                   );
 
+   my $allrows = 0;
+   $allrows = 1 if $form->{report_generator_output_format} ne 'HTML' ;
+
+   # manual paginating
+   my $pages = {};
+   $pages->{per_page}        = $::form->{per_page} || 15;
+   my $first_nr = ($page - 1) * $pages->{per_page};
+   my $last_nr  = $first_nr + $pages->{per_page};
+   my $idx       = 0;
+
   foreach my $entry (@contents) {
+    # type impl $entry->{type_and_classific} = $::request->presenter->type_abbreviation($entry->{type}).
+    $entry->{type_and_classific} = $::request->presenter->type_abbreviation($entry->{assembly},$entry->{inventory_accno_id}).
+                                   $::request->presenter->classification_abbreviation($entry->{classification_id});
     $entry->{qty}        = $form->format_amount_units('amount'     => $entry->{qty},
                                                       'part_unit'  => $entry->{partunit},
                                                       'conv_units' => 'convertible');
@@ -773,9 +797,20 @@ sub generate_journal {
       }
     }
 
-    $report->add_data($row);
+    if ( $allrows || ($idx >= $first_nr && $idx < $last_nr )) {
+       $report->add_data($row);
+    }
+    $idx++;
   }
 
+  if ( ! $allrows ) {
+      $pages->{max}  = SL::DB::Helper::Paginated::ceil($idx, $pages->{per_page}) || 1;
+      $pages->{page} = $page < 1 ? 1: $page > $pages->{max} ? $pages->{max}: $page;
+      $pages->{common} = [ grep { $_->{visible} } @{ SL::DB::Helper::Paginated::make_common_pages($pages->{page}, $pages->{max}) } ];
+
+      $report->set_options('raw_bottom_info_text' => $form->parse_html_template('common/paginate',
+                                                            { 'pages' => $pages , 'base_url' => $href}) );
+  }
   $report->generate_with_headers();
 
   $main::lxdebug->leave_sub();
@@ -821,28 +856,39 @@ sub generate_report {
 
   $form->{title}   = $locale->text("Report about warehouse contents");
   $form->{sort}  ||= 'partnumber';
+  $form->{sort}  ||= 'partunit';
   my $sort_col     = $form->{sort};
 
   my %filter;
-  my @columns = qw(warehousedescription bindescription partnumber partdescription chargenumber bestbefore qty stock_value);
+  my @columns = qw(warehousedescription bindescription partnumber type_and_classific partdescription chargenumber bestbefore comment qty partunit stock_value);
 
   # filter stuff
-  map { $filter{$_} = $form->{$_} if ($form->{$_}) } qw(warehouse_id bin_id partnumber description chargenumber bestbefore date include_invalid_warehouses);
+  map { $filter{$_} = $form->{$_} if ($form->{$_}) } qw(warehouse_id bin_id classification_id partnumber description chargenumber bestbefore date include_invalid_warehouses);
 
   # show filter stuff also in report
   my @options;
+  my $currentdate = $form->current_date(\%myconfig);
+  push @options, $locale->text('Printdate') . " : ".$locale->date(\%myconfig, $currentdate, 1);
+
   # dispatch all options
   my $dispatch_options = {
-   partnumber     => sub { push @options, $locale->text('Partnumber') . " : $form->{partnumber}"},
-   description    => sub { push @options, $locale->text('Description') . " : $form->{description}"},
-   chargenumber   => sub { push @options, $locale->text('Charge Number') . " : $form->{chargenumber}"},
-   bestbefore     => sub { push @options, $locale->text('Best Before') . " : $form->{bestbefore}"},
-   date           => sub { push @options, $locale->text('Date') . " : $form->{date}"},
+   warehouse_id   => sub { push @options, $locale->text('Warehouse') . " : " .
+                                            SL::DB::Manager::Warehouse->find_by(id => $form->{warehouse_id})->description},
+   bin_id         => sub { push @options, $locale->text('Bin') . " : " .
+                                            SL::DB::Manager::Bin->find_by(id => $form->{bin_id})->description},
+   partnumber     => sub { push @options, $locale->text('Partnumber')     . " : $form->{partnumber}"},
+   classification_id => sub { push @options, $locale->text('Parts Classification'). " : ".
+     SL::DB::Manager::PartsClassification->get_first(where => [ id => $form->{classification_id} ] )->description; },
+   description    => sub { push @options, $locale->text('Description')    . " : $form->{description}"},
+   chargenumber   => sub { push @options, $locale->text('Charge Number')  . " : $form->{chargenumber}"},
+   bestbefore     => sub { push @options, $locale->text('Best Before')    . " : $form->{bestbefore}"},
    include_invalid_warehouses    => sub { push @options, $locale->text('Include invalid warehouses ')},
   };
   foreach (keys %filter) {
-    defined $dispatch_options->{$_}  && $dispatch_options->{$_}->();
+   $dispatch_options->{$_}->() if $dispatch_options->{$_};
   }
+  push @options, $locale->text('Stock Qty for Date') . " " . $locale->date(\%myconfig, $form->{date}?$form->{date}:$currentdate, 1);
+
   # / end show filter stuff also in report
 
   $filter{qty_op} = WH->convert_qty_op($form->{qty_op});
@@ -857,30 +903,38 @@ sub generate_report {
 
   $form->{subtotal} = '' if (!first { $_ eq $sort_col } qw(partnumber partdescription));
 
+  $form->{report_generator_output_format} = 'HTML' if !$form->{report_generator_output_format};
   my $report = SL::ReportGenerator->new(\%myconfig, $form);
 
   my @hidden_variables = map { "l_${_}" } @columns;
-  push @hidden_variables, qw(warehouse_id bin_id partnumber description chargenumber bestbefore qty_op qty qty_unit l_warehousedescription l_bindescription);
+  push @hidden_variables, qw(warehouse_id bin_id partnumber partstypes_id description chargenumber bestbefore qty_op qty qty_unit partunit l_warehousedescription l_bindescription);
   push @hidden_variables, qw(include_empty_bins subtotal include_invalid_warehouses date);
+  push @hidden_variables, qw(classification_id);
 
   my %column_defs = (
     'warehousedescription' => { 'text' => $locale->text('Warehouse'), },
     'bindescription'       => { 'text' => $locale->text('Bin'), },
     'partnumber'           => { 'text' => $locale->text('Part Number'), },
+    'type_and_classific'   => { 'text' => $locale->text('Type'), },
     'partdescription'      => { 'text' => $locale->text('Part Description'), },
     'chargenumber'         => { 'text' => $locale->text('Charge Number'), },
     'bestbefore'           => { 'text' => $locale->text('Best Before'), },
     'qty'                  => { 'text' => $locale->text('Qty'), },
+    'partunit'             => { 'text' => $locale->text('Unit'), },
     'stock_value'          => { 'text' => $locale->text('Stock value'), },
   );
 
   my $href = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables);
-  map { $column_defs{$_}->{link} = $href . "&sort=${_}&order=" . Q($_ eq $sort_col ? 1 - $form->{order} : $form->{order}) } @columns;
+  my $page = $::form->{page} || 1;
+  map { $column_defs{$_}->{link} = $href . "&page=".$page."&sort=${_}&order=" . Q($_ eq $sort_col ? 1 - $form->{order} : $form->{order}) } @columns;
 
   my %column_alignment = map { $_ => 'right' } qw(qty stock_value);
 
   map { $column_defs{$_}->{visible} = $form->{"l_${_}"} ? 1 : 0 } @columns;
 
+  $column_defs{type_and_classific}->{visible} = 1;
+  $column_defs{type_and_classific}->{link} ='';
+
   $report->set_columns(%column_defs);
   $report->set_column_order(@columns);
 
@@ -905,13 +959,26 @@ sub generate_report {
 
   my $total_stock_value = 0;
 
+  my $allrows = 0;
+  $allrows = 1 if $form->{report_generator_output_format} ne 'HTML' ;
+
+  # manual paginating
+  my $pages = {};
+  $pages->{per_page}        = $::form->{per_page} || 20;
+  my $first_nr = ($page - 1) * $pages->{per_page};
+  my $last_nr  = $first_nr + $pages->{per_page};
+
   foreach my $entry (@contents) {
+
+    # type impl $entry->{type_and_classific} = $::request->presenter->type_abbreviation($entry->{type}).
+    $entry->{type_and_classific} = $::request->presenter->type_abbreviation($entry->{assembly},$entry->{inventory_accno_id}).
+                                   $::request->presenter->classification_abbreviation($entry->{classification_id});
     map { $subtotals{$_} += $entry->{$_} } @subtotals_columns;
     $total_stock_value   += $entry->{stock_value} * 1;
-
-    $entry->{qty}         = $form->format_amount_units('amount'     => $entry->{qty},
-                                                       'part_unit'  => $entry->{partunit},
-                                                       'conv_units' => 'convertible');
+    $entry->{qty}         = $form->format_amount(\%myconfig, $entry->{qty});
+#    $entry->{qty}         = $form->format_amount_units('amount'     => $entry->{qty},
+#                                                       'part_unit'  => $entry->{partunit},
+#                                                       'conv_units' => 'convertible');
     $entry->{stock_value} = $form->format_amount(\%myconfig, $entry->{stock_value} * 1, 2);
 
     my $row_set = [ { map { $_ => { 'data' => $entry->{$_}, 'align' => $column_alignment{$_} } } @columns } ];
@@ -921,9 +988,10 @@ sub generate_report {
             || ($entry->{$sort_col} ne $contents[$idx + 1]->{$sort_col}))) {
 
       my $row = { map { $_ => { 'data' => '', 'class' => 'listsubtotal', 'align' => $column_alignment{$_}, } } @columns };
-      $row->{qty}->{data}         = $form->format_amount_units('amount'     => $subtotals{qty} * 1,
-                                                               'part_unit'  => $entry->{partunit},
-                                                               'conv_units' => 'convertible');
+      $row->{qty}->{data}         = $form->format_amount(\%myconfig, $subtotals{qty});
+#      $row->{qty}->{data}         = $form->format_amount_units('amount'     => $subtotals{qty} * 1,
+#                                                               'part_unit'  => $entry->{partunit},
+#                                                               'conv_units' => 'convertible');
       $row->{stock_value}->{data} = $form->format_amount(\%myconfig, $subtotals{stock_value} * 1, 2);
 
       %subtotals                  = map { $_ => 0 } @subtotals_columns;
@@ -931,8 +999,9 @@ sub generate_report {
       push @{ $row_set }, $row;
     }
 
-    $report->add_data($row_set);
-
+    if ( $allrows || ($idx >= $first_nr && $idx < $last_nr )) {
+      $report->add_data($row_set);
+    }
     $idx++;
   }
 
@@ -968,7 +1037,7 @@ sub show_no_warehouses_error {
 
   my $msg = $locale->text('No warehouse has been created yet or the quantity of the bins is not configured yet.') . ' ';
 
-  if ($main::auth->check_right($form->{login}, 'config')) {
+  if ($main::auth->check_right($::myconfig{login}, 'config')) {
     $msg .= $locale->text('You can create warehouses and bins via the menu "System -> Warehouses".');
   } else {
     $msg .= $locale->text('Please ask your administrator to create warehouses and bins.');