programa buscar caja de comida

PHOTO EMBED

Tue Aug 26 2025 17:20:47 GMT+0000 (Coordinated Universal Time)

Saved by @jrg_300i #docker

#!/bin/bash

day_name=$(LC_TIME=es_ES.UTF-8 date -d "$year-$month-$day" +%A)
fecha_es=$(LC_TIME=es_ES.UTF-8 date -d "$year-$month-$day" +"%A %d de %B de %Y")


# Definir lista de personas (en orden) con 7 nombres (sin Aguedo)
persons=("Juan" "Jobran" "Luis" "Jesus" "Jose" "Gabriel" "Jonathan")

# Detectar carpeta de escritorio válida (prioriza "Escritorio" si existe, si no "Desktop")
if [ -d "$HOME/Escritorio" ]; then
    DESKTOP_DIR="$HOME/Escritorio"
elif [ -d "$HOME/Desktop" ]; then
    DESKTOP_DIR="$HOME/Desktop"
else
    # No existe ninguna, crear "Escritorio"
    DESKTOP_DIR="$HOME/Escritorio"
    mkdir -p "$DESKTOP_DIR"
    echo "No se encontró carpeta de escritorio, se ha creado '$DESKTOP_DIR'."
fi

# Crear carpeta asignacion
A="$DESKTOP_DIR/asignacion"
mkdir -p "$A"

# Definir archivo de salida
OUTPUT_FILE="$A/asignacion_caja.txt"

echo "Hola! Este script te dirá qué días te toca buscar la caja de comida este mes."
read -p "Por favor, ingresa tu nombre: " name

# Validar mes
while true; do
    read -p "Ingresa el número del mes (1-12): " month
    if [[ "$month" =~ ^[0-9]+$ ]] && (( month >= 1 && month <= 12 )); then
        break
    else
        echo "Error: Debes ingresar un número válido entre 1 y 12 para el mes."
    fi
done

# Validar año
while true; do
    read -p "Ingresa el año actual (2025): " year
    if [[ "$year" =~ ^[0-9]{4}$ ]] && (( year >= 1900 && year <= 3000 )); then
        break
    else
        echo "Error: Debes ingresar un año válido de 4 dígitos (por ejemplo, 2023)."
    fi
done

# Verificar nombre con mensaje específico
index=-1
for i in "${!persons[@]}"; do
    if [[ "${persons[$i],,}" == "${name,,}" ]]; then
        index=$i
        break
    fi
done
if [ $index -eq -1 ]; then
    echo "Error: Debes ingresar un nombre válido de las personas que trabajan en la oficina de sistemas y usan el servicio del comedor."
    exit 1
fi

# Fecha actual
current_year=$(date +%Y)
current_month=$(date +%m)
current_day=$(date +%d)

show_individual=1
if (( year < current_year )) || { (( year == current_year )) && (( month < 10#$current_month )); }; then
    show_individual=0
fi

days_in_month() {
    case $1 in
        1|3|5|7|8|10|12) echo 31 ;;
        4|6|9|11) echo 30 ;;
        2)
            if (( ($2 % 400 == 0) || (($2 % 4 == 0) && ($2 % 100 != 0)) )); then
                echo 29
            else
                echo 28
            fi
            ;;
        *)
            echo 30
            ;;
    esac
}

total_days=$(days_in_month $month $year)

# PRE-CALCULAR días laborales y asignados para evitar múltiples llamadas
declare -a laboral_days
declare -a asignacion_personas
laboral_count=0

for (( day=1; day<=total_days; day++ )); do
    wd=$(date -d "$year-$month-$day" +%u)
    if (( wd >= 1 && wd <= 5 )); then
        laboral_days[laboral_count]=$day
        assign_index=$(( laboral_count % 7 ))
        asignacion_personas[laboral_count]=${persons[$assign_index]}
        ((laboral_count++))
    fi
done

# Crear o sobreescribir archivo
echo "Asignación de búsqueda de caja para $month/$year" > "$OUTPUT_FILE"
echo "--------------------------------------------" >> "$OUTPUT_FILE"

assigned_days=()

for (( i=0; i<laboral_count; i++ )); do
    day=${laboral_days[i]}
    assigned_person=${asignacion_personas[i]}

    # Nombre del día en español, solo llamar una vez por día
    day_name=$(LC_TIME=es_ES.UTF-8 date -d "$year-$month-$day" +%A)

    # Filtrar fechas desde hoy en adelante para archivo y asignación individual
    if (( year > current_year )) || \
       { (( year == current_year )) && (( month > 10#$current_month )); } || \
       { (( year == current_year )) && (( month == 10#$current_month )) && (( day >= 10#$current_day )); }; then
        echo "$day_name $day/$month/$year : $assigned_person" >> "$OUTPUT_FILE"

        # Mostrar solo asignación individual para el usuario si corresponde
        if [[ $assigned_person == "${persons[$index]}" && show_individual -eq 1 ]]; then
            assigned_days+=("$day_name $day/$month/$year")
        fi
    fi
done

if (( show_individual == 1 )); then
    echo
    echo "¡Hola, $name! 🎉 Aquí están los días que te toca buscar la caja de comida este mes:"
    if [ ${#assigned_days[@]} -eq 0 ]; then
        echo "¡Nada esta vez! Pero recuerda estar listo para la próxima ronda. 😉"
    else
        for d in "${assigned_days[@]}"; do
            echo "  - $d"
        done
    fi
else
    echo
    echo "Tu asignación individual no se mostrará porque el mes seleccionado ($month/$year) ya pasó."
fi

echo
echo "Además, se ha creado o actualizado el archivo con la asignación completa en:"
echo "  $OUTPUT_FILE"
echo
echo "¡Gracias por colaborar con el equipo! 💪🍱"

exit 0
content_copyCOPY