Compare commits

..

22 commits
footer ... main

Author SHA1 Message Date
berhsi 82cbf0a4a7 Merge pull request 'Backslash-Korrektur' (#10) from qbi/rechnung:sed-backslash into main
Reviewed-on: #10
2024-02-05 18:33:11 +01:00
qbi 3364cad3ec Überflüssige Semikola im Kommentar gelöscht 2024-02-05 18:29:45 +01:00
qbi ef70318e30 Je ein ';' wird durch einen '\' ersetzt
Neben den Backslashes am Zeilenende gab es Backslashes innerhalb des
Textes.
Beispiel:
- Datum: 05.\,02.\,2024
- Straße: Gitstr.\,42

Mit diesen Backslashes kam die Ersetzung nicht gut zurecht.

Daher habe ich das so geändert, dass jedes Semikolon (';') durch einen
Backslash ersetzt wird. Im Datum und Straßen muss nun auch ein Semikolon
stehen. Damit klappt die Ersetzung besser.
2024-02-05 18:28:42 +01:00
berhsi d15355b689 Merge pull request 'template.ltx angepasst' (#9) from qbi/rechnung:main into main
Reviewed-on: #9
2024-02-04 18:53:37 +01:00
qbi 2095a4cdca Datei gehört nicht hier hin 2024-02-04 18:15:07 +01:00
qbi bdb15c0e0b Letter-Class-Option über eigenen Befehl geladen 2024-02-04 18:06:38 +01:00
qbi 7813890db6 @ entfernt
Das @ zu verwenden ist veraltet. Daher entfernt.
2024-02-04 18:03:00 +01:00
qbi 691f1ff563 Ersetzung der Anschrift geändert
Bisher war die Ersetzung der Anschrift nicht perfekt. Hier wurde teils zuviel
gefressen. Mit der Änderung klappt bei meinen Tests alles. Eventuell muss das
aber nochmal angepasst werden.
2021-10-10 13:40:30 +02:00
qbi feb3b49abb Einleitung eingebaut
Im Text der Rechnung muss es zu Anfang eine Einleitung geben. Dort kann
man auf Verträge, Absprachen, Beauftragungen etc. Bezug nehmen. Ich habe
das gemäß dem Muster der POSITION eingebaut.
2021-10-10 12:15:59 +02:00
qbi 72bdf42172 Quoting korrigiert 2021-07-28 19:29:12 +02:00
qbi ad5ba83adf Variable benutzt 2021-07-28 19:28:07 +02:00
qbi bb884d5e62 Merge branch 'main' of gitea:berhsi/rechnung 2021-07-28 19:26:24 +02:00
qbi 09722922b9 Option i ergänzt 2021-06-06 10:29:38 +02:00
qbi 7c5c93444c Zuerst muss /dev/null kommen 2021-06-06 10:21:54 +02:00
qbi f4e187c048 Doppelte Verneinung entfernt 2021-06-06 10:06:37 +02:00
qbi df55d17113 Variablen quoten 2021-06-06 10:04:24 +02:00
qbi bf2ca2c96b 1 gelöscht
Die einzelnen Felder sind nicht nummeriert. Die "1" war vermutlich ein Artefakt des früheren Formats.
2021-06-06 10:01:01 +02:00
qbi 8654e69a4a Merge branch 'submo-merge' 2021-05-28 23:13:11 +02:00
qbi 074650c9b0 Zu viele Backslashes 2021-05-28 23:02:45 +02:00
qbi 1c4a695cae SEDFILE soll nicht angehangen werden 2021-05-28 23:01:32 +02:00
qbi 7bf85fc94b Installation von rechnung.sty entfernt 2021-05-28 22:55:05 +02:00
qbi c5fb722e40 Submodul rechnung.sty hinzugefügt 2021-05-05 23:18:59 +02:00
7 changed files with 326 additions and 498 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "rechnung_sty"]
path = rechnung_sty
url = https://git.nr18.space/qbi/rechnung.sty

View file

@ -4,6 +4,9 @@ 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,71 +15,34 @@ Latexcompiler eine Rechnung im PDF-Format erstellt.
Installation
------------
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.
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.
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.
-k kundendatei
-l lco-datei
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.
Verwendet 'lco-datei' für verschiedene Variablen des Absenders.
-l lcodatei
-q
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.
Es werden nur noch Fehlermeldungen ausgegeben.
-v
Setzt die Ausgabe auf verbose. Standartmäßig werden nur Fehlermeldungen
und eine Abschlußmeldung ausgegeben.
-V
Zeigt die Programmversion an.

View file

@ -1,12 +1,13 @@
# 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.
[start]
kunde=Firma A
adresse1= Strasse A; 012345 Stadt A;
adresse= Strasse A;; 012345 Stadt A;;
anrede=Sehr geehrte Damen und Herren,
einleitung=anbei die Rechnung
anzahl=1
position=Dienstleistung A mit etwas mehr Text
short=Leistung A
@ -16,8 +17,9 @@ lfdnr=1
[start]
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,
einleitung=Wie in Vertrag 08/15 vereibart berechne ich
anzahl=11
position=Dienstleistung B mit mehr noch viel Text
short=Leistung B
@ -27,8 +29,9 @@ lfdnr=1
[start]
kunde=Herr C
adresse=Strasse C; 12345 Stadt C;
adresse=Strasse C;; 12345 Stadt C;;
anrede=Sehr geehrter Herr C,
einleitung=anbei die Rechnung
anzahl=1
position=Dienstleistung C mit ganzen vielen Nebenpositionen damit in der Tabelle mehrere Zeilen sind
short=Leistung C

View file

@ -15,58 +15,13 @@ set -e
OLDIFS=$IFS
IFS=' '
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=
OLDPATH=$PATH
PATH=/bin:/usr/bin
export PATH
# Benötigte Programme
# -------------------
@ -89,49 +44,92 @@ 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 --into $OUTPUTDIR "
GENPDF="$RUBBER_BIN -d "
else
GENPDF="$PDFLATEX_BIN -halt-on-error -output-directory $OUTPUTDIR "
GENPDF="$PDFLATEX_BIN -halt-on-error "
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
# ------------------------------
print_start() {
if [ "$VERBOSITY" -eq 1 ]; then
msg=$*
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then
printf "%s[+]%s %s" "$GREEN" "$NORMAL" "$@"
printf "%s[+]%s %s" "$GREEN" "$NORMAL" "$msg"
else
printf " Failed"
fi
fi
}
print_middle() {
if [ "$VERBOSITY" -eq 1 ]; then
printf "%s" "$@"
fi
}
print_failed() {
if [ "$VERBOSITY" -eq 1 ]; then
msg=$*
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then
printf "%s Failed%s\n" "$RED" "$NORMAL"
else
printf " Failed\n"
fi
fi
if [ ! -z "$@" ]; then
print_error "$@"
if [ -n "$msg" ]; then
print_error "$msg"
fi
fi
}
print_ok() {
if [ "$VERBOSITY" -eq 1 ]; then
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then
printf "%s OK%s\n" "$GREEN" "$NORMAL"
else
@ -140,196 +138,146 @@ 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() {
if [ "$VERBOSITY" -eq 1 ]; then
msg=$*
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${GREEN}[+]$NORMAL $@"
echo "${GREEN}[+]$NORMAL $msg"
else
echo "[-] $@"
echo "[-] $msg"
fi
fi
}
print_warn() {
if [ "$VERBOSITY" -eq 1 ]; then
msg=$*
if [ "$VERBOSITY" -eq 0 ]; then
return
else
if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${YELLOW}[-]$NORMAL $@" 1>&2
echo "${YELLOW}[-]$NORMAL $msg"
else
echo "[-] $@" 1>&2
echo "[-] $msg"
fi
fi
}
print_error() {
msg=$*
if [ "$COLORED_OUTPUT" -eq 1 ]; then
echo "${RED}[-]$NORMAL Error: $@" 1>&2
echo "${RED}[-]$NORMAL $msg"
else
echo "[-] Error: $@" 1>&2
echo "[-] $msg"
fi
}
print_head() {
failed_and_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
print_failed
exit "$*"
}
# Diverse Checks
# --------------
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() {
check_readable() {
# testet, ob die übergebene datei kein symlink ist, existiert und lesbar
# ist. schlägt einer der tests fehl, wird das programm beendet.
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
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
fi
if test -f "$file" && test -r "$file"; then
if test -f "$1" && test -r "$1"; then
print_ok
else
print_failed "Datei '$file' nicht lesbar oder nicht gefunden"
exit 5
failed_and_exit 1
fi
}
check_dir() {
check_sty() (
# testet, ob das übergebene verzeichnis keine link ist, existiert und
# hinein gewechselt werden darf. schlägt ein test fehl, wird das
# programm beendet.
# sucht in einer subshell nach dem paket rechnung.sty. gibt true oder
# false zurück.
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_start "Suche nach $STY_RECHNUNG ..."
if $KPSEWHICH_BIN "$STY_RECHNUNG" > /dev/null 2>&1 ; then
print_ok
return 0
else
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" > /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() (
@ -345,105 +293,44 @@ is_option() (
fi
)
check_rechnunsdaten() {
check_rechnunsdaten() (
# 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
# 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.
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 "$EINLEITUNG"; then
print_failed "Das Feld Einleitung 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
response=0
return 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
@ -474,6 +361,47 @@ 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"
@ -485,6 +413,7 @@ reset_values() {
ANREDE=""
ANZAHL=""
POSITION=""
EINLEITUNG=""
SHORT=""
BETRAG=""
LFDNR=""
@ -499,13 +428,13 @@ 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";;
anrede) ANREDE="$VALUE_BUFFER";;
anzahl) ANZAHL="$VALUE_BUFFER";;
position) POSITION="$VALUE_BUFFER";;
einleitung) EINLEITUNG="$VALUE_BUFFER";;
betrag) BETRAG="$VALUE_BUFFER";;
lfdnr) LFDNR="$VALUE_BUFFER";;
short) SHORT="$VALUE_BUFFER";;
@ -513,7 +442,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
@ -521,61 +450,57 @@ make_invoice() {
# darin befindlichen platzhalter durch die entsprechenden variablen zu
# ersetzen und das ganze zu kompilieren.
if ! check_rechnunsdaten; then
print_error "Check der Rechnungsdaten fehlgeschlagen"
print_error "Erstelle keine Rechnung"
print_trenner
return
if ! check_rechnunsdaten ; then
return 1
fi
dead_days="14"
if [ "$(date +%u)" -gt 5 ]; then
dead_days="16"
fi
# Bei der Ersetzung unten wird jedes ';' durch genau ein '\' ersetzt. Daher ist die Anzahl der ';' wichtig.
month_ascii=$(date '+%B')
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"
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')"
buffer="$KUNDE;; $ADRESSE"
#anschrift=$(echo "$buffer" | sed 's/;/\\\\/g')
print_info "Erstelle Rechnung: $filename"
{
printf "s!#LCOFILE#!%s!\n" "$LCO"
printf "s!#SUBJECT#!%s!\n" "$subject"
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!#ANZAHL#!%s!\n" "$ANZAHL"
printf "s!#POSITION#!%s!\n" "$POSITION"
printf "s!#EINLEITUNG#!%s!\n" "$EINLEITUNG"
printf "s!#BETRAG#!%s!\n" "$BETRAG"
printf "s!#DEADLINE#!%s!\n" "$inv_dead"
} >$sedfile
printf "s!#DEADLINE#!%s!\n" "$(echo "$inv_dead" | sed 's/;/\\\\/g')"
} >$SEDFILE
cp "$TEMPLATEFILE" "$filename"
$SED_BIN -i -f "$sedfile" "$filename"
if [ "$DEBUG" -eq 1 ]; then
cp "$filename" "$sedfile" "$OUTPUTDIR"
fi
$SED_BIN -i -f "$SEDFILE" "$filename"
if ! $GENPDF "$filename" 1>&2 >/dev/null; then
print_error "Kompilierung von $filename fehlgeschlagen"
logfile=$(echo "$OUTPUTDIR/$filename" | sed -e s/ltx/log/)
print_error "$(grep "Error" $logfile)"
logfile=$(echo "$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
}
)
parse_line() {
proced_ini_line() {
line=$*
first=$(echo "$line" | cut -c1-1)
@ -607,114 +532,71 @@ parse_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 --- #
# --------------------- #
## 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
# CLI Optionen auswerten
while getopts f:hi:l: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
## Farbe aktivieren wenn vorhanden
NUMBER_OF_COLORS=$($TPUT_BIN colors)
# Farbe aktivieren wenn vorhanden
if [ -n "$NUMBER_OF_COLORS" ] && [ "$NUMBER_OF_COLORS" -ge 8 ]; then
COLORED_OUTPUT=1
fi
## CLI Optionen auswerten
while getopts b:dhik:l:o:t:vV opt
do
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_deko " ========================"
print_deko " = $PROGRAMM_NAME v$PROGRAMM_VERSION ="
print_deko " ========================"
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
# 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
# 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
# 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

@ -0,0 +1 @@
Subproject commit 6d0d24599de1cf509ccef42a398d06519f890cc4

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
@ -17,7 +17,8 @@ parskip=half,%
numericaldate=off,%% Datum numerisch ausgeben
refline=narrow,%% Geschaeftszeile im Satzspiegel
firstfoot=on,%% Footerbereich
#LCOFILE#]{scrlttr2}
]{scrlttr2}
\LoadLetterOption{#LCOFILE#}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
@ -33,44 +34,18 @@ parskip=half,%
\begin{document}
\LoadLetterOption{DIN}
\makeatletter
%\@addtoplength[-]{firstfootvpos}{.75cm} % Fuß ein Stück nach oben
\@setplength{firstfootvpos}{270mm} % noch ein stück weiter nach oben
\addtoplength[-]{firstfootvpos}{.75cm} % Fuß ein Stück 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{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}%
}%
\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}%
}
\begin{letter}{#ANSCHRIFT#}
@ -81,9 +56,7 @@ parskip=half,%
%% Anrede
\opening{#ANREDE#}
wie besprochen, stelle ich für die Durchführung des Seminars
folgende Rechnung.
#EINLEITUNG#
\begin{Rechnung}[N]
\TrennerAus