CCCPaste

SISTEMA PLANTILLA FINAL CSOCIO

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()