Skip to content

Commit 6185f94

Browse files
committed
archive paid invoices in the history tab
1 parent 8e90d6a commit 6185f94

5 files changed

Lines changed: 28 additions & 25 deletions

File tree

gui/kivy/main_window.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ def on_complete(ok, msg):
729729
if self.send_screen:
730730
self.send_screen.do_clear()
731731
if pr:
732-
pr.set_paid(tx.txid())
732+
self.wallet.invoices.set_paid(pr, tx.txid())
733733
self.wallet.invoices.save()
734734
self.update_tab('invoices')
735735
else:

gui/qt/history_list.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def on_update(self):
7979
for h_item in h:
8080
tx_hash, height, conf, timestamp, value, balance = h_item
8181
status, status_str = self.wallet.get_tx_status(tx_hash, height, conf, timestamp)
82+
has_invoice = self.wallet.invoices.paid.get(tx_hash)
8283
icon = QIcon(":icons/" + TX_ICONS[status])
8384
v_str = self.parent.format_amount(value, True, whitespaces=True)
8485
balance_str = self.parent.format_amount(balance, whitespaces=True)
@@ -91,6 +92,8 @@ def on_update(self):
9192
entry.append(text)
9293
item = QTreeWidgetItem(entry)
9394
item.setIcon(0, icon)
95+
if has_invoice:
96+
item.setIcon(3, QIcon(":icons/seal"))
9497
for i in range(len(entry)):
9598
if i>3:
9699
item.setTextAlignment(i, Qt.AlignRight)
@@ -144,6 +147,8 @@ def create_menu(self, position):
144147
tx = self.wallet.transactions.get(tx_hash)
145148
is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
146149
is_unconfirmed = height <= 0
150+
pr_key = self.wallet.invoices.paid.get(tx_hash)
151+
147152
menu = QMenu()
148153

149154
menu.addAction(_("Copy %s")%column_title, lambda: self.parent.app.clipboard().setText(column_data))
@@ -159,6 +164,8 @@ def create_menu(self, position):
159164
child_tx = self.wallet.cpfp(tx, 0)
160165
if child_tx:
161166
menu.addAction(_("Child pays for parent"), lambda: self.parent.cpfp(tx, child_tx))
167+
if pr_key:
168+
menu.addAction(QIcon(":icons/seal"), _("View invoice"), lambda: self.parent.show_invoice(pr_key))
162169
if tx_URL:
163170
menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
164171
menu.exec_(self.viewport().mapToGlobal(position))

gui/qt/invoice_list.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
from electrum.util import block_explorer_URL, format_satoshis, format_time
3030
from electrum.plugins import run_hook
3131

32-
3332
class InvoiceList(MyTreeWidget):
3433
filter_columns = [0, 1, 2, 3] # Date, Requestor, Description, Amount
3534

@@ -40,7 +39,7 @@ def __init__(self, parent):
4039
self.setColumnWidth(1, 200)
4140

4241
def on_update(self):
43-
inv_list = self.parent.invoices.sorted_list()
42+
inv_list = self.parent.invoices.unpaid_invoices()
4443
self.clear()
4544
for pr in inv_list:
4645
key = pr.get_id()

gui/qt/main_window.py

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,7 +1383,7 @@ def broadcast_thread():
13831383
return False, _("Payment request has expired")
13841384
status, msg = self.network.broadcast(tx)
13851385
if pr and status is True:
1386-
pr.set_paid(tx.txid())
1386+
self.invoices.set_paid(pr, tx.txid())
13871387
self.invoices.save()
13881388
self.payment_request = None
13891389
refund_address = self.wallet.get_receiving_addresses()[0]
@@ -1621,27 +1621,18 @@ def show_pr_details(self, pr):
16211621
grid = QGridLayout()
16221622
grid.addWidget(QLabel(_("Requestor") + ':'), 0, 0)
16231623
grid.addWidget(QLabel(pr.get_requestor()), 0, 1)
1624-
grid.addWidget(QLabel(_("Expires") + ':'), 1, 0)
1625-
grid.addWidget(QLabel(format_time(pr.get_expiration_date())), 1, 1)
1626-
grid.addWidget(QLabel(_("Memo") + ':'), 2, 0)
1627-
grid.addWidget(QLabel(pr.get_memo()), 2, 1)
1628-
grid.addWidget(QLabel(_("Signature") + ':'), 3, 0)
1629-
grid.addWidget(QLabel(pr.get_verify_status()), 3, 1)
1630-
grid.addWidget(QLabel(_("Payment URL") + ':'), 4, 0)
1631-
grid.addWidget(QLabel(pr.payment_url), 4, 1)
1632-
grid.addWidget(QLabel(_("Outputs") + ':'), 5, 0)
1633-
outputs_str = '\n'.join(map(lambda x: x[1] + ' ' + self.format_amount(x[2])+ self.base_unit(), pr.get_outputs()))
1634-
grid.addWidget(QLabel(outputs_str), 5, 1)
1635-
if pr.tx:
1636-
grid.addWidget(QLabel(_("Transaction ID") + ':'), 6, 0)
1637-
l = QLineEdit(pr.tx)
1638-
l.setReadOnly(True)
1639-
grid.addWidget(l, 6, 1)
1624+
grid.addWidget(QLabel(_("Amount") + ':'), 1, 0)
1625+
outputs_str = '\n'.join(map(lambda x: self.format_amount(x[2])+ self.base_unit() + ' @ ' + x[1], pr.get_outputs()))
1626+
grid.addWidget(QLabel(outputs_str), 1, 1)
1627+
grid.addWidget(QLabel(_("Expires") + ':'), 2, 0)
1628+
grid.addWidget(QLabel(format_time(pr.get_expiration_date())), 2, 1)
1629+
grid.addWidget(QLabel(_("Memo") + ':'), 3, 0)
1630+
grid.addWidget(QLabel(pr.get_memo()), 3, 1)
1631+
grid.addWidget(QLabel(_("Signature") + ':'), 4, 0)
1632+
grid.addWidget(QLabel(pr.get_verify_status()), 4, 1)
16401633
vbox.addLayout(grid)
16411634
vbox.addLayout(Buttons(CloseButton(d)))
16421635
d.exec_()
1643-
return
1644-
16451636

16461637
def do_pay_invoice(self, key):
16471638
pr = self.invoices.get(key)

lib/paymentrequest.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,9 +298,6 @@ def send_ack(self, raw_tx, refund_addr):
298298
print "PaymentACK message received: %s" % paymntack.memo
299299
return True, paymntack.memo
300300

301-
def set_paid(self, tx_hash):
302-
self.tx = tx_hash
303-
304301

305302
def make_unsigned_request(req):
306303
from transaction import Transaction
@@ -460,16 +457,23 @@ class InvoiceStore(object):
460457
def __init__(self, storage):
461458
self.storage = storage
462459
self.invoices = {}
460+
self.paid = {}
463461
d = self.storage.get('invoices', {})
464462
self.load(d)
465463

464+
def set_paid(self, pr, txid):
465+
pr.tx = txid
466+
self.paid[txid] = pr.get_id()
467+
466468
def load(self, d):
467469
for k, v in d.items():
468470
try:
469471
pr = PaymentRequest(v.get('hex').decode('hex'))
470472
pr.tx = v.get('txid')
471473
pr.requestor = v.get('requestor')
472474
self.invoices[k] = pr
475+
if pr.tx:
476+
self.paid[pr.tx] = k
473477
except:
474478
continue
475479

@@ -517,3 +521,5 @@ def sorted_list(self):
517521
# sort
518522
return self.invoices.values()
519523

524+
def unpaid_invoices(self):
525+
return [ self.invoices[k] for k in filter(lambda x: self.get_status(x)!=PR_PAID, self.invoices.keys())]

0 commit comments

Comments
 (0)