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

516 lines
20 KiB
C#

using CPM;
using DAL;
using MLL;
using BLL;
using System;
using System.Drawing;
using System.Windows.Forms;
namespace UI
{
public class CheguesCadastroPanel : FormularioModelo
{
// ── CAMPOS DO FORMULÁRIO ──────────────────────────────────────────────
private LV_TEXTBOX1 txtId = null!;
private LV_TEXTBOX1 txtCodigo = null!;
private LV_COMBOBOXCUSTOM cmbTipo = null!;
// Banco
private LV_TEXTBOX1 txtBanco = null!;
private LV_TEXTBOX1 txtAgencia = null!;
private LV_TEXTBOX1 txtConta = null!;
private LV_TEXTBOX1 txtNumero = null!;
private LV_TEXTBOX1 txtValor = null!;
// Cliente + Fornecedor — busca
private LV_TEXTBOX1 txtCliente = null!;
private Button btnBuscarCliente = null!;
private LV_TEXTBOX1 txtFornecedor = null!;
private Button btnBuscarFornecedor = null!;
private LV_TEXTBOX1 txtEmitente = null!;
// Datas e compensação
private LV_TEXTBOX1 txtEmitido = null!;
private LV_TEXTBOX1 txtCompensar = null!;
private LV_TEXTBOX1 txtCodConta = null!;
private CheckBox chkOk = null!;
// Observações
private LV_TEXTBOX1 txtObs = null!;
// ── ESTADO ────────────────────────────────────────────────────────────
private enum ModoFormulario { Visualizacao, Novo, Edicao }
private ModoFormulario _modo = ModoFormulario.Visualizacao;
private int _idAtual = 0;
// ── BLL ───────────────────────────────────────────────────────────────
// private ChegueBLL _bll = null!;
// ── CONSTRUTOR ────────────────────────────────────────────────────────
public CheguesCadastroPanel()
{
Titulo = "Cadastro de Cheques";
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;
// Tipo
var lblTipo = new Label
{
Text = "Tipo",
Location = new Point(300, 58),
Font = new Font("Segoe UI", 7.5f, FontStyle.Bold),
ForeColor = TextDark,
AutoSize = true
};
cmbTipo = new LV_COMBOBOXCUSTOM
{
Location = new Point(300, 74),
Size = new Size(180, 32),
DropDownStyle = ComboBoxStyle.DropDownList,
BorderColor = BorderColor,
BackColor = Color.White,
ListBackColor = Color.White,
ListTextColor = TextDark,
IconColor = AccentBlue,
Font = new Font("Segoe UI", 9f)
};
cmbTipo.Items.Add("Recebido");
cmbTipo.Items.Add("Emitido");
cmbTipo.Items.Add("Devolvido");
cmbTipo.Items.Add("Cancelado");
cmbTipo.SelectedIndex = 0;
content.Controls.Add(lblTipo);
content.Controls.Add(cmbTipo);
// ── SEÇÃO: DADOS BANCÁRIOS ────────────────────────────────────────
content.Controls.Add(CreateSectionHeader("Dados Bancários", 128));
txtBanco = AddInput(content, "Banco", 20, 166, 220, 32);
txtBanco.MaxLength = 100;
txtAgencia = AddInput(content, "Agência", 260, 166, 140, 32);
txtAgencia.MaxLength = 20;
txtConta = AddInput(content, "Conta", 420, 166, 140, 32);
txtConta.MaxLength = 30;
txtNumero = AddInput(content, "Número", 580, 166, 120, 32);
txtNumero.MaxLength = 20;
txtValor = AddInput(content, "Valor", 20, 228, 160, 32);
txtValor.MaxLength = 20;
txtEmitido = AddInput(content, "Data Emissão", 200, 228, 160, 32);
txtEmitido.MaxLength = 20;
txtCompensar = AddInput(content, "Data Compensação", 380, 228, 160, 32);
txtCompensar.MaxLength = 20;
// CheckBox OK — compensado
chkOk = CreateCheckBox("Compensado (OK)", 560, 238);
content.Controls.Add(chkOk);
// ── SEÇÃO: PARTES ENVOLVIDAS ──────────────────────────────────────
content.Controls.Add(CreateSectionHeader("Partes Envolvidas", 290));
// Cliente + botão buscar
var lblCliente = new Label
{
Text = "Cliente",
Location = new Point(20, 328),
Font = new Font("Segoe UI", 7.5f, FontStyle.Bold),
ForeColor = TextDark,
AutoSize = true
};
txtCliente = new LV_TEXTBOX1
{
Location = new Point(20, 344),
Size = new Size(220, 32),
BorderColor = BorderColor,
BorderFocusColor = AccentBlue,
ReadOnly = true,
BackColor = ReadOnlyBg
};
btnBuscarCliente = new Button
{
Text = "🔍 Buscar",
Location = new Point(248, 344),
Size = new Size(90, 32),
BackColor = AccentBlue,
ForeColor = Color.White,
Font = new Font("Segoe UI Semibold", 8.5f),
Cursor = Cursors.Hand,
FlatStyle = FlatStyle.Flat,
Enabled = false
};
btnBuscarCliente.FlatAppearance.BorderSize = 0;
btnBuscarCliente.Click += BtnBuscarCliente_Click;
content.Controls.Add(lblCliente);
content.Controls.Add(txtCliente);
content.Controls.Add(btnBuscarCliente);
// Fornecedor + botão buscar
var lblFornecedor = new Label
{
Text = "Fornecedor",
Location = new Point(360, 328),
Font = new Font("Segoe UI", 7.5f, FontStyle.Bold),
ForeColor = TextDark,
AutoSize = true
};
txtFornecedor = new LV_TEXTBOX1
{
Location = new Point(360, 344),
Size = new Size(220, 32),
BorderColor = BorderColor,
BorderFocusColor = AccentBlue,
ReadOnly = true,
BackColor = ReadOnlyBg
};
btnBuscarFornecedor = new Button
{
Text = "🔍 Buscar",
Location = new Point(588, 344),
Size = new Size(90, 32),
BackColor = AccentBlue,
ForeColor = Color.White,
Font = new Font("Segoe UI Semibold", 8.5f),
Cursor = Cursors.Hand,
FlatStyle = FlatStyle.Flat,
Enabled = false
};
btnBuscarFornecedor.FlatAppearance.BorderSize = 0;
btnBuscarFornecedor.Click += BtnBuscarFornecedor_Click;
content.Controls.Add(lblFornecedor);
content.Controls.Add(txtFornecedor);
content.Controls.Add(btnBuscarFornecedor);
txtEmitente = AddInput(content, "Emitente", 20, 396, 340, 32);
txtEmitente.MaxLength = 150;
txtCodConta = AddInput(content, "Cód. Conta", 380, 396, 160, 32);
txtCodConta.MaxLength = 50;
// ── SEÇÃO: OBSERVAÇÕES ────────────────────────────────────────────
content.Controls.Add(CreateSectionHeader("Observações", 450));
var lblObs = new Label
{
Text = "Observações",
Location = new Point(20, 488),
Font = new Font("Segoe UI", 7.5f, FontStyle.Bold),
ForeColor = TextDark,
AutoSize = true
};
txtObs = new LV_TEXTBOX1
{
Location = new Point(20, 504),
Size = new Size(680, 70),
BorderColor = BorderColor,
BorderFocusColor = AccentBlue,
Multiline = true,
MaxLength = 500
};
content.Controls.Add(lblObs);
content.Controls.Add(txtObs);
content.Height = 610;
}
// ── CAMPOS EDITÁVEIS ──────────────────────────────────────────────────
private LV_TEXTBOX1[] CamposEditaveis() => new[]
{
txtCodigo, txtBanco, txtAgencia, txtConta, txtNumero,
txtValor, txtEmitido, txtCompensar, txtEmitente, txtCodConta, txtObs
};
// ── 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;
}
cmbTipo.Enabled = editando;
cmbTipo.BorderColor = editando ? BorderColor : ReadOnlyBorder;
cmbTipo.BackColor = editando ? Color.White : ReadOnlyBg;
chkOk.Enabled = editando;
btnBuscarCliente.Enabled = editando;
btnBuscarFornecedor.Enabled = editando;
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();
}
// ── BUSCA DE CLIENTE ──────────────────────────────────────────────────
private void BtnBuscarCliente_Click(object? sender, EventArgs e)
{
// TODO: abrir formulário de busca de clientes
// var frm = new FormularioBuscarCliente();
// if (frm.ShowDialog() == DialogResult.OK)
// txtCliente.Text = frm.ClienteSelecionado.CODIGO;
MessageBox.Show("Implemente o formulário de busca de clientes.",
"Buscar Cliente", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
// ── BUSCA DE FORNECEDOR ───────────────────────────────────────────────
private void BtnBuscarFornecedor_Click(object? sender, EventArgs e)
{
// TODO: abrir formulário de busca de fornecedores
// var frm = new FormularioBuscarFornecedor();
// if (frm.ShowDialog() == DialogResult.OK)
// txtFornecedor.Text = frm.FornecedorSelecionado.CODIGO;
MessageBox.Show("Implemente o formulário de busca de fornecedores.",
"Buscar Fornecedor", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
// ── POPULAR / LIMPAR ──────────────────────────────────────────────────
private void PopularCampos(ModeloChegues m)
{
_idAtual = m.ID_CHEGUES;
txtId.Text = m.ID_CHEGUES.ToString();
txtCodigo.Text = m.CODIGO;
txtBanco.Text = m.BANCO;
txtAgencia.Text = m.AGENCIA;
txtConta.Text = m.CONTA;
txtNumero.Text = m.NUMERO;
txtValor.Text = m.VALOR;
txtCliente.Text = m.CLIENTE;
txtFornecedor.Text = m.FORNECEDOR;
txtEmitente.Text = m.EMITENTE;
txtEmitido.Text = m.EMITIDO;
txtCompensar.Text = m.COMPENSAR;
txtCodConta.Text = m.COD_CONTA;
txtObs.Text = m.OBS;
chkOk.Checked = m.OK == "S" || m.OK == "1" || m.OK?.ToLower() == "true";
SelecionarCombo(cmbTipo, m.TIPO);
}
private void LimparCampos()
{
_idAtual = 0;
txtId.Text = string.Empty;
txtCodigo.Text = string.Empty;
txtBanco.Text = string.Empty;
txtAgencia.Text = string.Empty;
txtConta.Text = string.Empty;
txtNumero.Text = string.Empty;
txtValor.Text = string.Empty;
txtCliente.Text = string.Empty;
txtFornecedor.Text = string.Empty;
txtEmitente.Text = string.Empty;
txtEmitido.Text = string.Empty;
txtCompensar.Text = string.Empty;
txtCodConta.Text = string.Empty;
txtObs.Text = string.Empty;
chkOk.Checked = false;
cmbTipo.SelectedIndex = 0;
}
// ── HELPER COMBOBOX ───────────────────────────────────────────────────
private static void SelecionarCombo(LV_COMBOBOXCUSTOM cmb, string valor)
{
for (int i = 0; i < cmb.Items.Count; i++)
{
if (cmb.Items[i]?.ToString() == valor)
{
cmb.SelectedIndex = i;
return;
}
}
cmb.SelectedIndex = 0;
}
// ── VALIDAÇÃO ─────────────────────────────────────────────────────────
private bool Validar()
{
if (string.IsNullOrWhiteSpace(txtCodigo.Text))
{
MessageBox.Show("Informe o código do cheque.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtCodigo.Focus();
return false;
}
if (string.IsNullOrWhiteSpace(txtBanco.Text))
{
MessageBox.Show("Informe o banco.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtBanco.Focus();
return false;
}
if (string.IsNullOrWhiteSpace(txtNumero.Text))
{
MessageBox.Show("Informe o número do cheque.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtNumero.Focus();
return false;
}
if (string.IsNullOrWhiteSpace(txtValor.Text))
{
MessageBox.Show("Informe o valor do cheque.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtValor.Focus();
return false;
}
if (string.IsNullOrWhiteSpace(txtEmitido.Text))
{
MessageBox.Show("Informe a data de emissão.", "Validação",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtEmitido.Focus();
return false;
}
return true;
}
// ── MONTAR MODELO ─────────────────────────────────────────────────────
private ModeloChegues MontarModelo() => new ModeloChegues(
_idAtual,
txtCodigo.Text.Trim(),
txtBanco.Text.Trim(),
txtAgencia.Text.Trim(),
txtValor.Text.Trim(),
txtCliente.Text.Trim(),
txtFornecedor.Text.Trim(),
txtEmitido.Text.Trim(),
txtCompensar.Text.Trim(),
chkOk.Checked ? "S" : "N",
cmbTipo.SelectedItem?.ToString() ?? string.Empty,
txtConta.Text.Trim(),
txtNumero.Text.Trim(),
txtObs.Text.Trim(),
txtCodConta.Text.Trim(),
txtEmitente.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 cheque \"{txtNumero.Text}\"?",
"Confirmar exclusão",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);
if (confirm != DialogResult.Yes) return;
try
{
// TODO: _bll.Excluir(_idAtual);
MessageBox.Show("Cheque 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 cheques
// var frm = new FormularioBuscarCheques();
// if (frm.ShowDialog() == DialogResult.OK)
// {
// PopularCampos(frm.ChequeSelecionado);
// AplicarModo(ModoFormulario.Visualizacao);
// }
MessageBox.Show("Implemente o formulário de busca de cheques.",
"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("Cheque cadastrado com sucesso!", "Sucesso",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
// TODO: _bll.Atualizar(modelo);
MessageBox.Show("Cheque 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);
}
}
}