From ec502bdd154296844346666a1e7497a52938eeef Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Thu, 12 Oct 2023 06:49:54 +0000 Subject: [PATCH] Show possible duplicate transactions --- apiserver/apiserver/api/views.py | 14 ++++++++ webclient/src/Home.js | 6 +++- webclient/src/Transactions.js | 58 ++++++++++++++++++++++++++++---- 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/apiserver/apiserver/api/views.py b/apiserver/apiserver/api/views.py index 22de65f..4e1d8ae 100644 --- a/apiserver/apiserver/api/views.py +++ b/apiserver/apiserver/api/views.py @@ -507,6 +507,8 @@ class TransactionViewSet(Base, List, Create, Retrieve, Update): def get_queryset(self): queryset = models.Transaction.objects month = self.request.query_params.get('month', '') + date = self.request.query_params.get('date', '') + member_id = self.request.query_params.get('member_id', '') exclude_paypal = self.request.query_params.get('exclude_paypal', '') == 'true' exclude_snacks = self.request.query_params.get('exclude_snacks', '') == 'true' exclude_dues = self.request.query_params.get('exclude_dues', '') == 'true' @@ -520,10 +522,22 @@ class TransactionViewSet(Base, List, Create, Retrieve, Update): queryset = queryset.filter(date__year=dt.year) queryset = queryset.filter(date__month=dt.month) queryset = queryset.exclude(category='Memberships:Fake Months') + elif date: + try: + dt = datetime.datetime.strptime(date, '%Y-%m-%d') + except ValueError: + raise exceptions.ValidationError(dict(date='Should be YYYY-MM-DD.')) + queryset = queryset.filter(date__year=dt.year) + queryset = queryset.filter(date__month=dt.month) + queryset = queryset.filter(date__day=dt.day) + queryset = queryset.exclude(category='Memberships:Fake Months') else: queryset = queryset.exclude(report_type__isnull=True) queryset = queryset.exclude(report_type='') + if member_id: + queryset = queryset.filter(user__member__id=member_id) + if exclude_paypal: queryset = queryset.exclude(account_type='PayPal') diff --git a/webclient/src/Home.js b/webclient/src/Home.js index fe2b1e4..f9d4998 100644 --- a/webclient/src/Home.js +++ b/webclient/src/Home.js @@ -397,7 +397,11 @@ export function Home(props) {

ORD3 printer: {printer3dStat('ord3')}

- {user &&

Alarm status: {alarmStat()}

} + {user ? +

Alarm status: {alarmStat()}

+ : +

Alarm status: Unauthorized

+ } {user &&

Hosting status: {closedStat()}

} diff --git a/webclient/src/Transactions.js b/webclient/src/Transactions.js index bd06e14..8ddd85d 100644 --- a/webclient/src/Transactions.js +++ b/webclient/src/Transactions.js @@ -12,10 +12,44 @@ export function TransactionEditor(props) { const { token, input, setInput, error } = props; const [prevInput] = useState(input); + const [prevTransactions, setPrevTransactions] = useState([]); + const [txError, setTxError] = useState(false); const handleValues = (e, v) => setInput({ ...input, [v.name]: v.value }); const handleChange = (e) => handleValues(e, e.currentTarget); + const checkPrevTransactions = (member_id, date) => { + console.log(member_id, date); + + const isValidISODate = /^\d{4}-\d{2}-\d{2}$/.test(date); + + if (!member_id || !isValidISODate) { + return; + } + + console.log('Checking previous transactions:', member_id, date); + + requester('/transactions/?date=' + date + '&member_id=' + member_id, 'GET', token) + .then(res => { + setTxError(false); + setPrevTransactions(res.results); + }) + .catch(err => { + console.log(err); + setTxError(true); + }); + }; + + const handleMemberValue = (e, v) => { + checkPrevTransactions(v.value, input.date); + handleValues(e, v); + }; + + const handleDateValue = (e) => { + checkPrevTransactions(input.member_id, e.currentTarget.value); + handleChange(e); + }; + const makeProps = (name) => ({ name: name, onChange: handleChange, @@ -70,18 +104,27 @@ export function TransactionEditor(props) { + {!!prevTransactions.length && + +

These are from the same member, same day.

+ +
} + + {txError &&

Error checking for duplicate transactions.

} + {!isMobile && - Date + {!noDate && Date} {!noMember && Member} Amount Method {!noCategory && Category} + {!!addRef && Reference} Memo } @@ -233,9 +277,10 @@ export function TransactionList(props) { {transactions.length ? transactions.map(x => - + {!noDate && {moment(x.date).format('ll')} - + } + {!noMember && {x.member_id ? @@ -248,6 +293,7 @@ export function TransactionList(props) { {isMobile && 'Amount: '}{x.protocoin !== '0.00' ? '₱ ' + x.protocoin : '$ ' + x.amount} {isMobile && 'Method: '}{x.account_type} {!noCategory && {isMobile && 'Category: '}{x.category}} + {!!addRef && {isMobile && 'Reference: '}{x.reference_number}} {x.memo || x.report_memo} )