Suporte a seleção dinâmica de mês e melhorias na UI

Adicionada a biblioteca `System.Globalization` para manipulação de
datas. Criadas variáveis estáticas para armazenar o primeiro e o
último dia do mês atual, bem como suas representações formatadas.

Implementado o método `SetDateEval` para permitir a definição de
uma data específica com base no formato `AAMM`, ajustando as
variáveis de data dinamicamente.

Alterada a mensagem exibida ao usuário para incluir a opção de
visualizar outro mês ao pressionar `'/'`. Adicionada lógica para
capturar a tecla `'/'` e permitir a seleção de um mês no formato
`AAMM`, com restauração ao mês atual ao pressionar `ENTER`.

Atualizado o cabeçalho da interface para exibir o mês atual
formatado. Modificada a consulta SQL para usar `firstDayOfMonthStr`
e `lastDayOfMonthStr`, tornando o intervalo de datas dinâmico.
This commit is contained in:
Giuliano Paschoalino 2025-09-30 18:29:17 -03:00
parent 1832989012
commit a4063f9187

View File

@ -1,4 +1,5 @@
using System.Data.Common;
using System.Globalization;
using System.Numerics;
using Npgsql;
using Spectre.Console;
@ -9,6 +10,12 @@ class Program
static bool _stop = false;
static bool _isAuthenticated = false;
static readonly string _connectionString = "Server=192.168.10.248;Port=5432;Database=pipefy_move_cards;User Id=postgres;Password=gds21;";
static DateTime date = DateTime.Now;
static DateTime firstDayOfMonth = new(date.Year, date.Month, 1);
static DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddSeconds(-1);
static string firstDayOfMonthStr = firstDayOfMonth.ToString("yyyy-MM-dd HH\\:mm\\:sszz", new System.Globalization.CultureInfo("pt-BR"));
static string lastDayOfMonthStr = lastDayOfMonth.ToString("yyyy-MM-dd HH\\:mm\\:sszz", new System.Globalization.CultureInfo("pt-BR"));
#if DEBUG
static readonly string _windowsID = "gestao1.3";
#else
@ -73,7 +80,32 @@ class Program
AnsiConsole.MarkupLine("[bold yellow]Aplicação encerrada.[/]");
}
static void SetDateEval(string monthString)
{
if (System.Text.RegularExpressions.Regex.IsMatch(monthString, @"^\d{4}$"))
{
if (DateTime.TryParseExact(monthString[2..] + "/" + monthString[..2],
"MM/yy",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out date))
{
//valid date
}
else
{
date = DateTime.Now;
}
}
else
{
date = DateTime.Now;
}
firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddSeconds(-1);
firstDayOfMonthStr = firstDayOfMonth.ToString("yyyy-MM-dd HH\\:mm\\:sszz", new System.Globalization.CultureInfo("pt-BR"));
lastDayOfMonthStr = lastDayOfMonth.ToString("yyyy-MM-dd HH\\:mm\\:sszz", new System.Globalization.CultureInfo("pt-BR"));
}
static void AtualizarDados()
{
var records = new List<Record>();
@ -110,14 +142,14 @@ class Program
}
AnsiConsole.Clear();
AnsiConsole.MarkupLine("\n[gray]Pressione [green]ENTER[/] para atualizar agora ou qualquer outra tecla para sair.[/]");
AnsiConsole.MarkupLine("\n[gray]Pressione [green]ENTER[/] para atualizar agora, [green]'/'[/] para visualizar outro mês, ou qualquer outra tecla para sair.[/]");
ExibirCabecalho();
ExibirPainel(tableContLigacoes, "[blue bold] Ligações [/]");
ExibirPainel(tableContReunioes, "[blue bold] Reuniões Agendadas e Realizadas [/]");
ExibirPainel(tableReunioes, "[blue bold] Reuniões no Mês [/]");
AnsiConsole.MarkupLine("\n[gray]Pressione [green]ENTER[/] para atualizar agora ou qualquer outra tecla para sair.[/]");
AnsiConsole.MarkupLine("\n[gray]Pressione [green]ENTER[/] para atualizar agora, [green]'/'[/] para visualizar outro mês, ou qualquer outra tecla para sair.[/]");
}
static void ExibirCabecalho()
{
@ -125,7 +157,7 @@ class Program
var status = new Align(new Panel($"[bold]WindowsID[/]: {_windowsID} | [bold]Usuários encontrados[/]: {_pipeUsers.Count}"), HorizontalAlignment.Center, VerticalAlignment.Top);
var header = new Panel(status)
.Header("[yellow] Resumo Diário por Usuário [/]", Justify.Center)
.Header($"[yellow] Resumo Diário por Usuário - {date:Y} [/]", Justify.Center)
.Expand();
AnsiConsole.Write(new Align(header, HorizontalAlignment.Center, VerticalAlignment.Top));
@ -173,10 +205,10 @@ class Program
.Spinner(Spinner.Known.Line)
.Start($"[blue]Obtendo registros de [yellow]{nome}[/]...[/]", ctx =>
{
const string query = @"
string query = @$"
SELECT * FROM public.""ActionsHistory""
WHERE ""UserID"" = @pipeUser AND
""MovedAt"" >= date_trunc('month', CURRENT_DATE)";
""MovedAt"" >= '{firstDayOfMonthStr}' AND ""MovedAt"" <= '{lastDayOfMonthStr}'";
try
{
using var conn = new NpgsqlConnection(_connectionString);
@ -273,10 +305,17 @@ class Program
{
var key = Console.ReadKey(true);
// …e não for ENTER, sinalizamos para parar o loop e sair
if (key.Key != ConsoleKey.Enter)
if (key.Key != ConsoleKey.Enter && key.KeyChar != '/')
_stop = true;
else
break;
if (key.KeyChar == '/')
{
AnsiConsole.MarkupLine("\n[gray]Modo de seleção de mês ativado. Digite o mês no formato [green]AAMM[/] ou [green]ENTER[/] para voltar ao mês atual.[/]");
Console.Write("Mês (AAMM): ");
var input = Console.ReadLine();
SetDateEval(input ?? "");
}
break;
}
}