Ir para conteúdo
  • Cadastre-se

Gabriel Frones

Membros
  • Total de ítens

    115
  • Registro em

  • Última visita

  • Days Won

    2

Posts postados por Gabriel Frones

  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.

    • Curtir 1
  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. 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.

  4. 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.
  5. 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.

  6. 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

  7. 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.

  8. 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).

  9. 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.

  10. 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.

    • Curtir 1
  11. 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

    • Curtir 1
  12. Boa tarde pessoal. Muito bem observado Cristiano, deve ser por isso que estão dando chaves diferentes. Valew a Dica.   GabrielFrones, seu programa aq abre, digito os cnpjs, escolho o certificado digital, ai dá:  " Este programa parou de funcionar.... "  Vc saberia o por quê ?  Abraços...

    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

  13. @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. :)

  14. 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

    • Curtir 2
  15. 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;
    
  16. 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.

    • Curtir 1
  17. 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.

  18. 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).

  19. 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.

  20. 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.

    • Curtir 2
×
×
  • 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.