Jump to content
marcolopes

AT - questões legais

Recommended Posts

CrominhO

Já agora em modo texto, 

https://github.com/anastaciocintra/escpos-coffee

https://github.com/fukuchi/libqrencode

https://code.google.com/archive/p/qrencode-win32/downloads

Citação

qrencode -t UTF8 'StringCodigoQR'

Citação

qrencode -t ANSIUTF8 'StringCodigoQR'

Mas ainda não consegui meter a funcionar como queria, com qualquer impressora...


As mentes humanas são realmente um local estranho!

Share this post


Link to post
Share on other sites
Ricardo.Almeida
22 horas atrás, brunotoira disse:

 


uses DelphiZXingQRCode;

Procedure GravarDocumento ou ImprimirDocumento;
var CodigoQR:String;
...
...
...
begin
  
Ao gravar documento ou antes de imprimir:
  
//obter código unico
//ainda estou a aguardar informação adicional sobre o pedido do ATCUD
CodigoQR:=copy(AnsiReverseString(IntToStr(IBDOCS.fieldbyname('ID').Asinteger*4)),1,4);
CodigoQR:=CodigoQR+IBDOCS.fieldbyname('SERIE').AsString;
CodigoQR:=CodigoQR+copy(IntToStr(NumeroDocumento*2),5,9);
    
//criar os campos para gerar o QRCode.
//A NIF do emitente *
//B NIF do adquirente *
//C País do adquirente *
//D Tipo de documento *
//E Estado do documento *
//F Data do documento *
//G Identificação única do documento *
//H ATCUD *
//I1 Espaço fiscal *
//I2 Base tributável isenta de IVA *
//I3 Base tributável de IVA à taxa reduzida *
//I4 Total de IVA à taxa reduzida *
//I5 Base tributável de IVA à taxa intermédia *
//I6 Total de IVA à taxa intermédia *
//I7 Base tributável de IVA à taxa normal *
//I8 Total de IVA à taxa normal *
//J1 Espaço fiscal *
//J2 Base tributável isenta *
//J3 Base tributável deIVA à taxa reduzida *
//J4 Total de IVA à taxa reduzida *
//J5 Base tributável de IVA à taxa intermédia *
//..
//...
//...
//....
//.....
//etc....
//N Total de impostos *
//O Total do documento com impostos *
//Q 4 carateres do Hash *
//R Nº do certificado *

   StringCodigo:='A:NIFEMISSOR*';
   StringCodigo:=StringCodigo+'B:'+IBDocs.FieldByName('NRCONTRIBUINTE').AsString+'*';
   StringCodigo:=StringCodigo+'C:PT*';
   if TIPODOCUMENTO='FACTURA SIMPLIFICADA' then
     StringCodigo:=StringCodigo+'D:FS*';
   if TIPODOCUMENTO='NOTA DE CREDITO' then
     StringCodigo:=StringCodigo+'D:NC*';
   if TIPODOCUMENTO='RECIBO' then
     StringCodigo:=StringCodigo+'D:RE*';
    //ETC...

   StringCodigo:=StringCodigo+'E:N*';
   StringCodigo:=StringCodigo+'F:'+FORMATDATETIME('YYYYMMDD',IBDocs.FieldByName('DATADOC').AsDateTime)+'*';
   StringCodigo:=StringCodigo+'G:'+IBDOCS.fieldbyname('INICIAISDOC').AsString + ' ' + IBDOCS.FIELDBYNAME('SERIE').AsString + '/' + IBDOCS.fieldbyname('NDOC').asstring+'*';
   StringCodigo:=StringCodigo+'H:'+IBDocs.FieldByName('CODLOJA').AsString +'-'+IBDocs.FieldByName('NDOC').AsString+'*';
   StringCodigo:=StringCodigo+'I1:PT*';

   ibquery1.close;
   ibquery1.SQL.clear;
   ibquery1.SQL.add(
     'select ROUND(TOTAISIVA1,2), ROUND(TOTAISIVA2,2), ROUND(TOTAISIVA3,2), ROUND(TOTAISIVA4,2) FROM DOCS WHERE tipodoc=:TIPODOC AND ndoc=:NDOC');
   ibquery1.parambyname('TIPODOC').AsString := TIPODOCUMENTO;
   ibquery1.parambyname('NDOC').AsInteger := NumeroDocumento;
   ibquery1.open;

   while NOT ibquery1.eof do
    begin
      if ibquery1.FieldByName('IVA').AsInteger=6 then
        begin
          StringCodigo:=StringCodigo+'I3:'+FloatToStr(ibquery1.FieldByName('TOTALSEMIVA').AsFloat)+'*';
          StringCodigo:=StringCodigo+'I4:'+FloatToStr(ibquery1.FieldByName('TOTALIVA').AsFloat)+'*';
        end;
      if ibquery1.FieldByName('IVA').AsInteger=13 then
        begin
          StringCodigo:=StringCodigo+'I5:'+FloatToStr(ibquery1.FieldByName('TOTALSEMIVA').AsFloat)+'*';
          StringCodigo:=StringCodigo+'I6:'+FloatToStr(ibquery1.FieldByName('TOTALIVA').AsFloat)+'*';
        end;
      if ibquery1.FieldByName('IVA').AsInteger=23 then
        begin
          StringCodigo:=StringCodigo+'I7:'+FloatToStr(ibquery1.FieldByName('TOTALSEMIVA').AsFloat)+'*';
          StringCodigo:=StringCodigo+'I8:'+FloatToStr(ibquery1.FieldByName('TOTALIVA').AsFloat)+'*';
        end;
      ibquery1.Next;
    end;

   StringCodigo:=StringCodigo+'N:'+FloatToStr(RoundNExtend(IBDOCS.FieldByName('TOTALIVA').AsFloat,2))+'*';
   StringCodigo:=StringCodigo+'O:'+FloatToStr(RoundNExtend(IBDOCS.FieldByName('TOTALGERAL').AsFloat,2))+'*';
   StringCodigo:=StringCodigo+'Q:'+copy(IBDocs.FieldByName('PRINTHASH').AsString,1,4)+'*'; //CODIGO HASH
   StringCodigo:=StringCodigo+'R:'+CodigoCertificado+'*'; // VOSSO NUMERO DE CERTIFICADO
   StringCodigo:=StringCodigo+'S:NU;'+FloatToStr(RoundNExtend(IBDOCS.FieldByName('TOTALGERAL').AsFloat,2));

   StringCodigo:=StringReplace(StringCodigo,',','.',[rfReplaceAll]);

   UpdateQRCode(StringCodigo,CodigoQR);
        
   //Isto vai-vos criar o BMP com o QRCode.
   //Depois só têm que grava-lo numa BD, e no CrystalReports, adicionar o campo dessa BD.
   +/- ISTO UPDATE DOCS SET IMAGEMQRCODE=FILESTREAM(C:\PASTATEMPORARIA\QRCODE\XXXXXXXXX.BMP
  
          
       
        
        
Procedure TDataModule1.UpdateQRCode(Texto,Codigo:String);
var
  QRCode: TDelphiZXingQRCode; //Gratuito é só ir buscar á net.
  Row, Column: Integer;
  Scale: Double;
  QRCodeBitmap: TBitmap;
  ImageQR:TImage;
begin

  try
    ImageQR:=TImage.Create(self);
    QRCodeBitmap := TBitmap.Create;
    QRCode := TDelphiZXingQRCode.Create;

    QRCode.Data := Texto;
    QRCode.Encoding := TQRCodeEncoding(0);
    QRCode.QuietZone := 1;
    QRCodeBitmap.SetSize(QRCode.Rows, QRCode.Columns);
    for Row := 0 to QRCode.Rows - 1 do
    begin
      for Column := 0 to QRCode.Columns - 1 do
      begin
        if (QRCode.IsBlack[Row, Column]) then
        begin
          QRCodeBitmap.Canvas.Pixels[Column, Row] := clBlack;
        end else
        begin
          QRCodeBitmap.Canvas.Pixels[Column, Row] := clWhite;
        end;
      end;
    end;

    ImageQR.Canvas.Brush.Color := clWhite;
    ImageQR.Canvas.FillRect(Rect(0, 0, ImageQR.Width, ImageQR.Height));
    if ((QRCodeBitmap.Width > 0) and (QRCodeBitmap.Height > 0)) then
    begin
      if (ImageQR.Width < ImageQR.Height) then
      begin
        Scale := ImageQR.Width / QRCodeBitmap.Width;
      end else
      begin
        Scale := ImageQR.Height / QRCodeBitmap.Height;
      end;
      ImageQR.Canvas.StretchDraw(Rect(0, 0, Trunc(Scale * QRCodeBitmap.Width), Trunc(Scale * QRCodeBitmap.Height)), QRCodeBitmap);
    end;
  ImageQR.Picture.SaveToFile('C:\PASTATEMPORARIA\QRCode\'+Codigo+'.bmp');
  QRCode.Free;
  QRCodeBitmap.Free;

  except

  end;

end;

Delphi

Se precisarem para outras linguagens de programação, mandem msg.

Há dois pontos na especificação, que eu devo estar a fazer confusão.

Estou a usar zxing em c#, e não estou a ter problema em gerar o QRCode e posteriormente, ler.

Tenho no entanto especificações que ou não as estou a entender, ou não estou a ver como as configurar.

1) Tipo: Byte -

          Ao que percebo isto é automático, ou seja consoante o tipo de dados enviado, é configurado automaticamente, não sei como o "forçar".

          Já forcei o CHARACTER_SET para ISO-8859-1, ainda assim, se o texto forem só maiúsculas, ao fazer a leitura, não vem nenhuma especificação que indique tratar-se de byte.

2) Pontos por módulo(Size) : 2 

          Não encontro forma de configurar isto, ou não estou a saber fazê-lo.

3) Versão: v=9 (valor mínimo)

          Se configurar esta versão, penso que corro o risco, de em determinadas situações, não ser suficiente, já que posso definir QR_VERSION a 9, mas não como mínimo.

 

 

Se alguém puder ajudar, agradeço.

Share this post


Link to post
Share on other sites
kalin
1 hora atrás, Ricardo.Almeida disse:

Há dois pontos na especificação, que eu devo estar a fazer confusão.

Estou a usar zxing em c#, e não estou a ter problema em gerar o QRCode e posteriormente, ler.

Tenho no entanto especificações que ou não as estou a entender, ou não estou a ver como as configurar.

1) Tipo: Byte -

          Ao que percebo isto é automático, ou seja consoante o tipo de dados enviado, é configurado automaticamente, não sei como o "forçar".

          Já forcei o CHARACTER_SET para ISO-8859-1, ainda assim, se o texto forem só maiúsculas, ao fazer a leitura, não vem nenhuma especificação que indique tratar-se de byte.

2) Pontos por módulo(Size) : 2 

          Não encontro forma de configurar isto, ou não estou a saber fazê-lo.

3) Versão: v=9 (valor mínimo)

          Se configurar esta versão, penso que corro o risco, de em determinadas situações, não ser suficiente, já que posso definir QR_VERSION a 9, mas não como mínimo.

 

 

Se alguém puder ajudar, agradeço.

Quando andei a ver esta livraria, vi que existia 

public IDictionary<EncodeHintType, object> Hints { get; }

mas ainda não usei pelo que não tenho certeza se dá para configurar estas opções

Tentas-te colocar a questão no github?

Neste momento estou a usar um campo nativo aos meus reports e coloco o modulo como automático, penso que estar a forcar estas propriedades todas pode ser mais do que complicado.

Se o código estiver impresso e seja lido por um leitor e tenha a informação correta, não acredito que venha alguem dizer que o código não tem 2 pontos por módulo, a única coisa que pode ser vista é o tamanho do código qr. Em nenhuma aplicação que usei até hoje me diz os valores destes parâmetros.

Share this post


Link to post
Share on other sites
americob
1 hora atrás, Ricardo.Almeida disse:

Há dois pontos na especificação, que eu devo estar a fazer confusão.

Estou a usar zxing em c#, e não estou a ter problema em gerar o QRCode e posteriormente, ler.

Tenho no entanto especificações que ou não as estou a entender, ou não estou a ver como as configurar.

1) Tipo: Byte -

          Ao que percebo isto é automático, ou seja consoante o tipo de dados enviado, é configurado automaticamente, não sei como o "forçar".

          Já forcei o CHARACTER_SET para ISO-8859-1, ainda assim, se o texto forem só maiúsculas, ao fazer a leitura, não vem nenhuma especificação que indique tratar-se de byte.

2) Pontos por módulo(Size) : 2 

          Não encontro forma de configurar isto, ou não estou a saber fazê-lo.

3) Versão: v=9 (valor mínimo)

          Se configurar esta versão, penso que corro o risco, de em determinadas situações, não ser suficiente, já que posso definir QR_VERSION a 9, mas não como mínimo.

 

 

Se alguém puder ajudar, agradeço.

Eu acho que a Versão 9 é o mínimo.

Segundo este link: https://www.qrcode.com/en/about/version.html na versão 9, que é 53x53, com nível ECC = "M", poderás colocar uma string até 262 carateres. Se a string for maior, terás de ir subindo a versão até teres a capacidade necessária.

Segundo os meus cálculos, se usares todos os campos no tamanho máximo, vais precisar de 735 carateres o que te vai obrigar a subir a versão para 18 que é 89x89.

No meu caso, penso fazer isso dinamicamente ir subindo a versão conforme necessário.

 

Share this post


Link to post
Share on other sites
JorgeRocha
Em 20/08/2020 às 11:44, kalin disse:

Eu não usaria essa biblioteca, já não é atualizada desde 2012 não tenho a certeza da licença. 

Encontrei 2 para .NET que são open source e tem estado bem ativas:

https://github.com/codebude/QRCoder/

https://github.com/micjahn/ZXing.Net/

Viva

Eu experimentei a QRCoder e é de caras... super simples, alias o exemplo que vem lá da para perceber em 5 min... muito simples mesmo. Usei o VS2019

PS: até dá para por o icon da APP no centro da imagem ... 


Jorge Rocha

Share this post


Link to post
Share on other sites
JorgeRocha

Viva

Depois de uma leitura com calma sobre esta questão da criação do código único do documento (ATCUD) e percebi algo completamente diferente do que foi aqui abordado (acho eu).

Sendo este código constituído por: (1) código de validação atribuído pela AT e (2) pelo número do documento da serie. Sendo que este número já é o que se usa do número do documento a seguir a barra (Ponto 3 do artigo 3 da portaria 195/2020).

O que eu percebo é que cada entidade leia-se utilizador do software tem que solicitar um código pela utilização de uma determinada serie para a AT (Artigo 2). Pode ser qualquer coisa como FT 0 sendo o FT o tipo de documento e 0 a serie. (Tipo de recibo (!) não percebi? Será por causa do IVA de caixa ?!)

Esta informação depois de validada pela AT eles devolvem um código único sobre essa serie e constrói-se o tal ATCUD com o código devolvido. Na fatura número FT 0/12 e se o código de validação for A32344RT (mínimo de 8 carateres artigo 3 ponto 1) o dito ATCUD será: A32344RT-12.

Ou então eu não percebi nada disto! Eu nunca percebi essa coisa de chamar um webservice por cada documento emitido. Isso seria a loucura total … digo eu. Estão a imaginar a MEO ou a Vodafone a gerar milhares de faturas no seu ciclo de faturação?


Jorge Rocha

Share this post


Link to post
Share on other sites
kalin
11 minutos atrás, JorgeRocha disse:

Viva

Depois de uma leitura com calma sobre esta questão da criação do código único do documento (ATCUD) e percebi algo completamente diferente do que foi aqui abordado (acho eu).

Sendo este código constituído por: (1) código de validação atribuído pela AT e (2) pelo número do documento da serie. Sendo que este número já é o que se usa do número do documento a seguir a barra (Ponto 3 do artigo 3 da portaria 195/2020).

O que eu percebo é que cada entidade leia-se utilizador do software tem que solicitar um código pela utilização de uma determinada serie para a AT (Artigo 2). Pode ser qualquer coisa como FT 0 sendo o FT o tipo de documento e 0 a serie. (Tipo de recibo (!) não percebi? Será por causa do IVA de caixa ?!)

Esta informação depois de validada pela AT eles devolvem um código único sobre essa serie e constrói-se o tal ATCUD com o código devolvido. Na fatura número FT 0/12 e se o código de validação for A32344RT (mínimo de 8 carateres artigo 3 ponto 1) o dito ATCUD será: A32344RT-12.

Ou então eu não percebi nada disto! Eu nunca percebi essa coisa de chamar um webservice por cada documento emitido. Isso seria a loucura total … digo eu. Estão a imaginar a MEO ou a Vodafone a gerar milhares de faturas no seu ciclo de faturação?

O código emitido pela AT para uma série é unico, depois usas esse código para todas as faturas emitidas dentro dessa série.

Share this post


Link to post
Share on other sites
JorgeRocha
12 minutos atrás, kalin disse:

O código emitido pela AT para uma série é unico, depois usas esse código para todas as faturas emitidas dentro dessa série.

Se não foi o que eu disse foi o que queria dizer...

Sabes o que é o tipo de recibo ?


Jorge Rocha

Share this post


Link to post
Share on other sites
kalin
3 minutos atrás, JorgeRocha disse:

Se não foi o que eu disse foi o que queria dizer...

Sabes o que é o tipo de recibo ?

Na portaria que define a estrutura do SAFT:

Campo 4.1.4.8.Tipo de documento (InvoiceType)

Campo 4.2.3.8.Tipo de documento (MovementType)

Campo 4.3.4.8.Tipo de documento (WorkType)

Campo 4.4.4.6.Tipo de recibo (PaymentType) 

“RC” – Recibo emitido no âmbito do regime de IVA de Caixa (incluindo os relativos a adiantamentos desse regime);

“RG” – Outros recibos emitidos

Share this post


Link to post
Share on other sites
marcolopes
17 hours ago, Ricardo.Almeida said:

Há dois pontos na especificação, que eu devo estar a fazer confusão.

Estou a usar zxing em c#, e não estou a ter problema em gerar o QRCode e posteriormente, ler.

Tenho no entanto especificações que ou não as estou a entender, ou não estou a ver como as configurar.

1) Tipo: Byte -

          Ao que percebo isto é automático, ou seja consoante o tipo de dados enviado, é configurado automaticamente, não sei como o "forçar".

          Já forcei o CHARACTER_SET para ISO-8859-1, ainda assim, se o texto forem só maiúsculas, ao fazer a leitura, não vem nenhuma especificação que indique tratar-se de byte.

2) Pontos por módulo(Size) : 2 

          Não encontro forma de configurar isto, ou não estou a saber fazê-lo.

3) Versão: v=9 (valor mínimo)

          Se configurar esta versão, penso que corro o risco, de em determinadas situações, não ser suficiente, já que posso definir QR_VERSION a 9, mas não como mínimo.

Se alguém puder ajudar, agradeço.

Nem vais conseguir... o ZXING é uma autentica "bosta" no que toca a gerar código QR. Não tens controle absolutamente nenhum, isto para não falar que, se não usares "BYPASS" do render do BitMatrix, ele vai-te gerar BORDAS de acordo com o TAMANHO que especificares... UM QR-CODE "não tem tamanho" definido pelo utilizador (o mesmo é automático, e controlado pelos PONTOS POR MODULO + QUIET ZONE ou margem, juntamente com a VERSÃO MÍNIMA - esquece controlar alguma desta coisas no ZXING!!!).

Resta dizer que até agora usava esta LIB em JAVA para criar códigos de barras diversos... mas a falta de controle é gritante, como tal, pelo menos no que toca ao QR-CODE da AT, desisti e vou para alternativas que me dão controle TOTAL sobre as especificações QR-CODE.

Aliás, depois de entrar no código do ZXING percebi a complexidade e falta de organização na programação... muita parra para pouca uva.

Edited by marcolopes

The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Share this post


Link to post
Share on other sites
marcolopes
16 hours ago, JorgeRocha said:

Viva

Depois de uma leitura com calma sobre esta questão da criação do código único do documento (ATCUD) e percebi algo completamente diferente do que foi aqui abordado (acho eu).

Sendo este código constituído por: (1) código de validação atribuído pela AT e (2) pelo número do documento da serie. Sendo que este número já é o que se usa do número do documento a seguir a barra (Ponto 3 do artigo 3 da portaria 195/2020).

O que eu percebo é que cada entidade leia-se utilizador do software tem que solicitar um código pela utilização de uma determinada serie para a AT (Artigo 2). Pode ser qualquer coisa como FT 0 sendo o FT o tipo de documento e 0 a serie. (Tipo de recibo (!) não percebi? Será por causa do IVA de caixa ?!)

Esta informação depois de validada pela AT eles devolvem um código único sobre essa serie e constrói-se o tal ATCUD com o código devolvido. Na fatura número FT 0/12 e se o código de validação for A32344RT (mínimo de 8 carateres artigo 3 ponto 1) o dito ATCUD será: A32344RT-12.

Ou então eu não percebi nada disto! Eu nunca percebi essa coisa de chamar um webservice por cada documento emitido. Isso seria a loucura total … digo eu. Estão a imaginar a MEO ou a Vodafone a gerar milhares de faturas no seu ciclo de faturação?

Mas onde é que diz na legislação que é preciso comunicar CADA SÉRIE de DOCUMENTO EMITIDO?

A comunicação é exactamente como dizes... CADA SÉRIE NOVA criada POR DOCUMENTO.(portanto... na regra, UMA VEZ por ano, excepto necessidades "excepcionais", como integração de documentos perdidos, de outras aplicações, fecho de série e abertura de nova série por razões previstas na lei, etc)

A questão que se levantou aqui (precipitadamente,porque estamos todos frenéticos com todas as novidades!) é COMO VAI SER DEFINIDA a "string" com a IDENTIFICAÇÃO da SÉRIE (que, não pode ser nada menos do que o CÓDIGO INTERNO de documento + CÓDIGO da SÉRIE), mas essa explicação NÃO está na portaria. Volto a dizer, na portaria a AT não se refere a NUMERO de SÉRIE ou CÓDIGO de série, mas sim "a) O identificador da série do documento;"


The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Share this post


Link to post
Share on other sites
marcolopes
On 8/17/2020 at 7:58 PM, americob said:

Estava agora a passar os olhos pelas especificações técnicas:

Neste caso do código L, será que vai ser só para preencher quando uma fatura sujeita é a IS e por essa via não sujeita/não tributada em IVA, ou será que querem que se meta lá tudo o que tiver sido faturado com o código "M99" Não sujeito/Não tributado?

É que ele já pedem o I2, J2, e K2, todos semelhantes para aplicação por regiões (PT, PT-AC e PT-MA):

Eu vejo a maioria dos campos como "opcionais", mas, pelo menos alguns, só me parecem ser opcionais se outros tiverem informação.

Parece-me que estava na hora de a AT começar a divulgar umas FAQ's porque os 3 exemplos que dão no fim são muito fraquinhos.

Esta situação de discriminar os valores de IVA por ESPAÇO FISCAL no QRCODE é ridícula... tanto mais que no SAFT o espaço fiscal é discriminado por LINHA (não estou a ver quando é que um documento pode ser emitido taxas de IVA com diversos espaços fiscais, mas pelas especificações do SAFT, essa possibilidade pode existir) e no QRCODE vamos ter de desenvolver rotinas complexas para analisar a "tabela de IVA" e separar eventuais ESPAÇOS FISCAIS, ainda por cima por TIPO de TAXA de IVA...

DÚVIDA (não relativa ao IVA)

- Os documentos emitidos em data ANTERIOR à entrada em vigor da LEI, ao serem IMPRESSOS, devem gerar QRCODE?

- Caso o QRCODE deva constar de todos os documentos, independentemente da data de emissão, o ATCUD (por não poder ser construído na parte que toca ao CÓDIGO de VALIDAÇÃO da SÉRIE, que pode não ter sido comunicada), não deve ser apresentado, certo?

Edited by marcolopes

The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Share this post


Link to post
Share on other sites
kalin
8 horas atrás, marcolopes disse:

Esta situação de discriminar os valores de IVA por ESPAÇO FISCAL no QRCODE é ridícula... tanto mais que no SAFT o espaço fiscal é discriminado por LINHA (não estou a ver quando é que um documento pode ser emitido taxas de IVA com diversos espaços fiscais, mas pelas especificações do SAFT, essa possibilidade pode existir) e no QRCODE vamos ter de desenvolver rotinas complexas para analisar a "tabela de IVA" e separar eventuais ESPAÇOS FISCAIS, ainda por cima por TIPO de TAXA de IVA...

DÚVIDA (não relativa ao IVA)

- Os documentos emitidos em data ANTERIOR à entrada em vigor da LEI, ao serem IMPRESSOS, devem gerar QRCODE?

- Caso o QRCODE deva constar de todos os documentos, independentemente da data de emissão, o ATCUD (por não poder ser construído na parte que toca ao CÓDIGO de VALIDAÇÃO da SÉRIE, que pode não ter sido comunicada), não deve ser apresentado, certo?

Eu estou a fazer assim, se a série tiver o código dat AT, então construo o ATCUD e o Qrcode, caso contrário continua tudo na mesma

  • Vote 1

Share this post


Link to post
Share on other sites
desconfiado

A questão do Código ATCUD é muito simples de entender. É para evitar "fugas".

 

Há software no mercado que, aparentemente, permitiam criar diferentes séries por documentos, o que é perfeitamente legal, mas que depois uma ou mais séries de documentos "desapareciam" milagrosamente. Isto era a grande falha no sistema de assinaturas em vigor. Vai dai inventaram esta coisa do ATCUD para poderem controlar "todas" as séries que os contribuintes usam e evitar essa "fuga" de séries. Quando saiu a primeira portaria sobre o assunto imaginei logo o objectivo da coisa.

Já o que não faz sentido é este ATCUD ser apenas por Tipo de documento SAF-T (PT, NC, ND, etc) e não por Código Interno + Tipo porque podem, e existem, vários Códigos Internos de documentos que utilizam a mesma série. O que também pode permitir a tal "fuga" de documentos. Por isso estou um bocado preocupado que a AT venha agora acabar com a hipótese de não permitir mais do que um código interno por cada tipo de documento. A ser isto, vai ser um grande problema pois vai implicar alterações ao modelo de dados em que a maioria das aplicações se baseia. ESTOU MUITO PREOCUPADO com isto!

 

Em relação ao QRCODE, vou ser sincero, já achava a maior PARVOÍCE mas agora que vi o conteúdo do QRCODE, acho uma ESTUPIDEZ completa. É só minha impressão ou um conteúdo tão comprido como este vai causar grandes problemas na leitura do código?

Para concluir, numa altura de crise destas, obrigar ao tipo de investimento que isto vai obrigar ás empresas já em dificuldade, nomeadamente a restauração, é no mínimo AUTISMO da pior espécie! Um desrespeito total por quem luta por sobreviver à custa de trabalho honesto. Fica aqui o meu desabafo em nome destas empresas (Para nós, do software, até pode ser lucrativo).

  • Vote 1

Share this post


Link to post
Share on other sites
marcolopes
3 hours ago, desconfiado said:

A questão do Código ATCUD é muito simples de entender. É para evitar "fugas".

 

Há software no mercado que, aparentemente, permitiam criar diferentes séries por documentos, o que é perfeitamente legal, mas que depois uma ou mais séries de documentos "desapareciam" milagrosamente. Isto era a grande falha no sistema de assinaturas em vigor. Vai dai inventaram esta coisa do ATCUD para poderem controlar "todas" as séries que os contribuintes usam e evitar essa "fuga" de séries. Quando saiu a primeira portaria sobre o assunto imaginei logo o objectivo da coisa.

Já o que não faz sentido é este ATCUD ser apenas por Tipo de documento SAF-T (PT, NC, ND, etc) e não por Código Interno + Tipo porque podem, e existem, vários Códigos Internos de documentos que utilizam a mesma série. O que também pode permitir a tal "fuga" de documentos. Por isso estou um bocado preocupado que a AT venha agora acabar com a hipótese de não permitir mais do que um código interno por cada tipo de documento. A ser isto, vai ser um grande problema pois vai implicar alterações ao modelo de dados em que a maioria das aplicações se baseia. ESTOU MUITO PREOCUPADO com isto!

Em relação ao QRCODE, vou ser sincero, já achava a maior PARVOÍCE mas agora que vi o conteúdo do QRCODE, acho uma ESTUPIDEZ completa. É só minha impressão ou um conteúdo tão comprido como este vai causar grandes problemas na leitura do código?

Para concluir, numa altura de crise destas, obrigar ao tipo de investimento que isto vai obrigar ás empresas já em dificuldade, nomeadamente a restauração, é no mínimo AUTISMO da pior espécie! Um desrespeito total por quem luta por sobreviver à custa de trabalho honesto. Fica aqui o meu desabafo em nome destas empresas (Para nós, do software, até pode ser lucrativo).

1) As razões do ATCUD são claras... e sim, são exactamente as que descreves.

2) O CÓDIGO da VALIDAÇÃO da série (e não ao ATCUD) NÃO é apenas por TIPO de documento SAFT! Pela TERCEIRA vez volto a dizer que a PORTARIA diz "Artigo 2.º
Para a obtenção do código de validação das séries documentais... os sujeitos passivos devem comunicar... a) O identificador da série do documento;". Os IDENTIFICADORES das SÉRIES têm de conter, obrigatoriamente o PREFIXO do CÓDIGO INTERNO do documento, pois só assim podem ser IDENTIFICADAS de forma ÚNICA.

3) O conteúdo do QRCODE é realmente parvoíce!!! mas.............. não é devido ao conteúdo que o QRCODE não irá ser lido na PERFEIÇÃO. Já fiz testes, e não existe qualquer problema, inclusive obrigando a que o QRCODE com uma VERSION superior a 9 tenha um tamanho de apenas 3CM (isto já no PDF, visto que a imagem do QRCODE NÂO DEVE SER ESCALADA MANUALMENTE no processamento, mas sim ser renderizado com as características técnicas que a AT definiu, que em alguns casos irá ultrapassar os 3CM de tamanho mínimo. Os 3 CM mínimos foram indicados porque basicamente com as definições técnicas exigidas, nenhum QR CODE terá muito menos de 3CM, visto que a complexidade da VERSION 9, com 2 pontos por MODULO assim o ditam).

4) Concordo contigo nos custos associados para as empresas (upgrades de software, suporte técnico, etc), mas também temos de ver que há demasiado tempo não havia uma obrigação legal para levar as empresas a efectuar actualizações de Software... para além disso, o governo já adiou esta situação demasiado tempo. Se uma empresa sentir que esta obrigação vai fazer "mossa" nas finanças, então sinceramente, não está a usar a solução certa ($$$$$) ou até agora não se deu conta dos gastos que tinha com upgrades e manutenção do Software porque "tudo corria de vento em popa": Talvez esteja na hora de mudar...

 


The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Share this post


Link to post
Share on other sites
marcolopes
4 hours ago, kalin said:

Eu estou a fazer assim, se a série tiver o código dat AT, então construo o ATCUD e o Qrcode, caso contrário continua tudo na mesma

A questão aqui é que no SAFT as regras ditam

Quote

        /*
         * 4.1.4.2. * Codigo Unico do Documento (ATCUD)
         * Este campo deve conter o Codigo Unico do Documento.
         * O campo deve ser preenchido com "0" (zero) ate a sua regulamentacao.
         * Texto 100
         */
 

Como tal, acho que, tanto no SAFT como na apresentação nos documentos, vou aplicar esta regra (se a série não tiver código de validação, então o ATCUD devolve "0", e é aplicado também no SAFT)


The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Share this post


Link to post
Share on other sites
americob

Primeiro vamos ver como se pede o código de validação da série, pois só depois podemos saber com clareza como devemos proceder. Até lá só podemos conjeturar sobre o que vai acontecer.

O nº 3 do artigo 3º da Portaria 195/2020 não faz qualquer sentido:

Citação

Artigo 3.º
Composição do código único do documento (ATCUD)
1 - O código de validação da série a atribuir pela AT é composto por uma cadeia de carateres, com um comprimento mínimo de oito (8) carateres.
2 - O ATCUD é composto pela concatenação dos seguintes elementos, separados pelo carácter «-», sem aspas:
a) Código de validação da série, como definido no n.º 1; 
b) O número sequencial do documento dentro da série. 

3 - Para efeitos da alínea b) do número anterior, o número sequencial a utilizar é a sequência de caracteres numéricos, sendo que, no caso dos programas informáticos de faturação, é a que se encontra imediatamente a seguir à barra (/), tal como definido na estrutura de dados referida na Portaria n.º 321A/2007, de 26 de março, nas notas técnicas correspondentes aos campos «Identificação única do documento de venda», «Identificação única do documento de movimentação de mercadorias», «Identificação única do documento» e «Identificação única do recibo» do grupo de dados «Documentos comerciais».

Se a alínea b) diz que se deve usar o número sequencial dentro da série, porque é que o nº 3 vem dizer que este número tem de coincidir com o nº de documento do InvoiceNo, ...

Se é para coincidir, nem é preciso guardar, ele já está na base de dados.

Eu sempre pensei que o sistema fosse construído com base na série ou programa (estabelecimento) de faturação. Isso sim, seria interessante.

Quantas vezes já tive clientes que me perguntaram se, tendo já feito FR de Agosto poderiam ainda fazer uma FT + RC de Julho, já que ainda não tinham feito nenhuma destas em Agosto?

Ou então, quem usa FAC1 e FAC2, pode fazer exatamente o mesmo.

Sempre pensei que o ATCUD fosse acabar com isso, o número seria sequencial, independentemente do tipo de documento.

Por exemplo, documentos ordenados por ordem de emissão:

InvoiceNo ---> ATCUD

FAC1 2020/1 ---> ABCDEFGH-1
FAC1 2020/2 ---> ABCDEFGH-2
FAC2 2020/1 ---> ABCDEFGH-3
FAC1 2020/3 ---> ABCDEFGH-4
FAC2 2020/2 ---> ABCDEFGH-5

Isto seria um verdadeiro sistema de controlo. Ainda maior controlo se o código de validação fosse por estabelecimento, independente da série.

Claro que o ATCUD teria de passar a fazer parte da assinatura, senão poderia ser recalculado a qualquer momento.

Na minha opinião, quem fez a Portaria não percebeu o que estava em causa, ou não percebe nada disto.

Se isto não for alterado e/ou a AT insistir nisto, a solução passa por aquilo que o colega marcolopes já disse, cada instalação terá várias séries em simultâneo, no exemplo acima passará a:

FAC1 FAC1_2020/1 ---> ABCDEFGH-1
FAC1 FAC1_2020/2 ---> ABCDEFGH-2
FAC2 FAC2_2020/1 ---> IJKLMNOP-1
FAC1 FAC1_2020/3 ---> ABCDEFGH-3
FAC2 FAC2_2020/2 ---> IJKLMNOP-2

E, basicamente, não acrescenta nada ao controlo que já existe.

Share this post


Link to post
Share on other sites
americob
13 horas atrás, marcolopes disse:

Esta situação de discriminar os valores de IVA por ESPAÇO FISCAL no QRCODE é ridícula... tanto mais que no SAFT o espaço fiscal é discriminado por LINHA (não estou a ver quando é que um documento pode ser emitido taxas de IVA com diversos espaços fiscais, mas pelas especificações do SAFT, essa possibilidade pode existir) e no QRCODE vamos ter de desenvolver rotinas complexas para analisar a "tabela de IVA" e separar eventuais ESPAÇOS FISCAIS, ainda por cima por TIPO de TAXA de IVA...

Quanto a este assunto, tenho pensado implementar apenas com o conjunto I. Se o cliente quiser fazer faturas de 2 ESPAÇOS FISCAIS terá que fazer 2 faturas separadas.

Com isto evito que eles faturem umas linhas com taxas PT e noutras, por descuido, escolham motivos de isenção PT-AC.

 

13 horas atrás, marcolopes disse:

DÚVIDA (não relativa ao IVA)

- Os documentos emitidos em data ANTERIOR à entrada em vigor da LEI, ao serem IMPRESSOS, devem gerar QRCODE?

- Caso o QRCODE deva constar de todos os documentos, independentemente da data de emissão, o ATCUD (por não poder ser construído na parte que toca ao CÓDIGO de VALIDAÇÃO da SÉRIE, que pode não ter sido comunicada), não deve ser apresentado, certo?

Só penso gerar ATCUD para o SAF-T se tiver código de validação da série, senão vai o "0".

Quanto à impressão do QRcode, quando os modelos de impressão forem atualizados passarão a imprimir o QRcode, com o respetivo ATCUD, tenha ele conteúdo ou seja "0".
Claro que a reimpressões de documentos antigos, 2ªs vias, não vão sair iguais aos originais. Mas, temos pena, não vou ter 2 modelos de impressão diferentes e controlar qual vou usar com base na data em que o cliente atualizou o programa.

  • Vote 1

Share this post


Link to post
Share on other sites
marcolopes
2 hours ago, americob said:

Primeiro vamos ver como se pede o código de validação da série, pois só depois podemos saber com clareza como devemos proceder. Até lá só podemos conjeturar sobre o que vai acontecer.

O nº 3 do artigo 3º da Portaria 195/2020 não faz qualquer sentido:

Se a alínea b) diz que se deve usar o número sequencial dentro da série, porque é que o nº 3 vem dizer que este número tem de coincidir com o nº de documento do InvoiceNo, ...

Se é para coincidir, nem é preciso guardar, ele já está na base de dados.

Acho que estás a fazer confusão... o que a AT quer dizer é exactamente o que pensas...

CÓDIGO de VALIDAÇÃO da série + NUMERO DO DOCUMENTO (eles é que complicam com as definições, num caso, e pecam por não explicar no outro!)

O número sequencial do documento dentro da série, nada mais é que o NUMERO do documento, que evidentemente está consagrado na série, que é ÚNICA ao documento!!!

O que não faz sentido aqui é o ATCUD que é impresso, ser constituído pelo CÓDIGO de VALIDAÇÃO da SÉRIE + NUMERO do documento (ex "ABCDEFGH-123456")... quem quiser adulterar o NÚMERO do documento só tem de sacar a primeira parte do ATCUD, e concatenar o "novo" NUMERO do documento, e está feito!!!

O ATCUD teria de ser encriptado para evitar adulterações...

Edited by marcolopes
  • Vote 1

The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Share this post


Link to post
Share on other sites
americob
19 horas atrás, marcolopes disse:

Acho que estás a fazer confusão... o que a AT quer dizer é exactamente o que pensas...

CÓDIGO de VALIDAÇÃO da série + NUMERO DO DOCUMENTO (eles é que complicam com as definições, num caso, e pecam por não explicar no outro!)

O número sequencial do documento dentro da série, nada mais é que o NUMERO do documento, que evidentemente está consagrado na série, que é ÚNICA ao documento!!!

O que não faz sentido aqui é o ATCUD que é impresso, ser constituído pelo CÓDIGO de VALIDAÇÃO da SÉRIE + NUMERO do documento (ex "ABCDEFGH-123456")... quem quiser adulterar o NÚMERO do documento só tem de sacar a primeira parte do ATCUD, e concatenar o "novo" NUMERO do documento, e está feito!!!

O ATCUD teria de ser encriptado para evitar adulterações...

Pois é, se isto vai dar para retirar benefícios para o IRS, só com a leitura do QRcode, já estou a ver chicos espertos a introduzir números de faturas a eito no seu IRS, indo ao QRcode e aumentando +1, +2, +3, etc.

Eles vão ter de fazer uma validação qualquer, sob pena de terem várias pessoas a declararem a mesma compra e, como não é preciso o papel, não conseguirem provar quem é o verdadeiro comprador.

Pensando melhor, até pode ser o mesmo indivíduo que mete a mesma fatura no IRS dele, do pai, da mãe, do filho, etc.

Edited by americob

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.