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

392 lines
16 KiB
C#

using CPM;
using DAL;
using MLL;
using BLL;
using System;
using System.Drawing;
using System.Windows.Forms;
namespace UI
{
public class CartoesCadastroPanel : FormularioModelo
{
// ── CAMPOS DO FORMULÁRIO ──────────────────────────────────────────────
private LV_TEXTBOX1 txtId = null!;
private LV_TEXTBOX1 txtCodigo = null!;
private LV_COMBOBOXCUSTOM cmbBandeira = null!;
private LV_TEXTBOX1 txtNumCartao = null!;
private LV_TEXTBOX1 txtNome = null!;
private LV_TEXTBOX1 txtValidade = null!;
private LV_TEXTBOX1 txtAutorizacao = null!;
private LV_TEXTBOX1 txtParcelas = null!;
private LV_TEXTBOX1 txtValor = null!;
private LV_TEXTBOX1 txtCodCliente = null!;
private LV_TEXTBOX1 txtResumo = null!;
private LV_TEXTBOX1 txtDebito = null!;
private LV_TEXTBOX1 txtCodConta = null!;
private LV_TEXTBOX1 txtDia = null!;
private LV_TEXTBOX1 txtCompensado = null!;
private LV_TEXTBOX1 txtObsComp = null!;
// ── ESTADO ────────────────────────────────────────────────────────────
private enum ModoFormulario { Visualizacao, Novo, Edicao }
private ModoFormulario _modo = ModoFormulario.Visualizacao;
private int _idAtual = 0;
// ── BLL ───────────────────────────────────────────────────────────────
// private CartoesBLL _bll = null!;
// ── CONSTRUTOR ────────────────────────────────────────────────────────
public CartoesCadastroPanel()
{
Titulo = "Cadastro de Cartões";
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);
txtCodigo = AddInput(content, "Código", 120, 58, 160, 32);
txtCodigo.MaxLength = 50;
// ── SEÇÃO: DADOS DO CARTÃO ────────────────────────────────────────
content.Controls.Add(CreateSectionHeader("Dados do Cartão", 110));
// Bandeira — LV_COMBOBOXCUSTOM
var lblBandeira = new Label
{
Text = "Bandeira",
Location = new Point(20, 148),
Font = new Font("Segoe UI", 7.5f, FontStyle.Bold),
ForeColor = TextDark,
AutoSize = true
};
cmbBandeira = new LV_COMBOBOXCUSTOM
{
Location = new Point(20, 164),
Size = new Size(160, 32),
DropDownStyle = ComboBoxStyle.DropDownList,
BorderColor = BorderColor,
BackColor = Color.White,
ListBackColor = Color.White,
ListTextColor = TextDark,
IconColor = AccentBlue,
Font = new Font("Segoe UI", 9f)
};
cmbBandeira.Items.Add("Visa");
cmbBandeira.Items.Add("Mastercard");
cmbBandeira.Items.Add("Elo");
cmbBandeira.Items.Add("American Express");
cmbBandeira.Items.Add("Hipercard");
cmbBandeira.Items.Add("PayPal");
cmbBandeira.Items.Add("Outro");
cmbBandeira.SelectedIndex = 0;
content.Controls.Add(lblBandeira);
content.Controls.Add(cmbBandeira);
txtNumCartao = AddInput(content, "Número do Cartão", 200, 148, 220, 32);
txtNumCartao.MaxLength = 20;
txtNome = AddInput(content, "Nome no Cartão", 440, 148, 260, 32);
txtNome.MaxLength = 100;
txtValidade = AddInput(content, "Validade", 20, 228, 120, 32);
txtValidade.MaxLength = 10;
txtAutorizacao = AddInput(content, "Autorização", 160, 228, 180, 32);
txtAutorizacao.MaxLength = 50;
txtParcelas = AddInput(content, "Parcelas", 360, 228, 100, 32);
txtParcelas.MaxLength = 10;
txtValor = AddInput(content, "Valor", 480, 228, 140, 32);
txtValor.MaxLength = 20;
// ── SEÇÃO: CLIENTE E CONTA ────────────────────────────────────────
content.Controls.Add(CreateSectionHeader("Cliente e Conta", 290));
txtCodCliente = AddInput(content, "Cód. Cliente", 20, 328, 160, 32);
txtCodCliente.MaxLength = 50;
txtCodConta = AddInput(content, "Cód. Conta", 200, 328, 160, 32);
txtCodConta.MaxLength = 50;
txtDia = AddInput(content, "Dia", 380, 328, 80, 32);
txtDia.MaxLength = 5;
txtDebito = AddInput(content, "Débito", 480, 328, 140, 32);
txtDebito.MaxLength = 20;
// ── SEÇÃO: COMPENSAÇÃO ────────────────────────────────────────────
content.Controls.Add(CreateSectionHeader("Compensação", 390));
txtResumo = AddInput(content, "Resumo", 20, 428, 300, 32);
txtResumo.MaxLength = 255;
txtCompensado = AddInput(content, "Compensado", 340, 428, 120, 32);
txtCompensado.MaxLength = 20;
// Observações da compensação — multiline
var lblObsComp = new Label
{
Text = "Obs. Compensação",
Location = new Point(20, 490),
Font = new Font("Segoe UI", 7.5f, FontStyle.Bold),
ForeColor = TextDark,
AutoSize = true
};
txtObsComp = new LV_TEXTBOX1
{
Location = new Point(20, 506),
Size = new Size(700, 70),
BorderColor = BorderColor,
BorderFocusColor = AccentBlue,
Multiline = true,
MaxLength = 255
};
content.Controls.Add(lblObsComp);
content.Controls.Add(txtObsComp);
content.Height = 610;
}
// ── CAMPOS EDITÁVEIS — lista para evitar repetição ────────────────────
private LV_TEXTBOX1[] CamposEditaveis() => new[]
{
txtCodigo, txtNumCartao, txtNome, txtValidade, txtAutorizacao,
txtParcelas, txtValor, txtCodCliente, txtResumo, txtDebito,
txtCodConta, txtDia, txtCompensado, txtObsComp
};
// ── MODOS DO FORMULÁRIO ───────────────────────────────────────────────
private void AplicarModo(ModoFormulario modo)
{
_modo = modo;
bool editando = modo == ModoFormulario.Novo || modo == ModoFormulario.Edicao;
foreach (var txt in CamposEditaveis())
{
txt.ReadOnly = !editando;
txt.BackColor = editando ? Color.White : ReadOnlyBg;
txt.BorderColor = editando ? BorderColor : ReadOnlyBorder;
}
cmbBandeira.Enabled = editando;
cmbBandeira.BorderColor = editando ? BorderColor : ReadOnlyBorder;
cmbBandeira.BackColor = editando ? Color.White : ReadOnlyBg;
btnNovo.Enabled = !editando;
btnAlterar.Enabled = !editando && _idAtual > 0;
btnExcluir.Enabled = !editando && _idAtual > 0;
btnLocalizar.Enabled = !editando;
btnSalvar.Enabled = editando;
btnCancelar.Enabled = editando;
if (modo == ModoFormulario.Novo) LimparCampos();
}
// ── POPULAR / LIMPAR ──────────────────────────────────────────────────
private void PopularCampos(ModeloCartoes m)
{
_idAtual = m.ID_COD_CARTAO;
txtId.Text = m.ID_COD_CARTAO.ToString();
txtCodigo.Text = m.CODIGO;
txtNumCartao.Text = m.NUM_CARTAO;
txtNome.Text = m.NOME;
txtValidade.Text = m.VALIDADE;
txtAutorizacao.Text = m.AUTORIZACAO;
txtParcelas.Text = m.PARCELAS;
txtValor.Text = m.VALOR;
txtCodCliente.Text = m.COD_CLIENTE;
txtResumo.Text = m.RESUMO;
txtDebito.Text = m.DEBITO;
txtCodConta.Text = m.COD_CONTA;
txtDia.Text = m.DIA;
txtCompensado.Text = m.COMPENSADO;
txtObsComp.Text = m.OBS_COMP;
// Seleciona bandeira no ComboBox
for (int i = 0; i < cmbBandeira.Items.Count; i++)
{
if (cmbBandeira.Items[i]?.ToString() == m.BANDEIRA)
{
cmbBandeira.SelectedIndex = i;
break;
}
}
}
private void LimparCampos()
{
_idAtual = 0;
txtId.Text = string.Empty;
txtCodigo.Text = string.Empty;
txtNumCartao.Text = string.Empty;
txtNome.Text = string.Empty;
txtValidade.Text = string.Empty;
txtAutorizacao.Text = string.Empty;
txtParcelas.Text = string.Empty;
txtValor.Text = string.Empty;
txtCodCliente.Text = string.Empty;
txtResumo.Text = string.Empty;
txtDebito.Text = string.Empty;
txtCodConta.Text = string.Empty;
txtDia.Text = string.Empty;
txtCompensado.Text = string.Empty;
txtObsComp.Text = string.Empty;
cmbBandeira.SelectedIndex = 0;
}
// ── VALIDAÇÃO ─────────────────────────────────────────────────────────
private bool Validar()
{
if (string.IsNullOrWhiteSpace(txtCodigo.Text))
{
MessageBox.Show("Informe o código do cartão.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtCodigo.Focus();
return false;
}
if (string.IsNullOrWhiteSpace(txtNumCartao.Text))
{
MessageBox.Show("Informe o número do cartão.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtNumCartao.Focus();
return false;
}
if (string.IsNullOrWhiteSpace(txtValor.Text))
{
MessageBox.Show("Informe o valor.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtValor.Focus();
return false;
}
return true;
}
// ── MONTAR MODELO ─────────────────────────────────────────────────────
private ModeloCartoes MontarModelo() => new ModeloCartoes(
_idAtual,
txtCodigo.Text.Trim(),
cmbBandeira.SelectedItem?.ToString() ?? string.Empty,
txtNumCartao.Text.Trim(),
txtNome.Text.Trim(),
txtValidade.Text.Trim(),
txtAutorizacao.Text.Trim(),
txtParcelas.Text.Trim(),
txtValor.Text.Trim(),
txtCodCliente.Text.Trim(),
txtResumo.Text.Trim(),
txtDebito.Text.Trim(),
txtCodConta.Text.Trim(),
txtDia.Text.Trim(),
txtCompensado.Text.Trim(),
txtObsComp.Text.Trim()
);
// ── EVENTOS ABSTRATOS ─────────────────────────────────────────────────
protected override void OnNovo()
{
AplicarModo(ModoFormulario.Novo);
txtCodigo.Focus();
}
protected override void OnAlterar()
{
if (_idAtual == 0) return;
AplicarModo(ModoFormulario.Edicao);
txtCodigo.Focus();
}
protected override void OnExcluir()
{
if (_idAtual == 0) return;
var confirm = MessageBox.Show(
$"Deseja realmente excluir o cartão \"{txtNumCartao.Text}\"?",
"Confirmar exclusão",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);
if (confirm != DialogResult.Yes) return;
try
{
// TODO: _bll.Excluir(_idAtual);
MessageBox.Show("Cartão 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 de cartões
// var frm = new FormularioBuscarCartoes();
// if (frm.ShowDialog() == DialogResult.OK)
// {
// PopularCampos(frm.CartaoSelecionado);
// AplicarModo(ModoFormulario.Visualizacao);
// }
MessageBox.Show("Implemente o formulário de busca de cartões.",
"Localizar", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
protected override void OnSalvar()
{
if (!Validar()) return;
var modelo = MontarModelo();
try
{
if (_modo == ModoFormulario.Novo)
{
// TODO: _bll.Criar(modelo);
MessageBox.Show("Cartão cadastrado com sucesso!", "Sucesso",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
// TODO: _bll.Atualizar(modelo);
MessageBox.Show("Cartão 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 (_idAtual > 0)
{
// TODO: recarregar do banco se necessário
}
LimparCampos();
AplicarModo(ModoFormulario.Visualizacao);
}
}
}