From 7331d31bcf4da3462c437361116c26c9ef3fc689 Mon Sep 17 00:00:00 2001 From: bernd Date: Sat, 15 May 2021 23:22:39 +0200 Subject: [PATCH 01/18] =?UTF-8?q?fehlerhaftes=20exit=20entfernt,=20hilfe?= =?UTF-8?q?=20und=20option=20-f=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rechnung.sh | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/rechnung.sh b/rechnung.sh index 5d5f4ca..9e2d830 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -399,6 +399,11 @@ proced_ini_line() { fi } +display_help() ( + + echo "Usage: rechnung.sh [-f rechnungsfile] [-h]" +) + quit() { printf "\n" printf "%s" "$BLUE" @@ -409,6 +414,16 @@ quit() { # --- Programmstart --- # # --------------------- # +# CLI Optionen auswerten +while getopts f:h opt +do + case $opt in + f) RECHNUNGSFILE=$OPTARG;; + h) display_help; exit 0;; + *) display_help; exit 1;; + esac +done + # Verschiedene Basic Checks if [ -n "$NUMBER_OF_COLORS" ] && [ "$NUMBER_OF_COLORS" -ge 8 ]; then COLORED_OUTPUT=1 @@ -430,9 +445,6 @@ if ! check_sty "$STY_HOME"; then install_sty fi -exit - - # Kundendatei einlesen und rechnungen erstellen while IFS= read -r rawline do From 1b9ebd09e5059a8225215f1d61622b1606eadf42 Mon Sep 17 00:00:00 2001 From: bernd Date: Sat, 15 May 2021 23:53:45 +0200 Subject: [PATCH 02/18] =?UTF-8?q?readme=20angepa=C3=9Ft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.txt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/readme.txt b/readme.txt index 1ea13d9..e0f2fa1 100644 --- a/readme.txt +++ b/readme.txt @@ -9,8 +9,8 @@ Beschreibung Aus einer Kundendatei (rechnung.ini) werden blockweise Kundendaten gelesen und in Variablen gespeichert. Am Ende des Blocks wird eine Kopie des Templates (template.ltx) erstellt und die Platzhalter in der Kopie durch die -entsprechenden Variablen erstellt. Diese Kopie wird zweimal mittels pdflatex -übersetzt. +entsprechenden Variablen ersetzt. Aus dieser Kopie wird durch einen +Latexcompiler eine Rechnung im PDF-Format erstellt. Installation ------------ @@ -19,3 +19,15 @@ Kopieren Sie die Dateien template.ltx, octorech.lco, rechnung.ini und rechnung.{sh|py} in ein Verzeichnis Ihrer Wahl. Passen Sie die Dateien rechnung.ini und octorech.lco an Ihre Bedürfnisse an. +Optionen +-------- + +-h + + Gibt eine kurze Hilfe aus und beendet das Programm + +-f kundendatei + + Die Kundendaten werden aus 'kundendatei' gelesen und 'rechnung.ini' wird + ignoriert. + From 5180cb29722989828dd4b94d412e1c6fcd0d956a Mon Sep 17 00:00:00 2001 From: bernd Date: Fri, 28 May 2021 18:51:52 +0200 Subject: [PATCH 03/18] bugfix bei den ersetzungen mit sed --- rechnung.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rechnung.sh b/rechnung.sh index 9e2d830..4b39dad 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -307,6 +307,7 @@ set_value() { trim_key "$key" trim_value "$value" + print_info "Set $key to $value" case $KEY_BUFFER in kunde) KUNDE="$VALUE_BUFFER";; adresse) ADRESSE="$VALUE_BUFFER";; @@ -324,7 +325,7 @@ make_invoice() { dead_days="14" if [ "$(date +%u)" -gt 5 ]; then - dead_days="16" + dead_days="16" fi month_ascii=$(date '+%B') @@ -347,7 +348,7 @@ make_invoice() { printf "s!#POSITION#!%s!\n" "$POSITION" printf "s!#BETRAG#!%s!\n" "$BETRAG" printf "s!#DEADLINE#!%s!\n" "$inv_dead" - } >>$SEDFILE + } >$SEDFILE cp "$TEMPLATEFILE" "$filename" $SED_BIN -i -f "$SEDFILE" "$filename" From 80c76e5e885bfe6d9b3974106faece4740cc1114 Mon Sep 17 00:00:00 2001 From: bernd Date: Fri, 28 May 2021 21:40:18 +0200 Subject: [PATCH 04/18] bugfix in check_sty() und install_sty(), umstellung auf absender.lco und option -l --- absender.lco | 23 +++++++++++++++++++++++ rechnung.sh | 23 ++++++++++++++--------- template.ltx | 11 ++++++----- 3 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 absender.lco diff --git a/absender.lco b/absender.lco new file mode 100644 index 0000000..96b1de5 --- /dev/null +++ b/absender.lco @@ -0,0 +1,23 @@ +% eigene Variablen definieren und belegen +\newkomavar[stadt]{fromtown} +\newkomavar[adresse]{fromstreet} +\newkomavar[amtsgericht]{fromcourt} +\newkomavar[ustid]{fromustid} +\newkomavar[iban1]{fromiban1} +\newkomavar[iban2]{fromiban2} +\setkomavar{fromtown}{01234 Musterstadt} +\setkomavar{fromstreet}{Musterstr.\,1} +\setkomavar{fromcourt}{Amtsgericht Musterstadt} +\setkomavar{fromustid}{DE123456789} +\setkomavar{fromiban1}{DE01 2345 6789} +\setkomavar{fromiban2}{2345 6789 01} + +\setkomavar{fromname}{Musterfirma GmbH} +\setkomavar{fromaddress}{Musterstr.\,1\\01234 Musterstadt} +\setkomavar{frommobilephone}[\faMobilePhone~]{01\,23 / 456 78 90} +\setkomavar{fromurl}{https://musterfirma.com/} +\setkomavar{fromemail}[\faEnvelopeO~]{rechnung@musterfirma.com} +\setkomavar{place}{Musterstadt} +\setkomavar{placeseparator}{, } +\setkomavar{signature}{Max Mustermann} +\setkomavar{frombank}{Musterbank AG Musterstadt} diff --git a/rechnung.sh b/rechnung.sh index 4b39dad..2db7ea3 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -39,7 +39,7 @@ fi # Variablen definieren # -------------------- -PROGRAMM_NAME=$0 +PROGRAMM_NAME=`basename $0` PROGRAMM_VERSION="0.0.1" #VERBOSITY=0 STY_HOME="$HOME/texmf/tex/latex" @@ -47,6 +47,8 @@ STY_RECHNUNG="rechnung.sty" STY_URL="https://github.com/tomka/rechnung" RECHNUNGSFILE="rechnung.ini" TEMPLATEFILE="template.ltx" +LCOFILE="absender.lco" +LCO=$(basename $LCOFILE .lco) SEDFILE="sed.txt" LINE_BUFFER="" KEY_BUFFER="" @@ -155,7 +157,7 @@ print_error() { check_readable() { print_start "Datei $1 ist lesbar ..." - if [ -f "$1" ] && [ -r "$1" ]; then + if test -f "$1" && test -r "$1"; then print_ok else print_failed @@ -167,7 +169,7 @@ check_sty() ( print_start "Suche nach $STY_RECHNUNG ..." rechnung=$(find "$STY_HOME" -type f -name "$STY_RECHNUNG") - if [ "$rechnung" = "" ]; then + if test ! -f "$rechnung"; then print_failed return 1 else @@ -183,7 +185,7 @@ check_binaries() { for program in $binaries; do print_start "Suche nach $program ..." - if [ ! -x "$program" ]; then + if test ! -x "$program"; then print_failed print_error "Das Programm $program wird benötigt, aber nicht gefunden." quit 3 @@ -239,7 +241,7 @@ install_sty() ( old_pwd=$(pwd) - read -r " LaTeX Paket $STY_RECHNUNG installieren? (y/N): " + printf " LaTeX Paket '%s' installieren? (y/N): " $STY_RECHNUNG; read -r REPLY if [ "$REPLY" = "y" ] || [ "$REPLY" = "Y" ] || [ "$REPLY" = "j" ] || [ "$REPLY" = "J" ] then check_binaries "$GIT_BIN $LATEX_BIN" @@ -325,13 +327,13 @@ make_invoice() { dead_days="14" if [ "$(date +%u)" -gt 5 ]; then - dead_days="16" + dead_days="16" fi month_ascii=$(date '+%B') # inv_day=$(date '+%j') 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" @@ -340,6 +342,7 @@ make_invoice() { 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" @@ -402,7 +405,7 @@ proced_ini_line() { display_help() ( - echo "Usage: rechnung.sh [-f rechnungsfile] [-h]" + echo "Usage: rechnung.sh [-f rechnungsfile] [-h] [-l lco-file]" ) quit() { @@ -416,11 +419,12 @@ quit() { # --------------------- # # CLI Optionen auswerten -while getopts f:h opt +while getopts f:hl: opt do case $opt in f) RECHNUNGSFILE=$OPTARG;; h) display_help; exit 0;; + l) LCOFILE=$OPTARG;; *) display_help; exit 1;; esac done @@ -441,6 +445,7 @@ fi check_binaries "$EXECUTABLES_TO_CHECK" check_readable "$RECHNUNGSFILE" check_readable "$TEMPLATEFILE" +check_readable "$LCOFILE" if ! check_sty "$STY_HOME"; then print_warn "$STY_RECHNUNG nicht gefunden." install_sty diff --git a/template.ltx b/template.ltx index a9e15a7..4e12d7f 100644 --- a/template.ltx +++ b/template.ltx @@ -17,7 +17,7 @@ parskip=half,% numericaldate=off,%% Datum numerisch ausgeben refline=narrow,%% Geschaeftszeile im Satzspiegel firstfoot=on,%% Footerbereich -octorech]{scrlttr2} + #LCOFILE#]{scrlttr2} \usepackage[ngerman]{babel} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} @@ -35,13 +35,14 @@ octorech]{scrlttr2} \makeatletter \@addtoplength[-]{firstfootvpos}{.75cm} % Fuß ein Stück nach oben \makeatother + \setkomavar{firstfoot}{\footnotesize% \rule[3pt]{\textwidth}{.4pt} \\ \begin{tabularx}{\textwidth}{XXl} - OctoPi.Consulting & Amtsgericht Jena & \textbf{Bankverbindung}\\ - Jens Kubieziel & USt.-IdNr.: & IBAN: DE50 8204 0000\\ - Zitzmannstr.\,15 & DE298453137 & \hfill{}0264 3955 00\\ - 07743 Jena & & Commerzbank AG Jena + \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}% } From 26c43d7618f3fb8fd4511a75de7772226125717d Mon Sep 17 00:00:00 2001 From: bernd Date: Fri, 28 May 2021 23:29:37 +0200 Subject: [PATCH 05/18] =?UTF-8?q?octorech.lco=20entfernt,=20kleine=20?= =?UTF-8?q?=C3=A4nderungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- octorech.lco | 9 --------- rechnung.sh | 13 +++++++++++-- 2 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 octorech.lco diff --git a/octorech.lco b/octorech.lco deleted file mode 100644 index cd40ac8..0000000 --- a/octorech.lco +++ /dev/null @@ -1,9 +0,0 @@ -\setkomavar{fromname}{OctoPi.Consulting} -\setkomavar{fromaddress}{Zitzmannstr.\,15\\07743 Jena} -\setkomavar{frommobilephone}[\faMobilePhone~]{01\,63 / 615 61 98} -\setkomavar{fromurl}{https://octopi.consulting/} -\setkomavar{fromemail}[\faEnvelopeO~]{rechnung@octopi.consulting} -\setkomavar{place}{Jena} -\setkomavar{placeseparator}{, } -\setkomavar{signature}{Jens Kubieziel} -\setkomavar{frombank}{Commerzbank AG Jena} diff --git a/rechnung.sh b/rechnung.sh index 2db7ea3..f1754d0 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -10,6 +10,16 @@ set -u set -e +# ein paar Sicherheitsvorkehrungen +# -------------------------------- + +unset -f command +unset -f unalias +\unalias -a +OLDPATH=$PATH +PATH=/bin:/usr/bin +export PATH + # Benötigte Programme # ------------------- @@ -309,7 +319,6 @@ set_value() { trim_key "$key" trim_value "$value" - print_info "Set $key to $value" case $KEY_BUFFER in kunde) KUNDE="$VALUE_BUFFER";; adresse) ADRESSE="$VALUE_BUFFER";; @@ -405,7 +414,7 @@ proced_ini_line() { display_help() ( - echo "Usage: rechnung.sh [-f rechnungsfile] [-h] [-l lco-file]" + echo "Usage: $PROGRAMM_NAME [-f rechnungsfile] [-h] [-l lco-file]" ) quit() { From 5e18587864aa121100a590e6feba808a2e23e034 Mon Sep 17 00:00:00 2001 From: bernd Date: Fri, 28 May 2021 23:38:07 +0200 Subject: [PATCH 06/18] =?UTF-8?q?readme=20angepa=C3=9Ft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.txt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/readme.txt b/readme.txt index e0f2fa1..e55e720 100644 --- a/readme.txt +++ b/readme.txt @@ -15,9 +15,9 @@ Latexcompiler eine Rechnung im PDF-Format erstellt. Installation ------------ -Kopieren Sie die Dateien template.ltx, octorech.lco, rechnung.ini und +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 octorech.lco an Ihre Bedürfnisse an. +rechnung.ini und absender.lco an Ihre Bedürfnisse an. Optionen -------- @@ -28,6 +28,9 @@ Optionen -f kundendatei - Die Kundendaten werden aus 'kundendatei' gelesen und 'rechnung.ini' wird - ignoriert. + Die Kundendaten werden aus 'kundendatei' gelesen. + +-l lco-datei + + Verwendet 'lco-datei' für verschiedene Variablen des Absenders. From e7b2d5bd69661cbad0bd92687ae198264612deba Mon Sep 17 00:00:00 2001 From: bernd Date: Fri, 28 May 2021 23:49:46 +0200 Subject: [PATCH 07/18] =?UTF-8?q?option=20zum=20anzeigen=20der=20version?= =?UTF-8?q?=20eingef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.txt | 4 +++- rechnung.sh | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/readme.txt b/readme.txt index e55e720..d67dd35 100644 --- a/readme.txt +++ b/readme.txt @@ -24,7 +24,7 @@ Optionen -h - Gibt eine kurze Hilfe aus und beendet das Programm + Gibt eine kurze Hilfe aus und beendet das Programm. -f kundendatei @@ -34,3 +34,5 @@ Optionen Verwendet 'lco-datei' für verschiedene Variablen des Absenders. +-v + Zeigt die Programmversion an. diff --git a/rechnung.sh b/rechnung.sh index f1754d0..aaffb42 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -417,6 +417,11 @@ 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" @@ -428,12 +433,13 @@ quit() { # --------------------- # # CLI Optionen auswerten -while getopts f:hl: opt +while getopts f:hl:v opt do case $opt in f) RECHNUNGSFILE=$OPTARG;; h) display_help; exit 0;; l) LCOFILE=$OPTARG;; + v) display_version; exit 0;; *) display_help; exit 1;; esac done From 1ae6b0525c42312fc6b98d472e368e34c3d20d29 Mon Sep 17 00:00:00 2001 From: bernd Date: Sat, 29 May 2021 00:04:22 +0200 Subject: [PATCH 08/18] silent-modus eingebaut --- rechnung.sh | 65 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/rechnung.sh b/rechnung.sh index aaffb42..a3d3c12 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -51,7 +51,7 @@ fi PROGRAMM_NAME=`basename $0` PROGRAMM_VERSION="0.0.1" -#VERBOSITY=0 +VERBOSITY=1 STY_HOME="$HOME/texmf/tex/latex" STY_RECHNUNG="rechnung.sty" STY_URL="https://github.com/tomka/rechnung" @@ -92,28 +92,40 @@ print_start() { msg=$* - if [ "$COLORED_OUTPUT" -eq 1 ]; then - printf "%s[+]%s %s" "$GREEN" "$NORMAL" "$msg" + if [ "$VERBOSITY" -eq 0 ]; then + return else - printf " Failed" + if [ "$COLORED_OUTPUT" -eq 1 ]; then + printf "%s[+]%s %s" "$GREEN" "$NORMAL" "$msg" + else + printf " Failed" + fi fi } print_failed() { - if [ "$COLORED_OUTPUT" -eq 1 ]; then - printf "%s Failed%s\n" "$RED" "$NORMAL" + if [ "$VERBOSITY" -eq 0 ]; then + return else - printf " Failed\n" + if [ "$COLORED_OUTPUT" -eq 1 ]; then + printf "%s Failed%s\n" "$RED" "$NORMAL" + else + printf " Failed\n" + fi fi } print_ok() { - if [ "$COLORED_OUTPUT" -eq 1 ]; then - printf "%s OK%s\n" "$GREEN" "$NORMAL" + if [ "$VERBOSITY" -eq 0 ]; then + return else - printf " OK\n" + if [ "$COLORED_OUTPUT" -eq 1 ]; then + printf "%s OK%s\n" "$GREEN" "$NORMAL" + else + printf " OK\n" + fi fi } @@ -121,10 +133,14 @@ print_deko() { msg=$* - if [ "$COLORED_OUTPUT" -eq 1 ]; then - echo "${BLUE}${msg}${NORMAL}" + if [ "$VERBOSITY" -eq 0 ]; then + return else - echo "$msg" + if [ "$COLORED_OUTPUT" -eq 1 ]; then + echo "${BLUE}${msg}${NORMAL}" + else + echo "$msg" + fi fi } @@ -132,10 +148,14 @@ print_info() { msg=$* - if [ "$COLORED_OUTPUT" -eq 1 ]; then - echo "${GREEN}[+]$NORMAL $msg" + if [ "$VERBOSITY" -eq 0 ]; then + return else - echo "[-] $msg" + if [ "$COLORED_OUTPUT" -eq 1 ]; then + echo "${GREEN}[+]$NORMAL $msg" + else + echo "[-] $msg" + fi fi } @@ -143,10 +163,14 @@ print_warn() { msg=$* - if [ "$COLORED_OUTPUT" -eq 1 ]; then - echo "${YELLOW}[-]$NORMAL $msg" + if [ "$VERBOSITY" -eq 0 ]; then + return else - echo "[-] $msg" + if [ "$COLORED_OUTPUT" -eq 1 ]; then + echo "${YELLOW}[-]$NORMAL $msg" + else + echo "[-] $msg" + fi fi } @@ -433,12 +457,13 @@ quit() { # --------------------- # # CLI Optionen auswerten -while getopts f:hl:v opt +while getopts f:hl:qv opt do case $opt in f) RECHNUNGSFILE=$OPTARG;; h) display_help; exit 0;; l) LCOFILE=$OPTARG;; + q) VERBOSITY=0;; v) display_version; exit 0;; *) display_help; exit 1;; esac From 3786fe767ac264e74e7ba1229ebf92c53e948ca5 Mon Sep 17 00:00:00 2001 From: bernd Date: Sat, 29 May 2021 00:26:34 +0200 Subject: [PATCH 09/18] =?UTF-8?q?bugfix,=20readme=20angepa=C3=9Ft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.txt | 4 ++++ rechnung.sh | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index d67dd35..1f98b91 100644 --- a/readme.txt +++ b/readme.txt @@ -34,5 +34,9 @@ Optionen Verwendet 'lco-datei' für verschiedene Variablen des Absenders. +-q + + Es werden nur noch Fehlermeldungen ausgegeben. + -v Zeigt die Programmversion an. diff --git a/rechnung.sh b/rechnung.sh index a3d3c12..99fe8fd 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -388,7 +388,7 @@ make_invoice() { cp "$TEMPLATEFILE" "$filename" $SED_BIN -i -f "$SEDFILE" "$filename" - if ! $GENPDF "$filename"; then + if ! $GENPDF "$filename" 1>&2 >/dev/null; then print_error "Rechnung fehlgeschlagen" else print_info "Rechnung erfolgreich erstellt" From c2484f3015f20ed3a948889582add23e78914be6 Mon Sep 17 00:00:00 2001 From: +++ Date: Wed, 2 Jun 2021 23:20:52 +0200 Subject: [PATCH 10/18] installation von rechnung.sty nicht mehr interaktiv --- readme.txt | 6 ++++++ rechnung.sh | 55 ++++++++++++++++++++++++++--------------------------- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/readme.txt b/readme.txt index 1f98b91..db15157 100644 --- a/readme.txt +++ b/readme.txt @@ -30,6 +30,12 @@ Optionen Die Kundendaten werden aus 'kundendatei' gelesen. +-i + + Installiert bei Bedarf das Latex-Paket rechnung.sty. Das Paket wird aus + dem Repo geklont, mittels latex gebaut und in das Verzeichnis + $HOME/texmf/latex/tex/rechnung/ kopiert. + -l lco-datei Verwendet 'lco-datei' für verschiedene Variablen des Absenders. diff --git a/rechnung.sh b/rechnung.sh index 99fe8fd..ee063e8 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -59,6 +59,7 @@ RECHNUNGSFILE="rechnung.ini" TEMPLATEFILE="template.ltx" LCOFILE="absender.lco" LCO=$(basename $LCOFILE .lco) +INSTALL_LCO_FILE=0 SEDFILE="sed.txt" LINE_BUFFER="" KEY_BUFFER="" @@ -275,42 +276,35 @@ install_sty() ( old_pwd=$(pwd) - printf " LaTeX Paket '%s' installieren? (y/N): " $STY_RECHNUNG; read -r REPLY - if [ "$REPLY" = "y" ] || [ "$REPLY" = "Y" ] || [ "$REPLY" = "j" ] || [ "$REPLY" = "J" ] - then - check_binaries "$GIT_BIN $LATEX_BIN" - print_start "Hole Repo von $STY_URL ..." + check_binaries "$GIT_BIN $LATEX_BIN" + print_start "Hole Repo von $STY_URL ..." + + if git clone $STY_URL >/dev/null 2>&1; then + print_ok + cd rechnung + mkdir -p "$STY_HOME/rechnung/" + print_start "Kompiliere $STY_RECHNUNG ..." - if git clone $STY_URL >/dev/null 2>&1; then + if $LATEX_BIN rechnung.ins >/dev/null 2>&1; then print_ok - cd rechnung - mkdir -p "$STY_HOME/rechnung/" - print_start "Kompiliere $STY_RECHNUNG ..." + print_start "Kopiere $STY_RECHNUNG nach $STY_HOME/rechnung ..." - if $LATEX_BIN rechnung.ins >/dev/null 2>&1; then + if cp rechnung.sty "$STY_HOME/rechnung/"; then print_ok - print_start "Kopiere $STY_RECHNUNG nach $STY_HOME/rechnung ..." - - if cp rechnung.sty "$STY_HOME/rechnung/"; then - print_ok - else - print_failed - exit 1 - fi - cd "$old_pwd" - rm -rf rechnung/ - print_info "Paket $STY_RECHNUNG erfolgreich installiert" else - print_error "Installation fehlgeschlagen" - exit 5 + print_failed + exit 1 fi + cd "$old_pwd" + rm -rf rechnung/ + print_info "Paket $STY_RECHNUNG erfolgreich installiert" else - print_error "Klonen des Repos fehlgeschlagen" - exit 6 + print_error "Installation fehlgeschlagen" + exit 5 fi else - print_info "Beende Progrann" - exit 7 + print_error "Klonen des Repos fehlgeschlagen" + exit 6 fi ) @@ -462,6 +456,7 @@ 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;; @@ -488,7 +483,11 @@ check_readable "$TEMPLATEFILE" check_readable "$LCOFILE" if ! check_sty "$STY_HOME"; then print_warn "$STY_RECHNUNG nicht gefunden." - install_sty + if [ $INSTALL_LCO_FILE -eq 0 ]; then + print_info("Beende $PROGRAMM_NAME") + else + install_sty + fi fi # Kundendatei einlesen und rechnungen erstellen From c43c2cb7a125c0f131be8fc2953a985b7d2fbf27 Mon Sep 17 00:00:00 2001 From: +++ Date: Thu, 3 Jun 2021 10:28:56 +0200 Subject: [PATCH 11/18] fehlerausgabe verbessert, kleine korrekturen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit wenn das kompilieren fehlschlägt wird im log nach fehlermeldungen gesucht und diese ausgegeben. ein - nach /bin/sh verhindert parameterübergaben. ifs wird explitiet gesetzt. --- rechnung.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/rechnung.sh b/rechnung.sh index ee063e8..386914d 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/sh - # file: rechnung.sh # date: 02.05.2021 @@ -13,6 +13,9 @@ set -e # ein paar Sicherheitsvorkehrungen # -------------------------------- +OLDIFS=$IFS +IFS=' ' + unset -f command unset -f unalias \unalias -a @@ -383,9 +386,11 @@ make_invoice() { $SED_BIN -i -f "$SEDFILE" "$filename" if ! $GENPDF "$filename" 1>&2 >/dev/null; then - print_error "Rechnung fehlgeschlagen" + print_error "Kompilierung von $filename fehlgeschlagen" + logfile=$(echo "$filename" | sed -e s/ltx/log/) + print_error "$(grep "Error" $logfile)" else - print_info "Rechnung erfolgreich erstellt" + print_info "Rechnung $filename erfolgreich erstellt" fi if [ -x "$RUBBER_BIN" ]; then @@ -484,7 +489,7 @@ check_readable "$LCOFILE" if ! check_sty "$STY_HOME"; then print_warn "$STY_RECHNUNG nicht gefunden." if [ $INSTALL_LCO_FILE -eq 0 ]; then - print_info("Beende $PROGRAMM_NAME") + print_info "Beende $PROGRAMM_NAME" else install_sty fi @@ -497,4 +502,3 @@ do proced_ini_line "$LINE_BUFFER" done < "$RECHNUNGSFILE" - From 98a3abd1eed4f80fa348d2dcd0f6063b8130c5ab Mon Sep 17 00:00:00 2001 From: +++ Date: Thu, 3 Jun 2021 18:45:41 +0200 Subject: [PATCH 12/18] =?UTF-8?q?tests=20hinzugef=C3=BCgt,=20suche=20nach?= =?UTF-8?q?=20rechnung.sty=20=C3=BCberarbeitet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - kpsewhich sucht nach rechnung.sty - prinf_failed kann optional ein string übergeben werden - neue funktionen fail_and_exit, get_link_target, check_rechnungsdaten - check_readable und check_binarys testen auf symbolische links - einige funktionen mit kommentaren versehen --- rechnung.sh | 170 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 130 insertions(+), 40 deletions(-) diff --git a/rechnung.sh b/rechnung.sh index 386914d..8e184bc 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -33,13 +33,14 @@ CUT_BIN=$(which cut 2>/dev/null || echo "cut") DATE_BIN=$(which date 2>/dev/null || echo "date") TPUT_BIN=$(which tput 2>/dev/null || echo "tput") PDFLATEX_BIN=$(which pdflatex 2>/dev/null || echo "pdflatex") +KPSEWHICH_BIN=$(which kpsewhich 2>/dev/null || echo "kpsewhich") GIT_BIN=$(which git 2>/dev/null || echo "git") LATEX_BIN=$(which latex 2>/dev/null || echo "latex") RUBBER_BIN=$(which rubber 2>/dev/null || echo "rubber") # Nicht auf rubber prüfen; Programm ist optional # Nicht auf git prüfen; wird nur benötigt, wenn rechnung.sty nicht existiert. # Nicht auf latex prüfen; wird nur benötigt, wenn rechnung.sty nicht texistiert. -EXECUTABLES_TO_CHECK="$BC_BIN $TR_BIN $SED_BIN $CUT_BIN $TPUT_BIN $DATE_BIN $PDFLATEX_BIN" +EXECUTABLES_TO_CHECK="$BC_BIN $TR_BIN $SED_BIN $CUT_BIN $TPUT_BIN $DATE_BIN $PDFLATEX_BIN $KPSEWHICH_BIN" GENPDF="" if [ -x "$RUBBER_BIN" ]; then @@ -52,7 +53,7 @@ fi # Variablen definieren # -------------------- -PROGRAMM_NAME=`basename $0` +PROGRAMM_NAME=$(basename $0) PROGRAMM_VERSION="0.0.1" VERBOSITY=1 STY_HOME="$HOME/texmf/tex/latex" @@ -67,7 +68,6 @@ SEDFILE="sed.txt" LINE_BUFFER="" KEY_BUFFER="" VALUE_BUFFER="" -ERROR=0 KUNDE="" ADRESSE="" ANREDE="" @@ -109,6 +109,8 @@ print_start() { print_failed() { + msg=$* + if [ "$VERBOSITY" -eq 0 ]; then return else @@ -117,6 +119,9 @@ print_failed() { else printf " Failed\n" fi + if [ ! -z "$msg" ]; then + print_error "$msg" + fi fi } @@ -189,52 +194,96 @@ print_error() { fi } +failed_and_exit() { + + print_failed + exit $* +} + # Diverse Checks # -------------- check_readable() { - + + # testet, ob die übergebene datei kein symlink ist, existiert und lesbar + # ist. schlägt einer der tests fehl, wird das programm beendet. + print_start "Datei $1 ist lesbar ..." + if test -h "$1"; then + target=$(get_link_target "$1") + print_failed "$1 ist ein symbolischer Link auf $target" + exit 1 + fi if test -f "$1" && test -r "$1"; then print_ok else - print_failed - quit 1 + failed_and_exit 1 fi } check_sty() ( - + + # sucht in einer subshell nach dem paket rechnung.sty. gibt true oder + # false zurück. + print_start "Suche nach $STY_RECHNUNG ..." - rechnung=$(find "$STY_HOME" -type f -name "$STY_RECHNUNG") - if test ! -f "$rechnung"; then - print_failed - return 1 - else + kpsewhich "$STY_RECHNUNG" 2>&1 >/dev/null + if [ $? -eq 0 ]; then print_ok return 0 + else + print_failed + return 1 fi ) -check_binaries() { +check_binaries() ( - program="" + # 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 - print_error "Das Programm $program wird benötigt, aber nicht gefunden." + 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() ( + # die funktion überprüft in einer subshell, ob die übergebene zeile ein + # = als trennzeichen enthält. gibt ja oder falsch zurück. + line="$*" if [ "${line#*=}" != "$line" ]; then @@ -244,6 +293,43 @@ is_option() ( fi ) +check_rechnunsdaten() ( + + # die funktion überprüft in einer subshell, ob alle variablen belegt + # sind. ist eine variable leer, wird der name der variablen ausgegeben + # und ein fehler (1) zurück gegeben. + + print_start "Prüfe Rechnungsdaten ..." + if test -z "$KUNDE"; then + print_failed "Das Feld Kunde ist leer" + return 1 + elif test -z "$ADRESSE"; then + print_failed "Das Feld Adresse ist leer" + return 1 + elif test -z "$ANREDE"; then + print_failed "Das Feld Anrede ist leer" + return 1 + elif test -z "$ANZAHL"; then + print_failed "Das Feld Anzahl ist leer" + return 1 + elif test -z "$POSITION"; then + print_failed "Das Feld Position ist leer" + return 1 + elif test -z "$SHORT"; then + print_failed "Das Feld Short ist leer" + return 1 + elif test -z "$BETRAG"; then + print_failed "Das Feld Betrag ist leer" + return 1 + elif test -z "$LFDNR"; then + print_failed "Das Feld LfdNr ist leer" + return 1 + else + print_ok + return 0 + fi +) + # Whitespaces entfernen # in Buffer speichern # --------------------- @@ -282,7 +368,7 @@ install_sty() ( check_binaries "$GIT_BIN $LATEX_BIN" print_start "Hole Repo von $STY_URL ..." - if git clone $STY_URL >/dev/null 2>&1; then + if $GIT_BIN clone $STY_URL >/dev/null 2>&1; then print_ok cd rechnung mkdir -p "$STY_HOME/rechnung/" @@ -295,19 +381,18 @@ install_sty() ( if cp rechnung.sty "$STY_HOME/rechnung/"; then print_ok else - print_failed - exit 1 + failed_and_exit 3 fi cd "$old_pwd" rm -rf rechnung/ print_info "Paket $STY_RECHNUNG erfolgreich installiert" else print_error "Installation fehlgeschlagen" - exit 5 + exit 4 fi else print_error "Klonen des Repos fehlgeschlagen" - exit 6 + exit 5 fi ) @@ -316,11 +401,10 @@ install_sty() ( reset_values() { - print_info "Initialisiere Felder für Rechnung neu." + print_info "Beginne neue Rechnung" LINE_BUFFER="" KEY_BUFFER="" VALUE_BUFFER="" - ERROR=0 KUNDE="" ADRESSE="" ANREDE="" @@ -349,11 +433,22 @@ set_value() { betrag) BETRAG="$VALUE_BUFFER";; lfdnr) LFDNR="$VALUE_BUFFER";; short) SHORT="$VALUE_BUFFER";; - *) print_warn "Unbekanntes Feld: $KEY_BUFFER"; ERROR=1;; + *) print_warn "Unbekanntes Feld: $KEY_BUFFER";; 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 + # zurück. ansonst wird eine kopie des latex-templates erstellt, die + # darin befindlichen platzhalter durch die entsprechenden variablen zu + # ersetzen und das ganze zu kompilieren. + + check_rechnunsdaten + if [ ! "$?" -eq 0 ]; then + return 1 + fi dead_days="14" if [ "$(date +%u)" -gt 5 ]; then @@ -361,7 +456,6 @@ make_invoice() { fi month_ascii=$(date '+%B') -# inv_day=$(date '+%j') inv_date=$(date '+%Y%m%d') inv_dead=$(date -d "+${dead_days}days" '+%d.\\,%m.\\,%Y') rechnungsnummer="$inv_date--$LFDNR" @@ -394,9 +488,9 @@ make_invoice() { fi if [ -x "$RUBBER_BIN" ]; then - "$RUBBER_BIN" --clean "$filename" + "$RUBBER_BIN" --clean "$filename" fi -} +) proced_ini_line() { @@ -417,12 +511,7 @@ proced_ini_line() { # ende einer rechnung elif [ "$line" = "[ende]" ]; then - if [ $ERROR -ne 0 ]; then - print_warn "Kunde \"$KUNDE\" enthält einen Fehler. Erstelle keine Rechung." - return - else - make_invoice - fi + make_invoice # alle anderen zeilen else @@ -469,7 +558,7 @@ do esac done -# Verschiedene Basic Checks +# Farbe aktivieren wenn vorhanden if [ -n "$NUMBER_OF_COLORS" ] && [ "$NUMBER_OF_COLORS" -ge 8 ]; then COLORED_OUTPUT=1 fi @@ -478,6 +567,7 @@ print_deko " ========================" print_deko " = $PROGRAMM_NAME v$PROGRAMM_VERSION =" print_deko " ========================" +# Verschiedene Basic Checks if [ "$(id -u)" -eq 0 ]; then print_error "$0: Das Skript darf nicht als Root ausgeführt werden." exit 1 @@ -486,12 +576,12 @@ check_binaries "$EXECUTABLES_TO_CHECK" check_readable "$RECHNUNGSFILE" check_readable "$TEMPLATEFILE" check_readable "$LCOFILE" -if ! check_sty "$STY_HOME"; then - print_warn "$STY_RECHNUNG nicht gefunden." +if ! check_sty; then + print_warn "Verwenden sie -i um $STY_RECHNUNG zu installieren" if [ $INSTALL_LCO_FILE -eq 0 ]; then - print_info "Beende $PROGRAMM_NAME" + exit 7 else - install_sty + install_sty fi fi From b0baeaebe3b2d72252ad87cfecd242167b2d8a23 Mon Sep 17 00:00:00 2001 From: +++ Date: Fri, 4 Jun 2021 08:53:47 +0200 Subject: [PATCH 13/18] =?UTF-8?q?todo=20angepa=C3=9Ft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO.txt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/TODO.txt b/TODO.txt index 8313855..d3fdddf 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,13 +1,12 @@ TODO ---- -* Bessere Fehlerkontrolle -* Ausgabe (besonders farbige) im Terminal verbessern. -* Ausgabe deaktivierbar machen. -* Parameterübergabe um einzelne Kunden zu bearbeiten. - * Parameter für den Versand der Rechnung. +* 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 dürch eine Variable ersetzen. +* Den Begleittext im Latex-File durch eine Variable ersetzen. +* Das Program in einem temporären Verzeichnis arbeiten lassen. From bf2ca2c96b154bc91268d5b510fbcbe49f355930 Mon Sep 17 00:00:00 2001 From: qbi Date: Sun, 6 Jun 2021 10:01:01 +0200 Subject: [PATCH 14/18] =?UTF-8?q?1=20gel=C3=B6scht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die einzelnen Felder sind nicht nummeriert. Die "1" war vermutlich ein Artefakt des früheren Formats. --- rechnung.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rechnung.ini b/rechnung.ini index 0975a3f..2257515 100644 --- a/rechnung.ini +++ b/rechnung.ini @@ -5,7 +5,7 @@ [start] kunde=Firma A -adresse1= Strasse A; 012345 Stadt A; +adresse= Strasse A; 012345 Stadt A; anrede=Sehr geehrte Damen und Herren, anzahl=1 position=Dienstleistung A mit etwas mehr Text From df55d17113b4c7104288893c9b09510e29fa09ff Mon Sep 17 00:00:00 2001 From: qbi Date: Sun, 6 Jun 2021 10:04:24 +0200 Subject: [PATCH 15/18] Variablen quoten --- rechnung.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rechnung.sh b/rechnung.sh index 8e184bc..27d1b03 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -53,7 +53,7 @@ fi # Variablen definieren # -------------------- -PROGRAMM_NAME=$(basename $0) +PROGRAMM_NAME=$(basename "$0") PROGRAMM_VERSION="0.0.1" VERBOSITY=1 STY_HOME="$HOME/texmf/tex/latex" @@ -197,7 +197,7 @@ print_error() { failed_and_exit() { print_failed - exit $* + exit "$*" } # Diverse Checks @@ -255,7 +255,7 @@ check_binaries() ( quit 3 else if [ -h "$program" ]; then - program=$(get_link_target $program) + program=$(get_link_target "$program") fi if ! which "$program" 2>&1 >/dev/null; then print_failed "$program ist nicht im Pfad" @@ -274,7 +274,7 @@ get_link_target() ( program=$1 while [ -h "$program" ]; do - program=$(readlink $program) + program=$(readlink "$program") done echo "$program" ) @@ -482,7 +482,7 @@ make_invoice() ( if ! $GENPDF "$filename" 1>&2 >/dev/null; then print_error "Kompilierung von $filename fehlgeschlagen" logfile=$(echo "$filename" | sed -e s/ltx/log/) - print_error "$(grep "Error" $logfile)" + print_error "$(grep "Error" "$logfile")" else print_info "Rechnung $filename erfolgreich erstellt" fi From f4e187c0483d43af6f8fcae85b1d39c1d62997d6 Mon Sep 17 00:00:00 2001 From: qbi Date: Sun, 6 Jun 2021 10:06:37 +0200 Subject: [PATCH 16/18] Doppelte Verneinung entfernt --- rechnung.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rechnung.sh b/rechnung.sh index 27d1b03..08f0f76 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -119,7 +119,7 @@ print_failed() { else printf " Failed\n" fi - if [ ! -z "$msg" ]; then + if [ -n "$msg" ]; then print_error "$msg" fi fi From 7c5c93444cf7e5e4d40e85e8ea72ae843fa9c6b1 Mon Sep 17 00:00:00 2001 From: qbi Date: Sun, 6 Jun 2021 10:21:54 +0200 Subject: [PATCH 17/18] Zuerst muss /dev/null kommen --- rechnung.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rechnung.sh b/rechnung.sh index 08f0f76..69e8182 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -227,7 +227,7 @@ check_sty() ( # false zurück. print_start "Suche nach $STY_RECHNUNG ..." - kpsewhich "$STY_RECHNUNG" 2>&1 >/dev/null + kpsewhich "$STY_RECHNUNG" > /dev/null 2>&1 if [ $? -eq 0 ]; then print_ok return 0 @@ -257,7 +257,7 @@ check_binaries() ( if [ -h "$program" ]; then program=$(get_link_target "$program") fi - if ! which "$program" 2>&1 >/dev/null; then + if ! which "$program" > /dev/null 2>&1 ; then print_failed "$program ist nicht im Pfad" fi print_ok From 09722922b9dd43f8669a19886378d7f1c657f75b Mon Sep 17 00:00:00 2001 From: qbi Date: Sun, 6 Jun 2021 10:29:38 +0200 Subject: [PATCH 18/18] =?UTF-8?q?Option=20i=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rechnung.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rechnung.sh b/rechnung.sh index 69e8182..4755456 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -227,8 +227,8 @@ check_sty() ( # false zurück. print_start "Suche nach $STY_RECHNUNG ..." - kpsewhich "$STY_RECHNUNG" > /dev/null 2>&1 - if [ $? -eq 0 ]; then + + if kpsewhich "$STY_RECHNUNG" > /dev/null 2>&1 ; then print_ok return 0 else @@ -445,8 +445,8 @@ make_invoice() ( # darin befindlichen platzhalter durch die entsprechenden variablen zu # ersetzen und das ganze zu kompilieren. - check_rechnunsdaten - if [ ! "$?" -eq 0 ]; then + + if ! check_rechnunsdaten ; then return 1 fi @@ -545,7 +545,7 @@ quit() { # --------------------- # # CLI Optionen auswerten -while getopts f:hl:qv opt +while getopts f:hi:l:qv opt do case $opt in f) RECHNUNGSFILE=$OPTARG;;