import mysql.connector
from docx import Document
# Conexión a la base de datos MySQL
def conectar_db():
try:
conexion = mysql.connector.connect(
host="localhost",
user="root",
password="",
database="acu_v2"
)
return conexion
except mysql.connector.Error as err:
print(f"Error al conectar a la base de datos: {err}")
return None
# Consultar por DNI
def obtener_datos_por_dni(dni):
if dni == "0":
return "atras"
conexion = conectar_db()
if not conexion:
return None
cursor = conexion.cursor(dictionary=True)
query = """
SELECT
g_persona.ndoc,
g_persona.nomcompleto,
p_puesto.codigo,
p_puesto.codigo_ant,
p_giro.des_giro
FROM
g_persona
INNER JOIN
p_puesto_socio
ON p_puesto_socio.idsocio = g_persona.idpersona
INNER JOIN
p_puesto
ON p_puesto.idpuesto = p_puesto_socio.idpuesto
INNER JOIN
p_giro
ON p_puesto.idgiro = p_giro.idgiro
WHERE
g_persona.ndoc = %s
AND p_puesto.activo = 1
AND p_puesto_socio.activo = 1;
"""
cursor.execute(query, (dni,))
resultados = cursor.fetchall()
conexion.close()
return resultados
# Consultar por Código
def obtener_datos_por_codigo(codigo):
if codigo == "0":
return "atras"
conexion = conectar_db()
if not conexion:
return None
cursor = conexion.cursor(dictionary=True)
query = """
SELECT
g_persona.ndoc,
g_persona.nomcompleto,
p_puesto.codigo,
p_puesto.codigo_ant,
p_giro.des_giro
FROM
p_puesto
INNER JOIN
p_puesto_socio
ON p_puesto.idpuesto = p_puesto_socio.idpuesto
INNER JOIN
g_persona
ON p_puesto_socio.idsocio = g_persona.idpersona
INNER JOIN
p_giro
ON p_puesto.idgiro = p_giro.idgiro
WHERE
p_puesto.codigo = %s
AND p_puesto.activo = 1
AND p_puesto_socio.activo = 1
LIMIT 1;
"""
cursor.execute(query, (codigo,))
resultado = cursor.fetchone()
conexion.close()
return resultado
# Rellenar y guardar plantilla Word
def rellenar_plantilla(datos, plantilla="plantilla.docx"):
if not datos:
print("No se encontraron datos para la búsqueda realizada.")
return
# Asegurar que todos los campos existen en los datos
datos = {
"nombre": datos.get("nomcompleto", ""),
"dni": datos.get("ndoc", ""),
"codigo": datos.get("codigo", ""),
"codigo_ant": datos.get("codigo_ant", ""),
"giro": datos.get("des_giro", "")
}
# Generar nombre de archivo basado en el código
nombre_archivo = f"solicitud_{datos['codigo']}.docx"
# Cargar la plantilla
documento = Document(plantilla)
# Reemplazar los marcadores de posición
for parrafo in documento.paragraphs:
if "{NOMBRE}" in parrafo.text:
parrafo.text = parrafo.text.replace("{NOMBRE}", datos["nombre"])
if "{DNI}" in parrafo.text:
parrafo.text = parrafo.text.replace("{DNI}", datos["dni"])
if "{CODIGO}" in parrafo.text:
parrafo.text = parrafo.text.replace("{CODIGO}", datos["codigo"])
if "{CODIGO_ant}" in parrafo.text:
parrafo.text = parrafo.text.replace("{CODIGO_ant}", datos["codigo_ant"])
if "{GIRO}" in parrafo.text:
parrafo.text = parrafo.text.replace("{GIRO}", datos["giro"])
# Guardar el documento con los datos reemplazados
documento.save(nombre_archivo)
print(f"Documento generado exitosamente: {nombre_archivo}")
# Menú principal
def menu():
while True:
print("\n=== Menú de Búsqueda ===")
print("1. Buscar por DNI")
print("2. Buscar por Código")
print("3. Salir")
opcion = input("Seleccione una opción: ")
if opcion == "1":
while True:
print("Si quiere retroceder, llene con un 0 en la entrada.")
dni = input("Ingrese el DNI: ")
resultados = obtener_datos_por_dni(dni)
if resultados == "atras":
print("Volviendo al menú principal...")
break
elif resultados:
if len(resultados) == 1:
rellenar_plantilla(resultados[0])
break
else:
print("Se encontraron múltiples resultados:")
for i, resultado in enumerate(resultados, start=1):
print(f"{i}. {resultado['nomcompleto']} - {resultado['codigo']}")
eleccion = input("Seleccione una opción: ")
if eleccion.isdigit() and 1 <= int(eleccion) <= len(resultados):
rellenar_plantilla(resultados[int(eleccion) - 1])
break
else:
print("Opción no válida. Intente nuevamente.")
else:
print(f"El número de DNI '{dni}' no es correcto. Escriba nuevamente el DNI.")
elif opcion == "2":
while True:
print("Si quiere retroceder, llene con un 0 en la entrada.")
codigo = input("Ingrese el Código: ")
datos = obtener_datos_por_codigo(codigo)
if datos == "atras":
print("Volviendo al menú principal...")
break
elif datos:
rellenar_plantilla(datos)
break
else:
print(f"El código de puesto '{codigo}' es incorrecto. Ingrese nuevamente el código.")
elif opcion == "3":
print("Saliendo del programa.")
break
else:
print("Opción no válida. Por favor, intente de nuevo.")
# Ejecutar el programa
if __name__ == "__main__":
menu()