Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 07/01/2021 in all areas

  1. Comunicado da ASSOFT Olá, muito boa tarde! A espera foi longa, mas temos, por fim, informações da Autoridade Tributária sobre os temas que têm preocupado a nossa comunidade, designadamente no que tem que ver com a Plataforma de submissão do SAF-T (PT) para pré-preenchimento da IES e da comunicação obrigatória das séries usadas nos documentos de faturação. Em baixo compilamos as novidades por temas. Como sempre, saiba que pode usar os nossos canais de comunicação para nos fazer chegar o seu feedback e as suas dúvidas. Se ainda não fez o seu registo no Slack, clique aqui para concluir a sua inscrição. Boas férias! ✈️🌴⛱️ Autoridade Tributária e Aduaneira Plataforma de submissão do SAF-T (PT) para pré-preenchimento da IES Como é sabido, com o desenvolvimento dos trabalhos no âmbito do Projeto de Lei 655/XIV/2 pela Assembleia da República, as reuniões regulares de testes na plataforma foram suspensos. Pese embora o projeto de lei tenha sido objeto de revogação, o que se traduz na prática na manutenção deste projeto tal e qual como está previsto na legislação inicial, a AT iniciou um conjunto de rondas com vista à melhoria do processo inicial. Foram desenvolvidos esforços em conjunto com a Comissão de Normalização Contabilística para a criação de um novo plano de contas mais harmonizado com o esquema de Taxonomias. A espectativa é que o novo plano de contas seja publicado durante o mês de Setembro. Da mesma forma, será aprovado e publicado num novo esquema de Taxonomias pelo Governo. 📅 Prevê-se que os testes possam ser retomados em Setembro, sendo que, nesta fase, vão incidir acima de tudo na capacidade de envio de ficheiros descaracterizados (CryptoSAF-T), pelo menos até à definição quanto ao novo esquema de Taxonomias e ao novo plano de contas. 💬 No canal #wg-ies-pt do Slack encontra mais informação sobre este tema. e-Fatura O e-Fatura vai ser atualizado de forma a suportar um conjunto mais alargado de informação, designadamente informação que hoje só é possível ser transmitida através do ficheiro SAF-T (PT), mas também com vista a dar suporte às novas funcionalidades introduzidas pelas obrigações de comunicação de séries de documentos, IVAucher, entre outras. ⚠️ A nova versão não será compatível com as anteriores. Até janeiro de 2022 ambas estarão disponíveis. A partir de Janeiro apenas a nova versão ficará disponível. 📅 As regras e a documentação técnica da nova versão ficarão disponíveis durante o mês de Setembro. Por agora é prematuro dizer se as alterações vão atuar somente ao nível da transmissão de documentos de faturação ou se também incidir sobre a transmissão de documentos de transporte. 💬 No canal #wg-saft-pt do Slack encontra mais informação sobre este tema. Comunicação das séries e ATCUD Depois de uma longa espera, existe, por fim, uma definição quanto à comunicação das séries usadas pelos sistemas para a emissão de documentos. O novo serviço ficará disponível em breve e permitirá que os utilizadores possam comunicar esta informação à AT diretamente no Portal das Finanças ou por webservice. ⚠️ Pese embora ainda não esteja decidido, é possível que nos casos em que a comunicação seja feita por webservice venham a existir um conjunto diferenciado de endpoints: um para a generalidade dos casos e outros específicos para os casos em que existe auto-faturação (com acordo prévio e sem acordo prévio). 📅 Durante esta semana ficará disponível a documentação técnica e os elementos de apoio ao desenvolvimento e à realização de testes. Espera-se que a plataforma entre em produção por volta de Outubro, dando um período de 3 meses para a comunicação das séries que se vão utilizar durante o ano de 2022. 💬 No canal #wg-saft-pt do Slack encontra mais informação sobre este tema. Nesta fase de testes o vosso feedback é muito importante! Use a plataforma para nos reportar dúvidas e problemas que encontre na plataforma da AT. QRCode O mecanismo obrigatório de comunicação das séries introduz a obrigação de impressão de um QRCode em todos os documentos com relevância fiscal. Pese embora este processo esteja numa fase experimental, vai tornar-se igualmente obrigatório a partir de 1 de janeiro de 2022. ⚠️ Gostávamos de chamar à atenção para alguns dos erros mais frequentes: Inexistência de NIF Falta de campos obrigatórios Espaços fiscais inválidos Tipo de documento não identificado Datas não preenchidas 💬 No canal #wg-saft-pt do Slack encontra mais informação sobre este tema. Aproveite para esclarecer as suas dúvidas e dar feedback sobre eventuais problemas que esteja a encontrar. Segurança Social Ao abrigo do PRR - Plano de Recuperação e Resiliência, a Segurança Social vai dar início ao desenvolvimento de um projeto de Simplificação do Ciclo Contributivo. Este projeto tem como missão principal a eliminação de um conjunto de atos declarativos que hoje são impostos aos trabalhadores independentes e às empresas. Com a implementação definitiva destas medidas, os contribuintes ficarão dispensados de um conjunto de obrigações declarativas, assim, como do envio de informação redondante para múltiplos organismos da Administração Pública, que passará a ser automaticamente processada pela própria Segurança Social. A sua concretização vai depender do envolvimento de um conjunto alargado de organismos públicos, responsáveis pela disponibilização da informação, e, obviamente, dos parceiros tecnológicos que passarão a conseguir integrar com os sistemas da Segurança Social através de serviços e protocolos mais ágeis. A Segurança Social está aberta a propostas e ideias! Podem submeter as vossas ideias aqui e consultar as ideias já submetidas neste link. Participe! 💬 No Slack, pode usar o canal #wg-dmr-pt para debater e saber mais sobre este tema.
    2 points
  2. Eu interpreto a LEI dessa forma... Tanto FE como FE-AP estão abrangidos por esta medida... Era isso que tinha como certo. No entanto a "saphety" (na pessoa do seu departamento comercial) jura que estes adiamentos se aplicam APENAS à FE-AP!!! Portanto... cada um faz a sua interpretação conforme os interesses! 😄
    2 points
  3. O Despacho N.º 260/2021, do SEAAF, de 27 de Julho, vem dizer que as facturas em pdf são consideradas facturas electrónicas até 31 de Dezembro de 2021.
    2 points
  4. Em relação a preços, posso deixar aqui a seguinte informação: Multicert: Preço certificado / Ano = 145€ + pacote 1000 assinaturas 75€ = 220€/Ano Digitalsign: Preço pacote Certificado + 1250 assinaturas = 99€/Ano. GTS: Preço certificado / Ano = 65€ + Pacote 1250 assinaturas = 63.75€ = 128,75€ Em termos de desenvolvimento a Multicert devolve o PDF já assinado, é só gravar o ficheiro. Já a DigitalSign tem um grande problema, eles devolve a Hash que deve ser "inserida" no PDF. Isto implica a utilização de librarias (iText ou outras) de terceiros que não são gratuitas e são até caras. Ainda não encontrei nenhuma gratuita para .NET. Existem gratuitas para java. A GTS utiliza o mesmo sistema da digitalsign, ou seja, uma hash de certificação que deve ser inserida no PDF. Penso que o SAFE será igual. Pelo que li no manual deles o sistema é o mesmo. A Multicert é a que tem o sistema mais simples, envia-se o PDF e recebe-se o PDF assinado. Ponto. Se alguém descobrir alguma libraria, ou forma de inserir a Hash de certificação no PDF, PARTILHEM por favor.
    2 points
  5. Algumas entidades da Administração Pública estão a aplicar, por analogia, estas prorrogações para efeitos da FE-AP. Não me parece que tenham razão, mas que dá jeito ... dá!
    1 point
  6. Claro que se pode imprimir um PDF de uma fatura eletrónica, até para arquivar junto com as outras na contabilidade. A questão é a validade dessa impressão. Na minha opinião o documento válido é o PDF assinado, já que qualquer impressão dele será sempre uma cópia. A maior parte das empresas nem sequer têm noção disso, mas a partir do momento em que aceitem faturas eletrónicas (PDF assinado ou EDI), seja de que empresa for (EDP. Vodafone, Via Verde, etc.) passam a estar obrigadas a manter um Arquivo Digital, pelo menos desses documentos, nos termos do DL 28/2019.
    1 point
  7. Em primeiro lugar verifique se os caminhos para os ficheiros css e js do boostrap estão correctos. Em segundo verifique se tem todas as tags devidamente fechadas. Em terceiro abra as ferramentas de programador do seu browser, normalmente tecla F12, e analise os erros que ai são indicados, pois transmitem a informação onde poderá estar o problema.
    1 point
  8. viva, tens um problema na tag <title></title>: <title>Meu primeiro HTML com Bootstrap/title> <title>Meu primeiro HTML com Bootstrap</title> cps,
    1 point
  9. Houve um caso com a Phc há cerca de 3 semanas acho eu. Provavelmente terás que actualizar exes/certificados.
    1 point
  10. Ainda não se sabe como isto vai ser operacionalizado. Parece evidente que terá de haver um web service para atribuir o tal identificador único à série, mas também poderá haver a possibilidade adicional de comunicar a nova série directamente no portal das finanças. Depois de tanta euforia com o QR Code (que devia ser obrigatório em 2021 e depois passou para 2022) seria de esperar que estas questões do ATCUD já estivessem todas operacionais (pelo menos as especificações técnicas já deveriam estar disponíveis para nós podermos trabalhar - espero que não tenhamos de andar a fazer noitadas para cumprir prazos extremamente curtos). Resumindo, não me parece que isto esteja para breve. Como andamos sempre de adiamento em adiamento, primeiro ainda vamos ver se os QR Codes serão realmente obrigatórios em Janeiro.
    1 point
  11. Olá Boa tarde, Deixo aqui uma abordagem que assina o PDF sem a mensagem o documento foi alterado depois de assinando. O PDF é assinado com a invocação dos serviços web da AMA. private static final String input = "c:/tmp/ama/PDF-1.pdf"; private static final String output = "c:/tmp/ama/signed_signed.pdf"; public static void main(String[] args) throws IOException, GeneralSecurityException { Security.addProvider(new BouncyCastleProvider()); PdfReader reader = new PdfReader(input); OutputStream fos = new FileOutputStream(output); StampingProperties stampingProperties = new StampingProperties(); //For any signature in the Pdf but the first one, you need to use appendMode // stampingProperties.useAppendMode(); PdfSigner pdfSigner = new PdfSigner(reader, fos, stampingProperties); /*you can modify the signature appearance */ PdfSignatureAppearance appearance = pdfSigner.getSignatureAppearance(); appearance.setPageRect(new Rectangle(36, 508, 254, 200)); appearance.setPageNumber(1); appearance.setLayer2FontSize(10f); appearance.setReason("Teste Assinatura"); appearance.setLocation("Lisboa"); IExternalSignatureContainer gsContainer = new GSSignatureContainer(PdfName.Adobe_PPKLite, PdfName.Adbe_pkcs7_detached); pdfSigner.signExternalContainer(gsContainer, 8049); } public class GSSignatureContainer implements IExternalSignatureContainer { /* Signature dictionary. Filter and SubFilter. */ private PdfDictionary sigDic; public GSSignatureContainer( PdfName filter, PdfName subFilter) { sigDic = new PdfDictionary(); sigDic.put(PdfName.Filter, filter); sigDic.put(PdfName.SubFilter, subFilter); } @Override public byte[] sign(InputStream data) throws GeneralSecurityException { try { //get all certificates (3) from client via web service Certificate[] chain = new CallAMA().getCertificates(); String hashAlgorithm = DigestAlgorithms.SHA256;//"SHA-256"; BouncyCastleDigest digest = new BouncyCastleDigest(); MessageDigest md = digest.getMessageDigest(hashAlgorithm); byte[] hash = DigestAlgorithms.digest(data, md); PdfPKCS7 sgn = new PdfPKCS7(null, chain, hashAlgorithm, null, digest, false); //Collection<byte[]> ocsp = new OcspClientBouncyCastle(null); OcspClientBouncyCastle ocspClient = new OcspClientBouncyCastle(null); Collection<byte[]> ocsp = new ArrayList<byte[]>(); for(var i = 0; i < chain.length - 1; i++) { byte[] encoded = ocspClient.getEncoded((X509Certificate)chain[i], (X509Certificate)chain[i + 1], null); if(encoded != null) ocsp.add(encoded); } byte[] attributeBytes = sgn.getAuthenticatedAttributeBytes(hash, PdfSigner.CryptoStandard.CADES, ocsp, null); //criar sha256 message digest byte[] attributeBytesDigest = MessageDigest.getInstance(hashAlgorithm).digest(attributeBytes); /**************************************************** * CALL client (AMA) -> receive SMS and signed hash * ****************************************************/ byte[] signedHash = new CallAMA().getHashSignedByAma(attributeBytesDigest); sgn.setExternalDigest(signedHash, null, "RSA"); ITSAClient tsaClient = null;//new GSTSAClient(access); return sgn.getEncodedPKCS7(hash, PdfSigner.CryptoStandard.CADES, tsaClient, ocsp, null); } catch (IOException | GeneralSecurityException de) { de.printStackTrace(); throw new GeneralSecurityException(de); } } @Override public void modifySigningDictionary(PdfDictionary signDic) { signDic.putAll(sigDic); } } }
    1 point
  12. Eis um exemplo: <?xml version="1.0" encoding="UTF-8"?> <Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"> <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:feap.gov.pt:CIUS-PT:2.1.2.</cbc:CustomizationID> <cbc:ID>FT/98747</cbc:ID> <cbc:IssueDate>2020-06-07</cbc:IssueDate> <cbc:DueDate>2021-07-29</cbc:DueDate> <cbc:InvoiceTypeCode>FT</cbc:InvoiceTypeCode> <cbc:Note>#WITHHOLDINGTAXDESCRIPTION@WITHHOLDINGTAX-001#Retenção IRS#</cbc:Note> <cbc:Note>#WITHHOLDINGTAXAMOUNT@WITHHOLDINGTAX-001#100.00#</cbc:Note> <cbc:Note>#WITHHOLDINGTAXTYPE@WITHHOLDINGTAX-001#IRF#</cbc:Note> <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode> <cac:AccountingSupplierParty> <cac:Party> <cbc:EndpointID schemeID="9946">PT506252590</cbc:EndpointID> <cac:PartyName> <cbc:Name>A Trapalhada - Comércio de Têxteis, Lda</cbc:Name> </cac:PartyName> <cac:PostalAddress> <cbc:StreetName>Morada</cbc:StreetName> <cbc:CityName>localidade</cbc:CityName> <cbc:PostalZone>9000-222</cbc:PostalZone> <cac:Country> <cbc:IdentificationCode>PT</cbc:IdentificationCode> </cac:Country> </cac:PostalAddress> <cac:PartyTaxScheme> <cbc:CompanyID>PT506252590</cbc:CompanyID> <cac:TaxScheme> <cbc:ID>VAT</cbc:ID> </cac:TaxScheme> </cac:PartyTaxScheme> <cac:PartyLegalEntity> <cbc:RegistrationName>A Trapalhada - Comércio de Têxteis, Lda</cbc:RegistrationName> <cbc:CompanyID>PT506252590</cbc:CompanyID> </cac:PartyLegalEntity> <cac:Contact> <cbc:Telephone>969696969</cbc:Telephone> <cbc:ElectronicMail>bluejacking@h3ssk4p86gh4r4.ga</cbc:ElectronicMail> </cac:Contact> </cac:Party> </cac:AccountingSupplierParty> <cac:AccountingCustomerParty> <cac:Party> <cbc:EndpointID schemeID="9946">PT230451268</cbc:EndpointID> <cac:PartyName> <cbc:Name>Pastel Doce</cbc:Name> </cac:PartyName> <cac:PostalAddress> <cbc:StreetName>Rua dos remos 23</cbc:StreetName> <cbc:CityName>Nossa Senhora da Fé</cbc:CityName> <cbc:PostalZone>9456-455</cbc:PostalZone> <cac:Country> <cbc:IdentificationCode>PT</cbc:IdentificationCode> </cac:Country> </cac:PostalAddress> <cac:PartyTaxScheme> <cbc:CompanyID>PT230451268</cbc:CompanyID> <cac:TaxScheme> <cbc:ID>VAT</cbc:ID> </cac:TaxScheme> </cac:PartyTaxScheme> <cac:PartyLegalEntity> <cbc:RegistrationName>Pastel Doce</cbc:RegistrationName> <cbc:CompanyID>PT230451268</cbc:CompanyID> </cac:PartyLegalEntity> <cac:Contact> <cbc:Telephone>291456852</cbc:Telephone> <cbc:ElectronicMail>qaqeceli@getnada.com</cbc:ElectronicMail> </cac:Contact> </cac:Party> </cac:AccountingCustomerParty> <cac:Delivery> <cac:DeliveryLocation> <cac:Address> <cbc:StreetName>FXXX</cbc:StreetName> <cbc:CityName>987456</cbc:CityName> <cbc:PostalZone>9000-111</cbc:PostalZone> <cac:Country> <cbc:IdentificationCode>PT</cbc:IdentificationCode> </cac:Country> </cac:Address> </cac:DeliveryLocation> </cac:Delivery> <cac:TaxTotal> <cbc:TaxAmount currencyID="EUR">34.50</cbc:TaxAmount> <cac:TaxSubtotal> <cbc:TaxableAmount currencyID="EUR">150.00</cbc:TaxableAmount> <cbc:TaxAmount currencyID="EUR">34.50</cbc:TaxAmount> <cac:TaxCategory> <cbc:ID>NOR</cbc:ID> <cbc:Percent>23.00</cbc:Percent> <cac:TaxScheme> <cbc:ID>VAT</cbc:ID> </cac:TaxScheme> </cac:TaxCategory> </cac:TaxSubtotal> </cac:TaxTotal> <cac:LegalMonetaryTotal> <cbc:LineExtensionAmount currencyID="EUR">150.00</cbc:LineExtensionAmount> <cbc:TaxExclusiveAmount currencyID="EUR">150.00</cbc:TaxExclusiveAmount> <cbc:TaxInclusiveAmount currencyID="EUR">184.50</cbc:TaxInclusiveAmount> <cbc:AllowanceTotalAmount currencyID="EUR">0.00</cbc:AllowanceTotalAmount> <cbc:ChargeTotalAmount currencyID="EUR">0.00</cbc:ChargeTotalAmount> <cbc:PrepaidAmount currencyID="EUR">0.00</cbc:PrepaidAmount> <cbc:PayableRoundingAmount currencyID="EUR">0.00</cbc:PayableRoundingAmount> <cbc:PayableAmount currencyID="EUR">184.50</cbc:PayableAmount> </cac:LegalMonetaryTotal> <cac:InvoiceLine> <cbc:ID>1</cbc:ID> <cbc:InvoicedQuantity unitCode="C62">10.000</cbc:InvoicedQuantity> <cbc:LineExtensionAmount currencyID="EUR">150.00000000</cbc:LineExtensionAmount> <cac:Item> <cbc:Name>Ref 56884A</cbc:Name> <cac:ClassifiedTaxCategory> <cbc:ID>NOR</cbc:ID> <cbc:Percent>23.00</cbc:Percent> <cac:TaxScheme> <cbc:ID>VAT</cbc:ID> </cac:TaxScheme> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Price> <cbc:PriceAmount currencyID="EUR">15.00000000</cbc:PriceAmount> <cbc:BaseQuantity unitCode="C62">1.000</cbc:BaseQuantity> </cac:Price> </cac:InvoiceLine> </Invoice>
    1 point
  13. Removes a linha e deixas a nota. E a retenção não altera os somatórios do documento.
    1 point
  14. É basicamente um UUID (identificador unico universal). É normalmente usado nas mensagens de estado do documento (ver especificação CIUS - Message status), para comunicares que o documento com certo UUID passou a estado X.
    1 point
  15. Obrigado pela partilha dos preços! Já agora, alguém sabe se existe / quais são os brokers que disponibilizam o serviço de "OPERADOR VIRTUAL" (ou seja, uma entidade central - software house - adquire o serviço e paga por documento / pack de documentos. Os clientes limitam-se a utilizar o software e comunicar os documentos) Os preços da SAPHETY (OUTUBRO de 2020) eram os seguintes: CONDIÇÕES PARA OPERADOR VIRTUAL 0,20€ por documento transacionado Valor mínimo mensal de 5€ por cada NIF Emissor (máx. de 25 documentos/mês) 0,15€ após o 25º documento transacionado mensalmente (o serviço tanto serve para FE como para FE-AP)
    1 point
  16. Não é deve, é mesmo. Se a linguagem inicia indexação a 0, é a zero. Algo formidável na programação é que podes testar as tuas hipóteses e analisar os resultados sem ter que esperar por a concessão de ninguém.
    1 point
  17. Boa Tarde, O preço depende da quantidade. Se a empresa deixar de imprimir, posso dizer que compensa, mas se tiver que fazer ambos os serviços ai vai sair mais caro, pois irá comprar poucos selos a preços mais altos. Os preços variam entre 0,1€ e 0,01€ por assinatura dependendo da quantidade adquerida. Uma questão a ter em atenção é se é preciso introduzir o PIN por cada assinatura, se assim for isso é impraticavel para nós.
    1 point
  18. Se fizeres a integração via oAuth, sim expira mas podes renovar o token de acesso sem intervenção do utilizador. Não andava muito atento a estas assinaturas electrónicas e tinha/tenho ideia que a sua obrigatoriedade é só para empresas públicas (?), para além disso vi os preços de algumas entidades e é impracticável. Após ter conhecimento do SAFE e do custo (2 primeiros anos grátis e depois 40eur a cada 2 anos) parece-me uma solução apetecível para introduzir no meu software, independentemente de ser apenas ou não uma obrigatoriedade para a função pública.
    1 point
  19. Nós fizemos a implementação com a Multicert O suporte é bastante bom, mas a grande diferença entre a DigitalSign e a Multicert é que a API da Multicert é bastante simples e acessivel.
    1 point
  20. Olá a todos, Estou em Engenharia Informática e preciso de fazer um trabalho (que é o jogo do semáforo) onde tenho que fazer um tabuleiro (char) com alocação de memória. Neste momento estou preso numa função em que tenho que adicionar uma linha ou uma coluna dependendo do que o utilizador quiser fazer. Alguém me consegue ajudar? Obrigado.
    1 point
  21. Antes de mais, alguns apontamentos breves: Se nas funções ler_jogador() e ler_jogo() não estás a retornar um resultado, por que motivo declaraste que elas retornam jogador e jogo, respetivamente? Usar o mesmo identificador para uma estrutura e uma variável (struct dados_jogador e FILE *dados_jogador), apesar de possível neste caso, pode facilmente gerar confusão ao ler o código. Posto isto, acerca dos teus problemas: Ficheiros binários: deves passar o apontador para jogador e não jogador.nome, se o intuito é gravar a estrutura inteira: fwrite(&jogador, sizeof(struct dados_jogador), 1, dados_gerais); Podes definir no printf() e fprintf() um tamanho mínimo pré-definido para cada dado: int n = 1234; printf("|%d|\n", n); // |1234| <-- usa o espaço estritamente necessário printf("|%7d|\n", n); // | 1234| <-- preenche com espaços à esquerda até perfazer 7 printf("|%07d|\n", n); // |0001234| <-- preenche com zeros à esquerda até perfazer 7 Cumprimentos.
    1 point
  22. Oi pessoal! Eu estou fazendo um trabalho de gerir uma equipa de um desporto à escolha e preciso criar estruturas para colocar as informações dos jogadores e os seus respetivos jogos. O problema é que eu sou iniciante em estruturas tenho de fazer uma tabela e apresentá-la em ficheiro de texto e não sei como fazer a não ser em modo manual no entanto ficam tortas as linhas. O meu segundo problema é que tenho de criar um ficheiro binário com os dados de todos os jogadores e jogos como posso fazer isso? Alguém pode ajudar? Isto é o que eu tenho até agora: #include <stdio.h> FILE * dados_jogador; FILE * dados_jogo; FILE * dados_gerais; int i, j; struct dados_jogador { char nome[50]; int dia; int mes; int ano; float altura; float peso; int n_jogos; }; typedef struct dados_jogador jogador; jogador ler_jogador() { jogador jogador; printf("\nDADOS DO JOGADOR:\n"); printf("nome:"); scanf("%s", jogador.nome); printf("data de nascimento:"); scanf("%d/%d/%d", &jogador.dia, &jogador.mes, &jogador.ano); if ((jogador.dia >= 01 && jogador.dia <= 30) && (jogador.mes == 04 || jogador.mes == 06 || jogador.mes == 9 || jogador.mes == 11)){ } if (jogador.dia >= 01 && jogador.dia <= 31 && (jogador.mes == 01 || jogador.mes == 03 || jogador.mes == 05 || jogador.mes == 07 || jogador.mes == 8|| jogador.mes == 10 || jogador.mes == 12) && jogador.ano >= 1583){ } if (jogador.dia == 29 && jogador.dia == 2 && (jogador.ano % 400 == 0 || jogador.ano % 4 == 0 && jogador.ano % 100 != 0)){ } if ((jogador.dia >= 01 && jogador.dia <= 28) && (jogador.mes == 2)){ } if (jogador.dia <= 00 || jogador.dia > 31){ printf("dia invalido\n"); ler_jogador(); } if (jogador.mes <= 00 || jogador.mes > 12){ printf("mes invalido\n"); ler_jogador(); } if (jogador.ano < 1583){ printf("ano invalido\n"); ler_jogador(); } printf("altura:"); scanf("%f", &jogador.altura); if(jogador.altura <= 0){ ler_jogador(); } printf("peso:"); scanf("%f", &jogador.peso); if(jogador.peso <= 0){ ler_jogador(); } printf("numero de jogos:"); scanf("%d", &jogador.n_jogos); if(jogador.n_jogos < 0){ ler_jogador(); } dados_jogador = fopen("dados_jogador.txt", "a"); fprintf(dados_jogador, "\n%s %02d/%02d/%d %.2f %.2f %d", jogador.nome, jogador.dia, jogador.mes, jogador.ano, jogador.altura, jogador.peso, jogador.n_jogos); fclose(dados_jogador); dados_gerais = fopen("dados_gerais.dat", "ab"); fwrite (&jogador.nome, sizeof(struct dados_jogador), 1 , dados_gerais); fclose(dados_gerais); } struct dados_jogo { int dia; int mes; int ano; char local[50]; char adversario[50]; char resultado[50]; }; typedef struct dados_jogo jogo; jogo ler_jogo() { jogo jogo; printf("\nDADOS DO JOGO:\n"); printf("data:"); scanf("%d/%d/%d",&jogo.dia, &jogo.mes, &jogo.ano); printf("local:"); scanf("%s", jogo.local); printf("adversario:"); scanf("%s", jogo.adversario); printf("resultado:"); scanf("%s", jogo.resultado); dados_jogo = fopen("dados_jogo.txt", "a"); fprintf(dados_jogo, "\n%02d/%02d/%d %s %s %s\n", jogo.dia, jogo.mes, jogo.ano, jogo.local, jogo.adversario, jogo.resultado); fclose(dados_jogo); } int main(int argc, char *argv[]) { char opcao; do{ printf(" MENU INICIAL:\n"); printf("Escolha uma das opcoes:\n"); printf("1- Inserir jogador \n"); printf("2- Editar jogador \n"); printf("3- Procurar jogador \n"); printf("4- Eliminar jogador \n"); printf("5- Inserir jogo \n"); printf("6- Contabilizar \n"); printf("7- Sair do programa \n"); fflush(stdin); printf("opcao:"); scanf("%c", &opcao); switch(opcao){ case '1': ler_jogador(); break; //escolha das opcoes e suas funcoes case '2': break; case '3': break; case '4': break; case '5': ler_jogo(); break; case '6': break; case '7': return 0; default: printf("Opcao invalida\n");break; } } while (opcao != '7'); return 0; }
    1 point
  23. @devair fernandes envio o link onde coloquei o meu projeto, pois fiz algumas alterações e estou a começar a pensar que possa ser má comunicação entre funções, mas não estou a conseguir encontrar o erro. https://drive.google.com/drive/folders/1m1-szvIGJy34ktVybk6Th6UMvyRF9B_o?usp=sharing
    1 point
  24. Aquilo que eu quero fazer é: - Tenho uma matriz dinâmica (envio o código com a estrutura de dados e duas funções - char **inicializa_tab(pItab x); -> inicializa o tabuleiro e - void escreveTabela(pItab x); -> que escreve o tabuleiro: typedef struct infotab{ int coluna,linha,ganhou,n_jogadas,termina,jogador; char **tab; }Itab,*pItab; char **inicializa_tab(pItab x) { int c, l; char **aux = NULL; aux =(char **) malloc(x->linha*sizeof(char *)); //linhas for (c=0; c<x->coluna; c++) aux[c]=(char *) malloc(x->coluna*sizeof(char)); //colunas for (l = 0; l < x->linha; l++) { for (c = 0; c < x->coluna; c++) aux[l][c] = '_'; } return aux; } void escreveTabela(pItab x){ int c, l; printf("\n"); for(l=0; l<x->linha; l++){ for(c=0; c<x->coluna; c++) printf(" %c ", x->tab[l][c]); putchar('\n'); } } - Agora estou a fazer uma função onde o utilizador escolhe se quer aumentar uma linha a matriz ou uma coluna (envio o código que fiz, mas não funciona): char **aumentaTabela(pItab y,char c){ int i,j; char **aux = NULL; aux = y->tab; if(c == 'L') { aux = (char**) realloc(y->tab,sizeof (char*) * (y->linha + 1)); for (i = 0; i < y->coluna; i++) { aux[i] = (char*) realloc(y->tab[i],(y->coluna) * sizeof(char)); } for( j = 0;j<y->coluna;j++) aux[y->linha][j] = '_'; y->linha += 1; } if(c == 'C'){ //aux[0] = realloc(); for (i = 0; i < y->coluna + 1; i++) { aux[i] = (char *) realloc(y->tab[i], (y->coluna + 1) * sizeof(char *)); } for( j = 0;j<y->linha;j++) aux[j][y->coluna] = '_'; y->coluna += 1; } return aux; }
    1 point
  25. Partilho abaixo o código completo para comunicar com os serviços Saphety para quem precisar. A documentação é publica por isso não deve haver problema e com certeza muito pessoal agradece. Visto que existem vários brokers, para já estou a desenvolver para 2, saphety e espap, eu optei por criar uma interface com o essencial e derivar a partir dai para qualquer broker. No entanto quem quiser pode retirar a interface e usar apenas a classe. using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Text; using System.Threading.Tasks; using Microsoft.VisualBasic; public class SaphetyAS2 : AS2Interface { private string _token; public string Token { get { return _token; } } private string _responseText; public string ResponseText { get { return _responseText; } } private string _requestID; public string RequestID { get { return _requestID; } } private string _requestStatus; public string RequestStatus { get { return _requestStatus; } } private string _errors; public string Errors { get { return _requestStatus; } } private string server_base_adress = "dcn-solution.saphety.com/Dcn.Sandbox.WebApi"; // Saphety Invoice Network - Production Environment // Const server_base_adress = "dcn-solution.saphety.com/Dcn.Business.WebApi" private string TokenUri = "https://" + server_base_adress + "/api/Account/getToken"; private string SendFileUri = "https://" + server_base_adress + "/api/CountryFormatAsyncRequest/processDocument/{IssuerNIF}/{DocumentType}/PT"; private string GetStatusByRequestIDUri = "https://" + server_base_adress + "/api/CountryFormatAsyncRequest/{RequestId}"; private string GetStatusByDocumentKeyUri = "https://" + server_base_adress + "/api/OutboundFinancialDocument/documentFormats/{0}"; public HttpStatusCode GetToken(string username, string password) { HttpWebRequest http = (HttpWebRequest)WebRequest.Create(new Uri(TokenUri)); http.Method = "POST"; http.AllowAutoRedirect = true; http.KeepAlive = true; http.PreAuthenticate = false; http.SendChunked = false; Credentials cred = new Credentials() { UserName = username, Password = password }; string content = JsonConvert.SerializeObject(cred); string contentType = "application/json"; http.ContentType = contentType; http.ContentLength = content.Length; SendWebRequest(http, content); var resp = HandleWebResponse(http); if (resp == System.Net.HttpStatusCode.OK) { var json_response = JObject.Parse(_responseText); if (Convert.ToBoolean(json_response("IsValid")) == true) _token = json_response("Data"); } return resp; } public HttpStatusCode SendFileCIUSPT(string filename, string token, string DocType, string IssuerNIF) { string Content; if (string.IsNullOrEmpty(filename)) throw new ArgumentNullException("filename"); try { using (StreamReader xmlfilereader = new StreamReader(filename)) { Content = xmlfilereader.ReadToEnd(); } } catch (Exception ex) { Interaction.MsgBox("Ocorreu o seguinte erro a ler o ficheiro " + filename + Constants.vbNewLine + ex.Message); throw new ArgumentNullException("filename"); } HttpWebRequest http = (HttpWebRequest)WebRequest.Create(new Uri(SendFileUri.Replace("{IssuerNIF}", IssuerNIF).Replace("{DocumentType}", DocType))); http.Method = "POST"; http.UserAgent = "ENIGMA AGENT"; http.Headers.Add("Authorization", "Bearer " + token); http.ContentType = "application/xml"; http.ContentLength = Content.Length; SendWebRequest(http, Content); var resp = HandleWebResponse(http); if (resp == System.Net.HttpStatusCode.OK) _requestID = _responseText; return resp; } public HttpStatusCode GetStatusByRequestID(string ID, string token, string sender) { HttpWebRequest http = (HttpWebRequest)WebRequest.Create(new Uri(GetStatusByRequestIDUri.Replace("{RequestId}", ID))); http.Method = "GET"; http.UserAgent = "ENIGMA AGENT"; http.Headers.Add("Authorization", "Bearer " + token); // SendWebRequest(http, "") var resp = HandleWebResponse(http); if (resp == System.Net.HttpStatusCode.OK) { var json_response = JObject.Parse(_responseText); if (Convert.ToBoolean(json_response("IsValid")) == true) _requestStatus = json_response("Data")("AsyncStatus"); } return resp; } public HttpStatusCode GetStatusByDocumentKey(string ID, string token, string requester, string sender, string type, DateTime data) { } private HttpStatusCode HandleWebResponse(HttpWebRequest http) { try { HttpWebResponse response = (HttpWebResponse)http.GetResponse(); using (var reader = new System.IO.StreamReader(response.GetResponseStream(), true)) { _responseText = reader.ReadToEnd(); } response.Close(); return response.StatusCode; } catch (Exception ex) { Interaction.MsgBox("O servidor devolveu um erro: " + Constants.vbNewLine + ex.Message); } } private void SendWebRequest(HttpWebRequest http, byte[] fileData) { Stream oRequestStream = http.GetRequestStream(); oRequestStream.Write(fileData, 0, fileData.Length); oRequestStream.Flush(); oRequestStream.Close(); } private void SendWebRequest(HttpWebRequest http, string data) { StreamWriter oRequestStream = new StreamWriter(http.GetRequestStream(), Encoding.ASCII); oRequestStream.Write(data); oRequestStream.Close(); } }
    1 point
×
×
  • 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.