Compare commits

...

4 commits
main ... footer

Author SHA1 Message Date
bernd 223861a819 firstfoot umgestaltet 2021-06-05 23:18:51 +02:00
bernd 0088a34577 fehler vom letzten commit beheben (rechnung.sh nicht angegeben) 2021-06-05 23:04:44 +02:00
bernd f162cd27eb bugfix, debug-modus
fehler durch nichtsetzen der variable LCO behoben
debugmodus eingebaut. es werden kopien des sedfiles und des quelltextes aufgehoben.
2021-06-05 21:58:15 +02:00
+++ 457fcfecef umstellung auf temp. verzeichnis, optionen hinzugefügt
- das skript erledigt seine arbeit jetzt in einem temp. verzeichnis
- per default nur ausgabe von fehler- und abschlussmeldung
- buchstaben einiger optionen geändert
- optionen -b, -o und -t hinzugekommen
2021-06-04 22:53:26 +02:00
4 changed files with 486 additions and 300 deletions

View file

@ -4,9 +4,6 @@ TODO
* Bessere Fehlerkontrolle (besonders beim Einlesen)
* Längenprüfung
* Backticks
* Parameterübergabe für ein Ausgabeverzeichnis.
* Ansonsten vielleicht PDF verschieben
* Nicht mehr benötigte Dateien (*.log, *.aux, etc.) der Rechnung löschen.
* Den Begleittext im Latex-File durch eine Variable ersetzen.
* Das Program in einem temporären Verzeichnis arbeiten lassen.

View file

@ -15,34 +15,71 @@ Latexcompiler eine Rechnung im PDF-Format erstellt.
Installation
------------
Kopieren Sie die Dateien template.ltx, absender.lco, rechnung.ini und
rechnung.{sh|py} in ein Verzeichnis Ihrer Wahl. Passen Sie die Dateien
rechnung.ini und absender.lco an Ihre Bedürfnisse an.
Variante 1:
Erstellen Sie in $HOME ein Verzeichnis '.rechnung'. Kopieren Sie die
Dateien template.ltx, absender.lco, rechnung.ini in dieses Verzeichnis.
Passen Sie die Dateien rechnung.ini und absender.lco an Ihre Bedürfnisse an.
Kopieren Sie rechnung.{sh|py} in ein Verzeichnis von $PATH.
Variante 2:
Kopieren Sie alle Dateien template.ltx, absender.lco, rechnung.ini und
rechnung.{sh|py} in ein Verzeichnis ihrer Wahl. Sie sollten dann dem
Programm beim Aufruf mit der Option -b das aktuelle Verzeichnis als
Basisverzeichnis mitgeben.
Optionen
--------
-b basisverzeichnis
Hier sucht das Programm nach allen Dateien, die nicht extra als Option
übergeben wurde. Der Defaultwert ist '$HOME/.rechnung'.
-d
Debugmodus ... macht vom Latex-Quelltext und vom Sedfile eine Kopie und
speichert sie im Ausgabeverzeichnis.
-h
Gibt eine kurze Hilfe aus und beendet das Programm.
-f kundendatei
Die Kundendaten werden aus 'kundendatei' gelesen.
-i
Installiert bei Bedarf das Latex-Paket rechnung.sty. Das Paket wird aus
dem Repo geklont, mittels latex gebaut und in das Verzeichnis
$HOME/texmf/latex/tex/rechnung/ kopiert.
-l lco-datei
-k kundendatei
Verwendet 'lco-datei' für verschiedene Variablen des Absenders.
Die Daten zu den einzelnen Kunden werden aus 'kundendatei' gelesen. Der
Defaultwert ist '$BASISVERZEICHNIS/rechnung.ini'. Begin und Ende eines
Kunden sind mit '[start]' und '[ende]' markiert. Die einzelnen Einträge
haben die Form 'schlüssel=wert'. Derzeit sind die Schlüssel kunde,
adresse, anrede, anzahl, position, short, betrag und lfdnr
implementiert.
-q
-l lcodatei
Es werden nur noch Fehlermeldungen ausgegeben.
Verwendet die Datei 'lcodatei' für verschiedene Variablen des
Absenders.
-o ausgabeverzeichnis
Verzeichnis, in welches der Output des Latexkompilers geschrieben wird.
Defaultwert ist das Verzeichnis, in dem das Programm gestartet wird.
-t
Der Pfad zum Latex-Template, welches verwendet werden soll. Default ist
$BASISVERZEICHNIS/template.ltx.
-v
Setzt die Ausgabe auf verbose. Standartmäßig werden nur Fehlermeldungen
und eine Abschlußmeldung ausgegeben.
-V
Zeigt die Programmversion an.

View file

@ -15,13 +15,58 @@ set -e
OLDIFS=$IFS
IFS=' '
unset -f command
unset -f unalias
\unalias -a
UMASK=077
umask=$UMASK
OLDPATH=$PATH
PATH=/bin:/usr/bin
export PATH
unset -f command
unset -f unalias
\unalias -a
# Variablen
# ---------
PROGRAMM_NAME=$(basename $0)
PROGRAMM_VERSION="0.0.2"
VERBOSITY=0
DEBUG=0
COLORED_OUTPUT=0
RED="$(tput bold)$(tput setaf 1)"
GREEN="$(tput bold)$(tput setaf 2)"
YELLOW="$(tput bold)$(tput setaf 3)"
BLUE="$(tput bold)$(tput setaf 4)"
NORMAL="$(tput bold)$(tput sgr0)"
RECHNUNG_STY_URL="https://github.com/tomka/rechnung"
RECHNUNG_STY_FILE="rechnung.sty"
RECHNUNG_STY_HOME="$HOME/texmf/tex/latex/rechnung"
BASEDIR="$HOME/.rechnung"
KUNDENFILE="rechnung.ini"
TEMPLATEFILE="template.ltx"
LCOFILE="absender.lco"
LCO=
INSTALL_LCO_FILE=0
ANZAHL_RECHNUNGEN=0
READABLES_TO_CHECK=
STARTDIR="$(realpath -s `pwd`)"
TEMPDIR=
OUTPUTDIR="$STARTDIR"
LINE_BUFFER=
KEY_BUFFER=
VALUE_BUFFER=
KUNDE=
ADRESSE=
ANREDE=
BEGLEITTEXT=
ANZAHL=
POSITION=
SHORT=
BETRAG=
LFDNR=
# Benötigte Programme
# -------------------
@ -44,92 +89,49 @@ EXECUTABLES_TO_CHECK="$BC_BIN $TR_BIN $SED_BIN $CUT_BIN $TPUT_BIN $DATE_BIN $PDF
GENPDF=""
if [ -x "$RUBBER_BIN" ]; then
GENPDF="$RUBBER_BIN -d "
GENPDF="$RUBBER_BIN -d --into $OUTPUTDIR "
else
GENPDF="$PDFLATEX_BIN -halt-on-error "
GENPDF="$PDFLATEX_BIN -halt-on-error -output-directory $OUTPUTDIR "
fi
# Variablen definieren
# --------------------
PROGRAMM_NAME=$(basename $0)
PROGRAMM_VERSION="0.0.1"
VERBOSITY=1
STY_HOME="$HOME/texmf/tex/latex"
STY_RECHNUNG="rechnung.sty"
STY_URL="https://github.com/tomka/rechnung"
RECHNUNGSFILE="rechnung.ini"
TEMPLATEFILE="template.ltx"
LCOFILE="absender.lco"
LCO=$(basename $LCOFILE .lco)
INSTALL_LCO_FILE=0
SEDFILE="sed.txt"
LINE_BUFFER=""
KEY_BUFFER=""
VALUE_BUFFER=""
KUNDE=""
ADRESSE=""
ANREDE=""
ANZAHL=""
POSITION=""
SHORT=""
BETRAG=""
LFDNR=""
# Farben definieren
# -----------------
NUMBER_OF_COLORS=$($TPUT_BIN colors)
COLORED_OUTPUT=0
RED="$(tput bold)$(tput setaf 1)"
GREEN="$(tput bold)$(tput setaf 2)"
YELLOW="$(tput bold)$(tput setaf 3)"
BLUE="$(tput bold)$(tput setaf 4)"
NORMAL="$(tput bold)$(tput sgr0)"
# Ausgabefunktionen für Terminal
# ------------------------------
print_start() {
msg=$*
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$VERBOSITY" -eq 1 ]; then
if [ "$COLORED_OUTPUT" -eq 1 ]; then
printf "%s[+]%s %s" "$GREEN" "$NORMAL" "$msg"
printf "%s[+]%s %s" "$GREEN" "$NORMAL" "$@"
else
printf " Failed"
fi
fi
}
print_middle() {
if [ "$VERBOSITY" -eq 1 ]; then
printf "%s" "$@"
fi
}
print_failed() {
msg=$*
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$VERBOSITY" -eq 1 ]; then
if [ "$COLORED_OUTPUT" -eq 1 ]; then
printf "%s Failed%s\n" "$RED" "$NORMAL"
else
printf " Failed\n"
fi
if [ ! -z "$msg" ]; then
print_error "$msg"
fi
fi
if [ ! -z "$@" ]; then
print_error "$@"
fi
}
print_ok() {
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$VERBOSITY" -eq 1 ]; then
if [ "$COLORED_OUTPUT" -eq 1 ]; then
printf "%s OK%s\n" "$GREEN" "$NORMAL"
else
@ -138,96 +140,188 @@ print_ok() {
fi
}
print_deko() {
msg=$*
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${BLUE}${msg}${NORMAL}"
else
echo "$msg"
fi
fi
}
print_info() {
msg=$*
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$VERBOSITY" -eq 1 ]; then
if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${GREEN}[+]$NORMAL $msg"
echo "${GREEN}[+]$NORMAL $@"
else
echo "[-] $msg"
echo "[-] $@"
fi
fi
}
print_warn() {
msg=$*
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$VERBOSITY" -eq 1 ]; then
if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${YELLOW}[-]$NORMAL $msg"
echo "${YELLOW}[-]$NORMAL $@" 1>&2
else
echo "[-] $msg"
echo "[-] $@" 1>&2
fi
fi
}
print_error() {
msg=$*
if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${RED}[-]$NORMAL $msg"
echo "${RED}[-]$NORMAL Error: $@" 1>&2
else
echo "[-] $msg"
echo "[-] Error: $@" 1>&2
fi
}
failed_and_exit() {
print_head() {
print_failed
exit $*
if [ "$VERBOSITY" -eq 1 ]; then
if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${BLUE} ========================${NORMAL}"
echo "${BLUE} = $PROGRAMM_NAME v$PROGRAMM_VERSION =${NORMAL}"
echo "${BLUE} ========================${NORMAL}"
else
echo " ========================"
echo " = $PROGRAMM_NAME v$PROGRAMM_VERSION ="
echo " ========================"
fi
fi
}
print_trenner() {
echo "------------------------------------"
}
print_usage() {
cat <<EOF
Usage:
$PROGRAMM_NAME
[-b basedir] Suche hier Dateien, die nicht angegeben wurden
[-d] Debug Modus
[-h] Gibt diese Hilfe aus
[-i] Installiere das Latexpaket rechnung.sty
[-k kundenfile] Pfad zur Datei mit den Kundendaten
[-l lco-file] Pfad zum Latex-Class-Object File
[-o ausgabeverz.] Verzeichnis für die Rechnungen als PDF
[-t templatefile] Pfad zum Latextemplate
[-v] Verbose Modus
[-V] Ausgabe der Programmversion
Für weitere Informationen siehe readme.txt.
EOF
}
print_version() {
echo "$PROGRAMM_NAME version $PROGRAMM_VERSION"
}
# Funktionen zum Beenden
# ----------------------
usage_and_exit() {
print_usage
exit $1
}
clear_and_exit() {
if [ ! $(pwd) = "$STARTDIR" ]; then
print_info "Wechsle nach '$STARTDIR' zurück"
cd $STARTDIR
fi
if [ -d "$TEMPDIR" ]; then
print_info "Entferne temporäres Verzeichnis '$TEMPDIR'"
rm -rf "$TEMPDIR"
fi
msg="Es wurden $ANZAHL_RECHNUNGEN Rechnungen erstellt"
if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${BLUE}[*]${NORMAL} $msg"
else
echo "[*] $msg"
fi
exit $1
}
# Diverse Checks
# --------------
check_readable() {
check_binary() {
# die funktion prüft, ob das benötigte binariy installiert sind. sollte
# das binary ein symlink auf eine andere datei sein, wird solange den
# symlinks gefolgt, bis die executable gefunden ist. dann wird geprüft,
# ob sich diese im PATH befindet. schlägt die prüfungen fehl, wird das
# programm beendet.
program=$1
print_start "Suche nach $program ..."
if [ ! -x "$program" ]; then
print_failed "Das Programm $program wird benötigt, aber nicht gefunden."
exit 3
else
if [ -h "$program" ]; then
program=$(realpath $program)
print_middle " zeigt auf $program ..."
if ! which "$program" 2>&1 >/dev/null; then
print_failed "$program ist nicht im Pfad"
fi
fi
print_ok
fi
}
check_file() {
# testet, ob die übergebene datei kein symlink ist, existiert und lesbar
# ist. schlägt einer der tests fehl, wird das programm beendet.
print_start "Datei $1 ist lesbar ..."
if test -h "$1"; then
target=$(get_link_target "$1")
print_failed "$1 ist ein symbolischer Link auf $target"
exit 1
file="$*"
print_start "Suche nach Datei $file ..."
if [ -h "$file" ]; then
target=$(realpath "$file")
print_failed "'$file' ist ein symbolischer Link auf '$target'"
exit 4
fi
if test -f "$1" && test -r "$1"; then
if test -f "$file" && test -r "$file"; then
print_ok
else
failed_and_exit 1
print_failed "Datei '$file' nicht lesbar oder nicht gefunden"
exit 5
fi
}
check_sty() (
check_dir() {
# sucht in einer subshell nach dem paket rechnung.sty. gibt true oder
# false zurück.
# testet, ob das übergebene verzeichnis keine link ist, existiert und
# hinein gewechselt werden darf. schlägt ein test fehl, wird das
# programm beendet.
print_start "Suche nach $STY_RECHNUNG ..."
kpsewhich "$STY_RECHNUNG" 2>&1 >/dev/null
dir="$*"
print_start "Suche nach Verzeichnis $dir ..."
if [ -h "$dir" ]; then
target=$(realpath "$dir")
print_failed "'$dir' ist ein symbolischer Link auf '$target'"
exit 6
fi
if test -d "$dir" && test -x "$dir"; then
print_ok
else
print_failed "Verzeichnis '$dir' nicht gefunden oder keine Berechtigung"
exit 7
fi
}
check_sty() {
# sucht nach dem paket rechnung.sty. gibt true oder false zurück.
print_start "Suche nach $RECHNUNG_STY_FILE ..."
kpsewhich "$RECHNUNG_STY_FILE" 2>&1 >/dev/null
if [ $? -eq 0 ]; then
print_ok
return 0
@ -235,49 +329,7 @@ check_sty() (
print_failed
return 1
fi
)
check_binaries() (
# die funktion prüft in einer subshell, ob alle benötigten binaries
# installiert sind. sollte das binary ein symlink auf eine ander datei
# sein, wird geprüft, ob sich diese im PATH befindet und nicht ebenfalls
# ein symlink ist. schlägt eine der prüfungen fehl, wird das programm
# beendet.
program=
binaries=$*
for program in $binaries; do
print_start "Suche nach $program ..."
if test ! -x "$program"; then
print_failed "Das Programm $program wird benötigt, aber nicht gefunden."
quit 3
else
if [ -h "$program" ]; then
program=$(get_link_target $program)
fi
if ! which "$program" 2>&1 >/dev/null; then
print_failed "$program ist nicht im Pfad"
fi
print_ok
fi
done
)
get_link_target() (
# die funktion bekommt einen symbolischen link und folgt ihm bis zum
# ende. mit dem echo-befehl wird das ziel an die aufrufende funktion
# zurück gegeben.
program=$1
while [ -h "$program" ]; do
program=$(readlink $program)
done
echo "$program"
)
}
is_option() (
@ -293,41 +345,105 @@ is_option() (
fi
)
check_rechnunsdaten() (
check_rechnunsdaten() {
# die funktion überprüft in einer subshell, ob alle variablen belegt
# sind. ist eine variable leer, wird der name der variablen ausgegeben
# und ein fehler (1) zurück gegeben.
# die funktion prüft, ob alle variablen belegt sind. ist eine variable
# leer, wird der name der variablen ausgegeben und ein fehler (1) zurück
# gegeben.
response=1
print_start "Prüfe Rechnungsdaten ..."
if test -z "$KUNDE"; then
print_failed "Das Feld Kunde ist leer"
return 1
elif test -z "$ADRESSE"; then
print_failed "Das Feld Adresse ist leer"
return 1
elif test -z "$ANREDE"; then
print_failed "Das Feld Anrede ist leer"
return 1
elif test -z "$ANZAHL"; then
print_failed "Das Feld Anzahl ist leer"
return 1
elif test -z "$POSITION"; then
print_failed "Das Feld Position ist leer"
return 1
elif test -z "$SHORT"; then
print_failed "Das Feld Short ist leer"
return 1
elif test -z "$BETRAG"; then
print_failed "Das Feld Betrag ist leer"
return 1
elif test -z "$LFDNR"; then
print_failed "Das Feld LfdNr ist leer"
return 1
else
print_ok
return 0
response=0
fi
return $response
}
# Funktionen zum setzen von CLI-Variablen
# ---------------------------------------
set_cli_opt() {
# die funktion setzt für einen übergebenen pfad den absoluten pfad ohne
# sich darim zu kümmern, ob er existiert. FIS= sorgt dafür, daß der
# übergebene pfad nicht getrennt wird. sollte nur als subshell
# aufgerufen werden.
IFS=
echo "$(realpath -m -s "$@")"
}
set_abs_path() {
filename="$*"
first=$(echo "$filename" | cut -c1-1)
if [ ! "$first" = "/" ]; then
filename=$(realpath -m "$BASEDIR/$filename")
fi
echo "$filename"
}
# LaTeX-Paket rechnung.sty installieren
# -------------------------------------
install_sty() (
# Clont das Repo von rechnung.sty, baut das Latex-Paket und kopiert es
# nach $HOME/texmf/tex/latex/rechnung. Schlägt einer der Schritte fehl,
# wird clean_and_exit aufgerufen.
## notwendige programm prüfen
for program in "$GIT_BIN" "$LATEX_BIN"; do
check_binary $program
done
## Repo clonen
print_start "Hole Repo von $RECHNUNG_STY_URL ..."
if $GIT_BIN clone $RECHNUNG_STY_URL >/dev/null 2>&1; then
print_ok
cd rechnung
## rechnung.sty kompilieren
print_start "Kompiliere $RECHNUNG_STY_FILE ..."
if $LATEX_BIN rechnung.ins >/dev/null 2>&1; then
print_ok
## mach TEXHOME/rechnung/ kopieren
print_start "Kopiere $RECHNUNG_STY_FILE nach $RECHNUNG_STY_HOME ..."
if [ ! -d "$RECHNUNG_STY_HOME" ]; then
mkdir -p "$RECHNUNG_STY_HOME"
fi
if cp rechnung.sty "$RECHNUNG_STY_HOME"; then
print_ok
print_info "Paket $RECHNUNG_STY_FILE erfolgreich installiert"
else
print_failed "Installation fehlgeschlagen"
clean_and_exit 12
fi
else
print_failed "Kompilieren fehlgeschlagen"
clean_and_exit 11
fi
else
print_failed "Klonen des Repos fehlgeschlagen"
clean_and_exit 10
fi
cd "$TEMPDIR"
)
# Whitespaces entfernen
@ -358,47 +474,6 @@ trim_value() {
set +f
}
# LaTeX-Paket rechnung.sty installieren
# -------------------------------------
install_sty() (
old_pwd=$(pwd)
check_binaries "$GIT_BIN $LATEX_BIN"
print_start "Hole Repo von $STY_URL ..."
if $GIT_BIN clone $STY_URL >/dev/null 2>&1; then
print_ok
cd rechnung
mkdir -p "$STY_HOME/rechnung/"
print_start "Kompiliere $STY_RECHNUNG ..."
if $LATEX_BIN rechnung.ins >/dev/null 2>&1; then
print_ok
print_start "Kopiere $STY_RECHNUNG nach $STY_HOME/rechnung ..."
if cp rechnung.sty "$STY_HOME/rechnung/"; then
print_ok
else
failed_and_exit 3
fi
cd "$old_pwd"
rm -rf rechnung/
print_info "Paket $STY_RECHNUNG erfolgreich installiert"
else
print_error "Installation fehlgeschlagen"
exit 4
fi
else
print_error "Klonen des Repos fehlgeschlagen"
exit 5
fi
)
# wenn ein neuer Kunde beginnt, alle Variablen neu initialisieren
# ---------------------------------------------------------------
reset_values() {
print_info "Beginne neue Rechnung"
@ -424,6 +499,7 @@ set_value() {
trim_key "$key"
trim_value "$value"
print_info "Setze $key auf $value"
case $KEY_BUFFER in
kunde) KUNDE="$VALUE_BUFFER";;
adresse) ADRESSE="$VALUE_BUFFER";;
@ -437,7 +513,7 @@ set_value() {
esac
}
make_invoice() (
make_invoice() {
# die funktion erstellt in einer subshell die rechnung. schlägt die
# prüfung der rechnungsdaten fehl, kehrt sie zur aufrufenden shell
@ -445,11 +521,12 @@ make_invoice() (
# darin befindlichen platzhalter durch die entsprechenden variablen zu
# ersetzen und das ganze zu kompilieren.
check_rechnunsdaten
if [ ! "$?" -eq 0 ]; then
return 1
if ! check_rechnunsdaten; then
print_error "Check der Rechnungsdaten fehlgeschlagen"
print_error "Erstelle keine Rechnung"
print_trenner
return
fi
dead_days="14"
if [ "$(date +%u)" -gt 5 ]; then
dead_days="16"
@ -461,6 +538,7 @@ make_invoice() (
rechnungsnummer="$inv_date--$LFDNR"
subject="Rechnung zu $SHORT"
filename="$(date '+%Y%m%d')_Rechnung_${month_ascii}_$(echo "$KUNDE" | $TR_BIN " " "_").ltx"
sedfile="$(basename -s .ltx $filename).sed"
buffer="$KUNDE; $ADRESSE"
anschrift="$(echo "$buffer" | sed 's/; /\\\\\\\\\\\\\\ /g')"
@ -475,24 +553,29 @@ make_invoice() (
printf "s!#POSITION#!%s!\n" "$POSITION"
printf "s!#BETRAG#!%s!\n" "$BETRAG"
printf "s!#DEADLINE#!%s!\n" "$inv_dead"
} >$SEDFILE
} >$sedfile
cp "$TEMPLATEFILE" "$filename"
$SED_BIN -i -f "$SEDFILE" "$filename"
$SED_BIN -i -f "$sedfile" "$filename"
if [ "$DEBUG" -eq 1 ]; then
cp "$filename" "$sedfile" "$OUTPUTDIR"
fi
if ! $GENPDF "$filename" 1>&2 >/dev/null; then
print_error "Kompilierung von $filename fehlgeschlagen"
logfile=$(echo "$filename" | sed -e s/ltx/log/)
logfile=$(echo "$OUTPUTDIR/$filename" | sed -e s/ltx/log/)
print_error "$(grep "Error" $logfile)"
else
print_info "Rechnung $filename erfolgreich erstellt"
ANZAHL_RECHNUNGEN=$(expr $ANZAHL_RECHNUNGEN + 1)
fi
if [ -x "$RUBBER_BIN" ]; then
"$RUBBER_BIN" --clean "$filename"
fi
)
print_trenner
}
proced_ini_line() {
parse_line() {
line=$*
first=$(echo "$line" | cut -c1-1)
@ -524,71 +607,114 @@ proced_ini_line() {
fi
}
display_help() (
echo "Usage: $PROGRAMM_NAME [-f rechnungsfile] [-h] [-l lco-file]"
)
display_version() (
echo "$PROGRAMM_NAME version $PROGRAMM_VERSION"
)
quit() {
printf "\n"
printf "%s" "$BLUE"
printf "[-] Exit%s\n" "$NORMAL"
exit 1
}
# --- Programmstart --- #
# --------------------- #
# CLI Optionen auswerten
while getopts f:hl:qv opt
do
case $opt in
f) RECHNUNGSFILE=$OPTARG;;
h) display_help; exit 0;;
i) INSTALL_LCO_FILE=1;;
l) LCOFILE=$OPTARG;;
q) VERBOSITY=0;;
v) display_version; exit 0;;
*) display_help; exit 1;;
esac
done
## Nicht als Root laufen lassen
if [ "$(id -u)" -eq 0 ]; then
echo "$PROGRAMM_NAME: Das Skript sollte nicht als Root ausgeführt werden!"
exit 1
fi
# Farbe aktivieren wenn vorhanden
## Farbe aktivieren wenn vorhanden
NUMBER_OF_COLORS=$($TPUT_BIN colors)
if [ -n "$NUMBER_OF_COLORS" ] && [ "$NUMBER_OF_COLORS" -ge 8 ]; then
COLORED_OUTPUT=1
fi
print_deko " ========================"
print_deko " = $PROGRAMM_NAME v$PROGRAMM_VERSION ="
print_deko " ========================"
# Verschiedene Basic Checks
if [ "$(id -u)" -eq 0 ]; then
print_error "$0: Das Skript darf nicht als Root ausgeführt werden."
exit 1
fi
check_binaries "$EXECUTABLES_TO_CHECK"
check_readable "$RECHNUNGSFILE"
check_readable "$TEMPLATEFILE"
check_readable "$LCOFILE"
if ! check_sty; then
print_warn "Verwenden sie -i um $STY_RECHNUNG zu installieren"
if [ $INSTALL_LCO_FILE -eq 0 ]; then
exit 7
else
install_sty
fi
fi
# Kundendatei einlesen und rechnungen erstellen
while IFS= read -r rawline
## CLI Optionen auswerten
while getopts b:dhik:l:o:t:vV opt
do
trim_line "$rawline"
proced_ini_line "$LINE_BUFFER"
done < "$RECHNUNGSFILE"
case $opt in
b)
BASEDIR=$(set_cli_opt "$OPTARG")
;;
d)
DEBUG=1
;;
h)
usage_and_exit 0
;;
i)
INSTALL_LCO_FILE=1
;;
k)
KUNDENFILE=$(set_cli_opt "$OPTARG")
;;
l)
LCOFILE=$(set_cli_opt "$OPTARG")
;;
o)
OUTPUTDIR=$(set_cli_opt "$OPTARG")
;;
t)
TEMPLATEFILE=$(set_cli_opt "$OPTARG")
;;
v)
VERBOSITY=1
;;
V)
print_version
;;
*)
usage_and_exit 2
;;
esac
done
print_head
## Die nötigen Programme und rechnung.sty testen
for program in $EXECUTABLES_TO_CHECK; do
check_binary $program
done
## relative pfade in den variablen LCOFILE, KUNDENFILE und TEMPLATEFILE wenn
## nötig in absolute pfade umwandeln. -- TODO: das geht sicher besser.
LCOFILE=$(set_abs_path "$LCOFILE")
KUNDENFILE=$(set_abs_path "$KUNDENFILE")
TEMPLATEFILE=$(set_abs_path "$TEMPLATEFILE")
## verzeichnisse testen
check_dir "$BASEDIR"
check_dir "$OUTPUTDIR"
## die nötigen Dateien testen und die Variable LCO setzen
for file in "$LCOFILE" "$KUNDENFILE" "$TEMPLATEFILE"; do
check_file "$file"
done
LCO=$(basename "$LCOFILE" .lco)
## temporäres Verzeichnis erstellen und hineinwechseln
TEMPDIR=$(mktemp -d)
if [ ! $? -eq 0 ]; then
print_error "Erstellen der temp. Verzeichnis fehlgeschlagen"
exit 8
else
cd "$TEMPDIR"
print_info "Wechsle nach $(pwd)"
## prüfen, ob rechnung.sty installiert ist
if ! check_sty; then
if [ $INSTALL_LCO_FILE -eq 0 ]; then
print_error "Verwenden sie -i um $RECHNUNG_STY_FILE zu installieren"
clear_and_exit 9
else
print_info "Versuche $RECHNUNG_STY_FILE zu installieren"
install_sty
fi
fi
# Kundendatei einlesen und die einzelnen Zeilen an den Zeilenparser
# weiterreichen.
while IFS= read -r rawline
do
trim_line "$rawline"
parse_line "$LINE_BUFFER"
done < "$KUNDENFILE"
fi
# aufräumen
clear_and_exit 0

View file

@ -3,12 +3,12 @@ parskip=half,%
%DIV=calc,%
% Was kommt in den Briefkopf und in die Anschrift
fromalign=right,%% Plazierung des Briefkopfs
frommobilephone=on,%% Telefonnummer im Absender
frommobilephone=on,%% Telefonnummer im Absender
fromrule=aftername,%% Linie im Absender (aftername, afteraddress)
fromfax=off,%% Faxnummer
fromemail=on,%% Emailadresse
fromurl=off,%% Homepage
fromlogo=off,%% Firmenlogo
fromlogo=off,%% Firmenlogo
addrfield=on,%% Adressfeld fuer Fensterkuverts
backaddress=on,%% ...und Absender im Fenster
subject=beforeopening,%% Plazierung der Betreffzeile
@ -33,18 +33,44 @@ parskip=half,%
\begin{document}
\LoadLetterOption{DIN}
\makeatletter
\@addtoplength[-]{firstfootvpos}{.75cm} % Fuß ein Stück nach oben
%\@addtoplength[-]{firstfootvpos}{.75cm} % Fuß ein Stück nach oben
\@setplength{firstfootvpos}{270mm} % noch ein stück weiter nach oben
\makeatother
%\setkomavar{firstfoot}{\footnotesize%
%\rule[3pt]{\textwidth}{.4pt} \\
%\begin{tabularx}{\textwidth}{XXl}
% \usekomavar{fromname} & \usekomavar{fromcourt} & \textbf{Bankverbindung}\\
% \usekomavar{signature} & USt.-IdNr.: & IBAN: \usekomavar{fromiban1}\\
% \usekomavar{fromstreet} & \usekomavar{fromustid} & \hfill{}\usekomavar{fromiban2}\\
% \usekomavar{fromtown} & & \usekomavar{frombank}
%\end{tabularx}%
%}
\setkomavar{firstfoot}{\footnotesize%
\rule[3pt]{\textwidth}{.4pt} \\
\begin{tabularx}{\textwidth}{XXl}
\usekomavar{fromname} & \usekomavar{fromcourt} & \textbf{Bankverbindung}\\
\usekomavar{signature} & USt.-IdNr.: & IBAN: \usekomavar{fromiban1}\\
\usekomavar{fromstreet} & \usekomavar{fromustid} & \hfill{}\usekomavar{fromiban2}\\
\usekomavar{fromtown} & & \usekomavar{frombank}
\end{tabularx}%
}
\rule[3pt]{\textwidth}{.4pt}\\
\begin{tabular}[t]{l@{}}%
\textsl{Anschrift:}\\
\usekomavar{fromname}\\
Inh.~\usekomavar{signature}\\
\usekomavar{fromaddress}\\
\end{tabular}%
\hfill
\begin{tabular}[t]{l@{}}%
\textsl{Kontakt:}\\
\faMobilePhone~\usekomavar{frommobilephone}\\
\faBolt~\usekomavar{fromurl}\\
\faEnvelopeO~\usekomavar{fromemail}\\
\end{tabular}%
\hfill
\begin{tabular}[t]{l@{}}%
\textsl{Bankverbindung:}\\
\usekomavar{frombank}\\
\usekomavar{fromiban1}~\usekomavar{fromiban2}\\
\textsl{Ust.-IdNr.:}\\
\usekomavar{fromustid}\\
\end{tabular}%
}%
\begin{letter}{#ANSCHRIFT#}