Subject: ⚠️ Recordatorio Automático: Inicia tu TurnoBody: Buenos días. Son las 8:00 AM y el sistema aún no detecta tu registro de hoy. Por favor inicia tu monitoreo.
@app.route('/send-reminders')@login_requireddef send_reminders(): # Reutilizamos la función de envío para el botón manual enviar_recordatorio_automatizado() return "Proceso de recordatorios ejecutado"
@app.route('/reporte-pdf')@login_requireddef reporte_pdf(): registros = leer_json(REGISTROS_FILE) buffer = BytesIO() p = canvas.Canvas(buffer, pagesize=letter) p.setTitle("Reporte de Asistencia Maestros") p.drawString(100, 750, f"REPORTE DE ASISTENCIA - GENERADO: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") p.line(100, 745, 520, 745) y = 710 p.drawString(100, y, "Maestro") p.drawString(200, y, "Fecha") p.drawString(300, y, "Hora") p.drawString(400, y, "Estado") y -= 25 stats = {} for r in registros: hora = r.get('hora', '00:00:00') estado = "RETARDO" if hora > "08:30:00" else "PUNTUAL" p.drawString(100, y, str(r.get('usuario', 'S/N'))) p.drawString(200, y, str(r.get('fecha', 'S/F'))) p.drawString(300, y, str(hora)) p.drawString(400, y, estado) if estado == "RETARDO": usr = r.get('usuario', 'S/N') stats[usr] = stats.get(usr, 0) + 1 y -= 15 if y < 80: p.showPage() y = 750 y -= 40 p.drawString(100, y, "RESUMEN TOTAL DE RETARDOS ACUMULADOS:") p.line(100, y-5, 380, y-5) y -= 25 for user, count in stats.items(): p.drawString(120, y, f"• {user}: {count} retardos.") y -= 15 p.save() buffer.seek(0) return send_file(buffer, as_attachment=True, download_name="reporte_asistencia.pdf", mimetype='application/pdf')