# Modalità "query" # Variabili e funzioni di supporto # a modalità query # Controlla che l'id in ingresso esista # e lo converte nel nome dell'operatore corrispondente # (se non esiste, ferma il programma esce con un errore) id_to_name_check(){ case "$1" in 0) echo "$ID_0_150" ;; 1) echo "$ID_1_150" ;; 2) echo "$ID_2_150" ;; *) echoerr "Illegal operator ID specified. Choose between 0,1,2." esac return 0 } # Prendendo in ingresso l'id di un operatore # restituisce il numero totale di ore di lavoro get_operator_total(){ OPERATOR_NAME=$(id_to_name_check "$1") || exit 1 awk -F\; -v pattern="$OPERATOR_NAME" ' BEGIN { counter=0 } $0 ~ pattern { counter+=$3; } END{ print counter }' "$SHIFT_FILE" return 0 } # Grand total mode print_gtotal(){ echo -e "\nHere it comes the operators' grand total:" for i in {0..2} do printf "%-30s%10s/120h\n" "$(id_to_name_check $i):" "$(get_operator_total $i)" done } # Prendendo in stdin una lista di entrate # restituisce le date corrispondente. get_dates(){ cut -f1 -d';' | cut -f1 -d':' 2>/dev/null return 0 } # Prendendo come primo argomento il nome di un # operatore restituisce una lista delle date # nelle quali un suo turno è stato registrato. get_operator_dates(){ grep "$1" "$SHIFT_FILE" | get_dates | uniq 2>/dev/null return 0 } # Mostra a schermo le date relativi ai turni # dell'operatore richiesto in linea di comando # se questo esiste show_operator_dates(){ check_operator "$QUERY_OPERATOR" ||\ echoerr "\"$QUERY_OPERATOR\" is not an LCM operator." local OPERATOR_DATES="$(get_operator_dates "$QUERY_OPERATOR")" [ -n "$OPERATOR_DATES" ] ||\ { echo -e "\nNo dates for \"$QUERY_OPERATOR\"."; exit 0; } ifpaginate "Shifts dates for \"$QUERY_OPERATOR\":\n\n$OPERATOR_DATES" return 0 } # Controlla che il primo argomento sia # una data e nel caso l'assegna alla variabile # corretta ifformat_date(){ local DATE="$(check_date "$1")" if [ -n "$DATE" ] then QUERY_DATE="$DATE" else return 1 fi return 0 } # Prende come primo argomento una data e printa # la lista delle entrate per la stessa, se presenti. get_entries_by_date(){ grep "$1" "$SHIFT_FILE" 2>/dev/null ||\ return 1 return 0 } # Prendendo come primo argomento un'entrata # restituisce l'operatore corrispondente. get_operator_from_entry(){ cut -f2 -d';' <<< "$1" 2>/dev/null return 0 } # Prendendo come primo argomento un'entrata # restituisce la durata del turno corrispondente. get_shift_duration_from_entry(){ cut -f3 -d';' <<< "$1" 2>/dev/null return 0 } # Prendendo come primo argomento un'entrata # restituisce il commento corrispondente. get_comment_from_entry(){ local COMMENT="$(cut -f4 -d';' <<< "$1" 2>/dev/null)" if [ -z "$COMMENT" ] then COMMENT="[No comment]" else COMMENT="\"$(base64 -d <<<"$COMMENT")\"" fi echo "$COMMENT" return 0 } # Prende un'entrata come primo argomento # e la printa in formato leggibile per # esseri umani. entry_to_human(){ echo "operator: $(get_operator_from_entry "$1")" echo "shift duration: $(get_shift_duration_from_entry "$1")h" echo -e "comment: $(get_comment_from_entry "$1")\n" return 0 } # Mostra a schermo le entrate relative alla data # richiesta se presenti. show_entries_by_date(){ ifformat_date "$QUERY_DATE" ||\ echoerr "\"$QUERY_DATE\" is not a valid date." local DATE_ENTRIES="$(get_entries_by_date "$QUERY_DATE")" [ -n "$DATE_ENTRIES" ] ||\ { echo -e "\nNo entries for \"$QUERY_DATE\"."; exit 0; } local DATE_ENTRIES_HUMAN="$(for i in $DATE_ENTRIES; do entry_to_human "$i"; done)" ifpaginate "Entries for \"$QUERY_DATE\":\n\n$DATE_ENTRIES_HUMAN" return 0 }