Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- import docx
- import os
- import tempfile
- import shutil
- from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QPushButton, QLabel,
- QWidget, QSplitter, QCheckBox, QFormLayout, QLineEdit, QDateEdit,
- QComboBox, QSpinBox, QDoubleSpinBox, QTextEdit, QHBoxLayout,
- QGroupBox, QTimeEdit, QFileDialog, QMessageBox)
- from PyQt5.QtWidgets import QSizePolicy
- from PyQt5.QtCore import Qt, QDate, QTime
- from PyQt5.QtGui import QImage, QPixmap
- from docx2pdf import convert
- import fitz
- from docx import Document
- TEMP_PDF_PATH = ""
- #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"
- DOCX_PATH = r"C:\Users\Bitupx\Documents\PROYECTO HUABO\CONTRATO DE TRABAJO.docx"
- class MainWindow(QMainWindow):
- def __init__(self):
- super().__init__()
- self.initUI()
- self.load_initial_docx_content()
- def initUI(self):
- self.setWindowTitle("Generador de Contratos")
- self.setGeometry(100, 100, 800, 600)
- # Crear un splitter para el formulario y el visualizador
- splitter = QSplitter(Qt.Horizontal)
- # Lado izquierdo: formulario de entrada
- self.entry_widget = QWidget(self)
- self.entry_layout = QVBoxLayout(self.entry_widget)
- # Campos generales
- general_group = QGroupBox("Información General")
- general_layout = QFormLayout()
- general_group.setLayout(general_layout)
- self.contract_type = QComboBox()
- self.contract_type.addItems(["Tiempo completo", "Part-Time"])
- self.contract_type.currentTextChanged.connect(self.on_contract_type_changed)
- self.contract_duration = QSpinBox()
- self.contract_duration.setRange(1, 12) # Duración en meses
- # Esto es donde agregamos el QLabel que mostrará la duración del contrato
- self.contract_duration_label = QLabel("Duración: 0 meses, 0 días")
- general_layout.addRow(QLabel("Tipo de Contrato"), self.contract_type)
- general_layout.addRow(self.contract_duration_label)
- self.entry_layout.addWidget(general_group)
- # Grupo de campos de entrada
- entry_group = QGroupBox("Detalles del Contrato")
- entry_layout = QFormLayout()
- entry_group.setLayout(entry_layout)
- self.fields = {
- 'Fecha': QDateEdit(QDate.currentDate()),
- 'Ciudad': QComboBox(),
- 'Comuna': QComboBox(),
- 'Nombre de la Empresa': QLineEdit(),
- 'Rut de la Empresa': QLineEdit(),
- 'Nombre del Representante': QLineEdit(),
- 'Tipo de Documento Representante': QComboBox(),
- 'Numero Doc. del Representante': QLineEdit(),
- 'Domicilio de la Empresa': QLineEdit(),
- 'Nombre del Trabajador': QLineEdit(),
- 'Fecha de Nacimiento del Trabajador': QDateEdit(QDate.currentDate()),
- 'Estado Civil del Trabajador': QLineEdit(),
- 'Nacionalidad del Trabajador': QLineEdit(),
- 'Tipo de Documento Trabajador': QComboBox(),
- 'Numero Doc. del Trabajador': QLineEdit(),
- 'Domicilio del Trabajador': QLineEdit(),
- 'Comuna del Trabajador': QLineEdit(),
- 'Descripción del Trabajo': QLineEdit(),
- 'Número de Horas Semanales': QSpinBox(),
- 'Porcentaje de Gratificación': QDoubleSpinBox(),
- 'Fecha de Ingreso': QDateEdit(QDate.currentDate()),
- 'Fecha de Terminación': QDateEdit(QDate.currentDate().addDays(30))
- }
- self.fields['Monto del Sueldo'] = QSpinBox()
- self.fields['Monto del Sueldo'].setRange(0, 10000000)
- self.fields['Monto del Sueldo'].setValue(460000)
- self.fields['Monto del Sueldo'].setDisabled(True)
- # CheckBox para activar o desactivar la edición del monto del sueldo
- self.modify_salary_check = QCheckBox("Modificar sueldo")
- self.modify_salary_check.stateChanged.connect(self.toggle_salary_edit)
- # Añadir al layout
- entry_layout.addRow(self.modify_salary_check, self.fields['Monto del Sueldo'])
- # Configuración de los campos
- self.fields['Fecha'].setCalendarPopup(True)
- self.fields['Fecha de Nacimiento del Trabajador'].setCalendarPopup(True)
- self.fields['Fecha de Ingreso'].setCalendarPopup(True)
- self.fields['Fecha de Terminación'].setCalendarPopup(True)
- self.fields['Porcentaje de Gratificación'].setDisabled(True)
- self.fields['Porcentaje de Gratificación'].setValue(25)
- self.fields['Número de Horas Semanales'].setRange(0, 45)
- self.fields['Número de Horas Semanales'].setValue(45)
- self.fields['Número de Horas Semanales'].setDisabled(True)
- # Poblamos el QComboBox de Ciudad con algunas ciudades
- self.ciudades_comunas = {
- "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"],
- }
- self.fields['Ciudad'].addItems(self.ciudades_comunas.keys())
- self.fields['Ciudad'].currentTextChanged.connect(self.update_comunas)
- self.fields['Fecha de Ingreso'].dateChanged.connect(self.update_contract_duration)
- self.fields['Fecha de Terminación'].dateChanged.connect(self.update_contract_duration)
- # Inicializamos el diccionario de checkboxes
- self.checkboxes = {}
- for label, widget in self.fields.items():
- checkbox = QCheckBox()
- checkbox.keyPressEvent = lambda event, checkbox=checkbox: self.checkbox_keyPressEvent(event, checkbox)
- checkbox.stateChanged.connect(self.on_checkbox_changed)
- checkbox.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
- self.checkboxes[label] = checkbox
- widget.setMaximumWidth(150)
- widget.setEnabled(False)
- field_layout = QHBoxLayout()
- field_layout.addWidget(checkbox)
- field_layout.addWidget(QLabel(f"{label}:"))
- field_layout.addWidget(widget)
- self.entry_layout.addLayout(field_layout)
- # Configurar widgets adicionales
- for field in ['Fecha', 'Fecha de Nacimiento del Trabajador', 'Fecha de Ingreso', 'Fecha de Terminación']:
- self.fields[field].setDisplayFormat('dd/MM/yyyy')
- self.fields['Tipo de Documento Representante'].addItems(['Cédula de Identidad', 'Pasaporte', 'Rut para extranjeros', 'Rut Provisorio'])
- self.fields['Tipo de Documento Trabajador'].addItems(['Cédula de Identidad', 'Pasaporte', 'Rut para extranjeros', 'Rut Provisorio'])
- # Días de trabajo
- schedule_group = QGroupBox("Horarios de Trabajo")
- schedule_layout = QVBoxLayout()
- schedule_group.setLayout(schedule_layout)
- # Añadir QCheckBox para días de trabajo
- self.weekdays_checkbox = QCheckBox('Lunes a Viernes')
- self.saturday_checkbox = QCheckBox('Sábado')
- # TimeEdits para los horarios
- self.weekdays_start_time = QTimeEdit()
- self.weekdays_start_time.setDisplayFormat("HH:mm")
- self.weekdays_end_time = QTimeEdit()
- self.weekdays_end_time.setDisplayFormat("HH:mm")
- self.saturday_start_time = QTimeEdit()
- self.saturday_start_time.setDisplayFormat("HH:mm")
- self.saturday_end_time = QTimeEdit()
- self.saturday_end_time.setDisplayFormat("HH:mm")
- # SpinBox para horas de colación
- self.colacion_hours = QSpinBox()
- self.colacion_hours.setRange(0, 2)
- # Organizar los widgets para los días de semana en un layout horizontal
- weekday_layout = QHBoxLayout()
- weekday_layout.addWidget(self.weekdays_start_time)
- weekday_layout.addWidget(QLabel("a"))
- weekday_layout.addWidget(self.weekdays_end_time)
- weekday_layout.addWidget(QLabel("Horas de Colación"))
- weekday_layout.addWidget(self.colacion_hours)
- # Organizar los widgets para el Sábado en un layout horizontal
- saturday_layout = QHBoxLayout()
- saturday_layout.addWidget(self.saturday_start_time)
- saturday_layout.addWidget(QLabel("a"))
- saturday_layout.addWidget(self.saturday_end_time)
- self.saturday_colacion_checkbox = QCheckBox("¿Aplicar colación el sábado?")
- saturday_layout.addWidget(self.saturday_colacion_checkbox)
- # Añadir los layouts horizontales al layout principal (QFormLayout)
- entry_layout.addRow(QLabel('Días de Trabajo'), self.weekdays_checkbox)
- entry_layout.addRow(QLabel('Horario Lunes a Viernes'), weekday_layout)
- entry_layout.addRow(self.saturday_checkbox)
- entry_layout.addRow(QLabel('Horario Sábado'), saturday_layout)
- self.entry_layout.addWidget(entry_group)
- # Botones
- btn_layout = QHBoxLayout()
- self.add_button = QPushButton('Agregar Campos')
- self.add_button.clicked.connect(self.update_and_show_contract)
- btn_layout.addWidget(self.add_button)
- self.clear_button = QPushButton('Limpiar')
- self.clear_button.clicked.connect(self.clear_fields)
- btn_layout.addWidget(self.clear_button)
- self.entry_layout.addLayout(btn_layout)
- splitter.addWidget(self.entry_widget)
- # Lado derecho: visualizador de contrato (PDF)
- self.contract_viewer = QLabel(self)
- self.contract_viewer.setMinimumSize(300, 400)
- self.current_pdf_page = 0 # Initial page
- self.pdf_document = None # No PDF loaded initially
- splitter.addWidget(self.contract_viewer)
- # Configurar el layout del QWidget principal
- central_widget = QWidget(self)
- central_layout = QVBoxLayout(central_widget) # Nuevo layout para el widget central
- # Botón "Generar Documento" encima del visualizador del PDF
- self.generate_document_button = QPushButton('Generar Documento', self)
- self.generate_document_button.clicked.connect(self.generate_document)
- central_layout.addWidget(self.generate_document_button, alignment=Qt.AlignCenter) # Add the button to the central layout
- central_layout.addWidget(splitter) # Agregar el splitter al layout central
- # Adding PDF navigation buttons below the contract viewer
- self.pdf_navigation_layout = QHBoxLayout()
- self.previous_button = QPushButton("Anterior")
- self.previous_button.clicked.connect(self.previous_pdf_page)
- self.pdf_navigation_layout.addWidget(self.previous_button)
- self.next_button = QPushButton("Siguiente")
- self.next_button.clicked.connect(self.next_pdf_page)
- self.pdf_navigation_layout.addWidget(self.next_button)
- central_layout.addLayout(self.pdf_navigation_layout)
- self.setCentralWidget(central_widget) # Establecer el widget central
- def update_docx_with_form_data(self, docx_path):
- """
- Update the docx file content with the data from the form fields.
- """
- # Load the docx file
- doc = docx.Document(docx_path)
- # Recopilar los valores de los campos de la GUI
- values = {f"[{label}]": widget.text() for label, widget in self.fields.items()}
- # Replace the placeholders with the form data
- for paragraph in doc.paragraphs:
- for placeholder, value in values.items():
- if placeholder in paragraph.text:
- for run in paragraph.runs:
- run.text = run.text.replace(placeholder, value)
- # Save the updated docx
- doc.save(docx_path)
- def toggle_salary_edit(self, state):
- """
- Activa o desactiva la edición del 'Monto del Sueldo' según el estado del checkbox.
- """
- if state == Qt.Checked:
- self.fields['Monto del Sueldo'].setDisabled(False)
- else:
- self.fields['Monto del Sueldo'].setDisabled(True)
- self.fields['Monto del Sueldo'].setValue(460000) # Restablecer al valor por defecto
- def update_contract_duration(self):
- start_date = self.fields['Fecha de Ingreso'].date()
- end_date = self.fields['Fecha de Terminación'].date()
- if start_date >= end_date:
- QMessageBox.warning(self, "Error en las fechas", "La fecha de ingreso no puede ser igual o posterior a la fecha de terminación.")
- return
- duration = end_date.toJulianDay() - start_date.toJulianDay()
- months = duration // 30 # Aproximación simple para el cálculo de meses
- days = duration % 30
- self.contract_duration_label.setText(f"Duración: {months} meses, {days} días")
- def update_comunas(self, selected_city):
- # Limpia el QComboBox de Comuna.
- self.fields['Comuna'].clear()
- # Poblar la lista desplegable de Comuna según la ciudad seleccionada.
- comunas = self.ciudades_comunas.get(selected_city, [])
- self.fields['Comuna'].addItems(comunas)
- def checkbox_keyPressEvent(self, event, checkbox):
- if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
- checkbox.setChecked(not checkbox.isChecked())
- else:
- super(QCheckBox, checkbox).keyPressEvent(event) # Llama al comportamiento original en caso de que no sea Enter o Return.
- def on_checkbox_changed(self, state):
- # Encuentra qué checkbox fue cambiado
- for label, checkbox in self.checkboxes.items():
- if checkbox is self.sender():
- # Habilita o deshabilita el campo asociado dependiendo del estado del checkbox
- self.fields[label].setEnabled(state == Qt.Checked)
- def update_contract(self):
- # Verificar si el total de horas excede las 45, si es así, muestra un mensaje relevante y sale temprano
- if not self.validate_hours():
- return # Salir temprano si las horas no son válidas
- values = {}
- for label, widget in self.fields.items():
- if isinstance(widget, QLineEdit):
- values[label] = widget.text()
- elif isinstance(widget, QComboBox):
- values[label] = widget.currentText()
- elif isinstance(widget, QDateEdit):
- values[label] = widget.date().toString('yyyy-MM-dd')
- else:
- values[label] = widget.value()
- # Formatear días y horarios de trabajo
- days = []
- if self.weekdays_checkbox.isChecked():
- end_time = self.weekdays_end_time.time().hour() - self.colacion_hours.value()
- days.append(f"Lunes a Viernes: Desde las {self.weekdays_start_time.text()} hasta las {end_time} horas")
- if self.saturday_checkbox.isChecked():
- end_time = self.saturday_end_time.time().hour() - self.saturday_colacion_checkbox.value()
- days.append(f"Sábado: Desde {self.saturday_start_time.text()} hasta las {end_time} horas")
- values['Días y Horarios de Trabajo'] = ', '.join(days)
- # Obtener y formatear fechas en letras
- for label in ['Fecha', 'Fecha de Nacimiento del Trabajador', 'Fecha de Terminación', 'Fecha de Ingreso']:
- date_widget = self.fields[label]
- date = date_widget.date().toString('dddd dd \'de\' MMMM \'de\' yyyy')
- values[label] = date.capitalize()
- # Añadir el tipo de contrato y su duración, si aplica
- contract_info = self.contract_type.currentText()
- if "Contrato" in contract_info:
- end_date = self.fields['Fecha'].date().addMonths(self.contract_duration.value())
- formatted_date = end_date.toString("dddd dd 'de' MMMM 'de' yyyy").capitalize()
- contract_info += f", con duración hasta el {formatted_date}"
- values["Tipo y Duración del Contrato"] = contract_info
- def bold_and_format_text(self, paragraph, text, bold=False, underline=False, font_size=15.24, font_name="Times New Roman"):
- """ Función auxiliar para dar formato al texto """
- run = paragraph.add_run(text)
- run.bold = bold
- run.underline = underline
- run.font.size = Pt(font_size)
- run.font.name = font_name
- # Devolviendo el párrafo para mantener la coherencia con tu versión original
- return paragraph
- def validate_hours(self):
- weekdays_hours = self.weekdays_end_time.time().hour() - self.weekdays_start_time.time().hour() - self.colacion_hours.value()
- saturday_hours = 0 # Inicializamos a 0 y sólo lo modificamos si el checkbox del sábado está marcado
- if self.saturday_checkbox.isChecked():
- saturday_hours = self.saturday_end_time.time().hour() - self.saturday_start_time.time().hour()
- # Restar una hora de colación si el checkbox de colación del sábado está marcado
- if self.saturday_colacion_checkbox.isChecked():
- saturday_hours -= 1
- total_hours = weekdays_hours * 5 + saturday_hours
- max_hours = 45 if self.contract_type.currentText() == "Tiempo completo" else 30
- if total_hours > max_hours:
- QMessageBox.warning(self, "Error de Horas", f"Estás excediendo las {max_hours} horas. Ajusta el horario.")
- return False
- return True
- def on_contract_type_changed(self, text):
- if text == "Tiempo completo":
- self.colacion_hours.setEnabled(True) # Activa el campo de colación
- self.fields['Número de Horas Semanales'].setValue(45) # Establece en 45 horas para tiempo completo
- else:
- self.colacion_hours.setEnabled(False) # Desactiva el campo de colación
- self.fields['Número de Horas Semanales'].setValue(30) # Establece en 30 horas para part-time
- self.adjust_working_hours()
- def adjust_working_hours(self):
- contract_type = self.contract_type.currentText()
- if contract_type == "Tiempo completo":
- # Configuración por defecto para un contrato de tiempo completo, por ejemplo:
- self.weekdays_start_time.setTime(QTime(8, 0))
- self.weekdays_end_time.setTime(QTime(17, 45))
- self.colacion_hours.setValue(1)
- else:
- # Configuración por defecto para un contrato part-time, por ejemplo:
- self.weekdays_start_time.setTime(QTime(8, 0))
- self.weekdays_end_time.setTime(QTime(14, 0))
- self.colacion_hours.setValue(0)
- def bold_names(self, text):
- cursor = self.contract_viewer.textCursor()
- format = QTextCharFormat()
- format.setFontWeight(QFont.Bold)
- names = ["Rachel", "Fiona"]
- for name in names:
- pos = 0
- while pos != -1:
- pos = text.find(name, pos)
- if pos != -1:
- cursor.setPosition(pos, QTextCursor.KeepAnchor)
- cursor.mergeCharFormat(format)
- pos += len(name)
- def load_initial_docx_content(self):
- TEMP_PDF_PATH = os.path.join(tempfile.gettempdir(), "temp_initial_visualization.pdf")
- convert(DOCX_PATH, TEMP_PDF_PATH)
- self.load_pdf_to_viewer(TEMP_PDF_PATH)
- def load_pdf_to_viewer(self, pdf_path):
- self.pdf_document = fitz.open(pdf_path)
- doc = self.pdf_document
- page = doc.load_page(0)
- image = page.get_pixmap()
- qt_image = QPixmap.fromImage(self.pixmap_to_qimage(image))
- # Directly set the QPixmap to the existing contract_viewer
- self.contract_viewer.setPixmap(qt_image)
- self.contract_viewer.setAlignment(Qt.AlignCenter) # Ensure the content is centered
- def show_pdf_page(self, page_number):
- if self.pdf_document:
- page = self.pdf_document.load_page(page_number)
- image = page.get_pixmap()
- qt_image = QPixmap.fromImage(self.pixmap_to_qimage(image))
- self.contract_viewer.setPixmap(qt_image)
- self.contract_viewer.setAlignment(Qt.AlignCenter)
- self.update_pdf_navigation_buttons()
- def previous_pdf_page(self):
- if self.current_pdf_page > 0:
- self.current_pdf_page -= 1
- self.show_pdf_page(self.current_pdf_page)
- def next_pdf_page(self):
- if self.current_pdf_page < self.pdf_document.page_count - 1:
- self.current_pdf_page += 1
- self.show_pdf_page(self.current_pdf_page)
- def update_pdf_navigation_buttons(self):
- self.previous_button.setEnabled(self.current_pdf_page > 0)
- self.next_button.setEnabled(self.current_pdf_page < self.pdf_document.page_count - 1)
- def pixmap_to_qimage(self, pixmap):
- return QImage(pixmap.samples, pixmap.width, pixmap.height, pixmap.stride, QImage.Format_RGB888)
- def update_docx_content(self, docx_path, old_text, new_text):
- """
- Update the docx file content.
- """
- # Load the docx file
- doc = docx.Document(docx_path)
- # Replace the old text with the new text
- for paragraph in doc.paragraphs:
- if old_text in paragraph.text:
- for run in paragraph.runs:
- run.text = run.text.replace(old_text, new_text)
- # Save the updated docx
- doc.save(docx_path)
- def update_and_show_contract(self):
- # Actualiza el campo "Ciudad" en el documento
- text_to_replace = "En Santiago"
- new_text = self.fields['Ciudad'].currentText()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "09 DE DICIEMBRE DE 2022"
- new_text = self.fields['Fecha'].date().toString(Qt.ISODate)
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "IMPORTADORA EXPORTADORA EUROPA LIMITA"
- new_text = self.fields['Nombre de la Empresa'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "76.752.038-7"
- new_text = self.fields['Rut de la Empresa'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "JIANFENG JI"
- new_text = self.fields['Nombre del Representante'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "25.040.028-4"
- new_text = self.fields['Número Doc. del Representante'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "UNION AMERICANA 408"
- new_text = self.fields['Domicilio de la Empresa'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "SANTIAGO"
- new_text = self.fields['Comuna'].currentText()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "ILIANE DEL CARMEN BARRIOS SUAREZ"
- new_text = self.fields['Nombre del Trabajador'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "33.618.655-2"
- new_text = self.fields['Número Doc. del Trabajador'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "VENEZOLANA"
- new_text = self.fields['Nacionalidad del Trabajador'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "Soltera"
- new_text = self.fields['Estado Civil del Trabajador'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "TORO MAZOTTE 294"
- new_text = self.fields['Domicilio del Trabajador'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "ESTACION CENTRAL"
- new_text = self.fields['Comuna del Trabajador'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "VENDEDORA Y REPONEDORA"
- new_text = self.fields['Descripción del Trabajo'].text()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "45"
- new_text = str(self.fields['Número de Horas Semanales'].value())
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "25%"
- new_text = str(self.fields['Porcentaje de Gratificación'].value())
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "01 DE DICIEMBRE DE 2022"
- new_text = self.fields['Fecha de Ingreso'].date().toString(Qt.ISODate)
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "HASTA EL 01 DE MAYO DE 2023"
- new_text = self.fields['Fecha de Terminación'].date().toString(Qt.ISODate)
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "$400.000"
- new_text = str(self.fields['Monto del Sueldo'].value())
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- text_to_replace = "Rut provisorio"
- new_text = self.fields['Tipo de Documento Trabajador'].currentText()
- self.update_docx_content(DOCX_PATH, text_to_replace, new_text)
- # Convierte el DOCX actualizado a PDF y lo muestra en el visualizador
- TEMP_PDF_PATH = os.path.join(tempfile.gettempdir(), "temp_visualization.pdf")
- convert(DOCX_PATH, TEMP_PDF_PATH)
- self.load_pdf_to_viewer(TEMP_PDF_PATH)
- def generate_document(self):
- # Crear un directorio temporal
- temp_dir = tempfile.mkdtemp()
- TEMP_DOCX_PATH = os.path.join(temp_dir, "temp_visualization.docx")
- TEMP_PDF_PATH = os.path.join(temp_dir, "temp_visualization.pdf")
- # Verificar si hay campos faltantes
- missing_fields = [label for label, widget in self.fields.items() if not widget.text() and widget.isEnabled()]
- if missing_fields:
- QMessageBox.warning(self, "Campos faltantes", f"Faltan los siguientes campos: {', '.join(missing_fields)}. Por favor llénalos antes de generar.")
- return
- # Cargar el documento original desde la ruta fija
- doc = Document(DOCX_PATH)
- # Recopilar los valores de los campos de la GUI
- values = {label: widget.text() for label, widget in self.fields.items()}
- # Realizar las ediciones en el documento
- for paragraph in doc.paragraphs:
- for label, value in values.items():
- placeholder = f"[{label}]"
- if placeholder in paragraph.text:
- paragraph.text = paragraph.text.replace(placeholder, value)
- # Guardar el documento modificado en el directorio temporal
- doc.save(TEMP_DOCX_PATH)
- # Convertir el DOCX modificado a PDF
- convert(TEMP_DOCX_PATH, TEMP_PDF_PATH)
- # Cargar el PDF en el visualizador
- self.load_pdf_to_viewer(TEMP_PDF_PATH)
- # Eliminar el directorio temporal al final
- shutil.rmtree(temp_dir)
- def clear_fields(self):
- # Limpia los campos del formulario
- for widget in self.fields.values():
- if isinstance(widget, QLineEdit):
- widget.clear()
- elif isinstance(widget, QComboBox):
- widget.setCurrentIndex(0)
- elif isinstance(widget, QSpinBox) or isinstance(widget, QDoubleSpinBox):
- widget.setValue(widget.minimum())
- elif isinstance(widget, QDateEdit):
- widget.setDate(QDate.currentDate())
- # Limpia el visualizador
- self.contract_viewer.clear()
- if __name__ == "__main__":
- app = QApplication([])
- window = MainWindow()
- window.show()
- app.exec_()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement