diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2065bc --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/32211207872718000117550010000217781877120005-nfe.xml b/32211207872718000117550010000217781877120005-nfe.xml index 0b01f56..fc6ef5f 100644 --- a/32211207872718000117550010000217781877120005-nfe.xml +++ b/32211207872718000117550010000217781877120005-nfe.xml @@ -1,2 +1,282 @@ -3287712000VENDA MERCAD.ADQ.TERCEIROS551217782021-12-01T19:03:21-03:002021-12-01T19:03:21-03:0011320130811511010MeLinux 6.307872718000117COMERCIAL S.R.DE ALIMENTOS LTDA-MESR ALIMENTOSR.ODONIA DA COSTA MACHADO TOLEDO56QUADRA 1 LOTE 5TIRADENTES3201308CARIACICAES291435291058BRASIL2733363026082384975317197072000173JEFERSON SIMAO DE OLIVEIRA - MERUA SAO JOAO49ITACIBA3201308CARIACICAES291502301058BRASIL279965021211082917825001378SEM GTINFILE MERLUZA ARGENTINA INTERF.CX 18 c/ 18 KG030474005102CX1503.82503.82SEM GTINCX1827.991220358.82207.4617.0035.279995301503.820.653.2701503.823.0015.110001957896481907388CUPIM MAGRO FRISA CX -+ 18KG0201300017084005405KG21.7129.12989406632.417896481907388KG21.7129.1298940610609995301632.410.654.1101632.413.0018.97207.4635.270.000.000.000.000.000.001136.230.000.000.000.000.000.007.3834.080.001136.23907872718000117COMERCIAL S.R.DE ALIMENTOS LTDA-ME082384975RUA ODONIA DA COSTA MACHADO TOLEDO, 41 QD 1 LOTE 5 TIRADENTECARIACICAES23DIVERSASDIVERSAS40.1060217781136.230.001136.230012022-12-15568.110022022-12-22568.12151136.23Cod.Dest: 7452 Fantasia: REST.ESPA.GRILL Faturista: IGOR REIS # Forma Pag: BOLETO # Vendedor: TACIANI (27)99735-5228 Num.Ped: 102667 # Doc.emitido por ME/EPP optante do SIMPLES NACIONAL; nao gera credito fiscal de IPI e ISS # RUA DA FEIRA # sem email cadastrado para envio do XML # # Confira no ato da entrega, evite reclamacoes posteriores19495981000113OTMA SOLUCOES LTDAcontato@otmasolucoes.com.br2721417943yU29u4Sva8be/dmxDzD7eyMIOaY=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 -1SVRS202111190951322112078727180001175500100002177818771200052021-12-01T19:03:22-03:00332210083442441yU29u4Sva8be/dmxDzD7eyMIOaY=100Autorizado o uso da NF-e \ No newline at end of file + + + + + + 32 + 87712000 + VENDA MERCAD.ADQ.TERCEIROS + 55 + 1 + 21778 + 2021-12-01T19:03:21-03:00 + 2021-12-01T19:03:21-03:00 + 1 + 1 + 3201308 + 1 + 1 + 5 + 1 + 1 + 0 + 1 + 0 + MeLinux 6.3 + + + 07872718000117 + COMERCIAL S.R.DE ALIMENTOS LTDA-ME + SR ALIMENTOS + + R.ODONIA DA COSTA MACHADO TOLEDO + 56 + QUADRA 1 LOTE 5 + TIRADENTES + 3201308 + CARIACICA + ES + 29143529 + 1058 + BRASIL + 2733363026 + + 082384975 + 3 + + + 17197072000173 + JEFERSON SIMAO DE OLIVEIRA - ME + + RUA SAO JOAO + 49 + ITACIBA + 3201308 + CARIACICA + ES + 29150230 + 1058 + BRASIL + 27996502121 + + 1 + 082917825 + + + + 001378 + SEM GTIN + FILE MERLUZA ARGENTINA INTERF.CX 18 c/ 18 KG + 03047400 + 5102 + CX + 1 + 503.82 + 503.82 + SEM GTIN + CX + 18 + 27.99 + 1 + + + + + 2 + 20 + 3 + 58.82 + 207.46 + 17.00 + 35.27 + + + + 999 + + 53 + + + + + 01 + 503.82 + 0.65 + 3.27 + + + + + 01 + 503.82 + 3.00 + 15.11 + + + + + + + 000195 + 7896481907388 + CUPIM MAGRO FRISA CX -+ 18KG + 02013000 + 1708400 + 5405 + KG + 21.71 + 29.12989406 + 632.41 + 7896481907388 + KG + 21.71 + 29.12989406 + 1 + + + + + 0 + 60 + + + + 999 + + 53 + + + + + 01 + 632.41 + 0.65 + 4.11 + + + + + 01 + 632.41 + 3.00 + 18.97 + + + + + + + 207.46 + 35.27 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 1136.23 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 7.38 + 34.08 + 0.00 + 1136.23 + + + + 9 + + 07872718000117 + COMERCIAL S.R.DE ALIMENTOS LTDA-ME + 082384975 + RUA ODONIA DA COSTA MACHADO TOLEDO, 41 QD 1 LOTE 5 TIRADENTE + CARIACICA + ES + + + 23 + DIVERSAS + DIVERSAS + 40.106 + + + + + 021778 + 1136.23 + 0.00 + 1136.23 + + + 001 + 2022-12-15 + 568.11 + + + 002 + 2022-12-22 + 568.12 + + + + + 15 + 1136.23 + + + + Cod.Dest: 7452 Fantasia: REST.ESPA.GRILL Faturista: IGOR REIS # Forma Pag: BOLETO # Vendedor: + TACIANI (27)99735-5228 Num.Ped: 102667 # Doc.emitido por ME/EPP optante do SIMPLES NACIONAL; nao + gera credito fiscal de IPI e ISS # RUA DA FEIRA # sem email cadastrado para envio do XML # # Confira + no ato da entrega, evite reclamacoes posteriores + + + + 19495981000113 + OTMA SOLUCOES LTDA + contato@otmasolucoes.com.br + 2721417943 + + + + + + + + + + + + + yU29u4Sva8be/dmxDzD7eyMIOaY= + + + + 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 + + + + + + + + 1 + SVRS202111190951 + 32211207872718000117550010000217781877120005 + 2021-12-01T19:03:22-03:00 + 332210083442441 + yU29u4Sva8be/dmxDzD7eyMIOaY= + 100 + Autorizado o uso da NF-e + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..43156d6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM eclipse-temurin:17-jdk-alpine +VOLUME /tmp +COPY /build/libs/RecombApp-0.0.1-SNAPSHOT.jar app.jar +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/Documentacao.md b/Documentacao.md new file mode 100644 index 0000000..8c0d7ac --- /dev/null +++ b/Documentacao.md @@ -0,0 +1,307 @@ +# Documentação do Funcionamento da Implementação do Sistema + +## O FRONTEND +### VUE +- O VUE, framework de JavaScript, com possibilidade de implementação utilizando o TypeScript também, +foi escolhido por conta da versatilidade, usabilidade e facilidade na comuniação de seus componentes com +o consumo da API desenvolvida. Além disso, pode-se destacar a organização de sua estrutura, que, por ser simples, torna +viável o uso de bibliotecas necessárias, através do node, para desenvolvimento do sistema + +#### VIEWS +- Home View
+A Home View, localizado em _views_, possui a renderização do componente desenvolvido para esse sistema. +Como o _App.vue_ está com o RouterView para renderização, ao inserirmos o path: "_/_", ou seja, o path root, a renderização a ser +realizada é da própria home. Dessa forma, o componente _TheWelcome_ está sendo "consumido" para a criação +do modelo da página e sua posterior renderização. + +``` + + + + +``` + +#### ROTAS +- index.js
+As rotas, como abordado de forma rápida no tópico acima, define qual URL está sendo renderizada no momento, ou seja, +qual View deve ser renderizada conforme o path informado. Na rota implementada não houve necessidade de implementação +de outras possibilidades, visto que, uma única rota possui a formatação necessária para o envio do arquivo e visualização da consulta quando filtrado.
+``` + const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + name: 'home', + component: HomeView + }, + ] + }) +``` + +#### COMPONENTES +- components/TheWelcome
+O único componente desenvolvido foi o _TheWelcome_, o mesmo que é inicializado quando é criado um projeto +em VUE. Para definir melhor cada parte, separemos em partes: +--- +##### Nome e Dados +``` +export default { + name: "TheWelcome", + data() { + return { + xml_file: null, + resp: null, + showMessage: false, + search: "", + clientes_fornecedor: [] + } + }, +``` +O trecho de código acima possui a criação do nome do componente, ou seja, outro componente, view, serviço, etc, que queiram +importar esse componente, fazem através do nome informado no campo _name_.
+ +**DATA**
+Data retorna a criação de objetos no DOM do componente. Dessa forma, a parte lógica e o desenvolvimento de métodos +que precisam de consumir determinados dados, atualizar informações, fazem assim através da chamada _this.nomedodado_. +Dessa forma, no sistema desenvolvido existem alguns campos diferentes: +- xml_file: Responsavel por armazenar o arquivo xml +- resp: Responsável por armazenar o response em Json +- showMessage: Determina se houveram inicidências de Clientes ou Fornecedores a partir do filtro informado +- search: Armazena o campo de Pesquisa atual, ou seja, o que o usuário está digitando no campo de filtro +- clientes_fornecedor: Armazena todos os clientes e fornecedores que possuem CPF ou CNPJ com a os numeros informados + +--- +**Metodos** +``` +methods: { + sendFile() { + let FileForm = new FormData(); + FileForm.append("fileNf", this.xml_file); + if (this.xml_file['type'] !== 'text/xml') { + alert("Por favor, envie um arquivo XML válido!") + } else { + + sendFileXML(FileForm).then((response) => (this.resp = response.data)) + .then((response) => + this.resp = this.resp.map((d) => { + return { + boleto: d.boleto, + cliente: d.cliente, + fornecedor: d.fornecedor, + }; + })); + } + }, + doSearch(value) { + searchClient(value).then((response) => { + this.clientes_fornecedor = response.data; + if(response.data.fornecedores.length > 0 || response.data.clientes.length > 0){ + this.showMessage = false + } + }) + + }, + onImageUpload() { + this.xml_file = this.$refs.uploadImage.files[0]; + } + }, +``` +**sendFile**
+O Método cria um FormData em sua inicialização. Isso ocorre, pois, como estamos fazendo o envio de um arquivo, +para que a API possa entender o que está sendo passado e para que a requisição possa enviar o XML, o formData oferece +a possibilidade de fazer esse envio. Observa-se, no entanto, que, o FileForm possui um nome e um valor, e nesse caso +o nome informado no FileForm é o mesmo em que a API está esperando o arquivo, dessa forma facilita o consumo e a chegada do arquivo na Controller +para ser processado no serviço.
+Na continuação da chamada desse serviço, o Método então se comunica com sendFileXml, uma função inclusa no _axiosService_ e nesse momento, +após criar o FormFile, passa ele como parâmetro.
+O mapeamento que ocorre em seguida recebe as informações da NotaFiscal que a Controller retorna como um ResponseEntity no padrão informado. +No decorrer do processamento dessa página, ao enviar um arquivo XML válido, é criada uma seção abaixo da ‘interface’ principal que retorna com as informações da NFE referente +ao arquivo enviado.
+ +**doSearch()**
+O método faz a busca, com a chamada do axios em _axiosService_ informando o valor que está presente no campo de filtro. +``` +
+ +
+``` +O retorno da chamada do axios, o response, é passado para a variável criada _clientes_fornecedor_, e na continuidade, +é feita uma verificação para saber se houve algum retorno de objetos esperados. Caso haja retorno, a variável _showMessage_ recebe o valor de false, +indicando que não é necessário informar que não houve retornos, e por fim, a _div_ que possui essa condição não será renderizada. + +**onFileUpload**
+A função _onImageUpload_ é apenas chamada em condição de alteração de campo. +``` + +``` +A notação _@change_ verifica se houve alguma mudança no input. Se houver qualquer alteração, a função é chamada. Sua funcionalidade é armazenar +o arquivo enviado à variável informada, e dessa forma, possibilitar a ciração do FileForm. + +--- +**WATCHER** + +``` +watch: { + search(value) { + if (this.search.length < 3) { + this.showMessage = false + this.clientes_fornecedor = [] + } + if (this.search.length > 2) { + this.showMessage = true + this.doSearch(value) + } + } + }, +``` +O Watcher, ou watch, como seu próprio nome indica, assiste alguma mudança que possa ocorrer. No desenvolvimento do sistema, +uma das ideias foi implementar a funcionalidade de filtro de forma dinâmica, ou seja, sem a necessidade de clicar em um botão para +consumir o serviço. Dessa forma, houve a implementação: +``` +
+ +
+``` +O _watch_ observa o input com o v-model _search_, o qual possui o campo em _data_ como já informado. Dessa forma, a cada mudança, ocorre a chamada +da pesquisa de Clientes e Fornecedores para visualização na Interface _doSearch_. Para impedir uma consulta constante, +foi implementada a necessidade de que o campo possua no mínimo 3 caracteres para que a consulta seja realizada. + +### Estilização +Apenas para referenciamento, a estilização dos componentes da página foi realizada com _Tailwind_. A implementação do Tailwind se deu pela conta da +familiariedade com a ferramente e as opções ofertadas para construção de elementos no DOM com a utilização de diversas classes disponibilizadas. +--- +## O BACKEND +### JAVA (SpringBoot) - MYSQL + +A utilização de JAVA nesse sistema não foi por acaso. A escolha da linguagem e seu Framework foi realizada através da conclusão de possuir uma organização +bem estruturada. O Java é uma linguagem robusta, fortemente tipada com seu desenvolvimento voltado para Orientação a Objetos, o qual também é utilizado no desenvolvimento +de banco de dados. Dessa forma, torna-se mais viável, por conta da estratégia de criação de objetos semelhante na comunicação da linguagem com o Banco de Dados (MySql).
+O Padrão escolhido para esse projeto foi o MVC(Model, View, Controller). Como abordado em algumas partes do _Front End_ a controller tem um papel fundamental na chamada de serviços com +recebimento de dados do _Front-End_ ou no envio de informações à ‘interface’. + +--- +### Controllers +#### ConvertXmlJson +A controller possui apenas o Método de POST. O seu endpoint _/convert/xmlToJson_ permite que o arquivo enviado seja redirecionado para o serviço desejado. + +#### ClienteController +A controller possui dois métodos _GET_, pois, no desenvolvimento de busca de informações, não houve necessidade de implementar o POSTMAPPING do cliente, +uma vez que, a criação de cliente se dá pela análise do arquivo XML enviado pelo usuário. +##### ("/cliente/getAll") - Retorna todos os clientes no Banco de Dados +##### ("/cliente/{documento}") - Retorna os clientes com o documento(cpf) informado. + +#### NotaFiscalController +Possui apenas um GET, o qual retorna os Clientes e Fornecedores conforme o documento. O mesmo foi colocado em NotaFiscalController, pois na continuidade de uma implementação, +as informaçãoes completas dos mesmo serão trazidas, ou seja, a NotaFiscal completa. +##### ("/notafiscal/{documento}") - Retorna Clientes e Fornecedores com a inicialização do CPF ou CNPJ iguais ao documento informado + +--- +### Model +Os modelos Criados são as mesmas entidades criadas no Banco de dados. A notação de persistência abaixo garante que isso aconteça. +``` +@Table(name = "nome_tabel") +@Entity +@Getter +@Setter +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +``` +Em table cria-se a tabela.
+Em Entity cria-se a entidade daquele objeto.
+Em Getter cria-se os Getters de todos os campos do objeto.
+Em Setter cria-se os Setters de todos os campos do objeto.
+Em Data é garantida a persitência de dados.
+Em Builder é possível construir o objeto sem necessariamente instanciar com _new_.
+ +--- +### Payload +Os Payloads são tratados como As requisições necessárias que a controller pode receber, ou as Responses que a Controller pode enviar. +O Paylaod.response.NFResponse, por exemplo, é utilizado para aramazenar o retorno dos clientes e fornecedores, e retornar à Controller.
+Os Payloads possuem também a notação _@Builder_, dessa forma, um serviço pode construir a resposta sem Instanciação, deixando o código mais legível e eficiente. + +--- +### Repository +Os repositórios são interfaces responsáveis pelas Queries com o Banco de dados. Ou seja, cada repositório é responsável por um modelo. + +#### A implementação com o JPA +O JPA, Java Persistence API, possui uma linguagem de criação de consulta inteligente. Para uma determinada consulta, a API possui palavras reservadas, +para o nome da função resultante, que entende o retorno que será obtido e qual query, ou queries, devem ser feitas no Banco de Dados. Exemplo: +``` +List findFornecedorsByCNPJStartsWith(String Cnpj); +``` +O JPA entende da seguinte forma: _findFornecedores_, como a palavra está no plural, deve-se dar um "SELECT *" e o resultado vai ser o mapeamento para a Model de Fornecedores. +Porém, como eu vou achá-los? Qual o parâmetro? O mesmo é passado em seguida. _ByCNPJStartsWith_ é similar ao _LIKE %%_, porém, apenas a inicialização da palavra, pois, se o número do CPF ou CNPJ +que estivermos filtrando estiver no meio, ou separado pelo campo, não fará sentido em ser um resultado da busca que possui uma determinada ordem. + +--- +### SERVICES +#### Deserialize.DeserializeXML +O serviço de Deserialização do XML é realizado com o Jackson. O Jackson é um processador JSON de altoi desempenho. Com ele foi possível implementar a conversão de XML para JSON e criar o objeto necessário de acordo com o Modelo requerido. +
_SaveXml_ Possui a implementação do Mapeador para XML ser lido como JSON. Dessa forma, é criado um JsonNode, o qual faz a leitura do arquivo solicitado e o mapeia como nós em JSON.
+Sendo assim, para que cada componente pudesse receber um valor, o Objeto JsonNode permite fazer uma busca com base nas Tags XML. Dessa forma, para cada campo de cada modelo, foi passado o caminho e extraído o valor. +``` +ClienteDTO clienteDTO = ClienteDTO.builder() + .CPF(node.at("/NFe/infNFe/dest").get("CNPJ").asText()) + .nome(node.at("/NFe/infNFe/dest").get("xNome").asText()) + .endereco(enderecoDTOModel) + .build(); + +FornecedorDTO fornecedorDTO = FornecedorDTO.builder() + .CNPJ(node.at("/NFe/infNFe/emit").get("CNPJ").asText()) + .nome(node.at("/NFe/infNFe/emit").get("xNome").asText()) + .EnderecoEmissor(enderecoEmissorDTOModel) + .build(); + +EnderecoDTO enderecoEmissorDTO = EnderecoDTO.builder() + .CEP(node.at("/NFe/infNFe/emit/enderEmit").get("CEP").asText()) + .cMun(node.at("/NFe/infNFe/emit/enderEmit").get("cMun").asText()) + .cMun(node.at("/NFe/infNFe/emit/enderEmit").get("cMun").asText()) + .cPais(node.at("/NFe/infNFe/emit/enderEmit").get("cPais").asText()) + .xMun(node.at("/NFe/infNFe/emit/enderEmit").get("xMun").asText()) + .nro(node.at("/NFe/infNFe/emit/enderEmit").get("nro").asText()) + .UF(node.at("/NFe/infNFe/emit/enderEmit").get("UF").asText()) + .xLgr(node.at("/NFe/infNFe/emit/enderEmit").get("xLgr").asText()) + .xBairro(node.at("/NFe/infNFe/emit/enderEmit").get("xBairro").asText()) + .xPais(node.at("/NFe/infNFe/emit/enderEmit").get("xPais").asText()) + .fone(node.at("/NFe/infNFe/emit/enderEmit").get("fone").asText()) + .build(); + + EnderecoDTO enderecoDTO = EnderecoDTO.builder() + .CEP(node.at("/NFe/infNFe/dest/enderDest").get("CEP").asText()) + .cMun(node.at("/NFe/infNFe/dest/enderDest").get("cMun").asText()) + .cPais(node.at("/NFe/infNFe/dest/enderDest").get("cPais").asText()) + .xMun(node.at("/NFe/infNFe/dest/enderDest").get("xMun").asText()) + .nro(node.at("/NFe/infNFe/dest/enderDest").get("nro").asText()) + .UF(node.at("/NFe/infNFe/dest/enderDest").get("UF").asText()) + .xLgr(node.at("/NFe/infNFe/dest/enderDest").get("xLgr").asText()) + .xBairro(node.at("/NFe/infNFe/dest/enderDest").get("xBairro").asText()) + .xPais(node.at("/NFe/infNFe/dest/enderDest").get("xPais").asText()) + .fone(node.at("/NFe/infNFe/dest/enderDest").get("fone").asText()) + .build(); +``` +Como exemplos acima, o JsonNode possui a chamada de função _at_ o qual permite informar o caminho, como um URL até o valor desejado.
+Após informar o caminho, a função _get_ aceita como parâmetro uma string, referente ao nome do campo com o valor requerido. Por fim, a função _asText_ retorna +o valor do campo como texto para poder ser atribuído ao objeto em questão. + + +##### DTOS +Como os modelos que recebem as informações não estão presentes no banco de dados, e, além disso, como não é uma troca de informação entre controller e interface, foram criados os DTOS.
+Cada DTO criado possui os mesmos campos do model, com excessão do ID, pois como informado, eles não estão presentes ainda no Banco de Dados. Dessa forma, para que um DTO possa ser mapeado como um objeto de Modelo do Banco de dados, +foi implementado o código a seguir: +``` +ModelMapper modelMapper = new ModelMapper(); +``` +O modelMapper possui a função no sistema de fazer o mapeamento entra a DTO e sua respectiva classe, para que, ao chamar o repositório, o modelo possa ser salvo no banco como o objeto requerido. \ No newline at end of file diff --git a/ImagemModeloFuncionamento.png b/ImagemModeloFuncionamento.png new file mode 100644 index 0000000..864293e Binary files /dev/null and b/ImagemModeloFuncionamento.png differ diff --git a/NFe-002-3103.xml b/NFe-002-3103.xml index 831d193..8f9a282 100644 --- a/NFe-002-3103.xml +++ b/NFe-002-3103.xml @@ -1,11 +1,318 @@ -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 - + + + + + + 31 + 00464032 + Vendas a prazo + 55 + 2 + 3103 + 2019-04-10T17:24:03-02:00 + 2019-04-11T17:17:30-02:00 + 1 + 1 + 3170206 + 1 + 1 + 7 + 1 + 1 + 0 + 1 + 0 + 001 + + + 06273476000182 + MECA Office Mobil. Eireli-ME + MECA Office Mobil. Eireli-ME + + AV. MARCOS DE FREITAS COSTA + 1055 + DANIEL FOSECA + 3170206 + Uberlandia + MG + 38400328 + 1058 + BRASIL + 3432385585 + + 7022916720058 + 1 + + + 25587387000155 + HLTS ENGENHARIA E CONSTRUCOES LTDA + + RUA MACHADO DE ASSIS + 1324 + LIDICE + 3170206 + Uberlandia + MG + 38400081 + 1058 + BRASIL + 3432235966 + + 1 + 7021771340054 + + + + 00331 + SEM GTIN + CADEIRA GIRATORIA S/ BRACO ALMOFADADA PRETO + 94019090 + 5102 + UN + 2 + 165.00000 + 330.00 + SEM GTIN + UN + 2 + 165.00000 + 1 + + + 77.68 + + + 0 + 102 + + + + + 08 + + + + + 08 + + + + IMOBILIZADO IMOB - 2317 CADEIRA GIRATORIA S/ BRACO ALMOFADADA PRETO - IMOBILIZADO EQUIP. + MOVEIS P/ CANTEIRO MATERIAIS INSTALACAO DE CANTEIRO. + + + + + 01228 + SEM GTIN + CADEIRA GIRATORIA C/ BRACO ALMOFADADA PRETO + 94019090 + 5102 + UN + 1 + 215.00000 + 215.00 + SEM GTIN + UN + 1 + 215.00000 + 1 + + + 50.61 + + + 0 + 102 + + + + + 08 + + + + + 08 + + + + IMOBILIZADO EQUIP/MOVEIS P/ CANTEIRO MATERIAIS INSTALACAO DE CANTEIRO + + + + 01324 + SEM GTIN + BANQUETA ALTA 70CM PARA BALCAO ASSENTO 30 OU + 94019090 + 5102 + PC + 1 + 90.00000 + 90.00 + SEM GTIN + PC + 1 + 90.00000 + 1 + + + 21.19 + + + 0 + 102 + + + + + 08 + + + + + 08 + + + + 40CM NA COR PRETA - IMOBILIZADO EQUIP./MOVEIS P/ CANTEIRO MATERIAIS INSTALACAO DE CANTEIRO + + + + + 01644 + SEM GTIN + ESTANTE ACO C/ 06 PRATELEIRAS 0,93X040X1,98M + 94069020 + 5102 + PC + 2 + 234.00000 + 468.00 + SEM GTIN + PC + 2 + 234.00000 + 1 + + + 45.87 + + + 0 + 102 + + + + + 08 + + + + + 08 + + + + (REFORCADA) AMAPA - IMOBILIZADO. + + + + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 1103.00 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 0.00 + 1103.00 + 195.35 + + + + 0 + + 6 + VOLUME + VARIAS + 0.000 + 0.000 + + + + + 000003103 + 1103.00 + 0.00 + 1103.00 + + + 001 + 2019-05-11 + 1103.00 + + + + + 14 + 1103.00 + + 0.00 + + + ORDEM 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 S3A6R4 + + + + + + + + + + + + + + ngqVwH6QNCAHyRuI529RIAr7Nyk= + + + + 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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/build.gradle b/build.gradle new file mode 100644 index 0000000..f0954de --- /dev/null +++ b/build.gradle @@ -0,0 +1,45 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.1.3' + id 'io.spring.dependency-management' version '1.1.3' +} + +group = 'com.main' +version = '0.0.1-SNAPSHOT' + +java { + sourceCompatibility = '17' +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.0' + implementation 'javax.xml.bind:jaxb-api:2.3.1' + implementation 'org.modelmapper:modelmapper:3.1.1' + implementation 'jakarta.validation:jakarta.validation-api:3.0.2' + compileOnly 'org.projectlombok:lombok' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + runtimeOnly 'com.h2database:h2' + runtimeOnly 'com.mysql:mysql-connector-j' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.security:spring-security-test' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/build/libs/RecombApp-0.0.1-SNAPSHOT.jar b/build/libs/RecombApp-0.0.1-SNAPSHOT.jar new file mode 100644 index 0000000..c088edd Binary files /dev/null and b/build/libs/RecombApp-0.0.1-SNAPSHOT.jar differ diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5b1b1bd --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3.6' +services: + back: + build: + context: ./ + image: recomb/backend + container_name: recomb_back + ports: + - 8082:8082 + + + front: + build: ./front-end/recombfront + image: recomb/frontend + container_name: recomb_front + ports: + - 5173:5173 + depends_on: + - back \ No newline at end of file diff --git a/front-end/recombfront/.gitignore b/front-end/recombfront/.gitignore new file mode 100644 index 0000000..38adffa --- /dev/null +++ b/front-end/recombfront/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/front-end/recombfront/Dockerfile b/front-end/recombfront/Dockerfile new file mode 100644 index 0000000..da53a1a --- /dev/null +++ b/front-end/recombfront/Dockerfile @@ -0,0 +1,22 @@ +FROM node:lts-alpine + +# install simple http server for serving static content +# RUN npm install -g http-server + +# make the 'app' folder the current working directory +WORKDIR /app + +# copy both 'package.json' and 'package-lock.json' (if available) +COPY package*.json ./ + +# install project dependencies +RUN npm install + +# copy project files and folders to the current working directory (i.e. 'app' folder) +COPY . . + +# build app for production with minification +RUN npm run build + +EXPOSE 5173 +CMD [ "npm", "run", "dev" ] \ No newline at end of file diff --git a/front-end/recombfront/README.md b/front-end/recombfront/README.md new file mode 100644 index 0000000..f98e5d1 --- /dev/null +++ b/front-end/recombfront/README.md @@ -0,0 +1,29 @@ +# recombfront + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). + +## Customize configuration + +See [Vite Configuration Reference](https://vitejs.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Compile and Minify for Production + +```sh +npm run build +``` diff --git a/front-end/recombfront/index.html b/front-end/recombfront/index.html new file mode 100644 index 0000000..6448624 --- /dev/null +++ b/front-end/recombfront/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/front-end/recombfront/package-lock.json b/front-end/recombfront/package-lock.json new file mode 100644 index 0000000..b817222 --- /dev/null +++ b/front-end/recombfront/package-lock.json @@ -0,0 +1,1809 @@ +{ + "name": "recombfront", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "recombfront", + "version": "0.0.0", + "dependencies": { + "axios": "^1.5.0", + "tailwindcss-animated": "^1.0.1", + "vue": "^3.3.4", + "vue-router": "^4.2.4" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.3.4", + "autoprefixer": "^10.4.15", + "postcss": "^8.4.29", + "tailwindcss": "^3.3.3", + "vite": "^4.4.9" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.4.tgz", + "integrity": "sha512-ciXNIHKPriERBisHFBvnTbfKa6r9SAesOYXeGDzgegcvy9Q4xdScSHAmKbNT0M3O0S9LKhIf5/G+UYG4NnnzYw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.523", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.523.tgz", + "integrity": "sha512-9AreocSUWnzNtvLcbpng6N+GkXnCcBR80IQkxRC9Dfdyg4gaWNUPBujAHUpKkiUkoSoR9UlhA4zD/IgBklmhzg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.29.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.2.tgz", + "integrity": "sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animated": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tailwindcss-animated/-/tailwindcss-animated-1.0.1.tgz", + "integrity": "sha512-u5wusj89ZwP8I+s8WZlaAd7aZTWBN/XEG6QgMKpkIKmAf3xP1A6WYf7oYIKmGaB10UAQaSqWopi/i1ozzZEs8Q==", + "peerDependencies": { + "tailwindcss": ">=3.1.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/vue-router": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/front-end/recombfront/package.json b/front-end/recombfront/package.json new file mode 100644 index 0000000..acf049a --- /dev/null +++ b/front-end/recombfront/package.json @@ -0,0 +1,23 @@ +{ + "name": "recombfront", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^1.5.0", + "tailwindcss-animated": "^1.0.1", + "vue": "^3.3.4", + "vue-router": "^4.2.4" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.3.4", + "autoprefixer": "^10.4.15", + "postcss": "^8.4.29", + "tailwindcss": "^3.3.3", + "vite": "^4.4.9" + } +} diff --git a/front-end/recombfront/postcss.config.js b/front-end/recombfront/postcss.config.js new file mode 100644 index 0000000..ca0c0cd --- /dev/null +++ b/front-end/recombfront/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } +} \ No newline at end of file diff --git a/front-end/recombfront/public/favicon.ico b/front-end/recombfront/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/front-end/recombfront/public/favicon.ico differ diff --git a/front-end/recombfront/src/App.vue b/front-end/recombfront/src/App.vue new file mode 100644 index 0000000..98562ed --- /dev/null +++ b/front-end/recombfront/src/App.vue @@ -0,0 +1,12 @@ + + + + + diff --git a/front-end/recombfront/src/assets/tailwind.css b/front-end/recombfront/src/assets/tailwind.css new file mode 100644 index 0000000..bd6213e --- /dev/null +++ b/front-end/recombfront/src/assets/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/front-end/recombfront/src/components/TheWelcome.vue b/front-end/recombfront/src/components/TheWelcome.vue new file mode 100644 index 0000000..c3de567 --- /dev/null +++ b/front-end/recombfront/src/components/TheWelcome.vue @@ -0,0 +1,219 @@ + + + + + + diff --git a/front-end/recombfront/src/components/icons/IconCommunity.vue b/front-end/recombfront/src/components/icons/IconCommunity.vue new file mode 100644 index 0000000..2dc8b05 --- /dev/null +++ b/front-end/recombfront/src/components/icons/IconCommunity.vue @@ -0,0 +1,7 @@ + diff --git a/front-end/recombfront/src/components/icons/IconDocumentation.vue b/front-end/recombfront/src/components/icons/IconDocumentation.vue new file mode 100644 index 0000000..6d4791c --- /dev/null +++ b/front-end/recombfront/src/components/icons/IconDocumentation.vue @@ -0,0 +1,7 @@ + diff --git a/front-end/recombfront/src/components/icons/IconEcosystem.vue b/front-end/recombfront/src/components/icons/IconEcosystem.vue new file mode 100644 index 0000000..c3a4f07 --- /dev/null +++ b/front-end/recombfront/src/components/icons/IconEcosystem.vue @@ -0,0 +1,7 @@ + diff --git a/front-end/recombfront/src/components/icons/IconSupport.vue b/front-end/recombfront/src/components/icons/IconSupport.vue new file mode 100644 index 0000000..7452834 --- /dev/null +++ b/front-end/recombfront/src/components/icons/IconSupport.vue @@ -0,0 +1,7 @@ + diff --git a/front-end/recombfront/src/components/icons/IconTooling.vue b/front-end/recombfront/src/components/icons/IconTooling.vue new file mode 100644 index 0000000..660598d --- /dev/null +++ b/front-end/recombfront/src/components/icons/IconTooling.vue @@ -0,0 +1,19 @@ + + diff --git a/front-end/recombfront/src/main.js b/front-end/recombfront/src/main.js new file mode 100644 index 0000000..9f91fad --- /dev/null +++ b/front-end/recombfront/src/main.js @@ -0,0 +1,11 @@ +import './assets/tailwind.css' + +import { createApp } from 'vue' +import App from './App.vue' +import router from './router' + +const app = createApp(App) + +app.use(router) + +app.mount('#app') diff --git a/front-end/recombfront/src/model/NfeModel.js b/front-end/recombfront/src/model/NfeModel.js new file mode 100644 index 0000000..89bf185 --- /dev/null +++ b/front-end/recombfront/src/model/NfeModel.js @@ -0,0 +1,19 @@ +export default class NfeModel +{ + boleto = [{ + value: null, + valorParcelado: null, + dataVencimento: null + }]; + cliente = [{ + nome: "", + endereco: [{ + + }] + }]; + + constructor(boleto: [{ valorParcelado: null, dataVencimento: null, value: null }], cliente: [{ endereco: [{}], nome: string }]) { + this.boleto = boleto; + this.cliente = cliente; + } +} \ No newline at end of file diff --git a/front-end/recombfront/src/router/index.js b/front-end/recombfront/src/router/index.js new file mode 100644 index 0000000..e55886b --- /dev/null +++ b/front-end/recombfront/src/router/index.js @@ -0,0 +1,15 @@ +import { createRouter, createWebHistory } from 'vue-router' +import HomeView from '../views/HomeView.vue' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + name: 'home', + component: HomeView + }, + ] +}) + +export default router diff --git a/front-end/recombfront/src/service/axiosService.js b/front-end/recombfront/src/service/axiosService.js new file mode 100644 index 0000000..3af4099 --- /dev/null +++ b/front-end/recombfront/src/service/axiosService.js @@ -0,0 +1,31 @@ +import axios from "axios"; +import config from "tailwindcss/defaultConfig"; + +const URL_API_FILE = "http://localhost:8082/convert/xmlToJson"; +const URL_API_TESTE = "http://localhost:8082/convert/xmlToJson"; +const URL_API_CLIENT = "http://localhost:8082/notafiscal"; + + +const URL_API_FILE_NGROK = "https://e7f4-2804-1b3-9402-40e8-a8d7-47e6-38c0-95f7.ngrok-free.app/convert/xmlToJson" +const URL_API_FILE_CLIENT = "https://e7f4-2804-1b3-9402-40e8-a8d7-47e6-38c0-95f7.ngrok-free.app/notafiscal" + + +export async function sendFileXML(file) +{ + const config = { headers: { 'Content-Type': 'multipart/form-data', "ngrok-skip-browser-warning": "69420" } }; + return axios.post(URL_API_FILE, file, config) +} + +export async function searchClient(value) +{ + const config = { headers: { "ngrok-skip-browser-warning": "69420" } }; + return axios.get(URL_API_CLIENT + "/" + value, config) +} + +export async function teste() +{ + const config = { headers: { 'Content-Type': 'multipart/form-data' } }; + return axios.post(URL_API_TESTE) +} + + diff --git a/front-end/recombfront/src/views/HomeView.vue b/front-end/recombfront/src/views/HomeView.vue new file mode 100644 index 0000000..6bb706f --- /dev/null +++ b/front-end/recombfront/src/views/HomeView.vue @@ -0,0 +1,9 @@ + + + diff --git a/front-end/recombfront/tailwind.config.js b/front-end/recombfront/tailwind.config.js new file mode 100644 index 0000000..14caa44 --- /dev/null +++ b/front-end/recombfront/tailwind.config.js @@ -0,0 +1,13 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './public/**/*.html', + './src/**/*.{js,jsx,ts,tsx,vue}', + ], + theme: { + extend: {}, + }, + plugins: [ + require('tailwindcss-animated') + ], +} \ No newline at end of file diff --git a/front-end/recombfront/vite.config.js b/front-end/recombfront/vite.config.js new file mode 100644 index 0000000..5c45e1d --- /dev/null +++ b/front-end/recombfront/vite.config.js @@ -0,0 +1,16 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + } +}) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..033e24c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..9f4197d --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..fcb6fca --- /dev/null +++ b/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..afc5e72 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'RecombApp' diff --git a/src/main/java/com/main/RecombApp/Controller/ClienteController.java b/src/main/java/com/main/RecombApp/Controller/ClienteController.java new file mode 100644 index 0000000..95b32fa --- /dev/null +++ b/src/main/java/com/main/RecombApp/Controller/ClienteController.java @@ -0,0 +1,35 @@ +package com.main.RecombApp.Controller; + +import ch.qos.logback.core.net.server.Client; +import com.main.RecombApp.Model.Cliente; +import com.main.RecombApp.Payload.Response.ClienteResponse; +import com.main.RecombApp.Services.Cliente.ClienteService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + + +import java.util.List; + +@RestController +@RequestMapping("/cliente") +@RequiredArgsConstructor +@CrossOrigin +public class ClienteController { + + @Autowired + ClienteService clienteService; + + @GetMapping("/getAll") + public ResponseEntity> findAllClients() { + return ResponseEntity.ok().body(clienteService.findAllClients()); + } + + @GetMapping("/{documento}") + public ResponseEntity FindClientValue(@PathVariable String documento){ + var a = clienteService.findClientByValues(documento); + return ResponseEntity.ok().body(clienteService.findClientByValues(documento)); + } + +} diff --git a/src/main/java/com/main/RecombApp/Controller/Converter/ConvertXmlJson.java b/src/main/java/com/main/RecombApp/Controller/Converter/ConvertXmlJson.java new file mode 100644 index 0000000..0bfa39a --- /dev/null +++ b/src/main/java/com/main/RecombApp/Controller/Converter/ConvertXmlJson.java @@ -0,0 +1,27 @@ +package com.main.RecombApp.Controller.Converter; + + +import com.main.RecombApp.Payload.Request.NotaFiscalRequest; +import com.main.RecombApp.Payload.Response.NotaFiscalResponse; +import com.main.RecombApp.Services.Deserialize.DeserializeXML; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; + +@RestController +@CrossOrigin +@RequestMapping("/convert/") +public class ConvertXmlJson { + + @Autowired + DeserializeXML deserializeXML; + + // Just test + @PostMapping("xmlToJson") + public ResponseEntity convertFile(@ModelAttribute NotaFiscalRequest notaFiscalRequest) throws IOException { + return ResponseEntity.ok(deserializeXML.SaveXml(notaFiscalRequest.getFileNf())); + } + +} diff --git a/src/main/java/com/main/RecombApp/Controller/NotaFiscalController.java b/src/main/java/com/main/RecombApp/Controller/NotaFiscalController.java new file mode 100644 index 0000000..6f5d1fd --- /dev/null +++ b/src/main/java/com/main/RecombApp/Controller/NotaFiscalController.java @@ -0,0 +1,32 @@ +package com.main.RecombApp.Controller; + +import com.main.RecombApp.Payload.Request.NotaFiscalRequest; +import com.main.RecombApp.Payload.Response.NFResponse; +import com.main.RecombApp.Payload.Response.NotaFiscalResponse; +import com.main.RecombApp.Services.Deserialize.DeserializeXML; +import com.main.RecombApp.Services.NotaFiscal.NotaFiscalService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +@RestController +@RequestMapping("/notafiscal") +@RequiredArgsConstructor +@CrossOrigin +public class NotaFiscalController { + + @Autowired + DeserializeXML deserializeXML; + @Autowired + NotaFiscalService notaFiscalService; + + @GetMapping("/{documento}") + public ResponseEntity ClienteFornecedorCPF(@PathVariable String documento) + { + return ResponseEntity.ok().body(notaFiscalService.GetFornecedorClienteCPF(documento)); + } +} diff --git a/src/main/java/com/main/RecombApp/DTO/BoletoDTO.java b/src/main/java/com/main/RecombApp/DTO/BoletoDTO.java new file mode 100644 index 0000000..2351381 --- /dev/null +++ b/src/main/java/com/main/RecombApp/DTO/BoletoDTO.java @@ -0,0 +1,20 @@ +package com.main.RecombApp.DTO; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class BoletoDTO { + + private String Value; + private String DataVencimento; + private String ValorParcelado; + +} diff --git a/src/main/java/com/main/RecombApp/DTO/ClienteDTO.java b/src/main/java/com/main/RecombApp/DTO/ClienteDTO.java new file mode 100644 index 0000000..7fa282d --- /dev/null +++ b/src/main/java/com/main/RecombApp/DTO/ClienteDTO.java @@ -0,0 +1,23 @@ +package com.main.RecombApp.DTO; + +import com.main.RecombApp.Model.Boleto; +import com.main.RecombApp.Model.Endereco; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ClienteDTO { + + private String CPF; + private String nome; + private Endereco endereco; + Set boletos; + +} diff --git a/src/main/java/com/main/RecombApp/DTO/EnderecoDTO.java b/src/main/java/com/main/RecombApp/DTO/EnderecoDTO.java new file mode 100644 index 0000000..5a3906c --- /dev/null +++ b/src/main/java/com/main/RecombApp/DTO/EnderecoDTO.java @@ -0,0 +1,24 @@ +package com.main.RecombApp.DTO; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EnderecoDTO { + private String xLgr; + private String nro; + private String xBairro; + private String cMun; + private String xMun; + private String UF; + private String CEP; + private String cPais; + private String xPais; + private String fone; + +} diff --git a/src/main/java/com/main/RecombApp/DTO/FornecedorDTO.java b/src/main/java/com/main/RecombApp/DTO/FornecedorDTO.java new file mode 100644 index 0000000..e4f12dd --- /dev/null +++ b/src/main/java/com/main/RecombApp/DTO/FornecedorDTO.java @@ -0,0 +1,18 @@ +package com.main.RecombApp.DTO; + +import com.main.RecombApp.Model.Endereco; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FornecedorDTO { + + private String CNPJ; + private String nome; + private Endereco EnderecoEmissor; +} diff --git a/src/main/java/com/main/RecombApp/Model/Boleto.java b/src/main/java/com/main/RecombApp/Model/Boleto.java new file mode 100644 index 0000000..73c8dbe --- /dev/null +++ b/src/main/java/com/main/RecombApp/Model/Boleto.java @@ -0,0 +1,34 @@ +package com.main.RecombApp.Model; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import lombok.*; + +import java.util.Set; + +@Table(name = "boleto") +@Entity +@Getter +@Setter +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class Boleto { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @NotBlank + private String Value; + @NotBlank + private String ValorParcelado; + @NotBlank + private String DataVencimento; + + @ManyToMany + @JoinTable( + name = "clientefornecedor_boleto", + joinColumns = @JoinColumn(name = "boleto_id"), + inverseJoinColumns = @JoinColumn(name = "cliente_id")) + Set boletos; +} diff --git a/src/main/java/com/main/RecombApp/Model/Cliente.java b/src/main/java/com/main/RecombApp/Model/Cliente.java new file mode 100644 index 0000000..a6f6f00 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Model/Cliente.java @@ -0,0 +1,35 @@ +package com.main.RecombApp.Model; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import lombok.*; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import java.util.Set; + +@Table(name = "cliente") +@Entity +@Getter +@Setter +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class Cliente { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotBlank + private String CPF; + @NotBlank + private String nome; + + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @JoinColumn(name = "endereco_id", nullable = false) + @OnDelete(action = OnDeleteAction.CASCADE) + Endereco endereco; + +} diff --git a/src/main/java/com/main/RecombApp/Model/Endereco.java b/src/main/java/com/main/RecombApp/Model/Endereco.java new file mode 100644 index 0000000..928430c --- /dev/null +++ b/src/main/java/com/main/RecombApp/Model/Endereco.java @@ -0,0 +1,42 @@ +package com.main.RecombApp.Model; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import lombok.*; + +@Table(name = "endereco") +@Entity +@Getter +@Setter +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class Endereco { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotBlank + private String xLgr; + @NotBlank + private String nro; + @NotBlank + private String xBairro; + @NotBlank + private String cMun; + @NotBlank + private String xMun; + @NotBlank + private String UF; + @NotBlank + private String CEP; + @NotBlank + private String cPais; + @NotBlank + private String xPais; + private String fone; + + +} diff --git a/src/main/java/com/main/RecombApp/Model/Fornecedor.java b/src/main/java/com/main/RecombApp/Model/Fornecedor.java new file mode 100644 index 0000000..9c8f603 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Model/Fornecedor.java @@ -0,0 +1,35 @@ +package com.main.RecombApp.Model; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import lombok.*; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import java.util.Set; + +@Table(name = "fornecedor") +@Entity +@Getter +@Setter +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class Fornecedor { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @NotBlank + private String CNPJ; + @NotBlank + private String nome; + + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @JoinColumn(name = "endereco_id", nullable = false) + @OnDelete(action = OnDeleteAction.CASCADE) + Endereco endereco; + + +} diff --git a/src/main/java/com/main/RecombApp/Payload/Request/NotaFiscalRequest.java b/src/main/java/com/main/RecombApp/Payload/Request/NotaFiscalRequest.java new file mode 100644 index 0000000..4a7aeca --- /dev/null +++ b/src/main/java/com/main/RecombApp/Payload/Request/NotaFiscalRequest.java @@ -0,0 +1,17 @@ +package com.main.RecombApp.Payload.Request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.web.multipart.MultipartFile; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class NotaFiscalRequest { + + private MultipartFile fileNf; + +} diff --git a/src/main/java/com/main/RecombApp/Payload/Response/ClienteResponse.java b/src/main/java/com/main/RecombApp/Payload/Response/ClienteResponse.java new file mode 100644 index 0000000..aef9a82 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Payload/Response/ClienteResponse.java @@ -0,0 +1,18 @@ +package com.main.RecombApp.Payload.Response; + +import com.main.RecombApp.Model.Cliente; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ClienteResponse { + List clientes = new ArrayList<>(); +} diff --git a/src/main/java/com/main/RecombApp/Payload/Response/NFResponse.java b/src/main/java/com/main/RecombApp/Payload/Response/NFResponse.java new file mode 100644 index 0000000..89d95d0 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Payload/Response/NFResponse.java @@ -0,0 +1,24 @@ +package com.main.RecombApp.Payload.Response; + +import com.main.RecombApp.DTO.BoletoDTO; +import com.main.RecombApp.DTO.ClienteDTO; +import com.main.RecombApp.DTO.FornecedorDTO; +import com.main.RecombApp.Model.Cliente; +import com.main.RecombApp.Model.Fornecedor; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class NFResponse { + + List clientes; + List fornecedores; + +} diff --git a/src/main/java/com/main/RecombApp/Payload/Response/NotaFiscalResponse.java b/src/main/java/com/main/RecombApp/Payload/Response/NotaFiscalResponse.java new file mode 100644 index 0000000..86085a4 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Payload/Response/NotaFiscalResponse.java @@ -0,0 +1,25 @@ +package com.main.RecombApp.Payload.Response; + +import com.main.RecombApp.DTO.BoletoDTO; +import com.main.RecombApp.DTO.ClienteDTO; +import com.main.RecombApp.DTO.FornecedorDTO; +import jakarta.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class NotaFiscalResponse { + + List boleto; + ClienteDTO cliente; + FornecedorDTO fornecedor; + + +} diff --git a/src/main/java/com/main/RecombApp/RecombAppApplication.java b/src/main/java/com/main/RecombApp/RecombAppApplication.java new file mode 100644 index 0000000..56d881f --- /dev/null +++ b/src/main/java/com/main/RecombApp/RecombAppApplication.java @@ -0,0 +1,13 @@ +package com.main.RecombApp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class RecombAppApplication { + + public static void main(String[] args) { + SpringApplication.run(RecombAppApplication.class, args); + } + +} diff --git a/src/main/java/com/main/RecombApp/Repository/BoletoRepository.java b/src/main/java/com/main/RecombApp/Repository/BoletoRepository.java new file mode 100644 index 0000000..f8f9106 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Repository/BoletoRepository.java @@ -0,0 +1,15 @@ +package com.main.RecombApp.Repository; + +import com.main.RecombApp.Model.Boleto; +import com.main.RecombApp.Model.Cliente; +import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface BoletoRepository extends JpaRepository { + + +} diff --git a/src/main/java/com/main/RecombApp/Repository/ClienteRepository.java b/src/main/java/com/main/RecombApp/Repository/ClienteRepository.java new file mode 100644 index 0000000..852b6e4 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Repository/ClienteRepository.java @@ -0,0 +1,15 @@ +package com.main.RecombApp.Repository; + +import com.main.RecombApp.Model.Cliente; +import com.main.RecombApp.Model.Endereco; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ClienteRepository extends JpaRepository { + Cliente findByCPF(String CPF); + List findAllByCPFStartsWith(String cpf); +} diff --git a/src/main/java/com/main/RecombApp/Repository/EnderecoEmissorRepository.java b/src/main/java/com/main/RecombApp/Repository/EnderecoEmissorRepository.java new file mode 100644 index 0000000..fc2eb87 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Repository/EnderecoEmissorRepository.java @@ -0,0 +1,13 @@ +//package com.main.RecombApp.Repository; +// +//import com.main.RecombApp.Model.Boleto; +//import com.main.RecombApp.Model.EnderecoEmissor; +//import org.springframework.data.jpa.repository.JpaRepository; +//import org.springframework.stereotype.Repository; +// +//@Repository +//public interface EnderecoEmissorRepository extends JpaRepository { +// +// EnderecoEmissor findEnderecoEmissorByCep(String Cep); +// +//} diff --git a/src/main/java/com/main/RecombApp/Repository/EnderecoRepository.java b/src/main/java/com/main/RecombApp/Repository/EnderecoRepository.java new file mode 100644 index 0000000..376c40e --- /dev/null +++ b/src/main/java/com/main/RecombApp/Repository/EnderecoRepository.java @@ -0,0 +1,11 @@ +package com.main.RecombApp.Repository; + +import com.main.RecombApp.DTO.EnderecoDTO; +import com.main.RecombApp.Model.Endereco; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface EnderecoRepository extends JpaRepository { + Endereco findEnderecoByCEP(String CEP); +} diff --git a/src/main/java/com/main/RecombApp/Repository/FornecedorRepository.java b/src/main/java/com/main/RecombApp/Repository/FornecedorRepository.java new file mode 100644 index 0000000..f8dcb09 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Repository/FornecedorRepository.java @@ -0,0 +1,14 @@ +package com.main.RecombApp.Repository; + +import com.main.RecombApp.Model.Cliente; +import com.main.RecombApp.Model.Fornecedor; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface FornecedorRepository extends JpaRepository { + Fornecedor findByCNPJ (String CPF); + List findFornecedorsByCNPJStartsWith(String Cnpj); +} diff --git a/src/main/java/com/main/RecombApp/Security/SecurityConfiguration.java b/src/main/java/com/main/RecombApp/Security/SecurityConfiguration.java new file mode 100644 index 0000000..14a0a79 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Security/SecurityConfiguration.java @@ -0,0 +1,22 @@ +package com.main.RecombApp.Security; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +@RequiredArgsConstructor +public class SecurityConfiguration { + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http.csrf(AbstractHttpConfigurer::disable).authorizeHttpRequests(request -> request.anyRequest().permitAll()); + + return http.build(); + } +} diff --git a/src/main/java/com/main/RecombApp/Services/Cliente/ClienteService.java b/src/main/java/com/main/RecombApp/Services/Cliente/ClienteService.java new file mode 100644 index 0000000..4e10aa6 --- /dev/null +++ b/src/main/java/com/main/RecombApp/Services/Cliente/ClienteService.java @@ -0,0 +1,24 @@ +package com.main.RecombApp.Services.Cliente; + +import com.main.RecombApp.Model.Cliente; +import com.main.RecombApp.Payload.Response.ClienteResponse; +import com.main.RecombApp.Repository.ClienteRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ClienteService { + @Autowired + ClienteRepository clienteRepository; + + public List findAllClients(){ + return clienteRepository.findAll(); + } + + public ClienteResponse findClientByValues(String valor){ + return ClienteResponse.builder().clientes(clienteRepository.findAllByCPFStartsWith(valor)).build(); + } + +} diff --git a/src/main/java/com/main/RecombApp/Services/Deserialize/DeserializeXML.java b/src/main/java/com/main/RecombApp/Services/Deserialize/DeserializeXML.java new file mode 100644 index 0000000..7b6277f --- /dev/null +++ b/src/main/java/com/main/RecombApp/Services/Deserialize/DeserializeXML.java @@ -0,0 +1,130 @@ +package com.main.RecombApp.Services.Deserialize; + + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import com.main.RecombApp.DTO.*; +import com.main.RecombApp.Model.*; +import com.main.RecombApp.Payload.Response.NotaFiscalResponse; +import com.main.RecombApp.Repository.*; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@Service +public class DeserializeXML { + + @Autowired + EnderecoRepository enderecoRepository; + @Autowired + ClienteRepository clienteRepository; + @Autowired + FornecedorRepository fornecedorRepository; + @Autowired + BoletoRepository boletoRepository; + + public NotaFiscalResponse SaveXml(MultipartFile xmlFile) throws IOException { + XmlMapper xmlMapper = new XmlMapper(); + JsonNode node = xmlMapper.readTree(xmlFile.getBytes()); + ModelMapper modelMapper = new ModelMapper(); + + EnderecoDTO enderecoEmissorDTO = EnderecoDTO.builder() + .CEP(node.at("/NFe/infNFe/emit/enderEmit").get("CEP").asText()) + .cMun(node.at("/NFe/infNFe/emit/enderEmit").get("cMun").asText()) + .cMun(node.at("/NFe/infNFe/emit/enderEmit").get("cMun").asText()) + .cPais(node.at("/NFe/infNFe/emit/enderEmit").get("cPais").asText()) + .xMun(node.at("/NFe/infNFe/emit/enderEmit").get("xMun").asText()) + .nro(node.at("/NFe/infNFe/emit/enderEmit").get("nro").asText()) + .UF(node.at("/NFe/infNFe/emit/enderEmit").get("UF").asText()) + .xLgr(node.at("/NFe/infNFe/emit/enderEmit").get("xLgr").asText()) + .xBairro(node.at("/NFe/infNFe/emit/enderEmit").get("xBairro").asText()) + .xPais(node.at("/NFe/infNFe/emit/enderEmit").get("xPais").asText()) + .fone(node.at("/NFe/infNFe/emit/enderEmit").get("fone").asText()) + .build(); + + EnderecoDTO enderecoDTO = EnderecoDTO.builder() + .CEP(node.at("/NFe/infNFe/dest/enderDest").get("CEP").asText()) + .cMun(node.at("/NFe/infNFe/dest/enderDest").get("cMun").asText()) + .cPais(node.at("/NFe/infNFe/dest/enderDest").get("cPais").asText()) + .xMun(node.at("/NFe/infNFe/dest/enderDest").get("xMun").asText()) + .nro(node.at("/NFe/infNFe/dest/enderDest").get("nro").asText()) + .UF(node.at("/NFe/infNFe/dest/enderDest").get("UF").asText()) + .xLgr(node.at("/NFe/infNFe/dest/enderDest").get("xLgr").asText()) + .xBairro(node.at("/NFe/infNFe/dest/enderDest").get("xBairro").asText()) + .xPais(node.at("/NFe/infNFe/dest/enderDest").get("xPais").asText()) + .fone(node.at("/NFe/infNFe/dest/enderDest").get("fone").asText()) + .build(); + + + // Mapper + Endereco enderecoDTOModel = modelMapper.map(enderecoDTO, Endereco.class); + + if (enderecoRepository.findEnderecoByCEP(node.at("/NFe/infNFe/dest/enderDest").get("CEP").asText()) != null) { + enderecoDTOModel = enderecoRepository.findEnderecoByCEP(node.at("/NFe/infNFe/dest/enderDest").get("CEP").asText()); + } else { + enderecoRepository.save(enderecoDTOModel); + } + + + Endereco enderecoEmissorDTOModel = modelMapper.map(enderecoEmissorDTO, Endereco.class); + + if(enderecoRepository.findEnderecoByCEP(node.at("/NFe/infNFe/emit/enderEmit").get("CEP").asText()) != null) + { + enderecoEmissorDTOModel = enderecoRepository.findEnderecoByCEP(node.at("/NFe/infNFe/dest/enderDest").get("CEP").asText()); + } + else{ + enderecoRepository.save(enderecoEmissorDTOModel); + } + + ClienteDTO clienteDTO = ClienteDTO.builder() + .CPF(node.at("/NFe/infNFe/dest").get("CNPJ").asText()) + .nome(node.at("/NFe/infNFe/dest").get("xNome").asText()) + .endereco(enderecoDTOModel) + .build(); + + Cliente clienteDTOModel = modelMapper.map(clienteDTO, Cliente.class); + + if (clienteRepository.findByCPF(node.at("/NFe/infNFe/dest").get("CNPJ").asText()) == null) { + clienteRepository.save(clienteDTOModel); + } + + FornecedorDTO fornecedorDTO = FornecedorDTO.builder() + .CNPJ(node.at("/NFe/infNFe/emit").get("CNPJ").asText()) + .nome(node.at("/NFe/infNFe/emit").get("xNome").asText()) + .EnderecoEmissor(enderecoEmissorDTOModel) + .build(); + + Fornecedor fornecedorDTOModel = modelMapper.map(fornecedorDTO, Fornecedor.class); + + if (fornecedorRepository.findByCNPJ(node.at("/NFe/infNFe/emit").get("CNPJ").asText()) == null) { + fornecedorRepository.save(fornecedorDTOModel); + } + + // Considera-se que pode haver mais de um "parcelamento" do boleto + List listaBoletos = new ArrayList<>(); + + for (int i = 0; i < node.at("/NFe/infNFe/cobr/dup").findValuesAsText("dVenc").size(); i++) { + listaBoletos.add(BoletoDTO.builder() + .DataVencimento(node.at("/NFe/infNFe/cobr/dup").findValuesAsText("dVenc").get(i)) + .ValorParcelado(node.at("/NFe/infNFe/cobr/dup").findValuesAsText("vDup").get(i)) + .Value(node.at("/NFe/infNFe/cobr/fat").get("vLiq").asText()) + .build()); + } + + for (BoletoDTO boletoDTO : listaBoletos) { + Boleto boletoDTOModel = modelMapper.map(boletoDTO, Boleto.class); + boletoRepository.save(boletoDTOModel); + } + + return NotaFiscalResponse.builder() + .fornecedor(fornecedorDTO) + .cliente(clienteDTO) + .boleto(listaBoletos) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/main/RecombApp/Services/NotaFiscal/NotaFiscalService.java b/src/main/java/com/main/RecombApp/Services/NotaFiscal/NotaFiscalService.java new file mode 100644 index 0000000..18fe41a --- /dev/null +++ b/src/main/java/com/main/RecombApp/Services/NotaFiscal/NotaFiscalService.java @@ -0,0 +1,27 @@ +package com.main.RecombApp.Services.NotaFiscal; + +import com.main.RecombApp.Payload.Response.NFResponse; +import com.main.RecombApp.Repository.BoletoRepository; +import com.main.RecombApp.Repository.ClienteRepository; +import com.main.RecombApp.Repository.FornecedorRepository; +import com.main.RecombApp.Services.Cliente.ClienteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.stereotype.Service; + +@Service +public class NotaFiscalService { + + @Autowired + BoletoRepository boletoRepository; + + @Autowired + ClienteRepository clienteRepository; + @Autowired + FornecedorRepository fornecedorRepository; + + public NFResponse GetFornecedorClienteCPF(String documento){ + return NFResponse.builder().fornecedores(fornecedorRepository.findFornecedorsByCNPJStartsWith(documento)).clientes(clienteRepository.findAllByCPFStartsWith(documento)).build(); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..4b3b3e2 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,16 @@ +spring.session.store-type = jdbc +#spring.security.user.name = unionadmin +#spring.security.user.password = erjqfh80hqf3892uskp +spring.datasource.url=jdbc:mysql://db4free.net:3306/recombappbd +spring.datasource.username=recombadmin +spring.datasource.password=ysujdbASJKLDGHU3Y48913O247YEIOUH +spring.datasource.driverClassName=com.mysql.jdbc.Driver +spring.jpa.hibernate.ddl-auto=update +server.port = 8082 +server.shutdown=graceful +spring.jpa.show-sql = true + +# App Properties +WebApp.app.jwtCookieName= app +WebApp.app.jwtSecret= appKey +WebApp.app.jwtExpirationMs= 86400000 \ No newline at end of file diff --git a/src/test/java/com/main/RecombApp/RecombAppApplicationTests.java b/src/test/java/com/main/RecombApp/RecombAppApplicationTests.java new file mode 100644 index 0000000..5182d08 --- /dev/null +++ b/src/test/java/com/main/RecombApp/RecombAppApplicationTests.java @@ -0,0 +1,13 @@ +package com.main.RecombApp; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class RecombAppApplicationTests { + + @Test + void contextLoads() { + } + +}