#!/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