Jeden DATEV-Export in ein eigenes, eindeutig benanntes Verzeichnis schreiben, damit...
authorMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 5 May 2009 07:42:48 +0000 (07:42 +0000)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 5 May 2009 07:42:48 +0000 (07:42 +0000)
Temporäre Verzeichnisse werden beim nächsten Aufruf gelöscht, sofern sie älter als acht Stunden sind.
Fix für Bug 924.

SL/DATEV.pm
bin/mozilla/datev.pl

index d6dd7c6..d600b20 100644 (file)
@@ -30,6 +30,66 @@ use SL::DBUtils;
 use SL::DATEV::KNEFile;
 
 use Data::Dumper;
+use File::Path;
+use Time::HiRes qw(gettimeofday);
+
+sub _get_export_path {
+  $main::lxdebug->enter_sub();
+
+  my ($a, $b) = gettimeofday();
+  my $path    = get_path_for_download_token("${a}-${b}-${$}");
+
+  mkpath($path) unless (-d $path);
+
+  $main::lxdebug->leave_sub();
+
+  return $path;
+}
+
+sub get_path_for_download_token {
+  $main::lxdebug->enter_sub();
+
+  my $token = shift;
+  my $path;
+
+  if ($token =~ m|^(\d+)-(\d+)-(\d+)$|) {
+    $path = "${main::userspath}/datev-export-${1}-${2}-${3}";
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $path;
+}
+
+sub get_download_token_for_path {
+  $main::lxdebug->enter_sub();
+
+  my $path = shift;
+  my $token;
+
+  if ($path =~ m|.*datev-export-(\d+)-(\d+)-(\d+)/?$|) {
+    $token = "${1}-${2}-${3}";
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $token;
+}
+
+sub clean_temporary_directories {
+  $main::lxdebug->enter_sub();
+
+  foreach my $path (glob "${main::userspath}/datev-export-*") {
+    next unless (-d $path);
+
+    my $mtime = (stat($path))[9];
+    next if ((time() - $mtime) < 8 * 60 * 60);
+
+    rmtree $path;
+  }
+
+  $main::lxdebug->leave_sub();
+}
 
 sub _fill {
   $main::lxdebug->enter_sub();
@@ -109,17 +169,17 @@ sub kne_export {
   $main::lxdebug->enter_sub();
 
   my ($self, $myconfig, $form) = @_;
-  my @rc;
+  my $result;
 
   if ($form->{exporttype} == 0) {
-    @rc = &kne_buchungsexport($myconfig, $form);
+    $result = kne_buchungsexport($myconfig, $form);
   } else {
-    @rc = &kne_stammdatenexport($myconfig, $form);
+    $result = kne_stammdatenexport($myconfig, $form);
   }
 
   $main::lxdebug->leave_sub();
 
-  return @rc;
+  return $result;
 }
 
 sub obe_export {
@@ -560,7 +620,7 @@ sub kne_buchungsexport {
 
   my @filenames;
 
-  my $export_path = $main::userspath . "/";
+  my $export_path = _get_export_path() . "/";
   my $filename    = "ED00000";
   my $evfile      = "EV01";
   my @ed_versionsets;
@@ -724,7 +784,7 @@ sub kne_buchungsexport {
   ###
   $main::lxdebug->leave_sub();
 
-  return @filenames;
+  return { 'download_token' => get_download_token_for_path($export_path), 'filenames' => \@filenames };
 }
 
 sub kne_stammdatenexport {
@@ -741,7 +801,7 @@ sub kne_stammdatenexport {
 
   my @filenames;
 
-  my $export_path = $main::userspath . "/";
+  my $export_path = _get_export_path() . "/";
   my $filename    = "ED00000";
   my $evfile      = "EV01";
   my @ed_versionsets;
@@ -839,7 +899,7 @@ sub kne_stammdatenexport {
 
   $main::lxdebug->leave_sub();
 
-  return @filenames;
+  return { 'download_token' => get_download_token_for_path($export_path), 'filenames' => \@filenames };
 }
 
 1;
index 6d89a21..5f8c61e 100644 (file)
@@ -331,28 +331,33 @@ sub export3 {
 
   $auth->assert('datev_export');
 
+  DATEV::clean_temporary_directories();
+
   DATEV->save_datev_stamm(\%myconfig, \%$form);
 
-  my $link = "datev.pl?action=download";
+  my $link = "datev.pl?action=download&download_token=";
 
   if ($form->{kne}) {
-    my @filenames = DATEV->kne_export(\%myconfig, \%$form);
-    if (@filenames) {
-      print(qq|<br><b>| . $locale->text('KNE-Export erfolgreich!') . qq|</b><br>|);
-      $link .= "&filenames=" . $form->escape(join(":", @filenames));
-      print(qq|<br><a href="$link">Download</a>|);
+    my $result = DATEV->kne_export(\%myconfig, \%$form);
+    if ($result && @{ $result->{filenames} }) {
+      $link .= Q($result->{download_token});
+
+      print(qq|<br><b>| . $locale->text('KNE-Export erfolgreich!') . qq|</b><br><br><a href="$link">Download</a>|);
+
     } else {
       $form->error("KNE-Export schlug fehl.");
     }
   } else {
-    my @filenames = DATEV->obe_export(\%myconfig, \%$form);
-    if (@filenames) {
-      print(qq|<br><b>| . $locale->text('OBE-Export erfolgreich!') . qq|</b><br>|);
-      $link .= "&filenames=" . $form->escape(join(":", @filenames));
-      print(qq|<br><a href="$link">Download</a>|);
-    } else {
-      $form->error("OBE-Export schlug fehl.");
-    }
+    # OBE-Export nicht implementiert.
+
+    # my @filenames = DATEV->obe_export(\%myconfig, \%$form);
+    # if (@filenames) {
+    #   print(qq|<br><b>| . $locale->text('OBE-Export erfolgreich!') . qq|</b><br>|);
+    #   $link .= "&filenames=" . $form->escape(join(":", @filenames));
+    #   print(qq|<br><a href="$link">Download</a>|);
+    # } else {
+    #   $form->error("OBE-Export schlug fehl.");
+    # }
   }
 
   print("</body></html>");
@@ -366,21 +371,29 @@ sub download {
   $auth->assert('datev_export');
 
   my $tmp_name = Common->tmpname();
-  my $zip_name = strftime("lx-office-datev-export-%Y%m%d.zip",
-                          localtime(time()));
+  my $zip_name = strftime("lx-office-datev-export-%Y%m%d.zip", localtime(time()));
 
   my $cwd = getcwd();
-  chdir("users") || die("chdir users");
 
-  my @filenames = split(/:/, $form->{"filenames"});
-  map({ s|.*/||; $form->error("Eine der KNE-Exportdateien wurde nicht " .
-                              "gefunden. Wurde der Export bereits " .
-                              "durchgef&uuml;hrt?") unless (-f $_); }
-      @filenames);
+  my $path = DATEV::get_path_for_download_token($form->{download_token});
+  if (!$path) {
+    $form->error($locale->text("Your download does not exist anymore. Please re-run the DATEV export assistant."));
+  }
+
+  chdir($path) || die("chdir $path");
+
+  my @filenames = glob "*";
+
+  if (!@filenames) {
+    chdir($cwd);
+    DATEV::clean_temporary_directories();
+    $form->error($locale->text("Your download does not exist anymore. Please re-run the DATEV export assistant."));
+  }
 
   my $zip = Archive::Zip->new();
-  map({ $zip->addFile($_); } @filenames);
+  map { $zip->addFile($_); } @filenames;
   $zip->writeToFileNamed($tmp_name);
+
   chdir($cwd);
 
   open(IN, $tmp_name) || die("open $tmp_name");
@@ -393,5 +406,7 @@ sub download {
 
   unlink($tmp_name);
 
+  DATEV::clean_temporary_directories();
+
   $lxdebug->leave_sub();
 }