Exemplo n.º 1
0
 def __init__(self, padre):
     self.padre = padre
     arch = leerglade.leer('nav_nc_compras.glade')
     self.nav = arch.get_object
     self.nav('window1').set_title('Listado de Nota de Credito Compras')
     self.nav('window1').set_default_size(900, 600)
     self.nav('window1').set_position(1)
     self.nav('bt_nuevo').set_label('Nuevo')
     self.nav('bt_editar').set_label('Editar')
     self.nav('bt_eliminar').set_label('Eliminar')
     self.nav('bt_cerrar').set_label('Cerrar')
     self.entity = NotaCreditoCompras()
     self.tipo_facturas = TipoFacturas()
     self.detalle = DetalleNotaCreditoCompras()
     self.contactos = Contactos()
     self.articulos = Articulos()
     self.old_precio = None
     self.encabezado = False
     self.nav('window1').set_transient_for(self.padre.main('window1'))
     self.nav('window1').set_modal(True)
     self.nav('window1').set_border_width(5)
     self.nav('window1').show_all()
     arch.connect_signals(self)
     self.nav('bt_editar').set_visible(False)
     self.nav('bt_eliminar').set_visible(False)
     self.consultar()
Exemplo n.º 2
0
class RegFacturaNcCompra:
    def __init__(self, padre):
        self.padre = padre
        arch = leerglade.leer('nav_nc_compras.glade')
        self.nav = arch.get_object
        self.nav('window1').set_title('Listado de Nota de Credito Compras')
        self.nav('window1').set_default_size(900, 600)
        self.nav('window1').set_position(1)
        self.nav('bt_nuevo').set_label('Nuevo')
        self.nav('bt_editar').set_label('Editar')
        self.nav('bt_eliminar').set_label('Eliminar')
        self.nav('bt_cerrar').set_label('Cerrar')
        self.entity = NotaCreditoCompras()
        self.tipo_facturas = TipoFacturas()
        self.detalle = DetalleNotaCreditoCompras()
        self.contactos = Contactos()
        self.articulos = Articulos()
        self.old_precio = None
        self.encabezado = False
        self.nav('window1').set_transient_for(self.padre.main('window1'))
        self.nav('window1').set_modal(True)
        self.nav('window1').set_border_width(5)
        self.nav('window1').show_all()
        arch.connect_signals(self)
        self.nav('bt_editar').set_visible(False)
        self.nav('bt_eliminar').set_visible(False)
        self.consultar()


    def consultar(self, widget=None):
        self.nav('liststore1').clear()
        color = False
        for row in self.entity.compras_all(self.nav('entry1').get_text()):
            if not color:
                t_color = "#FFFFDA"
                color = True
            else:
                t_color = "#A9FFA9"
                color = False
            self.nav('liststore1').append([
                row[0], row[1], row[2], row[3],
                Format.number(row[4]), Format.number(row[5]),
                Format.number(row[6]), Format.number(row[7]), t_color
            ])

        if len(self.nav('liststore1')) == 0:
            self.nav('bt_editar').set_sensitive(False)
            self.nav('bt_eliminar').set_sensitive(False)
            self.nav('label1').set_text(' 0 Registros Encontrados')
        else:
            self.nav('bt_editar').set_sensitive(True)
            self.nav('bt_eliminar').set_sensitive(True)
            self.nav('label1').set_text(' %s Registros Encontrados' % len(self.nav('liststore1')))

        self.nav('entry1').set_text(self.nav('entry1').get_text().upper())

    def bt_nuevo_cb(self, widget):
        self.formulario()
        self.frm('entry8').set_text(self.padre.user_login.nombres_apellidos)
        self.frm('entry1').grab_focus()
        self.frm('button2').set_sensitive(False)

    def bt_editar_cb(self, widget):
        pass

    def bt_eliminar_cb(self, widget):
        pass

    def bt_cerrar_cb(self, widget):
        self.nav('window1').destroy()

    def formulario(self):
        arch = leerglade.leer('frm_nc_compra.glade')
        self.frm = arch.get_object
        self.frm('window1').set_default_size(800, 600)
        self.frm('window1').set_transient_for(self.nav('window1'))
        self.frm('window1').set_position(1)
        self.frm('window1').set_modal(True)
        self.frm('window1').set_border_width(5)
        self.frm('window1').set_title('Formulario de Nota de Credito')
        self.frm('window1').show_all()
        arch.connect_signals(self)


    def validar_entrys(self, widget=None):
        pass

    def guardar(self, widget=None):

        if len(self.frm('entry1').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Nro. Documento es Obligatorio!")
            self.frm('entry1').grab_focus()
            return
        if len(self.frm('entry2').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Fecha es Obligatorio!")
            self.frm('entry2').grab_focus()
            return
        if len(self.frm('entry3').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Tipo Factura es Obligatorio!")
            self.frm('entry3').grab_focus()
            return
        if len(self.frm('entry4').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Proveedor es Obligatorio!")
            self.frm('entry4').grab_focus()
            return
        if len(self.frm('entry7').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Timbrado es Obligatorio!")
            self.frm('entry7').grab_focus()
            return

        if len(self.frm('entry9').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Articulo es Obligatorio!")
            self.frm('entry9').grab_focus()
            return

        if len(self.frm('entry10').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Precio Costo es Obligatorio!")
            self.frm('entry10').grab_focus()
            return

        if not self.encabezado:
            self.entity.nro_notacredito = self.frm('entry1').get_text()
            self.entity.nro_timbrado = self.frm('entry7').get_text()
            self.entity.idcontacto = self.frm('entry4').get_text()
            self.entity.fecha = self.frm('entry2').get_text()
            self.entity.idtipo_factura = self.frm('entry3').get_text().split('-')[0]
            self.entity.idusuario = self.padre.user_login.idusuario

            self.entity.nro_factura = self.frm('entry13').get_text()
            self.entity.nro_timbrado_compras = self.frm('entry15').get_text()
            self.entity.idcontacto_compras = self.frm('entry4').get_text()

            if self.entity.save():
                self.desactivar_encabezado()
                self.encabezado = True
                self.consultar()

        if self.encabezado:
            cantidad = self.articulo_en_detalle(self.frm('entry9').get_text())
            if cantidad:
                cantidad += float(self.frm('entry12').get_text())
                update = self.detalle.update_cantidad(
                    cantidad, self.frm('entry1').get_text(),
                    self.frm('entry7').get_text(),
                    self.frm('entry4').get_text(),
                    self.frm('entry9').get_text()
                )
                if update:
                    self.limpiar_articulos()
                    self.refrescar_detalle()
                    self.frm('entry9').grab_focus()

                return

            self.detalle.nro_notacredito = self.frm('entry1').get_text()
            self.detalle.nro_timbrado = self.frm('entry7').get_text()
            self.detalle.idcontacto = self.frm('entry4').get_text()
            self.detalle.idarticulo = self.frm('entry9').get_text()
            self.detalle.idunidad_medida = self.frm('label8').get_text().split('-')[0]
            self.detalle.cantidad_empaque = self.frm('label8').get_text().split('-')[1]
            self.detalle.precio_costo = self.frm('entry11').get_text()
            self.detalle.iva = self.frm('label9').get_text()
            self.detalle.cantidad = self.frm('entry12').get_text()

            if self.detalle.save():
                self.refrescar_detalle()
                self.limpiar_articulos()
                self.frm('entry9').grab_focus()
                self.frm('button2').set_sensitive(True)

    def articulo_en_detalle(self, idarticulo):
        for row in self.frm('liststore1'):
            if idarticulo == row[0]:
                return float(row[2])
        return False

    def refrescar_detalle(self):
        self.frm('liststore1').clear()
        ex = 0.0
        g5 = 0.0
        g10 = 0.0
        for row in self.detalle.get_detalle(self.frm('entry1').get_text(), self.frm('entry7').get_text(),
                                            self.frm('entry4').get_text()):
            ex += row[4]
            g5 += row[5]
            g10 += row[6]
            self.frm('liststore1').append([
                str(row[0]), row[1], Format.number(row[2]), Format.number(row[3]),
                Format.number(row[4]), Format.number(row[5]),
                Format.number(row[6])
            ])

        self.frm('exentas').set_text(Format.number(ex))
        self.frm('gravada5').set_text(Format.number(g5))
        self.frm('gravada10').set_text(Format.number(g10))
        self.frm('iva5').set_text(Format.number(round(g5/21)))
        self.frm('iva10').set_text(Format.number(round(g10/11)))
        self.frm('t_iva').set_text(Format.number(round(g5/21)+round(g10/11)))
        self.frm('t_documento').set_text(Format.number(ex+g5+g10))



    def limpiar_articulos(self):
        self.frm('entry9').set_text("")
        self.frm('entry10').set_text("")
        self.frm('entry11').set_text("")
        self.frm("entry12").set_text("")
        self.frm('label8').set_text("Empaque")
        self.frm('label9').set_text("IVA")

    def desactivar_encabezado(self):
        self.frm('entry1').set_sensitive(False)
        self.frm('entry7').set_sensitive(False)
        self.frm('entry4').set_sensitive(False)
        self.frm('entry2').set_sensitive(False)
        self.frm('entry3').set_sensitive(False)
        self.frm('entry13').set_sensitive(False)
        self.frm('entry14').set_sensitive(False)
        self.frm('entry15').set_sensitive(False)

    def cancelar_cb(self, widget):
        self.encabezado = False
        self.frm('window1').destroy()
        self.consultar()

    def cargar_combos(self):
        pass
        #
        #for row in self.tipo_comprobantes.all(order_by=1, descripcion__ilike="%%"):
        #    self.frm('liststore1').append([str(row[0])+'-'+row[1]])
        #self.frm('combobox1').set_active(0)

    def set_active_combo(self, pk):
        it = 0
        for row in self.frm('liststore1'):
            if row[0].split('-')[0] == str(pk):
                self.frm('combobox1').set_active(it)
                break
            it += 1

    def buscar_fechas(self, widget, icon_pos, event):
        Calendar.Pegar(self.frm('window1'), widget)

    def buscar_referencias(self, widget, event):
        if event.keyval == 65470:
            
            if widget == self.frm('entry3'):
                data = self.tipo_facturas.all(order_by=2)
                busquedas.Buscar(self, data, widget)
            elif widget == self.frm('entry4'):
                data = self.contactos.get_all_contactos(2, "")
                busquedas.Buscar(self, data, widget, True)
            elif widget == self.frm('entry9'):
                data = self.articulos.all(order_by=3, where="habil_compras = True")
                busquedas.Buscar(self, data, widget, True, 2)
            elif widget == self.frm('entry9'):
                data = self.procedencias.all(order_by=2)
                busquedas.Buscar(self, data, widget)

    def treeview_key_press_cb(self, widget, event):
        if event.keyval == 65535:
            sl, it = self.frm('treeview1').get_selection().get_selected()
            try:
                idarticulo = sl.get_value(it, 0)
            except:
                msg.errorMsgBox(self.frm('window1'), "Sin selección", "Seleccione un registro para eliminar")
                return
            res = msg.preguntaMsgBox(self.frm('window1'), "Eliminando Registro",
                                     "Estas seguro?")
            if res == -8:
                quitar = self.detalle.quitar_detalle(
                    self.frm('entry1').get_text(),
                    self.frm('entry7').get_text(),
                    self.frm('entry4').get_text(),
                    idarticulo
                )

                self.refrescar_detalle()

    def iva_set(self, widget=None):
        try:
            cat = int(self.frm('entry8').get_text().split('-')[0])
        except:
            return
        self.categorias.find(idcategoria=cat)
        self.frm('entry13').set_text(str(self.categorias.iva))

    def cargar_proveedor(self):
        if len(self.frm('entry4').get_text()) == 0:
            return 
        
        dato = self.contactos.get_contacto(2, self.frm('entry4').get_text())
        if dato is None:
            msg.errorMsgBox(
                self.frm('window1'),
                "Contacto Inexistente",
                "Contacto inexistente o no establecido como Proveedor"
            )
            return 
        self.frm('entry5').set_text(dato[1])
        self.frm('entry6').set_text(dato[2])

    def cargar_articulos(self):
        if len(self.frm('entry9').get_text()) == 0:
            return
        dato = self.articulos.find(
            idarticulo=self.frm('entry9').get_text()
        )
        if dato[0] is None:
            msg.errorMsgBox(
                self.frm('window1'),
                "Articulo Inexistente",
                "El id ingresado no corresponde a ningún artículo registrado!"
            )
            self.frm('entry8').grab_focus()
            self.limpiar_articulos()
            return
        if not self.articulos.habil_compras:
            msg.errorMsgBox(
                self.frm('window1'),
                "Atención",
                "El articulo no está habilitado para compras."
            )
            self.limpiar_articulos()
            self.frm('entry8').grab_focus()
            return

        self.frm('entry10').set_text(self.articulos.descripcion)
        self.frm('label8').set_text(self.articulos.idunidad_medida + '-' + str(self.articulos.empaque))
        self.frm('label9').set_text(str(self.articulos.get_iva(self.articulos.idarticulo)))
        self.frm('entry11').set_text(str(self.articulos.precio_costo))
        self.frm('entry12').set_text('1')

    def set_focus(self, widget):
        if widget == self.frm('entry2'):
            widget.set_text(Format.fecha(widget.get_text()))
        if widget == self.frm('entry4'):
            self.cargar_proveedor()
        if widget == self.frm('entry1'):
            widget.set_text(Format.factura(widget.get_text()))
        if widget == self.frm('entry9'):
            self.cargar_articulos()
        widget.get_toplevel().child_focus(Gtk.DirectionType.TAB_FORWARD)

        if widget == self.frm('entry12'):
            self.guardar()

    def buscar_factura(self, widget, event):
        if event.keyval == 65470:
            busqueda_compras.Buscar(self, [self.frm('entry13'), self.frm('entry14'),
                                           self.frm('entry15'), self.frm('entry4'),
                                           self.frm('entry5'), self.frm('entry6')])
    def confirmar_cb(self, widget):
        #por el momento
        self.frm('window1').destroy()
        self.encabezado = False
        self.consultar()

    def win_delete_event(self, widget, event):
        self.encabezado = False
        self.consultar()
Exemplo n.º 3
0
class RegFacturaNcVenta:
    def __init__(self, padre):
        self.padre = padre
        arch = leerglade.leer('nav_nc_ventas.glade')
        self.nav = arch.get_object
        self.nav('window1').set_title('Listado de Nota de Credito Ventas')
        self.nav('window1').set_default_size(900, 600)
        self.nav('window1').set_position(1)
        self.nav('bt_nuevo').set_label('Nuevo')
        self.nav('bt_editar').set_label('Editar')
        self.nav('bt_eliminar').set_label('Eliminar')
        self.nav('bt_cerrar').set_label('Cerrar')
        self.entity = NotaCreditoVentas()
        self.tipo_facturas = TipoFacturas()
        self.detalle = DetalleNotaCreditoVentas()
        self.contactos = Contactos()
        self.articulos = Articulos()
        self.precios = Precios()
        self.categorias = Categorias()
        self.old_precio = None
        self.encabezado = False
        self.nav('window1').set_transient_for(self.padre.main('window1'))
        self.nav('window1').set_modal(True)
        self.nav('window1').set_border_width(5)
        self.nav('window1').show_all()
        arch.connect_signals(self)
        self.nav('bt_editar').set_visible(False)
        self.nav('bt_eliminar').set_visible(False)
        self.consultar()


    def consultar(self, widget=None):
        self.nav('liststore1').clear()
        color = False
        for row in self.entity.nc_all(self.nav('entry1').get_text()):
            if not color:
                t_color = "#FFFFDA"
                color = True
            else:
                t_color = "#A9FFA9"
                color = False
            self.nav('liststore1').append([
                row[0], row[1], row[2], row[3],
                Format.number(row[4]), Format.number(row[5]),
                Format.number(row[6]), Format.number(row[7]), t_color
            ])

        if len(self.nav('liststore1')) == 0:
            self.nav('bt_editar').set_sensitive(False)
            self.nav('bt_eliminar').set_sensitive(False)
            self.nav('label1').set_text(' 0 Registros Encontrados')
        else:
            self.nav('bt_editar').set_sensitive(True)
            self.nav('bt_eliminar').set_sensitive(True)
            self.nav('label1').set_text(' %s Registros Encontrados' % len(self.nav('liststore1')))

        self.nav('entry1').set_text(self.nav('entry1').get_text().upper())

    def bt_nuevo_cb(self, widget):
        self.encabezado = False
        fac = self.entity.get_new(
            self.padre.tim_nc_ventas,
            self.padre.establecimiento,
            self.padre.idpunto_expedicion
        )

        if str(fac[0]) == '1':
            fac = (self.padre.num_ini_nc_ventas,)

        if int(fac[0]) > self.padre.num_fin_nc_ventas:
            msg.errorMsgBox(self.nav('window1'), "Numero Maximo Alcanzado",
                            "Se ha superado la cantidad de numeros permitidos en el timbrado actual, avise al CONTADOR!")
            return

        est = '{:0>3}'.format(str(self.padre.establecimiento))
        pex = '{:0>3}'.format(str(self.padre.idpunto_expedicion))
        num = '{:0>7}'.format(str(fac[0]))
        factura = "%s-%s-%s" % (est, pex, num)

        self.formulario()
        self.frm('entry1').set_text(factura)
        self.frm('entry8').set_text(self.padre.user_login.nombres_apellidos)
        self.frm('entry7').set_text(str(self.padre.tim_nc_ventas))
        self.frm('entry2').set_text(datetime.now().strftime('%d/%m/%Y'))
        self.frm('entry3').grab_focus()
        self.frm('button2').set_sensitive(False)

    def bt_editar_cb(self, widget):
        pass

    def bt_eliminar_cb(self, widget):
        pass

    def bt_cerrar_cb(self, widget):
        self.nav('window1').destroy()

    def formulario(self):
        arch = leerglade.leer('frm_nc_ventas.glade')
        self.frm = arch.get_object
        self.frm('window1').set_default_size(800, 600)
        self.frm('window1').set_transient_for(self.nav('window1'))
        self.frm('window1').set_position(1)
        self.frm('window1').set_modal(True)
        self.frm('window1').set_border_width(5)
        self.frm('window1').set_title('Formulario de Nota de Credito')
        self.frm('window1').show_all()
        arch.connect_signals(self)


    def validar_entrys(self, widget=None):
        pass

    def guardar(self, widget=None):

        if len(self.frm('entry1').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Nro. Documento es Obligatorio!")
            self.frm('entry1').grab_focus()
            return
        if len(self.frm('entry2').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Fecha es Obligatorio!")
            self.frm('entry2').grab_focus()
            return
        if len(self.frm('entry3').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Tipo Factura es Obligatorio!")
            self.frm('entry3').grab_focus()
            return
        if len(self.frm('entry4').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Cliente es Obligatorio!")
            self.frm('entry4').grab_focus()
            return
        if len(self.frm('entry7').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Timbrado es Obligatorio!")
            self.frm('entry7').grab_focus()
            return

        if len(self.frm('entry9').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Articulo es Obligatorio!")
            self.frm('entry9').grab_focus()
            return

        if len(self.frm('entry10').get_text()) == 0:
            msg.errorMsgBox(self.frm('window1'), "Campo Obligatorio",
                            "El campo Precio Costo es Obligatorio!")
            self.frm('entry10').grab_focus()
            return

        if not self.encabezado:
            self.entity.nro_nota = self.frm('entry1').get_text().split('-')[2]
            self.entity.idpunto_expedicion = self.padre.idpunto_expedicion
            self.entity.idestablecimiento = self.padre.establecimiento
            self.entity.nro_timbrado = self.frm('entry7').get_text()
            self.entity.idtipo_factura = self.frm('entry3').get_text().split('-')[0]
            self.entity.fecha = self.frm('entry2').get_text()
            self.entity.idcontacto = self.frm('entry4').get_text()
            self.entity.idusuario = self.padre.user_login.idusuario
            self.entity.nro_factura_venta = self.frm('entry13').get_text().split('-')[2]
            self.entity.idpunto_expedicion_venta = self.frm('entry13').get_text().split('-')[1]
            self.entity.idestablecimiento_venta = self.frm('entry13').get_text().split('-')[0]
            self.entity.nro_timbrado_venta = self.frm('entry15').get_text()

            if self.entity.save():
                self.desactivar_encabezado()
                self.encabezado = True
                self.consultar()

        if self.encabezado:
            nro_factura = self.frm('entry1').get_text().split('-')[2]
            cantidad = self.articulo_en_detalle(self.frm('entry9').get_text())
            if cantidad:
                cantidad += float(self.frm('entry12').get_text())
                update = self.detalle.update_cantidad(
                    cantidad, nro_factura,
                    self.frm('entry7').get_text(),
                    self.padre.establecimiento,
                    self.padre.idpunto_expedicion,
                    self.frm('entry9').get_text()
                )
                if update:
                    self.limpiar_articulos()
                    self.refrescar_detalle()
                    self.frm('entry9').grab_focus()

                return

            self.detalle.nro_nota = self.frm('entry1').get_text().split('-')[2]
            self.detalle.nro_timbrado = self.frm('entry7').get_text()
            self.detalle.idpunto_expedicion = self.padre.idpunto_expedicion
            self.detalle.idestablecimiento = self.padre.establecimiento
            self.detalle.idarticulo = self.frm('entry9').get_text()
            self.detalle.idunidad_medida = self.frm('label8').get_text().split('-')[0]
            self.detalle.canidad_empaque = self.frm('label8').get_text().split('-')[1]
            self.detalle.precio_venta = self.frm('entry11').get_text()
            self.detalle.iva = self.frm('label9').get_text()
            self.detalle.cantidad = self.frm('entry12').get_text()
            actualizar = self.detalle.save()
            print actualizar
            if actualizar:
                self.refrescar_detalle()
                self.limpiar_articulos()
                self.frm('entry9').grab_focus()
                self.frm('button2').set_sensitive(True)

    def articulo_en_detalle(self, idarticulo):
        for row in self.frm('liststore1'):
            if idarticulo == row[0]:
                return float(row[2])
        return False

    def refrescar_detalle(self):
        self.frm('liststore1').clear()
        ex = 0.0
        g5 = 0.0
        g10 = 0.0
        nro_factura = self.frm('entry1').get_text().split('-')[2]
        for row in self.detalle.get_detalle(nro_factura, self.frm('entry7').get_text(),
                                            self.padre.idpunto_expedicion,
                                            self.padre.establecimiento):
            ex += row[4]
            g5 += row[5]
            g10 += row[6]
            self.frm('liststore1').append([
                str(row[0]), row[1], Format.number(row[2]), Format.number(row[3]),
                Format.number(row[4]), Format.number(row[5]),
                Format.number(row[6])
            ])

        self.frm('exentas').set_text(Format.number(ex))
        self.frm('gravada5').set_text(Format.number(g5))
        self.frm('gravada10').set_text(Format.number(g10))
        self.frm('iva5').set_text(Format.number(round(g5/21)))
        self.frm('iva10').set_text(Format.number(round(g10/11)))
        self.frm('t_iva').set_text(Format.number(round(g5/21)+round(g10/11)))
        self.frm('t_documento').set_text(Format.number(ex+g5+g10))

    def limpiar_articulos(self):
        self.frm('entry9').set_text("")
        self.frm('entry10').set_text("")
        self.frm('entry11').set_text("")
        self.frm("entry12").set_text("")
        self.frm('label8').set_text("Empaque")
        self.frm('label9').set_text("IVA")

    def desactivar_encabezado(self):
        self.frm('entry1').set_sensitive(False)
        self.frm('entry7').set_sensitive(False)
        self.frm('entry4').set_sensitive(False)
        self.frm('entry2').set_sensitive(False)
        self.frm('entry3').set_sensitive(False)
        self.frm('entry13').set_sensitive(False)
        self.frm('entry14').set_sensitive(False)
        self.frm('entry15').set_sensitive(False)

    def cancelar_cb(self, widget):
        self.encabezado = False
        self.frm('window1').destroy()
        self.consultar()

    def cargar_combos(self):
        pass
        #
        #for row in self.tipo_comprobantes.all(order_by=1, descripcion__ilike="%%"):
        #    self.frm('liststore1').append([str(row[0])+'-'+row[1]])
        #self.frm('combobox1').set_active(0)

    def set_active_combo(self, pk):
        it = 0
        for row in self.frm('liststore1'):
            if row[0].split('-')[0] == str(pk):
                self.frm('combobox1').set_active(it)
                break
            it += 1

    def buscar_fechas(self, widget, icon_pos, event):
        Calendar.Pegar(self.frm('window1'), widget)

    def buscar_referencias(self, widget, event):
        if event.keyval == 65470:
            
            if widget == self.frm('entry3'):
                data = self.tipo_facturas.all(order_by=2)
                busquedas.Buscar(self, data, widget)
            elif widget == self.frm('entry4'):
                data = self.contactos.get_all_contactos(1, "")
                busquedas.Buscar(self, data, widget, True)
            elif widget == self.frm('entry9'):
                data = self.articulos.all(order_by=3, where="habil_ventas = True")
                busquedas.Buscar(self, data, widget, True, 2)

    def treeview_key_press_cb(self, widget, event):
        if event.keyval == 65535:
            sl, it = self.frm('treeview1').get_selection().get_selected()
            try:
                idarticulo = sl.get_value(it, 0)
            except:
                msg.errorMsgBox(self.frm('window1'), "Sin selección", "Seleccione un registro para eliminar")
                return
            res = msg.preguntaMsgBox(self.frm('window1'), "Eliminando Registro",
                                     "Estas seguro?")
            if res == -8:
                nro_factura = self.frm('entry1').get_text().split('-')[2]
                quitar = self.detalle.quitar_detalle(
                    nro_factura,
                    self.frm('entry7').get_text(),
                    self.padre.establecimiento,
                    self.padre.idpunto_expedicion,
                    idarticulo
                )

                self.refrescar_detalle()

    def iva_set(self, widget=None):
        try:
            cat = int(self.frm('entry8').get_text().split('-')[0])
        except:
            return
        self.categorias.find(idcategoria=cat)
        self.frm('entry13').set_text(str(self.categorias.iva))

    def cargar_proveedor(self):
        if len(self.frm('entry4').get_text()) == 0:
            return 
        
        dato = self.contactos.get_contacto(1, self.frm('entry4').get_text())
        if dato is None:
            msg.errorMsgBox(
                self.frm('window1'),
                "Contacto Inexistente",
                "Contacto inexistente o no establecido como Cliente"
            )
            return 
        self.frm('entry5').set_text(dato[1])
        self.frm('entry6').set_text(dato[2])

    def cargar_articulos(self):
        if len(self.frm('entry9').get_text()) == 0:
            return
        try:
            dato = self.articulos.find(
                idarticulo=self.frm('entry9').get_text()
            )
        except:
            msg.errorMsgBox(
                self.frm('window1'),
                "Articulo Inexistente",
                "El id ingresado no corresponde a ningún artículo registrado!"
            )
            return
        if dato[0] is None:
            msg.errorMsgBox(
                self.frm('window1'),
                "Articulo Inexistente",
                "El id ingresado no corresponde a ningún artículo registrado!"
            )
            self.frm('entry8').grab_focus()
            self.limpiar_articulos()
            return
        if not self.articulos.habil_ventas:
            msg.errorMsgBox(
                self.frm('window1'),
                "Atención",
                "El articulo no está habilitado para ventas."
            )
            self.limpiar_articulos()
            self.frm('entry8').grab_focus()
            return

        self.frm('entry10').set_text(self.articulos.descripcion)
        precios = self.precios.all(where = "idarticulo=%s and vigente = True"%self.articulos.idarticulo)
        if len(precios) > 1:
            busquedas.Buscar(self, precios,
                             [self.frm('entry11'), self.frm('label8')], None, 1, True)
        else:
            self.frm('entry11').set_text(str(precios[0][5]))
            self.frm('label8').set_text(precios[0][3] + '-' + str(precios[0][4]))
        self.frm('label9').set_text(str(self.articulos.get_iva(self.articulos.idarticulo)))

        self.frm('entry12').set_text('1')

    def set_focus(self, widget):
        if widget == self.frm('entry2'):
            widget.set_text(Format.fecha(widget.get_text()))
        if widget == self.frm('entry4'):
            self.cargar_proveedor()
        if widget == self.frm('entry1'):
            widget.set_text(Format.factura(widget.get_text()))
        if widget == self.frm('entry9'):
            self.cargar_articulos()
        widget.get_toplevel().child_focus(Gtk.DirectionType.TAB_FORWARD)

        if widget == self.frm('entry12'):
            self.guardar()

    def buscar_factura(self, widget, event):
        if event.keyval == 65470:
            busqueda_ventas.Buscar(self, [self.frm('entry13'), self.frm('entry14'),
                                           self.frm('entry15'), self.frm('entry4'),
                                           self.frm('entry5'), self.frm('entry6')])

    def confirmar_cb(self, widget):
        self.imprimir()
        self.frm('window1').destroy()
        self.encabezado = False
        self.consultar()

    def win_delete_event(self, widget, event):
        self.encabezado = False
        self.consultar()


    def pdf(self, filename):
        #impresión de la factura
        f =  file(os.path.join('reportes', 'factura_venta.pdf'), 'wb')
        pisa.CreatePDF(filename, f)

        file.close(f)
        if sys.platform == 'win32':
            os.startfile(os.path.join('reportes', 'factura_venta.pdf'))
        else:
            os.system('evince reportes/factura_venta.pdf')

    def detalle_html(self):
        html = ""
        for row in self.frm('liststore1'):
            html += """
                <tr>
                    <td class = "row-codigo">%s</td>
                    <td class = "row-cantidad">%s</td>
                    <td widht = "300px" class = "row-descrip">%s</td>
                    <td class = "row-precio">%s</td>
                    <td class = "totales">%s</td>
                    <td class = "totales">%s</td>
                    <td class = "totales">%s</td>
                </tr>
            """ % (row[0], row[2], row[1],
            row[3], row[4], row[5], row[6])

        t_rows = 12
        if len(self.frm('liststore1')) < t_rows:
            for i in range(len(self.frm('liststore1')), t_rows):
                html += """<tr>
                            <td class = "row-codigo">&nbsp;</td>
                            <td class = "row-cantidad">&nbsp;</td>
                            <td widht = "300px" class = "row-descrip">&nbsp;</td>
                            <td class = "row-precio">&nbsp;</td>
                            <td class = "totales">&nbsp;</td>
                            <td class = "totales">&nbsp;</td>
                            <td class = "totales">&nbsp;</td>
                        </tr>
                    """
        return html

    def total_html(self):
        html = """
                <td class = "totales-totales">%s</td>
                <td class = "totales-totales">%s</td>
                <td class = "totales-totales">%s</td>
                <tr>
                    <td colspan = "5" class = "total-apagar">TOTAL A PAGAR: %s</td>
                    <td colspan = "2" class = "total-general">%s</td>
                </tr>
                <table class = "box-liquid">
                    <td class = "liquid">LIQUIDACION DEL IVA(5): %s</td>
                    <td class = "liquid">IVA 10: %s</td>
                    <td class = "liquid">TOTAL IVA: %s</td>
                </table>
        """%(self.frm('exentas').get_text(), self.frm('gravada5').get_text(), self.frm('gravada10').get_text(),
        num_to_text.to_word(int(self.frm('t_documento').get_text().replace(',', ''))), self.frm('t_documento').get_text(),
        self.frm('iva5').get_text(), self.frm('iva10').get_text(), self.frm('t_iva').get_text())

        return html

    def imprimir(self):
        contado = ' '
        credito = ' '
        if self.frm('entry3').get_text().split('-')[0] == '1':
            contado = 'x'
            credito = ' '
        else:
            credito = 'x'
            contado = ' '
        html = """
        <html>
            <head>
            <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
            <title>Factura Ventas</title></head>
            <style>
                @page {
                     size: legal;
                     margin: 0.5cm;
                    }
                .empresa{
                    padding-top: 3px;
                    border: 0.5px solid black;
                    padding-left: 2px;

                }
                .numero{
                    padding-top: 3px;
                    border: 0.5px solid black;
                    width: 250px;
                    padding-left: 2px;
                    padding-right: 2px;
                    background-color: #FFFFFF;

                }
                .datos{
                    border: 0.5px solid black;
                    padding-top: 3px;
                    padding-left: 2px;
                    padding-right: 2px;
                }

                .detalle{
                    margin-top: 10px;
                    padding-top: 3px;
                    padding-left: 2px;
                    padding-right: 2px;
                }

                .codigo{
                    border: 0.5px solid black;
                }
                .descripcion{
                    border: 0.5px solid black;
                    width: 300px;
                    text-align: center;
                }
                .cantidad{
                    border: 0.5px solid black;
                    text-align: right;

                }
                .precio{
                    border: 0.5px solid black;
                    text-align: center;
                }

                .exentas{
                    border: 0.5px solid black;
                    text-align: center;
                }
                .porcc{
                    border: 0.5px solid black;
                    text-align: center;
                }
                .porcd{
                    border: 0.5px solid black;
                    text-align: center;
                }

                .fecha{
                    text-align: left;
                }
                .condicion{
                    text-align: right;
                }

                .textbold{
                    font-weight: bold;
                }

                .str-empresa{
                    font-weight: bold;
                    font: 16px;
                    text-align: center;
                    color: #1A1A1A;
                }
                .str-actividad{
                    font-weight: bold;
                    font: 14px;
                    text-align: center;
                    color: #1A1A1A;
                }

                .header-detalle{
                    background-color: #FFFFFF;
                }

               .row-codigo{
                    text-align: right;
                    border-left: 0.5px solid black;
                    border-right: 0.5px solid black;
                }

                .row-cantidad{
                    text-align: right;
                    border-right: 0.5px solid black;
                }

               .row-descrip{
                    border-right: 0.5px solid black;
                }
               .row-precio{
                    text-align: right;
                    border-right: 0.5px solid black;
                }
               .totales{
                    text-align: right;
                    border-right: 0.5px solid black;
                }
               .sub-totales{
                    border-top: 0.5px solid black;
                    border-bottom: 0.5px solid black;
                    border-left: 0.5px solid black;
                    border-right: 0.5px solid black;
                    font-weight: bold;
               }
               .totales-totales{
                    text-align: right;
                    border-right: 0.5px solid black;
                    font-weight: bold;
                    border-top: 0.5px solid black;
                    border-bottom: 0.5px solid black;
                }

                .total-apagar{
                   font-weight: bold;
                   border-bottom: 0.5px solid black;
                   border-left: 0.5px solid black;
                   border-right: 0.5px solid black;
                }

                .total-general{
                    font-weight: bold;
                   border-bottom: 0.5px solid black;
                   border-right: 0.5px solid black;
                   text-align: right;
                   font-size: 11px;
                }

                .liquid{
                   font-weight: bold;
                   border-bottom: 0.5px solid black;
                }
                .box-liquid{
                   border-left: 0.5px solid black;
                   border-right: 0.5px solid black;
                   padding-top: 3px;
                   padding-left: 2px;
                   padding-right: 2px;
                }
            </style>
            <body>

                <table>
                    <tr>
                        <td class = "empresa">
                            <table>
                                <tr>
                                    <td colspan = "2" class = "str-empresa"><i>%s</i></td>
                                </tr>
                                <tr>
                                    <td colspan = "2" class = "str-actividad"><i>%s</i></td>
                                </tr>
                                <tr>
                                    <td class = "fecha"><span class = "textbold">Direccion: </span>%s</td>
                                    <td class = "condicion" style = "{padding-right: 2px; width: 150px;}">
                                        <span class = "textbold">Telefono: </span> %s
                                    </td>
                                </tr>
                                <tr>
                                    <td class = "fecha"><span class = "textbold">Ciudad: </span>%s</td>
                                    <td class = "condicion" style = "{padding-right: 2px; width: 150px;}">
                                        <span class = "textbold">Barrio: </span> %s
                                    </td>
                                </tr>
                            </table>
                        </td>
                        <td class = "numero">
                                <table>
                                    <tr>
                                        <td style = "{text-align: center; font-size: 10px}">
                                            Timbrado Nro: %s
                                        </td>
                                    </tr>
                                    <tr>
                                        <td style = "{text-align: center; font-size: 10px}">
                                            Validez: %s
                                        </td>
                                    </tr>
                                    <tr>
                                        <td style = "{text-align: center; font-size: 12px}">
                                            RUC: %s
                                        </td>
                                    </tr>
                                    <tr>
                                        <td style = "{text-align: center; font-weight: bold; font-size: 17px}">
                                            NOTA DE CREDITO
                                        </td>
                                    </tr>
                                    <tr>
                                        <td style = "{text-align: center; font-size: 14px}">
                                            NRO.: <span style = '{color: #E60000;}'>%s</span>
                                        </td>
                                    </tr>
                                </table>
                        </td>
                    </tr>
                </table>
                <table style = "{margin-top: 5px;}">
                    <tr>
                        <td class = "datos">
                            <table>
                                <tr>
                                    <td class  = "fecha"> <span class = "textbold">Fecha de emision: </span> %s </td>
                                    <td class  = "condicion"><span class = "textbold">Condicion de Venta: Contado(%s) Credito (%s)</span></td>
                                </tr>
                                <tr>
                                    <td class  = "fecha"> <span class = "textbold">Nombre o Razon Social: </span> %s </td>
                                    <td class  = "condicion"> <span class = "textbold">RUC/C.I.Nro.: </span> %s</td>
                                </tr>
                                <tr>
                                    <td class  = "fecha"> <span class = "textbold">Direccion: </span>%s</td>
                                    <td class  = "condicion"> <span class = "textbold">Telefono: </span> %s</td>
                                </tr>
                                <tr>
                                    <td class  = "fecha"> <span class = "textbold">Factura Venta Número: </span>%s</td>
                                    <td class  = "condicion">&nbsp;</td>
                                </tr>
                            </table>

                        </td>
                    </tr>
                 </table>

                <table class = "detalle">
                    <tr class = 'header-detalle'>
                        <td class = "codigo">Art./Codigo </td>
                        <td class = "cantidad">Cantidad </td>
                        <td class = "descripcion">Descripcion </td>
                        <td class = "precio">Precio Unit. </td>
                        <td class = "exentas">Exentas </td>
                        <td class = "porcc">Gravada 5 </td>
                        <td class = "porcd">Gravada 10</td>
                    </tr>
                    %s
                    <tr>
                        <td colspan = "4" class = "sub-totales">SUBTOTALES</td>
                        %s
                    </tr>
                </table>
            </body>
        </html>

        """ % (self.padre.main('label1').get_text(),
             self.padre.main('label4').get_text(),
             'Avda Principal Caaguazu', '0522-42001',
             'Caaguazu - Paraguay', 'Centro',
             self.frm('entry7').get_text(),
             self.padre.tim_nc_validez,
             self.padre.main('label3').get_text(),
             self.frm('entry1').get_text(), self.frm('entry2').get_text(),
             contado, credito, self.frm('entry5').get_text(),
             self.frm('entry6').get_text(), '', '',
             self.frm('entry13').get_text(), self.detalle_html(), self.total_html())
        self.pdf(html)