Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ADD] currency_rate_update_banxico: add Bank of Mexico as currency provider #58

Open
wants to merge 1 commit into
base: 17.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions currency_rate_update_banxico/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
=============================
Currency Rate Update: Banxico
=============================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:5fa37c60474118032bc96bb1d59b8ed8be27936c799a0609f9106817d89f64be
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--mexico-lightgray.png?logo=github
:target: https://github.com/OCA/l10n-mexico/tree/17.0/currency_rate_update_banxico
:alt: OCA/l10n-mexico
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/l10n-mexico-17-0/l10n-mexico-17-0-currency_rate_update_banxico
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-mexico&target_branch=17.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module adds `Banxico <https://www.banxico.org.mx/>`__ currency
exchange rate web services.

**Table of contents**

.. contents::
:local:

Configuration
=============

Now you can choose the 'Bank of Mexico' service when configuring a
currency rates providers.

1. Go to Banxico to `generate a
token <https://www.banxico.org.mx/SieAPIRest/service/v1/token>`__.
2. Go to *Invoicing > Configuration > Currency Rates Providers*.
3. Create a new 'Currency Rates Providers' or edit an existing one and
you will see 'Bank of Mexico' among the available 'Source Services'
to choose and set the token generated in step 1.
4. If you choose 'Bank of Mexico' as a 'Source Service', the exchange
rates will be updated from that provider.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/l10n-mexico/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/l10n-mexico/issues/new?body=module:%20currency_rate_update_banxico%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Jarsa
* AMOdoo

Contributors
------------

- `Jarsa <https://www.jarsa.com>`__:

- Alan Ramos

- `AMOdoo <https://amodoo.org/>`__

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/l10n-mexico <https://github.com/OCA/l10n-mexico/tree/17.0/currency_rate_update_banxico>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
3 changes: 3 additions & 0 deletions currency_rate_update_banxico/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).

from . import models
21 changes: 21 additions & 0 deletions currency_rate_update_banxico/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright 2025 Jarsa
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).

{
"name": "Currency Rate Update: Banxico",
"version": "17.0.1.0.0",
"category": "Financial Management/Configuration",
"summary": "Update exchange rates using Banxico",
"author": "Jarsa, AMOdoo, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/l10n-mexico",
"license": "AGPL-3",
"installable": True,
"application": False,
"depends": [
"currency_rate_update",
],
"external_dependencies": {"python": ["requests-mock"]},
"data": [
"views/res_currency_rate_provider_views.xml",
],
}
4 changes: 4 additions & 0 deletions currency_rate_update_banxico/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright 2025 Jarsa
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).

from . import res_currency_rate_provider_banxico
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Copyright 2025 Jarsa
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).

from datetime import datetime

import requests

from odoo import _, fields, models
from odoo.exceptions import UserError


class ResCurrencyRateProvider(models.Model):
_inherit = "res.currency.rate.provider"

service = fields.Selection(
selection_add=[("banxico", "Bank of Mexico")],
ondelete={"banxico": "set default"},
)
banxico_token = fields.Char()

def _get_supported_currencies(self):
self.ensure_one()

Check warning on line 22 in currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py

View check run for this annotation

Codecov / codecov/patch

currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py#L22

Added line #L22 was not covered by tests
if self.service != "banxico":
return super()._get_supported_currencies()
return ["EUR", "CAD", "JPY", "GBP", "USD"]

Check warning on line 25 in currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py

View check run for this annotation

Codecov / codecov/patch

currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py#L24-L25

Added lines #L24 - L25 were not covered by tests

def _obtain_rates(self, base_currency, currencies, date_from, date_to):
"""Get the exchange rates from the provider."""
self.ensure_one()
if self.service != "banxico":
return super()._obtain_rates(base_currency, currencies, date_from, date_to)

Check warning on line 31 in currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py

View check run for this annotation

Codecov / codecov/patch

currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py#L31

Added line #L31 was not covered by tests
result = {}
for currency in currencies:
url = self._get_banxico_webservice_url(currency, date_from, date_to)
data = self._request_data(url)
result.update(self._process_data(data, currency))
return result

def _get_banxico_webservice_url(self, currency, date_from, date_to):
"""Get the URL to request the exchange rates"""
base_url = "https://www.banxico.org.mx/SieAPIRest/service/v1/series/"
currencies_map = {
"EUR": "SF46410",
"CAD": "SF60632",
"GBP": "SF46407",
"JPY": "SF46406",
"USD": "SF60653",
}
if date_from < fields.Date.context_today(self):
return (
f"{base_url}{currencies_map[currency]}/datos/"
f"{date_from.strftime('%Y-%m-%d')}/{date_to.strftime('%Y-%m-%d')}"
)
return f"{base_url}{currencies_map[currency]}/datos/oportuno"

def _request_data(self, url):
try:
headers = {
"Bmx-Token": self.banxico_token,
}
response = requests.request("GET", url, headers=headers, timeout=10)
if response.status_code != 200:
raise UserError(

Check warning on line 63 in currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py

View check run for this annotation

Codecov / codecov/patch

currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py#L63

Added line #L63 was not covered by tests
response.json()
.get("error", {})
.get(
"mensaje",
_("Couldn't fetch data. Please contact your administrator."),
)
)
return response.json()
except Exception as e:
raise UserError(

Check warning on line 73 in currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py

View check run for this annotation

Codecov / codecov/patch

currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py#L72-L73

Added lines #L72 - L73 were not covered by tests
_("Couldn't fetch data. Please contact your administrator.")
) from e

def _process_data(self, data, currency):
result = {}
records = data.get("bmx", {}).get("series", [{}])[0].get("datos", [])
for rec in records:
date = datetime.strptime(rec.get("fecha"), "%d/%m/%Y")
if rec.get("dato") == "N/E":
continue

Check warning on line 83 in currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py

View check run for this annotation

Codecov / codecov/patch

currency_rate_update_banxico/models/res_currency_rate_provider_banxico.py#L83

Added line #L83 was not covered by tests
result[date] = {currency: 1 / float(rec["dato"])}
return result
3 changes: 3 additions & 0 deletions currency_rate_update_banxico/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not certain this should be pushed to the repo really

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file is created when I run pre-commit run -a

image

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

requires = ["whool"]
build-backend = "whool.buildapi"
10 changes: 10 additions & 0 deletions currency_rate_update_banxico/readme/CONFIGURE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Now you can choose the 'Bank of Mexico' service when configuring a currency
rates providers.

1. Go to Banxico to [generate a token](https://www.banxico.org.mx/SieAPIRest/service/v1/token).
2. Go to *Invoicing \> Configuration \> Currency Rates Providers*.
3. Create a new 'Currency Rates Providers' or edit an existing one and
you will see 'Bank of Mexico' among the available 'Source Services' to
choose and set the token generated in step 1.
4. If you choose 'Bank of Mexico' as a 'Source Service', the exchange rates
will be updated from that provider.
3 changes: 3 additions & 0 deletions currency_rate_update_banxico/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- [Jarsa](https://www.jarsa.com):
- Alan Ramos
- [AMOdoo](https://amodoo.org/)
2 changes: 2 additions & 0 deletions currency_rate_update_banxico/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
This module adds [Banxico](https://www.banxico.org.mx/) currency exchange rate
web services.
Loading
Loading