Donation.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. using Domain.Entities.Members;
  4. namespace Domain.Entities.Donations;
  5. public class Donation
  6. {
  7. [ForeignKey(nameof(SponsorMemberID))]
  8. public virtual Member? Sponsor { get; private set; }
  9. [ForeignKey(nameof(ReceiverMemberID))]
  10. public virtual Member? Receiver { get; private set; }
  11. [ForeignKey(nameof(ChannelID))]
  12. public virtual Channel? Channel { get; private set; }
  13. [ForeignKey(nameof(CrewSessionID))]
  14. public virtual CrewSession? CrewSession { get; private set; }
  15. [ForeignKey(nameof(CrewMemberID))]
  16. public virtual CrewMember? CrewMember { get; private set; }
  17. public virtual DonationAlert? DonationAlert { get; private set; }
  18. [Key]
  19. public int ID { get; private set; }
  20. public int SponsorMemberID { get; private set; }
  21. public int ReceiverMemberID { get; private set; }
  22. public int ChannelID { get; private set; }
  23. public int? CrewSessionID { get; private set; }
  24. public int? CrewMemberID { get; private set; }
  25. public int Amount { get; private set; }
  26. public decimal FeeRate { get; private set; }
  27. public int FeeAmount { get; private set; }
  28. public int NetAmount { get; private set; }
  29. public string? Message { get; private set; }
  30. public string SendName { get; private set; } = default!;
  31. public bool IsTest { get; private set; }
  32. public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
  33. private Donation() { }
  34. public static Donation Create(
  35. int sponsorMemberID,
  36. int receiverMemberID,
  37. int channelID,
  38. int amount,
  39. decimal feeRate,
  40. string? message,
  41. string sendName,
  42. int? crewSessionID = null,
  43. int? crewMemberID = null,
  44. bool isTest = false
  45. )
  46. {
  47. if (amount <= 0)
  48. {
  49. throw new ArgumentOutOfRangeException(nameof(amount));
  50. }
  51. if (feeRate < 0 || feeRate > 100)
  52. {
  53. throw new ArgumentOutOfRangeException(nameof(feeRate));
  54. }
  55. if (string.IsNullOrWhiteSpace(sendName))
  56. {
  57. throw new ArgumentException("SendName is required.", nameof(sendName));
  58. }
  59. var feeAmount = (int)Math.Floor(amount * feeRate / 100m);
  60. var netAmount = amount - feeAmount;
  61. return new Donation
  62. {
  63. SponsorMemberID = sponsorMemberID,
  64. ReceiverMemberID = receiverMemberID,
  65. ChannelID = channelID,
  66. Amount = amount,
  67. FeeRate = feeRate,
  68. FeeAmount = feeAmount,
  69. NetAmount = netAmount,
  70. Message = message,
  71. SendName = sendName,
  72. CrewSessionID = crewSessionID,
  73. CrewMemberID = crewMemberID,
  74. IsTest = isTest
  75. };
  76. }
  77. }