Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
21 changes: 21 additions & 0 deletions .github/workflows/documentation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Documentation
on:
push:
branches:
- main
jobs:
change-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Generate documentation
run: |
pip install pdoc3
pip install flask
PYTHONPATH=src pdoc --html src/ --force --output-dir ./docs
- name: Commit and push changes
uses: devops-infra/action-commit-push@v0.9.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
commit_message: Documentation update
18 changes: 18 additions & 0 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Quality
on:
push:
branches:
- main
jobs:
sonarcloud:
name: SonarCloud
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: SonarCloud Scan
uses: SonarSource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
env/
db/database.db
__pycache__/
src/__pycache__/
20 changes: 20 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# set base image (host OS)
FROM python:3.10

# set the working directory in the container
WORKDIR /recomb

# copy the dependencies file to the working directory
COPY requirements.txt .

# install dependencies
RUN pip install -r requirements.txt

# copy the content of the local schema to the working directory
COPY db/schema.sql db/schema.sql

# copy the content of the local src directory to the working directory
COPY src/ src/

# command to run on container start
CMD [ "python", "./src/service.py" ]
73 changes: 33 additions & 40 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,62 +1,55 @@
# Venha para Recomb

O desafio é desenvolver um programa que permita realizar as seguintes buscas:
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=LKhoe_venhapararecomb&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=LKhoe_venhapararecomb)

1) Listar os valores e data de Vencimento dos boletos presentes em um nota fiscal conforme o CPF ou CNPJ de um fornecedor.
2) Apresentar o nome, identificador (CPF ou CNPJ), endereço dos clientes de um fornecedor.
## Documentação da solução

**Escolha as tecnologias que você vai usar e tente montar uma solução completa para rodar a aplicação.**
### Solução

Para enviar o resultado, basta realiazar um Fork deste repositório e abra um Pull Request, com seu nome.
O Código desenvolvido cria um serviço Flask que permite o upload de arquivos de NFe em formato `.xml` e realiza o parsing em cada um deles.

É importante comentar que deve ser enviado apenas o código fonte. Não aceitaremos códigos compilados.
A partir do parsing as informações de Cliente, Fornecedor e Boletos de uma NFe são extraídos e armazenados em um banco de dados.

Por fim, o candidato deve atualizar o Readme.md com as seguintes informações:

1) Documentação da solução;
2) Lista dos diferenciais implementados
Também no serviço Flask é possível consultar informações de um Fornecedor a partir de seu identificador (CPF ou CNPJ).

## Avaliação
As informações informadas são aquelas especificadas no desafio:
1. Nome, CPF ou CNPJ e Endereço dos Clientes que compram desse Fornecedor;
2. Boletos emitidos por esse Fornecedor;

O programa será avaliado levando em conta os seguintes critérios:
|Critério| Valor|
|-------|--------|
|Legibilidade do Código |10|
|Organização do Código|10|
|Documentação do código |10|
|Documentação da solução |10|
|Tratamento de Erros |10|
|Total| 50|
### Código

A pontuação do candidato será a soma dos valores obtidos nos critérios acima.
O código foi desenvolvido em módulos, onde cada módulo realiza operações em uma área específica.
- [Database](./src/database.py): Responsável pela conexão de manipulação do banco de dados.
- [Parsing](./src/parsing.py): Responsável por reconhecer dos arquivos de entrada e extrair as informações dele.
- [Models](./src/models.py): Define as classes que representam os objetos que serão manipulados.

## Diferenciais
Além dos módulos foi desenvolvido um serviço em Flask para facilitar o uso.
- [Service](./src/service.py): Serviço em Flask responsável pela aplicação web.

A documentação de cada uma das funções dos módulos foi gerada pelo [pdoc3](https://pypi.org/project/pdoc3/), através dos comentários feitos no código.
Para consultar a documentação em um formato amigável:
- Clone o repositório ```git clone https://github.com/LKhoe/venhapararecomb.git```
- Na pasta `docs/` abra o arquivo `index.html` com algum navegador.

### Execução

```bash
docker build -t recomb .
docker run -it -p 5000:5000 recomb
```

## Lista dos diferenciais implementados

O candidato pode aumentar a sua pontuação na seleção implementando um ou mais dos itens abaixo:
|Item | Pontos Ganhos|
|-----|--------------|
|Criar um serviço com o problema |30|
|Utilizar banco de dados |30|
|Implementar Clean Code |20|
|Implementar o padrão de programação da tecnologia escolhida |20|
|Qualidade de Código com SonarQube| 15|
|Implementar testes unitários |15|
|Implementar testes comportamentais | 15|
|Implementar integração com Travis |10|
|Implementar integração com Travis + SonarQube |10|
|Implementar usando Docker |5|
|Total | 170|

A nota final do candidato será acrescido dos pontos referente ao item implementado corretamente.

## Penalizações

O candidato será desclassifiado nas seguintes situações:

1) Submeter um solução que não funcione;
2) Não cumprir os critérios presentes no seção Avaliação;
3) Plágio;


|Total | 120|

## Desafio

Descrito no [repositório original](https://github.com/recombX/venhapararecomb#readme) do desafio.
34 changes: 34 additions & 0 deletions db/schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
DROP TABLE IF EXISTS fornecedores;
DROP TABLE IF EXISTS clientes;
DROP TABLE IF EXISTS boletos;
DROP TABLE IF EXISTS notas_fiscais;

CREATE TABLE fornecedores (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
identificador TEXT NOT NULL UNIQUE
);

CREATE TABLE clientes (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
identificador TEXT NOT NULL UNIQUE,
nome TEXT NOT NULL,
endereco TEXT NOT NULL
);

CREATE TABLE notas_fiscais (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
chave_acesso TEXT NOT NULL UNIQUE,
fornecedor_id INTEGER,
cliente_id INTEGER,
FOREIGN KEY (fornecedor_id) REFERENCES fornecedores(_id),
FOREIGN KEY (cliente_id) REFERENCES clientes(_id)
);

CREATE TABLE boletos (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
valor REAL NOT NULL,
vencimento TIMESTAMP NOT NULL,
nota_fiscal_id INTEGER,
FOREIGN KEY (nota_fiscal_id) REFERENCES notas_fiscais(_id)
);

Loading