summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xInventur165
1 files changed, 165 insertions, 0 deletions
diff --git a/Inventur b/Inventur
new file mode 100755
index 0000000..b536e64
--- /dev/null
+++ b/Inventur
@@ -0,0 +1,165 @@
+#!/bin/bash
+
+bekannte_Barcodes=$(
+ {
+ printf 'SELECT '
+ printf '`Schrauben`.`barcode`'
+ printf ' FROM `Schrauben`;\n'
+ printf 'SELECT '
+ printf '`Muttern`.`barcode`'
+ printf ' FROM `Muttern`;\n'
+ printf 'SELECT '
+ printf '`Unterlegscheiben`.`barcode`'
+ printf ' FROM `Unterlegscheiben`;\n'
+ } \
+ | mysql
+)
+
+frag_ab() {
+ local Bezeichner="$1"
+ shift
+ while true; do
+ >&2 printf '%s (' "${Bezeichner}"
+ printf '%s/' "$@" \
+ | sed 's@/$@)? @' >&2
+ read Antwort >&2
+ if printf '%s\n' "$@" \
+ | grep -cF "${Antwort}" \
+ | grep -qxF '1'; then
+ printf '%s\n' "$@" \
+ | grep -F "${Antwort}"
+ return
+ fi
+ printf '\n' >&2
+ done
+}
+
+declare -A Kategorien
+Kategorien['Kopf']='Koepfe'
+Kategorien['Gewindetyp']='Gewindetypen'
+Kategorien['Material']='Materialien'
+
+declare -A Spalten
+for Typ in 'Schraube' 'Mutter' 'Unterlegscheibe'; do
+ Spalten["${Typ}"]=$(
+ printf 'SHOW CREATE TABLE `%sn`;\n' "${Typ}" \
+ | mysql -N --raw --batch \
+ | sed -n '
+ s/^ `\(\S\+\)` \(\S\+\) .*$/\1:\2/
+ T
+ p
+ ' \
+ | grep -v '^id:' \
+ | tr '\n' ' ' \
+ | sed 's@\s$@@'
+ )
+done
+
+frag_aus_Tabelle_ab() {
+ local Alternativen
+ local Antwort
+ Alternativen=$(
+ {
+ printf 'SELECT'
+ printf ' `id`,`name`'
+ printf ' FROM `%s`' "${Kategorien["$1"]}"
+ } \
+ | mysql -N --raw --batch \
+ | tr '\t' ' ' \
+ | sort -u
+ )
+ Antwort=$(
+ frag_ab "$1" $(printf '%s\n' "${Alternativen}" | sed 's@^\S\+ @@')
+ )
+ printf '%s\n' "${Alternativen}" \
+ | grep -wF "${Antwort}" \
+ | cut -d' ' -f1
+}
+
+tmp_dir=$(mktemp -d)
+trap 'rm -rf --one-file-system "${tmp_dir}"' EXIT
+
+while {
+ >&2 printf '%s Schachteln übrig\n' \
+ $(
+ printf '%s\n' "${bekannte_Barcodes}" "${vorhandene_Barcodes}" "${vorhandene_Barcodes}" \
+ | sort \
+ | uniq -u \
+ | wc -l
+ )
+ read -r Barcode
+}; do
+ if [ -z "${Barcode}" ]; then
+ break
+ fi
+ vorhandene_Barcodes=$(
+ printf '%s\n' ${vorhandene_Barcodes} ${Barcode} \
+ | sort -u
+ )
+ if printf '%s\n' "${bekannte_Barcodes}" \
+ | grep -qxF "${Barcode}"; then
+ >&2 printf 'ist bekannt\n\n'
+ continue
+ fi
+ Typ=$(
+ frag_ab 'Typ' 'Schraube' 'Mutter' 'Unterlegscheibe'
+ )
+ for Eigenschaft_Datentyp in ${Spalten["${Typ}"]}; do
+ Eigenschaft="${Eigenschaft_Datentyp%%:*}"
+ Datentyp="${Eigenschaft_Datentyp#${Eigenschaft}:}"
+ if [ "${Eigenschaft}" = 'Barcode' ]; then
+ Wert="${Barcode}"
+ elif [ -n "${Kategorien["${Eigenschaft}"]}" ]; then
+ Wert=$(
+ frag_aus_Tabelle_ab "${Eigenschaft}"
+ )
+ else
+ >&2 printf '%s (%s): ' "${Eigenschaft}" "${Datentyp}"
+ read Wert >&2
+ fi
+ printf '%s\t' "${Wert}"
+ done \
+ | sed '
+ s@\s$@\n@
+ ' >> "${tmp_dir}/neue-Daten-${Typ}"
+done
+
+for Datei in "${tmp_dir}/neue-Daten-"*; do
+ if [ ! -f "${Datei}" ]; then
+ continue
+ fi
+ Typ="${Datei##*/neue-Daten-}"
+ printf 'LOAD DATA LOCAL INFILE "%s"' "${Datei}"
+ printf ' INTO TABLE `%sn`(' "${Typ}"
+ printf '%s\n' ${Spalten["${Typ}"]} \
+ | sed '
+ s@^\([^:]\+\):.*$@`\1`,@
+ $ s@,$@@
+ ' \
+ | tr -d '\n'
+ printf ');\n'
+done \
+| mysql
+
+fehlende_Barcodes=$(
+ printf '%s\n' "${bekannte_Barcodes}" "${vorhandene_Barcodes}" "${vorhandene_Barcodes}" \
+ | sort \
+ | uniq -u \
+ | while read -r bc; do
+ printf '%s' "${bc}" \
+ | base64 -w0
+ printf '\n'
+ done
+)
+if [ -n "${fehlende_Barcodes}" ]; then
+ >&2 printf 'Ich vermisse:\n'
+ for Typ in "${!Spalten[@]}"; do
+ printf 'SELECT *'
+ printf ' FROM `%sn`' "${Typ}"
+ printf ' WHERE `%sn`.`Barcode` IN (' "${Typ}"
+ printf 'FROM_BASE64("%s"),' ${fehlende_Barcodes} \
+ | sed 's@,$@@'
+ printf ');\n'
+ done \
+ | mysql >&2
+fi