From e36b57e9fd4fa001f3c503b53036dc755c75ba00 Mon Sep 17 00:00:00 2001 From: Programmist73 <egor.eliseev.1986@mail.ru> Date: Fri, 19 May 2023 23:32:09 +0400 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=BE=D1=82=D0=BE=D0=B2=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=BE=D1=82=D1=87=D1=91=D1=82=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/ReportCashierLogic.cs | 15 +- .../BusinessLogics/ReportClientLogic.cs | 46 ++- .../OfficePackage/AbstractSaveToExcel.cs | 50 ++- .../AbstractSaveToExcelCashier.cs | 51 ---- .../OfficePackage/AbstractSaveToWord.cs | 286 ++++++++++++++++++ .../OfficePackage/AbstractSaveToWordClient.cs | 43 --- .../OfficePackage/HelperModels/WordInfo.cs | 12 +- .../HelperModels/WordParagraph.cs | 4 +- .../OfficePackage/Implements/SaveToWord.cs | 77 ++++- .../Implements/SaveToWordCashier.cs | 27 -- .../IReportClientLogic.cs | 4 +- ...perationEnum.cs => OfficeOperationEnum.cs} | 2 +- .../Controllers/ReportController.cs | 114 +++++-- .../BankYouBankruptRestAPI/Program.cs | 5 +- ...� по зявкам на снятие.docx | Bin 0 -> 1837 bytes ...� по зявкам на снятие.xlsx | Bin 0 -> 3482 bytes .../Отчёт по переводам.docx | Bin 0 -> 1608 bytes .../Отчёт по переводам.xls | Bin 3483 -> 1514 bytes ...�тчёт по пополнениям.docx | Bin 0 -> 1793 bytes .../Отчёт по снятиям.docx | Bin 0 -> 1856 bytes 20 files changed, 562 insertions(+), 174 deletions(-) delete mode 100644 BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToExcelCashier.cs create mode 100644 BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToWord.cs delete mode 100644 BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToWordClient.cs delete mode 100644 BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWordCashier.cs rename BankYouBankrupt/BankYouBankruptDataModels/Enums/{ExcelOperationEnum.cs => OfficeOperationEnum.cs} (90%) create mode 100644 BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по зявкам на снятие.docx create mode 100644 BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по зявкам на снятие.xlsx create mode 100644 BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по переводам.docx create mode 100644 BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по пополнениям.docx create mode 100644 BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по снятиям.docx diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportCashierLogic.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportCashierLogic.cs index 9b66f74..3d92073 100644 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportCashierLogic.cs +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportCashierLogic.cs @@ -29,14 +29,14 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics private readonly AbstractSaveToExcel _saveToExcel; - private readonly AbstractSaveToWordCashier _saveToWord; + private readonly AbstractSaveToWord _saveToWord; private readonly AbstractSaveToPdf _saveToPdf; //инициализируем поля класса через контейнер public ReportCashierLogic(IMoneyTransferStorage moneyTransferStorage, ICashWithdrawalStorage cashWithdrawalStorage, IClientStorage clientStorage, AbstractSaveToExcel saveToExcel, - AbstractSaveToWordCashier saveToWord, AbstractSaveToPdf saveToPdf, + AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf, IDebitingStorage debitingStorage, ICardStorage cardStorage) { _moneyTransferStorage = moneyTransferStorage; @@ -124,7 +124,14 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics //Сохранение мороженных в файл-Word public void SaveAccountsToWordFile(ReportBindingModel model) { - throw new NotImplementedException(); + _saveToWord.CreateDoc(new WordInfo + { + FileName = model.FileName, + + Title = "Заявки на снятия со счёта", + + Debiting = GetDebitings(model) + }, OfficeOperationEnum.Для_кассира); } //Сохранение заготовок с указаеним изделий в файл-Excel @@ -137,7 +144,7 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics Title = "Заявки на счёт", Debiting = GetDebitings(model) - }, ExcelOperationEnum.Для_кассира); + }, OfficeOperationEnum.Для_кассира); } //Сохранение заказов в файл-Pdf diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportClientLogic.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportClientLogic.cs index de204e4..f08fe3b 100644 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportClientLogic.cs +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/BusinessLogics/ReportClientLogic.cs @@ -24,11 +24,11 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics private readonly IMoneyTransferStorage _moneyTransferStorage; private readonly AbstractSaveToExcel _saveToExcel; - private readonly AbstractSaveToWordClient _saveToWord; + private readonly AbstractSaveToWord _saveToWord; private readonly AbstractSaveToPdf _saveToPdf; public ReportClientLogic(ICreditingStorage creditingStorage, IDebitingStorage debitingStorage, - AbstractSaveToExcel saveToExcel, AbstractSaveToWordClient saveToWord, AbstractSaveToPdf saveToPdf, + AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf, ICardStorage cardStorage, IMoneyTransferStorage moneyTransferStorage) { _creditingStorage = creditingStorage; @@ -136,9 +136,9 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics return totalList; } - public void SaveToExcelFile(ReportBindingModel model, ExcelOperationEnum operationEnum) + public void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum) { - if(operationEnum == ExcelOperationEnum.Между_cчетами) + if(operationEnum == OfficeOperationEnum.Между_cчетами) { _saveToExcel.CreateReport(new ExcelInfo { @@ -148,7 +148,7 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics }, operationEnum); } - if (operationEnum == ExcelOperationEnum.Пополнение_карт) + if (operationEnum == OfficeOperationEnum.Пополнение_карт) { _saveToExcel.CreateReport(new ExcelInfo { @@ -158,7 +158,7 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics }, operationEnum); } - if (operationEnum == ExcelOperationEnum.Cнятие_с_карты) + if (operationEnum == OfficeOperationEnum.Cнятие_с_карты) { _saveToExcel.CreateReport(new ExcelInfo { @@ -169,10 +169,38 @@ namespace BankYouBankruptBusinessLogic.BusinessLogics } } - public void SaveToWordFile(ReportBindingModel model) + public void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum) { - throw new NotImplementedException(); - } + if (operationEnum == OfficeOperationEnum.Между_cчетами) + { + _saveToWord.CreateDoc(new WordInfo + { + FileName = model.FileName, + Title = "Отчёт по переводам", + MoneyTransfer = GetMoneyTransfer(model) + }, operationEnum); + } + + if (operationEnum == OfficeOperationEnum.Пополнение_карт) + { + _saveToWord.CreateDoc(new WordInfo + { + FileName = model.FileName, + Title = "Отчёт по пополнениям (переводам из налички на карту)", + Crediting = GetExcelCrediting(model) + }, operationEnum); + } + + if (operationEnum == OfficeOperationEnum.Cнятие_с_карты) + { + _saveToWord.CreateDoc(new WordInfo + { + FileName = model.FileName, + Title = "Отчёт по снятиям денежных средств", + Debiting = GetExcelDebiting(model) + }, operationEnum); + } + } //отчёт в формате PDF для клиента public ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model) diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToExcel.cs index 30c4179..d35fa44 100644 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToExcel.cs +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToExcel.cs @@ -12,24 +12,24 @@ namespace BankYouBankruptBusinessLogic.OfficePackage public abstract class AbstractSaveToExcel { //Создание отчета. Описание методов ниже - public void CreateReport(ExcelInfo info, ExcelOperationEnum operationEnum) + public void CreateReport(ExcelInfo info, OfficeOperationEnum operationEnum) { - if(operationEnum == ExcelOperationEnum.Между_cчетами) + if(operationEnum == OfficeOperationEnum.Между_cчетами) { CreateMoneyTransferExcel(info); } - if (operationEnum == ExcelOperationEnum.Пополнение_карт) + if (operationEnum == OfficeOperationEnum.Пополнение_карт) { CreateCreditingExcel(info); } - if (operationEnum == ExcelOperationEnum.Cнятие_с_карты) + if (operationEnum == OfficeOperationEnum.Cнятие_с_карты) { CreateDebitingExcel(info); } - if (operationEnum == ExcelOperationEnum.Для_кассира) + if (operationEnum == OfficeOperationEnum.Для_кассира) { CreateCashierExcel(info); } @@ -130,6 +130,26 @@ namespace BankYouBankruptBusinessLogic.OfficePackage }); rowIndex++; + + //Вставляет слово "Сумма перевода" + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "A", + RowIndex = rowIndex, + Text = "Дата операции: ", + StyleInfo = ExcelStyleInfoType.Text + }); + + //подсчитывает общее кол-во заготовок в изделии + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "C", + RowIndex = rowIndex, + Text = mt.DateOperation.ToString(), + StyleInfo = ExcelStyleInfoType.Text + }); + + rowIndex++; } rowIndex++; @@ -442,6 +462,26 @@ namespace BankYouBankruptBusinessLogic.OfficePackage }); rowIndex++; + + //строчка с номером счёта получателя + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "B", + RowIndex = rowIndex, + Text = "Дата: ", + StyleInfo = ExcelStyleInfoType.TextWithBorder + }); + + //вставка номера отправителя + InsertCellInWorksheet(new ExcelCellParameters + { + ColumnName = "C", + RowIndex = rowIndex, + Text = cr.DateClose == null ? "В обработке" : cr.DateClose.ToString(), + StyleInfo = ExcelStyleInfoType.TextWithBorder + }); + + rowIndex++; } rowIndex++; diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToExcelCashier.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToExcelCashier.cs deleted file mode 100644 index dee00d6..0000000 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToExcelCashier.cs +++ /dev/null @@ -1,51 +0,0 @@ -using BankYouBankruptBusinessLogic.OfficePackage.HelperEnums; -using BankYouBankruptBusinessLogic.OfficePackage.HelperModels; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BankYouBankruptBusinessLogic.OfficePackage -{ - public abstract class AbstractSaveToExcelCashier - { - //Создание отчета. Описание методов ниже - public void CreateReport(ExcelInfo info) - { - CreateExcel(info); - - InsertCellInWorksheet(new ExcelCellParameters - { - ColumnName = "A", - RowIndex = 1, - Text = info.Title, - StyleInfo = ExcelStyleInfoType.Title - }); - - MergeCells(new ExcelMergeParameters - { - CellFromName = "A1", - CellToName = "C1" - }); - - uint rowIndex = 2; - - ///TODO - - SaveExcel(info); - } - - //Создание excel-файла - protected abstract void CreateExcel(ExcelInfo info); - - //Добавляем новую ячейку в лист - protected abstract void InsertCellInWorksheet(ExcelCellParameters excelParams); - - //Объединение ячеек - protected abstract void MergeCells(ExcelMergeParameters excelParams); - - //Сохранение файла - protected abstract void SaveExcel(ExcelInfo info); - } -} diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToWord.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToWord.cs new file mode 100644 index 0000000..0f012a3 --- /dev/null +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToWord.cs @@ -0,0 +1,286 @@ +using BankYouBankruptBusinessLogic.OfficePackage.HelperEnums; +using BankYouBankruptBusinessLogic.OfficePackage.HelperModels; +using BankYouBankruptDataModels.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BankYouBankruptBusinessLogic.OfficePackage +{ + public abstract class AbstractSaveToWord + { + //метод создания документа + public void CreateDoc(WordInfo info, OfficeOperationEnum operationEnum) + { + if (operationEnum == OfficeOperationEnum.Между_cчетами) + { + CreateMoneyTransferWord(info); + } + + if (operationEnum == OfficeOperationEnum.Пополнение_карт) + { + CreateCreditingWord(info); + } + + if (operationEnum == OfficeOperationEnum.Cнятие_с_карты) + { + CreateDebitingWord(info); + } + + if (operationEnum == OfficeOperationEnum.Для_кассира) + { + CreateCashierWord(info); + } + } + + private void CreateMoneyTransferWord(WordInfo info) + { + CreateWord(info); + + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> { (info.Title, new WordTextProperties { Bold = true, Size = "24" }) }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + + foreach (var transfer in info.MoneyTransfer) + { + List<List<(string, WordTextProperties)>> rowList = new() + { + new() + { + new("Номер счёта отправителя", new WordTextProperties { Bold = true, Size = "20" } ), + new("Номер счёта получателя", new WordTextProperties { Bold = true, Size = "20" } ), + new("Сумма операции", new WordTextProperties { Bold = true, Size = "20" } ), + new("Дата перевода", new WordTextProperties { Bold = true, Size = "20" } ) + } + }; + + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> { ("Перевод №" + transfer.Id.ToString(), new WordTextProperties { Bold = true, Size = "24" }) }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + + List<(string, WordTextProperties)> cellList = new() + { + new(transfer.AccountSenderNumber, new WordTextProperties { Size = "20" }), + new(transfer.AccountPayeeNumber, new WordTextProperties { Size = "20" }), + new(transfer.Sum.ToString(), new WordTextProperties { Size = "20"}), + new(transfer.DateOperation.ToString(), new WordTextProperties { Size = "20"}), + }; + + rowList.Add(cellList); + + CreateTable(new WordParagraph + { + RowTexts = rowList, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + } + + SaveWord(info); + } + + private void CreateCreditingWord(WordInfo info) + { + CreateWord(info); + + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> { (info.Title, new WordTextProperties { Bold = true, Size = "24" }) }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + + foreach (var crediting in info.Crediting) + { + List<List<(string, WordTextProperties)>> rowList = new() + { + new() + { + new("Номер карты", new WordTextProperties { Bold = true, Size = "24" } ), + new("Сумма пополнения", new WordTextProperties { Bold = true, Size = "24" } ), + new("Дата выполнения", new WordTextProperties { Bold = true, Size = "24" } ) + } + }; + + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> { ("Пополнение №" + crediting.Id.ToString(), new WordTextProperties { Bold = true, Size = "24" }) }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + + List<(string, WordTextProperties)> cellList = new() + { + new(crediting.CardNumber, new WordTextProperties { Size = "24" }), + new(crediting.Sum.ToString(), new WordTextProperties { Size = "24" }), + new(crediting.DateClose == null ? "В обработке" : crediting.DateClose.ToString(), new WordTextProperties { Size = "24" }) + }; + + rowList.Add(cellList); + + CreateTable(new WordParagraph + { + RowTexts = rowList, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + } + + SaveWord(info); + } + + private void CreateDebitingWord(WordInfo info) + { + CreateWord(info); + + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> { (info.Title, new WordTextProperties { Bold = true, Size = "24" }) }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + + foreach (var crediting in info.Debiting) + { + List<List<(string, WordTextProperties)>> rowList = new() + { + new() + { + new("Номер карты", new WordTextProperties { Bold = true, Size = "24" } ), + new("Сумма снятия", new WordTextProperties { Bold = true, Size = "24" } ), + new("Дата выполнения", new WordTextProperties { Bold = true, Size = "24" } ) + } + }; + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> { ("Снятие №" + crediting.Id.ToString(), new WordTextProperties { Bold = true, Size = "24" }) }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + + List<(string, WordTextProperties)> cellList = new() + { + new(crediting.CardNumber, new WordTextProperties { Size = "24" }), + new(crediting.Sum.ToString(), new WordTextProperties { Size = "24" }), + new(crediting.DateClose == null ? "В обработке" : crediting.DateClose.ToString(), new WordTextProperties { Size = "24" }) + }; + + rowList.Add(cellList); + + CreateTable(new WordParagraph + { + RowTexts = rowList, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + } + + SaveWord(info); + } + + private void CreateCashierWord(WordInfo info) + { + CreateWord(info); + + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> { (info.Title, new WordTextProperties { Bold = true, Size = "24" }) }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + + foreach (var crediting in info.Debiting) + { + List<List<(string, WordTextProperties)>> rowList = new() + { + new() + { + new("Сумма заявки", new WordTextProperties { Bold = true, Size = "24" } ), + new("Дата открытия", new WordTextProperties { Bold = true, Size = "24" } ), + new("Статус", new WordTextProperties { Bold = true, Size = "24" } ) + } + }; + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> { ("Заявка №" + crediting.Id.ToString(), new WordTextProperties { Bold = true, Size = "24" }) }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + + List<(string, WordTextProperties)> cellList = new() + { + new(crediting.Sum.ToString(), new WordTextProperties { Size = "24" }), + new(crediting.DateOpen.ToString(), new WordTextProperties { Size = "24" }), + new(crediting.Status.ToString(), new WordTextProperties { Size = "24" }) + }; + + rowList.Add(cellList); + + CreateTable(new WordParagraph + { + RowTexts = rowList, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + } + + SaveWord(info); + } + + // Создание doc-файла + protected abstract void CreateWord(WordInfo info); + + // Создание абзаца с текстом + protected abstract void CreateParagraph(WordParagraph paragraph); + + //Создание таблицы + protected abstract void CreateTable(WordParagraph paragraph); + + // Сохранение файла + protected abstract void SaveWord(WordInfo info); + } +} diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToWordClient.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToWordClient.cs deleted file mode 100644 index 1547b3a..0000000 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/AbstractSaveToWordClient.cs +++ /dev/null @@ -1,43 +0,0 @@ -using BankYouBankruptBusinessLogic.OfficePackage.HelperEnums; -using BankYouBankruptBusinessLogic.OfficePackage.HelperModels; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BankYouBankruptBusinessLogic.OfficePackage -{ - public abstract class AbstractSaveToWordClient - { - //метод создания документа - public void CreateDoc(WordInfo info) - { - CreateWord(info); - - //создание ряда абзацев - CreateParagraph(new WordParagraph - { - Texts = new List<(string, WordTextProperties)> { (info.Title, new WordTextProperties { Bold = true, Size = "24", }) }, - TextProperties = new WordTextProperties - { - Size = "24", - JustificationType = WordJustificationType.Center - } - }); - - //TODO - - SaveWord(info); - } - - // Создание doc-файла - protected abstract void CreateWord(WordInfo info); - - // Создание абзаца с текстом - protected abstract void CreateParagraph(WordParagraph paragraph); - - // Сохранение файла - protected abstract void SaveWord(WordInfo info); - } -} diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/WordInfo.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/WordInfo.cs index c79d66f..00c3122 100644 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/WordInfo.cs +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/WordInfo.cs @@ -1,4 +1,5 @@ using BankYouBankruptContracts.ViewModels; +using BankYouBankruptContracts.ViewModels.Client.Default; using System; using System.Collections.Generic; using System.Linq; @@ -14,7 +15,12 @@ namespace BankYouBankruptBusinessLogic.OfficePackage.HelperModels public string Title { get; set; } = string.Empty; - //списки для формирования отчёта клиента - public List<AccountViewModel> Accounts { get; set; } = new(); - } + //списки для отчёта клиента + public List<MoneyTransferViewModel> MoneyTransfer { get; set; } = new(); + + public List<CreditingViewModel> Crediting { get; set; } = new(); + + //список для отчёта кассира и клиента + public List<DebitingViewModel> Debiting { get; set; } = new(); + } } diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs index d326090..a2277e0 100644 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs @@ -14,5 +14,7 @@ namespace BankYouBankruptBusinessLogic.OfficePackage.HelperModels //свойства параграфа, если они есть public WordTextProperties? TextProperties { get; set; } - } + + public List<List<(string, WordTextProperties)>> RowTexts { get; set; } = new(); + } } diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWord.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWord.cs index 3da7708..c4e87e8 100644 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWord.cs +++ b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWord.cs @@ -8,7 +8,7 @@ using DocumentFormat.OpenXml.Wordprocessing; namespace BankYouBankruptBusinessLogic.OfficePackage.Implements { //реализация абстрактного класса сохранения в word - public class SaveToWord : AbstractSaveToWordClient + public class SaveToWord : AbstractSaveToWord { private WordprocessingDocument? _wordDocument; @@ -135,8 +135,79 @@ namespace BankYouBankruptBusinessLogic.OfficePackage.Implements _docBody.AppendChild(docParagraph); } - //метод сохранения документа - protected override void SaveWord(WordInfo info) + //метод, отвечающий за создание таблицы + protected override void CreateTable(WordParagraph paragraph) + { + if (_docBody == null || paragraph == null) + { + return; + } + + Table table = new Table(); + + var tableProp = new TableProperties(); + + tableProp.AppendChild(new TableLayout { Type = TableLayoutValues.Fixed }); + tableProp.AppendChild(new TableBorders( + new TopBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }, + new LeftBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }, + new RightBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }, + new BottomBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }, + new InsideHorizontalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }, + new InsideVerticalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 } + )); + tableProp.AppendChild(new TableWidth { Type = TableWidthUnitValues.Auto }); + + table.AppendChild(tableProp); + + TableGrid tableGrid = new TableGrid(); + + for (int j = 0; j < paragraph.RowTexts[0].Count; ++j) + { + tableGrid.AppendChild(new GridColumn() { Width = "2500" }); + } + + table.AppendChild(tableGrid); + + for (int i = 0; i < paragraph.RowTexts.Count; ++i) + { + TableRow docRow = new TableRow(); + + for (int j = 0; j < paragraph.RowTexts[i].Count; ++j) + { + var docParagraph = new Paragraph(); + + docParagraph.AppendChild(CreateParagraphProperties(paragraph.RowTexts[i][j].Item2)); + + var docRun = new Run(); + + var properties = new RunProperties(); + + properties.AppendChild(new FontSize { Val = paragraph.RowTexts[i][j].Item2.Size }); + + if (paragraph.RowTexts[i][j].Item2.Bold) + { + properties.AppendChild(new Bold()); + } + + docRun.AppendChild(properties); + + docRun.AppendChild(new Text { Text = paragraph.RowTexts[i][j].Item1, Space = SpaceProcessingModeValues.Preserve }); + + docParagraph.AppendChild(docRun); + TableCell docCell = new TableCell(); + docCell.AppendChild(docParagraph); + docRow.AppendChild(docCell); + } + + table.AppendChild(docRow); + } + + _docBody.AppendChild(table); + } + + //метод сохранения документа + protected override void SaveWord(WordInfo info) { if (_docBody == null || _wordDocument == null) { diff --git a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWordCashier.cs b/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWordCashier.cs deleted file mode 100644 index 19655b9..0000000 --- a/BankYouBankrupt/BankYouBankruptBusinessLogic/OfficePackage/Implements/SaveToWordCashier.cs +++ /dev/null @@ -1,27 +0,0 @@ -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/BankYouBankruptContracts/BusinessLogicsContracts/IReportClientLogic.cs b/BankYouBankrupt/BankYouBankruptContracts/BusinessLogicsContracts/IReportClientLogic.cs index ba06d3c..bdf3bfc 100644 --- a/BankYouBankrupt/BankYouBankruptContracts/BusinessLogicsContracts/IReportClientLogic.cs +++ b/BankYouBankrupt/BankYouBankruptContracts/BusinessLogicsContracts/IReportClientLogic.cs @@ -18,10 +18,10 @@ namespace BankYouBankruptContracts.BusinessLogicsContracts List<ReportClientViewModel>? GetDebiting(ReportBindingModel model); //Сохранение отчёта по картам в файл-Word - void SaveToWordFile(ReportBindingModel model); + void SaveToWordFile(ReportBindingModel model, OfficeOperationEnum operationEnum); //Сохранение отчёта по картам в файл-Excel - void SaveToExcelFile(ReportBindingModel model, ExcelOperationEnum operationEnum); + void SaveToExcelFile(ReportBindingModel model, OfficeOperationEnum operationEnum); //Сохранение отчёта по картам в файл-Pdf ReportClientViewModelForHTML SaveClientReportToPdfFile(ReportBindingModel model); diff --git a/BankYouBankrupt/BankYouBankruptDataModels/Enums/ExcelOperationEnum.cs b/BankYouBankrupt/BankYouBankruptDataModels/Enums/OfficeOperationEnum.cs similarity index 90% rename from BankYouBankrupt/BankYouBankruptDataModels/Enums/ExcelOperationEnum.cs rename to BankYouBankrupt/BankYouBankruptDataModels/Enums/OfficeOperationEnum.cs index bafa9e4..70e345f 100644 --- a/BankYouBankrupt/BankYouBankruptDataModels/Enums/ExcelOperationEnum.cs +++ b/BankYouBankrupt/BankYouBankruptDataModels/Enums/OfficeOperationEnum.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace BankYouBankruptDataModels.Enums { - public enum ExcelOperationEnum + public enum OfficeOperationEnum { Между_cчетами = 0, diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Controllers/ReportController.cs b/BankYouBankrupt/BankYouBankruptRestAPI/Controllers/ReportController.cs index 83b592b..386f998 100644 --- a/BankYouBankrupt/BankYouBankruptRestAPI/Controllers/ReportController.cs +++ b/BankYouBankrupt/BankYouBankruptRestAPI/Controllers/ReportController.cs @@ -35,6 +35,8 @@ namespace BankYouBankruptRestAPI.Controllers _reportCashierLogic = reportCashierLogic; } + #region Работа с pdf + //метод генерации отчёта за период по картам клиента [HttpPost] public ReportClientViewModelForHTML CreateClientReport(ReportSupportBindingModel model) @@ -80,20 +82,9 @@ namespace BankYouBankruptRestAPI.Controllers } } - /*//передача данных из отчёта кассира - [HttpGet] - public ReportCashierViewModelForHTML GetDataOfCashierReport() - { - try - { - return _reportCashierViewModelForHTML; - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка входа в систему"); - throw; - } - }*/ + #endregion + + #region Работа с Excel //отчёт клиента Excel по переводу денег [HttpPost] @@ -103,9 +94,9 @@ namespace BankYouBankruptRestAPI.Controllers { _reportClientLogic.SaveToExcelFile(new ReportBindingModel { - FileName = "Отчёт по переводам.xls", + FileName = "Отчёт по переводам.xlsx", CardList = model.CardList - }, ExcelOperationEnum.Между_cчетами); + }, OfficeOperationEnum.Между_cчетами); } catch (Exception ex) { @@ -122,9 +113,9 @@ namespace BankYouBankruptRestAPI.Controllers { _reportClientLogic.SaveToExcelFile(new ReportBindingModel { - FileName = "Отчёт по пополнениям.xls", + FileName = "Отчёт по пополнениям.xlsx", CardList = model.CardList - }, ExcelOperationEnum.Пополнение_карт); + }, OfficeOperationEnum.Пополнение_карт); } catch (Exception ex) { @@ -141,9 +132,9 @@ namespace BankYouBankruptRestAPI.Controllers { _reportClientLogic.SaveToExcelFile(new ReportBindingModel { - FileName = "Отчёт по снятиям.xls", + FileName = "Отчёт по снятиям.xlsx", CardList = model.CardList - }, ExcelOperationEnum.Cнятие_с_карты); + }, OfficeOperationEnum.Cнятие_с_карты); } catch (Exception ex) { @@ -160,7 +151,7 @@ namespace BankYouBankruptRestAPI.Controllers { _reportCashierLogic.SaveAccountsToExcelFile(new ReportBindingModel { - FileName = "Отчёт по зявкам на снятие.xls", + FileName = "Отчёт по зявкам на снятие.xlsx", AccountId = model.AccountId }); } @@ -171,5 +162,86 @@ namespace BankYouBankruptRestAPI.Controllers } } + #endregion + + #region Работа с word + + //отчёт клиента Word по переводу денег + [HttpPost] + public void CreateWordClient(ReportSupportBindingModel model) + { + try + { + _reportClientLogic.SaveToWordFile(new ReportBindingModel + { + FileName = "Отчёт по переводам.docx", + CardList = model.CardList + }, OfficeOperationEnum.Между_cчетами); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка входа в систему"); + throw; + } + } + + //отчёт клиента Word по переводу денег + [HttpPost] + public void CreateWordCrediting(ReportSupportBindingModel model) + { + try + { + _reportClientLogic.SaveToWordFile(new ReportBindingModel + { + FileName = "Отчёт по пополнениям.docx", + CardList = model.CardList + }, OfficeOperationEnum.Пополнение_карт); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка входа в систему"); + throw; + } + } + + //отчёт клиента Word по выдаче денег + [HttpPost] + public void CreateWordDebiting(ReportSupportBindingModel model) + { + try + { + _reportClientLogic.SaveToWordFile(new ReportBindingModel + { + FileName = "Отчёт по снятиям.docx", + CardList = model.CardList + }, OfficeOperationEnum.Cнятие_с_карты); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка входа в систему"); + throw; + } + } + + //отчёт клиента Word по переводу денег + [HttpPost] + public void CreateWordCashier(ReportSupportBindingModel model) + { + try + { + _reportCashierLogic.SaveAccountsToWordFile(new ReportBindingModel + { + FileName = "Отчёт по зявкам на снятие.docx", + AccountId = model.AccountId + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка входа в систему"); + throw; + } + } + + #endregion } } diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Program.cs b/BankYouBankrupt/BankYouBankruptRestAPI/Program.cs index 4bfc224..922ac20 100644 --- a/BankYouBankrupt/BankYouBankruptRestAPI/Program.cs +++ b/BankYouBankrupt/BankYouBankruptRestAPI/Program.cs @@ -42,11 +42,8 @@ builder.Services.AddTransient<AbstractMailWorker, MailKitWorker>(); //общие классы формировани отчётов builder.Services.AddTransient<AbstractSaveToPdf, SaveToPdf>(); - builder.Services.AddTransient<AbstractSaveToExcel, SaveToExcel>(); - -builder.Services.AddTransient<AbstractSaveToWordClient, SaveToWord>(); -builder.Services.AddTransient<AbstractSaveToWordCashier, SaveToWordCashier>(); +builder.Services.AddTransient<AbstractSaveToWord, SaveToWord>(); builder.Services.AddControllers(); diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по зявкам на снятие.docx b/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по зявкам на снятие.docx new file mode 100644 index 0000000000000000000000000000000000000000..3b25952e99020ffc56f8c9c91f53fb22b0408293 GIT binary patch literal 1837 zcmWIWW@Zs#VBp|jxW039n2Y_ToIqv<hP^=y41x>{4CVPnDf%h-$)&lec_n%kxjAp= zoXxxJAaFeX=%=|ql;wTHeYFoV^2rEz6qLR3%}S|W`*m4n^&-|z=5{X5gKLBCD>ylY zv_6w8i*Hm<%sKv7K#_44b7cRmwA}Y4W&c0k`j?q@J=*$rVal7pd96AxXZjsB<DK<G zhhuW$d6~|Gd)MvUyw_BX@w2<3Zwuo$Pq$;X#o--OBEp`%zjWiYl+IGlE4&i@wv4-L zGI}NXgU;2=N`0W$r*nOqb=aHM&Y8R4Y<{4ifBDg4&hy>V_Zg~H$6Yb5&FCq*yy4T~ z$X7ofFuhu2u+ZOK@a@cd9vdP{XRthF)8CuYK2>~s=!}TXTCZ0r?mHp#tL*dsV@oE) zeqoaGvplPDfAO<ze^k_8xztS)|8!@<^rEB{%9Shqu57dkSO0lV#O_M;SGhi)qWVQ& zqQ0g4Jt}@l{aC-b{M?<dT<m9w8i)UVv9bJs8`CWjcFiBsEx%1>Y~|kiJ@LeW1f6dY zQD1fB?F3B|&8^?e3^iA_66n^gu(%VObSd3wL&Zkl87YYl@_#!oes*=crZ4pSV)yF& zN3W(tZQsA4-G=AWS;Z;*5iH*dKAPs<o@e@}{P@~vJJ*{X`=2R)^w~S@{=@X76YH;s zKba$#8JcuG?i2e3&hH}5ehYU5tiQ7R)3U`|Uu=%qWEHml>c#h^&shKeXa63wHFrl! zZnf<B=Rui%%M-UtuX}68yWIN@-^SZfuXN-lUOj3VX_a!idb3}M!TT*rq6$#>M_V-G z=b93;bu$-u%1pQL)h)d?kJD@dr$JD|M5Z2*ge3`~{eCV?E={F;!X<*70#F#%%HsOX z;kUy<wZhm-cP<2_zh!2f?ZFCztGPw4uyEgMVC|b`mEF&JZqLW=$y^0NjDA`NJXtMP zKH!T9;5KO3$*QYcdg^kG+J--B%RdFxHSW*kRhO~a!N=IlCSh`50V5l4*iJsja)W~0 zOD!Fa?#Tu#K5DTXKia{VCS)+VVJ6ENl{IFQ7ideC<gatxu=~ixVD&bhBC8qO&#`>w zoZ)|<hUuBG!Tg4j4J~|Tp5B+YizhfSzDS7M#PN~=4igMz59E7ae#*JLd`8}c!1yWm zE<fD7C-a!I0QWyh@jKkESKChsn4P}vddTgo)~UDi1EBej0i6F7oLU;S7#SEqm>Zb? z;)_yqiuLtC<on(GZR~+LP@ycfs5mn}&sND$&p=5bH7_|oB{MJGR;jckP1i!n-p(c{ zH7BtIsG>L{v!GZ3s3ou1Rw<*Tq`*pFzc@J~H8-(XFTWr)4=9tCUzD3z0^}B@>lY*@ zXD6no>KhptnCSy;M3|w3YNkR+WkD)2Cg!K5WhSS(K#LD72J54$P*Mm<EJ{x;u~pK? zD0q|<JX36yg3J?>jZ#t#jm<0#j7$v8Oq3M#?QHZ>d~Amrr1zzn!lQt}3Btm_AdPm; z&np3zX7M0j6vu)JHR6L7tcT1XO@`R3TLQ8d7^E(#X^EvdB?_(;K<7YW6zCQu1*rQV zft*-Skdv7Vjtc#<ycD!}(}jc|ynqIUT0v2Ma%yogFiGU*=)q-j6EpL)!Nvo_3yaO5 z6h@lW(BuM2n~0PGw?ZErQoyKSWD;S(UB3Y10|{V6Izl`4?19kR0Ial-G7Gv!^hAKr Yc$o!jk_hl-WdkW<2Ev^{Iu6VO0Mo0&X#fBK literal 0 HcmV?d00001 diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по зявкам на снятие.xlsx b/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по зявкам на снятие.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8ac2f30de48a66bfd01ce49fbd65ab180e9c6375 GIT binary patch literal 3482 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 CV#Fr^ literal 0 HcmV?d00001 diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по переводам.docx b/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по переводам.docx new file mode 100644 index 0000000000000000000000000000000000000000..dcf9c9d28e87a2e7f88e7b8e6aebee16f3beaacc GIT binary patch literal 1608 zcmWIWW@Zs#VBp|jXx+UzjA5=>cn%W-gOV5ngCGL~LwSBtihfFda%paAUWr~sZqD0? zvwfEh1nQ=qD9<wgn`nNkMAhOzBQq1{xy(n~+&pD&=Iy>K{6^_p$Aqvu3?JD97X_)V zdZ%r%{=j5|pR3EZdV8x*D08kk(ewCZ&;F0;)l-@eFFs(d7UFTtS=v;ZMbe~X=kY@e zdyi!m<nzmZ<6AcE_}xMW=hTK;jkPO#-Mn1Ij$M+ycwi#0+(m(7Y%wf-P3t5cX^O|G z?C@U7Qr_6_>$J<FAfh8^dhNTjL6WKc%auge$0TR@%G`I;V_D23X;G`Ie4JI>;MwL0 zcGADExSfmmm^7m`Ze7QnZX3P5Gv1zI5qGYT^~f=5-x>QaD=T%w=17MJ9s!<5TNcgx zH)oDY`pNbuM=pq0O|^S=GTZk0{V!hi*Ehy3vkQ5r*<W{@v3@7dg&#k^C4YBoS@m9g zQNi`^^DT_+!UV$4Dt)j_aKECRbod4H0<H-LuRpGs6YC{CU+KlEWa+8FUtc=pZWG9{ zxRrG2x!1>p&Ai;IpI<z-H>}!tk|VzP#`pMj#v9|pYD^RRSw07qa(q(!eo)SA?oGud z9DmC1J=WeBB6sKSa~;*)8>hTEcFF(1xztl3%9WGf`^!pKu|8tDA<bMZzTo`V{wIHV zzZ^|v)0)L@v6A6uX3?_8|CPAoCkLN6WVG0!(CPR|>%AAcy$;)*pJu+VO!Kc?iPn*~ z_H5gn?rYzQjk&k>!7bO-Dm&CpMwxCbm0ohyp!25DtnX{j&Aa+0?{3%6w=r91UA(it z``E6GJ-OdgV@<BPCW8sl?0&zCt2oykGJRavT+%h`VwT|QyLT3*Ot})e^Lxe*8{V_5 z%o`re=T?<jcFJ-}+k$8RQyew_fB#m;7ywP03=D0+r1?E>?_w=R1_lu31}4q;qSTyX zeLWEQe)oPGdtl;JC`&CW&dkrVRWj5wP*O<EOU_Tp%uBabDlJLVwNSFRvk6MgNh|@X zD9*?%C{_S!$t$*1$|xx*u+rBrPR>ZpO)S>SFG$S;%B1BN<tCN@xkc&v1&PVoiRr2O zMg|6E`al~IW+<VWsSr|GkV=e+`DtmH$*C^ToQ1_;eN+`n3L%L_>8T~QO8OXiQc1xx z#a1cE!Z6V=Imsf`Al1;^BsJMkNkQMvMjyq;cBnymUz#aA3K*OqEDQ|NXy^RA5@1G; z2l=8n7L?zK4_dGuGJ`Z3Vy|uq$X;NOx}>HhmgbZwxK;q21Bp?fTa*-_?t=t!VnIPp zW->S`^vm*6(Be%O5`OTq3lwSvMfu68#l^rRk(;9jm&r}c%+m%N4-79XHiJ?aX;wp% z3n*<OQVQG(eQ-ztqk@r1gaLQa3ycpWfD!2k?bx#iLho!~d5)A>&^4kb0))nQ%vh5| TfHx}}ND(s-?gY}6tRNl$Bs6Os literal 0 HcmV?d00001 diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по переводам.xls b/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по переводам.xls index 5ca769e950ae34531443bc753a7c1285cb19c693..236f01a6b81541f4fd31f2bece4cfd53cc452838 100644 GIT binary patch literal 1514 zcmWIWW@Zs#VBp|j&{(%QET|!&mXC>nVHY<8gCGL~LwSBtihfFda%paAUWr~sZqD1V zyLp!lMCzuV_<rW*jSC{Wb4~OfG;y;C#XLXmYin7Svis~V?Hej(ofQldDw;V0R|<uG z=lUjHILAU%_(Gp`)Cbpdg@2w}+y9gK`Q*!@l!GlEuB`nR|HXAM9WtI69CsvRO*?<z z#g`A3^c79)^*&U}P_b^2m7DU~)f~xFdp%~ZuniRC%XU^g?Q%FoY=@Z9`Xwhif*it) zY6RN)3uXrN$)sw1TDdv&cZJ?u%kxcEvs854Bw3V&Sa0kN3!TKsy2kL-$!<esL$6~| zKT=P9J~vUed)J#tKE7y<Z{8K69_yN&^X%(F-E(i|iV5tP<RWOPn2}(2Q@c9Z{>JJ9 zcV;cEKJ!M}*f{>or5e-TNDIEZhNTyyw@s;hd^7l)&djcjZ6;r~GzmCYITp?5S~Jg4 zIkEfJ%oV><VuK|e4ML|IzA{cvS#e!iMb}MQVdaIWDX$HuXwRCw{5#{`DE344Q)g_t zzS?h1ndJT48^WH&&&3ktx!EcvJUMK@Q~SWay8nH_D?N{GPapl^P>Qi|Wc!x8Jm@k@ z8s{@Hms<@U&mWvWWB&V}xY5yC_OdPf1#t^MWmhN9s$axC|E+0B;zh3m|CdYsK6mEq zpYN&G%K!ffZ`}AJ*?wDLv$<ILi{pM`+xhD=B>t=Jy1KjK$#FlgFE8r2-ma6#<(Txc zZ=+V+t^%hZ4FQYRD@F@<_1|Vb`1akY2VcH_I9MJ4O*{<X#Ph!E;6E)!1_lrYrXPm* zqSTyXeLWEQe)oPGdtmZWC`&CW&dkrVRWj5wP*O<EOU_Tp%uBabDlJLVwNSFRvk6Mg zNh|@XD9*?%C{_S!$t$*1$|xx*u+rBrPR>ZpO)S>SFG$S;%B1BN<tCN@xkc&v1&PVo ziRr2OMg|6E`al~IW+<VWsSr|GkV=e+`DtmH$*C^Tw2#GLeN+`n3L%L_>8T~QO8OYN zMoGal#a1cEGA%VFG07m!+{n_@#K0s;NkQMvMjyq;cBnymUz#aA3K*OqEDQ|NXy^RA z5@1%02l=8n7L+524_dGuGJ`Z3Vy|uq$X;NOx}>HhmgbZwxK;q21Bp?fTa*-_?t=t! zVnIPpW->S`^vm*6(Be%O5`OT~1r%xpMfu68#l^rRk(;9jm&r}c%+m%N4-79XHiJ?a zX;wp%3n*<OQVQG(eQ-ztqk@r1gaLQq2#gOTfD!2k?bx#iLa!~b#6`+1=o--z0Yc*h XW~@mfz?+o~q=*>^cLHf?RuB&WT>de* literal 3483 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 C70m4b diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по пополнениям.docx b/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по пополнениям.docx new file mode 100644 index 0000000000000000000000000000000000000000..2621260eb3695f75a56e1be12100068cfba86a44 GIT binary patch literal 1793 zcmWIWW@Zs#VBp|jn6_hcm=(v*JXK}}h6rZ{20;b}hVuNP6#bO^<kH;Kyb`^N+?=;_ z&gNZq5NL=$`iYb8$bZjWSwWn91rHh=nl>lr3n|~uUTf}qJNT;7*9*+6T6Qo#;$79% z#lf|w=`WWJXR@`Q#uCqyoi~zC-rIljP0!xAda3+9dpC>!xTN=V<MBg%YfM8T7cD#- zqc2nPWa5ka*{7}VzBMeIY0Q<Op)!F#+34K~XGNt&8XJw5G|HMsxHxCLHkP}=)K#;f zN3vY`oQ%}*1$rMuV?$?qB~&k*v+|8$xxM$|KOb7sPkOscO^&_&{sdo%+fE(L$Wob` zd@CBv?sLDqJkj5JldVwBtv9WC6Cbut`?284qS-q;jB<n0WIv`pO1S-gztrSAZ|`uu zuy|y$tY-SDyH9GXrp#NC{&M1!KOXy@x7YliRpYIfIDg6d$=WaZuEZ{D4=85Loj<8~ zg}2(tbWW9Xj%AbPsl-q6jGLlRK2NUc-s9af85bEWHmE&({#v{JdA}mfzcpXOqF*e3 z@$+)Zsx8m$w|&3q;qX4mp6P6De*dmu?gd}%ddwt_S9ZEC?Y(*8^GcqhKNcuYXZyWH zf0}nezCn!QrDUfK2|IhlkInOzzw7qmr;*}Qeevpl-8W~>h>dyri?jNKt@&v_h1vr( z6WV`Y3kWT}^>P1I?dv67i-gk;AAe#k(I0;EuI2uZe&RjuOG`>0%l?}o*L*nqrqAYt zZL7At&VRrppV}9{Wcl`T8}A?g?H`5jx_@rF@16tNv6mCNn%2(RXDYqw>V?p|6SjyM zhA!F`)^{~&**Y~{2@h@r%(e|&n{~J;@<7u%;nND!qOv142#6uzwPx1StJE~NJWFgf zyExlrYnCsUuL>(1wtl_0KE!Org;}hk45B@1hPSr5wYuJWT*Vr*zTvfK!Ct0y;Rn8Q znZ~a-;MaK}WvH7ZwRKsm?h;lWorDBNW^Rdy0|yRO`CrkxeCXOAQ<jSgTLRv17ns$z zr2zrC#qyL`Yr7-PR!wf|T+#rC8^kncYzVbqk#N9XO}sYofm%q%N@cFM7av4kGkq*) z!Tn28{LVL*OlM7wn~%K3CTQ-Tbn!2105nfAfb-O10lQ0Dj0_AQ%ni&_@kOaQ#rk?6 z^8N1pHuk_=rBIeyRGgWgXRBnWXP~5znwOlPl9`uot5jN&rfZ>OZ)X#fnv+-pR8gFf zSx~G1)RI?htCUevQedU8U!0tgnwwaxmtT;Y2b4+6FUn0U0dkAd^$QY{vlG)(^^FV+ z%=CdaBFs=iHB%v^vLKZh6Z6y3GLutXphW@}gY{8WC@F*_7Nw__*edB`6edavo+-9U zL6#|L#s<b_hQ>)|rY0r^zyQ#<v(ZQKu^noV-j`+yj{*iK2nz#)G}<{ouLM{^#e;lN z91AL_h!0w@9x{V88Dg()3CLbxkh-L%C6?xtD7aPtodbzcpj(s_pzebNa$-S2PG&MV zD)h_pQqbZ}7ZQH(LKhTj1x5MEsl~;>B$1n=2balB%*@jU8xIUGEH;Bu7-?2RlM5(q zB2o(63Vm=$0i%MENrVA+odJvwB!Cg=2<_Oj2SRTMup&arEa)2169Gcwau%#fBEXxK P4Wx(}2zLT$BQOsD{=2sJ literal 0 HcmV?d00001 diff --git a/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по снятиям.docx b/BankYouBankrupt/BankYouBankruptRestAPI/Отчёт по снятиям.docx new file mode 100644 index 0000000000000000000000000000000000000000..d5829187968a66a399cb498c29bc0457bd8b24eb GIT binary patch literal 1856 zcmWIWW@Zs#VBp|jSg>Pr*uN=;FH@Kq7+8ZD7z7y@7|QdDQuI^ulS^|`^Gft8a&z9! zam>GLAaZ=a*A(mC$?Ia%*Un~Pw<vH>IB4m6M^B?y`FQO1xn7KgHxii?^Az4nmt5|; zaN|_?hW$+QTc$73^a;`3d+}Ll)Z8Qa=j%GN|9{y&_wL`tc^NWB6IpDsW|g(hVC%Md z#~!#m^IOXAxWjku-+miBzk07;_Y%f$flj}DKRcY75f%1GcEh^aAr)toPGlEfELEM; z)pzyzp?=oy5tABr=Ve&7Tv@wL+9mDPrlWr!oAhp8udd`9SLHTeZdc;vFAEIRd=7i* zt8aYW$bEvlxx@Bt>zd46wkMb0bbRuhUFrLzIU;d$)}A>sD=l(!(-EcO6}RXAzq&l~ zMx^e72N4@uI-S$rt<<ktasTD_s*Dx#SxGO#Uxm$ox$xJr^H+KouDcR(_t5?D9W|@& zJMEJ@@KSV%bLq@q(<?PA&tChJHb?y6>Wv>ipH;8UtJx&#H+kjeupc*UpV@LQJ@r_^ zW?QrJGk@>4JHIb<ET~LNx6ykw&1}VlnFX`vn4Dd-NHP2LQ8A?#GCGEtg_@P+8+`>- z8_&!A?Y{Wg)$Llm;<iKLo2?D2S6sU*{Vjl{uIfhP7e@Yra&>*7PA9fJxVkR7yyny% zf&8<#AElcHnrE$HZ`&27Y};`E<;ywWGDH`yt3B}imnlolVz+Xug}r<~m2GY)vaHej zntAK*s`ruU)w?Y|m<ax__l}pUQ~tf?F>{<$6z?uICo?0H-EoRryPRci7s$LaS+RNR zmX*(BzoZ>><bB8hhY6_`H+)QP%v<Dmbwl}z*yZQ^G%qGdUu1y8gsp-lpHCi8+>&-V zYVVX31OK;&Bw6PK9)J@O22E+fT+-a^-+as(JX_ZmonrgE$j!n54kI+AClvW;U1{K( z6LhK3_WegCIR!Y>Iocfb!Evh9k~uXEyG0AGGOn{a5X!#e6+^h}gQg=jJ%18bbnd#q zY#Jn<#nk+CtJL(#e9t=7R>&==YIw!CiXFt*5Mz5I;OBym(RM3>E@`};$GW?#p<%XI z!DXhrr~|&-J2Dfm`f@L2WSM;-%k#SYnd-C5S{y4B7Bn?*F@YEg3KE(MA(^?Ntcr>A z&K!TZ<Fk(J>YW@7d<iPgoVd&<9F>TdIF$JBmZybAT;|U2+yT%m$pFrh2j=iR(_&;` z0AX%mmW(e-%_-K`1Cj4{@3*lBW=e&!)S}|d{5)GFLp=i}h19&{{FKbRbX%p;k~Ccl zC3`!Ypwyhi5}=CWjLd>!1)!F^Vq2w*l9B=|ef{F(jMUu3V!ix=)I6X}T7FS(VhNC2 zl&)Wpn4F!Mo~mzTU|^;Xv=L#35~`UBA(aKG#F&_$mX?{E>H;lMuo$e5szOO2B(W$x zwZv9QAEPW%Qt(W%RSGgpOtnlkNU}6AO|>*hN-<GV(6_VENAa;8YLMQSW(to21}6v$ z1A{c$IX|xiSir@Dd{G<=D(8p~TCg56gESdpuWkv*USN>Aq^2d7=9DP7Rsfv?iBX_i zloX)ug9LJ7K|xMtGB_&q%komt;!PJ4e(*9I6lw)U`N^rp#lR$yo1+Jp$xY16(*_$4 z3@<D;gHjl2Rzs5uC~YEA3fu~Pa7Y28f{{st0e6)Hj1MG$5$Oo+*s}*h?_^*-hLl;* dHKHd1gvMtqSd&D6H!B-R5i=0(1k#0I9sr5G+;{*0 literal 0 HcmV?d00001