using System; using System.Collections.Generic; using System.Linq; using _0_Framework.Application; using _0_Framework.InfraStructure; using Company.Domain.FinancialInvoiceAgg; using CompanyManagment.App.Contracts.FinancialInvoice; using CompanyManagment.EFCore; namespace CompanyManagment.Application; public class FinancialInvoiceApplication : IFinancialInvoiceApplication { private readonly IFinancialInvoiceRepository _financialInvoiceRepository; public FinancialInvoiceApplication(IFinancialInvoiceRepository financialInvoiceRepository) { _financialInvoiceRepository = financialInvoiceRepository; } public OperationResult Create(CreateFinancialInvoice command) { var operation = new OperationResult(); if (command.Amount <= 0) return operation.Failed("مبلغ فاکتور باید بزرگتر از صفر باشد"); if (command.ContractingPartyId <= 0) return operation.Failed("طرف قرارداد نامعتبر است"); if (string.IsNullOrWhiteSpace(command.Description)) return operation.Failed("توضیحات فاکتور الزامی است"); var financialInvoice = new FinancialInvoice(command.Amount, command.ContractingPartyId, command.Description); if (command.Items != null && command.Items.Any()) { foreach (var item in command.Items) { if (string.IsNullOrWhiteSpace(item.Description)) return operation.Failed("توضیحات آیتم الزامی است"); if (item.Amount <= 0) return operation.Failed("مبلغ آیتم باید بزرگتر از صفر باشد"); var invoiceItem = new FinancialInvoiceItem(item.Description, item.Amount, financialInvoice.id, item.Type, item.EntityId); financialInvoice.AddItem(invoiceItem); } } _financialInvoiceRepository.Create(financialInvoice); _financialInvoiceRepository.SaveChanges(); return operation.Succcedded(); } public OperationResult Edit(EditFinancialInvoice command) { var operation = new OperationResult(); var financialInvoice = _financialInvoiceRepository.Get(command.Id); if (financialInvoice == null) return operation.Failed("فاکتور مورد نظر یافت نشد"); if (financialInvoice.Status == FinancialInvoiceStatus.Paid) return operation.Failed("امکان ویرایش فاکتور پرداخت شده وجود ندارد"); if (string.IsNullOrWhiteSpace(command.Description)) return operation.Failed("توضیحات فاکتور الزامی است"); // Update description financialInvoice.Description = command.Description; // Update items if provided if (command.Items != null) { // Clear existing items if (financialInvoice.Items != null) { financialInvoice.Items.Clear(); } else { financialInvoice.SetItems([]); } // Add updated items foreach (var item in command.Items) { if (string.IsNullOrWhiteSpace(item.Description)) return operation.Failed("توضیحات آیتم الزامی است"); if (item.Amount <= 0) return operation.Failed("مبلغ آیتم باید بزرگتر از صفر باشد"); var invoiceItem = new FinancialInvoiceItem(item.Description, item.Amount, financialInvoice.id, item.Type, item.EntityId); financialInvoice.AddItem(invoiceItem); } } _financialInvoiceRepository.SaveChanges(); return operation.Succcedded(); } public OperationResult SetPaid(long id, DateTime paidAt) { var operation = new OperationResult(); var financialInvoice = _financialInvoiceRepository.Get(id); if (financialInvoice == null) return operation.Failed("فاکتور مورد نظر یافت نشد"); if (financialInvoice.Status == FinancialInvoiceStatus.Paid) return operation.Failed("فاکتور قبلاً پرداخت شده است"); if (financialInvoice.Status == FinancialInvoiceStatus.Cancelled) return operation.Failed("امکان پرداخت فاکتور لغو شده وجود ندارد"); financialInvoice.SetPaid(paidAt); _financialInvoiceRepository.SaveChanges(); return operation.Succcedded(); } public OperationResult SetUnpaid(long id) { var operation = new OperationResult(); var financialInvoice = _financialInvoiceRepository.Get(id); if (financialInvoice == null) return operation.Failed("فاکتور مورد نظر یافت نشد"); financialInvoice.SetUnpaid(); _financialInvoiceRepository.SaveChanges(); return operation.Succcedded(); } public OperationResult SetCancelled(long id) { var operation = new OperationResult(); var financialInvoice = _financialInvoiceRepository.Get(id); if (financialInvoice == null) return operation.Failed("فاکتور مورد نظر یافت نشد"); if (financialInvoice.Status == FinancialInvoiceStatus.Paid) return operation.Failed("امکان لغو فاکتور پرداخت شده وجود ندارد"); financialInvoice.SetCancelled(); _financialInvoiceRepository.SaveChanges(); return operation.Succcedded(); } public OperationResult SetRefunded(long id) { var operation = new OperationResult(); var financialInvoice = _financialInvoiceRepository.Get(id); if (financialInvoice == null) return operation.Failed("فاکتور مورد نظر یافت نشد"); if (financialInvoice.Status != FinancialInvoiceStatus.Paid) return operation.Failed("فقط فاکتورهای پرداخت شده قابل بازپرداخت هستند"); financialInvoice.SetRefunded(); _financialInvoiceRepository.SaveChanges(); return operation.Succcedded(); } public EditFinancialInvoice GetDetails(long id) { return _financialInvoiceRepository.GetDetails(id); } public List Search(FinancialInvoiceSearchModel searchModel) { return _financialInvoiceRepository.Search(searchModel); } //public OperationResult Remove(long id) //{ // var operation = new OperationResult(); // try // { // var financialInvoice = _financialInvoiceRepository.Get(id); // if (financialInvoice == null) // return operation.Failed("فاکتور مورد نظر یافت نشد"); // if (financialInvoice.Status == FinancialInvoiceStatus.Paid) // return operation.Failed("امکان حذف فاکتور پرداخت شده وجود ندارد"); // // Remove the entity using the context directly since Remove method might not be available // _context.FinancialInvoiceSet.Remove(financialInvoice); // _financialInvoiceRepository.SaveChanges(); // return operation.Succcedded(); // } // catch (Exception ex) // { // return operation.Failed("خطا در حذف فاکتور"); // } //} }