diff --git a/.gitIgnore b/.gitIgnore
new file mode 100644
index 0000000..21adda3
--- /dev/null
+++ b/.gitIgnore
@@ -0,0 +1 @@
+databaseEmpresa.db
\ No newline at end of file
diff --git a/32211207872718000117550010000217781877120005-nfe.xml b/NFes/32211207872718000117550010000217781877120005-nfe.xml
similarity index 100%
rename from 32211207872718000117550010000217781877120005-nfe.xml
rename to NFes/32211207872718000117550010000217781877120005-nfe.xml
diff --git a/NFe-002-3103.xml b/NFes/NFe-002-3103.xml
similarity index 99%
rename from NFe-002-3103.xml
rename to NFes/NFe-002-3103.xml
index 831d193..14aef0f 100644
--- a/NFe-002-3103.xml
+++ b/NFes/NFe-002-3103.xml
@@ -1,11 +1,11 @@
-3100464032Vendas a prazo55231032019-04-10T17:24:03-02:002019-04-11T17:17:30-02:001131702061171101000106273476000182MECA Office Mobil. Eireli-MEMECA Office Mobil. Eireli-MEAV. MARCOS DE FREITAS COSTA1055DANIEL FOSECA3170206UberlandiaMG384003281058BRASIL34323855857022916720058125587387000155HLTS ENGENHARIA E CONSTRUCOES LTDARUA MACHADO DE ASSIS1324LIDICE3170206UberlandiaMG384000811058BRASIL34322359661702177134005400331SEM GTINCADEIRA GIRATORIA S/ BRACO ALMOFADADA PRETO940190905102UN2165.00000330.00SEM GTINUN2165.00000177.6801020808IMOBILIZADO IMOB - 2317 CADEIRA GIRATORIA S/ BRACO ALMOFADADA PRETO - IMOBILIZADO EQUIP. MOVEIS P/ CANTEIRO MATERIAIS INSTALACAO DE CANTEIRO.01228SEM GTINCADEIRA GIRATORIA C/ BRACO ALMOFADADA PRETO940190905102UN1215.00000215.00SEM GTINUN1215.00000150.6101020808IMOBILIZADO EQUIP/MOVEIS P/ CANTEIRO MATERIAIS INSTALACAO DE CANTEIRO01324SEM GTINBANQUETA ALTA 70CM PARA BALCAO ASSENTO 30 OU940190905102PC190.0000090.00SEM GTINPC190.00000121.190102080840CM NA COR PRETA - IMOBILIZADO EQUIP./MOVEIS P/ CANTEIRO MATERIAIS INSTALACAO DE CANTEIRO01644SEM GTINESTANTE ACO C/ 06 PRATELEIRAS 0,93X040X1,98M940690205102PC2234.00000468.00SEM GTINPC2234.00000145.8701020808(REFORCADA) AMAPA - IMOBILIZADO.0.000.000.000.000.000.000.000.001103.000.000.000.000.000.000.000.000.000.001103.00195.3506VOLUMEVARIAS0.0000.0000000031031103.000.001103.000012019-05-111103.00141103.000.00ORDEM DE FORNECIMENTO 36994 - 28DD - INFORMACOES COMPLEMENTARES a seguinte informacao. EMPRESA ENQUADRADA NO SIMPLES NACIONAL. NAO GERA CREDITO DE IPI/ISS. GERA CREDITO DE ICMS. Trib aprox R$: 54,84 Federal 140,51 Estadual Fonte: IBPT empresometro.com.br S3A6R4ngqVwH6QNCAHyRuI529RIAr7Nyk=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
- 1
- 14.2.26
- 31190406273476000182550020000031031004640327
- 2019-04-10T17:23:27-03:00
- 131193257591884
- ngqVwH6QNCAHyRuI529RIAr7Nyk=
- 100
- Autorizado o uso da NF-e
-
-
+3100464032Vendas a prazo55231032019-04-10T17:24:03-02:002019-04-11T17:17:30-02:001131702061171101000106273476000182MECA Office Mobil. Eireli-MEMECA Office Mobil. Eireli-MEAV. MARCOS DE FREITAS COSTA1055DANIEL FOSECA3170206UberlandiaMG384003281058BRASIL34323855857022916720058125587387000155HLTS ENGENHARIA E CONSTRUCOES LTDARUA MACHADO DE ASSIS1324LIDICE3170206UberlandiaMG384000811058BRASIL34322359661702177134005400331SEM GTINCADEIRA GIRATORIA S/ BRACO ALMOFADADA PRETO940190905102UN2165.00000330.00SEM GTINUN2165.00000177.6801020808IMOBILIZADO IMOB - 2317 CADEIRA GIRATORIA S/ BRACO ALMOFADADA PRETO - IMOBILIZADO EQUIP. MOVEIS P/ CANTEIRO MATERIAIS INSTALACAO DE CANTEIRO.01228SEM GTINCADEIRA GIRATORIA C/ BRACO ALMOFADADA PRETO940190905102UN1215.00000215.00SEM GTINUN1215.00000150.6101020808IMOBILIZADO EQUIP/MOVEIS P/ CANTEIRO MATERIAIS INSTALACAO DE CANTEIRO01324SEM GTINBANQUETA ALTA 70CM PARA BALCAO ASSENTO 30 OU940190905102PC190.0000090.00SEM GTINPC190.00000121.190102080840CM NA COR PRETA - IMOBILIZADO EQUIP./MOVEIS P/ CANTEIRO MATERIAIS INSTALACAO DE CANTEIRO01644SEM GTINESTANTE ACO C/ 06 PRATELEIRAS 0,93X040X1,98M940690205102PC2234.00000468.00SEM GTINPC2234.00000145.8701020808(REFORCADA) AMAPA - IMOBILIZADO.0.000.000.000.000.000.000.000.001103.000.000.000.000.000.000.000.000.000.001103.00195.3506VOLUMEVARIAS0.0000.0000000031031103.000.001103.000012019-05-111103.00141103.000.00ORDEM DE FORNECIMENTO 36994 - 28DD - INFORMACOES COMPLEMENTARES a seguinte informacao. EMPRESA ENQUADRADA NO SIMPLES NACIONAL. NAO GERA CREDITO DE IPI/ISS. GERA CREDITO DE ICMS. Trib aprox R$: 54,84 Federal 140,51 Estadual Fonte: IBPT empresometro.com.br S3A6R4ngqVwH6QNCAHyRuI529RIAr7Nyk=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
+ 1
+ 14.2.26
+ 31190406273476000182550020000031031004640327
+ 2019-04-10T17:23:27-03:00
+ 131193257591884
+ ngqVwH6QNCAHyRuI529RIAr7Nyk=
+ 100
+ Autorizado o uso da NF-e
+
+
diff --git a/README.md b/README.md
index 817b8c7..63302b4 100644
--- a/README.md
+++ b/README.md
@@ -1,62 +1,40 @@
-# Venha para Recomb
-
-O desafio é desenvolver um programa que permita realizar as seguintes buscas:
-
-1) Listar os valores e data de Vencimento dos boletos presentes em um nota fiscal conforme o CPF ou CNPJ de um fornecedor.
-2) Apresentar o nome, identificador (CPF ou CNPJ), endereço dos clientes de um fornecedor.
-
-**Escolha as tecnologias que você vai usar e tente montar uma solução completa para rodar a aplicação.**
-
-Para enviar o resultado, basta realiazar um Fork deste repositório e abra um Pull Request, com seu nome.
-
-É importante comentar que deve ser enviado apenas o código fonte. Não aceitaremos códigos compilados.
-
-Por fim, o candidato deve atualizar o Readme.md com as seguintes informações:
-
- 1) Documentação da solução;
- 2) Lista dos diferenciais implementados
-
-## Avaliação
-
-O programa será avaliado levando em conta os seguintes critérios:
-|Critério| Valor|
-|-------|--------|
-|Legibilidade do Código |10|
-|Organização do Código|10|
-|Documentação do código |10|
-|Documentação da solução |10|
-|Tratamento de Erros |10|
-|Total| 50|
-
-A pontuação do candidato será a soma dos valores obtidos nos critérios acima.
-
-## Diferenciais
-
-O candidato pode aumentar a sua pontuação na seleção implementando um ou mais dos itens abaixo:
-|Item | Pontos Ganhos|
-|-----|--------------|
-|Criar um serviço com o problema |30|
-|Utilizar banco de dados |30|
-|Implementar Clean Code |20|
-|Implementar o padrão de programação da tecnologia escolhida |20|
-|Qualidade de Código com SonarQube| 15|
-|Implementar testes unitários |15|
-|Implementar testes comportamentais | 15|
-|Implementar integração com Travis |10|
-|Implementar integração com Travis + SonarQube |10|
-|Implementar usando Docker |5|
-|Total | 170|
-
-A nota final do candidato será acrescido dos pontos referente ao item implementado corretamente.
+# Solução
+#### A solução implementada recebe 1 arquivo .xml por vez, envia para o banco de dados e apresenta o resultado logo a baixo.
+#### Na pagina web o usuário consegue visualizar o arquivo que acabou de enviar e no 'Dados do Ciente' pode ver o que já está armazenado
+
+# Como rodar
+#### Existem outros 2 README dentro da pasta [api](#api) e [front_ler_xml](#front_ler_xml)
+#### É necessario executar um START dentro de cada pasta, dentro dos outros 2 README contém as informaçõs
+
+# Modulos
+#### A implentação da solução foi dividida em módulos:
+
+ * [User:](#User) define um modelo de dados utilizando o Sequelize.
+ * [db:](#db)configura uma instância do Sequelize para se conectar ao banco de dados.
+ * [app:](#app) entrada principal para aplicação Node.js usando o framework Express.
+ * [globals:](#globals) gerado automaticamente pelo next é um arquivo de estilo escrito em CSS, que define variáveis de cor, esquemas de cores, estilos e outras configurações globais para serem usadas em uma aplicação web.
+ * [layout:](#layout) um componente React que define o layout padrão para a aplicação.
+ * [page:](#page) componente React funcional que representa a página principal da aplicação.
+ * [styles:](#styles) todo componente css dos dados dos clientes.
+
+# Pastas
-## Penalizações
+ * [api:](#api) pasta onde esta concentrado o backend que contém:
+ * [modules:](#modules) contém os módulos relacionados a aplicação.
+ * [routes:](#routes) nela contém as rotas da aplicação Express.js
+ * [front_ler_xml:](#front_ler_xml) pasta onde esta concentrado o frontend que contém:
+ * [public:](#public) gerado automaticamente pelo next.
+ * [src/app:](#src/app) contém toda logica do lado do frontend.
-O candidato será desclassifiado nas seguintes situações:
-1) Submeter um solução que não funcione;
-2) Não cumprir os critérios presentes no seção Avaliação;
-3) Plágio;
+# Execução
+##### Para executar, por favor, olhe os dois README dentro da pasta /api e /front_ler_xml
+###### Decidi divir essa parte para não gerar confusão
-
+# Diferenciais implementados
+| Itens | Pontos |
+|--------------------------------|---------|
+| Criar um serviço com o problema| 30 |
+| Utilizar banco de dados | 30 |
\ No newline at end of file
diff --git a/api/.gitignore b/api/.gitignore
new file mode 100644
index 0000000..8cb2765
--- /dev/null
+++ b/api/.gitignore
@@ -0,0 +1,40 @@
+# Node.js
+node_modules/
+node_modules/*
+
+# Logs
+logs
+*.log
+
+# Dependency directories
+pnp/
+pnp.js
+
+# Testing
+coverage/
+
+# Build output
+build/
+dist/
+
+# Environment variables
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# Editor directories and files
+.vscode/
+.idea/
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+# Yarn
+yarn-error.log
+yarn.lock
+.pnp.*
+.pnp.js
+.yarn
diff --git a/api/.yarnrc.yml b/api/.yarnrc.yml
new file mode 100644
index 0000000..8b757b2
--- /dev/null
+++ b/api/.yarnrc.yml
@@ -0,0 +1 @@
+nodeLinker: node-modules
\ No newline at end of file
diff --git a/api/README.md b/api/README.md
new file mode 100644
index 0000000..7c51b88
--- /dev/null
+++ b/api/README.md
@@ -0,0 +1,22 @@
+# COMO RODAR
+
+```bash
+yarn install
+yarn start
+```
+
+# Sequelize: biblioteca javascript que facilita gerenciamento com o SQl
+
+```bash
+yarn add --save sequelize
+```
+
+# Baixar sqLite
+
+ https://sqlitestudio.pl/
+
+# acessar o banco de dados no navegador
+
+ ```bash
+ http://localhost:8080
+```
diff --git a/api/models/User.js b/api/models/User.js
new file mode 100644
index 0000000..b8d9264
--- /dev/null
+++ b/api/models/User.js
@@ -0,0 +1,51 @@
+const Sequelize = require('sequelize');
+const db = require('./db');
+
+const User = db.define('users', {
+ CNPJ: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ primaryKey: true
+ },
+ xNome: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ },
+ vNF: {
+ type: Sequelize.FLOAT,
+ allowNull: false,
+ },
+ dVenc: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ },
+ xLgr: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ },
+ nro: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ },
+ xBairro: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ },
+ xMun: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ },
+ UF: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ },
+ CEP: {
+ type: Sequelize.STRING,
+ allowNull: false,
+ },
+});
+
+//Criar a tabela
+User.sync();
+
+module.exports = User;
\ No newline at end of file
diff --git a/api/models/db.js b/api/models/db.js
new file mode 100644
index 0000000..47e1fe3
--- /dev/null
+++ b/api/models/db.js
@@ -0,0 +1,8 @@
+const Sequelize = require('sequelize');
+
+const sequelize = new Sequelize( {
+ dialect: 'sqlite',
+ storage: '../databaseEmpresa.db'
+});
+
+module.exports = sequelize;
diff --git a/api/package.json b/api/package.json
new file mode 100644
index 0000000..7d31be6
--- /dev/null
+++ b/api/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "api",
+ "version": "1.0.0",
+ "description": "",
+ "main": "jquery.min.js",
+ "scripts": {
+ "start": "nodemon routes/app.js localhost 8080 ",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "cors": "^2.8.5",
+ "express": "^4.18.2",
+ "mysql2": "^3.6.5",
+ "nodemon": "^3.0.1",
+ "sequelize": "^6.35.1",
+ "sqlite3": "^5.1.6"
+ }
+}
diff --git a/api/routes/app.js b/api/routes/app.js
new file mode 100644
index 0000000..ea72c39
--- /dev/null
+++ b/api/routes/app.js
@@ -0,0 +1,45 @@
+const express = require('express');
+const bodyParser = require('body-parser');
+const app = express();
+const User = require('../models/User');
+var cors = require('cors')
+app.use(cors())
+
+app.use(bodyParser.json());
+
+app.post("/", async (req, res) => {
+ try {
+ await User.create(req.body);
+ res.json({
+ mensagem: "Cliente cadastrado com sucesso"
+ });
+ } catch (error) {
+ console.error(error);
+ res.status(400).json({
+ mensagem: "Erro: Cliente não cadastrado"
+ });
+ }
+});
+
+
+app.get('/databaseEmpresa', async (_, res) => {
+ try {
+ const databaseEmpresa = await User.findAll({
+ attributes: ['CNPJ', 'xNome', 'vNF', 'dVenc', 'xLgr', 'nro', 'xBairro', 'xMun', 'UF', 'CEP'],
+ });
+
+ if (databaseEmpresa) {
+ res.json(databaseEmpresa);
+ } else {
+ res.status(404).json({ error: 'Nenhum dado encontrado' });
+ }
+ } catch (error) {
+ console.error('Erro ao obter dados do banco de dados:', error);
+ res.status(500).json({ error: 'Erro ao obter dados do banco de dados' });
+ }
+});
+
+
+app.listen(8080, () => {
+ console.log("Iniciando na porta 8080: http://localhost:8080");
+});
\ No newline at end of file
diff --git a/front_ler_xml/.eslintrc.json b/front_ler_xml/.eslintrc.json
new file mode 100644
index 0000000..bffb357
--- /dev/null
+++ b/front_ler_xml/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "next/core-web-vitals"
+}
diff --git a/front_ler_xml/.gitignore b/front_ler_xml/.gitignore
new file mode 100644
index 0000000..9ef565b
--- /dev/null
+++ b/front_ler_xml/.gitignore
@@ -0,0 +1,47 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+.yarn/install-state.gz
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
+
+# ignore yarn
+.yarn/
+.yarn/*
+yarn.lock
+!.yarn/cache
+!.yarn/releases
+!.yarn/plugins
+!.yarn/sdks
+!.yarn/versions
+
diff --git a/front_ler_xml/.yarnrc.yml b/front_ler_xml/.yarnrc.yml
new file mode 100644
index 0000000..8b757b2
--- /dev/null
+++ b/front_ler_xml/.yarnrc.yml
@@ -0,0 +1 @@
+nodeLinker: node-modules
\ No newline at end of file
diff --git a/front_ler_xml/README.md b/front_ler_xml/README.md
new file mode 100644
index 0000000..dc2b695
--- /dev/null
+++ b/front_ler_xml/README.md
@@ -0,0 +1,31 @@
+This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
+
+# COMO RODAR
+
+```bash
+yarn install
+yarn dev
+```
+
+Abra [http://localhost:3000](http://localhost:3000) com seu navegador para ver o resultado.
+
+Você pode começar a editar a página modificando `app/page.js`. A página é atualizada automaticamente conforme você edita o arquivo.
+
+Este projeto usa [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) para otimizar e carregar automaticamente o Inter, uma fonte personalizada do Google.
+
+## Saber mais
+-----------------------------------------------------------------------------------
+##### Resolvi deixar essa parte que foi gerada pelo next para melhores informações
+-----------------------------------------------------------------------------------
+Para saber mais sobre Next.js, dê uma olhada nos seguintes recursos:
+
+- [Documentação do Next.js](https://nextjs.org/docs) - aprenda sobre os recursos e a API do Next.js.
+- [Aprenda Next.js](https://nextjs.org/learn) - um tutorial interativo de Next.js.
+
+Você pode conferir [o repositório Next.js GitHub](https://github.com/vercel/next.js/) - seus comentários e contribuições são bem-vindos!
+
+## Implantar no Vercel
+
+A maneira mais fácil de implantar seu aplicativo Next.js é usar a [Plataforma Vercel](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app -readme) dos criadores do Next.js.
+
+Confira nossa [documentação de implantação do Next.js](https://nextjs.org/docs/deployment) para mais detalhes.
\ No newline at end of file
diff --git a/front_ler_xml/jsconfig.json b/front_ler_xml/jsconfig.json
new file mode 100644
index 0000000..b8d6842
--- /dev/null
+++ b/front_ler_xml/jsconfig.json
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/front_ler_xml/next.config.js b/front_ler_xml/next.config.js
new file mode 100644
index 0000000..767719f
--- /dev/null
+++ b/front_ler_xml/next.config.js
@@ -0,0 +1,4 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {}
+
+module.exports = nextConfig
diff --git a/front_ler_xml/package.json b/front_ler_xml/package.json
new file mode 100644
index 0000000..8e4ebf8
--- /dev/null
+++ b/front_ler_xml/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "front_ler_xml",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
+ },
+ "dependencies": {
+ "@babel/preset-react": "^7.23.3",
+ "next": "14.0.3",
+ "react": "^18",
+ "react-dom": "^18"
+ },
+ "devDependencies": {
+ "eslint": "^8",
+ "eslint-config-next": "14.0.3"
+ },
+ "description": "This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).",
+ "main": "next.config.js",
+ "author": "",
+ "license": "ISC"
+}
diff --git a/front_ler_xml/public/next.svg b/front_ler_xml/public/next.svg
new file mode 100644
index 0000000..5174b28
--- /dev/null
+++ b/front_ler_xml/public/next.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/front_ler_xml/public/vercel.svg b/front_ler_xml/public/vercel.svg
new file mode 100644
index 0000000..d2f8422
--- /dev/null
+++ b/front_ler_xml/public/vercel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/front_ler_xml/src/app/favicon.ico b/front_ler_xml/src/app/favicon.ico
new file mode 100644
index 0000000..718d6fe
Binary files /dev/null and b/front_ler_xml/src/app/favicon.ico differ
diff --git a/front_ler_xml/src/app/globals.css b/front_ler_xml/src/app/globals.css
new file mode 100644
index 0000000..d4f491e
--- /dev/null
+++ b/front_ler_xml/src/app/globals.css
@@ -0,0 +1,107 @@
+:root {
+ --max-width: 1100px;
+ --border-radius: 12px;
+ --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono',
+ 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro',
+ 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace;
+
+ --foreground-rgb: 0, 0, 0;
+ --background-start-rgb: 214, 219, 220;
+ --background-end-rgb: 255, 255, 255;
+
+ --primary-glow: conic-gradient(
+ from 180deg at 50% 50%,
+ #16abff33 0deg,
+ #0885ff33 55deg,
+ #54d6ff33 120deg,
+ #0071ff33 160deg,
+ transparent 360deg
+ );
+ --secondary-glow: radial-gradient(
+ rgba(255, 255, 255, 1),
+ rgba(255, 255, 255, 0)
+ );
+
+ --tile-start-rgb: 239, 245, 249;
+ --tile-end-rgb: 228, 232, 233;
+ --tile-border: conic-gradient(
+ #00000080,
+ #00000040,
+ #00000030,
+ #00000020,
+ #00000010,
+ #00000010,
+ #00000080
+ );
+
+ --callout-rgb: 238, 240, 241;
+ --callout-border-rgb: 172, 175, 176;
+ --card-rgb: 180, 185, 188;
+ --card-border-rgb: 131, 134, 135;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --foreground-rgb: 255, 255, 255;
+ --background-start-rgb: 0, 0, 0;
+ --background-end-rgb: 0, 0, 0;
+
+ --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0));
+ --secondary-glow: linear-gradient(
+ to bottom right,
+ rgba(1, 65, 255, 0),
+ rgba(1, 65, 255, 0),
+ rgba(1, 65, 255, 0.3)
+ );
+
+ --tile-start-rgb: 2, 13, 46;
+ --tile-end-rgb: 2, 5, 19;
+ --tile-border: conic-gradient(
+ #ffffff80,
+ #ffffff40,
+ #ffffff30,
+ #ffffff20,
+ #ffffff10,
+ #ffffff10,
+ #ffffff80
+ );
+
+ --callout-rgb: 20, 20, 20;
+ --callout-border-rgb: 108, 108, 108;
+ --card-rgb: 100, 100, 100;
+ --card-border-rgb: 200, 200, 200;
+ }
+}
+
+* {
+ box-sizing: border-box;
+ padding: 0;
+ margin: 0;
+}
+
+html,
+body {
+ max-width: 100vw;
+ overflow-x: hidden;
+}
+
+body {
+ color: rgb(var(--foreground-rgb));
+ background: linear-gradient(
+ to bottom,
+ transparent,
+ rgb(var(--background-end-rgb))
+ )
+ rgb(var(--background-start-rgb));
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
+
+@media (prefers-color-scheme: dark) {
+ html {
+ color-scheme: dark;
+ }
+}
diff --git a/front_ler_xml/src/app/layout.js b/front_ler_xml/src/app/layout.js
new file mode 100644
index 0000000..821f712
--- /dev/null
+++ b/front_ler_xml/src/app/layout.js
@@ -0,0 +1,17 @@
+import { Inter } from 'next/font/google'
+import './globals.css'
+
+const inter = Inter({ subsets: ['latin'] })
+
+export const metadata = {
+ title: 'Create Next App',
+ description: 'Generated by create next app',
+}
+
+export default function RootLayout({ children }) {
+ return (
+
+
{children}
+
+ )
+}
diff --git a/front_ler_xml/src/app/page.js b/front_ler_xml/src/app/page.js
new file mode 100644
index 0000000..c500bde
--- /dev/null
+++ b/front_ler_xml/src/app/page.js
@@ -0,0 +1,185 @@
+'use client';
+
+import React, { useState, useEffect } from 'react';
+import './styles.css';
+
+const Componente = () => {
+ const [userForm, setUserForm] = useState({
+ CNPJ: '',
+ xNome: '',
+ vNF: '',
+ dVenc: '',
+ xLgr: '',
+ nro: '',
+ xBairro: '',
+ xMun: '',
+ UF: '',
+ CEP: ''
+ });
+
+
+ // Função para ler o arquivo XML
+ const readXMLFile = () => {
+ const fileInput = document.getElementById('fileInput');
+ const file = fileInput.files[0];
+
+ //Verifica se o arquivo foi selecionado
+ if (file) {
+ const reader = new FileReader(); // Cria uma instância de FileReader para ler o conteúdo do arquivo
+
+ // Define uma função de retorno de chamada para ser executada quando a leitura do arquivo estiver concluída
+ reader.onload = function (e) {
+ // Obtém a string XML do resultado da leitura do arquivo
+ const xmlString = e.target.result;
+ // Cria uma instância do DOMParser para análise XML
+ const parser = new DOMParser();
+ // Analisa a string XML e cria um documento XM
+ const xmlDoc = parser.parseFromString(xmlString, 'text/xml');
+
+ try {
+ // Acessando os elementos XML
+ const CNPJValue = xmlDoc.getElementsByTagName('CNPJ')[0].textContent;
+ const xNomeValue = xmlDoc.getElementsByTagName('xNome')[0].textContent;
+ const vNFValue = xmlDoc.getElementsByTagName('vNF')[0].textContent;
+ const dVencValue = xmlDoc.getElementsByTagName('dVenc')[0].textContent;
+ const xLgrValue = xmlDoc.getElementsByTagName('xLgr')[0].textContent;
+ const nroValue = xmlDoc.getElementsByTagName('nro')[0].textContent;
+ const xBairroValue = xmlDoc.getElementsByTagName('xBairro')[0].textContent;
+ const xMunValue = xmlDoc.getElementsByTagName('xMun')[0].textContent;
+ const UFValue = xmlDoc.getElementsByTagName('UF')[0].textContent;
+ const CEPValue = xmlDoc.getElementsByTagName('CEP')[0].textContent;
+
+ // Atualizar o estado com os valores obtidos
+ setUserForm({
+ CNPJ: CNPJValue,
+ xNome: xNomeValue,
+ vNF: vNFValue,
+ dVenc: dVencValue,
+ xLgr: xLgrValue,
+ nro: nroValue,
+ xBairro: xBairroValue,
+ xMun: xMunValue,
+ UF: UFValue,
+ CEP: CEPValue
+ });
+
+ // Enviar dados para o servidor Node.js
+ fetch('http://localhost:8080/', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+
+ body: JSON.stringify({
+ CNPJ: CNPJValue,
+ xNome: xNomeValue,
+ vNF: vNFValue,
+ dVenc: dVencValue,
+ xLgr: xLgrValue,
+ nro: nroValue,
+ xBairro: xBairroValue,
+ xMun: xMunValue,
+ UF: UFValue,
+ CEP: CEPValue
+ }),
+ })
+ .then(response => response.json())
+ .then(data => {
+ console.log('Sucesso:', data);
+
+ // Recarregar pagina após sucesso
+ window.location.reload();
+ })
+ // Erro que possa ocorrer durante a requisição fetch
+ .catch((error) => {
+ console.log('Erro ao processar o arquivo XML:', error);
+ });
+ // Alerta de erro caso a NF não esteja no padrão pré etabelecido
+ } catch (error) {
+ console.warn('Erro, arquivo não condiz com padrão estabelecido:', error);
+ }
+ };
+
+ // Inicia a leitura do arquivo como texto
+ reader.readAsText(file);
+ } else {
+ console.warn('Nenhum arquivo selecionado.');
+ }
+ };
+
+ const [storedData, setStoredData] = useState([]);
+
+ // Função para obter os dados armazenados no banco de dados
+ const fetchStoredData = async () => {
+ try {
+ const response = await fetch('http://localhost:8080/databaseEmpresa');
+ const data = await response.json();
+ setStoredData(data);
+ } catch (error) {
+ console.warn('Erro ao obter dados armazenados:', error);
+ }
+ };
+
+ // Executar a função ao carregar a página
+ useEffect(() => {
+ fetchStoredData();
+ }, []);
+
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dados do Cliente
+
+
+
+
+ | CNPJ |
+ Nome |
+ Valor |
+ Data vencimento |
+ Logradouro |
+ Numero |
+ Bairro |
+ Municipio |
+ UF |
+ CEP |
+
+
+
+
+ {storedData.map((item, index) => (
+
+ | {item.CNPJ} |
+ {item.xNome} |
+ {item.vNF} |
+ {item.dVenc} |
+ {item.xLgr} |
+ {item.nro} |
+ {item.xBairro} |
+ {item.xMun} |
+ {item.UF} |
+ {item.CEP} |
+
+ ))}
+
+
+
+
+
+
+ );
+};
+
+export default Componente;
\ No newline at end of file
diff --git a/front_ler_xml/src/app/page.module.css b/front_ler_xml/src/app/page.module.css
new file mode 100644
index 0000000..6676d2c
--- /dev/null
+++ b/front_ler_xml/src/app/page.module.css
@@ -0,0 +1,229 @@
+.main {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: center;
+ padding: 6rem;
+ min-height: 100vh;
+}
+
+.description {
+ display: inherit;
+ justify-content: inherit;
+ align-items: inherit;
+ font-size: 0.85rem;
+ max-width: var(--max-width);
+ width: 100%;
+ z-index: 2;
+ font-family: var(--font-mono);
+}
+
+.description a {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.description p {
+ position: relative;
+ margin: 0;
+ padding: 1rem;
+ background-color: rgba(var(--callout-rgb), 0.5);
+ border: 1px solid rgba(var(--callout-border-rgb), 0.3);
+ border-radius: var(--border-radius);
+}
+
+.code {
+ font-weight: 700;
+ font-family: var(--font-mono);
+}
+
+.grid {
+ display: grid;
+ grid-template-columns: repeat(4, minmax(25%, auto));
+ max-width: 100%;
+ width: var(--max-width);
+}
+
+.card {
+ padding: 1rem 1.2rem;
+ border-radius: var(--border-radius);
+ background: rgba(var(--card-rgb), 0);
+ border: 1px solid rgba(var(--card-border-rgb), 0);
+ transition: background 200ms, border 200ms;
+}
+
+.card span {
+ display: inline-block;
+ transition: transform 200ms;
+}
+
+.card h2 {
+ font-weight: 600;
+ margin-bottom: 0.7rem;
+}
+
+.card p {
+ margin: 0;
+ opacity: 0.6;
+ font-size: 0.9rem;
+ line-height: 1.5;
+ max-width: 30ch;
+}
+
+.center {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ padding: 4rem 0;
+}
+
+.center::before {
+ background: var(--secondary-glow);
+ border-radius: 50%;
+ width: 480px;
+ height: 360px;
+ margin-left: -400px;
+}
+
+.center::after {
+ background: var(--primary-glow);
+ width: 240px;
+ height: 180px;
+ z-index: -1;
+}
+
+.center::before,
+.center::after {
+ content: '';
+ left: 50%;
+ position: absolute;
+ filter: blur(45px);
+ transform: translateZ(0);
+}
+
+.logo {
+ position: relative;
+}
+/* Enable hover only on non-touch devices */
+@media (hover: hover) and (pointer: fine) {
+ .card:hover {
+ background: rgba(var(--card-rgb), 0.1);
+ border: 1px solid rgba(var(--card-border-rgb), 0.15);
+ }
+
+ .card:hover span {
+ transform: translateX(4px);
+ }
+}
+
+@media (prefers-reduced-motion) {
+ .card:hover span {
+ transform: none;
+ }
+}
+
+/* Mobile */
+@media (max-width: 700px) {
+ .content {
+ padding: 4rem;
+ }
+
+ .grid {
+ grid-template-columns: 1fr;
+ margin-bottom: 120px;
+ max-width: 320px;
+ text-align: center;
+ }
+
+ .card {
+ padding: 1rem 2.5rem;
+ }
+
+ .card h2 {
+ margin-bottom: 0.5rem;
+ }
+
+ .center {
+ padding: 8rem 0 6rem;
+ }
+
+ .center::before {
+ transform: none;
+ height: 300px;
+ }
+
+ .description {
+ font-size: 0.8rem;
+ }
+
+ .description a {
+ padding: 1rem;
+ }
+
+ .description p,
+ .description div {
+ display: flex;
+ justify-content: center;
+ position: fixed;
+ width: 100%;
+ }
+
+ .description p {
+ align-items: center;
+ inset: 0 0 auto;
+ padding: 2rem 1rem 1.4rem;
+ border-radius: 0;
+ border: none;
+ border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25);
+ background: linear-gradient(
+ to bottom,
+ rgba(var(--background-start-rgb), 1),
+ rgba(var(--callout-rgb), 0.5)
+ );
+ background-clip: padding-box;
+ backdrop-filter: blur(24px);
+ }
+
+ .description div {
+ align-items: flex-end;
+ pointer-events: none;
+ inset: auto 0 0;
+ padding: 2rem;
+ height: 200px;
+ background: linear-gradient(
+ to bottom,
+ transparent 0%,
+ rgb(var(--background-end-rgb)) 40%
+ );
+ z-index: 1;
+ }
+}
+
+/* Tablet and Smaller Desktop */
+@media (min-width: 701px) and (max-width: 1120px) {
+ .grid {
+ grid-template-columns: repeat(2, 50%);
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ .vercelLogo {
+ filter: invert(1);
+ }
+
+ .logo {
+ filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
+ }
+}
+
+@keyframes rotate {
+ from {
+ transform: rotate(360deg);
+ }
+ to {
+ transform: rotate(0deg);
+ }
+}
diff --git a/front_ler_xml/src/app/styles.css b/front_ler_xml/src/app/styles.css
new file mode 100644
index 0000000..08551db
--- /dev/null
+++ b/front_ler_xml/src/app/styles.css
@@ -0,0 +1,36 @@
+/* Adicione isso ao seu arquivo styles.css ou em uma tag