Advertisement
kuroshan1104

SISTEMA PLANTILLA FINAL CSOCIO

Jan 27th, 2025
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.54 KB | Source Code | 0 0
  1. import mysql.connector
  2. from docx import Document
  3.  
  4. # Conexión a la base de datos MySQL
  5. def conectar_db():
  6.     try:
  7.         conexion = mysql.connector.connect(
  8.             host="localhost",
  9.             user="root",
  10.             password="",
  11.             database="acu_v2"
  12.         )
  13.         return conexion
  14.     except mysql.connector.Error as err:
  15.         print(f"Error al conectar a la base de datos: {err}")
  16.         return None
  17.  
  18. # Consultar por DNI
  19. def obtener_datos_por_dni(dni):
  20.     if dni == "0":
  21.         return "atras"
  22.  
  23.     conexion = conectar_db()
  24.     if not conexion:
  25.         return None
  26.  
  27.     cursor = conexion.cursor(dictionary=True)
  28.     query = """
  29.        SELECT  
  30.            g_persona.ndoc,              
  31.            g_persona.nomcompleto,      
  32.            p_puesto.codigo,            
  33.            p_puesto.codigo_ant,        
  34.            p_giro.des_giro              
  35.        FROM
  36.            g_persona
  37.        INNER JOIN
  38.            p_puesto_socio              
  39.            ON p_puesto_socio.idsocio = g_persona.idpersona
  40.        INNER JOIN
  41.            p_puesto                    
  42.            ON p_puesto.idpuesto = p_puesto_socio.idpuesto
  43.        INNER JOIN
  44.            p_giro                      
  45.            ON p_puesto.idgiro = p_giro.idgiro
  46.        WHERE
  47.            g_persona.ndoc = %s  
  48.            AND p_puesto.activo = 1      
  49.            AND p_puesto_socio.activo = 1;
  50.    """
  51.     cursor.execute(query, (dni,))
  52.     resultados = cursor.fetchall()
  53.     conexion.close()
  54.     return resultados
  55.  
  56. # Consultar por Código
  57. def obtener_datos_por_codigo(codigo):
  58.     if codigo == "0":
  59.         return "atras"
  60.  
  61.     conexion = conectar_db()
  62.     if not conexion:
  63.         return None
  64.  
  65.     cursor = conexion.cursor(dictionary=True)
  66.     query = """
  67.        SELECT
  68.            g_persona.ndoc,              
  69.            g_persona.nomcompleto,      
  70.            p_puesto.codigo,            
  71.            p_puesto.codigo_ant,        
  72.            p_giro.des_giro              
  73.        FROM
  74.            p_puesto
  75.        INNER JOIN
  76.            p_puesto_socio              
  77.            ON p_puesto.idpuesto = p_puesto_socio.idpuesto
  78.        INNER JOIN
  79.            g_persona                    
  80.            ON p_puesto_socio.idsocio = g_persona.idpersona
  81.        INNER JOIN
  82.            p_giro                      
  83.            ON p_puesto.idgiro = p_giro.idgiro
  84.        WHERE
  85.            p_puesto.codigo = %s
  86.            AND p_puesto.activo = 1
  87.            AND p_puesto_socio.activo = 1
  88.        LIMIT 1;
  89.    """
  90.     cursor.execute(query, (codigo,))
  91.     resultado = cursor.fetchone()
  92.     conexion.close()
  93.     return resultado
  94.  
  95. # Rellenar y guardar plantilla Word
  96. def rellenar_plantilla(datos, plantilla="plantilla.docx"):
  97.     if not datos:
  98.         print("No se encontraron datos para la búsqueda realizada.")
  99.         return
  100.  
  101.     # Asegurar que todos los campos existen en los datos
  102.     datos = {
  103.         "nombre": datos.get("nomcompleto", ""),
  104.         "dni": datos.get("ndoc", ""),
  105.         "codigo": datos.get("codigo", ""),
  106.         "codigo_ant": datos.get("codigo_ant", ""),
  107.         "giro": datos.get("des_giro", "")
  108.     }
  109.  
  110.     # Generar nombre de archivo basado en el código
  111.     nombre_archivo = f"solicitud_{datos['codigo']}.docx"
  112.  
  113.     # Cargar la plantilla
  114.     documento = Document(plantilla)
  115.  
  116.     # Reemplazar los marcadores de posición
  117.     for parrafo in documento.paragraphs:
  118.         if "{NOMBRE}" in parrafo.text:
  119.             parrafo.text = parrafo.text.replace("{NOMBRE}", datos["nombre"])
  120.         if "{DNI}" in parrafo.text:
  121.             parrafo.text = parrafo.text.replace("{DNI}", datos["dni"])
  122.         if "{CODIGO}" in parrafo.text:
  123.             parrafo.text = parrafo.text.replace("{CODIGO}", datos["codigo"])
  124.         if "{CODIGO_ant}" in parrafo.text:
  125.             parrafo.text = parrafo.text.replace("{CODIGO_ant}", datos["codigo_ant"])
  126.         if "{GIRO}" in parrafo.text:
  127.             parrafo.text = parrafo.text.replace("{GIRO}", datos["giro"])
  128.  
  129.     # Guardar el documento con los datos reemplazados
  130.     documento.save(nombre_archivo)
  131.     print(f"Documento generado exitosamente: {nombre_archivo}")
  132.  
  133. # Menú principal
  134. def menu():
  135.     while True:
  136.         print("\n=== Menú de Búsqueda ===")
  137.         print("1. Buscar por DNI")
  138.         print("2. Buscar por Código")
  139.         print("3. Salir")
  140.    
  141.  
  142.         opcion = input("Seleccione una opción: ")
  143.  
  144.         if opcion == "1":
  145.             while True:
  146.                 print("Si quiere retroceder, llene con un 0 en la entrada.")
  147.                 dni = input("Ingrese el DNI: ")
  148.                 resultados = obtener_datos_por_dni(dni)
  149.                 if resultados == "atras":
  150.                     print("Volviendo al menú principal...")
  151.                     break
  152.                 elif resultados:
  153.                     if len(resultados) == 1:
  154.                         rellenar_plantilla(resultados[0])
  155.                         break
  156.                     else:
  157.                         print("Se encontraron múltiples resultados:")
  158.                         for i, resultado in enumerate(resultados, start=1):
  159.                             print(f"{i}. {resultado['nomcompleto']} - {resultado['codigo']}")
  160.                         eleccion = input("Seleccione una opción: ")
  161.                         if eleccion.isdigit() and 1 <= int(eleccion) <= len(resultados):
  162.                             rellenar_plantilla(resultados[int(eleccion) - 1])
  163.                             break
  164.                         else:
  165.                             print("Opción no válida. Intente nuevamente.")
  166.                 else:
  167.                     print(f"El número de DNI '{dni}' no es correcto. Escriba nuevamente el DNI.")
  168.  
  169.         elif opcion == "2":
  170.             while True:
  171.                 print("Si quiere retroceder, llene con un 0 en la entrada.")
  172.                 codigo = input("Ingrese el Código: ")
  173.                 datos = obtener_datos_por_codigo(codigo)
  174.                 if datos == "atras":
  175.                     print("Volviendo al menú principal...")
  176.                     break
  177.                 elif datos:
  178.                     rellenar_plantilla(datos)
  179.                     break
  180.                 else:
  181.                     print(f"El código de puesto '{codigo}' es incorrecto. Ingrese nuevamente el código.")
  182.  
  183.         elif opcion == "3":
  184.             print("Saliendo del programa.")
  185.             break
  186.         else:
  187.             print("Opción no válida. Por favor, intente de nuevo.")
  188.  
  189. # Ejecutar el programa
  190. if __name__ == "__main__":
  191.     menu()
  192.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement