Settlement.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. using Domain.Entities.Donations.ValueObject;
  4. using Domain.Entities.Members;
  5. namespace Domain.Entities.Donations;
  6. public class Settlement
  7. {
  8. [ForeignKey(nameof(ChannelID))]
  9. public virtual Channel? Channel { get; private set; }
  10. [ForeignKey(nameof(MemberID))]
  11. public virtual Member? Member { get; private set; }
  12. [Key]
  13. public int ID { get; private set; }
  14. public int ChannelID { get; private set; }
  15. public int MemberID { get; private set; }
  16. public DateTime PeriodStart { get; private set; }
  17. public DateTime PeriodEnd { get; private set; }
  18. public int GrossAmount { get; private set; }
  19. public int FeeAmount { get; private set; }
  20. public int NetAmount { get; private set; }
  21. public SettlementStatus Status { get; private set; } = SettlementStatus.Pending;
  22. public DateTime RequestedAt { get; private set; } = DateTime.UtcNow;
  23. public DateTime? ApprovedAt { get; private set; }
  24. public DateTime? PaidAt { get; private set; }
  25. public string? AdminMemo { get; private set; }
  26. private Settlement() { }
  27. public static Settlement Create(
  28. int channelID,
  29. int memberID,
  30. DateTime periodStart,
  31. DateTime periodEnd,
  32. int grossAmount,
  33. int feeAmount,
  34. int netAmount
  35. ) {
  36. return new Settlement
  37. {
  38. ChannelID = channelID,
  39. MemberID = memberID,
  40. PeriodStart = periodStart,
  41. PeriodEnd = periodEnd,
  42. GrossAmount = grossAmount,
  43. FeeAmount = feeAmount,
  44. NetAmount = netAmount
  45. };
  46. }
  47. public void Approve(string? adminMemo = null)
  48. {
  49. Status = SettlementStatus.Approved;
  50. ApprovedAt = DateTime.UtcNow;
  51. AdminMemo = adminMemo;
  52. }
  53. public void Reject(string? adminMemo = null)
  54. {
  55. Status = SettlementStatus.Rejected;
  56. AdminMemo = adminMemo;
  57. }
  58. public void MarkPaid()
  59. {
  60. Status = SettlementStatus.Paid;
  61. PaidAt = DateTime.UtcNow;
  62. }
  63. }