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

+

+ + + + + + + + + + + + + + + + + + {storedData.map((item, index) => ( + + + + + + + + + + + + + ))} + +
CNPJNomeValorData vencimentoLogradouroNumeroBairroMunicipioUFCEP
{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