Advertisement
Bitupx

huabo

Oct 6th, 2023
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.61 KB | None | 0 0
  1. import sys
  2. import docx
  3. import os
  4. import tempfile
  5. import shutil
  6. from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QPushButton, QLabel,
  7. QWidget, QSplitter, QCheckBox, QFormLayout, QLineEdit, QDateEdit,
  8. QComboBox, QSpinBox, QDoubleSpinBox, QTextEdit, QHBoxLayout,
  9. QGroupBox, QTimeEdit, QFileDialog, QMessageBox)
  10. from PyQt5.QtWidgets import QSizePolicy
  11. from PyQt5.QtCore import Qt, QDate, QTime
  12. from PyQt5.QtGui import QImage, QPixmap
  13. from docx2pdf import convert
  14. import fitz
  15. from docx import Document
  16.  
  17. TEMP_PDF_PATH = ""
  18. #DOCX_PATH = r"C:\Users\M700\ASESORIAS HUABOCONTA Dropbox\HUABOCONTA\contabilidad\RACHELE\01. RACHELE\01. MODELOS FINIQUITOS, CONTRATOS, AVISO DE VACACIONES, CERT DE VIGENCIA, CARTAS, DECLARACIONES, FORMULARIOS\CONTRATO DE TRABAJO1.docx"
  19. DOCX_PATH = r"C:\Users\Bitupx\Documents\PROYECTO HUABO\CONTRATO DE TRABAJO.docx"
  20.  
  21. class MainWindow(QMainWindow):
  22. def __init__(self):
  23. super().__init__()
  24. self.initUI()
  25. self.load_initial_docx_content()
  26.  
  27. def initUI(self):
  28. self.setWindowTitle("Generador de Contratos")
  29. self.setGeometry(100, 100, 800, 600)
  30.  
  31. # Crear un splitter para el formulario y el visualizador
  32. splitter = QSplitter(Qt.Horizontal)
  33.  
  34. # Lado izquierdo: formulario de entrada
  35. self.entry_widget = QWidget(self)
  36. self.entry_layout = QVBoxLayout(self.entry_widget)
  37.  
  38. # Campos generales
  39. general_group = QGroupBox("Información General")
  40. general_layout = QFormLayout()
  41. general_group.setLayout(general_layout)
  42.  
  43. self.contract_type = QComboBox()
  44. self.contract_type.addItems(["Tiempo completo", "Part-Time"])
  45. self.contract_type.currentTextChanged.connect(self.on_contract_type_changed)
  46.  
  47. self.contract_duration = QSpinBox()
  48. self.contract_duration.setRange(1, 12) # Duración en meses
  49.  
  50. # Esto es donde agregamos el QLabel que mostrará la duración del contrato
  51. self.contract_duration_label = QLabel("Duración: 0 meses, 0 días")
  52. general_layout.addRow(QLabel("Tipo de Contrato"), self.contract_type)
  53. general_layout.addRow(self.contract_duration_label)
  54.  
  55. self.entry_layout.addWidget(general_group)
  56.  
  57. # Grupo de campos de entrada
  58. entry_group = QGroupBox("Detalles del Contrato")
  59. entry_layout = QFormLayout()
  60. entry_group.setLayout(entry_layout)
  61.  
  62. self.fields = {
  63. 'Fecha': QDateEdit(QDate.currentDate()),
  64. 'Ciudad': QComboBox(),
  65. 'Comuna': QComboBox(),
  66. 'Nombre de la Empresa': QLineEdit(),
  67. 'Rut de la Empresa': QLineEdit(),
  68. 'Nombre del Representante': QLineEdit(),
  69. 'Tipo de Documento Representante': QComboBox(),
  70. 'Numero Doc. del Representante': QLineEdit(),
  71. 'Domicilio de la Empresa': QLineEdit(),
  72. 'Nombre del Trabajador': QLineEdit(),
  73. 'Fecha de Nacimiento del Trabajador': QDateEdit(QDate.currentDate()),
  74. 'Estado Civil del Trabajador': QLineEdit(),
  75. 'Nacionalidad del Trabajador': QLineEdit(),
  76. 'Tipo de Documento Trabajador': QComboBox(),
  77. 'Numero Doc. del Trabajador': QLineEdit(),
  78. 'Domicilio del Trabajador': QLineEdit(),
  79. 'Comuna del Trabajador': QLineEdit(),
  80. 'Descripción del Trabajo': QLineEdit(),
  81. 'Número de Horas Semanales': QSpinBox(),
  82. 'Porcentaje de Gratificación': QDoubleSpinBox(),
  83. 'Fecha de Ingreso': QDateEdit(QDate.currentDate()),
  84. 'Fecha de Terminación': QDateEdit(QDate.currentDate().addDays(30))
  85. }
  86.  
  87. self.fields['Monto del Sueldo'] = QSpinBox()
  88. self.fields['Monto del Sueldo'].setRange(0, 10000000)
  89. self.fields['Monto del Sueldo'].setValue(460000)
  90. self.fields['Monto del Sueldo'].setDisabled(True)
  91.  
  92. # CheckBox para activar o desactivar la edición del monto del sueldo
  93. self.modify_salary_check = QCheckBox("Modificar sueldo")
  94. self.modify_salary_check.stateChanged.connect(self.toggle_salary_edit)
  95.  
  96. # Añadir al layout
  97. entry_layout.addRow(self.modify_salary_check, self.fields['Monto del Sueldo'])
  98.  
  99. # Configuración de los campos
  100. self.fields['Fecha'].setCalendarPopup(True)
  101. self.fields['Fecha de Nacimiento del Trabajador'].setCalendarPopup(True)
  102. self.fields['Fecha de Ingreso'].setCalendarPopup(True)
  103. self.fields['Fecha de Terminación'].setCalendarPopup(True)
  104.  
  105. self.fields['Porcentaje de Gratificación'].setDisabled(True)
  106. self.fields['Porcentaje de Gratificación'].setValue(25)
  107.  
  108. self.fields['Número de Horas Semanales'].setRange(0, 45)
  109. self.fields['Número de Horas Semanales'].setValue(45)
  110. self.fields['Número de Horas Semanales'].setDisabled(True)
  111.  
  112. # Poblamos el QComboBox de Ciudad con algunas ciudades
  113. self.ciudades_comunas = {
  114. "Santiago": ["Santiago", "Cerrillos", "Cerro Navia", "Conchalí", "El Bosque", "Estación Central", "Huechuraba", "Independencia", "La Cisterna", "La Florida", "La Granja", "La Pintana", "La Reina", "Las Condes", "Lo Barnechea", "Lo Espejo", "Lo Prado", "Macul", "Maipú", "Ñuñoa", "Pedro Aguirre Cerda", "Peñalolén", "Providencia", "Pudahuel", "Quilicura", "Quinta Normal", "Recoleta", "Renca", "San Joaquín", "San Miguel", "San Ramón", "Vitacura"],
  115.  
  116. }
  117. self.fields['Ciudad'].addItems(self.ciudades_comunas.keys())
  118. self.fields['Ciudad'].currentTextChanged.connect(self.update_comunas)
  119. self.fields['Fecha de Ingreso'].dateChanged.connect(self.update_contract_duration)
  120. self.fields['Fecha de Terminación'].dateChanged.connect(self.update_contract_duration)
  121.  
  122. # Inicializamos el diccionario de checkboxes
  123. self.checkboxes = {}
  124. for label, widget in self.fields.items():
  125. checkbox = QCheckBox()
  126. checkbox.keyPressEvent = lambda event, checkbox=checkbox: self.checkbox_keyPressEvent(event, checkbox)
  127. checkbox.stateChanged.connect(self.on_checkbox_changed)
  128. checkbox.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
  129. self.checkboxes[label] = checkbox
  130.  
  131. widget.setMaximumWidth(150)
  132. widget.setEnabled(False)
  133.  
  134. field_layout = QHBoxLayout()
  135. field_layout.addWidget(checkbox)
  136. field_layout.addWidget(QLabel(f"{label}:"))
  137. field_layout.addWidget(widget)
  138.  
  139. self.entry_layout.addLayout(field_layout)
  140.  
  141. # Configurar widgets adicionales
  142. for field in ['Fecha', 'Fecha de Nacimiento del Trabajador', 'Fecha de Ingreso', 'Fecha de Terminación']:
  143. self.fields[field].setDisplayFormat('dd/MM/yyyy')
  144.  
  145. self.fields['Tipo de Documento Representante'].addItems(['Cédula de Identidad', 'Pasaporte', 'Rut para extranjeros', 'Rut Provisorio'])
  146. self.fields['Tipo de Documento Trabajador'].addItems(['Cédula de Identidad', 'Pasaporte', 'Rut para extranjeros', 'Rut Provisorio'])
  147.  
  148. # Días de trabajo
  149. schedule_group = QGroupBox("Horarios de Trabajo")
  150. schedule_layout = QVBoxLayout()
  151. schedule_group.setLayout(schedule_layout)
  152.  
  153. # Añadir QCheckBox para días de trabajo
  154. self.weekdays_checkbox = QCheckBox('Lunes a Viernes')
  155. self.saturday_checkbox = QCheckBox('Sábado')
  156.  
  157. # TimeEdits para los horarios
  158. self.weekdays_start_time = QTimeEdit()
  159. self.weekdays_start_time.setDisplayFormat("HH:mm")
  160. self.weekdays_end_time = QTimeEdit()
  161. self.weekdays_end_time.setDisplayFormat("HH:mm")
  162. self.saturday_start_time = QTimeEdit()
  163. self.saturday_start_time.setDisplayFormat("HH:mm")
  164. self.saturday_end_time = QTimeEdit()
  165. self.saturday_end_time.setDisplayFormat("HH:mm")
  166.  
  167. # SpinBox para horas de colación
  168. self.colacion_hours = QSpinBox()
  169. self.colacion_hours.setRange(0, 2)
  170.  
  171. # Organizar los widgets para los días de semana en un layout horizontal
  172. weekday_layout = QHBoxLayout()
  173. weekday_layout.addWidget(self.weekdays_start_time)
  174. weekday_layout.addWidget(QLabel("a"))
  175. weekday_layout.addWidget(self.weekdays_end_time)
  176. weekday_layout.addWidget(QLabel("Horas de Colación"))
  177. weekday_layout.addWidget(self.colacion_hours)
  178.  
  179. # Organizar los widgets para el Sábado en un layout horizontal
  180. saturday_layout = QHBoxLayout()
  181. saturday_layout.addWidget(self.saturday_start_time)
  182. saturday_layout.addWidget(QLabel("a"))
  183. saturday_layout.addWidget(self.saturday_end_time)
  184. self.saturday_colacion_checkbox = QCheckBox("¿Aplicar colación el sábado?")
  185. saturday_layout.addWidget(self.saturday_colacion_checkbox)
  186.  
  187. # Añadir los layouts horizontales al layout principal (QFormLayout)
  188. entry_layout.addRow(QLabel('Días de Trabajo'), self.weekdays_checkbox)
  189. entry_layout.addRow(QLabel('Horario Lunes a Viernes'), weekday_layout)
  190. entry_layout.addRow(self.saturday_checkbox)
  191. entry_layout.addRow(QLabel('Horario Sábado'), saturday_layout)
  192.  
  193. self.entry_layout.addWidget(entry_group)
  194.  
  195. # Botones
  196. btn_layout = QHBoxLayout()
  197. self.add_button = QPushButton('Agregar Campos')
  198. self.add_button.clicked.connect(self.update_and_show_contract)
  199. btn_layout.addWidget(self.add_button)
  200.  
  201. self.clear_button = QPushButton('Limpiar')
  202. self.clear_button.clicked.connect(self.clear_fields)
  203. btn_layout.addWidget(self.clear_button)
  204.  
  205. self.entry_layout.addLayout(btn_layout)
  206.  
  207. splitter.addWidget(self.entry_widget)
  208.  
  209. # Lado derecho: visualizador de contrato (PDF)
  210. self.contract_viewer = QLabel(self)
  211. self.contract_viewer.setMinimumSize(300, 400)
  212. self.current_pdf_page = 0 # Initial page
  213. self.pdf_document = None # No PDF loaded initially
  214. splitter.addWidget(self.contract_viewer)
  215.  
  216. # Configurar el layout del QWidget principal
  217. central_widget = QWidget(self)
  218. central_layout = QVBoxLayout(central_widget) # Nuevo layout para el widget central
  219.  
  220. # Botón "Generar Documento" encima del visualizador del PDF
  221. self.generate_document_button = QPushButton('Generar Documento', self)
  222. self.generate_document_button.clicked.connect(self.generate_document)
  223. central_layout.addWidget(self.generate_document_button, alignment=Qt.AlignCenter) # Add the button to the central layout
  224.  
  225. central_layout.addWidget(splitter) # Agregar el splitter al layout central
  226.  
  227. # Adding PDF navigation buttons below the contract viewer
  228. self.pdf_navigation_layout = QHBoxLayout()
  229. self.previous_button = QPushButton("Anterior")
  230. self.previous_button.clicked.connect(self.previous_pdf_page)
  231. self.pdf_navigation_layout.addWidget(self.previous_button)
  232.  
  233. self.next_button = QPushButton("Siguiente")
  234. self.next_button.clicked.connect(self.next_pdf_page)
  235. self.pdf_navigation_layout.addWidget(self.next_button)
  236.  
  237. central_layout.addLayout(self.pdf_navigation_layout)
  238.  
  239. self.setCentralWidget(central_widget) # Establecer el widget central
  240.  
  241. def update_docx_with_form_data(self, docx_path):
  242. """
  243. Update the docx file content with the data from the form fields.
  244. """
  245. # Load the docx file
  246. doc = docx.Document(docx_path)
  247.  
  248. # Recopilar los valores de los campos de la GUI
  249. values = {f"[{label}]": widget.text() for label, widget in self.fields.items()}
  250.  
  251. # Replace the placeholders with the form data
  252. for paragraph in doc.paragraphs:
  253. for placeholder, value in values.items():
  254. if placeholder in paragraph.text:
  255. for run in paragraph.runs:
  256. run.text = run.text.replace(placeholder, value)
  257.  
  258. # Save the updated docx
  259. doc.save(docx_path)
  260.  
  261. def toggle_salary_edit(self, state):
  262. """
  263. Activa o desactiva la edición del 'Monto del Sueldo' según el estado del checkbox.
  264. """
  265. if state == Qt.Checked:
  266. self.fields['Monto del Sueldo'].setDisabled(False)
  267. else:
  268. self.fields['Monto del Sueldo'].setDisabled(True)
  269. self.fields['Monto del Sueldo'].setValue(460000) # Restablecer al valor por defecto
  270.  
  271. def update_contract_duration(self):
  272. start_date = self.fields['Fecha de Ingreso'].date()
  273. end_date = self.fields['Fecha de Terminación'].date()
  274.  
  275. if start_date >= end_date:
  276. QMessageBox.warning(self, "Error en las fechas", "La fecha de ingreso no puede ser igual o posterior a la fecha de terminación.")
  277. return
  278.  
  279. duration = end_date.toJulianDay() - start_date.toJulianDay()
  280.  
  281. months = duration // 30 # Aproximación simple para el cálculo de meses
  282. days = duration % 30
  283.  
  284. self.contract_duration_label.setText(f"Duración: {months} meses, {days} días")
  285.  
  286.  
  287. def update_comunas(self, selected_city):
  288. # Limpia el QComboBox de Comuna.
  289. self.fields['Comuna'].clear()
  290.  
  291. # Poblar la lista desplegable de Comuna según la ciudad seleccionada.
  292. comunas = self.ciudades_comunas.get(selected_city, [])
  293. self.fields['Comuna'].addItems(comunas)
  294.  
  295. def checkbox_keyPressEvent(self, event, checkbox):
  296. if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
  297. checkbox.setChecked(not checkbox.isChecked())
  298. else:
  299. super(QCheckBox, checkbox).keyPressEvent(event) # Llama al comportamiento original en caso de que no sea Enter o Return.
  300.  
  301.  
  302. def on_checkbox_changed(self, state):
  303. # Encuentra qué checkbox fue cambiado
  304. for label, checkbox in self.checkboxes.items():
  305. if checkbox is self.sender():
  306. # Habilita o deshabilita el campo asociado dependiendo del estado del checkbox
  307. self.fields[label].setEnabled(state == Qt.Checked)
  308.  
  309.  
  310. def update_contract(self):
  311. # Verificar si el total de horas excede las 45, si es así, muestra un mensaje relevante y sale temprano
  312. if not self.validate_hours():
  313. return # Salir temprano si las horas no son válidas
  314.  
  315. values = {}
  316. for label, widget in self.fields.items():
  317. if isinstance(widget, QLineEdit):
  318. values[label] = widget.text()
  319. elif isinstance(widget, QComboBox):
  320. values[label] = widget.currentText()
  321. elif isinstance(widget, QDateEdit):
  322. values[label] = widget.date().toString('yyyy-MM-dd')
  323. else:
  324. values[label] = widget.value()
  325.  
  326. # Formatear días y horarios de trabajo
  327. days = []
  328. if self.weekdays_checkbox.isChecked():
  329. end_time = self.weekdays_end_time.time().hour() - self.colacion_hours.value()
  330. days.append(f"Lunes a Viernes: Desde las {self.weekdays_start_time.text()} hasta las {end_time} horas")
  331. if self.saturday_checkbox.isChecked():
  332. end_time = self.saturday_end_time.time().hour() - self.saturday_colacion_checkbox.value()
  333. days.append(f"Sábado: Desde {self.saturday_start_time.text()} hasta las {end_time} horas")
  334. values['Días y Horarios de Trabajo'] = ', '.join(days)
  335.  
  336. # Obtener y formatear fechas en letras
  337. for label in ['Fecha', 'Fecha de Nacimiento del Trabajador', 'Fecha de Terminación', 'Fecha de Ingreso']:
  338. date_widget = self.fields[label]
  339. date = date_widget.date().toString('dddd dd \'de\' MMMM \'de\' yyyy')
  340. values[label] = date.capitalize()
  341.  
  342. # Añadir el tipo de contrato y su duración, si aplica
  343. contract_info = self.contract_type.currentText()
  344. if "Contrato" in contract_info:
  345. end_date = self.fields['Fecha'].date().addMonths(self.contract_duration.value())
  346. formatted_date = end_date.toString("dddd dd 'de' MMMM 'de' yyyy").capitalize()
  347. contract_info += f", con duración hasta el {formatted_date}"
  348. values["Tipo y Duración del Contrato"] = contract_info
  349.  
  350.  
  351. def bold_and_format_text(self, paragraph, text, bold=False, underline=False, font_size=15.24, font_name="Times New Roman"):
  352. """ Función auxiliar para dar formato al texto """
  353. run = paragraph.add_run(text)
  354. run.bold = bold
  355. run.underline = underline
  356. run.font.size = Pt(font_size)
  357. run.font.name = font_name
  358.  
  359. # Devolviendo el párrafo para mantener la coherencia con tu versión original
  360. return paragraph
  361.  
  362.  
  363. def validate_hours(self):
  364. weekdays_hours = self.weekdays_end_time.time().hour() - self.weekdays_start_time.time().hour() - self.colacion_hours.value()
  365. saturday_hours = 0 # Inicializamos a 0 y sólo lo modificamos si el checkbox del sábado está marcado
  366.  
  367. if self.saturday_checkbox.isChecked():
  368. saturday_hours = self.saturday_end_time.time().hour() - self.saturday_start_time.time().hour()
  369. # Restar una hora de colación si el checkbox de colación del sábado está marcado
  370. if self.saturday_colacion_checkbox.isChecked():
  371. saturday_hours -= 1
  372.  
  373. total_hours = weekdays_hours * 5 + saturday_hours
  374. max_hours = 45 if self.contract_type.currentText() == "Tiempo completo" else 30
  375.  
  376. if total_hours > max_hours:
  377. QMessageBox.warning(self, "Error de Horas", f"Estás excediendo las {max_hours} horas. Ajusta el horario.")
  378. return False
  379.  
  380. return True
  381.  
  382.  
  383. def on_contract_type_changed(self, text):
  384. if text == "Tiempo completo":
  385. self.colacion_hours.setEnabled(True) # Activa el campo de colación
  386. self.fields['Número de Horas Semanales'].setValue(45) # Establece en 45 horas para tiempo completo
  387. else:
  388. self.colacion_hours.setEnabled(False) # Desactiva el campo de colación
  389. self.fields['Número de Horas Semanales'].setValue(30) # Establece en 30 horas para part-time
  390. self.adjust_working_hours()
  391.  
  392.  
  393. def adjust_working_hours(self):
  394. contract_type = self.contract_type.currentText()
  395. if contract_type == "Tiempo completo":
  396. # Configuración por defecto para un contrato de tiempo completo, por ejemplo:
  397. self.weekdays_start_time.setTime(QTime(8, 0))
  398. self.weekdays_end_time.setTime(QTime(17, 45))
  399. self.colacion_hours.setValue(1)
  400. else:
  401. # Configuración por defecto para un contrato part-time, por ejemplo:
  402. self.weekdays_start_time.setTime(QTime(8, 0))
  403. self.weekdays_end_time.setTime(QTime(14, 0))
  404. self.colacion_hours.setValue(0)
  405.  
  406.  
  407. def bold_names(self, text):
  408. cursor = self.contract_viewer.textCursor()
  409. format = QTextCharFormat()
  410. format.setFontWeight(QFont.Bold)
  411. names = ["Rachel", "Fiona"]
  412. for name in names:
  413. pos = 0
  414. while pos != -1:
  415. pos = text.find(name, pos)
  416. if pos != -1:
  417. cursor.setPosition(pos, QTextCursor.KeepAnchor)
  418. cursor.mergeCharFormat(format)
  419. pos += len(name)
  420.  
  421. def load_initial_docx_content(self):
  422. TEMP_PDF_PATH = os.path.join(tempfile.gettempdir(), "temp_initial_visualization.pdf")
  423. convert(DOCX_PATH, TEMP_PDF_PATH)
  424. self.load_pdf_to_viewer(TEMP_PDF_PATH)
  425.  
  426. def load_pdf_to_viewer(self, pdf_path):
  427. self.pdf_document = fitz.open(pdf_path)
  428. doc = self.pdf_document
  429. page = doc.load_page(0)
  430. image = page.get_pixmap()
  431. qt_image = QPixmap.fromImage(self.pixmap_to_qimage(image))
  432.  
  433. # Directly set the QPixmap to the existing contract_viewer
  434. self.contract_viewer.setPixmap(qt_image)
  435. self.contract_viewer.setAlignment(Qt.AlignCenter) # Ensure the content is centered
  436.  
  437.  
  438.  
  439. def show_pdf_page(self, page_number):
  440. if self.pdf_document:
  441. page = self.pdf_document.load_page(page_number)
  442. image = page.get_pixmap()
  443. qt_image = QPixmap.fromImage(self.pixmap_to_qimage(image))
  444. self.contract_viewer.setPixmap(qt_image)
  445. self.contract_viewer.setAlignment(Qt.AlignCenter)
  446. self.update_pdf_navigation_buttons()
  447.  
  448.  
  449. def previous_pdf_page(self):
  450. if self.current_pdf_page > 0:
  451. self.current_pdf_page -= 1
  452. self.show_pdf_page(self.current_pdf_page)
  453.  
  454.  
  455. def next_pdf_page(self):
  456. if self.current_pdf_page < self.pdf_document.page_count - 1:
  457. self.current_pdf_page += 1
  458. self.show_pdf_page(self.current_pdf_page)
  459.  
  460.  
  461. def update_pdf_navigation_buttons(self):
  462. self.previous_button.setEnabled(self.current_pdf_page > 0)
  463. self.next_button.setEnabled(self.current_pdf_page < self.pdf_document.page_count - 1)
  464.  
  465.  
  466. def pixmap_to_qimage(self, pixmap):
  467. return QImage(pixmap.samples, pixmap.width, pixmap.height, pixmap.stride, QImage.Format_RGB888)
  468.  
  469.  
  470.  
  471. def update_docx_content(self, docx_path, old_text, new_text):
  472. """
  473. Update the docx file content.
  474. """
  475. # Load the docx file
  476. doc = docx.Document(docx_path)
  477.  
  478. # Replace the old text with the new text
  479. for paragraph in doc.paragraphs:
  480. if old_text in paragraph.text:
  481. for run in paragraph.runs:
  482. run.text = run.text.replace(old_text, new_text)
  483.  
  484. # Save the updated docx
  485. doc.save(docx_path)
  486.  
  487.  
  488. def update_and_show_contract(self):
  489. # Actualiza el campo "Ciudad" en el documento
  490. text_to_replace = "En Santiago"
  491. new_text = self.fields['Ciudad'].currentText()
  492. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  493.  
  494. text_to_replace = "09 DE DICIEMBRE DE 2022"
  495. new_text = self.fields['Fecha'].date().toString(Qt.ISODate)
  496. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  497.  
  498. text_to_replace = "IMPORTADORA EXPORTADORA EUROPA LIMITA"
  499. new_text = self.fields['Nombre de la Empresa'].text()
  500. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  501.  
  502. text_to_replace = "76.752.038-7"
  503. new_text = self.fields['Rut de la Empresa'].text()
  504. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  505.  
  506. text_to_replace = "JIANFENG JI"
  507. new_text = self.fields['Nombre del Representante'].text()
  508. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  509.  
  510. text_to_replace = "25.040.028-4"
  511. new_text = self.fields['Número Doc. del Representante'].text()
  512. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  513.  
  514. text_to_replace = "UNION AMERICANA 408"
  515. new_text = self.fields['Domicilio de la Empresa'].text()
  516. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  517.  
  518. text_to_replace = "SANTIAGO"
  519. new_text = self.fields['Comuna'].currentText()
  520. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  521.  
  522. text_to_replace = "ILIANE DEL CARMEN BARRIOS SUAREZ"
  523. new_text = self.fields['Nombre del Trabajador'].text()
  524. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  525.  
  526. text_to_replace = "33.618.655-2"
  527. new_text = self.fields['Número Doc. del Trabajador'].text()
  528. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  529.  
  530. text_to_replace = "VENEZOLANA"
  531. new_text = self.fields['Nacionalidad del Trabajador'].text()
  532. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  533.  
  534. text_to_replace = "Soltera"
  535. new_text = self.fields['Estado Civil del Trabajador'].text()
  536. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  537.  
  538. text_to_replace = "TORO MAZOTTE 294"
  539. new_text = self.fields['Domicilio del Trabajador'].text()
  540. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  541.  
  542. text_to_replace = "ESTACION CENTRAL"
  543. new_text = self.fields['Comuna del Trabajador'].text()
  544. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  545.  
  546. text_to_replace = "VENDEDORA Y REPONEDORA"
  547. new_text = self.fields['Descripción del Trabajo'].text()
  548. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  549.  
  550. text_to_replace = "45"
  551. new_text = str(self.fields['Número de Horas Semanales'].value())
  552. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  553.  
  554. text_to_replace = "25%"
  555. new_text = str(self.fields['Porcentaje de Gratificación'].value())
  556. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  557.  
  558. text_to_replace = "01 DE DICIEMBRE DE 2022"
  559. new_text = self.fields['Fecha de Ingreso'].date().toString(Qt.ISODate)
  560. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  561.  
  562. text_to_replace = "HASTA EL 01 DE MAYO DE 2023"
  563. new_text = self.fields['Fecha de Terminación'].date().toString(Qt.ISODate)
  564. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  565.  
  566. text_to_replace = "$400.000"
  567. new_text = str(self.fields['Monto del Sueldo'].value())
  568. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  569.  
  570. text_to_replace = "Rut provisorio"
  571. new_text = self.fields['Tipo de Documento Trabajador'].currentText()
  572. self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
  573.  
  574. # Convierte el DOCX actualizado a PDF y lo muestra en el visualizador
  575. TEMP_PDF_PATH = os.path.join(tempfile.gettempdir(), "temp_visualization.pdf")
  576. convert(DOCX_PATH, TEMP_PDF_PATH)
  577. self.load_pdf_to_viewer(TEMP_PDF_PATH)
  578.  
  579. def generate_document(self):
  580. # Crear un directorio temporal
  581. temp_dir = tempfile.mkdtemp()
  582. TEMP_DOCX_PATH = os.path.join(temp_dir, "temp_visualization.docx")
  583. TEMP_PDF_PATH = os.path.join(temp_dir, "temp_visualization.pdf")
  584.  
  585. # Verificar si hay campos faltantes
  586. missing_fields = [label for label, widget in self.fields.items() if not widget.text() and widget.isEnabled()]
  587. if missing_fields:
  588. QMessageBox.warning(self, "Campos faltantes", f"Faltan los siguientes campos: {', '.join(missing_fields)}. Por favor llénalos antes de generar.")
  589. return
  590.  
  591. # Cargar el documento original desde la ruta fija
  592. doc = Document(DOCX_PATH)
  593.  
  594. # Recopilar los valores de los campos de la GUI
  595. values = {label: widget.text() for label, widget in self.fields.items()}
  596.  
  597. # Realizar las ediciones en el documento
  598. for paragraph in doc.paragraphs:
  599. for label, value in values.items():
  600. placeholder = f"[{label}]"
  601. if placeholder in paragraph.text:
  602. paragraph.text = paragraph.text.replace(placeholder, value)
  603.  
  604. # Guardar el documento modificado en el directorio temporal
  605. doc.save(TEMP_DOCX_PATH)
  606.  
  607. # Convertir el DOCX modificado a PDF
  608. convert(TEMP_DOCX_PATH, TEMP_PDF_PATH)
  609.  
  610. # Cargar el PDF en el visualizador
  611. self.load_pdf_to_viewer(TEMP_PDF_PATH)
  612.  
  613. # Eliminar el directorio temporal al final
  614. shutil.rmtree(temp_dir)
  615.  
  616.  
  617.  
  618. def clear_fields(self):
  619. # Limpia los campos del formulario
  620. for widget in self.fields.values():
  621. if isinstance(widget, QLineEdit):
  622. widget.clear()
  623. elif isinstance(widget, QComboBox):
  624. widget.setCurrentIndex(0)
  625. elif isinstance(widget, QSpinBox) or isinstance(widget, QDoubleSpinBox):
  626. widget.setValue(widget.minimum())
  627. elif isinstance(widget, QDateEdit):
  628. widget.setDate(QDate.currentDate())
  629. # Limpia el visualizador
  630. self.contract_viewer.clear()
  631.  
  632. if __name__ == "__main__":
  633. app = QApplication([])
  634. window = MainWindow()
  635. window.show()
  636. app.exec_()
  637.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement