using CPM; using MLL; using System; using System.Drawing; using System.Windows.Forms; namespace UI.Dashboards.Fiscal { public class SatFiscalConsumidorItensPanel : FormularioModelo { // Aplicação de (?) para sanar os avisos de campos não nulos ao sair do construtor (NRT net8.0) private TabControl? tabItens; // --- ABA 1: DADOS GERAIS DO PRODUTO --- private LV_TEXTBOX1? txtIdSatFiscalConsItens, txtCodigo, txtCodNfce, txtItemTipo, txtItemCean, txtItemCprod, txtItemXprod, txtItemInfAdic, txtDataCadastro; // --- ABA 2: QUANTIDADES, VALORES E COMERCIAL --- private LV_TEXTBOX1? txtItemCfop, txtItemNcm, txtItemUncom, txtItemQcom, txtItemVprod, txtItemVoutro, txtItemVfrete, txtItemVseg, txtItemVdesc, txtItemVTotTrib, txtItemCest, txtCProdAnp, txtCBenef; // --- ABA 3: ICMS (NORMAL E ST) --- private LV_TEXTBOX1? txtItemOrigem, txtItemCst, txtItemIcmsModBc, txtItemIcmsPRedBc, txtItemIcmsVBc, txtItemIcmsPIcms, txtItemIcmsVIcms, txtItemIcmsVIcmsDeson, txtItemIcmsMotDesIcms, txtItemIcmsModBcSt, txtItemIcmsPMvast, txtItemIcmsPRedBcSt, txtItemIcmsVBcSt, txtItemIcmsPIcmsSt, txtItemIcmsVIcmsSt; // --- ABA 4: FCP (FUNDO DE COMBATE À POBREZA) --- private LV_TEXTBOX1? txtItemPFcp, txtItemVFcp, txtItemVBcFcp, txtItemVBcFcpSt, txtItemPFcpSt, txtItemVFcpSt, txtItemPSt, txtItemVBcFcpStRet, txtItemPFcpStRet, txtItemVFcpStRet; // --- ABA 5: PIS, COFINS E EFETIVOS --- private LV_TEXTBOX1? txtItemPisCst, txtItemPisVBc, txtItemPisPPis, txtItemPisVPis, txtItemCofinsCst, txtItemCofinsVBc, txtItemCofinsPCofins, txtItemCofinsVCofins, txtVIcmsSubstituto, txtPRedBcEfet, txtVBcEfet, txtPIcmsEfet, txtVIcmsEfet; public SatFiscalConsumidorItensPanel() { this.Titulo = "DETALHAMENTO DE ITENS DO CUPOM FISCAL"; MontarInterfaceCompleta(); } private void MontarInterfaceCompleta() { tabItens = new TabControl { Location = new Point(10, 10), Size = new Size(1060, 520), Font = new Font("Segoe UI", 9.5f) }; var tpGeral = new TabPage("Dados do Produto"); var tpComercial = new TabPage("Valores e Códigos"); var tpIcms = new TabPage("ICMS Normal / ST"); var tpFcp = new TabPage("FCP"); var tpPisCofins = new TabPage("PIS / COFINS / Efetivos"); // Simplificação da inicialização de coleção aceita pelo compilador moderno tabItens.TabPages.AddRange([tpGeral, tpComercial, tpIcms, tpFcp, tpPisCofins]); content.Controls.Add(tabItens); ConfigurarAbaGeral(tpGeral); ConfigurarAbaComercial(tpComercial); ConfigurarAbaIcms(tpIcms); ConfigurarAbaFcp(tpFcp); ConfigurarAbaPisCofins(tpPisCofins); } private void ConfigurarAbaGeral(TabPage tp) { tp.Controls.Add(CreateSectionHeader("Identificação e Chaves do Item", 15)); txtIdSatFiscalConsItens = AddInput(tp, "ID ITEM REG.", 20, 50, 100, 28, true); txtCodigo = AddInput(tp, "CÓDIGO INT.", 135, 50, 110, 28); txtCodNfce = AddInput(tp, "CÓD. VÍNCULO NFC-E", 260, 50, 150, 28); txtItemTipo = AddInput(tp, "TIPO ITEM", 425, 50, 120, 28); txtDataCadastro = AddInput(tp, "DATA CADASTRO", 560, 50, 180, 28, true); tp.Controls.Add(CreateSectionHeader("Especificações do Produto", 120)); txtItemCprod = AddInput(tp, "CÓD. COMERCIAL DO PRODUTO", 20, 155, 200, 28); txtItemCean = AddInput(tp, "CÓDIGO EAN (CÓD. BARRAS)", 235, 155, 220, 28); txtItemXprod = AddInput(tp, "DESCRIÇÃO DO PRODUTO / SERVIÇO", 20, 215, 600, 28); txtItemInfAdic = AddInput(tp, "INFORMAÇÕES ADICIONAIS DO ITEM", 20, 275, 600, 28); } private void ConfigurarAbaComercial(TabPage tp) { tp.Controls.Add(CreateSectionHeader("Classificações Fiscais Obrigatórias", 15)); txtItemCfop = AddInput(tp, "CFOP", 20, 50, 90, 28); txtItemNcm = AddInput(tp, "NCM", 125, 50, 120, 28); txtItemCest = AddInput(tp, "CEST", 260, 50, 120, 28); txtCProdAnp = AddInput(tp, "CÓD. ANP (COMBUSTÍVEIS)", 395, 50, 180, 28); txtCBenef = AddInput(tp, "BENEFÍCIO FISCAL (CBENEF)", 590, 50, 180, 28); tp.Controls.Add(CreateSectionHeader("Valores Comerciais, Quantidades e Rateios", 120)); txtItemUncom = AddInput(tp, "UNIDADE MEDIDA", 20, 155, 100, 28); txtItemQcom = AddInput(tp, "QUANTIDADE COMERCIAL", 135, 155, 140, 28); txtItemVprod = AddInput(tp, "VALOR BRUTO PROD. (R$)", 290, 155, 150, 28); txtItemVdesc = AddInput(tp, "VALOR DESCONTO (R$)", 455, 155, 140, 28); txtItemVfrete = AddInput(tp, "RATEIO FRETE (R$)", 20, 215, 140, 28); txtItemVseg = AddInput(tp, "RATEIO SEGURO (R$)", 175, 215, 140, 28); txtItemVoutro = AddInput(tp, "OUTRAS DESPESAS (R$)", 330, 215, 150, 28); txtItemVTotTrib = AddInput(tp, "VALOR APROX. TRIBUTOS", 495, 215, 160, 28); } private void ConfigurarAbaIcms(TabPage tp) { tp.Controls.Add(CreateSectionHeader("ICMS Regra Geral e Base de Cálculo", 15)); txtItemOrigem = AddInput(tp, "ORIGEM PROD.", 20, 50, 100, 28); txtItemCst = AddInput(tp, "CST / CSOSN", 135, 50, 100, 28); txtItemIcmsModBc = AddInput(tp, "MODALIDADE BC ICMS", 250, 50, 150, 28); txtItemIcmsPRedBc = AddInput(tp, "% REDUÇÃO BC", 415, 50, 120, 28); txtItemIcmsVBc = AddInput(tp, "VALOR BC ICMS", 550, 50, 130, 28); txtItemIcmsPIcms = AddInput(tp, "ALÍQUOTA ICMS", 695, 50, 120, 28); txtItemIcmsVIcms = AddInput(tp, "VALOR ICMS", 830, 50, 130, 28); tp.Controls.Add(CreateSectionHeader("ICMS Desonerado e Regras de Substituição Tributária (ST)", 120)); txtItemIcmsVIcmsDeson = AddInput(tp, "VALOR ICMS DESON.", 20, 155, 150, 28); txtItemIcmsMotDesIcms = AddInput(tp, "MOTIVO DESON.", 185, 155, 140, 28); // Corrigido a inconsistência de caixa alta/baixa txtItemIcmsModBcSt = AddInput(tp, "MODALIDADE BC ST", 340, 155, 140, 28); txtItemIcmsPMvast = AddInput(tp, "% MVA ST", 495, 155, 110, 28); txtItemIcmsPRedBcSt = AddInput(tp, "% REDUÇÃO BC ST", 620, 155, 130, 28); txtItemIcmsVBcSt = AddInput(tp, "VALOR BASE CÁLCULO ST", 20, 215, 170, 28); txtItemIcmsPIcmsSt = AddInput(tp, "ALÍQUOTA ICMS ST", 205, 215, 140, 28); txtItemIcmsVIcmsSt = AddInput(tp, "VALOR DO ICMS ST", 360, 215, 150, 28); } private void ConfigurarAbaFcp(TabPage tp) { tp.Controls.Add(CreateSectionHeader("Fundo de Combate à Pobreza - ICMS Normal e ST", 15)); txtItemVBcFcp = AddInput(tp, "VALOR BC FCP", 20, 50, 130, 28); txtItemPFcp = AddInput(tp, "% ALÍQUOTA FCP", 165, 50, 130, 28); txtItemVFcp = AddInput(tp, "VALOR DO FCP", 310, 50, 130, 28); txtItemVBcFcpSt = AddInput(tp, "VALOR BC FCP ST", 455, 50, 140, 28); txtItemPFcpSt = AddInput(tp, "% ALÍQUOTA FCP ST", 610, 50, 140, 28); txtItemVFcpSt = AddInput(tp, "VALOR DO FCP ST", 765, 50, 140, 28); tp.Controls.Add(CreateSectionHeader("Fundo de Combate à Pobreza Retido Anteriormente", 120)); txtItemPSt = AddInput(tp, "% ALÍQUOTA ICMS ST RET.", 20, 155, 180, 28); txtItemVBcFcpStRet = AddInput(tp, "VALOR BC FCP ST RET.", 215, 155, 160, 28); txtItemPFcpStRet = AddInput(tp, "% ALÍQUOTA FCP ST RET.", 390, 155, 170, 28); txtItemVFcpStRet = AddInput(tp, "VALOR DO FCP ST RET.", 575, 155, 160, 28); // Corrigido nomenclatura para bater com a propriedade da classe } private void ConfigurarAbaPisCofins(TabPage tp) { tp.Controls.Add(CreateSectionHeader("Contribuições para o PIS", 15)); txtItemPisCst = AddInput(tp, "CST PIS", 20, 50, 100, 28); txtItemPisVBc = AddInput(tp, "VALOR BC PIS", 135, 50, 130, 28); txtItemPisPPis = AddInput(tp, "% ALÍQUOTA PIS", 280, 50, 120, 28); txtItemPisVPis = AddInput(tp, "VALOR DO PIS", 415, 50, 130, 28); tp.Controls.Add(CreateSectionHeader("Contribuições para a COFINS", 120)); txtItemCofinsCst = AddInput(tp, "CST COFINS", 20, 155, 100, 28); txtItemCofinsVBc = AddInput(tp, "VALOR BC COFINS", 135, 155, 130, 28); txtItemCofinsPCofins = AddInput(tp, "% ALÍQUOTA COFINS", 280, 155, 140, 28); txtItemCofinsVCofins = AddInput(tp, "VALOR DO COFINS", 435, 155, 140, 28); tp.Controls.Add(CreateSectionHeader("Indicadores de Valores Fiscais Efetivos", 225)); txtVIcmsSubstituto = AddInput(tp, "VALOR ICMS SUBST.", 20, 260, 150, 28); txtPRedBcEfet = AddInput(tp, "% REDUÇÃO BC EFET.", 185, 260, 150, 28); txtVBcEfet = AddInput(tp, "VALOR BC EFETIVA", 350, 260, 140, 28); txtPIcmsEfet = AddInput(tp, "% ALÍQUOTA ICMS EFET.", 505, 260, 160, 28); txtVIcmsEfet = AddInput(tp, "VALOR ICMS EFETIVO", 680, 260, 150, 28); } // --- MÉTODOS OBRIGATÓRIOS DO FORMULÁRIO MODELO --- protected override void OnNovo() { // Substituição por função local (atende à sugestão do analisador C# moderno) void LimparRecursivo(Control.ControlCollection controls) { foreach (Control c in controls) { if (c is LV_TEXTBOX1 txt && !txt.ReadOnly) txt.Text = string.Empty; if (c.HasChildren) LimparRecursivo(c.Controls); } } if (tabItens != null) { LimparRecursivo(tabItens.Controls); tabItens.SelectedIndex = 0; } if (txtIdSatFiscalConsItens != null) txtIdSatFiscalConsItens.Text = "0"; if (txtDataCadastro != null) txtDataCadastro.Text = DateTime.Now.ToString("g"); txtItemCprod?.Focus(); } protected override void OnSalvar() { // Proteção nula com operador condicional para checagem segura if (string.IsNullOrWhiteSpace(txtItemCprod?.Text)) { MessageBox.Show("O código comercial do produto é obrigatório.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning); if (tabItens != null) tabItens.SelectedIndex = 0; txtItemCprod?.Focus(); return; } // Mapeamento usando Operador de Coalescência Nula (??) para garantir strings limpas var item = new ModeloSatFiscalConsumidorItens { ID_SAT_FISCAL_CONS_ITENS = string.IsNullOrEmpty(txtIdSatFiscalConsItens?.Text) ? 0 : Convert.ToInt32(txtIdSatFiscalConsItens.Text), CODIGO = txtCodigo?.Text ?? string.Empty, COD_NFCE = txtCodNfce?.Text ?? string.Empty, ITEM_TIPO = txtItemTipo?.Text ?? string.Empty, ITEM_CEAN = txtItemCean?.Text ?? string.Empty, ITEM_CPROD = txtItemCprod.Text, ITEM_XPROD = txtItemXprod?.Text ?? string.Empty, ITEM_INF_ADIC = txtItemInfAdic?.Text ?? string.Empty, ITEM_CFOP = txtItemCfop?.Text ?? string.Empty, ITEM_NCM = txtItemNcm?.Text ?? string.Empty, ITEM_UNCOM = txtItemUncom?.Text ?? string.Empty, ITEM_QCOM = txtItemQcom?.Text ?? string.Empty, ITEM_VPROD = txtItemVprod?.Text ?? string.Empty, ITEM_VOUTRO = txtItemVoutro?.Text ?? string.Empty, ITEM_VFRETE = txtItemVfrete?.Text ?? string.Empty, ITEM_VSEG = txtItemVseg?.Text ?? string.Empty, ITEM_VDESC = txtItemVdesc?.Text ?? string.Empty, ITEM_vTotTrib = txtItemVTotTrib?.Text ?? string.Empty, ITEM_ORIGEM = txtItemOrigem?.Text ?? string.Empty, ITEM_CST = txtItemCst?.Text ?? string.Empty, DATA_CADASTRO = txtDataCadastro?.Text ?? string.Empty, ITEM_ICMS_modBC = txtItemIcmsModBc?.Text ?? string.Empty, ITEM_ICMS_pRedBC = txtItemIcmsPRedBc?.Text ?? string.Empty, ITEM_ICMS_vBC = txtItemIcmsVBc?.Text ?? string.Empty, ITEM_ICMS_pICMS = txtItemIcmsPIcms?.Text ?? string.Empty, ITEM_ICMS_vICMS = txtItemIcmsVIcms?.Text ?? string.Empty, ITEM_ICMS_vICMSDeson = txtItemIcmsVIcmsDeson?.Text ?? string.Empty, ITEM_ICMS_motDesICMS = txtItemIcmsMotDesIcms?.Text ?? string.Empty, ITEM_ICMS_modBCST = txtItemIcmsModBcSt?.Text ?? string.Empty, ITEM_ICMS_pMVAST = txtItemIcmsPMvast?.Text ?? string.Empty, ITEM_ICMS_pRedBCST = txtItemIcmsPRedBcSt?.Text ?? string.Empty, ITEM_ICMS_vBCST = txtItemIcmsVBcSt?.Text ?? string.Empty, ITEM_ICMS_pICMSST = txtItemIcmsPIcmsSt?.Text ?? string.Empty, ITEM_ICMS_vICMSST = txtItemIcmsVIcmsSt?.Text ?? string.Empty, ITEM_cProdANP = txtCProdAnp?.Text ?? string.Empty, ITEM_CEST = txtItemCest?.Text ?? string.Empty, CBenef = txtCBenef?.Text ?? string.Empty, ITEM_pFCP = txtItemPFcp?.Text ?? string.Empty, ITEM_vFCP = txtItemVFcp?.Text ?? string.Empty, ITEM_vBCFCP = txtItemVBcFcp?.Text ?? string.Empty, ITEM_vBCFCPST = txtItemVBcFcpSt?.Text ?? string.Empty, ITEM_pFCPST = txtItemPFcpSt?.Text ?? string.Empty, ITEM_vFCPST = txtItemVFcpSt?.Text ?? string.Empty, ITEM_pST = txtItemPSt?.Text ?? string.Empty, ITEM_vBCFCPSTRet = txtItemVBcFcpStRet?.Text ?? string.Empty, ITEM_pFCPSTRet = txtItemPFcpStRet?.Text ?? string.Empty, ITEM_vFCPSTRet = txtItemVFcpStRet?.Text ?? string.Empty, ITEM_PIS_CST = txtItemPisCst?.Text ?? string.Empty, ITEM_PIS_vBC = txtItemPisVBc?.Text ?? string.Empty, ITEM_PIS_pPIS = txtItemPisPPis?.Text ?? string.Empty, ITEM_PIS_vPIS = txtItemPisVPis?.Text ?? string.Empty, ITEM_COFINS_CST = txtItemCofinsCst?.Text ?? string.Empty, ITEM_COFINS_vBC = txtItemCofinsVBc?.Text ?? string.Empty, ITEM_COFINS_pCOFINS = txtItemCofinsPCofins?.Text ?? string.Empty, ITEM_COFINS_vCOFINS = txtItemCofinsVCofins?.Text ?? string.Empty, VICMSSubstituto = txtVIcmsSubstituto?.Text ?? string.Empty, PRedBCEfet = txtPRedBcEfet?.Text ?? string.Empty, VBCEfet = txtVBcEfet?.Text ?? string.Empty, PICMSEfet = txtPIcmsEfet?.Text ?? string.Empty, VICMSEfet = txtVIcmsEfet?.Text ?? string.Empty }; // Processa o objeto preenchido nas camadas inferiores MessageBox.Show($"Item {item.ITEM_CPROD} gravado com sucesso!", "LevelOS", MessageBoxButtons.OK, MessageBoxIcon.Information); } protected override void OnAlterar() { txtItemXprod?.Focus(); } protected override void OnExcluir() { if (MessageBox.Show("Confirma a exclusão deste item?", "LevelOS", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) { OnNovo(); } } protected override void OnLocalizar() { // Vinculado à Grid de busca global } protected override void OnCancelar() { OnNovo(); } } }