Compare commits
22 commits
Author | SHA1 | Date | |
---|---|---|---|
82cbf0a4a7 | |||
3364cad3ec | |||
ef70318e30 | |||
d15355b689 | |||
2095a4cdca | |||
bdb15c0e0b | |||
7813890db6 | |||
691f1ff563 | |||
feb3b49abb | |||
72bdf42172 | |||
ad5ba83adf | |||
bb884d5e62 | |||
09722922b9 | |||
7c5c93444c | |||
f4e187c048 | |||
df55d17113 | |||
bf2ca2c96b | |||
8654e69a4a | |||
074650c9b0 | |||
1c4a695cae | |||
7bf85fc94b | |||
c5fb722e40 |
7 changed files with 326 additions and 498 deletions
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "rechnung_sty"]
|
||||||
|
path = rechnung_sty
|
||||||
|
url = https://git.nr18.space/qbi/rechnung.sty
|
3
TODO.txt
3
TODO.txt
|
@ -4,6 +4,9 @@ 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.
|
||||||
|
|
||||||
|
|
59
readme.txt
59
readme.txt
|
@ -15,71 +15,34 @@ Latexcompiler eine Rechnung im PDF-Format erstellt.
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Variante 1:
|
Kopieren Sie die Dateien template.ltx, absender.lco, rechnung.ini und
|
||||||
|
rechnung.{sh|py} in ein Verzeichnis Ihrer Wahl. Passen Sie die Dateien
|
||||||
Erstellen Sie in $HOME ein Verzeichnis '.rechnung'. Kopieren Sie die
|
rechnung.ini und absender.lco an Ihre Bedürfnisse an.
|
||||||
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.
|
||||||
|
|
||||||
-k kundendatei
|
-l lco-datei
|
||||||
|
|
||||||
Die Daten zu den einzelnen Kunden werden aus 'kundendatei' gelesen. Der
|
Verwendet 'lco-datei' für verschiedene Variablen des Absenders.
|
||||||
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.
|
|
||||||
|
|
||||||
-l lcodatei
|
-q
|
||||||
|
|
||||||
Verwendet die Datei 'lcodatei' für verschiedene Variablen des
|
Es werden nur noch Fehlermeldungen ausgegeben.
|
||||||
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.
|
||||||
|
|
11
rechnung.ini
11
rechnung.ini
|
@ -1,12 +1,13 @@
|
||||||
# file: rechnung.ini
|
# file: rechnung.ini
|
||||||
#
|
#
|
||||||
# Bei adresse1 muss am Ende ein Semikolon (;) stehen. Dies sorgt dafür, dass im
|
# Bei adresse1 müssen an jedem Zeilenumbruch zwei Semikola (;;) stehen. Dies sorgt dafür, dass im
|
||||||
# LaTeX-Code dies durch zwei Backslashes ersetzt wird.
|
# LaTeX-Code dies durch zwei Backslashes ersetzt wird.
|
||||||
|
|
||||||
[start]
|
[start]
|
||||||
kunde=Firma A
|
kunde=Firma A
|
||||||
adresse1= Strasse A; 012345 Stadt A;
|
adresse= Strasse A;; 012345 Stadt A;;
|
||||||
anrede=Sehr geehrte Damen und Herren,
|
anrede=Sehr geehrte Damen und Herren,
|
||||||
|
einleitung=anbei die Rechnung
|
||||||
anzahl=1
|
anzahl=1
|
||||||
position=Dienstleistung A mit etwas mehr Text
|
position=Dienstleistung A mit etwas mehr Text
|
||||||
short=Leistung A
|
short=Leistung A
|
||||||
|
@ -16,8 +17,9 @@ lfdnr=1
|
||||||
|
|
||||||
[start]
|
[start]
|
||||||
kunde=Firma B
|
kunde=Firma B
|
||||||
adresse=Personalabteilung; Frau B; Strasse B; 01234 Stadt B;
|
adresse=Personalabteilung;; Frau B;; Strasse B;; 01234 Stadt B;;
|
||||||
anrede=Sehr geehrte Frau B,
|
anrede=Sehr geehrte Frau B,
|
||||||
|
einleitung=Wie in Vertrag 08/15 vereibart berechne ich
|
||||||
anzahl=11
|
anzahl=11
|
||||||
position=Dienstleistung B mit mehr noch viel Text
|
position=Dienstleistung B mit mehr noch viel Text
|
||||||
short=Leistung B
|
short=Leistung B
|
||||||
|
@ -27,8 +29,9 @@ lfdnr=1
|
||||||
|
|
||||||
[start]
|
[start]
|
||||||
kunde=Herr C
|
kunde=Herr C
|
||||||
adresse=Strasse C; 12345 Stadt C;
|
adresse=Strasse C;; 12345 Stadt C;;
|
||||||
anrede=Sehr geehrter Herr C,
|
anrede=Sehr geehrter Herr C,
|
||||||
|
einleitung=anbei die Rechnung
|
||||||
anzahl=1
|
anzahl=1
|
||||||
position=Dienstleistung C mit ganzen vielen Nebenpositionen damit in der Tabelle mehrere Zeilen sind
|
position=Dienstleistung C mit ganzen vielen Nebenpositionen damit in der Tabelle mehrere Zeilen sind
|
||||||
short=Leistung C
|
short=Leistung C
|
||||||
|
|
686
rechnung.sh
686
rechnung.sh
|
@ -15,58 +15,13 @@ set -e
|
||||||
|
|
||||||
OLDIFS=$IFS
|
OLDIFS=$IFS
|
||||||
IFS='
'
|
IFS='
'
|
||||||
UMASK=077
|
|
||||||
umask=$UMASK
|
|
||||||
OLDPATH=$PATH
|
|
||||||
PATH=/bin:/usr/bin
|
|
||||||
export PATH
|
|
||||||
unset -f command
|
unset -f command
|
||||||
unset -f unalias
|
unset -f unalias
|
||||||
\unalias -a
|
\unalias -a
|
||||||
|
OLDPATH=$PATH
|
||||||
|
PATH=/bin:/usr/bin
|
||||||
# Variablen
|
export PATH
|
||||||
# ---------
|
|
||||||
|
|
||||||
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
|
||||||
# -------------------
|
# -------------------
|
||||||
|
@ -89,49 +44,92 @@ 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 --into $OUTPUTDIR "
|
GENPDF="$RUBBER_BIN -d "
|
||||||
else
|
else
|
||||||
GENPDF="$PDFLATEX_BIN -halt-on-error -output-directory $OUTPUTDIR "
|
GENPDF="$PDFLATEX_BIN -halt-on-error "
|
||||||
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"
|
||||||
|
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=""
|
||||||
|
EINLEITUNG=""
|
||||||
|
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() {
|
||||||
|
|
||||||
if [ "$VERBOSITY" -eq 1 ]; then
|
msg=$*
|
||||||
|
|
||||||
|
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" "$@"
|
printf "%s[+]%s %s" "$GREEN" "$NORMAL" "$msg"
|
||||||
else
|
else
|
||||||
printf " Failed"
|
printf " Failed"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
print_middle() {
|
|
||||||
|
|
||||||
if [ "$VERBOSITY" -eq 1 ]; then
|
|
||||||
printf "%s" "$@"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
print_failed() {
|
print_failed() {
|
||||||
|
|
||||||
if [ "$VERBOSITY" -eq 1 ]; then
|
msg=$*
|
||||||
|
|
||||||
|
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 [ -n "$msg" ]; then
|
||||||
|
print_error "$msg"
|
||||||
fi
|
fi
|
||||||
if [ ! -z "$@" ]; then
|
|
||||||
print_error "$@"
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
print_ok() {
|
print_ok() {
|
||||||
|
|
||||||
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 OK%s\n" "$GREEN" "$NORMAL"
|
printf "%s OK%s\n" "$GREEN" "$NORMAL"
|
||||||
else
|
else
|
||||||
|
@ -140,196 +138,146 @@ 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() {
|
||||||
|
|
||||||
if [ "$VERBOSITY" -eq 1 ]; then
|
msg=$*
|
||||||
if [ "$COLORED_OUTPUT" -eq 1 ]; then
|
|
||||||
echo "${GREEN}[+]$NORMAL $@"
|
if [ "$VERBOSITY" -eq 0 ]; then
|
||||||
|
return
|
||||||
else
|
else
|
||||||
echo "[-] $@"
|
if [ "$COLORED_OUTPUT" -eq 1 ]; then
|
||||||
|
echo "${GREEN}[+]$NORMAL $msg"
|
||||||
|
else
|
||||||
|
echo "[-] $msg"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
print_warn() {
|
print_warn() {
|
||||||
|
|
||||||
if [ "$VERBOSITY" -eq 1 ]; then
|
msg=$*
|
||||||
if [ "$COLORED_OUTPUT" -eq 1 ]; then
|
|
||||||
echo "${YELLOW}[-]$NORMAL $@" 1>&2
|
if [ "$VERBOSITY" -eq 0 ]; then
|
||||||
|
return
|
||||||
else
|
else
|
||||||
echo "[-] $@" 1>&2
|
if [ "$COLORED_OUTPUT" -eq 1 ]; then
|
||||||
|
echo "${YELLOW}[-]$NORMAL $msg"
|
||||||
|
else
|
||||||
|
echo "[-] $msg"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
print_error() {
|
print_error() {
|
||||||
|
|
||||||
|
msg=$*
|
||||||
|
|
||||||
if [ "$COLORED_OUTPUT" -eq 1 ]; then
|
if [ "$COLORED_OUTPUT" -eq 1 ]; then
|
||||||
echo "${RED}[-]$NORMAL Error: $@" 1>&2
|
echo "${RED}[-]$NORMAL $msg"
|
||||||
else
|
else
|
||||||
echo "[-] Error: $@" 1>&2
|
echo "[-] $msg"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
print_head() {
|
failed_and_exit() {
|
||||||
|
|
||||||
if [ "$VERBOSITY" -eq 1 ]; then
|
print_failed
|
||||||
if [ "$COLORED_OUTPUT" -eq 1 ]; then
|
exit "$*"
|
||||||
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_binary() {
|
check_readable() {
|
||||||
|
|
||||||
# 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.
|
||||||
|
|
||||||
file="$*"
|
print_start "Datei $1 ist lesbar ..."
|
||||||
|
if test -h "$1"; then
|
||||||
print_start "Suche nach Datei $file ..."
|
target=$(get_link_target "$1")
|
||||||
if [ -h "$file" ]; then
|
print_failed "$1 ist ein symbolischer Link auf $target"
|
||||||
target=$(realpath "$file")
|
exit 1
|
||||||
print_failed "'$file' ist ein symbolischer Link auf '$target'"
|
|
||||||
exit 4
|
|
||||||
fi
|
fi
|
||||||
if test -f "$file" && test -r "$file"; then
|
if test -f "$1" && test -r "$1"; then
|
||||||
print_ok
|
print_ok
|
||||||
else
|
else
|
||||||
print_failed "Datei '$file' nicht lesbar oder nicht gefunden"
|
failed_and_exit 1
|
||||||
exit 5
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check_dir() {
|
check_sty() (
|
||||||
|
|
||||||
# testet, ob das übergebene verzeichnis keine link ist, existiert und
|
# sucht in einer subshell nach dem paket rechnung.sty. gibt true oder
|
||||||
# hinein gewechselt werden darf. schlägt ein test fehl, wird das
|
# false zurück.
|
||||||
# programm beendet.
|
|
||||||
|
|
||||||
dir="$*"
|
print_start "Suche nach $STY_RECHNUNG ..."
|
||||||
|
|
||||||
print_start "Suche nach Verzeichnis $dir ..."
|
if $KPSEWHICH_BIN "$STY_RECHNUNG" > /dev/null 2>&1 ; then
|
||||||
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
|
print_ok
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
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" > /dev/null 2>&1 ; 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() (
|
||||||
|
|
||||||
|
@ -345,105 +293,44 @@ is_option() (
|
||||||
fi
|
fi
|
||||||
)
|
)
|
||||||
|
|
||||||
check_rechnunsdaten() {
|
check_rechnunsdaten() (
|
||||||
|
|
||||||
# die funktion prüft, ob alle variablen belegt sind. ist eine variable
|
# die funktion überprüft in einer subshell, ob alle variablen belegt
|
||||||
# leer, wird der name der variablen ausgegeben und ein fehler (1) zurück
|
# sind. ist eine variable leer, wird der name der variablen ausgegeben
|
||||||
# gegeben.
|
# und ein fehler (1) zurück 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 "$EINLEITUNG"; then
|
||||||
|
print_failed "Das Feld Einleitung 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
|
||||||
response=0
|
return 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
|
||||||
|
@ -474,6 +361,47 @@ 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"
|
||||||
|
@ -485,6 +413,7 @@ reset_values() {
|
||||||
ANREDE=""
|
ANREDE=""
|
||||||
ANZAHL=""
|
ANZAHL=""
|
||||||
POSITION=""
|
POSITION=""
|
||||||
|
EINLEITUNG=""
|
||||||
SHORT=""
|
SHORT=""
|
||||||
BETRAG=""
|
BETRAG=""
|
||||||
LFDNR=""
|
LFDNR=""
|
||||||
|
@ -499,13 +428,13 @@ 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";;
|
||||||
anrede) ANREDE="$VALUE_BUFFER";;
|
anrede) ANREDE="$VALUE_BUFFER";;
|
||||||
anzahl) ANZAHL="$VALUE_BUFFER";;
|
anzahl) ANZAHL="$VALUE_BUFFER";;
|
||||||
position) POSITION="$VALUE_BUFFER";;
|
position) POSITION="$VALUE_BUFFER";;
|
||||||
|
einleitung) EINLEITUNG="$VALUE_BUFFER";;
|
||||||
betrag) BETRAG="$VALUE_BUFFER";;
|
betrag) BETRAG="$VALUE_BUFFER";;
|
||||||
lfdnr) LFDNR="$VALUE_BUFFER";;
|
lfdnr) LFDNR="$VALUE_BUFFER";;
|
||||||
short) SHORT="$VALUE_BUFFER";;
|
short) SHORT="$VALUE_BUFFER";;
|
||||||
|
@ -513,7 +442,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
|
||||||
|
@ -521,61 +450,57 @@ 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.
|
||||||
|
|
||||||
if ! check_rechnunsdaten; then
|
|
||||||
print_error "Check der Rechnungsdaten fehlgeschlagen"
|
if ! check_rechnunsdaten ; then
|
||||||
print_error "Erstelle keine Rechnung"
|
return 1
|
||||||
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"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Bei der Ersetzung unten wird jedes ';' durch genau ein '\' ersetzt. Daher ist die Anzahl der ';' wichtig.
|
||||||
month_ascii=$(date '+%B')
|
month_ascii=$(date '+%B')
|
||||||
inv_date=$(date '+%Y%m%d')
|
inv_date=$(date '+%Y%m%d')
|
||||||
inv_dead=$(date -d "+${dead_days}days" '+%d.\\,%m.\\,%Y')
|
inv_dead=$(date -d "+${dead_days}days" '+%d.;,%m.;,%Y')
|
||||||
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')"
|
|
||||||
|
|
||||||
print_info "Erstelle Rechnung: $filename"
|
print_info "Erstelle Rechnung: $filename"
|
||||||
{
|
{
|
||||||
printf "s!#LCOFILE#!%s!\n" "$LCO"
|
printf "s!#LCOFILE#!%s!\n" "$LCO"
|
||||||
printf "s!#SUBJECT#!%s!\n" "$subject"
|
printf "s!#SUBJECT#!%s!\n" "$subject"
|
||||||
printf "s!#ANREDE#!%s!\n" "$ANREDE"
|
printf "s!#ANREDE#!%s!\n" "$ANREDE"
|
||||||
printf "s!#ANSCHRIFT#!%s!\n" "$anschrift"
|
printf "s!#ANSCHRIFT#!%s!\n" "$(echo "$buffer" | sed 's/;/\\\\/g')"
|
||||||
printf "s!#RECHNUNGSNUMMER#!%s!\n" "$rechnungsnummer"
|
printf "s!#RECHNUNGSNUMMER#!%s!\n" "$rechnungsnummer"
|
||||||
printf "s!#ANZAHL#!%s!\n" "$ANZAHL"
|
printf "s!#ANZAHL#!%s!\n" "$ANZAHL"
|
||||||
printf "s!#POSITION#!%s!\n" "$POSITION"
|
printf "s!#POSITION#!%s!\n" "$POSITION"
|
||||||
|
printf "s!#EINLEITUNG#!%s!\n" "$EINLEITUNG"
|
||||||
printf "s!#BETRAG#!%s!\n" "$BETRAG"
|
printf "s!#BETRAG#!%s!\n" "$BETRAG"
|
||||||
printf "s!#DEADLINE#!%s!\n" "$inv_dead"
|
printf "s!#DEADLINE#!%s!\n" "$(echo "$inv_dead" | sed 's/;/\\\\/g')"
|
||||||
} >$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 "$OUTPUTDIR/$filename" | sed -e s/ltx/log/)
|
logfile=$(echo "$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
|
)
|
||||||
}
|
|
||||||
|
|
||||||
parse_line() {
|
proced_ini_line() {
|
||||||
|
|
||||||
line=$*
|
line=$*
|
||||||
first=$(echo "$line" | cut -c1-1)
|
first=$(echo "$line" | cut -c1-1)
|
||||||
|
@ -607,114 +532,71 @@ parse_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 --- #
|
||||||
# --------------------- #
|
# --------------------- #
|
||||||
|
|
||||||
## Nicht als Root laufen lassen
|
# CLI Optionen auswerten
|
||||||
if [ "$(id -u)" -eq 0 ]; then
|
while getopts f:hi:l:qv opt
|
||||||
echo "$PROGRAMM_NAME: Das Skript sollte nicht als Root ausgeführt werden!"
|
do
|
||||||
exit 1
|
case $opt in
|
||||||
fi
|
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
|
||||||
|
|
||||||
## 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
|
||||||
|
|
||||||
## CLI Optionen auswerten
|
print_deko " ========================"
|
||||||
while getopts b:dhik:l:o:t:vV opt
|
print_deko " = $PROGRAMM_NAME v$PROGRAMM_VERSION ="
|
||||||
do
|
print_deko " ========================"
|
||||||
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
|
# Verschiedene Basic Checks
|
||||||
|
if [ "$(id -u)" -eq 0 ]; then
|
||||||
## Die nötigen Programme und rechnung.sty testen
|
print_error "$0: Das Skript darf nicht als Root ausgeführt werden."
|
||||||
for program in $EXECUTABLES_TO_CHECK; do
|
exit 1
|
||||||
check_binary $program
|
fi
|
||||||
done
|
check_binaries "$EXECUTABLES_TO_CHECK"
|
||||||
|
check_readable "$RECHNUNGSFILE"
|
||||||
## relative pfade in den variablen LCOFILE, KUNDENFILE und TEMPLATEFILE wenn
|
check_readable "$TEMPLATEFILE"
|
||||||
## nötig in absolute pfade umwandeln. -- TODO: das geht sicher besser.
|
check_readable "$LCOFILE"
|
||||||
LCOFILE=$(set_abs_path "$LCOFILE")
|
if ! check_sty; then
|
||||||
KUNDENFILE=$(set_abs_path "$KUNDENFILE")
|
print_warn "Verwenden sie -i um $STY_RECHNUNG zu installieren"
|
||||||
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
|
if [ $INSTALL_LCO_FILE -eq 0 ]; then
|
||||||
print_error "Verwenden sie -i um $RECHNUNG_STY_FILE zu installieren"
|
exit 7
|
||||||
clear_and_exit 9
|
|
||||||
else
|
else
|
||||||
print_info "Versuche $RECHNUNG_STY_FILE zu installieren"
|
|
||||||
install_sty
|
install_sty
|
||||||
fi
|
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
|
fi
|
||||||
|
|
||||||
|
# Kundendatei einlesen und rechnungen erstellen
|
||||||
|
while IFS= read -r rawline
|
||||||
|
do
|
||||||
|
trim_line "$rawline"
|
||||||
|
proced_ini_line "$LINE_BUFFER"
|
||||||
|
done < "$RECHNUNGSFILE"
|
||||||
|
|
||||||
# aufräumen
|
|
||||||
clear_and_exit 0
|
|
||||||
|
|
1
rechnung_sty
Submodule
1
rechnung_sty
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 6d0d24599de1cf509ccef42a398d06519f890cc4
|
51
template.ltx
51
template.ltx
|
@ -17,7 +17,8 @@ parskip=half,%
|
||||||
numericaldate=off,%% Datum numerisch ausgeben
|
numericaldate=off,%% Datum numerisch ausgeben
|
||||||
refline=narrow,%% Geschaeftszeile im Satzspiegel
|
refline=narrow,%% Geschaeftszeile im Satzspiegel
|
||||||
firstfoot=on,%% Footerbereich
|
firstfoot=on,%% Footerbereich
|
||||||
#LCOFILE#]{scrlttr2}
|
]{scrlttr2}
|
||||||
|
\LoadLetterOption{#LCOFILE#}
|
||||||
\usepackage[ngerman]{babel}
|
\usepackage[ngerman]{babel}
|
||||||
\usepackage[utf8]{inputenc}
|
\usepackage[utf8]{inputenc}
|
||||||
\usepackage[T1]{fontenc}
|
\usepackage[T1]{fontenc}
|
||||||
|
@ -33,44 +34,18 @@ 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{tabular}[t]{l@{}}%
|
\begin{tabularx}{\textwidth}{XXl}
|
||||||
\textsl{Anschrift:}\\
|
\usekomavar{fromname} & \usekomavar{fromcourt} & \textbf{Bankverbindung}\\
|
||||||
\usekomavar{fromname}\\
|
\usekomavar{signature} & USt.-IdNr.: & IBAN: \usekomavar{fromiban1}\\
|
||||||
Inh.~\usekomavar{signature}\\
|
\usekomavar{fromstreet} & \usekomavar{fromustid} & \hfill{}\usekomavar{fromiban2}\\
|
||||||
\usekomavar{fromaddress}\\
|
\usekomavar{fromtown} & & \usekomavar{frombank}
|
||||||
\end{tabular}%
|
\end{tabularx}%
|
||||||
\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#}
|
||||||
|
|
||||||
|
@ -81,9 +56,7 @@ parskip=half,%
|
||||||
%% Anrede
|
%% Anrede
|
||||||
\opening{#ANREDE#}
|
\opening{#ANREDE#}
|
||||||
|
|
||||||
wie besprochen, stelle ich für die Durchführung des Seminars
|
#EINLEITUNG#
|
||||||
folgende Rechnung.
|
|
||||||
|
|
||||||
|
|
||||||
\begin{Rechnung}[N]
|
\begin{Rechnung}[N]
|
||||||
\TrennerAus
|
\TrennerAus
|
||||||
|
|
Loading…
Reference in a new issue