private static int EscreverLinhaTitulo(Graphics g, string texto, int tamanhoFonteTitulo, int larguraLogo, int x, int y, int larguraLinha)
        {
            var adicionarTexto = new AdicionarTexto(g, texto, tamanhoFonteTitulo);
            var larguraMaximaTexto = new ComprimentoMaximo((larguraLinha - larguraLogo));
            var laguraDoTexto = adicionarTexto.Medida.Largura;
            var quebrarLinha = new DefineQuebraDeLinha(adicionarTexto, larguraMaximaTexto, laguraDoTexto);
            adicionarTexto = quebrarLinha.DesenharComQuebras(g);
            var posisaoXTexto = x + larguraLogo + (((larguraLinha - larguraLogo) - adicionarTexto.Medida.Largura) / 2);
            adicionarTexto.Desenhar(posisaoXTexto, y);
            y += adicionarTexto.Medida.Altura;

            return y;
        }
예제 #2
0
        private void GerarNfCe(Graphics graphics)
        {
            var g = graphics;

            var       larguraLogo  = 64;
            const int larguraLinha = 284;
            const int larguraLinhaMargemDireita = 277;

            var x = 3;

            _y = 3;

            if (_logo != null)
            {
                new RedimensionaImagemPara(new AdicionarImagem(g, _logo, x, _y), 50, 24).Desenhar();
            }

            if (_logo == null)
            {
                larguraLogo = 0;
            }

            #region cabeçalho
            int tamanhoFonteTitulo = 6;

            string cnpjERazaoSocial = CnpjERazaoSocial();

            _y = EscreverLinhaTitulo(g, cnpjERazaoSocial, tamanhoFonteTitulo, larguraLogo, x, _y, larguraLinha);

            string enderecoEmitente = EnderecoEmitente();

            _y = EscreverLinhaTitulo(g, enderecoEmitente, tamanhoFonteTitulo, larguraLogo, x, _y, larguraLinha);

            const string mensagemGoverno = "Documento Auxiliar Da Nota Fiscal de Consumidor Eletrônica";

            _y = EscreverLinhaTitulo(g, mensagemGoverno, tamanhoFonteTitulo, larguraLogo, x, _y, larguraLinha);

            _y += 5;
            #endregion

            #region contingência
            if (_nfe.infNFe.ide.tpEmis != TipoEmissao.teNormal)
            {
                LinhaHorizontal(g, x, _y, larguraLinha);
                _y += 2;

                _y = MensagemContingencia(g, larguraLinha, _y);
            }
            #endregion

            LinhaHorizontal(g, x, _y, larguraLinha);

            #region tabela de itens
            int iniX = x;

            CriaHeaderColuna("CÓDIGO", g, iniX, _y);
            iniX += 75;

            AdicionarTexto colunaDescricaoHeader = CriaHeaderColuna("DESCRIÇÃO", g, iniX, _y);
            iniX -= 25;
            _y   += colunaDescricaoHeader.Medida.Altura;

            CriaHeaderColuna("QTDE", g, iniX, _y);
            iniX += 25;

            CriaHeaderColuna("UN", g, iniX, _y);
            iniX += 25;

            CriaHeaderColuna("x", g, iniX, _y);
            iniX += 20;

            AdicionarTexto colunaValorUnitarioHeader = CriaHeaderColuna("VALOR UNITÁRIO", g, iniX, _y);
            iniX += 85;

            CriaHeaderColuna("=", g, iniX, _y);
            iniX += 41;

            AdicionarTexto colunaTotalHeader = CriaHeaderColuna("TOTAL", g, iniX, _y);
            _y += colunaTotalHeader.Medida.Altura + 10;

            List <det> det = _nfe.infNFe.det;

            #region preencher itens
            foreach (det detalhe in det)
            {
                AdicionarTexto codigo = new AdicionarTexto(g, detalhe.prod.cProd, 7);
                codigo.Desenhar(x, _y);

                AdicionarTexto      nome       = new AdicionarTexto(g, detalhe.prod.xProd, 7);
                DefineQuebraDeLinha quebraNome = new DefineQuebraDeLinha(nome, new ComprimentoMaximo(202), nome.Medida.Largura);
                nome = quebraNome.DesenharComQuebras(g);
                nome.Desenhar(x + 75, _y);
                _y += nome.Medida.Altura;

                AdicionarTexto quantidade    = new AdicionarTexto(g, detalhe.prod.qCom.ToString("N3"), 7);
                AdicionarTexto valorUnitario = new AdicionarTexto(g, detalhe.prod.vUnCom.ToString("N4"), 7);
                AdicionarTexto vezesX        = new AdicionarTexto(g, "x", 7);
                AdicionarTexto unidadeSigla  = new AdicionarTexto(g, detalhe.prod.uCom.Length <= 2 ? detalhe.prod.uCom : detalhe.prod.uCom.Substring(0, 2), 7);

                decimal        detalheTotal      = detalhe.prod.vProd;
                AdicionarTexto valorTotalProduto = new AdicionarTexto(g, detalheTotal.ToString("N2"), 7);

                iniX = x + 50;

                quantidade.Desenhar(iniX, _y);

                iniX += 25;

                unidadeSigla.Desenhar(iniX, _y);

                iniX += 25;

                vezesX.Desenhar(iniX, _y);

                iniX += 20;

                int tituloColunaUnidadeLargura = colunaValorUnitarioHeader.Medida.Largura;
                valorUnitario.Desenhar((iniX + tituloColunaUnidadeLargura) - valorUnitario.Medida.Largura, _y);


                iniX += 85;

                AdicionarTexto igualColuna = new AdicionarTexto(g, "=", 7);
                igualColuna.Desenhar(iniX, _y);

                iniX += 41;

                int tituloColunaTotal = colunaTotalHeader.Medida.Largura;
                valorTotalProduto.Desenhar((iniX + tituloColunaTotal) - valorTotalProduto.Medida.Largura, _y);

                _y += quantidade.Medida.Altura;

                decimal valorDescontoItem = detalhe.prod.vDesc ?? 0.0m;
                if (valorDescontoItem > 0.0m)
                {
                    AdicionarTexto descontoColuna = new AdicionarTexto(g, "Desconto", 7);
                    descontoColuna.Desenhar(x + 50, _y);

                    StringBuilder descontoItemTexto = new StringBuilder("-");
                    descontoItemTexto.Append(valorDescontoItem.ToString("N2"));
                    AdicionarTexto valorDescontoItemColuna  = new AdicionarTexto(g, descontoItemTexto.ToString(), 7);
                    int            valorDescontoItemColunaX = ((x + 246) + tituloColunaTotal) -
                                                              valorDescontoItemColuna.Medida.Largura;
                    valorDescontoItemColuna.Desenhar(valorDescontoItemColunaX, _y);

                    _y += descontoColuna.Medida.Altura;
                }

                decimal valorAcrescimoItem = detalhe.prod.vOutro ?? 0.0m;
                if (valorAcrescimoItem > 0.0m)
                {
                    AdicionarTexto acrescimoColuna = new AdicionarTexto(g, "Acréscimo", 7);
                    acrescimoColuna.Desenhar(x + 50, _y);

                    StringBuilder acrescimoItemTexto = new StringBuilder("+");
                    acrescimoItemTexto.Append(valorAcrescimoItem.ToString("N2"));
                    AdicionarTexto valorAcrescimoItemColuna  = new AdicionarTexto(g, acrescimoItemTexto.ToString(), 7);
                    int            valorAcrescimoItemColunaX = ((x + 246) + tituloColunaTotal) -
                                                               valorAcrescimoItemColuna.Medida.Largura;
                    valorAcrescimoItemColuna.Desenhar(valorAcrescimoItemColunaX, _y);

                    _y += acrescimoColuna.Medida.Altura;
                }

                if (valorDescontoItem > 0.0m || valorAcrescimoItem > 0.0m)
                {
                    AdicionarTexto valorLiquidoTexto = new AdicionarTexto(g, "Valor Líquido", 7);
                    valorLiquidoTexto.Desenhar(x + 50, _y);

                    AdicionarTexto valorLiquidoTotalTexto = new AdicionarTexto(g,
                                                                               ((detalheTotal + valorAcrescimoItem) - valorDescontoItem).ToString("N2"), 7);
                    int valorLiquidoTotalTextoX = ((x + 246) + tituloColunaTotal) -
                                                  valorLiquidoTotalTexto.Medida.Largura;
                    valorLiquidoTotalTexto.Desenhar(valorLiquidoTotalTextoX, _y);

                    _y += valorLiquidoTexto.Medida.Altura;
                }
            }
            #endregion

            #endregion

            _y += 3;

            LinhaHorizontal(g, x, _y, larguraLinha);

            #region totais
            AdicionarTexto textoQuantidadeTotalItens = new AdicionarTexto(g, "Qtde. total de itens", 7);
            textoQuantidadeTotalItens.Desenhar(x, _y);

            AdicionarTexto qtdTotalItens  = new AdicionarTexto(g, det.Count.ToString(), 7);
            int            qtdTotalItensX = (larguraLinhaMargemDireita - qtdTotalItens.Medida.Largura);
            qtdTotalItens.Desenhar(qtdTotalItensX, _y);
            _y += textoQuantidadeTotalItens.Medida.Altura;

            AdicionarTexto textoValorTotal = new AdicionarTexto(g, "Valor total R$", 7);
            textoValorTotal.Desenhar(x, _y);

            decimal        valorTotal      = det.Sum(prod => prod.prod.vProd);
            AdicionarTexto valorTotalTexto = new AdicionarTexto(g, valorTotal.ToString("N2"), 7);
            int            qtdValorTotalX  = (larguraLinhaMargemDireita - valorTotalTexto.Medida.Largura);
            valorTotalTexto.Desenhar(qtdValorTotalX, _y);
            _y += textoValorTotal.Medida.Altura;

            decimal totalDesconto    = _nfe.infNFe.total.ICMSTot.vDesc;
            decimal totalOutras      = _nfe.infNFe.total.ICMSTot.vOutro;
            decimal valorTotalAPagar = valorTotal + totalOutras - totalDesconto;

            if (totalDesconto > 0)
            {
                AdicionarTexto textoDesconto = new AdicionarTexto(g, "Desconto R$", 7);
                textoDesconto.Desenhar(x, _y);

                AdicionarTexto valorDesconto  = new AdicionarTexto(g, totalDesconto.ToString("N2"), 7);
                int            valorDescontoX = (larguraLinhaMargemDireita - valorDesconto.Medida.Largura);
                valorDesconto.Desenhar(valorDescontoX, _y);
                _y += textoDesconto.Medida.Altura;
            }
            if (totalOutras > 0)
            {
                AdicionarTexto textoOutras = new AdicionarTexto(g, "Acréscimo R$", 7);
                textoOutras.Desenhar(x, _y);

                AdicionarTexto valorAcrescimo  = new AdicionarTexto(g, totalOutras.ToString("N2"), 7);
                int            valorAcrescimoX = (larguraLinhaMargemDireita - valorAcrescimo.Medida.Largura);
                valorAcrescimo.Desenhar(valorAcrescimoX, _y);
                _y += textoOutras.Medida.Altura;
            }
            if (totalDesconto > 0 || totalOutras > 0)
            {
                AdicionarTexto textoValorAPagar = new AdicionarTexto(g, "Valor a Pagar R$", 7);
                textoValorAPagar.Desenhar(x, _y);

                AdicionarTexto valorAPagar  = new AdicionarTexto(g, valorTotalAPagar.ToString("N2"), 7);
                int            valorAPagarX = (larguraLinhaMargemDireita - valorAPagar.Medida.Largura);
                valorAPagar.Desenhar(valorAPagarX, _y);
                _y += textoValorAPagar.Medida.Altura + 2;
            }

            AdicionarTexto tituloFormaPagamento = new AdicionarTexto(g, "FORMA PAGAMENTO", 7);
            tituloFormaPagamento.Desenhar(x, _y);

            AdicionarTexto tituloValorPago  = new AdicionarTexto(g, "VALOR PAGO R$", 7);
            int            tituloValorPagoX = (larguraLinhaMargemDireita - tituloValorPago.Medida.Largura);
            tituloValorPago.Desenhar(tituloValorPagoX, _y);
            _y += tituloFormaPagamento.Medida.Altura;

            foreach (pag pag in _nfe.infNFe.pag)
            {
                // v3.1
                if (pag.tPag != null)
                {
                    AdicionaFormaPagamento(x, larguraLinhaMargemDireita, g, pag.tPag, pag.vPag);
                }

                // v4.0
                if (pag.detPag != null)
                {
                    foreach (var detPag in pag.detPag)
                    {
                        AdicionaFormaPagamento(x, larguraLinhaMargemDireita, g, detPag.tPag, detPag.vPag);
                    }
                }
            }

            _y += 2;

            if (_troco > 0)
            {
                AdicionarTexto textoTroco = new AdicionarTexto(g, "Troco R$ (TOTAL PAGO R$" + _totalPago.ToString("N2") + ")", 7);
                textoTroco.Desenhar(x, _y);

                AdicionarTexto textoTrocoValor  = new AdicionarTexto(g, _troco.ToString("N2"), 7);
                int            textoTrocoValorX = (larguraLinhaMargemDireita - textoTrocoValor.Medida.Largura);
                textoTrocoValor.Desenhar(textoTrocoValorX, _y);
                _y += textoTroco.Medida.Altura;
            }
            #endregion

            _y += 5;

            LinhaHorizontal(g, x, _y, larguraLinha);

            #region consulta QrCode
            AdicionarTexto textoConsulteChave  = new AdicionarTexto(g, "Consulte pela Chave de Acesso em", 7);
            int            textoConsulteChaveX = ((larguraLinha - textoConsulteChave.Medida.Largura) / 2);
            textoConsulteChave.Desenhar(textoConsulteChaveX, _y);

            _y += textoConsulteChave.Medida.Altura;

            AdicionarTexto urlConsulta = new AdicionarTexto(g,
                                                            string.IsNullOrEmpty(_nfe.infNFeSupl.urlChave) ? _nfe.infNFeSupl.ObterUrlConsulta(_nfe, _configuracaoDanfeNfce.VersaoQrCode) : _nfe.infNFeSupl.urlChave, 7);
            int urlConsultaX = ((larguraLinha - urlConsulta.Medida.Largura) / 2);
            urlConsulta.Desenhar(urlConsultaX, _y);

            _y += urlConsulta.Medida.Altura;

            string novaChave = GeraChaveAcesso(_nfe);

            AdicionarTexto chave     = new AdicionarTexto(g, novaChave, 7);
            int            urlChaveX = ((larguraLinha - chave.Medida.Largura) / 2);
            chave.Desenhar(urlChaveX, _y);

            _y += chave.Medida.Altura;
            _y += 10;
            #endregion


            var mensagemConsumidor = MontaMensagemConsumidor(_nfe.infNFe.dest);

            var consumidor            = new AdicionarTexto(g, mensagemConsumidor, 9);
            var quebraLinhaConsumidor = new DefineQuebraDeLinha(
                consumidor,
                new ComprimentoMaximo(larguraLinhaMargemDireita),
                consumidor.Medida.Largura);

            consumidor = quebraLinhaConsumidor.DesenharComQuebras(g);
            var consumidorX = (larguraLinha - consumidor.Medida.Largura) / 2;
            consumidor.Desenhar(consumidorX, _y);

            _y += consumidor.Medida.Altura + 10;

            var mensagemDadosNfCe = MontaMensagemDadosNfce(_nfe);

            var dadosNfce  = new AdicionarTexto(g, mensagemDadosNfCe, 7);
            var dadosNfceX = (larguraLinha - dadosNfce.Medida.Largura) / 2;
            dadosNfce.Desenhar(dadosNfceX, _y);

            _y += dadosNfce.Medida.Altura;

            if (_nfe.infNFe.ide.tpEmis == TipoEmissao.teNormal)
            {
                var textoProtocoloAutorizacao = new StringBuilder("Protocolo de autorização: ");
                textoProtocoloAutorizacao.Append(_proc.protNFe.infProt.nProt);
                var protocoloAutorizacao  = new AdicionarTexto(g, textoProtocoloAutorizacao.ToString(), 7);
                int protocoloAutorizacaoX = (larguraLinha - protocoloAutorizacao.Medida.Largura) / 2;
                protocoloAutorizacao.Desenhar(protocoloAutorizacaoX, _y);
                _y += protocoloAutorizacao.Medida.Altura;


                var textoDataAutorizacao = new StringBuilder("Data de autorização ");
                textoDataAutorizacao.Append(_proc.protNFe.infProt.dhRecbto.ToString("G"));
                var dataAutorizacao  = new AdicionarTexto(g, textoDataAutorizacao.ToString(), 7);
                int dataAutorizacaoX = (larguraLinha - dataAutorizacao.Medida.Largura) / 2;
                dataAutorizacao.Desenhar(dataAutorizacaoX, _y);
                _y += dataAutorizacao.Medida.Altura;
            }

            if (_nfe.infNFe.ide.tpEmis != TipoEmissao.teNormal)
            {
                _y += 10;
                _y  = MensagemContingencia(g, larguraLinha, _y);
            }

            _y += 8;

            var urlQrCode = ObtemUrlQrCode(_nfe, _cIdToken, _csc);

            var qrCodeImagem   = QrCode.Gerar(urlQrCode);
            var qrCodeImagemX  = (larguraLinha - qrCodeImagem.Size.Width) / 2;
            var desenharQrCode = new AdicionarImagem(g, qrCodeImagem, qrCodeImagemX, _y);
            desenharQrCode.Desenhar();

            _y += qrCodeImagem.Size.Height + 10;

            LinhaHorizontal(g, x, _y, larguraLinha);

            _y += 5;

            var tributosIncidentes = _nfe.infNFe.total.ICMSTot.vTotTrib;

            if (tributosIncidentes != 0)
            {
                StringBuilder mensagemTributosTotais =
                    new StringBuilder("Tributos Totais Incidentes (Lei Federal 12.741/2012): R$");
                mensagemTributosTotais.Append(tributosIncidentes.ToString("N2"));

                AdicionarTexto tributosTotais  = new AdicionarTexto(g, mensagemTributosTotais.ToString(), 7);
                int            tributosTotaisX = (larguraLinha - tributosTotais.Medida.Largura) / 2;
                tributosTotais.Desenhar(tributosTotaisX, _y);

                _y += tributosTotais.Medida.Altura;

                _y += 5;

                LinhaHorizontal(g, x, _y, larguraLinha);
            }


            string observacoes = string.Empty;

            if (_nfe != null)
            {
                if (_nfe.infNFe != null)
                {
                    if (_nfe.infNFe.infAdic != null)
                    {
                        observacoes = _nfe.infNFe.infAdic.infCpl;
                    }
                }
            }

            if (!string.IsNullOrEmpty(observacoes))
            {
                _y += 5;
                var observacao       = new AdicionarTexto(g, observacoes, 7);
                var quebraObservacao = new DefineQuebraDeLinha(observacao,
                                                               new ComprimentoMaximo(larguraLinhaMargemDireita), observacao.Medida.Largura);
                observacao = quebraObservacao.DesenharComQuebras(g);
                observacao.Desenhar(x, _y);

                _y += observacao.Medida.Altura;
            }
        }