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()
예제 #2
0
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
예제 #3
0
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()
예제 #5
0
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
예제 #6
0
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))
예제 #7
0
    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)
예제 #8
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
예제 #9
0
    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)