#!/usr/bin/perl
use CGI qw(:standard); # Standard-CGI-Modul einbinden
use strict; # strikte Variablendeklaration
# Der Pfad des Kundenverzeichnisses relativ zum Server-Root. Dieses Verzeichnis
# sollte nur die Datei enthalten, die auch von außen sichtbar sein dürfen.
my $BasisverzeichnisKunden = $ENV{'DOCUMENT_ROOT'}. '';
# Der Pfad des Adminverzeichnisses relativ zum Server-Root. Dieses Verzeichnis
# enthält alle relevanten Dateien und ist serverseitig passwortgeschützt.
my $BasisverzeichnisAdmin = $ENV{'DOCUMENT_ROOT'}. '/admin';
my $FormularVorlagenDatei = 'speditionsauftrag_formular_vorlage.html'; # Die HTML-Vorlage für die Formular-Seiten relativ zum Admin-Root
my $DruckVorlagenDatei = 'speditionsauftrag_ausdruck_vorlage.html'; # Die HTML-Vorlage für die Ausdruck-Seiten relativ zum Admin-Root
my $AuftragLog = 'auftraege.log'; # In dieser Datei werden alle versendeten Aufträge zusätzlich gespeichert. (Relativ zu Admin-Root.)
my $auftragDateiPrefix = 'auftraege/auftrag'; # Daraus wird ein Dateiname gebastelt, in dem ein Auftrag abgelegt wird. Relativ zum Admin-Root. (Siehe "zeigeDruckseite")
my @errors = ();
my $absenderName = '';
my $absenderAnsprechpartner = '';
my $absenderStrasse = '';
my $absenderPLZOrt = '';
my $telefon = '';
my $beladeName = '';
my $beladeAnsprechpartner = '';
my $beladeStrasse = '';
my $beladePLZOrt = '';
my $entladeName = '';
my $entladeAnsprechpartner = '';
my $entladeStrasse = '';
my $entladePLZOrt = '';
my $beladeTag = '';
my $uhrzeit = '';
my $warenwert = '';
my $warenVersichern = 0; # false
my $frankatur = '';
my $frankatur_fh = '';
my $frankatur_uf = '';
my $hinweise = '';
my @markierung = ();
my @anzahl = ();
my @packmittel = ();
my @inhalt = ();
my @kg = ();
my @vol = ();
my @ldm = ();
my @lieferschein = ();
my $auftragNurAnzeigen = 0;
$SIG{__DIE__} = sub {
my $fehlermeldung = shift;
(my $sekunde, my $minute, my $stunde, my $tag, my $monat, my $jahr) = localtime(time);
$jahr += 1900;
# Fehler auf Standard-Ausgabe ausgeben (Browser)
print ' Es ist ein interner Fehler aufgetreten: ';
print $fehlermeldung." ($stunde:$minute:$sekunde Uhr - $tag.$monat.$jahr) \n";
print " Originalfehlermeldung: $!";
};
############################
# übergebene Datei locken (außer unter Windows oder DOS)
sub lockFile($)
{
if ($^O ne 'MSWin32' && $^O ne 'dos') {
flock(shift, 2); # Datei sperren
}
} # +++ lockFile +++
############################
# übergebene Datei entsperren (außer unter Windows oder DOS)
sub unlockFile($)
{
if ($^O ne 'MSWin32' && $^O ne 'dos') {
flock(shift, 8); # Datei entsperren
}
} # +++ unlockFile +++
####################################
# Schneidet führende und endende Whitespaces ab
sub trim()
{
my $string = shift;
$string =~ s/^\s+//; # Whitespace am Anfang entfernen
$string =~ s/\s+$//; # Whitespace am Ende entfernen
return $string;
} # +++ Trim +++
############################
# Ersetzt die relevanten Zeichen durch die entsprechenden HTML-Zeichenfolgen
sub HTMLEntities($)
{
my $token = shift;
$token =~ s/\&/\&\;/g;
$token =~ s/"/\"\;/g;
$token =~ s/\<\;/g;
$token =~ s/>/\>\;/g;
return $token;
} # +++ HTMLEntities +++
############################
# Zeigt die Formular-Seite an und ersetzt alle Platzhalter durch den jeweiligen Text.
sub zeigeFormular()
{
open(VORLAGE, "<$BasisverzeichnisAdmin/$FormularVorlagenDatei")
or die "Konnte Vorlagen-Datei für Formular ($BasisverzeichnisAdmin/$FormularVorlagenDatei) nicht öffnen!";
my $vorlage = '';
while ($vorlage = ) {
print &ersetzePlatzhalter($vorlage);
}
close(VORLAGE);
} # +++ zeigeFormular +++
############################
# Ersetzt die Platzhalter durch den jeweiligen Text.
sub ersetzePlatzhalter($)
{
my $line = shift;
# Keine zu ersetzenden Platzhalter in Zeile vorhanden vorhanden.
if ($line !~ //) { return $line; }
if ($line =~ //) { $line =~ s//&HTMLEntities($absenderName)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($absenderAnsprechpartner)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($absenderStrasse)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($absenderPLZOrt)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($telefon)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($beladeName)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($beladeAnsprechpartner)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($beladeStrasse)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($beladePLZOrt)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($entladeName)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($entladeAnsprechpartner)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($entladeStrasse)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($entladePLZOrt)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($beladeTag)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($uhrzeit)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($warenwert)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($frankatur)/ge; }
if ($line =~ //) { $line =~ s//$frankatur_fh/ge; }
if ($line =~ //) { $line =~ s//$frankatur_uf/ge; }
# if ($line =~ //) { $line =~ s//&HTMLEntities($frankatur_fh)/ge; }
# if ($line =~ //) { $line =~ s//&HTMLEntities($frankatur_uf)/ge; }
if ($line =~ //) { $line =~ s//&HTMLEntities($hinweise)/ge; }
if ($line =~ //) {
if ($warenVersichern) {
$line =~ s//checked/g;
} else {
$line =~ s///g;
}
}
if ($line =~ //) {
if ($warenVersichern) {
$line =~ s//Die Waren werden versichert./g;
} else {
$line =~ s///g;
}
}
if ($line =~ //) { $line =~ s//&erzeugeFormularWarentabelle()/ge; }
if ($line =~ //) { $line =~ s//&erzeugeAusdruckWarentabelle()/ge; }
if ($line =~ //) { $line =~ s//&erzeugeVersendeHinweis()/ge; }
if ($line =~ //) {
my $hinweis;
if ($auftragNurAnzeigen) {
$hinweis = '(Der Auftrag wurde nicht versendet)';
} else {
$hinweis = '(Der Auftrag wurde versendet)';
}
$line =~ s//$hinweis/ge;
}
if (@errors > 0 && $line =~ //) {
my $error = '';
$error .= 'Folgende Fehler sind aufgetreten: '. "\n";
$error .= '
'. "\n";
foreach $_ (@errors) {
$error .= "
$_\n";
}
$error .= '
'. "\n";
$error .= '
'. "\n";
$line =~ s//$error/g;
}
if ($line =~ //) {
(my $sekunde, my $minute, my $stunde, my $tag, my $monat, my $jahr) = localtime(time);
$jahr += 1900;
$monat = $monat+1;
my $datum = "$tag.$monat.$jahr";
$line =~ s//$datum/g;
}
return $line;
} # +++ ersetzePlatzhalter +++
sub erzeugeFormularWarentabelle()
{
my $result = '';
my $anzahlZeilen;
if (@markierung <= 3) {
$anzahlZeilen = 3;
} else {
$anzahlZeilen = @markierung;
}
for (my $i = 0; $i < $anzahlZeilen; $i++) {
if (defined $markierung[$i]) {
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
} else {
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
$result .= '
';
}
}
return $result;
}
sub erzeugeAusdruckWarentabelle()
{
my $result = '';
for (my $i = 0; $i < @markierung; $i++) {
$result .= '
' . "\n";
$result .= '
' . $markierung[$i] . '
' . "\n";
$result .= '
' . $anzahl[$i] . '
' . "\n";
$result .= '
' . $packmittel[$i] . '
' . "\n";
$result .= '
' . $inhalt[$i] . '
' . "\n";
$result .= '
' . $kg[$i] . '
' . "\n";
$result .= '
' . $vol[$i] . '
' . "\n";
$result .= '
' . $ldm[$i] . '
' . "\n";
$result .= '
' . $lieferschein[$i] . '
' . "\n";
$result .= '
' . "\n";
}
return $result;
}
sub erzeugeVersendeHinweis()
{
my $result = '';
$result .= '
' . "\n";
if ($auftragNurAnzeigen) {
$result .= 'Ihr Auftrag wurde erstellt. Er wurde jedoch nicht an die Scheerer Logistik GmbH & Co KG '.
'versendet.
' . "\n".
'Sie können den Auftrag jetzt über die Druckfunktion Ihres Browsers ausdrucken oder '.
'Ihre Angaben noch einmal überarbeiten (und anschließend ggf. online an die Logistik GmbH & Co KG '.
'versenden).
' . "\n";
$result .= '' . "\n" .
'\n";
} else {
$result .= 'Ihr Auftrag wurde erstellt und online an die Scheerer Logistik GmbH & Co KG versendet. '.
'Wir werden baldmöglichst mit Ihnen in Kontakt treten. ' . "\n" .
'Sie können den Auftrag jetzt noch für Ihre Unterlagen über die Druckfunktion Ihres '.
'Browsers ausdrucken. ' . "\n" .
" \n" .
'Herzlichen Dank für Ihren Auftrag!
' . "\n";
}
$result .= "
\n";
}
sub ladeParams()
{
if (defined param('absender_name')) { $absenderName = &trim(param('absender_name')); }
if (defined param('absender_ansprechpartner')) { $absenderAnsprechpartner = &trim(param('absender_ansprechpartner')); }
if (defined param('absender_strasse')) { $absenderStrasse = &trim(param('absender_strasse')); }
if (defined param('absender_plz_ort')) { $absenderPLZOrt = &trim(param('absender_plz_ort')); }
if (defined param('telefon')) { $telefon = &trim(param('telefon')); }
if (defined param('belade_name')) { $beladeName = &trim(param('belade_name')); }
if (defined param('belade_ansprechpartner')) { $beladeAnsprechpartner = &trim(param('belade_ansprechpartner')); }
if (defined param('belade_strasse')) { $beladeStrasse = &trim(param('belade_strasse')); }
if (defined param('belade_plz_ort')) { $beladePLZOrt = &trim(param('belade_plz_ort')); }
if (defined param('entlade_name')) { $entladeName = &trim(param('entlade_name')); }
if (defined param('entlade_ansprechpartner')) { $entladeAnsprechpartner = &trim(param('entlade_ansprechpartner')); }
if (defined param('entlade_strasse')) { $entladeStrasse = &trim(param('entlade_strasse')); }
if (defined param('entlade_plz_ort')) { $entladePLZOrt = &trim(param('entlade_plz_ort')); }
if (defined param('beladetag')) { $beladeTag = &trim(param('beladetag')); }
if (defined param('uhrzeit')) { $uhrzeit = &trim(param('uhrzeit')); }
if (defined param('warenwert')) { $warenwert = &trim(param('warenwert')); }
if (defined param('frankatur_x')) { $frankatur = &trim(param('frankatur_x')); }
# if (defined param('frankatur_fh')) {
$frankatur_fh = "";
if ($frankatur == "frei Haus") { $frankatur_fh = "checked"; }
# else { $frankatur_fh = ""; }
# }
# if (defined param('frankatur_uf')) {
# $frankatur_uf = "";
# if (&trim(param('frankatur')) == "unfrei") { $frankatur_uf = "selected"; }
# else { $frankatur_uf = ""; }
# }
if (defined param('warenversichern')) { $warenVersichern = 1; } # true
if (defined param('hinweise')) { $hinweise = &trim(param('hinweise')); }
my $i = 1;
while (defined param('markierung_' . $i)) {
if (param('markierung_' . $i) ne ''
|| param('anzahl_' . $i) ne ''
|| param('packmittel_' . $i) ne ''
|| param('inhalt_' . $i) ne ''
|| param('kg_' . $i) ne ''
|| param('vol_' . $i) ne ''
|| param('ldm_' . $i) ne ''
|| param('lieferschein_' . $i) ne '') {
##
$markierung[@markierung] = param('markierung_' . $i);
$anzahl[@anzahl] = param('anzahl_' . $i);
$packmittel[@packmittel] = param('packmittel_' . $i);
$inhalt[@inhalt] = param('inhalt_' . $i);
$kg[@kg] = param('kg_' . $i);
$vol[@vol] = param('vol_' . $i);
$ldm[@ldm] = param('ldm_' . $i);
$lieferschein[@lieferschein] = param('lieferschein_' . $i);
}
$i++;
}
}
sub zeigeDruckSeite()
{
my $auftragDatei;
&ladeParams();
checkeEingaben();
if (@errors > 0) {
&zeigeFormular();
return;
}
if (!$auftragNurAnzeigen) {
my $auftragNummer;
do {
$auftragNummer = int(rand(1000000000));
$auftragDatei = "$auftragDateiPrefix$auftragNummer" . '.html';
} while (-e $auftragDatei);
open (AUFTRAG, ">$BasisverzeichnisAdmin/$auftragDatei")
or die "Konnte den Auftrag nicht speichern. (Konnte $BasisverzeichnisAdmin/$auftragDatei nicht zum Schreiben öffnen.)";
}
open(VORLAGE, "<$BasisverzeichnisAdmin/$DruckVorlagenDatei")
or die "Konnte Vorlagen-Datei für Formular ($BasisverzeichnisAdmin/$DruckVorlagenDatei) nicht öffnen!";
my $vorlage = '';
while ($vorlage = ) {
$vorlage = &ersetzePlatzhalter($vorlage);
print $vorlage;
if (!$auftragNurAnzeigen) {
print AUFTRAG $vorlage;
}
}
close(VORLAGE);
if (!$auftragNurAnzeigen) {
close(AUFTRAG);
}
if (!$auftragNurAnzeigen) {
&sendeMail($auftragDatei);
&speichereAuftragLog();
}
}
sub sendeMail($)
{
my $auftragDatei = shift;
# Sendmail aufrufen. Flags:
# -io: Sendmail wird nicht beendet, wenn eine Zeile mit nur einem Punkt gelesen wird.
# -t: Nachrichten-Header soll gelesen werden um festzustellen, an wen die Mail gehen soll (To:).
open(SENDMAIL, '|/usr/sbin/sendmail -oi -t') or die "Konnte Sendmail nicht aufrufen";
print SENDMAIL 'From: dispo@scheerer-logistik.de',"\n";
print SENDMAIL 'To: dispo@scheerer-logistik.de',"\n";
# print SENDMAIL 'From: martin.wistuba@web.de',"\n";
# print SENDMAIL 'To: martin.wistuba@web.de',"\n";
# print SENDMAIL 'From: sr@hitcom.de',"\n";
# print SENDMAIL 'To: sr@hitcom.de',"\n";
print SENDMAIL 'Subject: Speditionsauftrag',"\n";
print SENDMAIL "\n"; # trennt Header vom Body
print SENDMAIL &erzeugeMailInhalt($auftragDatei);
close(SENDMAIL);
}
sub speichereAuftragLog()
{
open(LOG, ">>$BasisverzeichnisAdmin/$AuftragLog")
or die "Konnte Auftrags-Logdatei ($BasisverzeichnisAdmin/$AuftragLog) nicht zum Schreiben öffnen!";
lockFile(*LOG);
print LOG "\n--------------------------------------------------------------------------";
print LOG "\n--------------------------------------------------------------------------\n\n";
print LOG &erzeugeMailInhalt();
unlockFile(*LOG);
close(LOG);
}
sub erzeugeMailInhalt($)
{
my $auftragDatei = shift;
my $result = '';
(my $sekunde, my $minute, my $stunde, my $tag, my $monat, my $jahr) = localtime(time);
$jahr += 1900;
$result .= "Dieser Speditionsauftrag wurde am $tag.$monat.$jahr um $stunde:$minute:$sekunde Uhr erstellt.\n";
$result .= "Er kann unter http://www.scheererlogistik.de/admin/$auftragDatei abgerufen werden.\n";
$result .= "\n";
# $result .= '----------------------------------------------------------------'. "\n";
# $result .= "\n";
$result .= "Entladestelle:\n";
$result .= "==============\n";
$result .= " $entladeName\n";
$result .= " $entladeAnsprechpartner\n";
$result .= " $entladeStrasse\n";
$result .= " $entladePLZOrt\n";
$result .= "\n";
$result .= "Beladetag:\n";
$result .= "==========\n";
$result .= " $beladeTag\n";
$result .= "\n";
$result .= "Absender:\n";
$result .= "=========\n";
$result .= " $absenderName\n";
$result .= " $absenderAnsprechpartner\n";
$result .= " $absenderStrasse\n";
$result .= " $absenderPLZOrt\n";
$result .= " Tel.: $telefon\n";
$result .= "\n";
$result .= "Ladestelle:\n";
$result .= "===========\n";
$result .= " $beladeName\n";
$result .= " $beladeAnsprechpartner\n";
$result .= " $beladeStrasse\n";
$result .= " $beladePLZOrt\n";
$result .= "\n";
$result .= "Warentabelle:\n";
$result .= "=============\n";
for (my $i = 0; $i < @markierung; $i++) {
$result .= ' Waren ' . ($i + 1) . ":\n";
$result .= " --------\n";
$result .= ' Markierung: ' . $markierung[$i] . "\n";
$result .= ' Anzahl: ' . $anzahl[$i] . "\n";
$result .= ' Packmittel: ' . $packmittel[$i] . "\n";
$result .= ' Inhalt: ' . $inhalt[$i] . "\n";
$result .= ' KG: ' . $kg[$i] . "\n";
$result .= ' Vol.: ' . $vol[$i] . "\n";
$result .= ' Ldm.: ' . $ldm[$i] . "\n";
$result .= ' Lieferschein: ' . $lieferschein[$i] . "\n";
$result .= "\n";
}
if ($warenVersichern) {
$result .= "Die Ware soll versichert werden!\n\n";
$result .= "Warenwert:\n";
$result .= "==========\n";
$result .= " $warenwert\n";
}
$result .= "\n";
$result .= "Frankatur:\n";
$result .= "==========\n";
$result .= " $frankatur\n";
$result .= "\n";
$result .= "Termin:\n";
$result .= "=======\n";
$result .= " $uhrzeit\n";
$result .= "\n";
$result .= "Hinweise:\n";
$result .= "=========\n";
$result .= " $hinweise\n";
return $result;
}
sub checkeEingaben()
{
if (length($absenderName) <= 0
|| length($absenderAnsprechpartner) <= 0
|| length($absenderStrasse) <= 0
|| length($absenderPLZOrt) <= 0
|| length($telefon) <= 0
|| length($beladeName) <= 0
|| length($beladeAnsprechpartner) <= 0
|| length($beladeStrasse) <= 0
|| length($beladePLZOrt) <= 0
|| length($entladeName) <= 0
|| length($entladeAnsprechpartner) <= 0
|| length($entladeStrasse) <= 0
|| length($entladePLZOrt) <= 0
|| length($beladeTag) <= 0
|| length($frankatur) <= 0
|| length($uhrzeit) <= 0) {
##
push(@errors, "Die Eingaben sind nicht vollständig. Bitte füllen Sie alle Felder vollständig aus. (Das Hinweis-Feld ist eine optionale Angabe.)");
}
if ($warenVersichern && length($warenwert) <= 0) {
push(@errors, "Bitte geben Sie einen Warenwert an, wenn die Ware versichert werden soll.");
}
for (my $i = 0; $i < @markierung; $i++) {
if ($markierung[$i] eq ''
|| $anzahl[$i] eq ''
|| $packmittel[$i] eq ''
|| $inhalt[$i] eq ''
|| $kg[$i] eq ''
|| $vol[$i] eq ''
|| $ldm[$i] eq ''
|| $lieferschein[$i] eq '') {
##
push(@errors, "Die Warentabelle ist nicht vollständig. Bitte befüllen Sie jede Zeile der Warentabelle vollständig.");
last;
}
}
}
############## HAUPTPROGRAMM #################
print header;
if (param()) {
if (¶m('anzeigen')) {
$auftragNurAnzeigen = 1;
&zeigeDruckSeite();
}
if (¶m('senden')) {
$auftragNurAnzeigen = 0;
&zeigeDruckSeite();
}
if (¶m('editieren')) {
&ladeParams();
&zeigeFormular();
}
}
if (!¶m()) {
&zeigeFormular();
}