Skip to content

Commit 7c1cbc2

Browse files
Filter history by date (#730)
1 parent eacecea commit 7c1cbc2

File tree

3 files changed

+119
-9
lines changed

3 files changed

+119
-9
lines changed

app/core/myeclpay/cruds_myeclpay.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from datetime import datetime
33
from uuid import UUID
44

5-
from sqlalchemy import delete, or_, select, update
5+
from sqlalchemy import and_, delete, or_, select, update
66
from sqlalchemy.ext.asyncio import AsyncSession
77
from sqlalchemy.orm import selectinload
88

@@ -651,6 +651,8 @@ async def get_transactions(
651651
async def get_transactions_by_wallet_id(
652652
wallet_id: UUID,
653653
db: AsyncSession,
654+
start_datetime: datetime | None = None,
655+
end_datetime: datetime | None = None,
654656
) -> Sequence[models_myeclpay.Transaction]:
655657
result = await db.execute(
656658
select(models_myeclpay.Transaction)
@@ -659,6 +661,12 @@ async def get_transactions_by_wallet_id(
659661
models_myeclpay.Transaction.debited_wallet_id == wallet_id,
660662
models_myeclpay.Transaction.credited_wallet_id == wallet_id,
661663
),
664+
models_myeclpay.Transaction.creation >= start_datetime
665+
if start_datetime
666+
else and_(True),
667+
models_myeclpay.Transaction.creation <= end_datetime
668+
if end_datetime
669+
else and_(True),
662670
)
663671
.options(
664672
selectinload(models_myeclpay.Transaction.debited_wallet),
@@ -718,10 +726,21 @@ async def confirm_transfer(
718726
async def get_transfers_by_wallet_id(
719727
wallet_id: UUID,
720728
db: AsyncSession,
729+
start_datetime: datetime | None = None,
730+
end_datetime: datetime | None = None,
721731
) -> Sequence[models_myeclpay.Transfer]:
722732
result = await db.execute(
723-
select(models_myeclpay.Transfer).where(
733+
select(models_myeclpay.Transfer)
734+
.where(
724735
models_myeclpay.Transfer.wallet_id == wallet_id,
736+
)
737+
.where(
738+
models_myeclpay.Transfer.creation >= start_datetime
739+
if start_datetime
740+
else and_(True),
741+
models_myeclpay.Transfer.creation <= end_datetime
742+
if end_datetime
743+
else and_(True),
725744
),
726745
)
727746
return result.scalars().all()
@@ -867,6 +886,8 @@ async def get_refund_by_transaction_id(
867886
async def get_refunds_by_wallet_id(
868887
wallet_id: UUID,
869888
db: AsyncSession,
889+
start_datetime: datetime | None = None,
890+
end_datetime: datetime | None = None,
870891
) -> Sequence[schemas_myeclpay.Refund]:
871892
result = (
872893
(
@@ -876,6 +897,12 @@ async def get_refunds_by_wallet_id(
876897
models_myeclpay.Refund.debited_wallet_id == wallet_id,
877898
models_myeclpay.Refund.credited_wallet_id == wallet_id,
878899
),
900+
models_myeclpay.Refund.creation >= start_datetime
901+
if start_datetime
902+
else and_(True),
903+
models_myeclpay.Refund.creation <= end_datetime
904+
if end_datetime
905+
else and_(True),
879906
),
880907
)
881908
)

app/core/myeclpay/endpoints_myeclpay.py

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import logging
33
import urllib
44
import uuid
5-
from datetime import UTC, datetime, timedelta
5+
from datetime import UTC, date, datetime, timedelta
66
from pathlib import Path
77
from uuid import UUID
88

@@ -491,6 +491,8 @@ async def create_store(
491491
)
492492
async def get_store_history(
493493
store_id: UUID,
494+
start_date: date | None = None,
495+
end_date: date | None = None,
494496
db: AsyncSession = Depends(get_db),
495497
user: CoreUser = Depends(is_user()),
496498
):
@@ -520,11 +522,25 @@ async def get_store_history(
520522
detail="User is not authorized to see the store history",
521523
)
522524

525+
history = []
526+
527+
start_datetime = (
528+
datetime.combine(start_date, datetime.min.time(), tzinfo=UTC)
529+
if start_date
530+
else None
531+
)
532+
end_datetime = (
533+
datetime.combine(end_date, datetime.max.time(), tzinfo=UTC)
534+
if end_date
535+
else None
536+
)
537+
523538
transactions = await cruds_myeclpay.get_transactions_by_wallet_id(
524539
wallet_id=store.wallet_id,
525540
db=db,
541+
start_datetime=start_datetime,
542+
end_datetime=end_datetime,
526543
)
527-
history = []
528544
for transaction in transactions:
529545
history_refund: schemas_myeclpay.HistoryRefund | None = None
530546
if transaction.refund is not None:
@@ -566,6 +582,8 @@ async def get_store_history(
566582
transfers = await cruds_myeclpay.get_transfers_by_wallet_id(
567583
wallet_id=store.wallet_id,
568584
db=db,
585+
start_datetime=start_datetime,
586+
end_datetime=end_datetime,
569587
)
570588
if len(transfers) > 0:
571589
hyperion_error_logger.error(
@@ -576,6 +594,8 @@ async def get_store_history(
576594
refunds = await cruds_myeclpay.get_refunds_by_wallet_id(
577595
wallet_id=store.wallet_id,
578596
db=db,
597+
start_datetime=start_datetime,
598+
end_datetime=end_datetime,
579599
)
580600
for refund in refunds:
581601
if refund.debited_wallet_id == store.wallet_id:
@@ -1529,6 +1549,8 @@ async def revoke_user_devices(
15291549
async def get_user_wallet_history(
15301550
db: AsyncSession = Depends(get_db),
15311551
user: CoreUser = Depends(is_user()),
1552+
start_date: date | None = None,
1553+
end_date: date | None = None,
15321554
):
15331555
"""
15341556
Get all transactions for the current user's wallet.
@@ -1546,12 +1568,25 @@ async def get_user_wallet_history(
15461568
detail="User is not registered for MyECL Pay",
15471569
)
15481570

1571+
start_datetime = (
1572+
datetime.combine(start_date, datetime.min.time(), tzinfo=UTC)
1573+
if start_date
1574+
else None
1575+
)
1576+
end_datetime = (
1577+
datetime.combine(end_date, datetime.max.time(), tzinfo=UTC)
1578+
if end_date
1579+
else None
1580+
)
1581+
15491582
history: list[schemas_myeclpay.History] = []
15501583

15511584
# First we get all received and send transactions
15521585
transactions = await cruds_myeclpay.get_transactions_by_wallet_id(
15531586
wallet_id=user_payment.wallet_id,
15541587
db=db,
1588+
start_datetime=start_datetime,
1589+
end_datetime=end_datetime,
15551590
)
15561591

15571592
for transaction in transactions:
@@ -1594,6 +1629,8 @@ async def get_user_wallet_history(
15941629
transfers = await cruds_myeclpay.get_transfers_by_wallet_id(
15951630
wallet_id=user_payment.wallet_id,
15961631
db=db,
1632+
start_datetime=start_datetime,
1633+
end_datetime=end_datetime,
15971634
)
15981635

15991636
for transfer in transfers:
@@ -1619,6 +1656,8 @@ async def get_user_wallet_history(
16191656
refunds = await cruds_myeclpay.get_refunds_by_wallet_id(
16201657
wallet_id=user_payment.wallet_id,
16211658
db=db,
1659+
start_datetime=start_datetime,
1660+
end_datetime=end_datetime,
16221661
)
16231662
for refund in refunds:
16241663
if refund.debited_wallet_id == user_payment.wallet_id:
@@ -1640,7 +1679,6 @@ async def get_user_wallet_history(
16401679
)
16411680

16421681
return history
1643-
# TODO: limite by datetime
16441682

16451683

16461684
# TODO: do we keep this endpoint?

tests/test_myeclpay.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ async def init_objects() -> None:
267267
transaction_type=TransactionType.DIRECT,
268268
seller_user_id=ecl_user2.id,
269269
total=500, # 5€
270-
creation=datetime.now(UTC),
270+
creation=datetime(2025, 5, 20, 12, 0, 0, tzinfo=UTC),
271271
status=TransactionStatus.CONFIRMED,
272272
store_note="transaction_from_ecl_user_to_store",
273273
)
@@ -282,7 +282,7 @@ async def init_objects() -> None:
282282
transaction_type=TransactionType.DIRECT,
283283
seller_user_id=ecl_user2.id,
284284
total=600,
285-
creation=datetime.now(UTC),
285+
creation=datetime(2025, 5, 19, 12, 0, 0, tzinfo=UTC),
286286
status=TransactionStatus.CONFIRMED,
287287
store_note="transaction_from_ecl_user_to_ecl_user2",
288288
)
@@ -297,7 +297,7 @@ async def init_objects() -> None:
297297
transaction_type=TransactionType.DIRECT,
298298
seller_user_id=ecl_user2.id,
299299
total=700,
300-
creation=datetime.now(UTC),
300+
creation=datetime(2025, 5, 18, 12, 0, 0, tzinfo=UTC),
301301
status=TransactionStatus.CONFIRMED,
302302
store_note="transaction_from_store_to_ecl_user",
303303
)
@@ -312,7 +312,7 @@ async def init_objects() -> None:
312312
transaction_type=TransactionType.DIRECT,
313313
seller_user_id=ecl_user2.id,
314314
total=800,
315-
creation=datetime.now(UTC),
315+
creation=datetime(2025, 5, 17, 12, 0, 0, tzinfo=UTC),
316316
status=TransactionStatus.CONFIRMED,
317317
store_note="transaction_from_ecl_user2_to_ecl_user",
318318
)
@@ -1336,6 +1336,51 @@ def test_get_transactions_success(client: TestClient):
13361336
)
13371337

13381338

1339+
def test_get_transactions_success_with_date(client: TestClient):
1340+
"""Test successfully getting user transactions"""
1341+
response = client.get(
1342+
"/myeclpay/users/me/wallet/history",
1343+
params={
1344+
"start_date": "2025-05-18",
1345+
"end_date": "2025-05-19",
1346+
},
1347+
headers={"Authorization": f"Bearer {ecl_user_access_token}"},
1348+
)
1349+
assert response.status_code == 200
1350+
1351+
transactions = response.json()
1352+
assert len(transactions) == 2
1353+
transactions_dict = {UUID(t["id"]): t for t in transactions}
1354+
1355+
assert (
1356+
transactions_dict[transaction_from_ecl_user_to_ecl_user2.id][
1357+
"other_wallet_name"
1358+
]
1359+
== "firstname ECL User 2 (nickname)"
1360+
)
1361+
assert (
1362+
transactions_dict[transaction_from_ecl_user_to_ecl_user2.id]["type"] == "given"
1363+
)
1364+
assert transactions_dict[transaction_from_ecl_user_to_ecl_user2.id]["total"] == 600
1365+
assert (
1366+
transactions_dict[transaction_from_ecl_user_to_ecl_user2.id]["status"]
1367+
== "confirmed"
1368+
)
1369+
1370+
assert (
1371+
transactions_dict[transaction_from_store_to_ecl_user.id]["other_wallet_name"]
1372+
== "Test Store"
1373+
)
1374+
assert (
1375+
transactions_dict[transaction_from_store_to_ecl_user.id]["type"] == "received"
1376+
)
1377+
assert transactions_dict[transaction_from_store_to_ecl_user.id]["total"] == 700
1378+
assert (
1379+
transactions_dict[transaction_from_store_to_ecl_user.id]["status"]
1380+
== "confirmed"
1381+
)
1382+
1383+
13391384
def test_transfer_with_redirect_url_not_trusted(client: TestClient):
13401385
"""Test transferring with an unregistered user"""
13411386
response = client.post(

0 commit comments

Comments
 (0)