Ir para conteúdo
  • Cadastre-se

dremul

Membros
  • Total de ítens

    41
  • Registro em

  • Última visita

Tudo que dremul postou

  1. Prezados. Alguma atualização nesse tópico? Não consigo validar um NCM individual. Baixei o último fonte indicado, reinstalei os componentes, deixei a URL que está vindo por padrão agora (http://www4.receita.fazenda.gov.br/simulador/PesquisarNCM2.jsp?origem=PesquisarNCM2.jsp&) e não funciona, retorna NCM inválido pra 01051110 por exemplo. abs Andre `
  2. dremul

    Baixar Xml

    Pessoal. Só para registrar o que eu fiz: Eu pago uma solução chamada Arquivei. Subo o certificado A1 na nuvem. Daí o serviço deles consulta todas as notas. Arquiva em servidores da Amazon. Eles também disponibilizam um aplicativo que baixa todas as notas localmente. Apontei a minha aplicação para esse diretório. Resultado: O usuário lê a Danfe e o XML é carregado, porque ele já está baixado, e o usuário nem vê isso acontecendo. abs André
  3. Olá colegas. Estou rodando a versão 0.9.03.3 do Monitor. Ao tentar emitir uma Danfe recebo a mensagem de erro Canvas Does Not Allow Drawing. Alguém já passou por isso? obrigado André
  4. Você consegue imaginar o caos que seria os clientes precisarem esperar 30 segundos para aprovar cada "cupom" em frentes de caixa movimentadas? No rush? Totalmente inviável. 30 segundos, parado, esperando ali em pé, é muito tempo. Até 5 segundo é viável. Chorando em 10 segundos. Qualquer número além disso é off-line na veia
  5. Na verdade, pelo seu último arquivo dá: ERRO: Falha na validação dos dados da nota 19 TAG:<dest> ID:E02-E03/CNPJ-CPF(CNPJ/CPF) - Nenhum valor informado. TAG:<det nItem="1"><prod> ID:I05/NCM(Código NCM) - Nenhum valor informado. Element '{http://www.portalfiscal.inf.br/nfe}xNome'is unexpected according to content model of parent element '{http://www.portalfiscal.inf.br/nfe}dest'. Expecting: {http://www.portalfiscal.inf.br/nfe}CNPJ,{http://www.portalfiscal.inf.br/nfe}CPF, {http://www.portalfiscal.inf.br/nfe}idEst....
  6. Estou rodando a 0.9.03.3. Coloquei o seu arquivo, com os espaços em branco. E o erro no SAINFE.txt é ERRO: '' is not a valid floating point value Não dá esse outro erro não.
  7. Isaque. Eu tenho rotinas que exportam o bloco C por período (empresa/filial/ ...). Eu passo uma interface com parâmetros que me devolvem ele preenchido. Está tudo pronto. Eu poderia usar esse mesmo módulo para os 2 relatórios. A questão é que o Acbr tem um erro de design: Como no layout alguns registros possuem a seguinte documentação: "Registro com estrutura, campos e conteúdo definidos e constantes no Leiaute da Escrituração Fiscal Digital – EFD (ICMS e IPI)" A classe do registro deveria ser a mesma nos 2 SPEDs. Mas eu também sei o motivo disso: eu trabalhei no Contribuições desde bem cedo (incluindo quando ainda não estava liberado para o público em geral). Então me lembro que no início não era assim e todos "front runners" duplicaram as estruturas. Eu também projetei a duplicação disso na SAP por exemplo (https://br.linkedin.com/in/mullera). PS: a minha dúvida aqui é para uma coisa pessoal, um sistema que fiz para um negócio de minha família a mais de 10 anos atrás e mantenho por que gosto No topo das alternativas também imagino 4) Unificamos as classes. Isso pode gerar impacto em quem usa, por isso não recomendado 5) Eu resolvo meu problema já que ele é pequeno. Só entrego poucos registros. Essa a mais fácil pra mim, só imaginei que seria interessante contribuir Bom, vou de alternativa (5). Se surgir algum outro ponto que possa ser interessante para o grupo, eu aviso. Agradeço à todos pelo interesse. abs André
  8. Aqui tem a documentação sobre a diretiva de compilação: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/compdirsruntimetypeinformation_xml.html Veja que ali ele diz que a diretiva serve exatamente para ativar o RTTI para as propriedades da classe. Também para tornar visível coisas fora da Published. Isso exatamente porque nas versões mais altas do Delphi o RTTI é um pouco diferente e tudo no published já está liberado. Nas versões mais baixar (a minha é D7) é preciso da diretiva pra liberar a published em si pra RTTI. Então, nós poderíamos trocar de public pra published pra todas versões, mas adicionar o {M} somente para algumas versões, começando com o D7 (talvez somente esse inclusive)
  9. Olá Isaque. Não sei se entendi sua sugestão. Você diz uma rotina genérica que preenche ambos registros? Não tem como fazer isso com pouco código e dinâmico visto que as classes não possuem uma herança em comum. Daria para fazer as atribuições manualmente, de propriedades com o mesmo nome (mesma tag), uma por uma, isso é um procedimento manual e característica de um método Assign, que foi a outra alternativa que imaginei. Mais trabalhosa sim, precisa ser mantida depois, mas feita somente 1x por um de nós. Sobre as alterações, minha dúvida está mais no Lazarus que desconheço. As versões mais altas de Delphi possuem uma forma mais simples de usar RTTI, mas essa forma aqui não é incompatível. E a diretiva de compilação é somente para dizer ao compilador para tratar a classe de forma igual a TPersistent. Temos várias alternativas: 1) Implementar por Assign, já que vou fazer isso igual Com isso cada pessoa que precisar vai ter que implementar o Assign. Cada propriedade nova na classe não pode ser esquecida de ser adicionada ao Assign. Assign também normalmente é de objetos da mesma classe, então na verdade eu indicaria fazer uma nova classe com métodos estáticos para jogar de um tipo pra outro. Até para evitar referência circular entre as classes. 2) Só mudar as classes do Acbr com o Published e o {M} Só serve pra mim. Não faz muito sentido em um código aberto. 3) Mudar as classes do Acbr e entregar a rotina RTTI Acredito que nenhum de nós tem exatamente todos ambientes instalados para testar compatibilidade. Acredito que não exista problema. Sempre tem a possibilidade de isolar código com diretivas se algum problema for encontrado. Também o erro só deve acontecer se alguém tentar usar a rotina RTTI. @Elton: algum retorno no Lazarus? abs André
  10. Olá. Projeto anexado. Lembrando que para funcionar é necessário alterar 2 objetos no Acbr. O anexo também inclui esses objetos, como devem ficar. Não é necessário recompilar os componentes. Minha intenção seria fazer essa alteração (pelo menos no momento) somente para Bloco 0 e C. abs André ReusoSped.zip
  11. Juliomar, obrigado pelo retorno. E em relação ao certificado, quando são emitidos documentas de diversas estações de trabalho (indiferente do modelo de documento-e), o que vocês tem preferido? obrigado André
  12. Prezados. Demorou para postar algo aqui porque não estava trabalhando nesse tópico. Porém, voltei ao tópico hoje e montei um POC. Ele precisa ser estendido para, por exemplo, outros tipos além de string. Mas antes de eu continuar preciso passar com vocês uma alteração que será necessária nas classes do Acbr para que RTTI funcione. Então, eu criei uma rotina que atribui dinamicamente todas as propriedades de uma classe do EFD para as propriedades do PCO. Esse código faz as atribuições dinâmicas: procedure TdmFerramentasAdmin.TestaReuso; var oEfd_Reg: ACBrEFDBloco_0.TRegistro0000; oPco_Reg: ACBrEPCBloco_0.TRegistro0000; iPropIndex: Integer; iPropCount: Integer; pList: PPropList; rInfo, rInfoCheck: PPropInfo; const TypeKinds: TTypeKinds = [tkString, tkLString, tkWString]; begin oEfd_Reg := efd.Bloco_0.Registro0000New(); oEfd_Reg.NOME := 'Teste 1'; oPco_Reg := pco.Bloco_0.Registro0000New(); GetMem(pList, SizeOf(pList^)); try iPropCount := GetPropList(oPco_Reg.ClassInfo, TypeKinds, pList); for iPropIndex := 0 to iPropCount - 1 do begin rInfo := pList^[iPropIndex]; rInfoCheck := GetPropInfo(oEfd_Reg, rInfo.Name); if rInfoCheck = nil then Continue; if Assigned(rInfo^.SetProc) then case rInfo^.PropType^.Kind of tkString, tkLString, tkWString: SetStrProp(oPco_Reg, rInfo, GetPropValue(oEfd_Reg, rInfo.Name)); end; end; finally FreeMem(pList); end; pco.IniciaGeracao(); pco.SaveFileTXT(); end; Porém, para o RTTI funcionar, tanto as classes do EFD quanto do PCO precisam ficar como abaixo (com published ao invés de public, adicionando as diretivas de compilação): {$M+} //REGISTRO 0000: ABERTURA DO ARQUIVO DIGITAL E IDENTIFICAÇÃO DA PESSOA JURÍDICA TRegistro0000 = class private FCOD_VER : TACBrCodVer;{TACBrVersaoLeiaute;} //Código da versão do leiaute conforme a tabela 3.1.1 FTIPO_ESCRIT : TACBrTipoEscrit;{TACBrTipoEscrituracao;} //Tipo de escrituração: 0 - Original; 1 – Retificadora; FIND_SIT_ESP : TACBrIndSitEsp;{TACBrIndicadorSituacaoEspecial;} //Indicador de situação especial: 0 - Abertura; 1 - Cisão; 2 - Fusão; 3 - Incorporação; 4 – Encerramento; FNUM_REC_ANTERIOR : string; //Número do Recibo da Escrituração anterior a ser retificada, utilizado quando TIPO_ESCRIT for igual a 1 FDT_INI : TDateTime; //Data inicial das informações contidas no arquivo FDT_FIN : TDateTime; //Data final das informações contidas no arquivo FNOME : string; //Nome empresarial da pessoa jurídica FCNPJ : string; //Número de inscrição do estabelecimento matriz da pessoa jurídica no CNPJ FUF : string; //Sigla da Unidade da Federação da pessoa jurídica FCOD_MUN : integer; //Código do município do domicílio fiscal da pessoa jurídica, conforme a tabela IBGE FSUFRAMA : string; //Inscrição da pessoa jurídica na Suframa FIND_NAT_PJ : TACBrIndNatPJ;{TACBrIndicadorNaturezaPJ;} //Indicador da natureza da pessoa jurídica: 00 – Sociedade empresária em geral 01 – Sociedade cooperativa 02 – Entidade sujeita ao PIS/Pasep exclusivamente com base na Folha de Salários FIND_ATIV : TACBrIndAtiv;{TACBrIndicadorAtividade;} //Indicador de tipo de atividade preponderante: 0 – Industrial ou equiparado a industrial; 1 – Prestador de serviços; 2 - Atividade de comércio; 3 – Atividade financeira; 4 – Atividade imobiliária; 9 – Outros. published property COD_VER : TACBrCodVer{TACBrVersaoLeiaute} read FCOD_VER write FCOD_VER; property TIPO_ESCRIT : TACBrTipoEscrit{TACBrTipoEscrituracao} read FTIPO_ESCRIT write FTIPO_ESCRIT; property IND_SIT_ESP : TACBrIndSitEsp{TACBrIndicadorSituacaoEspecial} read FIND_SIT_ESP write FIND_SIT_ESP; property NUM_REC_ANTERIOR : string read FNUM_REC_ANTERIOR write FNUM_REC_ANTERIOR; property DT_INI : TDateTime read FDT_INI write FDT_INI; property DT_FIN : TDateTime read FDT_FIN write FDT_FIN; property NOME : string read FNOME write FNOME; property CNPJ : string read FCNPJ write FCNPJ; property UF : string read FUF write FUF; property COD_MUN : integer read FCOD_MUN write FCOD_MUN; property SUFRAMA : string read FSUFRAMA write FSUFRAMA; property IND_NAT_PJ : TACBrIndNatPJ{TACBrIndicadorNaturezaPJ} read FIND_NAT_PJ write FIND_NAT_PJ; property IND_ATIV : TACBrIndAtiv{TACBrIndicadorAtividade} read FIND_ATIV write FIND_ATIV; end; {$M-} Como só vai funcionar com essa alteração, para aperfeiçoar a rotina e entregar no Acbr preciso ter certeza que as alterações das classes to Acbr serão também adicionadas. E então? O que acham? abs André
  13. Prezados. Olhando o AcbrNfeMonitor percebi a configuração de impressão para NFC-e. Como o monitor define qual impressora imprimir? Ou ele manda os comandos somente local e por isso só vai imprimir na própria máquina com o monitor instalado? obrigado André
  14. Prezados. Gostaria de verificar a opinião de vocês sobre o desenvolvimento de NFC-e. Atualmente para NF-e eu utilizo o AcbrNfeMonitor, por arquivo INI, com certificado A3. Isso funciona OK porque tenho somente 1 estação emitindo NF-e. Em breve vou precisar emitir NFC-e, quer dizer então, em cada POS. Pelo fórum a minha percepção é que temos mais pessoas utilizando diretamente os componentes da paleta que o monitor. A minha pergunta pra vocês é a seguinte: o que vocês, dentro da experiência que nesse campo é superior a minha, recomendam? AcbrNfeMonitor? Por TCP/IP? Utilizar os componentes da paleta? Certificado digital instalado em todas estações? Acredito que aí precisaria ser A1, não? desde já obrigado André
  15. PSC: Acabo de baixar o arquivo, média de download de 20 kbps. As vezes ía a Zero, as vezes à 40 kbps.
  16. Pessoal, o site está muito lento. Não consigo baixar o AcbrNfeMonitor, capicom, última versão. Vai baixando, em 10 kbps, mas não consegue completar. Tentei em diferentes máquinas, em diferentes redes, em diferentes cidades. Á pouco, nem estava conseguindo postar esse tópico. Por favor me disponibilizem outro link, urgente porque no momento tenho um erro de layout. obrigado André
  17. dremul

    Parse Chave Nfe

    Claro que existem N formas de fazer isso, fazer um parse completo, retornar num Record, usar Ord(TipoDoCampo) pra ler um array e assim por diante. Também tem a questão do versionamento... Eu postei assim porque é assim que eu preciso dele no momento
  18. dremul

    Parse Chave Nfe

    Prezados. Como não houve resposta, vou postar aqui um código que faz isso e pode ser útil para outros. Eu tenho isso dividido em algumas classes, então pra copiar precisa adaptar, claro. Caso queiram, podem incorporar ao Acbr. type TCampoChaveNfe = (ccnUf, ccnAno, ccnMes, ccnCnpj, ccnModelo, ccnSerie, ccnNumero, ccnFormaEmissao, ccnCodigoNumerico, ccnDigitoVerificador); class function TStrUtils.FiltrarNumero(Value: string): string; var i: integer; begin Result := ''; for i := 1 to Length(Value) do if Value[i] in ['0'..'9'] then Result := Result + Value[i]; end; class function TNfe.GetConteudoCampoChaveNfe(Campo: TCampoChaveNfe; Chave: string): string; var sChave: string; begin sChave := TStrUtils.FiltrarNumero(Chave); if Length(sChave) <> 44 then raise Exception.Create('Chave de acesso inválida, não possui 44 números.'); case Campo of ccnUf: Result := Copy(sChave, 1 , 2); ccnAno: Result := Copy(sChave, 3, 2); ccnMes: Result := Copy(sChave, 5, 2); ccnCnpj: Result := Copy(sChave, 7, 14); ccnModelo: Result := Copy(sChave, 21, 2); ccnSerie: Result := Copy(sChave, 23, 3); ccnNumero: Result := Copy(sChave, 26, 9); ccnFormaEmissao: Result := Copy(sChave, 35, 1); ccnCodigoNumerico: Result := Copy(sChave, 36, 8); else Result := Copy(sChave, 44, 1); end; end; abs André
  19. dremul

    Parse Chave Nfe

    Olá amigos. Vocês conhecem alguma função que faça o parse (decomposição) da chave de acesso da NFe? Sim, seria simples de implementar, mas me pergunto se tem algo pronto obrigado André
  20. Olá Elton. Obrigado pela sua resposta. Então, vejo 2 possibilidades: 1) alteramos as classes de public para published e utilizamos RTTI para criar uma rotina que dinamicamente mapea os campos de mesmo nome de uma classe pra outra 2) criamos métodos Assign nas classes que ficaria parecido com oPisCofins0400 := epc.Bloco_0.Registro0400New(); oPisCofins0400.Assign(IntanciaClasseEFD_0400); Esse método Assign moveria manualmente, campo por campo, as propriedades da instância do EFD para o EPC. Bom, a opção [1] é mais simples de ser implementada, mas depende dos administradores do código ACBR concordarem. A opção [2] é o que eu vou implementar para os registros que eu gero caso a [1] não seja adotada por vocês. O que vocês acham?
  21. Bom, adicionando progresso: Type casts não vão funcionar. O Delphi vai gerar um erro de type cast inválido se tentado fazer um registro EFD virar EPC, mesmo que idênticos nas propriedades. Pegar dinamicamente as propriedades para mover os valores de uma classe para a outra, numa rotina única usando RTTI, não vai funcionar porque as propriedades estão como public, não published. Por enquanto é um beco sem saída, aparentemente vou precisar duplicar muito código.
  22. Sim, mas daí preciso repetir o código. Vai ser uma cópia do código, porém instanciando uma classe diferente (apesar de ter os mesmos campos). Um código semelhante vai existir 2 vezes. Ex: se mudar o layout do C100 vou precisar arrumar as 2 implementações, apesar dos 2 registros serem idênticos. Isso estaria resolvido se os 2 fossem a mesma classe ou partilhassem uma herança em comum (depois de TObject, com os campos). Vou ver se consigo resolver isso com um type cast dinâmico ou algo parecido. Se alguém tiver alguma ideia, estou aberto abs
  23. Prezado. Estou sem os fontes e o Delphi aqui nesse PC, então os nomes das classes serão aproximados. Então, digamos que eu tenha uma rotina que faz o seguinte: var oReg0400: TRegistroC400; begin oReg0400 := efd.bloco_0.RegistroC400New. oReg0400.COD_NAT = ‘01’; oReg0400.DESC_NAT = ‘Venda de mercadoria’; Bom, essa mesma rotina eu poderia utilizar para exportar o 0400 para o EFD (SPED ICMS/IPI) quanto para o EPC (SPED PIS/COFINS). Porém, aquele registro C400 que eu declarei, é específico para a classe do EFD. Não é uma classe genérica que eu possa usar para preencher o EFD e o EPC. São de “tipos” diferentes. Então, como vocês fazem para reaproveitar o mesmo código de um report para preencher outro report? Entendeu? abs
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.