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"])
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()
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"])