Jump to content

Kleverson Cruz

Pessoal da TecnoSpeed
  • Contagem de Conteúdo

    68
  • Ingressou

  • Última visita

  • Dias Ganhos

    6

Postagens postado por Kleverson Cruz

  1. Oi pessoal, tudo bem?

    Recentemente, tive a oportunidade de participar do quadro "Papo de Desenvolvedor" no canal da Casa do Desenvolvedor no YouTube. Foi uma conversa introdutória sobre a linguagem de programação C#, e também exploramos se ainda é válido começar a estudar essa linguagem. 🤓

    Durante o bate-papo, compartilhei minha perspectiva sobre o uso do C#, tanto na criação de interfaces quanto nos sistemas e projetos que estou desenvolvendo atualmente.

    Ficarei feliz se vocês quiserem conferir mais detalhes sobre nossa conversa:

     

     

    Estou à disposição para possíveis dúvidas que possam surgir!

    • Ajudou! 1
  2. Opa Fernando, beleza?

    Vou tentar passar a minha visão sobre as suas dúvidas:

    Tem bastante conteúdo para criação e publicação de apps nas lojas de aplicativos. Com um pouco de experiência, uma boa ideia e MUITO tempo é possível criar uma aplicação e publica-la.

    O salário vai depender muito da experiência que você possui. Se você possui uma longa experiência com uma tecnologia poderá negociar salários maiores. Manter uma carreira dentro de uma empresa é o método mais consistente de possuir uma fonte de renda, mas nada impede que desenvolvedores atuem como freelancers em outros projetos .

    Geralmente grandes aplicações são desenvolvidas e mantidas por dezenas de pessoas, então dificilmente um único desenvolvedor conseguirá dar conta de tudo, ainda mais considerando que há muitas áreas diferentes, como front-end, back-end, sre, dba e etc .

    • Curtir 5
  3. Opa, tudo bem?
    Utilizei o Azure Pipelines apenas com pipelines NodeJS, mas acredito que não seja muito diferente com Wordpress.

    Vamo lá:

    1. Configure o repositório.

    Vá para o Azure DevOps. Selecione seu projeto ou crie um novo.

    2. Configurar o arquivo azure-pipelines.yml

    No diretório raiz do seu projeto, crie um arquivo chamado "azure-pipelines.yml". Este arquivo vai ser preenchido com as instruções da sua pipeline.

    trigger:
      - master  # Indica que a pipeline será disparada sempre que houver commit na branch master
    
    pool:
      vmImage: 'ubuntu-latest'
    
    steps:
      - task: NodeTool@0
        inputs:
          versionSpec: '16.x'
        displayName: 'Install Node.js'
    
      - script: |
          npm install
          npm build
        displayName: 'Install and Build'
    
      # Esse é um exemplo básico de pipeline que utiliza NodeJS.
      # Modifique e adicione mais etapas conforme necessário, como build da aplicação, execução de teste, cópia de arquivos e etc.

    Na documentação do azure devops tem mais alguns modelos de yaml que podem ser úteis.

    3: Commit e Push

    Com o repositório clonado localmente adicione o código do seu projeto WordPress e faça push para o Azure Repos.

    4: Ative a Pipeline

    No Azure DevOps, vá para "Pipelines" no menu e clique em "New Pipeline" e escolha o repositório onde está o azure-pipelines.yml.

    Por fim clique em "Run" para executar a pipeline.

     

    A construção do arquivo yaml vai depender de como sua aplicação está construída e hospedada. Por exemplo, se os arquivos do site precisam disponíveis de forma estática num servidor web, você pode criar uma etapa na pipeline que faça uma conexão FTP com o servidor e copie todos os arquivos do Azure Repos.

    Espero ter ajudado de alguma forma 😉

     

     

    • Curtir 2
  4. Olá.
    Dei uma olhada no JS que já tem e parece que está bem definido o funcionamento no tabuleiro 3X3.

    Para conseguir um 4X4 basta modificar os array 'winPatterns' com os padrões corretos de vitória no 4x4, aumentar o tamanho do array 'gameBoard' e por fim ajustar o HTML com os novos elementos.

     

    O código parece bem estruturado então deve conseguir incrementar a lógica sem muitos problemas.

    • Curtir 1
  5. Olá.

    O Google fornece uma API para pesquisas customizadas onde é possível obter imagens:

    https://developers.google.com/custom-search/v1/overview?hl=pt-br

    Em C# você pode consumir da seguinte forma:

    usign var client = new HttpClient();
    var url = "https://customsearch.googleapis.com/customsearch/v1?cx=[IdMecanismoPesquisa]&key=[API_KEY]&searchType=image&q=Coca Cola&num=1";
    var request = new HttpRequestMessage(HttpMethod.Get, url);
    request.Headers.Add("Accept", "application/json");
    var response = await client.SendAsync(request);
    response.EnsureSuccessStatusCode();
    Console.WriteLine(await response.Content.ReadAsStringAsync());

    A partir dessa requisição será obtido a resposta:

    ...
    "items": [
            {
                "kind": "customsearch#result",
                "title": "Coca-Cola - Wikipedia",
                "htmlTitle": "<b>Coca</b>-<b>Cola</b> - Wikipedia",
                "link": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/15-09-26-RalfR-WLC-0098_-_Coca-Cola_glass_bottle_%28Germany%29.jpg/1200px-15-09-26-RalfR-WLC-0098_-_Coca-Cola_glass_bottle_%28Germany%29.jpg",
                "displayLink": "en.wikipedia.org",
                "snippet": "Coca-Cola - Wikipedia",
                "htmlSnippet": "<b>Coca</b>-<b>Cola</b> - Wikipedia",
                "mime": "image/jpeg",
                "fileFormat": "image/jpeg",
                "image": {
                    "contextLink": "https://en.wikipedia.org/wiki/Coca-Cola",
                    "height": 2128,
                    "width": 1200,
                    "byteSize": 283763,
                    "thumbnailLink": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQJyEDVQYqZINpelmoCLYQPCr6MQXd1m9-6goF80ivqcAhL-84dXFEQwYY&s",
                    "thumbnailHeight": 150,
                    "thumbnailWidth": 85
                }
            }
        ]
    ...

    documentação descreve os passos para obter o token de acesso e id do mecanismo de pesquisa programável. Importante notar que há uma limitação de uso gratuito de 100 consultas por dia.

     

    Uma outra alternativa é utilizar o pacote HtmlAgilityPack para realizar a extração das imagens a partir do HTML das páginas do Google, mas isso vai exigir um bom conhecimento em técnicas de webscraping.

    • Amei 1
  6. Olá Davi, tudo bom?

    O problema no seu código é o uso da função Array.of. Para resolver seu problema você pode chamar a Array.from diretamente:

    function getArrayWithLength(string) {
      return Array.from(string);
    }
    
    console.log(getArrayWithLength("Hello JS Arrays")); 
    
    //Saida:
    //[
    //  'H', 'e', 'l', 'l',
    //  'o', ' ', 'J', 'S',
    //  ' ', 'A', 'r', 'r',
    //  'a', 'y', 's'
    //]

     

    • Curtir 1
  7. Opa @porter, beleza?

    Ao executar JsonConvert.DeserializeObject, ele retornará um objeto genérico (object). Isso significa que você não terá um tipo específico para trabalhar e acessar os dados do JSON.

    Para conseguir acessar os valores você pode criar uma classe equivalente ao JSON e especificar o tipo de objeto para o qual deseja desserializar informando o argumento no método DeserializeObject:

    NotaFiscal notaFiscal = JsonConvert.DeserializeObject<NotaFiscal>(content);
    string idDaNota = notaFiscal.id;

     

    Outra opção é usar os tipos dynamic(não tão recomendado, pois não há verificação de tipo rs):

    dynamic jsonData = JsonConvert.DeserializeObject(content);
    string status_processamento = jsonData.retorno.status_processamento;

     

     

    • Curtir 1
  8. Se a intenção é transformar a imagem retangular em um quadrado, você pode usar a propriedade overflow: hidden para esconder as partes excedentes da imagem e ajustar o tamanho da imagem usando CSS.

     

    <div class="quadrado">
      <img src="sua-imagem.jpg" alt="Imagem Retangular">
    </div>

     

    .quadrado {
      width: 200px; /* Largura desejada do quadrado */
      height: 200px; /* Altura desejada do quadrado */
      overflow: hidden; /* Para cortar as partes excedentes da imagem */
    }

     

    .quadrado img {
      width: 100%;
      height: 100%;
      object-fit: cover; /* Ajusta a imagem para preencher o quadrado */
    }

     

    • Curtir 1
    • Amei 1
  9. Opa @Killberly, beleza?

    Sim, você pode criar um contador dentro de uma função, porém você deve criar a variável fora do loop.

    function exemplo() {
      var contador = 0;
      for (var c = 1; c <= 10; c++) {
        contador = c;
      }
      return contador;
    }
    
    var resultado = exemplo();
    console.log(resultado); 

     

    • Curtir 1
  10. Opa @jcvilanova, beleza?

    Não tenho experiência com PHP, mas posso ajudar com esse problema de forma mais conceitual rs.

    Em C# eu tenho o Razor Pages onde é possível criar uma página HTML e inserir informações compiladas. Por exemplo:

    <p>...@DateTime.Now nesta cidade de...</p>

    Então seria possível criar uma pagina HTML com o texto fixo, informações dinâmicas, exportar para PDF e realizar a impressão.

    Isso também pode ser feito usando apenas HTML e JS, mas acredito que você possa seguir um caminho parecido em PHP.

     

    • Curtir 1
  11. Geralmente, as hospedagens gratuitas impõem um limite de tempo que uma aplicação pode ficar em execução. Uma alternativa que pode ser interessante é utilizar sua função em uma solução serverless, como AWS Lambda ou Azure Functions. Nesse tipo de serviço, é possível configurar para que sua aplicação seja executada a cada 30 segundos sem a necessidade de manter e custear um servidor 24 horas.

     

    • Curtir 1
  12. Opa, tudo bem?

    Ao abrir HTML no navegador é possível utilizar as ferramentas de desenvolvimento(F12) para analisar erros. Quando tentei executar a função somar obtive o erro:

    "Uncaught ReferenceError: n2 is not defined"

    Ou seja, você não definiu a variável n2 antes de usa-la.

    var n1 = Number(tn1.value)
    var n1 = Number(tn2.value) //Atribuindo valor para n1, mas deveria ser n2
    var s = n1 + n2

    Atribuir valor corretamente na variável n2 deve deixar seu código funcional

    var n1 = Number(tn1.value)
    var n2 = Number(tn2.value)
    var s = n1 + n2

     

    • Amei 1
  13. O principal erro em seu código está na função meu_callback onde será obtido os elementos que tenham exatamente os ids: rua, bairro, cidade, uf. Ou seja, sempre será utilizado os elementos definidos no HTML.

    Acredito que essa seja a melhor forma de fazer seu código funcional:

    Modifiquei o HTML e defini o id no grupo_endereco e adicionei o atributo "data-grupoid" no input cep.

    <!DOCTYPE html>
    
    <head>
      <title>Teste</title>
      <script src="script.js"></script>
    </head>
    
    <body>
      <div id="endereco">
        <div class="grupo_endereco" id="campo1">
          <button type="button" onclick="adicionarCampo()">+</button>
          <br><br>
          <input type="text" name="cep[]" id="cep" data-grupoid="campo1" maxlength="9" placeholder="CEP" onblur="pesquisacep(this);"
            onkeypress="$(this).mask('#####-###');"><br>
          <input type="text" name="rua[]" id="rua" placeholder="Rua">
          <input type="text" name="numero[]" id="numero" placeholder="n">
          <input type="text" name="complemento[]" id="complemento" placeholder="Complemento">
          <input type="text" name="bairro[]" id="bairro" placeholder="Bairro">
          <input type="text" name="cidade[]" id="cidade" placeholder="Cidade">
          <input type="text" name="uf[]" id="uf" placeholder="UF">
        </div>
      </div>
    </body>
    
    </html>

     

    Criei uma variável global para definir qual é o grupo de endereço que está sendo modificado. Essa variável será utilizada nas outras funções para manipular os elementos.

    Também adicionei o atributo data-grupoid e função onBlur nos elementos gerados dinamicamente.

    var controleCampo = 1
    var grupoAtual
    
    function adicionarCampo() {
      controleCampo++
      // console.log(controleCampo);
      document
        .getElementById('endereco')
        .insertAdjacentHTML(
          'beforeend',
          '<br><div class="grupo_endereco" id="campo' +
            controleCampo +
            '"><button type="button" id="' +
            controleCampo +
            '" onclick="removerCampo(' +
            controleCampo +
            ')"> - </button><br><br><input type="text" name="cep[]" id="cep" data-grupoid="campo' + controleCampo + '" maxlength="9" placeholder="CEP" onblur="pesquisacep(this);"><br><input type="text" name="rua[]" id="rua" placeholder="Rua"><input type="text" name="numero[]" id="numero" placeholder="n"><input type="text" name="complemento[]" id="complemento" placeholder="Complemento"><input type="text" name="bairro[]" id="bairro" placeholder="Bairro"><input type="text" name="cidade[]" id="cidade" placeholder="Cidade"><input type="text" name="uf[]" id="uf" placeholder="UF"></div>'
        )
    }
    
    function removerCampo(idCampo) {
      document.getElementById('campo' + idCampo).remove()
    }
    
    function limpa_formulario_cep() {
      grupoAtual.querySelector('#rua').value = ''
      grupoAtual.querySelector('#bairro').value = ''
      grupoAtual.querySelector('#cidade').value = ''
      grupoAtual.querySelector('#uf').value = ''
    }
    
    function meu_callback(conteudo) {
      if (!('erro' in conteudo)) {
        grupoAtual.querySelector('#rua').value = conteudo.logradouro;
        grupoAtual.querySelector('#bairro').value = conteudo.bairro
        grupoAtual.querySelector('#cidade').value = conteudo.localidade
        grupoAtual.querySelector('#uf').value = conteudo.uf
      }
      else {
        limpa_formulario_cep()
        alert('CEP não encontrado.')
      }
    }
    
    function pesquisacep(input) {
      // Obtém o ID definido no atributo data-grupoid.
      var grupoId = input.getAttribute('data-grupoid')
      // Define a variável global grupoAtual com o elemento do grupo.
      grupoAtual =  document.getElementById(grupoId)
      var valor = input.value
    
      var cep = valor.replace(/\D/g, '')
    
      if (cep != '') {
        var validacep = /^[0-9]{8}$/
    
        if (validacep.test(cep)) {
          grupoAtual.querySelector('#rua').value = '...'
          grupoAtual.querySelector('#bairro').value = '...'
          grupoAtual.querySelector('#cidade').value = '...'
          grupoAtual.querySelector('#uf').value = '...'
    
          var script = document.createElement('script')
          script.src = 'https://viacep.com.br/ws/'+ cep + '/json/?callback=meu_callback'
    
          
          document.body.appendChild(script)
        } 
        else {
          limpa_formulario_cep()
          alert('Formato de CEP inválido.')
        }
      }
      else {
        limpa_formulario_cep()
      }
    }

     

    Não ficou muito bonito, mas está funcional hehe

  14. Oi, pessoal! Tudo bem?

    Hoje gostaria de compartilhar com vocês um guia sobre como utilizar a API PlugNotas para emitir Notas Fiscais de Serviço Eletrônicas (NFS-e) de forma prática. Com um único JSON é possível emitir notas de forma simplificada, independentemente do padrão de webservice ou da cidade de prestação.

     

    Acesso à API:
    Antes de iniciar o processo, verifique se você possui a chave de API necessária para autenticar suas requisições. Para este guia, vamos utilizar o ambiente Sandbox da API PlugNotas, que oferece respostas fixas e permite testes sem a necessidade de informar um prestador devidamente credenciado.

    Endpoint utilizado será: https://api.sandbox.plugnotas.com.br/
    Informe o token 2da392a6-79d2-4304-a8b7-959572c7e44d no cabeçalho x-api-key como autenticação para todas as suas requisições.

    Sp6lRTft3N4CC2n9U0TtZcDYG4OdFGhQGVFVBsRb
    Cabeçalho x-api-key preenchido com token de sandbox

    Caso esteja utilizando o ambiente de produção, o endpoint será: https://api.plugnotas.com.br/
    Para obter o token de produção, siga os passos descritos na documentação: Obtendo o Token

    Certifique-se de ajustar o endpoint e o token de acordo com o ambiente que você está utilizando. 
    Agora, vamos prosseguir com os passos para emitir uma NFS-e.

     

    Cadastrar certificado:
    O primeiro passo é cadastrar um certificado digital. Para isso, utilize a rota POST /certificado e inclua na requisição um form-data contendo o arquivo do certificado e a respectiva senha. 
    A obrigatoriedade do certificado pode variar de acordo com cada prefeitura ou webservice. Caso queira verificar se uma cidade utiliza certificado, você pode utilizar a rota GET /nfse/cidades.

    VAXvYjlypWJ1r4qfjU91ctA53kf3k-_89U4YJHP8
    O arquivo do certificado deve ser informado em corpo no formato form-data.

     

    Cadastrar prestador:
    Agora vamos realizar o cadastro do prestador enviando uma requisição POST para a rota /empresa. No corpo da requisição, além dos dados básicos da empresa, inclua o campo "nfse" com as configurações de número de RPS (Recibo Provisório de Serviços), ambiente de emissão e autenticação da prefeitura.
    Certifique-se também de incluir o campo "certificado" com o ID obtido no passo anterior, para vincular o certificado ao cadastro do prestador.

    {
        "cpfCnpj": "71073473000167",
        "inscricaoMunicipal": "8214100099",
        "simplesNacional": true,
        "regimeTributario": 1,
        "razaoSocial": "Tecnospeed S/A",
        "certificado": "64b58c5405f34cdce812efc1",
        "endereco": {
            "bairro": "Zona 01",
            "cep": "87020025",
            "codigoCidade": "4115200",
            "estado": "PR",
            "logradouro": "Duque de Caxias",
            "numero": "882",
            "tipoLogradouro": "Avenida",
            "codigoPais": "1058",
            "complemento": "17 andar",
            "descricaoCidade": "Maringá",
            "descricaoPais": "Brasil",
            "tipoBairro": "Zona"
        },
        "nfse": {
            "ativo": true,
            "tipoContrato": 0,
            "config": {
                "producao": true,
                "rps": {
                    "lote": 1,
                    "numeracao": [
                        {
                            "numero": 1,
                            "serie": "RPS"
                        }
                    ]
                },
                "prefeitura": {
                    "login": "teste",
                    "senha": "teste123"
                }
            }
        }
    }

     

    Emitir NFS-e
    Após o cadastro do prestador, você estará pronto para emitir uma NFS-e. Para isso, envie uma requisição POST para a rota /nfse, incluindo um JSON com as informações da nota de serviço. Vamos destacar algumas das propriedades obrigatórias que compõem esse JSON

    • Prestador: Deve ser informado o CPF/CNPJ e outros dados relevantes do prestador de serviço, conforme necessário. Por padrão serão utilizados os dados do cadastro realizado previamente.
    • Tomador: Nesse campo, devem ser fornecidos os dados do tomador do serviço, como CPF/CNPJ, razão social, endereço e e-mail.
    • Serviço: Aqui, serão informados os detalhes do serviço prestado, como código, discriminação, valor a ser cobrado e impostos aplicáveis.

    Com os campos devidamente apresentados podemos montar o JSON:

    [
      {
        "prestador": {
          "cpfCnpj": "82186217000100"
        },
        "tomador": {
          "cpfCnpj": "99999999999999",
          "razaoSocial": "Empresa de Teste LTDA",
          "email": "teste@plugnotas.com.br",
          "endereco": {
            "descricaoCidade": "Maringa",
            "cep": "87020100",
            "tipoLogradouro": "Rua",
            "logradouro": "Barao do rio branco",
            "tipoBairro": "Centro",
            "codigoCidade": "4115200",
            "complemento": "sala 01",
            "estado": "PR",
            "numero": "1001",
            "bairro": "Centro"
          }
        },
        "servico": [
          {
            "codigo": "14.10",
            "codigoTributacao": "14.10",
            "discriminacao": "Descrição dos serviços prestados",
            "cnae": "7490104",
            "iss": {
              "tipoTributacao": 7,
              "exigibilidade": 1,
              "aliquota": 3
            },
            "valor": {
              "servico": 1
            }
          }
        ]
      }
    ]

    A emissão da NFS-e é um processo assíncrono. Você receberá um protocolo e um ID que serão utilizados para consultar a situação da nota posteriormente.
    Se não houver erros de validação em sua requisição, você receberá a seguinte resposta:

    {
        "documents": [
            {
                "id": "64b5445a47188375a92f6414"
            }
        ],
        "message": "Nota(as) em processamento",
        "protocol": "22535d12-b458-4b12-b5d2-37c46f1f01ae"
    }

     

    Consultar NFS-e

    Após a emissão é necessário enviar uma requisição GET para /nfse/consultar/{idouprotocolo} a fim de verificar a situação da nota emitida. Essa consulta permitirá obter informações sobre o status atual da NFS-e.
    Durante o processo de consulta, você pode encontrar os seguintes status:

    • PROCESSANDO: Indica que a nota está em processamento. Nesse caso, é necessário realizar consultas subsequentes até obter a situação final da nota.
    • REJEITADO: Caso ocorra algum erro durante a emissão da nota, você receberá esse status juntamente com o motivo da rejeição. Analise a mensagem de erro, ajuste os dados do JSON de envio e tente a emissão novamente.
    • CONCLUÍDO: Indica que a NFS-e foi devidamente autorizada. No ambiente Sandbox, todas as emissões resultarão em sucesso.

    Ao consultar uma nota concluída, você receberá os seguintes dados:

    [
        {
            "id": "64b5445a47188375a92f6414",
            "emissao": "17/07/2023",
            "situacao": "CONCLUIDO",
            "prestador": "82186217000100",
            "tomador": "99999999999999",
            "valorServico": 1,
            "numeroNfse": "22143",
            "serie": "LAL",
            "lote": 290008,
            "numero": 7,
            "codigoVerificacao": "5278FE6A7",
            "autorizacao": "17/07/2023",
            "mensagem": "RPS Autorizada com sucesso",
            "pdf": "https://api.sandbox.plugnotas.com.br/nfse/pdf/64b5445a47188375a92f6414",
            "xml": "https://api.sandbox.plugnotas.com.br/nfse/xml/64b5445a47188375a92f6414"
        }
    ]

     

    Exportar NFS-e

    Após consultar a NFS-e e obter a situação "CONCLUÍDO", você pode exportar a nota nos formatos PDF ou XML. Para isso, basta realizar as seguintes operações:
    Para exportar o PDF da nota, faça uma requisição GET para /nfse/pdf/{idNota}. Isso permitirá que você obtenha o arquivo PDF contendo os dados da NFS-e.
    Para exportar o XML da nota, faça uma requisição GET para /nfse/xml/{idNota}. Isso permitirá que você obtenha o arquivo XML gerado pela prefeitura.

    ARPx4aXwjIJrdWCTs7Ah6EP02B_WlN6nQhGG4ouz
    PDF obtido ao exportar.

    E assim concluímos o guia de utilização da API PlugNotas para emissão de NFS-e. Espero que este guia tenha sido útil e fornecido todas as informações necessárias para você começar a utilizar a API em seus projetos.

    Caso queira explorar mais detalhes, exemplos e informações adicionais, recomendo que consulte a documentação completa, disponível no seguinte link: Documentação API PlugNotas

    • Amei 1
×
×
  • Create New...