From b164e9d5f36db81e8c76b75e7e932e5720fdceb6 Mon Sep 17 00:00:00 2001 From: cerenX9 Date: Wed, 22 Jul 2026 13:26:20 +0300 Subject: [PATCH] feat(currency): Integrate official TCMB daily currency rates --- .../mymach_fleet_intelligence/__manifest__.py | 1 + .../data/ir_cron.xml | 14 ++++ .../mymach_fleet_intelligence/i18n/en_GB.po | 3 + .../models/__init__.py | 1 + .../models/res_currency.py | 65 +++++++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 addons/mymach_fleet_intelligence/data/ir_cron.xml create mode 100644 addons/mymach_fleet_intelligence/models/res_currency.py diff --git a/addons/mymach_fleet_intelligence/__manifest__.py b/addons/mymach_fleet_intelligence/__manifest__.py index 86e1c40..5b5c19d 100644 --- a/addons/mymach_fleet_intelligence/__manifest__.py +++ b/addons/mymach_fleet_intelligence/__manifest__.py @@ -10,6 +10,7 @@ 'data': [ 'security/security_groups.xml', 'security/ir.model.access.csv', + 'data/ir_cron.xml', 'data/cron_jobs.xml', 'views/contract_views.xml', 'views/maintenance_cost_views.xml', diff --git a/addons/mymach_fleet_intelligence/data/ir_cron.xml b/addons/mymach_fleet_intelligence/data/ir_cron.xml new file mode 100644 index 0000000..ecdac42 --- /dev/null +++ b/addons/mymach_fleet_intelligence/data/ir_cron.xml @@ -0,0 +1,14 @@ + + + + + TCMB Kur Güncelleme + + code + model._update_tcmb_rates() + 1 + days + + + + diff --git a/addons/mymach_fleet_intelligence/i18n/en_GB.po b/addons/mymach_fleet_intelligence/i18n/en_GB.po index d18721f..2d90a0e 100644 --- a/addons/mymach_fleet_intelligence/i18n/en_GB.po +++ b/addons/mymach_fleet_intelligence/i18n/en_GB.po @@ -2840,3 +2840,6 @@ msgstr "🚨 INCOMPATIBLE (%(dev)s km Prohibited Personal Use)" #: code:addons/mymach_fleet_intelligence/controllers/main.py:0 msgid "🚨 UYUMSUZ ROTA (YÖNETİCİYE ALARM BİLDİRİLDİ)" msgstr "🚨 INCOMPATIBLE ROUTE (ALARM REPORTED TO MANAGER)" + +msgid "TCMB Kur Güncelleme" +msgstr "TCMB Currency Update" diff --git a/addons/mymach_fleet_intelligence/models/__init__.py b/addons/mymach_fleet_intelligence/models/__init__.py index 36846b3..043b434 100644 --- a/addons/mymach_fleet_intelligence/models/__init__.py +++ b/addons/mymach_fleet_intelligence/models/__init__.py @@ -9,3 +9,4 @@ from . import fleet_fine from . import fleet_handover from . import periodic_maintenance from . import fuel_index +from . import res_currency diff --git a/addons/mymach_fleet_intelligence/models/res_currency.py b/addons/mymach_fleet_intelligence/models/res_currency.py new file mode 100644 index 0000000..ebcdc96 --- /dev/null +++ b/addons/mymach_fleet_intelligence/models/res_currency.py @@ -0,0 +1,65 @@ +from odoo import models, fields, api +import requests +import xml.etree.ElementTree as ET +import logging + +_logger = logging.getLogger(__name__) + +class ResCurrency(models.Model): + _inherit = 'res.currency' + + @api.model + def _update_tcmb_rates(self): + url = "https://www.tcmb.gov.tr/kurlar/today.xml" + try: + response = requests.get(url, timeout=10) + response.raise_for_status() + tree = ET.fromstring(response.content) + + company = self.env.company + today = fields.Date.today() + + # Create a dict of rates from XML + rates = {} + for currency in tree.findall('Currency'): + code = currency.get('CurrencyCode') + buying = currency.find('ForexBuying') + if code and buying is not None and buying.text: + try: + rates[code] = float(buying.text) + except ValueError: + continue + + # Supported codes + target_codes = ['USD', 'EUR', 'GBP', 'CHF'] + + for code in target_codes: + if code in rates: + # In Odoo, if base is TRY (value=1.0), USD rate = 1 / 33.0 + rate_value = 1.0 / rates[code] + + curr_id = self.search([('name', '=', code), ('active', 'in', [True, False])], limit=1) + if curr_id: + # Ensure currency is active + if not curr_id.active: + curr_id.write({'active': True}) + + # Update or create rate + rate_id = self.env['res.currency.rate'].search([ + ('name', '=', today), + ('currency_id', '=', curr_id.id), + ('company_id', '=', company.id) + ], limit=1) + + if rate_id: + rate_id.write({'rate': rate_value}) + else: + self.env['res.currency.rate'].create({ + 'name': today, + 'currency_id': curr_id.id, + 'rate': rate_value, + 'company_id': company.id + }) + _logger.info("TCMB rates updated successfully for today.") + except Exception as e: + _logger.error("Failed to update TCMB rates: %s", str(e))