Skip to content

Commit

Permalink
[ADD] currency_rate_update_banxico: add Bank of Mexico as currency pr…
Browse files Browse the repository at this point in the history
…ovider
  • Loading branch information
alan196 committed Jan 10, 2025
1 parent e258560 commit cdff6a7
Show file tree
Hide file tree
Showing 13 changed files with 838 additions and 0 deletions.
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()
if self.service != "banxico":
return super()._get_supported_currencies()
return ["EUR", "CAD", "JPY", "GBP", "USD"]

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)
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(
response.json()
.get("error", {})
.get(
"mensaje",
_("Couldn't fetch data. Please contact your administrator."),
)
)
return response.json()
except Exception as e:
raise UserError(
_("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
result[date] = {currency: 1 / float(rec["dato"])}
return result
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

0 comments on commit cdff6a7

Please sign in to comment.