#!/usr/bin/perl
# use strict;
use warnings;
use CGI;
use CGI::Carp qw ( fatalsToBrowser );
use File::Basename;
use PDF::Reuse;
use Unicode::String qw(utf8 latin1);
use List::Util qw(shuffle);
$CGI::POST_MAX = 1024 * 5000;
my $safe_filename_characters = "a-zA-Z0-9_.-";
my $upload_dir = "../Documents/turnier/upload";
my ($tag, $mo, $tt, $time, $year) = split /\s+/, localtime();
my ($std, $min, $sec) = split /:/, $time;
my $q = new CGI;
my $tname = $q->param('Turnier'); # Name des Turniers für Datenbank und PDF Dateien
my $tart = $q->param('art'); # Turnierart DDV 1| Landesverband 2| Verein 3| Competition 4
my $tmod = $q->param('tmod'); # Turniermodus Gruppe 1| KO 2| DKO 3
my $gesetzt = $q->param('gesetzt'); # gesetzte Spieler ja 1| nein 0
my $gesetztMod = $q->param('gesmod'); # gesetzte Spieler DDV 1| Endrunde Zufall 2
my $anzGR = $q->param('Gruppen'); # Anzahl der Gruppen
my $anzPlatz = $q->param('platz'); # Anzahl der zu platzierenden Spieler aus einer Gruppe 3|2|1
my $filename = $q->param("sp");
my $upload_filehandle = $q->upload("sp");
my @tempspieler;
my @spieler;
my $anz;
my $gs;
my $rest;
#---------------------------------------------------------------------------------------------------------------------------------
# Diverse Zähler Variablen
#---------------------------------------------------------------------------------------------------------------------------------
my $i; # Subroutine gruppenerstellung erste Schleife
my $ii; # Subroutine gruppenerstellung zweite Schleife
my $x;
my $xxx;
my $sp;
my $vtest;
my $tsp;
my $a;
my $aa;
my $y;
my $h;
# sub paarung
my $zz;
my $z;
my $iii;
my $b;
my $c;
my $cc;
my ( $fname, $path, $extension ) = fileparse ( $filename, '..*' );
$filename = $fname . $extension;
$filename =~ tr/ /_/;
$filename =~ s/[^$safe_filename_characters]//g;
if ( !$filename )
{
print $q->header (-charset=>'UTF-8');
print "Es gibt ein Problem beim Hochladen der Datei. (max. Dateigröße: 5MB)";
exit;
}
if ( $filename =~ /^([$safe_filename_characters]+)$/ )
{
$filename = $1;
}
else
{
die "Der Dateiname enthält ungültige Zeichen!";
}
open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "$!";
binmode UPLOADFILE;
while ( <$upload_filehandle> )
{
print UPLOADFILE;
}
close UPLOADFILE;
print $q->header (-charset=>'UTF-8');
print $q->start_html;
print "Die Spielerdatei $upload_dir/$filename wurde erfolgreich gespeichert!
\n";
open (DATEI, "$upload_dir/$filename") or die $!;
while()
{
chomp($_);
$string = $_;
push(@tempspieler, $string);
}
close (DATEI);
foreach (@tempspieler)
{
($hdv,$name,$verein) = split(/,/);
push (@spieler, "$hdv: $name,$verein");
}
open (DATEI, "../Documents/turnier/upload/gesetzte.txt") or die $!;
while()
{
chomp($_);
push(@gesetztespieler, $_);
}
close (DATEI);
chomp(@gesetztespieler);
pdfteilnehmer();
print "
\n\n";
print "Turniername: $tname
\n";
print "Turnierart: $tart
\n";
print "Turniermodus: $tmod
\n";
print "ges. Spieler Modus: $gesetztMod
\n";
print "Anzahl Gruppen: $anzGR
\n";
print "Anzahl der Platzierungen: $anzPlatz
\n";
my $anz = @spieler; # Anzahl der Spieler
print "Anzahl der Spieler: $anz
\n";
my $gsanz = @gesetztespieler; # Anzahl der gesetzten Spieler
print "gesetzte Spieler: $gsanz
\n";
my $gs = int($anz/$anzGR);
print "Anzahl Spieler pro Gruppe: $gs
\n";
my $rest = $anz - ($gs * $anzGR);
print "Anzahl der Spieler zur Verteilung: $rest
\n";
gruppenerstellung();
print $q->end_html;
sub pdfteilnehmer
{
my $arial = '/Library/Fonts/Arial.ttf';
prFile("../Documents/turnier/PDF/Teilnehmerliste$year$mo$tt$std$min$sec.pdf");
prTTFont($arial);
my $jpeg = prJpeg("./HDVlogo.jpg", 700, 284);
my $bild = "q\n175 0 0 71 400 750 cm\n/$jpeg Do\nQ\n";
prAdd($bild);
prText(40, 785, "Teilnehmerliste $tt. $mo $year $std:$min:$sec");
prAdd("q 31 35 m 31 750 l S Q");
prAdd("q 95 35 m 95 750 l S Q");
prAdd("q 270 35 m 270 750 l S Q");
prAdd("q 550 35 m 550 750 l S Q");
prAdd("q 31 35 m 550 35 l S Q");
prAdd("q 31 750 m 550 750 l S Q");
my $i = 1;
my $hdv;
my $name;
my $verein;
my $z;
my $y = 735;
for my $row (@tempspieler)
{
($hdv,$name,$verein) = split(/,/, $row);
$name = utf8($name);
$verein = utf8($verein);
$z = $y - 3;
if($y > 30)
{
prText(35, $y, $hdv);
prText(105, $y, latin1($name));
prText(280, $y, latin1($verein));
prAdd("q 31 $z m 550 $z l S Q");
}
else
{
$y = 735;
$z = 732;
prPage();
prText(40, 785, "Teilnehmerliste $tt. $mo $year $std:$min:sec");
prAdd($bild);
prAdd("q 31 $z m 550 $z l S Q");
prAdd("q 31 35 m 31 750 l S Q");
prAdd("q 95 35 m 95 750 l S Q");
prAdd("q 270 35 m 270 750 l S Q");
prAdd("q 550 35 m 550 750 l S Q");
prAdd("q 31 35 m 550 35 l S Q");
prAdd("q 31 750 m 550 750 l S Q");
prText(35, $y, $hdv);
prText(105, $y, latin1($name));
prText(280, $y, latin1($verein));
}
$y = $y - 15;
$i++;
}
prEnd();
}
sub gruppenerstellung
{
@spieler = shuffle(shuffle(@spieler)); # Zweimal kräftig durchmischen
@temp = ();
@sptemp = ();
@spielergruppe = ();
$i = 1;
$x = 0;
my $arial = '/Library/Fonts/Arial.ttf';
prFile("../Documents/turnier/PDF/Gruppenrunde$year$mo$tt$std$min$sec.pdf");
prTTFont($arial);
my $jpeg = prJpeg("./HDVlogo.jpg", 700, 284);
my $bild = "q\n175 0 0 71 400 750 cm\n/$jpeg Do\nQ\n";
prAdd($bild);
prText(40, 785, "Gruppenrunde Gruppe: $i");
prText(60, 760, "$tt. $mo $year $std:$min:$sec");
prAdd("q 31 275 m 31 573 l S Q"); # vorne senkrecht
prAdd("q 470 275 m 470 573 l S Q"); # 2te senkrecht
prAdd("q 510 275 m 510 573 l S Q"); # 3te senkrecht
prAdd("q 550 275 m 550 573 l S Q"); # 4te senkrecht
prAdd("q 31 275 m 550 275 l S Q"); # unten quer
prAdd("q 31 573 m 550 573 l S Q"); # oben quer
# Gruppenerstellung beginnt
while($i <= $anzGR)
{
@temp = ();
@sptemp = ();
@spielergruppe = ();
$ii = 0;
if($i > 1)
{
prPage();
my $jpeg = prJpeg("./HDVlogo.jpg", 700, 284);
my $bild = "q\n175 0 0 71 400 750 cm\n/$jpeg Do\nQ\n";
prAdd($bild);
prText(40, 785, "Gruppenrunde Gruppe: $i");
prText(60, 760, "$tt. $mo $year $std:$min:$sec");
prAdd("q 31 275 m 31 573 l S Q"); # vorne senkrecht
prAdd("q 470 275 m 470 573 l S Q"); # 2te senkrecht
prAdd("q 510 275 m 510 573 l S Q"); # 3te senkrecht
prAdd("q 550 275 m 550 573 l S Q"); # 4te senkrecht
prAdd("q 31 275 m 550 275 l S Q"); # unten quer
prAdd("q 31 573 m 550 573 l S Q"); # oben quer
}
while($ii < $gs)
{
$xxx = @sptemp;
$sp = @spieler;
$vtest = 0;
$tsp = shift @spieler;
chomp($tsp);
($hdv,$verein) = split(/,/ ,$tsp); # hole einen Teilnehmer aus Spieler Array
if($xxx == 0)
{
$sptemp[$ii][0] = $hdv;
$sptemp[$ii][1] = $verein;
$ii++;
next;
}
else
{
$a = @sptemp; # Wie viele Einträge hat das temp Array, wichtig für die anschliessende Schleife
$aa = 0; # Zaehler fuer Schleife um SPTEMP zu ueberpruefen bzgl. Verein
while($aa <= $a)
{
if(@spieler < 15)
{
$vtest = 0;
last;
}
if($sptemp[$aa][1] eq $verein)
{
push (@spieler, "$hdv,$verein");
$vtest = 1;
last;
}
$aa++;
}
}
if($vtest == 0)
{
$sptemp[$ii][0] = $hdv;
$sptemp[$ii][1] = $verein;
$ii++;
}
}
if($x < $rest)
{
($hdv,$verein) = split(/,/ ,shift @spieler);
$sptemp[$ii][0] = $hdv;
$sptemp[$ii][1] = $verein;
$x++;
$ii++;
}
for ($y = 0; $y < @sptemp;$y++)
{
$tsp = $sptemp[$y][0];
push (@temp, utf8($tsp));
}
$h = 700;
for $row (@temp)
{
prText(35, $h, latin1($row));
$h = $h - 15;
}
push @gruppe, [@temp];
push @spielergruppe, @temp;
paarung();
$i++;
}
prEnd();
}
sub paarung
{
push @spielergruppe, utf8("FREILOS") if(@spielergruppe % 2);
$zz = @spielergruppe;
$z = $zz - 2;
my $iii = 0;
$h = 560;
print "\n";
for ($b = 3; $b < $z; $b = $b + 2)
{
splice(@spielergruppe, $b, 0, pop(@spielergruppe)) if(@spielergruppe); # Initialisierung des ersten Spiels
}
$c = 0;
$cc = 1;
for($b = 0; $b < $zz; $b++)
{
if($spielergruppe[$c])
{
if(($spielergruppe[$c] ne "FREILOS") and ($spielergruppe[$cc] ne "FREILOS"))
{
print "$spielergruppe[$c] | vs. | $spielergruppe[$cc] |
\n";
prText(35, $h, latin1($spielergruppe[$c]));
prText(240, $h, "vs.");
prText(280, $h, latin1($spielergruppe[$cc]));
$hh = $h - 5;
prAdd("q 31 $hh m 550 $hh l S Q"); # oben quer
$h = $h - 20;
}
}
$c = $c + 2;
$cc = $cc + 2;
}
while($iii < $z)
{
for ($b = 1; $b < $z;)
{
$xx = $b + 2;
splice(@spielergruppe, $b, 0, (splice(@spielergruppe, $xx, 1))) if(@spielergruppe); # 3->1, 5->3, 7->5, 9->7, 11->9 ... usw
$b = $b + 2;
}
$c = 0;
$cc = 1;
for($b = 0; $b < $zz; $b++)
{
if($spielergruppe[$c])
{
if(($spielergruppe[$c] ne "FREILOS") and ($spielergruppe[$cc] ne "FREILOS"))
{
print "$spielergruppe[$c] | vs. | $spielergruppe[$cc] |
\n";
prText(35, $h, latin1($spielergruppe[$c]));
prText(240, $h, "vs.");
prText(280, $h, latin1($spielergruppe[$cc]));
$hh = $h - 4;
prAdd("q 31 $hh m 550 $hh l S Q"); # oben quer
$h = $h - 20;
}
}
$c = $c + 2;
$cc = $cc + 2;
}
$iii++;
}
print "
\n
\n";
}