
| 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 |
| 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;