LevelOS-Core/UI/Dashboards/Cadastros/UsuariosCadastroPanel.cs

409 lines
17 KiB
C#

using CPM;
using DAL;
using MLL;
using BLL;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace UI
{
public class UsuariosCadastroPanel : FormularioModelo
{
// ── CAMPOS DO FORMULÁRIO ──────────────────────────────────────────────
private LV_TEXTBOX1 txtId = null!;
private LV_TEXTBOX1 txtNome = null!;
private LV_TEXTBOX1 txtEmail = null!;
private LV_TEXTBOX1 txtUsuario = null!;
private LV_TEXTBOX1 txtSenha = null!;
private LV_TEXTBOX1 txtUltimoLogin = null!;
private LV_TEXTBOX1 txtCriadoEm = null!;
private CheckBox chkAtivo = null!;
private LV_COMBOBOXCUSTOM cmbPerfil = null!;
// ── ESTADO DO FORMULÁRIO ──────────────────────────────────────────────
private enum ModoFormulario { Visualizacao, Novo, Edicao }
private ModoFormulario _modo = ModoFormulario.Visualizacao;
private int _usuarioAtualId = 0;
// ── BLL ───────────────────────────────────────────────────────────────
// Substitua pelos seus serviços reais quando implementar
// private UsuarioBLL _usuarioBLL = null!;
// private PerfilBLL _perfilBLL = null!;
// ── CONSTRUTOR ────────────────────────────────────────────────────────
public UsuariosCadastroPanel()
{
Titulo = "Cadastro de Usuários";
BuildForm();
AplicarModo(ModoFormulario.Visualizacao);
}
// ── CONSTRUÇÃO DOS CAMPOS ─────────────────────────────────────────────
private void BuildForm()
{
// ── SEÇÃO: IDENTIFICAÇÃO ──────────────────────────────────────────
content.Controls.Add(CreateSectionHeader("Identificação", 20));
txtId = AddInput(content, "ID", 20, 58, 80, 32, readOnly: true);
txtNome = AddInput(content, "Nome completo", 120, 58, 320, 32);
txtNome.MaxLength = 255;
txtEmail = AddInput(content, "E-mail", 460, 58, 280, 32);
txtEmail.MaxLength = 150;
// ── SEÇÃO: ACESSO ─────────────────────────────────────────────────
content.Controls.Add(CreateSectionHeader("Acesso ao sistema", 120));
txtUsuario = AddInput(content, "Usuário (login)", 20, 158, 200, 32);
txtUsuario.MaxLength = 50;
txtSenha = AddInput(content, "Senha", 240, 158, 200, 32);
txtSenha.PasswordChar = '●';
txtSenha.MaxLength = 255;
// Perfil — LV_COMBOBOXCUSTOM
var lblPerfil = new Label
{
Text = "Perfil de acesso",
Location = new Point(460, 158),
Font = new Font("Segoe UI", 7.5f, FontStyle.Bold),
ForeColor = TextDark,
AutoSize = true
};
cmbPerfil = new LV_COMBOBOXCUSTOM
{
Location = new Point(460, 174),
Size = new Size(280, 32),
DropDownStyle = ComboBoxStyle.DropDownList,
BorderColor = BorderColor,
BackColor = Color.White,
ListBackColor = Color.White,
ListTextColor = TextDark,
IconColor = AccentBlue,
Font = new Font("Segoe UI", 9f)
};
content.Controls.Add(lblPerfil);
content.Controls.Add(cmbPerfil);
// ── SEÇÃO: STATUS ─────────────────────────────────────────────────
content.Controls.Add(CreateSectionHeader("Status", 230));
chkAtivo = CreateCheckBox("Usuário ativo", 20, 268);
chkAtivo.Checked = true;
content.Controls.Add(chkAtivo);
// ── SEÇÃO: AUDITORIA (somente leitura) ────────────────────────────
content.Controls.Add(CreateSectionHeader("Auditoria", 310));
txtUltimoLogin = AddInput(content, "Último login", 20, 348, 200, 32, readOnly: true);
txtCriadoEm = AddInput(content, "Criado em", 240, 348, 200, 32, readOnly: true);
// Ajusta altura do content
content.Height = 420;
}
// ── CARREGAR PERFIS DO BANCO ──────────────────────────────────────────
private void CarregarPerfis()
{
cmbPerfil.Items.Clear();
cmbPerfil.Items.Add(new ComboItem(0, "— Selecione um perfil —"));
try
{
// TODO: substituir pela chamada real à BLL
// var perfis = _perfilBLL.ListarAtivosPorEmpresa(empresaId);
// foreach (var p in perfis)
// cmbPerfil.Items.Add(new ComboItem(p.Id, p.Nome));
// ── Exemplo estático para desenvolvimento ──
cmbPerfil.Items.Add(new ComboItem(1, "Administrador"));
cmbPerfil.Items.Add(new ComboItem(2, "Técnico"));
cmbPerfil.Items.Add(new ComboItem(3, "Vendedor"));
}
catch (Exception ex)
{
MessageBox.Show($"Erro ao carregar perfis:\n{ex.Message}",
"Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
cmbPerfil.SelectedIndex = 0;
}
// ── MODOS DO FORMULÁRIO ───────────────────────────────────────────────
private void AplicarModo(ModoFormulario modo)
{
_modo = modo;
bool editando = modo == ModoFormulario.Novo || modo == ModoFormulario.Edicao;
bool isNovo = modo == ModoFormulario.Novo;
// Campos editáveis conforme o modo
txtNome.ReadOnly = !editando;
txtEmail.ReadOnly = !editando;
txtUsuario.ReadOnly = !editando;
txtSenha.ReadOnly = !editando;
cmbPerfil.Enabled = editando;
cmbPerfil.BorderColor = editando ? BorderColor : ReadOnlyBorder;
cmbPerfil.BackColor = editando ? Color.White : ReadOnlyBg;
chkAtivo.Enabled = editando;
// Cor de fundo dos campos conforme readonly
Color bgAtivo = Color.White;
Color bgInativo = ReadOnlyBg;
txtNome.BackColor = editando ? bgAtivo : bgInativo;
txtEmail.BackColor = editando ? bgAtivo : bgInativo;
txtUsuario.BackColor = editando ? bgAtivo : bgInativo;
txtSenha.BackColor = editando ? bgAtivo : bgInativo;
// Senha: só obrigatória no cadastro novo
// Na edição, deixar em branco = manter senha atual
if (modo == ModoFormulario.Edicao)
{
var lblSenha = content.Controls.Find("lblSenhaInfo", true);
// Opcional: exibir aviso "deixe em branco para manter a senha"
}
// Botões
btnNovo.Enabled = !editando;
btnAlterar.Enabled = !editando && _usuarioAtualId > 0;
btnExcluir.Enabled = !editando && _usuarioAtualId > 0;
btnLocalizar.Enabled = !editando;
btnSalvar.Enabled = editando;
btnCancelar.Enabled = editando;
// No modo Novo limpa os campos
if (isNovo) LimparCampos();
}
// ── POPULAR CAMPOS COM UM USUÁRIO ─────────────────────────────────────
private void PopularCampos(ModeloUsuario u, int perfilId)
{
_usuarioAtualId = u.Id;
txtId.Text = u.Id.ToString();
txtNome.Text = u.Nome;
txtEmail.Text = u.Email;
txtUsuario.Text = u.Usuario;
txtSenha.Text = string.Empty; // nunca exibe hash
chkAtivo.Checked = u.Ativo;
txtUltimoLogin.Text = u.UltimoLogin.HasValue
? u.UltimoLogin.Value.ToString("dd/MM/yyyy HH:mm")
: "Nunca";
txtCriadoEm.Text = u.CriadoEm.ToString("dd/MM/yyyy HH:mm");
// Seleciona o perfil no ComboBox
for (int i = 0; i < cmbPerfil.Items.Count; i++)
{
if (cmbPerfil.Items[i] is ComboItem item && item.Id == perfilId)
{
cmbPerfil.SelectedIndex = i;
break;
}
}
}
private void LimparCampos()
{
_usuarioAtualId = 0;
txtId.Text = string.Empty;
txtNome.Text = string.Empty;
txtEmail.Text = string.Empty;
txtUsuario.Text = string.Empty;
txtSenha.Text = string.Empty;
chkAtivo.Checked = true;
txtUltimoLogin.Text = string.Empty;
txtCriadoEm.Text = string.Empty;
if (cmbPerfil.Items.Count > 0)
cmbPerfil.SelectedIndex = 0;
}
// ── VALIDAÇÃO ─────────────────────────────────────────────────────────
private bool Validar()
{
if (string.IsNullOrWhiteSpace(txtNome.Text))
{
MessageBox.Show("Informe o nome do usuário.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtNome.Focus();
return false;
}
if (string.IsNullOrWhiteSpace(txtEmail.Text))
{
MessageBox.Show("Informe o e-mail.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtEmail.Focus();
return false;
}
if (string.IsNullOrWhiteSpace(txtUsuario.Text))
{
MessageBox.Show("Informe o login do usuário.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtUsuario.Focus();
return false;
}
// Senha obrigatória apenas no cadastro novo
if (_modo == ModoFormulario.Novo && string.IsNullOrWhiteSpace(txtSenha.Text))
{
MessageBox.Show("Informe a senha para o novo usuário.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtSenha.Focus();
return false;
}
if (cmbPerfil.SelectedItem is not ComboItem perfil || perfil.Id == 0)
{
MessageBox.Show("Selecione um perfil de acesso.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
cmbPerfil.Focus();
return false;
}
return true;
}
// ── EVENTOS ABSTRATOS ─────────────────────────────────────────────────
protected override void OnNovo()
{
CarregarPerfis();
AplicarModo(ModoFormulario.Novo);
txtNome.Focus();
}
protected override void OnAlterar()
{
if (_usuarioAtualId == 0) return;
AplicarModo(ModoFormulario.Edicao);
txtNome.Focus();
}
protected override void OnExcluir()
{
if (_usuarioAtualId == 0) return;
var confirm = MessageBox.Show(
$"Deseja realmente excluir o usuário \"{txtNome.Text}\"?",
"Confirmar exclusão",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);
if (confirm != DialogResult.Yes) return;
try
{
// TODO: _usuarioBLL.Excluir(_usuarioAtualId);
MessageBox.Show("Usuário excluído com sucesso.", "Sucesso",
MessageBoxButtons.OK, MessageBoxIcon.Information);
LimparCampos();
AplicarModo(ModoFormulario.Visualizacao);
}
catch (Exception ex)
{
MessageBox.Show($"Erro ao excluir:\n{ex.Message}", "Erro",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
protected override void OnLocalizar()
{
// TODO: abrir formulário de busca e retornar o usuário selecionado
// Exemplo de como receber o retorno:
// var frm = new FormularioBuscarUsuario();
// if (frm.ShowDialog() == DialogResult.OK)
// {
// var u = frm.UsuarioSelecionado;
// var perfilId = _usuarioBLL.ObterPerfilId(u.Id);
// CarregarPerfis();
// PopularCampos(u, perfilId);
// AplicarModo(ModoFormulario.Visualizacao);
// }
MessageBox.Show("Implemente o formulário de busca de usuários.",
"Localizar", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
protected override void OnSalvar()
{
if (!Validar()) return;
var perfil = (ComboItem)cmbPerfil.SelectedItem;
try
{
if (_modo == ModoFormulario.Novo)
{
// TODO: chamar BLL para criar usuário e vincular perfil
// var novoUsuario = new ModeloUsuario
// {
// EmpresaId = SessaoAtual.EmpresaId,
// Nome = txtNome.Text.Trim(),
// Email = txtEmail.Text.Trim(),
// Usuario = txtUsuario.Text.Trim(),
// SenhaHash = HashHelper.GerarHash(txtSenha.Text),
// Ativo = chkAtivo.Checked,
// CriadoEm = DateTime.Now,
// AtualizadoEm = DateTime.Now
// };
// int novoId = _usuarioBLL.Criar(novoUsuario);
// _usuarioBLL.VincularPerfil(novoId, perfil.Id);
MessageBox.Show("Usuário criado com sucesso!", "Sucesso",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else // Edicao
{
// TODO: chamar BLL para atualizar usuário e perfil
// var u = new ModeloUsuario { Id = _usuarioAtualId, ... };
// if (!string.IsNullOrWhiteSpace(txtSenha.Text))
// u.SenhaHash = HashHelper.GerarHash(txtSenha.Text);
// _usuarioBLL.Atualizar(u);
// _usuarioBLL.AtualizarPerfil(_usuarioAtualId, perfil.Id);
MessageBox.Show("Usuário atualizado com sucesso!", "Sucesso",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
AplicarModo(ModoFormulario.Visualizacao);
}
catch (Exception ex)
{
MessageBox.Show($"Erro ao salvar:\n{ex.Message}", "Erro",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
protected override void OnCancelar()
{
if (_usuarioAtualId > 0)
{
// Volta para os dados que estavam antes
// TODO: recarregar do banco se necessário
}
LimparCampos();
AplicarModo(ModoFormulario.Visualizacao);
}
// ── CLASSE AUXILIAR PARA O COMBOBOX ──────────────────────────────────
private class ComboItem
{
public int Id { get; }
public string Nome { get; }
public ComboItem(int id, string nome)
{
Id = id;
Nome = nome;
}
public override string ToString() => Nome;
}
}
}