
| 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/ServFiBuBasic.pm |
package Application::ServFiBuBasic;
use strict;
use Data::Dumper;
sub new {
my $class = shift;
my $self = {};
my $text = shift;
$self->{'BUCHUNGEN'} = [];
$self->{'KONTENLISTE'} = {};
$self->{'STORE'} = {};
$self->{'BID'} = {}; # Liste der Buchungsidentifier
$self->{'GID'} = {}; # Liste der Gruppenidentifier
$self->{'BIDMAX'} = 0;
$self->{'GIDMAX'} = 0;
bless($self,$class);
$self->restore($text);
return($self);
}
#**********************************************************************
sub restore {
my $self = shift;
my $text = shift;
return(0) if (!$text);
my @tt = split("\n",$text);
my $o; my $o1; my $datum; my $amount; my $kto1; my $kto2; my $rem;
my $buchungen = []; my $kontenliste = {};
foreach $o (@tt) {
if ( $o =~ /^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.*?)(\s*)$/ ) {
$datum = $1;
$amount = $2;
$kto1 = $3;
$kto2 = $4;
$rem = $5;
if ($datum > 19970000) {
if (1 or $amount != 0) {
push(@$buchungen,[$datum,$amount,$kto1,$kto2,$rem]);
if ($rem =~ /BID\:(\d+)/) {
$o1 = $1;
$self->{'BID'}->{$o1} = 1;
if ($o1 > $self->{'BIDMAX'}) { $self->{'BIDMAX'} = $o1; }
}
if ($rem =~ /GID\:(\d+)/) {
$o1 = $1;
$self->{'GID'}->{$o1} = 1;
if ($o1 > $self->{'GIDMAX'}) { $self->{'GIDMAX'} = $o1; }
}
$o = "";
}
}
}
if ( $o =~ /^(\S+)\s+(.*?)(\s*)$/ ) {
if (substr($1,0,2) ne "\:\:") {
$kontenliste->{$1} = $2;
}
}
}
$self->buchungen($buchungen);
$self->kontenliste($kontenliste);
}
#**********************************************************************
sub exp { # Dump-Funktion
my $self = shift;
my $format = shift;
my $text = "";
my $buchungen = $self->buchungen();
my $o; my $p1; my $p2; my $o1;
foreach $o (@$buchungen) {
next if ($self->{'RESTRICTED'} and (!($o->[4] =~ /\@\@/)));
if (!$format) {
$text = $text . $o->[0] . " " . sprintf("%3.2f",$o->[1]) . " " .
$o->[2] . " " .
$o->[3] . " " .
$o->[4] . "\n";
} else {
if (length($o->[2]) < 23) {
$p1 = substr($o->[2]." ",0,23);
} else {
$p1 = $o->[2] . " ";
}
if (length($o->[3]) < 23) {
$p2 = substr($o->[3]." ",0,23);
} else {
$p2 = $o->[3] . " ";
}
$text = $text . $o->[0] . " " . sprintf("%11.2f",$o->[1]) . " " .
$p1 . " " . $p2 . " " .
$o->[4] . "\n";
}
}
my $kontenliste = $self->kontenliste();
foreach $o (sort keys %$kontenliste) {
$o1 = $o;
if (length($o1) < 31) {
$o1 = substr($o1." ",0,32);
}
$text = $text . $o1 . " " . $kontenliste->{$o} . "\n";
}
return($text);
}
#***********************************************************************
sub xxstore {
my $self = shift;
my $name = shift;
my $val = shift;
if ($val) {
$self->{'STORE'}->{$name} = $val;
}
return($self->{'STORE'}->{$name});
}
#**********************************************************************
sub restrict {
my $self = shift;
my $par = shift;
if ($par) {
if ($par == 1) {
$self->{'RESTRICTED'} = 1;
} else {
$self->{'RESTRICTED'} = 0;
}
}
return($self->{'RESTRICTED'});
}
#**********************************************************************
sub buchungen {
my $self = shift;
my $bb = shift;
if ($bb) {
$self->{'BUCHUNGEN'} = [ sort { $self->sortbuchung($a) cmp $self->sortbuchung($b) } @$bb ];
}
# foreach my $o (@{$self->{'BUCHUNGEN'}}) {
# print $self->sortbuchung($o) . "\n"; sleep 1;
# }
return($self->{'BUCHUNGEN'});
}
#**********************************************************************
sub kontenliste {
my $self = shift;
my $kk = shift;
if ($kk) {
$self->{'KONTENLISTE'} = $kk;
}
return($self->{'KONTENLISTE'});
}
#**********************************************************************
sub nextbid { my $self = shift; return($self->{'BIDMAX'}+1); }
sub nextgid { my $self = shift; return($self->{'GIDMAX'}+1); }
#**********************************************************************
# Hinzufuegen von Buchungen.
# Format: Datum, Betrag, Konto1, Konto2, Text
sub addbuchung {
my $self = shift;
my @buchsatz = @_; # Feld mit Buchungssaetzen
return(1) if ($self->{'RESTRICTED'});
my $o; my $o1;
foreach $o (@buchsatz) {
$o->[2] =~ s/^x//;
$o->[2] =~ s/-[1234567890ABCij]-/-/;
$o->[2] =~ s/-[1234567890ABCij]$//;
$o->[3] =~ s/^x//;
$o->[3] =~ s/-[1234567890ABCij]-//;
$o->[3] =~ s/-[1234567890ABCij]$//;
$o->[4] =~ s/^(.*?)(\s+)$/$1/;
push(@{$self->{'BUCHUNGEN'}},$o);
my $rem = $o->[4];
if ($rem =~ /BID\:(\d+)/) {
$o1 = $1;
$self->{'BID'}->{$o1} = 1;
if ($o1 > $self->{'BIDMAX'}) { $self->{'BIDMAX'} = $o1; }
}
if ($rem =~ /GID\:(\d+)/) {
$o1 = $1;
$self->{'GID'}->{$o1} = 1;
if ($o1 > $self->{'GIDMAX'}) { $self->{'GIDMAX'} = $o1; }
}
}
# my @bb = sort { $a->[0] . substr($a->[4],0,15)
# cmp $b->[0] . substr($b->[4],0,15) }
$self->buchungen( [ @{$self->{'BUCHUNGEN'}} ] );
# my @bb = sort { $self->sortbuchung($a) cmp $self->sortbuchung($b) }
# @{$self->{'BUCHUNGEN'}};
# $self->{'BUCHUNGEN'} = \@bb;
return(1);
}
#**********************************************************************
sub sortbuchung {
my $self = shift;
my $buchung = shift;
my $erg = $buchung->[4];
$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 = $buchung->[2];
my $o2 = $buchung->[3];
if (($o1 cmp $o2) > 0) {
$o1 = $buchung->[3];
$o2 = $buchung->[2];
}
$erg = $buchung->[0] . $erg . substr($o1." ",0,20) .
substr($o2." ",0,20);
# if (-f "xxx.xxx") { print " $erg\n"; sleep 1; }
return($erg);
}
#**********************************************************************
# Loeschen von Buchungen
sub delbuchung {
my $self = shift;
my @buchsatz = @_; # Feld mit Buchungssaetzen
return(1) if ($self->{'RESTRICTED'});
my $o; my $o1;
my @bb = ();
foreach $o (@{$self->{'BUCHUNGEN'}}) {
foreach $o1 (@buchsatz) {
$o1->[2] =~ s/-[1234567890ABCij]-/-/;
$o1->[2] =~ s/-[1234567890ABCij]$//;
$o1->[3] =~ s/-[1234567890ABCij]-//;
$o1->[3] =~ s/-[1234567890ABCij]$//;
last if (!(ref($o)));
if (ref($o1) and ref($o)) {
$o1->[2] =~ s/^x//;
$o1->[3] =~ s/^x//;
# $o->[4] =~ s/^\s*(.*?)\s*$/$1/;
# $o1->[4] =~ s/^\s*(.*?)\s*$/$1/;
# print Dumper($o);
# print Dumper($o1); sleep 10 if ($o->[1] =~ /14\.89/);
if ( (($o->[0] eq $o1->[0]) and
($o->[1] == $o1->[1]) and
($o->[2] eq $o1->[2]) and
($o->[3] eq $o1->[3]) and
($o->[4] eq $o1->[4])) or
(($o->[0] eq $o1->[0]) and
($o->[1] == -$o1->[1]) and
($o->[2] eq $o1->[3]) and
($o->[3] eq $o1->[2]) and
($o->[4] eq $o1->[4])) ) {
$o = "";
}
} else {
if ($o->[4] =~ /$o1(\D|$)/) {
$o = "";
}
last if (!$o);
}
}
if ($o) { push(@bb,$o); }
}
$self->{'BUCHUNGEN'} = \@bb;
return(1);
}
#****************************************************************
# Liefert Kontoinformationen als Array mit drei Feldern:
# Erstes Feld: Buchungssaetze
# Zweites Feld: Hash mit Unterkonten-Salden
# Drittes Feld: Gesamt-Konto-Saldo
sub viewkonto {
my $self = shift;
my $kto = shift;
my $o; my $o1; my $o2; my @ee;
my $saldo = 0;
my $gkto; my $ukto; my $amount;
my $ktotext = [];
my $buchkont = {};
my $remark;
my $monat = "";
$kto = $kto . "-";
if ($kto =~ s/-([123456789ABCij])-/-/) {
$monat = "0" . $1;
if ($monat eq "00") { $monat = "10"; }
elsif ($monat eq "0i") { $monat = "11"; }
elsif ($monat eq "0j") { $monat = "12"; }
elsif ($monat eq "0A") { $monat = "10"; }
elsif ($monat eq "0B") { $monat = "11"; }
elsif ($monat eq "0C") { $monat = "12"; }
}
$kto =~ s/(.*)-$/$1/;
my $buchungen = $self->{'BUCHUNGEN'};
### my $collect = 0;
my $ukto_add = "";
$o = "";
### if ($kto =~ /-X(.*)/ or $kto =~ s/^x//) {
### $o = $1;
#### if (!$o) {
#### $kto = $kto . "-";
#### $ukto_add = "-";
#### }
### $buchungen = [@$buchungen];
### $collect = 1;
### $kto =~ s/-X/-\[123456789ABCDEFGHIJKLMNOPQRSTUVWYZ\]/;
### }
foreach my $o (@$buchungen) {
next if ($self->{'RESTRICTED'} and (!($o->[4] =~ /\@\@/)));
$gkto = "";
$ukto = "";
if ($o->[2] =~ /^$kto(.*)/) {
$ukto = $1;
$amount = $o->[1];
$remark = $o->[4];
@ee = ();
my @ee1 = split(/-/,$kto);
foreach $o1 (split(/-/,$o->[2])) {
if (shift(@ee1) eq ".*") { $o1 = "xxx"; }
push(@ee,$o1);
$o2 = join("-",@ee);
### if ($collect) {
### $o2 =~ s/-[123456789ABCDEFGHIJKLMNOPQRSTUVWYZ](-|$)/-X$1/;
### }
next if (!($o2 =~ /^$kto/));
next if ($monat and substr($o->[0],4,2) ne $monat);
$buchkont->{$o2} = $buchkont->{$o2} + $amount;
}
$gkto = $o->[3];
}
if ($o->[3] =~ /^$kto(.*)/) {
$ukto = $1;
$amount = - ( $o->[1] );
$remark = $o->[4];
if ($remark !~ s/\{\-/\{/) { $remark =~ s/\{/\{\-/; }
@ee = ();
my @ee1 = split(/-/,$kto);
foreach $o1 (split(/-/,$o->[3])) {
if (shift(@ee1) eq ".*") { $o1 = "xxx"; }
push(@ee,$o1);
$o2 = join("-",@ee);
### if ($collect) {
### $o2 =~ s/-[123456789ABCDEFGHIJKLMNOPQRSTUVWYZ](-|$)/-X$1/;
### }
next if (!($o2 =~ /^$kto/));
next if ($monat and substr($o->[0],4,2) ne $monat);
$buchkont->{$o2} = $buchkont->{$o2} + $amount;
}
if ($gkto) {
$gkto = "";
} else {
$gkto = $o->[2];
}
}
next if (!$gkto);
next if ($monat and substr($o->[0],4,2) ne $monat);
if (!$ukto) { $ukto = "-"; }
$ukto = $ukto_add . $ukto;
$saldo = $saldo + $amount;
push(@$ktotext,[$o->[0],$amount,$ukto,$gkto,$saldo,$remark]);
}
return($ktotext,$buchkont,$saldo);
}
#*******************************************************************
sub saldo {
my $self = shift;
my $kto = shift;
my ($o,$o1,$o2) = $self->viewkonto($kto);
return($o2);
}
#*******************************************************************
sub ktoname {
my $self = shift;
my $kto = shift;
return($self->{'KONTENLISTE'}->{$kto});
}
#***********************************************************************
# Liefert eine Liste aller Unterkonten
sub konten {
my $self = shift;
my $path = shift;
my $x; my $o; my $o1; my $o2;
my @ukto = (); my $xx = {};
if (!($self->{'BUCHUNGEN'})) {
$self->{'BUCHUNGEN'} = [];
}
my @kl = keys %{$self->{'KONTENLISTE'}};
foreach $o (@kl) {
$o = ["",$o,$o];
}
foreach $o (@{$self->{'BUCHUNGEN'}},@kl) {
next if ($self->{'RESTRICTED'} and (!($o->[4] =~ /\@\@/)));
next if ( $o->[5] eq "DEL" );
foreach $o1 ($o->[2],$o->[3]) {
$o2 = $self->is_ukto($path,$o1);
next if (!$o2);
if (!($xx->{$o2})) {
$xx->{$o2} = 1;
if ($path) {
$o2 = $path . "-" . $o2;
$o2 =~ s/--/-/g;
}
$x = $self->{'KONTENLISTE'}->{$o2};
push(@ukto,[$o1,$o2,$x]);
}
}
}
@ukto = sort { $a->[1] cmp $b->[1] } @ukto;
return([@ukto]);
}
#***********************************************************************
#sub export_kto {
#
# my $self = shift;
# my $kto = shift;
#
# if (!($kto)) { $self->{'EXPORT_KTO'} = []; }
#
# my $ktoliste = $self->konten($kto);
# my $o;
# foreach $o (@$ktoliste) {
# push(@{$self->{'EXPORT_KTO'}},$o->[0]);
# $self->export_kto($o->[0]);
# }
#
# if (!($kto)) { return(join(",",@{$self->{'EXPORT_KTO'}})) }
# return(1);
#
#}
#***********************************************************************
sub is_ukto {
my $self = shift;
my $path = shift;
my $ukto = shift;
if ( $ukto =~ /^$path(.*)/ ) {
$ukto = "-" . $1;
my @ee = split(/-+/,$ukto);
if ($ee[1]) { return($ee[1]) };
}
return(0);
}
#************************************************************************
sub xxtransform {
my $self = shift;
my $bb = [];
my $ktoliste = {};
my $o; my $datum; my $amount; my $k1; my $k2; my $text;
foreach $o (@{$self->{'BUCHUNGEN'}}) {
next if ($self->{'RESTRICTED'} and (!($o->[4] =~ /\@\@/)));
$datum = $o->[0];
$amount = $o->[1];
$k1 = $o->[2];
$k2 = $o->[3];
$text = $o->[4];
push(@$bb,[$datum,$amount,$self->t1($k1,$datum,$ktoliste),
$self->t1($k2,$datum,$ktoliste),$text]);
}
$ktoliste->{"10"} = "Aktiva";
$ktoliste->{"11"} = "Passiva";
$ktoliste->{"12"} = "Ertrag";
$ktoliste->{"13"} = "Aufwand";
foreach $o (keys %{$self->{'KONTENLISTE'}}) {
$self->t1($o,"20000101",$ktoliste);
}
$self->{'BUCHUNGEN'} = $bb;
$self->{'KONTENLISTE'} = $ktoliste;
}
sub t1 {
my $self = shift;
my $kto = shift;
my $datum = shift;
my $ktoliste = shift;
my $ktotext = $self->{'KONTENLISTE'}->{$kto};
my $typ; my $quartal = "";
if ( 0 < $kto and $kto < 1799 ) { $typ = "10"; }
if ( 1799 < $kto and $kto < 1999 ) { $typ = "11"; }
if ( 1999 < $kto and $kto < 3000 ) { $typ = "12"; }
if ( 2999 < $kto and $kto < 6000 ) { $typ = "13"; }
if ( 6000 < $kto and $kto < 9999 ) { $typ = "12"; }
if ( 9999 < $kto and $kto < 10999 ) { $typ = "10"; }
if ( 10999 < $kto and $kto < 11999 ) { $typ = "11"; }
if ($kto == 1571 or $kto == 1575 or $kto == 1771 or $kto == 1775) {
$quartal = "-" . substr($datum,2,2);
$datum = substr($datum,4,2);
if ($datum == 1 or $datum == 2 or $datum == 3) {
$quartal = $quartal . "1"; }
if ($datum == 4 or $datum == 5 or $datum == 6) {
$quartal = $quartal . "2"; }
if ($datum == 7 or $datum == 8 or $datum == 9) {
$quartal = $quartal . "3"; }
if ($datum == 10 or $datum == 11 or $datum == 12) {
$quartal = $quartal . "4"; }
}
$kto = $typ . "-" . $kto;
$ktoliste->{$kto} = $ktotext;
$kto = $kto . $quartal;
return($kto);
}
1;