programa buscar caja v2

PHOTO EMBED

Tue Sep 23 2025 12:28:50 GMT+0000 (Coordinated Universal Time)

Saved by @jrg_300i

#!/bin/bash
# Jobran Rodriguez

# Definir lista de personas (en orden) con 8 nombres
persons=("Juan" "Jobran" "Luis" "Jose" "Gabriel" "Jonathan" "Brian" "Robert")

# Detectar carpeta de escritorio válida
if [ -d "$HOME/Escritorio" ]; then
    DESKTOP_DIR="$HOME/Escritorio"
elif [ -d "$HOME/Desktop" ]; then
    DESKTOP_DIR="$HOME/Desktop"
else
    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
        # Eliminar ceros a la izquierda para cálculos
        month=$((10#$month))
        # Formatear para mostrar
        month_fmt=$(printf "%02d" $month)
        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 (ej. 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."
    echo "Nombres válidos: ${persons[*]}"
    exit 1
fi

# Fecha actual (sin ceros a la izquierda para comparaciones)
current_year=$(date +%Y)
current_month=$(date +%-m)
current_day=$(date +%-d)

# Determinar si mostrar asignación individual
show_individual=1
if (( year < current_year )) || { (( year == current_year )) && (( month < current_month )); }; then
    show_individual=0
fi

# Función para obtener días del mes
days_in_month() {
    local m=$1
    local y=$2
    
    case $m in
        1|3|5|7|8|10|12) echo 31 ;;
        4|6|9|11) echo 30 ;;
        2)
            if (( (y % 400 == 0) || ((y % 4 == 0) && (y % 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 asignaciones
declare -a laboral_days
declare -a asignacion_personas
declare -a day_names
laboral_count=0

for (( day=1; day<=total_days; day++ )); do
    # Formatear día con dos dígitos para fecha
    day_fmt=$(printf "%02d" $day)
    wd=$(date -d "$year-$month_fmt-$day_fmt" +%u 2>/dev/null)
    
    if [ $? -ne 0 ]; then
        echo "Error: Fecha inválida $year-$month_fmt-$day_fmt. Verifica el mes y año."
        exit 1
    fi
    
    if (( wd >= 1 && wd <= 5 )); then
        laboral_days[laboral_count]=$day
        assign_index=$(( laboral_count % ${#persons[@]} ))
        asignacion_personas[laboral_count]=${persons[$assign_index]}
        
        # Obtener nombre del día en español
        day_name=$(LC_TIME=es_ES.UTF-8 date -d "$year-$month_fmt-$day_fmt" +%A 2>/dev/null)
        day_names[laboral_count]=$day_name
        
        ((laboral_count++))
    fi
done

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

assigned_days=()
current_week=""
week_started=0

# Mostrar asignación semanal por pantalla
echo
echo "📅 Asignación semanal de búsqueda de caja para $month_fmt/$year:"
echo "=========================================================="

for (( i=0; i<laboral_count; i++ )); do
    day=${laboral_days[i]}
    assigned_person=${asignacion_personas[i]}
    day_name=${day_names[i]}
    
    # Formatear día con dos dígitos
    day_fmt=$(printf "%02d" $day)
    fecha_es=$(LC_TIME=es_ES.UTF-8 date -d "$year-$month_fmt-$day_fmt" +"%A %d de %B de %Y" 2>/dev/null)
    
    if [ $? -ne 0 ]; then
        echo "Error: No se pudo obtener información de fecha para $year-$month_fmt-$day_fmt"
        continue
    fi
    
    # Determinar semana actual
    week_num=$(date -d "$year-$month_fmt-$day_fmt" +%U 2>/dev/null)
    
    # Verificar si la fecha ya pasó
    date_passed=0
    if (( year < current_year )) || \
       { (( year == current_year )) && (( month < current_month )); } || \
       { (( year == current_year )) && (( month == current_month )) && (( day < current_day )); }; then
        date_passed=1
    fi
    
    # Escribir en archivo (todas las fechas)
    echo "$fecha_es : $assigned_person" >> "$OUTPUT_FILE"
    
    # Mostrar solo asignación individual para el usuario si corresponde
    if [[ "${assigned_person,,}" == "${name,,}" && show_individual -eq 1 ]]; then
        assigned_days+=("$fecha_es")
    fi
    
    # Mostrar asignación semanal por pantalla (solo fechas futuras o actual)
    if [ $date_passed -eq 0 ]; then
        if [ "$current_week" != "$week_num" ]; then
            if [ $week_started -eq 1 ]; then
                echo "----------------------------------------------------"
            fi
            current_week=$week_num
            week_start_date=$(date -d "$year-$month_fmt-$day_fmt -$(( $(date -d "$year-$month_fmt-$day_fmt" +%u) - 1 )) days" +"%d/%m" 2>/dev/null)
            week_end_date=$(date -d "$year-$month_fmt-$day_fmt +$(( 7 - $(date -d "$year-$month_fmt-$day_fmt" +%u) )) days" +"%d/%m" 2>/dev/null)
            echo "📋 Semana del $week_start_date al $week_end_date:"
            week_started=1
        fi
        
        # Icono según el día de la semana
        case $day_name in
            lunes) icon="🔵" ;;
            martes) icon="🟢" ;;
            miércoles|miercoles) icon="🟡" ;;
            jueves) icon="🟠" ;;
            viernes) icon="🔴" ;;
            *) icon="📌" ;;
        esac
        
        # Resaltar si es el usuario actual
        if [[ "${assigned_person,,}" == "${name,,}" ]]; then
            echo "   $icon $day_name $day: 👤 **TÚ**"
        else
            echo "   $icon $day_name $day: $assigned_person"
        fi
    fi
done

if [ $week_started -eq 1 ]; then
    echo "=========================================================="
fi

# Mostrar resultados individuales al usuario
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_fmt/$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