using System; using System.Collections.Generic; using _0_Framework.Domain; using Company.Domain.PaymentTransactionAgg; using CompanyManagment.App.Contracts.FinancialInvoice; namespace Company.Domain.FinancialInvoiceAgg; public class FinancialInvoice : EntityBase { public string InvoiceNumber { get; private set; } public string Description { get; set; } public FinancialInvoiceStatus Status { get; private set; } public DateTime? PaidAt { get; private set; } public double Amount { get; private set; } public Guid PublicId { get; private set; } public bool IsActive { get; set; } public List PaymentTransactions { get; private set; } public long ContractingPartyId { get; private set; } public List Items { get; private set; } public FinancialInvoice(double amount, long contractingPartyId, string description) { InvoiceNumber = GenerateInvoiceNumber(); Status = FinancialInvoiceStatus.Unpaid; Amount = amount; PublicId = Guid.NewGuid(); ContractingPartyId = contractingPartyId; Description = description; IsActive = true; Items = []; PaymentTransactions = []; } public void AddItem(FinancialInvoiceItem item) { Items ??= []; Items.Add(item); } public void SetItems(List items) { Items = items; } public void SetPaid(DateTime paidAt) { Status = FinancialInvoiceStatus.Paid; PaidAt = paidAt; } public void SetUnpaid() { Status = FinancialInvoiceStatus.Unpaid; PaidAt = null; } public void SetCancelled() { Status = FinancialInvoiceStatus.Cancelled; PaidAt = null; } public void SetRefunded() { Status = FinancialInvoiceStatus.Refunded; PaidAt = null; } public void DeActivate() { IsActive = false; } public void SetInvoiceNumber(string invoiceNumber) { InvoiceNumber = invoiceNumber; } private string GenerateInvoiceNumber() { var timestamp = DateTime.Now.ToString("yyyyMMddHHmmss"); var random = new Random().Next(1000, 9999); return $"GZ_{timestamp}{random}"; } } public class FinancialInvoiceItem : EntityBase { public string Description { get; private set; } public double Amount { get; private set; } public FinancialInvoiceItemType Type { get; set; } public long EntityId { get; set; } public FinancialInvoice FinancialInvoice { get; set; } public long FinancialInvoiceId { get; set; } public FinancialInvoiceItem(string description, double amount, long financialInvoiceId, FinancialInvoiceItemType type, long entityId) { Description = description; Amount = amount; FinancialInvoiceId = financialInvoiceId; Type = type; EntityId = entityId; } }