Jump to content

Pesquise na Comunidade

Mostrando resultados para tags 'desenvolvimento de software'.

  • Pesquisar por Tags

    Digite as tags separadas por vírgulas.
  • Pesquisa por Autor(a)

Tipo de Conteúdo


Fóruns

  • Antes de tudo...
    • O nosso fórum é para vocês devs e software houses!
  • Geral
    • Desenvolvimento de Software
    • Reviews de Solução
    • Troca de Conhecimentos Gerais
    • Classificados
  • Negócios
    • Admistrativo/Financeiro
    • Tecnologia
    • Tudo sobre Marketing
    • Gestão
    • Gestão de Pessoas
    • LGPD
    • Customer Success: Foco no cliente
  • Comunidade DFe
    • Café com o Contador
    • Notas Técnicas - Café Expresso
    • Tudo sobre DFe
    • Cálculo de impostos (ICMS, IPI, PIS/COFINS, IRPJ)
    • Comércio Exterior
  • Linguagens de Programação
    • Dúvidas de Desenvolvimento
    • C#
    • C++
    • Delphi
    • HTML & CSS
    • Java
    • JavaScript
    • PHP
    • Python
    • SQL
    • Outras Linguagens
  • Startups
    • Mentoria
    • Apresente sua Startup
    • Dúvidas
  • Produtos
    • PlugBank
    • Suíte de Componentes
    • PlugDash
    • PlugNotas
    • TecnoSign
    • Manager SaaS
    • TecnoPay
  • Off Topic
    • Blog da Casa do Desenvolvedor
    • Blog da TecnoSpeed
    • Orgulho de ser Nerd/Geek
  • Cursos
    • TecnoSpeed Academy
    • Curso Básico para Devs
  • Eventos
    • TecnoUpdate
    • Eventos de Tecnologia 2022
    • Webinars/Lives
  • Monitor SEFAZ
    • NF-e
    • NFC-e
  • Rejeições
  • Regras Tributárias
  • Trampos em TI | Home Office's Vagas
  • Clube dos AGR's's Discussões
  • Clube dos AGR's's Fale com o Marketing
  • Clube dos AGR's's Dicas do CS
  • Clube dos AGR's's Capacitação em Vendas
  • Clube dos AGR's's Materiais CHS
  • Clube dos AGR's's Materiais Autêntica
  • Clube dos AGR's's Conteúdos TecnoSpeed Certificados
  • Parceiros - Canal de Vendas's Segmentos
  • Parceiros - Canal de Vendas's Dúvidas
  • Mentalidade Ágil's Tópicos
  • Computação Feitep's Geral
  • TIC Performance 2021 - SEBRAE's Trilha dos Workshops 2021
  • TIC Performance 2021 - SEBRAE's Materiais de apoio
  • TIC Performance 2021 - SEBRAE's Aula Gestão Financeira para Software Houses
  • TIC Performance 2021 - SEBRAE's Dúvidas
  • TecnoUpdate 2021's Novidades
  • TecnoUpdate 2021's Conteúdos
  • TecnoUpdate 2021's Dúvidas
  • Desafio Casa do Dev - NodeJS (2021)'s Comece aqui
  • Desafio Casa do Dev - NodeJS (2021)'s Dúvidas
  • Desafio Casa do Dev - NodeJS (2021)'s Cursos - Gratuitos
  • Desafio Casa do Dev - NodeJS (2021)'s O Desafio
  • PROTHEUS TOTVS's Release 33
  • Univale - Ivaiporã's Notícias

Blogs

  • Gestão Empresarial
  • Gestão de Pessoas
  • Empregabilidade

Product Groups

Não há resultados para exibir.


Encontre resultados em...

Encontre resultados que contenham...


Data de Criação

  • Início

    Fim


Última Atualização

  • Início

    Fim


Filter by number of...

Ingressou

  • Início

    Fim


Grupo


Ciente das Políticas de Privacidade


Declaração de Ciência e Autenticidade e de Veracidade


Ciente dos Termos de Serviços e das Regras do Hub


Sobre


Você é estudante?


Qual sua área?


Outro? Por favor, especifique.


Como você conheceu o nosso fórum?


Outro? Por favor, especifique.


Qual seu nível de senioridade?

  1. Tópico originalmente criado por: @Jonathan Santos Regex é uma linguagem formal que permite identificar padrões de caracteres dentro de um texto. E é muito utiliza em editores para encontrar e manipular pedaços de texto, nós podemos utilizar para identificar trechos específicos dentro de um xml, um csv, dados dentro de um formulário e qualquer fonte de texto. Segue abaixo alguns exemplos da forma mais simples até um ponto mais recomendado, você pode testar usando o site rubular.com 3 para acompanhar os exemplos: Dígitos numéricos com Regex : Quando queremos nos referir a dígitos em um pattern, colocamos uma abreviação de dígito = \d Por exemplo, para exigir que um campo de CPF tenha 11 dígitos, colocaria: pattern="\d\d\d\d\d\d\d\d\d\d" Porém, neste padrão acima, ficaria muito custoso manter pelo tanto de repetição e passível de falhas, então para facilitar, pode-se utilizar o recurso de repetição em regex, que é colocar entre chaves o número de repetições desejadas ou limitada: Este mesmo padrão é equivalente ao de cima, muito mais simples de manter e entender. pattern="\d{11}" Para validarmos o caracter if no final do cpf podemos utilizar o operador? que serve para dizer que pode ou não ter este caracter, ficando assim: Aqui teremos três blocos de 3 dígitos, o hífen e o operador? que indica que o hífen é opcional, pode ou não existir. pattern="\d{3}.\d{3}.\d{3}-?\d{2}" Dígitos literais e conjuntos com Regex : Indica que podemos usar qualquer letra do alfabeto no intervalo de a até z. Para letras do alfabeto neste intervalo: pattern="[a-z]" pattern="[A-Z]" Para se utilizar o comum é [a-zA-Z] esse grupo ja indica de forma agrupada todas letras. E para utilizar esse grupo de letras com números, basta colocar o indicador de dígitos que é o \d ficando: pattern="[a-zA-Z\d]" E para funcionar com qualquer palavra utilizamos o operador + que indica que uma ou mais letras deste mesmo grupo ficando. pattern="[a-zA-Z\d]+" Exemplo simples de validação de email: pattern="[a-zA-Z\d]+@[a-zA-Z\d]+\.[a-zA-Z\d]+\.[a-zA-Z\d]+" E para melhorar a forma de validação acima que está muito repetitiva. Usamos o operador \w que é equivalente ao [a-zA-Z\d_] que representa uma “word”. pattern="\w+@\w+\.\w+\.?\w?\w?+" E para melhorar ainda podemos utilizar o caractere especial *, que é o equivalente ao caractere ? e o +. Utilizando o * o caractere antes dele pode ser presente ou não e pode aparecer mais de uma vez ou não também. pattern="\w*@\w*\.\w*\.\w*" Como tratar grupos em regex: exemplo cartão de crédito: 9999-9999-9999-9999 Forma sem agrupamento pattern="\d{4}[ -]\d{4}[ -]\d{4}[ -]\d{4}" Neste grupo acima podemos notar que várias partes se repetem então podemos agrupar utilizar o () entre as partes identificadas exemplo: \d{4} = indica teremos 4 dígitos iniciais ([ -]\d{4}) = indica que este grupo pode se repetir na expressão {3} = e para finalizar nesse pattern, este indica que este grupo pode se repetir 3 vezes. pattern="\d{4}([ -]\d{4}){3}" Este post é apenas o básico desta linguagem formal, que seu uso cresce a cada dia dentre nós desenvolvedores.
  2. html Salvar CPF Nome Data de Nascimento Idade É maior de Idade Vaga javascript class Pessoas { salvar(){ let pessoas = this.FuncaoPrincipal(); if(this.ValidaCampos(pessoas)) { this.adicionar(pessoas) } this.ListaTabela(); } FuncaoPrincipal() { // função pra criar o json let pessoas = {} pessoas.id = this.id; pessoas.CPF = document.getElementById('CPF').value; pessoas.nome = document.getElementById('nome').value; pessoas.Sobrenome = document.getElementById('Sobrenome').value; pessoas.DataDeNascimento = document.getElementById('data').value; pessoas.Idade = document.getElementById('idade').value; pessoas.ÉMaiorDeIdade = document.getElementById('exampleRadios1').value; pessoas.EMaiorDeIdade = document.getElementById('exampleRadios2').value; pessoas.Vaga = document.getElementById('vaga').value; return pessoas; } constructor(){ this.id = 1; this.arrayPessoas = []; } adicionar(pessoas) { //função que pega o array de pessoas this.arrayPessoas.push(pessoas); this.id++; } ValidaCampos(pessoas){ // função que da uma olhada se os campos estão corretos ai da um alerta let msg = ''; if(pessoas.nome == '') { msg += '- Informe seu nome \n'; } if(pessoas.CPF == '') { msg += '- Informe seu CPF \n'; } if(pessoas.Sobrenome == '') { msg += '- Informe seu Sobrenome \n'; } if(pessoas.DataDeNascimento == '') { msg += '- Informe sua Data de Nascimento \n'; } if(pessoas.Idade == '') { msg += '- Informe sua Idade \n'; } if(pessoas.ÉMaiorDeIdade == '') { msg += '- Informe se você é maior de Idade ou não \n'; } if(pessoas.EMaiorDeIdade == '') { msg += '- Informe se você é maior de Idade ou não \n'; } if(pessoas.Vaga == '') { msg += '- Informe sua Vaga desejada \n'; } if(msg != '') { alert(msg); return false } return true; } ListaTabela() { let tbody = document.getElementById('tbody'); tbody.innerText = ''; for (let i = 0; i aplicação.rar
  3. html CPF * Tudo certo! Vaga Estágio em TiHelp DeskDesenvolvedor Front-EndDesenvolvedor Back-EndDesenvolvedor Full Stack Salvar javascript class Pessoas { salvar(){ let pessoas = this.FuncaoPrincipal(); if(this.ValidaCampos(pessoas)) { this.adicionar(pessoas) } this.ListaTabela(); } FuncaoPrincipal() { // função pra criar o json let pessoas = {} pessoas.id = this.id; pessoas.CPF = document.getElementById('CPF').value; pessoas.nome = document.getElementById('nome').value; pessoas.Sobrenome = document.getElementById('Sobrenome').value; pessoas.DataDeNascimento = document.getElementById('data').value; pessoas.Idade = document.getElementById('idade').value; pessoas.ÉMaiorDeIdade = document.getElementById('exampleRadios1').value; pessoas.EMaiorDeIdade = document.getElementById('exampleRadios2').value; pessoas.Vaga = document.getElementById('vaga').value; return pessoas; } constructor(){ this.id = 1; this.arrayPessoas = []; } adicionar(pessoas) { //função que pega o array de pessoas this.arrayPessoas.push(pessoas); this.id++; } ValidaCampos(pessoas){ // função que da uma olhada se os campos estão corretos ai da um alerta let msg = ''; if(pessoas.nome == '') { msg += '- Informe seu nome \n'; } if(pessoas.CPF == '') { msg += '- Informe seu CPF \n'; } if(pessoas.Sobrenome == '') { msg += '- Informe seu Sobrenome \n'; } if(pessoas.DataDeNascimento == '') { msg += '- Informe sua Data de Nascimento \n'; } if(pessoas.Idade == '') { msg += '- Informe sua Idade \n'; } if(pessoas.ÉMaiorDeIdade == '') { msg += '- Informe se você é maior de Idade ou não \n'; } if(pessoas.EMaiorDeIdade == '') { msg += '- Informe se você é maior de Idade ou não \n'; } if(pessoas.Vaga == '') { msg += '- Informe sua Vaga desejada \n'; } if(msg != '') { alert(msg); return false } return true; } ListaTabela() { let tbody = document.getElementById('tbody'); tbody.innerText = ''; for (let i = 0; i aplicação.rar
  4. Objetos, classes, atributos, métodos… A Programação Orientada a Objetos é composta por vários conceitos, paradigma responsável por aproximar os códigos do mundo real. Quer entender um pouco mais sobre POO? Então, continue lendo esse artigo! Afinal de contas, o que é um Paradigma de Programação? Existem diversas formas de organizar um software. Isso é possível graças aos paradigmas de programação, padrões que estruturam a execução de um código de forma lógica, sendo alguns dos paradigmas mais conhecidos: Programação Orientada a Objetos (POO) e a Programação Estruturada (PE). Programação Estruturada vs Programação Orientada a Objetos A Programação Estruturada é um dos paradigmas de programação mais simples, composto basicamente por três estruturas que controlam o fluxo da execução do código. Elas podem ser definidas como estruturas de: Sequência: fazem com que o programa seja executado linha a linha. Seleção: possibilitam que trechos do código sejam executados ou não, por meio de comandos condicionais. Repetição: também conhecida como iteração, são estruturas responsáveis por executar uma parte do programa mais de uma vez. Por outro lado, a Orientação a Objetos, como o próprio nome já diz, é baseada em objetos, estes que possuem atributos e métodos herdados de sua classe. Classes, Atributos, Métodos e Objetos na POO Como dito anteriormente, a POO tem como objetivo aproximar a programação do mundo real, com a utilização de objetos. Para isso, a orientação a objetos conta com classes, atributos e métodos, responsáveis por formar os objetos utilizados no código. CLASSES As classes podem ser definidas como o conceito de objeto, um molde/modelo que engloba seus atributos e métodos, compartilhados por objetos do mesmo tipo. ATRIBUTOS Os atributos são as características, também conhecidas como propriedades, que um objeto originado de uma classe possui. Considerando uma classe “Celular”, pode-se dizer que seus atributos(propriedades) são: Classe Celular; Propriedade Cor; Propriedade Marca; Propriedade Tamanho; MÉTODOS De forma geral, os métodos são as funcionalidades/ações que um objeto possui, também definidos em uma classe. Ainda levando em consideração a classe “Celular” e seus atributos, pode-se dizer que seus métodos são: Classe Celular; Propriedade cor; Propriedade marca; Propriedade tamanho; Método realizar_ligacao(); Método atender_ligacao(); Método enviar_mensagem(); Método reproduzir_audio(); OBJETOS Os objetos são "produtos" reais originados (instanciados) de uma classe, herdando seus atributos e métodos. Um objeto originado da classe “Celular” possuirá características como cor, marca e tamanho, além de funcionalidades como realizar e atender ligações, enviar mensagens e reproduzir áudios, visto que a classe “Celular”, em que o objeto é modelado, possui estes atributos e métodos. Por fim, objetos do mesmo tipo pertencem à mesma classe (são instanciados/modelados da mesma classe), ou seja, todo telefone criado a partir da classe “Celular” será do tipo celular, já que possui as características e funcionalidades deste tipo de dispositivo. Referências: POO: tudo sobre Programação Orientada a Objetos! POO: o que é programação orientada a objetos?
  5. porque o meu código não quer calcular tem alguma coisa errada com o meu código???? 2 imagens abaixo uma minha e outra do professor, só que ele não põem o placerholder, e se eu não bota no meu ele não pega?
  6. Após diversas tentativas frustradas e complexas de utilizar xPath em VB6 , acabamos por desenvolver uma OCX gratuita onde é possível utilizar xPath de forma simplificada. Apesar de desenvolvida para ser utilizada em VB6 é possível utilizar em qualquer linguagem que consiga consumir uma OCX . Como instalar: Realize o download da OCX no final do post, movendo para a SysWow64 -> S.O. x64 ou System32 -> S.O. x86 e registre utilizando o regsvr32 . Logo após deve referenciar essa OCX em seu projeto( Project -> References -> xPathXML.ocx ). Métodos disponiveis: SelecionaNodeXML -> O método irá retornar a tag ou estrutura informada no primeiro parâmetro, com base no indice informado no segundo parâmetro, buscando estas informações no XML informado no terceiro parâmetro. PercorreNodeXML -> O método irá retornar todas as ocorrências da tag ou estrutura informada no primeiro parâmetro, separadas pelo delimitador definido no segundo parâmetro, buscando estas informações no XML informado no terceiro parâmetro. XML utilizado para testes: <retEnviNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#"> <tpAmb>2</tpAmb> <verAplic>GO3.0</verAplic> <cStat>103</cStat> <xMotivo>Lote recebido com sucesso</xMotivo> <cUF>52</cUF> <dhRecbto>2015-03-18T11:15:24-03:00</dhRecbto> <infRec> <nRec>521000010289495</nRec> <nRec>521000010289495</nRec> <nRec>521000010289495</nRec> <tMed>2</tMed> </infRec> </retEnviNFe> SelecionaNodeXML exemplo de utilização: Dim XMLDoc As XPathXml.XPathXml Set XMLDoc = New XPathXml.XPathXml edtTesteTag.Text = XMLDoc.SelecionaNodeXml("nRec", 0, mmXml.Text) PercorreNodeXML exemplo de utilização: Dim XMLDoc As XPathXml.XPathXml Set XMLDoc = New XPathXml.XPathXml Dim i As Integer Dim vetor As Variant vetor = Split(XMLDoc.PercorreNodeXML("nRec", "|", mmXml.Text), "|") cbbTesteTag.Clear For i = LBound(vetor) To UBound(vetor) cbbTesteTag.AddItem vetor(i) Next Obtendo atributo de uma tag: Dim XMLDoc As XPathXml.XPathXml Set XMLDoc = New XPathXml.XPathXml edtTesteTag.Text = XMLDoc.SelecionaNodeXML("retEnviNFe/@versao", 0, mmXml.Text) ou edtTesteTag.Text = XMLDoc.SelecionaNodeXML("@versao", 0, mmXml.Text) OCX e Exemplo de utilização anexados logo abaixo. https://tsdn.tecnospeed.com.br/files/render/a/d1bA1YExdQc/m/2Aal0HUq8WfaoMbCJXVjsCp1gbKWDONcJmsewKMB3YfVHfqBRMt4Z30DjOvQgJkfk6NI1dQW2Fg https://tsdn.tecnospeed.com.br/files/render/a/d1bA1YExdQc/m/2Aal0HUq8WdpEWeYeAaOv23QOsnfWODue1p7fd688DUlyaYr3Kns7wlT7TWj6YHvLACX3jXbRv8 Tópico originalmente criado por: @Jonathan Santos
  7. Frameworks CSS Durante o desenvolvimento de aplicações web, independente do framework ou biblioteca utilizado, a estilização é, para muitos, uma das etapas mais trabalhosas e complicadas de se fazer, devido ao famoso CSS, que é amado por alguns e odiado por outros. Gostando ou não de escrever CSS, a verdade é que é necessário investir um tempo considerável do desenvolvimento a fim de obter o resultado desejado para o visual da aplicação. Com esse problema em mente, diversos desenvolvedores e designers construíram diversas ferramentas e frameworks para auxiliar nesse processo como, por exemplo, o Bootstrap, que é (provavelmente) o mais conhecido e utilizado de todos. A maioria desses frameworks funcionam por meio das classes HTML e realizam a estilização do elemento em questão de acordo com a classe inserida. A maior desvantagem desse tipo de framework é que grande parte deles são, na realidade, uma coleção de componentes prontos que mudam a estilização completa de um elemento com apenas uma classe e, muitas vezes, não possuem simples maneiras de customizá-lo diretamente, o que faz com que os desenvolvedores ainda tenham que escrever um código CSS adicional caso queiram mudar parte do design de um componente e torná-lo diferente do padrão. Há quem goste dessa abordagem, contudo, eu gostaria de mostrar uma outra abordagem de frameworks CSS, denominada “utility-first”, que, na prática utilizam classes para estilizar propriedades específicas de um elemento e não mudam o estilo dele por inteiro de uma única vez. Essa abordagem é ótima para quem não quer perder a liberdade de estilizar cada aspecto de um elemento individualmente, e também não deseja ter uma interface semelhante a várias outras, como acontece na maioria das interfaces que usam Bootstrap, por exemplo. E dentre os frameworks que utilizam essa abordagem, gostaria de destacar um deles em específico: o Tailwind CSS. Tailwind CSS O Tailwind CSS é um framework CSS utility-first e mobile-first que vem se destacando por ser simples, leve, responsivo, amplamente configurável e extremamente fácil de usar até para quem não domina CSS. Atualmente ele está disponível para diversos frameworks e bibliotecas como: React, Vue.js, Next.js, Nuxt.js, Vite, Laravel, Gatsby, e até para projetos com JavaScript puro, e seu processo de instalação é bem simples. Uma vez instalado, basta escrever as classes correspondentes às propriedades CSS desejadas no “class” (ou “className”, no React) do elemento em questão, seguindo as classes da documentação oficial, e o estilo será aplicado a ele instantaneamente. Outra vantagem é que o Tailwind CSS realiza o “purge” de classes, ou seja, classes não utilizadas não são incluídas no build da aplicação, reduzindo o tamanho dos arquivos finais e melhorando a performance. É possível testar o Tailwind CSS por meio do link: https://play.tailwindcss.com/ A seguir seguem alguns exemplos práticos da utilização do Tailwind CSS em comparação com CSS puro. 1 - Flexbox: HTML e CSS puro <div class="element"> ... </div> .element { display: flex; flex-direction: column; align-items: center; justify-content: center; } Utilizando Tailwind CSS <div class="flex flex-col items-center justify-center"> ... </div> 2 - Grid, quebra de linha e text-overflow: HTML e CSS puro <div class="container"> <div class="first"> ... </div> <div class="second"> ... </div> </div> .container { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); } .first { grid-column: span 3 / span 3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .second { grid-column: span 1 / span 1; } Utilizando Tailwind CSS <div class="grid grid-cols-4"> <div class="col-span-3 truncate"> ... </div> <div class="col-span-1"> ... </div> </div> 3 - Responsividade, cores, padding e border-radius: HTML e CSS puro <div class="element"> ... </div> .element { width: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2rem; padding: 1rem; background-color: #2563eb; color: #4b5563; border-radius: 0.5rem; @media (min-width: 768px) { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); } } Utilizando Tailwind CSS <div class=" w-full flex flex-col items-center justify-center gap-8 p-4 bg-blue-600 text-gray-600 rounded-lg md:grid md:grid-cols-4 " > ... </div> Conclusão: Por fim, espero que tenha sido possível perceber as diversas vantagens na utilização do Tailwind CSS em seu projeto front-end e que, embora não seja perfeito, ele pode proporcionar um grande aumento na produtividade de desenvolvedores front-end, reduzindo o tempo gasto em estilização, especialmente para aqueles que são muito fãs de escrever CSS. Existem também diversas outras ferramentas para melhorar a forma de lidar com estilização, como Styled Components, Sass, dentre outros. Qual o seu favorito? O que achou do Tailwind CSS? Gostaria de unir o Tailwind CSS com uma biblioteca de componentes como o Bootstrap? Dê uma olhada no Tailwind UI.
  8. Fazer essa pergunta é um caminho pra começar uma briga, né? A resposta diplomática é que toda linguagem de programação foi criada para suprir uma necessidade. Se existe uma outra linguagem que também supre essa necessidade, então ninguém em sã consciência entraria em todo o rolo de criar uma nova linguagem. No geral, o que isso significa é que toda linguagem que existe e não está completamente obsoleta é “a melhor” para uma aplicação particular. Toda linguagem por alguma razão é o que é. Então não há apenas uma “melhor” linguagem. Há sempre coisas em que ela é muito boa e coisas que nem tanto. No entanto, tem gente que diz que existem as piores linguagens. Para Steve Baker , as piores linguagens do momento são algumas bobinhas como BrainF**k e Befunge, e falando sério, pra ele PHP seria a pior linguagem que ainda está em uso, junto com COBOL. Pra ele, C++ é a melhor linguagem porque ele usa pra quase tudo, e também por causa do tipo de software que desenvolve. Mas pra outras pessoas, é JavaScript ou Pyhton, ou Java ou Ruby, ou C# ou Objectice C ou FORTRAN or Lisp… Exceto PHP e COBOL. Pro Steve, essas duas são realmente terríveis, e a única razão pela qual você ainda deveria continuar usando seria para manter projetos antigos e grandes, que pra reescrever seriam muito custosos. E aí, o que você acha? Postei e saí correndo… Postagem de ago/19
  9. Olá, pessoal! Como estão? E aí, você desenvolve para mobile? Quero saber qual a melhor plataforma/linguagem de desenvolvimento mobile. Levando em consideração sua experiência, custo, benefício e qualquer outro fator que você acha interessante compartilhar! Muito obrigada!
  10. Nos dias de hoje é essencial para qualquer empresa que desenvolva software a utilização de alguma forma de controle de versão (subversion, git, etc) para gerenciar os artefatos produzidos pelas equipes de programadores. No qual duas ou mais equipes, trabalham em um mesmo repositório é possível ocorrer problemas com a geração de releases.Um dos vários problemas que se pode encontrar é a dificuldade em encontrar uma versão do repositório para iniciar a validação de um produto. Outro problema é a necessidade de colocar uma alteração na versão congelada. Esses problemas aumentam a dificuldade da geração de releases estáveis.Para solucionar este problema estamos utilizando o processo criação de branches de qualidade e controle de commits nos repositórios de trunk, branch e tags, conforme a imagem abaixo. A cada marco criamos uma branch que validada pela equipe testes para que seja uma candidata à versão estável e encaminhada para o cliente.Caso a equipe de testes encontrem problemas na versão em que validam o pacote candidato, a correção é feita no repositório TRUNK e na BRANCH criada para validação. Este processo ocorre até que o pacote seja liberado para o cliente, no qual a BRANCH candidata acaba gerando a TAG (release estável).Após, a liberação da release estável o fluxo volta ao início, com novas gerações de branches candidatas com o incremento das novas funcionalidades normalmente. Porém, caso encontre um problema gravíssimo que impacte o cliente diretamente, a correção é feita de forma imediata e comitada na TRUNK e na BRANCH da qualidade em que o problema foi encontrado, gerando nova release com o codinome HOTFIX
  11. Este post é uma alternativa ao Como resolver a incompatibilidade do Delphi XE4 com a biblioteca midas.dll. Após o lançamento do Delphi XE4, aplicações que fazem uso de Dataset passaram a ter diversos problema com a versão da midas.dll que se encontra no sistema operacional. Problemas comuns: Acess Violation ao criar o componente; Acess Violation ao utilizar o DataSet; Geralmente para solucionar este problema os desenvolvedores distribuem junto a sua aplicação a midas.dll que se encontra dentro da pasta bin do Deplhi, uma opção mais pratica e mais robusta é incorporar a midas.dll ao seu .exe Para incorporar a dll a seu .exe, basta ir na Uses de seu form e adicionar a unit MidasLib. Após realizar este procedimento basta dar um novo Build de seu projeto e distribuir seu .exe, sem se preocupar agora em copiar/registrar a midas.dll.
  12. Há cerca de 50 anos atrás, nossos clientes tinham um perfil diferente: o interesse era na satisfação da necessidade e, sendo simplista, só. Não havia uma infinidade de opções para satisfazer uma mesma necessidade, se o consumidor queria um lugar para sentar, a alternativa dele era comprar uma cadeira, quiçá um banquinho como alternativa. E ponto. Havia empresas especializadas em cadeiras e elas poderiam sobreviver só esperando os clientes que precisassem de cadeiras procurarem elas, eles precisavam mais do produto do que a empresa precisa dos clientes. Os tempos mudaram e o perfil de consumo também, uma das coisas que menos importam hoje é a necessidade já que ela pode ser satisfeita por uma infinidade de produtos semelhantes. Se um consumidor quer um lugar para sentar, há cadeiras, bancos, puffs feitos nos mais diversos materiais e formatos, personalizados de acordo com a imaginação do cliente! O mercado se tornou mais competitivo, as empresas passaram a se preocupar diretamente com os desejos dos consumidores, com as suas preocupações também: o consumidor do século XXI se preocupa também com a sustentabilidade, com a reputação da marca que compra!(…)[ Continue lendo.](javascript:void(0))
  13. Uma validação de software é uma atividade que tem como objetivo assegurar que o produto final corresponda aos requisitos do software, comprovando a inexistência de erros(“BUG”). Visando melhorar o aprendizado e prática em validação, abaixo segue alguns casos e dicas para melhorar sua validação: Identificar e detalhar o que será validado, isto pode incluir o software em si, os requisitos, e outros tipos de documentos, por exemplo: documentação, demostrações, etc. Definir e implementar uma estratégia de validação, ou seja, definir como será feita e o que necessita para ser feita. Definir critérios e procedimentos para a validação, por exemplo, tempo de resposta, tolerância a falhas etc. Garantir a execução das atividades de validação. Por meio das reuniões de revisão, por exemplo. Identificação e registro dos problemas encontrados durante a validação. Isto é relatado no ticket de validação da estória. Em caso de validação de pacote para liberação de release, deve ser criado um ticket de BUG ou estória para fazer a correção. Disponibilização dos resultados das atividades de validação aos interessados, para que estes possam ser avaliados. Fornecer evidências de que o produto final de software desenvolvido esteja pronto para uso, por exemplo: no nosso dia a dia seria colar o template de validação no ticket da estória. Para fazer uma boa validação deve se pensar como o cliente irá usar a aplicação, testando todos os cenários possíveis: Testar tratamento para exceções; Verificar se há erros de português em mensagens de retorno(acentuação, pontuação, discordância verbal, etc); Testar case sensitive(letras Maiúsculas e Minusculas); Caracteres especiais, escapados e sem serem escapados; Validar tamanho máximo e mínimo de campos; Se possível testar em cenários diferentes(windows servers, windows x32bits, windows x64bits, etc); Validar reparando no Log da aplicação, pois pode conter explicações minuciosas para sua dúvida, ou detalhando um fluxo que não esteja correto; Alguns cenários que trazem erros simples são a impressão e e-mail, abaixo passarei algumas dicas para melhorar esta validação destes dois cenários: Validação de e-mail: Abrir os XMLs enviados e verificar a codificação destes, devem estar sempre em UTF8-sem BOM, que é a codificação padrão dos componentes TecnoSpeed; Enviar anexos(diferentes tipos: .jpg, .txt, etc); E-mail com cópia para outro usuário; Alterar assunto(mensagem com caracteres especiais, texto grande e pequeno); Enviar somente XML; Enviar somente impressão da nota; Enviar tudo o que for possível junto(XML, impressão, anexos, etc); Validação de Impressão: Exportar arquivos para um diretório; Cancelar a exportação; Visualizar a impressão; Imprimir com impressora em rede; Imprimir com impressora local; Editar RTM, dropar campos no .rtm e visualizar a impressão; Remover campos do .Rtm e visualizar impressão; Testar links do QRCode quando tiver na impressão; Trocar logotipo da empresa; Imprimir sem logotipo; imprimir passando caracteres especiais, deve sair corretamente na impressão; Verificar máscaras de CNPJ e CPF(devem estar formatadas corretamente); Durante a validação de um produto no nosso dia a dia usamos as seguintes técnicas: Demonstração e Teste de usabilidade. Como o próprio nome sugere, a demonstração do produto apresenta o incremento mais recente produto para os usuários, clientes e partes interessadas. O validador deverá implementar uma demonstração de forma que sirva de explicação ou gabarito para que os usuários que empregam o produto façam seu bom uso, e imaginam como seria usar o produto. Um teste de usabilidade permite entender como os usuários interagem com o produto. O validador irá executar uma tarefa usando o incremento mais recente produto. Desta forma, deverá ser testado os cenários de acordo como se o cliente esteja usando a aplicação. As técnicas discutidas têm seus pontos fortes e fracos. Enquanto você deve sempre escolher a técnica que ajuda a cumprir seu objetivo da sprint e validar o incremento de forma eficaz, sempre se pondo no lugar do cliente na hora da validação.
  14. Download Acesse o portal da Oracle através do link www.oracle.com/technetwork/pt/java/javase/downloads/jre7-downloads-1880261.html e localize " Java SE Runtime Environment 7u79 ", aceite os termos de uso e clique sobre o " Windows x86 Offline " (realize o download da versão x86 mesmo que sua máquina seja x64). Instalação Após realizar o download clique com o botão direito sobre o ícone e vá em " Executar como administrador ". Siga todos os passos do instalador e aguarde até que termine a instalação. Testando Ambiente Para verificarmos se a instalação do Java ocorreu com sucesso pressione Windows + R ou vá em Iniciar -> Executar e digite “cmd”. Quando o prompt de comando for apresentado, digite “java -version”. Se você recebeu uma mensagem parecida com a mostrada abaixo seu ambiente já está devidamente configurado e pronto para uso. Caso contrário é necessário que realize os próximos passos. Configurando Ambiente Clique com o botão direito sobre o menu iniciar e clique em “Sistema”. Localize a opção “Configurações avançadas do sistema” e clique sobre ela. Selecione a aba “Avançado” e clique em “Variáveis de Ambiente…” Em “Variáveis do Sistema”, procure por “Path” e clique em “Editar”. Em “Valor da Variável” adicione o caminho onde seu Java foi instalado geralmente “C:\Program Files (x86)\Java\jre7\bin” ou adicione a pasta de atalhos criada pelo próprio instalador do Java, geralmente “C:\ProgramData\Oracle\Java\javapath”. Como estava seu PATH: %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\MongoDB\Server\3.0\bin;C:\Program Files\TortoiseSVN\bin;C:\Program Files\OpenVPN\bin;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\nodejs\ Como fica seu PATH: %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\MongoDB\Server\3.0\bin;C:\Program Files\TortoiseSVN\bin;C:\Program Files\OpenVPN\bin;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\nodejs\;C:\ProgramData\Oracle\Java\javapath Após realizar esse procedimento basta clicar em “OK” e reiniciar sua máquina. Realize o passo “Testando Ambiente” novamente para verificar se a mensagem é retornada corretamente. Agora seu ambiente está devidamente configurado e pronto para uso.
  15. Arquitetura Serverless, ou “computação sem servidores”, é uma arquitetura de computação orientada a eventos . Sua principal proposta é permitir que as empresas de software criem e mantenham seus aplicativos web sem se preocupar com a infraestrutura em que esses aplicativos estão rodando. Trata-se de um conceito relativamente novo, que ganhou popularidade devido aos serviços como AWS Lambda , Microsoft Azure , Google Cloud , entre outros. Antes da Arquitetura Serverless Para compreender o conceito da Arquitetura Serverless, é necessário compreender como surgiu a demanda por ela. Para isso, vamos analisar os paradigmas que precederam a Arquitetura Serverless. Infraestrutura In-house No início das aplicações web, era comum utilizar um hardware contendo um sistema operacional e a aplicação. Alguns chamam essa abordagem de “ infraestrutura in-house “. Em muitos casos, esse hardware era hospedado em um data center, e a software house pagava pelo espaço e infra que utilizava. Computação Cloud Tradicional Com o ganho de performance em virtualização de máquinas, começamos a trabalhar com a computação cloud . Na computação cloud tradicional, nossas aplicações ficam em máquinas virtuais onde era possível aumentar (upgrade) ou diminuir (downgrade) o poder de processamento. Atualmente, a maiorias das aplicações online estão em máquinas virtuais. Backend as a Service (BaaS) Com a evolução das provedoras de cloud , surgiu a oferta de serviços de backend já construído e distribuído, conhecido como “BaaS”. Desta forma, a software house pode concentrar seus recursos em regras de negócio de implementação, abstraindo as necessidades de infraestrutura. Não tão server less assim… Antes de mergulharmos de cabeça no magnífico conceito da arquitetura Serverless, precisamos desmistificar seu nome tendencioso. Serverless , traduzido literalmente do inglês, significa “sem servidor”. Isso não é verdade . A arquitetura Serverless ainda é baseada em servidores. Nela, porém, o desenvolvedor não precisa configurar ou se preocupar com a maioria dos aspectos da infraestrutura em que sua aplicação será rodada. Essas decisões dinâmicas de infraestrutura ficam ocultas para o desenvolvedor ou operador. Com essa possível confusão já desfeita, vamos ao que interessa. Arquitetura Serverless: Function as a Service (FaaS) Utilizando uma plataforma Serverless, o time de desenvolvimento da software house não precisa gerenciar a infraestrutura de servidores, como provisionamento, capacidade de processamento, sistemas de armazenamento, atualização dos servidores, entre muitas outras configurações recorrentes: todas essas funções ficam a cargo do provedor cloud. Com esse trabalho periférico mitigado, os desenvolvedores passam a ter mais mais tempo para se dedicar a suas funções primárias, entregando muito mais software em um mesmo período. Apesar de ser a vantagem mais óbvia da arquitetura Serverless, o tempo ganho pelo dev é apenas um dos destaques da arquitetura Serverless.
  16. Todo programador Delphi algum dia já precisou lidar com um erro de Access Violation aparecendo na tela de seu sistema. Esse tipo de erro é tão comum que já até ganhou o carinhoso apelido de “AV”. Estes erros, também conhecidos por falhas de segmentação , ocorrem quando alguma parte do software tenta acessar um endereço de memória inválido, ou que já esteja em uso. Os AV’s são erros que podem tirar o sono de um programador, pois apesar de serem – na maioria dos casos – simples de resolver, eles são muito difíceis de serem encontrados. Por ocorrerem apenas em tempo de execução, e às vezes aleatoriamente, a correção deste tipo de erro exige uma certa experiência do programador na linguagem. Uma maneira comum de ocorrer um AV é quando tentamos acessar um método de um objeto que ainda não foi instanciado. Neste caso a solução é simples, bastando instanciar o objeto corretamente para depois acessar seu método. Outra maneira, um pouco mais complicada, ocorre quando tentamos referenciar um ponteiro nulo. Traduzindo, podemos dizer que alguém tentou acessar algo que não existia mais, e assim ocorre o AV. Os AV’s são comuns de aparecer em recursões com criação dinâmica de objetos, ou quando liberamos um objeto com muitos outros vinculados a ele, por exemplo, quando fechamos um formulário. Ao tentar destruir o objeto principal, se algum dos objetivos vinculados já tiver sido destruído, o seu vínculo ao objeto principal ainda existirá. Por esse vínculo o sistema tenta destruir o objeto novamente, causando o AV. Nestes casos, é comum que os AV’s venham acompanhados de Memory Leaks, que causam um consumo exagerado de memória por parte do sistema, sem a posterior liberação da mesma. Um problema grave com os AV’s, e que tira o sono de programadores, é que na maioria das vezes eles são difíceis de serem reproduzidos. E quando um programador não consegue reproduzir um erro, o trabalho para corrigí-lo é muito maior. Para tentar minimizar este problema surgiram algumas ferramentas que ajudam programadores Delphi a encontrar os AV’s e corrigí-los. São as ferramentas de log de erros, como o MadExcept ou o EurekaLog . As duas fazem o mesmo trabalho de analisar os dados gerados pelo software e identificar pontos onde as falhas ocorrem, dando ao programador informação relevante para que ele possa encontrar o ponto no código no qual os erros estão ocorrendo. Estas ferramentas não são balas de prata que resolverão todos os casos, porém através delas o tempo gasto para encontrar e corrigir um Access Violation pode ser bem menor. Uma outra abordagem mais proativa é utilizarmos processos que garantam a qualidade de nosso software, como o Desenvolvimento Orientado a Testes (TDD) e a Integração Contínua. Ao utilizar estes processos em seu dia a dia o programador passa a ter ferramentas que garantem que os problemas de Access Violation e outros serão encontrados mais rapidamente, pois os testes são rodados a todo momento e quando um erro for injetado no código, ele será detectado quase que imediatamente.
  17. O Out Of Memory é um erro comumente relacionado ao Windows que é um grande desafio para desenvolvedores de software, principalmente os que atuam em aplicações que processam alta carga de requisições. Normalmente, este erro ocorre quando a aplicação consome mais memória que o limite máximo permitido pelo sistema operacional para o processo. Como e por que este erro ocorre? Nas aplicações 32 bits o limite máximo de consumo de memória permitido para um processo é de aproximadamente 2GB. Caso a aplicação se aproxime deste valor o Windows levanta uma exceção de OutOfMemory, obrigando que o software seja reiniciado para não comprometer o funcionamento do sistema. Outro fator que pode causar este erro é o uso da memória aplicação de maneira incorreta. Neste caso o software constantemente instancia e destrói vários objetos, causando problemas de fragmentação da memória. Após isso o Windows também não consegue liberar a memória de maneira correta, causando o estouro de memória. Um outro caso onde este erro ocorre é quando a memória da máquina é insuficiente para a execução de todos os processos. Inicialmente a aplicação começa a reportar erros de “Insufficient Memory For This Operation”, seguidos por erros de “Out Of Memory”. Em resumo, alguns cenários que podem causar este problema são: Instanciar objetos e não liberá-los da memória. Instanciar e destruir objetos a todo momento. Pouca memória disponível na máquina Como evitar este problema? Sempre que instanciar um objeto tenha certeza que o mesmo será finalizado. Nunca crie várias vezes o mesmo objeto que será utilizado, se possível utilize padrões de projeto como Singleton ou Pools de Objetos. Evite a fragmentação da memória. Crie aplicações cuja arquitetura seja escalável, pois toda aplicação possui um limite máximo. Utilize componentes que possuam uma boa gestão de memória
  18. Contingência DPEC A Declaração Prévia de Emissão em Contingência (DPEC) é alternativa de emissão de NF-e em contingência com o registro prévio do resumo das NF-e emitidas. O registro prévio das NF-e permite a impressão do DANFE em papel comum. A validade do DANFE está condicionada à posterior transmissão da NF-e para a SEFAZ de Origem. Configurando DPEC 1º) Inicialmente, se o ambiente de desenvolvimento for Delphi 7 ou superior, adicione o componente spdNFeDPEC em seu formulário e configure suas propriedades, caso a linguagem consuma o componente via Activex (OCX) declare no projeto a classe spdNFeDPECX. 2º) Altere a tag tpemis_B22 recebendo o valor 4 que é referente à contingência DPEC, lembrando que este tipo deve permanecer igual mesmo após o retorno dos serviços. 3º) Gere e assine a nota normalmente utilizando os métodos normais do componente, por exemplo spdNFe.AssinarNota . 4º) Depois que a nota estiver gerada e assinada, utiliza-se o método spdNFeDPEC.MontarDPEC onde o xml DPEC será montado apartir do XML normal gerado anteriormente. Esse XML DPEC deve ser assinado utilizando o método spdNFeDPEC.AssinarDPEC e finalmente enviado utilizando o método spdNFeDPEC.EnviarDPEC, onde este envio é feito para os servidores de Ambiente Nacional. Após a correção dos problemas técnicos o emitente deve enviar o arquivo XML normal(primeiro que foi gerado), pelo método spdNFe.EnviarNota e este será enviado para o SEFAZ de origem. 5º) No arquivo Config.ini já existe o bloco [NFE], por exemplo: [NFE] UF=PR CNPJ=0000000000000 ArquivoServidoresHom=“nfeServidoresHom.ini” DiretorioEsquemas=Esquemas\ DiretorioTemplates=Templates\ DiretorioLog=Log\ TipoCertificado=File NomeCertificado= VersaoManual=6.0 6º) Crie o bloco [DPEC] abaixo do [NFE], por exemplo: [DPEC] UF=PR CNPJ=00000000000000 ArquivoServidoresHom=“nfeServidoresHomDPEC.ini” DiretorioEsquemas=Esquemas\ DiretorioTemplates=Templates\ DiretorioLog=Log\ TipoCertificado=File NomeCertificado= VersaoManual=6.0 Impressão DPEC Para realizar a impressão de um DANFE em DPEC é importante seguir alguns passos: 1º) Gera-se a nota normalmente pelo spdNFeDataSets e assina pelo componente spdNFe . 2º) Montar o XML … //Gera o XML por DPEC mOutput.Text := spdNFeDPEC.MontarDPEC (mOutput.Text); //Assina o XML mOutput.Text := spdNFeDPEC.AssinarDPEC (mOutput.Text); … 3º) Envio DPEC … //Envia o XML mOutput.Text := spdNFeDPEC.EnviarDPEC (mOutput.Text,‘0001’); … 4º) Consulta o DPEC a partir do código retornado pelo ENVIO … //Consulta o DPEC mOutput.Text := spdNFeDPEC.ConsultarDPEC (pcRegDpec,‘910000000194131’); … 5º) Outra forma de consulta que pode ser utilizada pelo desenvolvedor é a consulta pela chave da Nota. … //Consulta o DPEC mOutput.Text := spdNFeDPEC.ConsultarDPEC (pcChaveNota,'91 0000000194131 '); … 6º) Com o retorno do envio do DPEC você já tem as tags. 2010-09-16T09:19:49 910000000194131 7º) Feito os passos anteriores você já pode imprimir o DANFE utilizando o método spdNFeDPEC.ImprimirDanfe conforme exemplo abaixo: … //Método que possibilita a impressão do DANFE spdNFeDPEC.ImprimirDanfe (mOutput.Text,‘910000000194131’,‘2010-09-16T09:19:49’); … 8º) DANFE DPEC impresso
  19. Quando ocorre? Ao tentar o envio da NFe. Como resolver? Em casos de mensagem OUT OF MEMORY: Primeiro, veja se a máquina é 64 bits, caso seja então pode haver problemas no uso da memória por aplicativos feitos para rodar em 32 bits, nesse caso clique em propriedades no executável e peça para executar em modo de compatibilidade windows xp, assim o acesso a memoria vai se como se fosse 32 bits. Segundo, veja também o arquivo de paginação do windows se esta grande o suficiente e se a unidade em que esta direcionado tem espaço suficiente. Terceiro, caso a máquina seja 32 bits e tenha bastante memória, inicialmente verifique o arquivo de paginação de memória ou memoria virtual do windows, geralmente definem ela no C:\ e a unidade que esta definida talvez possa não ter espaço para criação e manipulação dessa página de alocação de memoria. Caso nada funcione peça para que o cliente veja com um tecnico para que seja feito testes de memoria com um aplicativo benchmark, pode ser erro de leitura ou gravação.
  20. No mês de Setembro implementamos um conjunto de 59 novas regras de validação para o Auditor Fiscal, que agora passa a auditar XMLs de NF-e 3.10. As novas regras de validação implementadas foram: Rejeição Mensagem Regra de validação 254 NF-e complementar não possui NF referenciada Se NF-e complementar (tag:finNFe=2): – Não informado NF referenciada (NF-e, NFC-e, NF modelo 1) 255 NF-e complementar possui mais de uma NF referenciada – NF referenciada com mais de uma ocorrência (NF-e, NFC-e, NF modelo 1) 269 CNPJ Emitente da NF Complementar difere do CNPJ da NF Referenciada – CNPJ emitente da NF Referenciada difere do CNPJ emitente desta NF-e (NF-e, NFC-e, NF modelo 1) 274 Rejeição: Código Município do Destinatário: dígito inválido Se endereço destinatário não é no Exterior (dest/UF <> “EX"): – Código Município do destinatário com dígito verificador inválido 321 NF-e de devolução de mercadoria não possui documento fiscal referenciado Se NF-e de devolução de mercadoria (tag:finNFe=4): – Não informado documento fiscal referenciado (NF-e, NFC-e, NF modelo 1, NF Produtor, ECF) 322 NF-e de devolução de mercadoria com mais de um documento fiscal referenciado – Informado mais de um documento fiscal referenciado 327 CFOP inválido para NF-e com finalidade de devolução de mercadoria Para as NF-e com finalidade de devolução de mercadoria (tag:finNFe=4), somente serão aceitos CFOP de devolução de mercadoria. Observação: Vide relação de CFOP de devolução de mercadoria no Anexo XI.01.| |328|CFOP de devolução de mercadoria para NF-e que não tenha finalidade de devolução de mercadoria|Para as NF-e que não tem a finalidade de devolução de mercadoria (tag:finNFe <> 4), não serão aceitos CFOP de devolução de mercadoria. Observação: Vide relação de CFOP de devolução de mercadoria no Anexo XI.01.| |330|Informar o Valor da AFRMM na importação por via marítima|Informar o Valor da AFRMM na importação por via marítima (tag:tpViaTransp=1 e não existe tag:vAFRMM)| |331|Informar o CNPJ do adquirente ou do encomendante nesta forma de importação|Informar o CNPJ do adquirente ou do encomendante na importação por conta e ordem ou encomenda (tag:DI/tpIntermedio=2 ou 3)| |332|CNPJ do adquirente ou do encomendante da importação inválido|CNPJ do adquirente ou do encomendante inválido (zeros, nulo ou DV inválido)| |333|Informar a UF do adquirente ou do encomendante nesta forma de importação|Informar a UF do adquirente ou do encomendante na importação por conta e ordem ou encomenda (tag:DI/tpIntermedio=2 ou 3)| |334|Número do processo de drawback não informado na importação|Obrigatória a informação do número do processo de drawback na Adição (Declaração de Importação) para os CFOP: 3127, 3211| |336|Informado o grupo de exportação no item para CFOP que não é de exportação|Informado o grupo de Exportação (tag:detExport) para o Item, para CFOP que não é de exportação (CFOP não inicia por 3 ou 7).| |337|Não informado o grupo de exportação no item|Grupo de Exportação (tag:detExport) obrigatório para os CFOP: 3127, 3211, 3503, 7127, 7211, 7501| |338|Número do processo de drawback não informado na exportação|Obrigatória informação do número do processo de drawback para CFOP: 7127: Venda de produção do estabelecimento sob o regime de drawback 7211: Devolução de compras p/ industrialização sob o regime de drawback| |340|Não informado o grupo de exportação indireta no item|Grupo de controle para a Exportação Indireta (tag:detExport/exportInd) não informado para os CFOP: 3503, 7501| |342|Chave de Acesso informada na Exportação Indireta com DV inválido|Chave de Acesso na exportação indireta (tag:exportInd/chNFe): – Dígito Verificador da Chave de Acesso inválido| |343|Modelo da NF-e informada na Exportação Indireta diferente de 55|– Modelo da Chave de Acesso diferente de 55| |349|Número RECOPI não informado|Se não informado o número do RECOPI (tag:nRECOPI, id:LB01) – Se Papel Imune (CST=41 ou CSOSN=300) e – NCM papel (ver relação NCM no Anexo XII.01)| |350|Número RECOPI inválido|Informado número do RECOPI: – Número do RECOPI inválido (Ver Anexo X, Identificador RECOPI)| |355|Informar o local de saída do Pais no caso da exportação|Não informado o local embarque ou de transposição de fronteira (tag:exporta) na operação de exportação (tpNF=1 e idDest=3)| |356|Informar o local de saída do Pais somente no caso da exportação|Informado o local embarque ou de transposição de fronteira (tag:exporta) em operação que não é de exportação (tpNF=0 ou idDest<>3)| |362|Venda de combustível sem informação do Transportador|Obrigatória a informação de identificação do Transportador para os CFOP de venda de combustível (tag: CNPJ/CPF, id:X04/X05) Nota: Vide relação de CFOP de combustível com obrigatoriedade de informações do transportador no Anexo XI.02. Exceção 1: A regra de validação acima se aplica somente para as NF-e com Finalidade de Emissão normal (tag:finNFe=1); Exceção 2: A regra de validação acima se aplica somente para os Códigos de Produto ANP relacionados no Anexo III.01; Observação: Nos casos em que não houver circulação física de mercadoria ou que esta circulação se realize por modal dutoviário, os dados do transportador poderão ser preenchidos com o CNPJ do próprio emitente do documento fiscal.| |364|Total do valor da dedução do ISS difere do somatório dos itens|Total do valor da dedução (id:W22b) difere do somatório dos itens (id:U07)| |365|Total de outras retenções difere do somatório dos itens|Total de outras retenções (id:W22c) difere do somatório dos itens (id:U08)| |366|Total do desconto incondicionado ISS difere do somatório dos itens|Total do desconto incondicionado ISS (id:W22d) difere do somatório dos itens (id:U09)| |367|Total do desconto condicionado ISS difere do somatório dos itens|Total do desconto condicionado ISS (id:W22e) difere do somatório dos itens (id:U10)| |368|Total de ISS retido difere do somatório dos itens|Total de ISS retido (id:W22f) difere do somatório dos itens (id:U11)| |369|Não informado o grupo avulsa na emissão pelo Fisco|Não informado grupo “avulsa” na emissão de Nota Fiscal pelo Fisco (tag:procEmi=1 ou 2)| |370|Nota Fiscal Avulsa com tipo de emissão inválido|Se Processo de Emissão pelo Fisco (procEmi=1 ou 2): Tipo de Emissão difere de 1-Emissão Normal (tpEmis<>1)| |461|Informado percentual de Gás Natural na mistura para produto diferente de GLP|Informado percentual de Gás Natural na mistura (tag:pMixGN) para produto diferente de “210203001 – GLP” (tag:cProdANP)| |509|Informado código de município diferente de “9999999” para operação com o exterior|Se endereço destinatário no Exterior (dest/UF = “EX”): – Código Município do destinatário difere de “9999999”| |510|Operação com Exterior e Código País destinatário é 1058 (Brasil) ou não informado|Se operação com Exterior (tag:idDest = 3): Código País do destinatário = 1058 (Brasil), ou não informado| |511|Não é de Operação com Exterior e Código País destinatário difere de 1058 (Brasil)|Se não é operação com Exterior (tag:idDest <> 3) e informado Código País do destinatário: – Código País do destinatário difere de 1058 (Brasil)| |523|CFOP não é de Operação Estadual e UF emitente igual à UF destinatário|CFOP é de operação interestadual (inicia por 2 ou 6) e UF emitente = UF destinatário e CNPJ/CPF emissor diferente do CNPJ/CPF destinatário (NT 2010/004) Exceção: Se a tag UFCons (id:LA06) foi informada com UF diversa do emitente: CFOP iniciado com 2 ou 6 é válido. (NT 2010/010)| |626|CFOP de operação isenta para ZFM diferente do previsto|Se informado tag:motDesICMS = 7 (desoneração Suframa): – deve ser informado um dos CFOP abaixo: 1203, 1204, 1208, 1209, 2203, 2204, 2208, 2209, 5109, 5110, 5120, 5151, 5152, 5651, 5652, 5654, 5655, 5658, 5659, 6109, 6110, 6120, 6122, 6123, 6151, 6152, 6651, 6652, 6654, 6655, 6658, 6659 (NT 2012/003)| |663|Alíquota do ICMS com valor superior a 4 por cento na operação de saída interestadual com produtos importados|Validação alíquota do ICMS na operação interestadual de produtos importados (NT 2012/005 e NT2013/006): CFOP de operação de saída para outra UF (inicia por 6) e IE do destinatário difere de “ISENTO” ou nulo; Origem da mercadoria = 1, 2, 3 ou 8; CST de ICMS = 00, 10, 20, 70 ou 90; Data de Emissão igual ou superior a 01/01/2013; Valor alíquota do ICMS maior do que “4.00” (4 por cento). Exceção 1: A regra acima não se aplica para as operações de Retorno / Devolução, com os CFOP: 6201, 6202, 6208, 6209, 6210, 6410, 6411, 6412, 6413, 6503, 6553, 6555, 6556, 6660, 6661, 6662, 6664, 6665, 6902, 6903, 6906, 6907, 6909, 6913, 6916, 6918, 6919, 6921, 6925 Exceção 2: A regra de validação acima não se aplica para operação com gás natural importado (cProdANP= 220101003, 220101004, 220101002, 220101001, 220101005 ou 220101006). Exceção 3: A regra de validação acima não se aplica na venda de veículos novos (grupo “veicProd”), para a Venda direta para grandes consumidores (tpOp=3), ou para Faturamento direto para consumidor final (tpOp=2). Exceção 4: Mesmo que informada a IE do destinatário, a regra de validação acima não se aplica para as operações com os CFOP 6107, 6108 (Não Contribuinte). Exceção 5: A regra de validação acima não se aplica para a NF Complementar (finNFe=2) quando: se referenciada uma NF-e, a NF-e referenciada tem a Data de Emissão anterior a 01/01/13; se referenciada uma NF modelo 1, a Data de Emissão é anterior a 1301 (tag refNF/AAMM). Exceção 6: Mesmo que informada a IE do destinatário, a regra de validação acima não se aplica para as operações com o CFOP 6.929 - Lançamento relativo a operação registrada em Cupom Fiscal (NT 2013/004)) Exceção 7: A regra de validação acima não se aplica para destinatário não contribuinte (tag:dest/indIEDest=9).| |678|NF referenciada com UF diferente da NF-e complementar|– UF da NF-e referenciada diferente da UF do emitente (NF-e, NFC-e, NF modelo 1) (NT 2013/003)| |679|Modelo da NF-e referenciada diferente de 55|Se informada uma NF-e referenciada (tag:refNFe): – Modelo da NF-e referenciada diferente de 55 / 65 (NT 2013/003)| |710|NF-e com formato de DANFE inválido|NF-e com tipo de impressão 4 ou 5 (tag:tpImp= 4 ou 5)| |711|NF-e com contingência off-line|NF-e com contingência off-line (tag:tpEmis=9)| |720|Na operação com Exterior deve ser informada tag idEstrangeiro|Se Operação com Exterior (tag:idDest = 3): – Deve ser informada tag idEstrangeiro (conteúdo da tag pode ser nulo)| |721|Operação interestadual deve informar CNPJ ou CPF.|Se Operação interestadual (tag:idDest = 2): – Não pode informar tag idEstrangeiro| |723|Operação interna com idEstrangeiro informado deve ser para consumidor final|Se Operação dentro do Estado (tag:idDest = 1): – Se informado “idEstrangeiro”, operação deve ser de consumidor final (tag:infFinal <> 1)| |727|Operação com Exterior e UF diferente de EX|Se endereço destinatário no Exterior (dest/UF = “EX”): – UF de destino diferente de “EX”| |728|NF-e sem informação da IE do destinatário|NF-e com indicação de Destinatário Contribuinte do ICMS (tag:dest/indIEDest=1), sem informar a IE (tag:dest/IE)| |731|CFOP de operação com Exterior e idDest <> 3|CFOP de operação com Exterior (inicia por 3 ou 7) e idDest <> 3| |732|CFOP de operação interestadual e idDest <> 2|CFOP de operação interestadual (inicia por 2 ou 6) e idDest <> 2| |733|CFOP de operação interna e idDest <> 1|CFOP de operação interna (inicia por 1 ou 5) e idDest <> 1| |771|Operação Interestadual e UF de destino com EX|Se operação Interestadual (tag:idDest = 2): UF de destino não pode ser “EX”| |772|Operação Interestadual e UF de destino igual à UF do emitente|Se operação Interestadual (tag:idDest = 2): – UF de destino igual à UF do emitente Exceção: Não rejeitar se existir algum item com a tag UFCons (id:L120) diversa da UF do emitente.| |773|Operação Interna e UF de destino difere da UF do emitente|Se operação Interna no Estado (tag:idDest = 1) e operação não é com Consumidor final: – UF de destino difere da UF do emitente| |790|Operação com Exterior para destinatário Contribuinte de ICMS|Se operação com Exterior (tag:idDest=3): – Indicação de IE Destinatário diferente “Não Contribuinte” (tag:indIEDest <> 9)| |791|NF-e com indicação de destinatário isento de IE, com a informação da IE do destinatário|NF-e com indicação de Destinatário Contribuinte Isento de IE (tag:dest/indIEDest=2), mas com informação da IE (tag:dest/IE)| |792|Informada a IE do destinatário para operação com destinatário no Exterior|Se informada a IE do Destinatário: – Não informar a IE do Destinatário se endereço do destinatário no Exterior (tag:dest/enderDest/UF=”EX”)| |793|Informado Capítulo do NCM inexistente|Se informado Capítulo do NCM (2 posições): – Capítulo do NCM inválido (77, 98, 99)| |794|NF-e com indicativo de NFC-e com entrega a domicílio|NF-e com indicativo de NFC-e com entrega a domicílio (tag:indPres=4)| |795|Total do ICMS desonerado difere do somatório dos itens|Total do ICMS desonerado (id:W04a) difere do somatório do valor dos itens (id:N27a).|
  21. 5. Contingências O Modo de Emissão em Contingência trata-se da forma pela qual se permite a emissão de uma Nota Fiscal Eletrônica, mesmo quando o software emissor não conseguir efetuar conexão com os webservices da SEFAZ do estado do contribuinte, (também chamada SEFAZ-Origem). O sistema de recepção de NF-e foi desenvolvido para oferecer aos contribuintes uma alta disponibilidade, de modo a atender as solicitações quase que instantaneamente. Mas, há situações em que podem ocorrer falhas de conexão entre o sistema emissor de NF-e e os webservices da SEFAZ. Como o processo do contribuinte vendedor não pode parar, e o contribuinte comprador necessita receber a(s) mercadoria(s), é possível a emissão da Nota Fiscal Eletrônica em Modo de Contingência. Leia antes de prosseguir: Nota 1 : A Tecnospeed aconselha que independente do tipo de contingência escolhida pelo desenvolvedor, os testes sejam feitos previamente em Ambiente de Homologação. A seguir, estaremos listando os tipos de contingências e demonstrando como fazer o uso das mesmas. 5.1. Contingência FS A contingência com uso do Formulário de Segurança é a alternativa mais simples para a situação em que exista algum impedimento para obtenção da autorização de uso da NF-e, como por exemplo, um problema no acesso à internet ou a indisponibilidade da SEFAZ de origem do emissor. Neste caso, o emissor pode optar pela emissão da NF-e em contingência com a impressão do DANFE em Formulário de Segurança. O envio das NF-e emitidas nesta situação para SEFAZ de origem será realizado quando cessarem os problemas técnicos que impediam a sua transmissão. Somente as empresas que possuam estoque de Formulário de Segurança poderão utilizar este impresso fiscal para a emissão do DANFE. Uma regra importante a ser enfatizada é que a a NF-e deverá ser enviada com o tipo FS para a Sefaz assim que cessarem os problemas técnicos que impediram a sua transmissão, até o prazo limite de 168 h. 5.1.1. Configurando FS Inicialmente, altere a tag tpemis_B22 recebendo o valor 2 sendo que, este tipo deve permanecer igual, mesmo após o retorno dos serviços. A chamada dos métodos continuam iguais, por exemplo spdNFe.AssinarNota . O que muda é o andamento do processo, pois logo após assinar a nota o DANFE já deve ser gerado, utilizando também o mesmo método para impressão, por exemplo spdNFe.ImprimirDanfe. O componente não guarda o arquivo XML da nota, então esta função fica a cargo do ERP, ele deve guardar o XML no banco para assim que os problemas de conexão for resolvido esse xml ser enviado a receita, também utilizando os mesmos métodos do ambiente normal. 5.1.2. Exemplo de DANFE emitido em FS 5.2. Contingência FS-DA FS-DA - Contingência com uso do Formulário de Segurança para impressão de Documento Auxiliar do Documento Fiscal eletrônico (FS-DA), trata-se de um modelo operacional similar ao modelo operacional da contingência, com uso de Formulário de Segurança – FS. A diferença é que o FS-DA foi criado para aumentar a capilaridade dos pontos de venda do Formulário de Segurança com a criação da figura do estabelecimento distribuidor do FS-DA que poderá adquiri-lo dos fabricantes para então distribuí-lo para os emissores de NF-e de sua região. 5.2.1. Configurando FS-DA Inicialmente, altere a tag tpemis_B22 recebendo o valor 5 sendo que, este tipo deve permanecer igual mesmo após o retorno dos serviços. A chamada dos métodos continuam iguais, por exemplo spdNFe.AssinarNota. O que muda é o andamento do processo, pois logo após assinar a nota, o DANFE já deve ser gerado, utilizando também o mesmo método para impressão, por exemplo spdNFe.ImprimirDanfe. O componente não guarda o arquivo XML da nota, então esta função fica a cargo do ERP. Este deve guardar o XML no banco para que, assim que os problemas de conexão forem resolvidos,o xml seja enviado à receita utilizando também os mesmos métodos do ambiente normal. 5.3. Contingência DPEC A Declaração Prévia de Emissão em Contingência (DPEC) é alternativa de emissão de NF-e em contingência com o registro prévio do resumo das NF-e emitidas. O registro prévio das NF-e permite a impressão do DANFE em papel comum. A validade do DANFE está condicionada à posterior transmissão da NF-e para a SEFAZ de Origem. 5.3.1. Configurando DPEC 1º) Inicialmente, se o ambiente de desenvolvimento for Delphi 7 ou superior, adicione o componente spdNFeDPECem seu formulário e configure suas propriedades, caso a linguagem consuma o componente via Activex (OCX) declare no projeto a classe spdNFeDPECX. 2º) Altere a tag tpemis_B22 recebendo o valor 4 que é referente à contingência DPEC, lembrando que este tipo deve permanecer igual, mesmo após o retorno dos serviços. 3º) Gere e assine a nota normalmente utilizando os métodos normais do componente, por exemplo, spdNFe.AssinarNota. 4º) Depois que a nota estiver gerada e assinada, utiliza-se o método spdNFeDPEC.MontarDPEC, onde o xml DPEC será montado apartir do XML normal gerado anteriormente. Esse XML DPEC deve ser assinado utilizando o método spdNFeDPEC.AssinarDPEC, e finalmente enviado utilizando o método spdNFeDPEC.EnviarDPEC ,onde este envio é feito para os servidores de Ambiente Nacional. Após a correção dos problemas técnicos, o emitente deve enviar o arquivo XML normal,(primeiro que foi gerado), pelo método spdNFe.EnviarNota e este será enviado para o SEFAZ de origem. 5º) No arquivo Config.ini já existe o bloco [NFE], por exemplo: [NFE] UF=PR CNPJ=0000000000000 ArquivoServidoresHom="nfeServidoresHom.ini" DiretorioEsquemas=Esquemas\ DiretorioTemplates=Templates\ DiretorioLog=Log\ TipoCertificado=File NomeCertificado= VersaoManual=3.0 6º) Crie o bloco [DPEC] abaixo do [NFE], por exemplo: [DPEC] UF=PR CNPJ=00000000000000 ArquivoServidoresHom="nfeServidoresHomDPEC.ini" DiretorioEsquemas=Esquemas\ DiretorioTemplates=Templates\ DiretorioLog=Log\ TipoCertificado=File NomeCertificado= VersaoManual=3.0 5.3.2. Impressão DPEC Para realizar a impressão de um DANFE em DPEC é importante seguir alguns passos: 1º) Gera-se a nota normalmente pelo spdNFeDataSets e assina pelo componente spdNFe . 2º) Montar o XML ... //Gera o XML por DPEC mOutput.Text := spdNFeDPEC.MontarDPEC (mOutput.Text); //Assina o XML mOutput.Text := spdNFeDPEC.AssinarDPEC (mOutput.Text); ... 3º) Envio DPEC ... //Envia o XML mOutput.Text := spdNFeDPEC.EnviarDPEC (mOutput.Text,'0001'); ... 4º) Consulta o DPEC a partir do código retornado pelo ENVIO ... //Consulta o DPEC mOutput.Text:= spdNFeDPEC.ConsultarDPEC (pcRegDpec,'910000000194131'); ... 5º) Outra forma de consulta que pode ser utilizada pelo desenvolvedor é a consulta pela chave da Nota. ... //Consulta o DPEC mOutput.Text := spdNFeDPEC.ConsultarDPEC (pcChaveNota,'91 0000000194131 '); ... 6º) Co m o retorno do envio do DPEC você já tem as tags. <dhRegDPEC> 2010-09-16T09:19:49 </dhRegDPEC> <nRegDPEC> 910000000194131 </nRegDPEC> 7º) Feito os passos anteriores você já pode imprimir o DANFE, utilizando o método spdNFeDPEC.ImprimirDanfe conforme exemplo abaixo: ... //Método que possibilita a impressão do DANFE spdNFeDPEC.ImprimirDanfe(mOutput.Text,'910000000194131','2010-09- 16T09:19:49'); ... 5.4. Contingência SCAN O Sistema de Contingência do Ambiente Nacional (SCAN), é a alternativa de emissão da NF-e em contingência com a transmissão da NF-e para o Sistema de Contingência do Ambiente Nacional (SCAN). Nesta modalidade de contingência, o DANFE pode ser impresso em papel comum e não há necessidade de transmissão da NF-e para SEFAZ de origem quando cessarem os problemas técnicos que impediam a transmissão. Além do uso de série específica reservada para o SCAN (série 900-999), o Sistema de Contingência do Ambiente Nacional depende de ativação da SEFAZ de origem, o que significa dizer que o SCAN só entra em operação quando a SEFAZ de origem estiver com problemas técnicos que impossibilitarem a recepção da NF-e. 5.4.1. Configurando o SCAN 1º) Para habilitar o modo SCAN deve-se incialmente, no caso de seu ambiente de desenvolvimento for o Delphi 7 ou superior, adicionar o componente spdNFeSCAN em seu formulário e configurar as propriedades.Caso a linguagem consuma o component via ActiveX (OCX), declare no projeto a classe spdNFeSCANX. 2º) Configure as propriedades deste componente, lembrando principalmente que a série das notas no Component Tecnospeed SCAN são de 900 a 999. 3º) Apartir de agora todos os métodos que você utilizar, por exemplo spdNFe.EnviarNota, serão no modo SCAN, ficando spdNFeSCAN.EnviarNota , e assim será com a assinatura, verificação de status, entre outros. 4º) Na tag tpemis_B22 passe o valor 3, que é a contingência SCAN. 5º) No arquivo Config.ini já existe o bloco [NFE], por exemplo: [NFE] UF=PR CNPJ=0000000000000 ArquivoServidoresHom="nfeServidoresHom.ini" DiretorioEsquemas=Esquemas\ DiretorioTemplates=Templates\ DiretorioLog=Log\ T ipoCertificado=File NomeCertificado= VersaoManual=3.0 6º) Crie o bloco [SCAN] abaixo do [NFE], por exemplo: [SCAN] UF=PR CNPJ=00000000000000 ArquivoServidoresHom="nfeServidoresHomSCAN.ini" DiretorioEsquemas=Esquemas\ DiretorioTemplates=Templates\ DiretorioLog=Log\ TipoCertificado=File NomeCertificado= VersaoManual=3.0 5.4.2. Cancelamento de NFe em SCAN Funcionalidade que permite o envio de uma solicitação de Cancelamento de uma NFe como um evento. Exemplo: _ReturnValue := CancelarNFeEvento(aNotaID, aNumProtocolo,aJustificativa, aDataHoraEvento, aSequenciaEvento, aFusoHorario, aIdLote); Onde: aNotaID: Chave de Identificação da NF. aNumProtocolo: Número do Protocolo de registro da NF, que deve conter exatamente 15 dígitos. aJustificativa: Texto (mínimo 15 dígitos) para descrição do Motivo de cancelamento da NF. aDataHoraEvento: Data e Hora do evento. aSequencia: Número sequêncial do evento (Passar 1). aFusoHorario: Fuso horário. aIdLote: Trata-se do número de identificação do Lote. Este campo pode ser utilizado para controle interno do ERP. 5.5. Contingência SVC A nota técnica 2013/007 trás o novo ambiente de autorização em contingência do sistema NF-e, denominado SVC - SEFAZ VIRTUAL DE CONTINGÊNCIA. Este novo modelo, que veio para substituir o SCAN e DEPEC, nada mais é que a criação de um lote de notas idêntico ao ambiente normal mas enviado a um servidor virtual localizado em outra região, quando a SEFAZ autorizadora estiver fora do ar ou em manutenção. No total, existem dois servidores virtuais SVC: SVC-AN - SEFAZ Virtual do Ambiente Nacional; SVC-RS - SEFAZ Virtual do Rio Grande do Sul. A vantagem deste modo de contingência é que não há necessidade do envio da mesma nota, a SEFAZ autorizadora quando estiver em funcionamento, e o DANFE é impresso em papel comum. A NT 2013/007 específica a seguinte divisão dos estados em relação aos servidores Virtuais: I - pela Sefaz Virtual do Ambiente Nacional, disponibilizada pela Secretaria da Receita Federal do Brasil, para os Estados do Acre, Alagoas, Amapá, Minas Gerais, Paraíba, Rio de Janeiro, Rio Grande do Sul, Rondônia, Roraima, Santa Catarina, Sergipe, São Paulo e Tocantins e para o Distrito Federal; e II - pela Sefaz Virtual do Rio Grande do Sul, disponibilizada pelo Estado do Rio Grande do Sul, para os estados do Amazonas, Bahia, Ceará, Espírito Santo, Goiás, Maranhão, Mato Grosso, Mato Grosso do Sul, Pará, Pernambuco, Piauí, Paraná e Rio Grande do Norte. 5.5.1. Componente NFe: Contingência SVC O grande diferencial da contingência SVC para as demais (SCAN e DEPEC) é a simplicidade, pois não há necessidade de números de séries diferentes ou mudanças no formato do XML. No componente NFe, para efetuar o envio de notas em SVC basta apenas três simples passos: Alterar a propriedade Modo Operação; Alterar o campo tpEmis_B22 do arquivo TX2 ou DataSet; e Preencher os campos dhCont_B28 e xJust_B29. A propriedade ModoOperacao possui três valores definidos: moNormal, moSVCAN e moSVCRS . Então basta setar a SEFAZ virtual desejada ou manter no modo Normal para envio à SEFAZ autorizadora. Esta propriedade também aceita valores em formato string: ‘Normal’, ‘SVCAN’ ou ‘SVCRS’. O campo tpEmis_B22 deve receber o valor “6”, caso a SEFAZ virtual seja o Ambiente Nacional (SVCAN) ou “7”, caso seja a SEFAZ virtual do Rio Grande do Sul (SVCRS), conforme legislação que define qual UF está vinculada a cada uma das SVC. Até o momento o envio SVC só esta liberado para a versão manual 5.0, pois a SEFAZ não liberou os links dos WebServices nas outras versões.
  22. Quando ocorre? Ao enviar uma NFe. Como resolver? Certifique-se de que o certificado está instalado corretamente e que o componente esta usando o certificado correto Se for certificado A3, insira TipoCertificado=SMART_CARD_USER_STORE no arquivo nfeConfig.ini, se preferir embaixo da linha escrita NomeCertificado= Se for A1 podem ocorrer duas situações Existem vários certificados instalados, remova os que não são necessários. O usuário instalou o certificado com uma conta do windows e está tentando acessá-lo com outra. Veja usando o arquivo ListarCertificado.msc, no menu a esquerda Certificados - usuário atual -> Pessoal -> Certificados, veja se tem algum certificado com algum momento com escrita [ERRO] algo deste nível, caso existir exclua e não precisa salvar depois que sair do programa.
  23. Você certamente ficará surpreso com o poder que essa ferramenta possuí mas também irá entender que ele exige muito trabalho pra que tudo fique bem no fim do dia. Bem, Protractor nada mais é que - em tradução livre - um framework de teste end-to-end para aplicações AngularJS . Ele executa testes contra seu aplicativo em execução em um navegador real, interagindo com ele como um usuário faria ( http://angular.github.io/protractor/#/ 1 ). Em suma ele substitui aquele bom e velho checklist que alguém da sua equipe gasta um tempo pra fazer, ou seja, significa redução de custos e de tempo pra sua empresa, ainda mais se você utilizar ele em conjunto com um servidor de integração contínua, como o Jenkins por exemplo ( mas isso é pra um outro post). O Protractor usa algumas tecnologias pra fazer a sua mágica, são elas: Jasmine : ferramenta de testes de comportamento para javascript, é com ele que você irá escrever seus testes ( http://jasmine.github.io/ ); Webdriver : basicamente automatiza processos em navegadores, é ele quem obedece o Jasmine e clica, preenche e interage com a sua aplicação como se fosse um usuário ( https://github.com/angular/protractor ). NodeJS : uma linguagem baseada no V8 JavaScript Engine , orientada a eventos e feita para ser facilmente escalável, é a tecnologia em que o Protractor foi escrito ( https://nodejs.org/ ). Agora, antes que fique chato demais, vamos a prática… PARTE 1 - Criar a aplicação a ser testada Vamos pegar uma aplicação de exemplo do AngularJS mesmo, o mais simples, segue: <!doctype html> Name: Hello {{yourName}} ! Crie uma pasta no lugar de sua preferência com o nome de protractortest e salve esse arquivo com o nome index.html . Abra index.html no navegador pra garantir que a aplicação funciona. PARTE 2 - Definindo e baixando as dependências Crie um arquivo chamado package.json na raiz da aplicação com o seguinte conteúdo: { “name” : “protractortest”, “version” : “0.0.1”, “private” : true, “scripts” : { “start” : “cls & http-server -p 8888 -c-1”, “update-webdriver” : “webdriver-manager update”, “test” : “protractor protractor.conf.js” }, “dependencies” : { “protractor” : “^1.6.1”, “http-server” : “^0.8.0” } } Caso não tenha o NodeJS instalado, faça isso agora https://nodejs.org/download/ E instale o protractor globalmente: via linha de comando, execute ‘npm install -g protractor’ Para, enfim, baixar as dependências da aplicação execute via linha de comando na pasta da aplicação o comando ‘npm install’ , caso dê algum erro tente executar como sudo (Linux) ou Administrador (Windows). PARTE 3 - Configurando tudo Crie o arquivo de configuração do protractor (protractor.conf.js) na raiz da sua aplicação, conforme exemplo abaixo: exports . config = { specs : [ ‘./tests/test.js’, ], capabilities : { ‘browserName’ : ‘chrome’ }, baseUrl : ‘http://localhost:8888/’, framework : ‘jasmine’, jasmineNodeOpts : { showColors : false, isVerbose: true, includeStackTrace: true }, directConnect : true, onPrepare : function () { browser . manage (). window (). maximize (); } }; Via linha de comando, na pasta raiz da aplicação, digite ‘npm run update-webdriver’ , isso irá instalar o Webdriver e o driver para o navegador escolhido e assim estaremos prontos para rodar os testes, mas calma, ainda precisamos escrever um… PARTE 4 - Escrevendo testes Crie uma pasta chamada tests e crie nela um arquivo chamado test.js , nele adicione o seguinte conteúdo: describe ( ‘Meu primeiro teste usando Protractor’ , function () { it ( ‘Acessando aplicação’ , function () { browser . get ( ‘http://localhost:8888/’ ); }); it ( ‘Escrevendo no input’ , function () { var name = ‘o meu nome é Teste, obrigado por me usar…’; var elementName = element ( by . model ( ‘yourName’ )); var elementResponse = element ( by . css ( ‘h1’ )); elementName . sendKeys ( name ); browser . sleep ( 2000 ); // essa linha não é necessária, serve apenas para que você veja a mágica acontecendo expect ( elementResponse . getText ()). toEqual ( 'Hello ’ + name + ‘!’ ); }); }); FINAL - Rodando os testes Novamente, via linha de comando e na pasta raiz da aplicação, digite ‘npm start’ para subir a aplicação no http://localhost:8888 , em seguida, em outro terminal, digite ‘npm test’ e espere a mágica acontecer… 2 tests , 1 assertion , 0 failures Deu certo? Ótimo! Nesse momento feche os olhos e imagine o quanto isso pode melhorar a sua vida e a qualidade dos seus produtos, agora abra-os, dê aquele sorriso, respire fundo e ao trabalho meu jovem!! Obrigado por ter lido até aqui, compartilhe em tudo quanto é lugar, afinal, o mundo precisa saber disso… Pronto p.s.: por favor, se não deu certo e você não teve sucesso, não desista… Deixe suas dúvidas (ou sugestões) nos comentários que eu terei o prazer de responder e ajudar se preciso. https://tsdn.tecnospeed.com.br/files/render/a/rTxaDtkw3uI/m/2Aal0HUq8WcsUkGJHDOIuxVL8QzTBMkNxmuPYT_WmSuXEgQQRC-pbFfCjQ-w5CdWBzI2RQIb0hw https://tsdn.tecnospeed.com.br/files/render/a/rTxaDtkw3uI/m/2Aal0HUq8WedKCXJ1JSNv1OfknRZ-46y6wruSOGq_PabPw9DYhxqofc-LSRHEma7yUhKzgvtKY4
  24. Neste post vamos conhecer um pouco do setor de desenvolvimento da Tecnospeed. Este, que é o responsável por prover os produtos que a empresa disponibiliza ao mercado e que ajudaram a tornar esta empresa, referência no cenário nacional, quando o assunto é documentos fiscais eletrônicos. Processo bem definido e certificado Desde a sua fundação, o desenvolvimento da Tecnospeed utiliza a metodologia ágil Scrum, como um dos pilares fundamentais para sustentar a produção de software de forma rápida e incremental, sem comprometer a qualidade dos produtos. Qualidade aliás, que é um item não negociável dentro da empresa. Com o crescimento rápido da empresa, ficou evidente que, buscar a excelência nos processos de desenvolvimento traria sustentabilidade para a empresa no mercado, pois nosso diferencial seria preservado. Com isso, a empresa em meados de 2011 iniciou um processo de certificação internacional chamado CMMI, que foi conquistado no ano seguinte. "Mais software, menos esforço" De nada nos adiantaria ter um processo bem definido, se cada um aqui dentro remasse para um lado diferente. Por isso todos os nossos desenvolvedores tem como norte a missão. O resultado disso pode ser visto nos recursos dos produtos disponibilizados, como é o caso do Padrão Único para emissão da NFS-e (Nota Fiscal de Serviço Eletrônica), onde através de um único layout de arquivo é possível integrar-se as mais diversas prefeituras do país, evitando que o desenvolvedor, tenha mais essa preocupação. Sempre atualizados Além do mais, como nossas soluções atuam em um processo tão crítico das empresas que é o faturamento, nossa preocupação em manter os produtos sempre atualizados com a legislação é constante. Por este motivo, procuramos ser proativos analisando cada Nota Técnica liberada pelo governo e publicamos um Parecer Técnico avisando a nossa rede das mudanças que estão por vir e o mais rápido possível, disponibilizamos as versões dos nossos produtos compatibilizados com a regulamentação em questão. Também procuramos nos manter atualizados em relação as novas tecnologias, para que nossa rede tenha sempre a disposição um produto capaz de acompanhar a evolução tecnológica que o setor exige. Uma prova disso é a nova versão do gerenciador de documentos eletrônicos lançada recentemente. Essa evolução tecnológica só é possível, pois a Tecnospeed conta com uma equipe altamente qualificada, que se capacita constantemente, tanto através de treinamentos externos, quanto, através do programa de capacitação interno. Todos os documentos eletrônicos Pensando em proporcionar uma maior comodidade para o desenvolvedor de software, a Tecnospeed, possui várias formas de integração para todos os documentos fiscais eletrônicos. Por isso conseguimos atender a mais de 900 software houses em todos o país, que utilizam as mais diversas linguagens de programação e dos mais diversos portes.
  25. Esse artigo tem como objetivo explicar o que é o modelo de padrão único de nota fiscal de serviços (NFS-e) oferecido pelo Componente NFSe da Tecnospeed, e quais são as vantagens em usá-lo. Cenário atual da NFS-e Para se entender o problema abordado pelo Padrão Único, primeiramente é necessário se explicar como está o cenário de NFS-e atualmente. Existem no momento inúmeros sistemas de NFS-e empregados pelos munícipios, cada um com seu modelo de comunicação de dados. Nós da Tecnospeed costumamos nomeá-los de acordo com seu fabricante ou, no caso dos padrões desenvolvidos pela própria prefeitura do município, o próprio nome do município ou órgão municipal que o desenvolveu. Alguns dos mais conhecidos são Ginfes, Betha, Ábaco, IssNetOnline, SIGISS, Simpliss, GovBR, dentre outros. Existe também um padrão criado pelo próprio governo federal, mais precisamente pela Associação Brasileira das Secretarias de Finanças das Capitais (ABRASF), que desenvolveu um padrão que tinha como objetivo servir de base para todos os sistemas de NFS-e. Naturalmente nós o chamamos de padrão ABRASF. Não vou me alongar nos detalhes desse padrão, mas vale citar que esse modelo especificava o esquema dos XMLs usados em toda a comunicação entre os ERPs e o sistema de NFS-e da prefeitura. De fato, muitos dos padrões de NFS-e são baseados no padrão ABRASF, porém, pelo fato de o padrão ABRASF não ser mandatório, mas sim apenas um modelo conceitual, existem os que são bastante diferentes, tanto na estrutura dos XMLs usados para envio dos lotes de notas quanto no modelo de comunicação. Ao passo que o padrão ABRASF estabeleceu um modelo assíncrono (o lote não é processado imediatamente) alguns padrões são síncronos (os lotes são processados no momento do envio). Alguns possuem serviços a mais além dos estabelecidos pelo padrão ABRASF, outros a menos, ou com parâmetros diferentes, outros com comportamentos diferentes. Mesmo os que seguiram o padrão ABRASF, cada um seguiu à sua maneira, fazendo adaptações conforme suas necessidades. A verdade é que cada padrão tem sua própria maneira de trabalhar, suas peculiaridades, etc. Vários padrões, vários layouts de integração diferentes O Componente NFSe, em relação aos serviços de NFSe especificados pelo padrão ABRASF (envio de lotes, consulta de situação do lote, consulta do lote, consulta de nota por NFSe, consulta de nota por RPS e cancelamento) consegue estabelecer uma interface razoavelmente comum entre os diversos padrões. Uma consulta de nota por NFSe, por exemplo, para dois padrões com funcionamento bastante diferente, vai ser chamada pelo ERP ao componente de uma única maneira. Porém, para o layout do envio dos lotes de notas não havia um “denominador comum”. Cada padrão exige um conjunto diferente de dados, com campos com nomes diferentes e até mesmo formatos de dados diferentes, e cabia ao desenvolvedor que se utilizava do Componente NFSe estudar os campos dos inúmeros padrões existentes, e saber quais dados usar em quais campos desses padrões. Isso aumentava muito a complexidade do uso do Componente NFSe. Padrão Único: vários padrões, um único layout de integração Foi pensando em diminuir esse problema de “Torre de Babel” que a Tecnospeed criou o Padrão Único NFSe. Ele funciona como um “esperanto”, ou seja, uma “linguagem universal”, que será traduzida para os diferentes layouts exigidos pelos padrões. O objetivo do Padrão Único é possibilitar a emissão de NFS-es para todos os padrões através de um único layout, e ainda ser flexível o suficiente para permitir se trabalhar com as particularidades de cada padrão. Ou seja, um ERP se utilizando do Padrão Único irá especificar sempre os mesmos campos com os mesmos formatos de dados independente do município para o qual ele estará emitindo notas, e deixar ao Componente NFSe a tarefa de saber que campos do Padrão Único correspondem a que campos do padrão do município, e que formato de dados ele usa. O Padrão Único estabelece um “denominador comum” entre os padrões, e com ele é possível se emitir NFS-e para para a grande maioria dos casos de emissão de notas de serviço. Em um cenário típico, o Padrão Único oferece tudo o que é necessário para se emitir NFS-es para os municípios homologados no Componente NFSe. Porém é importante ressaltar que ele não cobre todos os campos particulares de todos os padrões, apenas os essenciais e que tem funcionalidade em comum. Pode eventualmente surgir a necessidade de se informar dados particulares ao um padrão que não são cobertos pelo Padrão Único. Nesses casos, o Padrão Único oferece uma maneira de se especificar esses dados especiais, informando no arquivo de integração o nome do campo do padrão do município com um “@” (arroba) no início. Vale lembrar que esses casos são bastante raros de se acontecer. Raros também são os padrões que não são cobertos pelo Padrão Único, devido a um grau de diferença tamanho entre esse padrão e o padrão ABRASF que impossibilitou traçar qualquer paralelo entre os campos dos dois padrões. Até o momento nos deparamos com apenas um padrão assim, usado por poucos municípios, para o qual deve ainda ser usado o layout próprio do padrão. No final, o Padrão Único vem se mostrando uma poderosa ferramenta capaz de reduzir imensamente o esforço dos desenvolvedores na implementação da emissão de NFS-e pelos seus produtos. Tópico originalmente criado por: @Jonathan Santos

Sobre o Fórum

Este é um fórum para todos que fazem parte
do ecossistema de uma Software House!

Bem-vindo(a) ao fórum da Casa do Desenvolvedor, uma comunidade completa, onde desenvolvedores, software houses, profissionais de marketing, experiência e vendas, fornecedores de soluções, aficionados por inovação e tecnologia podem tirar dúvidas, compartilhar novidades e conhecimento, trocar experiências e até postar uns memes que só nós da tecnologia entendemos 😅

Crie agora sua conta e vamos juntos fortalecer
o desenvolvimento de software no Brasil! 🇧🇷

×
×
  • Create New...