using System.Text.Json.Serialization; using TakeoutSaaS.Domain.Billings.Enums; using TakeoutSaaS.Shared.Abstractions.Serialization; namespace TakeoutSaaS.Application.App.Billings.Contracts; /// /// 账单详情 DTO。 /// public sealed record BillingDetailDto { /// /// 账单 ID(雪花,序列化为字符串)。 /// [JsonConverter(typeof(SnowflakeIdJsonConverter))] public long Id { get; init; } /// /// 租户 ID(雪花,序列化为字符串)。 /// [JsonConverter(typeof(SnowflakeIdJsonConverter))] public long TenantId { get; init; } /// /// 租户名称。 /// public string? TenantName { get; init; } /// /// 账单编号。 /// public string StatementNo { get; init; } = string.Empty; /// /// 账单类型。 /// public TenantBillingType BillingType { get; init; } /// /// 账单周期开始时间。 /// public DateTime PeriodStart { get; init; } /// /// 账单周期结束时间。 /// public DateTime PeriodEnd { get; init; } /// /// 应付金额。 /// public decimal AmountDue { get; init; } /// /// 已付金额。 /// public decimal AmountPaid { get; init; } /// /// 折扣金额。 /// public decimal DiscountAmount { get; init; } /// /// 税额。 /// public decimal TaxAmount { get; init; } /// /// 货币代码。 /// public string Currency { get; init; } = "CNY"; /// /// 账单状态。 /// public TenantBillingStatus Status { get; init; } /// /// 到期日期。 /// public DateTime DueDate { get; init; } /// /// 账单明细 JSON。 /// public string? LineItemsJson { get; init; } /// /// 备注。 /// public string? Notes { get; init; } /// /// 逾期通知时间。 /// public DateTime? OverdueNotifiedAt { get; init; } /// /// 提醒发送时间。 /// public DateTime? ReminderSentAt { get; init; } /// /// 创建时间。 /// public DateTime CreatedAt { get; init; } /// /// 更新时间。 /// public DateTime? UpdatedAt { get; init; } /// /// 支付记录列表。 /// public IReadOnlyList Payments { get; init; } = []; } /// /// 支付记录 DTO。 /// public sealed record PaymentRecordDto { /// /// 支付记录 ID(雪花,序列化为字符串)。 /// [JsonConverter(typeof(SnowflakeIdJsonConverter))] public long Id { get; init; } /// /// 账单 ID(雪花,序列化为字符串)。 /// [JsonConverter(typeof(SnowflakeIdJsonConverter))] public long BillingStatementId { get; init; } /// /// 支付金额。 /// public decimal Amount { get; init; } /// /// 支付方式。 /// public int Method { get; init; } /// /// 支付状态。 /// public int Status { get; init; } /// /// 交易号。 /// public string? TransactionNo { get; init; } /// /// 支付凭证 URL。 /// public string? ProofUrl { get; init; } /// /// 支付时间。 /// public DateTime? PaidAt { get; init; } /// /// 备注。 /// public string? Notes { get; init; } /// /// 审核人 ID。 /// [JsonConverter(typeof(NullableSnowflakeIdJsonConverter))] public long? VerifiedBy { get; init; } /// /// 审核时间。 /// public DateTime? VerifiedAt { get; init; } /// /// 退款原因。 /// public string? RefundReason { get; init; } /// /// 退款时间。 /// public DateTime? RefundedAt { get; init; } /// /// 创建时间。 /// public DateTime CreatedAt { get; init; } }