├── .flake8 ├── .gitattributes ├── .github ├── dependabot.yml ├── labels.yml ├── release-drafter.yml ├── stale.yml └── workflows │ ├── constraints.txt │ ├── documentation.yml │ ├── labeler.yml │ ├── release.yml │ └── tests.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .readthedocs.yml ├── CODE_OF_CONDUCT.rst ├── CONTRIBUTING.rst ├── LICENSE.rst ├── README.rst ├── codecov.yml ├── docs ├── conf.py ├── index.rst ├── license.rst └── requirements.txt ├── mypy.ini ├── noxfile.py ├── poetry.lock ├── pyproject.toml ├── resources ├── corretoras.json ├── empresas.json ├── etfs.json ├── fiis.json └── json_helper.py ├── src └── irpf_cei │ ├── __init__.py │ ├── __main__.py │ ├── b3.py │ ├── cei.py │ ├── formatting.py │ ├── py.typed │ └── responses.py └── tests ├── __init__.py ├── conftest.py ├── test_b3.py ├── test_cei.py ├── test_formatting.py ├── test_main.py └── test_responses.py /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | select = B,B9,C,D,DAR,E,F,N,RST,S,W 3 | ignore = E203,E501,W503 4 | max-line-length = 80 5 | max-complexity = 10 6 | docstring-convention = google 7 | per-file-ignores = tests/*:S101 8 | rst-roles = class,const,func,meth,mod,ref 9 | rst-directives = deprecated 10 | ; darglint 11 | strictness = long 12 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | - package-ecosystem: pip 8 | directory: "/.github/workflows" 9 | schedule: 10 | interval: daily 11 | - package-ecosystem: pip 12 | directory: "/docs" 13 | schedule: 14 | interval: daily 15 | - package-ecosystem: pip 16 | directory: "/" 17 | schedule: 18 | interval: daily 19 | -------------------------------------------------------------------------------- /.github/labels.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Labels names are important as they are used by Release Drafter to decide 3 | # regarding where to record them in changelog or if to skip them. 4 | # 5 | # The repository labels will be automatically configured using this file and 6 | # the GitHub Action https://github.com/marketplace/actions/github-labeler. 7 | - name: breaking 8 | description: Breaking Changes 9 | color: bfd4f2 10 | - name: bug 11 | description: Something isn't working 12 | color: d73a4a 13 | - name: build 14 | description: Build System and Dependencies 15 | color: bfdadc 16 | - name: ci 17 | description: Continuous Integration 18 | color: 4a97d6 19 | - name: dependencies 20 | description: Pull requests that update a dependency file 21 | color: 0366d6 22 | - name: documentation 23 | description: Improvements or additions to documentation 24 | color: 0075ca 25 | - name: duplicate 26 | description: This issue or pull request already exists 27 | color: cfd3d7 28 | - name: enhancement 29 | description: New feature or request 30 | color: a2eeef 31 | - name: github_actions 32 | description: Pull requests that update Github_actions code 33 | color: "000000" 34 | - name: good first issue 35 | description: Good for newcomers 36 | color: 7057ff 37 | - name: help wanted 38 | description: Extra attention is needed 39 | color: 008672 40 | - name: invalid 41 | description: This doesn't seem right 42 | color: e4e669 43 | - name: performance 44 | description: Performance 45 | color: "016175" 46 | - name: python 47 | description: Pull requests that update Python code 48 | color: 2b67c6 49 | - name: question 50 | description: Further information is requested 51 | color: d876e3 52 | - name: refactoring 53 | description: Refactoring 54 | color: ef67c4 55 | - name: removal 56 | description: Removals and Deprecations 57 | color: 9ae7ea 58 | - name: style 59 | description: Style 60 | color: c120e5 61 | - name: testing 62 | description: Testing 63 | color: b1fc6f 64 | - name: wontfix 65 | description: This will not be worked on 66 | color: ffffff 67 | -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | categories: 2 | - title: ":boom: Breaking Changes" 3 | label: "breaking" 4 | - title: ":rocket: Features" 5 | label: "enhancement" 6 | - title: ":fire: Removals and Deprecations" 7 | label: "removal" 8 | - title: ":beetle: Fixes" 9 | label: "bug" 10 | - title: ":raising_hand: Help wanted" 11 | label: "help wanted" 12 | - title: ":racehorse: Performance" 13 | label: "performance" 14 | - title: ":rotating_light: Testing" 15 | label: "testing" 16 | - title: ":construction_worker: Continuous Integration" 17 | label: "ci" 18 | - title: ":books: Documentation" 19 | label: "documentation" 20 | - title: ":hammer: Refactoring" 21 | label: "refactoring" 22 | - title: ":lipstick: Style" 23 | label: "style" 24 | - title: ":package: Dependencies" 25 | labels: 26 | - "dependencies" 27 | - "build" 28 | template: | 29 | ## Changes 30 | 31 | $CHANGES 32 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 90 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - "dependencies" 8 | - "documentation" 9 | - "enhancement" 10 | # Label to use when marking an issue as stale 11 | staleLabel: wontfix 12 | # Comment to post when marking an issue as stale. Set to `false` to disable 13 | markComment: > 14 | This issue has been automatically marked as stale because it has not had 15 | recent activity. It will be closed if no further activity occurs. Thank you 16 | for your contributions. 17 | # Comment to post when closing a stale issue. Set to `false` to disable 18 | closeComment: > 19 | This issue has been automatically closed due to inactivity. Please create 20 | a new issue if you need more help. 21 | 22 | # limit to only issues 23 | only: issues 24 | -------------------------------------------------------------------------------- /.github/workflows/constraints.txt: -------------------------------------------------------------------------------- 1 | pip==21.3.1 2 | nox==2021.10.1 3 | nox-poetry==0.9.0 4 | poetry==1.1.12 5 | virtualenv==20.12.0 6 | -------------------------------------------------------------------------------- /.github/workflows/documentation.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Documentation 3 | 4 | on: 5 | schedule: 6 | - cron: "0 0 * * 0" # every week at midnight 7 | push: 8 | paths: 9 | - "**.rst" 10 | - "docs/**" 11 | pull_request: 12 | paths: 13 | - "**.rst" 14 | - "docs/**" 15 | 16 | jobs: 17 | docs: 18 | name: Build documentation & check links 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@v2.4.0 22 | - uses: actions/setup-python@v2.3.1 23 | with: 24 | python-version: "3.10" 25 | 26 | - name: Upgrade pip 27 | run: | 28 | pip install --constraint=.github/workflows/constraints.txt pip 29 | pip --version 30 | - name: Install Poetry 31 | run: | 32 | pipx install --pip-args=--constraint=.github/workflows/constraints.txt poetry 33 | poetry --version 34 | - name: Install Nox 35 | run: | 36 | pipx install --pip-args=--constraint=.github/workflows/constraints.txt nox 37 | pipx inject --pip-args=--constraint=.github/workflows/constraints.txt nox nox-poetry 38 | nox --version 39 | - name: Build documentation 40 | run: nox --force-color --session=docs-build 41 | 42 | - name: Upload documentation 43 | uses: actions/upload-artifact@v2.3.1 44 | with: 45 | name: docs 46 | path: docs/_build 47 | -------------------------------------------------------------------------------- /.github/workflows/labeler.yml: -------------------------------------------------------------------------------- 1 | name: Labeler 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | labeler: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Check out the repository 13 | uses: actions/checkout@v2.4.0 14 | 15 | - name: Run Labeler 16 | uses: crazy-max/ghaction-github-labeler@v3.1.1 17 | with: 18 | skip-delete: true 19 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | release: 10 | name: Release 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Check out the repository 14 | uses: actions/checkout@v2.4.0 15 | with: 16 | fetch-depth: 2 17 | 18 | - name: Set up Python 19 | uses: actions/setup-python@v2.3.1 20 | with: 21 | python-version: "3.10" 22 | 23 | - name: Upgrade pip 24 | run: | 25 | pip install --constraint=.github/workflows/constraints.txt pip 26 | pip --version 27 | 28 | - name: Install Poetry 29 | run: | 30 | pip install --constraint=.github/workflows/constraints.txt poetry 31 | poetry --version 32 | 33 | - name: Check if there is a parent commit 34 | id: check-parent-commit 35 | run: | 36 | echo "::set-output name=sha::$(git rev-parse --verify --quiet HEAD^)" 37 | 38 | - name: Detect and tag new version 39 | id: check-version 40 | if: steps.check-parent-commit.outputs.sha 41 | uses: salsify/action-detect-and-tag-new-version@v2.0.1 42 | with: 43 | version-command: | 44 | bash -o pipefail -c "poetry version | awk '{ print \$2 }'" 45 | 46 | - name: Bump version for developmental release 47 | if: "! steps.check-version.outputs.tag" 48 | run: | 49 | poetry version patch && 50 | version=$(poetry version | awk '{ print $2 }') && 51 | poetry version $version.dev.$(date +%s) 52 | 53 | - name: Build package 54 | run: | 55 | poetry build --ansi 56 | 57 | - name: Publish package on PyPI 58 | if: steps.check-version.outputs.tag 59 | uses: pypa/gh-action-pypi-publish@v1.4.2 60 | with: 61 | user: __token__ 62 | password: ${{ secrets.PYPI_TOKEN }} 63 | 64 | - name: Publish package on TestPyPI 65 | if: "! steps.check-version.outputs.tag" 66 | uses: pypa/gh-action-pypi-publish@v1.4.2 67 | with: 68 | user: __token__ 69 | password: ${{ secrets.TEST_PYPI_TOKEN }} 70 | repository_url: https://test.pypi.org/legacy/ 71 | 72 | - name: Publish the release notes 73 | uses: release-drafter/release-drafter@v5.15.0 74 | with: 75 | publish: ${{ steps.check-version.outputs.tag != '' }} 76 | tag: ${{ steps.check-version.outputs.tag }} 77 | env: 78 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 79 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: 4 | - push 5 | - pull_request 6 | 7 | jobs: 8 | tests: 9 | name: ${{ matrix.session }} ${{ matrix.python }} / ${{ matrix.os }} 10 | runs-on: ${{ matrix.os }} 11 | strategy: 12 | fail-fast: false 13 | matrix: 14 | include: 15 | - { python: "3.10", os: "ubuntu-latest", session: "pre-commit" } 16 | - { python: "3.10", os: "ubuntu-latest", session: "safety" } 17 | - { python: "3.10", os: "ubuntu-latest", session: "mypy" } 18 | - { python: "3.9", os: "ubuntu-latest", session: "mypy" } 19 | - { python: "3.8", os: "ubuntu-latest", session: "mypy" } 20 | - { python: "3.10", os: "ubuntu-latest", session: "tests" } 21 | - { python: "3.9", os: "ubuntu-latest", session: "tests" } 22 | - { python: "3.8", os: "ubuntu-latest", session: "tests" } 23 | - { python: "3.10", os: "windows-latest", session: "tests" } 24 | - { python: "3.10", os: "macos-latest", session: "tests" } 25 | - { python: "3.10", os: "ubuntu-latest", session: "typeguard" } 26 | 27 | env: 28 | NOXSESSION: ${{ matrix.session }} 29 | 30 | steps: 31 | - name: Check out the repository 32 | uses: actions/checkout@v2.4.0 33 | 34 | - name: Set up Python ${{ matrix.python }} 35 | uses: actions/setup-python@v2.3.1 36 | with: 37 | python-version: ${{ matrix.python }} 38 | 39 | - name: Upgrade pip 40 | run: | 41 | pip install --constraint=.github/workflows/constraints.txt pip 42 | pip --version 43 | 44 | - name: Install Poetry 45 | run: | 46 | pipx install --pip-args=--constraint=.github/workflows/constraints.txt poetry 47 | poetry --version 48 | 49 | - name: Install Nox 50 | run: | 51 | pipx install --pip-args=--constraint=.github/workflows/constraints.txt nox 52 | pipx inject --pip-args=--constraint=.github/workflows/constraints.txt nox nox-poetry 53 | nox --version 54 | 55 | - name: Compute pre-commit cache key 56 | if: matrix.session == 'pre-commit' 57 | id: pre-commit-cache 58 | shell: python 59 | run: | 60 | import hashlib 61 | import sys 62 | 63 | python = "py{}.{}".format(*sys.version_info[:2]) 64 | payload = sys.version.encode() + sys.executable.encode() 65 | digest = hashlib.sha256(payload).hexdigest() 66 | result = "${{ runner.os }}-{}-{}-pre-commit".format(python, digest[:8]) 67 | 68 | print("::set-output name=result::{}".format(result)) 69 | 70 | - name: Restore pre-commit cache 71 | uses: actions/cache@v2.1.7 72 | if: matrix.session == 'pre-commit' 73 | with: 74 | path: ~/.cache/pre-commit 75 | key: ${{ steps.pre-commit-cache.outputs.result }}-${{ hashFiles('.pre-commit-config.yaml') }} 76 | restore-keys: | 77 | ${{ steps.pre-commit-cache.outputs.result }}- 78 | 79 | - name: Run Nox 80 | run: | 81 | nox --force-color --python=${{ matrix.python }} 82 | 83 | - name: Upload coverage data 84 | if: always() && matrix.session == 'tests' 85 | uses: "actions/upload-artifact@v2.3.1" 86 | with: 87 | name: coverage-data 88 | path: ".coverage.*" 89 | 90 | coverage: 91 | runs-on: ubuntu-latest 92 | needs: tests 93 | steps: 94 | - name: Check out the repository 95 | uses: actions/checkout@v2.4.0 96 | 97 | - name: Set up Python 98 | uses: actions/setup-python@v2.3.1 99 | with: 100 | python-version: "3.10" 101 | 102 | - name: Upgrade pip 103 | run: | 104 | pip install --constraint=.github/workflows/constraints.txt pip 105 | pip --version 106 | 107 | - name: Install Poetry 108 | run: | 109 | pipx install --pip-args=--constraint=.github/workflows/constraints.txt poetry 110 | poetry --version 111 | 112 | - name: Install Nox 113 | run: | 114 | pipx install --pip-args=--constraint=.github/workflows/constraints.txt nox 115 | pipx inject --pip-args=--constraint=.github/workflows/constraints.txt nox nox-poetry 116 | nox --version 117 | 118 | - name: Download coverage data 119 | uses: actions/download-artifact@v2.1.0 120 | with: 121 | name: coverage-data 122 | 123 | - name: Combine coverage data and display human readable report 124 | run: | 125 | nox --force-color --session=coverage 126 | 127 | - name: Create coverage report 128 | run: | 129 | nox --force-color --session=coverage -- xml 130 | 131 | - name: Upload coverage report 132 | uses: codecov/codecov-action@v2.1.0 133 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .mypy_cache/ 2 | /.coverage 3 | /.nox/ 4 | /.python-version 5 | /.pytype/ 6 | /dist/ 7 | /docs/_build/ 8 | /src/*.egg-info/ 9 | __pycache__/ 10 | 11 | # Pycharm 12 | .idea/ 13 | 14 | # Visual Studio Code 15 | .vscode/ 16 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: local 3 | hooks: 4 | - id: black 5 | name: black 6 | entry: black 7 | language: system 8 | types: [python] 9 | require_serial: true 10 | - id: check-added-large-files 11 | name: Check for added large files 12 | entry: check-added-large-files 13 | language: system 14 | - id: check-toml 15 | name: Check Toml 16 | entry: check-toml 17 | language: system 18 | types: [toml] 19 | - id: check-yaml 20 | name: Check Yaml 21 | entry: check-yaml 22 | language: system 23 | types: [yaml] 24 | - id: end-of-file-fixer 25 | name: Fix End of Files 26 | entry: end-of-file-fixer 27 | language: system 28 | types: [text] 29 | stages: [commit, push, manual] 30 | - id: flake8 31 | name: flake8 32 | entry: flake8 33 | language: system 34 | types: [python] 35 | require_serial: true 36 | - id: pyupgrade 37 | name: pyupgrade 38 | description: Automatically upgrade syntax for newer versions. 39 | entry: pyupgrade 40 | language: system 41 | types: [python] 42 | args: [--py38-plus] 43 | - id: reorder-python-imports 44 | name: Reorder python imports 45 | entry: reorder-python-imports 46 | language: system 47 | types: [python] 48 | args: [--application-directories=src] 49 | - id: trailing-whitespace 50 | name: Trim Trailing Whitespace 51 | entry: trailing-whitespace-fixer 52 | language: system 53 | types: [text] 54 | stages: [commit, push, manual] 55 | - repo: https://github.com/prettier/pre-commit 56 | rev: v2.1.2 57 | hooks: 58 | - id: prettier 59 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | sphinx: 3 | configuration: docs/conf.py 4 | formats: all 5 | python: 6 | version: 3.8 7 | install: 8 | - requirements: docs/requirements.txt 9 | - path: . 10 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.rst: -------------------------------------------------------------------------------- 1 | Contributor Covenant Code of Conduct 2 | ==================================== 3 | 4 | Our Pledge 5 | ---------- 6 | 7 | We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. 8 | 9 | We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. 10 | 11 | 12 | Our Standards 13 | ------------- 14 | 15 | Examples of behavior that contributes to a positive environment for our community include: 16 | 17 | - Demonstrating empathy and kindness toward other people 18 | - Being respectful of differing opinions, viewpoints, and experiences 19 | - Giving and gracefully accepting constructive feedback 20 | - Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience 21 | - Focusing on what is best not just for us as individuals, but for the overall community 22 | 23 | Examples of unacceptable behavior include: 24 | 25 | - The use of sexualized language or imagery, and sexual attention or 26 | advances of any kind 27 | - Trolling, insulting or derogatory comments, and personal or political attacks 28 | - Public or private harassment 29 | - Publishing others' private information, such as a physical or email 30 | address, without their explicit permission 31 | - Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | Enforcement Responsibilities 35 | ---------------------------- 36 | 37 | Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. 38 | 39 | Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. 40 | 41 | 42 | Scope 43 | ----- 44 | 45 | This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. 46 | 47 | 48 | Enforcement 49 | ----------- 50 | 51 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at staticdev-support@protonmail.com. All complaints will be reviewed and investigated promptly and fairly. 52 | 53 | All community leaders are obligated to respect the privacy and security of the reporter of any incident. 54 | 55 | 56 | Enforcement Guidelines 57 | ---------------------- 58 | 59 | Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: 60 | 61 | 62 | 1. Correction 63 | ~~~~~~~~~~~~~ 64 | 65 | **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. 66 | 67 | **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. 68 | 69 | 70 | 2. Warning 71 | ~~~~~~~~~~ 72 | 73 | **Community Impact**: A violation through a single incident or series of actions. 74 | 75 | **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. 76 | 77 | 78 | 3. Temporary Ban 79 | ~~~~~~~~~~~~~~~~ 80 | 81 | **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. 82 | 83 | **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. 84 | 85 | 86 | 4. Permanent Ban 87 | ~~~~~~~~~~~~~~~~ 88 | 89 | **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. 90 | 91 | **Consequence**: A permanent ban from any sort of public interaction within the community. 92 | 93 | 94 | Attribution 95 | ----------- 96 | 97 | This Code of Conduct is adapted from the `Contributor Covenant `__, version 2.0, 98 | available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 99 | 100 | Community Impact Guidelines were inspired by `Mozilla’s code of conduct enforcement ladder `__. 101 | 102 | .. _homepage: https://www.contributor-covenant.org 103 | 104 | For answers to common questions about this code of conduct, see the FAQ at 105 | https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. 106 | -------------------------------------------------------------------------------- /CONTRIBUTING.rst: -------------------------------------------------------------------------------- 1 | Contributor Guide 2 | ================= 3 | 4 | Thank you for your interest in improving this project. 5 | This project is open-source under the `MIT license`_ and 6 | welcomes contributions in the form of bug reports, feature requests, and pull requests. 7 | 8 | Here is a list of important resources for contributors: 9 | 10 | - `Source Code`_ 11 | - `Documentation`_ 12 | - `Issue Tracker`_ 13 | - `Code of Conduct`_ 14 | 15 | .. _MIT license: https://opensource.org/licenses/MIT 16 | .. _Source Code: https://github.com/staticdev/irpf-cei 17 | .. _Documentation: https://irpf-cei.readthedocs.io/ 18 | .. _Issue Tracker: https://github.com/staticdev/irpf-cei/issues 19 | 20 | How to report a bug 21 | ------------------- 22 | 23 | Report bugs on the `Issue Tracker`_. 24 | 25 | When filing an issue, make sure to answer these questions: 26 | 27 | - Which operating system and Python version are you using? 28 | - Which version of this project are you using? 29 | - What did you do? 30 | - What did you expect to see? 31 | - What did you see instead? 32 | 33 | The best way to get your bug fixed is to provide a test case, 34 | and/or steps to reproduce the issue. 35 | 36 | 37 | How to request a feature 38 | ------------------------ 39 | 40 | Request features on the `Issue Tracker`_. 41 | 42 | 43 | How to set up your development environment 44 | ------------------------------------------ 45 | 46 | You need Python 3.6+ and the following tools: 47 | 48 | - Poetry_ 49 | - Nox_ 50 | 51 | Install the package with development requirements: 52 | 53 | .. code:: console 54 | 55 | $ poetry install 56 | 57 | You can now run an interactive Python session, 58 | or the command-line interface: 59 | 60 | .. code:: console 61 | 62 | $ poetry run python 63 | $ poetry run irpf-cei 64 | 65 | .. _Poetry: https://python-poetry.org/ 66 | .. _Nox: https://nox.thea.codes/ 67 | 68 | 69 | How to test the project 70 | ----------------------- 71 | 72 | Run the full test suite: 73 | 74 | .. code:: console 75 | 76 | $ nox 77 | 78 | List the available Nox sessions: 79 | 80 | .. code:: console 81 | 82 | $ nox --list-sessions 83 | 84 | You can also run a specific Nox session. 85 | For example, invoke the unit test suite like this: 86 | 87 | .. code:: console 88 | 89 | $ nox --session=tests 90 | 91 | Unit tests are located in the ``tests`` directory, 92 | and are written using the pytest_ testing framework. 93 | 94 | .. _pytest: https://pytest.readthedocs.io/ 95 | 96 | 97 | How to submit changes 98 | --------------------- 99 | 100 | Open a `pull request`_ to submit changes to this project. 101 | 102 | Your pull request needs to meet the following guidelines for acceptance: 103 | 104 | - The Nox test suite must pass without errors and warnings. 105 | - Include unit tests. This project maintains 100% code coverage. 106 | - If your changes add functionality, update the documentation accordingly. 107 | 108 | Feel free to submit early, though—we can always iterate on this. 109 | 110 | To run linting and code formatting checks before commiting your change, you can install pre-commit as a Git hook by running the following command: 111 | 112 | .. code:: console 113 | 114 | $ nox --session=pre-commit -- install 115 | 116 | It is recommended to open an issue before starting work on anything. 117 | This will allow a chance to talk it over with the owners and validate your approach. 118 | 119 | .. _pull request: https://github.com/staticdev/irpf-cei/pulls 120 | .. github-only 121 | .. _Code of Conduct: CODE_OF_CONDUCT.rst 122 | -------------------------------------------------------------------------------- /LICENSE.rst: -------------------------------------------------------------------------------- 1 | MIT License 2 | =========== 3 | 4 | Copyright © 2021 staticdev 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | **The software is provided "as is", without warranty of any kind, express or 17 | implied, including but not limited to the warranties of merchantability, 18 | fitness for a particular purpose and noninfringement. In no event shall the 19 | authors or copyright holders be liable for any claim, damages or other 20 | liability, whether in an action of contract, tort or otherwise, arising from, 21 | out of or in connection with the software or the use or other dealings in the 22 | software.** 23 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | IRPF CEI 2 | ======== 3 | 4 | **NOTA: este programa foi completamente substituído pelo** `IRPF Investidor`_ **e não será mais atualizado.** 5 | 6 | .. _IRPF Investidor: https://github.com/staticdev/irpf-investidor/ 7 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | comment: false 2 | coverage: 3 | status: 4 | project: 5 | default: 6 | target: "100" 7 | patch: 8 | default: 9 | target: "100" 10 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | """Sphinx configuration.""" 2 | from datetime import datetime 3 | 4 | 5 | project = "IRPF CEI" 6 | author = "staticdev" 7 | copyright = f"{datetime.now().year}, {author}" 8 | extensions = ["sphinx.ext.autodoc", "sphinx.ext.napoleon"] 9 | autodoc_typehints = "description" 10 | html_theme = "furo" 11 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../README.rst 2 | 3 | .. toctree:: 4 | :hidden: 5 | :maxdepth: 1 6 | 7 | License 8 | Changelog 9 | -------------------------------------------------------------------------------- /docs/license.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../LICENSE.rst 2 | -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | furo==2021.11.23 2 | sphinx==4.3.2 3 | -------------------------------------------------------------------------------- /mypy.ini: -------------------------------------------------------------------------------- 1 | [mypy] 2 | strict = True 3 | pretty = True 4 | show_column_numbers = True 5 | show_error_codes = True 6 | show_error_context = True 7 | 8 | [mypy-inquirer] 9 | ignore_missing_imports = True 10 | 11 | [mypy-pandas.*] 12 | ignore_missing_imports = True 13 | 14 | [mypy-pytest_mock] 15 | ignore_missing_imports = True 16 | 17 | [mypy-xlrd] 18 | ignore_missing_imports = True 19 | -------------------------------------------------------------------------------- /noxfile.py: -------------------------------------------------------------------------------- 1 | """Nox sessions.""" 2 | import shutil 3 | import sys 4 | from pathlib import Path 5 | from textwrap import dedent 6 | 7 | import nox 8 | 9 | try: 10 | from nox_poetry import Session 11 | from nox_poetry import session 12 | except ImportError: 13 | message = f"""\ 14 | Nox failed to import the 'nox-poetry' package. 15 | Please install it using the following command: 16 | {sys.executable} -m pip install nox-poetry""" 17 | raise SystemExit(dedent(message)) from None 18 | 19 | 20 | package = "irpf_cei" 21 | python_versions = ["3.10", "3.9", "3.8"] 22 | nox.options.sessions = ( 23 | "pre-commit", 24 | "safety", 25 | "mypy", 26 | "tests", 27 | "typeguard", 28 | "docs-build", 29 | ) 30 | 31 | 32 | def activate_virtualenv_in_precommit_hooks(session: Session) -> None: 33 | """Activate virtualenv in hooks installed by pre-commit. 34 | 35 | This function patches git hooks installed by pre-commit to activate the 36 | session's virtual environment. This allows pre-commit to locate hooks in 37 | that environment when invoked from git. 38 | 39 | Args: 40 | session: The Session object. 41 | """ 42 | if session.bin is None: 43 | return 44 | 45 | virtualenv = session.env.get("VIRTUAL_ENV") 46 | if virtualenv is None: 47 | return 48 | 49 | hookdir = Path(".git") / "hooks" 50 | if not hookdir.is_dir(): 51 | return 52 | 53 | for hook in hookdir.iterdir(): 54 | if hook.name.endswith(".sample") or not hook.is_file(): 55 | continue 56 | 57 | text = hook.read_text() 58 | bindir = repr(session.bin)[1:-1] # strip quotes 59 | if not ( 60 | Path("A") == Path("a") and bindir.lower() in text.lower() or bindir in text 61 | ): 62 | continue 63 | 64 | lines = text.splitlines() 65 | if not (lines[0].startswith("#!") and "python" in lines[0].lower()): 66 | continue 67 | 68 | header = dedent( 69 | f"""\ 70 | import os 71 | os.environ["VIRTUAL_ENV"] = {virtualenv!r} 72 | os.environ["PATH"] = os.pathsep.join(( 73 | {session.bin!r}, 74 | os.environ.get("PATH", ""), 75 | )) 76 | """ 77 | ) 78 | 79 | lines.insert(1, header) 80 | hook.write_text("\n".join(lines)) 81 | 82 | 83 | @session(name="pre-commit", python="3.10") 84 | def precommit(session: Session) -> None: 85 | """Lint using pre-commit.""" 86 | args = session.posargs or ["run", "--all-files", "--show-diff-on-failure"] 87 | session.install( 88 | "black", 89 | "darglint", 90 | "flake8", 91 | "flake8-bandit", 92 | "flake8-bugbear", 93 | "flake8-docstrings", 94 | "flake8-rst-docstrings", 95 | "pep8-naming", 96 | "pre-commit", 97 | "pre-commit-hooks", 98 | "pyupgrade", 99 | "reorder-python-imports", 100 | ) 101 | session.run("pre-commit", *args) 102 | if args and args[0] == "install": 103 | activate_virtualenv_in_precommit_hooks(session) 104 | 105 | 106 | @session(python="3.10") 107 | def safety(session: Session) -> None: 108 | """Scan dependencies for insecure packages.""" 109 | requirements = session.poetry.export_requirements() 110 | session.install("safety") 111 | session.run("safety", "check", "--full-report", f"--file={requirements}") 112 | 113 | 114 | @session(python=python_versions) 115 | def mypy(session: Session) -> None: 116 | """Type-check using mypy.""" 117 | args = session.posargs or ["src", "tests", "docs/conf.py"] 118 | session.install(".") 119 | session.install("mypy", "pytest") 120 | session.run("mypy", *args) 121 | if not session.posargs: 122 | session.run("mypy", f"--python-executable={sys.executable}", "noxfile.py") 123 | 124 | 125 | @session(python=python_versions) 126 | def tests(session: Session) -> None: 127 | """Run the test suite.""" 128 | session.install(".") 129 | session.install("coverage[toml]", "pygments", "pytest", "pytest-mock", "pyfakefs") 130 | try: 131 | session.run("coverage", "run", "--parallel", "-m", "pytest", *session.posargs) 132 | finally: 133 | if session.interactive: 134 | session.notify("coverage") 135 | 136 | 137 | @session 138 | def coverage(session: Session) -> None: 139 | """Produce the coverage report.""" 140 | # Do not use session.posargs unless this is the only session. 141 | nsessions = len(session._runner.manifest) 142 | has_args = session.posargs and nsessions == 1 143 | args = session.posargs if has_args else ["report"] 144 | 145 | session.install("coverage[toml]") 146 | 147 | if not has_args and any(Path().glob(".coverage.*")): 148 | session.run("coverage", "combine") 149 | 150 | session.run("coverage", *args) 151 | 152 | 153 | @session(python=python_versions) 154 | def typeguard(session: Session) -> None: 155 | """Runtime type checking using Typeguard.""" 156 | session.install(".") 157 | session.install("pygments", "pytest", "typeguard", "pytest-mock", "pyfakefs") 158 | session.run("pytest", f"--typeguard-packages={package}", *session.posargs) 159 | 160 | 161 | @session(python=python_versions) 162 | def xdoctest(session: Session) -> None: 163 | """Run examples with xdoctest.""" 164 | args = session.posargs or ["all"] 165 | session.install(".") 166 | session.install("xdoctest[colors]") 167 | session.run("python", "-m", "xdoctest", package, *args) 168 | 169 | 170 | @session(name="docs-build", python="3.10") 171 | def docs_build(session: Session) -> None: 172 | """Build the documentation.""" 173 | args = session.posargs or [ 174 | "-b", 175 | "linkcheck", 176 | "-W", 177 | "--keep-going", 178 | "docs", 179 | "docs/_build", 180 | ] 181 | session.install(".") 182 | session.install("sphinx", "furo") 183 | 184 | build_dir = Path("docs", "_build") 185 | if build_dir.exists(): 186 | shutil.rmtree(build_dir) 187 | 188 | session.run("sphinx-build", *args) 189 | 190 | 191 | @session(python="3.10") 192 | def docs(session: Session) -> None: 193 | """Build and serve the documentation with live reloading on file changes.""" 194 | args = session.posargs or ["--open-browser", "docs", "docs/_build"] 195 | session.install(".") 196 | session.install("sphinx", "sphinx-autobuild", "furo") 197 | 198 | build_dir = Path("docs", "_build") 199 | if build_dir.exists(): 200 | shutil.rmtree(build_dir) 201 | 202 | session.run("sphinx-autobuild", *args) 203 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "irpf-cei" 3 | version = "3.5.2" 4 | description = "Programa auxiliar gratuito para calcular custos de ações, ETFs e fundos imobiliários." 5 | authors = ["staticdev "] 6 | license = "MIT" 7 | readme = "README.rst" 8 | repository = "https://github.com/staticdev/irpf-cei" 9 | homepage = "https://github.com/staticdev/irpf-cei" 10 | documentation = "https://irpf-cei.readthedocs.io" 11 | classifiers = [ 12 | "Programming Language :: Python :: 3.8", 13 | "Programming Language :: Python :: 3.9", 14 | "Programming Language :: Python :: 3.10", 15 | ] 16 | 17 | [tool.poetry.urls] 18 | Changelog = "https://github.com/staticdev/irpf-cei/releases" 19 | 20 | [tool.poetry.dependencies] 21 | python = "^3.8" 22 | pandas = "^1.3.0" 23 | click = ">=7.1.1,<9.0.0" 24 | xlrd = ">=1.2,<3.0" 25 | inquirer = "^2.8.0" 26 | 27 | [tool.poetry.dev-dependencies] 28 | black = "^21.12b0" 29 | flake8 = "^4.0.1" 30 | flake8-bandit = "^2.1.2" 31 | flake8-bugbear = "^21.11.29" 32 | safety = "^1.10.0" 33 | pytest = "^6.2.5" 34 | mypy = "^0.930" 35 | pytest-mock = "^3.6.1" 36 | pyfakefs = "^4.5.3" 37 | typeguard = "^2.13.3" 38 | reorder-python-imports = "^2.5.0" 39 | pre-commit = "^2.16.0" 40 | pygments = "^2.11.1" 41 | xdoctest = "^0.15.10" 42 | sphinx = "^4.3.2" 43 | sphinx-autobuild = "^2021.3.14" 44 | darglint = "^1.8.1" 45 | flake8-docstrings = "^1.6.0" 46 | flake8-rst-docstrings = "^0.2.5" 47 | pep8-naming = "^0.12.1" 48 | pre-commit-hooks = "^4.1.0" 49 | nox-poetry = "0.9.0" 50 | coverage = {version = "6.2", extras = ["toml"]} 51 | pyupgrade = "^2.30.1" 52 | furo = ">=2021.11.12" 53 | 54 | [tool.poetry.scripts] 55 | irpf-cei = "irpf_cei.__main__:main" 56 | 57 | [tool.coverage.paths] 58 | source = ["src", "*/site-packages"] 59 | tests = ["tests", "*/tests"] 60 | 61 | [tool.coverage.run] 62 | branch = true 63 | source = ["irpf_cei", "tests"] 64 | 65 | [tool.coverage.report] 66 | show_missing = true 67 | fail_under = 100 68 | 69 | [build-system] 70 | requires = ["poetry-core>=1.0.0"] 71 | build-backend = "poetry.core.masonry.api" 72 | -------------------------------------------------------------------------------- /resources/corretoras.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "CodB3": "39", 4 | "Nome": "AGORA CTVM S/A", 5 | "Cnpj": "74.014.747/0001-35" 6 | }, 7 | { 8 | "CodB3": "4", 9 | "Nome": "ALFA CCVM S.A.", 10 | "Cnpj": "62.178.421/0001-64" 11 | }, 12 | { 13 | "CodB3": "226", 14 | "Nome": "AMARIL FRANKLIN CTV LTDA.", 15 | "Cnpj": "17.312.661/0001-55" 16 | }, 17 | { 18 | "CodB3": "147", 19 | "Nome": "ATIVA INVESTIMENTOS S.A. CTCV", 20 | "Cnpj": "33.775.974/0001-04" 21 | }, 22 | { 23 | "CodB3": "1982", 24 | "Nome": "MODAL DTVM LTDA", 25 | "Cnpj": "30.723.886/0001-62" 26 | }, 27 | { 28 | "CodB3": "172", 29 | "Nome": "BANRISUL S/A CVMC", 30 | "Cnpj": "93.026.847/0001-26" 31 | }, 32 | { 33 | "CodB3": "72", 34 | "Nome": "BRADESCO S/A CTVM", 35 | "Cnpj": "61.855.045/0001-32" 36 | }, 37 | { 38 | "CodB3": "120", 39 | "Nome": "BRASIL PLURAL CCTVM S/A", 40 | "Cnpj": "05.816.451/0001-15" 41 | }, 42 | { 43 | "CodB3": "85", 44 | "Nome": "BTG PACTUAL CTVM S.A.", 45 | "Cnpj": "43.815.158/0001-22" 46 | }, 47 | { 48 | "CodB3": "308", 49 | "Nome": "CLEAR CORRETORA - GRUPO XP", 50 | "Cnpj": "02.332.886/0011-78" 51 | }, 52 | { 53 | "CodB3": "88", 54 | "Nome": "CM CAPITAL MARKETS CCTVM LTDA", 55 | "Cnpj": "02.685.483/0001-30" 56 | }, 57 | { 58 | "CodB3": "234", 59 | "Nome": "CODEPE CV E CAMBIO S/A", 60 | "Cnpj": "09.512.542/0001-18" 61 | }, 62 | { 63 | "CodB3": "74", 64 | "Nome": "COINVALORES CCVM LTDA.", 65 | "Cnpj": "00.336.036/0001-40" 66 | }, 67 | { 68 | "CodB3": "45", 69 | "Nome": "CREDIT SUISSE BRASIL S.A. CTVM", 70 | "Cnpj": "42.584.318/0001-07" 71 | }, 72 | { 73 | "CodB3": "90", 74 | "Nome": "EASYNVEST - TITULO CV S.A.", 75 | "Cnpj": "62.169.875/0001-79" 76 | }, 77 | { 78 | "CodB3": "174", 79 | "Nome": "ELITE CCVM LTDA.", 80 | "Cnpj": "28.048.783/0001-00" 81 | }, 82 | { 83 | "CodB3": "131", 84 | "Nome": "FATOR S.A. CV", 85 | "Cnpj": "63.062.749/0001-83" 86 | }, 87 | { 88 | "CodB3": "173", 89 | "Nome": "GENIAL INVESTIMENTOS CVM S.A.", 90 | "Cnpj": "27.652.684/0001-62" 91 | }, 92 | { 93 | "CodB3": "186", 94 | "Nome": "CORRETORA GERAL DE VC LTDA", 95 | "Cnpj": "92.858.380/0001-18" 96 | }, 97 | { 98 | "CodB3": "15", 99 | "Nome": "GUIDE INVESTIMENTOS S.A. CV", 100 | "Cnpj": "65.913.436/0001-17" 101 | }, 102 | { 103 | "CodB3": "115", 104 | "Nome": "H.COMMCOR DTVM LTDA", 105 | "Cnpj": "01.788.147/0001-50" 106 | }, 107 | { 108 | "CodB3": "54", 109 | "Nome": "HAITONG SECURITIES", 110 | "Cnpj": "33.894.445/0001-11" 111 | }, 112 | { 113 | "CodB3": "735", 114 | "Nome": "ICAP DO BRASIL CTVM LTDA", 115 | "Cnpj": "09.105.360/0001-22" 116 | }, 117 | { 118 | "CodB3": "1099", 119 | "Nome": "INTER DTVM LTDA", 120 | "Cnpj": "18.945.670/0001-46" 121 | }, 122 | { 123 | "CodB3": "114", 124 | "Nome": "ITAU CV S/A", 125 | "Cnpj": "61.194.353/0001-64" 126 | }, 127 | { 128 | "CodB3": "16", 129 | "Nome": "J. P. MORGAN CCVM S.A.", 130 | "Cnpj": "32.588.139/0001-94" 131 | }, 132 | { 133 | "CodB3": "106", 134 | "Nome": "MERC. DO BRASIL COR. S.A. CTVM", 135 | "Cnpj": "16.683.062/0001-85" 136 | }, 137 | { 138 | "CodB3": "13", 139 | "Nome": "MERRILL LYNCH S/A CTVM", 140 | "Cnpj": "02.670.590/0001-95" 141 | }, 142 | { 143 | "CodB3": "262", 144 | "Nome": "MIRAE ASSET WEALTH MANAGEMENT", 145 | "Cnpj": "12.392.983/0001-38" 146 | }, 147 | { 148 | "CodB3": "40", 149 | "Nome": "MORGAN STANLEY CTVM S/A", 150 | "Cnpj": "04.323.351/0001-94" 151 | }, 152 | { 153 | "CodB3": "23", 154 | "Nome": "NECTON INVESTIMENTOS S.A. CVMC", 155 | "Cnpj": "52.904.364/0001-08" 156 | }, 157 | { 158 | "CodB3": "93", 159 | "Nome": "NOVA FUTURA CTVM LTDA", 160 | "Cnpj": "04.257.795/0001-79" 161 | }, 162 | { 163 | "CodB3": "63", 164 | "Nome": "NOVINVEST CVM LTDA.", 165 | "Cnpj": "43.060.029/0001-71" 166 | }, 167 | { 168 | "CodB3": "129", 169 | "Nome": "PLANNER CV S.A", 170 | "Cnpj": "00.806.535/0001-54" 171 | }, 172 | { 173 | "CodB3": "386", 174 | "Nome": "RICO INVESTIMENTOS - GRUPO XP", 175 | "Cnpj": "02.332.886/0016-82" 176 | }, 177 | { 178 | "CodB3": "3762", 179 | "Nome": "RJI CTVM LTDA", 180 | "Cnpj": "42.066.258/0001-30" 181 | }, 182 | { 183 | "CodB3": "59", 184 | "Nome": "SAFRA CVC LTDA.", 185 | "Cnpj": "60.783.503/0001-02" 186 | }, 187 | { 188 | "CodB3": "27", 189 | "Nome": "SANTANDER CCVM S/A", 190 | "Cnpj": "51.014.223/0001-49" 191 | }, 192 | { 193 | "CodB3": "187", 194 | "Nome": "SITA SCCVM S.A.", 195 | "Cnpj": "17.315.359/0001-50" 196 | }, 197 | { 198 | "CodB3": "58", 199 | "Nome": "SOCOPA SC PAULISTA S.A.", 200 | "Cnpj": "62.285.390/0001-40" 201 | }, 202 | { 203 | "CodB3": "177", 204 | "Nome": "SOLIDUS S/A CCVM", 205 | "Cnpj": "68.757.681/0001-70" 206 | }, 207 | { 208 | "CodB3": "10", 209 | "Nome": "SPINELLI S.A. CVMC", 210 | "Cnpj": "61.739.629/0001-42" 211 | }, 212 | { 213 | "CodB3": "107", 214 | "Nome": "TERRA INVESTIMENTOS DTVM LTDA", 215 | "Cnpj": "03.751.794/0001-13" 216 | }, 217 | { 218 | "CodB3": "4090", 219 | "Nome": "TORO CTVM LTDA.", 220 | "Cnpj": "29.162.769/0001-98" 221 | }, 222 | { 223 | "CodB3": "37", 224 | "Nome": "UM INVESTIMENTOS S.A. CTVM", 225 | "Cnpj": "33.968.066/0001-29" 226 | }, 227 | { 228 | "CodB3": "29", 229 | "Nome": "UNILETRA CCTVM S.A.", 230 | "Cnpj": "28.156.214/0001-70" 231 | }, 232 | { 233 | "CodB3": "21", 234 | "Nome": "VOTORANTIM ASSET MANAG. DTVM", 235 | "Cnpj": "03.384.738/0001-98" 236 | }, 237 | { 238 | "CodB3": "3", 239 | "Nome": "XP INVESTIMENTOS CCTVM S/A", 240 | "Cnpj": "02.332.886/0001-04" 241 | } 242 | ] 243 | -------------------------------------------------------------------------------- /resources/empresas.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "codigo": "AALR3", 4 | "empresa": "CENTRO DE IMAGEM DIAGNOSTICOS", 5 | "cnpj": "42.771.949/0001-35" 6 | }, 7 | { 8 | "codigo": "ABCB4", 9 | "empresa": "BANCO ABC BRASIL", 10 | "cnpj": "28.195.667/0001-06" 11 | }, 12 | { 13 | "codigo": "ABEV3", 14 | "empresa": "AMBEV", 15 | "cnpj": "07.526.557/0001-00" 16 | }, 17 | { 18 | "codigo": "ADHM3", 19 | "empresa": "ADVANCED DIGITAL HEALTH MEDICINA PREVENTIVA", 20 | "cnpj": "10.345.009/0001-98" 21 | }, 22 | { 23 | "codigo": "AGRO3", 24 | "empresa": "BRASILAGRO", 25 | "cnpj": "07.628.528/0001-59" 26 | }, 27 | { 28 | "codigo": "ALPA3-ALPA4", 29 | "empresa": "ALPARGATAS", 30 | "cnpj": "61.079.117/0001-05" 31 | }, 32 | { 33 | "codigo": "ALSC3", 34 | "empresa": "ALIANSCE SHOPPING CENTERS", 35 | "cnpj": "06.082.980/0001-03" 36 | }, 37 | { 38 | "codigo": "ALUP11-ALUP3-ALUP4", 39 | "empresa": "ALUPAR INVESTIMENTO", 40 | "cnpj": "08.364.948/0001-38" 41 | }, 42 | { 43 | "codigo": "AMAR3", 44 | "empresa": "LOJAS MARISA", 45 | "cnpj": "61.189.288/0001-89" 46 | }, 47 | { 48 | "codigo": "ANIM3", 49 | "empresa": "ANIMA HOLDING", 50 | "cnpj": "09.288.252/0001-32" 51 | }, 52 | { 53 | "codigo": "ARZZ3", 54 | "empresa": "AREZZO INDÚSTRIA E COMÉRCIO", 55 | "cnpj": "16.590.234/0001-76" 56 | }, 57 | { 58 | "codigo": "ATOM3", 59 | "empresa": "ATOM", 60 | "cnpj": "00.359.742/0001-08" 61 | }, 62 | { 63 | "codigo": "AZUL4", 64 | "empresa": "AZUL", 65 | "cnpj": "09.305.994/0001-29" 66 | }, 67 | { 68 | "codigo": "B3SA3", 69 | "empresa": "B3 – BRASIL – BOLSA – BALCÃO", 70 | "cnpj": "09.346.601/0001-25" 71 | }, 72 | { 73 | "codigo": "BAUH3-BAUH4", 74 | "empresa": "EXCELSIOR ALIMENTOS", 75 | "cnpj": "95.426.862/0001-97" 76 | }, 77 | { 78 | "codigo": "BBAS3", 79 | "empresa": "BANCO DO BRASIL", 80 | "cnpj": "00.000.000/0001-91" 81 | }, 82 | { 83 | "codigo": "BBDC3-BBDC4", 84 | "empresa": "BANCO BRADESCO", 85 | "cnpj": "60.746.948/0001-12" 86 | }, 87 | { 88 | "codigo": "BBRK3", 89 | "empresa": "BRASIL BROKERS", 90 | "cnpj": "08.613.550/0001-98" 91 | }, 92 | { 93 | "codigo": "BBSE3", 94 | "empresa": "BB SEGURIDADE", 95 | "cnpj": "17.344.597/0001-94" 96 | }, 97 | { 98 | "codigo": "BEEF3", 99 | "empresa": "MINERVA", 100 | "cnpj": "67.620.377/0001-14" 101 | }, 102 | { 103 | "codigo": "BIDI4-BIDI11", 104 | "empresa": "BANCO INTER", 105 | "cnpj": "18.945.670/0001-46" 106 | }, 107 | { 108 | "codigo": "BOBR3-BOBR4", 109 | "empresa": "BOMBRIL", 110 | "cnpj": "50.564.053/0001-03" 111 | }, 112 | { 113 | "codigo": "BPAC11-BPAC3-BPAC5", 114 | "empresa": "BANCO BTG PACTUAL", 115 | "cnpj": "30.306.294/0001-45" 116 | }, 117 | { 118 | "codigo": "BPAN4", 119 | "empresa": "BANCO PAN", 120 | "cnpj": "59.285.411/0001-13" 121 | }, 122 | { 123 | "codigo": "BPHA3", 124 | "empresa": "BRASIL PHARMA", 125 | "cnpj": "11.395.624/0001-71" 126 | }, 127 | { 128 | "codigo": "BRAP3-BRAP4", 129 | "empresa": "BRADESPAR", 130 | "cnpj": "03.847.461/0001-92" 131 | }, 132 | { 133 | "codigo": "BRDT3", 134 | "empresa": "PETROBRAS DISTRIBUIDORA", 135 | "cnpj": "34.274.233/0001-02" 136 | }, 137 | { 138 | "codigo": "BRFS3", 139 | "empresa": "BRF", 140 | "cnpj": "01.838.723/0001-27" 141 | }, 142 | { 143 | "codigo": "BRIN3", 144 | "empresa": "BR INSURANCE CORRETORA DE SEGUROS", 145 | "cnpj": "11.721.921/0001-60" 146 | }, 147 | { 148 | "codigo": "BRKM3-BRKM5-BRKM6", 149 | "empresa": "BRASKEM", 150 | "cnpj": "42.150.391/0001-70" 151 | }, 152 | { 153 | "codigo": "BRML3", 154 | "empresa": "BR MALLS PARTICIPACOES", 155 | "cnpj": "06.977.745/0001-91" 156 | }, 157 | { 158 | "codigo": "BRPR3", 159 | "empresa": "BR PROPERTIES", 160 | "cnpj": "06.977.751/0001-49" 161 | }, 162 | { 163 | "codigo": "BMGB4", 164 | "empresa": "BANCO BMG", 165 | "cnpj": "61.186.680/0001-74" 166 | }, 167 | { 168 | "codigo": "BRSR3-BRSR5-BRSR6 ", 169 | "empresa": "BANRISUL", 170 | "cnpj": "92.702.067/0001-96" 171 | }, 172 | { 173 | "codigo": "BSEV3", 174 | "empresa": "BIOSEV", 175 | "cnpj": "15.527.906/0001-36" 176 | }, 177 | { 178 | "codigo": "BTOW3", 179 | "empresa": "B2W – COMPANHIA DIGITAL", 180 | "cnpj": "00.776.574/0001-56" 181 | }, 182 | { 183 | "codigo": "CAML3", 184 | "empresa": "CAMIL ALIMENTOS", 185 | "cnpj": "64.904.295/0001-03" 186 | }, 187 | { 188 | "codigo": "CARD3", 189 | "empresa": "CSU CARDSYSTEM", 190 | "cnpj": "01.896.779/0001-38" 191 | }, 192 | { 193 | "codigo": "CCRO3", 194 | "empresa": "CCR", 195 | "cnpj": "02.846.056/0001-97" 196 | }, 197 | { 198 | "codigo": "CCXC3", 199 | "empresa": "CCX CARVÃO DA COLÔMBIA", 200 | "cnpj": "07.950.674/0001-04" 201 | }, 202 | { 203 | "codigo": "CEPE3-CEPE5-CEPE6", 204 | "empresa": "CIA ENERGETICA DE PERNAMBUCO – CELPE", 205 | "cnpj": "10.835.932/0001-08" 206 | }, 207 | { 208 | "codigo": "CESP3-CESP5-CESP6", 209 | "empresa": "CIA ENERGETICA DE SAO PAULO – CESP", 210 | "cnpj": "60.933.603/0001-78" 211 | }, 212 | { 213 | "codigo": "CGAS3-CGAS5", 214 | "empresa": "CIA GAS DE SAO PAULO – COMGAS", 215 | "cnpj": "61.856.571/0001-17" 216 | }, 217 | { 218 | "codigo": "CGRA3-CGRA4", 219 | "empresa": "GRAZZIOTIN", 220 | "cnpj": "92.012.467/0001-70" 221 | }, 222 | { 223 | "codigo": "CIEL3", 224 | "empresa": "CIELO", 225 | "cnpj": "01.027.058/0001-91" 226 | }, 227 | { 228 | "codigo": "CMIG3-CMIG4", 229 | "empresa": "CIA ENERGETICA DE MINAS GERAIS – CEMIG", 230 | "cnpj": "17.155.730/0001-64" 231 | }, 232 | { 233 | "codigo": "CNTO3", 234 | "empresa": "CENTAURO", 235 | "cnpj": "13.217.485/0001-11" 236 | }, 237 | { 238 | "codigo": "COCE3-COCE5-COCE6", 239 | "empresa": "CIA ENERGETICA DO CEARA – COELCE", 240 | "cnpj": "07.047.251/0001-70" 241 | }, 242 | { 243 | "codigo": "CPFE3", 244 | "empresa": "CPFL ENERGIA", 245 | "cnpj": "02.429.144/0001-93" 246 | }, 247 | { 248 | "codigo": "CREM3", 249 | "empresa": "CREMER", 250 | "cnpj": "82.641.325/0001-18" 251 | }, 252 | { 253 | "codigo": "CRFB3", 254 | "empresa": "ATACADÃO", 255 | "cnpj": "75.315.333/0001-09" 256 | }, 257 | { 258 | "codigo": "CSAN3", 259 | "empresa": "COSAN", 260 | "cnpj": "50.746.577/0001-15" 261 | }, 262 | { 263 | "codigo": "CSMG3", 264 | "empresa": "CIA SANEAMENTO DE MINAS GERAIS – COPASA", 265 | "cnpj": "17.281.106/0001-03" 266 | }, 267 | { 268 | "codigo": "CSNA3", 269 | "empresa": "CIA SIDERURGICA NACIONAL", 270 | "cnpj": "33.042.730/0001-04" 271 | }, 272 | { 273 | "codigo": "CEAB3", 274 | "empresa": "C&A MODAS", 275 | "cnpj": "45.242.914/0001-05" 276 | }, 277 | { 278 | "codigo": "CTKA3-CTKA4", 279 | "empresa": "KARSTEN", 280 | "cnpj": "82.640.558/0001-04" 281 | }, 282 | { 283 | "codigo": "CTNM3-CTNM4", 284 | "empresa": "CIA TECIDOS NORTE DE MINAS COTEMINAS", 285 | "cnpj": "22.677.520/0001-76" 286 | }, 287 | { 288 | "codigo": "CVCB3", 289 | "empresa": "CVC BRASIL OPERADORA E AGÊNCIA DE VIAGENS", 290 | "cnpj": "10.760.260/0001-19" 291 | }, 292 | { 293 | "codigo": "CYRE3", 294 | "empresa": "CYRELA BRAZIL REALTYEMPREEND E PART", 295 | "cnpj": "73.178.600/0001-18" 296 | }, 297 | { 298 | "codigo": "DAGB33", 299 | "empresa": "DUFRY A.G.", 300 | "cnpj": "11.423.623/0001-93" 301 | }, 302 | { 303 | "codigo": "DIRR3", 304 | "empresa": "DIRECIONAL ENGENHARIA", 305 | "cnpj": "16.614.075/0001-00" 306 | }, 307 | { 308 | "codigo": "DMMO3", 309 | "empresa": "DOMMO", 310 | "cnpj": "08.926.302/0001-05" 311 | }, 312 | { 313 | "codigo": "DTEX3", 314 | "empresa": "DURATEX", 315 | "cnpj": "97.837.181/0001-47" 316 | }, 317 | { 318 | "codigo": "ECOR3", 319 | "empresa": "ECORODOVIAS INFRAESTRUTURA E LOGÍSTICA", 320 | "cnpj": "04.149.454/0001-80" 321 | }, 322 | { 323 | "codigo": "EGIE3", 324 | "empresa": "ENGIE BRASIL ENERGIA", 325 | "cnpj": "02.474.103/0001-19" 326 | }, 327 | { 328 | "codigo": "ELEK3-ELEK4", 329 | "empresa": "ELEKEIROZ", 330 | "cnpj": "13.788.120/0001-47" 331 | }, 332 | { 333 | "codigo": "ELPL3", 334 | "empresa": "ELETROPAULO", 335 | "cnpj": "61.695.227/0001-93" 336 | }, 337 | { 338 | "codigo": "ELET3-ELET6", 339 | "empresa": "ELETROBRAS", 340 | "cnpj": "00.001.180/0001-26" 341 | }, 342 | { 343 | "codigo": "EMBR3", 344 | "empresa": "EMBRAER", 345 | "cnpj": "07.689.002/0001-89" 346 | }, 347 | { 348 | "codigo": "ENBR3", 349 | "empresa": "EDP – ENERGIAS DO BRASIL", 350 | "cnpj": "03.983.431/0001-03" 351 | }, 352 | { 353 | "codigo": "ENEV3", 354 | "empresa": "ENEVA", 355 | "cnpj": "04.423.567/0001-21" 356 | }, 357 | { 358 | "codigo": "ENGI11-ENGI3-ENGI4", 359 | "empresa": "ENERGISA", 360 | "cnpj": "00.864.214/0001-06" 361 | }, 362 | { 363 | "codigo": "EQTL3", 364 | "empresa": "EQUATORIAL ENERGIA", 365 | "cnpj": "03.220.438/0001-73" 366 | }, 367 | { 368 | "codigo": "YDUQ3", 369 | "empresa": "YDUQS", 370 | "cnpj": "08.807.432/0001-10" 371 | }, 372 | { 373 | "codigo": "ESTR3-ESTR4", 374 | "empresa": "MANUFATURA DE BRINQUEDOS ESTRELA", 375 | "cnpj": "61.082.004/0001-50" 376 | }, 377 | { 378 | "codigo": "ETER3", 379 | "empresa": "ETERNIT", 380 | "cnpj": "61.092.037/0001-81" 381 | }, 382 | { 383 | "codigo": "EUCA3-EUCA4", 384 | "empresa": "EUCATEX", 385 | "cnpj": "56.643.018/0001-66" 386 | }, 387 | { 388 | "codigo": "EVEN3", 389 | "empresa": "EVEN CONSTRUTORA E INCORPORADORA", 390 | "cnpj": "43.470.988/0001-65" 391 | }, 392 | { 393 | "codigo": "EZTC3", 394 | "empresa": "EZ TEC", 395 | "cnpj": "08.312.229/0001-73" 396 | }, 397 | { 398 | "codigo": "FESA3-FESA4", 399 | "empresa": "CIA FERRO LIGAS DA BAHIA – FERBASA", 400 | "cnpj": "15.141.799/0001-03" 401 | }, 402 | { 403 | "codigo": "FHER3", 404 | "empresa": "FERTILIZANTES HERINGER", 405 | "cnpj": "22.266.175/0001-88" 406 | }, 407 | { 408 | "codigo": "TASA3-TASA4-FJTA3-FJTA4", 409 | "empresa": "TAURUS ARMAS", 410 | "cnpj": "92.781.335/0001-02" 411 | }, 412 | { 413 | "codigo": "FLRY3", 414 | "empresa": "FLEURY", 415 | "cnpj": "60.840.055/0001-31" 416 | }, 417 | { 418 | "codigo": "FRAS3", 419 | "empresa": "FRAS-LE", 420 | "cnpj": "88.610.126/0001-29" 421 | }, 422 | { 423 | "codigo": "GNDI3", 424 | "empresa": "NOTRE DAME INTERMÉDICA", 425 | "cnpj": "19.853.511/0001-84" 426 | }, 427 | { 428 | "codigo": "HAPV3", 429 | "empresa": "HAPVIDA", 430 | "cnpj": "63.554.067/0001-98" 431 | }, 432 | { 433 | "codigo": "FRIO3", 434 | "empresa": "METALFRIO SOLUTIONS", 435 | "cnpj": "04.821.041/0001-08" 436 | }, 437 | { 438 | "codigo": "GEPA3-GEPA4", 439 | "empresa": "RIO PARANAPANEMA ENERGIA", 440 | "cnpj": "02.998.301/0001-81" 441 | }, 442 | { 443 | "codigo": "GFSA3", 444 | "empresa": "GAFISA", 445 | "cnpj": "01.545.826/0001-07" 446 | }, 447 | { 448 | "codigo": "GGBR3-GGBR4", 449 | "empresa": "GERDAU", 450 | "cnpj": "33.611.500/0001-19" 451 | }, 452 | { 453 | "codigo": "GOAU3-GOAU4", 454 | "empresa": "METALURGICA GERDAU", 455 | "cnpj": "92.690.783/0001-09" 456 | }, 457 | { 458 | "codigo": "GOLL4", 459 | "empresa": "GOL LINHAS AEREAS INTELIGENTES", 460 | "cnpj": "06.164.253/0001-87" 461 | }, 462 | { 463 | "codigo": "GRND3", 464 | "empresa": "GRENDENE", 465 | "cnpj": "89.850.341/0001-60" 466 | }, 467 | { 468 | "codigo": "GSHP3", 469 | "empresa": "GENERAL SHOPPING BRASIL", 470 | "cnpj": "08.764.621/0001-53" 471 | }, 472 | { 473 | "codigo": "GUAR3-GUAR4", 474 | "empresa": "GUARARAPES CONFECCOES", 475 | "cnpj": "08.402.943/0001-52" 476 | }, 477 | { 478 | "codigo": "HBOR3", 479 | "empresa": "HELBOR EMPREENDIMENTOS", 480 | "cnpj": "49.263.189/0001-02" 481 | }, 482 | { 483 | "codigo": "HGTX3", 484 | "empresa": "HERING", 485 | "cnpj": "78.876.950/0001-71" 486 | }, 487 | { 488 | "codigo": "HYPE3", 489 | "empresa": "HYPERMARCAS", 490 | "cnpj": "02.932.074/0001-91" 491 | }, 492 | { 493 | "codigo": "HOOT3-HOOT4", 494 | "empresa": "HOTEIS OTHON", 495 | "cnpj": "33.200.049/0001-47" 496 | }, 497 | { 498 | "codigo": "IDNT3", 499 | "empresa": "IDEIASNET", 500 | "cnpj": "02.365.069/0001-44" 501 | }, 502 | { 503 | "codigo": "IGTA3", 504 | "empresa": "IGUATEMI EMPRESA DE SHOPPING CENTERS", 505 | "cnpj": "51.218.147/0001-93" 506 | }, 507 | { 508 | "codigo": "IRBR3", 509 | "empresa": "IRB – BRASIL RESSEGUROS", 510 | "cnpj": "33.376.989/0001-91" 511 | }, 512 | { 513 | "codigo": "ITSA3-ITSA4", 514 | "empresa": "ITAUSA INVESTIMENTOS", 515 | "cnpj": "61.532.644/0001-15" 516 | }, 517 | { 518 | "codigo": "ITUB3-ITUB4", 519 | "empresa": "ITAU UNIBANCO HOLDING", 520 | "cnpj": "60.872.504/0001-23" 521 | }, 522 | { 523 | "codigo": "JBSS3", 524 | "empresa": "JBS", 525 | "cnpj": "02.916.265/0001-60" 526 | }, 527 | { 528 | "codigo": "JHSF3", 529 | "empresa": "JHSF PARTICIPACOES", 530 | "cnpj": "08.294.224/0001-65" 531 | }, 532 | { 533 | "codigo": "JSLG3", 534 | "empresa": "JSL", 535 | "cnpj": "52.548.435/0001-79" 536 | }, 537 | { 538 | "codigo": "KEPL3", 539 | "empresa": "KEPLER WEBER", 540 | "cnpj": "91.983.056/0001-69" 541 | }, 542 | { 543 | "codigo": "KLBN11-KLBN3-KLBN4", 544 | "empresa": "KLABIN", 545 | "cnpj": "89.637.490/0001-45" 546 | }, 547 | { 548 | "codigo": "COGN3-KROT3", 549 | "empresa": "KROTON EDUCACIONAL S.A.", 550 | "cnpj": "02.800.026/0001-40" 551 | }, 552 | { 553 | "codigo": "LAME3-LAME4", 554 | "empresa": "LOJAS AMERICANAS", 555 | "cnpj": "33.014.556/0001-96" 556 | }, 557 | { 558 | "codigo": "LCAM3", 559 | "empresa": "CIA LOCAÇÃO DAS AMÉRICAS", 560 | "cnpj": "10.215.988/0001-60" 561 | }, 562 | { 563 | "codigo": "LEVE3", 564 | "empresa": "MAHLE-METAL LEVE", 565 | "cnpj": "60.476.884/0001-87" 566 | }, 567 | { 568 | "codigo": "LIGT3", 569 | "empresa": "LIGHT", 570 | "cnpj": "03.378.521/0001-75" 571 | }, 572 | { 573 | "codigo": "LINX3", 574 | "empresa": "LINX", 575 | "cnpj": "06.948.969/0001-75" 576 | }, 577 | { 578 | "codigo": "LLIS3", 579 | "empresa": "RESTOQUE COMÉRCIO E CONFECÇÕES DE ROUPAS", 580 | "cnpj": "49.669.856/0001-43" 581 | }, 582 | { 583 | "codigo": "LIQO3", 584 | "empresa": "LIQ PARTICIPAÇÕES", 585 | "cnpj": "04.032.433/0001-80" 586 | }, 587 | { 588 | "codigo": "LOGG3", 589 | "empresa": "LOG COMMERCIAL PROPERTIES", 590 | "cnpj": "09.041.168/0001-10" 591 | }, 592 | { 593 | "codigo": "LOGN3", 594 | "empresa": "LOG-IN LOGISTICA INTERMODAL", 595 | "cnpj": "42.278.291/0001-24" 596 | }, 597 | { 598 | "codigo": "LPSB3", 599 | "empresa": "LPS BRASIL – CONSULTORIA DE IMOVEIS", 600 | "cnpj": "08.078.847/0001-09" 601 | }, 602 | { 603 | "codigo": "LREN3", 604 | "empresa": "LOJAS RENNER", 605 | "cnpj": "92.754.738/0001-62" 606 | }, 607 | { 608 | "codigo": "LUPA3", 609 | "empresa": "LUPATECH", 610 | "cnpj": "89.463.822/0001-12" 611 | }, 612 | { 613 | "codigo": "MAGG3", 614 | "empresa": "MAGNESITA REFRATARIOS", 615 | "cnpj": "08.684.547/0001-65" 616 | }, 617 | { 618 | "codigo": "MDIA3", 619 | "empresa": "M.DIAS BRANCO IND COM DE ALIMENTOS", 620 | "cnpj": "07.206.816/0001-15" 621 | }, 622 | { 623 | "codigo": "MGLU3", 624 | "empresa": "MAGAZINE LUIZA", 625 | "cnpj": "47.960.950/0001-21" 626 | }, 627 | { 628 | "codigo": "MILS3", 629 | "empresa": "MILLS ESTRUTURAS E SERVIÇOS DE ENGENHARIA", 630 | "cnpj": "27.093.558/0001-15" 631 | }, 632 | { 633 | "codigo": "MMXM3", 634 | "empresa": "MMX MINERACAO E METALICOS", 635 | "cnpj": "02.762.115/0001-49" 636 | }, 637 | { 638 | "codigo": "MNDL3", 639 | "empresa": "MUNDIAL – PRODUTOS DE CONSUMO", 640 | "cnpj": "88.610.191/0001-54" 641 | }, 642 | { 643 | "codigo": "MOVI3", 644 | "empresa": "MOVIDA", 645 | "cnpj": "21.314.559/0001-66" 646 | }, 647 | { 648 | "codigo": "MPLU3", 649 | "empresa": "MULTIPLUS", 650 | "cnpj": "11.094.546/0001-75" 651 | }, 652 | { 653 | "codigo": "MRFG3", 654 | "empresa": "MARFRIG GLOBAL FOODS", 655 | "cnpj": "03.853.896/0001-40" 656 | }, 657 | { 658 | "codigo": "MRVE3", 659 | "empresa": "MRV ENGENHARIA", 660 | "cnpj": "08.343.492/0001-20" 661 | }, 662 | { 663 | "codigo": "MULT3", 664 | "empresa": "MULTIPLAN", 665 | "cnpj": "07.816.890/0001-53" 666 | }, 667 | { 668 | "codigo": "MYPK3", 669 | "empresa": "IOCHPE MAXION", 670 | "cnpj": "61.156.113/0001-75" 671 | }, 672 | { 673 | "codigo": "NAFG3-NAFG4", 674 | "empresa": "NADIR FIGUEIREDO", 675 | "cnpj": "61.067.161/0001-97" 676 | }, 677 | { 678 | "codigo": "NATU3", 679 | "empresa": "NATURA COSMETICOS", 680 | "cnpj": "71.673.990/0001-77" 681 | }, 682 | { 683 | "codigo": "ODPV3", 684 | "empresa": "ODONTOPREV", 685 | "cnpj": "58.119.199/0001-51" 686 | }, 687 | { 688 | "codigo": "OFSA3", 689 | "empresa": "OURO FINO SAUDE ANIMAL", 690 | "cnpj": "20.258.278/0001-70" 691 | }, 692 | { 693 | "codigo": "OIBR3-OIBR4", 694 | "empresa": "OI", 695 | "cnpj": "76.535.764/0001-43" 696 | }, 697 | { 698 | "codigo": "OSXB3", 699 | "empresa": "OSX BRASIL", 700 | "cnpj": "09.112.685/0001-32" 701 | }, 702 | { 703 | "codigo": "PARD3", 704 | "empresa": "INSTITUTO HERMES PARDINI", 705 | "cnpj": "19.378.769/0001-76" 706 | }, 707 | { 708 | "codigo": "PCAR3-PCAR4", 709 | "empresa": "CIA BRASILEIRA DE DISTRIBUICAO", 710 | "cnpj": "47.508.411/0001-56" 711 | }, 712 | { 713 | "codigo": "PDGR3", 714 | "empresa": "PDG REALTY", 715 | "cnpj": "02.950.811/0001-89" 716 | }, 717 | { 718 | "codigo": "PETR3-PETR4", 719 | "empresa": "PETROLEO BRASILEIRO PETROBRAS", 720 | "cnpj": "33.000.167/0001-01" 721 | }, 722 | { 723 | "codigo": "PFRM3", 724 | "empresa": "PROFARMA DISTRIB PROD FARMACEUTICOS", 725 | "cnpj": "45.453.214/0001-51" 726 | }, 727 | { 728 | "codigo": "PINE3-PINE4", 729 | "empresa": "BANCO PINE", 730 | "cnpj": "62.144.175/0001-20" 731 | }, 732 | { 733 | "codigo": "PMAM3", 734 | "empresa": "PARANAPANEMA", 735 | "cnpj": "60.398.369/0004-79" 736 | }, 737 | { 738 | "codigo": "POMO3-POMO4", 739 | "empresa": "MARCOPOLO", 740 | "cnpj": "88.611.835/0001-29" 741 | }, 742 | { 743 | "codigo": "POSI3", 744 | "empresa": "POSITIVO TECNOLOGIA", 745 | "cnpj": "81.243.735/0001-48" 746 | }, 747 | { 748 | "codigo": "PRIO3", 749 | "empresa": "PETRO RIO", 750 | "cnpj": "10.629.105/0001-68" 751 | }, 752 | { 753 | "codigo": "PRML3", 754 | "empresa": "PRUMO LOGÍSTICA", 755 | "cnpj": "08.741.499/0001-08" 756 | }, 757 | { 758 | "codigo": "PSSA3", 759 | "empresa": "PORTO SEGURO", 760 | "cnpj": "02.149.205/0001-69" 761 | }, 762 | { 763 | "codigo": "QGEP3", 764 | "empresa": "QGEP", 765 | "cnpj": "11.669.021/0001-10" 766 | }, 767 | { 768 | "codigo": "QUAL3", 769 | "empresa": "QUALICORP", 770 | "cnpj": "11.992.680/0001-93" 771 | }, 772 | { 773 | "codigo": "RADL3", 774 | "empresa": "RAIA DROGASIL", 775 | "cnpj": "61.585.865/0001-51" 776 | }, 777 | { 778 | "codigo": "RAIL3", 779 | "empresa": "RUMO", 780 | "cnpj": "02.387.241/0001-60" 781 | }, 782 | { 783 | "codigo": "RAPT3-RAPT4", 784 | "empresa": "RANDON IMPLEMENTOS", 785 | "cnpj": "89.086.144/0001-16" 786 | }, 787 | { 788 | "codigo": "RCSL3-RCSL4", 789 | "empresa": "RECRUSUL", 790 | "cnpj": "91.333.666/0001-17" 791 | }, 792 | { 793 | "codigo": "REDE3", 794 | "empresa": "REDE ENERGIA", 795 | "cnpj": "61.584.140/0001-49" 796 | }, 797 | { 798 | "codigo": "RENT3", 799 | "empresa": "LOCALIZA RENT A CAR", 800 | "cnpj": "16.670.085/0001-55" 801 | }, 802 | { 803 | "codigo": "RNEW11-RNEW3-RNEW4", 804 | "empresa": "RENOVA ENERGIA", 805 | "cnpj": "08.534.605/0001-74" 806 | }, 807 | { 808 | "codigo": "ROMI3", 809 | "empresa": "INDUSTRIAS ROMI", 810 | "cnpj": "56.720.428/0001-63" 811 | }, 812 | { 813 | "codigo": "RPMG3", 814 | "empresa": "REFINARIA DE PETROLEOS MANGUINHOS", 815 | "cnpj": "33.412.081/0001-96" 816 | }, 817 | { 818 | "codigo": "RSID3", 819 | "empresa": "ROSSI RESIDENCIAL", 820 | "cnpj": "61.065.751/0001-80" 821 | }, 822 | { 823 | "codigo": "SANB11-SANB3-SANB4", 824 | "empresa": "BANCO SANTANDER", 825 | "cnpj": "90.400.888/0001-42" 826 | }, 827 | { 828 | "codigo": "SAPR11-SAPR3-SAPR4", 829 | "empresa": "CIA SANEAMENTO DO PARANA – SANEPAR", 830 | "cnpj": "76.484.013/0001-45" 831 | }, 832 | { 833 | "codigo": "SBSP3", 834 | "empresa": "CIA SANEAMENTO BASICO SAO PAULO – SABESP", 835 | "cnpj": "43.776.517/0001-80" 836 | }, 837 | { 838 | "codigo": "SCAR3", 839 | "empresa": "SAO CARLOS", 840 | "cnpj": "29.780.061/0001-09" 841 | }, 842 | { 843 | "codigo": "SEDU3", 844 | "empresa": "SOMOS EDUCAÇÃO", 845 | "cnpj": "02.541.982/0001-54" 846 | }, 847 | { 848 | "codigo": "SEER3", 849 | "empresa": "SER EDUCACIONAL", 850 | "cnpj": "04.986.320/0001-13" 851 | }, 852 | { 853 | "codigo": "SGPS3", 854 | "empresa": "SPRINGS GLOBAL", 855 | "cnpj": "07.718.269/0001-57" 856 | }, 857 | { 858 | "codigo": "SHOW3", 859 | "empresa": "T4F ENTRETENIMENTO", 860 | "cnpj": "02.860.694/0001-62" 861 | }, 862 | { 863 | "codigo": "SHUL3-SHUL4", 864 | "empresa": "SCHULZ", 865 | "cnpj": "84.693.183/0001-68" 866 | }, 867 | { 868 | "codigo": "SLCE3", 869 | "empresa": "SLC AGRICOLA", 870 | "cnpj": "89.096.457/0001-55" 871 | }, 872 | { 873 | "codigo": "SLED3-SLED4", 874 | "empresa": "SARAIVA LIVREIROS EDITORES", 875 | "cnpj": "60.500.139/0001-26" 876 | }, 877 | { 878 | "codigo": "SMLS3", 879 | "empresa": "SMILES FIDELIDADE", 880 | "cnpj": "05.730.375/0001-20" 881 | }, 882 | { 883 | "codigo": "SMTO3", 884 | "empresa": "SAO MARTINHO", 885 | "cnpj": "51.466.860/0001-56" 886 | }, 887 | { 888 | "codigo": "SQIA3-SNSL3", 889 | "empresa": "SINQIA S.A.", 890 | "cnpj": "04.065.791/0001-99" 891 | }, 892 | { 893 | "codigo": "SSBR3", 894 | "empresa": "SONAE SIERRA BRASIL", 895 | "cnpj": "05.878.397/0001-32" 896 | }, 897 | { 898 | "codigo": "STBP3", 899 | "empresa": "SANTOS BRASIL", 900 | "cnpj": "02.762.121/0001-04" 901 | }, 902 | { 903 | "codigo": "SULA11-SULA3-SULA4", 904 | "empresa": "SUL AMERICA", 905 | "cnpj": "29.978.814/0001-87" 906 | }, 907 | { 908 | "codigo": "SUZB3", 909 | "empresa": "SUZANO PAPEL E CELULOSE", 910 | "cnpj": "16.404.287/0001-55" 911 | }, 912 | { 913 | "codigo": "TAEE11-TAEE3-TAEE4", 914 | "empresa": "TRANSMISSORA ALIANÇA DE ENERGIA ELÉTRICA", 915 | "cnpj": "07.859.971/0001-30" 916 | }, 917 | { 918 | "codigo": "TCNO3-TCNO4", 919 | "empresa": "TECNOSOLO ENGENHARIA", 920 | "cnpj": "33.111.246/0001-90" 921 | }, 922 | { 923 | "codigo": "TCSA3", 924 | "empresa": "TECNISA", 925 | "cnpj": "08.065.557/0001-12" 926 | }, 927 | { 928 | "codigo": "TECN3", 929 | "empresa": "TECHNOS", 930 | "cnpj": "09.295.063/0001-97" 931 | }, 932 | { 933 | "codigo": "TEKA3-TEKA4", 934 | "empresa": "TEKA-TECELAGEM KUEHNRICH", 935 | "cnpj": "82.636.986/0001-55" 936 | }, 937 | { 938 | "codigo": "TEND3", 939 | "empresa": "CONSTRUTORA TENDA", 940 | "cnpj": "71.476.527/0001-35" 941 | }, 942 | { 943 | "codigo": "TGMA3", 944 | "empresa": "TEGMA GESTAO LOGISTICA", 945 | "cnpj": "02.351.144/0001-18" 946 | }, 947 | { 948 | "codigo": "TIET11-TIET3-TIET4", 949 | "empresa": "AES TIETE ENERGIA", 950 | "cnpj": "04.128.563/0001-10" 951 | }, 952 | { 953 | "codigo": "TIMP3", 954 | "empresa": "TIM", 955 | "cnpj": "02.558.115/0001-21" 956 | }, 957 | { 958 | "codigo": "TOTS3", 959 | "empresa": "TOTVS", 960 | "cnpj": "53.113.791/0001-22" 961 | }, 962 | { 963 | "codigo": "TOYB3-TOYB4", 964 | "empresa": "TEC TOY", 965 | "cnpj": "22.770.366/0001-82" 966 | }, 967 | { 968 | "codigo": "TPIS3", 969 | "empresa": "TRIUNFO PART", 970 | "cnpj": "03.014.553/0001-91" 971 | }, 972 | { 973 | "codigo": "TRIS3", 974 | "empresa": "TRISUL", 975 | "cnpj": "08.811.643/0001-27" 976 | }, 977 | { 978 | "codigo": "TRPL3-TRPL4", 979 | "empresa": "CIA TRANSMISSÃO ENERGIA ELÉTRICA PAULISTA – CTEEP", 980 | "cnpj": "02.998.611/0001-04" 981 | }, 982 | { 983 | "codigo": "TRPN3", 984 | "empresa": "TARPON INVESTIMENTOS", 985 | "cnpj": "05.341.549/0001-63" 986 | }, 987 | { 988 | "codigo": "TUPY3", 989 | "empresa": "TUPY", 990 | "cnpj": "84.683.374/0001-49" 991 | }, 992 | { 993 | "codigo": "UCAS3", 994 | "empresa": "UNICASA INDÚSTRIA DE MoVEIS", 995 | "cnpj": "90.441.460/0001-48" 996 | }, 997 | { 998 | "codigo": "UGPA3", 999 | "empresa": "ULTRAPAR PARTICIPACOES", 1000 | "cnpj": "33.256.439/0001-39" 1001 | }, 1002 | { 1003 | "codigo": "UNIP6", 1004 | "empresa": "UNIPAR CARBOCLORO S.A.", 1005 | "cnpj": "33.958.695/0001-78" 1006 | }, 1007 | { 1008 | "codigo": "USIM3-USIM5-USIM6", 1009 | "empresa": "USINAS SIDERÚRGICAS DE MINAS GERAIS – USIMINAS", 1010 | "cnpj": "60.894.730/0001-05" 1011 | }, 1012 | { 1013 | "codigo": "VALE3", 1014 | "empresa": "VALE", 1015 | "cnpj": "33.592.510/0001-54" 1016 | }, 1017 | { 1018 | "codigo": "VIVA3", 1019 | "empresa": "VIVARA", 1020 | "cnpj": "84.453.844/0342-44" 1021 | }, 1022 | { 1023 | "codigo": "VIVR3", 1024 | "empresa": "VIVER INCORPORADORA E CONSTRUTORA", 1025 | "cnpj": "67.571.414/0001-41" 1026 | }, 1027 | { 1028 | "codigo": "VIVT3-VIVT4", 1029 | "empresa": "TELEFÔNICA BRASIL", 1030 | "cnpj": "02.558.157/0001-62" 1031 | }, 1032 | { 1033 | "codigo": "VLID3", 1034 | "empresa": "VALID SOLUÇÕES", 1035 | "cnpj": "33.113.309/0001-47" 1036 | }, 1037 | { 1038 | "codigo": "VULC3", 1039 | "empresa": "VULCABRAS/AZALEIA", 1040 | "cnpj": "50.926.955/0001-42" 1041 | }, 1042 | { 1043 | "codigo": "VVAR11-VVAR3-VVAR4", 1044 | "empresa": "VIA VAREJO", 1045 | "cnpj": "33.041.260/0652-90" 1046 | }, 1047 | { 1048 | "codigo": "WEGE3", 1049 | "empresa": "WEG S.A.", 1050 | "cnpj": "84.429.695/0001-11" 1051 | }, 1052 | { 1053 | "codigo": "WHRL3-WHRL4", 1054 | "empresa": "WHIRLPOOL", 1055 | "cnpj": "59.105.999/0001-86" 1056 | }, 1057 | { 1058 | "codigo": "WIZS3", 1059 | "empresa": "WIZ SOLUÇÕES E CORRETAGEM DE SEGUROS", 1060 | "cnpj": "42.278.473/0001-03" 1061 | }, 1062 | { 1063 | "codigo": "WSON33", 1064 | "empresa": "WILSON SONS", 1065 | "cnpj": "05.721.735/0001-28" 1066 | }, 1067 | { 1068 | "codigo": "NEOE3", 1069 | "empresa": "NEOENERGIA S.A.", 1070 | "cnpj": "01.083.200/0001-18" 1071 | }, 1072 | { 1073 | "codigo": "TELB3-TELB4", 1074 | "empresa": "TELEC BRASILEIRAS S.A. TELEBRAS", 1075 | "cnpj": "00.336.701/0001-04" 1076 | }, 1077 | { 1078 | "codigo": "BEES3-BEES4", 1079 | "empresa": "BANESTES S.A. - BCO EST ESPIRITO SANTO", 1080 | "cnpj": "28.127.603/0001-78" 1081 | }, 1082 | { 1083 | "codigo": "EALT4", 1084 | "empresa": "ELECTRO ACO ALTONA S.A.", 1085 | "cnpj": "82.643.537/0001-34" 1086 | }, 1087 | { 1088 | "codigo": "MEAL3", 1089 | "empresa": "INTERNATIONAL MEAL COMPANY ALIMENTACAO S.A.", 1090 | "cnpj": "17.314.329/0001-20" 1091 | }, 1092 | { 1093 | "codigo": "PTNT4", 1094 | "empresa": "PETTENATI S.A. INDUSTRIA TEXTIL", 1095 | "cnpj": "88.613.658/0001-10" 1096 | }, 1097 | { 1098 | "codigo": "JPSA3", 1099 | "empresa": "JEREISSATI PARTICIPACOES S.A.", 1100 | "cnpj": "60.543.816/0001-93" 1101 | }, 1102 | { 1103 | "codigo": "ENAT3", 1104 | "empresa": "ENAUTA PARTICIPACOES S.A.", 1105 | "cnpj": "11.669.021/0001-10" 1106 | }, 1107 | { 1108 | "codigo": "CRPG5", 1109 | "empresa": "TRONOX PIGMENTOS DO BRASIL S.A.", 1110 | "cnpj": "15.115.504/0001-24" 1111 | }, 1112 | { 1113 | "codigo": "BKBR3", 1114 | "empresa": "BK BRASIL OPERAÇÃO E ASSESSORIA A RESTAURANTES SA", 1115 | "cnpj": "13.574.594/0001-96" 1116 | }, 1117 | { 1118 | "codigo": "GBIO33", 1119 | "empresa": "BIOTOSCANA INVESTMENTS S.A.", 1120 | "cnpj": "19.688.956/0001-56" 1121 | }, 1122 | { 1123 | "codigo": "PTBL3", 1124 | "empresa": "PBG S/A", 1125 | "cnpj": "83.475.913/0001-91" 1126 | }, 1127 | { 1128 | "codigo": "ALSO3", 1129 | "empresa": "ALIANSCE SONAE SHOPPING CENTERS S.A.", 1130 | "cnpj": "05.878.397/0001-32" 1131 | }, 1132 | { 1133 | "codigo": "BMEB4", 1134 | "empresa": "BCO MERCANTIL DO BRASIL S.A.", 1135 | "cnpj": "17.184.037/0001-10" 1136 | }, 1137 | { 1138 | "codigo": "BTTL3", 1139 | "empresa": "BATTISTELLA ADM PARTICIPACOES S.A.", 1140 | "cnpj": "42.331.462/0001-31" 1141 | }, 1142 | { 1143 | "codigo": "FRTA3", 1144 | "empresa": "POMIFRUTAS S/A", 1145 | "cnpj": "86.550.951/0001-50" 1146 | }, 1147 | { 1148 | "codigo": "TESA3", 1149 | "empresa": "TERRA SANTA AGRO S.A.", 1150 | "cnpj": "05.799.312/0001-20" 1151 | }, 1152 | { 1153 | "codigo": "MNPR3", 1154 | "empresa": "MINUPAR PARTICIPACOES S.A.", 1155 | "cnpj": "90.076.886/0001-40" 1156 | }, 1157 | { 1158 | "codigo": "AZEV4", 1159 | "empresa": "AZEVEDO E TRAVASSOS S.A.", 1160 | "cnpj": "61.351.532/0001-68" 1161 | }, 1162 | { 1163 | "codigo": "NTCO3", 1164 | "empresa": "NATURA &CO HOLDING S.A.", 1165 | "cnpj": "32.785.497/0001-97" 1166 | } 1167 | ] 1168 | -------------------------------------------------------------------------------- /resources/etfs.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "RazaoSocial": "BB ETF S&P DIVIDENDOS BRASIL FUNDO DE INDICE", 4 | "Fundo": "BB ETF SP DV", 5 | "Cnpj": "17.817.528/0001-50", 6 | "Codigo": "BBSD" 7 | }, 8 | { 9 | "RazaoSocial": "CAIXA ETF IBOVESPA FUNDO DE INDICE", 10 | "Fundo": "CAIXAETFXBOV", 11 | "Cnpj": "14.120.533/0001-11", 12 | "Codigo": "XBOV" 13 | }, 14 | { 15 | "RazaoSocial": "ETF BRADESCO IBOVESPA FDO DE INDICE", 16 | "Fundo": "ETF BRAD BOV", 17 | "Cnpj": "32.203.211/0001-18", 18 | "Codigo": "BOVB" 19 | }, 20 | { 21 | "RazaoSocial": "ISHARES S&P 500 FDO INV COTAS FDO INDICE", 22 | "Fundo": "ISHARE SP500", 23 | "Cnpj": "19.909.560/0001-91", 24 | "Codigo": "IVVB" 25 | }, 26 | { 27 | "RazaoSocial": "ISHARES IBOVESPA FUNDO DE INDICE", 28 | "Fundo": "ISHARES BOVA", 29 | "Cnpj": "10.406.511/0001-61", 30 | "Codigo": "BOVA" 31 | }, 32 | { 33 | "RazaoSocial": "ISHARES IBRX - INDICE BRASIL (IBRX-100) FDO INDICE", 34 | "Fundo": "ISHARES BRAX", 35 | "Cnpj": "11.455.378/0001-04", 36 | "Codigo": "BRAX" 37 | }, 38 | { 39 | "RazaoSocial": "ISHARES INDICE CARBONO EFIC. (ICO2) BRASIL-FDO IND", 40 | "Fundo": "ISHARES ECOO", 41 | "Cnpj": "15.562.377/0001-01", 42 | "Codigo": "ECOO" 43 | }, 44 | { 45 | "RazaoSocial": "ISHARES BMFBOVESPA SMALL CAP FUNDO DE INDICE", 46 | "Fundo": "ISHARES SMAL", 47 | "Cnpj": "10.406.600/0001-08", 48 | "Codigo": "SMAL" 49 | }, 50 | { 51 | "RazaoSocial": "IT NOW IBOVESPA FUNDO DE INDICE", 52 | "Fundo": "IT NOW IBOV", 53 | "Cnpj": "21.407.758/0001-19", 54 | "Codigo": "BOVV" 55 | }, 56 | { 57 | "RazaoSocial": "IT NOW IDIV FUNDO DE INDICE", 58 | "Fundo": "IT NOW IDIV", 59 | "Cnpj": "13.416.245/0001-46", 60 | "Codigo": "DIVO" 61 | }, 62 | { 63 | "RazaoSocial": "IT NOW IFNC FUNDO DE INDICE", 64 | "Fundo": "IT NOW IFNC", 65 | "Cnpj": "11.961.094/0001-81", 66 | "Codigo": "FIND" 67 | }, 68 | { 69 | "RazaoSocial": "IT NOW IGCT FUNDO DE INDICE", 70 | "Fundo": "IT NOW IGCT", 71 | "Cnpj": "11.184.136/0001-15", 72 | "Codigo": "GOVE" 73 | }, 74 | { 75 | "RazaoSocial": "IT NOW IMAT FUNDO DE INDICE", 76 | "Fundo": "IT NOW IMAT", 77 | "Cnpj": "13.416.228/0001-09", 78 | "Codigo": "MATB" 79 | }, 80 | { 81 | "RazaoSocial": "IT NOW ISE FUNDO DE INDICE", 82 | "Fundo": "IT NOW ISE", 83 | "Cnpj": "12.984.444/0001-98", 84 | "Codigo": "ISUS" 85 | }, 86 | { 87 | "RazaoSocial": "IT NOW PIBB IBRX-50 - FUNDO DE INDICE", 88 | "Fundo": "IT NOW PIBB", 89 | "Cnpj": "06.323.688/0001-27", 90 | "Codigo": "PIBB" 91 | }, 92 | { 93 | "RazaoSocial": "IT NOW SMALL FDO INDICE", 94 | "Fundo": "IT NOW SMALL", 95 | "Cnpj": "34.803.814/0001-86", 96 | "Codigo": "SMAC" 97 | }, 98 | { 99 | "RazaoSocial": "IT NOW S&P500 TRN FUNDO DE INDICE", 100 | "Fundo": "IT NOW SPXI", 101 | "Cnpj": "17.036.289/0001-00", 102 | "Codigo": "SPXI" 103 | } 104 | ] 105 | -------------------------------------------------------------------------------- /resources/fiis.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "codigo": "ALZR", 4 | "nome": "ALIANZA TRUST RENDA IMOBILIÁRIA", 5 | "cnpj": "28.737.771/0001-85", 6 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 7 | "cnpj_adm": "59.281.253/0001-23" 8 | }, 9 | { 10 | "codigo": "AQLL", 11 | "nome": "ÁQUILLA", 12 | "cnpj": "13.555.918/0001-49", 13 | "nome_adm": "FOCO DTVM LTDA.", 14 | "cnpj_adm": "00.329.598/0001-67" 15 | }, 16 | { 17 | "codigo": "BCRI", 18 | "nome": "BANESTES RECEBÍVEIS IMOBILIÁRIOS", 19 | "cnpj": "22.219.335/0001-38", 20 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 21 | "cnpj_adm": "13.486.793/0001-42" 22 | }, 23 | { 24 | "codigo": "BNFS", 25 | "nome": "BANRISUL NOVAS FRONTEIRAS", 26 | "cnpj": "15.570.431/0001-60", 27 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 28 | "cnpj_adm": "36.113.876/0001-91" 29 | }, 30 | { 31 | "codigo": "BBPO", 32 | "nome": "BB PROGRESSIVO II", 33 | "cnpj": "14.410.722/0001-29", 34 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 35 | "cnpj_adm": "03.384.738/0001-98" 36 | }, 37 | { 38 | "codigo": "BBIM", 39 | "nome": "BB RECEBÍVEIS IMOBILIÁRIOS", 40 | "cnpj": "20.716.161/0001-93", 41 | "nome_adm": "BB GESTAO DE RECURSOS DTVM S.A", 42 | "cnpj_adm": "30.822.936/0001-69" 43 | }, 44 | { 45 | "codigo": "BBRC", 46 | "nome": "BB RENDA CORPORATIVA", 47 | "cnpj": "12.681.340/0001-04", 48 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 49 | "cnpj_adm": "03.384.738/0001-98" 50 | }, 51 | { 52 | "codigo": "RDPD", 53 | "nome": "BB RENDA DE PAPEIS IMOBILIÁRIOS II", 54 | "cnpj": "23.120.027/0001-13", 55 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 56 | "cnpj_adm": "03.384.738/0001-98" 57 | }, 58 | { 59 | "codigo": "RNDP", 60 | "nome": "BB RENDA DE PAPÉIS IMOBILIÁRIOS", 61 | "cnpj": "15.394.563/0001-89", 62 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 63 | "cnpj_adm": "03.384.738/0001-98" 64 | }, 65 | { 66 | "codigo": "BCIA", 67 | "nome": "BRADESCO CARTEIRA IMOBILIÁRIA ATIVA", 68 | "cnpj": "20.216.935/0001-17", 69 | "nome_adm": "BANCO BRADESCO S.A.", 70 | "cnpj_adm": "60.746.948/0001-12" 71 | }, 72 | { 73 | "codigo": "BZLI", 74 | "nome": "BRAZIL REALTY", 75 | "cnpj": "14.074.706/0001-02", 76 | "nome_adm": "FOCO DTVM LTDA.", 77 | "cnpj_adm": "00.329.598/0001-67" 78 | }, 79 | { 80 | "codigo": "CARE", 81 | "nome": "BRAZILIAN GRAVEYARD AND DEATH CARE", 82 | "cnpj": "13.584.584/0001-31", 83 | "nome_adm": "PLANNER TRUSTEE DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 84 | "cnpj_adm": "67.030.395/0001-46" 85 | }, 86 | { 87 | "codigo": "BRCO", 88 | "nome": "FII BRESCO", 89 | "cnpj": "20.748.515/0001-81", 90 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 91 | "cnpj_adm": "36.113.876/0001-91" 92 | }, 93 | { 94 | "codigo": "BTLG", 95 | "nome": "FII BTLG", 96 | "cnpj": "11.839.593/0001-09", 97 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 98 | "cnpj_adm": "59.281.253/0001-23" 99 | }, 100 | { 101 | "codigo": "CRFF", 102 | "nome": "FII CX RBRA2", 103 | "cnpj": "31.887.401/0001-39", 104 | "nome_adm": "CAIXA ECONOMICA FEDERAL", 105 | "cnpj_adm": "00.360.305/0001-04" 106 | }, 107 | { 108 | "codigo": "CXRI", 109 | "nome": "CAIXA RIO BRAVO", 110 | "cnpj": "17.098.794/0001-70", 111 | "nome_adm": "CAIXA ECONOMICA FEDERAL", 112 | "cnpj_adm": "00.360.305/0001-04" 113 | }, 114 | { 115 | "codigo": "CPFF", 116 | "nome": "FII CAP REIT", 117 | "cnpj": "34.081.611/0001-23", 118 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 119 | "cnpj_adm": "22.610.500/0001-88" 120 | }, 121 | { 122 | "codigo": "CBOP", 123 | "nome": "CASTELLO BRANCO OFFICE PARK", 124 | "cnpj": "17.144.039/0001-85", 125 | "nome_adm": "CREDIT SUISSE HEDGING-GRIFFO CORRETORA DE VALORES S.A.", 126 | "cnpj_adm": "61.809.182/0001-30" 127 | }, 128 | { 129 | "codigo": "GRLV", 130 | "nome": "CSHG GR LOUVEIRA", 131 | "cnpj": "17.143.998/0001-86", 132 | "nome_adm": "CREDIT SUISSE HEDGING-GRIFFO CORRETORA DE VALORES S.A.", 133 | "cnpj_adm": "61.809.182/0001-30" 134 | }, 135 | { 136 | "codigo": "HGFF", 137 | "nome": "FII CSHG FOF", 138 | "cnpj": "32.784.898/0001-22", 139 | "nome_adm": "CREDIT SUISSE HEDGING-GRIFFO CORRETORA DE VALORES S.A.", 140 | "cnpj_adm": "61.809.182/0001-30" 141 | }, 142 | { 143 | "codigo": "HGLG", 144 | "nome": "CGHG LOGÍSTICA", 145 | "cnpj": "11.728.688/0001-47", 146 | "nome_adm": "CREDIT SUISSE HEDGING-GRIFFO CORRETORA DE VALORES S.A.", 147 | "cnpj_adm": "61.809.182/0001-30" 148 | }, 149 | { 150 | "codigo": "HGPO", 151 | "nome": "FII CSHGPRIM", 152 | "cnpj": "11.260.134/0001-68", 153 | "nome_adm": "CREDIT SUISSE HEDGING-GRIFFO CORRETORA DE VALORES S.A.", 154 | "cnpj_adm": "61.809.182/0001-30" 155 | }, 156 | { 157 | "codigo": "HGRE", 158 | "nome": "CSHG REAL ESTATE", 159 | "cnpj": "09.072.017/0001-29", 160 | "nome_adm": "CREDIT SUISSE HEDGING-GRIFFO CORRETORA DE VALORES S.A.", 161 | "cnpj_adm": "61.809.182/0001-30" 162 | }, 163 | { 164 | "codigo": "HGCR", 165 | "nome": "CGHG RECEBÍVEIS IMOBILIÁRIOS", 166 | "cnpj": "11.160.521/0001-22", 167 | "nome_adm": "CREDIT SUISSE HEDGING-GRIFFO CORRETORA DE VALORES S.A.", 168 | "cnpj_adm": "61.809.182/0001-30" 169 | }, 170 | { 171 | "codigo": "HGRU", 172 | "nome": "CSHG RENDA URBANA", 173 | "cnpj": "29.641.226/0001-53", 174 | "nome_adm": "CREDIT SUISSE HEDGING-GRIFFO CORRETORA DE VALORES S.A.", 175 | "cnpj_adm": "61.809.182/0001-30" 176 | }, 177 | { 178 | "codigo": "ERPA", 179 | "nome": "FII EUROPA", 180 | "cnpj": "31.469.385/0001-64", 181 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 182 | "cnpj_adm": "36.113.876/0001-91" 183 | }, 184 | { 185 | "codigo": "KINP", 186 | "nome": "EVEN PERMUTA KINEA", 187 | "cnpj": "24.070.076/0001-51", 188 | "nome_adm": "INTRAG DTVM LTDA.", 189 | "cnpj_adm": "62.418.140/0001-31" 190 | }, 191 | { 192 | "codigo": "VRTA", 193 | "nome": "FATOR VERITA", 194 | "cnpj": "11.664.201/0001-00", 195 | "nome_adm": "BANCO FATOR S/A", 196 | "cnpj_adm": "33.644.196/0001-06" 197 | }, 198 | { 199 | "codigo": "BMII", 200 | "nome": "BRASILIO MACHADO", 201 | "cnpj": "02.027.437/0001-44", 202 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 203 | "cnpj_adm": "72.600.026/0001-81" 204 | }, 205 | { 206 | "codigo": "BTCR", 207 | "nome": "BTG PACTUAL CRÉDITO IMOBILIÁRIO", 208 | "cnpj": "29.787.928/0001-40", 209 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 210 | "cnpj_adm": "59.281.253/0001-23" 211 | }, 212 | { 213 | "codigo": "FAED", 214 | "nome": "ANHANGUERA EDUCACIONAL", 215 | "cnpj": "11.179.118/0001-45", 216 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 217 | "cnpj_adm": "59.281.253/0001-23" 218 | }, 219 | { 220 | "codigo": "BPRP", 221 | "nome": "FII BRLPROP", 222 | "cnpj": "29.800.650/0001-01", 223 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 224 | "cnpj_adm": "59.281.253/0001-23" 225 | }, 226 | { 227 | "codigo": "BRCR", 228 | "nome": "BTG PACTUAL CORPORATE OFFICE", 229 | "cnpj": "08.924.783/0001-01", 230 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 231 | "cnpj_adm": "59.281.253/0001-23" 232 | }, 233 | { 234 | "codigo": "FEXC", 235 | "nome": "BTG PACTUAL FUNDO DE CRI", 236 | "cnpj": "09.552.812/0001-14", 237 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 238 | "cnpj_adm": "59.281.253/0001-23" 239 | }, 240 | { 241 | "codigo": "BCFF", 242 | "nome": "BTG FUNDO DE FUNDOS", 243 | "cnpj": "11.026.627/0001-38", 244 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 245 | "cnpj_adm": "59.281.253/0001-23" 246 | }, 247 | { 248 | "codigo": "FCFL", 249 | "nome": "CAMPUS FARIA LIMA", 250 | "cnpj": "11.602.654/0001-01", 251 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 252 | "cnpj_adm": "59.281.253/0001-23" 253 | }, 254 | { 255 | "codigo": "CNES", 256 | "nome": "CENESP", 257 | "cnpj": "13.551.286/0001-45", 258 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 259 | "cnpj_adm": "59.281.253/0001-23" 260 | }, 261 | { 262 | "codigo": "CEOC", 263 | "nome": "CYRELA COMMERCIAL PROPERTIES", 264 | "cnpj": "15.799.397/0001-09", 265 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 266 | "cnpj_adm": "59.281.253/0001-23" 267 | }, 268 | { 269 | "codigo": "THRA", 270 | "nome": "CYRELA THERA CORPORATE", 271 | "cnpj": "13.966.653/0001-71", 272 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 273 | "cnpj_adm": "59.281.253/0001-23" 274 | }, 275 | { 276 | "codigo": "EDGA", 277 | "nome": "EDIFÍCIO GALERIA", 278 | "cnpj": "15.333.306/0001-37", 279 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 280 | "cnpj_adm": "59.281.253/0001-23" 281 | }, 282 | { 283 | "codigo": "FLRP", 284 | "nome": "FLORIPA SHOPPING", 285 | "cnpj": "10.375.382/0001-91", 286 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 287 | "cnpj_adm": "59.281.253/0001-23" 288 | }, 289 | { 290 | "codigo": "HCRI", 291 | "nome": "HOSPITAL DA CRIANÇA", 292 | "cnpj": "04.066.582/0001-60", 293 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 294 | "cnpj_adm": "59.281.253/0001-23" 295 | }, 296 | { 297 | "codigo": "NSLU", 298 | "nome": "HOSPITAL NOSSA SRA LOURDES", 299 | "cnpj": "08.014.513/0001-63", 300 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 301 | "cnpj_adm": "59.281.253/0001-23" 302 | }, 303 | { 304 | "codigo": "HTMX", 305 | "nome": "HOTEL MAXINVEST", 306 | "cnpj": "08.706.065/0001-69", 307 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 308 | "cnpj_adm": "59.281.253/0001-23" 309 | }, 310 | { 311 | "codigo": "MAXR", 312 | "nome": "MAX RETAIL", 313 | "cnpj": "11.274.415/0001-70", 314 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 315 | "cnpj_adm": "59.281.253/0001-23" 316 | }, 317 | { 318 | "codigo": "NCHB", 319 | "nome": "NCH BRASIL RECEBÍVEIS IMOBILIÁRIOS", 320 | "cnpj": "18.085.673/0001-57", 321 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 322 | "cnpj_adm": "59.281.253/0001-23" 323 | }, 324 | { 325 | "codigo": "NVHO", 326 | "nome": "NOVO HORIZONTE", 327 | "cnpj": "17.025.970/0001-44", 328 | "nome_adm": "PLURAL S.A. BANCO MÚLTIPLO", 329 | "cnpj_adm": "45.246.410/0001-55" 330 | }, 331 | { 332 | "codigo": "PQDP", 333 | "nome": "PARQUE DOM PEDRO SHOPPING CENTER", 334 | "cnpj": "10.869.155/0001-12", 335 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 336 | "cnpj_adm": "59.281.253/0001-23" 337 | }, 338 | { 339 | "codigo": "PRSV", 340 | "nome": "PRESIDENTE VARGAS", 341 | "cnpj": "11.281.322/0001-72", 342 | "nome_adm": "BEM - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 343 | "cnpj_adm": "00.066.670/0001-00" 344 | }, 345 | { 346 | "codigo": "RBRM", 347 | "nome": "FII RBR DES", 348 | "cnpj": "26.314.437/0001-93", 349 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 350 | "cnpj_adm": "59.281.253/0001-23" 351 | }, 352 | { 353 | "codigo": "RBRR", 354 | "nome": "RBR RENDIMENTO HIGH GRADE", 355 | "cnpj": "29.467.977/0001-03", 356 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 357 | "cnpj_adm": "59.281.253/0001-23" 358 | }, 359 | { 360 | "codigo": "JRDM", 361 | "nome": "SHOPPING JARDIM SUL ", 362 | "cnpj": "14.879.856/0001-93", 363 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 364 | "cnpj_adm": "59.281.253/0001-23" 365 | }, 366 | { 367 | "codigo": "TBOF", 368 | "nome": "TB OFFICE", 369 | "cnpj": "17.365.105/0001-47", 370 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 371 | "cnpj_adm": "59.281.253/0001-23" 372 | }, 373 | { 374 | "codigo": "ALMI", 375 | "nome": "TORRE ALMIRANTE", 376 | "cnpj": "07.122.725/0001-00", 377 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 378 | "cnpj_adm": "59.281.253/0001-23" 379 | }, 380 | { 381 | "codigo": "TRNT", 382 | "nome": "TORRE NORTE", 383 | "cnpj": "04.722.883/0001-02", 384 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 385 | "cnpj_adm": "59.281.253/0001-23" 386 | }, 387 | { 388 | "codigo": "RECT", 389 | "nome": "FII UBSOFFIC", 390 | "cnpj": "32.274.163/0001-59", 391 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 392 | "cnpj_adm": "13.486.793/0001-42" 393 | }, 394 | { 395 | "codigo": "UBSR", 396 | "nome": "UBS BR RECEBÍVEIS IMOBILIÁRIOS", 397 | "cnpj": "28.152.272/0001-26", 398 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 399 | "cnpj_adm": "13.486.793/0001-42" 400 | }, 401 | { 402 | "codigo": "VLOL", 403 | "nome": "VILA OLÍMPIA CORPORATE", 404 | "cnpj": "15.296.696/0001-12", 405 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 406 | "cnpj_adm": "36.113.876/0001-91" 407 | }, 408 | { 409 | "codigo": "OUFF", 410 | "nome": "FII OURI FOF", 411 | "cnpj": "30.791.386/0001-68", 412 | "nome_adm": "BANCO OURINVEST S.A.", 413 | "cnpj_adm": "78.632.767/0001-20" 414 | }, 415 | { 416 | "codigo": "VVPR", 417 | "nome": "FII V2 PROP", 418 | "cnpj": "33.045.581/0001-37", 419 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 420 | "cnpj_adm": "59.281.253/0001-23" 421 | }, 422 | { 423 | "codigo": "LVBI", 424 | "nome": "FII VBI LOG", 425 | "cnpj": "30.629.603/0001-18", 426 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 427 | "cnpj_adm": "59.281.253/0001-23" 428 | }, 429 | { 430 | "codigo": "BARI", 431 | "nome": "FII BARIGUI", 432 | "cnpj": "29.267.567/0001-00", 433 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 434 | "cnpj_adm": "36.113.876/0001-91" 435 | }, 436 | { 437 | "codigo": "BBVJ", 438 | "nome": "BB VOTORANTIM CIDADE JARDIM CONTINENTAL TOWER", 439 | "cnpj": "10.347.985/0001-80", 440 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 441 | "cnpj_adm": "03.384.738/0001-98" 442 | }, 443 | { 444 | "codigo": "BPFF", 445 | "nome": "BRASIL PLURAL ABSOLUTO FUNDO DE FUNDOS", 446 | "cnpj": "17.324.357/0001-28", 447 | "nome_adm": "GENIAL INVESTIMENTOS CORRETORA DE VALORES MOBILIÁRIOS S.A.", 448 | "cnpj_adm": "27.652.684/0001-62" 449 | }, 450 | { 451 | "codigo": "BVAR", 452 | "nome": "BRASIL VAREJO", 453 | "cnpj": "21.126.204/0001-43", 454 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 455 | "cnpj_adm": "72.600.026/0001-81" 456 | }, 457 | { 458 | "codigo": "BPML", 459 | "nome": "FII BTG SHOP", 460 | "cnpj": "33.046.142/0001-49", 461 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 462 | "cnpj_adm": "59.281.253/0001-23" 463 | }, 464 | { 465 | "codigo": "CXTL", 466 | "nome": "CAIXA TRX LOGÍSTICA RENDA", 467 | "cnpj": "12.887.506/0001-43", 468 | "nome_adm": "CAIXA ECONOMICA FEDERAL", 469 | "cnpj_adm": "00.360.305/0001-04" 470 | }, 471 | { 472 | "codigo": "CTXT", 473 | "nome": "CENTRO TÊXTIL INTERNACIONAL", 474 | "cnpj": "00.762.723/0001-28", 475 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 476 | "cnpj_adm": "72.600.026/0001-81" 477 | }, 478 | { 479 | "codigo": "FLMA", 480 | "nome": "CONTINENTAL SQUARE FARIA LIMA", 481 | "cnpj": "04.141.645/0001-03", 482 | "nome_adm": "BR-CAPITAL DTVM S.A.", 483 | "cnpj_adm": "44.077.014/0001-89" 484 | }, 485 | { 486 | "codigo": "EURO", 487 | "nome": "EUROPAR", 488 | "cnpj": "05.437.916/0001-27", 489 | "nome_adm": "COINVALORES CCVM LTDA", 490 | "cnpj_adm": "00.336.036/0001-40" 491 | }, 492 | { 493 | "codigo": "FIGS", 494 | "nome": "GENERAL SHOPPING ATIVO E RENDA", 495 | "cnpj": "17.590.518/0001-25", 496 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 497 | "cnpj_adm": "07.253.654/0001-76" 498 | }, 499 | { 500 | "codigo": "ABCP", 501 | "nome": "GRAND PLAZA SHOPPING", 502 | "cnpj": "01.201.140/0001-90", 503 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 504 | "cnpj_adm": "72.600.026/0001-81" 505 | }, 506 | { 507 | "codigo": "GTWR", 508 | "nome": "FII G TOWERS", 509 | "cnpj": "23.740.527/0001-58", 510 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 511 | "cnpj_adm": "03.384.738/0001-98" 512 | }, 513 | { 514 | "codigo": "HBTT", 515 | "nome": "HABITAT I", 516 | "cnpj": "26.846.202/0001-42", 517 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 518 | "cnpj_adm": "22.610.500/0001-88" 519 | }, 520 | { 521 | "codigo": "HUSC", 522 | "nome": "HOSPITAL UNIMED SUL CAPIXABA", 523 | "cnpj": "28.851.767/0001-43", 524 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 525 | "cnpj_adm": "72.600.026/0001-81" 526 | }, 527 | { 528 | "codigo": "FIIB", 529 | "nome": "INDUSTRIAL DO BRASIL", 530 | "cnpj": "14.217.108/0001-45", 531 | "nome_adm": "COINVALORES CCVM LTDA", 532 | "cnpj_adm": "00.336.036/0001-40" 533 | }, 534 | { 535 | "codigo": "FINF", 536 | "nome": "INFRA REAL STATE", 537 | "cnpj": "18.369.510/0001-04", 538 | "nome_adm": "PLANNER CORRETORA DE VALORES SA", 539 | "cnpj_adm": "00.806.535/0001-54" 540 | }, 541 | { 542 | "codigo": "FMOF", 543 | "nome": "MEMORIAL OFFICE", 544 | "cnpj": "01.633.741/0001-72", 545 | "nome_adm": "COIN - DTVM LTDA.", 546 | "cnpj_adm": "61.384.004/0001-05" 547 | }, 548 | { 549 | "codigo": "MBRF", 550 | "nome": "MERCANTIL DO BRASIL", 551 | "cnpj": "13.500.306/0001-59", 552 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 553 | "cnpj_adm": "72.600.026/0001-81" 554 | }, 555 | { 556 | "codigo": "MGFF", 557 | "nome": "MOGNO FUNDO DE FUNDOS", 558 | "cnpj": "29.216.463/0001-77", 559 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 560 | "cnpj_adm": "59.281.253/0001-23" 561 | }, 562 | { 563 | "codigo": "NPAR", 564 | "nome": "NESTPAR", 565 | "cnpj": "24.814.916/0001-43", 566 | "nome_adm": "PLANNER CORRETORA DE VALORES SA", 567 | "cnpj_adm": "00.806.535/0001-54" 568 | }, 569 | { 570 | "codigo": "PABY", 571 | "nome": "PANAMBY", 572 | "cnpj": "00.613.094/0001-74", 573 | "nome_adm": "BRKB DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 574 | "cnpj_adm": "33.923.111/0001-29" 575 | }, 576 | { 577 | "codigo": "FPNG", 578 | "nome": "PEDRA NEGRA RENDA IMOBILIÁRIA", 579 | "cnpj": "17.161.979/0001-82", 580 | "nome_adm": "BR-CAPITAL DTVM S.A.", 581 | "cnpj_adm": "44.077.014/0001-89" 582 | }, 583 | { 584 | "codigo": "VPSI", 585 | "nome": "POLO SHOPPING INDAIATUBA", 586 | "cnpj": "14.721.889/0001-00", 587 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 588 | "cnpj_adm": "03.384.738/0001-98" 589 | }, 590 | { 591 | "codigo": "FPAB", 592 | "nome": "PROJETO ÁGUA BRANCA", 593 | "cnpj": "03.251.720/0001-18", 594 | "nome_adm": "COIN - DTVM LTDA.", 595 | "cnpj_adm": "61.384.004/0001-05" 596 | }, 597 | { 598 | "codigo": "RBRY", 599 | "nome": "FII RBR PCRI", 600 | "cnpj": "30.166.700/0001-11", 601 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 602 | "cnpj_adm": "59.281.253/0001-23" 603 | }, 604 | { 605 | "codigo": "RBRP", 606 | "nome": "RBR PROPERTIES", 607 | "cnpj": "21.408.063/0001-51", 608 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 609 | "cnpj_adm": "13.486.793/0001-42" 610 | }, 611 | { 612 | "codigo": "RCRB", 613 | "nome": "FII RIOB RC", 614 | "cnpj": "03.683.056/0001-86", 615 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 616 | "cnpj_adm": "72.600.026/0001-81" 617 | }, 618 | { 619 | "codigo": "RBED", 620 | "nome": "FII RIOB ED", 621 | "cnpj": "13.873.457/0001-52", 622 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 623 | "cnpj_adm": "72.600.026/0001-81" 624 | }, 625 | { 626 | "codigo": "RBVA", 627 | "nome": "FII RIOB VA", 628 | "cnpj": "15.576.907/0001-70", 629 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 630 | "cnpj_adm": "72.600.026/0001-81" 631 | }, 632 | { 633 | "codigo": "RNGO", 634 | "nome": "RIO NEGRO", 635 | "cnpj": "15.006.286/0001-90", 636 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 637 | "cnpj_adm": "72.600.026/0001-81" 638 | }, 639 | { 640 | "codigo": "SFND", 641 | "nome": "SÃO FERNANDO", 642 | "cnpj": "09.350.920/0001-04", 643 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 644 | "cnpj_adm": "72.600.026/0001-81" 645 | }, 646 | { 647 | "codigo": "FISC", 648 | "nome": "FII SC 401", 649 | "cnpj": "12.804.013/0001-00", 650 | "nome_adm": "CORRETORA GERAL DE VALORES E CAMBIO LTDA", 651 | "cnpj_adm": "92.858.380/0001-18" 652 | }, 653 | { 654 | "codigo": "SCPF", 655 | "nome": "SCP", 656 | "cnpj": "01.657.856/0001-05", 657 | "nome_adm": "BR-CAPITAL DTVM S.A.", 658 | "cnpj_adm": "44.077.014/0001-89" 659 | }, 660 | { 661 | "codigo": "SDIL", 662 | "nome": "SDI LOGÍSTICA RIO", 663 | "cnpj": "16.671.412/0001-93", 664 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 665 | "cnpj_adm": "72.600.026/0001-81" 666 | }, 667 | { 668 | "codigo": "SHPH", 669 | "nome": "SHOPPING PATIO HIGIENOPOLIS", 670 | "cnpj": "03.507.519/0001-59", 671 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 672 | "cnpj_adm": "72.600.026/0001-81" 673 | }, 674 | { 675 | "codigo": "TGAR", 676 | "nome": "TG ATIVO REAL", 677 | "cnpj": "25.032.881/0001-53", 678 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 679 | "cnpj_adm": "22.610.500/0001-88" 680 | }, 681 | { 682 | "codigo": "ONEF", 683 | "nome": "THE ONE", 684 | "cnpj": "12.948.291/0001-23", 685 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 686 | "cnpj_adm": "72.600.026/0001-81" 687 | }, 688 | { 689 | "codigo": "TOUR", 690 | "nome": "FII TOUR II", 691 | "cnpj": "30.578.316/0001-26", 692 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 693 | "cnpj_adm": "22.610.500/0001-88" 694 | }, 695 | { 696 | "codigo": "FVBI", 697 | "nome": "VBI FL 4440", 698 | "cnpj": "13.022.993/0001-44", 699 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 700 | "cnpj_adm": "59.281.253/0001-23" 701 | }, 702 | { 703 | "codigo": "VERE", 704 | "nome": "VEREDA", 705 | "cnpj": "08.693.497/0001-82", 706 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 707 | "cnpj_adm": "22.610.500/0001-88" 708 | }, 709 | { 710 | "codigo": "FVPQ", 711 | "nome": "VIA PARQUE SHOPPING", 712 | "cnpj": "00.332.266/0001-31", 713 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 714 | "cnpj_adm": "72.600.026/0001-81" 715 | }, 716 | { 717 | "codigo": "FIVN", 718 | "nome": "VIDA NOVA", 719 | "cnpj": "17.854.016/0001-64", 720 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 721 | "cnpj_adm": "36.113.876/0001-91" 722 | }, 723 | { 724 | "codigo": "VTLT", 725 | "nome": "VOTORANTIM LOGÍSTICA", 726 | "cnpj": "27.368.600/0001-63", 727 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 728 | "cnpj_adm": "03.384.738/0001-98" 729 | }, 730 | { 731 | "codigo": "VSHO", 732 | "nome": "FII VOT SHOP", 733 | "cnpj": "23.740.595/0001-17", 734 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 735 | "cnpj_adm": "03.384.738/0001-98" 736 | }, 737 | { 738 | "codigo": "IBFF", 739 | "nome": "FII FOF BREI", 740 | "cnpj": "33.721.517/0001-29", 741 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 742 | "cnpj_adm": "59.281.253/0001-23" 743 | }, 744 | { 745 | "codigo": "PLCR", 746 | "nome": "FII PLURAL R", 747 | "cnpj": "32.527.683/0001-26", 748 | "nome_adm": "PLURAL S.A. BANCO MÚLTIPLO", 749 | "cnpj_adm": "45.246.410/0001-55" 750 | }, 751 | { 752 | "codigo": "CVBI", 753 | "nome": "FII VBI CRI", 754 | "cnpj": "28.729.197/0001-13", 755 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 756 | "cnpj_adm": "13.486.793/0001-42" 757 | }, 758 | { 759 | "codigo": "MCCI", 760 | "nome": "FII MAUA", 761 | "cnpj": "23.648.935/0001-84", 762 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 763 | "cnpj_adm": "59.281.253/0001-23" 764 | }, 765 | { 766 | "codigo": "ARRI", 767 | "nome": "FII ATRIO", 768 | "cnpj": "32.006.821/0001-21", 769 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 770 | "cnpj_adm": "36.113.876/0001-91" 771 | }, 772 | { 773 | "codigo": "HOSI", 774 | "nome": "FII HOUSI", 775 | "cnpj": "34.081.631/0001-02", 776 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 777 | "cnpj_adm": "22.610.500/0001-88" 778 | }, 779 | { 780 | "codigo": "IRDM", 781 | "nome": "IRIDIUM RECEBÍVEIS IMOBILIÁRIOS", 782 | "cnpj": "28.830.325/0001-10", 783 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 784 | "cnpj_adm": "59.281.253/0001-23" 785 | }, 786 | { 787 | "codigo": "KFOF", 788 | "nome": "FII KINEAFOF", 789 | "cnpj": "30.091.444/0001-40", 790 | "nome_adm": "INTRAG DTVM LTDA.", 791 | "cnpj_adm": "62.418.140/0001-31" 792 | }, 793 | { 794 | "codigo": "OUCY", 795 | "nome": "OURINVEST CYRELA", 796 | "cnpj": "28.516.650/0001-03", 797 | "nome_adm": "BANCO OURINVEST S.A.", 798 | "cnpj_adm": "78.632.767/0001-20" 799 | }, 800 | { 801 | "codigo": "GSFI", 802 | "nome": "FII GENERAL", 803 | "cnpj": "11.769.604/0001-13", 804 | "nome_adm": "PLANNER CORRETORA DE VALORES SA", 805 | "cnpj_adm": "00.806.535/0001-54" 806 | }, 807 | { 808 | "codigo": "GGRC", 809 | "nome": "GGR COVEPI RENDA", 810 | "cnpj": "26.614.291/0001-00", 811 | "nome_adm": "CM CAPITAL MARKETS DTVM LTDA", 812 | "cnpj_adm": "02.671.743/0001-19" 813 | }, 814 | { 815 | "codigo": "RCFA", 816 | "nome": "FII GP RCFA", 817 | "cnpj": "27.771.586/0001-44", 818 | "nome_adm": "FRAM CAPITAL DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS S.A.", 819 | "cnpj_adm": "13.673.855/0001-25" 820 | }, 821 | { 822 | "codigo": "HABT", 823 | "nome": "FII HABIT II", 824 | "cnpj": "30.578.417/0001-05", 825 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 826 | "cnpj_adm": "22.610.500/0001-88" 827 | }, 828 | { 829 | "codigo": "ATCR", 830 | "nome": "HAZ", 831 | "cnpj": "14.631.148/0001-39", 832 | "nome_adm": "RJI CORRETORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA", 833 | "cnpj_adm": "42.066.258/0001-30" 834 | }, 835 | { 836 | "codigo": "HCTR", 837 | "nome": "FII HECTARE", 838 | "cnpj": "30.248.180/0001-96", 839 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 840 | "cnpj_adm": "22.610.500/0001-88" 841 | }, 842 | { 843 | "codigo": "ATSA", 844 | "nome": "HEDGE ATRIUM SHOPPING SANTO ANDRÉ", 845 | "cnpj": "12.809.972/0001-00", 846 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 847 | "cnpj_adm": "07.253.654/0001-76" 848 | }, 849 | { 850 | "codigo": "HGBS", 851 | "nome": "CSHG BRASIL SHOPPING", 852 | "cnpj": "08.431.747/0001-06", 853 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 854 | "cnpj_adm": "07.253.654/0001-76" 855 | }, 856 | { 857 | "codigo": "HLOG", 858 | "nome": "FII HEDGELOG", 859 | "cnpj": "27.486.542/0001-72", 860 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 861 | "cnpj_adm": "07.253.654/0001-76" 862 | }, 863 | { 864 | "codigo": "HRDF", 865 | "nome": "FII HREALTY", 866 | "cnpj": "16.929.519/0001-99", 867 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 868 | "cnpj_adm": "07.253.654/0001-76" 869 | }, 870 | { 871 | "codigo": "HPDP", 872 | "nome": "FII HEDGE RE", 873 | "cnpj": "35.586.415/0001-73", 874 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 875 | "cnpj_adm": "07.253.654/0001-76" 876 | }, 877 | { 878 | "codigo": "HMOC", 879 | "nome": "FII HEDMOCA", 880 | "cnpj": "14.733.211/0001-48", 881 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 882 | "cnpj_adm": "07.253.654/0001-76" 883 | }, 884 | { 885 | "codigo": "HFOF", 886 | "nome": "HEDGE TOP FOFII 3", 887 | "cnpj": "18.307.582/0001-19", 888 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 889 | "cnpj_adm": "07.253.654/0001-76" 890 | }, 891 | { 892 | "codigo": "TFOF", 893 | "nome": "HEDGE TOP FOFII ", 894 | "cnpj": "20.834.884/0001-97", 895 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 896 | "cnpj_adm": "07.253.654/0001-76" 897 | }, 898 | { 899 | "codigo": "HSML", 900 | "nome": "FII HSI MALL", 901 | "cnpj": "32.892.018/0001-31", 902 | "nome_adm": "SANTANDER SECURITIES SERVICES BRASIL DTVM S.A", 903 | "cnpj_adm": "62.318.407/0001-19" 904 | }, 905 | { 906 | "codigo": "BICR", 907 | "nome": "FII INTER", 908 | "cnpj": "34.007.109/0001-72", 909 | "nome_adm": "INTER DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS", 910 | "cnpj_adm": "18.945.670/0001-46" 911 | }, 912 | { 913 | "codigo": "RBBV", 914 | "nome": "JHSF RIO BRAVO FAZENDA BOA VISTA CAPITAL PROTEGIDO", 915 | "cnpj": "16.915.868/0001-51", 916 | "nome_adm": "CAIXA ECONOMICA FEDERAL", 917 | "cnpj_adm": "00.360.305/0001-04" 918 | }, 919 | { 920 | "codigo": "JPPA", 921 | "nome": "FII JPPMOGNO", 922 | "cnpj": "30.982.880/0001-00", 923 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 924 | "cnpj_adm": "22.610.500/0001-88" 925 | }, 926 | { 927 | "codigo": "JPPC", 928 | "nome": "JPP CAPITAL", 929 | "cnpj": "17.216.625/0001-98", 930 | "nome_adm": "BANCO FINAXIS S.A.", 931 | "cnpj_adm": "11.758.741/0001-52" 932 | }, 933 | { 934 | "codigo": "JSRE", 935 | "nome": "JS REAL ESTATE MULTIGESTÃO", 936 | "cnpj": "13.371.132/0001-71", 937 | "nome_adm": "BANCO J. SAFRA S.A.", 938 | "cnpj_adm": "03.017.677/0001-20" 939 | }, 940 | { 941 | "codigo": "JTPR", 942 | "nome": "JT PREV FII DESENVOLVIMENTO HABITACIONAL", 943 | "cnpj": "23.876.086/0001-16", 944 | "nome_adm": "PLANNER CORRETORA DE VALORES SA", 945 | "cnpj_adm": "00.806.535/0001-54" 946 | }, 947 | { 948 | "codigo": "KNHY", 949 | "nome": "KINEA HIGH YIELD CRI", 950 | "cnpj": "30.130.708/0001-28", 951 | "nome_adm": "INTRAG DTVM LTDA.", 952 | "cnpj_adm": "62.418.140/0001-31" 953 | }, 954 | { 955 | "codigo": "KNRE", 956 | "nome": "KINEA II REAL ESTATE EQUITY", 957 | "cnpj": "14.423.780/0001-97", 958 | "nome_adm": "INTRAG DTVM LTDA.", 959 | "cnpj_adm": "62.418.140/0001-31" 960 | }, 961 | { 962 | "codigo": "KNIP", 963 | "nome": "KINEA ÍNDICE DE PREÇOS", 964 | "cnpj": "24.960.430/0001-13", 965 | "nome_adm": "INTRAG DTVM LTDA.", 966 | "cnpj_adm": "62.418.140/0001-31" 967 | }, 968 | { 969 | "codigo": "KNRI", 970 | "nome": "KINEA RENDA IMOBILIÁRIA", 971 | "cnpj": "12.005.956/0001-65", 972 | "nome_adm": "INTRAG DTVM LTDA.", 973 | "cnpj_adm": "62.418.140/0001-31" 974 | }, 975 | { 976 | "codigo": "KNCR", 977 | "nome": "KINEA RENDIMENTOS IMOBILIÁRIOS", 978 | "cnpj": "16.706.958/0001-32", 979 | "nome_adm": "INTRAG DTVM LTDA.", 980 | "cnpj_adm": "62.418.140/0001-31" 981 | }, 982 | { 983 | "codigo": "LGCP", 984 | "nome": "FII LGCP INT", 985 | "cnpj": "34.598.181/0001-11", 986 | "nome_adm": "INTER DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS", 987 | "cnpj_adm": "18.945.670/0001-46" 988 | }, 989 | { 990 | "codigo": "LUGG", 991 | "nome": "FII LUGGO", 992 | "cnpj": "34.835.191/0001-23", 993 | "nome_adm": "INTER DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS", 994 | "cnpj_adm": "18.945.670/0001-46" 995 | }, 996 | { 997 | "codigo": "DMAC", 998 | "nome": "FII MAC", 999 | "cnpj": "30.579.348/0001-46", 1000 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1001 | "cnpj_adm": "36.113.876/0001-91" 1002 | }, 1003 | { 1004 | "codigo": "MALL", 1005 | "nome": "MALLS BRASIL PLURAL", 1006 | "cnpj": "26.499.833/0001-32", 1007 | "nome_adm": "GENIAL INVESTIMENTOS CORRETORA DE VALORES MOBILIÁRIOS S.A.", 1008 | "cnpj_adm": "27.652.684/0001-62" 1009 | }, 1010 | { 1011 | "codigo": "MXRF", 1012 | "nome": "MAXI RENDA", 1013 | "cnpj": "97.521.225/0001-25", 1014 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1015 | "cnpj_adm": "59.281.253/0001-23" 1016 | }, 1017 | { 1018 | "codigo": "MFII", 1019 | "nome": "MÉRITO DESENVOLVIMENTO IMOBILIÁRIO", 1020 | "cnpj": "16.915.968/0001-88", 1021 | "nome_adm": "PLANNER CORRETORA DE VALORES SA", 1022 | "cnpj_adm": "00.806.535/0001-54" 1023 | }, 1024 | { 1025 | "codigo": "PRTS", 1026 | "nome": "MULTI PROPERTIES FII", 1027 | "cnpj": "22.957.521/0001-74", 1028 | "nome_adm": "BANCO MODAL S.A.", 1029 | "cnpj_adm": "30.723.886/0001-62" 1030 | }, 1031 | { 1032 | "codigo": "SHOP", 1033 | "nome": "MULTI SHOPPINGS", 1034 | "cnpj": "22.459.737/0001-00", 1035 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1036 | "cnpj_adm": "59.281.253/0001-23" 1037 | }, 1038 | { 1039 | "codigo": "NEWL", 1040 | "nome": "FII NEWPORT", 1041 | "cnpj": "32.527.626/0001-47", 1042 | "nome_adm": "PLURAL S.A. BANCO MÚLTIPLO", 1043 | "cnpj_adm": "45.246.410/0001-55" 1044 | }, 1045 | { 1046 | "codigo": "OUJP", 1047 | "nome": "OURINVEST JPP", 1048 | "cnpj": "26.091.656/0001-50", 1049 | "nome_adm": "FINAXIS CORRETORA DE TÍTULOS E VALORES MOBILIÁRIOS S.A.", 1050 | "cnpj_adm": "03.317.692/0001-94" 1051 | }, 1052 | { 1053 | "codigo": "ORPD", 1054 | "nome": "OURO PRETO DESENVOLVIMENTO IMOBILIÁRIO I", 1055 | "cnpj": "19.107.604/0001-60", 1056 | "nome_adm": "PLANNER CORRETORA DE VALORES SA", 1057 | "cnpj_adm": "00.806.535/0001-54" 1058 | }, 1059 | { 1060 | "codigo": "PATC", 1061 | "nome": "FII PATRIA", 1062 | "cnpj": "30.048.651/0001-12", 1063 | "nome_adm": "MODAL D.T.V.M. LTDA", 1064 | "cnpj_adm": "05.389.174/0001-01" 1065 | }, 1066 | { 1067 | "codigo": "PLRI", 1068 | "nome": "POLO RECEBÍVEIS IMOBILIÁRIOS I", 1069 | "cnpj": "14.080.689/0001-16", 1070 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1071 | "cnpj_adm": "36.113.876/0001-91" 1072 | }, 1073 | { 1074 | "codigo": "PORD", 1075 | "nome": "POLO RECEBÍVEIS IMOBILIÁRIOS II", 1076 | "cnpj": "17.156.502/0001-09", 1077 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1078 | "cnpj_adm": "36.113.876/0001-91" 1079 | }, 1080 | { 1081 | "codigo": "PBLV", 1082 | "nome": "FII PROLOGIS", 1083 | "cnpj": "31.962.875/0001-06", 1084 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 1085 | "cnpj_adm": "13.486.793/0001-42" 1086 | }, 1087 | { 1088 | "codigo": "QAGR", 1089 | "nome": "FII QUASAR A", 1090 | "cnpj": "32.754.734/0001-52", 1091 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1092 | "cnpj_adm": "59.281.253/0001-23" 1093 | }, 1094 | { 1095 | "codigo": "RSPD", 1096 | "nome": "FII RBRESID3", 1097 | "cnpj": "19.249.989/0001-08", 1098 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1099 | "cnpj_adm": "36.113.876/0001-91" 1100 | }, 1101 | { 1102 | "codigo": "RBDS", 1103 | "nome": "RB CAPITAL DESENVOLVIMENTO RESIDENCIAL II", 1104 | "cnpj": "11.945.604/0001-27", 1105 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1106 | "cnpj_adm": "36.113.876/0001-91" 1107 | }, 1108 | { 1109 | "codigo": "RBGS", 1110 | "nome": "RB CAPITAL GENERAL SHOPPING SULACAP", 1111 | "cnpj": "13.652.006/0001-95", 1112 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1113 | "cnpj_adm": "36.113.876/0001-91" 1114 | }, 1115 | { 1116 | "codigo": "RBCO", 1117 | "nome": "FII R INCOME", 1118 | "cnpj": "31.894.369/0001-19", 1119 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 1120 | "cnpj_adm": "13.486.793/0001-42" 1121 | }, 1122 | { 1123 | "codigo": "RBRD", 1124 | "nome": "RB CAPITAL RENDA II", 1125 | "cnpj": "09.006.914/0001-34", 1126 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 1127 | "cnpj_adm": "03.384.738/0001-98" 1128 | }, 1129 | { 1130 | "codigo": "RBTS", 1131 | "nome": "FII RB TFO", 1132 | "cnpj": "29.299.737/0001-39", 1133 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1134 | "cnpj_adm": "36.113.876/0001-91" 1135 | }, 1136 | { 1137 | "codigo": "RBRF", 1138 | "nome": "RBR ALPHA FUNDO DE FUNDOS - FII", 1139 | "cnpj": "27.529.279/0001-51", 1140 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1141 | "cnpj_adm": "59.281.253/0001-23" 1142 | }, 1143 | { 1144 | "codigo": "DOMC", 1145 | "nome": "REAG RENDA IMOBILIÁRIA", 1146 | "cnpj": "17.374.696/0001-19", 1147 | "nome_adm": "MONETAR DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 1148 | "cnpj_adm": "12.063.256/0001-27" 1149 | }, 1150 | { 1151 | "codigo": "RBVO", 1152 | "nome": "RIO BRAVO CRÉDITO IMOBILIÁRIO II", 1153 | "cnpj": "15.769.670/0001-44", 1154 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 1155 | "cnpj_adm": "72.600.026/0001-81" 1156 | }, 1157 | { 1158 | "codigo": "RBFF", 1159 | "nome": "FII RIOB FF", 1160 | "cnpj": "17.329.029/0001-14", 1161 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 1162 | "cnpj_adm": "13.486.793/0001-42" 1163 | }, 1164 | { 1165 | "codigo": "SAAG", 1166 | "nome": "SANTANDER AGÊNCIAS", 1167 | "cnpj": "16.915.840/0001-14", 1168 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 1169 | "cnpj_adm": "72.600.026/0001-81" 1170 | }, 1171 | { 1172 | "codigo": "SADI", 1173 | "nome": "FII SANT PAP", 1174 | "cnpj": "32.903.521/0001-45", 1175 | "nome_adm": "SANTANDER SECURITIES SERVICES BRASIL DTVM S.A", 1176 | "cnpj_adm": "62.318.407/0001-19" 1177 | }, 1178 | { 1179 | "codigo": "SARE", 1180 | "nome": "FII SANT REN", 1181 | "cnpj": "32.903.702/0001-71", 1182 | "nome_adm": "SANTANDER SECURITIES SERVICES BRASIL DTVM S.A", 1183 | "cnpj_adm": "62.318.407/0001-19" 1184 | }, 1185 | { 1186 | "codigo": "FISD", 1187 | "nome": "SÃO DOMINGOS", 1188 | "cnpj": "16.543.270/0001-89", 1189 | "nome_adm": "RJI CORRETORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA", 1190 | "cnpj_adm": "42.066.258/0001-30" 1191 | }, 1192 | { 1193 | "codigo": "WPLZ", 1194 | "nome": "SHOPPING WEST PLAZA", 1195 | "cnpj": "09.326.861/0001-39", 1196 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 1197 | "cnpj_adm": "07.253.654/0001-76" 1198 | }, 1199 | { 1200 | "codigo": "REIT", 1201 | "nome": "SOCOPA FUNDO DE INVESTIMENTO IMOBILIÁRIO", 1202 | "cnpj": "16.841.067/0001-99", 1203 | "nome_adm": "SOCOPA SOCIEDADE CORRETORA PAULISTA SA", 1204 | "cnpj_adm": "62.285.390/0001-40" 1205 | }, 1206 | { 1207 | "codigo": "SPTW", 1208 | "nome": "SP DOWNTOWN", 1209 | "cnpj": "15.538.445/0001-05", 1210 | "nome_adm": "GENIAL INVESTIMENTOS CORRETORA DE VALORES MOBILIÁRIOS S.A.", 1211 | "cnpj_adm": "27.652.684/0001-62" 1212 | }, 1213 | { 1214 | "codigo": "SPAF", 1215 | "nome": "SPA FUNDO DE INVESTIMENTO IMOBILIÁRIO - FII", 1216 | "cnpj": "18.311.024/0001-27", 1217 | "nome_adm": "PLURAL S.A. BANCO MÚLTIPLO", 1218 | "cnpj_adm": "45.246.410/0001-55" 1219 | }, 1220 | { 1221 | "codigo": "STRX", 1222 | "nome": "FII STARX", 1223 | "cnpj": "11.044.355/0001-07", 1224 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1225 | "cnpj_adm": "36.113.876/0001-91" 1226 | }, 1227 | { 1228 | "codigo": "TSNC", 1229 | "nome": "TRANSINC", 1230 | "cnpj": "17.007.443/0001-07", 1231 | "nome_adm": "BANCO FINAXIS S.A.", 1232 | "cnpj_adm": "11.758.741/0001-52" 1233 | }, 1234 | { 1235 | "codigo": "TCPF", 1236 | "nome": "FII TREECORP", 1237 | "cnpj": "26.990.011/0001-50", 1238 | "nome_adm": "BR-CAPITAL DTVM S.A.", 1239 | "cnpj_adm": "44.077.014/0001-89" 1240 | }, 1241 | { 1242 | "codigo": "XTED", 1243 | "nome": "TRX EDIFÍCIOS CORPORATIVOS", 1244 | "cnpj": "15.006.267/0001-63", 1245 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1246 | "cnpj_adm": "59.281.253/0001-23" 1247 | }, 1248 | { 1249 | "codigo": "TRXF", 1250 | "nome": "FII TRX REAL", 1251 | "cnpj": "28.548.288/0001-52", 1252 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 1253 | "cnpj_adm": "13.486.793/0001-42" 1254 | }, 1255 | { 1256 | "codigo": "VGIR", 1257 | "nome": "VALORA RE III", 1258 | "cnpj": "29.852.732/0001-91", 1259 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1260 | "cnpj_adm": "59.281.253/0001-23" 1261 | }, 1262 | { 1263 | "codigo": "VLJS", 1264 | "nome": "VECTOR QUELUZ LAJES CORPORATIVAS", 1265 | "cnpj": "13.842.683/0001-76", 1266 | "nome_adm": "PLANNER CORRETORA DE VALORES SA", 1267 | "cnpj_adm": "00.806.535/0001-54" 1268 | }, 1269 | { 1270 | "codigo": "VILG", 1271 | "nome": "FII VINCILOG", 1272 | "cnpj": "24.853.044/0001-22", 1273 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 1274 | "cnpj_adm": "13.486.793/0001-42" 1275 | }, 1276 | { 1277 | "codigo": "VINO", 1278 | "nome": "FII VINC COR", 1279 | "cnpj": "12.516.185/0001-70", 1280 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 1281 | "cnpj_adm": "13.486.793/0001-42" 1282 | }, 1283 | { 1284 | "codigo": "VISC", 1285 | "nome": "VINCI SHOPPING CENTERS", 1286 | "cnpj": "17.554.274/0001-25", 1287 | "nome_adm": "BRL TRUST DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 1288 | "cnpj_adm": "13.486.793/0001-42" 1289 | }, 1290 | { 1291 | "codigo": "VOTS", 1292 | "nome": "VOTORANTIM SECURITIES MASTER", 1293 | "cnpj": "17.870.926/0001-30", 1294 | "nome_adm": "VOTORANTIM ASSET MANAGEMENT DTVM LTDA.", 1295 | "cnpj_adm": "03.384.738/0001-98" 1296 | }, 1297 | { 1298 | "codigo": "XPCM", 1299 | "nome": "XP CORPORATE MACAÉ", 1300 | "cnpj": "16.802.320/0001-03", 1301 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 1302 | "cnpj_adm": "72.600.026/0001-81" 1303 | }, 1304 | { 1305 | "codigo": "XPCI", 1306 | "nome": "FII XP CRED", 1307 | "cnpj": "28.516.301/0001-91", 1308 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 1309 | "cnpj_adm": "22.610.500/0001-88" 1310 | }, 1311 | { 1312 | "codigo": "XPHT", 1313 | "nome": "FII XP HOT", 1314 | "cnpj": "18.308.516/0001-63", 1315 | "nome_adm": "GENIAL INVESTIMENTOS CORRETORA DE VALORES MOBILIÁRIOS S.A.", 1316 | "cnpj_adm": "27.652.684/0001-62" 1317 | }, 1318 | { 1319 | "codigo": "XPIN", 1320 | "nome": "XP INDUSTRIAL", 1321 | "cnpj": "28.516.325/0001-40", 1322 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 1323 | "cnpj_adm": "22.610.500/0001-88" 1324 | }, 1325 | { 1326 | "codigo": "XPLG", 1327 | "nome": "XP LOG", 1328 | "cnpj": "26.502.794/0001-85", 1329 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 1330 | "cnpj_adm": "22.610.500/0001-88" 1331 | }, 1332 | { 1333 | "codigo": "XPML", 1334 | "nome": "XP MALLS", 1335 | "cnpj": "28.757.546/0001-00", 1336 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1337 | "cnpj_adm": "59.281.253/0001-23" 1338 | }, 1339 | { 1340 | "codigo": "XPPR", 1341 | "nome": "FII XP PROP", 1342 | "cnpj": "30.654.849/0001-40", 1343 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 1344 | "cnpj_adm": "22.610.500/0001-88" 1345 | }, 1346 | { 1347 | "codigo": "XPSF", 1348 | "nome": "FII XP SELEC", 1349 | "cnpj": "30.983.020/0001-90", 1350 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 1351 | "cnpj_adm": "22.610.500/0001-88" 1352 | }, 1353 | { 1354 | "codigo": "YCHY", 1355 | "nome": "FII YAGUARA", 1356 | "cnpj": "28.267.696/0001-36", 1357 | "nome_adm": "VORTX DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA.", 1358 | "cnpj_adm": "22.610.500/0001-88" 1359 | }, 1360 | { 1361 | "codigo": "ARFI", 1362 | "nome": "ÁQUILLA RENDA", 1363 | "cnpj": "14.069.202/0001-02", 1364 | "nome_adm": "FOCO DTVM LTDA.", 1365 | "cnpj_adm": "00.329.598/0001-67" 1366 | }, 1367 | { 1368 | "codigo": "BBFI", 1369 | "nome": "BB PROGRESSIVO", 1370 | "cnpj": "07.000.400/0001-46", 1371 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1372 | "cnpj_adm": "59.281.253/0001-23" 1373 | }, 1374 | { 1375 | "codigo": "CPTS", 1376 | "nome": "CAPITANIA SECURITIES II", 1377 | "cnpj": "18.979.895/0001-13", 1378 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1379 | "cnpj_adm": "59.281.253/0001-23" 1380 | }, 1381 | { 1382 | "codigo": "DAMT", 1383 | "nome": "FII DIAMANTE", 1384 | "cnpj": "26.642.727/0001-66", 1385 | "nome_adm": "BANCO MODAL S.A.", 1386 | "cnpj_adm": "30.723.886/0001-62" 1387 | }, 1388 | { 1389 | "codigo": "DOVL", 1390 | "nome": "FII DOVEL", 1391 | "cnpj": "10.522.648/0001-81", 1392 | "nome_adm": "BNY MELLON SERVICOS FINANCEIROS DTVM S.A.", 1393 | "cnpj_adm": "02.201.501/0001-61" 1394 | }, 1395 | { 1396 | "codigo": "ANCR", 1397 | "nome": "ANCAR CI", 1398 | "cnpj": "07.789.135/0001-27", 1399 | "nome_adm": "GENIAL INVESTIMENTOS CORRETORA DE VALORES MOBILIÁRIOS S.A.", 1400 | "cnpj_adm": "27.652.684/0001-62" 1401 | }, 1402 | { 1403 | "codigo": "BMLC", 1404 | "nome": "BM BRASCAN LAJES CORPORATIVAS", 1405 | "cnpj": "14.376.247/0001-11", 1406 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1407 | "cnpj_adm": "59.281.253/0001-23" 1408 | }, 1409 | { 1410 | "codigo": "FAMB", 1411 | "nome": "EDIFÍCIO ALMIRANTE BARROSO", 1412 | "cnpj": "05.562.312/0001-02", 1413 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1414 | "cnpj_adm": "59.281.253/0001-23" 1415 | }, 1416 | { 1417 | "codigo": "ELDO", 1418 | "nome": "ELDORADO", 1419 | "cnpj": "13.022.994/0001-99", 1420 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 1421 | "cnpj_adm": "72.600.026/0001-81" 1422 | }, 1423 | { 1424 | "codigo": "SHDP", 1425 | "nome": "SHOPPING PARQUE DOM PEDRO", 1426 | "cnpj": "07.224.019/0001-60", 1427 | "nome_adm": "BTG PACTUAL SERVIÇOS FINANCEIROS S/A DTVM", 1428 | "cnpj_adm": "59.281.253/0001-23" 1429 | }, 1430 | { 1431 | "codigo": "SAIC", 1432 | "nome": "SIA CORPORATE", 1433 | "cnpj": "17.311.079/0001-74", 1434 | "nome_adm": "BRB DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS S.A.", 1435 | "cnpj_adm": "33.850.686/0001-69" 1436 | }, 1437 | { 1438 | "codigo": "WTSP", 1439 | "nome": "OURINVEST RE I", 1440 | "cnpj": "28.693.595/0001-27", 1441 | "nome_adm": "BANCO OURINVEST S.A.", 1442 | "cnpj_adm": "78.632.767/0001-20" 1443 | }, 1444 | { 1445 | "codigo": "BRHT", 1446 | "nome": "BR HOTÉIS", 1447 | "cnpj": "15.461.076/0001-91", 1448 | "nome_adm": "ELITE CCVM LTDA", 1449 | "cnpj_adm": "28.048.783/0001-00" 1450 | }, 1451 | { 1452 | "codigo": "CXCE", 1453 | "nome": "CAIXA CEDAE", 1454 | "cnpj": "10.991.914/0001-15", 1455 | "nome_adm": "CAIXA ECONOMICA FEDERAL", 1456 | "cnpj_adm": "00.360.305/0001-04" 1457 | }, 1458 | { 1459 | "codigo": "EDFO", 1460 | "nome": "EDIFÍCIO OUROINVEST", 1461 | "cnpj": "06.175.262/0001-73", 1462 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1463 | "cnpj_adm": "36.113.876/0001-91" 1464 | }, 1465 | { 1466 | "codigo": "GESE", 1467 | "nome": "FII GEN SEV", 1468 | "cnpj": "17.007.528/0001-95", 1469 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1470 | "cnpj_adm": "36.113.876/0001-91" 1471 | }, 1472 | { 1473 | "codigo": "OULG", 1474 | "nome": "FII OURILOG", 1475 | "cnpj": "13.974.819/0001-00", 1476 | "nome_adm": "BANCO OURINVEST S.A.", 1477 | "cnpj_adm": "78.632.767/0001-20" 1478 | }, 1479 | { 1480 | "codigo": "LATR", 1481 | "nome": "LATERES", 1482 | "cnpj": "17.209.378/0001-00", 1483 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1484 | "cnpj_adm": "36.113.876/0001-91" 1485 | }, 1486 | { 1487 | "codigo": "LOFT", 1488 | "nome": "FII LOFT I", 1489 | "cnpj": "19.722.048/0001-31", 1490 | "nome_adm": "MODAL D.T.V.M. LTDA", 1491 | "cnpj_adm": "05.389.174/0001-01" 1492 | }, 1493 | { 1494 | "codigo": "DRIT", 1495 | "nome": "MULTIGESTÃO RENDA COMERCIAL", 1496 | "cnpj": "10.456.810/0001-00", 1497 | "nome_adm": "RIO BRAVO INVESTIMENTOS - DISTRIBUIDORA DE TITULOS E VALORES MOBILIARIOS LTDA", 1498 | "cnpj_adm": "72.600.026/0001-81" 1499 | }, 1500 | { 1501 | "codigo": "NVIF", 1502 | "nome": "FII NOVA I", 1503 | "cnpj": "22.003.469/0001-17", 1504 | "nome_adm": "MODAL D.T.V.M. LTDA", 1505 | "cnpj_adm": "05.389.174/0001-01" 1506 | }, 1507 | { 1508 | "codigo": "FTCE", 1509 | "nome": "OPORTUNITY", 1510 | "cnpj": "01.235.622/0001-61", 1511 | "nome_adm": "BNY MELLON SERVICOS FINANCEIROS DTVM S.A.", 1512 | "cnpj_adm": "02.201.501/0001-61" 1513 | }, 1514 | { 1515 | "codigo": "PRSN", 1516 | "nome": "LATERES", 1517 | "cnpj": "14.056.001/0001-62", 1518 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1519 | "cnpj_adm": "36.113.876/0001-91" 1520 | }, 1521 | { 1522 | "codigo": "FIIP", 1523 | "nome": "RB CAPITAL RENDA I", 1524 | "cnpj": "08.696.175/0001-97", 1525 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1526 | "cnpj_adm": "36.113.876/0001-91" 1527 | }, 1528 | { 1529 | "codigo": "RCRI", 1530 | "nome": "FII RB CRI", 1531 | "cnpj": "26.511.274/0001-39", 1532 | "nome_adm": "OLIVEIRA TRUST DTVM S.A.", 1533 | "cnpj_adm": "36.113.876/0001-91" 1534 | }, 1535 | { 1536 | "codigo": "FOFT", 1537 | "nome": "Hedge TOP FOFII 2", 1538 | "cnpj": "16.875.388/0001-04", 1539 | "nome_adm": "HEDGE INVESTMENTS DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS LTDA.", 1540 | "cnpj_adm": "07.253.654/0001-76" 1541 | } 1542 | ] 1543 | -------------------------------------------------------------------------------- /resources/json_helper.py: -------------------------------------------------------------------------------- 1 | """Helper to generate lists from Json.""" 2 | import json 3 | 4 | 5 | def convert_list_to_dict(assets, key, value_key): 6 | """Break down into dictionary.""" 7 | result = {} 8 | for asset in assets: 9 | codes = asset[key].split("-") 10 | for code in codes: 11 | result[code] = asset[value_key] 12 | return result 13 | 14 | 15 | # with open("etfs.json", "r") as json_file: 16 | # result = convert_list_to_dict(json.load(json_file), "Codigo", "Cnpj") 17 | # print(result) 18 | 19 | # with open("fiis.json", "r") as json_file: 20 | # result = convert_list_to_dict(json.load(json_file), "codigo", "cnpj") 21 | # print(result) 22 | 23 | # with open("empresas.json", "r") as json_file: 24 | # result = convert_list_to_dict(json.load(json_file), "codigo", "cnpj") 25 | # print(result) 26 | 27 | with open("corretoras.json") as json_file: 28 | result = convert_list_to_dict(json.load(json_file), "CodB3", "Cnpj") 29 | print(len(result)) 30 | print(result) 31 | -------------------------------------------------------------------------------- /src/irpf_cei/__init__.py: -------------------------------------------------------------------------------- 1 | """IRPF CEI.""" 2 | from importlib.metadata import version 3 | 4 | 5 | __version__ = version(__name__) 6 | -------------------------------------------------------------------------------- /src/irpf_cei/__main__.py: -------------------------------------------------------------------------------- 1 | """Command-line interface.""" 2 | from typing import Any 3 | from typing import List 4 | from typing import Tuple 5 | 6 | import click 7 | import inquirer 8 | 9 | import irpf_cei.cei 10 | import irpf_cei.formatting 11 | 12 | 13 | def select_trades(trades: List[Tuple[str, int]]) -> Any: 14 | """Checkbox selection of auction trades. 15 | 16 | Args: 17 | trades (List[Tuple[str, int]]): list of all trades and indexes. 18 | 19 | Returns: 20 | Any: list of indexes of selected auction trades. 21 | """ 22 | click.secho( 23 | ( 24 | "Para o cálculo dos emolumentos é necessário informar operações" 25 | "realizadas em horário de leilão. Essa informação é obtida com " 26 | "a sua corretora através de relatórios de ordem de compra." 27 | ), 28 | fg="green", 29 | ) 30 | while True: 31 | selection = inquirer.prompt( 32 | [ 33 | inquirer.Checkbox( 34 | "trades", 35 | message=( 36 | "Quais operações foram realizadas em horário de leilão? " 37 | "(Selecione apertando espaço e ao terminar aperte enter)" 38 | ), 39 | choices=trades, 40 | ) 41 | ] 42 | )["trades"] 43 | if len(selection) == 0: 44 | answer = inquirer.prompt( 45 | [ 46 | inquirer.List( 47 | "", 48 | message="Nenhuma operação selecionada.\nIsso está correto?", 49 | choices=["Sim", "Não"], 50 | ) 51 | ] 52 | )[""] 53 | if answer == "Sim": 54 | return [] 55 | else: 56 | return selection 57 | 58 | 59 | @click.command() 60 | @click.version_option() 61 | def main() -> None: 62 | """Sequecence of operations for trades.""" 63 | response = irpf_cei.formatting.set_pt_br_locale() 64 | if not response: 65 | click.secho( 66 | f"Erro: {response.value['message']}", 67 | fg="red", 68 | err=True, 69 | ) 70 | # Raises SystemExit 71 | raise click.ClickException("") 72 | filename = irpf_cei.cei.get_xls_filename() 73 | click.secho(f"Nome do arquivo: {filename}", fg="blue") 74 | 75 | ref_year, institution = irpf_cei.cei.validate_header(filename) 76 | source_df = irpf_cei.cei.read_xls(filename) 77 | source_df = irpf_cei.cei.clean_table_cols(source_df) 78 | source_df = irpf_cei.cei.group_trades(source_df) 79 | trades = irpf_cei.cei.get_trades(source_df) 80 | auction_trades = select_trades(trades) 81 | tax_df = irpf_cei.cei.calculate_taxes(source_df, auction_trades) 82 | irpf_cei.cei.output_taxes(tax_df) 83 | result_df = irpf_cei.cei.goods_and_rights(tax_df) 84 | irpf_cei.cei.output_goods_and_rights(result_df, ref_year, institution) 85 | 86 | 87 | if __name__ == "__main__": 88 | main() # pragma: no cover 89 | -------------------------------------------------------------------------------- /src/irpf_cei/b3.py: -------------------------------------------------------------------------------- 1 | """B3 module.""" 2 | import collections 3 | import datetime 4 | import sys 5 | from typing import List 6 | 7 | 8 | RatePeriod = collections.namedtuple("RatePeriod", ["start_date", "end_date", "rate"]) 9 | 10 | EMOLUMENTOS_PERIODS = [ 11 | RatePeriod( 12 | datetime.datetime(2019, 1, 3), datetime.datetime(2019, 2, 1), 0.00004476 13 | ), 14 | RatePeriod( 15 | datetime.datetime(2019, 2, 4), datetime.datetime(2019, 3, 1), 0.00004032 16 | ), 17 | RatePeriod( 18 | datetime.datetime(2019, 3, 6), datetime.datetime(2019, 4, 1), 0.00004157 19 | ), 20 | RatePeriod(datetime.datetime(2019, 4, 2), datetime.datetime(2019, 5, 2), 0.0000408), 21 | RatePeriod( 22 | datetime.datetime(2019, 5, 3), datetime.datetime(2019, 6, 3), 0.00004408 23 | ), 24 | RatePeriod( 25 | datetime.datetime(2019, 6, 4), datetime.datetime(2019, 7, 1), 0.00004245 26 | ), 27 | RatePeriod( 28 | datetime.datetime(2019, 7, 2), datetime.datetime(2019, 8, 1), 0.00004189 29 | ), 30 | RatePeriod( 31 | datetime.datetime(2019, 8, 2), datetime.datetime(2019, 9, 2), 0.00004115 32 | ), 33 | RatePeriod( 34 | datetime.datetime(2019, 9, 3), datetime.datetime(2019, 10, 1), 0.00003756 35 | ), 36 | RatePeriod( 37 | datetime.datetime(2019, 10, 2), datetime.datetime(2019, 11, 1), 0.00004105 38 | ), 39 | RatePeriod( 40 | datetime.datetime(2019, 11, 4), datetime.datetime(2019, 12, 2), 0.0000411 41 | ), 42 | RatePeriod( 43 | datetime.datetime(2019, 12, 3), datetime.datetime(2020, 1, 1), 0.00003802 44 | ), 45 | RatePeriod(datetime.datetime(2020, 1, 1), datetime.datetime(2020, 2, 1), 0.0000366), 46 | RatePeriod( 47 | datetime.datetime(2020, 2, 1), datetime.datetime(2020, 3, 1), 0.00003462 48 | ), 49 | RatePeriod( 50 | datetime.datetime(2020, 3, 1), datetime.datetime(2020, 4, 1), 0.00003248 51 | ), 52 | RatePeriod( 53 | datetime.datetime(2020, 4, 1), datetime.datetime(2020, 5, 1), 0.00003006 54 | ), 55 | RatePeriod(datetime.datetime(2020, 5, 1), datetime.datetime(2020, 6, 3), 0.0000334), 56 | RatePeriod( 57 | datetime.datetime(2020, 6, 1), datetime.datetime(2020, 7, 1), 0.00003291 58 | ), 59 | RatePeriod( 60 | datetime.datetime(2020, 7, 1), datetime.datetime(2020, 8, 1), 0.00003089 61 | ), 62 | RatePeriod(datetime.datetime(2020, 8, 1), datetime.datetime(2020, 9, 1), 0.0000318), 63 | RatePeriod( 64 | datetime.datetime(2020, 9, 1), datetime.datetime(2020, 10, 1), 0.00003125 65 | ), 66 | RatePeriod( 67 | datetime.datetime(2020, 10, 1), datetime.datetime(2020, 11, 1), 0.00003219 68 | ), 69 | RatePeriod( 70 | datetime.datetime(2020, 11, 1), datetime.datetime(2020, 12, 1), 0.00003247 71 | ), 72 | RatePeriod( 73 | datetime.datetime(2020, 12, 1), datetime.datetime(2021, 1, 1), 0.00003020 74 | ), 75 | ] 76 | EMOLUMENTOS_AUCTION_RATE = 0.00007 77 | LIQUIDACAO_RATE = 0.000275 78 | 79 | AssetInfo = collections.namedtuple("AssetInfo", ["category", "cnpj"]) 80 | 81 | ETFS = { 82 | "BBSD": "17.817.528/0001-50", 83 | "XBOV": "14.120.533/0001-11", 84 | "BOVB": "32.203.211/0001-18", 85 | "IVVB": "19.909.560/0001-91", 86 | "BOVA": "10.406.511/0001-61", 87 | "BRAX": "11.455.378/0001-04", 88 | "ECOO": "15.562.377/0001-01", 89 | "SMAL": "10.406.600/0001-08", 90 | "BOVV": "21.407.758/0001-19", 91 | "DIVO": "13.416.245/0001-46", 92 | "FIND": "11.961.094/0001-81", 93 | "GOVE": "11.184.136/0001-15", 94 | "MATB": "13.416.228/0001-09", 95 | "ISUS": "12.984.444/0001-98", 96 | "PIBB": "06.323.688/0001-27", 97 | "SMAC": "34.803.814/0001-86", 98 | "SPXI": "17.036.289/0001-00", 99 | } 100 | FIIS = { 101 | "ALZR": "28.737.771/0001-85", 102 | "AQLL": "13.555.918/0001-49", 103 | "BCRI": "22.219.335/0001-38", 104 | "BNFS": "15.570.431/0001-60", 105 | "BBPO": "14.410.722/0001-29", 106 | "BBIM": "20.716.161/0001-93", 107 | "BBRC": "12.681.340/0001-04", 108 | "RDPD": "23.120.027/0001-13", 109 | "RNDP": "15.394.563/0001-89", 110 | "BCIA": "20.216.935/0001-17", 111 | "BZLI": "14.074.706/0001-02", 112 | "CARE": "13.584.584/0001-31", 113 | "BRCO": "20.748.515/0001-81", 114 | "BTLG": "11.839.593/0001-09", 115 | "CRFF": "31.887.401/0001-39", 116 | "CXRI": "17.098.794/0001-70", 117 | "CPFF": "34.081.611/0001-23", 118 | "CBOP": "17.144.039/0001-85", 119 | "GRLV": "17.143.998/0001-86", 120 | "HGFF": "32.784.898/0001-22", 121 | "HGLG": "11.728.688/0001-47", 122 | "HGPO": "11.260.134/0001-68", 123 | "HGRE": "09.072.017/0001-29", 124 | "HGCR": "11.160.521/0001-22", 125 | "HGRU": "29.641.226/0001-53", 126 | "ERPA": "31.469.385/0001-64", 127 | "KINP": "24.070.076/0001-51", 128 | "VRTA": "11.664.201/0001-00", 129 | "BMII": "02.027.437/0001-44", 130 | "BTCR": "29.787.928/0001-40", 131 | "FAED": "11.179.118/0001-45", 132 | "BPRP": "29.800.650/0001-01", 133 | "BRCR": "08.924.783/0001-01", 134 | "FEXC": "09.552.812/0001-14", 135 | "BCFF": "11.026.627/0001-38", 136 | "FCFL": "11.602.654/0001-01", 137 | "CNES": "13.551.286/0001-45", 138 | "CEOC": "15.799.397/0001-09", 139 | "THRA": "13.966.653/0001-71", 140 | "EDGA": "15.333.306/0001-37", 141 | "FLRP": "10.375.382/0001-91", 142 | "HCRI": "04.066.582/0001-60", 143 | "NSLU": "08.014.513/0001-63", 144 | "HTMX": "08.706.065/0001-69", 145 | "MAXR": "11.274.415/0001-70", 146 | "NCHB": "18.085.673/0001-57", 147 | "NVHO": "17.025.970/0001-44", 148 | "PQDP": "10.869.155/0001-12", 149 | "PRSV": "11.281.322/0001-72", 150 | "RBRM": "26.314.437/0001-93", 151 | "RBRR": "29.467.977/0001-03", 152 | "JRDM": "14.879.856/0001-93", 153 | "TBOF": "17.365.105/0001-47", 154 | "ALMI": "07.122.725/0001-00", 155 | "TRNT": "04.722.883/0001-02", 156 | "RECT": "32.274.163/0001-59", 157 | "UBSR": "28.152.272/0001-26", 158 | "VLOL": "15.296.696/0001-12", 159 | "OUFF": "30.791.386/0001-68", 160 | "VVPR": "33.045.581/0001-37", 161 | "LVBI": "30.629.603/0001-18", 162 | "BARI": "29.267.567/0001-00", 163 | "BBVJ": "10.347.985/0001-80", 164 | "BPFF": "17.324.357/0001-28", 165 | "BVAR": "21.126.204/0001-43", 166 | "BPML": "33.046.142/0001-49", 167 | "CXTL": "12.887.506/0001-43", 168 | "CTXT": "00.762.723/0001-28", 169 | "FLMA": "04.141.645/0001-03", 170 | "EURO": "05.437.916/0001-27", 171 | "FIGS": "17.590.518/0001-25", 172 | "ABCP": "01.201.140/0001-90", 173 | "GTWR": "23.740.527/0001-58", 174 | "HBTT": "26.846.202/0001-42", 175 | "HUSC": "28.851.767/0001-43", 176 | "FIIB": "14.217.108/0001-45", 177 | "FINF": "18.369.510/0001-04", 178 | "FMOF": "01.633.741/0001-72", 179 | "MBRF": "13.500.306/0001-59", 180 | "MGFF": "29.216.463/0001-77", 181 | "NPAR": "24.814.916/0001-43", 182 | "PABY": "00.613.094/0001-74", 183 | "FPNG": "17.161.979/0001-82", 184 | "VPSI": "14.721.889/0001-00", 185 | "FPAB": "03.251.720/0001-18", 186 | "RBRY": "30.166.700/0001-11", 187 | "RBRP": "21.408.063/0001-51", 188 | "RCRB": "03.683.056/0001-86", 189 | "RBED": "13.873.457/0001-52", 190 | "RBVA": "15.576.907/0001-70", 191 | "RNGO": "15.006.286/0001-90", 192 | "SFND": "09.350.920/0001-04", 193 | "FISC": "12.804.013/0001-00", 194 | "SCPF": "01.657.856/0001-05", 195 | "SDIL": "16.671.412/0001-93", 196 | "SHPH": "03.507.519/0001-59", 197 | "TGAR": "25.032.881/0001-53", 198 | "ONEF": "12.948.291/0001-23", 199 | "TOUR": "30.578.316/0001-26", 200 | "FVBI": "13.022.993/0001-44", 201 | "VERE": "08.693.497/0001-82", 202 | "FVPQ": "00.332.266/0001-31", 203 | "FIVN": "17.854.016/0001-64", 204 | "VTLT": "27.368.600/0001-63", 205 | "VSHO": "23.740.595/0001-17", 206 | "IBFF": "33.721.517/0001-29", 207 | "PLCR": "32.527.683/0001-26", 208 | "CVBI": "28.729.197/0001-13", 209 | "MCCI": "23.648.935/0001-84", 210 | "ARRI": "32.006.821/0001-21", 211 | "HOSI": "34.081.631/0001-02", 212 | "IRDM": "28.830.325/0001-10", 213 | "KFOF": "30.091.444/0001-40", 214 | "OUCY": "28.516.650/0001-03", 215 | "GSFI": "11.769.604/0001-13", 216 | "GGRC": "26.614.291/0001-00", 217 | "RCFA": "27.771.586/0001-44", 218 | "HABT": "30.578.417/0001-05", 219 | "ATCR": "14.631.148/0001-39", 220 | "HCTR": "30.248.180/0001-96", 221 | "ATSA": "12.809.972/0001-00", 222 | "HGBS": "08.431.747/0001-06", 223 | "HLOG": "27.486.542/0001-72", 224 | "HRDF": "16.929.519/0001-99", 225 | "HPDP": "35.586.415/0001-73", 226 | "HMOC": "14.733.211/0001-48", 227 | "HFOF": "18.307.582/0001-19", 228 | "TFOF": "20.834.884/0001-97", 229 | "HSML": "32.892.018/0001-31", 230 | "BICR": "34.007.109/0001-72", 231 | "RBBV": "16.915.868/0001-51", 232 | "JPPA": "30.982.880/0001-00", 233 | "JPPC": "17.216.625/0001-98", 234 | "JSRE": "13.371.132/0001-71", 235 | "JTPR": "23.876.086/0001-16", 236 | "KNHY": "30.130.708/0001-28", 237 | "KNRE": "14.423.780/0001-97", 238 | "KNIP": "24.960.430/0001-13", 239 | "KNRI": "12.005.956/0001-65", 240 | "KNCR": "16.706.958/0001-32", 241 | "LGCP": "34.598.181/0001-11", 242 | "LUGG": "34.835.191/0001-23", 243 | "DMAC": "30.579.348/0001-46", 244 | "MALL": "26.499.833/0001-32", 245 | "MXRF": "97.521.225/0001-25", 246 | "MFII": "16.915.968/0001-88", 247 | "PRTS": "22.957.521/0001-74", 248 | "SHOP": "22.459.737/0001-00", 249 | "NEWL": "32.527.626/0001-47", 250 | "OUJP": "26.091.656/0001-50", 251 | "ORPD": "19.107.604/0001-60", 252 | "PATC": "30.048.651/0001-12", 253 | "PLRI": "14.080.689/0001-16", 254 | "PORD": "17.156.502/0001-09", 255 | "PBLV": "31.962.875/0001-06", 256 | "QAGR": "32.754.734/0001-52", 257 | "RSPD": "19.249.989/0001-08", 258 | "RBDS": "11.945.604/0001-27", 259 | "RBGS": "13.652.006/0001-95", 260 | "RBCO": "31.894.369/0001-19", 261 | "RBRD": "09.006.914/0001-34", 262 | "RBTS": "29.299.737/0001-39", 263 | "RBRF": "27.529.279/0001-51", 264 | "DOMC": "17.374.696/0001-19", 265 | "RBVO": "15.769.670/0001-44", 266 | "RBFF": "17.329.029/0001-14", 267 | "SAAG": "16.915.840/0001-14", 268 | "SADI": "32.903.521/0001-45", 269 | "SARE": "32.903.702/0001-71", 270 | "FISD": "16.543.270/0001-89", 271 | "WPLZ": "09.326.861/0001-39", 272 | "REIT": "16.841.067/0001-99", 273 | "SPTW": "15.538.445/0001-05", 274 | "SPAF": "18.311.024/0001-27", 275 | "STRX": "11.044.355/0001-07", 276 | "TSNC": "17.007.443/0001-07", 277 | "TCPF": "26.990.011/0001-50", 278 | "XTED": "15.006.267/0001-63", 279 | "TRXF": "28.548.288/0001-52", 280 | "VGIR": "29.852.732/0001-91", 281 | "VLJS": "13.842.683/0001-76", 282 | "VILG": "24.853.044/0001-22", 283 | "VINO": "12.516.185/0001-70", 284 | "VISC": "17.554.274/0001-25", 285 | "VOTS": "17.870.926/0001-30", 286 | "XPCM": "16.802.320/0001-03", 287 | "XPCI": "28.516.301/0001-91", 288 | "XPHT": "18.308.516/0001-63", 289 | "XPIN": "28.516.325/0001-40", 290 | "XPLG": "26.502.794/0001-85", 291 | "XPML": "28.757.546/0001-00", 292 | "XPPR": "30.654.849/0001-40", 293 | "XPSF": "30.983.020/0001-90", 294 | "YCHY": "28.267.696/0001-36", 295 | "ARFI": "14.069.202/0001-02", 296 | "BBFI": "07.000.400/0001-46", 297 | "CPTS": "18.979.895/0001-13", 298 | "DAMT": "26.642.727/0001-66", 299 | "DOVL": "10.522.648/0001-81", 300 | "ANCR": "07.789.135/0001-27", 301 | "BMLC": "14.376.247/0001-11", 302 | "FAMB": "05.562.312/0001-02", 303 | "ELDO": "13.022.994/0001-99", 304 | "SHDP": "07.224.019/0001-60", 305 | "SAIC": "17.311.079/0001-74", 306 | "WTSP": "28.693.595/0001-27", 307 | "BRHT": "15.461.076/0001-91", 308 | "CXCE": "10.991.914/0001-15", 309 | "EDFO": "06.175.262/0001-73", 310 | "GESE": "17.007.528/0001-95", 311 | "OULG": "13.974.819/0001-00", 312 | "LATR": "17.209.378/0001-00", 313 | "LOFT": "19.722.048/0001-31", 314 | "DRIT": "10.456.810/0001-00", 315 | "NVIF": "22.003.469/0001-17", 316 | "FTCE": "01.235.622/0001-61", 317 | "PRSN": "14.056.001/0001-62", 318 | "FIIP": "08.696.175/0001-97", 319 | "RCRI": "26.511.274/0001-39", 320 | "FOFT": "16.875.388/0001-04", 321 | } 322 | STOCKS = { 323 | "AALR3": "42.771.949/0001-35", 324 | "ABCB4": "28.195.667/0001-06", 325 | "ABEV3": "07.526.557/0001-00", 326 | "ADHM3": "10.345.009/0001-98", 327 | "AGRO3": "07.628.528/0001-59", 328 | "ALPA3": "61.079.117/0001-05", 329 | "ALPA4": "61.079.117/0001-05", 330 | "ALSC3": "06.082.980/0001-03", 331 | "ALUP11": "08.364.948/0001-38", 332 | "ALUP3": "08.364.948/0001-38", 333 | "ALUP4": "08.364.948/0001-38", 334 | "AMAR3": "61.189.288/0001-89", 335 | "ANIM3": "09.288.252/0001-32", 336 | "ARZZ3": "16.590.234/0001-76", 337 | "ATOM3": "00.359.742/0001-08", 338 | "AZUL4": "09.305.994/0001-29", 339 | "B3SA3": "09.346.601/0001-25", 340 | "BAUH3": "95.426.862/0001-97", 341 | "BAUH4": "95.426.862/0001-97", 342 | "BBAS3": "00.000.000/0001-91", 343 | "BBDC3": "60.746.948/0001-12", 344 | "BBDC4": "60.746.948/0001-12", 345 | "BBRK3": "08.613.550/0001-98", 346 | "BBSE3": "17.344.597/0001-94", 347 | "BEEF3": "67.620.377/0001-14", 348 | "BIDI4": "18.945.670/0001-46", 349 | "BIDI11": "18.945.670/0001-46", 350 | "BOBR3": "50.564.053/0001-03", 351 | "BOBR4": "50.564.053/0001-03", 352 | "BPAC11": "30.306.294/0001-45", 353 | "BPAC3": "30.306.294/0001-45", 354 | "BPAC5": "30.306.294/0001-45", 355 | "BPAN4": "59.285.411/0001-13", 356 | "BPHA3": "11.395.624/0001-71", 357 | "BRAP3": "03.847.461/0001-92", 358 | "BRAP4": "03.847.461/0001-92", 359 | "BRDT3": "34.274.233/0001-02", 360 | "BRFS3": "01.838.723/0001-27", 361 | "BRIN3": "11.721.921/0001-60", 362 | "BRKM3": "42.150.391/0001-70", 363 | "BRKM5": "42.150.391/0001-70", 364 | "BRKM6": "42.150.391/0001-70", 365 | "BRML3": "06.977.745/0001-91", 366 | "BRPR3": "06.977.751/0001-49", 367 | "BMGB4": "61.186.680/0001-74", 368 | "BRSR3": "92.702.067/0001-96", 369 | "BRSR5": "92.702.067/0001-96", 370 | "BRSR6 ": "92.702.067/0001-96", 371 | "BSEV3": "15.527.906/0001-36", 372 | "BTOW3": "00.776.574/0001-56", 373 | "CAML3": "64.904.295/0001-03", 374 | "CARD3": "01.896.779/0001-38", 375 | "CCRO3": "02.846.056/0001-97", 376 | "CCXC3": "07.950.674/0001-04", 377 | "CEPE3": "10.835.932/0001-08", 378 | "CEPE5": "10.835.932/0001-08", 379 | "CEPE6": "10.835.932/0001-08", 380 | "CESP3": "60.933.603/0001-78", 381 | "CESP5": "60.933.603/0001-78", 382 | "CESP6": "60.933.603/0001-78", 383 | "CGAS3": "61.856.571/0001-17", 384 | "CGAS5": "61.856.571/0001-17", 385 | "CGRA3": "92.012.467/0001-70", 386 | "CGRA4": "92.012.467/0001-70", 387 | "CIEL3": "01.027.058/0001-91", 388 | "CMIG3": "17.155.730/0001-64", 389 | "CMIG4": "17.155.730/0001-64", 390 | "CNTO3": "13.217.485/0001-11", 391 | "COCE3": "07.047.251/0001-70", 392 | "COCE5": "07.047.251/0001-70", 393 | "COCE6": "07.047.251/0001-70", 394 | "CPFE3": "02.429.144/0001-93", 395 | "CREM3": "82.641.325/0001-18", 396 | "CRFB3": "75.315.333/0001-09", 397 | "CSAN3": "50.746.577/0001-15", 398 | "CSMG3": "17.281.106/0001-03", 399 | "CSNA3": "33.042.730/0001-04", 400 | "CEAB3": "45.242.914/0001-05", 401 | "CTKA3": "82.640.558/0001-04", 402 | "CTKA4": "82.640.558/0001-04", 403 | "CTNM3": "22.677.520/0001-76", 404 | "CTNM4": "22.677.520/0001-76", 405 | "CVCB3": "10.760.260/0001-19", 406 | "CYRE3": "73.178.600/0001-18", 407 | "DAGB33": "11.423.623/0001-93", 408 | "DIRR3": "16.614.075/0001-00", 409 | "DMMO3": "08.926.302/0001-05", 410 | "DTEX3": "97.837.181/0001-47", 411 | "ECOR3": "04.149.454/0001-80", 412 | "EGIE3": "02.474.103/0001-19", 413 | "ELEK3": "13.788.120/0001-47", 414 | "ELEK4": "13.788.120/0001-47", 415 | "ELPL3": "61.695.227/0001-93", 416 | "ELET3": "00.001.180/0001-26", 417 | "ELET6": "00.001.180/0001-26", 418 | "EMBR3": "07.689.002/0001-89", 419 | "ENBR3": "03.983.431/0001-03", 420 | "ENEV3": "04.423.567/0001-21", 421 | "ENGI11": "00.864.214/0001-06", 422 | "ENGI3": "00.864.214/0001-06", 423 | "ENGI4": "00.864.214/0001-06", 424 | "EQTL3": "03.220.438/0001-73", 425 | "YDUQ3": "08.807.432/0001-10", 426 | "ESTR3": "61.082.004/0001-50", 427 | "ESTR4": "61.082.004/0001-50", 428 | "ETER3": "61.092.037/0001-81", 429 | "EUCA3": "56.643.018/0001-66", 430 | "EUCA4": "56.643.018/0001-66", 431 | "EVEN3": "43.470.988/0001-65", 432 | "EZTC3": "08.312.229/0001-73", 433 | "FESA3": "15.141.799/0001-03", 434 | "FESA4": "15.141.799/0001-03", 435 | "FHER3": "22.266.175/0001-88", 436 | "TASA3": "92.781.335/0001-02", 437 | "TASA4": "92.781.335/0001-02", 438 | "FJTA3": "92.781.335/0001-02", 439 | "FJTA4": "92.781.335/0001-02", 440 | "FLRY3": "60.840.055/0001-31", 441 | "FRAS3": "88.610.126/0001-29", 442 | "GNDI3": "19.853.511/0001-84", 443 | "HAPV3": "63.554.067/0001-98", 444 | "FRIO3": "04.821.041/0001-08", 445 | "GEPA3": "02.998.301/0001-81", 446 | "GEPA4": "02.998.301/0001-81", 447 | "GFSA3": "01.545.826/0001-07", 448 | "GGBR3": "33.611.500/0001-19", 449 | "GGBR4": "33.611.500/0001-19", 450 | "GOAU3": "92.690.783/0001-09", 451 | "GOAU4": "92.690.783/0001-09", 452 | "GOLL4": "06.164.253/0001-87", 453 | "GRND3": "89.850.341/0001-60", 454 | "GSHP3": "08.764.621/0001-53", 455 | "GUAR3": "08.402.943/0001-52", 456 | "GUAR4": "08.402.943/0001-52", 457 | "HBOR3": "49.263.189/0001-02", 458 | "HGTX3": "78.876.950/0001-71", 459 | "HYPE3": "02.932.074/0001-91", 460 | "HOOT3": "33.200.049/0001-47", 461 | "HOOT4": "33.200.049/0001-47", 462 | "IDNT3": "02.365.069/0001-44", 463 | "IGTA3": "51.218.147/0001-93", 464 | "IRBR3": "33.376.989/0001-91", 465 | "ITSA3": "61.532.644/0001-15", 466 | "ITSA4": "61.532.644/0001-15", 467 | "ITUB3": "60.872.504/0001-23", 468 | "ITUB4": "60.872.504/0001-23", 469 | "JBSS3": "02.916.265/0001-60", 470 | "JHSF3": "08.294.224/0001-65", 471 | "JSLG3": "52.548.435/0001-79", 472 | "KEPL3": "91.983.056/0001-69", 473 | "KLBN11": "89.637.490/0001-45", 474 | "KLBN3": "89.637.490/0001-45", 475 | "KLBN4": "89.637.490/0001-45", 476 | "COGN3": "02.800.026/0001-40", 477 | "KROT3": "02.800.026/0001-40", 478 | "LAME3": "33.014.556/0001-96", 479 | "LAME4": "33.014.556/0001-96", 480 | "LCAM3": "10.215.988/0001-60", 481 | "LEVE3": "60.476.884/0001-87", 482 | "LIGT3": "03.378.521/0001-75", 483 | "LINX3": "06.948.969/0001-75", 484 | "LLIS3": "49.669.856/0001-43", 485 | "LIQO3": "04.032.433/0001-80", 486 | "LOGG3": "09.041.168/0001-10", 487 | "LOGN3": "42.278.291/0001-24", 488 | "LPSB3": "08.078.847/0001-09", 489 | "LREN3": "92.754.738/0001-62", 490 | "LUPA3": "89.463.822/0001-12", 491 | "MAGG3": "08.684.547/0001-65", 492 | "MDIA3": "07.206.816/0001-15", 493 | "MGLU3": "47.960.950/0001-21", 494 | "MILS3": "27.093.558/0001-15", 495 | "MMXM3": "02.762.115/0001-49", 496 | "MNDL3": "88.610.191/0001-54", 497 | "MOVI3": "21.314.559/0001-66", 498 | "MPLU3": "11.094.546/0001-75", 499 | "MRFG3": "03.853.896/0001-40", 500 | "MRVE3": "08.343.492/0001-20", 501 | "MULT3": "07.816.890/0001-53", 502 | "MYPK3": "61.156.113/0001-75", 503 | "NAFG3": "61.067.161/0001-97", 504 | "NAFG4": "61.067.161/0001-97", 505 | "NATU3": "71.673.990/0001-77", 506 | "ODPV3": "58.119.199/0001-51", 507 | "OFSA3": "20.258.278/0001-70", 508 | "OIBR3": "76.535.764/0001-43", 509 | "OIBR4": "76.535.764/0001-43", 510 | "OSXB3": "09.112.685/0001-32", 511 | "PARD3": "19.378.769/0001-76", 512 | "PCAR3": "47.508.411/0001-56", 513 | "PCAR4": "47.508.411/0001-56", 514 | "PDGR3": "02.950.811/0001-89", 515 | "PETR3": "33.000.167/0001-01", 516 | "PETR4": "33.000.167/0001-01", 517 | "PFRM3": "45.453.214/0001-51", 518 | "PINE3": "62.144.175/0001-20", 519 | "PINE4": "62.144.175/0001-20", 520 | "PMAM3": "60.398.369/0004-79", 521 | "POMO3": "88.611.835/0001-29", 522 | "POMO4": "88.611.835/0001-29", 523 | "POSI3": "81.243.735/0001-48", 524 | "PRIO3": "10.629.105/0001-68", 525 | "PRML3": "08.741.499/0001-08", 526 | "PSSA3": "02.149.205/0001-69", 527 | "QGEP3": "11.669.021/0001-10", 528 | "QUAL3": "11.992.680/0001-93", 529 | "RADL3": "61.585.865/0001-51", 530 | "RAIL3": "02.387.241/0001-60", 531 | "RAPT3": "89.086.144/0001-16", 532 | "RAPT4": "89.086.144/0001-16", 533 | "RCSL3": "91.333.666/0001-17", 534 | "RCSL4": "91.333.666/0001-17", 535 | "REDE3": "61.584.140/0001-49", 536 | "RENT3": "16.670.085/0001-55", 537 | "RNEW11": "08.534.605/0001-74", 538 | "RNEW3": "08.534.605/0001-74", 539 | "RNEW4": "08.534.605/0001-74", 540 | "ROMI3": "56.720.428/0001-63", 541 | "RPMG3": "33.412.081/0001-96", 542 | "RSID3": "61.065.751/0001-80", 543 | "SANB11": "90.400.888/0001-42", 544 | "SANB3": "90.400.888/0001-42", 545 | "SANB4": "90.400.888/0001-42", 546 | "SAPR11": "76.484.013/0001-45", 547 | "SAPR3": "76.484.013/0001-45", 548 | "SAPR4": "76.484.013/0001-45", 549 | "SBSP3": "43.776.517/0001-80", 550 | "SCAR3": "29.780.061/0001-09", 551 | "SEDU3": "02.541.982/0001-54", 552 | "SEER3": "04.986.320/0001-13", 553 | "SGPS3": "07.718.269/0001-57", 554 | "SHOW3": "02.860.694/0001-62", 555 | "SHUL3": "84.693.183/0001-68", 556 | "SHUL4": "84.693.183/0001-68", 557 | "SLCE3": "89.096.457/0001-55", 558 | "SLED3": "60.500.139/0001-26", 559 | "SLED4": "60.500.139/0001-26", 560 | "SMLS3": "05.730.375/0001-20", 561 | "SMTO3": "51.466.860/0001-56", 562 | "SQIA3": "04.065.791/0001-99", 563 | "SNSL3": "04.065.791/0001-99", 564 | "SSBR3": "05.878.397/0001-32", 565 | "STBP3": "02.762.121/0001-04", 566 | "SULA11": "29.978.814/0001-87", 567 | "SULA3": "29.978.814/0001-87", 568 | "SULA4": "29.978.814/0001-87", 569 | "SUZB3": "16.404.287/0001-55", 570 | "TAEE11": "07.859.971/0001-30", 571 | "TAEE3": "07.859.971/0001-30", 572 | "TAEE4": "07.859.971/0001-30", 573 | "TCNO3": "33.111.246/0001-90", 574 | "TCNO4": "33.111.246/0001-90", 575 | "TCSA3": "08.065.557/0001-12", 576 | "TECN3": "09.295.063/0001-97", 577 | "TEKA3": "82.636.986/0001-55", 578 | "TEKA4": "82.636.986/0001-55", 579 | "TEND3": "71.476.527/0001-35", 580 | "TGMA3": "02.351.144/0001-18", 581 | "TIET11": "04.128.563/0001-10", 582 | "TIET3": "04.128.563/0001-10", 583 | "TIET4": "04.128.563/0001-10", 584 | "TIMP3": "02.558.115/0001-21", 585 | "TOTS3": "53.113.791/0001-22", 586 | "TOYB3": "22.770.366/0001-82", 587 | "TOYB4": "22.770.366/0001-82", 588 | "TPIS3": "03.014.553/0001-91", 589 | "TRIS3": "08.811.643/0001-27", 590 | "TRPL3": "02.998.611/0001-04", 591 | "TRPL4": "02.998.611/0001-04", 592 | "TRPN3": "05.341.549/0001-63", 593 | "TUPY3": "84.683.374/0001-49", 594 | "UCAS3": "90.441.460/0001-48", 595 | "UGPA3": "33.256.439/0001-39", 596 | "UNIP6": "33.958.695/0001-78", 597 | "USIM3": "60.894.730/0001-05", 598 | "USIM5": "60.894.730/0001-05", 599 | "USIM6": "60.894.730/0001-05", 600 | "VALE3": "33.592.510/0001-54", 601 | "VIVA3": "84.453.844/0342-44", 602 | "VIVR3": "67.571.414/0001-41", 603 | "VIVT3": "02.558.157/0001-62", 604 | "VIVT4": "02.558.157/0001-62", 605 | "VLID3": "33.113.309/0001-47", 606 | "VULC3": "50.926.955/0001-42", 607 | "VVAR11": "33.041.260/0652-90", 608 | "VVAR3": "33.041.260/0652-90", 609 | "VVAR4": "33.041.260/0652-90", 610 | "WEGE3": "84.429.695/0001-11", 611 | "WHRL3": "59.105.999/0001-86", 612 | "WHRL4": "59.105.999/0001-86", 613 | "WIZS3": "42.278.473/0001-03", 614 | "WSON33": "05.721.735/0001-28", 615 | "NEOE3": "01.083.200/0001-18", 616 | "TELB3": "00.336.701/0001-04", 617 | "TELB4": "00.336.701/0001-04", 618 | "BEES3": "28.127.603/0001-78", 619 | "BEES4": "28.127.603/0001-78", 620 | "EALT4": "82.643.537/0001-34", 621 | "MEAL3": "17.314.329/0001-20", 622 | "PTNT4": "88.613.658/0001-10", 623 | "JPSA3": "60.543.816/0001-93", 624 | "ENAT3": "11.669.021/0001-10", 625 | "CRPG5": "15.115.504/0001-24", 626 | "BKBR3": "13.574.594/0001-96", 627 | "GBIO33": "19.688.956/0001-56", 628 | "PTBL3": "83.475.913/0001-91", 629 | "ALSO3": "05.878.397/0001-32", 630 | "BMEB4": "17.184.037/0001-10", 631 | "BTTL3": "42.331.462/0001-31", 632 | "FRTA3": "86.550.951/0001-50", 633 | "TESA3": "05.799.312/0001-20", 634 | "MNPR3": "90.076.886/0001-40", 635 | "AZEV4": "61.351.532/0001-68", 636 | "NTCO3": "32.785.497/0001-97", 637 | } 638 | 639 | CNPJ_INSTITUTIONS = { 640 | "39": "74.014.747/0001-35", 641 | "4": "62.178.421/0001-64", 642 | "226": "17.312.661/0001-55", 643 | "147": "33.775.974/0001-04", 644 | "1982": "30.723.886/0001-62", 645 | "172": "93.026.847/0001-26", 646 | "72": "61.855.045/0001-32", 647 | "120": "05.816.451/0001-15", 648 | "85": "43.815.158/0001-22", 649 | "308": "02.332.886/0011-78", 650 | "88": "02.685.483/0001-30", 651 | "234": "09.512.542/0001-18", 652 | "74": "00.336.036/0001-40", 653 | "45": "42.584.318/0001-07", 654 | "90": "62.169.875/0001-79", 655 | "174": "28.048.783/0001-00", 656 | "131": "63.062.749/0001-83", 657 | "173": "27.652.684/0001-62", 658 | "186": "92.858.380/0001-18", 659 | "15": "65.913.436/0001-17", 660 | "115": "01.788.147/0001-50", 661 | "54": "33.894.445/0001-11", 662 | "735": "09.105.360/0001-22", 663 | "1099": "18.945.670/0001-46", 664 | "114": "61.194.353/0001-64", 665 | "16": "32.588.139/0001-94", 666 | "106": "16.683.062/0001-85", 667 | "13": "02.670.590/0001-95", 668 | "262": "12.392.983/0001-38", 669 | "40": "04.323.351/0001-94", 670 | "23": "52.904.364/0001-08", 671 | "93": "04.257.795/0001-79", 672 | "63": "43.060.029/0001-71", 673 | "129": "00.806.535/0001-54", 674 | "386": "02.332.886/0016-82", 675 | "3762": "42.066.258/0001-30", 676 | "59": "60.783.503/0001-02", 677 | "27": "51.014.223/0001-49", 678 | "187": "17.315.359/0001-50", 679 | "58": "62.285.390/0001-40", 680 | "177": "68.757.681/0001-70", 681 | "10": "61.739.629/0001-42", 682 | "107": "03.751.794/0001-13", 683 | "4090": "29.162.769/0001-98", 684 | "37": "33.968.066/0001-29", 685 | "29": "28.156.214/0001-70", 686 | "21": "03.384.738/0001-98", 687 | "3": "02.332.886/0001-04", 688 | } 689 | 690 | 691 | def get_asset_info(code: str) -> AssetInfo: 692 | """Return asset info. 693 | 694 | Args: 695 | code: asset code. 696 | 697 | Returns: 698 | AssetInfo: category and cnpj. 699 | """ 700 | if code in STOCKS: 701 | return AssetInfo("STOCKS", STOCKS[code]) 702 | # ETF and FII code can end in 11 or 11B 703 | if len(code) == 6 and code.endswith("11"): 704 | code = code[:-2] 705 | elif len(code) == 7 and code.endswith("11B"): 706 | code = code[:-3] 707 | if code in FIIS: 708 | return AssetInfo("FII", FIIS[code]) 709 | if code in ETFS: 710 | return AssetInfo("ETF", ETFS[code]) 711 | return AssetInfo("NOT_FOUND", "") 712 | 713 | 714 | def get_trading_rate() -> float: 715 | """Return fixes trading rate. 716 | 717 | Returns: 718 | float: constant float. 719 | """ 720 | return LIQUIDACAO_RATE 721 | 722 | 723 | def get_emoluments_rates( 724 | dates: List[datetime.datetime], auction_trades: List[int] 725 | ) -> List[float]: 726 | """Get the list of emuluments rates. 727 | 728 | Args: 729 | dates (List[datetime.datetime]): list of trade days. 730 | auction_trades (List[int]): list of indexes of trades in auction. 731 | 732 | Returns: 733 | List[float]: list of rates. 734 | """ 735 | rates = [] 736 | last_period = 0 737 | for date in dates: 738 | for idx_period, period in enumerate( 739 | EMOLUMENTOS_PERIODS[last_period:], start=last_period 740 | ): 741 | if period.start_date <= date <= period.end_date: 742 | last_period = idx_period 743 | rates.append(period.rate) 744 | break 745 | else: 746 | sys.exit(f"Nenhum período de emolumentos encontrado para a data: {date}") 747 | for trade in auction_trades: 748 | rates[trade] = EMOLUMENTOS_AUCTION_RATE 749 | return rates 750 | 751 | 752 | def get_cnpj_institution(institution: str) -> str: 753 | """Return CNPJ of institution. 754 | 755 | Args: 756 | institution (str): full institution description. 757 | 758 | Returns: 759 | str: CNPJ or not found message. 760 | """ 761 | b3_code = institution.split(" - ")[0] 762 | if b3_code in CNPJ_INSTITUTIONS: 763 | return CNPJ_INSTITUTIONS[b3_code] 764 | return "não encontrado" 765 | -------------------------------------------------------------------------------- /src/irpf_cei/cei.py: -------------------------------------------------------------------------------- 1 | """CEI XLS reader.""" 2 | import datetime 3 | import glob 4 | import math 5 | import os 6 | import sys 7 | from typing import List 8 | from typing import Tuple 9 | 10 | import pandas as pd 11 | import xlrd 12 | 13 | import irpf_cei.b3 14 | import irpf_cei.formatting 15 | 16 | 17 | IRPF_INVESTIMENT_CODES = { 18 | "ETF": "74 (ETF)", 19 | "FII": "73 (FII)", 20 | "STOCKS": "31 (Ações)", 21 | "NOT_FOUND": "Não encontrado", 22 | } 23 | 24 | 25 | def get_xls_filename() -> str: 26 | """Return first xls filename in current folder or Downloads folder.""" 27 | filenames = glob.glob("InfoCEI*.xls") 28 | if filenames: 29 | return filenames[0] 30 | home = os.path.expanduser("~") 31 | filenames = glob.glob(os.path.join(home, "Downloads", "InfoCEI*.xls")) 32 | if filenames: 33 | return filenames[0] 34 | return sys.exit( 35 | "Erro: arquivo não encontrado, confira a documentação para mais informações." 36 | ) 37 | 38 | 39 | def date_parse(value: str) -> datetime.datetime: 40 | """Parse dates from CEI report.""" 41 | return datetime.datetime.strptime(value.strip(), "%d/%m/%y") 42 | 43 | 44 | def validate_period(first: str, second: str) -> int: 45 | """Consider the year from the first trade date.""" 46 | first_year = int(first[-4:]) 47 | second_year = int(second[-4:]) 48 | if first_year <= second_year and first_year > 2018 and second_year < 2021: 49 | return second_year 50 | return sys.exit( 51 | f"Erro: o período de {first} a {second} não é válido, favor verificar " 52 | "instruções na documentação." 53 | ) 54 | 55 | 56 | def validate_header(filepath: str) -> Tuple[int, str]: 57 | """Validate file header. 58 | 59 | Arguments: 60 | filepath: CEI report's full path 61 | 62 | Returns: 63 | Tuple[int, str]: reference year for the report and institution name if valid. 64 | """ 65 | try: 66 | basic_df = pd.read_excel( 67 | filepath, 68 | usecols="B", 69 | date_parser=date_parse, 70 | skiprows=4, 71 | ) 72 | # exits if empty 73 | except (ValueError, xlrd.XLRDError): 74 | sys.exit( 75 | f"Erro: arquivo {filepath} não se encontra íntegro ou no formato de " 76 | "relatórios do CEI." 77 | ) 78 | 79 | periods = basic_df["Período de"].iloc[0].split(" a ") 80 | ref_year = validate_period(periods[0], periods[1]) 81 | 82 | instutition = basic_df["Período de"].iloc[4] 83 | return ref_year, instutition 84 | 85 | 86 | def read_xls(filename: str) -> pd.DataFrame: 87 | """Read xls. 88 | 89 | Args: 90 | filename (str): name of XLS file. 91 | 92 | Returns: 93 | pd.DataFrame: content of the file. 94 | """ 95 | df = pd.read_excel( 96 | filename, 97 | usecols="B:K", 98 | parse_dates=["Data Negócio"], 99 | date_parser=date_parse, 100 | skipfooter=4, 101 | skiprows=10, 102 | ) 103 | return df 104 | 105 | 106 | # Source: https://realpython.com/python-rounding/ 107 | def round_down_money(n: float, decimals: int = 2) -> float: 108 | """Round float on second decimal cases. 109 | 110 | Args: 111 | n (float): number. 112 | decimals (int): Number of decimal cases. Defaults to 2. 113 | 114 | Returns: 115 | float: rounded number. 116 | """ 117 | multiplier = 10 ** decimals 118 | # Type-hint for floor won't work until Python 3.9 119 | # https://github.com/python/typeshed/issues/3195 120 | return math.floor(n * multiplier) / multiplier # type: ignore 121 | 122 | 123 | def clean_table_cols(source_df: pd.DataFrame) -> pd.DataFrame: 124 | """Drop columns without values. 125 | 126 | Args: 127 | source_df (pd.DataFrame): full columns DataFrame. 128 | 129 | Returns: 130 | pd.DataFrame: DataFrame without columns with no value. 131 | """ 132 | return source_df.dropna(axis="columns", how="all") 133 | 134 | 135 | def get_trades(df: pd.DataFrame) -> List[Tuple[str, int]]: 136 | """Return trades representations. 137 | 138 | Args: 139 | df (pd.DataFrame): trades DataFrame. 140 | 141 | Returns: 142 | trades: list of df indexes and string representations. 143 | """ 144 | df["total_cost_rs"] = df["Valor Total (R$)"].apply( 145 | lambda x: "R$ " + str(f"{x:.2f}".replace(".", ",")) 146 | ) 147 | df = df.drop(columns=["Valor Total (R$)"]) 148 | list_of_list = df.astype(str).values.tolist() 149 | df = df.drop(columns=["total_cost_rs"]) 150 | return [(" ".join(x), i) for i, x in enumerate(list_of_list)] 151 | 152 | 153 | def group_trades(df: pd.DataFrame) -> pd.DataFrame: 154 | """Group trades by day, asset and action. 155 | 156 | Args: 157 | df (pd.DataFrame): ungrouped trades. 158 | 159 | Returns: 160 | pd.DataFrame: grouped trades. 161 | """ 162 | return ( 163 | df.groupby(["Data Negócio", "Código", "C/V"]) 164 | .agg( 165 | { 166 | "Quantidade": "sum", 167 | "Valor Total (R$)": "sum", 168 | "Especificação do Ativo": "first", 169 | } 170 | ) 171 | .reset_index() 172 | ) 173 | 174 | 175 | def calculate_taxes(df: pd.DataFrame, auction_trades: List[int]) -> pd.DataFrame: 176 | """Calculate emolumentos and liquidação taxes based on reference year. 177 | 178 | Args: 179 | df (pd.DataFrame): grouped trades. 180 | auction_trades (List[int]): list of auction trades. 181 | 182 | Returns: 183 | pd.DataFrame: trades with two new columns of calculated taxes. 184 | """ 185 | df["Liquidação (R$)"] = ( 186 | df["Valor Total (R$)"] * irpf_cei.b3.get_trading_rate() 187 | ).apply(round_down_money) 188 | df["Emolumentos (R$)"] = ( 189 | df["Valor Total (R$)"] 190 | * irpf_cei.b3.get_emoluments_rates(df["Data Negócio"].array, auction_trades) 191 | ).apply(round_down_money) 192 | return df 193 | 194 | 195 | def buy_sell_columns(df: pd.DataFrame) -> pd.DataFrame: 196 | """Create columns for buys and sells with quantity and total value. 197 | 198 | Args: 199 | df (pd.DataFrame): grouped trades. 200 | 201 | Returns: 202 | pd.DataFrame: grouped trades with four new columns of buys and sells. 203 | """ 204 | df["Quantidade Compra"] = df["Quantidade"].where(df["C/V"].str.contains("C"), 0) 205 | df["Custo Total Compra (R$)"] = ( 206 | df[["Valor Total (R$)", "Liquidação (R$)", "Emolumentos (R$)"]] 207 | .sum(axis="columns") 208 | .where(df["C/V"].str.contains("C"), 0) 209 | ).round(decimals=2) 210 | df["Quantidade Venda"] = df["Quantidade"].where(df["C/V"].str.contains("V"), 0) 211 | df["Custo Total Venda (R$)"] = ( 212 | df[["Valor Total (R$)", "Liquidação (R$)", "Emolumentos (R$)"]] 213 | .sum(axis="columns") 214 | .where(df["C/V"].str.contains("V"), 0) 215 | ).round(decimals=2) 216 | df.drop(["Quantidade", "Valor Total (R$)"], axis="columns", inplace=True) 217 | return df 218 | 219 | 220 | def group_buys_sells(df: pd.DataFrame) -> pd.DataFrame: 221 | """Group buys and sells by asset. 222 | 223 | Args: 224 | df (pd.DataFrame): ungrouped buys and sells. 225 | 226 | Returns: 227 | pd.DataFrame: grouped buys and sells. 228 | """ 229 | return ( 230 | df.groupby(["Código"]) 231 | .agg( 232 | { 233 | "Quantidade Compra": "sum", 234 | "Custo Total Compra (R$)": "sum", 235 | "Quantidade Venda": "sum", 236 | "Custo Total Venda (R$)": "sum", 237 | "Especificação do Ativo": "first", 238 | } 239 | ) 240 | .round(decimals=2) 241 | .reset_index() 242 | ) 243 | 244 | 245 | def average_price(df: pd.DataFrame) -> pd.DataFrame: 246 | """Compute average price. 247 | 248 | Args: 249 | df (pd.DataFrame): buys and sells without average price. 250 | 251 | Returns: 252 | pd.DataFrame: buys and sells with average price. 253 | """ 254 | df["Preço Médio (R$)"] = df["Custo Total Compra (R$)"] / df["Quantidade Compra"] 255 | return df 256 | 257 | 258 | def goods_and_rights(source_df: pd.DataFrame) -> pd.DataFrame: 259 | """Call methods for goods and rights. 260 | 261 | Args: 262 | source_df (pd.DataFrame): raw DataFrame. 263 | 264 | Returns: 265 | pd.DataFrame: goods and rights DataFrame. 266 | """ 267 | result_df = buy_sell_columns(source_df) 268 | result_df = group_buys_sells(source_df) 269 | result_df = average_price(result_df) 270 | return result_df 271 | 272 | 273 | def output_taxes(tax_df: pd.DataFrame) -> None: 274 | """Print tax DataFrame. 275 | 276 | Args: 277 | tax_df (pd.DataFrame): calculated tax columns. 278 | """ 279 | with pd.option_context("display.max_rows", None, "display.max_columns", None): 280 | print("Valores calculados de emolumentos, liquidação e custo total:\n", tax_df) 281 | 282 | 283 | def output_goods_and_rights( 284 | result_df: pd.DataFrame, ref_year: int, institution: str 285 | ) -> None: 286 | """Return a list of assets.""" 287 | pd.set_option("float_format", irpf_cei.formatting.get_currency_format()) 288 | print("========= Bens e Direitos =========") 289 | for row in result_df.iterrows(): 290 | idx = row[0] 291 | content = row[1] 292 | desc = content["Especificação do Ativo"] 293 | code = content["Código"] 294 | qtd = content["Quantidade Compra"] - content["Quantidade Venda"] 295 | avg_price = content["Preço Médio (R$)"] 296 | avg_price_str = irpf_cei.formatting.fmt_money(avg_price, 3) 297 | cnpj = irpf_cei.b3.get_cnpj_institution(institution) 298 | result = irpf_cei.formatting.fmt_money(avg_price * qtd, 2) 299 | asset_info = irpf_cei.b3.get_asset_info(code) 300 | print( 301 | f"============= Ativo {idx + 1} =============\n" 302 | f"Código: {IRPF_INVESTIMENT_CODES[asset_info.category]}\n" 303 | f"CNPJ: {asset_info.cnpj if asset_info.cnpj else 'Não encontrado'}\n" 304 | f"Discriminação (sugerida): {desc}, código: {code}, quantidade: {qtd}, " 305 | f"preço médio de compra: R$ {avg_price_str}, corretora: {institution} -" 306 | f" CNPJ {cnpj}\nSituação em 31/12/{ref_year}: R$ {result}\n" 307 | ) 308 | -------------------------------------------------------------------------------- /src/irpf_cei/formatting.py: -------------------------------------------------------------------------------- 1 | """Formatting module.""" 2 | import locale 3 | import math 4 | from typing import Any 5 | from typing import Callable 6 | from typing import Union 7 | 8 | import irpf_cei.responses as res 9 | 10 | 11 | def set_pt_br_locale() -> Union[res.ResponseFailure, res.ResponseSuccess]: 12 | """Sets pt_BR locale.""" 13 | # one gets available locale from shell `locale -a` 14 | supported_locales = ["pt_BR.utf8", "pt_BR.UTF-8"] 15 | for loc in supported_locales: 16 | try: 17 | locale.setlocale(locale.LC_ALL, loc) 18 | return res.ResponseSuccess() 19 | except locale.Error: 20 | pass 21 | return res.ResponseFailure( 22 | res.ResponseTypes.SYSTEM_ERROR, 23 | "locale pt_BR não encontrado, confira a documentação para mais informações.", 24 | ) 25 | 26 | 27 | def get_currency_format() -> Callable[[Any], str]: 28 | """Return currency function. 29 | 30 | Returns: 31 | Callable[[Any], str]: function from current locale. 32 | """ 33 | return locale.currency 34 | 35 | 36 | def fmt_money(amount: float, ndigits: int = 2) -> str: 37 | """Return padded and rounded value.""" 38 | if math.isnan(amount): 39 | return "N/A" 40 | rounded = round(amount, ndigits) 41 | result = str(rounded).replace(".", ",") 42 | rounded_digits = result.split(",")[1] 43 | missing_digits = ndigits - len(rounded_digits) 44 | padded_result = result + "0" * missing_digits 45 | return padded_result 46 | -------------------------------------------------------------------------------- /src/irpf_cei/py.typed: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/staticdev/irpf-cei/e2f3f793b2866f743207321eb73cc6f3a0a652a0/src/irpf_cei/py.typed -------------------------------------------------------------------------------- /src/irpf_cei/responses.py: -------------------------------------------------------------------------------- 1 | """Response objects.""" 2 | from typing import Any 3 | from typing import Dict 4 | from typing import Optional 5 | from typing import Union 6 | 7 | 8 | class ResponseTypes: 9 | """Response types class.""" 10 | 11 | PARAMETERS_ERROR = "ParametersError" 12 | RESOURCE_ERROR = "ResourceError" 13 | SYSTEM_ERROR = "SystemError" 14 | SUCCESS = "Success" 15 | 16 | 17 | class ResponseFailure: 18 | """Response failure class.""" 19 | 20 | def __init__(self, type_: str, message: Union[str, Exception, None]) -> None: 21 | """Constructor.""" 22 | self.type = type_ 23 | self.message = self._format_message(message) 24 | 25 | def _format_message(self, msg: Union[str, Exception, None]) -> Optional[str]: 26 | """Format message when it is an exception. 27 | 28 | Args: 29 | msg: string, exception or None. 30 | 31 | Returns: 32 | Union[str, None]: formatted message or None. 33 | """ 34 | if isinstance(msg, Exception): 35 | return f"{msg.__class__.__name__}: {msg}" 36 | return msg 37 | 38 | @property 39 | def value(self) -> Dict[str, Optional[str]]: 40 | """Value property. 41 | 42 | Returns: 43 | Dict[str, str]: type and message. 44 | """ 45 | return {"type": self.type, "message": self.message} 46 | 47 | def __bool__(self) -> bool: 48 | """Bool return for success.""" 49 | return False 50 | 51 | 52 | class ResponseSuccess: 53 | """Response success class.""" 54 | 55 | def __init__(self, value: Any = None) -> None: 56 | """Constructor.""" 57 | self.type = ResponseTypes.SUCCESS 58 | self.value = value 59 | 60 | def __bool__(self) -> bool: 61 | """Bool return for success.""" 62 | return True 63 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | """Test suite for the irpf_cei package.""" 2 | -------------------------------------------------------------------------------- /tests/conftest.py: -------------------------------------------------------------------------------- 1 | """Package-wide test fixtures.""" 2 | from _pytest.config import Config 3 | 4 | 5 | def pytest_configure(config: Config) -> None: 6 | """Pytest configuration hook.""" 7 | config.addinivalue_line("markers", "e2e: mark as end-to-end test.") 8 | -------------------------------------------------------------------------------- /tests/test_b3.py: -------------------------------------------------------------------------------- 1 | """Test cases for the B3 module.""" 2 | import datetime 3 | 4 | import pytest 5 | 6 | from irpf_cei import b3 7 | 8 | 9 | def test_get_asset_info_etf() -> None: 10 | """Return ETF.""" 11 | asset_info = b3.get_asset_info("BOVA11") 12 | assert asset_info.category == "ETF" 13 | assert asset_info.cnpj == "10.406.511/0001-61" 14 | 15 | 16 | def test_get_asset_info_fii() -> None: 17 | """Return FII.""" 18 | asset_info = b3.get_asset_info("DOVL11B") 19 | assert asset_info.category == "FII" 20 | assert asset_info.cnpj == "10.522.648/0001-81" 21 | 22 | 23 | def test_get_asset_info_stock() -> None: 24 | """Return STOCKS.""" 25 | asset_info = b3.get_asset_info("PETR4") 26 | assert asset_info.category == "STOCKS" 27 | assert asset_info.cnpj == "33.000.167/0001-01" 28 | 29 | 30 | def test_get_asset_info_not_found() -> None: 31 | """Return NOT_FOUND.""" 32 | asset_info = b3.get_asset_info("OMG3M3") 33 | assert asset_info.category == "NOT_FOUND" 34 | 35 | 36 | def test_get_trading_rate() -> None: 37 | """Return fixed float value.""" 38 | assert b3.get_trading_rate() == 0.000275 39 | 40 | 41 | def test_get_emoluments_rates_error() -> None: 42 | """Raise `SystemExit` when date is not found.""" 43 | series = [datetime.datetime(1930, 2, 20)] 44 | with pytest.raises(SystemExit): 45 | assert b3.get_emoluments_rates(series, []) 46 | 47 | 48 | def test_get_emoluments_rates_sucess_no_auction() -> None: 49 | """Return date rates.""" 50 | series = [ 51 | datetime.datetime(2019, 2, 20), 52 | datetime.datetime(2019, 3, 6), 53 | datetime.datetime(2019, 5, 14), 54 | datetime.datetime(2019, 12, 31), 55 | ] 56 | expected = [0.00004032, 0.00004157, 0.00004408, 0.00003802] 57 | result = b3.get_emoluments_rates(series, []) 58 | assert result == expected 59 | 60 | 61 | def test_get_emoluments_rates_sucess_with_auction() -> None: 62 | """Return date rates and auction rates.""" 63 | series = [ 64 | datetime.datetime(2019, 2, 20), 65 | datetime.datetime(2019, 3, 6), 66 | datetime.datetime(2019, 5, 14), 67 | datetime.datetime(2019, 12, 31), 68 | ] 69 | expected = [0.00004032, 0.00007, 0.00007, 0.00003802] 70 | result = b3.get_emoluments_rates(series, [1, 2]) 71 | assert result == expected 72 | 73 | 74 | def test_get_cnpj_institution_found() -> None: 75 | """Return a known CNPJ.""" 76 | institution = "90 - EASYNVEST - TITULO CV S.A." 77 | result = b3.get_cnpj_institution(institution) 78 | assert result == "62.169.875/0001-79" 79 | 80 | 81 | def test_get_cnpj_institution_not_found() -> None: 82 | """Return a known CNPJ.""" 83 | institution = "9999 - UNKNOWN S.A." 84 | result = b3.get_cnpj_institution(institution) 85 | assert result == "não encontrado" 86 | -------------------------------------------------------------------------------- /tests/test_cei.py: -------------------------------------------------------------------------------- 1 | """Test cases for the CEI module.""" 2 | import datetime 3 | import os 4 | 5 | import pandas as pd 6 | import pytest 7 | from pytest_mock import MockerFixture 8 | 9 | from irpf_cei import cei 10 | 11 | 12 | def test_date_parse() -> None: 13 | """Return datetime.""" 14 | expected = datetime.datetime(day=1, month=2, year=2019) 15 | assert cei.date_parse(" 01/02/19 ") == expected 16 | 17 | 18 | @pytest.fixture 19 | def mock_pandas_read_excel(mocker: MockerFixture) -> MockerFixture: 20 | """Fixture for mocking pandas.read_excel.""" 21 | mock = mocker.patch("pandas.read_excel") 22 | header = pd.DataFrame( 23 | { 24 | "Período de": [ 25 | "01/01/2019 a 31/12/2019", 26 | float("nan"), 27 | float("nan"), 28 | float("nan"), 29 | "INSTITUTION", 30 | ] 31 | } 32 | ) 33 | mock.return_value = header 34 | return mock 35 | 36 | 37 | def test_read_xls(mock_pandas_read_excel: MockerFixture) -> None: 38 | """Call read_excel.""" 39 | cei.read_xls("my.xls") 40 | mock_pandas_read_excel.assert_called_once() 41 | 42 | 43 | def test_round_down_money_more_than_half() -> None: 44 | """Return rounded down two decimals.""" 45 | assert cei.round_down_money(5.999) == 5.99 46 | 47 | 48 | def test_round_down_money_on_half() -> None: 49 | """Return rounded down two decimals second case.""" 50 | assert cei.round_down_money(5.555) == 5.55 51 | 52 | 53 | def test_round_down_money_one_digit() -> None: 54 | """Return rounded down two decimals third case.""" 55 | assert cei.round_down_money(8.5) == 8.50 56 | 57 | 58 | @pytest.fixture 59 | def cwd(fs: MockerFixture, monkeypatch: MockerFixture) -> None: 60 | """Fixture for pyfakefs fs.""" 61 | fs.cwd = "/path" 62 | monkeypatch.setenv("HOME", "/home") 63 | 64 | 65 | def test_get_xls_filename_not_found(fs: MockerFixture, cwd: MockerFixture) -> None: 66 | """Raise `SystemExit` when file is not found.""" 67 | with pytest.raises(SystemExit): 68 | assert cei.get_xls_filename() 69 | 70 | 71 | def test_get_xls_filename_current_folder(fs: MockerFixture, cwd: MockerFixture) -> None: 72 | """Return filename found in current folder.""" 73 | fs.create_file("/path/InfoCEI.xls") 74 | assert cei.get_xls_filename() == "InfoCEI.xls" 75 | 76 | 77 | def test_get_xls_filename_download_folder( 78 | mocker: MockerFixture, fs: MockerFixture, cwd: MockerFixture 79 | ) -> None: 80 | """Return filename found in downloads folder.""" 81 | mocker.patch("os.path.expanduser", return_value="/home") 82 | path = os.path.join("/home", "Downloads", "InfoCEI.xls") 83 | fs.create_file(path) 84 | assert cei.get_xls_filename() == path 85 | 86 | 87 | def test_validate_period_success() -> None: 88 | """Return reference year.""" 89 | first_date = "01/01/2019" 90 | second_date = "31/12/2020" 91 | 92 | assert cei.validate_period(first_date, second_date) == 2020 93 | 94 | 95 | def test_validate_period_wrong_start_finish() -> None: 96 | """Raise `SystemExit` from wrong start date.""" 97 | first_date = "01/01/2018" 98 | second_date = "31/12/2020" 99 | 100 | with pytest.raises(SystemExit) as ex: 101 | cei.validate_period(first_date, second_date) 102 | assert str(ex.value) == ( 103 | f"Erro: o período de {first_date} a {second_date} não é válido, favor " 104 | "verificar instruções na documentação." 105 | ) 106 | 107 | 108 | def test_validate_header_empty_file(fs: MockerFixture, cwd: MockerFixture) -> None: 109 | """Raise `SystemExit` from empty file.""" 110 | path = os.path.join("path", "InfoCEI.xls") 111 | fs.create_file(path) 112 | with pytest.raises(SystemExit): 113 | cei.validate_header(path) 114 | 115 | 116 | @pytest.fixture 117 | def mock_validate_period(mocker: MockerFixture) -> MockerFixture: 118 | """Fixture for mocking irpf_cei.cei.validate_period.""" 119 | mock = mocker.patch("irpf_cei.cei.validate_period") 120 | mock.return_value = 2019 121 | return mock 122 | 123 | 124 | def test_validate_header( 125 | mock_pandas_read_excel: MockerFixture, mock_validate_period: MockerFixture 126 | ) -> None: 127 | """Return year and institution.""" 128 | assert cei.validate_header("/my/path/InfoCEI.xls") == (2019, "INSTITUTION") 129 | 130 | 131 | def test_clean_table_cols() -> None: 132 | """Return cleaned DataFrame.""" 133 | df = pd.DataFrame( 134 | { 135 | "full_valued": [1, 2, 3], 136 | "all_missing1": [None, None, None], 137 | "some_missing": [None, 2, 3], 138 | "all_missing2": [None, None, None], 139 | } 140 | ) 141 | expected_df = pd.DataFrame({"full_valued": [1, 2, 3], "some_missing": [None, 2, 3]}) 142 | result_df = cei.clean_table_cols(df) 143 | pd.testing.assert_frame_equal(result_df, expected_df) 144 | 145 | 146 | def test_get_trades() -> None: 147 | """Return a list of trade tuples.""" 148 | df = pd.DataFrame( 149 | { 150 | "Data": ["10/10/2019", "12/11/2019"], 151 | "Operação": ["B ", "S "], 152 | "Quantidade": [10, 100], 153 | "Valor Total (R$)": [102.0, 3050], 154 | } 155 | ) 156 | expected_result = [ 157 | ("10/10/2019 B 10 R$ 102,00", 0), 158 | ("12/11/2019 S 100 R$ 3050,00", 1), 159 | ] 160 | result = cei.get_trades(df) 161 | assert expected_result == result 162 | 163 | 164 | def test_group_trades() -> None: 165 | """Return a DataFrame of grouped trades.""" 166 | df = pd.DataFrame( 167 | { 168 | "Data Negócio": ["1", "1", "2", "2", "2", "2"], 169 | "Código": ["BOVA11", "PETR4", "PETR4", "BOVA11", "BOVA11", "BOVA11"], 170 | "C/V": [" C ", " V ", " V ", " V ", " C ", " C "], 171 | "Quantidade": [20, 30, 50, 80, 130, 210], 172 | "Valor Total (R$)": [10.20, 30.50, 80.13, 210.34, 550.89, 144.233], 173 | "Especificação do Ativo": [ 174 | "ISHARES", 175 | "PETRO", 176 | "PETRO", 177 | "ISHARES", 178 | "ISHARES", 179 | "ISHARES", 180 | ], 181 | } 182 | ) 183 | expected_df = pd.DataFrame( 184 | { 185 | "Data Negócio": ["1", "1", "2", "2", "2"], 186 | "Código": ["BOVA11", "PETR4", "BOVA11", "BOVA11", "PETR4"], 187 | "C/V": [" C ", " V ", " C ", " V ", " V "], 188 | "Quantidade": [20, 30, 340, 80, 50], 189 | "Valor Total (R$)": [10.20, 30.50, 695.123, 210.34, 80.13], 190 | "Especificação do Ativo": [ 191 | "ISHARES", 192 | "PETRO", 193 | "ISHARES", 194 | "ISHARES", 195 | "PETRO", 196 | ], 197 | } 198 | ) 199 | result_df = cei.group_trades(df) 200 | pd.testing.assert_frame_equal(result_df, expected_df) 201 | 202 | 203 | def test_calculate_taxes_2019(mocker: MockerFixture) -> None: 204 | """Return calculated taxes.""" 205 | mocker.patch("irpf_cei.b3.get_trading_rate", return_value=0.000275) 206 | mocker.patch( 207 | "irpf_cei.b3.get_emoluments_rates", 208 | return_value=[0.00004105, 0.00004105, 0.00004105], 209 | ) 210 | df = pd.DataFrame( 211 | { 212 | "Data Negócio": [ 213 | datetime.datetime(2019, 2, 20), 214 | datetime.datetime(2019, 3, 6), 215 | datetime.datetime(2019, 5, 14), 216 | ], 217 | "Valor Total (R$)": [935, 10956, 8870], 218 | } 219 | ) 220 | expected_df = pd.DataFrame( 221 | { 222 | "Data Negócio": [ 223 | datetime.datetime(2019, 2, 20), 224 | datetime.datetime(2019, 3, 6), 225 | datetime.datetime(2019, 5, 14), 226 | ], 227 | "Valor Total (R$)": [935, 10956, 8870], 228 | "Liquidação (R$)": [0.25, 3.01, 2.43], 229 | "Emolumentos (R$)": [0.03, 0.44, 0.36], 230 | } 231 | ) 232 | result_df = cei.calculate_taxes(df, []) 233 | pd.testing.assert_frame_equal(result_df, expected_df) 234 | 235 | 236 | def test_buy_sell_columns() -> None: 237 | """Return DataFrame with separated buy/sell columns.""" 238 | df = pd.DataFrame( 239 | { 240 | "Data Negócio": ["1", "1", "2", "2", "2"], 241 | "Código": ["BOVA11", "PETR4", "BOVA11", "BOVA11", "PETR4"], 242 | "C/V": [" C ", " V ", " C ", " V ", " V "], 243 | "Quantidade": [20, 30, 340, 80, 50], 244 | "Valor Total (R$)": [10.20, 30.50, 695.123, 210.34, 80.13], 245 | "Liquidação (R$)": [1, 2, 5, 4, 3], 246 | "Emolumentos (R$)": [0.2, 0.3, 1.3, 0.8, 0.5], 247 | } 248 | ) 249 | expected_df = pd.DataFrame( 250 | { 251 | "Data Negócio": ["1", "1", "2", "2", "2"], 252 | "Código": ["BOVA11", "PETR4", "BOVA11", "BOVA11", "PETR4"], 253 | "C/V": [" C ", " V ", " C ", " V ", " V "], 254 | "Liquidação (R$)": [1, 2, 5, 4, 3], 255 | "Emolumentos (R$)": [0.2, 0.3, 1.3, 0.8, 0.5], 256 | "Quantidade Compra": [20, 0, 340, 0, 0], 257 | "Custo Total Compra (R$)": [11.40, 0, 701.423, 0, 0], 258 | "Quantidade Venda": [0, 30, 0, 80, 50], 259 | "Custo Total Venda (R$)": [0, 32.80, 0, 215.14, 83.63], 260 | } 261 | ) 262 | result_df = cei.buy_sell_columns(df) 263 | pd.testing.assert_frame_equal(result_df, expected_df) 264 | 265 | 266 | def test_group_buys_sells() -> None: 267 | """Return a DataFrame with grouped buy/sell trades.""" 268 | df = pd.DataFrame( 269 | { 270 | "Código": ["BOVA11", "PETR4", "BOVA11", "BOVA11", "PETR4"], 271 | "Quantidade Compra": [20, 0, 340, 0, 0], 272 | "Custo Total Compra (R$)": [11.40, 0, 701.423, 0, 0], 273 | "Quantidade Venda": [0, 30, 0, 80, 50], 274 | "Custo Total Venda (R$)": [0, 32.80, 0, 215.14, 83.63], 275 | "Especificação do Ativo": [ 276 | "ISHARES", 277 | "PETRO", 278 | "ISHARES", 279 | "ISHARES", 280 | "PETRO", 281 | ], 282 | } 283 | ) 284 | expected_df = pd.DataFrame( 285 | { 286 | "Código": ["BOVA11", "PETR4"], 287 | "Quantidade Compra": [360, 0], 288 | "Custo Total Compra (R$)": [712.823, 0], 289 | "Quantidade Venda": [80, 80], 290 | "Custo Total Venda (R$)": [215.14, 116.43], 291 | "Especificação do Ativo": ["ISHARES", "PETRO"], 292 | } 293 | ) 294 | result_df = cei.group_buys_sells(df) 295 | pd.testing.assert_frame_equal(result_df, expected_df) 296 | 297 | 298 | def test_average_price() -> None: 299 | """Return a DataFrame with average price column.""" 300 | df = pd.DataFrame( 301 | { 302 | "Código": ["BOVA11", "PETR4"], 303 | "Quantidade Compra": [360, 0], 304 | "Custo Total Compra (R$)": [712.823, 0], 305 | } 306 | ) 307 | expected_df = pd.DataFrame( 308 | { 309 | "Código": ["BOVA11", "PETR4"], 310 | "Quantidade Compra": [360, 0], 311 | "Custo Total Compra (R$)": [712.823, 0], 312 | "Preço Médio (R$)": [1.980064, float("nan")], 313 | } 314 | ) 315 | result_df = cei.average_price(df) 316 | pd.testing.assert_frame_equal(result_df, expected_df) 317 | 318 | 319 | def test_goods_and_rights( 320 | mocker: MockerFixture, 321 | ) -> None: 322 | """Return a DataFrame.""" 323 | mocker.patch("irpf_cei.cei.buy_sell_columns") 324 | mocker.patch("irpf_cei.cei.group_buys_sells") 325 | mocker.patch("irpf_cei.cei.average_price", return_value=pd.DataFrame()) 326 | 327 | df = cei.goods_and_rights(pd.DataFrame()) 328 | assert type(df) is pd.DataFrame 329 | 330 | 331 | def test_output_taxes(mocker: MockerFixture) -> None: 332 | """Print out taxes.""" 333 | mock_print = mocker.patch("builtins.print") 334 | 335 | cei.output_taxes(pd.DataFrame()) 336 | mock_print.assert_called_once() 337 | 338 | 339 | def test_output_goods_and_rights(mocker: MockerFixture) -> None: 340 | """Print out goods and rights.""" 341 | mocker.patch("irpf_cei.formatting.get_currency_format") 342 | mock_print = mocker.patch("builtins.print") 343 | 344 | df = pd.DataFrame( 345 | { 346 | "Código": ["BOVA11", "PETR4"], 347 | "Quantidade Compra": [360, 0], 348 | "Custo Total Compra (R$)": [712.823, 0], 349 | "Quantidade Venda": [80, 80], 350 | "Custo Total Venda (R$)": [215.14, 116.43], 351 | "Preço Médio (R$)": [1.980, float("nan")], 352 | "Especificação do Ativo": ["ISHARES", "PETRO"], 353 | } 354 | ) 355 | cei.output_goods_and_rights(df, 2019, "XYZ") 356 | assert mock_print.call_count == 3 357 | -------------------------------------------------------------------------------- /tests/test_formatting.py: -------------------------------------------------------------------------------- 1 | """Test cases for formatting module.""" 2 | import locale 3 | 4 | from pytest_mock import MockerFixture 5 | 6 | from irpf_cei import formatting 7 | 8 | 9 | def test_set_pt_br_locale_success(mocker: MockerFixture) -> None: 10 | """Return success.""" 11 | mocker.patch("locale.setlocale") 12 | assert bool(formatting.set_pt_br_locale()) is True 13 | 14 | 15 | def test_set_pt_br_locale_error(mocker: MockerFixture) -> None: 16 | """Return pt_BR locale.""" 17 | mocker.patch("locale.setlocale", side_effect=locale.Error()) 18 | response = formatting.set_pt_br_locale() 19 | 20 | assert bool(response) is False 21 | assert ( 22 | response.value["message"] 23 | == "locale pt_BR não encontrado, confira a documentação para mais informações." 24 | ) 25 | 26 | 27 | def test_get_currency_format(mocker: MockerFixture) -> None: 28 | """Give no error.""" 29 | mocker.patch("locale.currency") 30 | assert formatting.get_currency_format() 31 | 32 | 33 | def test_fmt_money_no_padding() -> None: 34 | """Return rounded value.""" 35 | num = 1581.12357 36 | digits = 3 37 | expected = "1581,124" 38 | 39 | assert formatting.fmt_money(num, digits) == expected 40 | 41 | 42 | def test_fmt_money_with_padding() -> None: 43 | """Return rounded and padded value.""" 44 | num = 1581.1 45 | digits = 3 46 | expected = "1581,100" 47 | 48 | assert formatting.fmt_money(num, digits) == expected 49 | 50 | 51 | def test_fmt_money_is_nan() -> None: 52 | """Return N/A.""" 53 | num = float("nan") 54 | digits = 2 55 | expected = "N/A" 56 | 57 | assert formatting.fmt_money(num, digits) == expected 58 | -------------------------------------------------------------------------------- /tests/test_main.py: -------------------------------------------------------------------------------- 1 | """Test cases for the __main__ module.""" 2 | import click.testing 3 | import pytest 4 | from pytest_mock import MockerFixture 5 | 6 | from irpf_cei import __main__ 7 | from irpf_cei import responses as res 8 | 9 | 10 | def test_select_trades_empty(mocker: MockerFixture) -> None: 11 | """It returns empty list.""" 12 | mocker.patch( 13 | "inquirer.prompt", 14 | side_effect=[{"trades": []}, {"": "Não"}, {"trades": []}, {"": "Sim"}], 15 | ) 16 | trades = [("trade 1", 0), ("trade 2", 1)] 17 | assert __main__.select_trades(trades) == [] 18 | 19 | 20 | def test_select_trades_some_selected(mocker: MockerFixture) -> None: 21 | """It returns list with id 1.""" 22 | mocker.patch("inquirer.prompt", return_value={"trades": [1]}) 23 | trades = [("trade 1", 0), ("trade 2", 1)] 24 | assert __main__.select_trades(trades) == [1] 25 | 26 | 27 | @pytest.fixture 28 | def runner() -> click.testing.CliRunner: 29 | """Fixture for invoking command-line interfaces.""" 30 | return click.testing.CliRunner() 31 | 32 | 33 | @pytest.fixture 34 | def mock_cei_get_xls_filename(mocker: MockerFixture) -> MockerFixture: 35 | """Fixture for mocking cei.get_xls_filename.""" 36 | return mocker.patch("irpf_cei.cei.get_xls_filename") 37 | 38 | 39 | @pytest.fixture 40 | def mock_cei_validate_header(mocker: MockerFixture) -> MockerFixture: 41 | """Fixture for mocking cei.validate.""" 42 | mock = mocker.patch("irpf_cei.cei.validate_header") 43 | mock.return_value = 2019, "ABC" 44 | return mock 45 | 46 | 47 | @pytest.fixture 48 | def mock_cei_read_xls(mocker: MockerFixture) -> MockerFixture: 49 | """Fixture for mocking cei.read_xls.""" 50 | return mocker.patch("irpf_cei.cei.read_xls") 51 | 52 | 53 | @pytest.fixture 54 | def mock_cei_clean_table_cols(mocker: MockerFixture) -> MockerFixture: 55 | """Fixture for mocking cei.clean_table_cols.""" 56 | return mocker.patch("irpf_cei.cei.clean_table_cols") 57 | 58 | 59 | @pytest.fixture 60 | def mock_cei_group_trades(mocker: MockerFixture) -> MockerFixture: 61 | """Fixture for mocking cei.group_trades.""" 62 | return mocker.patch("irpf_cei.cei.group_trades") 63 | 64 | 65 | @pytest.fixture 66 | def mock_select_trades(mocker: MockerFixture) -> MockerFixture: 67 | """Fixture for mocking __main__.select_trades.""" 68 | return mocker.patch("irpf_cei.__main__.select_trades") 69 | 70 | 71 | @pytest.fixture 72 | def mock_cei_get_trades(mocker: MockerFixture) -> MockerFixture: 73 | """Fixture for mocking cei.get_trades.""" 74 | return mocker.patch("irpf_cei.cei.get_trades") 75 | 76 | 77 | @pytest.fixture 78 | def mock_cei_calculate_taxes(mocker: MockerFixture) -> MockerFixture: 79 | """Fixture for mocking cei.calculate_taxes.""" 80 | return mocker.patch("irpf_cei.cei.calculate_taxes") 81 | 82 | 83 | @pytest.fixture 84 | def mock_cei_output_taxes(mocker: MockerFixture) -> MockerFixture: 85 | """Fixture for mocking cei.output_taxes.""" 86 | return mocker.patch("irpf_cei.cei.output_taxes") 87 | 88 | 89 | @pytest.fixture 90 | def mock_cei_goods_and_rights(mocker: MockerFixture) -> MockerFixture: 91 | """Fixture for mocking cei.goods_and_rights.""" 92 | return mocker.patch("irpf_cei.cei.goods_and_rights") 93 | 94 | 95 | @pytest.fixture 96 | def mock_cei_output_goods_and_rights(mocker: MockerFixture) -> MockerFixture: 97 | """Fixture for mocking cei.output_goods_and_rights.""" 98 | return mocker.patch("irpf_cei.cei.output_goods_and_rights") 99 | 100 | 101 | def test_main_succeeds( 102 | mocker: MockerFixture, 103 | runner: click.testing.CliRunner, 104 | mock_cei_get_xls_filename: MockerFixture, 105 | mock_cei_validate_header: MockerFixture, 106 | mock_cei_read_xls: MockerFixture, 107 | mock_cei_clean_table_cols: MockerFixture, 108 | mock_cei_group_trades: MockerFixture, 109 | mock_select_trades: MockerFixture, 110 | mock_cei_get_trades: MockerFixture, 111 | mock_cei_calculate_taxes: MockerFixture, 112 | mock_cei_output_taxes: MockerFixture, 113 | mock_cei_goods_and_rights: MockerFixture, 114 | mock_cei_output_goods_and_rights: MockerFixture, 115 | ) -> None: 116 | """Exit with a status code of zero.""" 117 | mocker.patch( 118 | "irpf_cei.formatting.set_pt_br_locale", return_value=res.ResponseSuccess() 119 | ) 120 | result = runner.invoke(__main__.main) 121 | assert result.output.startswith("Nome do arquivo: ") 122 | mock_cei_calculate_taxes.assert_called_once() 123 | mock_cei_output_taxes.assert_called_once() 124 | mock_cei_goods_and_rights.assert_called_once() 125 | mock_cei_output_goods_and_rights.assert_called_once() 126 | assert result.exit_code == 0 127 | 128 | 129 | def test_main_locale_fail( 130 | mocker: MockerFixture, 131 | runner: click.testing.CliRunner, 132 | mock_cei_get_xls_filename: MockerFixture, 133 | mock_cei_validate_header: MockerFixture, 134 | mock_cei_read_xls: MockerFixture, 135 | mock_cei_clean_table_cols: MockerFixture, 136 | mock_cei_group_trades: MockerFixture, 137 | mock_select_trades: MockerFixture, 138 | mock_cei_get_trades: MockerFixture, 139 | mock_cei_calculate_taxes: MockerFixture, 140 | mock_cei_output_taxes: MockerFixture, 141 | mock_cei_goods_and_rights: MockerFixture, 142 | mock_cei_output_goods_and_rights: MockerFixture, 143 | ) -> None: 144 | """Exit with `SystemExit` when locale not found.""" 145 | locale_fail = res.ResponseFailure( 146 | res.ResponseTypes.SYSTEM_ERROR, "locale xyz não encontrado." 147 | ) 148 | mocker.patch("irpf_cei.formatting.set_pt_br_locale", return_value=locale_fail) 149 | result = runner.invoke(__main__.main) 150 | 151 | assert result.output.startswith("Erro: locale xyz não encontrado.") 152 | assert type(result.exception) == SystemExit 153 | -------------------------------------------------------------------------------- /tests/test_responses.py: -------------------------------------------------------------------------------- 1 | """Test cases for response objects.""" 2 | import irpf_cei.responses as res 3 | 4 | SUCCESS_VALUE = {"key": ["value1", "value2"]} 5 | GENERIC_RESPONSE_TYPE = "Response" 6 | GENERIC_RESPONSE_MESSAGE = "This is a response" 7 | 8 | 9 | def test_response_success_is_true() -> None: 10 | """It has bool value of True.""" 11 | response = res.ResponseSuccess(SUCCESS_VALUE) 12 | 13 | assert bool(response) is True 14 | 15 | 16 | def test_response_success_has_type_and_value() -> None: 17 | """It has success type and value.""" 18 | response = res.ResponseSuccess(SUCCESS_VALUE) 19 | 20 | assert response.type == res.ResponseTypes.SUCCESS 21 | assert response.value == SUCCESS_VALUE 22 | 23 | 24 | def test_response_failure_is_false() -> None: 25 | """It has bool value of False.""" 26 | response = res.ResponseFailure(GENERIC_RESPONSE_TYPE, GENERIC_RESPONSE_MESSAGE) 27 | 28 | assert bool(response) is False 29 | 30 | 31 | def test_response_failure_has_type_and_message() -> None: 32 | """It has failure type and message.""" 33 | response = res.ResponseFailure(GENERIC_RESPONSE_TYPE, GENERIC_RESPONSE_MESSAGE) 34 | 35 | assert response.type == GENERIC_RESPONSE_TYPE 36 | assert response.message == GENERIC_RESPONSE_MESSAGE 37 | assert response.value == { 38 | "type": GENERIC_RESPONSE_TYPE, 39 | "message": GENERIC_RESPONSE_MESSAGE, 40 | } 41 | 42 | 43 | def test_response_failure_initialisation_with_exception() -> None: 44 | """It builds a ResponseFailure from exception.""" 45 | response = res.ResponseFailure( 46 | GENERIC_RESPONSE_TYPE, Exception("Just an error message") 47 | ) 48 | 49 | assert bool(response) is False 50 | assert response.type == GENERIC_RESPONSE_TYPE 51 | assert response.message == "Exception: Just an error message" 52 | --------------------------------------------------------------------------------