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(); } } }