feat(currency): Integrate official TCMB daily currency rates
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
'data': [
|
'data': [
|
||||||
'security/security_groups.xml',
|
'security/security_groups.xml',
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
|
'data/ir_cron.xml',
|
||||||
'data/cron_jobs.xml',
|
'data/cron_jobs.xml',
|
||||||
'views/contract_views.xml',
|
'views/contract_views.xml',
|
||||||
'views/maintenance_cost_views.xml',
|
'views/maintenance_cost_views.xml',
|
||||||
|
|||||||
14
addons/mymach_fleet_intelligence/data/ir_cron.xml
Normal file
14
addons/mymach_fleet_intelligence/data/ir_cron.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<record id="ir_cron_update_tcmb_rates" model="ir.cron">
|
||||||
|
<field name="name">TCMB Kur Güncelleme</field>
|
||||||
|
<field name="model_id" ref="base.model_res_currency"/>
|
||||||
|
<field name="state">code</field>
|
||||||
|
<field name="code">model._update_tcmb_rates()</field>
|
||||||
|
<field name="interval_number">1</field>
|
||||||
|
<field name="interval_type">days</field>
|
||||||
|
<field name="active" eval="True"/>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
@@ -2840,3 +2840,6 @@ msgstr "🚨 INCOMPATIBLE (%(dev)s km Prohibited Personal Use)"
|
|||||||
#: code:addons/mymach_fleet_intelligence/controllers/main.py:0
|
#: code:addons/mymach_fleet_intelligence/controllers/main.py:0
|
||||||
msgid "🚨 UYUMSUZ ROTA (YÖNETİCİYE ALARM BİLDİRİLDİ)"
|
msgid "🚨 UYUMSUZ ROTA (YÖNETİCİYE ALARM BİLDİRİLDİ)"
|
||||||
msgstr "🚨 INCOMPATIBLE ROUTE (ALARM REPORTED TO MANAGER)"
|
msgstr "🚨 INCOMPATIBLE ROUTE (ALARM REPORTED TO MANAGER)"
|
||||||
|
|
||||||
|
msgid "TCMB Kur G<>ncelleme"
|
||||||
|
msgstr "TCMB Currency Update"
|
||||||
|
|||||||
@@ -9,3 +9,4 @@ from . import fleet_fine
|
|||||||
from . import fleet_handover
|
from . import fleet_handover
|
||||||
from . import periodic_maintenance
|
from . import periodic_maintenance
|
||||||
from . import fuel_index
|
from . import fuel_index
|
||||||
|
from . import res_currency
|
||||||
|
|||||||
65
addons/mymach_fleet_intelligence/models/res_currency.py
Normal file
65
addons/mymach_fleet_intelligence/models/res_currency.py
Normal file
@@ -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))
|
||||||
Reference in New Issue
Block a user