programa buscar caja v2
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



Comments