Dicas sobre desenvolvimento de software, gestão e tributações

Rede Social

7 de agosto de 2018

eSocial o que é e resumo


Introdução
     São informações de RH enviadas à Sefaz, tem o funcionamento parecido com os outros projetos fiscais como NFe, MDFe etc.
     Trata-se de um projeto do governo federal (parte do SPED) que visa unificar o envio de informações por empregadores, incluindo empregadores domésticos, ao governo. Inclui obrigações fiscais, trabalhistas, tributárias e previdenciárias.

Obrigatoriedade
     Todo aquele que contratar prestador de serviço, pessoa física ou jurídica, e possua alguma obrigação trabalhista, previdenciária ou tributária, em função dessa relação jurídica, por força da legislação pertinente, está obrigado a enviar informações decorrentes desse fato por meio do eSocial.
     O obrigado poderá figurar nessa relação como empregador, nos termos definidos pelo art. 2º da CLT ou como contribuinte, conforme delineado pela Lei nº 5.172, de 1966 (Código Tributário Nacional – CTN), na qualidade de empresa, inclusive órgão público, ou de pessoa física equiparada a empresa, conforme prevê o art. 15 da Lei nº 8.212, de 1991.

O eSocial x EFD-Reinf: Sistemas Complementares
     Por meio do Sistema de Escrituração Digital das Obrigações Fiscais, Previdenciárias e Trabalhistas – eSocial os obrigados enviarão as informações relacionadas às relações de trabalho, que no campo da tributação previdenciária, abrangem, como regra, as informações necessárias para a apuração das contribuições previdenciárias e das contribuições das outras entidades e fundos (Terceiros) incidentes sobre a folha de pagamento ou remunerações pagas, devidas ou creditadas aos trabalhadores contratados.
     No caso, todavia, das informações necessárias para a apuração da retenção do art. 31 da Lei nº 8.212, de 1991, das contribuições previdenciárias substitutivas, incidentes, em regra, sobre a receita bruta e as informações necessárias para compor a DIRF, estas devem ser encaminhadas por meio da Escrituração Fiscal Digital de Retenções e Outras Informações Fiscais (EFD-Reinf), instituída pela Instrução Normativa RFB nº 1.701, de 2017.

Eventos iniciais
    São os eventos para cadastramento do empregador em geral. São informações como classificação fiscal, cargos, horários de trabalho, processos administrativos, rubricas. Ou seja, é o primeiro passo para começar a trabalhar com o eSocial.

Eventos periódicos
     Os eventos periódicos são eventos que tem uma data fixa para acontecer e como o próprio nome diz, tem uma periodicidade definida, como por exemplo remuneração do trabalhador, pagamentos de impostos e benefícios previdenciários.
    Quanto ao prazo:
     Os eventos periódicos devem ser transmitidos até o dia 07 do mês seguinte, antecipando-se o vencimento para o dia útil imediatamente anterior, em caso de não haver expediente bancário.

Eventos não periódicos
    Os eventos não periódicos são eventos sem uma data definida para acontecer e que não acontecem com certa constância como por exemplo, admissão e desligamento de funcionários, afastamento temporário e aviso prévio.
    Quanto ao prazo para envio dos eventos não periódicos:
     Como regra geral, a definição dos prazos de envio dos eventos não periódicos respeita as regras que asseguram os direitos dos trabalhadores, como no caso da admissão e do acidente de trabalho, ou possibilitam recolhimentos de encargos que tenham prazos diferenciados, como na situação do desligamento.
     O melhor momento para se transmitir os eventos não periódicos e os de tabela é imediatamente após a sua ocorrência. Este procedimento além de impedir possíveis inconsistências, evita tanto o represamento desnecessário de eventos a serem transmitidos quanto o congestionamento de redes pela transmissão de última hora.

Cronograma
esocial-faseamento.png

Contingência
    No eSocial não existe contingência como em alguns outros projetos, caso ocorra algum problema no software, poderá ser utilizado o portal do eSocial para enviar as informações, mas tudo lá é feito manualmente, caso o cliente tenha problemas com acesso à internet o mesmo não terá opções enquanto o problema persistir.

Envio de eventos
    O eSocial possui schemas, necessita de assinatura digital (certificado), Função de message digest: SHA-256 parecido com os outros projetos fiscais.
     Ao enviar xml para Sefaz, caso retorno de erro, são mostradas todas as ocorrências que geraram o erro, além do código do erro.

Qualificação cadastral dos trabalhadores
    Antes de enviar os eventos iniciais, será necessário confrontar os dados do trabalhador que se possui nos aplicativos com os dados que o eSocial possui desses trabalhadores, pois divergências desses cadastros resultarão em rejeições.
    Para isso a RFB disponibilizou duas formas de consulta, a primeira é no portal do eSocial, onde a consulta pode ser feita manualmente trabalhador por trabalhador http://consultacadastral.inss.gov.br/Esocial/pages/index.xhtml, a segunda é através de um arquivo de texto pré definido podendo conter todos os trabalhadores para serem validados de uma só vez. O formato pré definido pode ser visto em https://portal.esocial.gov.br/manuais/leiaute_cqc_em_lote.pdf.

Eventos
São 46 no total atualmente, sendo eles:
S-1000 – Informações do Empregador/Contribuinte/Órgão Público
S-1005 – Tabela de Estabelecimentos, Obras ou Unidades de Órgãos Públicos
S-1010 – Tabela de Rubricas
S-1020 – Tabela de Lotações Tributárias
S-1030 – Tabela de Cargos/Empregos Públicos
S-1035 – Tabela de Carreiras Públicas
S-1040 – Tabela de Funções e Cargos em Comissão
S-1050 – Tabela de Horários/Turnos de Trabalho
S-1060 – Tabela de Ambientes de Trabalho
S-1065 – Tabela de Equipamentos de Proteção
S-1070 – Tabela de Processos Administrativos/Judiciais
S-1080 – Tabela de Operadores Portuários
S-1200 – Remuneração de trabalhador vinculado ao Regime Geral de Previdência Social
S-1202 - Remuneração de servidor vinculado a Regime Próprio de Previdência Social – RPPS
S-1207 – Benefícios Previdenciários - RPPS
S-1210 – Pagamentos de Rendimentos do Trabalho
S-1250 – Aquisição de Produção Rural
S-1260 – Comercialização da Produção Rural Pessoa Física
S-1270 – Contratação de Trabalhadores Avulsos Não Portuários
S-1280 – Informações Complementares aos Eventos Periódicos
S-1295 – Solicitação de Totalização para Pagamento em Contingência
S-1298 – Reabertura dos Eventos Periódicos
S-1299 – Fechamento dos Eventos Periódicos
S-1300 – Contribuição Sindical Patronal
S-2190 – Admissão de Trabalhador – Registro Preliminar
S-2200 – Cadastramento Inicial do Vínculo e Admissão/Ingresso de Trabalhador
S-2205 – Alteração de Dados Cadastrais do Trabalhador
S-2206 – Alteração de Contrato de Trabalho
S-2210 – Comunicação de Acidente de Trabalho
S-2220 – Monitoramento da Saúde doTrabalhador e Exame Toxicológico
S-2230 – Afastamento Temporário
S-2240 – Condições Ambientais do Trabalho - Fatores de Risco
S-2245 – Treinamentos e Capacitações
S-2250 – Aviso Prévio
S-2260 – Convocação para Trabalho Intermitente
S-2298 – Reintegração
S-2299 – Desligamento
S-2300 – Trabalhador Sem Vínculo de Emprego/Estatutário - Início
S-2306 – Trabalhador Sem Vínculo de Emprego/Estatutário - Alteração Contratual
S-2399 – Trabalhador Sem Vínculo de Emprego/Estatutário - Término
S-2400 – Cadastro de Benefícios Previdenciários - RPPS
S-3000 – Exclusão de Eventos
S-5001 - Informações das contribuições sociais consolidadas por trabalhador
S-5002 – Imposto de Renda Retido na Fonte
S-5011 - Informações das contribuições sociais consolidadas por contribuinte
S-5012 - Informações do IRRF consolidadas por contribuinte


Referências
Documentação oficial
Ler

24 de julho de 2018

Get Ip local C#


Neste artigo irei mostrar como descobrir o IP da máquina onde está rodando seu aplicativo.
É bastante simples, você vai precisar apenas da classe System.Net.

Primeiro precisamos saber qual o nome da máquina, pois sem o nome não temos como pesquisar pelo IP.

string nomeMaquina = Dns.GetHostName();

Após isso utilizamos o método que pesquisa e retorna o IP de acordo com o nome passado.

IPAddress[] ipLocal = Dns.GetHostAddresses(nomeMaquina);
Este método retorna tanto o IPv6 quanto o IPv4, por tanto temos que escolher com qual iremos trabalhar.

Caso seja o IPv4 é só utilizar o ipLocal[1], caso seja o IPv6 é o ipLocal[0].


Segue abaixo o código completo:

string nomeMaquina = Dns.GetHostName();
IPAddress[] ipLocal = Dns.GetHostAddresses(nomeMaquina);
string ip = ipLocal[1].ToString();
Ler

9 de julho de 2018

Restaurar banco SQL server sem o arquivo .LDF (log)




     Recentemente passei por uma situação onde um bakcup do banco de dados foi feito de forma errada e ao invés de gerado um backup, foram copiados os arquivos .mdf e .ldf, até aí ok, mas o problema é que isso tudo foi feito remotamente e no momento de transferir os arquivos o .ldf foi corrompido.
    Quando o técnico tentou anexar o arquivo .mdf para voltar a utilizar o banco uma mensagem de erro era exibida algo como:
“Log file ‘D:\MeuDb.ldf’ does not match the primary file.  It may be from a different database or the log may have been rebuilt previously.The log cannot be rebuilt when the primary file is read-only.”
    Isso ocorre quando o banco de dados não é colocado offline antes de copiar os arquivos, portanto o arquivo primário como é dito na mensagem não aceita o comando é como se estivesse sempre vinculado ao arquivo de log.
    Mas mesmo assim existe uma forma de "enganar" o SQL Server e conseguir utilizar o banco de dados basta seguir os passos.

obs. Como na mensagem acima vou colocar o nome fictício do meu banco como Db, então nas descrições sempre que ver MeuDb coloque o nome do seu banco de dados. E durante o processo abaixo algumas mensagens de erro serão exibidas pelo SQL Server, continue seguindo o passo-a-passo mesmo assim.

1 - Criar um banco de dados qualquer com o mesmo nome do banco de dados que estamos tentando recuperar, se atente para os arquivos .mdf e .ldf que devem ser iguais aos que eram do banco anterior.
2 - Coloque o banco criado como somente leitura e depois como offline
alter database MeuDb set read_only
alter database MeuDb set offline
3 - Substitua o arquivo mdf do novo banco pelo arquivo que você está recuperando
4 - Volte o banco como online
alter database MeuDb set online
5 - Sete o banco para leitura e escrita
alter database MeuDb set read_write
6 - Coloque o banco em emergência e como usuário único
alter database MeuDb set emergency
alter database MeuDb set single_user
7 - Exclua o arquivo de log do banco novo
8 - Recrie o log
alter database MeuDb rebuild log on
(Name= MeuDb_log,filename='CaminhoDoArquivo\MeuDb.ldf')
9 - Defina o banco como pronto para uso
alter database MeuDb set online
alter database MeuDb set MULTI_USER

Pronto você já pode voltar a usar seu banco de dados.
Ler

3 de julho de 2018

Java Script: Criando elementos html


     Para criar elementos html no js podemos utilizar o comando createElement(), por exemplo, caso queiramos adicionar uma nova linha à uma tabela, podemos utilizar
var linha = document.createElement("tr");
Criado o elemento linha precisaremos crias as colunas da tabela.
var coluna1 = document.createElement("td");
var coluna2 = document.createElement("td");
Após criadas as colunas devemos informar à qual linha aquelas colunas se destinam;
linha.appendChild(coluna1);
linha.appendChild(coluna2);
E utilizando a mesma lógica deverá adicionar a linha como pertencente à uma tabela.
var tabela = document.querySelector("#tabela");
tabela.appendChild(linha);
Ler

25 de junho de 2018

Mongo: Importar arquivos


    No mongo temos a opção de importar arquivos para popular um banco de dados, aqui vão dois exemplos, um importando um json e outro um arquivo tipo csv.

mongoimport -c alunos --jsonArray < alunos.json
sendo "-c" alunos a coleção alunos, "--jsonArray" mostrando que é um arquivo contendo array e < alunos.json é o caminho do arquivo

mongoimport -d produtos -c camisetas --type csv --headerline --file camisetas.txt
Os parâmetros “-d” se refere ao banco, o “-c” se refere a collection, “–headerline” se a primeira linha é um cabeçalho, ou seja, os nomes dos campos.
Ler

21 de junho de 2018

CSS: Position e Transform


Position
     Para tirar algum elemento do fluxo da página, utiliza-se o float ou position (absolute ou fixed). O position sempre será relativo à algum outro elemento acima dele que tenha o position configurado, caso nenhum tenha essa configuração será tomada como base a página. Para adicionar um position a um elemento sem alterar a posição, apenas para servir como base a outro é só utilizar a opção relative.


Transform
    O transform serve para alterar formas ou elementos, isso é bastante usado por exemplo para colocar textos flutuantes na página, textos rotacionados, caixas com formas diferenciadas e até objetos 3D.

Algumas opções para se utilizar com transform:
rotate(10deg)                  - serve para rotacionar o elemento.
scale(1.2)                         - serve para redimensionar o elemento 
skew(10deg)                   - serve para entortar (cisalhamento)
translate(10px, 20px)     - serve para alterar a posição

     Podemos utilizar quantas transformações forem necessárias, mas quando fazemos isso temos que prestar atenção na ordem entre elas, pois o navegador as aplica da direita para a esquerda.
transform : translate(10px, 20px) scale(1.2)
Primeiro vai alterar o tamanho e depois transladar a posição.

    Para aplicar transformações em elementos inline (texto por exemplo), devemos transformar eles em blocos, para isso podemos utilizar:
display: inline-block;

    Quando vamos utilizar a transformação de rotação o navegador tem por padrão tomar como base o centro do elemento, mas quando necessário podemos alterar essa definição para isso é só utilizar a opção de alterar a origem da transformação.
transform-origin: 0 0;
Este exemplo altera a base para o canto superior esquerdo.
Ler

18 de junho de 2018

CSS: O que são prefixos CSS


     O CSS está em constante evolução e novas opções são lançadas sejam novos recursos ou novos valores para comandos já existentes e nem sempre substituir uma propriedade antiga largamente utilizada é uma boa ideia. Por este motivo, quando surge uma nova funcionalidade no CSS os navegadores tem que se atualizar e implementá-la para próximas versões, porém, até que tais recursos estejam totalmente estáveis e prontos para a utilização, são utilizadas propriedades próprias de CSS, e essas propriedades são os prefixos.
    Abaixo segue a lista dos prefixos utilizados pelos browsers mais conhecidos:

-moz-     = Mozilla
-ms-       = Edge
-webkit- = Chrome, Opera, Safari

Um ressalve para o Opera que utilizava o prefixo -o-, mas após um tempo passou a utilizar também o -webkit-, assim como o Chrome e Safari

     O caniuse.com é um catálogo onde mostram as funcionalidades por navegador e versão, bastante interessante para ter certeza que deve ou não usar um prefixo.

     Também existem ferramentas e .js que fazem essas conversões e tratamentos de prefixos para você não precisar ficar colocando-os em todos os elementos CSS e bagunçando (aumentando) o código.
Ler

14 de junho de 2018

JavaScript: Eventos


    Para adicionar um evento a um elemento é só adicionar usando o addEventListener, ele necessita de dois parâmetros, o primeiro é qual evento que será disparado e o segundo a função que será executada.
td.addEventListener("click", mensagemErro);

function mensagemErro(){
    console.log("Mensagem de erro exibida");
}

     Ou podemos passar a function diretamente na adição do evento, sendo uma função anônima.
td.addEventListener("click", function(){
     console.log("Mensagem de erro exibida");
});

    Para não deixar que o browser execute os eventos padrão podemos especificar isso, é só dentro do evento que estamos criando adicionar o comando:
event.preventDefault();
e na function passar o event como parâmetro, assim:
function(event). Isso se faz bastante útil por exemplo quando estamos lidando com eventos de um botão de enviar do form, que por padrão seleciona os dados do form e envia a uma página e recarrega, pode ser que nem sempre queiramos ir à outra página, caso um erro ocorra por exemplo, os dados digitados no form seriam perdidos.
Ler

11 de junho de 2018

JavaScript: querySelectorAll e limitar casas decimais


    Para selecionar todos os valores de um elemento, como por exemplo para selecionar todas as linhas de uma tabela.
    E caso eu queira percorrer todos os elementos poderia utilizar um loop como o for.

var tabelaAlunos = document.querySelectorAll(".alunos");

for (var i = 0; i < tabelaAlunos.length; i++)
{
     var aluno = tabelaAlunos[i];
}


Limitar casas decimais
     Podemos também limitar as casas decimais de um número, para isso temos a opção de utilizar o toFixed. Como segue o exemplo, onde setamos para o número conter 3 casas decimais.
var numero = 10/3;
td.textContent = numero.toFixed(3);
Ler

7 de junho de 2018

JavaScript: Alterando estilos CSS


    Uma boa prática em JS é alterar estilos CSS através do próprio CSS, alterando as classes dos elementos HTML, mesmo sendo possível alterar os estilos dentro do JS. Para alterar as classes podemos utilizar o classList para acessar a lista de classes do elemento e o add para adicionar uma classe, vamos a um exemplo:
Quero alterar uma linha de uma tabela de alunos e quando o aluno estiver abaixo da média de notas seja adicionada a classe CSS aluno-abaixoMedia:

aluno.classList.add("aluno-abaixoMedia");

Essa classe aluno-abaixoMedia pode conter os códigos CSS que eu quiser e repare que o . da classe não é adicionado, apenas o nome.

    Mesmo assim caso você tenha a necessidade de alterar um estilo dentro do JS, você pode utilizar o style como seria seguindo o exemplo anterior, aluno.style.estiloQueEuQuiser. Vale ressaltar que caso a propriedade CSS que estou alterando contenha mais de uma palavra, no CSS é separada por - no JS deve ser escrita junta utilizando camel case, como text-align deve ser textAlign
Ler

4 de junho de 2018

Mongo: Atualização (Update)


     Neste post estarei mostrando alguns comandos para atualização de documentos, o conhecido update do SQL.

     Para atualizar um documento podemos utilizar:
db.funcionarios.update({}, {}) onde o primeiro parâmetro é a condição do que queremos atualizar, seria o where do SQL e o segundo é o valor que será atualizado.
    Mas passando um update desta forma fazemos com que o mongo intenda que estamos atualizando um documento inteiro que é o padrão dele.

     Para atualizar o campo de um documento podemos utilizar:
db.funcionarios.update(
     { "departamento.nome" : "RH"},
     { $set : {"departamento.nome" : "Recursos humanos"}}
)
    Mas como disse anteriormente o padrão do mongo é atualizar um documento, mesmo que estejamos passando o set para atualizar apenas um campo e na condição passamos uma condição onde possam ter vários registros, ele só vai atualizar o primeiro que encontrar.

     Para atualizar todas as linhas encontradas temos que avisar ao mongo que é isso que desejamos, utilizando o multi:
db.funcionarios.update(
     { "departamento.nome" : "RH"},
     { $set : {"departamento.nome" : "Recursos humanos"}},
     { multi : true }
)

     Agora e quando queremos adicionar um valor a um documento? Imagine que estou em um banco de dados de controle de alunos e esses alunos podem ter várias notas, ou seja tenho um db.alunos contendo um .notas.
     Para adicionar um valor a um documento, temos uma opção que é o $push:

db.alunos.update(
    {"_id" : ObjectId("16db0004b8d72ea12f75d3b9")},
    { $push : { notas : 7.0 } }
)
    Certo e caso eu queira adicionar mais de uma nota de uma só vez?
    Para adicionar mais de um valor no push temos que utilizar o comando each
db.alunos.update(
    {"_id" : ObejctId("16db0004b8d72ea12f75d3b9")},
    { $push : { "notas" : {$each : [7.5, 5.0] } }}
)

     Existem muitas outras opções como o $inc que serve para incrementar um valor, como por exemplo foi adicionada a nota de um aluno como 7.5, mas o mesmo teve trabalhos extras que valeram mais um ponto, poderíamos utilizar o inc para adicionar 1 à nota ficando com 8.5.
     Ou o $currentDate que seta a data atual à um campo.

Como sempre faço aqui vai a Documentação MongoDB, pois existem várias outras opções.
Ler

29 de maio de 2018

Mongo: Find limitando registros e ordenação sort


    Muitas vezes desejamos selecionar um número específico de registros, imaginemos o seguinte caso, tenho uma loja e quero lançar um desconto promocional para o funcionário que tem o melhor aproveitamento em vendas. Esse aproveitamento é um número de 0 a 10 que é lançado baseado na quantidade de atendimentos, vendas e elogios por parte dos clientes.

     Poderíamos executar este comando:
db.funcionarios.findOne({
    aproveitamento : { $gt : 8}
})

     O findOne retorna o primeiro valor encontrado, no caso seria o primeiro funcionário que tenha aproveitamento maior que 8.

     Portanto talvez fosse interessante partir para outra opção. Como listar os funcionários ordenando pelo aproveitamento. Para isso usamos o sort.

db.funcionarios.find().sort({"aproveitamento" : 1})

     Com este comando estamos ordenando por ordem crescente, caso queira que seja por ordem decrescente é só alterar o segundo parâmetro para -1.

db.funcionarios.find().sort({"aproveitamento" : -1})

     Tendo ordenado podemos limitar a quantos registros desejamos. Imagine que quero lançar aquele desconto para os 5 funcionários com aproveitamento mais alto. O limit tem esta função, nele se pode colocar o número de registros desejados.

db.funcionarios.find().sort({"aproveitamento" : -1}).limit(5)
Ler

24 de maio de 2018

Mongo: Comandos para selecionar (find)


Pretty comando para identar o selecionar
     Ao utilizar o find como mostrado anteriormente são trazidos todos os dados sem filtro, como por exemplo db.alunos.find(), mas note que são exibidos os dados sem identação e fica um tanto quanto confuso para visualizar quando temos muitos dados, para melhorar isso podemos utilizar o comando pretty, ficaria dessa forma db.alunos.find().pretty(), veja como fica bem mais fácil de visualizar.

Find
    O comando find é utilizado para selecionar valores, anteriormente vimos como podemos selecionar em documentos simples, onde temos apenas uma estrutura, como por exemplo: db.alunos.find(
     { "nome" : "Mateus" }
).pretty()

     Mas e quando temos uma estrutura dentro desse aluno como por exemplo os cursos que ele está estudando, teríamos que pensar em um join se fosse SQL normal, alunos join cursos, mas no mongo fazemos isso de uma forma bem parecida como em linguagens de programação orientada a objetos como por exemplo:
db.alunos.find(
     { "curso.nome" : "Contabilidade" }
).pretty()
Neste exemplo pesquisei os alunos que estão estudando Contabilidade, simples não é?

Condições ("ou/or" e "e/and")
    Em SQL é muito comum termos uma seleção com mais de uma condição, no mongo também podemos fazer isso como por exemplo o "or" em um banco onde estamos trabalhando os funcionários.
db.funcionarios.find({
    $or : [
               {"departamento.nome" : "RH"},
               {"departamento.nome" : "Manutenção"}
             ]
     }).pretty()

     Agora caso quiséssemos filtrar esta consulta ainda pelos funcionários onde o gênero é feminino poderíamos fazer da seguinte forma.
db.funcionarios.find({
    $or : [
               {"departamento.nome" : "RH"},
               {"departamento.nome" : "Manutenção"}
             ],
              "genero" : "F"
     }).pretty()
     Ou seja, para o mongo sempre que adicionamos uma nova condição sem especificar nada ela será um "e/and".

Ler

21 de maio de 2018

Mongo: Comandos para inserção e remoção (insert e delete)


Comandos simples para inserção
Para criar coleções utilizamos o comando createCollection.
db.createCollection("alunos")

Para inserir valores na collection alunos podemos usar o insert
db.alunos.insert({
    "nome" : "João",
    sobrenome : "Silva"
    data_nascimento : new Date(1992,01,10)
})

É feito dessa forma pois é como um objeto javascript.

Também podemos inserir mais de uma collection para indicar collections referenciadas como por exemplo, este aluno cadastrado tem notas das matérias realizadas, poderíamos usar o insert da seguinte forma:
db.alunos.insert({
    "nome" : "João",
    sobrenome : "Silva"
    data_nascimento : new Date(1992,01,10)
},
{
"curso" :
     { "nome" : "JavaScript"}
},
"notas" : [9.0, 8.7]
})

Repare que em notas eu inseri dois valores de uma vez, isso é possível utilizando os colchetes []


Comando para remoção (delete)
     Para remover um aluno temos a opção de remover por ID como no exemplo:
db.alunos.remove({
    "_id" : ObjectId("78as0001q6w89gh25h69x3b5")
})
onde este ObjectId contido nas aspas é só um exemplo, no seu caso (no seu banco) ele será diferente.
Ler

17 de maio de 2018

JavaScript: Introdução


    Java script trabalha com a interatividade de sites com seus usuários, ela é a linguagem nativa da web, e ganhou muita popularidade por sua versatilidade, onde alguns desenvolvedores fizeram com que fosse possível utilizar java script para outras funcionalidades que não apenas no navegador.
     Como o NodeJs que o trouxe para o back-end, onde se é possível tratar requisições, enviar consultas para bancos de dados e etc.
     Também é possível utilizar em aplicações desktop, utilizando o Electron, um framework dedicado a isso, construir aplicativos desktop com html, css e javascript.
    E não bastasse, existe também um framework para utilizar javascript com arduino que é o Johnny-Five.

Boas práticas
    Uma boa prática é adicionar o javascript ao final da tag body, pois como os navegadores leem as páginas linearmente de cima para baixo, pode ser que algo da página ainda não tenha sido carregada quando ele for tentar executar o javascript.
     Document contém o DOM ou Document Object Model, que é como o navegador enxerga o HTML utilizado por ele para renderizar a página e com a função querySelector podemos selecionar uma parte do HTML, como por exemplo document.querySelector("h2").
    Lembrando sempre que é uma boa prática não atrelar muito o js com o html, portanto seria melhor selecionar por #id ou .classe css como por exemplo document.querySelector(".titulo").
    Separar o código js do código HTML é muito importante em alguns casos onde se tem muitas linhas de javascript e para fazer isso basta utilizar o comando <script src=""></script> onde o "" será preenchido pelo caminho do arquivo como, por exemplo <script src="scripts/principal.js"></script> indicando que na pasta principal da aplicação tem uma pasta scripts e dentro dela um arquivo principal.js.
Ler

14 de maio de 2018

Mongo DB: Introdução


Introdução
     Mongo é orientado à documentos (JSON), ou seja, ele é um banco não relacional document-based.
     Basicamente neste tipo de banco (document-based ou document-oriented) temos coleções de documentos, nas quais cada documento é autossuficiente, contém todos os dados que possa precisar, ao invés do conceito de não repetição + chaves estrangeiras do modelo relacional.
     A ideia é que você não tenha de fazer JOINs pois eles prejudicam muito a performance em suas queries (são um mal necessário no modelo relacional, infelizmente). Você modela a sua base de forma que a cada query você vai uma vez no banco e com apenas uma chave primária pega tudo que precisa.
     Obviamente isto tem um custo: armazenamento em disco. Não é raro bancos MongoDB consumirem muitas vezes mais disco do que suas contrapartes relacionais.
     MongoDB é case-sensitive ao contrário dos bancos relacionais.

Aplicativos mongo instalados:
  • mongod: inicializa o servidor de banco de dados;
  • mongo: inicializa o cliente de banco de dados;
  • mongodump: realiza dump do banco (backup binário);
  • mongorestore: restaura dumps do banco (restore binário);
  • mongoimport: importa documentos JSON ou CSV pro seu banco;
  • mongoexport: exporta documentos JSON ou CSV do seu banco;
  • entre outros.


Comandos básicos

Para subir um servidor mongo

C:\mongo\bin> mongod --dbpath C:\mongo\data

     Agora abra outro prompt de comando (o outro ficará executando o servidor) e novamente dentro da pasta bin do Mongo, digite:

c:\mongo\bin> mongo

    O comando abaixo no terminal cliente mostra os bancos existentes nesse servidor:

> show databases

    Agora digite o seguinte comando para “usar” o banco de dados “workshop” (um banco que você sabe que não existe ainda):

> use workshop

     O terminal vai lhe avisar que o contexto da variável “db” mudou para o banco workshop, que nem mesmo existe ainda (mas não se preocupe com isso!). Essa variável “db” representa agora o banco workshop e podemos verificar quais coleções existem atualmente neste banco usando o comando abaixo:

> show collections

    Além de campos com valores específicos, esse parâmetro do find permite usar uma infinidade de operadores como por exemplo, trazer todos documentos que possuam a letra ‘a’ no nome com regex:
> db.customers.find({nome: { $regex: /a/ }})

     Mas e se eu quiser trazer todos os customers maiores de idade?
> db.customers.find({idade: {$gte: 18}})
     O operador $gte (Greater Than or Equal) retorna todos os documentos que possuam o campo idade e que o valor do mesmo seja igual ou superior à 18. E podemos facilmente combinar filtros usando vírgulas dentro do documento passado por parâmetro, assim como fazemos quando queremos inserir campos em um documento:
> db.customers.find({nome: "Luiz", idade: {$gte: 18}})

Alguns outros operadores que você pode usar junto ao filtro do find são:
  • $eq: exatamente igual (=)
  • $ne: diferente (<> ou !=)
  • $gt: maior do que (>)
  • $lt: menor do que (<)
  • $lte: menor ou igual a (<=)
  • $in: o valor está contido em um array de possibilidades, como em um OU. Ex: {idade: {$in: [10,12] }}
  • $all: MongoDB permite campos com arrays. Ex: { tags: [“NodeJS”, “MongoDB”] }. Com esse operador, você compara se seu campo multivalorado possui todos os valores de um array específico. Ex: {tags: {$all: [“NodeJS”, “Android”]}}

     Você também pode usar findOne ao invés de find para retornar apenas o primeiro documento, ou ainda as funções limit e skip para limitar o número de documentos retornados e para ignorar alguns documentos, especificamente, da seguinte maneira:
> db.customers.find().skip(1).limit(10)
     No exemplo acima retornaremos 10 customers ignorando o primeiro existente na coleção.

     E para ordenar? Usamos a função sort no final de todas as outras, com um documento indicando quais campos e se a ordenação por aquele campo é crescente (1) ou descrescente (-1), como abaixo em que retorno todos os customers ordenados pela idade:
> db.customers.find().sort({idade: 1})
Nota: assim como nos bancos relacionais, os métodos de consulta retornam em ordem de chave primária por padrão, o que neste caso é o _id.
Ler

10 de maio de 2018

UX: Microcopy (Microtexto)


    Pode ser usado para links, botões, títulos, ações, enfim para quase tudo.
    É muito importante ter em mente que os textos devem ser simples e diretos, mas sem ser invasivo ou autoritário, eles devem literalmente conversar com o usuário claramente e fazer com que ele fique confortável.

     Usemos o exemplo do trivago, a sua página inicial é esta, o logo, um texto simples explicando claramente o que o site faz e embaixo um campo para digitar o texto da pesquisa "Ex.: Foz do Iguaçu". Mas se pensarmos bem Foz do Iguaçu é uma cidade e este campo de busca não serve apenas para cidades, nele posso digitar estados por exemplo que também é realizada a pesquisa, por tanto, pode ser melhorado para explicar melhor ao usuário o que acontece alí e não limitar a funcionalidade. Se tivéssemos, por exemplo, "Onde deseja encontrar hotéis?" teríamos mais possibilidades para o usuário digitar, vale apontar que em alguns casos perguntas são muito bem vindas.
Ler