1 package SL::Controller::MassDeliveryOrderPrint;
 
   5 use parent qw(SL::Controller::Base);
 
   9 use List::MoreUtils qw(uniq);
 
  10 use List::Util qw(first);
 
  12 use SL::Controller::Helper::GetModels;
 
  13 use SL::BackgroundJob::MassDeliveryOrderPrinting;
 
  15 use SL::DB::DeliveryOrder;
 
  19 use SL::Helper::MassPrintCreatePDF qw(:all);
 
  20 use SL::Helper::CreatePDF qw(:all);
 
  21 use SL::Helper::PrintOptions;
 
  22 use SL::Helper::Flash;
 
  23 use SL::Locale::String;
 
  25 use SL::System::TaskServer;
 
  27 use Rose::Object::MakeMethods::Generic
 
  29   'scalar --get_set_init' => [ qw(delivery_order_models delivery_order_ids printers filter_summary temp_files) ],
 
  32 __PACKAGE__->run_before('setup');
 
  37 sub action_list_delivery_orders {
 
  40   my $show = ($::form->{noshow}?0:1);
 
  41   delete $::form->{noshow};
 
  44     my $key = 'MassDeliveryOrderPrint::ids-' . $::form->{ids};
 
  45     $self->delivery_order_ids($::auth->get_session_value($key) || []);
 
  46     $self->delivery_order_models->add_additional_url_params(ids => $::form->{ids});
 
  49   my %selected_ids = map { +($_ => 1) } @{ $self->delivery_order_ids };
 
  51   my $pr = SL::DB::Manager::Printer->find_by(
 
  52       printer_description => $::locale->text("sales_delivery_order_printer"));
 
  54       $::form->{printer_id} = $pr->id;
 
  56   $self->render('mass_delivery_order_print/list_delivery_orders',
 
  57                 title        => $::locale->text('Print delivery orders'),
 
  59                 print_opt    => $self->print_options(hide_language_id => 1),
 
  60                 selected_ids => \%selected_ids);
 
  63 sub action_mass_mdo_download {
 
  65   my $job    = SL::DB::BackgroundJob->new(id => $::form->{job_id})->load;
 
  67   my $sfile  = SL::SessionFile->new($job->data_as_hash->{pdf_file_name}, mode => 'r');
 
  68   die $! if !$sfile->fh;
 
  70   my $merged_pdf = do { local $/; my $fh = $sfile->fh; <$fh> };
 
  73   my $file_name =  t8('Sales Delivery Orders') . '-' . DateTime->now_local->strftime('%Y%m%d%H%M%S') . '.pdf';
 
  74   $file_name    =~ s{[^\w\.]+}{_}g;
 
  76   return $self->send_file(
 
  78     type => 'application/pdf',
 
  83 sub action_mass_mdo_status {
 
  85   $::lxdebug->enter_sub();
 
  87     my $job = SL::DB::BackgroundJob->new(id => $::form->{job_id})->load;
 
  88     my $html = $self->render('mass_delivery_order_print/_print_status', { output => 0 }, job => $job);
 
  90     $self->js->html('#mass_print_dialog', $html);
 
  91     if ( $job->data_as_hash->{status} == SL::BackgroundJob::MassDeliveryOrderPrinting->DONE() ) {
 
  92       foreach my $dorder_id (@{$job->data_as_hash->{record_ids}}) {
 
  93         $self->js->prop('#multi_id_id_'.$dorder_id,'checked',0);
 
  95       $self->js->prop('#multi_all','checked',0);
 
  96       $self->js->run('kivi.MassDeliveryOrderPrint.massConversionFinished');
 
 100     $self->js->run('kivi.MassDeliveryOrderPrint.massConversionFinished')
 
 101       ->run('kivi.MassDeliveryOrderPrint.massConversionFinishProcess')
 
 102       ->flash('error', t8('No such job #1 in the database.',$::form->{job_id}));
 
 106   $::lxdebug->leave_sub();
 
 109 sub action_mass_mdo_print {
 
 111   $::lxdebug->enter_sub();
 
 114     my @do_ids = @{ $::form->{id} || [] };
 
 115     push @do_ids, map { $::form->{"trans_id_$_"} } grep { $::form->{"multi_id_$_"} } (1..$::form->{rowcount});
 
 117     my @delivery_orders = map { SL::DB::DeliveryOrder->new(id => $_)->load } @do_ids;
 
 119     if (!@delivery_orders) {
 
 120       $self->js->flash('error', t8('No delivery orders have been selected.'));
 
 122       my $job              = SL::DB::BackgroundJob->new(
 
 125         package_name       => 'MassDeliveryOrderPrinting',
 
 128         record_ids         => [ @do_ids ],
 
 129         printer_id         => $::form->{printer_id},
 
 130         formname           => $::form->{formname},
 
 131         format             => $::form->{format},
 
 132         media              => $::form->{media},
 
 133         bothsided          => ($::form->{bothsided}?1:0),
 
 134         copies             => $::form->{copies},
 
 135         status             => SL::BackgroundJob::MassDeliveryOrderPrinting->WAITING_FOR_EXECUTION(),
 
 139         conversion_errors  => [ ],
 
 141         session_id         => $::auth->get_session_id,
 
 143       )->update_next_run_at;
 
 145       SL::System::TaskServer->new->wake_up;
 
 146       my $html = $self->render('mass_delivery_order_print/_print_status', { output => 0 }, job => $job);
 
 149         ->html('#mass_print_dialog', $html)
 
 150         ->run('kivi.MassDeliveryOrderPrint.massConversionPopup')
 
 151         ->run('kivi.MassDeliveryOrderPrint.massConversionStarted');
 
 156     my $htmlstr = $errstr;
 
 157     $htmlstr =~ s/\n/<br>/g;
 
 158     $self->js->flash('error', t8('Document generating failed. Please check Templates an LateX !'));
 
 159     $self->js->flash_detail('error', $htmlstr);
 
 162   $::lxdebug->leave_sub();
 
 165 sub action_downloadpdf {
 
 167   $::lxdebug->enter_sub();
 
 168   if ( $::form->{filename} ) {
 
 169     my $content = scalar File::Slurp::read_file($::form->{filename});
 
 170     my $file_name = $::form->get_formname_translation($::form->{formname}) .
 
 171       '-' . DateTime->now_local->strftime('%Y%m%d%H%M%S') . '.pdf';
 
 172     $file_name    =~ s{[^\w\.]+}{_}g;
 
 174     unlink($::form->{filename});
 
 176     return $self->send_file(
 
 178       type => 'application/pdf',
 
 182     flash('error', t8('No filename exists!'));
 
 184   $::lxdebug->leave_sub();
 
 191 sub init_printers { SL::DB::Manager::Printer->get_all_sorted }
 
 192 sub init_delivery_order_ids { [] }
 
 193 sub init_temp_files { [] }
 
 195 sub init_delivery_order_models {
 
 197   my @delivery_order_ids = @{ $self->delivery_order_ids };
 
 199   SL::Controller::Helper::GetModels->new(
 
 201     model        => 'DeliveryOrder',
 
 202     (paginated   => 0,) x !!@delivery_order_ids,
 
 208       customer     => t8('Customer'),
 
 209       donumber     => t8('Delivery Order Number'),
 
 210       employee     => t8('Employee'),
 
 211       ordnumber    => t8('Order Number'),
 
 212       reqdate      => t8('Delivery Date'),
 
 213       transdate    => t8('Date'),
 
 215     with_objects => [ qw(customer employee) ],
 
 217       '!customer_id' => undef,
 
 218       or             => [ closed    => undef, closed    => 0 ],
 
 219       (id            => \@delivery_order_ids) x !!@delivery_order_ids,
 
 224 sub init_filter_summary {
 
 226   my $filter = $::form->{filter} || { customer => {}, shipto => {}, };
 
 229   push @filters, t8('Customer')                              . ' ' . $filter->{customer}->{'name:substr::ilike'}     if $filter->{customer}->{'name:substr::ilike'};
 
 230   push @filters, t8('Shipping address (name)')               . ' ' . $filter->{shipto}->{'shiptoname:substr::ilike'} if $filter->{shipto}->{'shiptoname:substr::ilike'};
 
 231   push @filters, t8('Delivery Date') . ' ' . t8('From Date') . ' ' . $filter->{'reqdate:date::ge'}                   if $filter->{'reqdate:date::ge'};
 
 232   push @filters, t8('Delivery Date') . ' ' . t8('To Date')   . ' ' . $filter->{'reqdate:date::le'}                   if $filter->{'reqdate:date::le'};
 
 234   return join ', ', @filters;
 
 239   $::auth->assert('sales_delivery_order_edit');
 
 240   $::request->layout->use_javascript("${_}.js")  for qw(kivi.MassDeliveryOrderPrint);
 
 244 sub generate_documents {
 
 245   my ($self, @delivery_orders) = @_;
 
 248     'documents'       => \@delivery_orders ,
 
 250       'type'            => $::form->{type},
 
 251       'formname'        => $::form->{formname},
 
 255       'printer_id'      => $::form->{printer_id},
 
 258   my ($temp_fh, $outname) = File::Temp::tempfile(
 
 259     'kivitendo-outfileXXXXXX',
 
 261     DIR    => $::lx_office_conf{paths}->{userspath},
 
 266   my @pdf_file_names = $self->create_pdfs(%pdf_params);
 
 267   my $fcount = scalar(@pdf_file_names);
 
 269     copy($pdf_file_names[0],$outname);
 
 271     if ( !$self->merge_pdfs(file_names => \@pdf_file_names, out_path => $outname, bothsided => $::form->{bothsided} )) {
 
 272       $::lxdebug->leave_sub();
 
 276   foreach my $dorder (@delivery_orders) {
 
 277     $self->js->prop('#multi_id_id_'.$dorder->id,'checked',0);
 
 279   $self->js->prop('#multi_all','checked',0);