X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FFile.pm;h=dcf790e5b49769ccd602997e427d0abdc2ab6514;hb=95b5d54bac9dc0cb47c67444c9e19c1d68b0d520;hp=1429912c8af7fb4b059e983229a84c19663cb3e7;hpb=86dcebf00db1421fc5208a1ab407293a18a03e0e;p=kivitendo-erp.git diff --git a/SL/Controller/File.pm b/SL/Controller/File.pm index 1429912c8..dcf790e5b 100644 --- a/SL/Controller/File.pm +++ b/SL/Controller/File.pm @@ -17,6 +17,7 @@ use File::Slurp qw(slurp); use File::Spec::Unix; use File::Spec::Win32; use File::MimeInfo::Magic; +use MIME::Base64; use SL::DB::Helper::Mappings; use SL::DB::Order; use SL::DB::DeliveryOrder; @@ -54,24 +55,27 @@ __PACKAGE__->run_before('check_object_params', only => [ qw(list ajax_delete aja # model: base name of the rose model # right: access right used for import my %file_types = ( - 'sales_quotation' => { gen => 1, gltype => '', dir =>'SalesQuotation', model => 'Order', right => 'import_ar' }, - 'sales_order' => { gen => 5, gltype => '', dir =>'SalesOrder', model => 'Order', right => 'import_ar' }, - 'sales_delivery_order' => { gen => 1, gltype => '', dir =>'SalesDeliveryOrder', model => 'DeliveryOrder', right => 'import_ar' }, - 'invoice' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice', model => 'Invoice', right => 'import_ar' }, - 'credit_note' => { gen => 1, gltype => '', dir =>'CreditNote', model => 'Invoice', right => 'import_ar' }, - 'request_quotation' => { gen => 7, gltype => '', dir =>'RequestForQuotation', model => 'Order', right => 'import_ap' }, - 'purchase_order' => { gen => 7, gltype => '', dir =>'PurchaseOrder', model => 'Order', right => 'import_ap' }, - 'purchase_delivery_order' => { gen => 7, gltype => '', dir =>'PurchaseDeliveryOrder',model => 'DeliveryOrder', right => 'import_ap' }, - 'purchase_invoice' => { gen => 6, gltype => 'ap', dir =>'PurchaseInvoice', model => 'PurchaseInvoice',right => 'import_ap' }, - 'vendor' => { gen => 0, gltype => '', dir =>'Vendor', model => 'Vendor', right => 'xx' }, - 'customer' => { gen => 1, gltype => '', dir =>'Customer', model => 'Customer', right => 'xx' }, - 'part' => { gen => 0, gltype => '', dir =>'Part', model => 'Part', right => 'xx' }, - 'gl_transaction' => { gen => 6, gltype => 'gl', dir =>'GeneralLedger', model => 'GLTransaction', right => 'import_ap' }, - 'draft' => { gen => 0, gltype => '', dir =>'Draft', model => 'Draft', right => 'xx' }, - 'csv_customer' => { gen => 1, gltype => '', dir =>'Reports', model => 'Customer', right => 'xx' }, - 'csv_vendor' => { gen => 1, gltype => '', dir =>'Reports', model => 'Vendor', right => 'xx' }, - 'shop_image' => { gen => 0, gltype => '', dir =>'ShopImages', model => 'Part', right => 'xx' }, - 'letter' => { gen => 7, gltype => '', dir =>'Letter', model => 'Letter', right => 'sales_letter_edit | purchase_letter_edit' }, + 'sales_quotation' => { gen => 1, gltype => '', dir =>'SalesQuotation', model => 'Order', right => 'import_ar' }, + 'sales_order' => { gen => 5, gltype => '', dir =>'SalesOrder', model => 'Order', right => 'import_ar' }, + 'sales_delivery_order' => { gen => 1, gltype => '', dir =>'SalesDeliveryOrder', model => 'DeliveryOrder', right => 'import_ar' }, + 'invoice' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice', model => 'Invoice', right => 'import_ar' }, + 'invoice_for_advance_payment' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice', model => 'Invoice', right => 'import_ar' }, + 'final_invoice' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice', model => 'Invoice', right => 'import_ar' }, + 'credit_note' => { gen => 1, gltype => '', dir =>'CreditNote', model => 'Invoice', right => 'import_ar' }, + 'request_quotation' => { gen => 7, gltype => '', dir =>'RequestForQuotation', model => 'Order', right => 'import_ap' }, + 'purchase_order' => { gen => 7, gltype => '', dir =>'PurchaseOrder', model => 'Order', right => 'import_ap' }, + 'purchase_delivery_order' => { gen => 7, gltype => '', dir =>'PurchaseDeliveryOrder',model => 'DeliveryOrder', right => 'import_ap' }, + 'purchase_invoice' => { gen => 6, gltype => 'ap', dir =>'PurchaseInvoice', model => 'PurchaseInvoice',right => 'import_ap' }, + 'vendor' => { gen => 0, gltype => '', dir =>'Vendor', model => 'Vendor', right => 'xx' }, + 'customer' => { gen => 1, gltype => '', dir =>'Customer', model => 'Customer', right => 'xx' }, + 'project' => { gen => 0, gltype => '', dir =>'Project', model => 'Project', right => 'xx' }, + 'part' => { gen => 0, gltype => '', dir =>'Part', model => 'Part', right => 'xx' }, + 'gl_transaction' => { gen => 6, gltype => 'gl', dir =>'GeneralLedger', model => 'GLTransaction', right => 'import_ap' }, + 'draft' => { gen => 0, gltype => '', dir =>'Draft', model => 'Draft', right => 'xx' }, + 'csv_customer' => { gen => 1, gltype => '', dir =>'Reports', model => 'Customer', right => 'xx' }, + 'csv_vendor' => { gen => 1, gltype => '', dir =>'Reports', model => 'Vendor', right => 'xx' }, + 'shop_image' => { gen => 0, gltype => '', dir =>'ShopImages', model => 'Part', right => 'xx' }, + 'letter' => { gen => 7, gltype => '', dir =>'Letter', model => 'Letter', right => 'sales_letter_edit | purchase_letter_edit' }, ); #--- 4 locale ---# @@ -298,7 +302,10 @@ sub action_ajax_files_uploaded { sub action_download { my ($self) = @_; - my ($id, $version) = split /_/, $::form->{id}; + + my $id = $::form->{id}; + my $version = $::form->{version}; + my $file = SL::File->get(id => $id ); $file->version($version) if $version; my $ref = $file->get_content; @@ -310,6 +317,26 @@ sub action_download { } } +sub action_ajax_get_thumbnail { + my ($self) = @_; + + my $id = $::form->{file_id}; + my $version = $::form->{file_version}; + my $file = SL::File->get(id => $id); + + $file->version($version) if $version; + + my $thumbnail = _create_thumbnail($file, $::form->{size}); + + my $overlay_selector = '#enlarged_thumb_' . $id; + $overlay_selector .= '_' . $version if $version; + $self->js + ->attr($overlay_selector, 'src', 'data:' . $thumbnail->{thumbnail_img_content_type} . ';base64,' . MIME::Base64::encode_base64($thumbnail->{thumbnail_img_content})) + ->data($overlay_selector, 'is-overlay-loaded', '1') + ->render; +} + + # # filters # @@ -381,7 +408,7 @@ sub _do_list { if ( $self->file_type eq 'document' ) { my @object_types; push @object_types, $self->object_type; - push @object_types, qw(dunning dunning1 dunning2 dunning3) if $self->object_type eq 'invoice'; # hardcoded object types? + push @object_types, qw(dunning1 dunning2 dunning3 dunning_invoice dunning_orig_invoice) if $self->object_type eq 'invoice'; # hardcoded object types? @files = SL::File->get_all_versions(object_id => $self->object_id, object_type => \@object_types, file_type => $self->file_type, @@ -609,7 +636,9 @@ sub _get_sources { # ignores all errros # todo: cache thumbs? sub _create_thumbnail { - my ($file) = @_; + my ($file, $size) = @_; + + $size //= 64; my $filename; if (!eval { $filename = $file->get_file(); 1; }) { @@ -621,7 +650,7 @@ sub _create_thumbnail { # Maybe use mime info stored in db? my $mime_type = File::MimeInfo::Magic::magic($filename); if ($mime_type =~ m{pdf}) { - $filename = _convert_pdf_to_png($filename); + $filename = _convert_pdf_to_png($filename, size => $size); } return if !$filename; @@ -632,7 +661,7 @@ sub _create_thumbnail { } my $ret; - if (!eval { $ret = file_probe_type($content); 1; }) { + if (!eval { $ret = file_probe_type($content, size => $size); 1; }) { $::lxdebug->message(LXDebug::WARN(), "SL::File::_create_thumbnail file_probe_type failed: " . $EVAL_ERROR); return; } @@ -648,11 +677,16 @@ sub _create_thumbnail { } sub _convert_pdf_to_png { - my ($filename) = @_; - - my $sfile = SL::SessionFile::Random->new(); + my ($filename, %params) = @_; - my $command = 'pdftoppm -singlefile -scale-to 64 -png' . ' ' . $filename . ' ' . $sfile->file_name; + my $size = $params{size} // 64; + my $sfile = SL::SessionFile::Random->new(); + unless (-f $filename) { + $::lxdebug->message(LXDebug::WARN(), "_convert_pdf_to_png failed, no file found: $filename"); + return; + } + # quotemeta for storno case "storno\ zu\ 1020" *nix only + my $command = 'pdftoppm -singlefile -scale-to ' . $size . ' -png' . ' ' . quotemeta($filename) . ' ' . $sfile->file_name; if (system($command) == -1) { $::lxdebug->message(LXDebug::WARN(), "SL::File::_convert_pdf_to_png: system call failed: " . $ERRNO); @@ -660,6 +694,7 @@ sub _convert_pdf_to_png { } if ($CHILD_ERROR) { $::lxdebug->message(LXDebug::WARN(), "SL::File::_convert_pdf_to_png: pdftoppm failed with error code: " . ($CHILD_ERROR >> 8)); + $::lxdebug->message(LXDebug::WARN(), "SL::File::_convert_pdf_to_png: File: $filename"); return; }