An open API service indexing awesome lists of open source software.

https://github.com/fabiodelllima/processador-csv-fullstack

Aplicação fullstack para processamento e validação de grandes volumes de dados financeiros em CSV (~30 GB). Leitura via streaming, validação de CPF/CNPJ com algoritmo próprio (sem bibliotecas externas), verificação de consistência contratual e formatação monetária BRL.
https://github.com/fabiodelllima/processador-csv-fullstack

csv-processing express nodejs postgresql react tailwindcss typescript vite

Last synced: 29 days ago
JSON representation

Aplicação fullstack para processamento e validação de grandes volumes de dados financeiros em CSV (~30 GB). Leitura via streaming, validação de CPF/CNPJ com algoritmo próprio (sem bibliotecas externas), verificação de consistência contratual e formatação monetária BRL.

Awesome Lists containing this project

README

          

# Processador CSV

![Node.js](https://img.shields.io/badge/Node.js-22-339933?logo=nodedotjs&logoColor=white)
![TypeScript](https://img.shields.io/badge/TypeScript-5.6-3178C6?logo=typescript&logoColor=white)
![React](https://img.shields.io/badge/React-18-61DAFB?logo=react&logoColor=white)
![PostgreSQL](https://img.shields.io/badge/PostgreSQL-17-4169E1?logo=postgresql&logoColor=white)
![Tests](https://img.shields.io/badge/Tests-35%20passed-brightgreen)
![Docker](https://img.shields.io/badge/Docker-Compose-2496ED?logo=docker&logoColor=white)

Desafio técnico fullstack para processamento e validação de grandes volumes de dados financeiros em CSV (~30 GB). A aplicação lê registros de contratos via streaming, valida o CPF/CNPJ com algoritmo próprio (sem bibliotecas externas), verifica a consistência entre valor total e prestações, e formata valores monetários em BRL — exibindo os resultados em uma interface web com indicadores visuais por registro.

---

## Sumário

- [O Problema](#o-problema)
- [A Solução](#a-solução)
- [Backend](#backend)
- [Frontend](#frontend)
- [Estrutura do CSV](#estrutura-do-csv)
- [Stack](#stack)
- [Testes](#testes)
- [Uso](#uso)

---

## O Problema

O desafio propunha a construção de uma aplicação capaz de processar aproximadamente **30 GB** de dados financeiros em formato CSV — registros de contratos com campos como CPF/CNPJ, valores totais, prestações, mora, multa, IOF e descontos. Cada registro deveria ser validado individualmente, e os resultados deveriam ser apresentados em uma interface web ao final do processamento.

Parte dos dados é intencionalmente inválida: CPFs e CNPJs gerados por um script com dígitos verificadores incorretos, valores de prestação inconsistentes com o total do contrato e campos financeiros em formato bruto que exigem conversão monetária. O objetivo era avaliar a construção de uma solução capaz de lidar com esse volume sem comprometer a memória, mantendo validações rigorosas e retorno visual claro para o usuário.

### Restrições do Desafio

- **Processamento em larga escala:** ~30 GB de dados sem estouro de memória — leitura obrigatoriamente via streaming, sem carregamento integral.
- **Validação de CPF/CNPJ sem bibliotecas externas:** algoritmo próprio que implementa o cálculo dos dígitos verificadores conforme regras da Receita Federal, tanto para o CPF (11 dígitos) quanto para o CNPJ (14 dígitos). O objetivo era avaliar o raciocínio algorítmico, não o uso de dependências.
- **Formatação monetária:** todos os campos financeiros (`vlTotal`, `vlPresta`, `vlMora`, `vlMulta`, `vlOutAcr`, `vlIof`, `vlDescon`, `vlAtual`) convertidos para Real Brasileiro (BRL) com `Intl.NumberFormat`.
- **Verificação de consistência contratual:** divisão de `vlTotal` por `qtPrestacoes` e comparação com `vlPresta` para cada registro, garantindo que os valores de prestação sejam matematicamente coerentes com o valor total do contrato.
- **Critérios de avaliação:** tratamento de dados em larga escala, comunicação assíncrona, gerenciamento de estado, escolha adequada de tecnologias e boas práticas de desenvolvimento.

---

## A Solução

### Backend

O servidor é construído em **Node.js com TypeScript** e processa os arquivos CSV via streaming com `fs` (File System) e `csv-parser`, convertendo cada linha em um objeto JavaScript sem carregar o arquivo inteiro em memória. Essa abordagem permite que a aplicação suporte arquivos de dezenas de gigabytes sem degradação de desempenho, processando registro por registro em um fluxo assíncrono.

A arquitetura separa responsabilidades em camadas bem definidas: os controllers recebem as requisições HTTP (upload, download, status), delegam ao serviço de processamento que orquestra as validações, e cada tipo de validação reside em seu próprio módulo com interface tipada:

```
backend/src/
├── controllers/ # Upload, download, status de processamento
├── database/
│ ├── migrations/ # Scripts SQL de criação do schema
│ └── repository.ts # Camada de acesso ao PostgreSQL
├── services/
│ ├── csv.service.ts # Orquestração do fluxo de processamento
│ └── validations/
│ ├── document.validation.ts # CPF/CNPJ (algoritmo próprio)
│ ├── contract.validation.ts # Consistência contratual
│ ├── installment.validation.ts # Verificação de prestações
│ └── file.validation.ts # Validação de formato do CSV
├── interfaces/ # Tipagem TypeScript (records, results, errors)
├── errors/ # Hierarquia de erros (AppError, ValidationError, etc.)
├── middlewares/ # Error handler global, upload handler (multer)
├── config/ # Database, variáveis de ambiente, upload
├── utils/ # Formatação monetária (BRL)
└── routes/ # Endpoints REST
```

A validação de documentos implementa, do zero, o algoritmo de dígitos verificadores da Receita Federal. Para o **CPF**, os multiplicadores [10,9,8…2] geram o primeiro dígito verificador e [11,10,9…2] geram o segundo, com resto de divisão por 11 determinando o dígito esperado. Para o **CNPJ**, a mesma lógica se aplica com multiplicadores [5,4,3,2,9,8,7,6,5,4,3,2] e [6,5,4,3,2,9,8,7,6,5,4,3,2]. Ambos os algoritmos tratam os casos limite definidos pela Receita — sequências repetidas (111.111.111-11), restos iguais a zero e restos iguais a um.

O sistema persiste os resultados de cada validação em **PostgreSQL**, permitindo que o frontend consulte o status e os resultados de processamentos anteriores sem reprocessar o arquivo.

### Frontend

A interface consiste em uma **SPA construída com React 18 e TypeScript**, com build gerenciado pelo **Vite** e estilização via **Tailwind CSS**. O usuário faz upload de um arquivo CSV e acompanha o processamento em tempo real. Ao final, os resultados aparecem em uma tabela com indicadores visuais de aprovação ou reprovação para cada validação — documento válido/inválido, prestação consistente/inconsistente, formatação aplicada.

O gerenciamento de estado do processamento está encapsulado no hook `useCsvProcessor`, que abstrai as chamadas à API e expõe estados de carregamento, progresso e resultados para os componentes de apresentação.

```
frontend/src/
├── components/ # Loader, StatusDots (indicadores visuais por validação)
├── hooks/ # useCsvProcessor (estado do processamento)
├── pages/ # Home (upload + tabela de resultados)
├── services/ # Comunicação com a API backend
└── interfaces/ # Tipagem compartilhada com o backend
```

---

## Estrutura do CSV

Os arquivos de entrada contêm registros de contratos financeiros com as seguintes colunas:

| Campo | Descrição |
| ---------------------------------------------------- | ----------------------------------------------------------------------- |
| `nrInst` | Número da Instituição |
| `nrAgencia` | Número da Agência |
| `cdClient` / `nmClient` | Código e nome do cliente |
| `nrCpfCnpj` | CPF ou CNPJ (alvo de validação) |
| `nrContrato` / `dtContrato` | Número e data do contrato |
| `qtPrestacoes` | Quantidade de prestações |
| `vlTotal` | Valor total do contrato |
| `vlPresta` | Valor da prestação (comparado com `vlTotal / qtPrestacoes`) |
| `vlMora`, `vlMulta`, `vlOutAcr`, `vlIof`, `vlDescon` | Componentes financeiros (mora, multa, outros acréscimos, IOF, desconto) |
| `vlAtual` | Valor atual |
| `idSituac` / `idSitVen` | Situação e situação de vencimento |

---

## Stack

| Camada | Tecnologias |
| -------- | ---------------------------------------------------- |
| Backend | Node.js, TypeScript, Express, csv-parser, PostgreSQL |
| Frontend | React 18, TypeScript, Vite, Tailwind CSS |
| Testes | Vitest, @vitest/coverage-v8 |
| Lint | Biome, ESLint (type-aware) |
| Infra | Docker Compose, dotenv |

---

## Testes

O backend possui 35 testes unitários cobrindo as regras de negócio centrais do processamento, executados com **Vitest**:

```bash
cd backend
npm test # Executa todos os testes
npm run test:coverage # Executa com relatório de cobertura
```

| Suite | Testes | Cobertura |
| ---------------------- | ------ | --------- |
| Validação de CPF/CNPJ | 12 | 96% |
| Validação de prestação | 7 | 100% |
| Validação de contrato | 6 | 100% |
| Parsing numérico (BRL) | 10 | 65% |
| **Total** | **35** | |

---

## Uso

### Pré-requisitos

- Node.js 22+
- Docker e Docker Compose

### Banco de Dados

```bash
docker compose up -d # Sobe o PostgreSQL na porta 5434
```

### Backend

```bash
cd backend
cp .env.example .env # Credenciais já configuradas para dev
npm install
npm run dev # http://localhost:3000
```

### Frontend

```bash
cd frontend
npm install
npm run dev # http://localhost:5173
```

### Fluxo

1. Acesse `http://localhost:5173`
2. Faça upload de um arquivo CSV
3. Aguarde o processamento
4. Visualize os resultados na tabela de validações