diff --git a/CPM/Textbox/LV-TEXTBOX1.cs b/CPM/Textbox/LV-TEXTBOX1.cs index a86ef50..0d1e9da 100644 --- a/CPM/Textbox/LV-TEXTBOX1.cs +++ b/CPM/Textbox/LV-TEXTBOX1.cs @@ -22,6 +22,12 @@ namespace CPM InitializeComponent(); Redraw(); } + [Category("LV")] + public HorizontalAlignment TextAlign + { + get => txt.TextAlign; + set => txt.TextAlign = value; + } // Propriedades public override string Text diff --git a/UI/Dashboards/Cadastros/OrdensCadastroPanel.cs b/UI/Dashboards/Cadastros/OrdensCadastroPanel.cs index 04481cf..ac43460 100644 --- a/UI/Dashboards/Cadastros/OrdensCadastroPanel.cs +++ b/UI/Dashboards/Cadastros/OrdensCadastroPanel.cs @@ -1,837 +1,1479 @@ using CPM; -using MLL; +using CustomMessageBox; using System; using System.Drawing; using System.Windows.Forms; namespace UI { - public partial class OrdensCadastroPanel : UserControl + public class OrdensCadastroPanel : FormularioModelo { - //Variaveis auxiliares - private string nomeCliente = "Nicolas Felipe G. dos santos"; - // ── CORES ────────────────────────────────────────────────────────────── - private readonly Color CorPreta = Color.FromArgb(20, 20, 20); - private readonly Color CorVerde = Color.FromArgb(22, 163, 74); - private readonly Color CorVerdeHover = Color.FromArgb(16, 120, 55); - private readonly Color CorVermelha = Color.FromArgb(220, 38, 38); - private readonly Color CorVermelhaHov = Color.FromArgb(170, 20, 20); - private readonly Color CorAzul = Color.FromArgb(37, 99, 235); - private readonly Color CorCinzaClaro = Color.FromArgb(245, 245, 245); - private readonly Color CorCinzaBorda = Color.FromArgb(200, 200, 200); - private readonly Color CorTexto = Color.FromArgb(30, 41, 59); - private readonly Color CorFocoBorda = Color.FromArgb(37, 99, 235); - private readonly Color CorLaranja = Color.FromArgb(253, 186, 116); - private readonly Color CorBranca = Color.FromArgb(255, 255, 255); + #region Campos - // ── CAMPOS ───────────────────────────────────────────────────────────── - private Label lblNumOS; - private Label lblCliente; - private Label lblEndereco; - private Label lblTelefone; - private Label lblCodVal; - private DateTimePicker dtpEntrada; - private DateTimePicker dtpPronto; - private DateTimePicker dtpSaida; - private ComboBox cmbSituacao; - private Label lblGarantia; - private LV_TEXTBOX1 txtAdiantamento; - private Label lblVMao; - private Label lblVPecas; - private Label lblVDesloca; - private Label lblVTerceiro; - private Label lblVOutros; - private Label lblVTotal; - private LV_TEXTBOX1 txtModelo; - private LV_TEXTBOX1 txtMarca; - private LV_TEXTBOX1 txtOperadora; - private LV_TEXTBOX1 txtSerial; - private LV_TEXTBOX1 txtPatrimonio; - private TextBox txtAcessorios; - private TextBox txtDefeito; - private TextBox txtObsAparelho; - private DataGridView dgvServicos; - private DataGridView dgvPecas; - private TextBox txtLaudo; - private TextBox txtObsServico; - private ComboBox cmbTecnico; - private ComboBox cmbPrioridade; - private TabControl tabs; + private Label lblNumeroOS = null!; - private ModeloOrdens _os; - public event Action? OnVoltar; + private Panel cardCliente = null!; + private Panel cardDatas = null!; + private Panel cardFinanceiro = null!; + private Panel cardRodape = null!; + + private TabControl tabDetalhes = null!; + + private LV_TEXTBOX1 txtCliente = null!; + private LV_TEXTBOX1 txtEndereco = null!; + private LV_TEXTBOX1 txtTelefones = null!; + private LV_TEXTBOX1 txtDocs = null!; + private LV_TEXTBOX1 txtEmail = null!; + + private LV_TEXTBOX1 txtGarantia = null!; + + private LV_TEXTBOX1 txtAdiantamento = null!; + private LV_TEXTBOX1 txtMaoObra = null!; + private LV_TEXTBOX1 txtPecas = null!; + private LV_TEXTBOX1 txtDeslocamento = null!; + private LV_TEXTBOX1 txtServicosTerceiros = null!; + private LV_TEXTBOX1 txtOutros = null!; + private LV_TEXTBOX1 txtTotal = null!; + + private DateTimePicker dtpEntrada = null!; + private DateTimePicker dtpPronto = null!; + private DateTimePicker dtpSaida = null!; + private DateTimePicker dtpGarantia = null!; + + private ComboBox cbSituacao = null!; + private ComboBox cbTecnico = null!; + private ComboBox cbPrioridade = null!; + + + #endregion - // ══════════════════════════════════════════════════════════════════════ - // CONSTRUTOR - // ══════════════════════════════════════════════════════════════════════ public OrdensCadastroPanel() { - _os = new ModeloOrdens(); - this.Dock = DockStyle.Fill; - this.BackColor = Color.White; - MontarInterface(); + Titulo = "Ordem de Serviço"; + + content.Width = 1200; + content.Height = 960; + content.BackColor = Color.FromArgb(245, 247, 250); + + BuildInterface(); } - private void InitializeComponent() { } + #region Build - public void CarregarOS(ModeloOrdens os) + private void BuildInterface() { - _os = os; - PreencherCampos(); + BuildHeader(); + BuildCliente(); + BuildDatasStatus(); + BuildFinanceiro(); + BuildTabs(); + BuildRodape(); } - - // ══════════════════════════════════════════════════════════════════════ - // MONTAGEM PRINCIPAL - // ══════════════════════════════════════════════════════════════════════ - private void MontarInterface() + private Panel CreateInternalCard(string title,Rectangle rect) { - // Usamos posicionamento manual com Anchor/Dock + eventos Resize - // para controle preciso igual ao print. - - // 1) HEADER (topo fixo, 56px) - var pnlHeader = CriarHeader(); - pnlHeader.Dock = DockStyle.Top; - pnlHeader.Height = 56; - - // 2) RODAPÉ (base fixa, 46px) - var pnlRodape = CriarRodape(); - pnlRodape.Dock = DockStyle.Bottom; - pnlRodape.Height = 46; - - // 3) ÁREA CENTRAL (Fill) — contém cliente + meio + abas - var pnlCentral = new Panel { Dock = DockStyle.Fill, BackColor = Color.White }; - - // 3a) PAINEL CLIENTE (topo da área central, 72px) - var pnlCliente = CriarPainelCliente(); - pnlCliente.Dock = DockStyle.Top; - pnlCliente.Height = 72; - - // 3b) PAINEL MEIO (datas + situação + financeiro, 115px) - var pnlMeio = CriarPainelMeio(); - pnlMeio.Dock = DockStyle.Top; - pnlMeio.Height = 115; - - // 3c) ABAS (Fill restante) - var tabCtrl = CriarAbas(); - - // Adiciona em ordem inversa (DockStyle.Top empilha de cima pra baixo) - pnlCentral.Controls.Add(tabCtrl); // Fill — vai primeiro - pnlCentral.Controls.Add(pnlMeio); // Top - pnlCentral.Controls.Add(pnlCliente); // Top - - // Adiciona ao UserControl - this.Controls.Add(pnlCentral); - this.Controls.Add(pnlRodape); - this.Controls.Add(pnlHeader); - } - - // ══════════════════════════════════════════════════════════════════════ - // HEADER - // ══════════════════════════════════════════════════════════════════════ - private Panel CriarHeader() - { - var pnl = new Panel { BackColor = CorPreta }; - - lblNumOS = new Label + var pnl = new Panel { - Text = "O.S. nº —", - Font = new Font("Segoe UI", 18f, FontStyle.Bold), - ForeColor = CorVermelha, - Location = new Point(16, 10), - AutoSize = true - }; - pnl.Controls.Add(lblNumOS); + Location = rect.Location, + Size = rect.Size, - var btnGravar = LvBtn("✔ Gravar OS", CorVerde, CorVerdeHover, CorVerdeHover, 130, 36, br: 6); - var btnCancelar = LvBtn("✖ Cancelar", CorVermelha, CorVermelhaHov, CorVermelhaHov, 120, 36, br: 6); + BackColor = Color.White, - btnGravar.Click += (s, e) => Salvar(); - btnCancelar.Click += (s, e) => OnVoltar?.Invoke(); - - pnl.Resize += (s, e) => - { - btnCancelar.Location = new Point(pnl.Width - 128, 10); - btnGravar.Location = new Point(pnl.Width - 266, 10); + BorderStyle = BorderStyle.FixedSingle }; - pnl.Controls.Add(btnGravar); - pnl.Controls.Add(btnCancelar); - return pnl; - } - - // ══════════════════════════════════════════════════════════════════════ - // PAINEL CLIENTE - // ══════════════════════════════════════════════════════════════════════ - private Panel CriarPainelCliente() - { - var pnl = new Panel { BackColor = Color.White, Padding = new Padding(10, 6, 10, 4) }; - pnl.Paint += (s, e) => - { - // Linha inferior separadora - using var pen = new Pen(CorCinzaBorda); - e.Graphics.DrawLine(pen, 0, pnl.Height - 1, pnl.Width, pnl.Height - 1); - }; - - // Linha 1 — "Cliente:" + nome - pnl.Controls.Add(Lbl("Cliente:", 10, 6, 60, bold: true, fs: 9f)); - lblCliente = new Label - { - ////Text = "—", - Text = this.nomeCliente, - Font = new Font("Segoe UI", 9.5f, FontStyle.Bold), - ForeColor = CorTexto, - Location = new Point(72, 6), - AutoSize = true - }; - pnl.Controls.Add(lblCliente); - - // "Cod.:" ancorado à direita - var lblRotCod = Lbl("Cod.:", 0, 6, 36, fs: 8.5f); - lblCodVal = Lbl("—", 0, 6, 60, fs: 8.5f); - lblRotCod.Anchor = AnchorStyles.Top | AnchorStyles.Right; - lblCodVal.Anchor = AnchorStyles.Top | AnchorStyles.Right; - pnl.Resize += (s, e) => - { - lblRotCod.Location = new Point(pnl.Width - 98, 6); - lblCodVal.Location = new Point(pnl.Width - 60, 6); - }; - pnl.Controls.Add(lblRotCod); - pnl.Controls.Add(lblCodVal); - - // Linha 2 — Endereço - pnl.Controls.Add(Lbl("Endereço:", 10, 28, 68, bold: true, fs: 8.5f)); - lblEndereco = new Label - { - Text = "—", - Font = new Font("Segoe UI", 8.5f), - ForeColor = CorAzul, - Location = new Point(80, 28), - AutoSize = true - }; - pnl.Controls.Add(lblEndereco); - - // Linha 3 — Telefones - pnl.Controls.Add(Lbl("Telefones:", 10, 50, 70, bold: true, fs: 8.5f)); - lblTelefone = new Label - { - Text = "—", - Font = new Font("Segoe UI", 8.5f), - ForeColor = CorAzul, - Location = new Point(82, 50), - AutoSize = true - }; - pnl.Controls.Add(lblTelefone); - - return pnl; - } - - // ══════════════════════════════════════════════════════════════════════ - // PAINEL MEIO — datas à esquerda | financeiro à direita - // ══════════════════════════════════════════════════════════════════════ - private Panel CriarPainelMeio() - { - var pnl = new Panel { BackColor = Color.White }; - pnl.Paint += (s, e) => - { - using var pen = new Pen(CorCinzaBorda); - e.Graphics.DrawLine(pen, 0, pnl.Height - 1, pnl.Width, pnl.Height - 1); - }; - - // ── FINANCEIRO (direita, largura fixa 270) ───────────────────────── - var pnlFin = CriarPainelFinanceiro(); - pnlFin.Anchor = AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; - - pnl.Resize += (s, e) => - { - pnlFin.Location = new Point(pnl.Width - 272, 0); - pnlFin.Size = new Size(272, pnl.Height); - }; - pnl.Controls.Add(pnlFin); - - // ── DATAS + SITUAÇÃO (esquerda) ──────────────────────────────────── - int lx = 10, lw = 62, tw = 148, th = 22; - - // Entrada - pnl.Controls.Add(Lbl("Entrada", lx, 12, lw, bold: true)); - dtpEntrada = DTP(pnl, lx + lw, 10, tw, th); - - // Pronto - pnl.Controls.Add(Lbl("Pronto", lx, 38, lw, bold: true)); - dtpPronto = DTP(pnl, lx + lw, 36, tw, th); - - // Saída - pnl.Controls.Add(Lbl("Saída", lx, 64, lw, bold: true)); - dtpSaida = DTP(pnl, lx + lw, 62, tw, th); - - // Situação da OS - int sx = 240; - pnl.Controls.Add(Lbl("Situação da OS", sx, 4, 130, bold: true)); - cmbSituacao = new ComboBox - { - Location = new Point(sx, 22), - Size = new Size(220, 26), - DropDownStyle = ComboBoxStyle.DropDownList, - Font = new Font("Segoe UI", 9f), - FlatStyle = FlatStyle.Flat - }; - cmbSituacao.Items.AddRange(new object[] - { - "Aguardando avaliação do técnico", - "Em Orçamento", - "Orçamento Aprovado", - "Em Reparo", - "Pronto", - "Entregue", - "Cancelado" - }); - cmbSituacao.SelectedIndex = 0; - pnl.Controls.Add(cmbSituacao); - - // Garantia até - lblGarantia = new Label - { - Text = "Garantia até —", - Font = new Font("Segoe UI", 9f, FontStyle.Bold), - ForeColor = CorVermelha, - Location = new Point(sx, 54), - AutoSize = true - }; - pnl.Controls.Add(lblGarantia); - - // Botão Histórico - var btnHist = LvBtn("Histórico", CorCinzaClaro, Color.FromArgb(180, 180, 180), Color.FromArgb(150, 150, 150), 88, 24, br: 4, bs: 1, bc: CorCinzaBorda); - btnHist.ForeColor = CorTexto; - btnHist.Location = new Point(sx, 80); - pnl.Controls.Add(btnHist); - - return pnl; - } - - // ── PAINEL FINANCEIRO ────────────────────────────────────────────────── - private Panel CriarPainelFinanceiro() - { - var pnl = new Panel { BackColor = Color.White }; - pnl.Paint += (s, e) => - { - using var pen = new Pen(CorCinzaBorda); - e.Graphics.DrawLine(pen, 0, 0, 0, pnl.Height); // borda esquerda - }; - - int lx = 10, vx = 160, vw = 100, rh = 17; - int[] yy = { 4, 22, 40, 58, 76, 94 }; - - // Adiantamento - pnl.Controls.Add(Lbl("Adiantamento", lx, yy[0] + 1, 110)); - txtAdiantamento = new LV_TEXTBOX1 - { - Location = new Point(vx, yy[0]), - Size = new Size(vw, 20), - BorderColor = CorCinzaBorda, - BorderFocusColor = CorFocoBorda, - BorderSize = 2, - Text = "0,00" - }; - pnl.Controls.Add(txtAdiantamento); - - // Valores somente leitura - lblVMao = LblV(pnl, "Mão-de-obra", lx, yy[1], vx, vw, rh); - lblVPecas = LblV(pnl, "Peças", lx, yy[2], vx, vw, rh); - lblVDesloca = LblV(pnl, "Deslocamento", lx, yy[3], vx, vw, rh); - lblVTerceiro = LblV(pnl, "Serviço terceiros", lx, yy[4], vx, vw, rh); - lblVOutros = LblV(pnl, "Outros", lx, yy[5], vx, vw, rh); - - // Botão <> - var btnGar = LvBtn("<>", CorVermelha, CorVermelhaHov, CorVermelhaHov, 108, 20, br: 3); - btnGar.Font = new Font("Segoe UI", 7.5f, FontStyle.Bold); - btnGar.Location = new Point(lx, 78); - pnl.Controls.Add(btnGar); - - // Total — linha inferior destacada - lblVTotal = new Label - { - Text = "R$ 0,00", - Font = new Font("Segoe UI", 11f, FontStyle.Bold), - ForeColor = CorVermelha, - Dock = DockStyle.Bottom, - Height = 26, - TextAlign = ContentAlignment.MiddleRight, - Padding = new Padding(0, 0, 6, 0), - BackColor = Color.FromArgb(255, 240, 240) - }; - pnl.Controls.Add(lblVTotal); - - return pnl; - } - - // ══════════════════════════════════════════════════════════════════════ - // ABAS - // ══════════════════════════════════════════════════════════════════════ - private TabControl CriarAbas() - { - tabs = new TabControl - { - Dock = DockStyle.Fill, - Font = new Font("Segoe UI", 9f), - DrawMode = TabDrawMode.OwnerDrawFixed, - ItemSize = new Size(0, 28), - Padding = new Point(12, 4) - }; - - tabs.DrawItem += (s, e) => - { - var pg = tabs.TabPages[e.Index]; - bool sel = (e.Index == tabs.SelectedIndex); - var rect = e.Bounds; - - using var bg = new SolidBrush(sel ? CorVermelha : CorCinzaClaro); - e.Graphics.FillRectangle(bg, rect); - - if (!sel) - { - using var pen = new Pen(CorCinzaBorda); - e.Graphics.DrawRectangle(pen, rect.X, rect.Y, rect.Width - 1, rect.Height - 1); - } - - var sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; - using var fg = new SolidBrush(sel ? Color.White : CorTexto); - e.Graphics.DrawString(pg.Text, - new Font("Segoe UI", 9f, sel ? FontStyle.Bold : FontStyle.Regular), - fg, rect, sf); - }; - - var pgAparelho = new TabPage("Aparelho") { BackColor = Color.White }; - var pgMaoObra = new TabPage("Mão de obra/Serviços") { BackColor = Color.White }; - var pgPecas = new TabPage("Peças utilizadas") { BackColor = Color.White }; - var pgLaudo = new TabPage("Obs/Laudo técnico") { BackColor = Color.White }; - var pgMisc = new TabPage("Miscelânea") { BackColor = Color.White }; - - ConfigAbaAparelho(pgAparelho); - ConfigAbaMaoObra(pgMaoObra); - ConfigAbaPecas(pgPecas); - ConfigAbaLaudo(pgLaudo); - ConfigAbaMisc(pgMisc); - - tabs.TabPages.AddRange(new[] { pgAparelho, pgMaoObra, pgPecas, pgLaudo, pgMisc }); - return tabs; - } - - // ── Aba Aparelho ─────────────────────────────────────────────────────── - private void ConfigAbaAparelho(TabPage page) - { - page.Padding = new Padding(6, 4, 6, 4); - - // Usamos posicionamento manual + Anchor para evitar TableLayoutPanel - // (que causava o problema dos campos desaparecendo) - - // ── Linha 1: Modelo | Marca ── - var lblModelo = Lbl("Modelo", 0, 0, 100); - txtModelo = LvTxt(page, 0, 16, 420, 26); - - var lblMarca = Lbl("Marca", 430, 0, 100); - txtMarca = new LV_TEXTBOX1 - { - BorderColor = CorCinzaBorda, - BorderFocusColor = CorFocoBorda, - BorderSize = 2, - Font = new Font("Segoe UI", 9.5f), - Location = new Point(430, 16), - Size = new Size(200, 26) // ajustado via Resize - }; - txtMarca.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - - // ── Linha 2: Operadora | Serial | Nº Patrimônio ── - var lblOper = Lbl("Operadora", 0, 52, 100); - txtOperadora = LvTxt(page, 0, 68, 420, 26); - - var lblSer = Lbl("Serial", 430, 52, 100); - txtSerial = LvTxt(page, 430, 68, 200, 26); - - var lblPat = Lbl("Nº Patrimônio", 640, 52, 120); - txtPatrimonio = new LV_TEXTBOX1 - { - BorderColor = CorCinzaBorda, - BorderFocusColor = CorFocoBorda, - BorderSize = 2, - Font = new Font("Segoe UI", 9.5f), - Location = new Point(640, 68), - Size = new Size(200, 26) - }; - txtPatrimonio.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - - // ── Linha 3: Acessórios | Defeito/Reclamação ── - var lblAces = Lbl("Acessórios", 0, 106, 120); - var lblDef = Lbl("Defeito/Reclamação", 430, 106, 200); - - txtAcessorios = new TextBox - { - Multiline = true, - ScrollBars = ScrollBars.Vertical, - BorderStyle = BorderStyle.FixedSingle, - Font = new Font("Segoe UI", 9.5f), - Location = new Point(0, 122), - Size = new Size(422, 140) - }; - - txtDefeito = new TextBox - { - Multiline = true, - ScrollBars = ScrollBars.Vertical, - BorderStyle = BorderStyle.FixedSingle, - Font = new Font("Segoe UI", 9.5f), - Location = new Point(430, 122), - Size = new Size(500, 140) // ajustado via Resize - }; - txtDefeito.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - - // ── Linha 4: Observações (laranja) ── - var lblObs = Lbl("Observações", 0, 272, 120); - txtObsAparelho = new TextBox - { - Multiline = true, - ScrollBars = ScrollBars.Vertical, - BorderStyle = BorderStyle.FixedSingle, - Font = new Font("Segoe UI", 9.5f), - BackColor = CorLaranja, - Location = new Point(0, 288), - Size = new Size(930, 120) // ajustado via Resize - }; - txtObsAparelho.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; - - page.Controls.AddRange(new Control[] - { - lblModelo, txtModelo, lblMarca, txtMarca, - lblOper, txtOperadora, lblSer, txtSerial, lblPat, txtPatrimonio, - lblAces, txtAcessorios, lblDef, txtDefeito, - lblObs, txtObsAparelho - }); - - // Reposiciona controles ancorados à direita no resize - page.Resize += (s, e) => - { - int w = page.ClientSize.Width - 12; - txtMarca.Size = new Size(w - 430, 26); - txtPatrimonio.Size = new Size(w - 640, 26); - txtDefeito.Size = new Size(w - 430, 140); - txtObsAparelho.Size = new Size(w, txtObsAparelho.Height); - }; - } - - // ── Aba Mão de Obra ──────────────────────────────────────────────────── - private void ConfigAbaMaoObra(TabPage page) - { - dgvServicos = Grid(); - dgvServicos.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Serviço", FillWeight = 40 }); - dgvServicos.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Técnico", FillWeight = 20 }); - dgvServicos.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Início", FillWeight = 15 }); - dgvServicos.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Fim", FillWeight = 15 }); - dgvServicos.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Valor", FillWeight = 10 }); - page.Controls.Add(dgvServicos); - } - - // ── Aba Peças ────────────────────────────────────────────────────────── - private void ConfigAbaPecas(TabPage page) - { - dgvPecas = Grid(); - dgvPecas.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Código", FillWeight = 12 }); - dgvPecas.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Descrição", FillWeight = 38 }); - dgvPecas.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Qtd", FillWeight = 10 }); - dgvPecas.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "V. Unit.", FillWeight = 15 }); - dgvPecas.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Total", FillWeight = 15 }); - dgvPecas.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Técnico", FillWeight = 10 }); - page.Controls.Add(dgvPecas); - } - - // ── Aba Laudo ────────────────────────────────────────────────────────── - private void ConfigAbaLaudo(TabPage page) - { - page.Padding = new Padding(6, 4, 6, 4); - - var lblLaudo = Lbl("Laudo Técnico / Serviço Realizado", 0, 0, 300); - txtLaudo = new TextBox - { - Multiline = true, - ScrollBars = ScrollBars.Vertical, - BorderStyle = BorderStyle.FixedSingle, - Font = new Font("Segoe UI", 9.5f), - Location = new Point(0, 16), - Size = new Size(900, 160), - Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right - }; - - var lblObs = Lbl("Observações Adicionais do Serviço", 0, 186, 300); - txtObsServico = new TextBox - { - Multiline = true, - ScrollBars = ScrollBars.Vertical, - BorderStyle = BorderStyle.FixedSingle, - Font = new Font("Segoe UI", 9.5f), - Location = new Point(0, 202), - Size = new Size(900, 120), - Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom - }; - - page.Controls.AddRange(new Control[] { lblLaudo, txtLaudo, lblObs, txtObsServico }); - - page.Resize += (s, e) => - { - int w = page.ClientSize.Width - 12; - txtLaudo.Width = w; - txtObsServico.Width = w; - }; - } - - // ── Aba Miscelânea ───────────────────────────────────────────────────── - private void ConfigAbaMisc(TabPage page) - { - page.Controls.Add(Lbl("Campos adicionais serão configurados aqui.", 10, 12, 400)); - } - - // ══════════════════════════════════════════════════════════════════════ - // RODAPÉ - // ══════════════════════════════════════════════════════════════════════ - private Panel CriarRodape() - { - var pnl = new Panel { BackColor = CorCinzaClaro }; - pnl.Paint += (s, e) => - { - using var pen = new Pen(CorCinzaBorda); - e.Graphics.DrawLine(pen, 0, 0, pnl.Width, 0); - }; - - // Técnico Responsável - pnl.Controls.Add(Lbl("Técnico Responsável", 10, 2, 140, bold: true, fs: 8.5f)); - cmbTecnico = new ComboBox - { - Location = new Point(10, 18), - Size = new Size(200, 24), - DropDownStyle = ComboBoxStyle.DropDownList, - Font = new Font("Segoe UI", 9f), - FlatStyle = FlatStyle.Flat - }; - cmbTecnico.Items.Add("Não definido"); - cmbTecnico.SelectedIndex = 0; - pnl.Controls.Add(cmbTecnico); - - // Prioridade - pnl.Controls.Add(Lbl("Prioridade", 220, 2, 80, bold: true, fs: 8.5f)); - cmbPrioridade = new ComboBox - { - Location = new Point(220, 18), - Size = new Size(120, 24), - DropDownStyle = ComboBoxStyle.DropDownList, - Font = new Font("Segoe UI", 9f), - FlatStyle = FlatStyle.Flat - }; - cmbPrioridade.Items.AddRange(new object[] { "Normal", "Alta", "Urgente" }); - cmbPrioridade.SelectedIndex = 0; - pnl.Controls.Add(cmbPrioridade); - - // Botão Fotos/Docs - var btnFotos = LvBtn("📷 Fotos/Docs", CorCinzaClaro, Color.FromArgb(180, 180, 180), CorCinzaBorda, 128, 28, br: 4, bs: 1, bc: CorCinzaBorda); - btnFotos.ForeColor = CorTexto; - btnFotos.Anchor = AnchorStyles.Top | AnchorStyles.Right; - pnl.Resize += (s, e) => btnFotos.Location = new Point(pnl.Width - 136, 8); - pnl.Controls.Add(btnFotos); - - return pnl; - } - - // ══════════════════════════════════════════════════════════════════════ - // PREENCHIMENTO - // ══════════════════════════════════════════════════════════════════════ - private void PreencherCampos() - { - if (_os == null) return; - - lblNumOS.Text = $"O.S. nº {_os.CODIGO ?? "—"}"; - lblCliente.Text = _os.COD_CLIENTE ?? "—"; - lblCodVal.Text = _os.ID_ORDENS.ToString(); - - txtModelo.Text = _os.MODELO ?? ""; - txtMarca.Text = _os.MARCA ?? ""; - txtSerial.Text = _os.SERIE ?? ""; - txtAcessorios.Text = _os.ACESSORIO ?? ""; - txtDefeito.Text = _os.DEFEITO ?? ""; - txtObsAparelho.Text = _os.OBS_APARELHO ?? ""; - txtLaudo.Text = _os.LAUDO ?? ""; - txtObsServico.Text = _os.OBS_SERVICO ?? ""; - - lblVMao.Text = Fmt(_os.V_MAO); - lblVPecas.Text = Fmt(_os.V_PECAS); - lblVDesloca.Text = Fmt(_os.V_DESLOCA); - lblVTerceiro.Text = Fmt(_os.V_TERCEIRO); - lblVOutros.Text = Fmt(_os.V_OUTROS); - - if (!string.IsNullOrEmpty(_os.SITUACAO)) - { - int i = cmbSituacao.Items.IndexOf(_os.SITUACAO); - if (i >= 0) cmbSituacao.SelectedIndex = i; - } - - if (DateTime.TryParse(_os.ENTRADA, out var de)) dtpEntrada.Value = de; - if (DateTime.TryParse(_os.PRONTO, out var dp)) dtpPronto.Value = dp; - if (DateTime.TryParse(_os.SAIDA, out var ds)) dtpSaida.Value = ds; - - if (!string.IsNullOrEmpty(_os.GARANTIA)) - lblGarantia.Text = $"Garantia até {_os.GARANTIA}"; - - AtualizarTotal(); - } - - private void AtualizarTotal() - { - decimal total = Prx(_os?.V_MAO) - + Prx(_os?.V_PECAS) - + Prx(_os?.V_DESLOCA) - + Prx(_os?.V_TERCEIRO) - + Prx(_os?.V_OUTROS); - lblVTotal.Text = $"R$ {total:N2}"; - } - - // ══════════════════════════════════════════════════════════════════════ - // SALVAR - // ══════════════════════════════════════════════════════════════════════ - private void Salvar() - { - try - { - _os ??= new ModeloOrdens(); - _os.MODELO = txtModelo.Text; - _os.MARCA = txtMarca.Text; - _os.SERIE = txtSerial.Text; - _os.ACESSORIO = txtAcessorios.Text; - _os.DEFEITO = txtDefeito.Text; - _os.OBS_APARELHO = txtObsAparelho.Text; - _os.LAUDO = txtLaudo.Text; - _os.OBS_SERVICO = txtObsServico.Text; - _os.SITUACAO = cmbSituacao.SelectedItem?.ToString(); - _os.ENTRADA = dtpEntrada.Value.ToString("dd/MM/yy HH:mm"); - _os.PRONTO = dtpPronto.Value.ToString("dd/MM/yy HH:mm"); - _os.SAIDA = dtpSaida.Value.ToString("dd/MM/yy HH:mm"); - - MessageBox.Show("Ordem de Serviço salva com sucesso!", "LevelOS", - MessageBoxButtons.OK, MessageBoxIcon.Information); - OnVoltar?.Invoke(); - } - catch (Exception ex) - { - MessageBox.Show($"Erro ao salvar: {ex.Message}", "Erro", - MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - - // ══════════════════════════════════════════════════════════════════════ - // FACTORY HELPERS - // ══════════════════════════════════════════════════════════════════════ - - /// LV_BUTTON configurado. - private LV_BUTTON LvBtn(string texto, Color bg, Color hover, Color click, - int w, int h, int br = 0, int bs = 0, Color bc = default) - { - var btn = new LV_BUTTON - { - Text = texto, - Size = new Size(w, h), - BackColor = bg, - HoverColor = hover, - ClickColor = click, - ForeColor = Color.White, - Font = new Font("Segoe UI", 9f, FontStyle.Bold), - BorderRadius = br, - BorderSize = bs, - Cursor = Cursors.Hand - }; - if (bc != default) btn.BorderColor = bc; - return btn; - } - - /// LV_TEXTBOX1 adicionado ao parent. - private LV_TEXTBOX1 LvTxt(Control parent, int x, int y, int w, int h) - { - var tb = new LV_TEXTBOX1 - { - Location = new Point(x, y), - Size = new Size(w, h), - BorderColor = CorCinzaBorda, - BorderFocusColor = CorFocoBorda, - BorderSize = 2, - Font = new Font("Segoe UI", 9.5f) - }; - parent.Controls.Add(tb); - return tb; - } - - /// Label de valor (painel financeiro). - private Label LblV(Panel parent, string rotulo, int lx, int ly, int vx, int vw, int rh) - { - parent.Controls.Add(Lbl(rotulo, lx, ly + 1, 120)); var lbl = new Label { - Text = "R$ 0,00", - Font = new Font("Segoe UI", 8.5f), - ForeColor = CorTexto, - Location = new Point(vx, ly), - Size = new Size(vw, rh), - TextAlign = ContentAlignment.MiddleRight + Text = title, + + Font = new Font("Segoe UI", 9f, FontStyle.Bold), + + ForeColor = AccentBlue, + + Location = new Point(10, 10), + + AutoSize = true }; - parent.Controls.Add(lbl); - return lbl; + + pnl.Controls.Add(lbl); + + return pnl; } - /// DataGridView padronizado. - private DataGridView Grid() + #endregion + + #region Header + + private void BuildHeader() { - var dgv = new DataGridView + var header = new Panel { - Dock = DockStyle.Fill, + Location = new Point(20, 20), + Size = new Size(1130, 90), + BackColor = Color.White + }; + + header.Paint += CardPaint; + + lblNumeroOS = new Label + { + Text = "O.S. nº 1771", + Font = new Font("Segoe UI", 25f, FontStyle.Bold), + ForeColor = Color.FromArgb(210, 38, 38), + Location = new Point(15, 20), + AutoSize = true + }; + + var lblSub = new Label + { + Text = "Cadastro e gerenciamento da ordem de serviço", + Font = new Font("Segoe UI", 9f), + ForeColor = Color.Gray, + Location = new Point(24, 63), + AutoSize = true + }; + + header.Controls.Add(lblNumeroOS); + header.Controls.Add(lblSub); + + content.Controls.Add(header); + } + + #endregion + + #region Cliente + + private void BuildCliente() + { + cardCliente = CreateCard(new Rectangle(20, 130, 760, 220), "Dados do Cliente"); + + txtCliente = AddModernInput(cardCliente, "Cliente", 20, 45, 700); + txtEndereco = AddModernInput(cardCliente, "Endereço", 20, 95, 700); + + txtTelefones = AddModernInput(cardCliente, "Telefones", 20, 145, 220); + txtDocs = AddModernInput(cardCliente, "Documentos", 260, 145, 220); + txtEmail = AddModernInput(cardCliente, "E-mail", 500, 145, 220); + + content.Controls.Add(cardCliente); + txtCliente.Text = "Nicolas Felipe G. dos santos"; + } + + #endregion + + #region Datas + + private void BuildDatasStatus() + { + cardDatas = CreateCard(new Rectangle(20, 370, 760, 170), "Status e Datas"); + + AddSmallLabel(cardDatas, "Entrada", 20, 45); + + dtpEntrada = CreatePicker(20, 65, 180); + cardDatas.Controls.Add(dtpEntrada); + + AddSmallLabel(cardDatas, "Pronto", 20, 100); + + dtpPronto = CreatePicker(20, 120, 180); + cardDatas.Controls.Add(dtpPronto); + + AddSmallLabel(cardDatas, "Saída", 220, 45); + + dtpSaida = CreatePicker(220, 65, 180); + cardDatas.Controls.Add(dtpSaida); + + cbSituacao = AddComboBox(cardDatas, "Situação da OS", 430, 45, 280); + + AddSmallLabel(cardDatas, "Garantia até", 220, 100); + dtpGarantia = CreatePicker(220, 120, 180); + cardDatas.Controls.Add(dtpGarantia); + + var btnHistorico = new Button + { + Text = "🕘 Histórico", + Location = new Point(480, 120), + Size = new Size(220, 36), + + FlatStyle = FlatStyle.Flat, + BackColor = Color.White, + ForeColor = TextDark, + + Font = new Font("Segoe UI Semibold", 9f), + + Cursor = Cursors.Hand + }; + + btnHistorico.FlatAppearance.BorderColor = BorderColor; + btnHistorico.FlatAppearance.MouseOverBackColor = Color.Blue; + + // Evento clique + btnHistorico.Click += (s, e) => + { + MessageBox.Show( + "Abrir histórico da OS", + "Histórico", + MessageBoxButtons.OK, + MessageBoxIcon.Information); + }; + + // Adiciona no painel + cardDatas.Controls.Add(btnHistorico); + + //txtGarantia = AddModernInput(cardDatas, "Garantia até", 250, 105, 180); + + content.Controls.Add(cardDatas); + } + + #endregion + + #region Financeiro + + private void BuildFinanceiro() + { + cardFinanceiro = CreateCard(new Rectangle(800, 130, 350, 410), "Financeiro"); + + int y = 50; + + txtAdiantamento = AddFinanceRow(cardFinanceiro, "Adiantamento", y); + y += 42; + + txtMaoObra = AddFinanceRow(cardFinanceiro, "Mão-de-obra", y); + y += 42; + + txtPecas = AddFinanceRow(cardFinanceiro, "Peças", y); + y += 42; + + txtDeslocamento = AddFinanceRow(cardFinanceiro, "Deslocamento", y); + y += 42; + + txtServicosTerceiros = AddFinanceRow(cardFinanceiro, "Serviços terceiros", y); + y += 42; + + txtOutros = AddFinanceRow(cardFinanceiro, "Outros", y); + y += 65; + + var line = new Panel + { + BackColor = BorderColor, + Location = new Point(20, y), + Size = new Size(300, 1) + }; + + cardFinanceiro.Controls.Add(line); + + y += 20; + + var lblTotal = new Label + { + Text = "TOTAL", + Font = new Font("Segoe UI", 12f, FontStyle.Bold), + ForeColor = Color.FromArgb(220, 38, 38), + Location = new Point(20, y + 8), + AutoSize = true + }; + + txtTotal = new LV_TEXTBOX1 + { + Location = new Point(140, y), + Size = new Size(180, 38), + Font = new Font("Segoe UI", 14f, FontStyle.Bold), + TextAlign = HorizontalAlignment.Right, + BorderColor = Color.FromArgb(220, 38, 38), + BorderFocusColor = Color.FromArgb(220, 38, 38), + ForeColor = Color.FromArgb(220, 38, 38) + }; + + cardFinanceiro.Controls.Add(lblTotal); + cardFinanceiro.Controls.Add(txtTotal); + + content.Controls.Add(cardFinanceiro); + } + + #endregion + + #region Tabs + + private void BuildTabs() + { + tabDetalhes = new TabControl + { + Location = new Point(20, 560), + Size = new Size(1130, 320), + Font = new Font("Segoe UI", 9f), + DrawMode = TabDrawMode.OwnerDrawFixed, + SizeMode = TabSizeMode.Fixed, + ItemSize = new Size(180, 35) + }; + + tabDetalhes.DrawItem += DrawTab; + + BuildTabAparelho(); + BuildTabServicos(); + BuildTabPecas(); + BuildTabLaudo(); + BuildTabMiscelanea(); + + + //tabDetalhes.TabPages.Add(CreateSimpleTab("Peças utilizadas")); + //tabDetalhes.TabPages.Add(CreateSimpleTab("Obs / Laudo técnico")); + //tabDetalhes.TabPages.Add(CreateSimpleTab("Miscelânea")); + + content.Controls.Add(tabDetalhes); + } + + private void BuildTabAparelho() + { + var tab = new TabPage("Aparelho") + { + BackColor = Color.White + }; + + AddModernInput(tab, "Modelo", 20, 20, 500); + AddModernInput(tab, "Marca", 550, 20, 500); + + AddModernInput(tab, "Operadora", 20, 90, 300); + AddModernInput(tab, "Serial", 350, 90, 300); + AddModernInput(tab, "Nº Patrimônio", 680, 90, 370); + + var txtAcessorios = AddModernInput(tab, "Acessórios", 20, 160, 500, 90); + txtAcessorios.Multiline = true; + + var txtDefeito = AddModernInput(tab, "Defeito / Reclamação", 550, 160, 500, 90); + txtDefeito.Multiline = true; + + tabDetalhes.TabPages.Add(tab); + }//Aparelho + private void BuildTabServicos() + { + var tab = new TabPage("Mão de obra / Serviços") + { + BackColor = Color.White + }; + + // ===================================================== + // GRID DE SERVIÇOS + // ===================================================== + + var lblLista = new Label + { + Text = "Lista de Serviços executados nesta OS", + Font = new Font("Segoe UI", 9f, FontStyle.Bold), + ForeColor = TextDark, + Location = new Point(15, 15), + AutoSize = true + }; + + tab.Controls.Add(lblLista); + + var gridServicos = new DataGridView + { + Location = new Point(15, 40), + Size = new Size(900, 240), + BackgroundColor = Color.White, - BorderStyle = BorderStyle.None, - AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, - EnableHeadersVisualStyles = false, - AllowUserToAddRows = true, + BorderStyle = BorderStyle.FixedSingle, + + AllowUserToAddRows = false, + AllowUserToDeleteRows = false, + AllowUserToResizeRows = false, + RowHeadersVisible = false, + SelectionMode = DataGridViewSelectionMode.FullRowSelect, - GridColor = CorCinzaBorda, - Font = new Font("Segoe UI", 9f) + MultiSelect = false, + + AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None, + + EnableHeadersVisualStyles = false, + + Font = new Font("Segoe UI", 8.5f), + + GridColor = BorderColor }; - dgv.ColumnHeadersDefaultCellStyle.BackColor = CorCinzaClaro; - dgv.ColumnHeadersDefaultCellStyle.ForeColor = CorTexto; - dgv.ColumnHeadersDefaultCellStyle.Font = new Font("Segoe UI", 9f, FontStyle.Bold); - dgv.ColumnHeadersHeight = 28; - dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(250, 250, 255); - return dgv; + + // ========================= + // HEADER STYLE + // ========================= + + gridServicos.ColumnHeadersDefaultCellStyle.BackColor = + Color.FromArgb(245, 247, 250); + + gridServicos.ColumnHeadersDefaultCellStyle.ForeColor = + TextDark; + + gridServicos.ColumnHeadersDefaultCellStyle.Font = + new Font("Segoe UI", 8.5f, FontStyle.Bold); + + gridServicos.ColumnHeadersHeight = 30; + + // ========================= + // COLUNAS + // ========================= + + gridServicos.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Descrição", + Width = 320 + }); + + gridServicos.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Tipo", + Width = 80 + }); + + gridServicos.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Início", + Width = 70 + }); + + gridServicos.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Fim", + Width = 70 + }); + + gridServicos.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Qtd", + Width = 60 + }); + + gridServicos.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Valor", + Width = 90 + }); + + gridServicos.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Técnico", + Width = 180 + }); + + tab.Controls.Add(gridServicos); + + // ===================================================== + // MENU LATERAL + // ===================================================== + + var pnlLateral = new Panel + { + Location = new Point(930, 40), + Size = new Size(170, 240), + BackColor = Color.White + }; + + Button CriarBotao(string texto, int y, Color cor) + { + var btn = new Button + { + Text = texto, + Location = new Point(10, y), + Size = new Size(145, 38), + + FlatStyle = FlatStyle.Flat, + BackColor = cor, + ForeColor = Color.White, + + Font = new Font("Segoe UI Semibold", 8.5f), + + Cursor = Cursors.Hand + }; + + btn.FlatAppearance.BorderSize = 0; + + return btn; + } + + var btnPadroes = CriarBotao( + "Padrões", + 0, + AccentBlue); + + var btnAvulsos = CriarBotao( + "Avulsos", + 50, + Color.FromArgb(34, 197, 94)); + + var btnExcluir = CriarBotao( + "Excluir", + 100, + Color.FromArgb(239, 68, 68)); + + pnlLateral.Controls.Add(btnPadroes); + pnlLateral.Controls.Add(btnAvulsos); + pnlLateral.Controls.Add(btnExcluir); + + // ===================================================== + // TOTAL HORAS + // ===================================================== + + var lblHoras = new Label + { + Text = "Total de horas", + Font = new Font("Segoe UI", 8.5f, FontStyle.Bold), + ForeColor = TextDark, + Location = new Point(10, 170), + AutoSize = true + }; + + pnlLateral.Controls.Add(lblHoras); + + var txtHoras = new LV_TEXTBOX1 + { + Location = new Point(10, 190), + Size = new Size(145, 30), + + BorderColor = BorderColor, + BorderFocusColor = AccentBlue, + + Font = new Font("Segoe UI", 10f, FontStyle.Bold) + }; + + pnlLateral.Controls.Add(txtHoras); + + // ===================================================== + // TOTAL + // ===================================================== + + var lblTotal = new Label + { + Text = "Total", + Font = new Font("Segoe UI", 9f, FontStyle.Bold), + ForeColor = Color.Red, + Location = new Point(10, 230), + AutoSize = true + }; + + pnlLateral.Controls.Add(lblTotal); + + var txtTotal = new LV_TEXTBOX1 + { + Location = new Point(10, 250), + Size = new Size(145, 34), + + BorderColor = Color.Red, + BorderFocusColor = Color.Red, + + Font = new Font("Segoe UI", 11f, FontStyle.Bold), + ForeColor = Color.Red + }; + + pnlLateral.Controls.Add(txtTotal); + + tab.Controls.Add(pnlLateral); + + // ===================================================== + // OBSERVAÇÕES + // ===================================================== + + var lblObs = new Label + { + Text = "Observações internas", + Font = new Font("Segoe UI", 8.5f, FontStyle.Bold), + ForeColor = TextDark, + Location = new Point(15, 295), + AutoSize = true + }; + + tab.Controls.Add(lblObs); + + var txtObs = new LV_TEXTBOX1 + { + Location = new Point(15, 318), + Size = new Size(900, 90), + + Multiline = true, + + BorderColor = BorderColor, + BorderFocusColor = AccentBlue + }; + + tab.Controls.Add(txtObs); + + // ===================================================== + // BOTÃO DESLOCAMENTO + // ===================================================== + + var btnDeslocamento = new Button + { + Text = "Deslocamentos", + + Location = new Point(930, 360), + Size = new Size(145, 40), + + FlatStyle = FlatStyle.Flat, + + BackColor = AccentBlue, + ForeColor = Color.White, + + Font = new Font("Segoe UI Semibold", 8.5f), + + Cursor = Cursors.Hand + }; + //eventos clicks + btnPadroes.Click += (s, e) => + { + NT_MessageBox.Show( + "Testando evento click padrão", + "Padrão", + MessageBoxButtons.OK, + MessageBoxIcon.Information); + }; + + btnDeslocamento.FlatAppearance.BorderSize = 0; + + tab.Controls.Add(btnDeslocamento); + + // ===================================================== + // ADD TAB + // ===================================================== + + tabDetalhes.TabPages.Add(tab); + }//Mão de obra e serviço + private void BuildTabPecas() + { + var tab = new TabPage("Peças utilizadas") + { + BackColor = Color.White + }; + + // ===================================================== + // TITULO + // ===================================================== + + var lblLista = new Label + { + Text = "Lista de Peças utilizadas nesta OS", + Font = new Font("Segoe UI", 9f, FontStyle.Bold), + ForeColor = TextDark, + Location = new Point(15, 15), + AutoSize = true + }; + + tab.Controls.Add(lblLista); + + // ===================================================== + // GRID + // ===================================================== + + var gridPecas = new DataGridView + { + Location = new Point(15, 40), + Size = new Size(900, 360), + + BackgroundColor = Color.White, + BorderStyle = BorderStyle.FixedSingle, + + AllowUserToAddRows = false, + AllowUserToDeleteRows = false, + AllowUserToResizeRows = false, + + RowHeadersVisible = false, + + SelectionMode = DataGridViewSelectionMode.FullRowSelect, + MultiSelect = false, + + AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None, + + EnableHeadersVisualStyles = false, + + Font = new Font("Segoe UI", 8.5f), + + GridColor = BorderColor + }; + + // ===================================================== + // HEADER STYLE + // ===================================================== + + gridPecas.ColumnHeadersDefaultCellStyle.BackColor = + Color.FromArgb(245, 247, 250); + + gridPecas.ColumnHeadersDefaultCellStyle.ForeColor = + TextDark; + + gridPecas.ColumnHeadersDefaultCellStyle.Font = + new Font("Segoe UI", 8.5f, FontStyle.Bold); + + gridPecas.ColumnHeadersHeight = 30; + + // ===================================================== + // COLUNAS + // ===================================================== + + gridPecas.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Peça nº", + Width = 120 + }); + + gridPecas.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Descrição", + Width = 300 + }); + + gridPecas.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Valor un", + Width = 110 + }); + + gridPecas.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Qtd.", + Width = 80 + }); + + gridPecas.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Valor Total", + Width = 120 + }); + + gridPecas.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "Técnico", + Width = 170 + }); + + tab.Controls.Add(gridPecas); + + // ===================================================== + // MENU LATERAL + // ===================================================== + + var pnlLateral = new Panel + { + Location = new Point(930, 40), + Size = new Size(170, 360), + BackColor = Color.White + }; + + Button CriarBotao( + string texto, + int y, + Color cor) + { + var btn = new Button + { + Text = texto, + + Location = new Point(10, y), + Size = new Size(145, 40), + + FlatStyle = FlatStyle.Flat, + + BackColor = cor, + ForeColor = Color.White, + + Font = new Font("Segoe UI Semibold", 8.5f), + + Cursor = Cursors.Hand + }; + + btn.FlatAppearance.BorderSize = 0; + + return btn; + } + + // ===================================================== + // BOTÕES + // ===================================================== + + var btnEstoque = CriarBotao( + "Peças do Estoque", + 0, + AccentBlue); + + var btnAvulsas = CriarBotao( + "Peças avulsas", + 50, + Color.FromArgb(34, 197, 94)); + + var btnKit = CriarBotao( + "KIT Montado", + 100, + Color.FromArgb(245, 158, 11)); + + var btnExcluir = CriarBotao( + "Excluir", + 150, + Color.FromArgb(239, 68, 68)); + + var btnOrcamento = CriarBotao( + "Inserir orçamento", + 210, + Color.FromArgb(99, 102, 241)); + + var btnRequisicao = CriarBotao( + "Requisição", + 260, + Color.FromArgb(107, 114, 128)); + + pnlLateral.Controls.Add(btnEstoque); + pnlLateral.Controls.Add(btnAvulsas); + pnlLateral.Controls.Add(btnKit); + pnlLateral.Controls.Add(btnExcluir); + pnlLateral.Controls.Add(btnOrcamento); + pnlLateral.Controls.Add(btnRequisicao); + + tab.Controls.Add(pnlLateral); + + // ===================================================== + // ADD TAB + // ===================================================== + + tabDetalhes.TabPages.Add(tab); + }//Peças utilizadas + private void BuildTabLaudo() + { + var tab = new TabPage("Obs / Laudo técnico") + { + BackColor = Color.White + }; + + // ===================================================== + // TITULO + // ===================================================== + + var lblInfo = new Label + { + Text = "Escreva no espaço abaixo o laudo técnico ou detalhes do conserto do equipamento", + + Font = new Font("Segoe UI", 9f, FontStyle.Bold), + + ForeColor = TextDark, + + Location = new Point(15, 15), + + AutoSize = true + }; + + tab.Controls.Add(lblInfo); + + // ===================================================== + // AJUDA + // ===================================================== + + var lblAjuda = new Label + { + Text = "(SHIFT + Enter para pular linha)", + + Font = new Font("Segoe UI", 8f), + + ForeColor = Color.Gray, + + Location = new Point(780, 18), + + AutoSize = true + }; + + tab.Controls.Add(lblAjuda); + + // ===================================================== + // CAMPO DO LAUDO + // ===================================================== + + var txtLaudo = new LV_TEXTBOX1 + { + Location = new Point(15, 40), + + Size = new Size(1080, 300), + + Multiline = true, + + BorderColor = BorderColor, + + BorderFocusColor = AccentBlue, + + Font = new Font("Segoe UI", 9f), + + BackColor = Color.White + }; + + tab.Controls.Add(txtLaudo); + + // ===================================================== + // BOTÃO PREENCHER + // ===================================================== + + var btnPreencher = new Button + { + Text = "📝 Preencher Laudo", + + Location = new Point(15, 355), + + Size = new Size(180, 38), + + FlatStyle = FlatStyle.Flat, + + BackColor = AccentBlue, + + ForeColor = Color.White, + + Font = new Font("Segoe UI Semibold", 9f), + + Cursor = Cursors.Hand + }; + + btnPreencher.FlatAppearance.BorderSize = 0; + + btnPreencher.Click += (s, e) => + { + txtLaudo.Text = + @"Equipamento analisado e testado em bancada. + +Foi identificado defeito no componente principal. + +Realizado: +- limpeza interna +- substituição de peças +- testes finais + +Equipamento funcionando normalmente."; + }; + + tab.Controls.Add(btnPreencher); + + // ===================================================== + // ADD TAB + // ===================================================== + + tabDetalhes.TabPages.Add(tab); + }//Laudo tecnico + private void BuildTabMiscelanea() + { + var tab = new TabPage("Miscelânea") + { + BackColor = Color.White + }; + + // ===================================================== + // CARD GARANTIA + // ===================================================== + + var cardGarantia = CreateInternalCard( + "Garantia / Garantidor", + new Rectangle(15, 15, 650, 280)); + + // Garantidor + + var cbGarantidor = AddComboBox( + cardGarantia, + "Fábrica / Garantidor", + 15, + 20, + 300); + + cbGarantidor.Items.AddRange(new object[] + { + "Nenhum", + "Samsung", + "LG", + "Motorola", + "Dell" + }); + + cbGarantidor.SelectedIndex = 0; + + // Senha + + AddSmallLabel( + cardGarantia, + "Senha garantidor", + 15, + 75); + + var txtSenha = new LV_TEXTBOX1 + { + Location = new Point(15, 95), + Size = new Size(220, 30), + + BorderColor = BorderColor, + BorderFocusColor = AccentBlue + }; + + cardGarantia.Controls.Add(txtSenha); + + // Aviso + + var lblAviso = new Label + { + Text = + "A fábrica/Garantidor é aquele que pagará pelo reparo do equipamento.", + + Font = new Font("Segoe UI", 8f), + + ForeColor = Color.FromArgb(120, 53, 15), + + BackColor = Color.FromArgb(254, 249, 195), + + Location = new Point(250, 95), + + Size = new Size(360, 45), + + TextAlign = ContentAlignment.MiddleCenter + }; + + cardGarantia.Controls.Add(lblAviso); + + // NF Venda + + AddSmallLabel( + cardGarantia, + "Nº NF de venda", + 15, + 150); + + var txtNFVenda = new LV_TEXTBOX1 + { + Location = new Point(15, 170), + Size = new Size(180, 30), + + BorderColor = BorderColor, + BorderFocusColor = AccentBlue + }; + + cardGarantia.Controls.Add(txtNFVenda); + + // Certificado + + AddSmallLabel( + cardGarantia, + "Nº certificado de garantia", + 220, + 150); + + var txtCertificado = new LV_TEXTBOX1 + { + Location = new Point(220, 170), + Size = new Size(390, 30), + + BorderColor = BorderColor, + BorderFocusColor = AccentBlue + }; + + cardGarantia.Controls.Add(txtCertificado); + + // Compra + + AddSmallLabel( + cardGarantia, + "Data da compra", + 15, + 215); + + var dtCompra = new DateTimePicker + { + Location = new Point(15, 235), + Width = 180, + + Format = DateTimePickerFormat.Short, + + Font = new Font("Segoe UI", 8.5f) + }; + + cardGarantia.Controls.Add(dtCompra); + + // Revendedor + + AddSmallLabel( + cardGarantia, + "Revendedor", + 220, + 215); + + var txtRevendedor = new LV_TEXTBOX1 + { + Location = new Point(220, 235), + Size = new Size(390, 30), + + BorderColor = BorderColor, + BorderFocusColor = AccentBlue + }; + + cardGarantia.Controls.Add(txtRevendedor); + + tab.Controls.Add(cardGarantia); + + // ===================================================== + // CARD NF ENTRADA + // ===================================================== + + var cardNF = CreateInternalCard( + "Nota Fiscal Entrada / Remessa", + new Rectangle(685, 15, 420, 130)); + + // Numero NF + + AddSmallLabel( + cardNF, + "Número da NF", + 15, + 20); + + var txtNumeroNF = new LV_TEXTBOX1 + { + Location = new Point(15, 40), + Size = new Size(140, 30), + + BorderColor = BorderColor, + BorderFocusColor = AccentBlue + }; + + cardNF.Controls.Add(txtNumeroNF); + + // Valor NF + + AddSmallLabel( + cardNF, + "Valor da NF", + 175, + 20); + + var txtValorNF = new LV_TEXTBOX1 + { + Location = new Point(175, 40), + Size = new Size(180, 30), + + BorderColor = BorderColor, + BorderFocusColor = AccentBlue + }; + + cardNF.Controls.Add(txtValorNF); + + // Emissor + + var cbFornecedorNF = AddComboBox( + cardNF, + "Emissor (Fornecedor)", + 15, + 75, + 340); + + cbFornecedorNF.Items.Add("Nenhum"); + cbFornecedorNF.SelectedIndex = 0; + + tab.Controls.Add(cardNF); + + // ===================================================== + // CARD TERCEIROS + // ===================================================== + + var cardTerceiros = CreateInternalCard( + "Ordem de serviço de Terceiros / Parceiros", + new Rectangle(685, 160, 420, 135)); + + // OS Terceiro + + AddSmallLabel( + cardTerceiros, + "Nº OS terceiros", + 15, + 20); + + var txtOSTerceiros = new LV_TEXTBOX1 + { + Location = new Point(15, 40), + Size = new Size(120, 30), + + BorderColor = BorderColor, + BorderFocusColor = AccentBlue + }; + + cardTerceiros.Controls.Add(txtOSTerceiros); + + // OS Fabricante + + AddSmallLabel( + cardTerceiros, + "Nº OS Fabricante", + 160, + 20); + + var txtOSFabricante = new LV_TEXTBOX1 + { + Location = new Point(160, 40), + Size = new Size(160, 30), + + BorderColor = BorderColor, + BorderFocusColor = AccentBlue + }; + + cardTerceiros.Controls.Add(txtOSFabricante); + + // Fornecedor + + var cbFornecedor = AddComboBox( + cardTerceiros, + "Emissor (Fornecedor)", + 15, + 75, + 340); + + cbFornecedor.Items.Add("Nenhum"); + cbFornecedor.SelectedIndex = 0; + + tab.Controls.Add(cardTerceiros); + + // ===================================================== + // ADD TAB + // ===================================================== + + tabDetalhes.TabPages.Add(tab); + }//Miscelânea + + #endregion + + #region Rodapé + + private void BuildRodape() + { + cardRodape = CreateCard(new Rectangle(20, 900, 1130, 70), ""); + + cbTecnico = AddComboBox(cardRodape, "Técnico Responsável", 20, 10, 350); + + cbPrioridade = AddComboBox(cardRodape, "Prioridade", 400, 10, 180); + cbPrioridade.Items.AddRange(new object[]{"Baixa","Normal", "Alta", "Urgente" ,"Emergencial"}); + cbPrioridade.SelectedIndex = 1; + + var btnFotos = new Button + { + Text = "Fotos / Docs", + Location = new Point(930, 20), + Size = new Size(160, 35), + FlatStyle = FlatStyle.Flat, + BackColor = AccentBlue, + ForeColor = Color.White, + Font = new Font("Segoe UI Semibold", 9f), + Cursor = Cursors.Hand + }; + + btnFotos.FlatAppearance.BorderSize = 0; + + cardRodape.Controls.Add(btnFotos); + + content.Controls.Add(cardRodape); } - /// DateTimePicker padronizado. - private DateTimePicker DTP(Control parent, int x, int y, int w, int h) + #endregion + + #region Helpers + + private Panel CreateCard(Rectangle rect, string title) { - var dtp = new DateTimePicker + var pnl = new Panel + { + Location = rect.Location, + Size = rect.Size, + BackColor = Color.White + }; + + pnl.Paint += CardPaint; + + if (!string.IsNullOrWhiteSpace(title)) + { + var lbl = new Label + { + Text = title, + Font = new Font("Segoe UI", 10f, FontStyle.Bold), + ForeColor = AccentBlue, + Location = new Point(18, 15), + AutoSize = true + }; + + pnl.Controls.Add(lbl); + + var line = new Panel + { + BackColor = BorderColor, + Location = new Point(18, 40), + Size = new Size(rect.Width - 36, 1) + }; + + pnl.Controls.Add(line); + } + + return pnl; + } + + private LV_TEXTBOX1 AddModernInput( + Control parent, + string label, + int x, + int y, + int width, + int height = 32) + { + var lbl = new Label + { + Text = label, + Font = new Font("Segoe UI", 8.5f, FontStyle.Bold), + ForeColor = TextDark, + Location = new Point(x, y), + AutoSize = true + }; + + var txt = new LV_TEXTBOX1 + { + Location = new Point(x, y + 20), + Size = new Size(width, height), + BorderColor = BorderColor, + BorderFocusColor = AccentBlue, + BackColor = Color.White + }; + + parent.Controls.Add(lbl); + parent.Controls.Add(txt); + + return txt; + } + + private LV_TEXTBOX1 AddFinanceRow(Control parent, string text, int y) + { + var lbl = new Label + { + Text = text, + Font = new Font("Segoe UI", 9f, FontStyle.Bold), + ForeColor = TextDark, + Location = new Point(20, y + 7), + AutoSize = true + }; + + var txt = new LV_TEXTBOX1 + { + Location = new Point(140, y), + Size = new Size(180, 32), + TextAlign = HorizontalAlignment.Right, + BorderColor = BorderColor, + BorderFocusColor = AccentBlue + }; + + parent.Controls.Add(lbl); + parent.Controls.Add(txt); + + return txt; + } + + private void AddSmallLabel(Control parent, string text, int x, int y) + { + parent.Controls.Add(new Label + { + Text = text, + Font = new Font("Segoe UI", 8.5f, FontStyle.Bold), + ForeColor = TextDark, + Location = new Point(x, y), + AutoSize = true + }); + } + + private DateTimePicker CreatePicker(int x, int y, int width) + { + return new DateTimePicker { Location = new Point(x, y), - Size = new Size(w, h), + Width = width, Format = DateTimePickerFormat.Custom, - CustomFormat = "dd/MM/yy HH:mm", + CustomFormat = "dd/MM/yyyy HH:mm", Font = new Font("Segoe UI", 9f) }; - parent.Controls.Add(dtp); - return dtp; } - /// Label simples. - private Label Lbl(string texto, int x, int y, int w, bool bold = false, float fs = 8.5f) + private TabPage CreateSimpleTab(string title) { - return new Label + return new TabPage(title) { - Text = texto, - Location = new Point(x, y), - Size = new Size(w, 16), - Font = new Font("Segoe UI", fs, bold ? FontStyle.Bold : FontStyle.Regular), - ForeColor = CorTexto, - AutoSize = false + BackColor = Color.White }; } - private string Fmt(string? v) => decimal.TryParse(v, out var d) ? $"R$ {d:N2}" : "R$ 0,00"; - private decimal Prx(string? v) => decimal.TryParse(v, out var d) ? d : 0m; + #endregion + + #region Eventos Visuais + + private void CardPaint(object? sender, PaintEventArgs e) + { + var pnl = sender as Panel; + + using var pen = new Pen(BorderColor); + + e.Graphics.DrawRectangle( + pen, + 0, + 0, + pnl!.Width - 1, + pnl.Height - 1); + } + + private void DrawTab(object? sender, DrawItemEventArgs e) + { + var tab = tabDetalhes.TabPages[e.Index]; + var rect = e.Bounds; + + bool selected = e.Index == tabDetalhes.SelectedIndex; + + using var back = new SolidBrush( + selected + ? AccentBlue + : Color.FromArgb(230, 233, 238)); + + using var text = new SolidBrush( + selected + ? Color.White + : TextDark); + + e.Graphics.FillRectangle(back, rect); + + var sf = new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Center + }; + + e.Graphics.DrawString( + tab.Text, + new Font("Segoe UI", 9f, FontStyle.Bold), + text, + rect, + sf); + } + + #endregion + + #region Métodos Abstratos + + protected override void OnNovo() + { + + } + + protected override void OnAlterar() + { + + } + + protected override void OnExcluir() + { + + } + + protected override void OnLocalizar() + { + + } + + protected override void OnSalvar() + { + + } + + protected override void OnCancelar() + { + + } + + #endregion } } \ No newline at end of file