def parseJSON(self): # Slip data might be in a root element or in ticket/document/receipt if 'ticket' in self.slip_json: sub = self.slip_json['ticket'] if 'document' in sub: sub = sub['document'] if 'receipt' in sub: slip = sub['receipt'] else: logging.error( g_tr('ImportSlipDialog', "Can't find 'receipt' tag in json 'document'")) return else: logging.error( g_tr('ImportSlipDialog', "Can't find 'document' tag in json 'ticket'")) return else: slip = self.slip_json # Get operation type operation = 0 if 'operationType' in slip: operation = int(slip['operationType']) else: logging.error( g_tr('ImportSlipDialog', "Can't find 'operationType' tag in json 'ticket'")) return # Get shop name shop_name = '' if 'user' in slip: shop_name = self.SlipShopName.setText(slip['user']) if (not shop_name) and ('userInn' in slip): shop_name = self.slipsAPI.get_shop_name_by_inn(slip['userInn']) self.SlipShopName.setText(shop_name) peer_id = self.match_shop_name(self.SlipShopName.text()) if peer_id is not None: self.PeerEdit.selected_id = peer_id try: self.slip_lines = pd.DataFrame(slip['items']) except: return # Get date from timestamp if 'dateTime' in slip: slip_datetime = QDateTime() slip_datetime.setSecsSinceEpoch(int(slip['dateTime'])) self.SlipDateTime.setDateTime(slip_datetime) # Convert price to roubles self.slip_lines['price'] = self.slip_lines['price'] / 100 if operation == self.OPERATION_PURCHASE: self.slip_lines['sum'] = -self.slip_lines['sum'] / 100 elif operation == self.OPERATION_RETURN: self.slip_lines['sum'] = self.slip_lines['sum'] / 100 else: logging.error( g_tr('ImportSlipDialog', "Unknown operation type ") + f"{operation}") return # Use quantity if it differs from 1 unit value self.slip_lines.loc[self.slip_lines['quantity'] != 1, 'name'] = \ self.slip_lines.agg('{0[name]} ({0[quantity]:g} x {0[price]:.2f})'.format, axis=1) # Assign empty category self.slip_lines['category'] = 0 self.slip_lines['confidence'] = 1 # Assign empty tags self.slip_lines['tag'] = None self.slip_lines = self.slip_lines[[ 'name', 'category', 'confidence', 'tag', 'sum' ]] self.model = PandasLinesModel(self.slip_lines) self.LinesTableView.setModel(self.model) self.delegate = SlipLinesDelegate(self.LinesTableView) for column in range(self.model.columnCount()): if column == 0: self.LinesTableView.horizontalHeader().setSectionResizeMode( column, QHeaderView.Stretch) elif column == 1: self.LinesTableView.setColumnWidth(column, 200) elif column == 2: self.LinesTableView.setColumnHidden(column, True) else: self.LinesTableView.setColumnWidth(column, 100) self.LinesTableView.setItemDelegateForColumn(column, self.delegate) font = self.LinesTableView.horizontalHeader().font() font.setBold(True) self.LinesTableView.horizontalHeader().setFont(font) self.LinesTableView.show()
def parseJSON(self): # Slip data might be in a root element or in ticket/document/receipt if 'ticket' in self.slip_json: sub = self.slip_json['ticket'] if 'document' in sub: sub = sub['document'] if 'receipt' in sub: slip = sub['receipt'] else: logging.error( g_tr('ImportSlipDialog', "Can't find 'receipt' tag in json 'document'")) return else: logging.error( g_tr('ImportSlipDialog', "Can't find 'document' tag in json 'ticket'")) return else: slip = self.slip_json # Shop name may be present or only INN may be there if 'user' in slip: self.SlipShopName.setText(slip['user']) else: if 'userInn' in slip: name_by_inn = self.slipsAPI.get_shop_name_by_inn( slip['userInn']) if name_by_inn: self.SlipShopName.setText(name_by_inn) else: self.SlipShopName.setText(slip['userInn']) peer_id = self.match_shop_name(self.SlipShopName.text()) if peer_id is not None: self.PeerEdit.selected_id = peer_id try: self.slip_lines = pd.DataFrame(slip['items']) except: return # Get date from timestamp if 'dateTime' in slip: slip_datetime = QDateTime() slip_datetime.setSecsSinceEpoch(int(slip['dateTime'])) self.SlipDateTime.setDateTime(slip_datetime) # Convert price to roubles self.slip_lines['price'] = self.slip_lines['price'] / 100 self.slip_lines['sum'] = -self.slip_lines['sum'] / 100 self.slip_lines['category'] = 0 self.slip_lines = self.slip_lines[['name', 'category', 'sum']] self.model = PandasLinesModel(self.slip_lines, self.db) self.LinesTableView.setModel(self.model) self.delegates = [] for column in range(self.model.columnCount()): if column == 0: self.LinesTableView.horizontalHeader().setSectionResizeMode( column, QHeaderView.Stretch) elif column == 1: self.LinesTableView.setColumnWidth(column, 200) else: self.LinesTableView.setColumnWidth(column, 100) self.delegates.append(SlipLinesPandasDelegate(self.LinesTableView)) self.LinesTableView.setItemDelegateForColumn( column, self.delegates[-1]) font = self.LinesTableView.horizontalHeader().font() font.setBold(True) self.LinesTableView.horizontalHeader().setFont(font) self.LinesTableView.show()