using CanteenBusinessLogic.OfficePackage; using CanteenBusinessLogic.OfficePackage.HelperModels; using CanteenContracts.BindingModels; using CanteenContracts.BusinessLogicsContracts; using CanteenContracts.SearchModel; using CanteenContracts.StoragesContracts; using CanteenContracts.View; using CanteenContracts.ViewModels; namespace CanteenBusinessLogic.BusinessLogics { public class ReportLogic : IReportLogic { private readonly ILunchStorage lunchStorage; private readonly IOrderStorage orderStorage; private readonly ICookStorage cookStorage; private readonly IProductStorage productStorage; private readonly IVisitorStorage workerStorage; private readonly AbstractSaveToPdf saveToPdf; private readonly AbstractSaveToWord saveToWord; private readonly AbstractSaveToExcel saveToExcel; public ReportLogic(ILunchStorage lunchStorage, IOrderStorage orderStorage, ICookStorage cookStorage, IProductStorage productStorage, IVisitorStorage workerStorage, AbstractSaveToPdf saveToPdf, AbstractSaveToWord saveToWord, AbstractSaveToExcel saveToExcel) { this.cookStorage = cookStorage; this.orderStorage = orderStorage; this.lunchStorage = lunchStorage; this.productStorage = productStorage; this.workerStorage = workerStorage; this.saveToPdf = saveToPdf; this.saveToWord = saveToWord; this.saveToExcel = saveToExcel; } public List GetLunchesPCView(ReportBindingModel model) { var list = new List(); // Получаем список обедов (сущность 1) за указанный период и для указанного посетителя var lunches = lunchStorage.GetFilteredList(new LunchSearchModel { DateFrom = (DateTime)model.DateAfter, DateTo = model.DateBefore, VisitorId = model.VisitorId }); foreach (var lunch in lunches) { var record = new ReportLunchesPCView { DateCreate = lunch.DateCreate, Sum = Convert.ToInt32(lunch.Sum), Orders = new List(), Cooks = new List() }; // Получаем связанные заказы (сущность 2) для текущего обеда var orders = lunch.LunchOrders.Keys.ToList(); foreach (var orderId in orders) { // Получаем заказы (сущность 2) и добавляем их в список Orders var order = orderStorage.GetElement(new OrderSearchModel { Id = orderId }); record.Orders.Add(order); } // Получаем связанных поваров (сущность 4) для текущих продуктов обеда var lunchProducts = lunch.LunchProducts.Keys.ToList(); foreach (var productId in lunchProducts) { var product = productStorage.GetElement(new ProductSearchModel { Id = productId }); var productCooks = product.ProductCooks.Keys.ToList(); foreach (var cookId in productCooks) { // Получаем поваров (сущность 4) и добавляем их в список Cooks var cook = cookStorage.GetElement(new CookSearchModel { Id = cookId }); record.Cooks.Add(cook); } } list.Add(record); } return list; } public void saveLunchesToPdfFile(ReportBindingModel model) { saveToPdf.CreateDoc(new PdfInfo { FileName = model.FileName, Title = "Список заказов", DateAfter = model.DateAfter.Value, DateBefore = model.DateBefore.Value, Lunches = GetLunchesPCView(model) }); } public List GetCooksByLanches(ReportBindingModel model) { var list = new List(); var listCookIds = new List(); foreach (var lunch in model.lunches) { var lunchProducts = lunch.LunchProducts.Keys.ToList().Select(rec => productStorage.GetElement(new ProductSearchModel { Id = rec })); foreach (var elem in lunchProducts) { listCookIds.AddRange(elem.ProductCooks.Keys.ToList()); } } list = listCookIds.Distinct().ToList().Select(rec => cookStorage.GetElement(new CookSearchModel { Id = rec })).ToList(); return list; } public void saveCooksToExcel(ReportBindingModel model) { saveToExcel.CreateReport(new ExcelInfo() { FileName = model.FileName, Title = "Список поваров:", Cooks = GetCooksByLanches(model) }); } public void saveCooksToWord(ReportBindingModel model) { saveToWord.CreateDoc(new WordInfo() { FileName = model.FileName, Title = "Список поваров", Cooks = GetCooksByLanches(model) }); } } }