Ir para o conteúdo

Rankings


Conteúdo Popular

A mostrar o conteúdo com mais reputação desde 17-01-2018 em todas as áreas

  1. 4 pontos
    Eis as informações que conseguir reunir: ASSOFT: https://www.assoft.org/pt/noticias/78/norma-europeia-de-fatura-eletronica http://vexillum.pt/fatura-eletronica/ The eInvoicing Workshop https://www.cen.eu/work/areas/ICT/eBusiness/Pages/eInvoicing.aspx Um site holandês dedicado ao E-Invoicing, onde encontrei documentos e informação técnica valiosa: https://eeiplatform.com/category/standards/ LINKS: (NOTA: estas informações são MAIS DETALHADAS do que a treta do DVD vendido pelo IPQ) http://eur-lex.europa.eu/legal-content/EN/TXT/?uri=COM:2017:590:FIN http://eur-lex.europa.eu/legal-content/EN/ALL/?uri=CELEX%3A32014L0055 https://standards.cen.eu/dyn/www/f?p=204:7:0::::FSP_ORG_ID:1883209&cs=1E81C9C833655EEDC7010C8D0A2FB786C https://github.com/CenPC434 http://docs.oasis-open.org/ubl/os-UBL-2.1/UBL-2.1.html http://docs.oasis-open.org/ubl/os-UBL-2.1/UBL-2.1.zip http://www.unece.org/cefact/xml_schemas/index http://www.unece.org/fileadmin/DAM/cefact/xml_schemas/D16B_SCRDM__Subset__CII.zip https://github.com/phax/peppol-validation-engine/ GLOSSARY Term Description CEN = Comité Européen de Normalisation – European Committee for Standardization CEN/TC = CEN Technical Committee – working group CII = UN/CEFACT Cross Industry Invoice – XML representation of an invoice CIUS = Core Invoice User Specification – A specification based on EN 16931-1:2017 that defines certain elements more narrow EN = European Norm – has tighter binding than TR and TS EN 16931 = European Norm instance with ID 16931 – this is the EN that contains the semantic data model for electronic invoices in Europe TR = Technical Recommendation – has lower binding than EN and TS TS = Technical Specification – binding between EN and TR
  2. 3 pontos
    Aparentemente a letra da lei permite essa interpretação. Para a AT isso não deve ter problema nenhum porque a chave primária deles não deve ser o InvoiceNo, mas sim o IdDocumento. Além disso, cada SAFT só pode ter documentos de 1 ano, seja o ano completo ou seja parcial. No meu caso não dá porque a chave primária que uso é "Tipo+Serie+Numero", mas para dar bastaria alterar para "year(data)+Tipo+Serie+Numero". Por outro lado, para o utilizador, não vejo qualquer vantagem nisso, pois só iria dar confusão com os respetivos clientes. Para identificar uma fatura, além de dar o numero e a série também iria ter de dar a data. Quando a AT diz "... por um período não inferior a um ano fiscal …" o que quer dizer é que uma série criada no início do ano deve ser, por regra, utilizada pelo menos até ao fim do ano, em vez de serem, por exemplo, mensais. Por exemplo, na contabilidade é comum criarem-se diários (pastas) em que se separam documentos por tipo do género "vendas", "compras", "bancos", etc. Dentro de cada um desses diários a numeração é também sequencial. O problema é que muitas vezes os documentos chegam muito tarde á mão do contabilista, especialmente faturas e notas de crédito de fornecedores que, não sendo emitidas pela empresa, não se consegue controlar. A forma de dar a volta a isso é reiniciar a numeração todos os meses. Assim, ainda que já estejam lançados documentos de Setembro, podes sempre acrescentar mais um lançamento em Julho de uma fatura que o empresário se esqueceu de entregar. Ou se estiveres a conferir um extrato bancário de Janeiro e verificares que te esqueceste de lançar um documento que até tinhas de ir buscar ao homebanking, nunca terás o problema de falta de numero para inseri-lo no respetivo mês.
  3. 3 pontos
    Dá uma olhada no TIdleTimer, um irmão do TTimer sugerido pelo @thoga31 específico para lidar com inactividade. http://lazarus-ccr.sourceforge.net/docs/lcl/extctrls/tidletimer.html Assim não tens de te preocupar com multi-threading nem verificação dos inicios e fins de processos, pois o componente trata disso por ti.
  4. 3 pontos
    Estou até meio que sem saber o que responder a essa história do professor, pelo que vou deixar para último... 😕 Isso é outra coisa... Ninguém nasce ensinado, e o paradigma OOP é radicalmente diferente do Imperativo. Muitas pessoas (sim, programadores de Java também) não fazem a mais pálida ideia de como se programa realmente em OOP. Acham que programar orientado a objectos é... fazer objectos. É muito mais. Todo o conceito muda, a forma de pensar tem de mudar também, ou apenas terão objectos a fazer o papel de armazéns de código. Recomendo, para entender o conceito OOP, o livro Object Thinking (David West). Não tem nada a ver com Pascal, Java, etc. É um livro para expandir um conceito. Alguns exemplos usados estão em SmallTalk, mas poderiam estar em qualquer outra, visto que são só exemplos para entender o conceito. Já programei muito em Imperativo, e programei muito mais em 'Imperativo com Objectos' - e pensava como os outros que estava a fazer OOP. Actualmente prefiro programar em "OOP a sério", e com anos disto considero que ainda tenho muito para aprender. É uma evolução constante para quem quer realmente aprender, mas dependendo do tipo de software que se quer criar, vale a pena o esforço. As Units do Pascal, que depois chamas na secção Uses, são apenas uma das formas de reutilizar código. Um simples procedimento é uma forma de reutilizar. Um objecto, uma framework - há várias formas de reutilizar código, e podem e devem ser usadas em Pascal (ou qualquer outra LP). Sempre que no teu código usares copy/paste, quase de certeza estás na presença de uma situação onde um qualquer método de reutilização de código se faz necessário. Isso já virou piada entre os programadores de Pascal... Pessoas que nunca tocaram no Pascal a reclamarem dele é motivo para rir. Pessoas que tentam comparar o Standard Pascal - uma LP de 1974 formalizada em 1983, com um conjunto limitado de funcionalidades visto que era uma linguagem pensada para uso académico - com LPs actuais com funcionalidades actuais. Obviamente, nesta comparação, Pascal perde. O que falta a essa malta é aprender a não comparar alhos com bugalhos. Querem comprar com uma LP actual? Então comparem com Delphi actual. E mesmo quando comparam o Pascal 'actual', em vez de compararem linguagens, comparam compiladores - e geralmente acham boa ideia comparar com PascalZIM, que, sem desprimor ao seu criador, é muito fraquinho, tendo apenas uma pequena parte das funcionalidades do Pascal. Bem... Tem de ser, vamos a isto: Se ele disse mesmo isto, podes por favor dizer-lhe que ele é burro que nem uma porta, que não tem competência para ser professor de informática, muito menos de programação, e muito provavelmente não devia ser autorizado nem a operar uma calculadora de bolso... Podes dizer que fui eu que disse! A divisão do código em segmentos menores - sejam métodos, funções, procedimentos, rotinas, units, módulos, ou o que quiseres chamar-lhe - não é 'típico de programadores de Delphi'. É típico de quem sabe programar, seja em que linguagem for. Colocar todo o código no bloco principal? A sério? Até o Basic evoluiu para além disso. Imagina criar um projecto com milhões de linhas de código, todas no bloco principal. Ui, que lindo seria. Se esse é o teu professor, a minha sugestão é fazeres tudo ao contrário do que ele mandar. Aprendes mais a limpar o pó a livros de lógica e algoritmia do que a ser ensinado por quem quer que seja que te diga isso.
  5. 3 pontos
    O Application.ProcessMessages é largamente usado para 'desenrascar' esse problema, mas o seu uso não é sem custos... Este método serve para 'avisar' o programa para processar as mensagens (duh! ) que estão na queue do Windows, independentemente de quais são e do risco associado à execução de mensagens fora de ordem. Antes de mais, uma explicação simplista do que são 'mensagens': O GUI do Windows funciona porque os seus elementos enviam mensagens uns aos outros com indicação do que querem fazer. Por exemplo, quando clicas num botão, é enviada uma mensagem para o componente encarregue de alterar o aspecto visual do botão (que o faz parecer 'pressionado' visualmente) que por sua vez manda uma mensagem à form para se redesenhar para que o novo aspecto seja mostrado, há uma mensagem a dar iniciação do trabalho do botão, etc. Ao fazer ProcessMessages, estás a forçar a main thread do programa a executar tudo o que estiver na fila, e isto tem, de entre outras, as seguintes consequências: Estás a parar temporariamente a execução da tarefa principal, obrigando-a a demorar mais tempo Estás a mandar executar mensagens a meio da tarefa, sem saber quais as mensagens que lá estão nem os problemas que a sua execução forçada pode causar. No caso, a tua ideia faz com que ele pare a leitura dos dados, actualize o UI ao processar as mensagens de actualização que estão pendentes, e volta a ler, e voltar a parar, e por aí fora até completar a leitura. Como à primeira vista, isto funciona, muita gente o faz. O que muitos desconhecem é que, ao fazer isto, podem estar com uma simples linha a introduzir bugs no programa, bugs esses que são de detecção extremamente difícil pois existem pela execução de mensagens fora da ordem correcta. O caso é tal que podes correr um programa e dar tudo bem, voltas a correr sem alterar nada e os bugs manifestam-se, voltas a correr e está tudo bem, voltas a correr e aparecem bugs completamente diferentes dos primeiros. Ou seja, o pesadelo de qualquer programador. Por outro lado, dependendo das mensagens pendentes, o resultado pode nem ser o esperado, e não resolve sequer o problema inicial. Podes agora 'resolver' assim, e noutro programa em que te depares com um problema semelhante, resolves usar o mesmo, mas nesse outro programa não funcionar, por um qualquer motivo. Isto retira-te a previsibilidade das soluções, o que te obrigará a perder tempo à procura da solução de cada vez que te surgir o problema. E se o utilizador for dado a clicar à toa enquanto espera, como há tantos por aí, o resultado é muitas vezes o crash do programa, porque independentemente de lhe mandarmos processar as mensagens, a thread continua a ser só uma, e nem sempre com capacidade de fazer tudo o que lhe pedem. Nota: Não estou com isto a dizer que nunca se deve usar o ProcessMessages, ou que no teu caso não resolva o problema sem introduzir outros. Tudo depende do código circundante ao ProcessMessages. E mesmo quando os bugs aparecem, podem ser coisas tão banais quanto uma barra de progresso que anda para a frente e depois volta atrás, para depois voltar pra frente, não afectando nada de especial senão o aspecto visual. Mas há casos bem mais graves, o que me leva a recomendar que quem não saiba exactamente o que está a acontecer, ignore o 'remendo' que é o ProcessMessages, em favor de uma solução mais previsível, como o uso de multi-threading. Nota 2: Multi-threading não é, no entanto, um mar de rosas. É preciso perder algum tempo para sequer começar a ter ideia do ninho de ratos que aquilo é. No entanto, a partir do momento que saibas usar e implementares com as devidas protecções, é mais previsível e consistente do que correr mensagens desconhecidas a meio de uma tarefa.
  6. 3 pontos
    Realmente, o Portal da AT está tão modificado que não se consegue encontrar nada à primeira. Aqui vai o link: https://www.acesso.gov.pt/gestaoDeUtilizadores/consulta?partID=PFAP
  7. 3 pontos
    isso é o operador ternário. imagina um if, mas que "retorna" um valor. olha para a estrutura do operador ternário: <expr1> ? <expr2> : <expr3> agora é necessário como a linguagem processa essa expressão (toda a combinação acima descrita): - caso o valor de expr1 for verdadeiro, então o resultado do operador ternário é o resultado da expr2, caso contrário, será expr3.
  8. 3 pontos
    Para tornar este tópico menos político e mais prático, vou responder a esta questão: Por experiência própria, ainda tem tem bastante impacto. Qualquer software que trate/processe dados pessoais pode implementar estes pontos para ajudar o utilizador a cumprir com o regulamento: - impressão de pedidos de autorização para armazenamento de dados pessoais das diversas entidades; - direito a ser esquecido a pedido das entidades; - pseudonimizar dados pessoais (esconder dados pessoais a utilizadores que não necessitam de vê-los. Ex: mostrar apenas o código ou o primeiro nome ao utilizador que está a processar salários); - eliminar dados pessoais que já não são necessários (rotinas automáticas ou a pedido); - direito ao acesso e portabilidade dos dados (por exemplo exportar a ficha do cliente para um ficheiro); - proteção de dados pessoais (acessos condicionados na aplicação, boas práticas na política de passwords) - registo de acesso e tratamento de dados pessoais (por exemplo um log) Gostava que partilhassem outras experiências práticas de implementação do GDPR nas aplicações que desenvolvem.
  9. 3 pontos
    Olá a todos! Estamos a tentar usar os Webservices referentes ao STADA Exportação. Finalmente hoje enviaram-nos um certificado para o sistema de testes sem o WSDL (apesar de já o ter pedido) e foi assim que cheguei a este fórum através do nome do ficheiro do certificado. Alguém tem experiência com o STADA Exportação ou consegue arranjar o WSDL? Para adiantar a parte da autenticação estou a tentar enviar umas faturas para o ambiente de testes e estou sempre a obter o famoso <?xml version='1.0' ?> <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'> <env:Body> <env:Fault> <faultcode>env:Client</faultcode> <faultstring>Internal Error</faultstring> </env:Fault> </env:Body> </env:Envelope> Hoje estive na luta e consegui finalmente enviar alguma coisa para o servidor de testes. Basicamente a luz acendeu quando passei o parâmetro encoding com UTF-8 nas opções de encoding do SoapClient e devolveu um erro diferente de Internal Error. A partir daí foi dar marteladas atrás de marteladas, ler coisas neste tópico, tratar da autenticação e embrulhar Para quem esteja a chegar agora e trabalhe com PHP fica aqui o código com o SoapClient e phpseclib (não usa mcrypt que foi descontinuado nas versões mais recentes e é considerado inseguro). Este exemplo é para as guias de transporte. Eu vou estar a trabalhar com outros webservices que não estão no site das finanças referentes ao STADA Exportação portanto espero que a autenticação seja igual!! Neste caso estou a usar composer para instalar a dependência do phpseclib portanto terão de adaptar ao vosso código! 1. Obter os certificados do Portal das Finanças. 2. Pegar no ficheiro TesteWebservices.pfx, converter para o formato PEM e copiar o resultado para uma pasta acessível pelo vosso script (no meu caso a pasta certs). A password é TESTEwebservice. O comando irá retirar a password do ficheiro portanto não será necessária no código. openssl pkcs12 -in TesteWebservices.pfx -out TesteWebservices.pem -nodes 3. Copiar o ficheiro da chave pública da AT que está no link indicado no número 1 para a pasta do vosso script. 4. Personalizar o código em baixo com as vossas credenciais, caminhos e endpoints no array $options. <?php require 'vendor/autoload.php'; use phpseclib\Crypt\AES; use phpseclib\Crypt\Random; use phpseclib\Crypt\RSA; use phpseclib\File\X509; $transport = new stdClass(); $transport->TaxRegistrationNumber = '599999993'; $transport->CompanyName = 'Nome Empresa Lda'; $transport->CompanyAddress = new stdClass(); $transport->CompanyAddress->Addressdetail = 'Rua da Empresa, 123'; $transport->CompanyAddress->City = 'Maia'; $transport->CompanyAddress->PostalCode = '4470-263'; $transport->CompanyAddress->Country = 'PT'; $transport->DocumentNumber = bin2hex(openssl_random_pseudo_bytes(8)); $transport->MovementStatus = 'N'; $transport->MovementDate = date('Y-m-d'); $transport->MovementType = 'GT'; $transport->CustomerName = 'Nome Cliente Lda'; $transport->CustomerTaxID = 599999993; $transport->CustomerAddress = new stdClass(); $transport->CustomerAddress->Addressdetail = 'Local'; $transport->CustomerAddress->City = 'Lisboa'; $transport->CustomerAddress->PostalCode = '2775-089'; $transport->CustomerAddress->Country = 'PT'; $transport->AddressFrom = new stdClass(); $transport->AddressFrom->Addressdetail = 'Local carga'; $transport->AddressFrom->City = 'Maia'; $transport->AddressFrom->PostalCode = '4470-263'; $transport->AddressFrom->Country = 'PT'; $transport->AddressTo = new stdClass(); $transport->AddressTo->Addressdetail = 'Local entrega'; $transport->AddressTo->City = 'Lisboa'; $transport->AddressTo->PostalCode = '2775-089'; $transport->AddressTo->Country = 'PT'; $transport->VehicleID = '00-00-KK'; $transport->MovementStartTime = date('Y-m-d\TH:i:s', mktime(date('H') + 1, date('i'), 0, date('m'), date('d'), date('Y'))); $transport->MovementEndTime = date('Y-m-d\TH:i:s', mktime(date('H') + 5, date('i'), 0, date('m'), date('d'), date('Y'))); $transport->Line = []; $transport->Line[] = (function () { $line = new stdClass(); $line->ProductDescription = 'prod1'; $line->Quantity = 1; $line->UnitOfMeasure = 'Kg'; $line->UnitPrice = 11; return $line; })(); $transport->Line[] = (function () { $line = new stdClass(); $line->ProductDescription = 'prod2'; $line->Quantity = 1; $line->UnitOfMeasure = 'Kg'; $line->UnitPrice = 12; return $line; })(); $wsdl = 'wsdl/documentosTransporte.wsdl'; $options = [ 'local_cert' => 'certs/TesteWebservices.pem', 'encoding' => 'utf-8', 'soap_version' => SOAP_1_2, 'at_username' => '599999993/37', 'at_password' => 'testes1234', 'at_public_key' => 'certs/ChavePublicaAT.cer', 'location' => 'https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte', 'uri' => 'https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte', ]; $client = new SoapClientAT($wsdl, $options); var_dump($client->envioDocumentoTransporte($transport)); /** * Class SoapClientAT */ class SoapClientAT extends SoapClient { /** * @var array|null */ private $options = null; /** * SoapClientAT constructor. * @param string $wsdl * @param array $options */ public function __construct($wsdl, $options) { $this->options = $options; parent::__construct($wsdl, $options); } /** * @param DOMDocument $document * @return DOMElement */ private function createHeaderNode($document) { $publicKey = $this->options['at_public_key']; if (is_file($publicKey)) { $publicKey = file_get_contents($publicKey); } $key = Random::string(16); $certificate = new X509(); $certificate->loadX509($publicKey); $rsa = new RSA(); $rsa->loadKey($certificate->getPublicKey()); $rsa->setEncryptionMode(RSA::ENCRYPTION_PKCS1); $nonce = $rsa->encrypt($key); $cipher = new AES(AES::MODE_ECB); $cipher->setKey($key); $password = $cipher->encrypt($this->options['at_password']); $created = $cipher->encrypt(gmdate('Y-m-d\TH:i:s\Z')); $usernameToken = $document->createElement('wss:UsernameToken'); $usernameTokenData = [ 'wss:Username' => $this->options['at_username'], 'wss:Password' => base64_encode($password), 'wss:Nonce' => base64_encode($nonce), 'wss:Created' => base64_encode($created), ]; foreach ($usernameTokenData as $tag => $value) { $usernameToken->appendChild($document->createElement($tag, $value)); } $security = $document->createElement('wss:Security'); $security->appendChild($usernameToken); $security->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:wss', 'http://schemas.xmlsoap.org/ws/2002/12/secext' ); $header = $document->createElement('env:Header'); $header->appendChild($security); return $header; } /** * @param $request * @return string */ private function embedHeader($request) { $document = new DOMDocument(); $document->preserveWhiteSpace = true; $document->loadXML($request); $body = $document->getElementsByTagName('Body')->item(0); $header = $this->createHeaderNode($document); $envelope = $document->getElementsByTagName('Envelope'); $envelope->item(0)->insertBefore($header, $body); // Must change the namespace of the Envelope tag to match the one specified in the WSDL otherwise we'll get // an HTTP 500 Error with the text "Internal Error" $envelope->item(0)->setAttributeNS( 'http://www.w3.org/2000/xmlns/', 'xmlns:env', 'http://schemas.xmlsoap.org/soap/envelope/' ); return $document->saveXML(); } /** * @param string $request * @param string $location * @param string $action * @param int $version * @param int $one_way * * @return string */ public function __doRequest($request, $location, $action, $version, $one_way = 0) { $request = $this->embedHeader($request); return parent::__doRequest($request, $location, $action, $version, $one_way); } } Cumprimentos, Ricardo
  10. 3 pontos
    Ok, lembrei-me de uma forma de carregar a imagem. Faço notar, no entanto, que este não é um método eficiente! Essencialmente recorri a umas units muito úteis da FCL - um conjunto de units do Free Pascal que não fazem parte do "pacote de base" (RTL) - e à unit wingraph, uma melhoria da velhinha graph dos tempos do Turbo Pascal. Esta última é freeware e pode ser encontrada aqui. program CLIImage; uses fpreadbmp, fpimage, // Free Pascal FCL wingraph; // http://math.ubbcluj.ro/~sberinde/wingraph/ var image : TFPCustomImage; // Stream onde fica carregada a imagem reader : TFPCustomImageReader; // Leitor de imagens BMP driver, mode : smallint; // Para a janela gerada pelo 'wingraph' x, y : integer; // Coordenadas begin image := TFPMemoryImage.Create(500, 500); // Imagem 500x500 reader := TFPReaderBMP.Create; image.LoadFromFile('image.bmp', reader); // Leitura do ficheiro de imagem 'imagem.bmp' reader.Free; DetectGraph(driver, mode); // Inicialização da janela do 'wingraph' mode := m800x600; // Janela 800x600 será suficiente InitGraph(driver, mode, ''); // Gera a janela { Coloca a imagem na janela - é preciso converter o código RGB numa Color entendida pelo 'wingraph' } for y := 0 to image.Height-1 do for x := 0 to image.Width-1 do PutPixel(x, y, GetRGBColor(image.Colors[x,y].Red, image.Colors[x,y].Green, image.Colors[x,y].Blue)); readln; // Pausa do programa CloseGraph; // Fecha a janela do 'wingraph' image.Free; // Liberta recursos da imagem - OBRIGATÓRIO! end. Ainda assim, continuo a sugerir que, para este tipo de fins, se usem aplicações GUI em vez de CLI uma vez que isto é já uma arte arcaica e que, mais dia menos dia, deixará de ser praticável. Cumprimentos.
  11. 3 pontos
    Retirado da pagina que não consegues ver. Parâmetros de invocação da aplicação: Opção Opção extendida Descrição Obrigatório Exemplo de utilização Validações -XMS - Define o tamanho inicial e mínimo de memória para iniciar a aplicação. É definido através de um inteiro seguido da unidade de memória que este representa. Os valores possíveis para a unidade de memória são: g|G|m|M|k|K. Este valor terá de ser indicado antes do parâmetro "-jar". Não -XMS64m - -XMX - Define o tamanho máximo de memória que a aplicação poderá utilizar. É definido através de um inteiro seguido da unidade de memória que este representa. Valores possíveis para a unidade de memória: g|G|m|M|k|K. Este valor terá de ser indicado antes do parâmetro "-jar". Não -XMX1024m - -jar - Define o ficheiro jar onde se encontra a aplicação de envio de ficheiro SAF_T (PT). Caso o caminho para o ficheiro jar contenha espaços este terá de ser delimitado por aspas. Sim -jar FACTEMICLI-[VERSAO]-cmdClient.jar - -n --nif Define o NIF do comerciante para o qual se pretende enviar o ficheiro SAFT-T (PT) e que será utilizado para autenticação no portal. Poderá ser definido o sub-utilizador, através da seguinte formatação 123456789/1. Sim -i 123456789 -Terá de ser um NIF válido. -p --password Password do utilizador, no Portal das Finanças, para o qual se pretende realizar o envio de ficheiro SAF-T (PT). Sim -n xxxxxxxxx - Password terá de ser válida para o contribuinte em questão. -a --ano Ano a que se refere o ficheiro SAF-T(PT) a enviar. Sim -a 2013 - Terá de ser um valor numérico; - Dimensão igual a 4. -m --mes Mês a que se refere o ficheiro SAF-T(PT) a enviar. Sim -m 01 - Terá de ser um valor numérico; - Dimensão igual a 2. -op --operacao Indicação da operação que se pretende realizar, com um dos seguintes valores: - "validar": Valida o ficheiro SAF-T(PT) definido no parâmetro '-i'; - "enviar": Envia o ficheiro SAF-T(PT), definido no parâmetro '-i', para a AT. Sim -op enviar - O valor definido para a operação terá de ser um dos especificados. -i --input Indicação do caminho para o ficheiro SAF-T (PT) que pretende enviar/validar para a AT. Se o caminho contiver espaços este terá de ser delimitado por aspas. Sim -i "c:\Ficheiro saft-t (pt).xml" - Ficheiro tem de existir em disco. -v --version Indicação do formato de ficheiro a enviar, com um dos seguintes valores: - "R02": Portaria n.º 160/2013 (versão 1.02_01). - "R03": Portaria n.º 274/2013 (versão 1.03_01). - "R04": Portaria n.º 302/2016 (versão 1.04_01). Por omissão o formato de envio terá o valor "R04". O formato "R01" (Portaria n.º 1192/2009 (versão 1.01_01)) deixou de ser aceite a partir de 1 de Abril de 2014. Não -v R02 - O valor definido para o formato terá de ser um dos especificados. -o --output Indicação do caminho para o ficheiro onde será escrito o resultado do envio do ficheiro SAF-T (PT). Se o caminho contiver espaços este terá de ser delimitado por aspas. Por omissão escreve para a consola onde foi iniciado o envio. Não -o "c:\Ficheiro resultado.xml" -Pasta onde será colocado o ficheiro terá de existir em disco. -r --resumido Indicação do caminho para o ficheiro onde será escrito o ficheiro resumido. Se o caminho contiver espaços este terá de ser delimitado por aspas. Por omissão escreve o ficheiro na mesma directoria e nome, com sufixo 'resumido', do ficheiro definido no parâmetro '-i'. Não -r "c:\Ficheiro resumido.xml" - -t --testes Indicação de que se trata de um envio de testes, devendo o ficheiro ser ignorado para processamento. Não -t -h --help Imprime a listagem com todo os parâmetros existentes, bem como um exemplo de utilização. Não -h Exemplos de utilização: A configuração mínima para proceder ao envio do ficheiro SAF-T (PT) é a seguinte: java -jar FACTEMICLI-[VERSAO]-cmdClient.jar -n 123456789 -p xxxxxxxxx -a 2013 -m 01 -op enviar -i "C:\caminho para ficheiro\Nome_ficheiro.xml" Caso seja pretendido é possível indicar um ficheiro de saída para onde será escrito o resultado do processamento ou alterar a quantidade de memoria utilizada: java -Xms:256m -Xmx:1024m -jar FACTEMICLI-[VERSAO]-cmdClient.jar -n 123456789/14 -p xxxxxxxxx -a 2013 -m 01 -op enviar -i "C:\caminho para ficheiro\Nome_ficheiro.xml" -o "C:\caminho para ficheiro\Nome_ficheiro_saida.xml" Estrutura de resposta (XML) Nesta secção descreve-se a estrutura e informação da resposta ao envio de ficheiro SAF-T (PT) através do aplicativo batch. A especificação XSD da resposta enviada pelo servidor é a seguinte: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="response"> <xs:complexType> <xs:choice> <xs:element name="errors" type="errorType" minOccurs="1"/> <xs:sequence> <xs:element name="totalFaturas" type="xs:string" maxOccurs="1" minOccurs="1"></xs:element> <xs:element name="totalCreditos" type="xs:string" maxOccurs="1" minOccurs="1"></xs:element> <xs:element name="totalDebitos" type="xs:string" maxOccurs="1" minOccurs="1"></xs:element> <xs:element name="warning" type="xs:string" maxOccurs="1" minOccurs="0"></xs:element> <xs:element name="idFicheiro" type="xs:string" maxOccurs="1" minOccurs="0"></xs:element> <xs:element name="nomeFicheiro" type="xs:string" maxOccurs="1" minOccurs="1"></xs:element> <xs:element name="createdDate" type="xs:string" maxOccurs="1" minOccurs="1"></xs:element> </xs:sequence> </xs:choice> <xs:attribute name="code" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:complexType name="errorType"> <xs:sequence> <xs:element name="error" type="xs:string" maxOccurs="unbounded" minOccurs="1"/> </xs:sequence> </xs:complexType> </xs:schema> Exemplo de resposta de sucesso no envio do ficheiro SAF-T (PT). No caso de o ficheiro ser aceite mas com alguma condicionante, será colocada uma mensagem de "warning". <?xml version="1.0" encoding="ISO-8859-1"?> <response code="200"> <totalFaturas>10</totalFaturas> <totalCreditos>1234.56</totalCreditos> <totalDebitos>12.34</totalDebitos> <warning>Devido a todas as faturas serem anteriores a 1/Jan/2013 o ficheiro não será considerado para processamento.</warning> <idFicheiro>123</idFicheiro> <nomeFicheiro>saft-pt.xml</nomeFicheiro> <createdDate>2013-02-01 15:17:54</createdDate> </response> Exemplo de resposta quando existe um erro no envio ou validação do ficheiro SAF-T (PT). <?xml version="1.0" encoding="ISO-8859-1"?> <response code="-3"> <errors> <error>NIF do comerciante ('123456789') é diferente do NIF declarado no ficheiro SAF-T PT ('987654321').</error> </errors> </response> Códigos de resposta existentes Código de Resposta Mensagem de erro Descrição do erro -1 Ocorreu um erro durante o envio do ficheiro. Erro genérico na comunicação entre cliente e servidor. -2 O ficheiro recebido não tem o mesmo tamanho que o ficheiro enviado. Tamanho do ficheiro declarado no header pelo programa cliente não corresponde ao tamanho real enviado -3 Mensagem específica da validação que não está a ser respeitada. A mensagem de resposta para este erro é variável, estando a sua mensagem de erro dependente da validação que não é respeitada -4 Ocorreu um erro durante o envio do ficheiro. Erro ao inserir o ficheiro na base de dados -5 O ficheiro selecionado já foi enviado para a AT. Cenário em um ficheiro idêntico foi previamente enviado para a AT. -6 Erro no processo de conversão. Este erro ocorre caso exista algum problema durante o processo de conversão. É apresentada mensagem complementar indicando a origem do erro. -7 O cliente de linha de comandos que está a utilizar não se encontra atualizado. Por favor aceda ao portal e-fatura e obtenha a nova versão. Caso o cliente linha de comando que se encontra a utilizar não seja a versão mais actual. -8 O ficheiro resumido não pode ser o mesmo que o ficheiro seleccionado para envio. Caso em que o ficheiro indicado no parâmetro -i (ficheiro SAF-T (PT) a enviar para a AT) é o mesmo que o indicado pelo parâmetro -r (localização do ficheiro resumido). -9 Para poder entregar o SAF-T na versão que indicou necessita de atualizar o cliente de linha de comandos. Para isso, por favor, aceda ao portal e-fatura e obtenha a nova versão. Caso o cliente linha de comando que se encontra a utilizar não seja a versão mais actual para o formato de SAF-T que está a entregar. -401 Login failed for user 123456789. ERROR CODE: <ERRO ANTENTICAÇÃO> Quando ocorre um erro na autenticação do servidor -666 Ocorreu um erro. Erro não categorizado durante o processo de envio. É apresentada uma mensagem descritiva do erro. 200 - Sucesso no envio do ficheiro
  12. 2 pontos
    Penso que o que procuras está a ser discutido aqui: https://www.portugal-a-programar.pt/forums/topic/76837-norma-europeia-de-fatura-eletrónica/
  13. 2 pontos
    Há muitos anos que eu digo que o PC de teste de um programador deveria ser um chaço arcaico. Só assim para alguns programadores perceberem que, independentemente de tudo o resto, o programa deveria ser o mais eficiente possível, e dever-se-ia apostar em fazer o melhor possível logo à primeira, para evitar depois a 'perca de tempo' a refactorar.
  14. 2 pontos
    Boa tarde, Quando não definimos o SecurityProtocol, é utilizado o protocolo que estiver definido por defeito no Windows... O que tem sido alterado nos ultimos tempos através do Windows Update. Por isso, forcei a utilização de TLS 1.2. O ServerCertificateValidationCallback serve para ignorar a validação do certificado remoto (o tal que foi alterado pela AT, cuja entidade emissora - COMODO - não consta nas entidades de certificação raiz). Se instalares o certificado em todas as máquinas, não é necessário estar a implementar isto... Relativamente à framework, eu estou a utilizar a 3.5 (por isso tive de utilizar o valor 3072 em vez da constante por não existir), e só tive problemas com máquinas que não tinham updates em dia... o erro algo semelhante a: «could not load protocol»... Não tenho a aplicação instalada em XP, mas como o XP não tem atualizações, pode não ter o protocolo instalado ou estar desativado no registry...
  15. 2 pontos
    Bom dia Fabio, posso tentar ajudar nas tuas duvidas, mas convém consultares a documentação oficial da AT: http://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/Pages/certificacao-de-software.aspx http://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/SAFT_PT/Paginas/news-saf-t-pt.aspx 1. a) A melhor forma de teres a certeza do formato é analisares o ficheiro de validação do SAF-T para o campo DocumentNumber. Mas basicamente a série é uma forma de identificar unicamente a numeração. Por exemplo podes ter a série por posto e juntas o ano, ficando P12018 (ex: FR P12018/1). Não podes ter o caracter de espaço na série. b) O código hash é gerado com a chave privada, usando alguns campos do documento (dataemissão;datahorasistema;numero;total;hashdocanterior). No caso do primeiro documento, como não tens documento anterior, omites esse conteúdo. Essa parte de extrair 4 caracteres do hash será apenas na impressão do documento para entregar ao cliente. c) Não entendi a duvida mas os documentos fechados e assinados não podem ser alterados. d) Todos os documentos que possam ser entregues a clientes têm de ser assinados (faturas, contas, etc). O prazo de envio do SAF-T é atualmente até ao dia 20 do mês seguinte. e) Para cancelamento de algum produto, deve ser feita uma nota de crédito. A anulação julgo que só em casos extremos (por exemplo, engano no NIF) 2. Esse erro indica que estás a exportar um produto (com o código MO) na parte dos documentos, que não referenciaste no inicio do SAF-T, na parte dos produtos 3. Não tenho conhecimento se existe alguma API que facilite, mas tenta ver o tópico SAFT-PT: debate de dúvidas e ideias no forum, tem lá bastante informação que ajudou-me na altura que fiz. Espero que ajude, nelsonr
  16. 2 pontos
    Olá xambas. O que quero dizer é que fiz o POST do XML diretamente para o Endpoint. Uma coisa importante com o servidor de testes é que, da minha experiência, só funciona com o user de testes (por favor confirma). 'at_username' => '599999993/37', 'at_password' => 'testes1234' Peguei no teu XML, fiz algumas alterações e consegui que o teu XML passasse. Aqui estão as diferenças entre ambos: https://www.diffchecker.com/tmTqCSnF (antigo do lado direito e novo do lado esquerdo). Repara que, apesar de tu veres um erro genérico (Internal Server Error) quer dizer que no fundo há um erro mais detalhado que não consegues ver. Possivelmente esse erro é aquele que indiquei da estrutura do XML. Sugiro também que o programa que gera o XML retire espaços em branco e newlines do XML http://www.webtoolkitonline.com/xml-minifier.html <?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:doc="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/"><S:Header><wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext"><wss:UsernameToken><wss:Username>xxxxxxxxx/1</wss:Username><wss:Password>N4rXr+dB2ukThO75sSUblA==</wss:Password><wss:Nonce>IOcKjb7C5YI9vCtHQQ/eh4gOLnwMpYIloKoQx3qRNfmuy5CKorxKg4Sgy7BKNzS8IbtRlXjlMNY8rywYVoNbji4tsRy+6FsTM6tOP5P/f39xPUXG23B2xqHFX7LQ9ZLb1WBsdwA7G3EPl49gQCVQF5QWIzbu9TrkVraVR5ACWJx2h6YlXlOT/IO7KpN+z6htRhvWR2VrXwd7Vuku+eOxQSPfq/V+hLszWLwcJJnNQjuVsGDFV0Q/PPW9roN+6yIGaeATQbc07OtZdYLENz0gGDW7isdmttpFWhZ9t85Bsge8JDmWyl/XI9AV9ZULL1EZ+euWRfYmvboSGcLTvlUoeQ==</wss:Nonce><wss:Created>UL4jE55BGauN4C0eDKgA6a0Iq9gB8UE1VAvk0nXpKdM=</wss:Created></wss:UsernameToken></wss:Security></S:Header><S:Body><doc:envioDocumentoTransporteRequestElem><TaxRegistrationNumber>123456789</TaxRegistrationNumber><CompanyName>SHM Eng.</CompanyName><CompanyAddress><Addressdetail>Rua Tal, Sitio Tal</Addressdetail><City>São Jorge da Murronhanha</City><PostalCode>4444-555</PostalCode><Country>PT</Country></CompanyAddress><DocumentNumber>GT SERIE0/99990</DocumentNumber><MovementStatus>N</MovementStatus><MovementDate>2017-03-01</MovementDate><MovementType>GT</MovementType><CustomerTaxID>599999993</CustomerTaxID><CustomerAddress><Addressdetail>RUA JOSÉ PEREIRA DO NASCIMENTO, Nº 51 LUANDA</Addressdetail><City>LUANDA</City><PostalCode>4444-555</PostalCode><Country/></CustomerAddress><CustomerName>CASAIS ANGOLA, ENGENHARIA E CONSTRUÇÃO SA</CustomerName><AddressTo><Addressdetail>Endereço1 Endereço2</Addressdetail><City>Localidade</City><PostalCode>4444-555</PostalCode><Country>PT</Country></AddressTo><AddressFrom><Addressdetail>Rua Tal, Sitio Tal</Addressdetail><City>São Jorge da Murronhanha</City><PostalCode>4444-555</PostalCode><Country>PT</Country></AddressFrom><MovementEndTime>2018-06-13T17:38:00</MovementEndTime><MovementStartTime>2018-06-13T13:38:00</MovementStartTime><VehicleID>LD-50-36-EW</VehicleID><Line><ProductDescription>C35/45 S4 D20</ProductDescription><Quantity>7</Quantity><UnitOfMeasure>M3</UnitOfMeasure><UnitPrice>0</UnitPrice></Line></doc:envioDocumentoTransporteRequestElem></S:Body></S:Envelope> Experimenta efetuar as alterações no teu programa que gera o XML para ficar de acordo com aquilo que eu também alterei. Se quiseres experimentar algo que funcione coloquei numas páginas atrás código PHP para as guias de transporte.
  17. 2 pontos
    Se o seu negócio for obrigado a ter contabilidade organizada, terá de ter um contabilista certificado, que terá de ser indicado à AT. Por essa razão, terá de pagar a um contabilista, nem que seja para "assinar" as contas, pelo que não vejo qual a necessidade de se estar a preocupar em fazer a contabilidade. Se pelo contrário o seu negócio estiver abrangido pelo regime de contabilidade simplificada, não necessitará de um contabilista e poderá ser você próprio a tratar da mesma. Terá de respeitar determinadas regras e ter os livros que são indicados pelo código fiscal, nomeadamente no código do IRS. Ver um resumo das diferenças: https://www.e-konomista.pt/artigo/contabilidade-organizada-ou-regime-simplificado/ https://www.economias.pt/vantagens-e-desvantagens-da-contabilidade-organizada/ Não esqueçer, o regime do IVA, se beneficia do regime de isenção ou não, ver https://www.economias.pt/isencao-de-iva-ao-abrigo-do-artigo-53/ Se beneficiar desse regime, facilita-lhe ainda mais a vida, porque não tem de fazer apuramento do mesmo, o que lhe pode dar algum trabalho A contabilidade das empresas é regulada pelo SNC (sistema de normalização contabilística), que apresenta o plano das contas que deve adoptar, pode recolher mais informação em http://www.cnc.min-financas.pt/snc.html
  18. 2 pontos
    Olá! É possível sim! Coloque os dados dentro de divs e no css estilize para que fiquem lado a lado.
  19. 2 pontos
    Sim, existe um documento que te indica quais os requisitos de um software certificado. É o despacho 8632/2014 (https://dre.pt/application/dir/pdf2s/2014/07/126000000/1725517261.pdf), e é o teu ponto de partida para isso. Nota que não é só disso que precisas. Vais precisar conhecer alguns artigos do CIVA, à portaria 302/2016 (https://dre.pt/application/conteudo/105300290), e estar atento a toda a legislação emitida pelo ministério das finanças, porque não raras vezes te obriga a alterar o programa. Quando tiveres tudo pronto, vais ao portal das finanças e preenches o Modelo 24, que é o pedido de certificação. Quando eles te chamarem, levas lá o programa e cumpres o que te pedirem para fazer. Se eles acharem que algo não está bem, dizem-te o que é, e terás de alterar e voltar a ir lá. Em alguns casos, se for coisa rápida, podes até alterar lá na hora (depende dos inspectores), e noutros ainda, se for coisa pouco grave, certificam-te o programa com indicação que terás de o corrigir antes de o usar.
  20. 2 pontos
    hum ... só uns warnings ? gcc -c -g -MD -MP -Wall -Werror -pedantic -std=c99 -I. -I./include/ src/main.c -o obj/MINGW64_NT-10.0/main.o src/main.c: In function 'main': src/main.c:46:12: error: format '%c' expects argument of type 'char *', but argument 2 has type 'int' [-Werror=format=] scanf("%c",linha); ~^ src/main.c:46:12: error: format '%c' expects argument of type 'char *', but argument 2 has type 'int' [-Werror=format=] src/main.c:47:12: error: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Werror=format=] scanf("%d",coluna); ~^ src/main.c:47:12: error: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Werror=format=] src/main.c:67:23: error: suggest parentheses around comparison in operand of '==' [-Werror=parentheses] if (tabuleiro[1][1]==tabuleiro[1][2]==tabuleiro[1][3]){ ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ src/main.c:71:23: error: suggest parentheses around comparison in operand of '==' [-Werror=parentheses] if (tabuleiro[2][1]==tabuleiro[2][2]==tabuleiro[2][3]){ ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ src/main.c:75:23: error: suggest parentheses around comparison in operand of '==' [-Werror=parentheses] if (tabuleiro[3][1]==tabuleiro[3][2]==tabuleiro[3][3]){ ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ src/main.c:79:23: error: suggest parentheses around comparison in operand of '==' [-Werror=parentheses] if (tabuleiro[1][1]==tabuleiro[2][1]==tabuleiro[3][1]){ ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ src/main.c:83:23: error: suggest parentheses around comparison in operand of '==' [-Werror=parentheses] if (tabuleiro[1][2]==tabuleiro[2][2]==tabuleiro[3][2]){ ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ src/main.c:87:23: error: suggest parentheses around comparison in operand of '==' [-Werror=parentheses] if (tabuleiro[1][3]==tabuleiro[2][3]==tabuleiro[3][3]){ ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ src/main.c:91:23: error: suggest parentheses around comparison in operand of '==' [-Werror=parentheses] if (tabuleiro[1][1]==tabuleiro[2][2]==tabuleiro[3][3]){ ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ src/main.c:112:48: error: left-hand operand of comma expression has no effect [-Werror=unused-value] printf(("O vencedor dos cinco jogos foi %s", jogadores[1].nickname)); ^ src/main.c: In function 'preencher_dados': src/main.c:126:12: error: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Werror=format=] scanf("%d",identificacao); ~^ src/main.c:126:12: error: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Werror=format=] src/main.c:129:12: error: 'return' with a value, in function returning void [-Werror] return 0; ^ src/main.c:120:6: note: declared here void preencher_dados () ^~~~~~~~~~~~~~~ src/main.c:139:14: error: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Werror=format=] scanf("%d",jogadores[i].numero_de_estudante); ~^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ src/main.c:139:14: error: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Werror=format=] src/main.c:147:13: error: format '%c' expects argument of type 'char *', but argument 2 has type 'int' [-Werror=format=] scanf("%c",jogadores[i].simbolo); ~^ ~~~~~~~~~~~~~~~~~~~~ src/main.c:147:13: error: format '%c' expects argument of type 'char *', but argument 2 has type 'int' [-Werror=format=] src/main.c:126:4: error: 'identificacao' may be used uninitialized in this function [-Werror=maybe-uninitialized] scanf("%d",identificacao); ^~~~~~~~~~~~~~~~~~~~~~~~~ src/main.c: In function 'main': src/main.c:46:4: error: 'linha' may be used uninitialized in this function [-Werror=maybe-uninitialized] scanf("%c",linha); ^~~~~~~~~~~~~~~~~ src/main.c:47:4: error: 'coluna' may be used uninitialized in this function [-Werror=maybe-uninitialized] scanf("%d",coluna); ^~~~~~~~~~~~~~~~~~ cc1.exe: all warnings being treated as errors Makefile:78: recipe for target 'obj/MINGW64_NT-10.0/main.o' failed make: *** [obj/MINGW64_NT-10.0/main.o] Error 1 só existe um tipo de compilação aceitável : 0 errors and 0 warnings
  21. 2 pontos
    Aqui está a última versão da estrutura XML usada em Portugal para exportar o ficheiro SEPA: https://www.bportugal.pt/sites/default/files/sepa-manual-c2b-xml-022016-en.pdf Estamos a comparar se este ficheiro corresponde ao LibSEPA que já usamos para a Alemanha (https://libsepa.com/de/) ou se precisa de ajustes. O validador para as exportações eu encontrei aqui no fórum mesmo (ainda não testamos para ver se funciona): https://www.mobilefish.com/services/sepa_xml_validation/sepa_xml_validation.php
  22. 2 pontos
    That error is usually returned when your clock time is not in sync with theirs. To ensure this, you should always sync yours with Observatório Astronómico de Lisboa, using their ntp servers. Another possible cause, might be that their servers are on heavy loading, taking to long to parse your request, resulting also in a clock time difference between the time you issue the request and the time it is processed.
  23. 2 pontos
    Um resumo interessante de soluções de backup de vários tipos que encontrei na net: https://wiki.archlinux.org/index.php/Synchronization_and_backup_program (maioritariamente útil para sistema Linux). Aproveitava para deixar a questão: que soluções de backup usam/recomendam? Pessoalmente, faço essencialmente backups de uma máquina macOS, onde uso 3 métodos de backup: TimeMachine para backup incremental regular/automático de quase todo o sistema de ficheiros (para dois NAS locais). borg para backup incremental regular/automático das pastas mais importantes (para um NAS local e um servidor remoto). cópias manuais para documentos que não posso mesmo perder (para NAS local, sincronizado com a cloud). Entre as soluções automáticas, não confio muito no TimeMachine pois por vezes em caso de falha de rede ou dos NAS o backup fica corrompido. Mas contornei o problema com snapshots do sistema de ficheiros num dos NAS. Agrada-me a simplicidade da solução, que torna fácil verificar se consigo recuperar ficheiros. Não é lá muito eficiente em termos de espaço, pois mover um ficheiro significa que o mesmo será duplicado no backup. Estou bastante satisfeito com o borg, por ser bastante eficiente e funcional (compressão, deduplicação, reinício de backups interrompidos, cifragem, filtros, etc.). Apesar de nunca ter tido de recuperar dados, as validações periódicas dos backups não têm detectado qualquer problema. Para além disso faço backups completos de dados importantes e configurações de outras máquinas, essencialmente com scripts Bash para automatizar as tarefas (comprimir, cifrar, gerir versões, copiar entre máquinas). Os mais importantes também envio para a cloud. Ultimamente tenho lido algumas coisas sobre o restic, e também me parece um solução interessante (similar ao borg, mas com menos limitações relativamente ao local onde os backups são armazenados). Uma solução que provavelmente considerarei em backups para a cloud.
  24. 2 pontos
    I managed to send a valid request generating those openssl commands in PHP (using shell_exec and reading the resulting files back). I cheated a little bit in the -K parameter by using bin2hex. You write that you are you transforming the hex result of openssl rand into the byte equivalent. How are you achieving that? That might be the answer. shell_exec('openssl x509 -inform pem -outform pem -in certs/ChaveCifraPublicaAT.cer -pubkey -noout > certs/ChaveCifraPublicaAT2020_aux.pem'); shell_exec('openssl rand 16 -out rand.txt'); $key = file_get_contents('rand.txt'); shell_exec('openssl rsautl -encrypt -inkey certs/ChaveCifraPublicaAT2020_aux.pem -pubin -in rand.txt -out fileWithResult.txt'); shell_exec('openssl enc -base64 -in fileWithResult.txt -out fileWithBASE64Result.txt'); $nonce = file_get_contents('fileWithBASE64Result.txt'); file_put_contents('fileWithCreatedInside.txt', gmdate('Y-m-d\TH:i:s\Z')); shell_exec('openssl enc -base64 -aes-128-ecb -K '.bin2hex($key).' -in fileWithCreatedInside.txt -out fileWithENCCreatedInside.txt'); file_put_contents('fileWithPasswordInside.txt', 'mypassword'); shell_exec('openssl enc -base64 -aes-128-ecb -K '.bin2hex($key).' -in fileWithPasswordInside.txt -out fileWithENCPasswordInside.txt');
  25. 2 pontos
    A função void VianaDoCastelo tem como argumento(o que está entre parenteses) CIDADE *ap_cidade , ou seja, declaras que a função tem um argumento apontador do tipo de dados CIDADE e que dentro daquela função se chama ap_cidade (que também é o nome usado em main para criar o apontador). Na função distrito, no case 16, chama a função VianaDoCastelo sem passar o argumento que antes foi definido para essa função. A solução passa por passar o apontador que está na função Distrito (e que veio da função main) para a função VianaDoCastelo quando a chama, ficando no case 16 case (16): VianaDoCastelo(ap_cidade); break;
×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.