diff --git a/backend/README.md b/backend/README.md index 4985483..9c75638 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,8 +1,11 @@ -## **Guia de Utilização da API de Licitações Culturais de Minas Gerais** +# Como utilizar o Back-end do projeto ### **Visão Geral** -Esta API permite consultar informações relacionadas a licitações culturais de Minas Gerais. A API foi desenvolvida utilizando Express.js e está organizada em três camadas principais: `models`, `services` e `controllers`. Abaixo, você encontrará a descrição dos endpoints disponíveis e como utilizá-los. +Esta API permite consultar informações sobre licitações culturais em Minas Gerais. Embora o código-fonte da API esteja disponível em nosso repositório, o acesso ao banco de dados principal é restrito. No entanto, você pode acessar a API publicamente através da seguinte URL: [https://minas-cultura-api.onrender.com](https://minas-cultura-api.onrender.com). + + +A API foi desenvolvida utilizando Express.js e está organizada em três camadas principais: `models`, `services` e `controllers`. Abaixo, você encontrará a descrição dos endpoints disponíveis e como utilizá-los. ### **Estrutura da API** @@ -10,13 +13,14 @@ A API está localizada no diretório `backend/src/`, e é composta por três end 1. **/tenders** 2. **/tenders/year** +3. **/health** ### **Endpoints** #### **1. Consultar Licitações Mensais: `/tenders`** - **Descrição:** Retorna uma lista de licitações baseadas nos parâmetros de data inicial e final. -- **URL:** `http://localhost:5000/tenders?start=201501&end=201502` +- **URL:** `https://minas-cultura-api.onrender.com/tenders?start=201501&end=201502` - **Método:** `GET` - **Parâmetros:** - `start`: Representa o início do período de consulta no formato `AAAAMM` (ano/mês). Por exemplo, `201501` corresponde a janeiro de 2015. @@ -25,15 +29,17 @@ A API está localizada no diretório `backend/src/`, e é composta por três end #### **2. Consultar Licitações Anuais: `/tenders/year`** - **Descrição:** Retorna os valores totais empenhados, liquidados e pagos no ano informado no parâmetro "year". -- **URL:** `http://localhost:5000/tenders/year?year=2024` +- **URL:** `https://minas-cultura-api.onrender.com/tenders/year?year=2024` - **Método:** `GET` - **Parâmetros:** - `year`: Representa o ano de consulta no formato `AAAA` (ano). Por exemplo, `year=2024` retornará o total de licitações empenhadas, liquidadas e pagas no ano de 2024. +#### **3. Consultar a saúde da aplicação: `/health`** + +- **Descrição:** Retorna a mensagem "OK" em caso de sucesso na conexão com a api, este endpoint é necessário para monitorar a estabilidade do sistema. +- **URL:** `https://minas-cultura-api.onrender.com/health` +- **Método:** `GET` -### **Considerações Importantes** -- **Porta:** A API está configurada para rodar na porta `5000`. ---- Siga este guia para consultar e explorar as licitações culturais de Minas Gerais. Caso tenha dúvidas ou precise de suporte adicional, entre em contato com o time de desenvolvimento. \ No newline at end of file diff --git a/backend/src/controllers/citiesController.js b/backend/[deprecated]/controllers/citiesController.js similarity index 100% rename from backend/src/controllers/citiesController.js rename to backend/[deprecated]/controllers/citiesController.js diff --git a/backend/src/controllers/tendersController.js b/backend/[deprecated]/controllers/tendersController.js similarity index 100% rename from backend/src/controllers/tendersController.js rename to backend/[deprecated]/controllers/tendersController.js diff --git a/backend/src/controllers/unitsController.js b/backend/[deprecated]/controllers/unitsController.js similarity index 100% rename from backend/src/controllers/unitsController.js rename to backend/[deprecated]/controllers/unitsController.js diff --git a/backend/src/routes/citiesRoutes.js b/backend/[deprecated]/routes/citiesRoutes.js similarity index 100% rename from backend/src/routes/citiesRoutes.js rename to backend/[deprecated]/routes/citiesRoutes.js diff --git a/backend/src/routes/tendersRoutes.js b/backend/[deprecated]/routes/tendersRoutes.js similarity index 100% rename from backend/src/routes/tendersRoutes.js rename to backend/[deprecated]/routes/tendersRoutes.js diff --git a/backend/src/routes/unitsRoutes.js b/backend/[deprecated]/routes/unitsRoutes.js similarity index 100% rename from backend/src/routes/unitsRoutes.js rename to backend/[deprecated]/routes/unitsRoutes.js diff --git a/backend/src/scripts/insertData.js b/backend/[deprecated]/scripts/insertData.js similarity index 97% rename from backend/src/scripts/insertData.js rename to backend/[deprecated]/scripts/insertData.js index c032bf6..cabb6bd 100644 --- a/backend/src/scripts/insertData.js +++ b/backend/[deprecated]/scripts/insertData.js @@ -35,7 +35,7 @@ async function main() { .single() if (unidadeAdmError || !unidadeAdmData) { - const { data, error } = await supabase + const { data } = await supabase .from('administrative_units') .insert([{ name: unidadeAdm }]) .single() @@ -52,7 +52,7 @@ async function main() { .single() if (cidadeError || !cidadeData) { - const { data, error } = await supabase + const { data } = await supabase .from('cities') .insert([{ name: cidade }]) .single() diff --git a/backend/src/scripts/insertInitialData.js b/backend/[deprecated]/scripts/insertInitialData.js similarity index 91% rename from backend/src/scripts/insertInitialData.js rename to backend/[deprecated]/scripts/insertInitialData.js index 088679e..4e3cbf4 100644 --- a/backend/src/scripts/insertInitialData.js +++ b/backend/[deprecated]/scripts/insertInitialData.js @@ -26,7 +26,7 @@ const insertInitialData = async () => { // Inserir cidades for (const city of uniqueCities) { - const { data: cityData, error: cityError } = await supabase + const { error: cityError } = await supabase .from('cities') .upsert({ name: city }, { onConflict: ['name'] }) @@ -37,7 +37,7 @@ const insertInitialData = async () => { // Inserir unidades administrativas for (const unit of uniqueUnits) { - const { data: unitData, error: unitError } = await supabase + const { error: unitError } = await supabase .from('administrative_units') .upsert({ name: unit }, { onConflict: ['name'] }) diff --git a/backend/src/services/citiesService.js b/backend/[deprecated]/services/citiesService.js similarity index 80% rename from backend/src/services/citiesService.js rename to backend/[deprecated]/services/citiesService.js index fb459be..030d6be 100644 --- a/backend/src/services/citiesService.js +++ b/backend/[deprecated]/services/citiesService.js @@ -1,4 +1,4 @@ -const supabase = require('../config/supabaseClient') +const supabase = require('../../src/config/supabaseClient') async function getAllCities() { const { data, error } = await supabase diff --git a/backend/src/services/tendersService.js b/backend/[deprecated]/services/tendersService.js similarity index 90% rename from backend/src/services/tendersService.js rename to backend/[deprecated]/services/tendersService.js index bd5d281..3e6f402 100644 --- a/backend/src/services/tendersService.js +++ b/backend/[deprecated]/services/tendersService.js @@ -1,4 +1,4 @@ -const supabase = require('../config/supabaseClient'); +const supabase = require('../../src/config/supabaseClient'); async function getTendersByCityAndDate(start, end, cityId) { const startAno = Math.floor(start / 100) % 100; // Extrai os últimos dois dígitos do ano diff --git a/backend/src/services/unitsService.js b/backend/[deprecated]/services/unitsService.js similarity index 81% rename from backend/src/services/unitsService.js rename to backend/[deprecated]/services/unitsService.js index 9e9bd77..b447cea 100644 --- a/backend/src/services/unitsService.js +++ b/backend/[deprecated]/services/unitsService.js @@ -1,4 +1,4 @@ -const supabase = require('../config/supabaseClient') +const supabase = require('../../src/config/supabaseClient') async function getAllUnits() { const { data, error } = await supabase diff --git a/backend/__tests__/citiesAPI.spec.js b/backend/[deprecated]/tests/citiesAPI.js similarity index 100% rename from backend/__tests__/citiesAPI.spec.js rename to backend/[deprecated]/tests/citiesAPI.js diff --git a/backend/__tests__/unitsAPI.spec.js b/backend/[deprecated]/tests/unitsAPI.js similarity index 100% rename from backend/__tests__/unitsAPI.spec.js rename to backend/[deprecated]/tests/unitsAPI.js diff --git a/backend/__tests__/health.spec.js b/backend/__tests__/health.spec.js new file mode 100644 index 0000000..10b0829 --- /dev/null +++ b/backend/__tests__/health.spec.js @@ -0,0 +1,15 @@ +const request = require('supertest'); +const app = 'https://minas-cultura-api.onrender.com'; + +describe('Testes do Endpoint de Health', () => { + it('Deve retornar "OK"', async () => { + + const res = await request(app) + .get(`/health`) + .expect('Content-Type', /json/) + .expect(200); + + expect(res.status).toBe(200); + expect(res.body).toBeDefined(); + }); + }); diff --git a/backend/__tests__/tendersAPI.spec.js b/backend/__tests__/tendersMonth.spec.js similarity index 51% rename from backend/__tests__/tendersAPI.spec.js rename to backend/__tests__/tendersMonth.spec.js index e40e947..f60fe68 100644 --- a/backend/__tests__/tendersAPI.spec.js +++ b/backend/__tests__/tendersMonth.spec.js @@ -1,16 +1,15 @@ const request = require('supertest'); -const app = 'http://localhost:5000'; +const app = 'https://minas-cultura-api.onrender.com'; -describe('Testes do Endpoint de Licitações', () => { - it('Deve retornar licitações para a cidade específica no intervalo de tempo fornecido', async () => { - const startYear = '23'; +describe('Testes do Endpoint de Licitações Mensais', () => { + it('Deve retornar licitações no intervalo de tempo fornecido', async () => { + const startYear = '2023'; const startMonth = '01'; - const endYear = '23'; + const endYear = '2023'; const endMonth = '06'; - const cityId = 1; const res = await request(app) - .get(`/tenders?start=${startYear}${startMonth}&end=${endYear}${endMonth}&city=${cityId}`) + .get(`/tenders?start=${startYear}${startMonth}&end=${endYear}${endMonth}`) .expect('Content-Type', /json/) .expect(200); @@ -20,26 +19,18 @@ describe('Testes do Endpoint de Licitações', () => { res.body.forEach(tender => { expect(tender).toHaveProperty('id'); - expect(tender).toHaveProperty('administrative_unit_id'); - expect(tender).toHaveProperty('city_id'); expect(tender).toHaveProperty('committed_value'); expect(tender).toHaveProperty('liquidated_value'); expect(tender).toHaveProperty('paid_value'); expect(tender).toHaveProperty('year'); expect(tender).toHaveProperty('month'); - expect(typeof tender.id).toBe('number'); - expect(typeof tender.administrative_unit_id).toBe('number'); }); }); - it('Deve retornar um erro quando a cidade não for fornecida', async () => { - const startYear = '23'; - const startMonth = '01'; - const endYear = '23'; - const endMonth = '06'; + it('Deve retornar um erro quando a data não for fornecida', async () => { const res = await request(app) - .get(`/tenders?start=${startYear}${startMonth}&end=${endYear}${endMonth}`); + .get(`/tenders?start=&end=`); expect(res.status).toBe(400); expect(res.body).toBeDefined(); diff --git a/backend/__tests__/tendersYear.spec.js b/backend/__tests__/tendersYear.spec.js new file mode 100644 index 0000000..bce12d4 --- /dev/null +++ b/backend/__tests__/tendersYear.spec.js @@ -0,0 +1,34 @@ +const request = require('supertest'); +const app = 'https://minas-cultura-api.onrender.com'; + +describe('Testes do Endpoint de Licitações Anuais', () => { + it('Deve retornar a licitação referente ao ano fornecido', async () => { + const year = '2023'; + + const res = await request(app) + .get(`/tenders/year?year=${year}`) + .expect('Content-Type', /json/) + .expect(200); + + expect(res.status).toBe(200); + expect(res.body).toBeDefined(); + expect(Array.isArray(res.body)).toBe(true); + + res.body.forEach(tender => { + expect(tender).toHaveProperty('committed_value'); + expect(tender).toHaveProperty('liquidated_value'); + expect(tender).toHaveProperty('paid_value'); + expect(tender).toHaveProperty('year'); + }); + }); + + it('Deve retornar um erro quando a data não for fornecida', async () => { + const year = null; + + const res = await request(app) + .get(`/tenders/year?year=${year}`); + + expect(res.status).toBe(400); + expect(res.body).toBeDefined(); + }); +}); diff --git a/backend/src/routes/healthRoutes.js b/backend/src/routes/healthRoutes.js new file mode 100644 index 0000000..e8e9f73 --- /dev/null +++ b/backend/src/routes/healthRoutes.js @@ -0,0 +1,16 @@ +const express = require('express'); +const router = express.Router(); + +router.get('/', async (_req, res) => { + const healthcheck = { + message: 'OK' + }; + try { + res.send(healthcheck); + } catch (error) { + healthcheck.message = error; + res.status(503).send(); + } +}); + +module.exports = router; diff --git a/backend/src/index.js b/backend/src/server.js similarity index 57% rename from backend/src/index.js rename to backend/src/server.js index 54e1008..b7aa622 100644 --- a/backend/src/index.js +++ b/backend/src/server.js @@ -4,18 +4,23 @@ const cors = require('cors'); const app = express(); const port = 5000; -const citiesRoutes = require('./routes/citiesRoutes'); +// * [Deprecated] * +// const citiesRoutes = require('./routes/citiesRoutes'); +// const unitsRoutes = require('./routes/unitsRoutes'); + const tendersMonthRoutes = require('./routes/tendersMonthRoutes'); const tendersYearRoutes = require('./routes/tendersYearRoutes'); -const tendersRoutes = require('./routes/tendersRoutes'); -const unitsRoutes = require('./routes/unitsRoutes'); +const healthRoutes = require('./routes/healthRoutes'); app.use(cors()) -app.use('/cities', citiesRoutes) +// * [Deprecated] * +// app.use('/cities', citiesRoutes) +// app.use('/units', unitsRoutes) + app.use('/tenders', tendersMonthRoutes) app.use('/tenders/year', tendersYearRoutes) -app.use('/units', unitsRoutes) +app.use('/health', healthRoutes) app.listen(port, () => { console.log(`API running at http://localhost:${port}`) diff --git a/backend/src/services/tendersMonthService.js b/backend/src/services/tendersMonthService.js index 1f25a3b..dd05437 100644 --- a/backend/src/services/tendersMonthService.js +++ b/backend/src/services/tendersMonthService.js @@ -6,14 +6,23 @@ async function getTendersByMonth(start, end) { const endYear = Math.floor(end / 100); const endMonth = end % 100; - const { data, error } = await supabase - .from('tendersmonth') - .select('*') - .or( - `and(year.eq.${startYear},month.gte.${startMonth}),` + - `and(year.gt.${startYear},year.lt.${endYear}),` + - `and(year.eq.${endYear},month.lte.${endMonth})` - ); + let query = supabase.from('tendersmonth').select('*'); + + if (startYear === endYear) { + query = query + .eq('year', startYear) + .gte('month', startMonth) + .lte('month', endMonth); + } else { + query = query + .or( + `and(year.eq.${startYear},month.gte.${startMonth}),` + + `and(year.eq.${endYear},month.lte.${endMonth}),` + + `and(year.gt.${startYear},year.lt.${endYear})` + ); + } + + const { data, error } = await query; if (error) { throw new Error(error.message); @@ -24,4 +33,5 @@ async function getTendersByMonth(start, end) { module.exports = { getTendersByMonth, -}; \ No newline at end of file +}; + diff --git a/docs/Arquitetura/Arquitetura.md b/docs/Arquitetura/Arquitetura.md index e7653f2..39106ae 100644 --- a/docs/Arquitetura/Arquitetura.md +++ b/docs/Arquitetura/Arquitetura.md @@ -18,11 +18,15 @@ O deploy do frontend foi realizado na **Vercel**, uma plataforma otimizada para ## Backend -O backend do projeto é uma **API REST** desenvolvida com **Express.js**, um framework minimalista para Node.js. Essa API é responsável por gerenciar as requisições dos usuários e interagir com o banco de dados **PostgreSQL**. Utilizamos **pgAdmin** para facilitar a administração e o gerenciamento do banco de dados. +O backend do projeto é uma **API REST** desenvolvida com [**Express.js**](https://expressjs.com/), um framework minimalista para [**Node.js**](https://nodejs.org/). Esta API é responsável por gerenciar as requisições dos usuários e interagir com o banco de dados [**PostgreSQL**](https://www.postgresql.org/). + +Inicialmente, utilizamos um container de **PostgreSQL** junto com o [**pgAdmin**](https://www.pgadmin.org/) para facilitar a administração e o gerenciamento do banco de dados durante a fase inicial de desenvolvimento. Posteriormente, migramos para o [**Supabase**](https://supabase.com/), que oferece uma solução gerenciada de PostgreSQL com funcionalidades adicionais para desenvolvimento de aplicações web. ### Deploy do Backend -O deploy da nossa API foi realizado no **Render**, uma plataforma de cloud que oferece deploys automáticos a partir de repositórios Git, suporte a SSL automático e escalabilidade fácil. O Render foi escolhido por sua simplicidade e robustez, permitindo que a API esteja sempre disponível e pronta para responder às requisições com alta performance. +O deploy da nossa API foi realizado no [**Render**](https://render.com/), uma plataforma de cloud que oferece **deploys automáticos** a partir de repositórios Git, suporte a **SSL automático** e **escalabilidade fácil**. Escolhemos o Render por sua simplicidade e robustez. No entanto, enfrentamos alguns desafios, pois o plano gratuito do Render limita o tempo em que a aplicação permanece ativa quando não está em uso, resultando em períodos de inatividade (downtime). + +Para contornar essa limitação, utilizamos outra plataforma chamada [**BetterStack**](https://betterstack.com/), que monitora a aplicação em intervalos regulares. Implementamos um endpoint específico `/health` que verifica a saúde da aplicação a cada 10 minutos. Dessa forma, garantimos que a API esteja sempre disponível e pronta para responder às requisições, mantendo alta performance e evitando o downtime. ## Banco de Dados @@ -53,14 +57,16 @@ Abaixo estão as principais tecnologias que compõem o projeto: - **Linguagens de Programação**: [Python](https://docs.python.org/3/), [JavaScript](https://www.javascript.com/), [TypeScript](https://www.typescriptlang.org/) - **Framework Web**: [Next.js](https://nextjs.org/) -- **Banco de Dados**: [PostgreSQL](https://www.postgresql.org/) +- **Banco de Dados**: [PostgreSQL](https://www.postgresql.org/) e [Supabase](https://supabase.com/) - **Ferramentas de Coleta de Dados**: Framework [Scrapy](https://scrapy.org/) com auxílio das bibliotecas [Beautiful Soup](https://beautiful-soup-4.readthedocs.io/en/latest/) e [Selenium](https://www.selenium.dev/) +- **Testes**: [Jest](https://jestjs.io/pt-BR/) e [Supertest](https://github.com/ladjs/supertest) - **Tecnologias Adicionais**: [Docker](https://www.docker.com/), [Express](https://expressjs.com/), [React](https://react.dev/), [Tailwind CSS](https://tailwindcss.com/) ## 📁 Histórico de Versão | Versão | Data | Descrição | Autor | | :----: | :--------: | :------------------------------------------------------------------------------: | :-------------: | +| 6.0 | 03/09/2024 | Detalhamento do backend | Isaac Batista| | 5.0 | 02/09/2024 | Reestruturação da arquitetura | Gabriel Scheidt| | 4.0 | 16/08/2024 | Reestruturação da arquitetura | Gabriel Scheidt| | 3.0 | 25/04/2024 | Reestruturando Documento de Arquitetura | Rafael Carvalho | diff --git a/docs/Como executar/backend/Executar a API.md b/docs/Como executar/backend/Executar a API.md index 4985483..9c75638 100644 --- a/docs/Como executar/backend/Executar a API.md +++ b/docs/Como executar/backend/Executar a API.md @@ -1,8 +1,11 @@ -## **Guia de Utilização da API de Licitações Culturais de Minas Gerais** +# Como utilizar o Back-end do projeto ### **Visão Geral** -Esta API permite consultar informações relacionadas a licitações culturais de Minas Gerais. A API foi desenvolvida utilizando Express.js e está organizada em três camadas principais: `models`, `services` e `controllers`. Abaixo, você encontrará a descrição dos endpoints disponíveis e como utilizá-los. +Esta API permite consultar informações sobre licitações culturais em Minas Gerais. Embora o código-fonte da API esteja disponível em nosso repositório, o acesso ao banco de dados principal é restrito. No entanto, você pode acessar a API publicamente através da seguinte URL: [https://minas-cultura-api.onrender.com](https://minas-cultura-api.onrender.com). + + +A API foi desenvolvida utilizando Express.js e está organizada em três camadas principais: `models`, `services` e `controllers`. Abaixo, você encontrará a descrição dos endpoints disponíveis e como utilizá-los. ### **Estrutura da API** @@ -10,13 +13,14 @@ A API está localizada no diretório `backend/src/`, e é composta por três end 1. **/tenders** 2. **/tenders/year** +3. **/health** ### **Endpoints** #### **1. Consultar Licitações Mensais: `/tenders`** - **Descrição:** Retorna uma lista de licitações baseadas nos parâmetros de data inicial e final. -- **URL:** `http://localhost:5000/tenders?start=201501&end=201502` +- **URL:** `https://minas-cultura-api.onrender.com/tenders?start=201501&end=201502` - **Método:** `GET` - **Parâmetros:** - `start`: Representa o início do período de consulta no formato `AAAAMM` (ano/mês). Por exemplo, `201501` corresponde a janeiro de 2015. @@ -25,15 +29,17 @@ A API está localizada no diretório `backend/src/`, e é composta por três end #### **2. Consultar Licitações Anuais: `/tenders/year`** - **Descrição:** Retorna os valores totais empenhados, liquidados e pagos no ano informado no parâmetro "year". -- **URL:** `http://localhost:5000/tenders/year?year=2024` +- **URL:** `https://minas-cultura-api.onrender.com/tenders/year?year=2024` - **Método:** `GET` - **Parâmetros:** - `year`: Representa o ano de consulta no formato `AAAA` (ano). Por exemplo, `year=2024` retornará o total de licitações empenhadas, liquidadas e pagas no ano de 2024. +#### **3. Consultar a saúde da aplicação: `/health`** + +- **Descrição:** Retorna a mensagem "OK" em caso de sucesso na conexão com a api, este endpoint é necessário para monitorar a estabilidade do sistema. +- **URL:** `https://minas-cultura-api.onrender.com/health` +- **Método:** `GET` -### **Considerações Importantes** -- **Porta:** A API está configurada para rodar na porta `5000`. ---- Siga este guia para consultar e explorar as licitações culturais de Minas Gerais. Caso tenha dúvidas ou precise de suporte adicional, entre em contato com o time de desenvolvimento. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 735598c..c0cfd27 100644 --- a/docs/index.md +++ b/docs/index.md @@ -63,9 +63,11 @@ Através desta aplicação, buscamos oferecer uma maneira mais transparente e ac ## 🚀 Getting Started -### Pré-requisito - -- Baixar o docker compose usando o apt [Aqui](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository) +### Pré-requisito para rodar localmente +- [Docker](https://www.docker.com/) +- [Docker Compose](https://docs.docker.com/compose/) +- [Npm](https://www.npmjs.com/) +- [Node](https://nodejs.org/en) ### Clonar o repositório @@ -80,6 +82,9 @@ cd 2024-1-MinasDeCultura ``` +Acesse o guia completo [Aqui](https://unb-mds.github.io/2024-1-MinasDeCultura/Como%20executar/Front-end/Executar%20o%20Frontend/) + + ## 🤖 Identidade Visual - *Desenvolvimento da Identidade Visual:* Investimos tempo no desenvolvimento de uma identidade visual consistente para o projeto, incluindo seleção de cores, tipografia e uma logo autêntica baseada na bandeira. Essa identidade visual reflete nossa visão e valores, e está integrada em toda a interface do usuário e materiais de design. diff --git "a/docs/vis\303\243o geral/modelagem_banco.md" "b/docs/vis\303\243o geral/modelagem_banco.md" index d87cb26..48643a3 100644 --- "a/docs/vis\303\243o geral/modelagem_banco.md" +++ "b/docs/vis\303\243o geral/modelagem_banco.md" @@ -1 +1,42 @@ -# Modelagem do banco \ No newline at end of file +# Modelagem do Banco de Dados + +## Visão Geral + +O banco de dados é composto por duas tabelas principais que armazenam informações sobre licitações culturais: uma com dados mensais (`tendersmonth`) e outra com dados anuais (`tendersyear`). Atualmente, as tabelas não possuem relações entre si. + +## Descrição das Tabelas + +### Tabela `tendersmonth` + +A tabela `tendersmonth` armazena informações detalhadas sobre as licitações culturais de Minas Gerais organizadas por mês. + +| Coluna | Tipo de Dado | Descrição | Restrição | +|--------------------|--------------|-----------------------------------------------------|----------------| +| `id` | `int4` | Identificador único da licitação mensal | **Primary Key**| +| `commited_value` | `numeric` | Valor comprometido para a licitação naquele mês | | +| `liquidated_value` | `numeric` | Valor liquidado da licitação naquele mês | | +| `paid_value` | `numeric` | Valor pago da licitação naquele mês | | +| `year` | `int4` | Ano da licitação | **NOT NULL** | +| `month` | `int4` | Mês da licitação | **NOT NULL** | + +### Tabela `tendersyear` + +A tabela `tendersyear` armazena informações consolidadas das licitações culturais de Minas Gerais por ano. + +| Coluna | Tipo de Dado | Descrição | Restrição | +|--------------------|--------------|-----------------------------------------------------|----------------| +| `id` | `int4` | Identificador único da licitação anual | **Primary Key**| +| `commited_value` | `numeric` | Valor comprometido total para a licitação no ano | | +| `liquidated_value` | `numeric` | Valor liquidado total da licitação no ano | | +| `paid_value` | `numeric` | Valor pago total da licitação no ano | | +| `year` | `int4` | Ano da licitação | **NOT NULL** | + +## Exemplos de Consultas + +```sql +-- Seleciona todas as licitações mensais para o ano de 2023 +SELECT * FROM tendersmonth WHERE year = 2023; + +-- Seleciona todas as licitações anuais com valor pago superior a 100000 +SELECT * FROM tendersyear WHERE paid_value > 100000; +``` \ No newline at end of file diff --git "a/docs/vis\303\243o geral/testes.md" "b/docs/vis\303\243o geral/testes.md" deleted file mode 100644 index e2440dd..0000000 --- "a/docs/vis\303\243o geral/testes.md" +++ /dev/null @@ -1 +0,0 @@ -# Testes frontend \ No newline at end of file