class ClientDialog(QtGui.QDialog): def __init__(self, parent=None): super(ClientDialog, self).__init__(parent) self.layout = QtGui.QFormLayout(self) self.label = QtGui.QLabel('Nombre') self.last_name = QtGui.QLabel('Apellido') self.layout_line_client = QtGui.QHBoxLayout() self.line_edit_search = QtGui.QLineEdit() self.line_edit_last_name = QtGui.QLineEdit() screen_size = QtGui.QApplication.desktop().availableGeometry() header_names = ['ID', 'Nombre', 'Apellido', 'DNI'] self.tablemodel = MyTableModel(Cliente, header_names, self) self.tableview = QtGui.QTableView() self.tableview.setModel(self.tablemodel) self.layout_line_client.addWidget(self.label) self.layout_line_client.addWidget(self.line_edit_search) self.layout_line_client.addWidget(self.last_name) self.layout_line_client.addWidget(self.line_edit_last_name) self.layout.addRow(self.layout_line_client) self.button_new_client = QtGui.QPushButton('Nuevo Cliente') self.button_new_client.setMaximumWidth(screen_size.height() / 6) self.layout.addRow(self.button_new_client) self.layout.addRow(self.tableview) self.tableview.setMinimumSize(screen_size.width() / 2, screen_size.height() / 4) self.buttons = QtGui.QDialogButtonBox( QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel, QtCore.Qt.Horizontal, self) self.buttons.accepted.connect(self.accept) self.buttons.rejected.connect(self.reject) self.button_new_client.clicked.connect(self.new_client) self.line_edit_search.textChanged.connect(self.search_client) self.line_edit_last_name.textChanged.connect(self.last_name_search) self.layout.addRow(self.buttons) self.setLayout(self.layout) self.setWindowTitle('Clientes Administrador') def search_client(self, string): self.tablemodel.searchClient(string, self.line_edit_last_name.text()) def last_name_search(self, string): self.tablemodel.searchClient(self.line_edit_search.text(), string) def new_client(self): data, result = GenericFormDialog.get_data(Cliente, self) if result: new_client = Cliente( data['nombre'], data['apellido'], data['dni'], ) session.add(new_client) session.commit() #QtCore.QAbstractTableModel.dataChanged() self.tableview.model().refresh_data() def get_id_selected_client(self): indexes = self.tableview.selectedIndexes() if len(indexes) < 1: client_id = None else: client_id = self.tablemodel.get_id_object_alchemy(indexes[0].row()) return client_id @staticmethod def get_client(parent=None): dialog = ClientDialog(parent) result = dialog.exec_() id_client = dialog.get_id_selected_client() return (id_client, result == QtGui.QDialog.Accepted)
class ServicesTab(QtGui.QWidget): service_payment_realeased = QtCore.pyqtSignal(float) def __init__(self): super(ServicesTab, self).__init__() self.client_id = None self.last_query_services = None self.array_data = [] self.exist_client = False self.layout = QtGui.QFormLayout(self) self.layout_line_client = QtGui.QHBoxLayout() self.screenGeometry = QtGui.QApplication.desktop().availableGeometry() self.label = QtGui.QLabel('Nombre') self.last_name = QtGui.QLabel('Apellido') self.line_edit_search = QtGui.QLineEdit() self.line_edit_last_name = QtGui.QLineEdit() header_names = ['ID', 'Nombre', 'Apellido', 'DNI'] self.tablemodel = MyTableModel(Cliente, header_names, self) self.tableview = QtGui.QTableView() self.tableview.setAlternatingRowColors(True) self.tableview.setModel(self.tablemodel) self.tableview.setMaximumHeight(self.screenGeometry.height() / 6) self.tableview.setColumnWidth(1, self.screenGeometry.width() * 0.3) self.tableview.setColumnWidth(2, self.screenGeometry.width() * 0.3) self.tableview.setColumnWidth(3, self.screenGeometry.width() * 0.15) self.button_new_type_service = QtGui.QPushButton('Nuevo Servicio') self.button_new_type_service.setMaximumWidth( self.screenGeometry.width() / 6) self.button_new_type_service.setMinimumWidth( self.screenGeometry.width() / 6) self.button_search_client = QtGui.QPushButton('Buscar Cliente') self.button_search_client.setMaximumWidth( self.screenGeometry.width() / 4) self.button_new_client = QtGui.QPushButton('Nuevo Cliente') self.button_new_client.setMaximumWidth( self.screenGeometry.width() / 4) self.button_clean = QtGui.QPushButton('Limpiar') self.third_contain_layout = QtGui.QHBoxLayout() self.third_contain_layout.addWidget(self.button_search_client) self.third_contain_layout.addWidget(self.button_new_client) self.third_contain_layout.setSpacing(self.screenGeometry.width() / 2) self.first_contain_layout = QtGui.QHBoxLayout() self.first_contain_layout.addWidget( self.button_new_type_service, 0, QtCore.Qt.AlignRight) self.line_edit_search.textChanged.connect( self.auto_complete_client_search) self.line_edit_last_name.textChanged.connect( self.auto_complete_last_name_search) self.button_search_client.clicked.connect( self.search_client_clicked) self.button_new_type_service.clicked.connect( self.new_service) self.button_clean.clicked.connect( self.clean_results) self.button_new_client.clicked.connect( self.new_client) self.group_results = QtGui.QGroupBox(str("Resultados Busqueda")) self.layout_results = QtGui.QHBoxLayout() self.layout_buttons_results = QtGui.QVBoxLayout() self.tableview_results = QtGui.QTableView() self.button_add_payment = QtGui.QPushButton("Agregar Pago") self.button_cancel_payment = QtGui.QPushButton("Cancelar Pago") self.button_new_service_payment = QtGui.QPushButton( "Nuevo Pago Servicio") self.button_add_payment.setMinimumWidth( self.screenGeometry.width() / 6) self.button_cancel_payment.setMinimumWidth( self.screenGeometry.width() / 6) self.button_new_service_payment.setMinimumWidth( self.screenGeometry.width() / 6) self.layout_filter = QtGui.QFormLayout() self.label_filter_years = QtGui.QLabel("Mostrar solo del Anio:") self.year_filter_results = QtGui.QComboBox() self.year_filter_results.addItems(LIST_YEARS) self.year_filter_results.setCurrentIndex(INDEX_CURRENT_YEAR) self.layout_filter.addRow(self.label_filter_years, self.year_filter_results) self.layout_buttons_results.addWidget(self.button_add_payment) self.layout_buttons_results.addWidget(self.button_cancel_payment) self.layout_buttons_results.addWidget(self.button_new_service_payment) self.layout_buttons_results.addLayout(self.layout_filter) self.layout_results.addWidget(self.tableview_results) self.layout_results.addLayout(self.layout_buttons_results) self.group_results.setLayout(self.layout_results) self.button_add_payment.clicked.connect(self.add_payment_to_service) self.button_cancel_payment.clicked.connect(self.cancel_payment) self.button_new_service_payment.clicked.connect( self.new_service_payment) self.year_filter_results.currentIndexChanged.connect(self.year_filter_changed) verticalSpacer = QtGui.QSpacerItem(20, 70, QtGui.QSizePolicy.Minimum, QSizePolicy.Expanding) verticalSpacer_2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QSizePolicy.Expanding) self.layout_line_client.addWidget(self.label) self.layout_line_client.addWidget(self.line_edit_search) self.layout_line_client.addWidget(self.last_name) self.layout_line_client.addWidget(self.line_edit_last_name) self.layout.addRow(self.first_contain_layout) self.layout.addRow(self.layout_line_client) self.layout.addRow(self.tableview) self.layout.addRow(self.third_contain_layout) self.layout.addItem(verticalSpacer) self.layout.addRow(self.group_results) self.layout.addItem(verticalSpacer) self.layout.addRow(self.button_clean) self.setLayout(self.layout) def year_filter_changed(self): if not self.exist_client: return self.search_client_clicked() def update_last_query(self): current_year_str = str(self.year_filter_results.currentText()) if current_year_str == 'Todos': self.last_query_services = ( session.query(Detalle.servicio).distinct().join(Factura). filter( Detalle.servicio.isnot(None), Factura.cliente == self.client_id ).all() ) else: current_year = int(current_year_str) self.last_query_services = ( session.query(Detalle.servicio).distinct().join(Factura). filter( Detalle.servicio.isnot(None), extract('year', Factura.fecha) == current_year, Factura.cliente == self.client_id ).all() ) self.array_data = [session.query(Servicio).get(service) for service in self.last_query_services] def search_client_clicked(self): indexes = self.tableview.selectedIndexes() if len(indexes) < 1: QtGui.QMessageBox.critical( self, 'Error', 'No se selecciono ningun cliente', QtGui.QMessageBox.Ok) self.client_id = None return else: client_id = self.tablemodel.get_id_object_alchemy(indexes[0].row()) self.client_id = client_id self.update_last_query() header_names = ['ID', 'Tipo', 'Cancelado', 'Monto Total'] self.table_model_result = MyTableModel( Servicio, header_names, self, self.array_data) self.tableview_results.setModel(self.table_model_result) self.tableview_results.resizeColumnsToContents() self.exist_client = True def auto_complete_client_search(self, string): self.tablemodel.searchClient(string, self.line_edit_last_name.text()) def auto_complete_last_name_search(self, string): self.tablemodel.searchClient(self.line_edit_search.text(), string) def new_service(self): data, result = GenericFormDialog.get_data(TipoServicio, self) if result: new_type_service = TipoServicio( data['nombre'], data['descripcion'], ) session.add(new_type_service) session.commit() def new_client(self): data, result = GenericFormDialog.get_data(Cliente, self) if result: new_client = Cliente( data['nombre'], data['apellido'], data['dni'], ) session.add(new_client) session.commit() self.tableview.model().refresh_data() def clean_results(self): if self.exist_client: self.client_id = None self.last_query_services = None self.array_data = [] self.exist_client = False self.tableview_results.model().clear() return def cancel_payment(self): if not self.exist_client: QtGui.QMessageBox.critical( self, 'Error', 'Primero Busque un Cliente', QtGui.QMessageBox.Ok) return indexes = self.tableview_results.selectedIndexes() if len(indexes) < 1: QtGui.QMessageBox.critical( self, 'Error', 'No se selecciono ningun servicio', QtGui.QMessageBox.Ok) return row = indexes[0].row() service_id = self.table_model_result.get_id_object_alchemy(row) service = session.query(Servicio).get(service_id) index_type_service = self.table_model_result.index(row, 1) type_service = self.table_model_result.data( index_type_service, Qt.DisplayRole) if service.cancelado: QtGui.QMessageBox.information(self, 'Servicio cancelado', 'Este servicio ya esta cancelado') return cancel_question = ( QtGui.QMessageBox.question(self, u'Cancelar %s' % str(type_service), "Desea Cancelar el pago?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)) if cancel_question == QtGui.QMessageBox.Yes: service.cancelado = True session.add(service) session.commit() self.update_last_query() self.tableview_results.model().refresh_data(self.array_data) def add_payment_to_service(self): if not self.exist_client: QtGui.QMessageBox.critical( self, 'Error', 'Primero Busque un Cliente', QtGui.QMessageBox.Ok) return indexes = self.tableview_results.selectedIndexes() if len(indexes) < 1: QtGui.QMessageBox.critical( self, 'Error', 'No se selecciono ningun servicio', QtGui.QMessageBox.Ok) return row = indexes[0].row() index_type_service = self.table_model_result.index(row, 1) service_id = self.table_model_result.get_id_object_alchemy(row) service = session.query(Servicio).get(service_id) type_service = self.table_model_result.data( index_type_service, Qt.DisplayRole) label_service = QtGui.QLabel(str(type_service)) widget_canceled = AdvCheckBox() widget_canceled.setChecked(service.cancelado) customs_widgets = [('Servicio:', label_service), ('Cancelado', widget_canceled)] fields = ['precio_total'] data_pay, result_pay = GenericFormDialog.get_data( Detalle, self, fields=fields, customs_widgets=customs_widgets) if result_pay: sale = SaleApi(float(data_pay['precio_total']), self.client_id) sale.generate_factura() sale.add_detail_service(id_service=service_id, canceled=data_pay['Cancelado']) sale.save_sale() QtGui.QMessageBox.information(self, 'Finalizado', 'Pago Guardado') sale.print_factura(self) QtGui.QMessageBox.information(self, 'Finalizado', 'Ticket Imprimido') # very dangerous, we need use the same object session session.commit() self.update_last_query() self.tableview_results.model().refresh_data(self.array_data) self.tableview_results.resizeColumnsToContents() self.service_payment_realeased.emit(float(data_pay['precio_total'])) def new_service_payment(self): if not self.exist_client: QtGui.QMessageBox.critical( self, 'Error', 'Primero Busque un Cliente', QtGui.QMessageBox.Ok) return data_type_service = ['%s %s' % (str(e.id), str(e.nombre)) for e in session.query(TipoServicio).all()] widget_type_service = AdvComboBox() widget_type_service.addItems(data_type_service) widget_canceled = AdvCheckBox() custom_widgets = [('TipoServicio', widget_type_service), ('Cancelado', widget_canceled)] fields = ['precio_total'] data_payment, result_payment = GenericFormDialog.get_data( Detalle, self, fields=fields, customs_widgets=custom_widgets) if result_payment: sale = SaleApi(float(data_payment['precio_total']), self.client_id) sale.generate_factura() sale.add_detail_service(type_service=data_payment['TipoServicio'], canceled=data_payment['Cancelado']) sale.save_sale() QtGui.QMessageBox.information(self, 'Finalizado', 'Pago Guardado') sale.print_factura(self) QtGui.QMessageBox.information(self, 'Finalizado', 'Ticket Imprimido') # I need check why query it's this way # self.last_query_services = ( # session.query(Detalle.servicio).distinct().join(Factura). # filter_by(cliente=self.client_id).all()) # # self.array_data = [session.query(Servicio).get(service) # for service in self.last_query_services] self.update_last_query() self.tableview_results.model().refresh_data(self.array_data) self.tableview_results.resizeColumnsToContents() self.service_payment_realeased.emit(float(data_payment['precio_total']))