Ensure unique transaction IDs
This commit is contained in:
parent
4e180f5151
commit
9d1e8af875
@ -304,7 +304,7 @@ def transactions():
|
|||||||
|
|
||||||
@app.route('/transaction')
|
@app.route('/transaction')
|
||||||
def transaction():
|
def transaction():
|
||||||
tid = flask.request.args['tid']
|
uuid = flask.request.args['uuid']
|
||||||
cash = flask.request.args.get('cash', False)
|
cash = flask.request.args.get('cash', False)
|
||||||
commodity = flask.request.args.get('commodity', False)
|
commodity = flask.request.args.get('commodity', False)
|
||||||
|
|
||||||
@ -314,7 +314,7 @@ def transaction():
|
|||||||
if cash:
|
if cash:
|
||||||
l = accounting.ledger_to_cash(l, report_commodity)
|
l = accounting.ledger_to_cash(l, report_commodity)
|
||||||
|
|
||||||
transaction = next((t for t in l.transactions if str(t.id) == tid))
|
transaction = next((t for t in l.transactions if str(t.uuid) == uuid))
|
||||||
|
|
||||||
if commodity:
|
if commodity:
|
||||||
total_dr = sum((p.amount for p in transaction.postings if p.amount > 0), Balance()).clean()
|
total_dr = sum((p.amount for p in transaction.postings if p.amount > 0), Balance()).clean()
|
||||||
|
@ -67,7 +67,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% for transaction in transactions %}
|
{% for transaction in transactions %}
|
||||||
{% set trn_url = '/transaction?' + {'tid': transaction.id, 'cash': 'on' if cash else ''}|urlencode %}
|
{% set trn_url = '/transaction?' + {'uuid': transaction.uuid, 'cash': 'on' if cash else ''}|urlencode %}
|
||||||
|
|
||||||
{% if transaction.has_comment_detail %}
|
{% if transaction.has_comment_detail %}
|
||||||
<tr class="trn-first">
|
<tr class="trn-first">
|
||||||
|
@ -66,7 +66,7 @@
|
|||||||
{% set ns.balance = opening_balance %}
|
{% set ns.balance = opening_balance %}
|
||||||
|
|
||||||
{% for transaction in transactions %}
|
{% for transaction in transactions %}
|
||||||
{% set trn_url = '/transaction?' + {'tid': transaction.id, 'cash': 'on' if cash else ''}|urlencode %}
|
{% set trn_url = '/transaction?' + {'uuid': transaction.uuid, 'cash': 'on' if cash else ''}|urlencode %}
|
||||||
{% for posting in transaction.postings if posting.account == account %}
|
{% for posting in transaction.postings if posting.account == account %}
|
||||||
{% set ns.balance = ns.balance + posting.amount %}
|
{% set ns.balance = ns.balance + posting.amount %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -20,6 +20,7 @@ from .model import *
|
|||||||
import csv
|
import csv
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
import hashlib
|
||||||
import re
|
import re
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
@ -92,11 +93,24 @@ def raw_transactions_at_date(date):
|
|||||||
|
|
||||||
output = run_ledger_date(date, 'csv', '--csv-format', '%(quoted(parent.id)),%(quoted(format_date(date))),%(quoted(parent.code)),%(quoted(payee)),%(quoted(account)),%(quoted(display_amount)),%(quoted(comment)),%(quoted(state))\n')
|
output = run_ledger_date(date, 'csv', '--csv-format', '%(quoted(parent.id)),%(quoted(format_date(date))),%(quoted(parent.code)),%(quoted(payee)),%(quoted(account)),%(quoted(display_amount)),%(quoted(comment)),%(quoted(state))\n')
|
||||||
|
|
||||||
|
uuids = set()
|
||||||
|
|
||||||
reader = csv.reader(output.splitlines(), dialect='ledger')
|
reader = csv.reader(output.splitlines(), dialect='ledger')
|
||||||
for trn_id, date_str, code, payee, account_str, amount_str, comment, state_str in reader:
|
for trn_id, date_str, code, payee, account_str, amount_str, comment, state_str in reader:
|
||||||
if not ledger.transactions or trn_id != ledger.transactions[-1].id:
|
if not ledger.transactions or trn_id != ledger.transactions[-1].id:
|
||||||
transaction = Transaction(ledger, trn_id, datetime.strptime(date_str, '%Y-%m-%d'), payee, code=code)
|
if trn_id in uuids:
|
||||||
|
digest = hashlib.sha256()
|
||||||
|
digest.update(trn_id.encode('utf-8'))
|
||||||
|
digest.update(date_str.encode('utf-8'))
|
||||||
|
digest.update(payee.encode('utf-8'))
|
||||||
|
uuid = digest.hexdigest()
|
||||||
|
else:
|
||||||
|
uuid = trn_id
|
||||||
|
|
||||||
|
transaction = Transaction(ledger, trn_id, datetime.strptime(date_str, '%Y-%m-%d'), payee, code=code, uuid=uuid)
|
||||||
ledger.transactions.append(transaction)
|
ledger.transactions.append(transaction)
|
||||||
|
|
||||||
|
uuids.add(uuid)
|
||||||
else:
|
else:
|
||||||
# Transaction ID matches: continuation of previous transaction
|
# Transaction ID matches: continuation of previous transaction
|
||||||
transaction = ledger.transactions[-1]
|
transaction = ledger.transactions[-1]
|
||||||
|
@ -65,12 +65,13 @@ class Ledger:
|
|||||||
return max(prices, key=lambda p: p[0])[2]
|
return max(prices, key=lambda p: p[0])[2]
|
||||||
|
|
||||||
class Transaction:
|
class Transaction:
|
||||||
def __init__(self, ledger, id, date, description, code=None):
|
def __init__(self, ledger, id, date, description, code=None, uuid=None):
|
||||||
self.ledger = ledger
|
self.ledger = ledger
|
||||||
self.id = id
|
self.id = id
|
||||||
self.date = date
|
self.date = date
|
||||||
self.description = description
|
self.description = description
|
||||||
self.code = code
|
self.code = code
|
||||||
|
self.uuid = uuid
|
||||||
|
|
||||||
self.postings = []
|
self.postings = []
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user