diff options
-rwxr-xr-x | Inventur | 165 |
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 |