From 1e33e50a8bba9edef5077a386186ad0469911d2f Mon Sep 17 00:00:00 2001 From: Programmist73 Date: Thu, 18 May 2023 12:48:45 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D1=82=D0=B8=20=D0=B3=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=D1=8B=D0=B9=20PDF=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=81=D1=81=D0=B8=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/ReportCashierLogic.cs | 26 +++- .../OfficePackage/AbstractSaveToPdfCashier.cs | 43 +++++-- .../OfficePackage/AbstractSaveToPdfClient.cs | 120 +++++++++++++++--- .../OfficePackage/HelperModels/PdfInfo.cs | 12 +- .../Implements/SaveToExcelCashier.cs | 32 +++++ .../Implements/SaveToWordCashier.cs | 27 ++++ .../Controllers/HomeController.cs | 70 +++++----- .../Views/Home/CreateReport.cshtml | 30 ++++- .../ViewModels/ReportCashierViewModel.cs | 9 +- .../Implements/CashWithdrawalStorage.cs | 15 +++ .../Implements/MoneyTransferStorage.cs | 11 ++ .../Controllers/ReportController.cs | 26 +++- .../BankYouBankruptRestAPI/Program.cs | 7 +- ...ёт по картам за 18.05.2023.pdf | Bin 36157 -> 0 bytes 14 files changed, 351 insertions(+), 77 deletions(-) create mode 100644 BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToExcelCashier.cs create mode 100644 BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWordCashier.cs delete mode 100644 BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по картам за 18.05.2023.pdf diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportCashierLogic.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportCashierLogic.cs index ce029ea..373ad7a 100644 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportCashierLogic.cs +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportCashierLogic.cs @@ -25,12 +25,12 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics private readonly AbstractSaveToWordCashier _saveToWord; - private readonly AbstractSaveToPdfCashier _saveToPdf; + private readonly AbstractSaveToPdfClient _saveToPdf; //инициализируем поля класса через контейнер public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage, IAccountStorage accountStorage, AbstractSaveToExcelCashier saveToExcel, AbstractSaveToWordCashier saveToWord, - AbstractSaveToPdfCashier saveToPdf) + AbstractSaveToPdfClient saveToPdf) { _moneyTransferStorage = moneyTransferStorage; _cashWithdrawalStorage = cashWithdrawalStorage; @@ -41,25 +41,30 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics _saveToPdf = saveToPdf; } + //формирование списка переводов между счетами за период public List? GetMoneyTransfers(ReportBindingModel model) { return _moneyTransferStorage.GetFilteredList(new MoneyTransferSearchModel { DateFrom = model.DateFrom, DateTo = model.DateTo}) .Select(x => new ReportCashierViewModel { + OperationId = x.Id, DateComplite = x.DateOperation, - AccountPayeeId = x.AccountPayeeId, - AccountSenderId = x.AccountSenderId, + AccountPayeeNumber = x.AccountPayeeNumber, + AccountSenderNumber = x.AccountSenderNumber, SumOperation = x.Sum }) .ToList(); } + //формирование списка выдаци наличных со счёта за период public List? GetCashWithrawals(ReportBindingModel model) { return _cashWithdrawalStorage.GetFilteredList(new CashWithdrawalSearchModel { DateFrom = model.DateFrom, DateTo = model.DateTo }) .Select(x => new ReportCashierViewModel { - AccountPayeeId = x.Id, + OperationId = x.Id, + DebitingId = x.DebitingId, + AccountPayeeNumber = x.AccountNumber, DateComplite = x.DateOperation, SumOperation = x.Sum }) @@ -81,7 +86,16 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics //Сохранение заказов в файл-Pdf public void SaveAccountsToPdfFile(ReportBindingModel model) { - throw new NotImplementedException(); + _saveToPdf.CreateDoc(new PdfInfo + { + ForClient = false, + FileName = model.FileName, + Title = "Отчёт по операциям начислений и переводов между счетами", + DateFrom = model.DateFrom!.Value, + DateTo = model.DateTo!.Value, + ReportMoneyTransfer = GetMoneyTransfers(model), + ReportCashWithdrawal = GetCashWithrawals(model) + }); } } } diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToPdfCashier.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToPdfCashier.cs index 8cfd443..564617e 100644 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToPdfCashier.cs +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToPdfCashier.cs @@ -17,38 +17,65 @@ namespace BankYouBankruptBusinessLogic.OfficePackage CreateParagraph(new PdfParagraph { - Text = info.Title, - Style = "NormalTitle", + Text = info.Title + $"\nот {DateTime.Now.ToShortDateString()}", + Style = "NormalTitle", ParagraphAlignment = PdfParagraphAlignmentType.Center }); CreateParagraph(new PdfParagraph { - Text = $"с {info.DateFrom.ToShortDateString()} по {info.DateTo.ToShortDateString()}", + Text = $"Расчётный период: с {info.DateFrom.ToShortDateString()} по {info.DateTo.ToShortDateString()}", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Center }); - CreateTable(new List { "2cm", "3cm", "6cm", "3cm", "3cm" }); + //параграф с отчётом по выдаче наличных с карт + CreateParagraph(new PdfParagraph { Text = "Отчёт по выдаче наличных с карт", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Center }); + + CreateTable(new List { "3cm", "3cm", "5cm", "5cm" }); CreateRow(new PdfRowParameters { - Texts = new List { "Номер", "Дата заказа", "Изделие", "Статус заказа", "Сумма" }, + Texts = new List { "Номер операции", "Номер счёта получателя", "Сумма операции", "Дата операции" }, Style = "NormalTitle", ParagraphAlignment = PdfParagraphAlignmentType.Center }); - foreach (var report in info.Accounts) + foreach (var report in info.ReportCashWithdrawal) { CreateRow(new PdfRowParameters { - Texts = new List { report.AccountSenderId.ToString(), report.AccountPayeeId.ToString(), report.DateComplite.ToShortDateString(), report.SumOperation.ToString() }, + Texts = new List { report.OperationId.ToString(), report.AccountPayeeNumber.ToString(), report.SumOperation.ToString(), report.DateComplite.ToShortDateString(), }, Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Left }); } - //CreateParagraph(new PdfParagraph { Text = $"Итого: {info.Orders.Sum(x => x.Sum)}\t", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Right }); + CreateParagraph(new PdfParagraph { Text = $"Итоговая сумма снятий за период: {info.ReportCashWithdrawal.Sum(x => x.SumOperation)}\t", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Right }); + + //параграф с отчётом по переводу денег со счёта на счёт + CreateParagraph(new PdfParagraph { Text = "Отчёт по денежным переводам между счетами", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Center }); + + CreateTable(new List { "3cm", "3cm", "3cm", "5cm", "5cm" }); + + CreateRow(new PdfRowParameters + { + Texts = new List { "Номер операции", "Номер счёта отправителя", "Номер счёта получателя", "Сумма операции", "Дата операции" }, + Style = "NormalTitle", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + + foreach (var report in info.ReportMoneyTransfer) + { + CreateRow(new PdfRowParameters + { + Texts = new List { report.OperationId.ToString(), report.AccountSenderNumber, report.AccountPayeeNumber, report.SumOperation.ToString(), report.DateComplite.ToShortDateString(), }, + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Left + }); + } + + CreateParagraph(new PdfParagraph { Text = $"Итоговая сумма переводов за период: {info.ReportMoneyTransfer.Sum(x => x.SumOperation)}\t", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Right }); SavePdf(info); } diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToPdfClient.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToPdfClient.cs index 433c6cc..21589b3 100644 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToPdfClient.cs +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToPdfClient.cs @@ -13,27 +13,41 @@ namespace BankYouBankruptBusinessLogic.OfficePackage //публичный метод создания документа. Описание методов ниже public void CreateDoc(PdfInfo info) { - CreatePdf(info); + if(info.ForClient) + { + CreateDocClient(info); + } + else + { + CreateDocCashier(info); + } + } - CreateParagraph(new PdfParagraph - { - Text = info.Title + $"\nот { DateTime.Now.ToShortDateString() }", + #region Отчёт для клиента + + public void CreateDocClient(PdfInfo info) + { + CreatePdf(info); + + CreateParagraph(new PdfParagraph + { + Text = info.Title + $"\nот {DateTime.Now.ToShortDateString()}", Style = "NormalTitle", - ParagraphAlignment = PdfParagraphAlignmentType.Center - }); + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); - CreateParagraph(new PdfParagraph - { - Text = $"Расчётный период: с {info.DateFrom.ToShortDateString()} по {info.DateTo.ToShortDateString()}", - Style = "Normal", - ParagraphAlignment = PdfParagraphAlignmentType.Center - }); + CreateParagraph(new PdfParagraph + { + Text = $"Расчётный период: с {info.DateFrom.ToShortDateString()} по {info.DateTo.ToShortDateString()}", + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); //параграф с отчётом на пополнения CreateParagraph(new PdfParagraph { Text = "Отчёт по пополнениям", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Center }); - CreateTable(new List { "3cm", "3cm", "5cm", "5cm"}); + CreateTable(new List { "3cm", "3cm", "5cm", "5cm" }); CreateRow(new PdfRowParameters { @@ -83,8 +97,84 @@ namespace BankYouBankruptBusinessLogic.OfficePackage SavePdf(info); } - /// Создание pdf-файла - protected abstract void CreatePdf(PdfInfo info); + #endregion + + #region Отчёт для кассира + + //создание отчёта для кассира + public void CreateDocCashier(PdfInfo info) + { + CreatePdf(info); + + CreateParagraph(new PdfParagraph + { + Text = info.Title + $"\nот {DateTime.Now.ToShortDateString()}", + Style = "NormalTitle", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + + CreateParagraph(new PdfParagraph + { + Text = $"Расчётный период: с {info.DateFrom.ToShortDateString()} по {info.DateTo.ToShortDateString()}", + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + + //параграф с отчётом по выдаче наличных с карт + CreateParagraph(new PdfParagraph { Text = "Отчёт по выдаче наличных с карт", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Center }); + + CreateTable(new List { "3.5cm", "3.5cm", "5cm", "5cm" }); + + CreateRow(new PdfRowParameters + { + Texts = new List { "Номер операции", "Номер счёта получателя", "Сумма операции", "Дата операции" }, + Style = "NormalTitle", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + + foreach (var report in info.ReportCashWithdrawal) + { + CreateRow(new PdfRowParameters + { + Texts = new List { report.OperationId.ToString(), report.AccountPayeeNumber, report.SumOperation.ToString(), report.DateComplite.ToShortDateString(), }, + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Left + }); + } + + CreateParagraph(new PdfParagraph { Text = $"Итоговая сумма снятий за период: {info.ReportCashWithdrawal.Sum(x => x.SumOperation)}\t", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Right }); + + //параграф с отчётом по переводу денег со счёта на счёт + CreateParagraph(new PdfParagraph { Text = "Отчёт по денежным переводам между счетами", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Center }); + + CreateTable(new List { "3cm", "3cm", "3cm", "4cm", "4cm" }); + + CreateRow(new PdfRowParameters + { + Texts = new List { "Номер операции", "Номер счёта отправителя", "Номер счёта получателя", "Сумма операции", "Дата операции" }, + Style = "NormalTitle", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + + foreach (var report in info.ReportMoneyTransfer) + { + CreateRow(new PdfRowParameters + { + Texts = new List { report.OperationId.ToString(), report.AccountSenderNumber, report.AccountPayeeNumber, report.SumOperation.ToString(), report.DateComplite.ToShortDateString(), }, + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Left + }); + } + + CreateParagraph(new PdfParagraph { Text = $"Итоговая сумма переводов за период: {info.ReportMoneyTransfer.Sum(x => x.SumOperation)}\t", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Right }); + + SavePdf(info); + } + + #endregion + + /// Создание pdf-файла + protected abstract void CreatePdf(PdfInfo info); /// Создание параграфа с текстом protected abstract void CreateParagraph(PdfParagraph paragraph); diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs index 7cf9432..38fb1cc 100644 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs @@ -18,13 +18,19 @@ namespace BankYouBankruptBusinessLogic.OfficePackage.HelperModels public DateTime DateTo { get; set; } + //по умолчанию отчёт делается для клиента + public bool ForClient { get; set; } = true; + //перечень заказов за указанный период для вывода/сохранения public List ReportCrediting { get; set; } = new(); //перечень заказов за указанный период для вывода/сохранения public List ReportDebiting { get; set; } = new(); - //перечень счетов для отчёта кассира - public List Accounts { get; set; } = new(); - } + //перечень переводов со счёта на счёт + public List ReportMoneyTransfer { get; set; } = new(); + + //перечень зачислений денежных средств на карту (т. е. на её счёт) + public List ReportCashWithdrawal { get; set; } = new(); + } } diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToExcelCashier.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToExcelCashier.cs new file mode 100644 index 0000000..d7f0c1f --- /dev/null +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToExcelCashier.cs @@ -0,0 +1,32 @@ +using BankYouBankruptBusinessLogic.OfficePackage.HelperModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankYouBankruptBusinessLogic.OfficePackage.Implements +{ + public class SaveToExcelCashier : AbstractSaveToExcelCashier + { + protected override void CreateExcel(ExcelInfo info) + { + throw new NotImplementedException(); + } + + protected override void InsertCellInWorksheet(ExcelCellParameters excelParams) + { + throw new NotImplementedException(); + } + + protected override void MergeCells(ExcelMergeParameters excelParams) + { + throw new NotImplementedException(); + } + + protected override void SaveExcel(ExcelInfo info) + { + throw new NotImplementedException(); + } + } +} diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWordCashier.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWordCashier.cs new file mode 100644 index 0000000..19655b9 --- /dev/null +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWordCashier.cs @@ -0,0 +1,27 @@ +using BankYouBankruptBusinessLogic.OfficePackage.HelperModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankYouBankruptBusinessLogic.OfficePackage.Implements +{ + public class SaveToWordCashier : AbstractSaveToWordCashier + { + protected override void CreateParagraph(WordParagraph paragraph) + { + throw new NotImplementedException(); + } + + protected override void CreateWord(WordInfo info) + { + throw new NotImplementedException(); + } + + protected override void SaveWord(WordInfo info) + { + throw new NotImplementedException(); + } + } +} diff --git a/BankYouBankrupt/BankYouBankruptCashierApp/Controllers/HomeController.cs b/BankYouBankrupt/BankYouBankruptCashierApp/Controllers/HomeController.cs index 9f1f207..06debf5 100644 --- a/BankYouBankrupt/BankYouBankruptCashierApp/Controllers/HomeController.cs +++ b/BankYouBankrupt/BankYouBankruptCashierApp/Controllers/HomeController.cs @@ -202,44 +202,6 @@ namespace BankYouBankruptCashierApp.Controllers Response.Redirect("Index"); } - //открытие формы отчёта. Получаем и передаём список изделий во вьюху? - [HttpGet] - public IActionResult CreateReport() - { - if (APICashier.Cashier == null) - { - return Redirect("~/Home/Enter"); - } - - ViewBag.Accountes = APICashier.GetRequest>("api/main/getaccountlist"); - - return View(); - } - - //создание отчёта Post-запросом - [HttpPost] - public void CreateReport(DateTime DateFrom, DateTime DateTo) - { - if (APICashier.Cashier == null) - { - throw new Exception("Вы как сюда попали? Суда вход только авторизованным"); - } - - if (DateFrom > DateTo) - { - throw new Exception("Дата начала периода не может быть позже даты конца периода"); - } - - APICashier.PostRequest("api/main/createreport", new ReportBindingModel - { - FileName = APICashier.Cashier.Surname - - //TODO - }); - - Response.Redirect("Index"); - } - //для страницы "Заявки на снятие" [HttpGet] public IActionResult Debiting() @@ -460,5 +422,35 @@ namespace BankYouBankruptCashierApp.Controllers return View(); } - } + + #region Получение отчёта PDF + + [HttpGet] + public IActionResult CreateReport() + { + if (APICashier.Cashier == null) + { + return Redirect("~/Home/Enter"); + } + + return View(); + } + + [HttpPost] + public void CreateReport(DateTime dateFrom, DateTime dateTo) + { + if (APICashier.Cashier == null) + { + throw new Exception("Не авторизованы"); + } + + APICashier.PostRequest("api/Report/CreateCashierReport", new ReportSupportBindingModel() + { + DateFrom = dateFrom, + DateTo = dateTo + }); + } + + #endregion + } } \ No newline at end of file diff --git a/BankYouBankrupt/BankYouBankruptCashierApp/Views/Home/CreateReport.cshtml b/BankYouBankrupt/BankYouBankruptCashierApp/Views/Home/CreateReport.cshtml index c00de4a..59638ae 100644 --- a/BankYouBankrupt/BankYouBankruptCashierApp/Views/Home/CreateReport.cshtml +++ b/BankYouBankrupt/BankYouBankruptCashierApp/Views/Home/CreateReport.cshtml @@ -2,6 +2,34 @@ ViewData["Title"] = "Создание отчёта"; } +
+

Отчёт по счетам за выбранный период

+
+
+
+
Дата начала периода:
+
+ +
+
+
+
Дата конца периода:
+
+ +
+
+
+
+
+ +
+
+
+ + \ No newline at end of file diff --git a/BankYouBankrupt/BankYouBankruptContracts/ViewModels/ReportCashierViewModel.cs b/BankYouBankrupt/BankYouBankruptContracts/ViewModels/ReportCashierViewModel.cs index b02984e..4fd210c 100644 --- a/BankYouBankrupt/BankYouBankruptContracts/ViewModels/ReportCashierViewModel.cs +++ b/BankYouBankrupt/BankYouBankruptContracts/ViewModels/ReportCashierViewModel.cs @@ -8,9 +8,14 @@ namespace BankYouBankruptContracts.ViewModels { public class ReportCashierViewModel { - public int AccountPayeeId { get; set; } - public int? AccountSenderId { get; set; } + public int OperationId { get; set; } + + public int DebitingId { get; set; } + + public string AccountPayeeNumber { get; set; } + + public string? AccountSenderNumber { get; set; } public double SumOperation { get; set; } diff --git a/BankYouBankrupt/BankYouBankruptDatabaseImplement/Implements/CashWithdrawalStorage.cs b/BankYouBankrupt/BankYouBankruptDatabaseImplement/Implements/CashWithdrawalStorage.cs index 70d2f92..99f0e9c 100644 --- a/BankYouBankrupt/BankYouBankruptDatabaseImplement/Implements/CashWithdrawalStorage.cs +++ b/BankYouBankrupt/BankYouBankruptDatabaseImplement/Implements/CashWithdrawalStorage.cs @@ -21,6 +21,7 @@ namespace BankYouBankruptDatabaseImplement.Implements return context.CashWithdrawals .Include(x => x.Cashier) .Include(x => x.Debiting) + .Include(x => x.Account) .Select(x => x.GetViewModel) .ToList(); } @@ -39,14 +40,27 @@ namespace BankYouBankruptDatabaseImplement.Implements return context.CashWithdrawals .Include(x => x.Cashier) .Include(x => x.Debiting) + .Include(x => x.Account) .Where(x => x.CashierId == model.CashierId) .Select(x => x.GetViewModel) .ToList(); } + if(model.DateFrom.HasValue && model.DateTo.HasValue) + { + return context.CashWithdrawals + .Include(x => x.Cashier) + .Include(x => x.Debiting) + .Include(x => x.Account) + .Where(x => x.DateOperation >= model.DateFrom && x.DateOperation <= model.DateTo) + .Select(x => x.GetViewModel) + .ToList(); + } + return context.CashWithdrawals .Include(x => x.Cashier) .Include(x => x.Debiting) + .Include(x => x.Account) .Where(x => x.AccountId == model.AccountId) .Select(x => x.GetViewModel) .ToList(); @@ -64,6 +78,7 @@ namespace BankYouBankruptDatabaseImplement.Implements return context.CashWithdrawals .Include(x => x.Cashier) .Include(x => x.Debiting) + .Include(x => x.Account) .FirstOrDefault(x => (!(model.AccountId < 0) && x.AccountId == model.AccountId) || (model.Id.HasValue && x.Id == model.Id)) ?.GetViewModel; diff --git a/BankYouBankrupt/BankYouBankruptDatabaseImplement/Implements/MoneyTransferStorage.cs b/BankYouBankrupt/BankYouBankruptDatabaseImplement/Implements/MoneyTransferStorage.cs index 693bf2e..e9940ce 100644 --- a/BankYouBankrupt/BankYouBankruptDatabaseImplement/Implements/MoneyTransferStorage.cs +++ b/BankYouBankrupt/BankYouBankruptDatabaseImplement/Implements/MoneyTransferStorage.cs @@ -35,6 +35,17 @@ namespace BankYouBankruptDatabaseImplement.Implements using var context = new BankYouBancruptDatabase(); + if(model.DateFrom.HasValue && model.DateTo.HasValue) + { + return context.MoneyTransfers + .Include(x => x.AccountPayeer) + .Include(x => x.AccountSender) + .Include(x => x.Cashier) + .Where(x => x.DateOperation >= model.DateFrom && x.DateOperation <= model.DateTo && x.AccountSenderId != null) + .Select(x => x.GetViewModel) + .ToList(); + } + return context.MoneyTransfers .Include(x => x.AccountPayeer) .Include(x => x.AccountSender) diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Controllers/ReportController.cs b/BankYouBankrupt/BankYouBankruptRestAPI/Controllers/ReportController.cs index daae94b..0c80b16 100644 --- a/BankYouBankrupt/BankYouBankruptRestAPI/Controllers/ReportController.cs +++ b/BankYouBankrupt/BankYouBankruptRestAPI/Controllers/ReportController.cs @@ -19,11 +19,13 @@ namespace BankYouBankruptRestAPI.Controllers private readonly IReportClientLogic _reportClientLogic; - public ReportController(ILogger logger, IReportClientLogic reportClientLogic) + private readonly IReportCashierLogic _reportCashierLogic; + + public ReportController(ILogger logger, IReportClientLogic reportClientLogic, IReportCashierLogic reportCashierLogic) { _logger = logger; _reportClientLogic = reportClientLogic; - //_reportCashierLogic = reportCashierLogic; + _reportCashierLogic = reportCashierLogic; } //метод генерации отчёта за период по картам клиента @@ -45,5 +47,25 @@ namespace BankYouBankruptRestAPI.Controllers throw; } } + + //метод генерации отчёта по всем счетм клиентов + [HttpPost] + public void CreateCashierReport(ReportSupportBindingModel model) + { + try + { + _reportCashierLogic.SaveAccountsToPdfFile(new ReportBindingModel + { + FileName = "Отчёт по счетам за " + DateTime.Now.ToShortDateString() + ".pdf", + DateFrom = model.DateFrom, + DateTo = model.DateTo + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка входа в систему"); + throw; + } + } } } diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Program.cs b/BankYouBankrupt/BankYouBankruptRestAPI/Program.cs index ebf2cd2..c3c2cd3 100644 --- a/BankYouBankrupt/BankYouBankruptRestAPI/Program.cs +++ b/BankYouBankrupt/BankYouBankruptRestAPI/Program.cs @@ -32,10 +32,15 @@ builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddTransient(); + +//теперь общий builder.Services.AddTransient(); + builder.Services.AddTransient(); builder.Services.AddTransient(); -//builder.Services.AddTransient(); +builder.Services.AddTransient(); +builder.Services.AddTransient(); builder.Services.AddControllers(); diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по картам за 18.05.2023.pdf b/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по картам за 18.05.2023.pdf deleted file mode 100644 index 97b5aeee873f9b0b0aaba7eda84e4704e6fbd6b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36157 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