diff --git a/NFe.Danfe.QuestPdf/Fontes/Arial.ttf b/NFe.Danfe.QuestPdf/Fontes/Arial.ttf new file mode 100644 index 000000000..7ff88f228 Binary files /dev/null and b/NFe.Danfe.QuestPdf/Fontes/Arial.ttf differ diff --git a/NFe.Danfe.QuestPdf/ImpressaoEventoNfe/EventoNfeDocument.cs b/NFe.Danfe.QuestPdf/ImpressaoEventoNfe/EventoNfeDocument.cs new file mode 100644 index 000000000..82103edb5 --- /dev/null +++ b/NFe.Danfe.QuestPdf/ImpressaoEventoNfe/EventoNfeDocument.cs @@ -0,0 +1,654 @@ +using System.Text; +using System.Text.RegularExpressions; +using BarcodeStandard; +using DFe.Utils; +using NFe.Classes; +using NFe.Classes.Servicos.Consulta; +using QuestPDF.Fluent; +using QuestPDF.Helpers; +using QuestPDF.Infrastructure; + +namespace NFe.Danfe.QuestPdf.ImpressaoEventoNfe; + +public class EventoNfeDocument : IDocument +{ + private nfeProc _nfeProc; + private NFe.Classes.NFe _nfe; + private procEventoNFe _procEventoNFe; + private readonly byte[]? _logo; + private static string _fontFamily = "Times New Roman"; + + public EventoNfeDocument(string xmlNfe, string xmlCce, byte[]? logo) + { + _logo = logo; + CarregarXmlNfe(xmlNfe); + CarregarXmlCce(xmlCce); + } + + public void Compose(IDocumentContainer container) + { + container + .Page(page => + { + page.Size(PageSizes.A4); + page.Margin(20); + + page.Header().Element(Cabecalho); + + page.Content().Element(Conteudo); + + page.Footer().Element(Rodape); + }); + } + + private void Cabecalho(IContainer container) + { + container.Column(column => + { + column.Item().Border(0.5f).Row(x => + { + x.RelativeItem().Column(c => + { + c.Item().AlignCenter().Text(_procEventoNFe.evento.infEvento.detEvento.descEvento).FontSize(14).FontFamily(_fontFamily).Bold(); + c.Item().AlignCenter().Text("Não possui valor fiscal. Simples representação do evento indicado abaixo.\r\nCONSULTE A AUTENTICIDADE NO SITE DA SEFAZ AUTORIZADORA").FontSize(10).FontFamily(_fontFamily); + }); + }); + + column.Item().PaddingTop(10); + + column.Item().Row(x => + { + x.RelativeItem().Column(c => + { + c.Item().AlignLeft().Text("NOTA FISCAL ELETRÔNICA - NF-e").FontSize(10).FontFamily(_fontFamily) + .Bold(); + }); + }); + + column.Item().Border(0.5f).Row(x => + { + x.RelativeItem().Table(t => + { + t.ColumnsDefinition(cd => + { + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + }); + + + t.Cell().Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("MODELO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text(_nfe.infNFe.ide.mod).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("SÉRIE").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text(_nfe.infNFe.ide.serie.ToString("D3")).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(2).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("NÚMERO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text(_nfe.infNFe.ide.nNF.ToString("D9")).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(2).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("MÊS/ANO DA EMISSÃO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text(_nfe.infNFe.ide.dhEmi.ToString("MM/yyyy")).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + var b = new Barcode(); + + b.Encode(BarcodeStandard.Type.Code128, _nfe.infNFe.Id.Substring(3), 300, 30); + + t.Cell().ColumnSpan(6).RowSpan(2).Border(0.5f).Padding(5).Image(b.GetImageData(SaveTypes.Png)); + + t.Cell().ColumnSpan(6).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("CHAVE DE ACESSO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text(_nfe.infNFe.Id.Substring(3)).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + }); + }); + + column.Item().PaddingTop(10); + + column.Item().Row(x => + { + x.RelativeItem().Column(c => + { + c.Item().AlignLeft().Text("CARTA DE CORREÇÃO ELETRÔNICA").FontSize(10).FontFamily(_fontFamily) + .Bold(); + }); + }); + + column.Item().Border(0.5f).Row(x => + { + x.RelativeItem().Table(t => + { + t.ColumnsDefinition(cd => + { + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + }); + + + t.Cell().Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("ÓRGÃO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text(_procEventoNFe.evento.infEvento.cOrgao).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(9).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("AMBIENTE").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_procEventoNFe.evento.infEvento.tpAmb).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(2).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("DATA E HORÁRIO DO EVENTO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text(_procEventoNFe.evento.infEvento.dhEvento.ToString("G")).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(2).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("EVENTO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text(_procEventoNFe.evento.infEvento.tpEvento).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(6).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("DESCRIÇÃO DO EVENTO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_procEventoNFe.evento.infEvento.detEvento.descEvento).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(2).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("SEQUÊNCIA DO EVENTO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignRight().AlignTop().PaddingRight(2).Text(_procEventoNFe.evento.infEvento.nSeqEvento).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(2).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("VERSÃO DO EVENTO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignRight().AlignTop().PaddingRight(2).Text(_procEventoNFe.evento.infEvento.verEvento).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(6).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("STATUS").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text($"{_procEventoNFe.retEvento.infEvento.cStat} - {_procEventoNFe.retEvento.infEvento.xMotivo}").FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(3).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("PROTOCOLO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text($"{_procEventoNFe.retEvento.infEvento.nProt}").FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(3).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("DATA E HORÁRIO DO REGISTRO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text($"{_procEventoNFe.retEvento.infEvento.dhRegEvento:G}").FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + }); + }); + }); + } + + private void Conteudo(IContainer container) + { + container.Column(column => + { + column.Item().PaddingTop(10); + + column.Item().Row(x => + { + x.RelativeItem().Column(c => + { + c.Item().AlignLeft().Text("EMITENTE").FontSize(10).FontFamily(_fontFamily) + .Bold(); + }); + }); + + column.Item().Border(0.5f).Row(x => + { + x.RelativeItem().Table(t => + { + t.ColumnsDefinition(cd => + { + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + }); + + + t.Cell().ColumnSpan(9).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("NOME / RAZÃO SOCIAL").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.emit.xNome).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(3).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("CNPJ / CPF").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.emit.CNPJ ?? _nfe.infNFe.emit.CPF).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(6).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("ENDEREÇO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text($"{_nfe.infNFe.emit.enderEmit.xLgr} {_nfe.infNFe.emit.enderEmit.nro} {_nfe.infNFe.emit.enderEmit.xCpl}").FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(4).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("BAIRRO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.emit.enderEmit.xBairro).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(2).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("CEP").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.emit.enderEmit.CEP).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(5).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("MUNICÍPIO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.emit.enderEmit.xMun).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("ESTADO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text(_nfe.infNFe.emit.enderEmit.UF).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(3).Column(tx => + { + var temTelefone = _nfe.infNFe.emit.enderEmit.fone.HasValue; + + tx.Item().Border(temTelefone ? 0.5f : 0).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("FONE / FAX").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.emit.enderEmit.fone).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(3).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("INSCRIÇÃO ESTADUAL").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.emit.IE).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + }); + }); + + column.Item().PaddingTop(10); + + column.Item().Row(x => + { + x.RelativeItem().Column(c => + { + c.Item().AlignLeft().Text("DESTINATÁRIO / REMETENTE").FontSize(10).FontFamily(_fontFamily) + .Bold(); + }); + }); + + column.Item().Border(0.5f).Row(x => + { + x.RelativeItem().Table(t => + { + t.ColumnsDefinition(cd => + { + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + }); + + + t.Cell().ColumnSpan(9).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("NOME / RAZÃO SOCIAL").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.dest.xNome).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(3).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("CNPJ / CPF").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.dest.CNPJ ?? _nfe.infNFe.dest.CPF).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(6).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("ENDEREÇO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text($"{_nfe.infNFe.dest.enderDest.xLgr} {_nfe.infNFe.dest.enderDest.nro} {_nfe.infNFe.dest.enderDest.xCpl}").FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(4).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("BAIRRO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.dest.enderDest.xBairro).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(2).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("CEP").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.dest.enderDest.CEP).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(5).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("MUNICÍPIO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.dest.enderDest.xMun).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("ESTADO").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignCenter().AlignTop().Text(_nfe.infNFe.dest.enderDest.UF).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(3).Column(tx => + { + var temTelefone = _nfe.infNFe.dest.enderDest.fone.HasValue; + + tx.Item().Border(temTelefone ? 0.5f : 0).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("FONE / FAX").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.dest.enderDest.fone).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + + t.Cell().ColumnSpan(3).Column(tx => + { + tx.Item().Border(0.5f).Column(txc => + { + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text("INSCRIÇÃO ESTADUAL").FontSize(5).FontFamily(_fontFamily); + txc.Item().AlignLeft().AlignTop().PaddingLeft(2).Text(_nfe.infNFe.dest.IE).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + }); + }); + + column.Item().PaddingTop(10); + + column.Item().Row(x => + { + x.RelativeItem().Column(c => + { + c.Item().AlignLeft().Text("CONDIÇÕES DE USO").FontSize(10).FontFamily(_fontFamily) + .Bold(); + }); + }); + + column.Item().Border(0.5f).Row(x => + { + x.RelativeItem().Table(t => + { + t.ColumnsDefinition(cd => + { + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + }); + + + t.Cell().RowSpan(8).ColumnSpan(12).Column(tx => + { + tx.Item().Border(0.5f).PaddingLeft(2).Text(Regex.Replace(_procEventoNFe.evento.infEvento.detEvento.xCondUso.Replace("\r", string.Empty).Replace("\n", ""), @"\s+", " ")).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + }); + + column.Item().PaddingTop(10); + + column.Item().Row(x => + { + x.RelativeItem().Column(c => + { + c.Item().AlignLeft().Text(_procEventoNFe.evento.infEvento.detEvento.descEvento).FontSize(10).FontFamily(_fontFamily) + .Bold(); + }); + }); + + column.Item().Border(0.5f).Row(x => + { + x.RelativeItem().Table(t => + { + t.ColumnsDefinition(cd => + { + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + cd.RelativeColumn(); + }); + + + t.Cell().RowSpan(8).ColumnSpan(12).Column(tx => + { + var texto = new StringBuilder(); + + if (_procEventoNFe.evento.infEvento.detEvento.xJust != null) + { + texto.Append(Regex.Replace( + _procEventoNFe.evento.infEvento.detEvento.xJust.Replace("\r", string.Empty) + .Replace("\n", ""), @"\s+", " ")); + + texto.Append("\n"); + } + + if (_procEventoNFe.evento.infEvento.detEvento.xCorrecao != null) + { + texto.Append(Regex.Replace( + _procEventoNFe.evento.infEvento.detEvento.xCorrecao.Replace("\r", string.Empty) + .Replace("\n", ""), @"\s+", " ")); + } + + tx.Item().Border(0.5f).PaddingLeft(2).Text(texto).FontSize(9).FontFamily(_fontFamily).Bold(); + }); + }); + }); + }); + } + + private void Rodape(IContainer container) + { + container.Column(column => + { + column.Item().Border(0.5f).Row(x => + { + x.RelativeItem().Column(c => + { + c.Item().AlignLeft().Text($"Data e hora da impressão {DateTime.UtcNow:G}").FontSize(6).FontFamily(_fontFamily); + }); + }); + }); + } + + public DocumentMetadata GetMetadata() => DocumentMetadata.Default; + + private void CarregarXmlNfe(string xmlNfe) + { + try + { + _nfeProc = FuncoesXml.XmlStringParaClasse(xmlNfe); + _nfe = _nfeProc.NFe; + } + catch (Exception) + { + try + { + NFe.Classes.NFe nfe = FuncoesXml.XmlStringParaClasse(xmlNfe); + _nfe = nfe; + } + catch (Exception) + { + throw new ArgumentException( + "Ei! Verifique se seu xml da NF-e ou NF-e Proc não está correto, pois identificamos uma falha ao tentar carregar ele."); + } + } + } + + private void CarregarXmlCce(string xmlCce) + { + try + { + _procEventoNFe = FuncoesXml.XmlStringParaClasse(xmlCce); + } + catch (Exception) + { + throw new ArgumentException( + "Ei! Verifique se seu xml da Carta Correção não está correto, pois identificamos uma falha ao tentar carregar ele."); + } + } +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/ImpressaoNfce/DanfeNfceDocument.cs b/NFe.Danfe.QuestPdf/ImpressaoNfce/DanfeNfceDocument.cs new file mode 100644 index 000000000..d4f24c973 --- /dev/null +++ b/NFe.Danfe.QuestPdf/ImpressaoNfce/DanfeNfceDocument.cs @@ -0,0 +1,564 @@ +using System.Text; +using DFe.Classes.Flags; +using DFe.Utils; +using NFe.Classes; +using NFe.Classes.Informacoes.Destinatario; +using NFe.Classes.Informacoes.Pagamento; +using NFe.Utils; +using NFe.Utils.InformacoesSuplementares; +using QuestPDF.Fluent; +using QuestPDF.Helpers; +using QuestPDF.Infrastructure; +using SkiaSharp; +using SkiaSharp.QrCode.Image; + +namespace NFe.Danfe.QuestPdf.ImpressaoNfce; + +public class DanfeNfceDocument : IDocument +{ + private readonly byte[]? _logo; + private nfeProc? _nfeProc; + private NFe.Classes.NFe? _nfe; + private float _tamanhoImpressao = 300f; + private float _tamanhoFontePadrao; + + public DanfeNfceDocument(string xml, byte[]? logo) + { + _logo = logo; + CarregarXml(xml); + } + + public void TamanhoImpressao(TamanhoImpressao tamanhoImpressao) + { + switch (tamanhoImpressao) + { + case ImpressaoNfce.TamanhoImpressao.Impressao80: + _tamanhoImpressao = 8f; + _tamanhoFontePadrao = 8f; + break; + case ImpressaoNfce.TamanhoImpressao.Impressao72: + _tamanhoImpressao = 7.2f; + _tamanhoFontePadrao = 8f; + break; + case ImpressaoNfce.TamanhoImpressao.Impressao50: + _tamanhoImpressao = 5f; + _tamanhoFontePadrao = 5f; + break; + default: + throw new ArgumentOutOfRangeException(nameof(tamanhoImpressao), tamanhoImpressao, null); + } + } + + public DocumentMetadata GetMetadata() => DocumentMetadata.Default; + + public void Compose(IDocumentContainer container) + { + container + .Page(page => + { + page.MarginLeft(0.4f, Unit.Centimetre); + page.MarginRight(0.8f, Unit.Centimetre); + page.MarginTop(0); + page.MarginBottom(0); + page.ContinuousSize(_tamanhoImpressao, Unit.Centimetre); + + page.Header().Element(Cabecalho); + + page.Content().Element(Conteudo); + + page.Footer().Element(Rodape); + }); + } + + private void Cabecalho(IContainer container) + { + container.Row(row => + { + row.RelativeItem().Column(column => + { + if (_logo != null) + { + column.Item().AlignCenter().MaxWidth(60).MaxHeight(60).Image(_logo); + } + column.Item().AlignCenter().Text(_nfe.infNFe.emit.xFant).FontSize(_tamanhoFontePadrao + 2).SemiBold(); + column.Item().AlignCenter().Text(_nfe.infNFe.emit.xNome).FontSize(_tamanhoFontePadrao + 2); + column.Item().Row(r => + { + r.RelativeItem().AlignLeft().Column(c => + { + c.Item().Text($"CNPJ: {_nfe.infNFe.emit.CNPJ}").FontSize(_tamanhoFontePadrao); + }); + + r.RelativeItem().AlignRight().Column(c => + { + c.Item().Text($"IE: {_nfe.infNFe.emit.IE}").FontSize(_tamanhoFontePadrao); + }); + }); + column.Item().Row(r => + { + r.RelativeItem().AlignLeft().Column(c => + { + c.Item().Text($"Endereço: {EnderecoEmitente()}").FontSize(_tamanhoFontePadrao).Italic(); + }); + }); + + if (_nfe.infNFe.ide.tpAmb == TipoAmbiente.Homologacao) + { + column.Item().LineHorizontal(1); + column.Item().Row(r => + { + r.RelativeItem().AlignCenter().Column(c => + { + c.Item().AlignCenter().Text("EMITIDO EM AMBIENTE DE HOMOLOGAÇÃO SEM VALOR FISCAL").FontSize(_tamanhoFontePadrao).SemiBold().Underline(); + }); + }); + column.Item().LineHorizontal(1); + } + + column.Item().LineHorizontal(1); + column.Item().Row(r => + { + r.RelativeItem().AlignCenter().Column(c => + { + c.Item().AlignCenter().Text("DANFE NFC-e").FontSize(_tamanhoFontePadrao).ExtraBlack(); + c.Item().AlignCenter().Text("Documento Auxiliar Da Nota Fiscal de Consumidor Eletrônica").FontSize(_tamanhoFontePadrao - 1); + c.Item().AlignCenter().Text("Não permite aproveitamento de crédito do ICMS").FontSize(_tamanhoFontePadrao - 1); + }); + }); + column.Item().LineHorizontal(1); + }); + }); + } + + private void Conteudo(IContainer container) + { + container.Table(t => + { + t.ColumnsDefinition(c => + { + c.RelativeColumn(); + c.RelativeColumn(); + c.RelativeColumn(); + c.RelativeColumn(); + c.RelativeColumn(); + c.RelativeColumn(); + c.RelativeColumn(); + c.RelativeColumn(); + c.RelativeColumn(); + c.RelativeColumn(); + c.RelativeColumn(); + c.RelativeColumn(); + }); + + t.Header(h => + { + h.Cell().Element(CellStyle).Text("Num.").ExtraBlack(); + h.Cell().ColumnSpan(11).Element(CellStyle).Text("Descrição").ExtraBlack(); + h.Cell().RowSpan(1); + h.Cell().ColumnSpan(2).Element(CellStyle).AlignRight().Text("Qtde Un ").ExtraBlack(); + h.Cell().ColumnSpan(1).Element(CellStyle).AlignCenter().Text("X").ExtraBlack(); + h.Cell().ColumnSpan(4).Element(CellStyle).AlignRight().Text("Valor Unitário").ExtraBlack(); + h.Cell().ColumnSpan(1).Element(CellStyle).AlignCenter().Text("=").ExtraBlack(); + h.Cell().ColumnSpan(3).Element(CellStyle).AlignRight().AlignRight().Text("Valor Total").ExtraBlack(); + h.Cell().RowSpan(1); + + IContainer CellStyle(IContainer container) + { + return container.DefaultTextStyle(x => + x.SemiBold() + .FontSize(_tamanhoFontePadrao - 0.5f) + ) + .BorderColor(Colors.Black); + } + }); + + t.Cell().ColumnSpan(12).LineHorizontal(1).LineColor(Colors.Grey.Medium); + + foreach (var det in _nfe.infNFe.det) + { + t.Cell().Text(det.nItem.ToString("D3")).FontSize(_tamanhoFontePadrao - 0.5f); + t.Cell().ColumnSpan(11).Text(det.prod.xProd).FontSize(_tamanhoFontePadrao - 0.5f); + t.Cell().RowSpan(1); + t.Cell().ColumnSpan(2).AlignRight().Text(det.prod.qCom.ToString("N3")).FontSize(_tamanhoFontePadrao - 0.5f); + t.Cell().ColumnSpan(1).AlignCenter(); + t.Cell().ColumnSpan(4).AlignRight().Text(det.prod.vUnCom.ToString("N2")).FontSize(_tamanhoFontePadrao - 0.5f); + t.Cell().ColumnSpan(1).AlignCenter(); + t.Cell().ColumnSpan(3).AlignRight().Text(det.prod.vProd.ToString("N2")).FontSize(_tamanhoFontePadrao - 0.5f); + t.Cell().ColumnSpan(12).RowSpan(1).Element(CellStyle); + } + + t.Footer(footer => + { + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + footer.Cell().LineHorizontal(1); + }); + static IContainer CellStyle(IContainer container) + { + return container.BorderBottom(1).BorderColor(Colors.Grey.Lighten2).PaddingVertical(0); + } + }); + } + + private void Rodape(IContainer container) + { + container.Row(row => + { + row.RelativeItem().Column(column => + { + column.Item().Row(r => + { + r.RelativeItem().AlignLeft().Column(c => + { + c.Item().Text("Quantidade de itens").FontSize(_tamanhoFontePadrao); + }); + + r.RelativeItem().AlignRight().Column(c => + { + c.Item().Text($"{_nfe.infNFe.det.Count}").FontSize(_tamanhoFontePadrao); + }); + }); + + column.Item().Row(r => + { + r.RelativeItem().AlignLeft().Column(c => + { + c.Item().Text("Total Desconto").FontSize(_tamanhoFontePadrao); + }); + + r.RelativeItem().AlignRight().Column(c => + { + c.Item().Text($"R$ {_nfe.infNFe.total.ICMSTot.vDesc:N2}").FontSize(_tamanhoFontePadrao); + }); + }); + + column.Item().Row(r => + { + r.RelativeItem().AlignLeft().Column(c => + { + c.Item().Text("Total Outros").FontSize(_tamanhoFontePadrao); + }); + + r.RelativeItem().AlignRight().Column(c => + { + c.Item().Text($"R$ {_nfe.infNFe.total.ICMSTot.vOutro:N2}").FontSize(_tamanhoFontePadrao); + }); + }); + + column.Item().Row(r => + { + r.RelativeItem().AlignLeft().Column(c => + { + c.Item().Text("Total Cupom").FontSize(_tamanhoFontePadrao).ExtraBlack(); + }); + + r.RelativeItem().AlignRight().Column(c => + { + c.Item().Text($"R$ {_nfe.infNFe.total.ICMSTot.vNF:N2}").FontSize(_tamanhoFontePadrao).ExtraBlack(); + }); + }); + + column.Item().Row(r => + { + r.RelativeItem().AlignLeft().Column(c => + { + c.Item().Text("Tributos Totais Incidentes (Lei Federal 12.741/2012)").FontSize(_tamanhoFontePadrao); + }); + + r.RelativeItem().AlignRight().Column(c => + { + c.Item().Text($"R$ {_nfe.infNFe.total.ICMSTot.vTotTrib:N2}").FontSize(_tamanhoFontePadrao); + }); + }); + + column.Item().LineHorizontal(1); + + column.Item().Row(r => + { + + r.RelativeItem().AlignLeft().Column(c => + { + c.Item().Text("Forma Pagamento").FontSize(_tamanhoFontePadrao); + }); + + r.RelativeItem().AlignRight().Column(c => + { + c.Item().Text("Valor Pago").FontSize(_tamanhoFontePadrao); + }); + }); + + foreach (pag pag in _nfe.infNFe.pag) + { + if (pag.detPag != null) + { + foreach (var detPag in pag.detPag) + { + column.Item().Row(r => + { + + r.RelativeItem().AlignLeft().Column(c => + { + c.Item().Text(ObtemDescricao(detPag.tPag)).FontSize(_tamanhoFontePadrao); + }); + + r.RelativeItem().AlignRight().Column(c => + { + c.Item().Text($"{detPag.vPag:N2}").FontSize(_tamanhoFontePadrao); + }); + }); + } + } + } + + column.Item().LineHorizontal(1); + + column.Item().Row(r => + { + r.RelativeItem().AlignCenter().Column(c => + { + c.Item().Text("Consulte pela chave de acesso em:").FontSize(_tamanhoFontePadrao); + }); + }); + + column.Item().Row(r => + { + r.RelativeItem().AlignCenter().Column(c => + { + c.Item().Text(string.IsNullOrEmpty(_nfe.infNFeSupl.urlChave) ? _nfe.infNFeSupl.ObterUrlConsulta(_nfe, VersaoQrCode.QrCodeVersao2) : _nfe.infNFeSupl.urlChave).FontSize(_tamanhoFontePadrao); + }); + }); + + column.Item().LineHorizontal(1); + + column.Item().Row(r => + { + r.RelativeItem().AlignCenter().Column(c => + { + c.Item().AlignCenter().Text(_nfe.infNFe.Id.Substring(3)).FontSize(_tamanhoFontePadrao); + }); + }); + + column.Item().LineHorizontal(1); + + column.Item().Row(r => + { + r.RelativeItem().AlignCenter().Column(c => + { + c.Item().AlignCenter().Text(MontaMensagemConsumidor()).FontSize(_tamanhoFontePadrao).ExtraBlack(); + }); + }); + + column.Item().LineHorizontal(1); + + column.Item().Row(r => + { + r.RelativeItem().Table(t => + { + t.ColumnsDefinition(c => + { + c.RelativeColumn(2); + c.RelativeColumn(3); + }); + + t.Cell().AlignCenter().Image(ImagemQrCode()); + t.Cell().AlignLeft().Column(c => + { + c.Item().Text($"Série: {_nfe.infNFe.ide.serie:D3}").FontSize(_tamanhoFontePadrao); + c.Item().Text($"Número: {_nfe.infNFe.ide.nNF:D9}").FontSize(_tamanhoFontePadrao); + c.Item().Text($"Emissão: {_nfeProc.NFe.infNFe.ide.dhEmi:G}").FontSize(_tamanhoFontePadrao); + c.Item().Text($"Protocolo: {_nfeProc.protNFe.infProt.nProt}").FontSize(_tamanhoFontePadrao); + c.Item().Text($"Autorização: {_nfeProc.protNFe.infProt.dhRecbto:G}").FontSize(_tamanhoFontePadrao); + }); + }); + }); + + column.Item().LineHorizontal(1); + + column.Item().Row(r => + { + r.RelativeItem().AlignCenter().Column(c => + { + c.Item().AlignCenter().Text("Nota Fiscal de Consumidor Eletrônica").FontSize(_tamanhoFontePadrao).ExtraBlack(); + }); + }); + + column.Item().LineHorizontal(1); + }); + }); + } + + private byte[] ImagemQrCode() + { + using var memoryStream = new MemoryStream(); + var qrCode = new QrCode(ObtemUrlQrCode(), new Vector2Slim(256, 256), SKEncodedImageFormat.Png); + qrCode.GenerateImage(memoryStream); + + var qrCodeBytes = memoryStream.ToArray(); + + return qrCodeBytes; + } + + private string ObtemUrlQrCode() + { + var urlQrCode = _nfe.infNFeSupl.qrCode; + + return urlQrCode; + } + + private string MontaMensagemConsumidor() + { + var dest = _nfe.infNFe.dest; + + var mensagem = new StringBuilder("CONSUMIDOR "); + + if (dest == null || string.IsNullOrEmpty(dest.CPF) && string.IsNullOrEmpty(dest.CNPJ)) + { + mensagem.Append("NÃO IDENTIFICADO"); + return mensagem.ToString(); + } + + if (!string.IsNullOrEmpty(dest.idEstrangeiro)) + { + mensagem.Append("Id "); + mensagem.Append(dest.idEstrangeiro); + } + + + if (!string.IsNullOrEmpty(dest.CPF)) + { + mensagem.Append("CPF "); + mensagem.Append(dest.CPF); + } + + if (!string.IsNullOrEmpty(dest.CNPJ)) + { + mensagem.Append("CNPJ "); + mensagem.Append(dest.CNPJ); + } + + if (!string.IsNullOrEmpty(dest.xNome)) + { + mensagem.Append(" "); + mensagem.Append(dest.xNome); + } + + enderDest enderecoDest = dest.enderDest; + + if (enderecoDest == null) return mensagem.ToString().Replace(", ,", ", "); + + string rua = string.Empty; + if (!string.IsNullOrEmpty(enderecoDest.xLgr)) + rua = enderecoDest.xLgr; + + string numero = "S/N"; + if (!string.IsNullOrEmpty(enderecoDest.nro)) + numero = enderecoDest.nro; + + var bairro = string.Empty; + if (!string.IsNullOrEmpty(enderecoDest.xBairro)) + bairro = enderecoDest.xBairro; + + var cidade = string.Empty; + if (!string.IsNullOrEmpty(enderecoDest.xMun)) + bairro = enderecoDest.xMun; + + var siglaUf = string.Empty; + if (!string.IsNullOrEmpty(enderecoDest.UF)) + bairro = enderecoDest.UF; + + if (string.IsNullOrEmpty(rua)) return mensagem.ToString(); + mensagem.Append(" - "); + mensagem.Append(rua); + mensagem.Append(", "); + mensagem.Append(numero); + mensagem.Append(", "); + mensagem.Append(bairro); + mensagem.Append(", "); + mensagem.Append(cidade); + mensagem.Append(" - "); + mensagem.Append(siglaUf); + + return mensagem.ToString().Replace(", ,", ", "); + } + + private string EnderecoEmitente() + { + var enderEmit = _nfe.infNFe.emit.enderEmit; + var foneEmit = string.Empty; + + if (enderEmit.fone != null) + { + StringBuilder fone = new StringBuilder(" - FONE: "); + fone.Append(enderEmit.fone); + foneEmit = fone.ToString(); + } + + var enderecoEmitenteBuilder = new StringBuilder(); + enderecoEmitenteBuilder.Append(enderEmit.xLgr); + enderecoEmitenteBuilder.Append(" "); + + if (string.IsNullOrEmpty(enderEmit.nro)) + { + enderecoEmitenteBuilder.Append("S/N, "); + } + + if (!string.IsNullOrEmpty(enderEmit.nro)) + { + enderecoEmitenteBuilder.Append(enderEmit.nro); + enderecoEmitenteBuilder.Append(", "); + } + + enderecoEmitenteBuilder.Append(enderEmit.xBairro); + enderecoEmitenteBuilder.Append(", "); + enderecoEmitenteBuilder.Append(enderEmit.xMun); + enderecoEmitenteBuilder.Append(", "); + enderecoEmitenteBuilder.Append(enderEmit.UF); + enderecoEmitenteBuilder.Append(foneEmit); + + return enderecoEmitenteBuilder.ToString(); + } + + private void CarregarXml(string xml) + { + try + { + _nfeProc = FuncoesXml.XmlStringParaClasse(xml); + _nfe = _nfeProc.NFe; + } + catch (Exception) + { + try + { + NFe.Classes.NFe nfe = FuncoesXml.XmlStringParaClasse(xml); + _nfe = nfe; + } + catch (Exception) + { + throw new ArgumentException( + "Ei! Verifique se seu xml está correto, pois identificamos uma falha ao tentar carregar ele."); + } + } + } + + private string ObtemDescricao(FormaPagamento? formaPagamento) + { + var existeEnum = Enum + .GetValues(typeof(FormaPagamento)) + .Cast() + .Any(p => formaPagamento.HasValue && p.Equals(formaPagamento)); + + if (existeEnum) + return formaPagamento.Descricao(); + else + throw new ArgumentException("Forma pagamento inválida"); + } +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/ImpressaoNfce/TamanhoImpressao.cs b/NFe.Danfe.QuestPdf/ImpressaoNfce/TamanhoImpressao.cs new file mode 100644 index 000000000..0585aca52 --- /dev/null +++ b/NFe.Danfe.QuestPdf/ImpressaoNfce/TamanhoImpressao.cs @@ -0,0 +1,15 @@ +using System.ComponentModel; + +namespace NFe.Danfe.QuestPdf.ImpressaoNfce; + +public enum TamanhoImpressao +{ + [Description("Impressão 80mm")] + Impressao80 = 1, + + [Description("Impressão 72mm")] + Impressao72 = 2, + + [Description("Impressão 50mm")] + Impressao50 = 3 +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/Models/EmpresaModel.cs b/NFe.Danfe.QuestPdf/Models/EmpresaModel.cs new file mode 100644 index 000000000..f4d954c55 --- /dev/null +++ b/NFe.Danfe.QuestPdf/Models/EmpresaModel.cs @@ -0,0 +1,7 @@ +namespace NFe.Danfe.QuestPdf.Models; + +public class EmpresaModel +{ + public string RazaoSocial { get; set; } + public string Cnpj { get; set; } +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/Models/NfceInutilizacaoModel.cs b/NFe.Danfe.QuestPdf/Models/NfceInutilizacaoModel.cs new file mode 100644 index 000000000..53f0e81c6 --- /dev/null +++ b/NFe.Danfe.QuestPdf/Models/NfceInutilizacaoModel.cs @@ -0,0 +1,10 @@ +namespace NFe.Danfe.QuestPdf.Models; + +public class NfceInutilizacaoModel +{ + public DateTime InutilizacaoEm { get; set; } + public string DescricaoModelo { get; set; } + public int Serie { get; set; } + public int NumeroInicial { get; set; } + public int NumeroFinal { get; set; } +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/Models/NfceResumidaModel.cs b/NFe.Danfe.QuestPdf/Models/NfceResumidaModel.cs new file mode 100644 index 000000000..0004d773e --- /dev/null +++ b/NFe.Danfe.QuestPdf/Models/NfceResumidaModel.cs @@ -0,0 +1,11 @@ +namespace NFe.Danfe.QuestPdf.Models; + +public class NfceResumidaModel +{ + public DateTime AutorizacaoEm { get; set; } + public string Situacao { get; set; } + public int Serie { get; set; } + public int NumeroFiscal { get; set; } + public string Chave { get; set; } + public decimal ValorTotal { get; set; } +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/Models/NfeInutilizadaModel.cs b/NFe.Danfe.QuestPdf/Models/NfeInutilizadaModel.cs new file mode 100644 index 000000000..e26fc3f1c --- /dev/null +++ b/NFe.Danfe.QuestPdf/Models/NfeInutilizadaModel.cs @@ -0,0 +1,10 @@ +namespace NFe.Danfe.QuestPdf.Models; + +public class NfeInutilizadaModel +{ + public DateTime InutilizacaoEm { get; set; } + public string DescricaoModelo { get; set; } + public int Serie { get; set; } + public int NumeroInicial { get; set; } + public int NumeroFinal { get; set; } +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/Models/NfeResumidaModel.cs b/NFe.Danfe.QuestPdf/Models/NfeResumidaModel.cs new file mode 100644 index 000000000..ad9cf37ed --- /dev/null +++ b/NFe.Danfe.QuestPdf/Models/NfeResumidaModel.cs @@ -0,0 +1,11 @@ +namespace NFe.Danfe.QuestPdf.Models; + +public class NfeResumidaModel +{ + public DateTime AutorizacaoEm { get; set; } + public string Situacao { get; set; } + public int Serie { get; set; } + public int NumeroFiscal { get; set; } + public string Chave { get; set; } + public decimal ValorTotal { get; set; } +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/Models/PeriodoModel.cs b/NFe.Danfe.QuestPdf/Models/PeriodoModel.cs new file mode 100644 index 000000000..e25c0a719 --- /dev/null +++ b/NFe.Danfe.QuestPdf/Models/PeriodoModel.cs @@ -0,0 +1,7 @@ +namespace NFe.Danfe.QuestPdf.Models; + +public class PeriodoModel +{ + public DateOnly DataInicial { get; set; } + public DateOnly DataFinal { get; set; } +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/Models/RelatorioFiscalEmissoesNfceModel.cs b/NFe.Danfe.QuestPdf/Models/RelatorioFiscalEmissoesNfceModel.cs new file mode 100644 index 000000000..a5793affb --- /dev/null +++ b/NFe.Danfe.QuestPdf/Models/RelatorioFiscalEmissoesNfceModel.cs @@ -0,0 +1,20 @@ +namespace NFe.Danfe.QuestPdf.Models; + +public class RelatorioFiscalEmissoesNfceModel +{ + public EmpresaModel EmpresaModel { get; set; } + public PeriodoModel PeriodoModel { get; set; } + public IEnumerable NfceResumidaModels { get; set; } + public IEnumerable NfceInutilizacaoModels { get; set; } + + public decimal QuantidadeNfceAutorizada => NfceResumidaModels.Count(n => n.Situacao == "Autorizada"); + public decimal ValorTotalNfceAutorizada => NfceResumidaModels.Where(n => n.Situacao == "Autorizada") + .Sum(n => n.ValorTotal); + public decimal QuantidadeNfceCancelada => NfceResumidaModels.Count(n => n.Situacao == "Cancelada"); + public decimal ValorTotalNfceCancelada => NfceResumidaModels.Where(n => n.Situacao == "Cancelada") + .Sum(n => n.ValorTotal); + public decimal QuantidadeNfceDenegada => NfceResumidaModels.Count(n => n.Situacao == "Denegada"); + + public decimal ValorTotalNfceDenegada => NfceResumidaModels.Where(n => n.Situacao == "Denegada") + .Sum(n => n.ValorTotal); +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/Models/RelatorioFiscalEmissoesNfeModel.cs b/NFe.Danfe.QuestPdf/Models/RelatorioFiscalEmissoesNfeModel.cs new file mode 100644 index 000000000..e9f4f2f5f --- /dev/null +++ b/NFe.Danfe.QuestPdf/Models/RelatorioFiscalEmissoesNfeModel.cs @@ -0,0 +1,20 @@ +namespace NFe.Danfe.QuestPdf.Models; + +public class RelatorioFiscalEmissoesNfeModel +{ + public EmpresaModel EmpresaModel { get; set; } + public PeriodoModel PeriodoModel { get; set; } + public IEnumerable NfeResumidaModels { get; set; } + public IEnumerable NfeInutilizacaoModels { get; set; } + + public decimal QuantidadeNfeAutorizada => NfeResumidaModels.Count(n => n.Situacao == "Autorizada"); + public decimal ValorTotalNfeAutorizada => NfeResumidaModels.Where(n => n.Situacao == "Autorizada") + .Sum(n => n.ValorTotal); + public decimal QuantidadeNfeCancelada => NfeResumidaModels.Count(n => n.Situacao == "Cancelada"); + public decimal ValorTotalNfeCancelada => NfeResumidaModels.Where(n => n.Situacao == "Cancelada") + .Sum(n => n.ValorTotal); + public decimal QuantidadeNfeDenegada => NfeResumidaModels.Count(n => n.Situacao == "Denegada"); + + public decimal ValorTotalNfeDenegada => NfeResumidaModels.Where(n => n.Situacao == "Denegada") + .Sum(n => n.ValorTotal); +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/NFe.Danfe.QuestPdf.csproj b/NFe.Danfe.QuestPdf/NFe.Danfe.QuestPdf.csproj new file mode 100644 index 000000000..62333071e --- /dev/null +++ b/NFe.Danfe.QuestPdf/NFe.Danfe.QuestPdf.csproj @@ -0,0 +1,28 @@ + + + + net6.0 + enable + enable + + + + + + + + + Always + + + + + + + + + + + + + diff --git a/NFe.Danfe.QuestPdf/ParaContadores/RelatorioFiscalEmissoesNfceDocument.cs b/NFe.Danfe.QuestPdf/ParaContadores/RelatorioFiscalEmissoesNfceDocument.cs new file mode 100644 index 000000000..a864f2b85 --- /dev/null +++ b/NFe.Danfe.QuestPdf/ParaContadores/RelatorioFiscalEmissoesNfceDocument.cs @@ -0,0 +1,285 @@ +using NFe.Danfe.QuestPdf.Models; +using QuestPDF.Fluent; +using QuestPDF.Helpers; +using QuestPDF.Infrastructure; + +namespace NFe.Danfe.QuestPdf.ParaContadores; + +public class RelatorioFiscalEmissoesNfceDocument : IDocument +{ + private static string Fonte = "Arial"; + private RelatorioFiscalEmissoesNfceModel Model; + + public RelatorioFiscalEmissoesNfceDocument(RelatorioFiscalEmissoesNfceModel model) + { + Model = model; + } + + public DocumentMetadata GetMetadata() => DocumentMetadata.Default; + + public void Compose(IDocumentContainer container) + { + container + .Page(page => + { + page.Size(PageSizes.A4); + page.Margin(20); + + page.Header().Element(Cabecalho); + + + page.Content().Element(Conteudo); + + + page.Footer().AlignCenter().Text(x => + { + x.CurrentPageNumber(); + x.Span(" / "); + x.TotalPages(); + }); + }); + } + + private void Cabecalho(IContainer container) + { + var titleStyle = TextStyle.Default.FontSize(11).FontFamily(Fonte); + + container.Row(row => + { + row.RelativeItem().Column(column => + { + column.Item().AlignRight().Text("Relatório fiscal de emissões na NFC-e").FontSize(12).FontFamily(Fonte).SemiBold(); + column.Item().AlignRight().Text($"Impresso em: {GetMetadata().CreationDate}").FontSize(10).FontFamily(Fonte).Italic().SemiBold(); + column.Item().AlignLeft().Text($"Razão Social: {Model.EmpresaModel.RazaoSocial}").Style(titleStyle); + column.Item().AlignLeft().Text($"CNPJ: {Model.EmpresaModel.Cnpj}").Style(titleStyle); + column.Item().AlignLeft().Text($"Período: {Model.PeriodoModel.DataInicial:d} até {Model.PeriodoModel.DataFinal:d}"); + }); + }); + } + + private void Conteudo(IContainer container) + { + void TituloInicioTabela(ColumnDescriptor column, string titulo) + { + column.Item() + .PaddingTop(15) + .AlignCenter() + .Text(titulo) + .FontSize(9) + .Italic() + .SemiBold() + .FontFamily(Fonte); + } + + + container + .PaddingVertical(10) + .Column(column => + { + TituloInicioTabela(column, "Documento Fiscal Modelo 65 - NFCE"); + + column.Item().Element(TabelaNFCeResumida); + + TituloInicioTabela(column, "Inutilização feitas no periodo"); + + column.Item().Element(TabelaInutilizacoes); + + column.Item() + .PaddingTop(15) + .AlignCenter(); + + ResumoTotais(column); + }); + } + + private void TabelaNFCeResumida(IContainer container) + { + container.Table(table => + { + table.ColumnsDefinition(columns => + { + columns.ConstantColumn(80); + columns.ConstantColumn(50); + columns.ConstantColumn(30); + columns.ConstantColumn(55); + columns.RelativeColumn(); + columns.ConstantColumn(55); + }); + + + table.Header(header => + { + header.Cell().Element(CellStyle).Text("Data Autorização"); + header.Cell().Element(CellStyle).Text("Situação"); + header.Cell().Element(CellStyle).Text("Série"); + header.Cell().Element(CellStyle).Text("Número"); + header.Cell().Element(CellStyle).Text("Chave"); + header.Cell().Element(CellStyle).AlignRight().Text("Valo Total"); + + + static IContainer CellStyle(IContainer container) + { + return container.DefaultTextStyle(x => + x.SemiBold() + .FontSize(9) + .FontFamily(Fonte) + ) + .PaddingVertical(5) + .BorderBottom(1) + .BorderColor(Colors.Black); + } + }); + + foreach (var item in Model.NfceResumidaModels) + { + table.Cell().Element(CellStyle).Text(item.AutorizacaoEm.ToString("g")).Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text(item.Situacao).Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.Serie:D3}").Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.NumeroFiscal:D9}").Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.Chave}").Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).AlignRight().Text($"{item.ValorTotal:C}").Style(EstiloTextoColunas()); + + static IContainer CellStyle(IContainer container) + { + return container.BorderBottom(1).BorderColor(Colors.Grey.Lighten2).PaddingVertical(0); + } + + static TextStyle EstiloTextoColunas() + { + return TextStyle.Default.FontSize(8.5f).FontFamily(Fonte); + } + } + + table.Footer(footer => + { + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + }); + }); + } + + private void TabelaInutilizacoes(IContainer container) + { + container.Table(table => + { + table.ColumnsDefinition(columns => + { + columns.RelativeColumn(); + columns.RelativeColumn(); + columns.RelativeColumn(); + columns.RelativeColumn(); + columns.RelativeColumn(); + }); + + table.Header(header => + { + header.Cell().Element(CellStyle).Text("Data Inutilização"); + header.Cell().Element(CellStyle).Text("Modelo"); + header.Cell().Element(CellStyle).Text("Série"); + header.Cell().Element(CellStyle).Text("Número Inicial"); + header.Cell().Element(CellStyle).Text("Número Final"); + + + static IContainer CellStyle(IContainer container) + { + return container.DefaultTextStyle(x => x.SemiBold().FontSize(9).FontFamily(Fonte)) + .PaddingVertical(5) + .BorderBottom(1) + .BorderColor(Colors.Black); + } + }); + + foreach (var item in Model.NfceInutilizacaoModels) + { + table.Cell().Element(CellStyle).Text(item.InutilizacaoEm.ToString("g")).Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text(item.DescricaoModelo).Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.Serie:D3}").Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.NumeroInicial:D9}").Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.NumeroFinal:D9}").Style(EstiloTextoColunas()); + + static IContainer CellStyle(IContainer container) + { + return container.BorderBottom(1).BorderColor(Colors.Grey.Lighten2).PaddingVertical(0); + } + + static TextStyle EstiloTextoColunas() + { + return TextStyle.Default.FontSize(8.5f).FontFamily(Fonte); + } + } + + table.Footer(footer => + { + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + }); + }); + } + + private void ResumoTotais(ColumnDescriptor column) + { + column.Item().Row(row => + { + row.RelativeItem(7) + .Border(0.3f) + .Text("Resumo das saidas").FontSize(10).FontFamily(Fonte).SemiBold().Italic(); + + row.RelativeItem(3) + .Border(0.3f) + .Text(text => + { + text.AlignCenter(); + text.Span("Cupons").FontSize(10).FontFamily(Fonte).SemiBold().Italic(); + }); + }); + + column.Item().Row(LinhaTotal("Resumo notas autorizadas" + , Model.QuantidadeNfceAutorizada + , Model.ValorTotalNfceAutorizada)); + + column.Item().Row(LinhaTotal("Resumo notas canceladas" + , Model.QuantidadeNfceCancelada + , Model.ValorTotalNfceCancelada)); + + column.Item().Row(LinhaTotal("Resumo notas denegadas" + , Model.QuantidadeNfceDenegada + , Model.ValorTotalNfceDenegada)); + + + } + + private Action LinhaTotal(string descricaoLinha, decimal quantidadeNfce, decimal valorTotal) + { + return row => + { + row.RelativeItem(7) + .Border(0.3f) + .Text(descricaoLinha).FontSize(10).FontFamily(Fonte).Italic(); + + row.RelativeItem(3) + .Border(0.3f) + .Row(resumoAutoriadasRow => + { + resumoAutoriadasRow.RelativeItem(5) + .Border(0.3f) + .Text(quantidadeNfce).FontSize(10) + .FontFamily(Fonte).Italic(); + + resumoAutoriadasRow.RelativeItem(5) + .Border(0.3f) + .Text(text => + { + text.AlignRight(); + text.Span(valorTotal.ToString("N")).FontSize(10).FontFamily(Fonte).Italic(); + }); + }); + }; + } +} \ No newline at end of file diff --git a/NFe.Danfe.QuestPdf/ParaContadores/RelatorioFiscalEmissoesNfeDocument.cs b/NFe.Danfe.QuestPdf/ParaContadores/RelatorioFiscalEmissoesNfeDocument.cs new file mode 100644 index 000000000..5fea82b34 --- /dev/null +++ b/NFe.Danfe.QuestPdf/ParaContadores/RelatorioFiscalEmissoesNfeDocument.cs @@ -0,0 +1,285 @@ +using NFe.Danfe.QuestPdf.Models; +using QuestPDF.Fluent; +using QuestPDF.Helpers; +using QuestPDF.Infrastructure; + +namespace NFe.Danfe.QuestPdf.ParaContadores; + +public class RelatorioFiscalEmissoesNfeDocument : IDocument +{ + private static string Fonte = "Arial"; + private RelatorioFiscalEmissoesNfeModel Model; + + public RelatorioFiscalEmissoesNfeDocument(RelatorioFiscalEmissoesNfeModel model) + { + Model = model; + } + + public DocumentMetadata GetMetadata() => DocumentMetadata.Default; + + public void Compose(IDocumentContainer container) + { + container + .Page(page => + { + page.Size(PageSizes.A4); + page.Margin(20); + + page.Header().Element(Cabecalho); + + + page.Content().Element(Conteudo); + + + page.Footer().AlignCenter().Text(x => + { + x.CurrentPageNumber(); + x.Span(" / "); + x.TotalPages(); + }); + }); + } + + private void Cabecalho(IContainer container) + { + var titleStyle = TextStyle.Default.FontSize(11).FontFamily(Fonte); + + container.Row(row => + { + row.RelativeItem().Column(column => + { + column.Item().AlignRight().Text("Relatório fiscal de emissões na NF-e").FontSize(12).FontFamily(Fonte).SemiBold(); + column.Item().AlignRight().Text($"Impresso em: {GetMetadata().CreationDate}").FontSize(10).FontFamily(Fonte).Italic().SemiBold(); + column.Item().AlignLeft().Text($"Razão Social: {Model.EmpresaModel.RazaoSocial}").Style(titleStyle); + column.Item().AlignLeft().Text($"CNPJ: {Model.EmpresaModel.Cnpj}").Style(titleStyle); + column.Item().AlignLeft().Text($"Período: {Model.PeriodoModel.DataInicial:d} até {Model.PeriodoModel.DataFinal:d}"); + }); + }); + } + + private void Conteudo(IContainer container) + { + void TituloInicioTabela(ColumnDescriptor column, string titulo) + { + column.Item() + .PaddingTop(15) + .AlignCenter() + .Text(titulo) + .FontSize(9) + .Italic() + .SemiBold() + .FontFamily(Fonte); + } + + + container + .PaddingVertical(10) + .Column(column => + { + TituloInicioTabela(column, "Documento Fiscal Modelo 55 - NFE"); + + column.Item().Element(TabelaNFeResumida); + + TituloInicioTabela(column, "Inutilização feitas no periodo"); + + column.Item().Element(TabelaInutilizacoes); + + column.Item() + .PaddingTop(15) + .AlignCenter(); + + ResumoTotais(column); + }); + } + + private void TabelaNFeResumida(IContainer container) + { + container.Table(table => + { + table.ColumnsDefinition(columns => + { + columns.ConstantColumn(80); + columns.ConstantColumn(50); + columns.ConstantColumn(30); + columns.ConstantColumn(55); + columns.RelativeColumn(); + columns.ConstantColumn(55); + }); + + + table.Header(header => + { + header.Cell().Element(CellStyle).Text("Data Autorização"); + header.Cell().Element(CellStyle).Text("Situação"); + header.Cell().Element(CellStyle).Text("Série"); + header.Cell().Element(CellStyle).Text("Número"); + header.Cell().Element(CellStyle).Text("Chave"); + header.Cell().Element(CellStyle).AlignRight().Text("Valo Total"); + + + static IContainer CellStyle(IContainer container) + { + return container.DefaultTextStyle(x => + x.SemiBold() + .FontSize(9) + .FontFamily(Fonte) + ) + .PaddingVertical(5) + .BorderBottom(1) + .BorderColor(Colors.Black); + } + }); + + foreach (var item in Model.NfeResumidaModels) + { + table.Cell().Element(CellStyle).Text(item.AutorizacaoEm.ToString("g")).Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text(item.Situacao).Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.Serie:D3}").Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.NumeroFiscal:D9}").Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.Chave}").Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).AlignRight().Text($"{item.ValorTotal:C}").Style(EstiloTextoColunas()); + + static IContainer CellStyle(IContainer container) + { + return container.BorderBottom(1).BorderColor(Colors.Grey.Lighten2).PaddingVertical(0); + } + + static TextStyle EstiloTextoColunas() + { + return TextStyle.Default.FontSize(8.5f).FontFamily(Fonte); + } + } + + table.Footer(footer => + { + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + }); + }); + } + + private void TabelaInutilizacoes(IContainer container) + { + container.Table(table => + { + table.ColumnsDefinition(columns => + { + columns.RelativeColumn(); + columns.RelativeColumn(); + columns.RelativeColumn(); + columns.RelativeColumn(); + columns.RelativeColumn(); + }); + + table.Header(header => + { + header.Cell().Element(CellStyle).Text("Data Inutilização"); + header.Cell().Element(CellStyle).Text("Modelo"); + header.Cell().Element(CellStyle).Text("Série"); + header.Cell().Element(CellStyle).Text("Número Inicial"); + header.Cell().Element(CellStyle).Text("Número Final"); + + + static IContainer CellStyle(IContainer container) + { + return container.DefaultTextStyle(x => x.SemiBold().FontSize(9).FontFamily(Fonte)) + .PaddingVertical(5) + .BorderBottom(1) + .BorderColor(Colors.Black); + } + }); + + foreach (var item in Model.NfeInutilizacaoModels) + { + table.Cell().Element(CellStyle).Text(item.InutilizacaoEm.ToString("g")).Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text(item.DescricaoModelo).Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.Serie:D3}").Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.NumeroInicial:D9}").Style(EstiloTextoColunas()); + table.Cell().Element(CellStyle).Text($"{item.NumeroFinal:D9}").Style(EstiloTextoColunas()); + + static IContainer CellStyle(IContainer container) + { + return container.BorderBottom(1).BorderColor(Colors.Grey.Lighten2).PaddingVertical(0); + } + + static TextStyle EstiloTextoColunas() + { + return TextStyle.Default.FontSize(8.5f).FontFamily(Fonte); + } + } + + table.Footer(footer => + { + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + footer.Cell().BorderBottom(1); + }); + }); + } + + private void ResumoTotais(ColumnDescriptor column) + { + column.Item().Row(row => + { + row.RelativeItem(7) + .Border(0.3f) + .Text("Resumo das saidas").FontSize(10).FontFamily(Fonte).SemiBold().Italic(); + + row.RelativeItem(3) + .Border(0.3f) + .Text(text => + { + text.AlignCenter(); + text.Span("Notas Fiscais").FontSize(10).FontFamily(Fonte).SemiBold().Italic(); + }); + }); + + column.Item().Row(LinhaTotal("Resumo notas autorizadas" + , Model.QuantidadeNfeAutorizada + , Model.ValorTotalNfeAutorizada)); + + column.Item().Row(LinhaTotal("Resumo notas canceladas" + , Model.QuantidadeNfeCancelada + , Model.ValorTotalNfeCancelada)); + + column.Item().Row(LinhaTotal("Resumo notas denegadas" + , Model.QuantidadeNfeDenegada + , Model.ValorTotalNfeDenegada)); + + + } + + private Action LinhaTotal(string descricaoLinha, decimal quantidadeNfe, decimal valorTotal) + { + return row => + { + row.RelativeItem(7) + .Border(0.3f) + .Text(descricaoLinha).FontSize(10).FontFamily(Fonte).Italic(); + + row.RelativeItem(3) + .Border(0.3f) + .Row(resumoAutoriadasRow => + { + resumoAutoriadasRow.RelativeItem(5) + .Border(0.3f) + .Text(quantidadeNfe).FontSize(10) + .FontFamily(Fonte).Italic(); + + resumoAutoriadasRow.RelativeItem(5) + .Border(0.3f) + .Text(text => + { + text.AlignRight(); + text.Span(valorTotal.ToString("N")).FontSize(10).FontFamily(Fonte).Italic(); + }); + }); + }; + } +} \ No newline at end of file diff --git a/Zeus NFe.sln b/Zeus NFe.sln index e9efbf580..187e4eef2 100644 --- a/Zeus NFe.sln +++ b/Zeus NFe.sln @@ -121,6 +121,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFe.Danfe.App.Teste.Html", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFe.Danfe.PdfClown", "NFe.Danfe.PdfClown\NFe.Danfe.PdfClown.csproj", "{2A235861-B8FC-463A-A774-0C179529881A}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFe.Danfe.QuestPdf", "NFe.Danfe.QuestPdf\NFe.Danfe.QuestPdf.csproj", "{C3EB9A85-92D6-4201-96AB-959CBAE4BF1B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -473,6 +475,14 @@ Global {2A235861-B8FC-463A-A774-0C179529881A}.Release|Any CPU.Build.0 = Release|Any CPU {2A235861-B8FC-463A-A774-0C179529881A}.Release|x86.ActiveCfg = Release|Any CPU {2A235861-B8FC-463A-A774-0C179529881A}.Release|x86.Build.0 = Release|Any CPU + {C3EB9A85-92D6-4201-96AB-959CBAE4BF1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3EB9A85-92D6-4201-96AB-959CBAE4BF1B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3EB9A85-92D6-4201-96AB-959CBAE4BF1B}.Debug|x86.ActiveCfg = Debug|Any CPU + {C3EB9A85-92D6-4201-96AB-959CBAE4BF1B}.Debug|x86.Build.0 = Debug|Any CPU + {C3EB9A85-92D6-4201-96AB-959CBAE4BF1B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3EB9A85-92D6-4201-96AB-959CBAE4BF1B}.Release|Any CPU.Build.0 = Release|Any CPU + {C3EB9A85-92D6-4201-96AB-959CBAE4BF1B}.Release|x86.ActiveCfg = Release|Any CPU + {C3EB9A85-92D6-4201-96AB-959CBAE4BF1B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -529,6 +539,7 @@ Global {3CDB91BD-EEF4-4808-83AC-E45B1FE7570C} = {003B008B-F388-4FB5-A081-12C0FBA84B57} {18429710-19E2-480F-8B3A-39FB6FC7AF19} = {3AC1A3D4-91D0-471A-AF9C-5EF8442F3F27} {2A235861-B8FC-463A-A774-0C179529881A} = {003B008B-F388-4FB5-A081-12C0FBA84B57} + {C3EB9A85-92D6-4201-96AB-959CBAE4BF1B} = {003B008B-F388-4FB5-A081-12C0FBA84B57} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C8C4D9F7-EF86-49A2-83AF-13FA5D4E8DBB}