Skip to content

Commit

Permalink
close #3 Close #5 Close #7
Browse files Browse the repository at this point in the history
  • Loading branch information
kenoma committed May 3, 2022
1 parent 6496aed commit 5e46207
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 15 deletions.
63 changes: 53 additions & 10 deletions RQ.Bot/BotInfrastructure/Entries/EntryDownloadReport.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Globalization;
using System.Drawing;
using System.Globalization;
using System.Text;
using Bot.Repo;
using CsvHelper;
Expand All @@ -17,19 +18,21 @@ public class EntryDownloadCsv
{
private readonly TelegramBotClient _botClient;
private readonly IRepository _repo;
private readonly Questionnaire _questionnaire;

public EntryDownloadCsv(TelegramBotClient botClient, IRepository repo)
public EntryDownloadCsv(TelegramBotClient botClient, IRepository repo, Questionnaire questionnaire)
{
_botClient = botClient ?? throw new ArgumentNullException(nameof(botClient));
_repo = repo ?? throw new ArgumentNullException(nameof(repo));
_questionnaire = questionnaire ?? throw new ArgumentNullException(nameof(questionnaire));
}

public async Task GetRequestsInCsv(ChatId chatId, bool allRequests)
{
var dataToRenderCsv = allRequests ? _repo.GetAllRequests() : _repo.GetCurrentRequests();

var sb = RenderCsv(dataToRenderCsv.Where(z=>z.IsCompleted).OrderByDescending(z=>z.TimeStamp));
var sb = RenderCsv(dataToRenderCsv.Where(z => z.IsCompleted).OrderByDescending(z => z.TimeStamp));

var ms = new MemoryStream();
var sw = new StreamWriter(ms, new UTF8Encoding(true));
await sw.WriteAsync(sb);
Expand All @@ -52,7 +55,7 @@ private StringBuilder RenderCsv(IEnumerable<RefRequest> dataToRenderCsv)
var records = new List<Dictionary<string, string>>();
var users = _repo.GetAllUsers()
.ToDictionary(z => z.UserId, z => z);

foreach (var refRequest in dataToRenderCsv)
{
var record = new Dictionary<string, string>();
Expand Down Expand Up @@ -101,19 +104,18 @@ public async Task GetRequestsInXlsx(ChatId chatId, bool allRequests)
{
var dataToRenderXlsx = allRequests ? _repo.GetAllRequests() : _repo.GetCurrentRequests();

var ms = await RenderXlsxAsync(dataToRenderXlsx.Where(z=>z.IsCompleted).OrderByDescending(z=>z.TimeStamp));
var ms = await RenderXlsxAsync(dataToRenderXlsx.Where(z => z.IsCompleted).OrderByDescending(z => z.TimeStamp));

var payload = new InputOnlineFile(ms, $"{(allRequests ? "ВСЕ" : "ТЕКУЩИЕ")}_{DateTime.Now.Ticks}_dataset.xlsx");


await _botClient.SendDocumentAsync(
disableContentTypeDetection: true,
document: payload,
chatId: chatId,
caption: $"Выгрузка *{(allRequests ? "всех" : "текущих")}* запросов на {DateTime.Now}",
parseMode: ParseMode.Markdown
);

}

private async Task<Stream> RenderXlsxAsync(IEnumerable<RefRequest> dataToRenderXlsx)
Expand Down Expand Up @@ -170,8 +172,49 @@ private async Task<Stream> RenderXlsxAsync(IEnumerable<RefRequest> dataToRenderX
}
}

CheckDuplicates(headings, row, sheet);

await package.SaveAsync();
ms.Position = 0;
return ms;
}

private void CheckDuplicates(string[] headings, int row, ExcelWorksheet sheet)
{
int col;
var colorList = Enum.GetValues(typeof(KnownColor))
.Cast<KnownColor>()
.ToList();
var rnd = new Random(Environment.TickCount);

col = 0;
foreach (var heading in headings)
{
++col;

var quest = _questionnaire.Entries.FirstOrDefault(z => z.Text == heading);
if (quest is not { DuplicateCheck: 1 })
continue;
var vals = new List<string>();
for (var r = 1; r <= row; r++)
{
vals.Add(sheet.Cells[r, col].Text);
}

var group = 0;
var duplicates = vals.GroupBy(z => z)
.Where(z => z.Count() > 1);
foreach (var duplicate in duplicates)
{
var color = Color.FromKnownColor(colorList[rnd.Next(0, colorList.Count)]);
for (var r = 1; r <= row; r++)
if (sheet.Cells[r, col].Text == duplicate.Key)
{
sheet.Cells[r, col].Style.Fill.PatternType = ExcelFillStyle.Solid;

sheet.Cells[r, col].Style.Fill.BackgroundColor.SetColor(color);
}
}
}
}
}
2 changes: 2 additions & 0 deletions RQ.Bot/Domain/QuestionnaireEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ public class QuestionnaireEntry
public string Text { get; set; } = string.Empty;

public string ValidationRegex { get; set; } = string.Empty;

public byte DuplicateCheck { get; set; } = 0;
}
4 changes: 3 additions & 1 deletion RQ.Bot/Extensions/QuestionnaireExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ public static WebApplicationBuilder UseQuestionnaire(this WebApplicationBuilder
{
PrepareHeaderForMatch = args => args.Header.ToLower(),
NewLine = Environment.NewLine,
MissingFieldFound = null
MissingFieldFound = null,
IgnoreBlankLines = true,
BadDataFound = null
};
using var reader = new StreamReader(pathToQuest);
Expand Down
8 changes: 4 additions & 4 deletions RQ.Bot/sample.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Text,ValidationRegex
"Ваше ФИО:",
"Какого вы года рождения?","\d{4}"
"Где вы находитесь?"
Text,DuplicateCheck,ValidationRegex
"Ваше ФИО:",0,
"Какого вы года рождения?",1,"\d{4}"
"Где вы находитесь?",0

0 comments on commit 5e46207

Please sign in to comment.