def buscar_nro_nota_debito(self): timb = self.obj("txt_01_1").get_text() cursor = Op.consultar( self.conexion, "NumeroInicio, NumeroFin", "timbrados_s", " WHERE NroTimbrado = " + timb + " AND " + "idTipoDocumento = 3 AND FechaVencimiento > NOW() AND Anulado <> 1" ) datos = cursor.fetchall() ini, fin = datos[0][0], datos[0][1] num_nota = Op.nuevoid(self.conexion, self.tabla + "_s WHERE NroTimbrado = " + timb, "NroNotaDebito") if int(num_nota) >= ini and int(num_nota) <= fin: self.obj("txt_00_3").set_text(Op.cadenanumeros(num_nota, 7)) elif int(num_nota) < ini: self.obj("txt_00_3").set_text(Op.cadenanumeros(str(ini), 7)) elif int(num_nota) > fin: Mens.error_generico( "¡ERROR!", "El nuevo Número de Nota de Débito es mayor " + "al último número\npara el Timbrado asignado a este Punto de Expedición." + "\n\nHable con el Administrador par resolver el problema.") self.estadoedicion(False) self.limpiarcampos()
def seleccion(self): try: seleccion, iterador = self.obj("grilla").get_selection().get_selected() timb = str(seleccion.get_value(iterador, 0)) caja = str(seleccion.get_value(iterador, 7)) estab = str(seleccion.get_value(iterador, 9)) self.origen.txt_nro_timb.set_text(timb) self.origen.txt_nro_cja.set_text(Op.cadenanumeros(caja, 3)) self.origen.txt_nro_est.set_text(Op.cadenanumeros(estab, 3)) self.on_btn_salir_clicked(0) except: pass
def listar_grilla(self): from clases import listado from reportlab.platypus import Paragraph as Par from reportlab.lib.pagesizes import A4, landscape datos = self.obj("grilla").get_model() cant = len(datos) head = listado.tabla_celda_titulo() body_ce = listado.tabla_celda_centrado() body_iz = listado.tabla_celda_just_izquierdo() body_de = listado.tabla_celda_just_derecho() lista = [[ Par("Nro. Timbrado", head), Par("Nro. Establecimiento", head), Par("Nro. Caja", head), Par("Fecha de Emisión", head), Par("Fecha de Vencimiento", head), Par("Desde", head), Par("Hasta", head), Par("Estado", head) ]] for i in range(0, cant): lista.append([ Par(str(datos[i][0]), body_ce), Par(Op.cadenanumeros(datos[i][9], 3), body_ce), Par(Op.cadenanumeros(datos[i][7], 3), body_ce), Par(datos[i][1], body_iz), Par(datos[i][2], body_iz), Par(str(datos[i][3]), body_de), Par(str(datos[i][4]), body_de), Par(datos[i][20], body_ce) ]) listado.listado(self.titulo, lista, [100, 100, 100, 125, 125, 50, 50, 50], landscape(A4))
def buscar_nro_timbrado(self): cursor = Op.consultar( self.conexion, "NroTimbrado, FechaVencimiento", "timbrados_s", " WHERE NroEstablecimiento = " + self.estab + " AND NroCaja = " + self.caja + " AND FechaVencimiento > NOW() AND idTipoDocumento = 3 AND Anulado <> 1 ORDER BY NroTimbrado" ) datos = cursor.fetchall() if cursor.rowcount > 0: # Datos del Timbrado self.obj("txt_01_1").set_text(str(datos[0][0])) self.obj("txt_01_2").set_text(Cal.mysql_fecha(datos[0][1])) # Datos del Punto de Expedición self.obj("txt_00_1").set_text(Op.cadenanumeros(self.estab, 3)) self.obj("txt_00_2").set_text(Op.cadenanumeros(self.caja, 3)) else: Mens.error_generico( "¡ERROR!", "No se ha encontrado un Timbrado\npara este Punto de Expedición." + "\nConsulte al Administrador del Sistema.\n\nLa ventana de Nota de Débitos se cerrará." ) self.obj("ventana").destroy()
def calendario(): arch = archivo("calendario") obj = arch.get_object obj("ventana").set_title("Calendario: Seleccione una Fecha") obj("ventana").set_default_size(350, 300) obj("ventana").set_position(1) obj("ventana").set_modal(True) resp = obj("ventana").run() seleccion = False if resp == 1: year, month, day = obj("calendar").get_date() fechaletra = cadenanumeros(day, 2) + " de " + \ mesesletras(month + 1) + " de " + str(year) fechamysql = str(year) + "-" + \ cadenanumeros(month + 1, 2) + "-" + cadenanumeros(day, 2) seleccion = [fechaletra, fechamysql] obj("ventana").destroy() return seleccion
def genera_comprobante_pago(datos_conexion, nro_comp): ubicacion_archivo = dialogo_guardar("Comprobante de Pago") if ubicacion_archivo is not None: # Si no tiene la terminación .pdf se le agrega if ubicacion_archivo[-4:].lower() != ".pdf": ubicacion_archivo += ".pdf" story = [] titulo = tabla_celda_titulo() texto = tabla_celda_just_izquierdo() numero = tabla_celda_just_derecho() centro = tabla_celda_centrado() tabla = Table([[ Paragraph( "<b><font size=15>Distribuidora María Auxiliadora</font></b><br/><br/>" + "<i><font size=12>Productos y Servicios S.A.</font></i><br/><br/><br/>" + "<font size=8>Caaguazú - Paraguay</font>", centro), Paragraph( "RUC:<br/><br/>" + "<b><font size=15>RECIBO DE PAGO</font></b><br/><br/>" + "<i><font size=7>Liquidación de Sueldo y Otras Remuneraciones<br/>" + "(Conforme al Art. 235 del Código Laboral)</font></i><br/><br/>" + "<b><font size=15>" + cadenanumeros(nro_comp, 7) + "</font></b>", centro), ]], [350, 150]) tabla.setStyle([ ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), # Alineación Vertical de la Tabla ('BOX', (0, 0), (-1, -1), 0.25, colors.black), # Borde Exterior de la Tabla ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), # Grilla Interior de la Tabla ]) story.append(tabla) story.append(Spacer(0, 20)) # Establece la conexión con la Base de Datos conexion = conectar(datos_conexion) cursor = consultar( conexion, "idEmpleado, NroDocumento, " + "NombreApellido, FechaInicio, FechaFin, TotalPagar", "comprobantepagos_s", " WHERE NroComprobante = " + nro_comp) datos_comp = cursor.fetchall() # Buscar otros datos del Empleado cursor = consultar(conexion, "DireccionPrincipal", "personas_s", " WHERE idPersona = " + str(datos_comp[0][0])) datos_empl = cursor.fetchall() if cursor.rowcount > 0: direccion = "" if datos_empl[0][0] is None else datos_empl[0][0] else: direccion = "" # Buscar datos de la Empresa cursor = consultar(conexion, "NroPatronalIPS, NroPatronalMJT", "empresas_s", " ORDER BY idEmpresa") datos_empr = cursor.fetchall() if cursor.rowcount > 0: ips = "" if datos_empr[0][0] is None else datos_empr[0][0] mjt = "" if datos_empr[0][1] is None else datos_empr[0][1] else: ips = mjt = "" tabla = Table( [[ Paragraph("<b>Lugar y Fecha:</b>", texto), Paragraph("Caaguazú, " + fecha_hoy(), texto), '', '' ], [ Paragraph("<b>Trabajador:</b>", texto), Paragraph(datos_comp[0][2], texto), Paragraph("<b>C.I. Nro.:</b>", texto), Paragraph(datos_comp[0][1], texto) ], [ Paragraph("<b>Dirección:</b>", texto), Paragraph(direccion, texto), '', '' ], [ Paragraph("<b>Sucursal:</b>", texto), Paragraph("Caaguazú", texto), '', '' ], [ Paragraph("<b>Periodo de Pago:</b>", texto), Paragraph( "Desde " + mysql_fecha(datos_comp[0][3]) + " hasta " + mysql_fecha(datos_comp[0][4]), texto), '', '' ], [ Paragraph("<b>Nro. Patronal:</b>", texto), Paragraph(ips + " / " + str(mjt), texto), '', '' ]], [100, 275, 50, 75]) tabla.setStyle([ ('SPAN', (1, 0), (-1, 0)), # Combina columnas, primera fila ('ALIGN', (0, 0), (0, -1), 'RIGHT'), # Alineación de la Primera Columna ('ALIGN', (1, 1), (-1, -1), 'LEFT'), # Alineación de Otras Columnas ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), # Alineación Vertical de la Tabla ('TOPPADDING', (0, 0), (-1, -1), 1), # Espacio Arriba ('BOTTOMPADDING', (0, 0), (-1, -1), 3), # Espacio Abajo ('LEFTPADDING', (0, 0), (-1, -1), 3), # Espacio a la Izquierda ('RIGHTPADDING', (0, 0), (-1, -1), 3), # Espacio a la Derecha ('SPAN', (1, 2), (-1, 2)), # Combina columnas, segunda fila ('SPAN', (1, 3), (-1, 3)), # Combina columnas, tercera fila ('SPAN', (1, 4), (-1, 4)), # Combina columnas, cuarta fila ('SPAN', (1, 5), (-1, 5)), # Combina columnas, quinta fila ]) story.append(tabla) story.append(Spacer(0, 20)) cursor = consultar(conexion, "Cantidad, Concepto, Monto", "comprobantepagos_detalles_s", " WHERE NroComprobante = " + nro_comp) datos_det = cursor.fetchall() cant = cursor.rowcount lista = [[ Paragraph("Cantidad", titulo), Paragraph("Descripción", titulo), Paragraph("Importe", titulo) ]] for i in range(0, cant): cantidad = "" if datos_det[i][0] is None else str(datos_det[i][0]) lista.append([ Paragraph(cantidad, centro), Paragraph(datos_det[i][1], texto), Paragraph(str(datos_det[i][2]), numero) ]) if cant < 16: # Completar hasta 16 casillas for i in range(cant, 16): lista.append(["", "", ""]) # Total a Pagar lista.append([ Paragraph("Total a Pagar:", numero), '', Paragraph(str(datos_comp[0][5]), numero) ]) tabla = Table(lista, [100, 300, 100]) tabla = tabla_style(tabla) tabla.setStyle([ ('SPAN', (0, -1), (-2, -1)), # Combina columnas, última fila ]) story.append(tabla) #ubicacion_archivo = path.join(path.expanduser("~"), "Desktop", "listado.pdf") doc = SimpleDocTemplate( ubicacion_archivo, pagesize=A4, # Tamaño de Página (landscape(A4) hoja horizontal) leftMargin=3 * cm, # Margen Izquierdo rightMargin=3 * cm, # Margen Derecho topMargin=2.5 * cm, # Margen Superior bottomMargin=2.5 * cm, # Margen Inferior allowSplitting=1, title="Comprobante de Pago Nro. " + cadenanumeros(nro_comp, 7), author="Sistema Distribuidora") try: # Generar Archivo doc.build(story) popen(ubicacion_archivo) except PermissionError as e: error_permiso_archivo(str(e))
def on_btn_guardar_cuota_clicked(self, objeto): fact = self.obj("txt_fact").get_text() fact = "'" + fact + "'" if self.tabla == "cuentaspagar" else fact timb = self.obj("txt_timb").get_text() if self.obj("notebook").get_current_page() == 0: ini = int( Op.nuevoid( self.datos_conexion, self.tabla + " WHERE NroTimbrado = " + timb + " AND NroFactura = " + fact, "NroCuota")) resto = float(self.obj("txt_no_asignado").get_text()) cant = float(self.obj("txt_i_00").get_text()) monto = self.obj("txt_i_02").get_text() # Si cantidad es decimal, suma uno a la cantidad de cuotas if cant > int(cant): cant = int(cant) + ini + 1 else: cant = int(cant) + ini # Valores Iniciales if self.pago == "Mensual": dia_venc = self.obj("txt_i_01_1").get_value_as_int() longitud_grilla = len(self.obj("grilla").get_model()) if longitud_grilla == 0: # Vacía fecha = date.today() else: conexion = Op.conectar(self.datos_conexion) cursor = Op.consultar( conexion, "FechaVencimiento", self.tabla, " WHERE NroTimbrado = " + timb + " AND NroFactura = " + fact + " ORDER BY NroCuota DESC") fecha = cursor.fetchall()[0][0] conexion.close() # Finaliza la conexión anho = fecha.strftime("%Y") mes = fecha.strftime("%m") dia = fecha.strftime("%d") if longitud_grilla == 0: # Vacía if dia_venc < int(dia): mes, anho = Cal.mes_mas_uno(mes, anho) else: if dia_venc <= int(dia): mes, anho = Cal.mes_mas_uno(mes, anho) dia = Op.cadenanumeros(dia_venc, 2) else: periodo = 7 if self.pago == "Semanal" else 14 anho = self.fecha_inic[0:4] mes = self.fecha_inic[5:7] dia = self.fecha_inic[8:10] # Carga de Datos for nro in range(ini, cant): if int(mes) == 2: # Años bisiestos: 1900, (2000), 2100, 2200, 2300, (2400), 2500 if int(anho) % 4 == 0: # Es Múltiplo de 4 dia_max = 29 if int(anho) % 100 == 0: # Pero NO es múltiplo de 100 if int( anho ) % 400 != 0: # Excepto si es múltiplo de 400 dia_max = 28 else: dia_max = 28 elif int(mes) in (4, 6, 9, 11): dia_max = 30 else: dia_max = 31 if self.pago == "Mensual": if int(dia) > dia_max: dia = str(dia_max) fecha = "'" + anho + "-" + mes + "-" + dia + "'" monto = str(resto) if float(monto) > resto else monto resto -= float(monto) sql = timb + ", " + fact + ", " + str( nro) + ", " + fecha + ", " + monto Op.insertar(self.conexion, self.tabla, sql) if resto > 0: # Modifica valores para proxima cuota if self.pago == "Mensual": dia = Op.cadenanumeros(int(dia_venc), 2) mes, anho = Cal.mes_mas_uno(mes, anho) else: dia = str(int(dia) + periodo) if int(dia) > dia_max: dia = str(int(dia) - dia_max) mes, anho = Cal.mes_mas_uno(mes, anho) else: nro = self.obj("txt_d_00").get_text() monto = self.obj("txt_d_02").get_text() sql = timb + ", " + fact + ", " + nro + ", '" + self.fecha_venc + "', " + monto if not self.editando_cuota: Op.insertar(self.conexion, self.tabla, sql) else: Op.modificar(self.conexion, self.tabla, self.cond_cuota + ", " + sql) self.cargar_grilla_cuotas() self.on_btn_cancelar_cuota_clicked(0)
def mes_mas_uno(mes, anho): mes = cadenanumeros(int(mes) + 1, 2) if int(mes) > 12: mes, anho = "01", str(int(anho) + 1) return mes, anho
def on_btn_guardar_descuento_clicked(self, objeto): self.guardar_principal_descuentos() desc = self.obj("txt_00").get_text() if self.obj("notebook").get_current_page() == 0: ini = int(Op.nuevoid(self.conexion, "descuentos_periodocobros" + " WHERE idDescuento = " + desc, "idCobro")) cant = self.obj("txt_i_01").get_value_as_int() monto = str(round(Decimal(self.obj("txt_i_04").get_text()), 2)) # Valores Iniciales if self.idPeriodoPago == 1: # Mensual dia_desc = self.obj("txt_i_03").get_value_as_int() longitud_grilla = len(self.obj("grilla").get_model()) if longitud_grilla == 0: # Vacía fecha = date.today() else: # Buscar la última fecha registrada cursor = Op.consultar(self.conexion, "MAX(FechaCobro)", "descuentos_periodocobros", " WHERE idDescuento = " + desc) fecha = cursor.fetchall()[0][0] anho = fecha.strftime("%Y") mes = fecha.strftime("%m") dia = fecha.strftime("%d") if longitud_grilla == 0: # Vacía if dia_desc < int(dia): # Puede cobrarse hoy mes, anho = Cal.mes_mas_uno(mes, anho) else: if dia_desc <= int(dia): mes, anho = Cal.mes_mas_uno(mes, anho) dia = Op.cadenanumeros(dia_desc, 2) else: if self.idPeriodoPago == 2: # Quincenal periodo = 14 elif self.idPeriodoPago == 3: # Semanal periodo = 7 elif self.idPeriodoPago == 4: # Diario periodo = 1 anho = self.fecha_inicial[0:4] mes = self.fecha_inicial[5:7] dia = self.fecha_inicial[8:10] # Carga de Datos for i in range(0, cant): if int(mes) == 2: # Años bisiestos: 1900, (2000), 2100, 2200, 2300, (2400), 2500 if int(anho) % 4 == 0: # Es Múltiplo de 4 dia_max = 29 if int(anho) % 100 == 0: # Pero NO es múltiplo de 100 if int(anho) % 400 != 0: # Excepto si es múltiplo de 400 dia_max = 28 else: dia_max = 28 elif int(mes) in (4, 6, 9, 11): dia_max = 30 else: dia_max = 31 if self.idPeriodoPago == 1: # Mensual if int(dia) > dia_max: dia = str(dia_max) fecha = "'" + anho + "-" + mes + "-" + dia + "'" sql = desc + ", " + str(ini) + ", " + monto + ", " + fecha Op.insertar(self.conexion, "descuentos_periodocobros", sql) ini += 1 # Modifica valores para proxima cuota if self.idPeriodoPago == 1: # Mensual dia = Op.cadenanumeros(int(dia_desc), 2) mes, anho = Cal.mes_mas_uno(mes, anho) else: dia = str(int(dia) + periodo) if int(dia) > dia_max: dia = str(int(dia) - dia_max) mes, anho = Cal.mes_mas_uno(mes, anho) else: cod = self.obj("txt_d_01").get_text() monto = self.obj("txt_d_03").get_text() sql = desc + ", " + cod + ", " + monto + ", '" + str(self.fecha) + "'" if not self.editando_descuento: Op.insertar(self.conexion, "descuentos_periodocobros", sql) else: Op.modificar(self.conexion, "descuentos_periodocobros", self.cond_descuento + ", " + sql) self.cargar_grilla_descuentos() self.on_btn_cancelar_descuento_clicked(0)