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

163 lines
6.4 KiB
C#

using CPM;
using MLL;
using System;
using System.Drawing;
using System.Windows.Forms;
namespace UI
{
public class PlanoDeContasPanel : FormularioModelo
{
// Mapeamento absoluto de todas as propriedades do ModeloPlanoDeContas
private LV_TEXTBOX1 txtId;
private LV_TEXTBOX1 txtEmpresaId;
private LV_TEXTBOX1 txtContaPaiId;
private LV_TEXTBOX1 txtNome;
private LV_TEXTBOX1 txtCodigo;
private LV_TEXTBOX1 txtTipo;
private CheckBox chkAceitaLancamento;
private CheckBox chkAtivo;
private LV_TEXTBOX1 txtCriadoEm;
private LV_TEXTBOX1 txtAtualizadoEm;
public PlanoDeContasPanel()
{
this.Titulo = "ESTRUTURAÇÃO DO PLANO DE CONTAS FINACEIRO";
MontarInterfaceCompleta();
}
private void MontarInterfaceCompleta()
{
// --- SEÇÃO 1: HIERARQUIA E IDENTIFICAÇÃO ---
content.Controls.Add(CreateSectionHeader("Classificação e Hierarquia da Conta", 20));
txtId = AddInput(content, "ID REGISTRO", 20, 55, 100, 28, true);
txtEmpresaId = AddInput(content, "ID EMPRESA", 135, 55, 110, 28);
txtCodigo = AddInput(content, "CÓDIGO ESTRUTURAL (EX: 1.01.02)", 260, 55, 230, 28);
txtContaPaiId = AddInput(content, "ID CONTA PAI (NULO P/ GRUPO RAIZ)", 505, 55, 230, 28);
// --- SEÇÃO 2: DEFINIÇÃO COMERCIAL ---
content.Controls.Add(CreateSectionHeader("Dados de Identificação e Regras de Operação", 115));
txtNome = AddInput(content, "NOME DA CONTA (EX: ENERGIA ELÉTRICA, RECEITA DE VENDAS)", 20, 150, 470, 28);
txtTipo = AddInput(content, "TIPO (RECEITA / DESPESA / ATIVO)", 505, 150, 230, 28);
// Checkboxes de Regras de Negócio e Status alinhados lado a lado
chkAceitaLancamento = new CheckBox
{
Text = "Aceita Lançamento Direto (Conta Analítica)",
Location = new Point(20, 200),
AutoSize = true,
Font = new Font("Segoe UI", 9.5F, FontStyle.Bold),
ForeColor = Color.FromArgb(64, 64, 64)
};
content.Controls.Add(chkAceitaLancamento);
chkAtivo = new CheckBox
{
Text = "Conta Ativa no Sistema",
Location = new Point(350, 200),
AutoSize = true,
Font = new Font("Segoe UI", 9.5F, FontStyle.Bold),
ForeColor = Color.FromArgb(64, 64, 64)
};
content.Controls.Add(chkAtivo);
// --- SEÇÃO 3: AUDITORIA ---
content.Controls.Add(CreateSectionHeader("Datas de Auditoria e Controle de Registro", 245));
txtCriadoEm = AddInput(content, "DATA DE CRIAÇÃO", 20, 280, 220, 28, true);
txtAtualizadoEm = AddInput(content, "ÚLTIMA ATUALIZAÇÃO", 255, 280, 220, 28, true);
}
// --- MÉTODOS OBRIGATÓRIOS DO FORMULÁRIO MODELO ---
protected override void OnNovo()
{
// Limpa os campos editáveis de texto
txtEmpresaId.Text = string.Empty;
txtCodigo.Text = string.Empty;
txtContaPaiId.Text = string.Empty;
txtNome.Text = string.Empty;
txtTipo.Text = string.Empty;
// Valores padrão para novos registros
txtId.Text = "0";
chkAceitaLancamento.Checked = true;
chkAtivo.Checked = true;
txtCriadoEm.Text = DateTime.Now.ToString("g");
txtAtualizadoEm.Text = DateTime.Now.ToString("g");
txtCodigo.Focus();
}
protected override void OnSalvar()
{
// Validações básicas de negócio
if (string.IsNullOrWhiteSpace(txtCodigo.Text))
{
MessageBox.Show("O código estrutural da conta é obrigatório.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtCodigo.Focus();
return;
}
if (string.IsNullOrWhiteSpace(txtNome.Text))
{
MessageBox.Show("O nome da conta é obrigatório.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtNome.Focus();
return;
}
// Tratamento explícito para o tipo Nullable (int?) da ContaPaiId
int? contaPai = null;
if (!string.IsNullOrWhiteSpace(txtContaPaiId.Text) && int.TryParse(txtContaPaiId.Text, out int resultId))
{
contaPai = resultId;
}
// Mapeamento absoluto e tipado de todas as propriedades do ModeloPlanoDeContas
var conta = new ModeloPlanoDeContas
{
Id = string.IsNullOrEmpty(txtId.Text) ? 0 : Convert.ToInt32(txtId.Text),
EmpresaId = string.IsNullOrEmpty(txtEmpresaId.Text) ? 0 : Convert.ToInt32(txtEmpresaId.Text),
ContaPaiId = contaPai,
Codigo = txtCodigo.Text,
Nome = txtNome.Text,
Tipo = txtTipo.Text,
AceitaLancamento = chkAceitaLancamento.Checked,
Ativo = chkAtivo.Checked,
// Preserva ou trata as datas de auditoria
CriadoEm = string.IsNullOrEmpty(txtCriadoEm.Text) ? DateTime.Now : Convert.ToDateTime(txtCriadoEm.Text),
AtualizadoEm = DateTime.Now // Sempre grava a data do momento do save
};
// Envio do objeto limpo e preenchido para as camadas BLL / DAL do SQL Server
MessageBox.Show("Conta cadastrada com sucesso no plano de contas!", "LevelOS", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
protected override void OnAlterar()
{
txtNome.Focus();
}
protected override void OnExcluir()
{
if (MessageBox.Show("Atenção! Remover uma conta com lançamentos financeiros vinculados pode corromper os relatórios de DRE e fluxo de caixa. Confirmar exclusão?", "LevelOS", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
// Processa deleção...
OnNovo();
}
}
protected override void OnLocalizar()
{
// Abre sua Grid de pesquisa ou componente TreeView do plano de contas
}
protected override void OnCancelar()
{
OnNovo();
}
}
}