diff --git a/README.md b/README.md
index 338e4406..6598460d 100644
--- a/README.md
+++ b/README.md
@@ -1,112 +1,46 @@
-# Por que trabalhar na Contabilizei
+# Minha solução para o Projeto de Pedidos
-**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.
+Projeto desenvolvido para o processo seletivo da Contabilizei
-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 utilizadas
-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.
+- Back-End
+ * Java EE
+ * Jersey Framework
+ * Tomcat 8
+ * MySQL
-### O que fazem os Ninjas da Contabilizei? O que comem (e bebem)? Onde vivem?
+- Front-End
+ * HTML5
+ * Bootstrap ~3.3.7
+ * JavaScript
+ * AngularJS ~1.5.8
-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 :)
+## Estruturas de Pastas
+- O projeto Back-End está localizado na pasta servico_rest
+- A Single Page Application está localizada na pasta app_pedidoscontabilizei
-# O trabalho por aqui
+## Como executar o projeto
-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
+Foi desenvolvido um Maven Project no Eclipse utilizando Java 8 e como Server Runtime o Tomcat 8,
+assim que você importar o projeto para a IDE, o adicione ao Tomcat e execute o comando Maven Update Project
+para atualização das dependêcias.
-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)
+Crie uma banco de dados no MySQL com o nome "pedidoscontabilizei" e altere os dados de acesso ao MySQL no arquivo
+META-INF/persistence.xml dentro da pasta resources do projeto.
-# O que preciso fazer?
+Certifique que o Tomcat esteja sendo executado na porta padrão 8080, pois todos as requisições da Single Page
+estão sendo executadas nessa porta.
-Vamos ser práticos e diretos, se você quer trabalhar conosco siga os passos abaixo:
+No desenvolvimento da Single Page Application, foi utilizado o NPM como gerenciador de pacotes após clonar o
+projeto execute ```npm install [opcional --save]``` para baixar suas dependências.
-* 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 (souninja@contabilizei.com.br) avisando que finalizou o desafio com a url do seu fork.
-* Cruze os dedos e aguarde nosso contato.
+Para evitar problemas com Access-Control-Allow-Origin dos Browsers, o projeto deve ser executado em cima de um
+simples servidor HTTP local, pode ser o do ```node http-server``` que é instalado através
+```npm install http-server -g``` ou o do Python caso tenha instalado na máquina.
-# O desafio (CRUD de pedidos)
+Exemplos de como executar a SPA, dentro da pasta app_pedidoscontabilizei execute:
-Você deverá criar 2 aplicações para cadastramento de pedidos de venda:
-
-**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.
-
-A aplicação Back-end dever ter, ao menos, serviços para: inclusão, alteração, exclusão e listagem dos pedidos.
-
-Pedidos deverão conter:
-* número
-* data de emissão
-* cliente
-* lista de produtos
-* valor total
-
-Cada produto do pedido deve ter:
-* código
-* descrição
-* quantidade
-* valor unitário
-
-No pedido, deve constar as seguintes informações do cliente:
-* cpf ou cnpj
-* nome ou razão social
-* telefone
-* e-mail
-
-### 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, Cassandra)
-
-#### Front-end
-
-* Single Page Application utilizando apenas HTML5 e CSS3
-* Javascript puro / JQuery (e plugins)
-* AngularJS 1.x (será diferencial)
-* Bootstrap (http://getbootstrap.com/) ou Angular Material Design (será diferencial)
-
-### 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
-
-# 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.
+- Utilizando Python: ```python -m http.server 8888```
+- Utilizando node: ```http-server -p 8888```
diff --git a/app_pedidoscontabilizei/app/app.js b/app_pedidoscontabilizei/app/app.js
new file mode 100644
index 00000000..9c885084
--- /dev/null
+++ b/app_pedidoscontabilizei/app/app.js
@@ -0,0 +1,5 @@
+(function () {
+ 'use strict';
+
+ angular.module('pedidos_app', []);
+})();
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/app/controllers/clientes_controller.js b/app_pedidoscontabilizei/app/controllers/clientes_controller.js
new file mode 100644
index 00000000..60c3bc47
--- /dev/null
+++ b/app_pedidoscontabilizei/app/controllers/clientes_controller.js
@@ -0,0 +1,84 @@
+(function () {
+ 'use strict';
+
+ angular.module('pedidos_app').controller('clientesController', clientesController);
+
+ clientesController.$inject = ['clienteAPI', '$scope'];
+
+ function clientesController(clienteAPI, $scope, $uibModal) {
+ $scope.clientes = [];
+ $scope.cliente;
+ $scope.escondeAdicionar = false;
+
+ $scope.buscaTodos = function () {
+ buscarTodos();
+ }
+
+ $scope.carregarFormulario = function (documento) {
+ clienteAPI.buscaPorCPF(documento).success(function (data) {
+ $scope.cliente = data;
+ $scope.escondeAdicionar = true;
+
+ $('#documentoCliente').attr('readonly', 'documentoCliente');
+ });
+ }
+
+ $scope.inserir = function (cliente) {
+ clienteAPI.inserir(cliente).success(function (data) {
+ limparDados();
+ })
+ .error(function (data) {
+ mostraErro(data);
+ });
+ }
+
+ $scope.alterar = function (cliente) {
+ clienteAPI.alterar(cliente).success(function (data) {
+ limparDados();
+ })
+ .error(function (data) {
+ mostraErro(data);
+ });
+ }
+
+ $scope.excluir = function (cpf) {
+ clienteAPI.excluir(cpf).success(function (data) {
+ limparDados();
+ })
+ .error(function (data) {
+ mostraErro(data);
+ });
+ }
+
+ $scope.cancelar = function () {
+ limparDados();
+ }
+
+ function buscarTodos() {
+ clienteAPI.buscaTodos().success(function (result) {
+ $scope.clientes = result;
+ });
+ }
+
+ function limparDados() {
+ $scope.cliente = null;
+ $scope.escondeAdicionar = false;
+
+ resetCliente();
+ buscarTodos();
+ }
+
+ function resetCliente() {
+ $('#nomRazaoSocial').val('');
+ $('#cpfCnpj').val('');
+ $('#telefone').val('');
+ $('#telefone').val('');
+ $('#documentoCliente').removeAttr('readonly', 'documentoCliente');
+ }
+
+ function mostraErro(data) {
+ alert("Infelizmente ocorreu um erro. Verifique seus dados e tente novamente mais tarde");
+ }
+ }
+
+})();
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/app/controllers/pedidos_controller.js b/app_pedidoscontabilizei/app/controllers/pedidos_controller.js
new file mode 100644
index 00000000..92360266
--- /dev/null
+++ b/app_pedidoscontabilizei/app/controllers/pedidos_controller.js
@@ -0,0 +1,172 @@
+(function () {
+ 'use strict';
+
+ angular.module('pedidos_app').controller('pedidosController', pedidosController);
+
+ pedidosController.$inject = ['pedidoAPI', 'clienteAPI', 'produtoAPI', '$scope'];
+
+ function pedidosController(pedidoAPI, clienteAPI, produtoAPI, $scope) {
+ $scope.pedido;
+ $scope.pedidos = [];
+ $scope.clientes = [];
+ $scope.produto = [];
+ $scope.produtosPedido = [];
+ $scope.codigoProdutos = [];
+ $scope.escondeAdicionar = false;
+
+ $scope.buscaTodos = function () {
+ buscaDadosIniciais();
+ }
+
+ $scope.carregarFormulario = function (codigo) {
+ resetPedidos();
+
+ pedidoAPI.buscaPorCodigo(codigo).success(function (data) {
+ $scope.pedido = data;
+ $scope.escondeAdicionar = true;
+ let tamanho = data.codigoProdutos.length;
+
+ for (var i = 0; i < tamanho; i++) {
+ var obj = new Object();
+ obj.codigo = data.codigoProdutos[i];
+ obj.descricao = data.descricaoProdutos[i];
+ obj.valorUnitario = data.valorUnitarioProdutos[i];
+
+ $scope.codigoProdutos.push(obj.codigo);
+ $scope.produtosPedido.push(obj);
+ }
+ })
+ }
+
+ $scope.inserir = function (pedido) {
+ if (pedido === undefined) {
+ alert("Ops! Os dados do seu pedido são inválidos!");
+ }
+
+ pedido.codigoProdutos = $scope.codigoProdutos;
+
+ pedidoAPI.inserir(pedido).success(function (data) {
+ limpaDados();
+ })
+ .error(function (data) {
+ mostraErro(data);
+ });
+ }
+
+ $scope.alterar = function (pedido) {
+ pedido.codigoProdutos = $scope.codigoProdutos;
+
+ pedidoAPI.alterar(pedido).success(function (data) {
+ limpaDados();
+ })
+ .error(function (data) {
+ mostraErro(data);
+ });
+ }
+
+ $scope.excluir = function (numero) {
+ pedidoAPI.excluir(numero).success(function (data) {
+ limpaDados();
+ })
+ .error(function (data) {
+ mostraErro(data);
+ });
+ }
+
+ $scope.adicionarProduto = function (produto) {
+ if (produto === undefined) {
+ return;
+ }
+
+ let existente = $scope.produtosPedido.some(function (arg) {
+ return arg.codigo == produto.codigo;
+ })
+
+ if (existente) {
+ alert("Produto já adicionado!")
+ return false;
+ }
+
+ $scope.codigoProdutos.push(produto.codigo);
+ $scope.produtosPedido.push(produto);
+
+ calculaTotal();
+ }
+
+ $scope.removerProduto = function (codigo) {
+ var novosCodigos = $scope.codigoProdutos.filter(function (param) {
+ return param != codigo;
+ });
+ $scope.codigoProdutos = [];
+
+ var novosProdutos = $scope.produtosPedido.filter(function (param) {
+ return param.codigo != codigo;
+ });
+ $scope.produtosPedido = [];
+
+ $scope.codigoProdutos = novosCodigos;
+ $scope.produtosPedido = novosProdutos;
+
+ calculaTotal();
+ }
+
+ $scope.cancelar = function () {
+ resetPedidos();
+ }
+
+ function calculaTotal() {
+ var total = $scope.produtosPedido.reduce(function (result, prod) {
+ return result + prod.valorUnitario;
+ }, 0);
+
+ $scope.pedido.valorTotal = parseFloat(total.toFixed(2));
+ }
+
+ function buscaDadosIniciais() {
+ $scope.pedidos = [];
+ $scope.produtos = [];
+ $scope.clientes = [];
+
+ pedidoAPI.buscaTodos().success(function (data) {
+ $scope.pedidos = data;
+ })
+ .error(function (data) {
+ console.log(data);
+ });
+
+ clienteAPI.buscaTodos().success(function (data) {
+ $scope.clientes = data;
+ })
+ .error(function (data) {
+ console.log(data);
+ });
+
+ produtoAPI.buscaTodos().success(function (data) {
+ $scope.produtos = data;
+ })
+ .error(function (data) {
+ console.log(data);
+ });
+ }
+
+ function limpaDados() {
+ $scope.pedido = null;
+ $scope.escondeAdicionar = false;
+
+ resetPedidos();
+ buscaDadosIniciais();
+ }
+
+ function resetPedidos(argument) {
+ $('select').val('');
+ $('#valorUnitario').val('');
+
+ $scope.produtosPedido = [];
+ $scope.codigoProdutos = [];
+ }
+
+ function mostraErro(data) {
+ alert("Infelizmente ocorreu um erro. Verifique seus dados e tente novamente mais tarde");
+ }
+ }
+})();
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/app/controllers/produtos_controller.js b/app_pedidoscontabilizei/app/controllers/produtos_controller.js
new file mode 100644
index 00000000..48d7bdca
--- /dev/null
+++ b/app_pedidoscontabilizei/app/controllers/produtos_controller.js
@@ -0,0 +1,83 @@
+(function () {
+ 'use strict';
+
+ angular.module('pedidos_app').controller('produtosController', produtosController);
+
+ produtosController.$inject = ['produtoAPI', '$scope'];
+
+ function produtosController(produtoAPI, $scope) {
+ $scope.produtos = [];
+ $scope.produto;
+ $scope.escondeAdicionar = false;
+
+ $scope.buscaTodos = function () {
+ buscarTodos();
+ }
+
+ $scope.carregarFormulario = function (codigo) {
+ produtoAPI.buscaPorCodigo(codigo).success(function (data) {
+ $scope.produto = data;
+ $scope.escondeAdicionar = true;
+ });
+ }
+
+ $scope.inserir = function (produto) {
+ produto.valorUnitario = produto.valorUnitario.replace(',', '.');
+
+ produtoAPI.inserir(produto).success(function (data) {
+ limparDados();
+ })
+ .error(function (data) {
+ mostraErro(data);
+ });
+ }
+
+ $scope.alterar = function (produto) {
+ produto.valorUnitario = produto.valorUnitario.replace(',', '.');
+
+ produtoAPI.alterar(produto).success(function (data) {
+ limparDados();
+ })
+ .error(function (data) {
+ mostraErro(data);
+ });
+ }
+
+ $scope.excluir = function (codigo) {
+ produtoAPI.excluir(codigo).success(function (data) {
+ limparDados();
+ })
+ .error(function (data) {
+ mostraErro(data);
+ });
+ }
+
+ $scope.cancelar = function (argument) {
+ limparDados();
+ }
+
+ function buscarTodos() {
+ produtoAPI.buscaTodos().success(function (data) {
+ $scope.produtos = data;
+ });
+ }
+
+ function limparDados(argument) {
+ $scope.produto = null;
+ $scope.escondeAdicionar = false;
+
+ resetProdutos();
+ buscarTodos();
+ }
+
+ function resetProdutos() {
+ $('#descricao').val('');
+ $('#quantidade').val('');
+ $('#valorUnitario').val('');
+ }
+
+ function mostraErro(data) {
+ alert("Infelizmente ocorreu um erro. Verifique seus dados e tente novamente mais tarde");
+ }
+ }
+})();
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/app/services/clientes_service.js b/app_pedidoscontabilizei/app/services/clientes_service.js
new file mode 100644
index 00000000..33885706
--- /dev/null
+++ b/app_pedidoscontabilizei/app/services/clientes_service.js
@@ -0,0 +1,39 @@
+(function () {
+ 'use strict';
+
+ angular.module('pedidos_app').factory('clienteAPI', clienteAPI);
+
+ clienteAPI.$inject = ['$http'];
+
+ function clienteAPI($http) {
+ var _buscaTodos = function () {
+ return $http.get('http://localhost:8080/pedidoscontabilizei/rest/clientes');
+ }
+
+ var _inserir = function (cliente) {
+ return $http.post('http://localhost:8080/pedidoscontabilizei/rest/clientes', cliente);
+ }
+
+
+ var _alterar = function (cliente) {
+ return $http.put('http://localhost:8080/pedidoscontabilizei/rest/clientes', cliente);
+ }
+
+ var _excluir = function (cpf) {
+ return $http.delete('http://localhost:8080/pedidoscontabilizei/rest/clientes/' + cpf);
+ }
+
+ var _buscaPorCPF = function (cpf) {
+ return $http.get('http://localhost:8080/pedidoscontabilizei/rest/clientes/' + cpf);
+ }
+
+ return {
+ buscaTodos : _buscaTodos,
+ buscaPorCPF : _buscaPorCPF,
+ inserir : _inserir,
+ alterar : _alterar,
+ excluir : _excluir
+ }
+ }
+
+})();
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/app/services/pedidos_service.js b/app_pedidoscontabilizei/app/services/pedidos_service.js
new file mode 100644
index 00000000..aefd2af9
--- /dev/null
+++ b/app_pedidoscontabilizei/app/services/pedidos_service.js
@@ -0,0 +1,37 @@
+(function () {
+ 'use strict';
+
+ angular.module('pedidos_app').factory('pedidoAPI', pedidoAPI);
+
+ pedidoAPI.$inject = ['$http'];
+
+ function pedidoAPI($http) {
+ var _buscaTodos = function () {
+ return $http.get('http://localhost:8080/pedidoscontabilizei/rest/pedidos');
+ }
+
+ var _buscaPorCodigo = function (codigo) {
+ return $http.get('http://localhost:8080/pedidoscontabilizei/rest/pedidos/' + codigo);
+ }
+
+ var _inserir = function (pedido) {
+ return $http.post('http://localhost:8080/pedidoscontabilizei/rest/pedidos', pedido);
+ }
+
+ var _alterar = function (pedido) {
+ return $http.put('http://localhost:8080/pedidoscontabilizei/rest/pedidos', pedido);
+ }
+
+ var _excluir = function (codigo) {
+ return $http.delete('http://localhost:8080/pedidoscontabilizei/rest/pedidos/' + codigo);
+ }
+
+ return {
+ buscaTodos : _buscaTodos,
+ buscaPorCodigo : _buscaPorCodigo,
+ inserir : _inserir,
+ alterar : _alterar,
+ excluir : _excluir
+ }
+ }
+})();
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/app/services/produtos_service.js b/app_pedidoscontabilizei/app/services/produtos_service.js
new file mode 100644
index 00000000..c57770bf
--- /dev/null
+++ b/app_pedidoscontabilizei/app/services/produtos_service.js
@@ -0,0 +1,37 @@
+(function () {
+ 'use strict';
+
+ angular.module('pedidos_app').factory('produtoAPI', produtoAPI);
+
+ produtoAPI.$inject = ["$http"];
+
+ function produtoAPI($http) {
+ var _buscaTodos = function () {
+ return $http.get('http://localhost:8080/pedidoscontabilizei/rest/produtos');
+ }
+
+ var _buscaPorCodigo = function (codigo) {
+ return $http.get('http://localhost:8080/pedidoscontabilizei/rest/produtos/' + codigo);
+ }
+
+ var _inserir = function (produto) {
+ return $http.post('http://localhost:8080/pedidoscontabilizei/rest/produtos', produto);
+ }
+
+ var _alterar = function (produto) {
+ return $http.put('http://localhost:8080/pedidoscontabilizei/rest/produtos', produto);
+ }
+
+ var _excluir = function (codigo) {
+ return $http.delete('http://localhost:8080/pedidoscontabilizei/rest/produtos/' + codigo);
+ }
+
+ return {
+ buscaTodos : _buscaTodos,
+ buscaPorCodigo : _buscaPorCodigo,
+ inserir : _inserir,
+ alterar : _alterar,
+ excluir : _excluir
+ }
+ }
+})();
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/assets/css/index.css b/app_pedidoscontabilizei/assets/css/index.css
new file mode 100644
index 00000000..be19f0cb
--- /dev/null
+++ b/app_pedidoscontabilizei/assets/css/index.css
@@ -0,0 +1,3 @@
+table.table {
+ margin-top: 3%;
+}
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/assets/js/index.js b/app_pedidoscontabilizei/assets/js/index.js
new file mode 100644
index 00000000..11c5c8cd
--- /dev/null
+++ b/app_pedidoscontabilizei/assets/js/index.js
@@ -0,0 +1,31 @@
+function escondeElementos(texto) {
+ if (texto === 'Pedidos') {
+ $('#pedidos').show();
+ $('#clientes').hide();
+ $('#produtos').hide();
+ }
+
+ if (texto === 'Clientes') {
+ $('#clientes').show();
+ $('#pedidos').hide();
+ $('#produtos').hide();
+ }
+
+ if (texto === 'Produtos') {
+ $('#produtos').show();
+ $('#clientes').hide();
+ $('#pedidos').hide();
+ }
+}
+
+$(function() {
+ $('.tab-section').on('click', function () {
+ var texto = $(this).text();
+ escondeElementos(texto);
+ });
+
+ $('.selectpicker').selectpicker({
+ style: 'btn-info',
+ size: 5
+ });
+});
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/index.html b/app_pedidoscontabilizei/index.html
new file mode 100644
index 00000000..0ba4af3e
--- /dev/null
+++ b/app_pedidoscontabilizei/index.html
@@ -0,0 +1,54 @@
+
+
+
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/views/pedidos/listar.html b/app_pedidoscontabilizei/views/pedidos/listar.html
new file mode 100644
index 00000000..2f8e9147
--- /dev/null
+++ b/app_pedidoscontabilizei/views/pedidos/listar.html
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
Cadatro de Pedidos
+
+
+
+
+
+
+
+
Nº Pedido
+
Cliente
+
Valor Total
+
Ações
+
+
+
+
{{ pedido.numero }}
+
{{ pedido.nomeCliente }}
+
{{ pedido.valorTotal | currency:"R$ " }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app_pedidoscontabilizei/views/produtos/listar.html b/app_pedidoscontabilizei/views/produtos/listar.html
new file mode 100644
index 00000000..2ca30c80
--- /dev/null
+++ b/app_pedidoscontabilizei/views/produtos/listar.html
@@ -0,0 +1,66 @@
+