class CloseTicket(QtGui.QDialog): def __init__(self, ticket_data, allow_manual, parent): super(CloseTicket, self).__init__(parent) config = configparser.ConfigParser() settings_path = os.path.abspath(os.path.dirname(__file__)) config.read(os.path.join(settings_path, 'settings.ini')) self.tolerance = config.getint('Other', 'Tolerance') self.api = parent.api self.ticket = ticket_data['ticket'] self.previous_incoming_weight = self.ticket.incoming_weight self.allow_manual = allow_manual self.ui = Ui_CloseTicket() self.ui.setupUi(self) self.setModal(True) if hasattr(self.ticket, 'client'): self.setClient(self.ticket.client) if ticket_data['weight_captured']: self.ui.captureWeightButton.setChecked(True) self.ui.outgoingWeightSpinBox.setValue(self.ticket.outgoing_weight) self.old_driver = self.ticket.driver self.old_truck = self.ticket.truck self.reception_diff = self.dispatch_diff = self.max_diff = 0.5 self.diff_ok = False self.transactions_diff_ok = False self.transactions_diff = 999 self.api.getSettingsFinished.connect(self.updateSettings) self.api.get_settings() self.api.getFeaturesFinished.connect(self.updateFeatures) self.api.get_features() self.api.getDocumentTypesFinished.connect(self.updateDocumentTypes) self.api.get_document_types() if not self.allow_manual: self.ui.manualCheckBox.hide() self.ui.addressWidget.hide() self.ui.documentTypeWidget.hide() self.ui.numberLineEdit.setText(str(self.ticket.number)) self.ui.driverLineEdit.setText( "%s - %s" % (self.ticket.driver.ci, self.ticket.driver.name)) self.ui.truckLineEdit.setText( "%s - %s" % (self.ticket.truck.license_plate, self.ticket.truck.carrier.name)) self.ui.incomingWeightSpinBox.setValue(self.ticket.incoming_weight) self.ui.commentPlainTextEdit.setPlainText(self.ticket.comment) self.transactionsTableModel = TransactionsTableModel( self.ticket.transactions_attributes, ticket_data['lots'], self) self.ui.transactionsTableView.setModel(self.transactionsTableModel) horizontalHeader = self.ui.transactionsTableView.horizontalHeader() horizontalHeader.resizeSection(0, 80) horizontalHeader.resizeSection(1, 80) horizontalHeader.setResizeMode(2, QtGui.QHeaderView.Stretch) horizontalHeader.resizeSection(3, 50) horizontalHeader.resizeSection(4, 50) horizontalHeader.resizeSection(5, 80) if self.ticket.ticket_type_id == 1: self.ui.receptionButton.setChecked(True) else: self.ui.dispatchButton.setChecked(True) self.ui.changeDriverButton.clicked.connect(self.changeDriver) self.ui.changeTruckButton.clicked.connect(self.changeTruck) self.ui.addClientButton.clicked.connect(self.addClient) self.ui.manualCheckBox.stateChanged.connect(self.setManualCapture) self.ui.outgoingWeightSpinBox.valueChanged.connect(self.weightChanged) self.ui.incomingWeightSpinBox.valueChanged.connect( self.updateTicketType) self.ui.netWeightSpinBox.valueChanged.connect(self.updateDiff) self.ui.providerWeightSpinBox.valueChanged.connect(self.updateDiff) self.ui.diffSpinBox.valueChanged.connect(self.updateDiffStyle) self.ui.receptionButton.clicked.connect(self.updateTicketType) self.ui.dispatchButton.clicked.connect(self.updateTicketType) self.ui.addTransactionButton.clicked.connect(self.addTransaction) self.ui.cancelButton.clicked.connect(self.cancel) self.ui.saveButton.clicked.connect(self.saveTicket) self.ui.closeTicketButton.clicked.connect(self.closeTicket) self.ui.transactionsTableView.clicked.connect( self.enableDeleteTransaction) self.ui.removeTransactionButton.clicked.connect(self.removeTransaction) self.transactionsTableModel.totalChanged.connect(self.updateTotal) self.transactionsTableModel.recalculateTotal() self.updateTicketType() self.st = SerialThread(config.get('Serial', 'PortName'), config.get('Serial', 'Regex'), config.getint('Serial', 'Baudrate'), config.get('Serial', 'Parity'), config.getint('Serial', 'Bytesize'), config.getboolean('Serial', 'Simulate')) self.st.dataReady.connect(self.getWeight, QtCore.Qt.QueuedConnection) self.st.start() def cancel(self): self.ticket.driver = self.old_driver self.reject() def updateTotal(self, total): self.ui.transactionsTotalSpinBox.setValue(total) if self.ui.dispatchButton.isChecked(): self.ui.providerWeightSpinBox.setValue( self.ui.transactionsTotalSpinBox.value()) self.updateDiff() def updateDiff(self): net_weight = self.ui.netWeightSpinBox.value() total = self.ui.providerWeightSpinBox.value() transactions_total = self.ui.transactionsTotalSpinBox.value() if total == 0: diff = 999 else: diff = (net_weight - total) / total * 100 if transactions_total == 0: self.transactions_diff = 999 else: self.transactions_diff = ( net_weight - transactions_total) / transactions_total * 100 self.ui.diffSpinBox.setValue(diff) self.updateDiffStyle() def updateDiffStyle(self): diff = self.ui.diffSpinBox.value() if self.ui.receptionButton.isChecked(): self.max_diff = self.reception_diff else: self.max_diff = self.dispatch_diff if diff >= -1 * self.max_diff and diff <= self.max_diff: bkg_color = "0, 0, 0" self.diff_ok = True else: bkg_color = "255, 0, 0" self.diff_ok = False self.transactions_diff_ok = self.transactions_diff >= -1 * self.max_diff and self.transactions_diff <= self.max_diff self.ui.diffSpinBox.setStyleSheet( "background-color: rgb(%s);\ncolor: rgb(0, 170, 0);" % bkg_color) def updateSettings(self, settings): self.reception_diff = settings.ticket_reception_diff self.dispatch_diff = settings.ticket_dispatch_diff def updateFeatures(self, features): self.features = features if "multiple_addresses" in features: self.ui.addressWidget.show() if "document_types" in features: self.ui.documentTypeWidget.show() def updateDocumentTypes(self, document_types): self.documentTypeListModel = DocumentTypeListModel( document_types, self) self.ui.documentTypeComboBox.setModel(self.documentTypeListModel) try: row = self.documentTypeListModel.findRowById( self.ticket.document_type_id) self.ui.documentTypeComboBox.setCurrentIndex(row) except AttributeError: pass def updateTicketType(self): self.ticket.incoming_weight = self.ui.incomingWeightSpinBox.value() weight = self.ui.outgoingWeightSpinBox.value() if self.ui.receptionButton.isChecked(): self.ui.providerWidget.show() gross_weight = self.ticket.incoming_weight tare_weight = weight self.ui.providerWeightSpinBox.setReadOnly(False) else: gross_weight = weight tare_weight = self.ticket.incoming_weight self.ui.providerWeightSpinBox.setReadOnly(True) self.ui.providerWeightSpinBox.setValue( self.ui.transactionsTotalSpinBox.value()) net_weight = gross_weight - tare_weight self.ui.grossWeightSpinBox.setValue(gross_weight) self.ui.tareWeightSpinBox.setValue(tare_weight) self.ui.netWeightSpinBox.setValue(net_weight) def addTransaction(self): # TODO ELIMINAR if self.ticket.ticket_type_id == 1: transaction_type_id = 4 else: transaction_type_id = 5 # FIN TODO self.api.get_lots() self.api.get_product_lots() addTransactionDialog = AddTransaction(transaction_type_id, self) self.api.getLotsFinished.connect(addTransactionDialog.getLotsFinished) self.api.getProductLotsFinished.connect( addTransactionDialog.getProductLotsFinished) if addTransactionDialog.exec_() == QtGui.QDialog.Accepted: transaction = addTransactionDialog.transaction lot = addTransactionDialog.lot self.transactionsTableModel.addTransaction(transaction, lot) def removeTransaction(self): row = self.ui.transactionsTableView.currentIndex().row() self.transactionsTableModel.removeTransaction(row) currentRow = self.ui.transactionsTableView.currentIndex().row() if currentRow == -1: self.ui.removeTransactionButton.setEnabled(False) def enableDeleteTransaction(self, index): if index.row() != -1: self.ui.removeTransactionButton.setEnabled(True) def closeTicket(self): outgoing_weight = self.ui.outgoingWeightSpinBox.value() weight_captured = self.ui.captureWeightButton.isChecked() manualEnabled = self.ui.manualCheckBox.isChecked() net_weight = self.ui.netWeightSpinBox.value() provider_weight = self.ui.providerWeightSpinBox.value() provider_document_number = self.ui.providerDocumentNumberLineEdit.text( ) transactions_total = self.ui.transactionsTotalSpinBox.value() diff = self.ui.diffSpinBox.value() if self.ui.receptionButton.isChecked(): self.ticket.ticket_type_id = 1 elif self.ui.dispatchButton.isChecked(): self.ticket.ticket_type_id = 2 errors = [] if not (self.diff_ok and self.transactions_diff_ok): if not self.allow_manual: if not self.diff_ok: errors.append( 'La diferencia entre el peso neto y peso proveedor es muy grande' ) if not self.transactions_diff_ok: errors.append( 'La diferencia entre el peso neto y el total de transacciones es muy grande' ) else: flags = QtGui.QMessageBox.StandardButton.Yes flags |= QtGui.QMessageBox.StandardButton.No diff_fields = [] if not self.diff_ok: diff_fields.append("peso proveedor") if not self.transactions_diff_ok: diff_fields.append("transacciones") question = "¿Esta seguro de permitir una diferencia mayor a %s %% (%s)?" % ( self.max_diff, ", ".join(diff_fields)) response = QtGui.QMessageBox.question(self, "Advertencia", question, flags) if response == QtGui.QMessageBox.Yes: pass else: if not self.diff_ok: errors.append( 'La diferencia entre el peso neto y peso proveedor es muy grande' ) if not self.transactions_diff_ok: errors.append( 'La diferencia entre el peso neto y el total de transacciones es muy grande' ) if net_weight < 0: errors.append('El peso neto no puede ser negativo') if transactions_total == 0: errors.append('El total de transacciones no puede ser 0') if self.client == None: errors.append('El cliente/fábrica no ha sido seleccionado') elif "multiple_addresses" in self.features: self.ticket.address = self.ui.addressComboBox.currentText() else: self.ticket.address = self.client.address if not weight_captured and not manualEnabled: errors.append('El peso de salida no ha sido capturado') if provider_document_number == '': errors.append('El número de documento no ha sido indicado') if not errors: if "document_types" in self.features: index = self.ui.documentTypeComboBox.currentIndex() if index != -1: dt = self.documentTypeListModel.getDocumentType(index) self.ticket.document_type_id = dt.id self.ticket.comment = self.ui.commentPlainTextEdit.toPlainText() self.ticket.outgoing_weight = outgoing_weight self.ticket.provider_weight = provider_weight self.ticket.provider_document_number = provider_document_number self.ticket.transactions_attributes = self.transactionsTableModel.getTransactions( ) for transaction in self.ticket.transactions_attributes: if self.ticket.ticket_type_id == 1: transaction.transaction_type_id = 4 else: transaction.transaction_type_id = 5 delattr(transaction, 'content_comment') self.ticket.client_id = self.client.id self.ticket.driver_id = self.ticket.driver.id self.ticket.truck_id = self.ticket.truck.id self.ticket.manual_outgoing = manualEnabled self.ticket.manual_incoming |= self.previous_incoming_weight != self.ticket.incoming_weight self.accept() else: ErrorMessageBox(errors).exec_() def setManualCapture(self): if self.ui.manualCheckBox.isChecked(): self.ui.outgoingWeightSpinBox.setEnabled(True) self.ui.incomingWeightSpinBox.setEnabled(True) self.ui.captureWeightButton.setEnabled(False) self.ui.captureWeightButton.setChecked(False) else: self.ui.outgoingWeightSpinBox.setEnabled(False) self.ui.incomingWeightSpinBox.setEnabled(False) self.ui.captureWeightButton.setEnabled(True) def getWeight(self, weight): if not self.ui.captureWeightButton.isChecked( ) and not self.ui.manualCheckBox.isChecked(): self.ui.outgoingWeightSpinBox.setValue(weight) def weightChanged(self, weight): if self.ui.dispatchButton.isChecked(): gross_weight = weight tare_weight = self.ticket.incoming_weight else: gross_weight = self.ticket.incoming_weight tare_weight = weight net_weight = gross_weight - tare_weight self.ui.grossWeightSpinBox.setValue(gross_weight) self.ui.tareWeightSpinBox.setValue(tare_weight) self.ui.netWeightSpinBox.setValue(net_weight) def addClient(self): addClientDialog = AddClient(self) if addClientDialog.exec_() == QtGui.QDialog.Accepted: self.setClient(addClientDialog.client) def setClient(self, client): try: self.client = client self.ui.clientLineEdit.setText(self.client.name) self.ui.addressComboBox.clear() self.ui.addressComboBox.addItem(client.address) self.ui.addressComboBox.addItems(client.addresses) self.ui.addressComboBox.setCurrentIndex( self.ui.addressComboBox.findText(self.ticket.address)) except AttributeError: pass def changeDriver(self): changeDriverDialog = ChangeDriver(self) if changeDriverDialog.exec_() == QtGui.QDialog.Accepted: self.setDriver(changeDriverDialog.driver) def setDriver(self, driver): self.ticket.driver = driver self.ui.driverLineEdit.setText( "%s - %s" % (self.ticket.driver.ci, self.ticket.driver.name)) def changeTruck(self): changeTruckDialog = ChangeTruck(self) if changeTruckDialog.exec_() == QtGui.QDialog.Accepted: self.setTruck(changeTruckDialog.truck) def setTruck(self, truck): self.ticket.truck = truck self.ui.truckLineEdit.setText( "%s - %s" % (self.ticket.truck.license_plate, self.ticket.truck.carrier.name)) def saveTicket(self): self.ticket.ticket_type_id = 1 if self.ui.receptionButton.isChecked( ) else 2 if "multiple_addresses" in self.features: self.ticket.address = self.ui.addressComboBox.currentText() elif self.client: self.ticket.address = self.client.address if "document_types" in self.features: index = self.ui.documentTypeComboBox.currentIndex() if index != -1: dt = self.documentTypeListModel.getDocumentType(index) self.ticket.document_type_id = dt.id self.ticket.comment = self.ui.commentPlainTextEdit.toPlainText() self.ticket.outgoing_weight = self.ui.outgoingWeightSpinBox.value() self.ticket.provider_weight = self.ui.providerWeightSpinBox.value() self.ticket.provider_document_number = self.ui.providerDocumentNumberLineEdit.text( ) self.ticket.transactions_attributes = self.transactionsTableModel.getTransactions( ) self.ticket.client = self.client self.ticket.manual_outgoing = self.ui.manualCheckBox.isChecked() self.ticket.manual_incoming |= self.previous_incoming_weight != self.ticket.incoming_weight ticket_data = { 'ticket': self.ticket, 'weight_captured': self.ui.captureWeightButton.isChecked(), 'lots': self.transactionsTableModel.getLots() } fileObject = open("%s.ticket" % self.ticket.number, 'wb') pickle.dump(ticket_data, fileObject) fileObject.close() print("Se guardó el ticket %s" % self.ticket.number) self.reject()
class NewTicket(QtGui.QDialog): def __init__(self, ticket_type_id, allow_manual, parent): super(NewTicket, self).__init__(parent) config = configparser.ConfigParser() settings_path = os.path.abspath(os.path.dirname(__file__)) config.read(os.path.join(settings_path, "settings.ini")) self.api = parent.api self.ticket_type_id = ticket_type_id self.ui = Ui_NewTicket() self.ui.setupUi(self) if ticket_type_id == 1: self.setWindowTitle("Nueva Recepción") else: self.setWindowTitle("Nuevo Despacho") self.setModal(True) self.driver = None self.truck = None if not allow_manual: self.ui.manualCheckBox.hide() self.api.createDriverFinished.connect(self.setDriver) self.api.createTruckFinished.connect(self.setTruck) self.ui.addDriverButton.clicked.connect(self.addDriver) self.ui.addTruckButton.clicked.connect(self.addTruck) self.ui.manualCheckBox.stateChanged.connect(self.setManualCapture) self.ui.createTicketButton.clicked.connect(self.createTicket) self.ui.cancelButton.clicked.connect(self.reject) self.st = SerialThread( config.get("Serial", "PortName"), config.get("Serial", "Regex"), config.getint("Serial", "Baudrate"), config.get("Serial", "Parity"), config.getint("Serial", "Bytesize"), config.getboolean("Serial", "Simulate"), ) self.st.dataReady.connect(self.getWeight, QtCore.Qt.QueuedConnection) self.st.start() def createTicket(self): weightCaptured = self.ui.captureWeightButton.isChecked() manualEnabled = self.ui.manualCheckBox.isChecked() errors = [] if self.driver == None: errors.append("El chofer no ha sido seleccionado") if self.truck == None: errors.append("El camión no ha sido seleccionado") if not manualEnabled and not weightCaptured: errors.append("El peso de entrada no ha sido capturado") if not errors: incoming_weight = self.ui.incomingWeightSpinBox.value() comment = self.ui.commentPlainTextEdit.toPlainText() self.ticket = Ticket(self.ticket_type_id, self.driver.id, self.truck.id, incoming_weight, comment) self.ticket.manual_incoming = manualEnabled self.accept() else: ErrorMessageBox(errors).exec_() def addDriver(self): addDriverDialog = AddDriver(self) if addDriverDialog.exec_() == QtGui.QDialog.Accepted: self.setDriver(addDriverDialog.driver) def setDriver(self, driver): self.driver = driver self.ui.driverLineEdit.setText("%s - %s" % (self.driver.name, self.driver.ci)) def addTruck(self): addTruckDialog = AddTruck(self) if addTruckDialog.exec_() == QtGui.QDialog.Accepted: self.setTruck(addTruckDialog.truck) def setTruck(self, truck): self.truck = truck self.ui.truckLineEdit.setText("%s - %s" % (self.truck.license_plate, self.truck.carrier.name)) def setManualCapture(self): if self.ui.manualCheckBox.isChecked(): self.ui.incomingWeightSpinBox.setEnabled(True) self.ui.captureWeightButton.setEnabled(False) self.ui.captureWeightButton.setChecked(False) else: self.ui.incomingWeightSpinBox.setEnabled(False) self.ui.captureWeightButton.setEnabled(True) def getWeight(self, weight): if not self.ui.captureWeightButton.isChecked() and not self.ui.manualCheckBox.isChecked(): self.ui.incomingWeightSpinBox.setValue(weight) def getTrucksFinished(self, trucks): self.trucksListModel = TrucksListModel(trucks, self) self.ui.trucksComboBox.setModel(self.trucksListModel) self.ui.trucksComboBox.setCurrentIndex(-1)
class CloseTicket(QtGui.QDialog): def __init__(self, ticket_data, allow_manual, parent): super(CloseTicket, self).__init__(parent) config = configparser.ConfigParser() settings_path = os.path.abspath(os.path.dirname(__file__)) config.read(os.path.join(settings_path, "settings.ini")) self.tolerance = config.getint("Other", "Tolerance") self.api = parent.api self.ticket = ticket_data["ticket"] self.previous_incoming_weight = self.ticket.incoming_weight self.allow_manual = allow_manual self.ui = Ui_CloseTicket() self.ui.setupUi(self) self.setModal(True) if hasattr(self.ticket, "client"): self.setClient(self.ticket.client) if ticket_data["weight_captured"]: self.ui.captureWeightButton.setChecked(True) self.ui.outgoingWeightSpinBox.setValue(self.ticket.outgoing_weight) self.old_driver = self.ticket.driver self.old_truck = self.ticket.truck self.reception_diff = self.dispatch_diff = self.max_diff = 0.5 self.diff_ok = False self.transactions_diff_ok = False self.transactions_diff = 999 self.api.getSettingsFinished.connect(self.updateSettings) self.api.get_settings() self.api.getFeaturesFinished.connect(self.updateFeatures) self.api.get_features() self.api.getDocumentTypesFinished.connect(self.updateDocumentTypes) self.api.get_document_types() if not self.allow_manual: self.ui.manualCheckBox.hide() self.ui.addressWidget.hide() self.ui.documentTypeWidget.hide() self.ui.numberLineEdit.setText(str(self.ticket.number)) self.ui.driverLineEdit.setText("%s - %s" % (self.ticket.driver.ci, self.ticket.driver.name)) self.ui.truckLineEdit.setText("%s - %s" % (self.ticket.truck.license_plate, self.ticket.truck.carrier.name)) self.ui.incomingWeightSpinBox.setValue(self.ticket.incoming_weight) self.ui.commentPlainTextEdit.setPlainText(self.ticket.comment) self.transactionsTableModel = TransactionsTableModel( self.ticket.transactions_attributes, ticket_data["lots"], self ) self.ui.transactionsTableView.setModel(self.transactionsTableModel) horizontalHeader = self.ui.transactionsTableView.horizontalHeader() horizontalHeader.resizeSection(0, 80) horizontalHeader.resizeSection(1, 80) horizontalHeader.setResizeMode(2, QtGui.QHeaderView.Stretch) horizontalHeader.resizeSection(3, 50) horizontalHeader.resizeSection(4, 50) horizontalHeader.resizeSection(5, 80) if self.ticket.ticket_type_id == 1: self.ui.receptionButton.setChecked(True) else: self.ui.dispatchButton.setChecked(True) self.ui.changeDriverButton.clicked.connect(self.changeDriver) self.ui.changeTruckButton.clicked.connect(self.changeTruck) self.ui.addClientButton.clicked.connect(self.addClient) self.ui.manualCheckBox.stateChanged.connect(self.setManualCapture) self.ui.outgoingWeightSpinBox.valueChanged.connect(self.weightChanged) self.ui.incomingWeightSpinBox.valueChanged.connect(self.updateTicketType) self.ui.netWeightSpinBox.valueChanged.connect(self.updateDiff) self.ui.providerWeightSpinBox.valueChanged.connect(self.updateDiff) self.ui.diffSpinBox.valueChanged.connect(self.updateDiffStyle) self.ui.receptionButton.clicked.connect(self.updateTicketType) self.ui.dispatchButton.clicked.connect(self.updateTicketType) self.ui.addTransactionButton.clicked.connect(self.addTransaction) self.ui.cancelButton.clicked.connect(self.cancel) self.ui.saveButton.clicked.connect(self.saveTicket) self.ui.closeTicketButton.clicked.connect(self.closeTicket) self.ui.transactionsTableView.clicked.connect(self.enableDeleteTransaction) self.ui.removeTransactionButton.clicked.connect(self.removeTransaction) self.transactionsTableModel.totalChanged.connect(self.updateTotal) self.transactionsTableModel.recalculateTotal() self.updateTicketType() self.st = SerialThread( config.get("Serial", "PortName"), config.get("Serial", "Regex"), config.getint("Serial", "Baudrate"), config.get("Serial", "Parity"), config.getint("Serial", "Bytesize"), config.getboolean("Serial", "Simulate"), ) self.st.dataReady.connect(self.getWeight, QtCore.Qt.QueuedConnection) self.st.start() def cancel(self): self.ticket.driver = self.old_driver self.reject() def updateTotal(self, total): self.ui.transactionsTotalSpinBox.setValue(total) if self.ui.dispatchButton.isChecked(): self.ui.providerWeightSpinBox.setValue(self.ui.transactionsTotalSpinBox.value()) self.updateDiff() def updateDiff(self): net_weight = self.ui.netWeightSpinBox.value() total = self.ui.providerWeightSpinBox.value() transactions_total = self.ui.transactionsTotalSpinBox.value() if total == 0: diff = 999 else: diff = (net_weight - total) / total * 100 if transactions_total == 0: self.transactions_diff = 999 else: self.transactions_diff = (net_weight - transactions_total) / transactions_total * 100 self.ui.diffSpinBox.setValue(diff) self.updateDiffStyle() def updateDiffStyle(self): diff = self.ui.diffSpinBox.value() if self.ui.receptionButton.isChecked(): self.max_diff = self.reception_diff else: self.max_diff = self.dispatch_diff if diff >= -1 * self.max_diff and diff <= self.max_diff: bkg_color = "0, 0, 0" self.diff_ok = True else: bkg_color = "255, 0, 0" self.diff_ok = False self.transactions_diff_ok = ( self.transactions_diff >= -1 * self.max_diff and self.transactions_diff <= self.max_diff ) self.ui.diffSpinBox.setStyleSheet("background-color: rgb(%s);\ncolor: rgb(0, 170, 0);" % bkg_color) def updateSettings(self, settings): self.reception_diff = settings.ticket_reception_diff self.dispatch_diff = settings.ticket_dispatch_diff def updateFeatures(self, features): self.features = features if "multiple_addresses" in features: self.ui.addressWidget.show() if "document_types" in features: self.ui.documentTypeWidget.show() def updateDocumentTypes(self, document_types): self.documentTypeListModel = DocumentTypeListModel(document_types, self) self.ui.documentTypeComboBox.setModel(self.documentTypeListModel) try: row = self.documentTypeListModel.findRowById(self.ticket.document_type_id) self.ui.documentTypeComboBox.setCurrentIndex(row) except AttributeError: pass def updateTicketType(self): self.ticket.incoming_weight = self.ui.incomingWeightSpinBox.value() weight = self.ui.outgoingWeightSpinBox.value() if self.ui.receptionButton.isChecked(): self.ui.providerWidget.show() gross_weight = self.ticket.incoming_weight tare_weight = weight self.ui.providerWeightSpinBox.setReadOnly(False) else: gross_weight = weight tare_weight = self.ticket.incoming_weight self.ui.providerWeightSpinBox.setReadOnly(True) self.ui.providerWeightSpinBox.setValue(self.ui.transactionsTotalSpinBox.value()) net_weight = gross_weight - tare_weight self.ui.grossWeightSpinBox.setValue(gross_weight) self.ui.tareWeightSpinBox.setValue(tare_weight) self.ui.netWeightSpinBox.setValue(net_weight) def addTransaction(self): # TODO ELIMINAR if self.ticket.ticket_type_id == 1: transaction_type_id = 4 else: transaction_type_id = 5 # FIN TODO self.api.get_lots() self.api.get_product_lots() addTransactionDialog = AddTransaction(transaction_type_id, self) self.api.getLotsFinished.connect(addTransactionDialog.getLotsFinished) self.api.getProductLotsFinished.connect(addTransactionDialog.getProductLotsFinished) if addTransactionDialog.exec_() == QtGui.QDialog.Accepted: transaction = addTransactionDialog.transaction lot = addTransactionDialog.lot self.transactionsTableModel.addTransaction(transaction, lot) def removeTransaction(self): row = self.ui.transactionsTableView.currentIndex().row() self.transactionsTableModel.removeTransaction(row) currentRow = self.ui.transactionsTableView.currentIndex().row() if currentRow == -1: self.ui.removeTransactionButton.setEnabled(False) def enableDeleteTransaction(self, index): if index.row() != -1: self.ui.removeTransactionButton.setEnabled(True) def closeTicket(self): outgoing_weight = self.ui.outgoingWeightSpinBox.value() weight_captured = self.ui.captureWeightButton.isChecked() manualEnabled = self.ui.manualCheckBox.isChecked() net_weight = self.ui.netWeightSpinBox.value() provider_weight = self.ui.providerWeightSpinBox.value() provider_document_number = self.ui.providerDocumentNumberLineEdit.text() transactions_total = self.ui.transactionsTotalSpinBox.value() diff = self.ui.diffSpinBox.value() if self.ui.receptionButton.isChecked(): self.ticket.ticket_type_id = 1 elif self.ui.dispatchButton.isChecked(): self.ticket.ticket_type_id = 2 errors = [] if not (self.diff_ok and self.transactions_diff_ok): if not self.allow_manual: if not self.diff_ok: errors.append("La diferencia entre el peso neto y peso proveedor es muy grande") if not self.transactions_diff_ok: errors.append("La diferencia entre el peso neto y el total de transacciones es muy grande") else: flags = QtGui.QMessageBox.StandardButton.Yes flags |= QtGui.QMessageBox.StandardButton.No diff_fields = [] if not self.diff_ok: diff_fields.append("peso proveedor") if not self.transactions_diff_ok: diff_fields.append("transacciones") question = "¿Esta seguro de permitir una diferencia mayor a %s %% (%s)?" % ( self.max_diff, ", ".join(diff_fields), ) response = QtGui.QMessageBox.question(self, "Advertencia", question, flags) if response == QtGui.QMessageBox.Yes: pass else: if not self.diff_ok: errors.append("La diferencia entre el peso neto y peso proveedor es muy grande") if not self.transactions_diff_ok: errors.append("La diferencia entre el peso neto y el total de transacciones es muy grande") if net_weight < 0: errors.append("El peso neto no puede ser negativo") if transactions_total == 0: errors.append("El total de transacciones no puede ser 0") if self.client == None: errors.append("El cliente/fábrica no ha sido seleccionado") elif "multiple_addresses" in self.features: self.ticket.address = self.ui.addressComboBox.currentText() else: self.ticket.address = self.client.address if not weight_captured and not manualEnabled: errors.append("El peso de salida no ha sido capturado") if provider_document_number == "": errors.append("El número de documento no ha sido indicado") if not errors: if "document_types" in self.features: index = self.ui.documentTypeComboBox.currentIndex() if index != -1: dt = self.documentTypeListModel.getDocumentType(index) self.ticket.document_type_id = dt.id self.ticket.comment = self.ui.commentPlainTextEdit.toPlainText() self.ticket.outgoing_weight = outgoing_weight self.ticket.provider_weight = provider_weight self.ticket.provider_document_number = provider_document_number self.ticket.transactions_attributes = self.transactionsTableModel.getTransactions() for transaction in self.ticket.transactions_attributes: if self.ticket.ticket_type_id == 1: transaction.transaction_type_id = 4 else: transaction.transaction_type_id = 5 delattr(transaction, "content_comment") self.ticket.client_id = self.client.id self.ticket.driver_id = self.ticket.driver.id self.ticket.truck_id = self.ticket.truck.id self.ticket.manual_outgoing = manualEnabled self.ticket.manual_incoming |= self.previous_incoming_weight != self.ticket.incoming_weight self.accept() else: ErrorMessageBox(errors).exec_() def setManualCapture(self): if self.ui.manualCheckBox.isChecked(): self.ui.outgoingWeightSpinBox.setEnabled(True) self.ui.incomingWeightSpinBox.setEnabled(True) self.ui.captureWeightButton.setEnabled(False) self.ui.captureWeightButton.setChecked(False) else: self.ui.outgoingWeightSpinBox.setEnabled(False) self.ui.incomingWeightSpinBox.setEnabled(False) self.ui.captureWeightButton.setEnabled(True) def getWeight(self, weight): if not self.ui.captureWeightButton.isChecked() and not self.ui.manualCheckBox.isChecked(): self.ui.outgoingWeightSpinBox.setValue(weight) def weightChanged(self, weight): if self.ui.dispatchButton.isChecked(): gross_weight = weight tare_weight = self.ticket.incoming_weight else: gross_weight = self.ticket.incoming_weight tare_weight = weight net_weight = gross_weight - tare_weight self.ui.grossWeightSpinBox.setValue(gross_weight) self.ui.tareWeightSpinBox.setValue(tare_weight) self.ui.netWeightSpinBox.setValue(net_weight) def addClient(self): addClientDialog = AddClient(self) if addClientDialog.exec_() == QtGui.QDialog.Accepted: self.setClient(addClientDialog.client) def setClient(self, client): try: self.client = client self.ui.clientLineEdit.setText(self.client.name) self.ui.addressComboBox.clear() self.ui.addressComboBox.addItem(client.address) self.ui.addressComboBox.addItems(client.addresses) self.ui.addressComboBox.setCurrentIndex(self.ui.addressComboBox.findText(self.ticket.address)) except AttributeError: pass def changeDriver(self): changeDriverDialog = ChangeDriver(self) if changeDriverDialog.exec_() == QtGui.QDialog.Accepted: self.setDriver(changeDriverDialog.driver) def setDriver(self, driver): self.ticket.driver = driver self.ui.driverLineEdit.setText("%s - %s" % (self.ticket.driver.ci, self.ticket.driver.name)) def changeTruck(self): changeTruckDialog = ChangeTruck(self) if changeTruckDialog.exec_() == QtGui.QDialog.Accepted: self.setTruck(changeTruckDialog.truck) def setTruck(self, truck): self.ticket.truck = truck self.ui.truckLineEdit.setText("%s - %s" % (self.ticket.truck.license_plate, self.ticket.truck.carrier.name)) def saveTicket(self): self.ticket.ticket_type_id = 1 if self.ui.receptionButton.isChecked() else 2 if "multiple_addresses" in self.features: self.ticket.address = self.ui.addressComboBox.currentText() elif self.client: self.ticket.address = self.client.address if "document_types" in self.features: index = self.ui.documentTypeComboBox.currentIndex() if index != -1: dt = self.documentTypeListModel.getDocumentType(index) self.ticket.document_type_id = dt.id self.ticket.comment = self.ui.commentPlainTextEdit.toPlainText() self.ticket.outgoing_weight = self.ui.outgoingWeightSpinBox.value() self.ticket.provider_weight = self.ui.providerWeightSpinBox.value() self.ticket.provider_document_number = self.ui.providerDocumentNumberLineEdit.text() self.ticket.transactions_attributes = self.transactionsTableModel.getTransactions() self.ticket.client = self.client self.ticket.manual_outgoing = self.ui.manualCheckBox.isChecked() self.ticket.manual_incoming |= self.previous_incoming_weight != self.ticket.incoming_weight ticket_data = { "ticket": self.ticket, "weight_captured": self.ui.captureWeightButton.isChecked(), "lots": self.transactionsTableModel.getLots(), } fileObject = open("%s.ticket" % self.ticket.number, "wb") pickle.dump(ticket_data, fileObject) fileObject.close() print("Se guardó el ticket %s" % self.ticket.number) self.reject()
class NewTicket(QtGui.QDialog): def __init__(self, ticket_type_id, allow_manual, parent): super(NewTicket, self).__init__(parent) config = configparser.ConfigParser() settings_path = os.path.abspath(os.path.dirname(__file__)) config.read(os.path.join(settings_path, 'settings.ini')) self.api = parent.api self.ticket_type_id = ticket_type_id self.ui = Ui_NewTicket() self.ui.setupUi(self) if ticket_type_id == 1: self.setWindowTitle("Nueva Recepción") else: self.setWindowTitle("Nuevo Despacho") self.setModal(True) self.driver = None self.truck = None if not allow_manual: self.ui.manualCheckBox.hide() self.api.createDriverFinished.connect(self.setDriver) self.api.createTruckFinished.connect(self.setTruck) self.ui.addDriverButton.clicked.connect(self.addDriver) self.ui.addTruckButton.clicked.connect(self.addTruck) self.ui.manualCheckBox.stateChanged.connect(self.setManualCapture) self.ui.createTicketButton.clicked.connect(self.createTicket) self.ui.cancelButton.clicked.connect(self.reject) self.st = SerialThread(config.get('Serial', 'PortName'), config.get('Serial', 'Regex'), config.getint('Serial', 'Baudrate'), config.get('Serial', 'Parity'), config.getint('Serial', 'Bytesize'), config.getboolean('Serial', 'Simulate')) self.st.dataReady.connect(self.getWeight, QtCore.Qt.QueuedConnection) self.st.start() def createTicket(self): weightCaptured = self.ui.captureWeightButton.isChecked() manualEnabled = self.ui.manualCheckBox.isChecked() errors = [] if self.driver == None: errors.append("El chofer no ha sido seleccionado") if self.truck == None: errors.append("El camión no ha sido seleccionado") if not manualEnabled and not weightCaptured: errors.append("El peso de entrada no ha sido capturado") if not errors: incoming_weight = self.ui.incomingWeightSpinBox.value() comment = self.ui.commentPlainTextEdit.toPlainText() self.ticket = Ticket(self.ticket_type_id, self.driver.id, self.truck.id, incoming_weight, comment) self.ticket.manual_incoming = manualEnabled self.accept() else: ErrorMessageBox(errors).exec_() def addDriver(self): addDriverDialog = AddDriver(self) if addDriverDialog.exec_() == QtGui.QDialog.Accepted: self.setDriver(addDriverDialog.driver) def setDriver(self, driver): self.driver = driver self.ui.driverLineEdit.setText("%s - %s" % (self.driver.name, self.driver.ci)) def addTruck(self): addTruckDialog = AddTruck(self) if addTruckDialog.exec_() == QtGui.QDialog.Accepted: self.setTruck(addTruckDialog.truck) def setTruck(self, truck): self.truck = truck self.ui.truckLineEdit.setText( "%s - %s" % (self.truck.license_plate, self.truck.carrier.name)) def setManualCapture(self): if self.ui.manualCheckBox.isChecked(): self.ui.incomingWeightSpinBox.setEnabled(True) self.ui.captureWeightButton.setEnabled(False) self.ui.captureWeightButton.setChecked(False) else: self.ui.incomingWeightSpinBox.setEnabled(False) self.ui.captureWeightButton.setEnabled(True) def getWeight(self, weight): if not self.ui.captureWeightButton.isChecked( ) and not self.ui.manualCheckBox.isChecked(): self.ui.incomingWeightSpinBox.setValue(weight) def getTrucksFinished(self, trucks): self.trucksListModel = TrucksListModel(trucks, self) self.ui.trucksComboBox.setModel(self.trucksListModel) self.ui.trucksComboBox.setCurrentIndex(-1)