Saltar al contenido principal

Codificando la Productividad: Organizador Semanal PHP

· 13 min de lectura
Oscar Adrian Ortiz Bustos

Introducción

Dudo que sea el único, pero siempre he sido de la filosofía del "Después lo hago". Y si bien siempre termino haciendo las cosas que debo hacer, no siempre me siento conforme con el tiempo que le dedico a ser productivo. Por eso decidí crear el organizador semanal de PHP.

Creo que sería la primera vez que hablo sobre esto dentro de La Cueva del NeanderTech pero he estado visitando a una psicóloga últimamente, justo por eso.

¿Porque un organizador?

Entre tantas cosas que se tocaron en la sesión, salió a la conversación el hecho de que me cuesta bastante ser organizado y administrar de buena manera mi tiempo. A lo que la terapeuta me recomendó tener un tipo "calendario" que me ayudara a centrarme en lo que haría en ese momento.

Y como no podía ser de otra manera, utilicé mis habilidades en programación para poder generarme un pequeño pero poderoso programa en PHP que me permita llevar el control de mis actividades a lo largo del día.

¿PHP?

A diferencia de lo que pudiéramos llegar a pensar, hoy en día PHP sigue siendo uno de los lenguajes de programación más utilizados y vanguardista que podemos llegar a utilizar.

Aunque honestamente no es solo eso, sino que he visto en la necesidad de perfeccionar mis habilidades en dicho lenguaje debido a una oportunidad de trabajo que se me ha presentado.

Si eres consumidor frecuente de mi blog, sabrás que en varias ocasiones he mencionado el hecho de que la programación no es solo un lenguaje, sino que es la habilidad de pensar y descomponer problemas grandes en pequeños fragmentos que sean más fáciles de comprender y por ende de solucionar. Así que fue relativamente sencillo, ya que tenía en mente que quería hacer y solo fue familiarizarme con la sintaxis de PHP.

Estructura de proyecto

De manera que el proyecto sea más modular y por ende más escalable, me di a la tarea de separar cada función en un archivo diferente.

El primer archivo fue el menu.php, que es básicamente el que se encarga de printear en la consola las opciones disponibles.

Menú

<?php
function mostrarMenu() {
echo "Organizador Semanal\n";
echo "1. Ingresar nueva actividad\n";
echo "2. Mostrar calendario\n";
echo "3. Modificar actividad\n";
echo "4. Reiniciar semana\n";
echo "5. Salir\n";
echo "Elige una opción: ";
}
?>

Como se puede observar no es nada del otro mundo, el típico menú que haces cuando a penas estás comenzando a programar jaja, pero vaya, es funcional, y con eso basta.

Ingresar Actividad

Para seguir el orden de printeo continuaré con el archivo íngresarActividad.php

<?php
function ingresarActividad($collection) {
echo "Días disponibles: lunes (L), martes (M), miercoles (X), jueves (J), viernes (V)\n";
echo "Ingrese el día (L, M, X, J, V): ";
$dia = trim(fgets(STDIN));

$dias_map = ['L' => 'lunes', 'M' => 'martes', 'X' => 'miercoles', 'J' => 'jueves', 'V' => 'viernes'];

if (!array_key_exists($dia, $dias_map)) {
echo "Día no válido.\n";
return;
}

$dia_completo = $dias_map[$dia];

echo "Ingrese la actividad: ";
$actividad = trim(fgets(STDIN));

echo "Ingrese la hora de inicio (hh:mm): ";
$horaInicio = trim(fgets(STDIN));

echo "Ingrese la hora de fin (hh:mm): ";
$horaFin = trim(fgets(STDIN));

try {
$collection->insertOne([
'dia' => $dia_completo,
'actividad' => $actividad,
'hora_inicio' => $horaInicio,
'hora_fin' => $horaFin
]);
echo "Actividad agregada correctamente.\n";
} catch (Exception $e) {
echo "Error al agregar la actividad: ", $e->getMessage(), "\n";
}
}
?>

El cual gestiona la carga de nuevas actividades en la base de datos... Que, no les había dicho?

A estas alturas los que me conocen saben que cada que tengo que realizar algo que involucre una base de datos, generalmente opto por usar MongoDB, por su facilidad, su escalabilidad y principalmente por que tengo un cluster en la nube y no me tengo que estar preocupando por instalarlo de manera local.

Pero continuando con el archivo de ingresar actividad, dicho archivo toma un parámetro, que en este caso es ´$collection´ que es la colección de Mongo donde se almacenarán las actividades.

Después imprime los días disponibles para ingresar una actividad y solicita que se ingrese un día, para evitar espacios en blanco (que en el trabajo donde estoy me he dado cuenta que es de suma importancia) se utiliza trim(), la función elimina cualquier caracter en blanco antes y después del valor ingresado.

Después utilizo un array asociativo para poder mapear las iniciales de los días a los nombres completos. Después verifico si el día ingresado por el usuario existe en el array de días, y si no existe, printeo un mensaje de error y termina la función, pero si existe, se obtiene el nombre completo del día del array.

Posterior a eso se solicita que ingrese los demás datos:

  • Actividad
  • Hora de inicio (hh:mm)
  • Hora fin (hh:mm)

Una vez ingresados los datos, se intenta insertar la actividad en la colección de MongoDB. Si la inserción es exitosa, se printea un mensaje de éxito, si no... exacto, adivinaste, se printea un mensaje de error.

Modificar Actividad

Siendo claros, el archivo de 'modificarActividad' es bastante similar al de ingresar, pero ya estoy motivado escribiendo esto así que manos a la obra.

<?php
function modificarActividad($collection) {
echo "Ingrese el día de la actividad a modificar (L, M, X, J, V): ";
$dia = trim(fgets(STDIN));

$dias_map = ['L' => 'lunes', 'M' => 'martes', 'X' => 'miercoles', 'J' => 'jueves', 'V' => 'viernes'];

if (!array_key_exists($dia, $dias_map)) {
echo "Día no válido.\n";
return;
}

$dia_completo = $dias_map[$dia];

echo "Ingrese la hora de inicio de la actividad a modificar (hh:mm): ";
$horaInicio = trim(fgets(STDIN));

$actividad = $collection->findOne(['dia' => $dia_completo, 'hora_inicio' => $horaInicio]);

if ($actividad) {
echo "Ingrese la nueva actividad: ";
$nuevaActividad = trim(fgets(STDIN));

echo "Ingrese la nueva hora de inicio (hh:mm): ";
$nuevaHoraInicio = trim(fgets(STDIN));

echo "Ingrese la nueva hora de fin (hh:mm): ";
$nuevaHoraFin = trim(fgets(STDIN));

try {
$collection->updateOne(
['_id' => $actividad['_id']],
['$set' => [
'actividad' => $nuevaActividad,
'hora_inicio' => $nuevaHoraInicio,
'hora_fin' => $nuevaHoraFin
]]
);
echo "Actividad modificada correctamente.\n";
} catch (Exception $e) {
echo "Error al modificar la actividad: ", $e->getMessage(), "\n";
}
} else {
echo "No se encontró ninguna actividad para modificar.\n";
}
}
?>

Primero, como ya se nos está haciendo costumbre, se toma un parámetro ($collection) que es la colección de MongoDB donde se encuentran las actividades. Luego el script me imprime los días disponibles para que el usuario pueda seleccionar en cuál quiere realizar la modificación. Aquí también uso trim() para asegurarme de que no haya espacios en blanco al inicio o final del valor ingresado.

Después con la ayuda del array asociativo, se mapean las iniciales de los días a sus nombres completos, lo cual nos permite verificar si el día ingresado es válido. Si el día no es válido, se muestra un mensaje de error y la función se termina. Pero si es válido, el script procede a obtener el nombre completo del día.

Ahora bien, una vez que se valida el día, el script pide que el usuario ingrese la hora de inicio de la actividad que desea modificar. Aquí es donde la magia de mi queridísimo MongoDB entra en juego: se busca la actividad en la colección que coincida con el día y la hora de inicio proporcionados.

Si la actividad está en la colección, se le solicita al usuario que ingrese los nuevos valores.

  • Nueva Actividad
  • Nueva Hora de Inicio
  • Nueva Hora de Fin

Después se actualiza el documento y si todo sale bien, se muestra un mensaje de éxito, si no, pues no.

Mostrar Calendario

<?php
function mostrarCalendario($collection) {
$dias_abreviados = ['lunes' => 'L', 'martes' => 'M', 'miercoles' => 'X', 'jueves' => 'J', 'viernes' => 'V'];

echo "Actividades Semanales\n";
echo "-----------------------------------------\n";
foreach ($dias_abreviados as $dia_completo => $dia_abreviado) {
echo $dia_abreviado . ":\n";
$actividades = $collection->find(['dia' => $dia_completo]);
if ($actividades->isDead()) {
echo " No hay actividades\n";
} else {
foreach ($actividades as $actividad) {
echo " {$actividad['hora_inicio']} - {$actividad['hora_fin']} : {$actividad['actividad']}\n";
}
}
echo "-----------------------------------------\n";
}
}
?>

Primero, defino un array llamado $dias_abreviados que, como su nombre lo indica, contiene los días de la semana con sus respectivas abreviaturas, solo para poder presentar la información de una manera más concisa.

Después se imprime un simpático encabezado super informativo "Actividades Semanales" (No tenía muchas ganar de quebrarme la cabeza pensando en un título llamativo)

El script continua y entra en un bucle foreach que itera sobre cada día de la semana (bueno, solo de lunes a viernes, que tampoco es plan de hacer actividades el fin de semana, ¿verdad?). Y aquí es donde cobra sentido el array, ya que imprime la abreviatura correspondiente, lo que nos da una vista compacta del calendario.

Se utiliza la colección para buscar todas las actividades registrada para el día en cuestión. Si la colección no tiene actividades para ese día, se imprime un mensaje que indica "No hay actividades" (hay que ser claros) pero si si hay, recorre cada una y nos muestra la hora de inicio, la de fin, y el nombre de la actividad en un formato fácil de leer.

Y si, probablemente piensen que este enfoque es sencillo, y pues si, jaja, pero es increíblemente efectivo para mostrar de manera clara y directa todas las actividades semanales que tienes.

Ahora toca lo que es realmente difícil; hacerlas.

Reiniciar semana

<?php
function reiniciarSemana($collection) {
try {
$collection->deleteMany([]);
echo "Semana reiniciada correctamente.\n";
} catch (Exception $e) {
echo "Error al reiniciar la semana: ", $e->getMessage(), "\n";
}
}

Creo que no necesita mucha presentación, básicamente es el botón de reinicio que todos necesitamos de vez en cuando, pero aplicado a las actividades, su función es bien (si, bien) sencilla y directa: borrar todas las actividades de la semana en nuestra colección y dejar todo listo para empezar de nuevo.

La función reiniciarSemana() toma como parámetro la colección, luego sin mucho preámbulo utiliza el método deleteMany([]) para eliminar todos los documentos en la colección. Este método es poderoso, se lleva por delante todo lo que haya en la colección.

Después de realizar esta acción drástica pero necesario, se imprime un mensaje de éxito para confirmar que la semana ha sido reiniciada sin problemas.

Perooo, siempre hay que estar preparados por si algo male sal, por eso se envuelve todo en un bloque try-catch, por si algo sale mal durante el proceso (alguna conexión fallida, problema con la base de datos, quien sabe), la excepción es capturada y se imprime un mensaje de error que incluye la descripción del problema.

La idea es ejecutar esta función cada inicio de semana.

Config.php

<?php

require 'vendor/autoload.php';

use MongoDB\Client as MongoC;

$mongo = new MongoC('mongodb+srv://<usuario>:<contra>@<urlCluster>');

$db = $mongo->organizadorSemanal;
$collection = $db->actividades;

Este es la puerta de entrada a nuestro programa, donde establecemos la conexión con la base de datos. Ahora, si bien es posible que algunos de ustedes prefieran hacerlo de una manera más segura y flexible, yo opté por hardcodear la conexión directamente en el código. Si, lo sé, no es la mejor práctica, pero a veces soy un poco tonto y me gusta simplificar las cosas cuando estoy en un ambiente controlado.

Primero, se utiliza el require 'vendor/autoload.php' para cargar las dependencias necesarias, que en este caso incluyen la biblioteca de MongoDB. Luego, importamos la clase Client de MongoDB con un alias MongoC, porque, ¿por qué no hacer las cosas un poquito más cortas?

Después, creamos una instancia de MongoC, pasando la cadena de conexión directamente. Aquí es donde ustedes podría (y deberían) usar variables de entorno o algún archivo de configuración para manejar de manera más segura la información sensible como el usuario y contra.

Finalmente, accedemos a la base de datos organizadorSemanal y a la colección de actividades, que es donde vamos a guardar y gestionar todas nuestras actividades. Este setup es fundamental para que el programa funcione correctamente, permitiéndonos interactuar con la base de datos de una manera sencilla y directa.

Ojito, este código está un poco 'a lo bruto' en cuanto a la gestión de la conexión, cumple su propósito en un entorno donde no me preocupa demasiado la seguridad.

¿Que es?

Este organizador semanal en PHP es tu asistente personal en forma de código, diseñado para ayudarte a gestionar de manera eficiente tus actividades diarias y semanales. Si eres alguien que lucha por mantener la organización y administración de su tiempo (y estás frente a una computadora, la mayor parte de tu día), este programa es una herramienta poderosa que puedes adaptar a tus necesidades. Al estar escrito en PHP y utilizando MongoDB como base de datos, es fácilmente escalable, lo que significa que puede crecer con nosotros y nuestros proyectos.

Con este organizador (se aceptan ideas para un nombre mejor) tienes un control total sobre tu semana. Ideal para quienes buscan una solución simple pero efectiva para gestionar su tiempo y ser más productivos.

¿Que no es?

Este organizador no es una solución mágica que resolverá todos tus problemas de productividad por si solo. No es un software comercial ni una aplicación con interfaz gráfica, es un programa basado en consola que requiere ciertos conocimientos (tampoco tantos, eh) técnicos para su implementación y uso. Tampoco es una herramienta omnipotente que te dirá que hacer o cómo hacerlo; es una estructura flexible que necesita de tu input para ser útil.

Tampoco es una agenda o un calendario, está pensado para uso semanal, cada inicio de semana, PUM, borrón y cuenta nueva. No esperes que esta herramienta maneje automáticamente tus prioridades o se integre sin esfuerzo en otros sistemas de gestión de tareas.

No es una plataforma colaborativa ni una aplicación en la nube lista para su distribución masiva. Es un proyecto personalizado, diseñado para que tú, como usuario individual, tomes las riendas de tu tiempo y ajustes las funcionalidades a tus propias necesidades. Y, por su puesto, no es un sustituto para la disciplina personal que se necesita para realmente llevar a cabo las tareas que decidas colocar aquí.

Conclusión

Este organizador semanal en PHP es más que una simple herramienta de código; es una respuesta directa a la necesidad de organización y productividad que se reveló en mis sesiones con la psicóloga. A través de nuestras conversaciones, comprendí la importancia de estructurar mi tiempo de manera más efectiva, y este programa es el resultado tangible de ese aprendizaje.

Con esta aplicación, no solo logré plasmar mis habilidades en programación, sino que también di un paso significativo hacia mejorar mi gestión del tiempo y, en última instancia, mi bienestar. Es un recordatorio de que a veces las soluciones más poderosas son aquellas que creamos nosotros mismos, adaptadas a nuestras necesidades particulares.

Espero que esta pequeña herramienta te inspire a explorar nuevas formas de ser dueño de tu tiempo y a encontrar soluciones creativas a tus propios desafíos de productividad. Recuerda que la programación es una herramienta poderosa que puede ayudarte a mejorar tu vida de maneras inesperadas, solo tienes que darle la oportunidad de hacerlo.

Y con esto, me despido Cibernícolas, se que no he estado tan activo en el blog, pero intento hacerme tiempo para compartirles un poco de mis conocimientos y experiencias. Si te gustó este artículo, no dudes en compartirlo en tus redes sociales y dejarme un comentario con tus pensamientos y sugerencias. ¡Nos vemos en el próximo fuego de campamento en La Cueva del NeanderTech!

No es que tengamos poco tiempo, sino que perdemos mucho.

— Filósofo Séneca