Commit Graph
24 Commits
Author SHA1 Message Date
Lizandro GuarnizoandClaude Sonnet 5 62c644b815 feat(portal): descarga del cronograma del proyecto en Excel
El cliente ya veía el roadmap en pantalla pero no tenía cómo pasárselo a
alguien que no entra al portal.

El .xlsx se genera con archive/zip + encoding/xml de la stdlib en vez de
sumar una dependencia de Excel para una sola pantalla. Un CSV renombrado
no servía: en Excel en español el separador y los acentos se rompen, y
esto es un archivo que el cliente le entrega a un tercero.

Detalles que hacen que Excel lo acepte y se lea bien: inline strings (sin
tabla sharedStrings, así ningún índice puede apuntar a la cadena
equivocada), encabezado en negrita y congelado, anchos de columna según
el contenido, y nombre de hoja saneado (Excel rechaza el archivo si pasa
de 31 caracteres o trae : \ / ? * [ ]).

El endpoint repite el chequeo de acceso de PortalProyecto: sin eso,
cualquiera con sesión de portal se bajaba el cronograma de otro cliente
adivinando el slug.

Verificado abriendo el archivo generado con openpyxl: 6 partes, CRC OK,
XML bien formado en todas, acentos y CJK intactos, negrita y panel
congelado donde corresponde.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 22:12:45 -05:00
Lizandro Guarnizo 28affb5a55 feat: área de soporte con webhook de correo y asignación de tickets 2026-07-28 23:39:03 -05:00
Lizandro Guarnizo 39f56372c3 fix: tickets filtrados por proyecto, vistas contabilidad/websms en resources/view 2026-06-22 10:23:28 -05:00
Lizandro Guarnizo ca6a44f64e up 2026-06-18 16:48:49 -05:00
Lizandro Guarnizo 58d98f23aa Revert "telegram"
This reverts commit 46daf3d4aa.
2026-05-25 12:50:53 -05:00
Lizandro Guarnizo 46daf3d4aa telegram 2026-05-25 10:08:40 -05:00
Lizandro GuarnizoandCopilot 6e27032ac6 feat(portal): agregar flujo de recuperación de contraseña
- Nuevo modelo PortalPasswordResetToken con token seguro (32 bytes, 1h vigencia)
- AutoMigrate del nuevo modelo en main.go
- SendPortalPasswordResetEmail con diseño consistente al app
- Handlers: PortalForgotPasswordPage/Post y PortalResetPasswordPost/Page
- Rutas públicas GET/POST /portal/forgot-password y /portal/reset-password
- Vistas forgot_password.html y reset_password.html con validación JS
- Enlace ¿Olvidaste tu contraseña? en login.html + soporte mensaje success

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 15:25:53 -05:00
Lizandro Guarnizo b5e6a9285f up 2026-05-19 13:33:39 -05:00
Lizandro Guarnizo 762ebc2afc up 2026-05-19 13:09:06 -05:00
Lizandro Guarnizo d713dcd47b up 2026-05-19 12:43:19 -05:00
Lizandro Guarnizo 4b2003c752 ip 2026-05-16 21:54:17 -05:00
Lizandro Guarnizo 1511ca97d9 up 2026-05-16 21:36:59 -05:00
Lizandro Guarnizo 4fa506c7d6 up 2026-05-16 21:27:30 -05:00
Lizandro Guarnizo fcc3ff7ca7 up 2026-05-16 21:05:05 -05:00
Lizandro Guarnizo 4c14f4a641 up 2026-05-16 18:47:40 -05:00
Lizandro Guarnizo 1b22cc2fe7 k 2026-05-16 15:26:48 -05:00
Lizandro Guarnizo f5eef70e09 up 2026-05-16 15:17:49 -05:00
Lizandro Guarnizo 76a0c28b16 up 2026-05-16 13:44:32 -05:00
Lizandro Guarnizo 084f6e3930 up 2026-05-15 22:00:54 -05:00
Lizandro Guarnizo 5ec5595196 up 2026-05-15 21:01:30 -05:00
Lizandro Guarnizo f7e8d273d2 up 2026-05-15 15:47:49 -05:00
Lizandro Guarnizo 04fd456a4c mejora del portal 2026-05-15 15:39:48 -05:00
Lizandro Guarnizo b340d29583 up 2026-05-15 14:26:52 -05:00
Lizandro Guarnizo 2377371b2c up 2026-05-14 22:52:10 -05:00