X-Git-Url: http://wagnertech.de/git?p=kivitendo-erp.git;a=blobdiff_plain;f=SL%2FController%2FDownloadZip.pm;fp=SL%2FController%2FDownloadZip.pm;h=33514c4a7e0b106e2ea6b672efd3e0186837e1b0;hp=0000000000000000000000000000000000000000;hb=53593baa211863fbf66540cf1bcc36c8fb37257f;hpb=deb4d2dbb676d7d6f69dfe7815d6e0cb09bd4a44 diff --git a/SL/Controller/DownloadZip.pm b/SL/Controller/DownloadZip.pm new file mode 100644 index 000000000..33514c4a7 --- /dev/null +++ b/SL/Controller/DownloadZip.pm @@ -0,0 +1,131 @@ +package SL::Controller::DownloadZip; + +use strict; + +use parent qw(SL::Controller::Base); + +use List::Util qw(first max); + +use utf8; +use Encode qw(decode encode); +use Archive::Zip; +use SL::File; +use SL::SessionFile::Random; + +sub action_download_orderitems_files { + my ($self) = @_; + + # + # special case for customer which want to have not all + # in kivitendo.conf some regex may be defined: + # For no values just let it commented out + # PA = Produktionsauftrag, L = Lieferschein, ML = Materialliste + # If you want several options, please separate the letter with '|'. Example: '^(PA|L).*' + #set_sales_documenttype_for_delivered_quantity = '^(LS).*' + #set_purchase_documenttype_for_delivered_quantity = '^(EL).*' + # + # enbale this perl code: + # my $doctype = $::lx_office_conf{system}->{"set_documenttype_for_part_zip_download"}; + # if ( $doctype ) { + # # eliminate first and last char (are quotes) + # $doctype =~ s/^.//; + # $doctype =~ s/.$//; + # } + + #$Archive::Zip::UNICODE = 1; + + my $object_id = $::form->{object_id}; + my $object_type = $::form->{object_type}; + my $element_type = $::form->{element_type}; + my $sfile = SL::SessionFile::Random->new(mode => "w"); + my $zip = Archive::Zip->new(); + #TODO Check client encoding !! + #my $name_encoding = 'cp850'; + my $name_encoding = 'UTF-8'; + + if ( $object_id + && ($object_type =~ m{^(?:sales_order|purchase_order|sales_quotation|request_quotation)$}) + && ($element_type eq 'part')) { + my $orderitems = SL::DB::Manager::OrderItem->get_all(query => ['order.id' => $object_id ], + with_objects => [ 'order', 'part' ], + sort_by => 'part.partnumber ASC'); + foreach my $item ( @{$orderitems} ) { + my @files = SL::File->get_all(object_id => $item->parts_id, + object_type => $element_type, + ); + next unless @files; + + $zip->addDirectory($item->part->partnumber); + $zip->addFile($_->get_file, Encode::encode($name_encoding, $item->part->partnumber . '/' . $_->db_file->file_name)) for @files; + } + } + unless ( $zip->writeToFileNamed($sfile->file_name) == Archive::Zip::AZ_OK ) { + die 'zipfile write error'; + } + $sfile->fh->close; + + return $self->send_file( + $sfile->file_name, + type => 'application/zip', + name => $::form->{zipname}.'.zip', + ); +} + +1; + +__END__ + +=pod + +=encoding utf-8 + +=head1 NAME + +SL::Controller::DownloadZip - controller for download all files from parts of an order in one zip file + +=head2 C + +Some customer want all attached files for the parts of an sales order or sales delivery order in one zip to download. +This is a special method for one customer, so it is moved into an extra controller. +The $Archive::Zip::UNICODE = 1; doesnt work ok +So today the filenames in cp850/DOS format for legacy windows. +To ues it for Linux Clients an additinal effort must be done, +for ex. a link to the same file with an utf-8 name. + +There is also a special javascript method necessary which calles this controller method. +THis method must be inserted into the customer branch: + +=begin text + + ns.downloadOrderitemsAtt = function(type,id) { + var rowcount = $('input[name=rowcount]').val() - 1; + var data = { + action: 'FileManagement/download_zip', + type: type, + object_id: id, + rowcount: rowcount + }; + if ( rowcount == 0 ) { + kivi.display_flash('error', kivi.t8('No articles have been added yet.')); + return false; + } + for (var i = 1; i <= rowcount; i++) { + data['parts_id_'+i] = $('#id_' + i).val(); + }; + $.download("controller.pl", data); + return false; + } + +=end text + +See also L + +=head1 DISCUSSION + +Is this method needed in the master branch ? + +=head1 AUTHOR + +Martin Helmling Emartin.helmling@opendynamic.deE + +=cut