Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation since 08/18/2020 in all areas

  1. 3 points
    isto é a base para se adaptar nas vossas aplicações. Isto até é de uma aplicação minha que só fatura "Roupa", o que é tudo a 23%... não preciso de muita coisa neste caso. no entanto, acho que deixei bem claro o seguinte: //J5 Base tributável de IVA à taxa intermédia * //.. //... //... //.... //..... //etc.... //N Total de impostos * //etc... que significa que podem e devem adaptar caso a caso. eu uso filestreamm direto da image QRCode, nao gravo o bmp antes de o gravar na BD, porque não preciso, mas cada um é que sabe como quer e pode adaptar na sua aplicação. quem tiver melhor que partilhe, pois como sabes, 95% das pessoas daqui só querem é a papinha toda feita, mas partilhar código fonte fodias-te. (sei que nao é o teu caso)
  2. 3 points
    Podes ver mais informações sobre este assunto aqui https://snede.net/the-most-dangerous-constructor-in-net/
  3. 3 points
    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.
  4. 2 points
    Para quem precisar de imprimir código QR em impressora genérica, têm aqui os comandos ESC POS da Epson (pode não funcionar em todas). O único problema é que não deixa escolher a versão. https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=140 (vejam também no tab da esquerda as funções 167,169,180,181,182) Exemplo: sCodigo_QR is string="A:123456789*B:999999990*C:PT*D:FS*E:N*F:20190812*G:FS CDVF/12345*H:CDF7T5HD-12345*I1:PT*I7:0.65*I8:0.15*N:0.15*O:0.80*Q:YhGV*R:9999*S:NU;0.80" iConfigure("Generic / Text Only") // indicar impressora nAvanco is int=0 nPrimeiroAvanco is int=0 nSegundoAvanco is int=0 IF nAvanco>255 THEN nResto is int nResto=modulo(nAvanco,256) IF nResto>0 THEN nPrimeiroAvanco=nResto nAvanco=nAvanco-nResto END nSegundoAvanco=nAvanco/256 ELSE nPrimeiroAvanco=nAvanco END IF nPrimeiroAvanco>0 OR nSegundoAvanco>0 THEN iEscape(EvaluateExpression("charact(27)+charact(36)+charact("+nPrimeiroAvanco+")+charact("+nSegundoAvanco+")")) END nTamanho is int=6 nPrimeiroValor is int=0 nSegundoValor is int=0 nTamanhoCodigo is int=(Length(sCodigo_QR)+3) IF nTamanhoCodigo>255 THEN nResto is int nResto=modulo(nTamanhoCodigo,256) IF nResto>0 THEN nPrimeiroValor=nResto nTamanhoCodigo=nTamanhoCodigo-nResto END nSegundoValor=nTamanhoCodigo/256 ELSE nPrimeiroValor=nTamanhoCodigo END iEscape(EvaluateExpression("charact(29)+charact(40)+charact(107)+charact(4)+charact(0)+charact(49)+charact(65)+charact(50)+charact(0)")) // Function 165 iEscape(EvaluateExpression("charact(29)+charact(40)+charact(107)+charact(3)+charact(0)+charact(49)+charact(67)+charact("+nTamanho+")")) // Function 167 iEscape(EvaluateExpression("charact(29)+charact(40)+charact(107)+charact(3)+charact(0)+charact(49)+charact(69)+charact(49)")) // Function 169 iEscape(EvaluateExpression("charact(29)+charact(40)+charact(107)+charact("+nPrimeiroValor+")+charact("+nSegundoValor+")+charact(49)+charact(80)+charact(48)")); // Function 180 iEscape(sCodigo_QR) iEscape(EvaluateExpression("charact(29)+charact(40)+charact(107)+charact(3)+charact(0)+charact(49)+charact(81)+charact(48)")) //Function 181 iEscape(EvaluateExpression("charact(29)+charact(40)+charact(107)+charact(3)+charact(0)+charact(49)+charact(82)+charact(48)")) //Function 182 iEndPrinting()
  5. 2 points
    até agora resolvi-o como aqui indicado https://genopro.com/ssl/
  6. 2 points
    É exatamente como dizes, e já referi isto atrás. Na portaria 202_2016, define-se a Identificação única do documento de venda (InvoiceNo): "Esta identificação é composta sequencialmente pelos seguintes elementos: o código interno do tipo de documento atribuído pela aplicação, um espaço, o identificador da série do documento, uma barra (/) e o número sequencial desse documento dentro dessa série." Com rigor, o identificador da série é o que vem depois do código interno. Em termos práticos, eles esqueceram-se disso nestas especificações técnicas, e puseram apenas o termo identificador da série, a pensar que já inclui o código interno. Haverá uma correção das especificações, ou então no momento de enviar os dados da série, vão requerer o código interno na submissão.
  7. 1 point
    Boas, antes de mais.. não sei se este é o lugar certo para apresentar um projecto.. mas não encontrei outro sitio aqui no fórum. As "SelectBox" para mim sempre foi um problema, super difícil de colocar um design intuitivo, poucas alternativas, bibliotecas enormes, bugs, falta de compatibilidade... enfim. Nestes últimos meses tenho estado a trabalhar num plugin em JavaScript puro (sem dependências) para tornar as SelectBox muito mais façeis de personalizar. GitHub: https://github.com/BMSVieira/BVSelect-VanillaJS Demo: https://bmsvieira.github.io/BVSelect-VanillaJS/ Vejam, testem e digam coisas Ideias são sempre bem vindas!
  8. 1 point
    Boas, A versão, normalmente, é definida em função do tamanho da mensagem. Para garantir a versão 9 no mínimo forço que a mensagem tenho no mínimo 180 caracteres através do campo S. Por exemplo, coloco o nosso nome comercial da empresa, o id do cliente, etc.
  9. 1 point
    Para construir um ficheiro SAFT (ou qualquer ficheiro XML) existem várias formas, mas a mais correta é mapear todas as características do ficheiro em um ou mais objetos. Felizmente o Delphi tem uma ferramenta que faz isso de forma automatica. Para isso basta teres o ficheiro XSD correspondente à estrutura do SAFT (aqui) e dentro do Delphi, escolheres criar novo ficheiro e lá dentro escolher a opção XML Data Binding. Seguindo os passos que se apresentam nessa janela, o Delphi irá criar uma unit com um conjunto de objetos que mapeiam o SAFT (aqui). Uma vez criada essa unit, e acrescentada ao teu projeto, usarás de forma semelhante a esta: var SAFT: IXMLAuditFile; begin SAFT := NewAuditFile; // Cria um objeto com a estrutura do SAFT SAFT.Header.CompanyName := 'blablabla'; // Atribui dados ao objeto. SAFT.Header.TaxRegistrationNumber := '555555550'; // Em vez de valores fixos, adicionarias a partir do local onde tenhas esses dados (ficheiro, banco, etc) ... ... ... SAFT.OwnerDocument.SaveToFile('SAFT.XML'); // Grava o resultado final num ficheiro .XML end; Lembrando é claro que tens campos que são arrays. Por exemplo, para adicionar clientes (terás mais do que um, à partida), terias de usar um ciclo FOR ou algo do género a percorrer a tabela de clientes na base de dados, e a adicionar um a um ao ficheiro, tipo isto: for i := 1 to qEntidades.RecordCount do begin qEntidades.RecNo := i; // Percorre a tabela with SAFT.MasterFiles.Customer.Add do // O objeto inclui este método para criar um novo cliente begin { 2. 2. 1. . . } CustomerID := qEntidades.FieldByName('EntidadeID').AsString; { 2. 2. 2. . . } AccountID := 'Desconhecido'; { 2. 2. 3. . . } CustomerTaxID := qEntidades.FieldByName('NIF').AsString; { 2. 2. 4. . . } CompanyName := qEntidades.FieldByName('Nome').AsString; { 2. 2. 6. 3. . } BillingAddress.AddressDetail := StrDefault(qEntidades.FieldByName('Morada').AsString, 'Desconhecido'); { 2. 2. 6. 4. . } BillingAddress.City := StrDefault(qEntidades.FieldByName('City').AsString, 'Desconhecido'); { 2. 2. 6. 5. . } BillingAddress.PostalCode := StrDefault(qEntidades.FieldByName('PostalCode').AsString, 'Desconhecido'); { 2. 2. 6. 7. . } BillingAddress.Country := StrDefault(qEntidades.FieldByName('Country').AsString, 'Desconhecido'); { 2. 2. 8. . . } if not qEntidades.FieldByName('Telefone').IsNull and not qEntidades.FieldByName('Telefone').AsString.IsEmpty then Telephone := qEntidades.FieldByName('Telefone').AsString; { 2. 2. 9. . . } if not qEntidades.FieldByName('Fax').IsNull and not qEntidades.FieldByName('Fax').AsString.IsEmpty then Fax := qEntidades.FieldByName('Fax').AsString; { 2. 2.10. . . } if not qEntidades.FieldByName('Email').IsNull and not qEntidades.FieldByName('Email').AsString.IsEmpty then Email := qEntidades.FieldByName('Email').AsString; { 2. 2.12. . . } SelfBillingIndicator := qEntidades.FieldByName('SelfBillingIndicator').AsInteger; end; end;
  10. 1 point
    Para a malta do PHP, segue um exemplo com recurso a https://github.com/chillerlan/php-qrcode. Creio que não me escapou nada (🤔), mas saliento: Não é preenchido o campo "L" (Não sujeito / não tributável em IVA) Não é preenchido o campo "M" (Imposto do Selo) Não é preenchido o campo "S" (Outras informações) Creio que em termos de settings do QRCode parece estar tudo OK e em conformidade com os specs O QRCode é gerado com as dimensões mínimas (30x30), convêm imprimirem e ajustarem. A library gera a imagem em formato Base64, sempre que o documento é visualizado é gerado o QRCode (e não é gravado em lado nenhum). Não notei qualquer diferença (delay). use chillerlan\QRCode\QRCode; use chillerlan\QRCode\QROptions; .... $options = new QROptions( [ 'outputType' => QRCode::OUTPUT_IMAGE_PNG, 'eccLevel' => QRCode::ECC_M, 'dataModeOverride' => QRCode::DATA_BYTE, 'versionMin' => 9, ]); $values = [ 'A' => '', 'B' => '', 'C' => '', 'D' => '', 'E' => '', 'F' => '', 'G' => '', 'H' => '', 'I1' => 'PT', 'N' => '', 'O' => '', 'P' => '', 'Q' => '', 'R' => '' ]; $vatValues = ''; foreach ($vats as $vat) { if ($vat['saft_region'] == 'PT') { if ($vat['type'] == 'Isenta') $vatsValues .= 'I2:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; else if ($vat['type'] == 'Reduzida') { $vatsValues .= 'I3:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; $vatsValues .= 'I4:' . number_format($vat['total_vat'], 2, '.', '') . '*'; } else if ($vat['type'] == 'Intermédia') { $vatsValues .= 'I5:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; $vatsValues .= 'I6:' . number_format($vat['total_vat'], 2, '.', '') . '*'; } else if ($vat['type'] == 'Normal') { $vatsValues .= 'I7:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; $vatsValues .= 'I8:' . number_format($vat['total_vat'], 2, '.', '') . '*'; } } else if ($vat['saft_region'] == 'PT-AC') { $vatsValues .= 'J1:PT-AC*'; if ($vat['type'] == 'Isenta') $vatsValues .= 'J2:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; else if ($vat['type'] == 'Reduzida') { $vatsValues .= 'J3:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; $vatsValues .= 'J4:' . number_format($vat['total_vat'], 2, '.', '') . '*'; } else if ($vat['type'] == 'Intermédia') { $vatsValues .= 'J5:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; $vatsValues .= 'J6:' . number_format($vat['total_vat'], 2, '.', '') . '*'; } else if ($vat['type'] == 'Normal') { $vatsValues .= 'J7:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; $vatsValues .= 'J8:' . number_format($vat['total_vat'], 2, '.', '') . '*'; } } else if ($vat['saft_region'] == 'PT-MA') { $vatsValues .= 'K1:PT-MA*'; if ($vat['type'] == 'Isenta') $vatsValues .= 'K2:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; else if ($vat['type'] == 'Reduzida') { $vatsValues .= 'K3:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; $vatsValues .= 'K4:' . number_format($vat['total_vat'], 2, '.', '') . '*'; } else if ($vat['type'] == 'Intermédia') { $vatsValues .= 'K5:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; $vatsValues .= 'K6:' . number_format($vat['total_vat'], 2, '.', '') . '*'; } else if ($vat['type'] == 'Normal') { $vatsValues .= 'K7:' . number_format($vat['total_base_vat'], 2, '.', '') . '*'; $vatsValues .= 'K8:' . number_format($vat['total_vat'], 2, '.', '') . '*'; } } } $qrValue = sprintf (' A:%s* B:%s* C:%s* D:%s* E:%s* F:%s* G:%s* H:%s* I1:%s* %s N:%s* O:%s* P:%s* Q:%s* R:%s ', $values['A'], $values['B'], $values['C'], $values['D'], $values['E'], $values['F'], $values['G'], $values['H'], $values['I1'], $vatsValues, $values['N'], $values['O'], $values['P'], $values['Q'], $values['R'], ); // Removes new lines & whitespaces $qrValue = trim(preg_replace('/\s\s+/', '', $qrValue)); <img src="' . (new QRCode($options))->render($qrValue) . '" width="30" height="30"/>
  11. 1 point
    EXACTAMENTE a minha abordagem! (excepto que eu não faço verificação do MOTIVO de ISENÇÃO, porque eu apenas aceito o MOTIVO M99 num TaxCode "NS" (portanto, para ser usado um M99, terá de ser criada uma "taxa de IVA" com o respectivo TaxCode = NÃO SUJEITO. /** KEYS ordenadas por ordem ASCENDENTE */ private class TaxCountryRegionMap extends TreeMap<String, TaxCodeMap> { /** Nao sujeito / nao tributavel em IVA */ public BigDecimal L=BigDecimal.ZERO; public TaxCountryRegionMap(Entidadesdocumentos documento) { for (Entidadesdocumentosivas iva: documento.getTabelaiva()){ //separa por TaxCountryRegion String key=getTaxCountryRegion(iva.getCodigoiva()); if (!containsKey(key)) put(key, new TaxCodeMap()); //acumula valores switch(iva.getCodigoiva().getTipotaxa()){ case Codigosiva.tipotaxa_normal: case Codigosiva.tipotaxa_reduzida: case Codigosiva.tipotaxa_intermedia: case Codigosiva.tipotaxa_isenta: get(key).add(iva); break; case Codigosiva.tipotaxa_outras: case Codigosiva.tipotaxa_naosujeito: L.add(iva.getTotal()); break; } } } } Mas a complexidade do código para uma coisa aparentemente tão simples é assombrosa... tenho uma estrutura dentro desta que trata de separar cada TaxCountryRegion por TaxCode (acumulando os valores) Será que a AT pensou bem naquilo que quer controlar?
  12. 1 point
    Já tinha levantado essa questão há algum tempo: Tenho pensado no assunto e, tendo em conta que o meu software só faz faturas em IVA, não faz em IS, até que saiam instruções específicas sobre como fazer, acho que os valores sem IVA só deverão ir no código "L" se o motivo TaxExemptionCode for o "M99". Ou seja, se todos os TaxExemptionCode's de uma determinada fatura forem "M99", o L será igual à soma de I2 + J2 + K2. Por oposição, se nenhum dos TaxExemptionCode's da fatura for "M99", o L ficará a zero. Havendo diversos TaxExemptionCode's na fatura, terei que calcular a soma das linhas com "M99" para colocar em L. Aguardemos pelas necessárias FAQ's.
  13. 1 point
    Sem conhecer a versão do PHP que está a utilizar o procedimento mysql_num_rows está DEPRECATED, sendo inclusive removida da versão 7 do PHP. Por isso é aconselhável mudar para o mysqli ou o pdo. Ver: https://www.php.net/mysql_num_rows Sem mais indicações de qual será o erro, se dá erro na query é mornal que vá dar erro na condição do mysql_num_rows. Pelo que convém investigar a query, pode retirar o sinal ` que delimita os nomes dos campos porque não são necessários, ex. `id` e em seguida em vez de passar as variáveis, atribua manualmente o valor à mesmas, por exemplo id='1234' . Se a query funcionar com este procedimento significa que o erro é na passagem dos valores das variáveis. Se tiver instalado o phpmyadmin ou outro gestor da base de dados, tente correr a query no gestor e verificar se ocorrem erros e verifique na query se o nome dos campos estão presentes na base de dados e se têm o mesmo nome. Não se esqueça de verificar se eventualmente a conexão à base de dados se está a fazer correctamente.
  14. 1 point
    Boas Tenho estado a acompanhar o que têm escrito e no meu entender o código identificador da serie será dado ao par TipoDoc+Serie. Deste modo para a mesma serie e dois TiposDoc teremos dois códigos diferentes Para o mesmo TipoDoc e duas series, iremos tb ter dois códigos diferentes. A seguir o ATCUD será Código da serie - Numero do doc. Isto não é mais do que TpDoc Serie/numeroDoc mas escrito de maneira diferente. Não esquecer que o Código da serie Atribuído representa TipoDoc + Serie. Para outro par TipoDoc+Serie em que varie 1 ou os 2 elementos em relação ao Anterior (conjunto TipoDoc+Serie) novo Código será atribuído
  15. 1 point
    Assim à primeira vista e pelo que é descrito no código, na pasta onde está o ficheiro do html, deverá ter o ficheiro do jquery. Depois dentro dessa pasta, deverá ter outras 2 pastas, uma identificada por js, onde no seu interior estará o ficheiro AudioFade.js, e um outra identificada por sound onde deverá colocar os ficheiros de som Mas se pretender por o projecto online, aí o aconselhável é utilizar o endereço do CDN do jquey e dos outros ficheiros se existir essa possibilidade. Ver: https://code.jquery.com/
  16. 1 point
    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...
  17. 1 point
    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. 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.
  18. 1 point
    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).
  19. 1 point
    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
  20. 1 point
    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/
  21. 1 point
    Um dos problemas das macros do LibreOficce Base é terem um comportamento esquisito. A compilação da macro pode ter um comportamento diferente, que a mesma seja executada dentro do GUI onde edita a macro, ou na barra de Ferramentas->Macros. Deixo no seguinte link um manual onde poderá ter uma ideia sobre as macros: https://www.pitonyak.org/database/AndrewBase.pdf
  22. 1 point
    Penso que não dá para fazer com uma fonte, posso estar muito enganado, mas o que há é caracter a caracter, ou seja "FT" terias 2 códigos QR 1 para o "F" e outro para o "T". Tens que usar uma livraria que te crie os códigos nos reports ou uma que gere uma imagem e inseres nos documentos quando estiveres a imprimir, ou se usares impressoras térmicas, ESC/POS. Estive a testar os exemplos do manual, na minha impressora de 58mm e o 1º exemplo da FT, consigo imprimir mas depois não consigo ler o que lá está, todas as aplicações que usei dão erro ao ler aquilo, hoje é dia de testar na de 80mm
  23. 1 point
    Não leves a mal, mas de certeza que nunca me viste a colocar aqui post's descontextualizados (tirando algumas trocas de ideias com o CrominhO). Quando coloco uma questão, ou vem no seguimento do que se está a falar, ou contextualizo devidamente. Todos os programas têm mais que 1 tipo de documento interno para o mesmo tipo de documento do SAFT. Basta ver o caso da "GT" Guia de Transporte que tanto se aplica a Clientes como a Fornecedores. No meu caso, nem sequer usam as mesmas tabelas da base de dados, uma usa as tabelas do módulo de Vendas e a outra usa as tabelas do módulo de Compras.
  24. 1 point
    Estava mesmo a falar das especificações técnicas do QRcode: https://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/Novas_regras_faturacao/Documents/Especificacoes_Tecnicas_Codigo_QR.pdf
  25. 1 point
    Boa tarde, Iniciei um curso em python, estou a utilizar o IDE Pycharm acontece que não estou a conseguir por algumas bibliotecas neste caso o requests,pygame, etc Já vi imensos tutoriais como instalar faço tudo corretamente, mas quando faço import com requests aparece-me o request com simbolo de pasta. Precisava de ajuda. Obrigado
×
×
  • 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.