
| 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/IB.pm |
package Application::IB;
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 viewkonto_txt {
my $self = shift;
my $kto = shift;
my $format = shift;
my $file0 = shift;
my $file = shift;
my $kto0 = "";
if ($kto =~ s/^(.*)--(.*)$/$1-$2/) {
$kto0 = $1;
}
$kto =~ s/\-$//;
my $text; my $text1; my $datum; my $kto1; my $kto2; my $betrag; my $remark;
my $zeile; my $sum; my $o; my $o1; my $name; my $mode; my $buchh0;
my $diff; my $buchh; my $text0; my $header;
my $konten = {};
return("") if ($self->{'FILE'} !~ /^(.*)\.(csv|txt|kto)$/);
# 1. Extract mode
$buchh0 = $1;
$name = "";
if ($buchh0 =~ s/^(.*?)--(.*)$/$1/) {
$name = $2;
}
$buchh0 =~ s/^(.*)[\\\/](.*)$/$2/;
open(FFILE,"<".$self->{'FILE'});
if ($file0) {
$text = [<FFILE>];
$text0 = join("",@$text); # Speichern des gesamten Files im Falle eines Merge
$header = shift($text);
$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);
my $md5 = Digest::MD5::md5_base64($text);
$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---EMPTY---$4$3/g; # Konten umdrehen
$text =~ s/\[\-$kto(.*?)\]/\[---EMPTY---$1\]/g; # Konten in Berechnungen aendern
$text =~ s/---EMPTY----/-/g; # Referenz auf das Konto selbst
$text =~ s/---EMPTY---/-/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]*?\n//gs; # absolutes Konto am Anfang der Zeile geht nicht
# $text =~ s/\n(\d\d\d\d\d\d\d\d.*\d\d\d\d\d\d\d\d.*?\n)(.*)/$1\n/s;
$text =~ s/^([^ ;]+)[; ]+\-?\d+\.\d\d(.*)$/$1/g; # Kontobezeichnungen uebernehmen
while ($text =~ s/\n$kto0-([^ ;]+[; ]+[^ ;]+)(\s*)\n/\n$1\n/gs) { 1; }; # Kontobezeichnungen uebernehmen
while ($text =~ s/\n$kto0-([^ ;]+[; ]+[^ ;]+)[ ;]+(-\d+\.\d\d)(\s*)\n/\n$1\n/gs) { 1; }; # Kontobezeichnungen uebernehmen
while ($text =~ s/\n\s*\S+\s*\n/\n/gs) { 1; } # leere Kontoeintraege entfernen
# print $text; print "KK $kto $kto0\n"; exit;
if ($kto0) {
$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;
# print $text; print "KK $kto $kto0\n"; exit;
$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;
}
$md5 =~ s/\+/\-/gs;
$md5 =~ s/\//\_/gs;
$buchh0 = $kto0 . "--" . $kto if ($kto);
$text = $kto0 . "--" . $kto . "--" . $md5 . "\n" . $text;
$o = 1;
$o = 0 if ($format =~ s/^\.//);
$o = 2 if ($format =~ s/^\://);
$o = 3 if ($format =~ s/^,//);
$mode = "txt" if ($format =~ s/t//i or !$mode);
$mode = "csv" if ($format =~ s/c//i);
$file = $buchh0."_$md5.$mode";
# 2. --- Change mode
while ($file0) {
$diff = $self->compute_diff($file0,$file);
$buchh = $diff->[0];
$kto = $diff->[1];
$o = $diff->[2];
last if ($o ne $md5);
foreach $zeile (split(/\n/,$diff->[3])) { # delete list
if ($zeile =~ /^(\d\d\d\d\d\d\d\d)[; ]+(-?\d+\.\d\d)[; ]+(.*?)([^ :;]+)[; ]+(.*?)([^ :;]+)[; ]-?\d+\.\d\d[ ;]+(.*?)[ ;]*$/) {
$zeile = "$1.*?$2.*?$3.*?$4.*?$6.*?$7";
}
elsif ($zeile =~ /^([^ ;]+)[ ;]+([^ ;]+)[ ;]+-?\d+\.\d\d/) {
$zeile = ".*?$kto-$1.*?$2.*?";
}
return("Line not found: $zeile") if ($text0 !~ s/\n$zeile\n/\n/s);
return("Double line: $zeile") if ($text0 !~ s/\n$zeile\n/\n/s);
}
foreach $zeile (split(/\n/,$diff->[4])) { # add list
if ($zeile =~ s/^(\d\d\d\d\d\d\d\d[; ]+-?\d+\.\d\d[; ]+)([^ ;]+)([; ]+)([^ ;]+)(.*?)[ ;]*$/$1---KTO1---$3---KTO2---$5/) {
$o = [$2,$4];
foreach $o1 (@$o) {
$o1 =~ s/^-/$kto-/;
if ($o1 !~ /\:/) { $o1 = $buchh . ":" . $o1; }
$o1 =~ s/-$//;
}
$o1 = $o->[1];
$o = $o->[0];
$zeile =~ s/---KTO1---/$o/;
$zeile =~ s/---KTO2---/$o/;
}
elsif ($zeile =~ /^([^ ;]+)[ ;]+([^ ;]+)/) {
$zeile = $buchh . "-" . $zeile;
$zeile =~ s/^$buchh0//;
}
$text0 = $zeile . "\n" . $text0;
}
$text = join("",sort { $self->sortbuchung($a) cmp $self->sortbuchung($b) }
split(/\n/,$text0) );
unlink($file0);
unlink($file);
$file = $self->{'FILE'};
}
$text = $self->to_txt($text,$mode);
if ($o == 1 or $o == 3) {
open(FFILE,">$file");
print FFILE $text;
close(FFILE);
}
return($text) if ($o > 1);
return($file);
}
#******************************************************************************
sub to_txt {
my $self = shift;
my $text = shift;
my $format = 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 $text1 = "";
my $bezeichner = {};
my $gesamt = {};
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;
$sum = "0.00";
$remark = $6;
# print "$zeile\n$kto1-\n$kto2-\n"; exit;
$remark =~ s/^\-?\d+\.\d\d[; ]+//;
if ($kto2 !~ /^-/) {
$kto3 = $kto1;
$kto3 =~ s/^-$//;
while (0 == 0) {
$gesamt->{$kto.$kto3} = $gesamt->{$kto.$kto3} + $betrag;
last if ($kto3 !~ s/-([^- ]+)$//);
}
$sum = $gesamt->{$kto};
}
if ($format eq "txt") {
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;
}
$text1 = $text1 . $zeile . "\n";
}
elsif ($zeile =~ /^\s*(.*?)([ ;]+)(.*?)\s*$/) {
$bezeichner->{$1} = $3;
}
elsif (!$buchh and $zeile =~ /^(.*)--(.*)--(.*)/) {
$buchh = $1;
$kto = $2;
$md5 = $3;
}
}
# print Dumper $gesamt; exit;
$text1 = $text1 . "\n";
$xtab = $kto;
$xtab =~ s/[^-]//g;
foreach $kto1 (sort keys %$gesamt) {
$zeile = sprintf("%3.2f",$gesamt->{$kto1});
$zeile =~ s/^(.*?)( *)$/$2$1/;
$zeile =~ s/ /\\/g;
$ytab = $kto1;
$ytab =~ s/[^-]//g;
$ytab =~ s/^$xtab//;
if ($format eq "txt") {
$o = $bezeichner->{$kto1} || "___undefined___";
if (length($zeile) < 13) { $zeile = substr($zeile." "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 . "___TAB4___" . (sprintf("%09b",1023-length($o))) . "___ " .
$ytab . $ytab . $ytab . $zeile;
} else {
$ytab =~ s/\-/\;/g;
$zeile = $kto1 . ";" .
$bezeichner->{$kto1} . ";" .
$ytab . $zeile;
}
$text1 = $text1 . $zeile . "\n";
}
#print $text1; exit;
if ($format eq "txt") {
foreach $tab (1,2,3,4) {
while (0 == 0) {
last if ($text1 =~ /___TAB$tab\___1/ and $text1 =~ /___TAB$tab\___0/);
last if ($text1 !~ s/___TAB$tab\___(0|1)/___TAB$tab\___/gs);
}
while (0 == 0) {
last if ($text1 !~ /___TAB$tab\___([01]*)\___/);
$o = $1;
$space = " " x eval("0b".$o);
$text1 =~ s/___TAB$tab\___$o\___/$space/gs;
}
}
$text1 =~ s/\\/ /g;
$text1 =~ s/___undefined___/ /gs;
}
$o = $text1;
$o =~ s/[ ;]+/ /g;
if ($format eq "txt") {
$text1 = $buchh . ", " . $kto . " (" . $md5 . ")\n\n" . $text1;
} else {
$text1 = $buchh . ";" . $kto . ";;" . $md5 . "\n\n" . $text1;
}
return($text1);
}
#******************************************************************
sub compute_diff { # compute a diff for changing the Buchungs-Liste
my $self = shift;
my $list0 = shift;
my $list = shift;
if(!$list) {
$list = $list0;
$list0 = $list0 . "~";
}
if (-f $list0) {
open(FFILE,"<".$list0);
$list0 = join("",<FFILE>);
close(FFILE);
}
if (-f $list) {
open(FFILE,"<".$list);
$list = join("",<FFILE>);
close(FFILE);
}
return([]) if ($list0 !~ s/^(.*?)[,;\(\)]+(.*?)[,;\(\)]+(.*?)\n//s);
my $buchh = $1;
my $kto = $2;
my $md5 = $3;
return([]) if ($list !~ s/^$buchh[,;\(\)]+$kto[,;\(\)]+$md5\n//s);
$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,$md5,$dellist,$addlist]);
}
#*****************************************************************
#*****************************************************************
sub viewkonto { # Ausgabe des kleinsten Kontoblattes, das das angegebene Konto enthaelt
my $self = shift;
my $kto = shift;
my $text = "";
my $kto; my $kto1; my $kto0;
foreach $kto1 ( $self->subkto($kto) ) {
$text = $text . $self->viewkonto($kto1);
}
opendir(DDIR,$self->{'DIR'});
my $o; my $o1;
while (0 == 0) {
$o = readdir(DDIR);
next if ($o !~ /^(.*)\.csv$/);
$o1 = $1;
next if ($kto !~ /^$o/);
next if (length($o) < length($kto0));
$kto0 = $o1;
}
closedir(DDIR);
}
#*****************************************************************
sub consolidate {
my $self = shift;
my $kto = shift;
my $text = "";
my $zeile; my $datum; my $betrag; my $kto1; my $kto2; my $sum; my $remark;
my $o; my $o1; my $text1; my $kto0; my $buch;
while (0 == 0) { # Konsolidieren aller Unterkonten
opendir(DDIR,$self->{'DIR'});
while (0 == 0) {
$o = readdir(DDIR);
last if (!$o);
next if ($o !~ /^(.*)\.csv$/);
$o1 = $1;
last if ($o1 =~ /^$kto/); # suche IRGENDEIN Unterkonto aus
}
closedir(DDIR);
last if (!$o);
$text1 = $self->consolidate($o);
$text1 =~ s/(\.\d\d)\;-/$1\;\-$o\-/g; # addiere zur relativen Kontoliste das Konto
$text1 =~ s/(\.\d\d)\;(.*?)\;-/$1\;$2\;\-$o\-/g;
}
open(FFILE,"<$o.kto");
$o = [ join("",<FFILE>) ];
shift(@$o);
$text = $text . join("",@$o);
close(FFILE);
$text = [ sort { $self->sortkto($a) cmp $self->sortkto($b) } split(/\n/,$text) ];
my $sum = 0;
foreach $o (@$text) { # Umsortieren, so dass Unterkonten stets am Anfang stehen
if ($o =~ /^(\d\d\d\d\d\d\d\d)\;(\-?)(.*?)\;(.*?)\;+(.*?)\;+(.*?)\;+(.*)$/) {
$datum = $1;
$betrag = $2.$3;
$kto1 = $4;
$kto2 = $5;
$remark = $7;
if ($kto1 =~ /^\-/ and $kto2 !~ /\-/) {
$sum = $sum + $betrag;
}
elsif ($kto2 =~ /^\-/ and $kto1 !~ /\-/) {
$betrag = (-1) * $betrag;
$o = $kto1;
$kto1 = $kto2;
$kto2 = $o;
$sum = $sum + $betrag;
}
}
$o = "$datum\;".sprintf("%3.2f",$betrag).
"\;$kto1\;$kto2\;".sprintf("%3.2f",$sum).$remark;
}
open(FFILE,"<".$self->{'DIR'} . $slash . $kto0 . ".kto");
my @text = <FFILE>;
close(FFILE);
$buch = join("\n",grep(/$o/,@$buch));
if ($text) { # Speichern der Buchungen
$self->{'BUCHUNGEN'} = $text;
system("rm " . $self->{'KTO'} . "-\*.kto");
open(FFILE,">".$self->{'KTO'}.".kto");
print FFILE $self->{'NAME'} . "\n";
print FFILE $self->{'BUCHLIST'};
print FFILE $self->{'KONTLIST'};
close(FFILE);
return($text);
}
open(FFILE,"<".$self->{'NAME'}.".kto");
$text = join("",<FFILE>);
close(FFILE);
$text =~ s/^(.*?)\n//s;
$text =~ s/(\d\d\d\d\d\d\d\d+) +(\S+) +(\S+) +(\S+) +(.+?) */$1,$2,$3,$4,$5\|/g;
$text =~ s/(.*?),\-(.*?),(.*?),(.*?),(.+) */$1,$2,$4,$3,$5/g;
$self->{'BUCHLIST'} = $text;
$self->{'KONTLIST'} = "";
if ($text =~ /^(.*)\|(.*?)\n(.*)$/s) {
$self->{'BUCHLIST'} = $1 . $2 . "\n";
$self->{'KONTLIST'} = $3;
$self->{'BUCHLIST'} =~ s/\|//gs;
}
return($self->{'BUCHLIST'});
}
#******************************************************************
sub konten {
my $self = shift;
my $text = shift;
if ($text) {
$self->{'KONTLIST'} = $text;
}
return($self->{'KONTLIST'});
}
#******************************************************************
sub dump { 1; }
#******************************************************************
sub ch_kto {
my $self = shift;
my $list0 = shift;
my $list = shift;
my ($dellist,$addlist) = $self->compute_diff($list0,$list);
$self->change_buchung($dellist,$addlist);
}
#******************************************************************
sub compute_diff { # compute a diff for changing the Buchungs-Liste
my $self = shift;
my $list0 = shift;
my $list = shift;
if(!$list) {
$list = $list0;
$list0 = $list0 . "~";
}
if (-f $list0) {
open(FFILE,"<".$list0);
$list0 = join("",<FFILE>);
close(FFILE);
}
if (-f $list) {
open(FFILE,"<".$list);
$list = join("",<FFILE>);
close(FFILE);
}
$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([$dellist,$addlist]);
}
#*****************************************************************
sub change_buchung {
my $self = shift;
my $dellist = shift;
my $addlist = shift;
return("") if (!$dellist and !$addlist);
my $o = "," . $self->{'NAME'} . ":";
$dellist =~ s/$o//g;
$addlist =~ s/$o//g;
my $newbuch = "";
$newbuch = $self->buchungen();
if ($dellist) {
$o = $dellist;
$o =~ s/(.*)\:(.*)//g;
$o =~ s/(\n+)/\|/gs;
$o = "(" . $o . ")";
$newbuch =~ s/$o//gs;
$newbuch =~ s/\n+/\n/gs;
}
if ($addlist) {
$newbuch = $self->buchungen() if (!$newbuch);
$newbuch = join("\n", sort { $self->sortbuchung($a) cmp $self->sortbuchung($b) }
split(/\n/,$newbuch.$addlist) ) . "\n";
}
$dellist =~ s/(\d\d\d\d\d\d\d\d),(.*),([^\:]+),([^\:]+),(.*)//g;
$addlist =~ s/(\d\d\d\d\d\d\d\d),(.*),([^\:]+),([^\:]+),(.*)//g;
# $self->{'PARENT'}->change_buchung($dellist,$addlist);
$self->buchungen($newbuch);
}
#**************************************************************************
sub sortbuchung {
my $self = shift;
my $text = shift;
$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,22) . "ZZZZZZZZZZZZZZZZZZZZZZZZZ";
} else {
$erg = substr($erg,0,22) . "AAAAAAAAAAAAAAAAAAAAAAAAA";
}
$erg = substr($erg,0,23);
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 . substr($o1." ",0,20) .
substr($o2." ",0,20);
# if (-f "xxx.xxx") { print " $erg\n"; sleep 1; }
return($erg);
}
#**************************************************************************
sub viewkonto {
my $self = shift;
my $kto = shift;
my $text = $self->viewkonto1($kto);
$text = $text . $self->{'PARENT'}->viewkonto2($kto,"") if ($self->{'PARENT'});
$text = $text . $self->viewkonto3($kto);
$text = [ sort { $self->sortbuchung($a) cmp $self->sortbuchung($b) }
split(/\n/,$text) ];
return(join("\n",@$text) . "\n");
}
#**************************************************************************
# Look in kto and in sub fibus
sub viewkonto1 {
my $self = shift;
my $kto = shift;
# my $interval = "";
# if ($kto =~ /^(.*)\-([123456789ABCEZDV])$/) {
# $kto = $1;
# $interval = $2;
# }
my $buch = [ split(/\n/,$self->buchungen()) ];
my $o = "," . $kto;
$buch = join("\n",grep(/$o/,@$buch));
}
#**************************************************************************
sub viewkonto2 { # searching above
my $self = shift;
my $kto = shift;
my $buch = shift;
$buch = $self->{'NAME'} . "-" . $buch;
$kto = $self->{'NAME'} . "-" . $kto;
my $text = $self->viewkonto1($kto);
$text =~ s/(.*?),(.*?),(.*?),(.*)/$1,$buch\:$2,$buch\:$3,$4/g;
$text =~ s/,$buch\:$buch//g;
if ($self->{'PARENT'}) {
$text = $text . $self->{'PARENT'}->viewkonto2($kto,$buch);
}
return($text);
}
#**************************************************************************
sub viewkonto3 { # searching underneath
my $self = shift;
my $kto = shift;
print "KK: $self $kto $self->{'NAME'}\n";
my $fibu; my $name; my $text;
foreach $fibu (@{$self->subfibu()}) {
$name = $fibu->{'NAME'};
print "NAME: $name $kto $fibu\n"; sleep 1;
if ($kto =~ s/^$name\-//) {
$text = $fibu->viewkonto1($kto);
print "TT $text $fibu->{'NAME'} " . $fibu->buchungen() ."\n"; sleep 20;
$text =~ s/(.*?),(.*?),(.*?),(.*)/$1,$name\-$2,$name\-$3,$4/g;
return($text . $self->viewkonto3($kto));
}
}
return("");
}
#************************************************************
sub to_kto {
my $self = shift;
my $kto = shift;
my $buch1 = "";
my $o;
# foreach $o (@$buch) {
# next if ($o !~ /^(.*?),(\-*)(.*?),(.*?),(.*?),(.*)$/);
# if ($2) {
# $sum = sprintf("%10.8f",$sum-$3);
# $o = "$1,$3,$5,$4,$sum,$6";
# } else {
# $sum = sprintf("%10.8f",$sum+$3);
# $o = "$1,$3,$4,$5,$sum,$6";
# }
# $buch1 = $buch1 . $o . "\n";
# }
return($buch1);
}
#********************************************************************************
1;