示例#1
0
def get_margen(tipo):
    config_model = DataModel('Configuracion')
    margen = config_model.get_records(parametro = tipo)
    if len(margen) > 0:
        for item in margen:
            return item
    return None
示例#2
0
 def _load_proveedor_combobox(self):
     model = DataModel('Proveedor')
     proveedores = model.get_records()
     combo_model = gtk.ListStore(int, str)
     for row in proveedores:
         combo_model.append([int(row['id']), row['nombre']])
     self.proveedor.set_model(combo_model)
     self.proveedor.show()
示例#3
0
 def __init__(self, main):
     super(VentasFactory, self).__init__()
     self.main = main
     self.builder = gtk.Builder()
     self.builder.add_from_file("ventas_frame.glade")
     self.builder.connect_signals(self)
     content = self.builder.get_object("vbox_content")
     content.reparent(self)
     content.show()
     self.form_builder = FormBuilder(self.builder, 'Producto')
     self.producto_model = self.form_builder.get_model()
     self.venta_model = DataModel('Venta')
     self.venta_detalle_model = DataModel('VentaDetalle')
     self.ventas_grid = self.builder.get_object('ventas_grid')
     self._load_ventas_grid()
     self.form_builder.load_widget_value('fecha_hora_label', 
         datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
     self.idevent = gobject.timeout_add(1000, self._update_fecha_hora)
示例#4
0
 def __run_reporte(self):
     model_producto = DataModel('Producto')
     model_proveedor = DataModel('Proveedor')
     if self.__agotados:
         productos = model_producto.get_records_from_query('SELECT * FROM Producto WHERE existencia <= 0 ORDER BY nombre ASC')
     else:
         productos = model_producto.get_records(order='nombre ASC')
     c = canvas.Canvas('ReporteProductos.pdf', pagesize=landscape(letter))
     self.__add_page_header(c)
     total = 0
     if len(productos) > 0:
         y = 490
         for producto in productos:
             c.drawString(20, y, str(producto['id']))
             nombre = producto['nombre'] if len(producto['nombre']) <= 20 else producto['nombre'][:19]
             c.drawRightString(270, y, nombre)
             proveedor = model_proveedor.get_record(producto['proveedor'])
             if proveedor:
                 prov_nombre = proveedor['nombre'] if len(proveedor['nombre']) <= 20 else proveedor['nombre'][:19]
                 c.drawRightString(460, y, prov_nombre)
             try:
                 c.drawRightString(550, y, '{:20,.2f}'.format(float(producto['precio_compra'])))
                 c.drawRightString(660, y, '{:20,.2f}'.format(float(producto['precio_venta'])))
                 c.drawRightString(760, y, str(producto['existencia']))
             except:
                 pass
             y -= 20
             if y <= 80:
                 self.__add_page_footer(c)
                 y = 490
                 c.showPage()
                 self.__add_page_header(c)
             total += 1
     c.drawRightString(650, 60, 'T O T A L   D E   P R O D U C T O S:   ' + str(total))
     self.__add_page_footer(c)
     c.showPage()
     c.save()
     reader = get_pdf_reader()
     if reader and reader['valor'] != '':
         subprocess.Popen([reader['valor'], "ReporteProductos.pdf"])
示例#5
0
 def __init__(self, table_name, on_value_selected, search_fields={}, display_fields=[]):
     self.on_value_selected = on_value_selected
     self.model = DataModel(table_name)
     builder = gtk.Builder()
     builder.add_from_file("busqueda.glade")
     builder.connect_signals(self)
     self.window = builder.get_object("window1")
     self._search_fields = search_fields
     self.search_entry = builder.get_object("search_entry")
     self.tree = builder.get_object("treeview1")
     self.combo = builder.get_object("search_fields_combo")
     self._load_search_fields()
     self._build_treeview(display_fields)
     self.window.show()
示例#6
0
 def __init__(self, main):
     super(ConfiguracionesFactory, self).__init__()
     self.main = main
     builder = gtk.Builder()
     builder.add_from_file("config_frame.glade")
     self.content = builder.get_object("vbox_content")
     self.entry = builder.get_object("pdf_entry")
     self.entry_margen_superior = builder.get_object("margen_superior")
     self.entry_margen_izquierdo = builder.get_object("margen_izquierdo")
     builder.connect_signals(self)
     self.content.reparent(self)
     self.content.show()
     self.config_model = DataModel('Configuracion')
     reader = get_pdf_reader()
     self.entry.set_text(reader['valor'])
     self.__record_id = reader['id']
     self.margen_izquierdo =  get_margen('margen_izquierdo')
     self.margen_superior = get_margen('margen_superior')
     if self.margen_superior is not None:
         self.entry_margen_superior.set_text(str(self.margen_superior['valor']).strip())
     if self.margen_izquierdo is not None:
         self.entry_margen_izquierdo.set_text(str(self.margen_izquierdo['valor']).strip())
示例#7
0
class VentasFactory(gtk.Frame):
    
    __id_venta = 0

    def __init__(self, main):
        super(VentasFactory, self).__init__()
        self.main = main
        self.builder = gtk.Builder()
        self.builder.add_from_file("ventas_frame.glade")
        self.builder.connect_signals(self)
        content = self.builder.get_object("vbox_content")
        content.reparent(self)
        content.show()
        self.form_builder = FormBuilder(self.builder, 'Producto')
        self.producto_model = self.form_builder.get_model()
        self.venta_model = DataModel('Venta')
        self.venta_detalle_model = DataModel('VentaDetalle')
        self.ventas_grid = self.builder.get_object('ventas_grid')
        self._load_ventas_grid()
        self.form_builder.load_widget_value('fecha_hora_label', 
            datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
        self.idevent = gobject.timeout_add(1000, self._update_fecha_hora)

    def on_buscar_producto_button_clicked(self, widget):
        if self.__id_venta != 0:
            self._show_error_message('Esta visualizando el detalle de una venta realizada, de click en el boton nuevo para realizar una nueva venta')
            return
        busqueda = BusquedaWindow('Producto', self._load_producto,
            search_fields={'id': 'match', 'nombre': 'like'},
            display_fields=['id', 'nombre', 'precio_venta', 'existencia'])

    def on_buscar_button_clicked(self, widget):
        busqueda = BusquedaWindow('Venta', self._load_venta,
            search_fields={'id': 'match', 'fecha_sistema': 'match'},
            display_fields=['id', 'fecha_sistema', 'sub_total', 'impuesto', 'total'])


    def on_agregar_button_clicked(self, widget):
        if self.__id_venta != 0:
            self._show_error_message('Esta visualizando el detalle de una venta realizada, de click en el boton nuevo para realizar una nueva venta')
            return
        id_producto = self.form_builder.get_widget_value('id_producto')
        if id_producto == '' or id_producto == '0':
            self._show_error_message('Escriba un código de producto valido')
            return
        nombre_producto = self.form_builder.get_widget_value('nombre_producto')
        if nombre_producto.strip() == '':
            self._show_error_message('Escriba una descripción del producto')
            return
        precio_producto = self.form_builder.get_widget_value('precio_producto')
        try:
            precio_producto = Decimal(precio_producto)
            if precio_producto < 0:
                raise NameError('Precio no valido')
        except:
            self._show_error_message('Escriba un precio valido')
            return
        cantidad_producto = self.form_builder.get_widget_value('cantidad_producto')
        try:
            cantidad_producto = int(cantidad_producto)
            if cantidad_producto == 0:
                raise NameError('Cantidad no valida')
        except:
            self._show_error_message('Escriba una cantidad valida')
            return
        append = True
        producto = self.producto_model.get_record(id_producto)
        if producto:
            if producto['existencia'] < cantidad_producto:
                self._show_error_message('No existe la cantidad necesaria del producto en inventario')
                return
            for row in self.ventas_grid_model:
                if row[0] == id_producto:
                    row[2] = int(row[2]) + cantidad_producto
                    row[4] = str(round(int(row[2]) * Decimal(row[3]), 2))
                    append = False
                    break
            if append:
                self.ventas_grid_model.append([str(id_producto), nombre_producto,
                    str(cantidad_producto), str(round(precio_producto, 2)), 
                        str(round(cantidad_producto * precio_producto, 2))])
            self._clear_producto(True)
            self._ensure_ventas_grid()
            self._calcular_totales()
            gobject.source_remove(self.idevent)
        else:
            self._show_error_message('El codigo de producto no existe')

    def on_eliminar_butto_clicked(self, widget):
        if self.__id_venta != 0:
            self._show_error_message('Esta visualizando el detalle de una venta realizada, de click en el boton nuevo para realizar una nueva venta')
            return
        selection = self.ventas_grid.get_selection()
        model, treeiter = selection.get_selection_selected()
        if treeiter:
            del model[treeiter]
            self._ensure_ventas_grid()
            self._calcular_totales()

    def on_iva_check_toggled(self, widget):
        self._calcular_totales()

    def _load_producto(self, value):
        self.form_builder.load_widget_value('id_producto', value)

    def id_producto_key_release_event_cb(self, widget, ev, data=None):
        if ev.keyval == 65293:
            producto_id = widget.get_text()
            producto = self.producto_model.get_record(producto_id)
            self._clear_producto()
            if producto:
                self._load_producto_information(producto)

    def on_nuevo_button_clicked(self, widget):
        self.__id_venta = 0
        self._clear_producto(True)
        self._clear_venta()
        self.ventas_grid_model.clear()
        self._ensure_ventas_grid()
        self._update_fecha_hora()

    def on_guardar_button_clicked(self, widget, upsert=False):
        total = self.form_builder.get_widget_value('total_label').replace(',', '').strip()
        cambio = 0
        pago_recibido = self.form_builder.get_widget_value('pago_recibido').replace(',', '').strip()
        try:
            pago_recibido = float(pago_recibido)
            total_numero = float(total)
            if pago_recibido <= 0 or pago_recibido < total_numero:
                raise NameError('Cantidad no valida')
            else:
                cambio = pago_recibido - total_numero
        except:
            self._show_error_message('La cantidad recibida de pago no es valida')
            return
        if self.__id_venta == 0:
            if self._show_save_continue() != -9:
                fecha_hora = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
                fecha_sistema = datetime.datetime.now().strftime("%Y/%m/%d")
                sub_total = self.form_builder.get_widget_value('subtotal_label').replace(',', '')
                impuesto = self.form_builder.get_widget_value('iva_label').replace(',', '')
                id_venta = self.venta_model.create_record({'fecha_hora': fecha_hora, 'sub_total': sub_total,
                    'impuesto': impuesto, 'total': total, 'fecha_sistema': fecha_sistema, 
                    'pago_recibido': str(pago_recibido).strip(), 
                    'cambio': str(cambio).strip()})
                if id_venta:
                    for row in self.ventas_grid_model:
                        producto = self.producto_model.get_record(row[0])
                        if producto:
                            self.venta_detalle_model.create_record({'venta_id': str(id_venta), 'producto_id': row[0].strip(),
                                'producto_precio': row[3].strip(), 'producto_cantidad': row[2].strip(),
                                'subtotal': row[4].strip(), 'nombre': row[1].strip()})
                            self.producto_model.update_record({
                                    'existencia': str(self.normalizar_existencia(producto['existencia']) - int(row[2].strip()))}, 
                                row[0].strip())
                self._show_error_message('El cambio es de %s' % '{:20,.2f}'.format(float(cambio)))
                if not upsert:
                    self._clear_producto(True)
                    self._clear_venta()
                    self.ventas_grid_model.clear()
                    self._ensure_ventas_grid()
                    self.idevent = gobject.timeout_add(1000, self._update_fecha_hora)
                else:
                    return id_venta
            else:
                return 0
        else:
            self._show_error_message('Esta visualizando el detalle de una venta realizada, de click en el boton nuevo para realizar una nueva venta')

    def on_cancelar_button_clicked(self, widget):
        page = self.parent.get_current_page()
        self.parent.remove_page(page)
        del self.main.pages[page]

    def on_imprimir_ticket_button_clicked(self, widget):
        if self.__id_venta == 0:
            self.__id_venta = self.on_guardar_button_clicked(widget, True)
        ticket = Ticket(self.__id_venta)
        if not ticket.imprimir():
            self._show_error_message('No se pudo imprimir ticket, asegurese de que la venta exista')

    def _calcular_totales(self):
        subtotal = 0.00
        impuesto = 0.00
        total = 0.00
        for row in self.ventas_grid_model:
            precio = Decimal(row[3]) * int(row[2])
            subtotal += round(precio, 2)
        if self.form_builder.get_widget_value('iva_check'):
            impuesto = round(subtotal * 0.16, 2)
            self.form_builder.load_widget_value('iva_label', '{:20,.2f}'.format(impuesto))
        else:
            self.form_builder.load_widget_value('iva_label', '0.00')
        total = round(subtotal + impuesto, 2)
        self.form_builder.load_widget_value('subtotal_label', '{:20,.2f}'.format(subtotal))
        self.form_builder.load_widget_value('total_label', '{:20,.2f}'.format(total))

    def _load_ventas_grid(self):
        self.ventas_grid_model = gtk.ListStore(str, str, str, str, str)
        count = 0
        columns = ['Id Producto', 'Producto', 'Cantidad', 'Precio', 'Subtotal']
        sizes = [50, 200, 60, 100, 100]
        for column in columns:
            render = gtk.CellRendererText()
            column_instance = gtk.TreeViewColumn(column, render, text=count)
            column_instance.set_min_width(sizes[count])
            self.ventas_grid.append_column(column_instance)
            count += 1
        self._ensure_ventas_grid()

    def _ensure_ventas_grid(self):
        self.ventas_grid.set_model(self.ventas_grid_model)
        self.ventas_grid.show()

    def _load_producto_information(self, row):
        self.form_builder.load_widget_value('nombre_producto', row['nombre'])
        self.form_builder.load_widget_value('precio_producto', row['precio_venta'])
        self.form_builder.load_widget_value('cantidad_producto', '0')
        self.builder.get_object('cantidad_producto').grab_focus()

    def _clear_producto(self, clear_id=False):
        if clear_id:
            self.form_builder.load_widget_value('id_producto', '')
        self.form_builder.load_widget_value('nombre_producto', '')
        self.form_builder.load_widget_value('precio_producto', '0.00')
        self.form_builder.load_widget_value('cantidad_producto', '0')

    def _clear_venta(self):
        self.form_builder.load_widget_value('subtotal_label', '0.00')
        self.form_builder.load_widget_value('total_label', '0.00')
        self.form_builder.load_widget_value('iva_label', '0.00')
        self.form_builder.load_widget_value('pago_recibido', '0.00')

    def _show_error_message(self, message):
        dialog = gtk.MessageDialog(self.parent.parent.parent, gtk.DIALOG_DESTROY_WITH_PARENT,
            gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, message)
        dialog.run()
        dialog.destroy()

    def _show_save_continue(self):
        dialog = gtk.MessageDialog(self.parent.parent.parent, gtk.DIALOG_DESTROY_WITH_PARENT,
            gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, '¿Desea guardad la venta actual?')
        response = dialog.run()
        dialog.destroy()
        return response

    def _update_fecha_hora(self):
        self.form_builder.load_widget_value('fecha_hora_label', 
            datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
        self.idevent = gobject.timeout_add(1000, self._update_fecha_hora)

    def _load_venta(self, value):
        venta = self.venta_model.get_record(int(value))
        if venta:
            self._clear_producto(True)
            self._clear_venta()
            self.ventas_grid_model.clear()
            self._ensure_ventas_grid()

            self.__id_venta = venta['id']
            self.form_builder.load_widget_value('subtotal_label', '{:20,.2f}'.format(float(venta['sub_total'])))
            self.form_builder.load_widget_value('iva_label', '{:20,.2f}'.format(float(venta['impuesto'])))
            self.form_builder.load_widget_value('total_label', '{:20,.2f}'.format(float(venta['total'])))
            self.form_builder.load_widget_value('pago_recibido', '{:20,.2f}'.format(float(venta['pago_recibido'])))
            gobject.source_remove(self.idevent)
            self.form_builder.load_widget_value('fecha_hora_label', self._parse_fecha(str(venta['fecha_hora'])))
            items = self.venta_detalle_model.get_records(venta_id=venta['id'])
            if len(items) > 0:
                for item in items:
                    self.ventas_grid_model.append([str(item['id']), item['nombre'].strip(),
                        str(item['producto_cantidad']).strip(), str(round(item['producto_precio'], 2)).strip(), 
                            str(round(item['producto_cantidad'] * item['producto_precio'], 2)).strip()])
        else:
            self._show_error_message('La venta seleccionada no existe')

    def _parse_fecha(self, fecha):
        year = fecha[:4]
        month = fecha[4:6]
        day = fecha[6:8]
        hour = fecha[8:10]
        minutes = fecha[10:12]
        seconds = fecha[12:14]
        return "%s/%s/%s %s:%s:%s" % (year, month, day, hour, minutes, seconds)

    def normalizar_existencia(self, existencia):
        try:
            existencia = int(existencia)
        except:
            if isinstance(existencia, str):
                number = re.match(r"\d", existencia)
                if number:
                    existencia = number.group(0)
                else:
                    existencia = 0
            else:
                existencia = 0
        return existencia
示例#8
0
class ConfiguracionesFactory(gtk.Frame):
    
    __record_id = 0

    def __init__(self, main):
        super(ConfiguracionesFactory, self).__init__()
        self.main = main
        builder = gtk.Builder()
        builder.add_from_file("config_frame.glade")
        self.content = builder.get_object("vbox_content")
        self.entry = builder.get_object("pdf_entry")
        self.entry_margen_superior = builder.get_object("margen_superior")
        self.entry_margen_izquierdo = builder.get_object("margen_izquierdo")
        builder.connect_signals(self)
        self.content.reparent(self)
        self.content.show()
        self.config_model = DataModel('Configuracion')
        reader = get_pdf_reader()
        self.entry.set_text(reader['valor'])
        self.__record_id = reader['id']
        self.margen_izquierdo =  get_margen('margen_izquierdo')
        self.margen_superior = get_margen('margen_superior')
        if self.margen_superior is not None:
            self.entry_margen_superior.set_text(str(self.margen_superior['valor']).strip())
        if self.margen_izquierdo is not None:
            self.entry_margen_izquierdo.set_text(str(self.margen_izquierdo['valor']).strip())

    def on_aceptar_button_clicked(self, widget):
        pdf = self.entry.get_text()
        if self.__record_id == 0:
            self.config_model.create_record({'parametro': 'pdf_reader', 'valor': pdf})
        else:
            self.config_model.update_record({'parametro': 'pdf_reader', 'valor': pdf}, self.__record_id)

        #try:
        float(self.entry_margen_superior.get_text())
        """except:
            self._show_error_message('El valor para el margen superior debe de ser numerico')
            return"""
        if self.margen_superior is None:
            self.config_model.create_record({'parametro': 'margen_superior', 
                    'valor': self.entry_margen_superior.get_text()})
        else:
            self.config_model.update_record({'valor': self.entry_margen_superior.get_text()},
                self.margen_superior['id'])
        
        try:
            float(self.entry_margen_izquierdo.get_text())
        except:
            self._show_error_message('El valor para el margen izquierdo debe de ser numerico')
            return

        if self.margen_izquierdo is None:
            self.config_model.create_record({'parametro': 'margen_izquierdo', 
                    'valor': self.entry_margen_izquierdo.get_text()})
        else:
            self.config_model.update_record({'valor': self.entry_margen_izquierdo.get_text()},
                self.margen_izquierdo['id'])

    def on_cerrar_button_clicked(self, widget):
        page = self.parent.get_current_page()
        self.parent.remove_page(page)
        del self.main.pages[page]

    def _show_error_message(self, message):
        dialog = gtk.MessageDialog(self.parent.parent.parent, gtk.DIALOG_DESTROY_WITH_PARENT,
            gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, message)
        dialog.run()
        dialog.destroy()
示例#9
0
def get_pdf_reader():
    config_model = DataModel('Configuracion')
    pdf = config_model.get_records(parametro = 'pdf_reader')
    if len(pdf) > 0:
        for item in pdf:
            return item
示例#10
0
class Ticket:

    __meses = {1: 'Enero', 2: 'Febrero', 3: 'Marzo', 4: 'Abril', 5: 'Mayo',
        6: 'Junio', 7: 'Julio', 8: 'Agosto', 9: 'Septiembre',
        10: 'Octubre', 11: 'Noviembre', 12: 'Diciembre'}

    def __init__(self, id_venta):
        self.c = canvas.Canvas('Ticket.pdf')
        self.venta_model = DataModel('Venta')
        self.venta_detalle_model = DataModel('VentaDetalle')
        self.producto_model = DataModel('Producto')
        self.id_venta = id_venta

    def imprimir(self):
        #1 cm = 28.346 puntos
        if self.id_venta > 0:
            x = get_margen('margen_izquierdo')
            print x
            x = 3.92 if x is None else float(x['valor'])

            y = get_margen('margen_superior')
            print y
            y = 692.0 if y is None else float(y['valor'])
            y_inicial = y 
            venta = self.obtener_venta()
            if len(venta) == 0:
                return False
            self.c.setFont("Helvetica", 8)
            self.c.drawString(x + 79.08, y, 
                str(self.fecha_parser(venta['fecha'], 'dia')))
            self.c.drawString(x + 118.08, y, 
                str(self.fecha_parser(venta['fecha'], 'mes')))
            self.c.drawString(x + 264.08, y, 
                str(self.fecha_parser(venta['fecha'], 'anyo')))
            y -= 48.14
            items = self.venta_detalle_model.get_records(venta_id=venta['id'])
            if len(items) > 0:
                for item in items:
                    piezas = ' piezas' if int(item['producto_cantidad']) > 1 else ' pieza'
                    self.c.drawString(x, y, str(item['producto_cantidad']) + piezas)
                    self.c.drawString(x + 49.91, y, item['nombre'][0:30])
                    self.c.drawString(x + 165.70, y, '{:20,.2f}'.format(item['producto_precio']))
                    self.c.drawString(x + 214.70, y, '{:20,.2f}'.format(item['subtotal']))
                    y -= 18.06
            self.c.drawString(x + 208.08, y_inicial - 284.0, 
                '{:20,.2f}'.format(float(venta['total'])))
            self.c.drawString(x + 49.08, y_inicial - 308.0, self.total_a_cadena(venta['total']))
            self.c.showPage()
            self.c.setPageSize((432, 544))
            self.c.save()
            reader = get_pdf_reader()
            if reader and reader['valor'] != '':
                subprocess.Popen([reader['valor'], "Ticket.pdf"])
            return True
        else:
            return False

    def obtener_venta(self):
        venta_info = {}
        venta = self.venta_model.get_record(int(self.id_venta))
        if venta:
            total = float(venta['total'].strip()) if not isinstance(venta['total'], float) else venta['total']
            venta_info = {'id': venta['id'], 'total': total, 'fecha': venta['fecha_sistema']}
        return venta_info

    def fecha_parser(self, fecha, dato):
        if dato is 'dia':
            return int(fecha[8:10])
        if dato is 'mes':
            mes = int(fecha[5:7])
            return self.__meses[mes]
        if dato is 'anyo':
            return fecha[3:4]

    def total_a_cadena(self, total):
        total_neto = int(float(total))
        cadena = to_word(total_neto) + 'Pesos'
        decimales = self.obtener_decimales(total)
        cadena += ' %s/100 M.N' % decimales
        return cadena

    def obtener_decimales(self, total):
        cadena = '{:20,.2f}'.format(total)
        decimales = ''
        agregar = False
        index = 0
        while index < len(cadena):
            if agregar:
                decimales += cadena[index]
            if cadena[index] == '.':
                agregar = True
            index += 1
        if decimales == '':
            decimales = '00'
        return decimales
示例#11
0
    def on_productos_agotados_reporte_item_activate(self, widget):
        reporte_productos = Productos(True)

    def on_configuracion_button_clicked(self, widget):
        config_factory = ConfiguracionesFactory(self)
        self.__add_tab('Configuración', config_factory)

    def __add_tab(self, label, content_object):
        if label not in self.pages:
            self.pages.append(label)
            self.notebook.append_page(content_object, gtk.Label(label))
            content_object.show()
        page_number = self.pages.index(label)
        self.notebook.set_current_page(page_number)

    def __load_reportes_menu(self, menu):
        self.reportes_button.set_menu(menu)
        self.reportes_button.show()

if __name__ == "__main__":
    ventasModel = DataModel('VENTA')
    columns = ventasModel.get_colums();
    if 'pago_recibido' not in columns:
        query = 'ALTER TABLE VENTA ADD COLUMN pago_recibido REAL default 0';
        ventasModel.execute(query)
    if 'cambio' not in columns:
        query = 'ALTER TABLE VENTA ADD COLUMN cambio REAL default 0';
        ventasModel.execute(query)
    hwg = MainWindowGtk()
    gtk.main()
示例#12
0
 def _run_reporte(self, fecha_inicio, fecha_fin):
     model_venta = DataModel('Venta')
     model_venta_detalle = DataModel('VentaDetalle')
     model_producto = DataModel('Producto')
     fecha_inicio = datetime.datetime(fecha_inicio[0], fecha_inicio[1] + 1,
         fecha_inicio[2])
     fecha_fin = datetime.datetime(fecha_fin[0], fecha_fin[1] + 1,
         fecha_fin[2])
     fecha_inicio_param = fecha_inicio.strftime("%Y%m%d000000")
     fecha_fin_param = fecha_fin.strftime("%Y%m%d235959")
     query = 'SELECT id, fecha_sistema, sub_total, impuesto, total, pago_recibido, cambio FROM Venta ' +\
         'WHERE fecha_hora >= ? AND fecha_hora <= ?'
     ventas = model_venta.get_records_from_query(query, [fecha_inicio_param, 
         fecha_fin_param])
     c = canvas.Canvas('ReporteVentas.pdf', pagesize=letter)
     if len(ventas) > 0:
         self.__add_page_header(c, fecha_inicio, fecha_fin)
         c.drawString(30, 680, 'Id Venta')
         c.drawString(90, 680, 'Fecha')
         c.drawString(180, 680, 'Sub Total')
         c.drawString(310, 680, 'IVA')
         c.drawString(390, 680, 'Total')
         c.drawString(460, 680, 'Pagado')
         c.drawString(520, 680, 'Cambio')
         y = 650
         total = 0.00
         for venta in ventas:
             total_string = str(venta['total'])
             c.drawString(43, y, str(venta['id']))
             c.drawString(80, y, venta['fecha_sistema'])
             c.drawRightString(230, y, '{:20,.2f}'.format(float(venta['sub_total'])))
             c.drawRightString(340, y, '{:20,.2f}'.format(float(venta['impuesto'])))
             c.drawRightString(420, y, '{:20,.2f}'.format(float(total_string)))
             c.drawRightString(500, y, '{:20,.2f}'.format(float(venta['pago_recibido'])))
             c.drawRightString(560, y, '{:20,.2f}'.format(float(venta['cambio'])))
             total += float(total_string)
             items = model_venta_detalle.get_records(venta_id=venta['id'])
             y -= 30
             if len(items) > 0:
                 
                 c.drawString(133, y, 'Producto')
                 c.drawString(253, y, 'Precio')
                 c.drawString(313, y, 'Cantidad')
                 c.drawString(413, y, 'Subtotal')
                 total_registros = len(items)
                 actual = 0
                 for item in items:
                     y -= 20
                     nombre = item['nombre'] if len(item['nombre']) <= 20 else item['nombre'][:19]
                     c.drawRightString(213, y, nombre)
                     c.drawRightString(280, y, '{:20,.2f}'.format(float(item['producto_precio'])))
                     c.drawRightString(353, y, str(item['producto_cantidad']))
                     c.drawRightString(453, y, '{:20,.2f}'.format(float(item['subtotal'])))
                 y -= 20
                 c.line(10, y, 600, y)
                 y -= 20
                 actual += 1
             if y <= 120:
                 self.__add_page_footer(c)
                 y = 680
                 c.showPage()
                 self.__add_page_header(c, fecha_inicio, fecha_fin)
         c.drawString(360, y - 20, 'T O T A L:')
         c.drawRightString(520, y - 20, '{:20,.2f}'.format(total))
         self.__add_page_footer(c)
         c.showPage()
         c.save()
         reader = get_pdf_reader()
         if reader and reader['valor'] != '':
             subprocess.Popen([reader['valor'], "ReporteVentas.pdf"])
示例#13
0
from utils.Database import DataModel
model = DataModel('Proveedor')
#model.get_record(1)
model.update_record({'cp': 72420, 'email_contacto': '*****@*****.**'}, 1)
model.dispose()
示例#14
0
 def __init__(self, builder, entity):
     self.builder = builder
     self.entity = entity
     self.model = DataModel(entity)
     self.__fields = self.model.get_colums()
示例#15
0
class FormBuilder:
    __fields = []
    def __init__(self, builder, entity):
        self.builder = builder
        self.entity = entity
        self.model = DataModel(entity)
        self.__fields = self.model.get_colums()

    def get_entity(self, entity_id):
        row = self.model.get_record(entity_id)
        if row is not None:
            for field in self.__fields:
                self.load_widget_value(field, row[field])
    
    def save_entity(self, upsert=False, custom_id=False):
        id = self.__get_id()
        values = {}
        for field in self.__fields:
            if field != 'id' or (field == 'id' and custom_id == True):
                values[field] = self.get_widget_value(field)
        if id == 0 or id == '':
            self.model.create_record(values)
        else:
            self.model.update_record(values, id, upsert)
        self.clear_form()

    def delete_entity(self):
        id = self.__get_id()
        if id > 0 or id != '':
            dialog = gtk.MessageDialog(None, gtk.DIALOG_DESTROY_WITH_PARENT,
                gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, "¿Desea eliminar el registro actual?")
            response = dialog.run()
            dialog.destroy()
            if response == gtk.RESPONSE_YES:
                self.model.delete_record(id)
                self.clear_form()

    def clear_form(self):
        for field in self.__fields:
            self.load_widget_value(field, '')

    def load_widget_value(self, widget_name, value):
        widget = self.builder.get_object(widget_name)
        if isinstance(widget, gtk.Entry) or isinstance(widget, gtk.Label):
            widget.set_text(str(value))
        if isinstance(widget, gtk.ComboBox):
            model = widget.get_model()
            count = 0
            for row in model:
                if row[0] == value:
                    widget.set_active(count)
                count += 1
        if isinstance(widget, gtk.CheckButton):
            widget.set_active(True if value else False)
        if isinstance(widget, gtk.Calendar):
            widget.select_month(value[1], value[0])
            widget.select_day(value[2])
            
    def get_widget_value(self, widget_name):
        value = None
        widget = self.builder.get_object(widget_name)
        if isinstance(widget, gtk.Entry) or isinstance(widget, gtk.Label):
            value = widget.get_text()
        if isinstance(widget, gtk.ComboBox):
            model = widget.get_model()
            tree_iter = widget.get_active_iter()
            if tree_iter != None:
                value = str(model[tree_iter][0])
        if isinstance(widget, gtk.CheckButton):
            value = widget.get_active()
        if isinstance(widget, gtk.Calendar):
            value = widget.get_date()
        return value

    def get_model(self):
        return self.model

    def __get_id(self):
        id = 0
        widget = self.builder.get_object('id')
        if isinstance(widget, gtk.Label) or isinstance(widget, gtk.Entry):
            id = widget.get_text()
        return id
示例#16
0
class BusquedaWindow:
    def __init__(self, table_name, on_value_selected, search_fields={}, display_fields=[]):
        self.on_value_selected = on_value_selected
        self.model = DataModel(table_name)
        builder = gtk.Builder()
        builder.add_from_file("busqueda.glade")
        builder.connect_signals(self)
        self.window = builder.get_object("window1")
        self._search_fields = search_fields
        self.search_entry = builder.get_object("search_entry")
        self.tree = builder.get_object("treeview1")
        self.combo = builder.get_object("search_fields_combo")
        self._load_search_fields()
        self._build_treeview(display_fields)
        self.window.show()

    def _build_treeview(self, fields):
        if len(fields) == 0:
            self.column_names = self.model.get_colums()
        else:
            self.column_names = fields
        self.store = gtk.ListStore(*([str] * len(self.column_names)))
        count = 0
        for column in self.column_names:
            renderer = gtk.CellRendererText()
            label = self._get_column_label(column)
            self.tree.append_column(gtk.TreeViewColumn(label,
                renderer, text=count))
            count += 1
        self._get_data()
        self._ensure_tree_view()

    def _ensure_tree_view(self):
        self.tree.set_model(self.store)
        self.tree.show()

    def _load_search_fields(self):
        self.store_combo = gtk.ListStore(str, str)
        for key in self._search_fields.keys():
            self.store_combo.append([key, self._get_column_label(key)])
        self.combo.set_model(self.store_combo)
        self.combo.set_active(0)
        self.combo.show()

    def _get_data(self, query="", values=None):
        if len(query) == 0:
            data = self.model.get_records()
        else:
            data = self.model.get_records_from_query(query, values)
        for row in data:
            current_row = []
            for column in self.column_names:
                current_row.append(str(row[column]))
            if len(current_row) > 0:
                self.store.append(current_row)

    def _get_column_label(self, column_name):
        return column_name.replace('_', ' ').title()
    
    def on_buscar_button_clicked(self, widget):
        current_selection = self.combo.get_active()
        field = self.store_combo[current_selection][0]
        match_type = self._search_fields[field]
        value = self.search_entry.get_text()
        query = "SELECT * FROM %s WHERE %s %s ? ORDER BY %s ASC" % (self.model.table_name,
            field, ('=' if match_type == 'match' else 'like'), field)
        values = [(value if match_type == 'match' else "%%%s%%" % value)]
        model = self.tree.get_model()
        model.clear()
        self._get_data(query, values)
        self._ensure_tree_view()

    def on_cancelar_button_clicked(self, widget):
        self.window.destroy()

    def on_aceptar_btn_clicked(self, widget):
        selection = self.tree.get_selection()
        model, treeiter = selection.get_selected()
        if treeiter != None:
            index = None
            try:
                index = self.column_names.index('id')
            except:
                pass
            if index is not None and self.on_value_selected is not None:
                self.on_value_selected(model[treeiter][index])
            self.window.destroy()
        else:
            dialog = gtk.MessageDialog(None, gtk.DIALOG_DESTROY_WITH_PARENT,
                gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "Debe seleccionar un registro para continuar")
            dialog.run()
            dialog.destroy()
示例#17
0
 def __init__(self, id_venta):
     self.c = canvas.Canvas('Ticket.pdf')
     self.venta_model = DataModel('Venta')
     self.venta_detalle_model = DataModel('VentaDetalle')
     self.producto_model = DataModel('Producto')
     self.id_venta = id_venta