Skip to content
This repository was archived by the owner on Jul 1, 2021. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions .classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/desafio1-0.0.1-SNAPSHOT/WEB-INF/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.google.appengine.server.runtimeTarget/Google App Engine 1.9.25">
<attributes>
<attribute name="owner.project.facets" value="jst.web"/>
</attributes>
</classpathentry>
<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="com.google.appengine.eclipse.wtp.jpa.DATANUCLEUS_CONTAINER">
<attributes>
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
<attribute name="owner.project.facets" value="jpt.jpa"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/desafio1-0.0.1-SNAPSHOT/WEB-INF/classes"/>
</classpath>
63 changes: 63 additions & 0 deletions .project
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>desafio1</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.google.appengine.eclipse.wtp.swarm.gaeCloudEndpointsBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.google.appengine.eclipse.wtp.enhancerbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
<nature>org.eclipse.pde.PluginNature</nature>
</natures>
</projectDescription>
8 changes: 8 additions & 0 deletions META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: desafio1
Bundle-SymbolicName: desafio1
Bundle-Version: 1.0.0.qualifier
Export-Package: br.com.entidades,
br.com.manager,
br.com.service
190 changes: 16 additions & 174 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,179 +1,21 @@
# Por que trabalhar na Contabilizei
#Ferramentas:
- Eclipse com o plugin do google app engine
- Maven
- Java Development Kit 7
- Server Google App Engine

**Eleita a melhor startup B2B da América Latina em 2016, a Contabilizei** é um escritório de contabilidade online, líder de mercado, com sede em Curitiba (PR). Nosso propósito é resolver a dor e burocracia de micro e pequenas empresas ao se manterem regulares com o governo. Somos contadores, só que online, simples assim. Acreditamos no poder da tecnologia para melhorar continuamente a vida das pessoas.

Se você tem espírito e comportamento empreendedor, muita disposição e proatividade para trabalhar em uma empresa em franca expansão, você é um forte candidato :)
#Tecnologias:
- Google App Engine para Java
- RESTFul API Jersey JAX-RS
- AngularJS 1.6
- Bootstrap

Como Desenvolvedor Full-stack você irá atuar no desenvolvimento de soluções em arquitetura Java Web MVC com RestFul APis (JAX-RS), integrações com outros sistemas (SOAP, XML, JSON), banco de dados NoSQL e soluções escaláveis, participando de todo o processo de desenvolvimento, desde tomadas de decisões à codificação e testes.

### O que fazem os Ninjas da Contabilizei? O que comem (e bebem)? Onde vivem?

Somos um time de desenvolvimento ágil, focado em fazer as coisas acontecerem. Trabalhamos com Kanban, entregas contínuas, Git, Cloud, aplicações distribuídas e mais uma porrada de tecnologias novas... Queremos que nosso cliente tenha o produto e a experiência mais fodásticos do planeta. Gostamos de compartilhar ideias, testar tecnologias e de cerveja :)

# O trabalho por aqui

Que tal fazer parte de um time com atitude “get Fˆ%#ing things done”? Participar de uma das maiores disrupções no mercado? Ter a oportunidade de trabalhar com tecnologias e conceitos inovadores, como:
* Práticas ágeis como Kanban / Scrum
* Google Cloud Platform
* Escalabilidade
* Micro services e aplicações distribuídas
* Kubernetes
* Git
* AngularJs
* Material Design
* BDD

Mais informações sobre a vaga você encontra aqui: [Desenvolvedor Full Stack Java na Contabilizei](https://jobs.lever.co/contabilizei/826c32bd-d800-475a-9f05-531e86dc4ea3)

# O que preciso fazer?

Vamos ser práticos e diretos, se você quer trabalhar conosco siga os passos abaixo:

* Faça um "fork" desse projeto para sua conta GitHub.
* Implemente o desafio descrito no tópico abaixo.
* Faça um push para seu repositório com o desafio implementado.
* Envie um email para ([email protected]) avisando que finalizou o desafio com a url do seu fork.
* Cruze os dedos e aguarde nosso contato.

# O Desafio de Notas Fiscais e Cálculo de Impostos

Você deverá criar 2 aplicações para cadastramento de notas fiscais e cálculo de impostos:

**Back-end:** aplicação JavaEE baseada em Web Services no padrão RESTful JAX-RS.

**Front-end:** Single Page Application que se comunique com estes serviços.

**Requisitos:**

- Permitir o cadastro de clientes (empresas)
- Permitir o registro de notas fiscais emitidas
- Realizar o cálculo dos impostos devidos por mês e ano de referência
- Permitir a consulta de notas fiscais e impostos por mês e ano de referência
- Permitir marcar o imposto como PAGO

O cadastro do cliente da Contabilizei deve conter as seguintes informações:

* Razão Social
* CNPJ
* Regime Tributário (Simples Nacional ou Lucro Presumido)
* Anexos (no caso de Regime Simples Nacional)
* E-mail

O cliente da Contabilizei deve registrar as notas fiscais para que seus impostos sejam calculados mensalmente.

As Notas Fiscais contém as seguintes informações:

* Numero da Nota fiscal
* Data de emissão
* Descrição (Apenas texto. Pode ser um serviço prestado, um produto vendido ou produzido)
* Valor
* Anexo (1,2,3)

Quando o cliente terminar de lançar suas notas fiscais, ele poderá solicitar o cálculo de seus impostos do mês. Cada mês deverá ter apenas 1 imposto de cada tipo. Os impostos deverão ter as seguintes informações:

* Tipo de Imposto (Simples Nacional, Imposto de Renda, ISS, Cofins)
* Vencimento
* Valor
* Mês e ano de referência (por exemplo, 10/2016)
* Pago ou não

**Regras para o cálculo dos impostos:**

- Se a empresa for do Simples Nacional, somente o imposto Simples Nacional é calculado. Para isso, somam-se as notas fiscais do mês por anexo e aplicam-se, para cada anexo as alíquotas conforme a tabela abaixo e criamos esse imposto.

| Anexo | Alíquota de imposto |
| --------------------------|:---------------------|
| 1 - Comércio | 6% |
| 2 - Indústria | 8,5% |
| 3 - Prestação de serviços | 11% |

Exemplo:

| Número da nota | Valor | Anexo | Valor x Alíquota |
| ---------------|:-----------|:------|:-----------------|
| 001 | 1.000,00 | 1 | 60,00 |
| 002 | 5.000,00 | 3 | 550,00 |

**Total Imposto Simples Nacional = R$ 610,00**

Neste caso, será gerado 1 imposto do Tipo Simples Nacional cujo valor será R$ 610,00

- Se a empresa for do Lucro Presumido, será necessário calcular o IRPJ, o ISS e o Cofins. Então, desconsideramos o anexo, somamos todas as notas fiscais do mês, aplicamos as alíquotas abaixo e criamos os impostos (IRPJ, ISS e Cofins).

| Tipo do imposto | Alíquota de imposto |
| --------------------------|:---------------------|
| IRPJ | 4,8% |
| ISS | 2% |
| COFINS | 3% |

Exemplo:

| Número da nota | Valor | IRPJ | ISS |COFINS |
| ---------------|:-----------|:----------|:-------|:-----------|
| 001 | 1.000,00 | 48,00 | 20,00 |30,00 |
| 002 | 500,00 | 24,00 | 10,00 |15,00 |

**Total de impostos Lucro Presumido: IRPJ R$ 72,00, ISS R$ 30,00, COFINS R$ 45,00**

Neste caso, serão gerados 3 impostos (IR, ISS e Cofins) cujos valores serão (R$ 72, R$ 30 e R$ 45)


Após o cálculo dos impostos, o cliente ainda poderá consultar quais impostos está devendo por mês e marcar os impostos pagos.

### Tecnologias

Escolha umas das opções abaixo para implementar sua solução. A modelagem dos dados fica a seu critério. Não se preocupe com autenticação ou multitenancy.

#### BACK-END

**Opção 1**

* Aplicação JavaEE utilizando framework [**Google App Engine para Java**](https://cloud.google.com/appengine/)
* Banco de dados NOSQL [Datastore](https://cloud.google.com/datastore/)
* RESTFul API com [Google Endpoints](https://cloud.google.com/appengine/docs/java/endpoints/) ou Jersey JAX-RS

**Opção 2**

* Aplicação pura Java EE (não utilize Spring, Struts, EJB, etc)
* RESTful API JAX-RS utilizando Servlets ou framework Jersey
* Banco de dados SQL (MySQL, PostgreSQL, HSQLDB) com JPA ou NOSQL(MongoDB)

#### FRONT-END

* Single Page Application utilizando apenas HTML5 e CSS3
* Javascript puro / JQuery (e plugins)
* AngularJS 1.x
* Bootstrap (http://getbootstrap.com/) ou Angular Material Design (será diferencial)

**Recomendações gerais:**

* Não utilize frameworks ou BD que não foram indicados
* Para servidor de aplicação utilize Jetty ou Tomcat (Não utilize: JBOSS, Wildfly ou qualquer outro servidor. Por quê? Critério de facilidade de configuração)
* Utilize o Maven para gerenciamento de dependências
* Utilizar automatizadores como Bower, Gulp, Grant é opcional.

### Arquitetura e documentação

No arquivo README do projeto explique o funcionamento e a arquitetura da solução adotada na sua implementação. Descreva também os passos para executar corretamente seu projeto.

### Avaliação

Entre os critérios de avaliação estão:

* Facilidade de configuração do projeto
* Performance
* Código limpo e organização
* Documentação de código
* Documentação do projeto (readme)
* Arquitetura
* Boas práticas de desenvolvimento
* Design Patterns

#### Bonus

Se voce fosse utilizar esse sistema comercialmente, que alterações vc faria para escalar e/ou facilitar a vida do usuario? OBS: Voce pode descrever isso aqui ou mostrar na implementação.

# Sobre você

Queremos saber um pouco mais sobre você também :) Por favor, responda o questionário do arquivo [questions.md](questions.md) e envie junto com seu projeto.
- DataStore id: desafio-173023
- Link: https://desafio-173023.appspot.com/

#Bugs conhecidos
*Foi implementado no pacote br.com.manager a classe IdManager para gerenciar os ids inseridos nas entidades persistidas.
E como os ids utilizados não foram persistidos toda vez que a aplicação morre a referência é perdida.
*A pesquisa de impostos por faixa de data não está funcionando e usuário não está funcionando.
4 changes: 4 additions & 0 deletions build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
source.. = src/main/java/,\
src/test/java/
bin.includes = META-INF/,\
.
52 changes: 52 additions & 0 deletions nbactions.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<actions>
<action>
<actionName>CUSTOM-appengine:devserver</actionName>
<displayName>appengine:devserver</displayName>
<goals>
<goal>appengine:devserver</goal>
</goals>
</action>
<action>
<actionName>CUSTOM-appengine:update</actionName>
<displayName>appengine:update</displayName>
<goals>
<goal>appengine:update</goal>
</goals>
</action>
<action>
<actionName>CUSTOM-appengine:rollback</actionName>
<displayName>appengine:rollback</displayName>
<goals>
<goal>appengine:rollback</goal>
</goals>
</action>
<action>
<actionName>CUSTOM-appengine:update_cron</actionName>
<displayName>appengine:update_cron</displayName>
<goals>
<goal>appengine:update_cron</goal>
</goals>
</action>
<action>
<actionName>CUSTOM-appengine:update_dos</actionName>
<displayName>appengine:update_dos</displayName>
<goals>
<goal>appengine:update_dos</goal>
</goals>
</action>
<action>
<actionName>CUSTOM-appengine:update_indexes</actionName>
<displayName>appengine:update_indexes</displayName>
<goals>
<goal>appengine:update_indexes</goal>
</goals>
</action>
<action>
<actionName>CUSTOM-appengine:update_queues</actionName>
<displayName>appengine:update_queues</displayName>
<goals>
<goal>appengine:update_queues</goal>
</goals>
</action>
</actions>
Loading