Ir para conteúdo
  • Cadastre-se

Gabriel Frones

Membros
  • Total de ítens

    115
  • Registro em

  • Última visita

  • Days Won

    2

Tudo que Gabriel Frones postou

  1. Na versão mais recente dos fontes, o PCN e o ACBrDFe estão altamente acoplados, de maneira que usar o PCN apenas para geração dos arquivos XML inclui até mesmo as bibliotecas de criptografia. Em um teste rápido que fiz, criei um novo projeto apenas com um pcnNFe e um pcnNFeW e ao compilar, o executável tentou carregar dinamicamente a libxml2.dll. Esse acoplamento se deve ao uso da ACBrDFeUtil no pcnNFeW. Para resolver isso aqui eu movi todas as funções de validação do ACBrDFeUtil para o pcnAuxiliar. As funções movidas foram: function ValidaDIDSI(AValue: String): Boolean; function ValidaDIRE(AValue: String): Boolean; function ValidaRE(AValue: String): Boolean; function ValidaDrawback(AValue: String): Boolean; function ValidaSUFRAMA(AValue: String): Boolean; function ValidaRECOPI(AValue: String): Boolean; function ValidaNVE(AValue: string): Boolean; Obs.: As funções ValidaUFCidade não são usadas em parte alguma dos fontes do ACBr.
  2. O código sugere que o repositório contem um arquivo .res binário pré-compilado para 32 bits, e que usa o .rc para compilar um novo .res se for 64 bits. O seu deve estar caindo nessa linha do .rc porque está usando uma plataforma 64 bits. Mas o FPC possui suporte a arquivos .rc desde a versão 2.4. De uma olhada aqui: http://wiki.freepascal.org/Lazarus_Resources#FPC_resources Quanto à sua dificuldade, talvez você não tenha o compilador de resources instalado. Mas posta aqui a mensagem de erro que você está obtendo, assim não temos que adivinhar qual o problema. rs
  3. Bom, adiciona todos os paths, independente de pacote escolhido (dá pra otimizar, mas tenho minhas dúvidas se vale o trabalho), mas não adicionou nenhum .svn. Você baixa os fontes pelo SVN ou por algum zip?
  4. Confesso que também fiquei confuso com a resposta do amigo Juliomar rs. Então procurei nos fontes do instalador e achei a seguinte função: procedure TfrmPrincipal.FindDirs(ADirRoot: String; bAdicionar: Boolean = True); var oDirList: TSearchRec; function EProibido(const ADir: String): Boolean; const LISTA_PROIBIDOS: ARRAY[0..4] OF STRING = ( 'quick', 'rave', 'laz', 'VerificarNecessidade', '__history' ); var Str: String; begin Result := False; for str in LISTA_PROIBIDOS do begin Result := Pos(AnsiUpperCase(str), AnsiUpperCase(ADir)) > 0; if Result then Break; end; end; begin ADirRoot := IncludeTrailingPathDelimiter(ADirRoot); if FindFirst(ADirRoot + '*.*', faDirectory, oDirList) = 0 then begin try repeat if ((oDirList.Attr and faDirectory) <> 0) and (oDirList.Name <> '.') and (oDirList.Name <> '..') and (not EProibido(oDirList.Name)) then begin with oACBr.Installations[iVersion] do begin if bAdicionar then begin AddToLibrarySearchPath(ADirRoot + oDirList.Name, tPlatform); AddToLibraryBrowsingPath(ADirRoot + oDirList.Name, tPlatform); end else RemoveFromLibrarySearchPath(ADirRoot + oDirList.Name, tPlatform); end; //-- Procura subpastas FindDirs(ADirRoot + oDirList.Name, bAdicionar); end; until FindNext(oDirList) <> 0; finally SysUtils.FindClose(oDirList) end; end; end; Pelo código, só posso assumir que ele adiciona todos os subdiretórios de Fontes, com exceção destes poucos listados no array de proibidos. Curiosamente, o diretório .svn não aparece na lista de proibidos, então me pergunto se ele não estará adicionando estes diretórios também ao path. Alguém que tenha instalado pelo instalador confirma? Abraços.
  5. Raylan, Sempre usei ACBr sem instalar. Funciona muito bem e facilita bastante a instalação de atualizações: É só baixar. Sempre que o componente é não visual, eu costumo preferir essa abordagem. Só o que tem que fazer é como disse o colega Nazareno: Adicionar o ACBr ao path: são várias pastas a adicionar. Quanto mais componentes for usar, mais pastas terá que adicionar. Eu particularmente, vou tentando compilar, vejo qual unit está faltando, localizo e adicionando ao path. Uma alternativa a essas várias pastas é colocar tudo na mesma pasta... mas aí você vai ter um pouco mais de trabalho na hora de atualizar... acho mais prático adicionar os paths. Depois você pode copiar a linha do Library Path e guardar em um arquivo texto (eu tenho um repositório só para esses arquivos texto rs) caso precise configurar em uma nova instalação. Usar os componentes instanciando dinamicamente quando for usar (variavel := TComponente.Create). Aqui cabe ter uma certa atenção às boas práticas de instanciamento de classes no Delphi: Não esquecer de liberar os objetos não mais necessários; Usar sempre uma variável local ou Field de algum objeto, se possível (poucas situações na minha experiencia exigiram uma variável global!) Se for um Field, provavelmente será uma boa ideia instanciar no constructor da classe e destruir no destructor (às vezes não é necessário destruir manualmente, se o objeto for owner do componente instanciado.
  6. Colegas, O grupo ICMS90 (N10 no manual), não está sendo exportado corretamente no TXT, pois a id de grupo do cst90 está associada ao código 12 (o que corresponderia ao grupo N12, que nem existe). O correto é associar ao grupo N10, portanto a seguinte alteração corrige o problema: ----------------------- Fontes/PCNComum/pcnConversao.pas ----------------------- index 5c54c86..8ce2434 100644 @@ -708,7 +708,7 @@ end; function CSTICMSToStrTagPos(const t: TpcnCSTIcms): string; begin - result := EnumeradoToStr(t, ['02', '03', '04', '05', '06', '06', '06', '07', '08', '09', '10', '11', '12', '10a', '10a', '10b'], + result := EnumeradoToStr(t, ['02', '03', '04', '05', '06', '06', '06', '07', '08', '09', '10', '11', '10', '10a', '10a', '10b'], [cst00, cst10, cst20, cst30, cst40, cst41, cst50, cst51, cst60, cst70, cst80, cst81, cst90, cstPart10 , cstPart90 , cstRep41]); end; Abraços.
  7. Arnaldo, Não sou advogado, mas no meu entendimento, seu cliente está fraudando a receita usando recursos que qualquer sistema de AC será certamente obrigado a fornecer. Não vejo saída nesse momento, a não ser fiscalização. Aliás, em breve não será muito difícil, pois com NFe em todas as operações, o fisco terá um bom controle do estoque do varejista. Só vai conseguir vender sem nota se comprar sem nota. Enfim, eu não me preocuparia com isso, a não ser como cidadão. rs
  8. Colega, Não acho que você possa ter problemas legais com relação a isso. Fica muito claro nessa situação que a má fé é do seu cliente, e não sua. E até onde sei, uma venda pode ser cancelada antes de ser transmitida (antes mesma de ser "paga", nesse caso), e nesse caso, não tem que transmitir nada mesmo, diferente do ECF, que nesse ponto já teria registrado os itens. Agora, sugiro que verifique se o seu sistema toma as medidas possíveis para evitar isso, como exigir uma senha de supervisor para cancelar os itens. Porque se você não exige nenhuma senha, então você pode ter problemas com seu próprio cliente, que pode a qualquer momento ser roubado por um operador de caixa executando exatamente esse procedimento.
  9. Em qual UF? Em SP, não tem como: se estiver sem internet, só com SAT/CFe. Não tem outra contingencia. Se disser sua UF, posso dar uma pesquisada aqui e ver se encontro se o mesmo vale.
  10. Amigo, Qual estado? O seu procedimento me parece incompleto, porque você não está fazendo nenhum tipo de transmissão de informação à SEFAZ. No estado de SP, se bem me lembro, a contingencia é o SAT/CFe. Tem também o EPEC, mas só é ativado quando a própria sefaz sai do ar, e ainda assim tem que transmitir um arquivo (só que para um ambiente diferente).
  11. Existiu outro fórum sobre o ACBr (inclusive era o oficial), e acho que talvez ainda tenha muito conhecimento interessante por lá. Este fórum, no entanto estava muito mal administrado e acabou caindo em desuso (uma pena... tinhamos formado uma comunidade Delphi muito legal por lá). Acho que por isso a equipe do ACBr optou por migrar. Não vou passar o link porque a última vez que acessei recebi alerta de malware do google e do meu antivirus (algum ad, provavelmente), mas se alguém quiser arriscar, se chama forumweb. =/ Edit: Aparentemente está fora do ar. Era só questão de tempo para morrer definitivamente.
  12. Italo, Desculpe, acho que não fui claro. O que acontece é que esse campo está duplicado no TNFe. Ele existe dentro do grupo NFRef, como deveria e como manda o manual, como você observou. Mas ele também existe como filho do TIde, e isso não está no manual. No meu arquivo anexo, apenas removi aquele que está como filho do TIde e, portanto, não existe no manual.
  13. Colegas, A propriedade refNFP do TIde não existe no leiaute da receita e não é utilizada em lugar nenhum, e acredito que tenha sido incluida por acidente. Para verificar isso, eu fiz um grep por Ide.refNFP no diretório de fontes e não encontrei nada. Estou enviando o pcnNFe.pas que alterei removendo essa propriedade. Abraços. pcnNFe.pas
  14. Mauricio, Tem cara de ser alguma dependencia não atendida. Como fiz em C#, minha aposta é o .Net Framework. Vi aqui que ele estava configurado para compilar para .Net Framework 4.5. Eu alterei para compilar para .Net Framework 3.0... talvez já resolva seu problema. Segue anexo a nova versão, com o executável compilado na mesma pasta. Obrigado pelo feedback. SatCVSign.zip
  15. @MauricioElias eu disponibilizei meu programa com os fontes. Mas o executável compilado está dentro de 'SatCVSign/bin/Release'.
  16. @Felipenata esse erro é no programa que eu enviei? @MauricioElias, eu confiaria no da Tanca se houver diferença entre eles (mas é claro que o site da SEFAZ é o soberano aqui rs). Uma primeira versão do programa que fiz tinha um bug que gerava uma chave diferente do da Tanca. E teste com o meu programa também.
  17. Colegas, Segue o programa em C# (tem o binário dentro da pasta bin/Release) que eu desenvolvi para assinar com certificado A1 diretamente do repositório do Windows. Ele é semelhante ao da Tanca, mas diferencia-se pelo fato de usar um certificado instalado, enquanto o Tanca você precisa do arquivo e da senha. Não faço ideia se funciona com A3 também, mas se estiver instalado no Windows, acho que deveria funcionar. Abraços. SatCVSign.zip
  18. Colegas, O ACBrECFVirtualSAT não funciona corretamente com Simples Nacional, deixando o grupo de ICMS vazio quando o regime de tributação é SN (independente da alíquota do produto). Para usar o ACBrECFVirtualSAT com Simples Nacional fiz as seguintes alterações: Em TACBrECFVirtualSATClass.VendeItem: if Config.emit_cRegTrib = RTSimplesNacional then begin Det.Prod.CFOP := '5102'; Det.Imposto.ICMS.CSOSN := csosn102; Det.Imposto.PIS.CST := pis49; Det.Imposto.COFINS.CST := cof49; if ItemCupom.PosAliq = 0 then // FF begin Det.Prod.CFOP := '5405'; Det.Imposto.ICMS.CSOSN := csosn500; end else if ItemCupom.PosAliq = 1 then // II begin Det.Imposto.ICMS.CSOSN := csosn300; end else if ItemCupom.PosAliq = 2 then // NN begin //Det.Imposto.ICMS.CSOSN := csosn400; //A partir de 01/01/2016 Det.Imposto.ICMS.CSOSN := csosn300; //Até 01/01/2016 end; end else begin Det.Prod.CFOP := '5102'; Det.Imposto.ICMS.CST := cst00; Det.Imposto.ICMS.pICMS := AliqECF.Aliquota; if ItemCupom.PosAliq = 0 then // FF begin Det.Prod.CFOP := '5405'; Det.Imposto.ICMS.CST := cst60; end else if ItemCupom.PosAliq = 1 then // II begin Det.Imposto.ICMS.CST := cst40; end else if ItemCupom.PosAliq = 2 then // NN begin Det.Imposto.ICMS.CST := cst41; end else if AliqECF.Tipo = 'S' then // Serviços begin Det.Prod.CFOP := '5949'; Det.Imposto.ICMS.CST := cst90; Det.Imposto.ICMS.pICMS := 0; Det.Imposto.ISSQN.vAliq := AliqECF.Aliquota; end; end;
  19. Colegas, O que vocês acham de adicionar uma opção para utilização do ACBrInstall sem uma instação ativa do Tortoise/CollabNet? Neste caso, a atualização do repositório local seria responsabilidade do usuário, de fazer manualmente. Pra mim, isso é útil pois utilizo Git para baixar repositórios SVN, e nos poucos casos em que uso SVN mesmo, uso SlikSVN, que também não é suportado. Mas consigo imaginar que isso possa ser útil também para quem pretende instalar uma versão anterior específica dos componentes, ou com alterações personalizadas.
  20. Ivan, Então me desculpe... é que o método existe no component TACBrNFe, e como não uso o Monitor, não sabia que não tinha. O que acontece é que uma inutilização não é um evento, são arquivos completamente diferentes. Acho que existe uma chance de que a impressão de inutilização não seja suportada pelo Monitor ainda. Vamos aguardar alguém mais versado na ferramenta dar um parecer. PS: Curiosidade apenas: por que você quer imprimir uma inutilização? A inutilização é só uma justificativa de porque alguns números não foram usados e não constitui um documento fiscal em si. Eu não me lembro de ter visto no manual ou nos meus clientes a necessidade de se ter um impresso disso.
  21. Colega, Como eu desconfiei, o problema é na leitura do TXT. No arquivo pcnNFeRTXT.pas, aproximadamente na linha 715 (eu tenho modificações locais, talvez não seja a mesma linha): { NFe.Det[i].Imposto.ICMS.motDesICMS := StrToModBC(ok, LerCampo(tcStr, 'motDesICMS')); NFe.Det[i].Imposto.ICMS.pDif := LerCampo(tcDe4, 'pDif'); NFe.Det[i].Imposto.ICMS.vICMSDif := LerCampo(tcDe2, 'vICMSDif'); NFe.Det[i].Imposto.ICMS.vICMSOp := LerCampo(tcDe2, 'vICMSOp');} Descomente este trecho e corrija a primeira linha para: NFe.Det[i].Imposto.ICMS.motDesICMS := StrTomotDesICMS(ok, LerCampo(tcStr, 'motDesICMS')); Isso resolve o problema... resta agora saber por que isso estava comentado, se funciona bem (ou parece funcionar ao menos).
  22. Colega, Dei uma olhada nos fontes aqui e parece que o ACBr já tem os campos necessários. Então, só pra eu tentar entender o seu procedimento: Você está gerando um arquivo TXT no formado do manual da receita, e importando este arquivo txt para o ACBrNFeMonitor para transmissão, é isso? Eu tive alguns problemas com leitura de arquivos TXT no ACBr e talvez o problema esteja na leitura do seu txt e não na criação do XML.
  23. Werner, Você está usando thread pra enviar e-mail. Por essa razão que não está funcionando o try..except: A função enviar e-mail só cria a thread e essa operação não gera exception nenhum. Para não usar thread, adicione mais um parâmetro, False à sua chamada de função: try ACBrNFe.NotasFiscais.Items[0].EnviarEmail(qrEmpresa.fieldbyname('nm_smtpemail').asstring , qrEmpresa.fieldbyname('nr_portaemail').asstring , qrEmpresa.fieldbyname('nm_usuarioemail').asstring , qrEmpresa.fieldbyname('nr_senhaemail').asstring , qrEmpresa.fieldbyname('nm_usuarioemail').asstring , Para , 'Nota Fiscal Eletrônica - '+ACBrNFe.NotasFiscais.Items[0].NFe.infNFe.ID , memo1.Lines //mmEmailMsg.Lines , (qrEmpresa.fieldbyname('tp_conexaoseguraemail').asinteger=1) // SSL - Conexão Segura , True //Enviar PDF junto , CC //Lista com emails que serão enviado cópias - TStrings , nil // Lista de anexos - TStrings , False //Pede confirmação de leitura do email , True //Aguarda Envio do Email(não usa thread) , qrempresa.fieldbyname('nm_emp').asstring // Nome do Rementente , (qrEmpresa.fieldbyname('tp_conexaossltsl').asinteger=1) // Auto TLS , False); //Esse parametro diz pra não usar thread. except raise exception.Create('Email não enviado'); end; Lembrando que o parametro AguardarEnvio = True não significa que não vai usar thread, como está escrito nos seus comentários... significa que se usar, vai esperar ela concluir a tarefa. Eu, particularmente, não vejo muita vantagem em usar uma thread se você vai travar o programa até ela concluir, isso só adiciona complexidade ao seu programa.
×
×
  • 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.