Skip to content

Commit 89e3f8e

Browse files
Merge pull request #621 from nofrixion/MOOV-4725-payment-request-model-improvements
Payment request model improvements.
2 parents 0e00bac + 91b4e54 commit 89e3f8e

File tree

4 files changed

+125
-0
lines changed

4 files changed

+125
-0
lines changed

src/NoFrixion.MoneyMoov/Extensions/PaymentRequestEventExtensions.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,4 +368,43 @@ private static List<PaymentRequestEvent> GetAllCardSaleEvents(
368368
.Where(x => x.EventType == PaymentRequestEventTypesEnum.card_sale)
369369
.ToList() : new List<PaymentRequestEvent>();
370370
}
371+
372+
private static bool IsPispRelatedEvent(this PaymentRequestEvent paymentRequestEvent)
373+
{
374+
return
375+
paymentRequestEvent.EventType == PaymentRequestEventTypesEnum.pisp_initiate ||
376+
paymentRequestEvent.EventType == PaymentRequestEventTypesEnum.pisp_callback ||
377+
paymentRequestEvent.EventType == PaymentRequestEventTypesEnum.pisp_webhook ||
378+
paymentRequestEvent.EventType == PaymentRequestEventTypesEnum.pisp_settle ||
379+
paymentRequestEvent.EventType == PaymentRequestEventTypesEnum.pisp_settle_failure ||
380+
paymentRequestEvent.EventType == PaymentRequestEventTypesEnum.pisp_refund_initiated ||
381+
paymentRequestEvent.EventType == PaymentRequestEventTypesEnum.pisp_refund_settled;
382+
}
383+
384+
private static bool IsDirectDebitRelatedEvent(this PaymentRequestEvent paymentRequestEvent)
385+
{
386+
return paymentRequestEvent.EventType == PaymentRequestEventTypesEnum.direct_debit_create ||
387+
paymentRequestEvent.EventType == PaymentRequestEventTypesEnum.direct_debit_failed ||
388+
paymentRequestEvent.EventType == PaymentRequestEventTypesEnum.direct_debit_paid;
389+
}
390+
391+
public static PaymentMethodTypeEnum GetPaymentMethodType(this PaymentRequestEvent paymentRequestEvent)
392+
{
393+
if (paymentRequestEvent.IsCardRelatedEvent())
394+
{
395+
return PaymentMethodTypeEnum.card;
396+
}
397+
398+
if (paymentRequestEvent.IsPispRelatedEvent())
399+
{
400+
return PaymentMethodTypeEnum.pisp;
401+
}
402+
403+
if (paymentRequestEvent.IsDirectDebitRelatedEvent())
404+
{
405+
return PaymentMethodTypeEnum.directDebit;
406+
}
407+
408+
return PaymentMethodTypeEnum.None;
409+
}
371410
}

src/NoFrixion.MoneyMoov/Extensions/PaymentRequestExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ public static List<PaymentRequestPaymentAttempt> GetPaymentAttempts(this IEnumer
3535
paymentAttempts.AddRange(GetPispPaymentAttempts(events));
3636
paymentAttempts.AddRange(GetLightningPaymentAttempts(events));
3737
paymentAttempts.AddRange(GetDirectDebitPaymentAttempts(events));
38+
39+
paymentAttempts.Sort(
40+
(x, y) => y.InitiatedAt.CompareTo(x.InitiatedAt));
3841

3942
return paymentAttempts;
4043
}

src/NoFrixion.MoneyMoov/Models/PaymentRequests/PaymentRequestEvent.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
//-----------------------------------------------------------------------------
1919

2020
using System.ComponentModel.DataAnnotations;
21+
using NoFrixion.MoneyMoov.Extensions;
2122

2223
namespace NoFrixion.MoneyMoov.Models;
2324

@@ -211,4 +212,9 @@ public decimal DisplayAmount()
211212
_ => Math.Round(Amount, PaymentsConstants.FIAT_ROUNDING_DECIMAL_PLACES)
212213
};
213214
}
215+
216+
/// <summary>
217+
/// The type of payment method the event relates to, e.g. card, pisp, etc.
218+
/// </summary>
219+
public PaymentMethodTypeEnum PaymentMethodType => this.GetPaymentMethodType();
214220
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// -----------------------------------------------------------------------------
2+
// Filename: PaymentRequestExtensionsTests.cs
3+
//
4+
// Description: Unit tests for the PaymentRequestExtensions.
5+
// Author(s):
6+
// Saurav Maiti ([email protected])
7+
//
8+
// History:
9+
// 29 Jul 2025 Saurav Maiti Created, Hamilton gardens, Dublin, Ireland.
10+
//
11+
// License:
12+
// MIT.
13+
// -----------------------------------------------------------------------------
14+
15+
using NoFrixion.MoneyMoov.Extensions;
16+
using NoFrixion.MoneyMoov.Models;
17+
using Xunit;
18+
19+
namespace NoFrixion.MoneyMoov.UnitTests.Extensions;
20+
21+
public class PaymentRequestExtensionsTests
22+
{
23+
[Fact]
24+
public void PaymentRequestExtensions_GetPaymentAttempts_ReturnsDescendingByInitiatedAt()
25+
{
26+
// Arrange
27+
var paymentRequestEvents = new List<PaymentRequestEvent>()
28+
{
29+
new PaymentRequestEvent
30+
{
31+
ID = Guid.NewGuid(),
32+
PaymentRequestID = Guid.NewGuid(),
33+
Amount = 100,
34+
Currency = CurrencyTypeEnum.EUR,
35+
Inserted = DateTime.UtcNow,
36+
EventType = PaymentRequestEventTypesEnum.pisp_initiate,
37+
Status = PaymentRequestResult.PISP_YAPILY_PENDING_STATUS,
38+
PispPaymentInitiationID = "initiation1",
39+
PispPaymentServiceProviderID = "bankofireland"
40+
},
41+
new PaymentRequestEvent
42+
{
43+
ID = Guid.NewGuid(),
44+
PaymentRequestID = Guid.NewGuid(),
45+
Amount = 100,
46+
Currency = CurrencyTypeEnum.EUR,
47+
Inserted = DateTime.UtcNow.AddMinutes(-5),
48+
EventType = PaymentRequestEventTypesEnum.pisp_initiate,
49+
Status = PaymentRequestResult.PISP_YAPILY_PENDING_STATUS,
50+
PispPaymentInitiationID = "initiation2",
51+
PispPaymentServiceProviderID = "bankofireland"
52+
},
53+
new PaymentRequestEvent
54+
{
55+
ID = Guid.NewGuid(),
56+
PaymentRequestID = Guid.NewGuid(),
57+
Amount = 100,
58+
Currency = CurrencyTypeEnum.EUR,
59+
Inserted = DateTime.UtcNow.AddMinutes(-10),
60+
EventType = PaymentRequestEventTypesEnum.pisp_initiate,
61+
Status = PaymentRequestResult.PISP_YAPILY_PENDING_STATUS,
62+
PispPaymentInitiationID = "initiation3",
63+
PispPaymentServiceProviderID = "bankofireland"
64+
}
65+
};
66+
67+
// Act
68+
var result = paymentRequestEvents.GetPaymentAttempts();
69+
70+
// Assert
71+
Assert.NotNull(result);
72+
Assert.Equal(3, result.Count);
73+
Assert.Equal("initiation1", result[0].AttemptKey);
74+
Assert.Equal("initiation2", result[1].AttemptKey);
75+
Assert.Equal("initiation3", result[2].AttemptKey);
76+
}
77+
}

0 commit comments

Comments
 (0)