auto commit on 2019-03-12 19:39
authorKilian Saffran <ksaffran@dks.lu>
Tue, 12 Mar 2019 18:39:22 +0000 (19:39 +0100)
committerKilian Saffran <ksaffran@dks.lu>
Tue, 12 Mar 2019 18:39:22 +0000 (19:39 +0100)
bin/dkssync.pl [new file with mode: 0644]
bin/pdfextract.pl [new file with mode: 0644]

diff --git a/bin/dkssync.pl b/bin/dkssync.pl
new file mode 100644 (file)
index 0000000..ecf8873
--- /dev/null
@@ -0,0 +1,338 @@
+#!/usr/local/ActivePerl-5.14/bin/perl
+
+use strict;
+use Net::FTP;
+use File::Basename;
+use Data::Dumper;
+use Getopt::Long;
+use Archive::Tar;
+use File::Path qw (remove_tree make_path);
+my $host="";
+my $user="";
+my $pwd="";
+my $dir="";
+my $import = 0;
+my $export=0;
+my $backup=0;
+my $restore="";
+#my $list=0;
+my $ftp = undef;
+my $time = 0;
+my $clean = 0;
+my $getcfg = "";
+#my $folder = "";
+my $test = 0;
+my $os = $^O;
+#import example: -i -h www.dks.lu -u fripo@dks.lu -p hootee3y -d sync
+#backup local example: -b -d "D:\workspace\planer\backup\1347954617"
+#backup remote example: -b -h www.dks.lu -u fripo@dks.lu -p hootee3y -d "D:\workspace\planer\backup\1347954617"
+#list backupfiles: -l -d "D:\workspace\planer\backup" -h www.dks.lu -u fripo@dks.lu -p hootee3y 
+GetOptions("host|h=s" => \$host,
+           "user|u=s" => \$user,
+           "password|p=s" => \$pwd,
+           "dir|d=s" => \$dir,
+           "export|e" => \$export,
+           "import|i" => \$import,
+           "backup|b" => \$backup,
+           "restore|r=s" => \$restore,
+           #"backuplist|l" => \$list,
+           "clean|c" => \$clean,
+           "getcfg|g=s" => \$getcfg,
+           "test" => \$test,
+           #"folder|f=s" => \$folder,
+           "time|t=i" => \$time);
+my $tar = Archive::Tar->new;
+
+chdir(dirname($0));
+$dir =~ s/\\/\//g;
+
+if ($getcfg ne ""){
+  my @l = split(dirname($0));
+  my $nn = pop(@l);
+  my $rcfg = ""; 
+  if ($getcfg eq "stdbackuppath"){
+    if ($os eq "MSWin32"){
+      $rcfg = $ENV{APPDATA}."\\$nn\\backup";
+    }elsif ($os eq "darwin"){
+      $rcfg = $ENV{HOME}."/Application/$nn/backup";
+    }
+    make_path($rcfg);
+  }elsif($getcfg eq "stdsyncpath"){
+    if ($os eq "MSWin32"){
+      $rcfg = $ENV{APPDATA}."\\$nn\\sync";
+    }elsif ($os eq "darwin"){
+      $rcfg = $ENV{HOME}."/Application/$nn/sync";
+    }
+    make_path($rcfg);
+  }
+  print $rcfg;
+  exit(0);
+}
+
+if ($host ne ""){
+  &ftpconnect();  
+}
+
+if ($test == 1){
+  if(defined($ftp)){
+    print "1";
+    &ftpdisconnect();
+  }else {
+    print "0";
+  }
+  exit(0);
+}
+
+if ($import == 1){
+  chdir($dir);
+  my @rfiles = ();
+ # my $sync = 0;
+  if(defined($ftp)){
+    $ftp->cwd('sync');
+    my $r = $ftp->get('sync.tgz','sync.tgz');
+    if ((defined($r)) && (-f $dir.'/sync.tgz')){
+      $tar->extract_archive('sync.tgz',1);
+    }
+#    $sync = 1;
+    unlink("sync.tgz");
+  }
+#  if ($sync == 1){
+    my $lf = &getlocalsyncfiles($dir);
+    foreach my $x (keys%${lf}){
+      print $dir."/".$x."\n";
+    }
+#  }
+} elsif ($export == 1){
+  my $name = "sync.tgz";
+  chdir($dir);
+  my $lf = &getlocalsyncfiles($dir);
+  unlink($name);
+  my @ltarfiles = ();
+  foreach my $l (keys %{$lf}){
+    push @ltarfiles, $l;
+  }
+  if (scalar(@ltarfiles) > 0){
+    $tar->add_files(@ltarfiles);
+    $tar->write($name,COMPRESS_GZIP);
+    if(defined($ftp)){
+      $ftp->cwd('sync');
+      $ftp->put($name,$name);
+      unlink($name);
+    }
+  }
+} elsif ($clean == 1){
+    remove_tree($dir,{ 'keep_root' => 1});
+} elsif ($backup == 1){
+  #my $bdir = substr($dir,0,rindex($dir,'/'));
+  #my $cdir = substr($dir,length($bdir)+1);
+  my @mt = localtime();
+  $mt[5] = $mt[5] + 1900;
+  $mt[4] = $mt[4] + 1;
+  if ($mt[4] < 10){ $mt[4] = "0".$mt[4];}
+  if ($mt[3] < 10){ $mt[3] = "0".$mt[3];}
+  if ($mt[2] < 10){ $mt[2] = "0".$mt[2];}
+  if ($mt[1] < 10){ $mt[1] = "0".$mt[1];}
+  if ($mt[0] < 10){ $mt[0] = "0".$mt[0];}
+  my $name = $mt[5].$mt[4].$mt[3].$mt[2].$mt[1].$mt[0]."_backup.tgz";
+  chdir($dir);
+  my $lf = &readlocal($dir);
+  unlink($name);
+  my @ltarfiles = ();
+  foreach my $l (keys %{$lf}){
+    push @ltarfiles, $l;
+  }
+  if (-d $dir.'/container'){
+    my $alf = &readlocalall($dir.'/container');
+    foreach my $al (keys %{$alf}){
+      push @ltarfiles, 'container/'.$al;
+    }
+  }
+  $tar->add_files(@ltarfiles);
+  $tar->write($name,COMPRESS_GZIP);
+  #if(defined($ftp)){
+  #  $ftp->cwd('backup');
+  #  $ftp->put($name,$name);
+  #}
+  foreach my $x (@ltarfiles){
+    unlink($x);
+  }
+  if (-d $dir.'/container'){
+    remove_tree($dir.'/container',{ 'keep_root' => 0});
+  }
+  #remove_tree($dir);
+  print $name."\n";
+}elsif ($restore ne ""){
+  my $dir = dirname($restore);
+  chdir($dir);
+  my @files = $tar->extract_archive($restore,1);
+  if (-d $dir){
+    print $dir;
+  }else{
+    print "ERROR";
+  }
+}else {
+  print "Keine Verbindung zum Server!\n";
+}
+if (defined($ftp)){
+  &ftpdisconnect();
+}
+
+#elsif ($list == 1){
+#  chdir($dir);
+#  my $lf = &readlocalfile($dir);
+#  my $rf = ();
+#  if (defined($ftp)){
+#    $ftp->cwd('backup');
+#    $rf = &readftpfile();
+#  }
+#  foreach my $r (keys(%{$rf})){
+#    if (!exists($lf->{$r})){
+#      $lf->{$r} = $rf->{$r};
+#    }
+#  }
+#  foreach my $l (sort {$b <=> $a} keys(%{$lf})){
+#    my $t = substr($l,0,index($l,"_"));
+#    print $l." (".&utime_to_time($t).")\n";
+#  }
+#}
+
+sub readlocal(){
+  my $cdir = shift;
+  my $ret = ();
+  opendir(XX,$cdir) or die $cdir." does not exist";
+  while (my $d = readdir(XX)){
+    #print $d."\n";
+    if (substr($d,0,1) eq "."){ next; }
+    if ((-f $cdir.'/'.$d) && ($d =~ /\.xml$/)){
+      my @stat = stat($cdir.'/'.$d);
+      $ret->{$d}->{mtime} = $stat[9];
+      $ret->{$d}->{size} = $stat[7];
+    }
+  }
+  closedir(XX);
+  return $ret;
+}
+
+sub readlocalall(){
+  my $cdir = shift;
+  my $ret = ();
+  opendir(XX,$cdir) or die $cdir." does not exist";
+  while (my $d = readdir(XX)){
+    #print $d."\n";
+    if (substr($d,0,1) eq "."){ next; }
+    if (-f $cdir.'/'.$d){
+      my @stat = stat($cdir.'/'.$d);
+      $ret->{$d}->{mtime} = $stat[9];
+      $ret->{$d}->{size} = $stat[7];
+    }
+  }
+  closedir(XX);
+  return $ret;
+}
+
+sub getlocalsyncfiles(){
+  my $cdir = shift;
+  my $ret = ();
+  opendir(XX,$cdir) or die $cdir." does not exist";
+  while (my $d = readdir(XX)){
+    #print $d."\n";
+    if (substr($d,0,1) eq "."){ next; }
+    if ((-f $cdir.'/'.$d) && ($d =~ /\.xml$/)){
+      my @stat = stat($cdir.'/'.$d);
+      $ret->{$d}->{mtime} = $stat[9];
+      $ret->{$d}->{size} = $stat[7];
+    }
+  }
+  closedir(XX);
+  return $ret;
+}
+
+
+sub readlocalfile(){
+  my $cdir = shift;
+    my $ret = ();
+    opendir(XX,$cdir) or die $cdir." does not exist";
+    while (my $d = readdir(XX)){
+        #print $d."\n";
+        if (substr($d,0,1) eq "."){ next; }
+        if ((-f $cdir.'/'.$d) && ($d =~ /\.tgz$/)){
+            my @stat = stat($cdir.'/'.$d);
+            $ret->{$d}->{mtime} = $stat[9];
+            $ret->{$d}->{size} = $stat[7];
+        }
+    }
+    closedir(XX);
+    return $ret;
+}
+
+sub readftpfile(){
+    my @rtxt = $ftp->ls();
+    my $ret = ();
+    foreach my $r (@rtxt){
+        if ($r =~ /\.tgz/){
+            my $t = $ftp->mdtm($r);
+            $ret->{$r}->{mtime} = $t;
+            my $s = $ftp->size($r);
+            $ret->{$r}->{size} = $s;
+        }
+    }
+    return $ret;
+}
+
+sub ftpconnect(){
+    $ftp = Net::FTP->new($host,'Timeout' => 30, 'Passive' => 1);
+    if (defined($ftp)){
+        $ftp->login($user,$pwd);
+        $ftp->binary;
+    }
+    
+}
+
+sub ftpdisconnect(){
+  $ftp->quit();
+}
+
+sub utime_to_time(){
+  my $utime = shift;
+  my @lx = localtime($utime);
+  $lx[5] = $lx[5] +1900;
+  $lx[4] = $lx[4] + 1;
+  
+  if ($lx[4] <10) {$lx[4] = "0".$lx[4];}
+  if ($lx[3] <10) {$lx[3] = "0".$lx[3];}
+  if ($lx[2] <10) {$lx[2] = "0".$lx[2];}
+  if ($lx[1] <10) {$lx[1] = "0".$lx[1];}
+  if ($lx[0] <10) {$lx[0] = "0".$lx[0];}
+  return $lx[3].".".$lx[4].".".$lx[5]." ".$lx[2].":".$lx[1].":".$lx[0];
+}
+
+#sub dlgopendir($){
+#  my $path = shift;
+#  my $mw = Tkx::widget->new(".",-topmost => 1,);
+#  my $scrw = Tkx::winfo('screenwidth',  $mw);
+#  $scrw += 100;
+#  my $scrh = Tkx::winfo('screenheight',  $mw);
+#  $scrh += 100;
+#  $mw->g_wm_title("DKSSync");
+#  $mw->g_wm_geometry("50x50-".$scrw."-".$scrh);
+#  $mw->g_wm_maxsize(0, 0);
+#  $mw->g_wm_iconify();
+#  &opendirbrowser($mw,$path);
+#  Tkx::MainLoop();
+#  return $dir;
+#}
+#
+#sub opendirbrowser($){
+#  my $parent = shift;
+#  my $path = shift;
+#  my $dir = Tkx::tk___chooseDirectory(
+#    -parent => $parent,
+#    -initialdir => $path,
+#    -mustexist => 1,
+#  );
+#  if ($os eq "MSWin32"){
+#    $dir =~ s/\//\\/g;
+#  }
+#  print $dir;
+#  exit(0);
+#}
diff --git a/bin/pdfextract.pl b/bin/pdfextract.pl
new file mode 100644 (file)
index 0000000..26d5748
--- /dev/null
@@ -0,0 +1,155 @@
+#!C:\Perl\bin\perl.exe
+
+use strict;
+use warnings;
+use Getopt::Long;
+use File::Basename;
+my $pdffile="";
+my $toolsdir=dirname($0);
+GetOptions("pdf|p=s" => \$pdffile);
+
+if (! -e $pdffile) {
+  print "incomplete input!\n";
+  exit(1);
+}
+if (-e $pdffile.'.txt'){
+  unlink($pdffile.'.txt');
+}
+if (-e $pdffile.'.csv'){
+  unlink($pdffile.'.csv');
+}
+
+my $sep = '/';
+if ($^O eq "Win32") {
+  $sep = "\\";
+}
+if (! -e $toolsdir.$sep.'pdftotext.exe'){
+  exit(2);
+}
+  my $cmd = '"'.$toolsdir.$sep.'pdftotext.exe" -table -eol unix "'.$pdffile.'" "'.$pdffile.'.txt"';
+  my $st = system($cmd);
+  my $jdata = ();
+  if (($st == 0) && (-e $pdffile.".txt")){
+    my @pdata = ();
+    open(PDFDATA,$pdffile.".txt");
+    while (my $l = <PDFDATA>) {
+      chomp($l);
+      if ($l ne "") {
+        push @pdata,$l;
+      }
+    }
+    close(PDFDATA);
+    my $caccount = "";
+    my $stmtnum = "";
+    my $r = 0;
+    my $cpos = "";
+    foreach my $p (@pdata){
+      if ($p =~ /^\s+Konto\s+:/ ) {
+        $cpos = "";
+        ($caccount) = $p =~ m/.+IBAN\s+(.+)$/;
+        next;
+      }elsif ($p =~ /Kontoauszug Nr\./){
+        $cpos = "";
+        ($stmtnum) = $p =~ m/^Kontoauszug Nr\.\s(\d+).+$/;
+        next;
+      }elsif ($p =~ /^\d\d\.\d\d\s+[GUT|UEBER|SEPA]/){
+        $cpos = "";
+        $r++;
+        my ($type,$trdate,$trval,$trsign) = $p =~ m/\d\d\.\d\d\s+(.+)\s+(\d\d\.\d\d\.\d\d)\s+([\d|,|\.]+)\s([+|-])$/; 
+        $type =~ s/\s//g;
+        $trsign =~ s/\+//;
+        $trval=~ s/\.//g;
+        $trdate = substr($trdate,0,6).'20'.substr($trdate,-2);
+        $jdata->{$r}->{"Account"} = $caccount;
+        $jdata->{$r}->{"StatementNumber"} = $stmtnum;
+        $jdata->{$r}->{"BookingDate"} = $trdate;
+        $jdata->{$r}->{"Amount"} = $trsign.$trval;
+        $jdata->{$r}->{"TransactionIdent"} = "";
+        $jdata->{$r}->{"Message"} = "";
+        $jdata->{$r}->{"ForeignAccountOwner"} = "";
+        $jdata->{$r}->{"Bank"} = "";
+        $jdata->{$r}->{"TransferAccount"} = "";
+        $jdata->{$r}->{"TransferCosts"} = 0;
+        #$jdata->{$r}->{"BookingType"} = $type;
+        next;
+      }elsif ($p =~ /^\s+Unser Zeichen/){
+        $cpos = "TransactionIdent";
+        my ($trid) = $p =~ m/^\s+Unser Zeichen\s+(.+)$/;
+        $jdata->{$r}->{$cpos} =$trid;
+      }elsif ($p =~ /^\s+Mitteilung/){
+        $cpos = "Message";
+        my ($msg) = $p =~ m/^\s+Mitteilung\s+(.+)$/;
+        $jdata->{$r}->{$cpos} = $msg;
+      }elsif ($p =~ /^\s+Auftraggeber/){
+        $cpos = "ForeignAccountOwner";
+        my ($apl) = $p =~ /^\s+Auftraggeber\s+(.+)$/;
+        $apl =~ s/\s+/\ /g;
+        $jdata->{$r}->{$cpos} =$apl;
+      }elsif ($p =~ /^\s+Bank d. Auftr.gebers/){
+        $cpos = "";
+      }elsif ($p =~ /^\s+BIC-Code Bank d. Auftraggebers/){
+        $cpos = "Bank";
+        my ($trfbank) = $p =~ /^\s+BIC-Code\sBank\sd\.\sAuftraggebers\s+(.+)$/;
+        $jdata->{$r}->{$cpos} =$trfbank;
+      }elsif ($p =~ /^\s+End-to-End-Identifizierung/){
+        $cpos = "";
+      }elsif ($p =~ /^\s+Beg.nstigter/){
+        $cpos = "ForeignAccountOwner";
+        my ($recp) = $p =~ /^\s+Beg.nstigter\s+(.+)$/;
+        $recp =~ s/\s+/\ /g;
+        $jdata->{$r}->{$cpos} =$recp;
+        $cpos="";
+      }elsif ($p =~ /^\s+Konto Nr. Beg.nst./){
+        $cpos = "TransferAccount";
+        
+        my ($trfacc) = $p =~ /^\s+Konto\sNr\.\sBeg.nst.\s+(.+)$/;
+        $trfacc =~ s/\///g;
+        $trfacc =~ s/(....)/$1 /sg;
+        $trfacc =~ s/\s+$//;
+        $jdata->{$r}->{$cpos} =$trfacc;
+        $cpos="";
+      }elsif ($p =~ /^\s+bei/){
+        $cpos = "";
+      }elsif ($p =~ /^\s+Transfergeb.hr/){
+        $cpos = "TransferCosts";
+        my ($tramount) = $p =~ /^\s+Transfergeb.hr\s+EUR\s+(.+)$/;
+        $tramount =~ s/\,/\./g;
+        $jdata->{$r}->{$cpos} =$tramount;
+      }elsif ($p =~ /^\s+Durch Ihren Bonus abgedeckt/){
+        $cpos = "TransferCosts";
+        my ($tramount) = $p =~ /^\s+Durch Ihren Bonus abgedeckt\s+EUR\s+(.+)$/;
+        $tramount =~ s/\,/\./g;
+        $jdata->{$r}->{$cpos} = $jdata->{$r}->{$cpos} + $tramount;
+      }elsif ($p =~ /^\s+Zeichen/){
+        $cpos = "";
+      } elsif ($p =~ /^\s+Neuer Kontostand/){
+        $cpos="";
+      }elsif ($cpos ne "") {
+        my ($data) = $p =~ m/\s+(.+)$/;
+        $jdata->{$r}->{$cpos} .= " ".$data;
+      }
+    }
+
+  }
+if (-e $pdffile.'.txt'){
+  unlink($pdffile.'.txt');
+}
+open(FOUT,">".$pdffile.".csv");
+print FOUT '"Account","StatementNumber","BookingDate","Amount","TransactionIdent","Message","ForeignAccountOwner","Bank","TransferAccount","TransferCosts"'."\n";
+foreach my $r (keys(%{$jdata})){
+  my @data = ();
+  push @data, $jdata->{$r}->{"Account"};
+  push @data, $jdata->{$r}->{"StatementNumber"};
+  push @data, $jdata->{$r}->{"BookingDate"};
+  push @data, $jdata->{$r}->{"Amount"};
+  push @data, $jdata->{$r}->{"TransactionIdent"};
+  $jdata->{$r}->{"Message"} =~ s/\s+/\ /g;
+  push @data, $jdata->{$r}->{"Message"};
+  $jdata->{$r}->{"ForeignAccountOwner"} =~ s/\s+/\ /g;
+  push @data, $jdata->{$r}->{"ForeignAccountOwner"};
+  push @data, $jdata->{$r}->{"Bank"};
+  push @data, $jdata->{$r}->{"TransferAccount"};
+  push @data, $jdata->{$r}->{"TransferCosts"};
+  print FOUT '"'.join('","',@data).'"'."\n";
+}
+close(FOUT);
\ No newline at end of file