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) * Bessere Fehlerkontrolle (besonders beim Einlesen)
* Längenprüfung * Längenprüfung
* Backticks * Backticks
* Parameterübergabe für ein Ausgabeverzeichnis.
* Ansonsten vielleicht PDF verschieben
* Nicht mehr benötigte Dateien (*.log, *.aux, etc.) der Rechnung löschen. * Nicht mehr benötigte Dateien (*.log, *.aux, etc.) der Rechnung löschen.
* Den Begleittext im Latex-File durch eine Variable ersetzen. * 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 Installation
------------ ------------
Kopieren Sie die Dateien template.ltx, absender.lco, rechnung.ini und Variante 1:
rechnung.{sh|py} in ein Verzeichnis Ihrer Wahl. Passen Sie die Dateien
rechnung.ini und absender.lco an Ihre Bedürfnisse an. 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 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 -h
Gibt eine kurze Hilfe aus und beendet das Programm. Gibt eine kurze Hilfe aus und beendet das Programm.
-f kundendatei
Die Kundendaten werden aus 'kundendatei' gelesen.
-i -i
Installiert bei Bedarf das Latex-Paket rechnung.sty. Das Paket wird aus Installiert bei Bedarf das Latex-Paket rechnung.sty. Das Paket wird aus
dem Repo geklont, mittels latex gebaut und in das Verzeichnis dem Repo geklont, mittels latex gebaut und in das Verzeichnis
$HOME/texmf/latex/tex/rechnung/ kopiert. $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 -v
Setzt die Ausgabe auf verbose. Standartmäßig werden nur Fehlermeldungen
und eine Abschlußmeldung ausgegeben.
-V
Zeigt die Programmversion an. Zeigt die Programmversion an.

View file

@ -15,13 +15,58 @@ set -e
OLDIFS=$IFS OLDIFS=$IFS
IFS=' ' IFS=' '
UMASK=077
unset -f command umask=$UMASK
unset -f unalias
\unalias -a
OLDPATH=$PATH OLDPATH=$PATH
PATH=/bin:/usr/bin PATH=/bin:/usr/bin
export PATH 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 # Benötigte Programme
# ------------------- # -------------------
@ -44,92 +89,49 @@ EXECUTABLES_TO_CHECK="$BC_BIN $TR_BIN $SED_BIN $CUT_BIN $TPUT_BIN $DATE_BIN $PDF
GENPDF="" GENPDF=""
if [ -x "$RUBBER_BIN" ]; then if [ -x "$RUBBER_BIN" ]; then
GENPDF="$RUBBER_BIN -d " GENPDF="$RUBBER_BIN -d --into $OUTPUTDIR "
else else
GENPDF="$PDFLATEX_BIN -halt-on-error " GENPDF="$PDFLATEX_BIN -halt-on-error -output-directory $OUTPUTDIR "
fi 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 # Ausgabefunktionen für Terminal
# ------------------------------ # ------------------------------
print_start() { print_start() {
msg=$* if [ "$VERBOSITY" -eq 1 ]; then
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then if [ "$COLORED_OUTPUT" -eq 1 ]; then
printf "%s[+]%s %s" "$GREEN" "$NORMAL" "$msg" printf "%s[+]%s %s" "$GREEN" "$NORMAL" "$@"
else else
printf " Failed" printf " Failed"
fi fi
fi fi
} }
print_middle() {
if [ "$VERBOSITY" -eq 1 ]; then
printf "%s" "$@"
fi
}
print_failed() { print_failed() {
msg=$* if [ "$VERBOSITY" -eq 1 ]; then
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then if [ "$COLORED_OUTPUT" -eq 1 ]; then
printf "%s Failed%s\n" "$RED" "$NORMAL" printf "%s Failed%s\n" "$RED" "$NORMAL"
else else
printf " Failed\n" printf " Failed\n"
fi fi
if [ ! -z "$msg" ]; then fi
print_error "$msg" if [ ! -z "$@" ]; then
fi print_error "$@"
fi fi
} }
print_ok() { print_ok() {
if [ "$VERBOSITY" -eq 0 ]; then if [ "$VERBOSITY" -eq 1 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then if [ "$COLORED_OUTPUT" -eq 1 ]; then
printf "%s OK%s\n" "$GREEN" "$NORMAL" printf "%s OK%s\n" "$GREEN" "$NORMAL"
else else
@ -138,96 +140,188 @@ print_ok() {
fi 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() { print_info() {
msg=$* if [ "$VERBOSITY" -eq 1 ]; then
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${GREEN}[+]$NORMAL $msg" echo "${GREEN}[+]$NORMAL $@"
else else
echo "[-] $msg" echo "[-] $@"
fi fi
fi fi
} }
print_warn() { print_warn() {
msg=$* if [ "$VERBOSITY" -eq 1 ]; then
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${YELLOW}[-]$NORMAL $msg" echo "${YELLOW}[-]$NORMAL $@" 1>&2
else else
echo "[-] $msg" echo "[-] $@" 1>&2
fi fi
fi fi
} }
print_error() { print_error() {
msg=$*
if [ "$COLORED_OUTPUT" -eq 1 ]; then if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${RED}[-]$NORMAL $msg" echo "${RED}[-]$NORMAL Error: $@" 1>&2
else else
echo "[-] $msg" echo "[-] Error: $@" 1>&2
fi fi
} }
failed_and_exit() { print_head() {
print_failed if [ "$VERBOSITY" -eq 1 ]; then
exit $* 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 # 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 # testet, ob die übergebene datei kein symlink ist, existiert und lesbar
# ist. schlägt einer der tests fehl, wird das programm beendet. # ist. schlägt einer der tests fehl, wird das programm beendet.
print_start "Datei $1 ist lesbar ..." file="$*"
if test -h "$1"; then
target=$(get_link_target "$1") print_start "Suche nach Datei $file ..."
print_failed "$1 ist ein symbolischer Link auf $target" if [ -h "$file" ]; then
exit 1 target=$(realpath "$file")
print_failed "'$file' ist ein symbolischer Link auf '$target'"
exit 4
fi fi
if test -f "$1" && test -r "$1"; then if test -f "$file" && test -r "$file"; then
print_ok print_ok
else else
failed_and_exit 1 print_failed "Datei '$file' nicht lesbar oder nicht gefunden"
exit 5
fi fi
} }
check_sty() ( check_dir() {
# sucht in einer subshell nach dem paket rechnung.sty. gibt true oder # testet, ob das übergebene verzeichnis keine link ist, existiert und
# false zurück. # hinein gewechselt werden darf. schlägt ein test fehl, wird das
# programm beendet.
print_start "Suche nach $STY_RECHNUNG ..." dir="$*"
kpsewhich "$STY_RECHNUNG" 2>&1 >/dev/null
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 if [ $? -eq 0 ]; then
print_ok print_ok
return 0 return 0
@ -235,49 +329,7 @@ check_sty() (
print_failed print_failed
return 1 return 1
fi 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() ( is_option() (
@ -293,41 +345,105 @@ is_option() (
fi fi
) )
check_rechnunsdaten() ( check_rechnunsdaten() {
# die funktion überprüft in einer subshell, ob alle variablen belegt # die funktion prüft, ob alle variablen belegt sind. ist eine variable
# sind. ist eine variable leer, wird der name der variablen ausgegeben # leer, wird der name der variablen ausgegeben und ein fehler (1) zurück
# und ein fehler (1) zurück gegeben. # gegeben.
response=1
print_start "Prüfe Rechnungsdaten ..." print_start "Prüfe Rechnungsdaten ..."
if test -z "$KUNDE"; then if test -z "$KUNDE"; then
print_failed "Das Feld Kunde ist leer" print_failed "Das Feld Kunde ist leer"
return 1
elif test -z "$ADRESSE"; then elif test -z "$ADRESSE"; then
print_failed "Das Feld Adresse ist leer" print_failed "Das Feld Adresse ist leer"
return 1
elif test -z "$ANREDE"; then elif test -z "$ANREDE"; then
print_failed "Das Feld Anrede ist leer" print_failed "Das Feld Anrede ist leer"
return 1
elif test -z "$ANZAHL"; then elif test -z "$ANZAHL"; then
print_failed "Das Feld Anzahl ist leer" print_failed "Das Feld Anzahl ist leer"
return 1
elif test -z "$POSITION"; then elif test -z "$POSITION"; then
print_failed "Das Feld Position ist leer" print_failed "Das Feld Position ist leer"
return 1
elif test -z "$SHORT"; then elif test -z "$SHORT"; then
print_failed "Das Feld Short ist leer" print_failed "Das Feld Short ist leer"
return 1
elif test -z "$BETRAG"; then elif test -z "$BETRAG"; then
print_failed "Das Feld Betrag ist leer" print_failed "Das Feld Betrag ist leer"
return 1
elif test -z "$LFDNR"; then elif test -z "$LFDNR"; then
print_failed "Das Feld LfdNr ist leer" print_failed "Das Feld LfdNr ist leer"
return 1
else else
print_ok print_ok
return 0 response=0
fi 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 # Whitespaces entfernen
@ -358,47 +474,6 @@ trim_value() {
set +f 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() { reset_values() {
print_info "Beginne neue Rechnung" print_info "Beginne neue Rechnung"
@ -424,6 +499,7 @@ set_value() {
trim_key "$key" trim_key "$key"
trim_value "$value" trim_value "$value"
print_info "Setze $key auf $value"
case $KEY_BUFFER in case $KEY_BUFFER in
kunde) KUNDE="$VALUE_BUFFER";; kunde) KUNDE="$VALUE_BUFFER";;
adresse) ADRESSE="$VALUE_BUFFER";; adresse) ADRESSE="$VALUE_BUFFER";;
@ -437,7 +513,7 @@ set_value() {
esac esac
} }
make_invoice() ( make_invoice() {
# die funktion erstellt in einer subshell die rechnung. schlägt die # die funktion erstellt in einer subshell die rechnung. schlägt die
# prüfung der rechnungsdaten fehl, kehrt sie zur aufrufenden shell # prüfung der rechnungsdaten fehl, kehrt sie zur aufrufenden shell
@ -445,11 +521,12 @@ make_invoice() (
# darin befindlichen platzhalter durch die entsprechenden variablen zu # darin befindlichen platzhalter durch die entsprechenden variablen zu
# ersetzen und das ganze zu kompilieren. # ersetzen und das ganze zu kompilieren.
check_rechnunsdaten if ! check_rechnunsdaten; then
if [ ! "$?" -eq 0 ]; then print_error "Check der Rechnungsdaten fehlgeschlagen"
return 1 print_error "Erstelle keine Rechnung"
print_trenner
return
fi fi
dead_days="14" dead_days="14"
if [ "$(date +%u)" -gt 5 ]; then if [ "$(date +%u)" -gt 5 ]; then
dead_days="16" dead_days="16"
@ -461,6 +538,7 @@ make_invoice() (
rechnungsnummer="$inv_date--$LFDNR" rechnungsnummer="$inv_date--$LFDNR"
subject="Rechnung zu $SHORT" subject="Rechnung zu $SHORT"
filename="$(date '+%Y%m%d')_Rechnung_${month_ascii}_$(echo "$KUNDE" | $TR_BIN " " "_").ltx" filename="$(date '+%Y%m%d')_Rechnung_${month_ascii}_$(echo "$KUNDE" | $TR_BIN " " "_").ltx"
sedfile="$(basename -s .ltx $filename).sed"
buffer="$KUNDE; $ADRESSE" buffer="$KUNDE; $ADRESSE"
anschrift="$(echo "$buffer" | sed 's/; /\\\\\\\\\\\\\\ /g')" anschrift="$(echo "$buffer" | sed 's/; /\\\\\\\\\\\\\\ /g')"
@ -475,24 +553,29 @@ make_invoice() (
printf "s!#POSITION#!%s!\n" "$POSITION" printf "s!#POSITION#!%s!\n" "$POSITION"
printf "s!#BETRAG#!%s!\n" "$BETRAG" printf "s!#BETRAG#!%s!\n" "$BETRAG"
printf "s!#DEADLINE#!%s!\n" "$inv_dead" printf "s!#DEADLINE#!%s!\n" "$inv_dead"
} >$SEDFILE } >$sedfile
cp "$TEMPLATEFILE" "$filename" 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 if ! $GENPDF "$filename" 1>&2 >/dev/null; then
print_error "Kompilierung von $filename fehlgeschlagen" 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)" print_error "$(grep "Error" $logfile)"
else else
print_info "Rechnung $filename erfolgreich erstellt" print_info "Rechnung $filename erfolgreich erstellt"
ANZAHL_RECHNUNGEN=$(expr $ANZAHL_RECHNUNGEN + 1)
fi fi
if [ -x "$RUBBER_BIN" ]; then if [ -x "$RUBBER_BIN" ]; then
"$RUBBER_BIN" --clean "$filename" "$RUBBER_BIN" --clean "$filename"
fi fi
) print_trenner
}
proced_ini_line() { parse_line() {
line=$* line=$*
first=$(echo "$line" | cut -c1-1) first=$(echo "$line" | cut -c1-1)
@ -524,71 +607,114 @@ proced_ini_line() {
fi 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 --- # # --- Programmstart --- #
# --------------------- # # --------------------- #
# CLI Optionen auswerten ## Nicht als Root laufen lassen
while getopts f:hl:qv opt if [ "$(id -u)" -eq 0 ]; then
do echo "$PROGRAMM_NAME: Das Skript sollte nicht als Root ausgeführt werden!"
case $opt in exit 1
f) RECHNUNGSFILE=$OPTARG;; fi
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
# 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 if [ -n "$NUMBER_OF_COLORS" ] && [ "$NUMBER_OF_COLORS" -ge 8 ]; then
COLORED_OUTPUT=1 COLORED_OUTPUT=1
fi fi
print_deko " ========================" ## CLI Optionen auswerten
print_deko " = $PROGRAMM_NAME v$PROGRAMM_VERSION =" while getopts b:dhik:l:o:t:vV opt
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
do do
trim_line "$rawline" case $opt in
proced_ini_line "$LINE_BUFFER" b)
done < "$RECHNUNGSFILE" 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,% %DIV=calc,%
% Was kommt in den Briefkopf und in die Anschrift % Was kommt in den Briefkopf und in die Anschrift
fromalign=right,%% Plazierung des Briefkopfs fromalign=right,%% Plazierung des Briefkopfs
frommobilephone=on,%% Telefonnummer im Absender frommobilephone=on,%% Telefonnummer im Absender
fromrule=aftername,%% Linie im Absender (aftername, afteraddress) fromrule=aftername,%% Linie im Absender (aftername, afteraddress)
fromfax=off,%% Faxnummer fromfax=off,%% Faxnummer
fromemail=on,%% Emailadresse fromemail=on,%% Emailadresse
fromurl=off,%% Homepage fromurl=off,%% Homepage
fromlogo=off,%% Firmenlogo fromlogo=off,%% Firmenlogo
addrfield=on,%% Adressfeld fuer Fensterkuverts addrfield=on,%% Adressfeld fuer Fensterkuverts
backaddress=on,%% ...und Absender im Fenster backaddress=on,%% ...und Absender im Fenster
subject=beforeopening,%% Plazierung der Betreffzeile subject=beforeopening,%% Plazierung der Betreffzeile
@ -33,18 +33,44 @@ parskip=half,%
\begin{document} \begin{document}
\LoadLetterOption{DIN} \LoadLetterOption{DIN}
\makeatletter \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 \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% \setkomavar{firstfoot}{\footnotesize%
\rule[3pt]{\textwidth}{.4pt} \\ \rule[3pt]{\textwidth}{.4pt}\\
\begin{tabularx}{\textwidth}{XXl} \begin{tabular}[t]{l@{}}%
\usekomavar{fromname} & \usekomavar{fromcourt} & \textbf{Bankverbindung}\\ \textsl{Anschrift:}\\
\usekomavar{signature} & USt.-IdNr.: & IBAN: \usekomavar{fromiban1}\\ \usekomavar{fromname}\\
\usekomavar{fromstreet} & \usekomavar{fromustid} & \hfill{}\usekomavar{fromiban2}\\ Inh.~\usekomavar{signature}\\
\usekomavar{fromtown} & & \usekomavar{frombank} \usekomavar{fromaddress}\\
\end{tabularx}% \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#} \begin{letter}{#ANSCHRIFT#}