diff --git a/.gitignore b/.gitignore index 0daa0dbf5..cadfc12ca 100644 --- a/.gitignore +++ b/.gitignore @@ -284,3 +284,4 @@ build/ # End of https://www.gitignore.io/api/visualstudio *.dll /Bredas.SharedKernel/novo.sql +/.vscode diff --git a/CTe.AppTeste/CTe.AppTeste.csproj b/CTe.AppTeste/CTe.AppTeste.csproj index a1c168627..078b5e731 100644 --- a/CTe.AppTeste/CTe.AppTeste.csproj +++ b/CTe.AppTeste/CTe.AppTeste.csproj @@ -1,4 +1,4 @@ - + @@ -304,6 +304,7 @@ Designer + Always Designer @@ -331,6 +332,7 @@ Designer + Always Designer @@ -384,12 +386,13 @@ Designer Always - + Designer Always - + Designer + Always Designer @@ -531,6 +534,10 @@ Designer Always + + Designer + Always + Designer Always @@ -601,6 +608,7 @@ Designer + Always Designer @@ -704,6 +712,7 @@ Designer + Always Designer @@ -789,10 +798,6 @@ Designer Always - - Designer - Always - Designer Always diff --git a/CTe.AppTeste/schemas/DFeTiposBasicos_v1.00.xsd b/CTe.AppTeste/schemas/DFeTiposBasicos_v1.00.xsd index ea6eab8e8..efc90133f 100644 --- a/CTe.AppTeste/schemas/DFeTiposBasicos_v1.00.xsd +++ b/CTe.AppTeste/schemas/DFeTiposBasicos_v1.00.xsd @@ -1,6 +1,16 @@ + + + Tipo Chave de Documento Fiscal Eletrônico + + + + + + + Tipo string genérico @@ -55,6 +65,24 @@ + + + Tipo CNPJ Base + + + + + + + + + Tipo CNPJ + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais @@ -81,6 +109,23 @@ + + + + + + + Tipo de Receita Bruta do SN + + + + + + + + + + @@ -93,6 +138,8 @@ + + @@ -115,6 +162,14 @@ + + + Ano e mês referência do período de apuração (AAAA-MM) + + + + + Grupo de informações da Tributação da NFCom @@ -163,6 +218,26 @@ + + + Grupo de informações da Tributação da NFGas + + + + + Código Situação Tributária do IBS/CBS + + + + + + + + Informado conforme indicador no cClassTrib + + + + Grupo de informações da Tributação da NFAg @@ -240,7 +315,7 @@ - + @@ -262,7 +337,7 @@ - + Informar essa opção da Choice para Monofasia (CST 620) @@ -298,33 +373,6 @@ - - - Grupo de informações da Tributação da NFGas - - - - - Código Situação Tributária do IBS/CBS - - - - - - - - - Informar essa opção da Choice para Monofasia - - - - - - Informado conforme indicador no cClassTrib - - - - Grupo de informações do Imposto Seletivo @@ -347,7 +395,7 @@ Alíquota do Imposto Seletivo (percentual) - + Alíquota do Imposto Seletivo (por valor) @@ -949,6 +997,152 @@ Grupo de campos da redução de aliquota + + + Grupo de operações em áreas incentivadas (ALC/ZFM) - CBS (alíquota zero) + Grupo de informações para identificação de operações em áreas incentivadas (ALC/ZFM) com alíquota zero da CBS, conforme arts. 451 e 466 da LC 214/2025, quando fornecedor e destinatário estiverem nessas áreas, distinguindo a existência de processo aprovado na Suframa. + + + + + Valor da CBS + + + + + + + + Grupo de informações da Tributação Regular. Informar como seria a tributação caso não cumprida a condição resolutória/suspensiva. Exemplo 1: Art. 442, §4. Operações com ZFM e ALC. Exemplo 2: Operações com suspensão do tributo. + + + + + Grupo de informações da composição do valor do IBS e da CBS em compras governamental + + + + + + + Tipo CBS IBS Completo NFe + + + + IBS / CBS + + + + Valor do BC + + + + + + Grupo de informações do IBS na UF + + + + + + Aliquota do IBS de competência das UF (em percentual) + + + + + Grupo de campos do Diferimento + + + + + Grupo de Informações da devolução de tributos + + + + + Grupo de campos da redução de aliquota + + + + + Valor do IBS de competência das UF + + + + + + + + Grupo de Informações do IBS no Município + + + + + + Aliquota do IBS Municipal (em percentual) + + + + + Grupo de campos do Diferimento + + + + + Grupo de Informações da devolução de tributos + + + + + Grupo de campos da redução de aliquota + + + + + Valor do IBS Municipal + + + + + + + + Valor do IBS + + + + + + Grupo de Tributação da CBS + + + + + + Aliquota da CBS (em percentual) + + + + + Grupo de campos do Diferimento + + + + + Grupo de Informações da devolução de tributos + + + + + Grupo de campos da redução de aliquota + + + + + Grupo de operações em áreas incentivadas (ALC/ZFM) - CBS (alíquota zero) + Grupo de informações para identificação de operações em áreas incentivadas (ALC/ZFM) com alíquota zero da CBS, conforme arts. 451 e 466 da LC 214/2025, quando fornecedor e destinatário estiverem nessas áreas, distinguindo a existência de processo aprovado na Suframa. + + Valor da CBS @@ -1032,10 +1226,14 @@ Tipo Devolução Tributo + + + Percentual de devolução do tributo, conforme LC 214/25 art. 118. + + - Valor do tributo devolvido. No fornecimento de energia elétrica, água, esgoto e -gás natural e em outras hipóteses definidas no regulamento + Valor do tributo devolvido ("cashback" de desconto na própria Nota Fiscal / Fatura) @@ -1131,7 +1329,9 @@ gás natural e em outras hipóteses definidas no regulamento 1=União 2=Estados 3=Distrito Federal -4=Municípios +4=Municípios +5=Consórcio Público +6=Comitê Gestor do IBS @@ -1139,6 +1339,29 @@ gás natural e em outras hipóteses definidas no regulamento Percentual de redução de aliquota em compra governamental + + + Tipo da operação com ente governamental: +1 – Fornecimento com pagamento posterior; + +2 - Recebimento do pagamento com fornecimento já realizado; + +3 – Fornecimento com pagamento já realizado; + +4 – Recebimento do pagamento com fornecimento posterior; + + + + + Chave de acesso do documento fiscal anterior. + +Deverá ser informado para tpOperGov 2 e 3 e vedado para os tipos 1 e 4. + +No caso do tpOperGov 2 aceitará apenas uma chave referenciada, no tipo 3 poderá aceitar múltiplas chaves + +Obs: a chave de acesso deverá ser de um emitente com o mesmo CNPJ base + + @@ -1153,19 +1376,49 @@ gás natural e em outras hipóteses definidas no regulamento 1=União 2=Estados 3=Distrito Federal -4=Municípios +4=Municípios +5=Consórcio Público +6=Comitê Gestor do IBS - Percentual de redução de aliquota em compra governamental + Percentual de redução de alíquota em compra governamental Tipo da operação com ente governamental: -1 - Fornecimento -2 - Recebimento do Pagamento +1 – Fornecimento com pagamento posterior; +2 - Recebimento do pagamento com fornecimento já realizado; +3 – Fornecimento com pagamento já realizado; +4 – Recebimento do pagamento com fornecimento posterior; + + + + + Chave de acesso do documento fiscal anterior. + +Deverá ser informado para tpOperGov 2 e 3 e vedado para os tipos 1 e 4. + +No caso do tpOperGov 2 aceitará apenas uma chave referenciada, no tipo 3 poderá aceitar múltiplas chaves + +Obs: a chave de acesso deverá ser de um emitente com o mesmo CNPJ base + + + + + + + Tipo Pagamento que ocorre em DFe emitdo anteriormente + Informado para abater as parcelas de antecipação de pagamento, conforme art. 10 §4 + + + + + Chave de acesso do documento fiscal de antecipação de pagamento + +Obs: esse DFe deverá ter o indAntecipacaoPgto marcado no grupo ide @@ -1187,6 +1440,68 @@ gás natural e em outras hipóteses definidas no regulamento + + + Tipo Operações em areas incentivadas com CBS Zero + + + + + Percentual efetivo sem a redução + Alíquota efetiva de referência da CBS aplicável à operação fora de áreas ou regimes incentivados. + + + + + Valor efetivo sem a redução + Valor da CBS calculado para a operação fora de áreas ou regimes incentivado + + + + + + + Tipo Operações em áreas incentivadas (ALC/ZFM) - CBS (alíquota zero) + + + + + Tipo de aplicação da alíquota zero da CBS. + + + + + + + + + + + + Número do processo na Suframa para o item +comercializado. + + + + + + + + + + + Percentual efetivo sem a redução + Alíquota efetiva de referência da CBS aplicável à operação fora de áreas ou regimes incentivados. + + + + + Valor efetivo sem a redução + Valor da CBS calculado para a operação fora de áreas ou regimes incentivado + + + + Tipo Estorno de Crédito @@ -1204,14 +1519,6 @@ gás natural e em outras hipóteses definidas no regulamento - - - Ano e mês referência do período de apuração (AAAA-MM) - - - - - Tipo Ajuste de Competência @@ -1290,4 +1597,165 @@ OBS: Percentuais definidos no art. 450, § 1º, da LC 214/25 para o cálculo do + + + Tipo Detalhamento dos Tributos por Item + + + + + Valor da receita bruta do Simples Nacional atribuída ao item. +Se item tributável, RBSNitem = vTPrest + + + + + Tipo de Receita Bruta do Simples Nacional + Tipo de Receita Bruta do Simples Nacional +referente ao cClassTrib do item +0 - Não é receita bruta +1 - Receita bruta - interna +2 - Receita bruta - interna sem cálculo de IBS e CBS +3 - Receita bruta – exportação direta +4 - Receita bruta - exportação indireta +5 - Receita bruta - mercado interno e exportação +9 - Fornecimento incompatível com SN + + + + + Alíquota aplicável de cálculo do IBS referente ao +item + + + + + Valor do IBS devido pelo Simples Nacional. + + + + + Alíquota aplicável de cálculo da CBS referente ao +item + + + + + Valor da CBS devido pelo Simples Nacional. + + + + + Valor do IBS pendente ou suspenso referente ao +item + + + + + Valor da CBS pendente ou suspenso referente ao +item + + + + + + Número do item + + + + + + + + + + + + Tipo dados de totais do SN + + + + + Valor total da receita bruta do Simples Nacional, correspondente ao somatório dos valores atribuídos aos itens do DFe + + + + + Valor total do IBS devido pelo Simples Nacional +apurado no documento + + + + + Valor total do IBS devido pelo Simples Nacional cuja apropriação encontra-se pendente ou com +exigibilidade suspensa + + + + + Valor total da CBS devido pelo Simples Nacional +apurado no documento + + + + + Valor total do CBS devido pelo Simples Nacional cuja apropriação encontra-se pendente ou com +exigibilidade suspensa + + + + + + + Tipo dados do pagamento para o sistema de arrecadação + Estrutura a ser utilizada no grupo ide + + + + + Código do meio de pagamento (ver IT DFe 2026.001) + + + + + + + + + + + CNPJ do recebedor do pagamento + Informar zeros não significativos + + + + + CNPJ base da instituição financeira ou de pagamento + Informar zeros não significativos + + + + + + Número sequencial do pagamento + + + + + + + + + + + ID específico da transação financeira conforme o meio de pagamento + + + + + + + + + \ No newline at end of file diff --git a/CTe.AppTeste/schemas/cteTiposBasico_v4.00.xsd b/CTe.AppTeste/schemas/cteTiposBasico_v4.00.xsd index 389b6391d..c2cbaadb6 100644 --- a/CTe.AppTeste/schemas/cteTiposBasico_v4.00.xsd +++ b/CTe.AppTeste/schemas/cteTiposBasico_v4.00.xsd @@ -1,5 +1,5 @@ - + @@ -571,6 +571,19 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc Endereço do emitente + + + Inscrição do emitente da Suframa + Informar o número do Cadastro do emitente na Suframa. Campo obrigatório nas operações que se beneficiam de incentivos fiscais existentes nas áreas sob controle da SUFRAMA com alíquota zero da CBS referente aos arts. 451 e 466 da LC 214/25 + + + + + + + + + @@ -961,13 +974,10 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc Digest Value da CT-e processado. Utilizado para conferir a integridade do CT-e original. - + Código do status do CT-e. - - - @@ -984,13 +994,10 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc - + Código do status da mensagem do fisco - - - @@ -1051,13 +1058,10 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc Digest Value da CT-e processado. Utilizado para conferir a integridade do CT-e original. - + Código do status do CT-e. - - - @@ -1074,13 +1078,10 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc - + Código do status da mensagem do fisco - - - @@ -1141,13 +1142,10 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc Digest Value da GTV-e processado. Utilizado para conferir a integridade da GTV-e original. - + Código do status da GTV-e. - - - @@ -1164,13 +1162,10 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc - + Código do status da mensagem do fisco - - - @@ -1250,15 +1245,10 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc Versão do Aplicativo que processou a CT-e - + código do status do retorno da consulta. - - - - - @@ -1493,12 +1483,13 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc 6 - Substituição CTe Simplificado - + Identificador do processo de emissão do CT-e Preencher com: - 0 - emissão de CT-e com aplicativo do contribuinte; - 3- emissão CT-e pelo contribuinte com aplicativo fornecido pelo SEBRAE. +0 - emissão de CTe com aplicativo do contribuinte; +3 - emissão CTe pelo contribuinte com aplicativo fornecido pelo SEBRAE. +4 - emissão CTe pelo Provedor de Autorização e assinatura - PAA @@ -1627,6 +1618,35 @@ para tpEmis diferente de 1 Grupo de Compras Governamentais + + + Tipo Pagamento ou Pagamento Antecipado + Informar: +1 - Pagamento Antecipado +3 - Fornecimento com pagamento realizado anteriormente + +Este campo é opcional e apenas deve ser informado em caso de Antecipação de Pagamento e no CTe de fornecimento associada a esses pagamentos antecipados, demais hipóteses de prestação de serviço sem antecipação não devem preencher. + + + + + Grupo de antecipação de pagamento + +Permite informar apenas quando tpPagAnt=3 + Informado para abater as parcelas de antecipação de +pagamento, conforme Art. 10. § 4º + + + + + + Chave de acesso do DFe de antecipação de pagamento (com tpPagAnt=1) + Referência a CTe emitido anteriormente, referente a pagamento antecipado + + + + + @@ -1884,6 +1904,19 @@ Usar com série específica 920-969 para emitente pessoa física com inscrição + + + Inscrição do emitente da Suframa + Informar o número do Cadastro do emitente na Suframa. Campo obrigatório nas operações que se beneficiam de incentivos fiscais existentes nas áreas sob controle da SUFRAMA com alíquota zero da CBS referente aos arts. 451 e 466 da LC 214/25 + + + + + + + + + @@ -2438,15 +2471,10 @@ Onde v9.99 é a a designação genérica para a versão do arquivo. Por exemplo, - + Chave de acesso do CT-e a ser substituído (original) - - - - - @@ -2547,6 +2575,28 @@ Onde v9.99 é a a designação genérica para a versão do arquivo. Por exemplo, + + + Grupo de informações da vínculação com a transação de pagamento + + + + + + Dados de cada pagamento previsto + + + + + + + + + + + + + Valores Totais do CTe @@ -2851,12 +2901,13 @@ Onde v9.99 é a a designação genérica para a versão do arquivo. Por exemplo, 3 - CT-e de Substituição - + - Identificador do processo de emissão do CT-e + Identificador do processo de emissão do CTe Preencher com: - 0 - emissão de CT-e com aplicativo do contribuinte; - 3- emissão CT-e pelo contribuinte com aplicativo fornecido pelo SEBRAE. +0 -emissão de CTe com aplicativo do contribuinte; +3- emissão CTe pelo contribuinte com aplicativo fornecido pelo SEBRAE. +4- emissão de CTe por Provedor de Assinatura e Autorização - PAA @@ -3168,6 +3219,33 @@ para tpEmis diferente de 1 Grupo de Compras Governamentais + + + Tipo Pagamento ou Pagamento Antecipado + Informar: +1 - Pagamento Antecipado +3 - Fornecimento com pagamento realizado anteriormente + +Este campo é opcional e apenas deve ser informado quando pagamento que ocorre antes da prestação do serviço e na DFe de fornecimento associada a esses pagamentos, demais hipóteses de prestação de serviço sem antecipação não devem preencher. + + + + + Grupo de antecipação de pagamento + Informado para abater as parcelas de antecipação de +pagamento, conforme Art. 10. § 4º + + + + + + Chave de acesso do CTe de antecipação de pagamento + Referência a CTe emitido anteriormente, referente a pagamento antecipado + + + + + @@ -3644,6 +3722,19 @@ Usar com série específica 920-969 para emitente pessoa física com inscrição + + + Inscrição do emitente da Suframa + Informar o número do Cadastro do emitente na Suframa. Campo obrigatório nas operações que se beneficiam de incentivos fiscais existentes nas áreas sob controle da SUFRAMA com alíquota zero da CBS referente aos arts. 451 e 466 da LC 214/25 + + + + + + + + + @@ -4050,6 +4141,28 @@ Usar com série específica 920-969 para emitente pessoa física com inscrição + + + Grupo de informações da vínculação com a transação de pagamento + + + + + + Dados de cada pagamento previsto + + + + + + + + + + + + + @@ -4784,15 +4897,10 @@ Onde v9.99 é a a designação genérica para a versão do arquivo. Por exemplo, - + Chave de acesso do CT-e a ser substituído (original) - - - - - @@ -5141,10 +5249,9 @@ Onde v9.99 é a a designação genérica para a versão do arquivo. Por exemplo, - Identificador do processo de emissão do CT-e OS - Preencher com: - 0 - emissão de CT-e com aplicativo do contribuinte; - 3- emissão CT-e pelo contribuinte com aplicativo fornecido pelo Fisco. + Identificador do processo de emissão do CTe OS + Preencher com: 0 - emissão de CTe com aplicativo do contribuinte; +3 - emissão CTe pelo contribuinte com aplicativo fornecido pelo Fisco. @@ -5319,6 +5426,33 @@ para tpEmis diferente de 1 Grupo de Compras Governamentais + + + Tipo Pagamento ou Pagamento Antecipado + Informar: +1 - Pagamento Antecipado +3 - Fornecimento com pagamento realizado anteriormente + +Este campo é opcional e apenas deve ser informado quando pagamento que ocorre antes da prestação do serviço e na DFe de fornecimento associada a esses pagamentos, demais hipóteses de prestação de serviço sem antecipação não devem preencher. + + + + + Grupo de antecipação de pagamento + Informado para abater as parcelas de antecipação de +pagamento, conforme Art. 10. § 4º + + + + + + Chave de acesso do CTe de antecipação de pagamento + Referência a CTe emitido anteriormente, referente a pagamento antecipado + + + + + @@ -5508,6 +5642,19 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc + + + Inscrição do emitente da Suframa + Informar o número do Cadastro do emitente na Suframa. Campo obrigatório nas operações que se beneficiam de incentivos fiscais existentes nas áreas sob controle da SUFRAMA com alíquota zero da CBS referente aos arts. 451 e 466 da LC 214/25 + + + + + + + + + @@ -5759,6 +5906,28 @@ REENTREGA; DEVOLUÇÃO; REFATURAMENTO; etc + + + Grupo de informações da vínculação com a transação de pagamento + + + + + + Dados de cada pagamento previsto + + + + + + + + + + + + + @@ -5954,15 +6123,10 @@ Onde v9.99 é a a designação genérica para a versão do arquivo. Por exemplo, - + Chave de acesso do CT-e a ser substituído (original) - - - - - @@ -6056,15 +6220,10 @@ Somente para Transporte de Valores - + Chave de acesso da GTV-e - - - - - @@ -8007,6 +8166,17 @@ Observação: 28 caracteres são representados no schema como 20 bytes do tipo b + + + Tipo processo de emissão do CTe e CTe Simplificado + + + + + + + + Tipo processo de emissão do CT-e @@ -8026,6 +8196,18 @@ Observação: 28 caracteres são representados no schema como 20 bytes do tipo b + + + Tipo Pagamento ou Pagamento Antecipado + + + + + + + + + Tipo Versão do CT-e - 4.00 diff --git a/CTe.AppTeste/schemas/evCancPrestDesacordo.xsd b/CTe.AppTeste/schemas/evCancPrestDesacordo.xsd deleted file mode 100644 index a3404d254..000000000 --- a/CTe.AppTeste/schemas/evCancPrestDesacordo.xsd +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - Schema XML de validação do evento Cancelamento Prestação do Serviço em Desacordo 610111 - - - - - - Descrição do Evento - “Cancelamento Prestação do Serviço em Desacordo” - - - - - - - - - - - - Protocolo do evento que será cancelado - Informar o número do protocolo de autorização do evento de prestação de serviço em desacordo que será cancelado - - - - - - diff --git a/CTe.AppTeste/schemas/evCancVincPgto_v4.00.xsd b/CTe.AppTeste/schemas/evCancVincPgto_v4.00.xsd new file mode 100644 index 000000000..ecb9e2a59 --- /dev/null +++ b/CTe.AppTeste/schemas/evCancVincPgto_v4.00.xsd @@ -0,0 +1,36 @@ + + + + + + + Schema XML de validação do evento cancelamento da vinculação do pgto 110301 + + + + + + Descrição do Evento - “Cancelamento da vinculação do pagamento” + + + + + + + + + + + + Número do Protocolo de autorização do DFe + + + + + Número do Protocolo de autorização do evento a ser cancelado + + + + + + \ No newline at end of file diff --git a/CTe.AppTeste/schemas/evVincPgto_v4.00.xsd b/CTe.AppTeste/schemas/evVincPgto_v4.00.xsd new file mode 100644 index 000000000..0e492fb1d --- /dev/null +++ b/CTe.AppTeste/schemas/evVincPgto_v4.00.xsd @@ -0,0 +1,45 @@ + + + + + + + + Schema XML de validação do evento de vinculação da transação de pagamento com o DFe - 110300 + + + + + + Descrição do Evento - “Vinculação Pagamento” + + + + + + + + + + + + Número do Protocolo de autorização do DFe + + + + + Vinuclação com o pagamento + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CTe.AppTeste/schemas/tiposDistDFe_v1.00.xsd b/CTe.AppTeste/schemas/tiposDistDFe_v1.00.xsd index c05ae3f9d..423fe401b 100644 --- a/CTe.AppTeste/schemas/tiposDistDFe_v1.00.xsd +++ b/CTe.AppTeste/schemas/tiposDistDFe_v1.00.xsd @@ -142,7 +142,7 @@ - + @@ -189,7 +189,7 @@ - + @@ -199,7 +199,7 @@ - + diff --git a/CTe.AppTeste/schemas/tiposGeralCTe_v3.00-OPENSSL.xsd b/CTe.AppTeste/schemas/tiposGeralCTe_v3.00-OPENSSL.xsd deleted file mode 100644 index 0126ebbff..000000000 --- a/CTe.AppTeste/schemas/tiposGeralCTe_v3.00-OPENSSL.xsd +++ /dev/null @@ -1,615 +0,0 @@ - - - - - Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) - - - - - - - - - Tipo Ambiente - - - - - - - - - - Tipo ano - - - - - - - - - Tipo Código da UF da tabela do IBGE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Código do Município da tabela do IBGE - - - - - - - - - Tipo Código de orgão (UF da tabela do IBGE + 90 SUFRAMA + 91 RFB) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Chave da Nota Fiscal Eletrônica - - - - - - - - - - Tipo Número do CNPJ - - - - - - - - - Tipo Número do Telefone - - - - - - - - - Tipo Número do CNPJ tamanho varíavel (3-14) - - - - - - - - - Tipo Número do CNPJ Opcional - - - - - - - - - Tipo Número do CPF - - - - - - - - - Tipo Número do CPF de tamanho variável (3-11) - - - - - - - - - Tipo data AAAA-MM-DD - - - - - - - - - Tipo Decimal com 5 dígitos, sendo 3 de corpo e 2 decimais - - - - - - - - - Tipo Decimal com 6 dígitos, sendo 3 de corpo e 3 decimais - - - - - - - - - Tipo Decimal com 6 ou 5 dígitos, sendo 3 de corpo e 3 ou 2 decimais - - - - - - - - - Tipo Decimal com 5 dígitos, sendo 3 de corpo e 2 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 11 dígitos, sendo 8 de corpo e 3 decimais - - - - - - - - - Tipo Decimal com 11 dígitos, sendo 8 de corpo e 3 decimais utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 12 dígitos, sendo 8 de corpo e 4decimais - - - - - - - - - Tipo Decimal com 12 dígitos, sendo 8 de corpo e 4 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 9 de corpo e 6 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 11 de corpo e 4 decimais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 11 de corpo e 4 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 12 de corpo e 3 decimais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 12 de corpo e 3 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 16 dígitos, sendo 12 de corpo e 4 decimais - - - - - - - - - Tipo Decimal com 16 dígitos, sendo 12 de corpo e 4 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Inscrição Estadual do Emitente - - - - - - - - - - Tipo Inscrição Estadual do Destinatário - - - - - - - - - - Tipo Justificativa - - - - - - - - - Tipo temp médio em segundos - - - - - - - - - Tipo Modelo Documento Fiscal - - - - - - - - - Tipo Modelo Documento Fiscal - - - - - - - - - - Tipo Modelo Documento Fiscal - - - - - - - - - Tipo Modelo Documento Fiscal - NF Remetente - - - - - - - - - - Tipo da Unidade de Transporte - - - - - - - - - - - - - - - Tipo da Unidade de Carga - - - - - - - - - - - - Tipo Motivo - - - - - - - - - Tipo Número do Documento Fiscal - - - - - - - - - Tipo Número do Protocolo de Status - - - - - - - - - Tipo Número do Recibo do envio de lote de NF-e - - - - - - - - - Tipo Série do Documento Fiscal - - - - - - - - - Tipo Serviço solicitado - - - - - - Tipo Código da Mensagem enviada - - - - - - - - - Tipo string genérico - - - - - - - - - Tipo Sigla da UF - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Sigla da UF, sem Exterior - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Versão do Aplicativo - - - - - - - - - Coordenada geográfica Latitude - - - - - - - - Coordenada geográfica Longitude - - - - - - - - Tipo IP versão 4 - - - - - - - diff --git a/CTe.Classes/Informacoes/Identificacao/gCompraGov.cs b/CTe.Classes/Informacoes/Identificacao/gCompraGov.cs index 1c75654bb..162e70fca 100644 --- a/CTe.Classes/Informacoes/Identificacao/gCompraGov.cs +++ b/CTe.Classes/Informacoes/Identificacao/gCompraGov.cs @@ -1,4 +1,6 @@ -using CTe.Classes.Informacoes.Tipos; +using System.Collections.Generic; +using System.Xml.Serialization; +using CTe.Classes.Informacoes.Tipos; using DFe.Classes; namespace CTe.Classes.Informacoes.Identificacao @@ -15,5 +17,25 @@ public decimal pRedutor set => _pRedutor = value.Arredondar(4); } + /// + /// Tipo da operação com o ente governamental + /// + public TipoOperacaoGov? tpOperGov { get; set; } + + public bool ShouldSerializetpOperGov() + { + return tpOperGov.HasValue; + } + + /// + /// Chave de acesso do documento fiscal anterior (0 a 99 ocorrências). + /// + [XmlElement("refDFeAnt")] + public List refDFeAnt { get; set; } + + public bool ShouldSerializerefDFeAnt() + { + return refDFeAnt != null && refDFeAnt.Count > 0; + } } } diff --git a/CTe.Classes/Informacoes/Impostos/ICMS/ICMS20.cs b/CTe.Classes/Informacoes/Impostos/ICMS/ICMS20.cs index a04bdd9ad..34fa4ee73 100644 --- a/CTe.Classes/Informacoes/Impostos/ICMS/ICMS20.cs +++ b/CTe.Classes/Informacoes/Impostos/ICMS/ICMS20.cs @@ -48,7 +48,8 @@ public ICMS20() private decimal _vBc; private decimal _pIcms; private decimal _vIcms; - public CST CST { get; set; } + private decimal? _vIcmsDeson; + public CST CST { get; set; } public decimal pRedBC { @@ -73,5 +74,23 @@ public decimal vICMS get { return _vIcms.Arredondar(2); } set { _vIcms = value.Arredondar(2); } } + + public decimal? vICMSDeson + { + get { return _vIcmsDeson.Arredondar(2); } + set { _vIcmsDeson = value.Arredondar(2); } + } + + public string cBenef { get; set; } + + public bool ShouldSerializevICMSDeson() + { + return vICMSDeson.HasValue; + } + + public bool ShouldSerializecBenef() + { + return !string.IsNullOrWhiteSpace(cBenef); + } } } diff --git a/CTe.Classes/Informacoes/Impostos/ICMS/ICMS45.cs b/CTe.Classes/Informacoes/Impostos/ICMS/ICMS45.cs index 45b9be1b1..614864c4b 100644 --- a/CTe.Classes/Informacoes/Impostos/ICMS/ICMS45.cs +++ b/CTe.Classes/Informacoes/Impostos/ICMS/ICMS45.cs @@ -33,11 +33,31 @@ using CTe.Classes.Informacoes.Impostos.ICMS.Tipos; using CTe.Classes.Informacoes.Tipos; +using DFe.Classes; namespace CTe.Classes.Informacoes.Impostos.ICMS { public class ICMS45 : ICMSBasico { + private decimal? _vIcmsDeson; public CST CST { get; set; } + + public decimal? vICMSDeson + { + get { return _vIcmsDeson.Arredondar(2); } + set { _vIcmsDeson = value.Arredondar(2); } + } + + public string cBenef { get; set; } + + public bool ShouldSerializevICMSDeson() + { + return vICMSDeson.HasValue; + } + + public bool ShouldSerializecBenef() + { + return !string.IsNullOrWhiteSpace(cBenef); + } } } diff --git a/CTe.Classes/Informacoes/Impostos/ICMS/ICMS60.cs b/CTe.Classes/Informacoes/Impostos/ICMS/ICMS60.cs index a520a417d..b6bd7de66 100644 --- a/CTe.Classes/Informacoes/Impostos/ICMS/ICMS60.cs +++ b/CTe.Classes/Informacoes/Impostos/ICMS/ICMS60.cs @@ -48,6 +48,7 @@ public ICMS60() private decimal _vIcmsstRet; private decimal _pIcmsstRet; private decimal _vCred; + private decimal? _vIcmsDeson; public CST CST { get; set; } public decimal vBCSTRet @@ -73,5 +74,23 @@ public decimal vCred get { return _vCred.Arredondar(2); } set { _vCred = value.Arredondar(2); } } + + public decimal? vICMSDeson + { + get { return _vIcmsDeson.Arredondar(2); } + set { _vIcmsDeson = value.Arredondar(2); } + } + + public string cBenef { get; set; } + + public bool ShouldSerializevICMSDeson() + { + return vICMSDeson.HasValue; + } + + public bool ShouldSerializecBenef() + { + return !string.IsNullOrWhiteSpace(cBenef); + } } } diff --git a/CTe.Classes/Informacoes/Impostos/ICMS/ICMS90.cs b/CTe.Classes/Informacoes/Impostos/ICMS/ICMS90.cs index 21cebb853..8b79d0978 100644 --- a/CTe.Classes/Informacoes/Impostos/ICMS/ICMS90.cs +++ b/CTe.Classes/Informacoes/Impostos/ICMS/ICMS90.cs @@ -49,6 +49,7 @@ public ICMS90() private decimal _pIcms; private decimal _vIcms; private decimal _vCred; + private decimal? _vIcmsDeson; public CST CST { get; set; } public decimal? pRedBC @@ -81,5 +82,23 @@ public decimal vCred get { return _vCred.Arredondar(2); } set { _vCred = value.Arredondar(2); } } + + public decimal? vICMSDeson + { + get { return _vIcmsDeson.Arredondar(2); } + set { _vIcmsDeson = value.Arredondar(2); } + } + + public string cBenef { get; set; } + + public bool ShouldSerializevICMSDeson() + { + return vICMSDeson.HasValue; + } + + public bool ShouldSerializecBenef() + { + return !string.IsNullOrWhiteSpace(cBenef); + } } } diff --git a/CTe.Classes/Informacoes/Impostos/ICMS/ICMSOutraUF.cs b/CTe.Classes/Informacoes/Impostos/ICMS/ICMSOutraUF.cs index 71deef1c8..b061ce683 100644 --- a/CTe.Classes/Informacoes/Impostos/ICMS/ICMSOutraUF.cs +++ b/CTe.Classes/Informacoes/Impostos/ICMS/ICMSOutraUF.cs @@ -48,6 +48,7 @@ public ICMSOutraUF() private decimal _vBcOutraUf; private decimal _pIcmsOutraUf; private decimal _vIcmsOutraUf; + private decimal? _vIcmsDeson; public CST CST { get; set; } public decimal? pRedBCOutraUF @@ -75,5 +76,23 @@ public decimal vICMSOutraUF get { return _vIcmsOutraUf.Arredondar(2); } set { _vIcmsOutraUf = value.Arredondar(2); } } + + public decimal? vICMSDeson + { + get { return _vIcmsDeson.Arredondar(2); } + set { _vIcmsDeson = value.Arredondar(2); } + } + + public string cBenef { get; set; } + + public bool ShouldSerializevICMSDeson() + { + return vICMSDeson.HasValue; + } + + public bool ShouldSerializecBenef() + { + return !string.IsNullOrWhiteSpace(cBenef); + } } } diff --git a/CTe.Classes/Informacoes/Tipos/TipoEnteGov.cs b/CTe.Classes/Informacoes/Tipos/TipoEnteGov.cs index e82732fee..8ebe37346 100644 --- a/CTe.Classes/Informacoes/Tipos/TipoEnteGov.cs +++ b/CTe.Classes/Informacoes/Tipos/TipoEnteGov.cs @@ -24,6 +24,14 @@ public enum TipoEnteGov [Description("Município")] [XmlEnum("4")] - Municipio = 4 + Municipio = 4, + + [Description("Consórcio Público")] + [XmlEnum("5")] + ConsorcioPublico = 5, + + [Description("Comitê Gestor do IBS")] + [XmlEnum("6")] + ComiteGestorDoIbs = 6 } } diff --git a/CTe.Classes/Informacoes/Tipos/TipoOperacaoGov.cs b/CTe.Classes/Informacoes/Tipos/TipoOperacaoGov.cs new file mode 100644 index 000000000..fab39eb2e --- /dev/null +++ b/CTe.Classes/Informacoes/Tipos/TipoOperacaoGov.cs @@ -0,0 +1,24 @@ +using System.ComponentModel; +using System.Xml.Serialization; + +namespace CTe.Classes.Informacoes.Tipos +{ + public enum TipoOperacaoGov + { + [Description("Fornecimento com pagamento posterior")] + [XmlEnum("1")] + FornecimentoComPagamentoPosterior = 1, + + [Description("Recebimento do pagamento com fornecimento já realizado")] + [XmlEnum("2")] + RecebimentoDoPagamentoComFornecimentoJaRealizado = 2, + + [Description("Fornecimento com pagamento já realizado")] + [XmlEnum("3")] + FornecimentoComPagamentoJaRealizado = 3, + + [Description("Recebimento do pagamento com fornecimento posterior")] + [XmlEnum("4")] + RecebimentoDoPagamentoComFornecimentoPosterior = 4 + } +} diff --git a/CTe.Classes/Informacoes/infCTeNormal/infDoc.cs b/CTe.Classes/Informacoes/infCTeNormal/infDoc.cs index 089c71b60..e322e8a7c 100644 --- a/CTe.Classes/Informacoes/infCTeNormal/infDoc.cs +++ b/CTe.Classes/Informacoes/infCTeNormal/infDoc.cs @@ -48,6 +48,13 @@ public class infDoc [XmlElement(ElementName = "infOutros")] public List infOutros { get; set; } + /// + /// Informações das DCe (modelo 99) transportadas pelo CT-e. + /// Grupo criado pela NT 2025.001, disponível somente no leiaute 4.00. + /// + [XmlElement(ElementName = "infDCe")] + public List infDCe { get; set; } + public string nCont { get; set; } public string dPrev { get; set; } diff --git a/CTe.Classes/Informacoes/infCTeNormal/infDocumentos/infDCe.cs b/CTe.Classes/Informacoes/infCTeNormal/infDocumentos/infDCe.cs new file mode 100644 index 000000000..c918937a4 --- /dev/null +++ b/CTe.Classes/Informacoes/infCTeNormal/infDocumentos/infDCe.cs @@ -0,0 +1,21 @@ +using System.Xml.Serialization; + +namespace CTe.Classes.Informacoes.infCTeNormal.infDocumentos +{ + /// + /// Informações das DCe (Declaração de Conteúdo eletrônica, modelo 99) + /// transportadas pelo CT-e. + /// + /// Grupo criado pela NT 2025.001 (item "Criação do grupo de informações da DCe nos + /// documentos originários"), disponível somente no leiaute 4.00. + /// + /// + public class infDCe + { + /// + /// Chave de acesso da DCe + /// + [XmlElement(Order = 1)] + public string chave { get; set; } + } +} diff --git a/CTe.Dacte.Fast.Skia/CTe.Dacte.Fast.Skia.csproj b/CTe.Dacte.Fast.Skia/CTe.Dacte.Fast.Skia.csproj new file mode 100644 index 000000000..fe1bd0a11 --- /dev/null +++ b/CTe.Dacte.Fast.Skia/CTe.Dacte.Fast.Skia.csproj @@ -0,0 +1,21 @@ + + + + net6.0 + fastskia + + + + + + + + + + + + + + + + diff --git a/CTe.Dacte.Fast.Skia/DacteFastBase.cs b/CTe.Dacte.Fast.Skia/DacteFastBase.cs new file mode 100644 index 000000000..3bc295406 --- /dev/null +++ b/CTe.Dacte.Fast.Skia/DacteFastBase.cs @@ -0,0 +1,129 @@ +using System; +using System.IO; +using FastReport; +using FastReport.Export.Html; +using FastReport.Export.Pdf; + +namespace CTe.Dacte.Fast.Skia +{ + public class DacteFastBase + { + public Report Relatorio { get; protected set; } + + public void LoadReport(string arquivoRelatorio) + { + Relatorio.Load(arquivoRelatorio); + } + + public void LoadReport(MemoryStream stream) + { + Relatorio.Load(stream); + } + + /// + /// Converte o DACTE para PDF e salva-o no caminho/arquivo indicado + /// + /// Caminho/arquivo onde deve ser salvo o PDF do DACTE + public void ExportarPdf(string arquivo) + { + Relatorio.Prepare(); + Relatorio.Export(new PDFExport(), arquivo); + } + + /// + /// Converte o DACTE para PDF e copia para o stream + /// + /// Variável do tipo Stream para output + public void ExportarPdf(Stream outputStream) + { + Relatorio.Prepare(); + Relatorio.Export(new PDFExport(), outputStream); + outputStream.Position = 0; + } + + /// + /// Converte o DACTE para PDF retorna como byte[] + /// + public byte[] ExportarPdf() + { + using (MemoryStream stream = new MemoryStream()) + { + Relatorio.Prepare(); + Relatorio.Export(new PDFExport(), stream); + return stream.ToArray(); + } + } + + /// + /// Converte o DACTE para PDF e salva-o no caminho/arquivo indicado + /// + /// Caminho/arquivo onde deve ser salvo o PDF do DACTE + /// Instancia do tipo de exportacao do FastReport + public void ExportarPdf(string arquivo, FastReport.Export.ExportBase exportBase) + { + if (exportBase == null) + throw new NullReferenceException("exportBase deve ter um objeto instanciado, tente 'new PDFExport()'"); + + Relatorio.Prepare(); + Relatorio.Export(exportBase, arquivo); + } + + /// + /// Converte o DACTE para PDF e copia para o stream + /// + /// Variável do tipo Stream para output + /// Instancia do tipo de exportacao do FastReport + public void ExportarPdf(Stream outputStream, FastReport.Export.ExportBase exportBase) + { + if (exportBase == null) + throw new NullReferenceException("exportBase deve ter um objeto instanciado, tente 'new PDFExport()'"); + + Relatorio.Prepare(); + Relatorio.Export(exportBase, outputStream); + outputStream.Position = 0; + } + + /// + /// Converte o DACTE para PDF retorna como byte[] + /// + /// Instancia do tipo de exportacao do FastReport + public byte[] ExportarPdf(FastReport.Export.ExportBase exportBase) + { + using (MemoryStream stream = new MemoryStream()) + { + Relatorio.Prepare(); + Relatorio.Export(exportBase, stream); + return stream.ToArray(); + } + } + + public byte[] ExportarHtml() + { + using (MemoryStream stream = new MemoryStream()) + { + Relatorio.Prepare(); + HTMLExport html = new HTMLExport + { + SinglePage = true, + Navigator = false, + EmbedPictures = true + }; + Relatorio.Export(html, stream); + return stream.ToArray(); + } + } + + public void ExportarHtml(Stream outputStream) + { + Relatorio.Prepare(); + HTMLExport html = new HTMLExport + { + SinglePage = true, + Navigator = false, + EmbedPictures = true + }; + Relatorio.Export(html, outputStream); + outputStream.Position = 0; + } + } +} diff --git a/CTe.Dacte.Fast.Skia/DacteFrCte.cs b/CTe.Dacte.Fast.Skia/DacteFrCte.cs new file mode 100644 index 000000000..544bad1c3 --- /dev/null +++ b/CTe.Dacte.Fast.Skia/DacteFrCte.cs @@ -0,0 +1,54 @@ +using System; +using CTe.Classes; +using CTe.Dacte.Base; +using FastReport; +using System.IO; +using DFe.Utils; + +namespace CTe.Dacte.Fast.Skia +{ + public class DacteFrCte : DacteFastBase + { + public DacteFrCte() + { + Relatorio = new Report(); + } + + public DacteFrCte(cteProc proc, ConfiguracaoDacte config, string arquivoRelatorio = "") + { + Relatorio = new Report(); + RegisterData(proc); + + if (string.IsNullOrWhiteSpace(arquivoRelatorio)) + { + const string caminho = @"CTe\CTeRetrato.frx"; + var frx = FrxFileHelper.TryGetFrxFile(caminho); + if (frx == null || frx.Length == 0) + throw new Exception($"Erro em DacteFrCte. Relatório '{caminho}' não encontrado, passe o parametro 'arquivoRelatorio' com o caminho do arquivo"); + Relatorio.Load(new MemoryStream(frx)); + } + else + { + Relatorio.Load(arquivoRelatorio); + } + + Configurar(config); + } + + public void RegisterData(cteProc proc) + { + Relatorio.RegisterData(new[] { proc }, "cteProc", 20); + Relatorio.GetDataSource("cteProc").Enabled = true; + } + + public void Configurar(ConfiguracaoDacte config) + { + Relatorio.SetParameterValue("DocumentoCancelado", config.DocumentoCancelado); + Relatorio.SetParameterValue("Desenvolvedor", config.Desenvolvedor); + Relatorio.SetParameterValue("QuebrarLinhasObservacao", config.QuebrarLinhasObservacao); + + if (Relatorio.FindObject("poEmitLogo") != null) + ((PictureObject)Relatorio.FindObject("poEmitLogo")).SetImageData(config.Logomarca); + } + } +} diff --git a/CTe.Dacte.Fast.Skia/DacteFrEvento.cs b/CTe.Dacte.Fast.Skia/DacteFrEvento.cs new file mode 100644 index 000000000..694b5bd34 --- /dev/null +++ b/CTe.Dacte.Fast.Skia/DacteFrEvento.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using FastReport; +using CTe.Classes; +using CTe.Classes.Servicos.Consulta; +using DFe.Utils; + +namespace CTe.Dacte.Fast.Skia +{ + public class DacteFrEvento : DacteFastBase + { + public DacteFrEvento() + { + Relatorio = new Report(); + } + + public DacteFrEvento(cteProc proc, procEventoCTe procEventoCTe, string desenvolvedor = "", string arquivoRelatorio = "") + { + Relatorio = new Report(); + + if (string.IsNullOrWhiteSpace(arquivoRelatorio)) + { + const string caminho = @"CTe\CTeEvento.frx"; + var frx = FrxFileHelper.TryGetFrxFile(caminho); + if (frx == null || frx.Length == 0) + throw new Exception($"Erro em DacteFrEvento. Relatório '{caminho}' não encontrado, passe o parametro 'arquivoRelatorio' com o caminho do arquivo"); + Relatorio.Load(new MemoryStream(frx)); + } + else + { + Relatorio.Load(arquivoRelatorio); + } + + RegisterData(proc, procEventoCTe); + Configurar(desenvolvedor: desenvolvedor); + } + + public void RegisterData(cteProc proc, procEventoCTe procEventoCTe) + { + Relatorio.RegisterData(new[] { proc }, "cteProc", 20); + Relatorio.GetDataSource("cteProc").Enabled = true; + + Relatorio.RegisterData(new[] { procEventoCTe }, "procEventoCTe", 20); + Relatorio.GetDataSource("procEventoCTe").Enabled = true; + } + + public void Configurar(string desenvolvedor = "") + { + Relatorio.SetParameterValue("Desenvolvedor", desenvolvedor); + } + } +} diff --git a/CTe.Dacte.Fast.Skia/Dlls/FastReport.dll b/CTe.Dacte.Fast.Skia/Dlls/FastReport.dll new file mode 100644 index 000000000..f20ad7ab4 Binary files /dev/null and b/CTe.Dacte.Fast.Skia/Dlls/FastReport.dll differ diff --git a/DFe.Utils/FrxFileHelper.cs b/DFe.Utils/FrxFileHelper.cs index 131133c84..688936664 100644 --- a/DFe.Utils/FrxFileHelper.cs +++ b/DFe.Utils/FrxFileHelper.cs @@ -15,6 +15,9 @@ public static byte[] TryGetFrxFile(string caminho) caminho += ".frx"; } + // Os caminhos são informados com "\" (ex.: @"CTe\CTeRetrato.frx"); em Linux/macOS "\" não é separador de diretório + caminho = caminho.Replace('\\', Path.DirectorySeparatorChar).Replace('/', Path.DirectorySeparatorChar); + var path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? throw new InvalidOperationException("Erro no Zeus. Assembly de relatório nao encontrado"), caminho); var bytes = File.ReadAllBytes(path); return bytes.Length == 0 ? null : bytes; diff --git a/MDFe.Damdfe.Fast.Skia/DamdfeFrMDFe.cs b/MDFe.Damdfe.Fast.Skia/DamdfeFrMDFe.cs new file mode 100644 index 000000000..0c97511ad --- /dev/null +++ b/MDFe.Damdfe.Fast.Skia/DamdfeFrMDFe.cs @@ -0,0 +1,120 @@ +using System; +using System.IO; +using DFe.Utils; +using FastReport; +using FastReport.Export.Pdf; +using MDFe.Classes.Retorno; +using MDFe.Damdfe.Base; + +namespace MDFe.Damdfe.Fast.Skia +{ + public class DamdfeFrMDFe + { + protected Report Relatorio; + + public DamdfeFrMDFe(MDFeProcMDFe proc, ConfiguracaoDamdfe config, string arquivoRelatorio = null) + { + Relatorio = new Report(); + RegisterData(proc); + + if (string.IsNullOrWhiteSpace(arquivoRelatorio)) + { + const string caminho = @"MDFe\MDFeRetrato.frx"; + var frx = FrxFileHelper.TryGetFrxFile(caminho); + if (frx == null || frx.Length == 0) + throw new Exception($"Erro em DamdfeFrMDFe. Relatório '{caminho}' não encontrado, passe o parametro 'arquivoRelatorio' com o caminho do arquivo"); + Relatorio.Load(new MemoryStream(frx)); + } + else + { + Relatorio.Load(arquivoRelatorio); + } + + Configurar(config); + } + + public DamdfeFrMDFe() + { + Relatorio = new Report(); + } + + public void RegisterData(MDFeProcMDFe proc) + { + Relatorio.RegisterData(new[] { proc }, "MDFeProcMDFe", 20); + Relatorio.GetDataSource("MDFeProcMDFe").Enabled = true; + } + + public void Configurar(ConfiguracaoDamdfe config) + { + Relatorio.SetParameterValue("DocumentoCancelado", config.DocumentoCancelado); + Relatorio.SetParameterValue("DocumentoEncerrado", config.DocumentoEncerrado); + Relatorio.SetParameterValue("Desenvolvedor", config.Desenvolvedor); + Relatorio.SetParameterValue("QuebrarLinhasObservacao", config.QuebrarLinhasObservacao); + if (Relatorio.FindObject("poEmitLogo") != null) + ((PictureObject)Relatorio.FindObject("poEmitLogo")).SetImageData(config.Logomarca); + } + + /// + /// Converte o DAMDFe para PDF e salva-o no caminho/arquivo indicado + /// + /// Caminho/arquivo onde deve ser salvo o PDF do DAMDFe + public void ExportarPdf(string arquivo) + { + Relatorio.Prepare(); + Relatorio.Export(new PDFExport(), arquivo); + } + + /// + /// Converte o DAMDFe para PDF e copia para o stream + /// + /// Variável do tipo Stream para output + public void ExportarPdf(Stream outputStream) + { + Relatorio.Prepare(); + Relatorio.Export(new PDFExport(), outputStream); + outputStream.Position = 0; + } + + /// + /// Converte o DAMDFe para PDF e retorna como byte[] + /// + public byte[] ExportarPdf() + { + using (var stream = new MemoryStream()) + { + ExportarPdf(stream); + return stream.ToArray(); + } + } + + /// + /// Converte o DAMDFe para PDF e salva-o no caminho/arquivo indicado + /// + /// Caminho/arquivo onde deve ser salvo o PDF do DAMDFe + /// Instancia do tipo de exportacao do FastReport + public void ExportarPdf(string arquivo, FastReport.Export.ExportBase exportBase) + { + if (exportBase == null) + throw new NullReferenceException("exportBase deve ter um objeto instanciado, tente 'new PDFExport()'"); + + Relatorio.Prepare(); + Relatorio.Export(exportBase, arquivo); + } + + /// + /// Converte o DAMDFe para PDF e copia para o stream + /// + /// Variável do tipo Stream para output + /// Instancia do tipo de exportacao do FastReport + public void ExportarPdf(Stream outputStream, FastReport.Export.ExportBase exportBase) + { + if (exportBase == null) + throw new NullReferenceException("exportBase deve ter um objeto instanciado, tente 'new PDFExport()'"); + + Relatorio.Prepare(); + Relatorio.Export(exportBase, outputStream); + outputStream.Position = 0; + } + } +} + diff --git a/MDFe.Damdfe.Fast.Skia/Dlls/FastReport.dll b/MDFe.Damdfe.Fast.Skia/Dlls/FastReport.dll new file mode 100644 index 000000000..f20ad7ab4 Binary files /dev/null and b/MDFe.Damdfe.Fast.Skia/Dlls/FastReport.dll differ diff --git a/MDFe.Damdfe.Fast.Skia/MDFe.Damdfe.Fast.Skia.csproj b/MDFe.Damdfe.Fast.Skia/MDFe.Damdfe.Fast.Skia.csproj new file mode 100644 index 000000000..aad4d05dc --- /dev/null +++ b/MDFe.Damdfe.Fast.Skia/MDFe.Damdfe.Fast.Skia.csproj @@ -0,0 +1,21 @@ + + + + net6.0 + fastskia + + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e211110_v1.00.xsd b/NFe.AppTeste/Schemas/e211110_v1.00.xsd index b89f1cf0e..f486b108c 100644 --- a/NFe.AppTeste/Schemas/e211110_v1.00.xsd +++ b/NFe.AppTeste/Schemas/e211110_v1.00.xsd @@ -31,6 +31,7 @@ + @@ -40,31 +41,31 @@ Versão do Aplicativo que recebeu o Evento - + Informações de crédito presumido por item - + Valor do base de cálculo do item - + + + Código de Classificação do Crédito presumido, conforme tabela cCredPres (Anexo IV) + + + + + + + + + - - - Usar tabela Cred Presumido, para o emitente da nota. - - - - - - - - Percentual do Crédito Presumido @@ -78,20 +79,9 @@ - + - - - Usar tabela Cred Presumido, para o emitente da nota. - - - - - - - - Percentual do Crédito Presumido diff --git a/NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd b/NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd index acdee4038..12c0015f1 100644 --- a/NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd +++ b/NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd @@ -1,5 +1,4 @@ - - + Tipo número sequencial único @@ -116,7 +115,7 @@ - + @@ -173,7 +172,7 @@ - + @@ -215,4 +214,3 @@ - diff --git a/NFe.Classes/Informacoes/Emitente/emit.cs b/NFe.Classes/Informacoes/Emitente/emit.cs index fdd7b8abf..b8a7810a2 100644 --- a/NFe.Classes/Informacoes/Emitente/emit.cs +++ b/NFe.Classes/Informacoes/Emitente/emit.cs @@ -131,5 +131,11 @@ public string CPF /// public CRT CRT { get; set; } + /// + /// C22 - Inscrição do emitente na Suframa + /// 8 a 9 dígitos. Obrigatório nas operações com CBS alíquota zero em áreas ZFM/ALC (arts. 451 e 466 da LC 214/25). + /// + public string ISUFEmit { get; set; } + } } \ No newline at end of file diff --git a/NFe.Classes/Informacoes/Identificacao/ide.cs b/NFe.Classes/Informacoes/Identificacao/ide.cs index 2e0d77a09..c0dbf53d0 100644 --- a/NFe.Classes/Informacoes/Identificacao/ide.cs +++ b/NFe.Classes/Informacoes/Identificacao/ide.cs @@ -243,6 +243,13 @@ public bool indIntermedSpecified get { return indIntermed.HasValue; } } + /// + /// B25d - Código indicador do local da operação de fornecimento + /// 6 dígitos. Obrigatório para leilão/licitação (010104) e irregularidade fiscal (010105). + /// Não permitido na NFC-e (modelo 65). + /// + public string cIndOp { get; set; } + /// /// B26 - Processo de emissão utilizado com a seguinte codificação: /// diff --git a/NFe.Classes/Servicos/DistribuicaoDFe/Schemas/resEvento.cs b/NFe.Classes/Servicos/DistribuicaoDFe/Schemas/resEvento.cs index 0cb7b1e40..c75996a23 100644 --- a/NFe.Classes/Servicos/DistribuicaoDFe/Schemas/resEvento.cs +++ b/NFe.Classes/Servicos/DistribuicaoDFe/Schemas/resEvento.cs @@ -57,7 +57,7 @@ public class resEvento public string cOrgao { get; set; } /// - /// D04 - CNPJ do Emitente + /// D04 - CNPJ do Emitente (Alfanumérico apartir da NT2014.002_v1.40 - WsNFeDistribuicaoDFe - julho de 2026) /// public string CNPJ { get; set; } diff --git a/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCBS.cs b/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCBSCredPres.cs similarity index 92% rename from NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCBS.cs rename to NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCBSCredPres.cs index 9b5b0f3e1..4b325f51e 100644 --- a/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCBS.cs +++ b/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCBSCredPres.cs @@ -31,19 +31,12 @@ /* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */ /********************************************************************************/ -using NFe.Classes.Informacoes.Detalhe; - namespace NFe.Classes.Servicos.Evento.Informacoes.CreditoPresumido { - public class gCBS + public class gCBSCredPres { private decimal _pCredPres; private decimal _vCredPres; - - /// - /// P31 - Código de Classificação do Crédito presumido, conforme tabela cCredPres (Anexo IV) - /// - public CCredPres cCredPres { get; set; } /// /// P32 - Percentual do Crédito Presumido diff --git a/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCredPres.cs b/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCredPresOper.cs similarity index 85% rename from NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCredPres.cs rename to NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCredPresOper.cs index db3b9a357..9d100fd80 100644 --- a/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCredPres.cs +++ b/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gCredPresOper.cs @@ -31,12 +31,15 @@ /* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */ /********************************************************************************/ +using NFe.Classes.Informacoes.Detalhe; using System.Xml.Serialization; namespace NFe.Classes.Servicos.Evento.Informacoes.CreditoPresumido { - public class gCredPres + public class gCredPresOper { + private decimal _vBCCredPres; + /// /// P24 - Corresponde ao atributo “nItem” do elemento “det” do documento referenciado /// @@ -46,16 +49,25 @@ public class gCredPres /// /// P25 - Valor do base de cálculo do item /// - public int vBC { get; set; } - + public decimal vBCCredPres + { + get => _vBCCredPres.Arredondar(2); + set => _vBCCredPres = value.Arredondar(2); + } + + /// + /// P25a - Código de Classificação do Crédito presumido, conforme tabela cCredPres (Anexo IV) + /// + public CCredPres cCredPres { get; set; } + /// /// P26 - Grupo de Informações do Crédito Presumido do IBS /// - public gIBS gIBS { get; set; } + public gIBSCredPres gIBSCredPres { get; set; } /// /// P30 - Grupo de Informações do Crédito Presumido da CBS /// - public gCBS gCBS { get; set; } + public gCBSCredPres gCBSCredPres { get; set; } } } \ No newline at end of file diff --git a/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gIBS.cs b/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gIBSCredPres.cs similarity index 92% rename from NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gIBS.cs rename to NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gIBSCredPres.cs index d7bd88d74..36f407676 100644 --- a/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gIBS.cs +++ b/NFe.Classes/Servicos/Evento/Informacoes/CreditoPresumido/gIBSCredPres.cs @@ -31,19 +31,12 @@ /* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */ /********************************************************************************/ -using NFe.Classes.Informacoes.Detalhe; - namespace NFe.Classes.Servicos.Evento.Informacoes.CreditoPresumido { - public class gIBS + public class gIBSCredPres { private decimal _pCredPres; private decimal _vCredPres; - - /// - /// P27 - Código de Classificação do Crédito presumido, conforme tabela cCredPres (Anexo IV) - /// - public CCredPres cCredPres { get; set; } /// /// P28 - Percentual do Crédito Presumido diff --git a/NFe.Classes/Servicos/Evento/detEvento.cs b/NFe.Classes/Servicos/Evento/detEvento.cs index 99fc664da..a954b5b25 100644 --- a/NFe.Classes/Servicos/Evento/detEvento.cs +++ b/NFe.Classes/Servicos/Evento/detEvento.cs @@ -392,12 +392,12 @@ public bool ShouldSerializeindQuitacao() /// /// P23 - Informações de crédito presumido por item /// - [XmlElement("gCredPres")] - public List gCredPres { get; set; } + [XmlElement("gCredPresOper")] + public List gCredPresOper { get; set; } - public bool ShouldSerializegCredPres() + public bool ShouldSerializegCredPresOper() { - return gCredPres != null; + return gCredPresOper != null; } #endregion diff --git a/NFe.Danfe.Fast.Skia/DanfeFastBase.cs b/NFe.Danfe.Fast.Skia/DanfeFastBase.cs index f71781017..8795dfd7a 100644 --- a/NFe.Danfe.Fast.Skia/DanfeFastBase.cs +++ b/NFe.Danfe.Fast.Skia/DanfeFastBase.cs @@ -26,16 +26,9 @@ public void ExportarPdf(string arquivo) /// Variável do tipo Stream para output public void ExportarPdf(Stream outputStream) { - try - { - Relatorio.Prepare(); - Relatorio.Export(new PDFExport(), outputStream); - outputStream.Position = 0; - } - catch (Exception ex) - { - throw ex; - } + Relatorio.Prepare(); + Relatorio.Export(new PDFExport(), outputStream); + outputStream.Position = 0; } /// @@ -45,16 +38,9 @@ public byte[] ExportarPdf() { using (MemoryStream stream = new MemoryStream()) // Create a stream for the report { - try - { - Relatorio.Prepare(); - Relatorio.Export(new PDFExport(), stream); - return stream.ToArray(); - } - catch (System.Exception ex) - { - throw ex; - } + Relatorio.Prepare(); + Relatorio.Export(new PDFExport(), stream); + return stream.ToArray(); } } @@ -96,45 +82,15 @@ public byte[] ExportarPdf(FastReport.Export.ExportBase exportBase) { using (MemoryStream stream = new MemoryStream()) // Create a stream for the report { - try - { - Relatorio.Prepare(); - Relatorio.Export(exportBase, stream); - return stream.ToArray(); - } - catch (System.Exception ex) - { - throw ex; - } + Relatorio.Prepare(); + Relatorio.Export(exportBase, stream); + return stream.ToArray(); } } - + public byte[] ExportarHtml() { using (MemoryStream stream = new MemoryStream()) // Create a stream for the report - { - try - { - Relatorio.Prepare(); - HTMLExport html = new HTMLExport - { - SinglePage = true, // Single page report - Navigator = false, // Top navigation bar - EmbedPictures = true // Embeds images into a document - }; - Relatorio.Export(html, stream); - return stream.ToArray(); - } - catch (System.Exception ex) - { - throw ex; - } - } - } - - public void ExportarHtml(Stream outputStream) - { - try { Relatorio.Prepare(); HTMLExport html = new HTMLExport @@ -143,13 +99,22 @@ public void ExportarHtml(Stream outputStream) Navigator = false, // Top navigation bar EmbedPictures = true // Embeds images into a document }; - Relatorio.Export(html, outputStream); - outputStream.Position = 0; + Relatorio.Export(html, stream); + return stream.ToArray(); } - catch (System.Exception ex) + } + + public void ExportarHtml(Stream outputStream) + { + Relatorio.Prepare(); + HTMLExport html = new HTMLExport { - throw ex; - } + SinglePage = true, // Single page report + Navigator = false, // Top navigation bar + EmbedPictures = true // Embeds images into a document + }; + Relatorio.Export(html, outputStream); + outputStream.Position = 0; } } } diff --git a/NFe.Danfe.OpenFast/NFe/DanfeFrSimplificadoTipo2.cs b/NFe.Danfe.OpenFast/NFe/DanfeFrSimplificadoTipo2.cs new file mode 100644 index 000000000..4285c9d35 --- /dev/null +++ b/NFe.Danfe.OpenFast/NFe/DanfeFrSimplificadoTipo2.cs @@ -0,0 +1,31 @@ +using DFe.Utils; +using NFe.Classes; +using NFe.Danfe.Base.NFe; +using Shared.DFe.Danfe; + +namespace NFe.Danfe.OpenFast.NFe +{ + public class DanfeFrSimplificadoTipo2 : DanfeOpenFastBase + { + /// + /// Construtor da classe responsável pela impressão do DANFE Simplificado Tipo 2 da NF-e em Fast Reports + /// + /// Objeto do tipo nfeProc + /// Objeto do tipo contendo as definições de impressão + /// Identificador do Token CSC + /// Token CSC para geração do QR Code + /// Texto do desenvolvedor a ser informado no DANFE + /// Caminho do arquivo frx + public DanfeFrSimplificadoTipo2(nfeProc proc, ConfiguracaoDanfeNfeSimplificadoTipo2 configuracao, string cIdToken, string csc, string desenvolvedor = "", string arquivoRelatorio = "") + { + byte[] frx = null; + if (string.IsNullOrWhiteSpace(arquivoRelatorio)) + { + const string caminho = @"NFe\NFeSimplificadoTipo2.frx"; + frx = FrxFileHelper.TryGetFrxFile(caminho); + } + + Relatorio = DanfeSharedHelper.GenerateDanfeFrNfeSimplificadoTipo2Report(proc, configuracao, cIdToken, csc, frx, desenvolvedor, arquivoRelatorio); + } + } +} \ No newline at end of file diff --git a/NFe.Servicos/ServicosNFe.cs b/NFe.Servicos/ServicosNFe.cs index 13f0be433..5bc761f06 100644 --- a/NFe.Servicos/ServicosNFe.cs +++ b/NFe.Servicos/ServicosNFe.cs @@ -483,7 +483,7 @@ private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List eventos, S #region Valida, Envia os dados e obtém a resposta var xmlEvento = _cFgServico.RemoverAcentos - ? pedEvento.ObterXmlString().RemoverAcentos() + ? pedEvento.ObterXmlString().RemoverAcentosPreservandoDescEvento() : pedEvento.ObterXmlString(); SalvarArquivoXml(idlote + "-ped-eve.xml", xmlEvento); @@ -502,7 +502,7 @@ private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List eventos, S var detEvento = evento.infEvento.detEvento; var detEventoXml = FuncoesXml.ClasseParaXmlString(detEvento); if (_cFgServico.RemoverAcentos) - detEventoXml = detEventoXml.RemoverAcentos(); + detEventoXml = detEventoXml.RemoverAcentosPreservandoDescEvento(); Validador.Valida(servicoEvento, _cFgServico.VersaoRecepcaoEventoCceCancelamento, detEventoXml, cfgServico: _cFgServico, validarLote: false); } @@ -1410,9 +1410,11 @@ public RetornoRecepcaoEvento RecepcaoEventoInformacaoDeEfetivoPagamentoIntegralP return retornoRecepcaoEvento; } - + /// - /// Serviço para evento a ser gerado pelo destinatário da NF-e em relação às notas fiscais de aquisição de emissão de terceiros e que lhe gerem o direito à apropriação de crédito presumido. + /// Serviço para Evento a ser gerado pelo destinatário da NF-e em relação às notas fiscais de aquisição de emissão + /// de terceiros e que lhe gerem o direito à apropriação de crédito presumido, + /// ou pelo emitente quando a informação não tiver sido incluída na NF - e ou necessitar correção. /// /// Nº do lote /// sequencia do evento @@ -1429,7 +1431,7 @@ public RetornoRecepcaoEvento RecepcaoEventoSolicitacaoDeApropriacaoDeCreditoPres string cpfCnpj, TipoAutor tipoAutor, string chaveNFe, - List informacoesDeCreditoPresumidoPorItem, + List informacoesDeCreditoPresumidoPorItem, Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dataHoraEvento = null) @@ -1440,7 +1442,7 @@ public RetornoRecepcaoEvento RecepcaoEventoSolicitacaoDeApropriacaoDeCreditoPres var versaoServicoRecepcaoString = servicoNfe.VersaoServicoParaString(versaoServicoRecepcao); var detalhesEvento = ObterDetalhesEvento(versaoServicoRecepcaoString, versaoAplicativo, nfeTipoEvento, ufAutor, tipoAutor); - detalhesEvento.gCredPres = informacoesDeCreditoPresumidoPorItem; + detalhesEvento.gCredPresOper = informacoesDeCreditoPresumidoPorItem; var informacoesEventoEnv = ObterInformacoesEventoEnv(sequenciaEvento, chaveNFe, cpfCnpj, versaoServicoRecepcaoString, cOrgao: Estado.SVRS, dataHoraEvento, nfeTipoEvento, detalhesEvento); var evento = ObterEvento(versaoServicoRecepcaoString, informacoesEventoEnv); diff --git a/NFe.Utils/Assinatura/Assinador.cs b/NFe.Utils/Assinatura/Assinador.cs index 8ffcc5a52..51d31603f 100644 --- a/NFe.Utils/Assinatura/Assinador.cs +++ b/NFe.Utils/Assinatura/Assinador.cs @@ -30,13 +30,14 @@ /* http://www.zeusautomacao.com.br/ */ /* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */ /********************************************************************************/ +using DFe.Utils; +using DFe.Utils.Assinatura; +using NFe.Utils.Evento; +using Shared.DFe.Utils; using System; using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.Xml; using System.Xml; -using DFe.Utils; -using DFe.Utils.Assinatura; -using Shared.DFe.Utils; using Signature = DFe.Classes.Assinatura.Signature; namespace NFe.Utils.Assinatura @@ -92,7 +93,7 @@ public static Signature ObterAssinatura(T objeto, string id, X509Certificate2 { var documento = new XmlDocument { PreserveWhitespace = true }; var xml = cfgServicoRemoverAcentos - ? FuncoesXml.ClasseParaXmlString(objetoLocal).RemoverAcentos() + ? FuncoesXml.ClasseParaXmlString(objetoLocal).RemoverAcentosPreservandoDescEvento() : FuncoesXml.ClasseParaXmlString(objetoLocal); documento.LoadXml(xml); diff --git a/NFe.Utils/Evento/Extevento.cs b/NFe.Utils/Evento/Extevento.cs index b5fa718ec..8f652b449 100644 --- a/NFe.Utils/Evento/Extevento.cs +++ b/NFe.Utils/Evento/Extevento.cs @@ -30,12 +30,16 @@ /* http://www.zeusautomacao.com.br/ */ /* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */ /********************************************************************************/ -using System; -using System.Security.Cryptography.X509Certificates; using DFe.Utils; using NFe.Classes.Servicos.Evento; using NFe.Classes.Servicos.Tipos; using NFe.Utils.Assinatura; +using Shared.DFe.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text.RegularExpressions; namespace NFe.Utils.Evento { @@ -89,5 +93,66 @@ public static evento Assina(this evento evento, X509Certificate2 certificadoDigi eventoLocal.Signature = assinatura; return eventoLocal; } + + /// + /// descEvento que o XSD do evento só aceita com acento, indexados pela forma sem acento. + /// Os demais eventos (ex.: Carta de Correção, cujo XSD aceita as duas formas) continuam sem acento. + /// + private static readonly Dictionary DescEventoSomenteComAcento = new[] + { + NFeTipoEvento.TeNfeCancConciliacaoFinanceiraNFe, + NFeTipoEvento.TeNfeInformacaoDeEfetivoPagamentoIntegralParaLiberarCreditoPresumidoDoAdquirente, + NFeTipoEvento.TeNfeImportacaoEmAlcZfmNaoConvertidaEmIsencao, + NFeTipoEvento.TeNfeFornecimentoNaoRealizadoComPagamentoAntecipado, + NFeTipoEvento.TeNfeAtualizacaoDaDataDePrevisaoDeEntrega, + NFeTipoEvento.TeNfeSolicitacaoDeApropriacaoDeCreditoPresumido, + NFeTipoEvento.TeNfeDestinacaoDeItemParaConsumoPessoal, + NFeTipoEvento.TeNfeAceiteDeDebitoNaApuracaoPorEmissaoDeNotaDeCredito, + NFeTipoEvento.TeNfeImobilizacaoDeItem, + NFeTipoEvento.TeNfeSolicitacaoApropriacaoCreditoCombustivel, + NFeTipoEvento.TeNfeSolicitacaoDeApropriacaoDeCreditoParaBensEServicosQueDependemDeAtividadeDoAdquirente, + NFeTipoEvento.TeNfeManifestacaoSobrePedidoDeTransferenciaDeCreditoDeIbsEmOperacoesDeSucessao, + NFeTipoEvento.TeNfeManifestacaoSobrePedidoDeTransferenciaDeCreditoDeCbsEmOperacoesDeSucessao, + NFeTipoEvento.TeNfeManifestacaoDoFiscoSobrePedidoDeTransferenciaDeCreditoDeIbsEmOperacoesDeSucessao, + NFeTipoEvento.TeNfeManifestacaoDoFiscoSobrePedidoDeTransferenciaDeCreditoDeCbsEmOperacoesDeSucessao + }.Select(t => t.Descricao()).ToDictionary(d => d.RemoverAcentos(), d => d); + + /// + /// xCondUso que o XSD do evento só aceita com acento, indexados pela forma sem acento: + /// 110150 (Ator interessado na NF-e), quando o autor é o emitente ou o destinatário. + /// A Carta de Correção não entra, porque o XSD dela aceita as duas formas. + /// + private static readonly Dictionary XCondUsoSomenteComAcento = new[] + { + "O emitente ou destinatário da NF-e, declara que permite o transportador declarado no campo CNPJ/CPF deste evento a autorizar os transportadores subcontratados ou redespachados a terem acesso ao download da NF-e" + }.ToDictionary(x => x.RemoverAcentos(), x => x); + + /// + /// Remove os acentos do XML, mantendo o descEvento e o xCondUso dos eventos cujo XSD só aceita o texto acentuado + /// (ex.: descEvento "Imobilização de Item" e xCondUso do evento 110150) + /// + /// XML do evento + /// XML sem acentos, exceto no descEvento e no xCondUso dos eventos que exigem acentuação + public static string RemoverAcentosPreservandoDescEvento(this string xml) + { + var semAcentos = xml.RemoverAcentos(); + if (string.IsNullOrEmpty(semAcentos) || (semAcentos.IndexOf("", StringComparison.Ordinal) < 0 && semAcentos.IndexOf("", StringComparison.Ordinal) < 0)) + return semAcentos; + + semAcentos = RestaurarTextoAcentuado(semAcentos, "descEvento", DescEventoSomenteComAcento); + return RestaurarTextoAcentuado(semAcentos, "xCondUso", XCondUsoSomenteComAcento); + } + + private static string RestaurarTextoAcentuado(string xml, string tag, IReadOnlyDictionary textosComAcento) + { + return Regex.Replace(xml, "<" + tag + ">([^<]*)", m => + { + string texto; + + return textosComAcento.TryGetValue(m.Groups[1].Value, out texto) + ? "<" + tag + ">" + texto + "" + : m.Value; + }); + } } } \ No newline at end of file diff --git a/README.md b/README.md index ad124c97e..a7aa45e79 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ A biblioteca foi desenvolvida em **C#** utilizando Visual Studio Community 2022 | NFe, NFCe, CTe, MDFe | .NET 4.6.2, .NET 4.7, .NET 4.7.1, .NET 4.7.2, .NET 4.8, .NetStandard 2.0, .NET 6.0 .NET 7.0 .NET 8.0 | | Impressões com OpenFastReport (NFe, NFCe, CTe, MDFe) | ..NET 4.6.2, .NET 4.7, .NET 4.7.1, .NET 4.7.2, .NET 4.8, .NetStandard 2.0, .NET 6.0(windows+linux) .NET 7.0+(windows) | | Impressões com FastReport(versão paga) (NFe, NFCe, CTe, MDFe) | .NET 4.6.2, .NET 4.7, .NET 4.7.1, .NET 4.7.2, .NET 4.8 .NetStandard 2.0, .NET 6.0 .NET 7.0+(windows) | -| Impressões com FastReport.Skia(versão paga) (NFe) | .NET 7.0+(windows+linux+mobile) | +| Impressões com FastReport.Skia(versão paga) (NFe, NFCe, CTe, MDFe) | .NET 7.0+(windows+linux+mobile) | ***Não temos suporte para .NetFramework 4.5.2 ou 4.5 ou menor. A Biblioteca irá seguir o [ciclo de vida de versões da microsoft](https://dotnet.microsoft.com/en-us/learn/dotnet/what-is-dotnet-framework), sendo retirado a compatibilidade de versoes específicas e antigas do .Net caso a microsoft retire seu suporte.*** @@ -106,10 +106,11 @@ Para facilitar o seus estudos a biblioteca oferece projetos do tipo DEMO, sendo ## Impressão (FastReport): - Exemplo no Projeto *NFe.Danfe.AppTeste.Fast*. +- Suporte a linux usando os pacotes SkiaSharp https://www.fast-report.com/blogs/fastreport-core-skia (projetos *NFe.Danfe.Fast.Skia*, *CTe.Dacte.Fast.Skia* e *MDFe.Damdfe.Fast.Skia*) - A impressão de forma nativa (sem dependências de bibliotecas de terceiros) está disponível somente para a *NFCe*¹. - O projeto conta também com a impressão em FastReport.Net¹ (https://www.fast-report.com/pt/product/fast-report-net/) para *NFe*, *NFCe²* _(térmica)_, *CTe* _(modal rodoviário)_ e *MDFe*. ->¹ As dlls do FastReport.Net disponibilizadas na biblioteca são da versão de demonstração³ do mesmo. A versão de demonstração coloca uma marca d'água "DEMO VERSION" na impressão do relatório. Se você possui licença FastReport.Net, substitua as dlls do FastReport.Net nos projetos NFe.Danfe.Fast\Dll, CTe.Dacte.Fast\DLLs e MDFe.Damdfe.Fast\Dlls pelas dlls de sua versão licenciada, antes de compilar sua aplicação para distribuição. +>¹ As dlls do FastReport.Net disponibilizadas na biblioteca são da versão de demonstração³ do mesmo. A versão de demonstração coloca uma marca d'água "DEMO VERSION" na impressão do relatório. Se você possui licença FastReport.Net, substitua as dlls do FastReport.Net nos projetos NFe.Danfe.Fast\Dll, CTe.Dacte.Fast\DLLs e MDFe.Damdfe.Fast\Dlls pelas dlls de sua versão licenciada, antes de compilar sua aplicação para distribuição. Nos projetos NFe.Danfe.Fast.Skia\Dlls, CTe.Dacte.Fast.Skia\Dlls e MDFe.Damdfe.Fast.Skia\Dlls a substituição deve ser feita pelas dlls licenciadas do FastReport.Skia. >² Obs: Visando abranger o maior número possível de impressoras térmicas, a impressão é feita via spooler do windows. A impressão térmica via spooler, dependendo da impressora, pode sair com má qualidade. Para sanar isso, no relatório são utilizadas duas fontes condensadas que possuem boa legibilidade em tamanho pequeno, a saber a OpenSans e UbuntuCondensed, ambas de uso livre podendo ser obtidas em https://www.google.com/fonts; As fontes estão anexadas ao projeto em Shared.NFe.Danfe.Base\Fontes_; diff --git a/Zeus NFe.sln b/Zeus NFe.sln index 7271f3e39..c7c5eeb16 100644 --- a/Zeus NFe.sln +++ b/Zeus NFe.sln @@ -25,6 +25,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CTe.Dacte.Base", "CTe.Dacte EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CTe.Dacte.Fast", "CTe.Dacte.Fast\CTe.Dacte.Fast.csproj", "{1D58CBBD-56A5-4A10-8DAB-F795D35150EE}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CTe.Dacte.Fast.Skia", "CTe.Dacte.Fast.Skia\CTe.Dacte.Fast.Skia.csproj", "{C9F7B541-7D23-4984-9E78-01BD6CA4E331}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CTe.Dacte.AppTeste", "CTe.Dacte.AppTeste\CTe.Dacte.AppTeste.csproj", "{827FA496-0F49-4E93-8CE9-2246CCD353B8}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Teste", "Teste", "{164EF13E-7F27-4BC8-92A4-A82B1696B279}" @@ -107,6 +109,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFe.Danfe.AppTeste.OpenFast EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MDFe.Damdfe.OpenFast", "MDFe.Damdfe.OpenFast\MDFe.Damdfe.OpenFast.csproj", "{55C00722-DE2E-467C-A9BC-D5BCDC0FCC43}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MDFe.Damdfe.Fast.Skia", "MDFe.Damdfe.Fast.Skia\MDFe.Damdfe.Fast.Skia.csproj", "{23B191EA-9B61-4C54-9ABE-976C47E06CDC}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AppTeste", "AppTeste", "{0AFEB550-56BB-449B-BB3A-0625167B4669}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AppTeste", "AppTeste", "{97A82A0A-A574-452D-9D89-C6F0840DDDB8}" @@ -213,6 +217,14 @@ Global {1D58CBBD-56A5-4A10-8DAB-F795D35150EE}.Release|Any CPU.Build.0 = Release|Any CPU {1D58CBBD-56A5-4A10-8DAB-F795D35150EE}.Release|x86.ActiveCfg = Release|Any CPU {1D58CBBD-56A5-4A10-8DAB-F795D35150EE}.Release|x86.Build.0 = Release|Any CPU + {C9F7B541-7D23-4984-9E78-01BD6CA4E331}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9F7B541-7D23-4984-9E78-01BD6CA4E331}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9F7B541-7D23-4984-9E78-01BD6CA4E331}.Debug|x86.ActiveCfg = Debug|Any CPU + {C9F7B541-7D23-4984-9E78-01BD6CA4E331}.Debug|x86.Build.0 = Debug|Any CPU + {C9F7B541-7D23-4984-9E78-01BD6CA4E331}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9F7B541-7D23-4984-9E78-01BD6CA4E331}.Release|Any CPU.Build.0 = Release|Any CPU + {C9F7B541-7D23-4984-9E78-01BD6CA4E331}.Release|x86.ActiveCfg = Release|Any CPU + {C9F7B541-7D23-4984-9E78-01BD6CA4E331}.Release|x86.Build.0 = Release|Any CPU {827FA496-0F49-4E93-8CE9-2246CCD353B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {827FA496-0F49-4E93-8CE9-2246CCD353B8}.Debug|Any CPU.Build.0 = Debug|Any CPU {827FA496-0F49-4E93-8CE9-2246CCD353B8}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -445,6 +457,14 @@ Global {55C00722-DE2E-467C-A9BC-D5BCDC0FCC43}.Release|Any CPU.Build.0 = Release|Any CPU {55C00722-DE2E-467C-A9BC-D5BCDC0FCC43}.Release|x86.ActiveCfg = Release|Any CPU {55C00722-DE2E-467C-A9BC-D5BCDC0FCC43}.Release|x86.Build.0 = Release|Any CPU + {23B191EA-9B61-4C54-9ABE-976C47E06CDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23B191EA-9B61-4C54-9ABE-976C47E06CDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23B191EA-9B61-4C54-9ABE-976C47E06CDC}.Debug|x86.ActiveCfg = Debug|Any CPU + {23B191EA-9B61-4C54-9ABE-976C47E06CDC}.Debug|x86.Build.0 = Debug|Any CPU + {23B191EA-9B61-4C54-9ABE-976C47E06CDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23B191EA-9B61-4C54-9ABE-976C47E06CDC}.Release|Any CPU.Build.0 = Release|Any CPU + {23B191EA-9B61-4C54-9ABE-976C47E06CDC}.Release|x86.ActiveCfg = Release|Any CPU + {23B191EA-9B61-4C54-9ABE-976C47E06CDC}.Release|x86.Build.0 = Release|Any CPU {2DB1B4DC-ABC2-4B8B-B7AE-8C6EB3EDA210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2DB1B4DC-ABC2-4B8B-B7AE-8C6EB3EDA210}.Debug|Any CPU.Build.0 = Debug|Any CPU {2DB1B4DC-ABC2-4B8B-B7AE-8C6EB3EDA210}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -547,6 +567,7 @@ Global {47A90E97-AD65-4673-91CB-B42065E9C575} = {F841431C-E84B-4B4A-9CAA-515BCAAB4648} {E46ECA77-8732-4D99-9460-FA5E2CD90266} = {E29EDD3B-9F68-4F8D-9E38-0E0E38942E4A} {1D58CBBD-56A5-4A10-8DAB-F795D35150EE} = {E29EDD3B-9F68-4F8D-9E38-0E0E38942E4A} + {C9F7B541-7D23-4984-9E78-01BD6CA4E331} = {E29EDD3B-9F68-4F8D-9E38-0E0E38942E4A} {827FA496-0F49-4E93-8CE9-2246CCD353B8} = {0AFEB550-56BB-449B-BB3A-0625167B4669} {003B008B-F388-4FB5-A081-12C0FBA84B57} = {F981A8AC-E660-492B-8BF3-CBF70B66E392} {3AC1A3D4-91D0-471A-AF9C-5EF8442F3F27} = {003B008B-F388-4FB5-A081-12C0FBA84B57} @@ -582,6 +603,7 @@ Global {DEFCCB64-84E6-45B1-984C-9CAF0BA8CC23} = {3AC1A3D4-91D0-471A-AF9C-5EF8442F3F27} {81CCEE73-EE9A-4A7D-899D-A55730E4A60B} = {3AC1A3D4-91D0-471A-AF9C-5EF8442F3F27} {55C00722-DE2E-467C-A9BC-D5BCDC0FCC43} = {1664C93C-730D-40B3-8257-B652B26F7EE8} + {23B191EA-9B61-4C54-9ABE-976C47E06CDC} = {1664C93C-730D-40B3-8257-B652B26F7EE8} {0AFEB550-56BB-449B-BB3A-0625167B4669} = {E29EDD3B-9F68-4F8D-9E38-0E0E38942E4A} {97A82A0A-A574-452D-9D89-C6F0840DDDB8} = {1664C93C-730D-40B3-8257-B652B26F7EE8} {2DB1B4DC-ABC2-4B8B-B7AE-8C6EB3EDA210} = {E29EDD3B-9F68-4F8D-9E38-0E0E38942E4A}