import streamlit as st
import re
import smtplib
import json
import openpyxl
import os
from [Link] import MIMEText
from [Link] import MIMEMultipart
from [Link] import MIMEBase
from email import encoders
from datetime import datetime
SMTP_SERVER = "[Link]"
SMTP_PORT = 587
EMAIL_ADDRESS = "kewinrami2005@[Link]"
EMAIL_PASSWORD = "rcic evbs nuzy euer"
USERS_FILE = "[Link]"
EXCEL_FILE = "formato_bitacora.xlsx"
def cargar_usuarios():
try:
with open(USERS_FILE, "r") as file:
return [Link](file)
except FileNotFoundError:
return {}
def guardar_usuarios(usuarios):
with open(USERS_FILE, "w") as file:
[Link](usuarios, file)
def enviar_correo(destinatario, asunto, mensaje, archivo_adjunto=None):
try:
msg = MIMEMultipart()
msg['From'] = EMAIL_ADDRESS
msg['To'] = destinatario
msg['Subject'] = asunto
[Link](MIMEText(mensaje, 'plain'))
if archivo_adjunto:
with open(archivo_adjunto, "rb") as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload([Link]())
encoders.encode_base64(part)
part.add_header(
'Content-Disposition',
f'attachment; filename={[Link](archivo_adjunto)}',
)
[Link](part)
with [Link](SMTP_SERVER, SMTP_PORT) as server:
[Link]()
[Link](EMAIL_ADDRESS, EMAIL_PASSWORD)
server.send_message(msg)
return True
except Exception as e:
[Link](f"Error al enviar el correo: {e}")
return False
def validar_password(password):
if len(password) < 12:
return "La contraseña debe tener al menos 12 caracteres."
if not [Link](r"[A-Z]", password):
return "La contraseña debe incluir al menos una letra mayúscula."
if not [Link](r"[a-z]", password):
return "La contraseña debe incluir al menos una letra minúscula."
if not [Link](r"\d", password):
return "La contraseña debe incluir al menos un número."
if not [Link](r"[!@#$%^&*(),.?\":{}|<>]", password):
return "La contraseña debe incluir al menos un símbolo."
return None
def actualizar_excel(datos, numero_bitacora, descripcion_actividad):
if not [Link](EXCEL_FILE):
[Link](f"El archivo {EXCEL_FILE} no existe. Verifica la ruta.")
return
workbook = openpyxl.load_workbook(EXCEL_FILE)
sheet = [Link]
try:
sheet.merge_cells("B5:Y5")
sheet["B5"] = "Regional Distrito Capital"
sheet.merge_cells("B6:Y6")
sheet["B6"] = "Centro de electricidad, electronica y telecomunicaciones"
sheet.merge_cells("T10:Y10")
sheet["T10"] = "2024"
sheet.merge_cells("B10:J10")
sheet["B10"] = datos["Nombre de la Empresa"]
sheet.merge_cells("M10:O10")
sheet["M10"] = datos["NIT de la Empresa"]
sheet.merge_cells("B13:J13")
sheet["B13"] = datos["Nombre del Instructor"]
sheet.merge_cells("K13:P13")
sheet["K13"] = datos["Teléfono del Instructor"]
sheet.merge_cells("Q13:Y13")
sheet["Q13"] = datos["Correo del Instructor"]
sheet.merge_cells("B20:I20")
sheet["B20"] = datos["Nombre del Aprendiz"]
sheet.merge_cells("J20:N20")
sheet["J20"] = datos["Documento del Aprendiz"]
sheet.merge_cells("O20:S20")
sheet["O20"] = datos["Teléfono del Aprendiz"]
sheet.merge_cells("T20:Y20")
sheet["T20"] = datos["Correo del Aprendiz"]
sheet.merge_cells("B23:J23")
sheet["B23"] = datos["Número de Ficha"]
sheet.merge_cells("K23:Y23")
sheet["K23"] = datos["Programa de Formación"]
sheet.merge_cells("P10:S10")
sheet["P10"] = f"Número de Bitácora: {numero_bitacora}"
sheet.merge_cells("B26:J26")
sheet["B26"] = descripcion_actividad
fecha_actual = [Link]().strftime("%Y-%m-%d")
sheet.merge_cells("K26:L26")
sheet["K26"] = fecha_actual
sheet.merge_cells("B45:I45")
sheet["B45"] = datos["Nombre del Aprendiz"]
sheet.merge_cells("B49:I49")
sheet["B49"] = datos["Nombre del Instructor"]
[Link](EXCEL_FILE)
[Link]("Información guardada en el archivo Excel.")
except Exception as e:
[Link](f"Ocurrió un error al actualizar el Excel: {e}")
def main():
st.set_page_config(page_title="Registro de Información", page_icon="📝",
layout="centered")
usuarios = cargar_usuarios()
if "logged_in" not in st.session_state:
st.session_state.logged_in = False
st.session_state.email = ""
if not st.session_state.logged_in:
menu = [Link]("Seleccione una opción", ["Inicio de Sesión",
"Registro"])
if menu == "Inicio de Sesión":
[Link]("Inicio de Sesión")
email = st.text_input("Correo electrónico", placeholder="Ingrese su
correo electrónico")
password = st.text_input("Contraseña", type="password",
placeholder="Ingrese su contraseña")
if [Link]("Iniciar Sesión"):
if email in usuarios and usuarios[email]['password'] == password:
st.session_state.logged_in = True
st.session_state.email = email
[Link]("Inicio de sesión exitoso!")
else:
[Link]("Correo o contraseña incorrectos")
elif menu == "Registro":
[Link]("Registro de Usuario")
new_username = st.text_input("Nombre completo", placeholder="Ingrese su
nombre completo")
new_password = st.text_input("Contraseña", type="password",
placeholder="Cree una contraseña")
email = st.text_input("Correo electrónico", placeholder="Ingrese su
correo electrónico")
if [Link]("Registrar"):
if not new_username or not new_password or not email:
[Link]("Por favor complete todos los campos para
registrarse.")
else:
error = validar_password(new_password)
if error:
[Link](error)
elif email in usuarios:
[Link]("Este correo ya está registrado.")
else:
usuarios[email] = {
"username": new_username,
"password": new_password
}
guardar_usuarios(usuarios)
if enviar_correo(email, "Registro Exitoso", f"Hola
{new_username}, su registro fue exitoso."):
[Link]("Usuario registrado exitosamente. Se ha
enviado un correo de confirmación.")
else:
[Link]("No se pudo enviar el correo de
confirmación.")
else:
[Link]("Menú")
menu = [Link]("Opciones", ["Inicio", "Bitácoras"])
if menu == "Inicio":
[Link]("Bienvenido al Sistema del SENA")
[Link]("[Link]
width=200)
[Link](
"""
### Sistema de Gestión
Bienvenido al sistema del SENA. Aquí podrás gestionar información
importante.
**Opciones disponibles:**
- Registro de bitácoras
- Gestión de información
¡Estamos comprometidos con tu desarrollo profesional!
"""
)
elif menu == "Bitácoras":
[Link]("Registro de Información 📝")
[Link]("Por favor, ingresa los datos solicitados a continuación.")
[Link]("Número de Bitácora")
numero_bitacora = st.text_input("Número de Bitácora",
placeholder="Ingrese el número de bitácora")
[Link]("Información de la Empresa")
with [Link](key='empresa_form'):
nombre_empresa = st.text_input("Nombre de la Empresa",
placeholder="Ingrese el nombre de la empresa")
nit_empresa = st.text_input("NIT de la Empresa",
placeholder="Ingrese el NIT de la empresa")
[Link]()
[Link]("Información del Instructor de Seguimiento")
nombre_instructor = st.text_input("Nombre del Instructor",
placeholder="Ingrese el nombre del instructor")
telefono_instructor = st.text_input("Teléfono del Instructor",
placeholder="Ingrese el teléfono del instructor")
correo_instructor = st.text_input("Correo Electrónico del
Instructor", placeholder="Ingrese el correo electrónico")
[Link]()
[Link]("Información del Aprendiz")
nombre_aprendiz = st.text_input("Nombre del Aprendiz",
placeholder="Ingrese el nombre del aprendiz")
documento_aprendiz = st.text_input("Número de Documento del
Aprendiz", placeholder="Ingrese el documento")
telefono_aprendiz = st.text_input("Teléfono de Contacto del
Aprendiz", placeholder="Ingrese el teléfono del aprendiz")
correo_aprendiz = st.text_input("Correo Electrónico Institucional
del Aprendiz", placeholder="Ingrese el correo institucional")
numero_ficha = st.text_input("Número de Ficha",
placeholder="Ingrese el número de ficha")
programa_formacion = st.text_input("Programa de Formación",
placeholder="Ingrese el programa de formación")
[Link]()
[Link]("Descripción de la Actividad")
descripcion_actividad = st.text_area("Descripción de la actividad
realizada", placeholder="Escriba aquí una descripción detallada de la actividad")
submit_button = st.form_submit_button(label="Registrar
Información")
if submit_button:
if (not nombre_empresa or not nit_empresa or not nombre_instructor
or not telefono_instructor or
not correo_instructor or not nombre_aprendiz or not
documento_aprendiz or not telefono_aprendiz or not correo_aprendiz or
not numero_ficha or not programa_formacion or not
descripcion_actividad or not numero_bitacora):
[Link]("Por favor, completa todos los campos antes de
enviar.")
else:
datos = {
"Nombre de la Empresa": nombre_empresa,
"NIT de la Empresa": nit_empresa,
"Nombre del Instructor": nombre_instructor,
"Teléfono del Instructor": telefono_instructor,
"Correo del Instructor": correo_instructor,
"Nombre del Aprendiz": nombre_aprendiz,
"Documento del Aprendiz": documento_aprendiz,
"Teléfono del Aprendiz": telefono_aprendiz,
"Correo del Aprendiz": correo_aprendiz,
"Número de Ficha": numero_ficha,
"Programa de Formación": programa_formacion
}
actualizar_excel(datos, numero_bitacora, descripcion_actividad)
archivo_generado = f"bitacora_{nombre_aprendiz}.xlsx"
with open(EXCEL_FILE, "rb") as f:
st.download_button(
label="Descargar Excel",
data=f,
file_name=archivo_generado,
mime="application/[Link]-
[Link]"
)
if enviar_correo(correo_instructor,
"Bitácora Registrada",
"Se ha registrado una nueva bitácora. Por
favor, revise el archivo adjunto.",
EXCEL_FILE):
[Link](f"El archivo Excel se ha enviado al correo del
instructor: {correo_instructor}.")
else:
[Link]("No se pudo enviar el correo al instructor.
Verifique los datos.")
if __name__ == "__main__":
main()