using Contracts.BusinessLogicsContracts; using Contracts.ViewModels; using Contracts.BindingModels; using Contracts.StoragesContracts; using Contracts.SearchModels; using BusinessLogic.OfficePackage; using BusinessLogic.MailWorker; using Org.BouncyCastle.Bcpg; namespace ImplementerApp { public class ImplementerData { private readonly ILogger _logger; private readonly IImplementerLogic _implementerLogic; private readonly IDetailLogic _detailLogic; private readonly IProductionLogic _productionLogic; private readonly IProductLogic _productLogic; private readonly IMachineLogic _machineLogic; private readonly IWorkshopLogic _workshopLogic; private readonly AbstractSaveToExcelImplementer _excel; private readonly AbstractSaveToWordImplementer _word; private readonly AbstractSaveToPdfImplementer _pdf; private readonly AbstractMailWorker _mail; public ImplementerData(ILogger logger, IImplementerLogic implementerLogic, IDetailLogic detailLogic, IProductionLogic productionLogic, IProductLogic productLogic, IMachineLogic machineLogic, IWorkshopLogic workshopLogic, AbstractSaveToExcelImplementer excel, AbstractSaveToWordImplementer word, AbstractMailWorker mail, AbstractSaveToPdfImplementer pdf) { _logger = logger; _implementerLogic = implementerLogic; _detailLogic = detailLogic; _productionLogic = productionLogic; _productLogic = productLogic; _machineLogic = machineLogic; _workshopLogic = workshopLogic; _excel = excel; _word = word; _mail = mail; _pdf = pdf; } public ImplementerViewModel? Login(string login, string password) { return _implementerLogic.ReadElement(new() { Login = login, Password = password }); } public bool Register(ImplementerBindingModel model) { return _implementerLogic.Create(model); } public bool UpdateUser(ImplementerBindingModel model) { return _implementerLogic.Update(model); } public bool CheckLogin(string login) { return _implementerLogic.ReadElement(new() { Login = login }) == null; } public List? GetDetails(int userId) { return _detailLogic.ReadList(new DetailSearchModel() { UserId = userId }); } public bool DeleteDetail(int detailId) { return _detailLogic.Delete(new() { Id = detailId }); } public bool CreateDetail(DetailBindingModel model) { return _detailLogic.Create(model); } public bool UpdateDetail(DetailBindingModel model) { return _detailLogic.Update(model); } public DetailViewModel? GetDetail(int id) { return _detailLogic.ReadElement(new() { Id= id }); } public bool CheckDetailName(string name) { return _detailLogic.ReadElement(new() { Name = name }) == null; } public List? GetProducts(int userId) { return _productLogic.ReadList(new ProductSearchModel() { UserId = userId }); } public ProductViewModel? GetProduct(int id) { return _productLogic.ReadElement(new() { Id = id }); } public bool UpdateProduct(ProductBindingModel model) { return _productLogic.Update(model); } public bool DeleteProduct(int productId) { return _productLogic.Delete(new() { Id = productId }); } public bool CreateProduct(ProductBindingModel model) { return _productLogic.Create(model); } public bool CheckProductName(string name) { return _productLogic.ReadElement(new() { Name = name }) == null; } public List? GetProductions(int userId) { return _productionLogic.ReadList(new() { UserId = userId }); } public ProductionViewModel? GetProduction(int id) { return _productionLogic.ReadElement(new() { Id = id }); } public bool CreateProduction(ProductionBindingModel model) { return _productionLogic.Create(model); } public bool UpdateProduction(ProductionBindingModel model) { return _productionLogic.Update(model); } public bool DeleteProduction(int productionId) { return _productionLogic.Delete(new() { Id = productionId}); } public bool CheckProductionName(string name) { return _productionLogic.ReadElement(new() { Name = name }) == null; } public List? GetMachines() { return _machineLogic.ReadList(null); } public List GetTimeReport(DateTime? startDate, DateTime? endDate, int UserId) { var details = _detailLogic.ReadList(new() { DateFrom = startDate, DateTo = endDate, UserId = UserId }); if (details == null) return new(); List detailTimeReports = new List(); foreach (var detail in details) { var report = new DetailTimeReport(); report.DetailName = detail.Name; var products = _productLogic.ReadList(new() { DetailId = detail.Id, UserId = UserId }); if (products != null) report.Products = products.Select(p => p.Name).ToList(); var productions = _productionLogic.ReadList(new() { DetailId = detail.Id, UserId = UserId }); if (productions != null) report.Productions = productions.Select(p => p.Name).ToList(); detailTimeReports.Add(report); } return detailTimeReports; } public List? GetWorkshopReports(List details) { List reports = new(); foreach (int i in details) { DetailWorkshopReportViewModel report = new(); var detail = _detailLogic.ReadElement(new() { Id = i }); report.DetailName = detail!.Name; var workshops = _workshopLogic.ReadList(new() { DetailId = i }); if (workshops != null) report.WorkShops = workshops.Select(w => w.Title).ToList(); reports.Add(report); } return reports; } public void SaveReportExcel(List details, MemoryStream stream) { var reports = GetWorkshopReports(details); if (reports == null) return; int maxsize = 0; foreach (var report in reports) { maxsize = Math.Max(maxsize, report.WorkShops.Count); } _excel.CreateReport(new() { detailWorkshops = reports, Title = "Отчет Деталь - цех", memoryStream = stream, maxleng = maxsize }); } public void SaveReportWord(List details, MemoryStream stream) { var reports = GetWorkshopReports(details); if (reports == null) return; _word.CreateDoc(new() { memoryStream = stream, Title = "Отчет Деталь - цех", Workshops = reports }); } public void SendMailReport(DateTime? startDate, DateTime? endDate, int UserId, MemoryStream stream) { var reports = GetTimeReport(startDate, endDate, UserId); if (reports == null) return; _pdf.CreateDoc(new() { DateFrom = startDate!.Value, DateTo = endDate!.Value, FileName = stream, Reports = reports, Title = "Отчет" }); byte[] report = stream.GetBuffer(); _mail.MailSendAsync(new() { MailAddress = UserImplementer.user!.Email, Subject = "Отчет", FileName = "PdfReport.pdf", Pdf = report}); } } }