def cargar_configuracion_por_defecto(self): self.configuracion_nomina = self.configuracion_por_defecto self.processor = NominaHelperProcessor(self.configuracion_por_defecto) self.nombre_archivo_errores.setText(self.configuracion_por_defecto.nombre_archivo_errores) self.nombre_archivo_registro.setText(self.configuracion_por_defecto.nombre_archivo_registro) self.nombre_archivo_liquidacion.setText(self.configuracion_por_defecto.nombre_archivo_liquidacion) self.numero_minimo_lineas.setText(str(self.configuracion_por_defecto.numero_minimo_lineas)) self.smlv.setText(str(self.configuracion_por_defecto.smlv)) self.auxilio_transporte.setText(str(self.configuracion_por_defecto.auxilio_transporte)) self.tope_auxilio_transporte.setText(str(self.configuracion_por_defecto.tope_auxilio_transporte)) self.tope_fondo_solidaridad.setText(str(self.configuracion_por_defecto.tope_fondo_solidaridad)) self.porcentaje_fondo_solidaridad.setText(str(self.configuracion_por_defecto.porcentaje_fondo_solidaridad)) self.porcentaje_arl.setText(str(self.configuracion_por_defecto.porcentaje_arl))
def aplicar_cambios_configuracion(self): nueva_configuracion = ConfiguracionNomina( self.nombre_archivo_errores.text(), # Nombre archivo de errores self.nombre_archivo_registro.text(), # Nombre archivo de registro de operacion del programa self.nombre_archivo_liquidacion.text(), # Nombre archivo que contendra la liquidacion de la nomina int(self.numero_minimo_lineas.text()), # Numero minimo de lineas para archivo de nomina float(self.smlv.text()), # Salario Minimo Legal Vigente (SMLV) 2015 float(self.auxilio_transporte.text()), # Auxilio de Transporte 2015 float(self.tope_auxilio_transporte.text()), # El auxilio de transporte solo se da si gana igual o menor a 2 SMLV float(self.tope_fondo_solidaridad.text()), # Quienes ganes igual o mas de 4 SMLV contribuyen 1% al fondo de solidaridad pensional float(self.porcentaje_fondo_solidaridad.text()), # Porcentaje de deducccion de aporte al fondo de solidaridad pensional. float(self.porcentaje_arl.text()) # Porcentaje Administracion de Riesgos Laborales. Modifcar porcentaje segun el tipo de riesgo definido en: https://www.positiva.gov.co/ARL/Paginas/default.aspx ) self.configuracion_nomina = nueva_configuracion self.processor = NominaHelperProcessor(nueva_configuracion)
def __init__(self, configuracion_por_defecto): super(self.__class__, self).__init__() self.setupUi(self) self.configuracion_por_defecto = configuracion_por_defecto self.configuracion_nomina = configuracion_por_defecto self.nombre_archivo_errores.setText(configuracion_por_defecto.nombre_archivo_errores) self.nombre_archivo_registro.setText(configuracion_por_defecto.nombre_archivo_registro) self.nombre_archivo_liquidacion.setText(configuracion_por_defecto.nombre_archivo_liquidacion) self.numero_minimo_lineas.setText(str(configuracion_por_defecto.numero_minimo_lineas)) self.smlv.setText(str(configuracion_por_defecto.smlv)) self.auxilio_transporte.setText(str(configuracion_por_defecto.auxilio_transporte)) self.tope_auxilio_transporte.setText(str(configuracion_por_defecto.tope_auxilio_transporte)) self.tope_fondo_solidaridad.setText(str(configuracion_por_defecto.tope_fondo_solidaridad)) self.porcentaje_fondo_solidaridad.setText(str(configuracion_por_defecto.porcentaje_fondo_solidaridad)) self.porcentaje_arl.setText(str(configuracion_por_defecto.porcentaje_arl)) self.processor = NominaHelperProcessor(configuracion_por_defecto) self.empleados = [] self.nominas_empleados = [] self.liquidaciones_empleados = [] self.sleep_barra = 0.0 self.step_barra = 0.0 self.tabla_empleados_inicializada = False self.tabla_apropiaciones_inicializada = False self.tabla_deducciones_inicializada = False self.tabla_liquidacion_inicializada = False self.nomina_calculada = False # Conexion de signals & slots self.boton_cargar_archivo.clicked.connect(self.cargar_archivo) self.boton_calcular_nomina.clicked.connect(self.calcular_nomina) self.boton_guardar_liquidacion.clicked.connect(self.guardar_liquidacion) self.tabla_empleados.selectionModel().selectionChanged.connect(self.empleado_seleccionado) #self.connect(self.tabla_empleados.selectionModel(), QtCore.SIGNAL("selectionChanged()"), self.empleado_seleccionado) self.connect(self.smlv, QtCore.SIGNAL("editingFinished()"), self.actualizar_topes) self.boton_aplicar_cambios.clicked.connect(self.aplicar_cambios_configuracion) self.boton_cargar_valores_defecto.clicked.connect(self.cargar_configuracion_por_defecto)
class NominaHelper(QtGui.QMainWindow, Ui_MainWindow): def __init__(self, configuracion_por_defecto): super(self.__class__, self).__init__() self.setupUi(self) self.configuracion_por_defecto = configuracion_por_defecto self.configuracion_nomina = configuracion_por_defecto self.nombre_archivo_errores.setText(configuracion_por_defecto.nombre_archivo_errores) self.nombre_archivo_registro.setText(configuracion_por_defecto.nombre_archivo_registro) self.nombre_archivo_liquidacion.setText(configuracion_por_defecto.nombre_archivo_liquidacion) self.numero_minimo_lineas.setText(str(configuracion_por_defecto.numero_minimo_lineas)) self.smlv.setText(str(configuracion_por_defecto.smlv)) self.auxilio_transporte.setText(str(configuracion_por_defecto.auxilio_transporte)) self.tope_auxilio_transporte.setText(str(configuracion_por_defecto.tope_auxilio_transporte)) self.tope_fondo_solidaridad.setText(str(configuracion_por_defecto.tope_fondo_solidaridad)) self.porcentaje_fondo_solidaridad.setText(str(configuracion_por_defecto.porcentaje_fondo_solidaridad)) self.porcentaje_arl.setText(str(configuracion_por_defecto.porcentaje_arl)) self.processor = NominaHelperProcessor(configuracion_por_defecto) self.empleados = [] self.nominas_empleados = [] self.liquidaciones_empleados = [] self.sleep_barra = 0.0 self.step_barra = 0.0 self.tabla_empleados_inicializada = False self.tabla_apropiaciones_inicializada = False self.tabla_deducciones_inicializada = False self.tabla_liquidacion_inicializada = False self.nomina_calculada = False # Conexion de signals & slots self.boton_cargar_archivo.clicked.connect(self.cargar_archivo) self.boton_calcular_nomina.clicked.connect(self.calcular_nomina) self.boton_guardar_liquidacion.clicked.connect(self.guardar_liquidacion) self.tabla_empleados.selectionModel().selectionChanged.connect(self.empleado_seleccionado) #self.connect(self.tabla_empleados.selectionModel(), QtCore.SIGNAL("selectionChanged()"), self.empleado_seleccionado) self.connect(self.smlv, QtCore.SIGNAL("editingFinished()"), self.actualizar_topes) self.boton_aplicar_cambios.clicked.connect(self.aplicar_cambios_configuracion) self.boton_cargar_valores_defecto.clicked.connect(self.cargar_configuracion_por_defecto) def actualizar_topes(self): nuevo_smlv = float(self.smlv.text()) nuevo_tope_auxilio_transporte = 2 * nuevo_smlv nuevo_tope_fondo_solidaridad = 4 * nuevo_smlv self.configuracion_nomina.tope_auxilio_transporte self.tope_auxilio_transporte.setText(str(nuevo_tope_auxilio_transporte)) self.tope_fondo_solidaridad.setText(str(nuevo_tope_fondo_solidaridad)) def aplicar_cambios_configuracion(self): nueva_configuracion = ConfiguracionNomina( self.nombre_archivo_errores.text(), # Nombre archivo de errores self.nombre_archivo_registro.text(), # Nombre archivo de registro de operacion del programa self.nombre_archivo_liquidacion.text(), # Nombre archivo que contendra la liquidacion de la nomina int(self.numero_minimo_lineas.text()), # Numero minimo de lineas para archivo de nomina float(self.smlv.text()), # Salario Minimo Legal Vigente (SMLV) 2015 float(self.auxilio_transporte.text()), # Auxilio de Transporte 2015 float(self.tope_auxilio_transporte.text()), # El auxilio de transporte solo se da si gana igual o menor a 2 SMLV float(self.tope_fondo_solidaridad.text()), # Quienes ganes igual o mas de 4 SMLV contribuyen 1% al fondo de solidaridad pensional float(self.porcentaje_fondo_solidaridad.text()), # Porcentaje de deducccion de aporte al fondo de solidaridad pensional. float(self.porcentaje_arl.text()) # Porcentaje Administracion de Riesgos Laborales. Modifcar porcentaje segun el tipo de riesgo definido en: https://www.positiva.gov.co/ARL/Paginas/default.aspx ) self.configuracion_nomina = nueva_configuracion self.processor = NominaHelperProcessor(nueva_configuracion) def cargar_configuracion_por_defecto(self): self.configuracion_nomina = self.configuracion_por_defecto self.processor = NominaHelperProcessor(self.configuracion_por_defecto) self.nombre_archivo_errores.setText(self.configuracion_por_defecto.nombre_archivo_errores) self.nombre_archivo_registro.setText(self.configuracion_por_defecto.nombre_archivo_registro) self.nombre_archivo_liquidacion.setText(self.configuracion_por_defecto.nombre_archivo_liquidacion) self.numero_minimo_lineas.setText(str(self.configuracion_por_defecto.numero_minimo_lineas)) self.smlv.setText(str(self.configuracion_por_defecto.smlv)) self.auxilio_transporte.setText(str(self.configuracion_por_defecto.auxilio_transporte)) self.tope_auxilio_transporte.setText(str(self.configuracion_por_defecto.tope_auxilio_transporte)) self.tope_fondo_solidaridad.setText(str(self.configuracion_por_defecto.tope_fondo_solidaridad)) self.porcentaje_fondo_solidaridad.setText(str(self.configuracion_por_defecto.porcentaje_fondo_solidaridad)) self.porcentaje_arl.setText(str(self.configuracion_por_defecto.porcentaje_arl)) def iniciar_barra_progreso(self, mensaje, n_steps, sleep_barra): self.sleep_barra = sleep_barra self.barra_progreso.setEnabled(True) self.mensaje_progreso.setText(mensaje) self.barra_progreso.reset() self.step_barra = float(100.0/n_steps) def finalizar_barra_progreso(self, mensaje): self.barra_progreso.setEnabled(False) self.mensaje_progreso.setText(mensaje) def avanzar_barra_progreso(self, valor): time.sleep(self.sleep_barra) self.barra_progreso.setValue(valor * self.step_barra) def cargar_empleados(self, ruta_nomina): archivo_nomina = open(ruta_nomina, 'r') lineas_archivo_nomina = archivo_nomina.readlines() print "Leyendo empleados ..." n_lineas_nomina = len(lineas_archivo_nomina) for i in range(n_lineas_nomina): # Eliminar el \n al final linea_empleado = lineas_archivo_nomina[i].strip() # print "Leyendo empleado " + str(i) + ": " + empleado campos_empleado = linea_empleado.split("*") self.empleados.append(Empleado(i, campos_empleado[0], int(campos_empleado[1]), campos_empleado[2])) def inicializar_tabla_empleados(self): encabezados_tabla_empleados = QtCore.QStringList() encabezados_tabla_empleados << "Nombre" << "Salario" << "Cargo" self.tabla_empleados.setSelectionMode(QtGui.QTableView.SingleSelection) self.tabla_empleados.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.tabla_empleados.setColumnCount(3) self.tabla_empleados.setColumnWidth(0, 250) self.tabla_empleados.setColumnWidth(1, 120) self.tabla_empleados.setColumnWidth(2, 200) self.tabla_empleados.setHorizontalHeaderLabels(encabezados_tabla_empleados) def actualizar_tabla_empleados(self): if not self.tabla_empleados_inicializada: self.inicializar_tabla_empleados(); self.tabla_empleados_inicializada = True n_empleados = float(len(self.empleados)) self.tabla_empleados.setRowCount(n_empleados) self.iniciar_barra_progreso("Actualizando tabla de empleados...", n_empleados, 0.1) for empleado in self.empleados: item_nombre = QtGui.QTableWidgetItem(empleado.nombre) item_nombre.setTextAlignment(QtCore.Qt.AlignLeft) self.tabla_empleados.setItem(empleado.id, 0, item_nombre) item_salario = QtGui.QTableWidgetItem(str(empleado.salario)) item_salario.setTextAlignment(QtCore.Qt.AlignRight) self.tabla_empleados.setItem(empleado.id, 1, item_salario) item_cargo = QtGui.QTableWidgetItem(empleado.cargo) item_cargo.setTextAlignment(QtCore.Qt.AlignHCenter) self.tabla_empleados.setItem(empleado.id, 2, item_cargo) self.avanzar_barra_progreso(empleado.id+1) self.finalizar_barra_progreso("Tabla de empleados actualizada!") self.tabla_empleados.resizeColumnsToContents() self.tabla_empleados.horizontalHeader().setStretchLastSection(True) # Funcion que se encarga de cargar archivo def cargar_archivo(self): ruta_nomina = QtGui.QFileDialog.getOpenFileName(self, 'Cargar archivo de nomina', '.', "Archivos de nomina (*.txt)") self.ruta_archivo_nomina.setText(ruta_nomina) self.cargar_empleados(ruta_nomina) self.actualizar_tabla_empleados() self.boton_calcular_nomina.setEnabled(True) def calcular_nomina(self): print "Calculando nomina..." self.nominas_empleados = [] self.liquidaciones_empleados = [] self.iniciar_barra_progreso("Calculando nomina para empleados...", len(self.empleados), 0) for empleado in self.empleados: nomina = self.processor.calcular_nomina(empleado) liquidacion = LiquidacionEmpleado(empleado, nomina) self.nominas_empleados.append(nomina) self.liquidaciones_empleados.append(liquidacion) self.avanzar_barra_progreso(empleado.id+1) self.finalizar_barra_progreso("Nomina calculada!") self.tabla_apropiaciones.setEnabled(True) self.tabla_deducciones.setEnabled(True) self.tabla_liquidacion.setEnabled(True) self.boton_guardar_liquidacion.setEnabled(True) self.nomina_calculada = True def inicializar_tabla_apropiaciones(self): encabezados_tabla_apropiaciones = QtCore.QStringList() encabezados_tabla_apropiaciones << "Apropiacion" << "Valor" self.tabla_apropiaciones.setSelectionMode(QtGui.QTableView.SingleSelection) self.tabla_apropiaciones.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.tabla_apropiaciones.setColumnCount(2) self.tabla_apropiaciones.verticalHeader().setVisible(False) self.tabla_apropiaciones.setHorizontalHeaderLabels(encabezados_tabla_apropiaciones) self.tabla_apropiaciones.setRowCount(10) self.tabla_apropiaciones.setItem(0, 0, QtGui.QTableWidgetItem("SS - Salud Empresa")) self.tabla_apropiaciones.setItem(1, 0, QtGui.QTableWidgetItem("SS - Pension Empresa")) self.tabla_apropiaciones.setItem(2, 0, QtGui.QTableWidgetItem("SS - ARL")) self.tabla_apropiaciones.setItem(3, 0, QtGui.QTableWidgetItem("AP - Sena")) self.tabla_apropiaciones.setItem(4, 0, QtGui.QTableWidgetItem("AP - ICBF")) self.tabla_apropiaciones.setItem(5, 0, QtGui.QTableWidgetItem("AP - Cajas")) self.tabla_apropiaciones.setItem(6, 0, QtGui.QTableWidgetItem("PS - Cesantias")) self.tabla_apropiaciones.setItem(7, 0, QtGui.QTableWidgetItem("PS - Intereses")) self.tabla_apropiaciones.setItem(8, 0, QtGui.QTableWidgetItem("PS - Vacaciones")) self.tabla_apropiaciones.setItem(9, 0, QtGui.QTableWidgetItem("PS - Prima")) def actualizar_tabla_apropiaciones(self, empleado): if not self.nomina_calculada: print "Calcular nomina primero!" return if not self.tabla_apropiaciones_inicializada: self.inicializar_tabla_apropiaciones(); self.tabla_apropiaciones_inicializada = True apropiacion = self.nominas_empleados[empleado.id].apropiacion item_ss_salud_empresa = QtGui.QTableWidgetItem(str(apropiacion.seguridad_social.salud_empresa)) item_ss_salud_empresa.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_apropiaciones.setItem(0, 1, item_ss_salud_empresa) item_ss_pension_empresa = QtGui.QTableWidgetItem(str(apropiacion.seguridad_social.pension_empresa)) item_ss_pension_empresa.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_apropiaciones.setItem(1, 1, item_ss_pension_empresa) item_ss_arl = QtGui.QTableWidgetItem(str(apropiacion.seguridad_social.arl)) item_ss_arl.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_apropiaciones.setItem(2, 1, item_ss_arl) item_ap_sena = QtGui.QTableWidgetItem(str(apropiacion.aporte_parafiscal.sena)) item_ap_sena.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_apropiaciones.setItem(3, 1, item_ap_sena) item_ap_icbf = QtGui.QTableWidgetItem(str(apropiacion.aporte_parafiscal.icbf)) item_ap_icbf.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_apropiaciones.setItem(4, 1, item_ap_icbf) item_ap_cajas = QtGui.QTableWidgetItem(str(apropiacion.aporte_parafiscal.cajas)) item_ap_cajas.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_apropiaciones.setItem(5, 1, item_ap_cajas) item_ps_cesantias = QtGui.QTableWidgetItem(str(apropiacion.prestacion_social.cesantias)) item_ps_cesantias.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_apropiaciones.setItem(6, 1, item_ps_cesantias) item_ps_intereses = QtGui.QTableWidgetItem(str(apropiacion.prestacion_social.interes_cesantias)) item_ps_intereses.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_apropiaciones.setItem(7, 1, item_ps_intereses) item_ps_vacaciones = QtGui.QTableWidgetItem(str(apropiacion.prestacion_social.vacaciones)) item_ps_vacaciones.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_apropiaciones.setItem(8, 1, item_ps_vacaciones) item_ps_prima = QtGui.QTableWidgetItem(str(apropiacion.prestacion_social.prima_servicios)) item_ps_prima.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_apropiaciones.setItem(9, 1, item_ps_prima) self.tabla_apropiaciones.resizeColumnsToContents() self.tabla_apropiaciones.horizontalHeader().setStretchLastSection(True) def inicializar_tabla_deducciones(self): encabezados_tabla_deducciones = QtCore.QStringList() encabezados_tabla_deducciones << "Deduccion" << "Valor" self.tabla_deducciones.setSelectionMode(QtGui.QTableView.SingleSelection) self.tabla_deducciones.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.tabla_deducciones.setColumnCount(2) self.tabla_deducciones.verticalHeader().setVisible(False) self.tabla_deducciones.setHorizontalHeaderLabels(encabezados_tabla_deducciones) self.tabla_deducciones.setRowCount(3) self.tabla_deducciones.setItem(0, 0, QtGui.QTableWidgetItem("Salud Empleado")) self.tabla_deducciones.setItem(1, 0, QtGui.QTableWidgetItem("Pension Empleado")) self.tabla_deducciones.setItem(2, 0, QtGui.QTableWidgetItem("Fondo Solidaridad")) def actualizar_tabla_deducciones(self, empleado): if not self.nomina_calculada: print "Calcular nomina primero!" return if not self.tabla_deducciones_inicializada: self.inicializar_tabla_deducciones(); self.tabla_deducciones_inicializada = True deduccion = self.nominas_empleados[empleado.id].deduccion item_salud_empleado = QtGui.QTableWidgetItem(str(deduccion.salud_empleado)) item_salud_empleado.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_deducciones.setItem(0, 1, item_salud_empleado) item_pension_empleado = QtGui.QTableWidgetItem(str(deduccion.pension_empleado)) item_pension_empleado.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_deducciones.setItem(1, 1, item_pension_empleado) item_fondo_solidaridad = QtGui.QTableWidgetItem(str(deduccion.aporte_fondo_solidaridad)) item_fondo_solidaridad.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_deducciones.setItem(2, 1, item_fondo_solidaridad) self.tabla_deducciones.resizeColumnsToContents() self.tabla_deducciones.horizontalHeader().setStretchLastSection(True) def inicializar_tabla_liquidacion(self): encabezados_tabla_liquidacion = QtCore.QStringList() encabezados_tabla_liquidacion << "Detalle" << "Valor" self.tabla_liquidacion.setSelectionMode(QtGui.QTableView.SingleSelection) self.tabla_liquidacion.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.tabla_liquidacion.setColumnCount(2) self.tabla_liquidacion.verticalHeader().setVisible(False) self.tabla_liquidacion.setHorizontalHeaderLabels(encabezados_tabla_liquidacion) self.tabla_liquidacion.setRowCount(5) self.tabla_liquidacion.setItem(0, 0, QtGui.QTableWidgetItem("Total Apropiaciones")) self.tabla_liquidacion.setItem(1, 0, QtGui.QTableWidgetItem("Total Deducciones")) self.tabla_liquidacion.setItem(2, 0, QtGui.QTableWidgetItem("Auxilio de Transporte")) self.tabla_liquidacion.setItem(3, 0, QtGui.QTableWidgetItem("Salario Neto")) self.tabla_liquidacion.setItem(4, 0, QtGui.QTableWidgetItem("Costo Empresa")) def actualizar_tabla_liquidacion(self, empleado): if not self.nomina_calculada: print "Calcular nomina primero!" return if not self.tabla_liquidacion_inicializada: self.inicializar_tabla_liquidacion(); self.tabla_liquidacion_inicializada = True liquidacion = self.liquidaciones_empleados[empleado.id] item_total_apropiaciones = QtGui.QTableWidgetItem(str(liquidacion.nomina_empleado.apropiacion.total())) item_total_apropiaciones.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_liquidacion.setItem(0, 1, item_total_apropiaciones) item_total_deducciones = QtGui.QTableWidgetItem(str(liquidacion.nomina_empleado.deduccion.total())) item_total_deducciones.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_liquidacion.setItem(1, 1, item_total_deducciones) item_auxilio_transporte = QtGui.QTableWidgetItem(str(liquidacion.nomina_empleado.valor_auxilio_transporte)) item_auxilio_transporte.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_liquidacion.setItem(2, 1, item_auxilio_transporte) item_salario_neto = QtGui.QTableWidgetItem(str(liquidacion.salario_neto)) item_salario_neto.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_liquidacion.setItem(3, 1, item_salario_neto) item_costo_empresa = QtGui.QTableWidgetItem(str(liquidacion.costo_empresa)) item_costo_empresa.setTextAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tabla_liquidacion.setItem(4, 1, item_costo_empresa) self.tabla_liquidacion.resizeColumnsToContents() self.tabla_liquidacion.horizontalHeader().setStretchLastSection(True) def empleado_seleccionado(self, selected, deselected): cur_index = selected.indexes()[0] cur_row = cur_index.row() #print "cur_row = " + str(cur_row) #print "Selected: " + self.empleados[cur_row].nombre + " - Id: " + str(self.empleados[cur_row].id) self.actualizar_tabla_apropiaciones(self.empleados[cur_row]) self.actualizar_tabla_deducciones(self.empleados[cur_row]) self.actualizar_tabla_liquidacion(self.empleados[cur_row]) # Funcion que se encarga de cargar archivo def guardar_liquidacion(self): ruta_liquidacion = QtGui.QFileDialog.getSaveFileName(self, 'Guardar archivo de liquidacion', '.', "Archivos de liquidacion (*.liq)") print "Ruta para guardar liquidacion: " + ruta_liquidacion self.iniciar_barra_progreso("Guardando liquidaciones ...", 2, 1) self.avanzar_barra_progreso(1) self.processor.guardar_liquidacion_nomina(self.liquidaciones_empleados, ruta_liquidacion) self.avanzar_barra_progreso(2) self.finalizar_barra_progreso("Liquidaciones guardadas!")