X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDN.pm;h=a4eb1276929f770110fdbae3b276e3f93ae6735b;hb=a386ea48944a5fff408862f5c6622ddfd5cde736;hp=9016aaad470740af1360c645eb3c01324357e7d7;hpb=edff34950b489a16a8d49d7d583479e23cb5d6c7;p=kivitendo-erp.git diff --git a/SL/DN.pm b/SL/DN.pm index 9016aaad4..a4eb12769 100644 --- a/SL/DN.pm +++ b/SL/DN.pm @@ -317,8 +317,18 @@ sub save_dunning { my ($self, $myconfig, $form, $rows) = @_; $main::lxdebug->enter_sub(); + $form->{DUNNING_PDFS_STORAGE} = []; + my $rc = SL::DB->client->with_transaction(\&_save_dunning, $self, $myconfig, $form, $rows); + # Save PDFs in filemanagement and webdav after transation succeeded, + # because otherwise files in the storage may exists if the transaction + # failed. Ignore all errros. + # Todo: Maybe catch errros and display them as warnings or non fatal errors in the status. + if (!$error && $form->{DUNNING_PDFS_STORAGE} && scalar @{ $form->{DUNNING_PDFS_STORAGE} }) { + _store_pdf_to_webdav_and_filemanagement($_->{dunning_id}, $_->{path}, $_->{name}) for @{ $form->{DUNNING_PDFS_STORAGE} }; + } + if (!$rc) { die SL::DB->client->error } @@ -418,7 +428,7 @@ sub _save_dunning { $self->print_dunning($myconfig, $form, $dunning_id, $dbh); if ($print_invoice) { - $self->print_original_invoice($myconfig, $form, $_) for @invoice_ids; + $self->print_original_invoice($myconfig, $form, $dunning_id, $_) for @invoice_ids; } if ($send_email) { @@ -727,6 +737,11 @@ sub get_dunning { push(@values, like($form->{$key})); } + if ($form->{dunning_id}) { + $where .= qq| AND da.dunning_id = ?|; + push(@values, conv_i($form->{dunning_id})); + } + if ($form->{dunning_level}) { $where .= qq| AND a.dunning_config_id = ?|; push(@values, conv_i($form->{dunning_level})); @@ -770,19 +785,20 @@ sub get_dunning { } my %sort_columns = ( - 'dunning_description' => [ qw(dn.dunning_description customername invnumber) ], - 'customername' => [ qw(customername invnumber) ], + 'dunning_description' => [ qw(dn.dunning_description da.dunning_id customername invnumber) ], + 'customername' => [ qw(customername da.dunning_id invnumber) ], 'invnumber' => [ qw(a.invnumber) ], 'transdate' => [ qw(a.transdate a.invnumber) ], 'duedate' => [ qw(a.duedate a.invnumber) ], - 'dunning_date' => [ qw(dunning_date a.invnumber) ], - 'dunning_duedate' => [ qw(dunning_duedate a.invnumber) ], + 'dunning_date' => [ qw(dunning_date da.dunning_id a.invnumber) ], + 'dunning_duedate' => [ qw(dunning_duedate da.dunning_id a.invnumber) ], + 'dunning_id' => [ qw(dunning_id a.invnumber) ], 'salesman' => [ qw(salesman) ], ); my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; my $sortkey = $sort_columns{$form->{sort}} ? $form->{sort} : 'customername'; - my $sortorder = join ', ', map { "$_ $sortdir" } (@{ $sort_columns{$sortkey} }, 'da.dunning_id'); + my $sortorder = join ', ', map { "$_ $sortdir" } @{ $sort_columns{$sortkey} }; my $query = qq|SELECT a.id, a.ordnumber, a.invoice, a.transdate, a.invnumber, a.amount, a.language_id, @@ -833,10 +849,10 @@ sub melt_pdfs { $out = IO::File->new("| $form->{printer_command}"); } - $::locale->with_raw_io($out, sub { $out->print($_) while <$in> }); - $form->error($main::locale->text('Could not spawn the printer command.')) unless $out; + $::locale->with_raw_io($out, sub { $out->print($_) while <$in> }); + } else { my $dunning_filename = $form->get_formname_translation('dunning'); print qq|Content-Type: Application/PDF\n| . @@ -862,7 +878,7 @@ sub print_dunning { $dunning_id =~ s|[^\d]||g; - my ($language_tc, $output_numberformat, $output_dateformat, $output_longdates, @dunned_invoices); + my ($language_tc, $output_numberformat, $output_dateformat, $output_longdates); if ($form->{"language_id"}) { ($language_tc, $output_numberformat, $output_dateformat, $output_longdates) = AM->get_language_details($myconfig, $form, $form->{language_id}); @@ -884,7 +900,7 @@ sub print_dunning { ar.transdate, ar.duedate, ar.customer_id, ar.invnumber, ar.ordnumber, ar.cp_id, ar.amount, ar.netamount, ar.paid, - ar.employee_id, ar.salesman_id, ar.id AS dunned_invoice_id, + ar.employee_id, ar.salesman_id, (SELECT cu.name FROM currencies cu WHERE cu.id = ar.currency_id) AS curr, (SELECT description from department WHERE id = ar.department_id) AS department, ar.amount - ar.paid AS open_amount, @@ -906,7 +922,6 @@ sub print_dunning { map { $ref->{$_} = $form->format_amount($myconfig, $ref->{$_}, 2) } qw(amount netamount paid open_amount fee interest linetotal); map { $form->{$_} = $ref->{$_} } keys %$ref; map { push @{ $form->{TEMPLATE_ARRAYS}->{"dn_$_"} }, $ref->{$_} } keys %$ref; - push @dunned_invoices, {id => $ref->{dunned_invoice_id}, invnumber => $ref->{invnumber}}; } $sth->finish(); @@ -999,9 +1014,12 @@ sub print_dunning { delete $form->{tmpfile}; - push @{ $form->{DUNNING_PDFS} }, $filename; - push @{ $form->{DUNNING_PDFS_EMAIL} }, { 'path' => "${spool}/$filename", - 'name' => $form->get_formname_translation('dunning') . "_${dunning_id}.pdf" }; + push @{ $form->{DUNNING_PDFS} } , $filename; + push @{ $form->{DUNNING_PDFS_EMAIL} } , { 'path' => "${spool}/$filename", + 'name' => $form->get_formname_translation('dunning') . "_${dunning_id}.pdf" }; + push @{ $form->{DUNNING_PDFS_STORAGE} }, { 'dunning_id' => $dunning_id, + 'path' => "${spool}/$filename", + 'name' => $form->get_formname_translation('dunning') . "_${dunning_id}.pdf" }; my $employee_id = ($::instance_conf->get_dunning_creator eq 'invoice_employee') ? $form->{employee_id} : @@ -1020,33 +1038,6 @@ sub print_dunning { # this generates the file in the spool directory $form->parse_template($myconfig); - # save dunning pdf in filemanagement/webdav for each invoice - foreach my $dunned_invoice (@dunned_invoices) { - if ($::instance_conf->get_doc_storage) { - SL::File->save( - object_id => $dunned_invoice->{id}, - object_type => $form->{attachment_type}, - mime_type => 'application/pdf', - source => 'created', - file_type => 'document', - file_name => $form->{attachment_filename}, - file_path => "${spool}/$filename", - ); - } - - if ($::instance_conf->get_webdav_documents) { - my $webdav = SL::Webdav->new( - type => 'invoice', - number => $dunned_invoice->{invnumber}, - ); - my $webdav_file = SL::Webdav::File->new( - webdav => $webdav, - filename => $form->{attachment_filename}, - ); - $webdav_file->store(file => "${spool}/$filename"); - } - } - $main::lxdebug->leave_sub(); } @@ -1144,41 +1135,12 @@ sub print_invoice_for_fees { restore_form($saved_form); - push @{ $form->{DUNNING_PDFS} }, $filename; - push @{ $form->{DUNNING_PDFS_EMAIL} }, { 'path' => "${spool}/$filename", - 'name' => $attachment_filename }; - - # save dunning fee pdf in filemanagement/webdav for each dunned invoice - if ($::instance_conf->get_doc_storage || $::instance_conf->get_webdav_documents) { - $query = qq|SELECT trans_id, invnumber FROM dunning LEFT JOIN ar ON (ar.id = trans_id) WHERE dunning_id = ?|; - my $dunned_invoices = selectall_hashref_query($form, $dbh, $query, $dunning_id); - - foreach my $dunned_invoice (@$dunned_invoices) { - if ($::instance_conf->get_doc_storage) { - SL::File->save( - object_id => $dunned_invoice->{trans_id}, - object_type => 'dunning', - mime_type => 'application/pdf', - source => 'created', - file_type => 'document', - file_name => $attachment_filename, - file_path => "${spool}/$filename", - ); - } - - if ($::instance_conf->get_webdav_documents) { - my $webdav = SL::Webdav->new( - type => 'invoice', - number => $dunned_invoice->{invnumber}, - ); - my $webdav_file = SL::Webdav::File->new( - webdav => $webdav, - filename => $attachment_filename, - ); - $webdav_file->store(file => "${spool}/$filename"); - } - } - } + push @{ $form->{DUNNING_PDFS} }, $filename; + push @{ $form->{DUNNING_PDFS_EMAIL} }, { 'path' => "${spool}/$filename", + 'name' => $attachment_filename }; + push @{ $form->{DUNNING_PDFS_STORAGE} }, { 'dunning_id' => $dunning_id, + 'path' => "${spool}/$filename", + 'name' => $attachment_filename }; $main::lxdebug->leave_sub(); } @@ -1205,7 +1167,7 @@ sub set_customer_cvars { } sub print_original_invoice { - my ($self, $myconfig, $form, $invoice_id) = @_; + my ($self, $myconfig, $form, $dunning_id, $invoice_id) = @_; # get one invoice as object and print to pdf my $invoice = SL::DB::Invoice->new(id => $invoice_id)->load; @@ -1246,36 +1208,56 @@ sub print_original_invoice { my $attachment_filename = $form->get_formname_translation('invoice') . "_" . $invoice->invnumber . ".pdf"; - push @{ $form->{DUNNING_PDFS} }, $file_name; - push @{ $form->{DUNNING_PDFS_EMAIL} }, { 'path' => "${spool}/$file_name", - 'name' => $attachment_filename }; + push @{ $form->{DUNNING_PDFS} }, $file_name; + push @{ $form->{DUNNING_PDFS_EMAIL} }, { 'path' => "${spool}/$file_name", + 'name' => $attachment_filename }; + push @{ $form->{DUNNING_PDFS_STORAGE} }, { 'dunning_id' => $dunning_id, + 'path' => "${spool}/$file_name", + 'name' => $attachment_filename }; $form->{recipient_locale} = $saved_reicpient_locale; +} + +sub _store_pdf_to_webdav_and_filemanagement { + my ($dunning_id, $path, $name) =@_; + + my @errors; - # save original invoice pdf in filemanagement/webdav for dunned invoice if ($::instance_conf->get_doc_storage) { - SL::File->save( - object_id => $invoice_id, - object_type => 'dunning_orig_invoice', - mime_type => 'application/pdf', - source => 'created', - file_type => 'document', - file_name => $attachment_filename, - file_path => "${spool}/$file_name", - ); + eval { + SL::File->save( + object_id => $dunning_id, + object_type => 'dunning', + mime_type => 'application/pdf', + source => 'created', + file_type => 'document', + file_name => $name, + file_path => $path, + ); + 1; + } or do { + push @errors, $::locale->text('Storing PDF in storage backend failed: #1', $@); + }; } + if ($::instance_conf->get_webdav_documents) { - my $webdav = SL::Webdav->new( - type => 'invoice', - number => $invoice->invnumber, - ); - my $webdav_file = SL::Webdav::File->new( - webdav => $webdav, - filename => $attachment_filename, - ); - $webdav_file->store(file => "${spool}/$file_name"); + eval { + my $webdav = SL::Webdav->new( + type => 'dunning', + number => $dunning_id, + ); + my $webdav_file = SL::Webdav::File->new( + webdav => $webdav, + filename => $name, + ); + $webdav_file->store(file => $path); + } or do { + push @errors, $::locale->text('Storing PDF to webdav folder failed: #1', $@); + }; } + return @errors; } + 1;