using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using AutoMapper.QueryableExtensions; using iPackage.Core.Web.Repositories; using iPackage.Core.Web.Services.Contracts; using iPackage.Extensions; using iPackage.Models.Dto; using iPackage.Models.Entity; using iPackage.Models.Util; using MD.PersianDateTime.Standard; namespace iPackage.Core.Web.Services { public class ReportService : IReportService { private readonly IRepositoryWrapper _repositoryWrapper; public ReportService(IRepositoryWrapper repositoryWrapper) { _repositoryWrapper = repositoryWrapper; } public async Task CrudDataBaseReportTask(ReportRequest request) where T : ApiEntity { var table = _repositoryWrapper.SetRepository().TableNoTracking; switch (request.ReportType) { case ReportType.ByDate: table = table.Where(t => t.CreationTime.Date >= request.FromDateTime.Date && t.CreationTime.Date <= request.ToDateTime.Date); break; case ReportType.ByValue: throw new Exception("درخواست گزارش صحیح نیست تنها مقدور به درخواست تاریخی هستید"); default: throw new Exception("درخواست گزارش صحیح نیست تنها مقدور به درخواست تاریخی هستید"); } var result = await CreateReportFromDates(table); return result; } public async Task CrudDataBaseDtoReportTask(ReportRequest request) where T : ApiEntity, new() where TDto : BaseDto, new() { var table = _repositoryWrapper.SetRepository().TableNoTracking; switch (request.ReportType) { case ReportType.ByDate: table = table.Where(t => t.CreationTime.Date >= request.FromDateTime.Date && t.CreationTime.Date <= request.ToDateTime.Date); break; case ReportType.ByValue: throw new Exception("درخواست گزارش صحیح نیست تنها مقدور به درخواست تاریخی هستید"); default: throw new Exception("درخواست گزارش صحیح نیست تنها مقدور به درخواست تاریخی هستید"); } var result = await CreateReportFromDates(table.ProjectTo()); return result; } private async Task CreateReportFromDates(IQueryable table) { ReportResult result = new ReportResult(); var baseObj = Activator.CreateInstance(); var baseProperteis = baseObj.GetType().GetProperties(); var headerRow = new ReportRow(); foreach (var peroperty in baseProperteis) { if (peroperty.GetCustomAttributes(typeof(DisplayAttribute)).FirstOrDefault() == null) continue; var atts = peroperty.CustomAttributes; if (peroperty.GetType() != typeof(IList) && peroperty.GetType() != typeof(ICollection)) headerRow.Cells.Add(peroperty.GetPropertyDisplayName()); } result.Rows.Add(headerRow); if (table is IQueryable queryTable) { foreach (var query in queryTable) { var row = new ReportRow(); var peroperties = query.GetType().GetProperties(); foreach (var peroperty in peroperties) { if (peroperty.GetCustomAttributes(typeof(DisplayAttribute)).FirstOrDefault() == null) continue; if (peroperty.GetValue(query) is bool) row.Cells.Add((bool)peroperty.GetValue(query) ? "بلی" : "خیر"); else if (peroperty.GetValue(query) is DateTime) { var datetime = new PersianDateTime((DateTime)peroperty.GetValue(query)); row.Cells.Add(datetime.ToString()); } else if (peroperty.GetValue(query) is Enum) { var enumDisplay = EnumExtensions.ToDisplay((Enum)peroperty.GetValue(query)); row.Cells.Add(enumDisplay); } else if (peroperty.GetType() != typeof(IList) && peroperty.GetType() != typeof(ICollection)) row.Cells.Add(peroperty.GetValue(query)?.ToString()); } result.Rows.Add(row); } } return result; } } }