Skip to content

Commit

Permalink
Merge remote-tracking branch 'ak/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
antoniospneto committed Jul 19, 2024
2 parents 7356921 + 61eef52 commit f571fba
Show file tree
Hide file tree
Showing 7 changed files with 274 additions and 63 deletions.
46 changes: 46 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Build

on:
push:
branches:
- master
pull_request:
schedule:
- cron: "0 4 * * 0"

jobs:
build-boleto-cnab-api:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to ghcr.io
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build image
uses: docker/build-push-action@v5
with:
context: .
file: Dockerfile
cache-from: type=registry,ref=ghcr.io/build-boleto-cnab-api-latest
cache-to: type=local,dest=/tmp/.buildx-cache
load: true
- name: Install test pre-requisites
run: pip install pytest
- name: Test
run: pytest -v
- name: Push image
uses: docker/build-push-action@v5
with:
context: .
file: Dockerfile
tags: |
ghcr.io/${{ github.repository }}:latest
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=inline
push: true
if: ${{ github.repository_owner == 'akretion' && github.ref == 'refs/heads/master' }}
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Backup files
*~
*.swp

30 changes: 19 additions & 11 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
FROM ruby:3.1.2-slim
FROM alpine:3.20.0
MAINTAINER "raphael.valyi@akretion.com"

WORKDIR /usr/src/app
COPY . .
RUN addgroup app
RUN adduser app --ingroup=app --disabled-password --quiet --gecos ''
RUN mkdir -p tmp log && chown app:app tmp log
RUN addgroup -S app && adduser -S -G app app && \
mkdir -p tmp log && chown app:app tmp log

RUN apt-get update
RUN apt-get install -y --no-install-recommends build-essential ghostscript git ruby-dev bundler
RUN set -eux; \
apk update && \
apk upgrade && \
apk add --no-cache \
build-base \
ghostscript \
git \
ruby-dev \
&& rm -rf /var/cache/apk/* \
;

# Evita erro
# Warning: the running version of Bundler (2.1.4) is older than the version that created the lockfile (2.3.7). We suggest you to upgrade to the version that created the lockfile by running `gem install bundler:2.3.7`.
RUN gem install bundler:2.3.7
RUN set -eux; \
gem install bundler:2.5.11 --no-document \
&& bundle install \
&& rm -rf /usr/local/bundle/cache/*.gem \
;

# throw errors if Gemfile has been modified since Gemfile.lock
RUN bundle config --global frozen 1
RUN bundle install
RUN bundle config --global frozen 1 && bundle install

EXPOSE 9292
USER app
Expand Down
5 changes: 5 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,8 @@ gem 'brcobranca', git: 'https://github.com/Engenere/brcobranca.git', branch: 'ma
gem 'rghost', '0.9.8'
gem 'grape'
gem 'puma'
gem 'base64'
gem 'mutex_m'
gem 'bigdecimal'
# Erro na versão 0.9.9 https://github.com/shairontoledo/rghost/issues/75
gem 'rghost', git: 'https://github.com/shairontoledo/rghost.git'
65 changes: 35 additions & 30 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3,73 +3,78 @@ GIT
revision: 12ff0ced3939202ae54f3f0b642b835e1f0bb596
branch: master
specs:
brcobranca (11.0.0)
fast_blank
brcobranca (10.0.0)
activesupport (>= 5.2.6)
parseline (>= 1.0.3)
rghost (>= 0.9.8)
rghost (>= 0.9)
rghost_barcode (>= 0.9)

GEM
remote: https://rubygems.org/
specs:
activesupport (7.0.5)
activesupport (7.0.3)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
connection_pool (>= 2.2.5)
base64 (>= 0)
drb (>= 0)
mutex_m (>= 0)
builder (3.2.4)
concurrent-ruby (1.2.2)
dry-core (1.0.0)
concurrent-ruby (1.1.10)
dry-configurable (0.15.0)
concurrent-ruby (~> 1.0)
zeitwerk (~> 2.6)
dry-inflector (1.0.0)
dry-logic (1.5.0)
dry-core (~> 0.6)
dry-container (0.9.0)
concurrent-ruby (~> 1.0)
dry-core (~> 1.0, < 2)
zeitwerk (~> 2.6)
dry-types (1.7.1)
dry-configurable (~> 0.13, >= 0.13.0)
dry-core (0.7.1)
concurrent-ruby (~> 1.0)
dry-core (~> 1.0)
dry-inflector (~> 1.0)
dry-logic (~> 1.4)
zeitwerk (~> 2.6)
fast_blank (1.0.1)
grape (1.7.1)
dry-inflector (0.2.1)
dry-logic (1.2.0)
concurrent-ruby (~> 1.0)
dry-core (~> 0.5, >= 0.5)
dry-types (1.5.1)
concurrent-ruby (~> 1.0)
dry-container (~> 0.3)
dry-core (~> 0.5, >= 0.5)
dry-inflector (~> 0.1, >= 0.1.2)
dry-logic (~> 1.0, >= 1.0.2)
grape (1.6.2)
activesupport
builder
dry-types (>= 1.1)
mustermann-grape (~> 1.0.0)
rack (>= 1.3.0, < 3)
rack-accept
i18n (1.14.1)
i18n (1.10.0)
concurrent-ruby (~> 1.0)
minitest (5.18.0)
mustermann (3.0.0)
minitest (5.16.1)
mustermann (1.1.1)
ruby2_keywords (~> 0.0.1)
mustermann-grape (1.0.2)
mustermann-grape (1.1.0)
mustermann (>= 1.0.0)
nio4r (2.5.9)
nio4r (2.5.8)
parseline (1.0.3)
puma (6.3.0)
puma (5.6.4)
nio4r (~> 2.0)
rack (2.2.7)
rack (2.2.4)
rack-accept (0.4.5)
rack (>= 0.4)
rghost (0.9.8)
rghost (0.9.7)
rghost_barcode (0.9)
ruby2_keywords (0.0.5)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
zeitwerk (2.6.8)

PLATFORMS
x86_64-linux
ruby

DEPENDENCIES
brcobranca!
grape
puma
rghost (= 0.9.8)

BUNDLED WITH
2.3.5
2.3.7
116 changes: 94 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,69 +1,66 @@
# sobre o projeto boleto_cnab_api
# Sobre o projeto boleto_cnab_api

O projeto de gestão de boletos, remessas e retornos bancarios https://github.com/kivanio/brcobranca é muito bem feito, bem testado e mantido.
O projeto de gestão de Boletos, Remessas e Retornos Bancários https://github.com/kivanio/brcobranca é muito bem feito, bem testado e mantido.

É interessante poder usar o projeto brcobranca (escrito em Ruby) a partir de outras linguagens na forma de um micro-serviço REST.
Mais especificamente, a [Akretion](http://www.akretion.com) que é a empresa que lidera a localização do Odoo no Brasil desde 2009 https://github.com/OCA/l10n-brazil e co-criou a fundação OCA usa esse projeto para gerenciar boletos a partir do ERP Odoo (feito em Python).
É interessante poder usar o projeto BRCobranca (escrito em Ruby) a partir de outras linguagens na forma de um micro-serviço REST.
Mais especificamente, a [Akretion](http://www.akretion.com) que é a empresa que lidera a localização do Odoo no Brasil desde 2009 https://github.com/OCA/l10n-brazil e co-criou a fundação [OCA](https://odoo-community.org/) usa esse projeto para gerenciar Boletos, Remessas e Retornos a partir do ERP Odoo (feito em Python, módulo específico https://github.com/OCA/l10n-brazil/tree/14.0/l10n_br_account_payment_brcobranca).

# funcionalidades
# Funcionalidades

Imprime *boletos*, gera arquivos de *remessa* e lê os arquivos de *retorno* nos formatos CNAB 240, CNAB 400 para os 15 principais bancos do Brasil (Banco do Brasil, Banco do Nordeste, Banco de Brasília, Banestes, Banrisul, Bradesco,Caixa, Citibank, HSBC, Itaú, Santander, Sicoob, Sicredi, UNICRED, CECRED, CREDISIS...). Mas o grande barato desse projeto é que fazemos isso com menos de 200 linhas de código! Ja comparou quantas linhas de de codigo vc tem que manter sozinho ou quase se for re-fazer na linguagem que vc quer tudo que o brcobranca ja faz? Seriam dezenas de milhares de linhas e vc nunca teria uma qualidade tão boa...
Imprime *Boletos*, gera arquivos de *Remessa* e lê os arquivos de *Retorno* nos formatos CNAB 240, CNAB 400 para os 16 principais bancos do Brasil (Banco do Brasil, Banco do Nordeste, Banestes, Santander, Banrisul, Banco de Brasília, Caixa, Bradesco, Itaú, HSBC, Sicredi, Sicoob, AILOS, Unicred, CREDISIS e Citibank). Mas o grande barato desse projeto é que fazemos isso com menos de 200 linhas de código! comparou quantas linhas de de código você tem que manter sozinho ou quase se for re-fazer na linguagem que você quer tudo que o BRCobranca já faz? Seriam dezenas de milhares de linhas e você nunca teria uma qualidade tão boa...

# API

```ruby
# validar os dados de um boleto:
# Validar os dados de um Boleto:
GET /boleto/validate
requires :bank, type: String, desc: 'Bank'
requires :data, type: String, desc: 'Boleto data as a stringified json'

# obter o nosso_numero de um boleto:
# Obter o nosso_numero de um Boleto:
GET /boleto/nosso_numero
requires :bank, type: String, desc: 'Bank'
requires :data, type: String, desc: 'Boleto data as a stringified json'

# imprimir um boleto apenas:
# Imprimir um Boleto apenas:
GET /boleto/get
requires :bank, type: String, desc: 'Bank'
requires :type, type: String, desc: 'Type: pdf|jpg|png|tif'
requires :data, type: String, desc: 'Boleto data as a stringified json'

# imprimir uma lista de boletos:
# Imprimir uma lista de Boletos:
POST /boleto/multi
requires :type, type: String, desc: 'Type: pdf|jpg|png|tif'
requires :data, type: File, desc: 'json of the list of boletos, including the "bank" key'

# gerir um arquivo de remessa CNAB 240 ou CNAB 400:
# Gerir um arquivo de Remessa CNAB 240 ou CNAB 400:
POST /remessa
requires :bank, type: String, desc: 'Bank'
requires :type, type: String, desc: 'Type: cnab400|cnab240'
requires :data, type: File, desc: 'json of the list of pagamentos'

# transformar um aqruivo de retorno CNAB 240 ou CNAB 400 em json:
# Transformar um arquivo de Retorno CNAB 240 ou CNAB 400 em JSON:
POST /retorno
requires :bank, type: String, desc: 'Bank'
requires :type, type: String, desc: 'Type: cnab400|cnab240'
requires :data, type: File, desc: 'txt of the retorno file'
```
```

Nota: os campos datas devem estar no formato YYYY/MM/DD

O API esta documentato com mais detalhes no codigo aqui: https://github.com/akretion/boleto_api/blob/master/lib/boleto_api.rb
O API está documentado com mais detalhes no código aqui: https://github.com/akretion/boleto_cnab_api/blob/master/lib/boleto_api.rb

# Como rodar o micro-serviço

```bash
git clone https://github.com/akretion/boleto_api.git
cd boleto_api
docker build -t akretion/boleto_api .
docker run -ti -p 9292:9292 akretion/boleto_api
docker run -p 9292:9292 ghcr.io/akretion/boleto_cnab_api
```

# Examplos de como consumir o serviço usando sua linguagem preferida
# Exemplos de como consumir o serviço usando sua linguagem preferida:

## Bash

Por examplo, para imprimir uma lista de boletos é preciso criar um arquivo temporario com os boletos em formato json e depois fazer um POST do arquivo:
Por exemplo, para imprimir uma lista de Boletos é preciso criar um arquivo temporario com os Boletos em formato JSON e depois fazer um POST do arquivo:
```bash
echo '[{"valor":5.0,"cedente":"Kivanio Barbosa","documento_cedente":"12345678912","sacado":"Claudio Pozzebom",
"sacado_documento":"12345678900","agencia":"0810","conta_corrente":"53678","convenio":12387,"nosso_numero":"12345678","bank":"itau"},
Expand All @@ -72,17 +69,92 @@ echo '[{"valor":5.0,"cedente":"Kivanio Barbosa","documento_cedente":"12345678912
> /tmp/boletos_data.json
curl -X POST -F type=pdf -F 'data=@/tmp/boletos_data.json' localhost:9292/api/boleto/multi > /tmp/boletos.pdf
```
Vc pode então conferir os boletos gerados no arquivo ```/tmp/boletos.pdf```
Você pode então conferir os Boletos gerados no arquivo ```/tmp/boletos.pdf```

## Python

```
TODO
```
(ver os examplos nos modulos Odoo: https://github.com/akretion/odoo-boleto-cnab)
(Ver os exemplos nos módulos Odoo: https://github.com/OCA/l10n-brazil/tree/14.0/l10n_br_account_payment_brcobranca)

## Java

```
TODO (contribuições bem vindas)
```

## Testar alterações na imagem sem necessidade de commit

No arquivo Gemfile.lock é possível alterar o repositório e o commit específico que será usado na criação da imagem, o que é necessário durante uma correção, atualização ou implementação de um novo caso, um exemplo simples pode ser visto nesse PR https://github.com/akretion/boleto_cnab_api/pull/11/files , mas também é possível alterar o Dockerfile para criar uma imagem de teste onde seja possível editar os arquivos dentro do container (o que evita subir um commit desnecessário ou com erro), para isso no arquivo Dockerfile são feitas as seguintes alterações:

Instalar Editores de texto, por exemplo vim ou nano, configurar o locales para o pt_BR.UTF-8 para evitar erro com caracteres e alterar o usuário app para o root para poder editar os arquivos
```bash
-RUN apt-get install -y --no-install-recommends build-essential ghostscript git ruby-dev bundler
+RUN apt-get install -y --no-install-recommends build-essential ghostscript git ruby-dev bundler vim locales nano
+
+RUN sed -i -e 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/' /etc/locale.gen && \
+ dpkg-reconfigure --frontend=noninteractive locales && \
+ update-locale LANG=pt_BR.UTF-8

-USER app
+USER root

```

Criação da imagem
```bash
$ docker build -t akretion/boleto_cnab_api-teste .
```

Depois de iniciar a imagem podemos entrar dentro do container
```bash
Localizar o container ID

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f265658f13ab 4abc53b9d1a2 "/bin/sh -c 'bundle …" About an hour ago Up About an hour 9292/tcp

Acessando o container

$ docker exec -it <container-id> /bin/bash

O valor <container-id> varia, nesse exemplo o comando seria

$ docker exec -it f265658f13ab /bin/bash

Dentro do container, é preciso localizar a pasta onde está instalada a biblioteca, no exemplo é usado o comando find

root@f265658f13ab:/usr/src/app# find /usr -name unicred.rb
/usr/local/bundle/bundler/gems/brcobranca-7bad3e5da8f6/lib/brcobranca/retorno/cnab400/unicred.rb
/usr/local/bundle/bundler/gems/brcobranca-7bad3e5da8f6/lib/brcobranca/remessa/cnab240/unicred.rb
/usr/local/bundle/bundler/gems/brcobranca-7bad3e5da8f6/lib/brcobranca/remessa/cnab400/unicred.rb
/usr/local/bundle/bundler/gems/brcobranca-7bad3e5da8f6/lib/brcobranca/boleto/unicred.rb

A partir disso é possível realizar alterações necessárias

root@f265658f13ab:/usr/src/app# cd /usr/local/bundle/bundler/gems/brcobranca-7bad3e5da8f6/
root@f265658f13ab:/usr/local/bundle/bundler/gems/brcobranca-7bad3e5da8f6# ls
CHANGELOG.md HISTORY.md README.md brcobranca.gemspec lib
Gemfile LICENSE Rakefile docs spec
root@f265658f13ab:/usr/local/bundle/bundler/gems/brcobranca-7bad3e5da8f6# vim lib/brcobranca/boleto/unicred.rb

```

Se for preciso podemos acompanhar o LOG para ver se há algum erro ou para verificar "imprimindo" o valor de alguma variável com o comando "puts"(https://www.codesdope.com/ruby-putsputsputs/) é possível em outra aba ou terminal rodar o comando
```bash
$ docker run -ti -p 9292:9292 akretion/boleto_cnab_api-3_3_2_slim
Puma starting in single mode...
* Puma version: 6.4.2 (ruby 3.3.2-p78) ("The Eagle of Durango")
* Min threads: 0
* Max threads: 5
* Environment: development
* PID: 6
* Listening on http://0.0.0.0:9292
Use Ctrl-C to stop
^C- Gracefully stopping, waiting for requests to finish
=== puma shutdown: 2024-06-07 15:28:38 +0000 ===
- Goodbye!
```

IMPORTANTE: por algum motivo as alterações dentro do container só tem efeito na primeira vez que o arquivo é Salvo, uma segunda alteração não tem efeito, isso pode ser algo referente ao comportamento da imagem, ou do docker ou do docker-compose, já que nos testes realizados esse container é iniciado e usado por outro container rodando o Odoo, é preciso investigar melhor para entender se isso é algo normal e já esperado ou se teria uma forma de corrigir, porque devido a isso para testar dessa forma está sendo necessário alterar uma vez e se for preciso fazer outra alteração sair do container fazer um kill e inicia-lo novamente.
Loading

0 comments on commit f571fba

Please sign in to comment.