Merge pull request #72 from feketemihai/8.0

[MIG] Migrate currency_rate_update to V8.
This commit is contained in:
Pedro M. Baeza
2014-11-21 13:26:29 +01:00
33 changed files with 1689 additions and 2407 deletions

View File

@@ -1,97 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2008 Camtocamp SA
# @author JB Aubort, Nicolas Bessi, Joel Grand-Guillaume
# European Central Bank and Polish National Bank by Grzegorz Grzelak
# Ported to OpenERP 7.0 by Lorenzo Battistini
# <lorenzo.battistini@agilebg.com>
# Banxico implemented by Agustin Cruz openpyme.mx
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
"name": "Currency Rate Update",
"version": "0.7",
"author": "Camptocamp",
"website": "http://camptocamp.com",
"category": "Financial Management/Configuration",
"description": """Import exchange rates from the Internet.
The module is able to use 4 different sources:
1. Admin.ch
Updated daily, source in CHF.
2. European Central Bank (ported by Grzegorz Grzelak)
The reference rates are based on the regular
daily concertation procedure between
central banks within and outside the European System of Central Banks,
which normally takes place at 2.15 p.m. (14:15) ECB time. Source in EUR.
http://www.ecb.europa.eu/stats/exchange/eurofxref/html/index.en.html
3. Yahoo Finance
Updated daily
4. Polish National Bank (Narodowy Bank Polski)
(contribution by Grzegorz Grzelak)
Takes official rates from www.nbp.pl. Adds rate table symbol in log.
You should check when rates should apply to bookkeeping.
If next day you should change the update hour in schedule settings
because in OpenERP they apply from
date of update (date - no hours).
5. Banxico for USD & MXN (created by Agustín Cruz)
Updated daily
In the roadmap : Google Finance.
Updated daily from Citibank N.A., source in EUR. Information may be delayed.
This is parsed from an HTML page, so it may be broken at anytime.
The update can be set under the company form.
You can set for each services which currency you want to update.
The logs of the update are visible under the service note.
You can active or deactivate the update.
The module uses internal ir_cron feature from OpenERP,
so the job is launched once
the server starts if the 'first execute date' is before the current day.
The module supports multi-company currency in two ways:
* the currencies are shared, you can set currency update only on one
company
* the currency are separated, you can set currency on every company
separately
A function field lets you know your currency configuration.
If in multi-company mode, the base currency will
be the first company's currency
found in database.
Thanks to main contributors: Grzegorz Grzelak, Alexis de Lattre
""",
"depends": [
"base",
"account", # Added to ensure account security groups are present
],
"data": [
"currency_rate_update.xml",
"company_view.xml",
"security/security.xml",
],
"demo": [],
"active": False,
'installable': False
}

View File

@@ -1,159 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import fields, orm
class res_company(orm.Model):
"""override company to add currency update"""
def _multi_curr_enable(self, cr, uid, ids, field_name, arg, context=None):
"check if multi company currency is enabled"
result = {}
field_ids = self.pool.get('ir.model.fields').search(
cr, uid,
[('name', '=', 'company_id'),
('model', '=', 'res.currency')]
)
if not field_ids:
enable = 0
else:
enable = 1
for id in ids:
result[id] = enable
return result
def button_refresh_currency(self, cr, uid, ids, context=None):
"""Refrech the currency for all the company now"""
currency_updater_obj = self.pool.get('currency.rate.update')
try:
currency_updater_obj.run_currency_update(cr, uid)
except Exception:
return False
return True
def on_change_auto_currency_up(self, cr, uid, id, value):
"""handle the activation of the currecny update on compagnies.
There are two ways of implementing multi_company currency,
the currency is shared or not. The module take care of the two
ways. If the currency are shared, you will only be able to set
auto update on one company, this will avoid to have unusefull cron
object running.
If yours currency are not share you will be able to activate the
auto update on each separated company
"""
if len(id):
id = id[0]
else:
return {}
enable = self.browse(cr, uid, id).multi_company_currency_enable
compagnies = self.search(cr, uid, [])
activate_cron = 'f'
if not value:
# this statement is here beacaus we do no want to save #
# in case of error
self.write(cr, uid, id, {'auto_currency_up': value})
for comp in compagnies:
if self.browse(cr, uid, comp).auto_currency_up:
activate_cron = 't'
break
self.pool.get('currency.rate.update').save_cron(
cr,
uid,
{'active': activate_cron}
)
return {}
else:
for comp in compagnies:
if comp != id and not enable:
current = self.browse(cr, uid, comp)
if current.multi_company_currency_enable:
# We ensure taht we did not have write a true value
self.write(cr, uid, id, {'auto_currency_up': False})
msg = ('You can not activate auto currency'
'update on more thant one company with this '
'multi company configuration')
return {
'value': {'auto_currency_up': False},
'warning': {
'title': "Warning",
'message': msg,
}
}
self.write(cr, uid, id, {'auto_currency_up': value})
for comp in compagnies:
if self.browse(cr, uid, comp).auto_currency_up:
activate_cron = 't'
self.pool.get('currency.rate.update').save_cron(
cr,
uid,
{'active': activate_cron}
)
break
return {}
def on_change_intervall(self, cr, uid, id, interval):
# Function that will update the cron freqeuence
self.pool.get('currency.rate.update').save_cron(
cr,
uid,
{'interval_type': interval}
)
compagnies = self.search(cr, uid, [])
for comp in compagnies:
self.write(cr, uid, comp, {'interval_type': interval})
return {}
_inherit = "res.company"
_columns = {
# Activate the currency update
'auto_currency_up': fields.boolean(
'Automatical update of the currency this company'
),
'services_to_use': fields.one2many(
'currency.rate.update.service',
'company_id',
'Currency update services'
),
# Predifine cron frequence
'interval_type': fields.selection(
[
('days', 'Day(s)'),
('weeks', 'Week(s)'),
('months', 'Month(s)')
],
'Currency update frequence',
help="Changing this value will "
"also affect other compagnies"
),
# Function field that allows to know the
# mutli company currency implementation
'multi_company_currency_enable': fields.function(
_multi_curr_enable,
method=True,
type='boolean',
string="Multi company currency",
help="If this case is not check you can"
" not set currency is active on two company"
),
}

View File

@@ -1,799 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 Camptocamp SA
# @source JBA and AWST inpiration
# @contributor Grzegorz Grzelak (grzegorz.grzelak@birdglobe.com),
# Joel Grand-Guillaume
# Copyright (c) 2010 Alexis de Lattre (alexis@via.ecp.fr)
# - ported XML-based webservices (Admin.ch, ECB, PL NBP) to new XML lib
# - rates given by ECB webservice is now correct even when main_cur <> EUR
# - rates given by PL_NBP webs. is now correct even when main_cur <> PLN
# - if company_currency <> CHF, you can now update CHF via Admin.ch
# (same for EUR with ECB webservice and PLN with NBP webservice)
# For more details, see Launchpad bug #645263
# - mecanism to check if rates given by the webservice are "fresh"
# enough to be written in OpenERP
# ('max_delta_days' parameter for each currency update service)
# Ported to OpenERP 7.0 by Lorenzo Battistini
# <lorenzo.battistini@agilebg.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# TODO "nice to have" : restrain the list of currencies that can be added for
# a webservice to the list of currencies supported by the Webservice
# TODO : implement max_delta_days for Yahoo webservice
import logging
import time
from datetime import datetime, timedelta
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT
from openerp.osv import fields, osv, orm
from openerp.tools.translate import _
_logger = logging.getLogger(__name__)
class Currency_rate_update_service(osv.Model):
"""Class that tells for wich services wich currencies have to be updated
"""
_name = "currency.rate.update.service"
_description = "Currency Rate Update"
_columns = {
# List of webservicies the value sould be a class name
'service': fields.selection(
[
('Admin_ch_getter', 'Admin.ch'),
('ECB_getter', 'European Central Bank'),
('Yahoo_getter', 'Yahoo Finance '),
# Added for polish rates
('PL_NBP_getter', 'Narodowy Bank Polski'),
# Added for mexican rates
('Banxico_getter', 'Banco de México'),
# Bank of Canada is using RSS-CB
# http://www.cbwiki.net/wiki/index.php/Specification_1.1
# This RSS format is used by other national banks
# (Thailand, Malaysia, Mexico...)
('CA_BOC_getter', 'Bank of Canada - noon rates'),
],
"Webservice to use",
required=True
),
# List of currency to update
'currency_to_update': fields.many2many(
'res.currency',
'res_curreny_auto_udate_rel',
'service_id',
'currency_id',
'currency to update with this service',
),
# Back ref
'company_id': fields.many2one(
'res.company',
'linked company',
),
# Note fileds that will be used as a logger
'note': fields.text('update notice'),
'max_delta_days': fields.integer(
'Max delta days',
required=True,
help="If the time delta between the "
"rate date given by the webservice and "
"the current date exeeds this value, "
"then the currency rate is not updated in OpenERP."
),
}
_defaults = {'max_delta_days': lambda *a: 4}
_sql_constraints = [
(
'curr_service_unique',
'unique (service, company_id)',
_('You can use a service one time per company !')
)
]
def _check_max_delta_days(self, cr, uid, ids):
for company in self.read(cr, uid, ids, ['max_delta_days']):
if company['max_delta_days'] >= 0:
continue
else:
return False
return True
_constraints = [
(_check_max_delta_days,
"'Max delta days' must be >= 0",
['max_delta_days']),
]
class Currency_rate_update(osv.Model):
"""Class that handle an ir cron call who will
update currencies based on a web url"""
_name = "currency.rate.update"
_description = "Currency Rate Update"
# Dict that represent a cron object
nextcall_time = datetime.today() + timedelta(days=1)
nextcall = nextcall_time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
cron = {
'active': False,
'priority': 1,
'interval_number': 1,
'interval_type': 'weeks',
'nextcall': nextcall,
'numbercall': -1,
'doall': True,
'model': 'currency.rate.update',
'function': 'run_currency_update',
'args': '()',
}
LOG_NAME = 'cron-rates'
MOD_NAME = 'currency_rate_update: '
def get_cron_id(self, cr, uid, context):
"""Returns the updater cron's id.
Create one if the cron does not exists
"""
cron_id = 0
cron_obj = self.pool.get('ir.cron')
try:
# Finds the cron that send messages
cron_id = cron_obj.search(
cr,
uid,
[
('function', 'ilike', self.cron['function']),
('model', 'ilike', self.cron['model'])
],
context={
'active_test': False
}
)
cron_id = int(cron_id[0])
except Exception:
_logger.info('warning cron not found one will be created')
# Ignore if the cron is missing cause we are
# going to create it in db
pass
if not cron_id:
self.cron['name'] = _('Currency Rate Update')
cron_id = cron_obj.create(cr, uid, self.cron, context)
return cron_id
def save_cron(self, cr, uid, datas, context=None):
"""save the cron config data should be a dict"""
cron_id = self.get_cron_id(cr, uid, context)
return self.pool.get('ir.cron').write(cr, uid, [cron_id], datas)
def run_currency_update(self, cr, uid):
"update currency at the given frequence"
factory = Currency_getter_factory()
curr_obj = self.pool.get('res.currency')
rate_obj = self.pool.get('res.currency.rate')
companies = self.pool.get('res.company').search(cr, uid, [])
for comp in self.pool.get('res.company').browse(cr, uid, companies):
# The multi company currency can beset or no so we handle
# The two case
if not comp.auto_currency_up:
continue
# We fetch the main currency looking for currency with base = true.
# The main rate should be set at 1.00
main_curr_ids = curr_obj.search(
cr, uid,
[('base', '=', True), ('company_id', '=', comp.id)]
)
if not main_curr_ids:
# If we can not find a base currency for this company
# we look for one with no company set
main_curr_ids = curr_obj.search(
cr, uid,
[('base', '=', True), ('company_id', '=', False)]
)
if main_curr_ids:
main_curr_rec = curr_obj.browse(cr, uid, main_curr_ids[0])
else:
raise orm.except_orm(
_('Error!'),
('There is no base currency set!')
)
if main_curr_rec.rate != 1:
raise orm.except_orm(
_('Error!'),
('Base currency rate should be 1.00!')
)
main_curr = main_curr_rec.name
for service in comp.services_to_use:
note = service.note or ''
try:
# We initalize the class that will handle the request
# and return a dict of rate
getter = factory.register(service.service)
curr_to_fetch = map(lambda x: x.name,
service.currency_to_update)
res, log_info = getter.get_updated_currency(
curr_to_fetch,
main_curr,
service.max_delta_days
)
rate_name = time.strftime(DEFAULT_SERVER_DATE_FORMAT)
for curr in service.currency_to_update:
if curr.name == main_curr:
continue
do_create = True
for rate in curr.rate_ids:
if rate.name == rate_name:
rate.write({'rate': res[curr.name]})
do_create = False
break
if do_create:
vals = {
'currency_id': curr.id,
'rate': res[curr.name],
'name': rate_name
}
rate_obj.create(
cr,
uid,
vals,
)
# Show the most recent note at the top
msg = "%s \n%s currency updated. %s" % (
log_info or '',
datetime.today().strftime(
DEFAULT_SERVER_DATETIME_FORMAT
),
note
)
service.write({'note': msg})
except Exception as exc:
error_msg = "\n%s ERROR : %s %s" % (
datetime.today().strftime(
DEFAULT_SERVER_DATETIME_FORMAT
),
repr(exc),
note
)
_logger.info(repr(exc))
service.write({'note': error_msg})
class AbstractClassError(Exception):
def __str__(self):
return 'Abstract Class'
def __repr__(self):
return 'Abstract Class'
class AbstractMethodError(Exception):
def __str__(self):
return 'Abstract Method'
def __repr__(self):
return 'Abstract Method'
class UnknowClassError(Exception):
def __str__(self):
return 'Unknown Class'
def __repr__(self):
return 'Unknown Class'
class UnsuportedCurrencyError(Exception):
def __init__(self, value):
self.curr = value
def __str__(self):
return 'Unsupported currency %s' % self.curr
def __repr__(self):
return 'Unsupported currency %s' % self.curr
class Currency_getter_factory():
"""Factory pattern class that will return
a currency getter class base on the name passed
to the register method
"""
def register(self, class_name):
allowed = [
'Admin_ch_getter',
'PL_NBP_getter',
'ECB_getter',
'NYFB_getter',
'Google_getter',
'Yahoo_getter',
'Banxico_getter',
'CA_BOC_getter',
]
if class_name in allowed:
class_def = eval(class_name)
return class_def()
else:
raise UnknowClassError
class Curreny_getter_interface(object):
"Abstract class of currency getter"
log_info = " "
supported_currency_array = [
'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN',
'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BRL',
'BSD', 'BTN', 'BWP', 'BYR', 'BZD', 'CAD', 'CDF', 'CHF', 'CLP', 'CNY',
'COP', 'CRC', 'CUP', 'CVE', 'CYP', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD',
'EEK', 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GGP',
'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG',
'HUF', 'IDR', 'ILS', 'IMP', 'INR', 'IQD', 'IRR', 'ISK', 'JEP', 'JMD',
'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD',
'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LTL', 'LVL', 'LYD', 'MAD',
'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRO', 'MTL', 'MUR', 'MVR',
'MWK', 'MXN', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NZD',
'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', 'RON',
'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', 'SHP',
'SLL', 'SOS', 'SPL', 'SRD', 'STD', 'SVC', 'SYP', 'SZL', 'THB', 'TJS',
'TMM', 'TND', 'TOP', 'TRY', 'TTD', 'TVD', 'TWD', 'TZS', 'UAH', 'UGX',
'USD', 'UYU', 'UZS', 'VEB', 'VEF', 'VND', 'VUV', 'WST', 'XAF', 'XAG',
'XAU', 'XCD', 'XDR', 'XOF', 'XPD', 'XPF', 'XPT', 'YER', 'ZAR', 'ZMK',
'ZWD'
]
# Updated currency this arry will contain the final result
updated_currency = {}
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""Interface method that will retrieve the currency
This function has to be reinplemented in child
"""
raise AbstractMethodError
def validate_cur(self, currency):
"""Validate if the currency to update is supported"""
if currency not in self.supported_currency_array:
raise UnsuportedCurrencyError(currency)
def get_url(self, url):
"""Return a string of a get url query"""
try:
import urllib
objfile = urllib.urlopen(url)
rawfile = objfile.read()
objfile.close()
return rawfile
except ImportError:
raise osv.except_osv(
'Error !',
self.MOD_NAME + 'Unable to import urllib !'
)
except IOError:
raise osv.except_osv(
'Error !',
self.MOD_NAME + 'Web Service does not exist !'
)
def check_rate_date(self, rate_date, max_delta_days):
"""Check date constrains. rate_date must be of datetime type"""
days_delta = (datetime.today() - rate_date).days
if days_delta > max_delta_days:
raise Exception(
'The rate timestamp (%s) is %d days away from today, '
'which is over the limit (%d days). '
'Rate not updated in OpenERP.' % (rate_date,
days_delta,
max_delta_days)
)
# We always have a warning when rate_date != today
rate_date_str = datetime.strftime(rate_date,
DEFAULT_SERVER_DATE_FORMAT)
if rate_date.date() != datetime.today().date():
msg = "The rate timestamp (%s) is not today's date"
self.log_info = ("WARNING : %s %s") % (msg, rate_date_str)
_logger.warning(msg, rate_date_str)
# Yahoo #######################################################################
class Yahoo_getter(Curreny_getter_interface):
"""Implementation of Currency_getter_factory interface
for Yahoo finance service
"""
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""implementation of abstract method of curreny_getter_interface"""
self.validate_cur(main_currency)
url = ('http://download.finance.yahoo.com/d/'
'quotes.txt?s="%s"=X&f=sl1c1abg')
if main_currency in currency_array:
currency_array.remove(main_currency)
for curr in currency_array:
self.validate_cur(curr)
res = self.get_url(url % (main_currency + curr))
val = res.split(',')[1]
if val:
self.updated_currency[curr] = val
else:
raise Exception('Could not update the %s' % (curr))
return self.updated_currency, self.log_info
# Admin CH ####################################################################
class Admin_ch_getter(Curreny_getter_interface):
"""Implementation of Currency_getter_factory interface
for Admin.ch service
"""
def rate_retrieve(self, dom, ns, curr):
"""Parse a dom node to retrieve currencies data"""
res = {}
xpath_rate_currency = ("/def:wechselkurse/def:devise[@code='%s']/"
"def:kurs/text()") % (curr.lower())
xpath_rate_ref = ("/def:wechselkurse/def:devise[@code='%s']/"
"def:waehrung/text()") % (curr.lower())
res['rate_currency'] = float(
dom.xpath(xpath_rate_currency, namespaces=ns)[0]
)
res['rate_ref'] = float(
(dom.xpath(xpath_rate_ref, namespaces=ns)[0]).split(' ')[0]
)
return res
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""Implementation of abstract method of Curreny_getter_interface"""
url = ('http://www.afd.admin.ch/publicdb/newdb/'
'mwst_kurse/wechselkurse.php')
# We do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
# Move to new XML lib cf Launchpad bug #645263
from lxml import etree
_logger.debug("Admin.ch currency rate service : connecting...")
rawfile = self.get_url(url)
dom = etree.fromstring(rawfile)
_logger.debug("Admin.ch sent a valid XML file")
adminch_ns = {
'def': 'http://www.afd.admin.ch/publicdb/newdb/mwst_kurse'
}
rate_date = dom.xpath(
'/def:wechselkurse/def:datum/text()',
namespaces=adminch_ns
)
rate_date = rate_date[0]
rate_date_datetime = datetime.strptime(rate_date,
DEFAULT_SERVER_DATE_FORMAT)
self.check_rate_date(rate_date_datetime, max_delta_days)
# we dynamically update supported currencies
self.supported_currency_array = dom.xpath(
"/def:wechselkurse/def:devise/@code",
namespaces=adminch_ns
)
self.supported_currency_array = [x.upper() for x
in self.supported_currency_array]
self.supported_currency_array.append('CHF')
_logger.debug(
"Supported currencies = " + str(self.supported_currency_array)
)
self.validate_cur(main_currency)
if main_currency != 'CHF':
main_curr_data = self.rate_retrieve(dom, adminch_ns, main_currency)
# 1 MAIN_CURRENCY = main_rate CHF
rate_curr = main_curr_data['rate_currency']
rate_ref = main_curr_data['rate_ref']
main_rate = rate_curr / rate_ref
for curr in currency_array:
self.validate_cur(curr)
if curr == 'CHF':
rate = main_rate
else:
curr_data = self.rate_retrieve(dom, adminch_ns, curr)
# 1 MAIN_CURRENCY = rate CURR
if main_currency == 'CHF':
rate = curr_data['rate_ref'] / curr_data['rate_currency']
else:
rate = (main_rate * curr_data['rate_ref'] /
curr_data['rate_currency'])
self.updated_currency[curr] = rate
_logger.debug(
"Rate retrieved : 1 %s = %s %s" % (main_currency, rate, curr)
)
return self.updated_currency, self.log_info
# ECB getter #################################################################
class ECB_getter(Curreny_getter_interface):
"""Implementation of Currency_getter_factory interface
for ECB service
"""
def rate_retrieve(self, dom, ns, curr):
"""Parse a dom node to retrieve-
currencies data
"""
res = {}
xpath_curr_rate = ("/gesmes:Envelope/def:Cube/def:Cube/"
"def:Cube[@currency='%s']/@rate") % (curr.upper())
res['rate_currency'] = float(
dom.xpath(xpath_curr_rate, namespaces=ns)[0]
)
return res
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""implementation of abstract method of Curreny_getter_interface"""
url = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'
# Important : as explained on the ECB web site, the currencies are
# at the beginning of the afternoon ; so, until 3 p.m. Paris time
# the currency rates are the ones of trading day N-1
# http://www.ecb.europa.eu/stats/exchange/eurofxref/html/index.en.html
# We do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
# Move to new XML lib cf Launchpad bug #645263
from lxml import etree
_logger.debug("ECB currency rate service : connecting...")
rawfile = self.get_url(url)
dom = etree.fromstring(rawfile)
_logger.debug("ECB sent a valid XML file")
ecb_ns = {
'gesmes': 'http://www.gesmes.org/xml/2002-08-01',
'def': 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref'
}
rate_date = dom.xpath('/gesmes:Envelope/def:Cube/def:Cube/@time',
namespaces=ecb_ns)[0]
rate_date_datetime = datetime.strptime(rate_date,
DEFAULT_SERVER_DATE_FORMAT)
self.check_rate_date(rate_date_datetime, max_delta_days)
# We dynamically update supported currencies
self.supported_currency_array = dom.xpath(
"/gesmes:Envelope/def:Cube/def:Cube/def:Cube/@currency",
namespaces=ecb_ns
)
self.supported_currency_array.append('EUR')
_logger.debug("Supported currencies = %s " %
self.supported_currency_array)
self.validate_cur(main_currency)
if main_currency != 'EUR':
main_curr_data = self.rate_retrieve(dom, ecb_ns, main_currency)
for curr in currency_array:
self.validate_cur(curr)
if curr == 'EUR':
rate = 1 / main_curr_data['rate_currency']
else:
curr_data = self.rate_retrieve(dom, ecb_ns, curr)
if main_currency == 'EUR':
rate = curr_data['rate_currency']
else:
rate = (curr_data['rate_currency'] /
main_curr_data['rate_currency'])
self.updated_currency[curr] = rate
_logger.debug(
"Rate retrieved : 1 %s = %s %s" % (main_currency, rate, curr)
)
return self.updated_currency, self.log_info
# PL NBP ######################################################################
class PL_NBP_getter(Curreny_getter_interface):
"""Implementation of Currency_getter_factory interface
for PL NBP service
"""
def rate_retrieve(self, dom, ns, curr):
""" Parse a dom node to retrieve
currencies data"""
res = {}
xpath_rate_currency = ("/tabela_kursow/pozycja[kod_waluty='%s']/"
"kurs_sredni/text()") % (curr.upper())
xpath_rate_ref = ("/tabela_kursow/pozycja[kod_waluty='%s']/"
"przelicznik/text()") % (curr.upper())
res['rate_currency'] = float(
dom.xpath(xpath_rate_currency, namespaces=ns)[0].replace(',', '.')
)
res['rate_ref'] = float(dom.xpath(xpath_rate_ref, namespaces=ns)[0])
return res
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""implementation of abstract method of Curreny_getter_interface"""
# LastA.xml is always the most recent one
url = 'http://www.nbp.pl/kursy/xml/LastA.xml'
# We do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
# Move to new XML lib cf Launchpad bug #645263
from lxml import etree
_logger.debug("NBP.pl currency rate service : connecting...")
rawfile = self.get_url(url)
dom = etree.fromstring(rawfile)
ns = {} # Cool, there are no namespaces !
_logger.debug("NBP.pl sent a valid XML file")
rate_date = dom.xpath('/tabela_kursow/data_publikacji/text()',
namespaces=ns)[0]
rate_date_datetime = datetime.strptime(rate_date,
DEFAULT_SERVER_DATE_FORMAT)
self.check_rate_date(rate_date_datetime, max_delta_days)
# We dynamically update supported currencies
self.supported_currency_array = dom.xpath(
'/tabela_kursow/pozycja/kod_waluty/text()',
namespaces=ns
)
self.supported_currency_array.append('PLN')
_logger.debug("Supported currencies = %s" %
self.supported_currency_array)
self.validate_cur(main_currency)
if main_currency != 'PLN':
main_curr_data = self.rate_retrieve(dom, ns, main_currency)
# 1 MAIN_CURRENCY = main_rate PLN
main_rate = (main_curr_data['rate_currency'] /
main_curr_data['rate_ref'])
for curr in currency_array:
self.validate_cur(curr)
if curr == 'PLN':
rate = main_rate
else:
curr_data = self.rate_retrieve(dom, ns, curr)
# 1 MAIN_CURRENCY = rate CURR
if main_currency == 'PLN':
rate = curr_data['rate_ref'] / curr_data['rate_currency']
else:
rate = (main_rate * curr_data['rate_ref'] /
curr_data['rate_currency'])
self.updated_currency[curr] = rate
_logger.debug("Rate retrieved : %s = %s %s" %
(main_currency, rate, curr))
return self.updated_currency, self.log_info
# Banco de México #############################################################
class Banxico_getter(Curreny_getter_interface):
"""Implementation of Currency_getter_factory interface
for Banco de México service
"""
def rate_retrieve(self):
""" Get currency exchange from Banxico.xml and proccess it
TODO: Get correct data from xml instead of process string
"""
url = ('http://www.banxico.org.mx/rsscb/rss?'
'BMXC_canal=pagos&BMXC_idioma=es')
from xml.dom.minidom import parse
from StringIO import StringIO
logger = logging.getLogger(__name__)
logger.debug("Banxico currency rate service : connecting...")
rawfile = self.get_url(url)
dom = parse(StringIO(rawfile))
logger.debug("Banxico sent a valid XML file")
value = dom.getElementsByTagName('cb:value')[0]
rate = value.firstChild.nodeValue
return float(rate)
def get_updated_currency(self, currency_array, main_currency,
max_delta_days=1):
"""implementation of abstract method of Curreny_getter_interface"""
logger = logging.getLogger(__name__)
# we do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
# Suported currencies
suported = ['MXN', 'USD']
for curr in currency_array:
if curr in suported:
# Get currency data
main_rate = self.rate_retrieve()
if main_currency == 'MXN':
rate = 1 / main_rate
else:
rate = main_rate
else:
# No other currency supported
continue
self.updated_currency[curr] = rate
logger.debug("Rate retrieved : %s = %s %s" %
(main_currency, rate, curr))
# CA BOC ##### Bank of Canada #############################################
class CA_BOC_getter(Curreny_getter_interface):
"""Implementation of Curreny_getter_factory interface
for Bank of Canada RSS service
"""
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""implementation of abstract method of Curreny_getter_interface"""
# as of Jan 2014 BOC is publishing noon rates for about 60 currencies
url = ('http://www.bankofcanada.ca/stats/assets/'
'rates_rss/noon/en_%s.xml')
# closing rates are available as well (please note there are only 12
# currencies reported):
# http://www.bankofcanada.ca/stats/assets/rates_rss/closing/en_%s.xml
# We do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
import feedparser
import pytz
from dateutil import parser
for curr in currency_array:
_logger.debug("BOC currency rate service : connecting...")
dom = feedparser.parse(url % curr)
self.validate_cur(curr)
# check if BOC service is running
if dom.bozo and dom.status != 404:
_logger.error("Bank of Canada - service is down - try again\
later...")
# check if BOC sent a valid response for this currency
if dom.status != 200:
_logger.error("Exchange data for %s is not reported by Bank\
of Canada." % curr)
raise osv.except_osv('Error !', 'Exchange data for %s is not\
reported by Bank of Canada.' % str(curr))
_logger.debug("BOC sent a valid RSS file for: " + curr)
# check for valid exchange data
if (dom.entries[0].cb_basecurrency == main_currency) and \
(dom.entries[0].cb_targetcurrency == curr):
rate = dom.entries[0].cb_exchangerate.split('\n', 1)[0]
rate_date_datetime = parser.parse(dom.entries[0].updated)\
.astimezone(pytz.utc).replace(tzinfo=None)
self.check_rate_date(rate_date_datetime, max_delta_days)
self.updated_currency[curr] = rate
_logger.debug("BOC Rate retrieved : %s = %s %s" %
(main_currency, rate, curr))
else:
_logger.error(
"Exchange data format error for Bank of Canada -"
"%s. Please check provider data format "
"and/or source code." % curr)
raise osv.except_osv('Error !',
'Exchange data format error for\
Bank of Canada - %s !' % str(curr))
return self.updated_currency, self.log_info

View File

@@ -1,180 +0,0 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * c2c_currency_rate_update
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2013-10-18 17:52+0000\n"
"PO-Revision-Date: 2013-11-11 16:24+0000\n"
"Last-Translator: Grzegorz Grzelak (Cirrus) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-06-12 06:31+0000\n"
"X-Generator: Launchpad (build 17041)\n"
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency auto update configuration"
msgstr "Aktualizacja kursów walut"
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency updates services"
msgstr "Serwisy aktualizacji kursów"
#. module: currency_rate_update
#: field:currency.rate.update.service,company_id:0
msgid "linked company"
msgstr "dla firmy"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rate"
msgstr "Kurs"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rates"
msgstr "Kursy"
#. module: currency_rate_update
#: field:res.company,multi_company_currency_enable:0
msgid "Multi company currency"
msgstr "Waluta dla wielu firm"
#. module: currency_rate_update
#: field:res.company,interval_type:0
msgid "Currency update frequence"
msgstr "Częstotliwość aktualizacji kursów"
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Day(s)"
msgstr "Codziennie"
#. module: currency_rate_update
#: field:currency.rate.update.service,currency_to_update:0
msgid "currency to update with this service"
msgstr "Waluty aktualizowane tym serwisem"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Narodowy Bank Polski"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,note:0
msgid "update notice"
msgstr "Notatka aktualizacji"
#. module: currency_rate_update
#: field:currency.rate.update.service,service:0
msgid "Webservice to use"
msgstr "Strona web do zastosowania"
#. module: currency_rate_update
#: help:currency.rate.update.service,max_delta_days:0
msgid ""
"If the time delta between the rate date given by the webservice and the "
"current date exeeds this value, then the currency rate is not updated in "
"OpenERP."
msgstr ""
#. module: currency_rate_update
#: field:res.company,services_to_use:0
msgid "Currency update services"
msgstr "Serwisy aktualizacji kursów"
#. module: currency_rate_update
#: constraint:currency.rate.update.service:0
msgid "'Max delta days' must be >= 0"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:89
#: sql_constraint:currency.rate.update.service:0
#, python-format
msgid "You can use a service one time per company !"
msgstr "Możesz stosować jeden serwis na firmę !"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Yahoo Finance "
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,max_delta_days:0
msgid "Max delta days"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Admin.ch"
msgstr ""
#. module: currency_rate_update
#: model:ir.model,name:currency_rate_update.model_res_company
msgid "Companies"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Currencies to update with this service"
msgstr ""
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Week(s)"
msgstr "Co tydzień"
#. module: currency_rate_update
#: help:res.company,multi_company_currency_enable:0
msgid ""
"if this case is not check you can not set currency is active on two company"
msgstr ""
"Jeśli nie zaznaczysz, to nie będziesz mógł ustawić waluty jako aktywnej dla "
"dwóch firm"
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:153
#: model:ir.model,name:currency_rate_update.model_currency_rate_update
#: model:ir.model,name:currency_rate_update.model_currency_rate_update_service
#, python-format
msgid "Currency Rate Update"
msgstr "Aktualizacja kursów walut"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Logs"
msgstr ""
#. module: currency_rate_update
#: field:res.company,auto_currency_up:0
msgid "Automatical update of the currency this company"
msgstr "Automatyczna aktualizacja kursów walut dla tej firmy"
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Month(s)"
msgstr "Co miesiąc"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "European Central Bank"
msgstr ""
#. module: currency_rate_update
#: help:res.company,interval_type:0
msgid ""
"changing this value will\n"
" also affect other compagnies"
msgstr "Zmiana tej wartości wpłynie również na inne firmy"
#. module: currency_rate_update
#: view:res.company:0
msgid "Refresh currencies"
msgstr "Aktualizuj kursy"

View File

@@ -1,173 +0,0 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * currency_rate_update
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-10-18 17:52+0000\n"
"PO-Revision-Date: 2013-10-18 17:52+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency auto update configuration"
msgstr ""
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency updates services"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,company_id:0
msgid "linked company"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rate"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rates"
msgstr ""
#. module: currency_rate_update
#: field:res.company,multi_company_currency_enable:0
msgid "Multi company currency"
msgstr ""
#. module: currency_rate_update
#: field:res.company,interval_type:0
msgid "Currency update frequence"
msgstr ""
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Day(s)"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,currency_to_update:0
msgid "currency to update with this service"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Narodowy Bank Polski"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,note:0
msgid "update notice"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,service:0
msgid "Webservice to use"
msgstr ""
#. module: currency_rate_update
#: help:currency.rate.update.service,max_delta_days:0
msgid "If the time delta between the rate date given by the webservice and the current date exeeds this value, then the currency rate is not updated in OpenERP."
msgstr ""
#. module: currency_rate_update
#: field:res.company,services_to_use:0
msgid "Currency update services"
msgstr ""
#. module: currency_rate_update
#: constraint:currency.rate.update.service:0
msgid "'Max delta days' must be >= 0"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:89
#: sql_constraint:currency.rate.update.service:0
#, python-format
msgid "You can use a service one time per company !"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Yahoo Finance "
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,max_delta_days:0
msgid "Max delta days"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Admin.ch"
msgstr ""
#. module: currency_rate_update
#: model:ir.model,name:currency_rate_update.model_res_company
msgid "Companies"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Currencies to update with this service"
msgstr ""
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Week(s)"
msgstr ""
#. module: currency_rate_update
#: help:res.company,multi_company_currency_enable:0
msgid "if this case is not check you can not set currency is active on two company"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:153
#: model:ir.model,name:currency_rate_update.model_currency_rate_update
#: model:ir.model,name:currency_rate_update.model_currency_rate_update_service
#, python-format
msgid "Currency Rate Update"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Logs"
msgstr ""
#. module: currency_rate_update
#: field:res.company,auto_currency_up:0
msgid "Automatical update of the currency this company"
msgstr ""
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Month(s)"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "European Central Bank"
msgstr ""
#. module: currency_rate_update
#: help:res.company,interval_type:0
msgid "changing this value will\n"
" also affect other compagnies"
msgstr ""
#. module: currency_rate_update
#: view:res.company:0
msgid "Refresh currencies"
msgstr ""

View File

@@ -1,184 +0,0 @@
# Spanish translation for account-financial-tools
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the account-financial-tools package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: account-financial-tools\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-10-18 17:52+0000\n"
"PO-Revision-Date: 2014-04-08 19:54+0000\n"
"Last-Translator: Pedro Manuel Baeza <pedro.baeza@gmail.com>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-06-12 06:31+0000\n"
"X-Generator: Launchpad (build 17041)\n"
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency auto update configuration"
msgstr "Configuración de auto actualización de las tasas de cambio"
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency updates services"
msgstr "Servicios de actualización de las tasas de cambio"
#. module: currency_rate_update
#: field:currency.rate.update.service,company_id:0
msgid "linked company"
msgstr "compañía relacionada"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rate"
msgstr "Tasa"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rates"
msgstr "Tasas"
#. module: currency_rate_update
#: field:res.company,multi_company_currency_enable:0
msgid "Multi company currency"
msgstr "Moneda multi-compañía"
#. module: currency_rate_update
#: field:res.company,interval_type:0
msgid "Currency update frequence"
msgstr "Frecuencia de actualización"
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Day(s)"
msgstr "Día(s)"
#. module: currency_rate_update
#: field:currency.rate.update.service,currency_to_update:0
msgid "currency to update with this service"
msgstr "moneda a actualizar con este servicio"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Narodowy Bank Polski"
msgstr "Narodowy Bank Polski"
#. module: currency_rate_update
#: field:currency.rate.update.service,note:0
msgid "update notice"
msgstr "nota de actualización"
#. module: currency_rate_update
#: field:currency.rate.update.service,service:0
msgid "Webservice to use"
msgstr "Servicio web a utilizar"
#. module: currency_rate_update
#: help:currency.rate.update.service,max_delta_days:0
msgid ""
"If the time delta between the rate date given by the webservice and the "
"current date exeeds this value, then the currency rate is not updated in "
"OpenERP."
msgstr ""
"Si la diferencia de tiempo entre la fecha de la tasa dada por el servicio "
"web y la fecha actual excede este valor, entonces la tasa de cambio de "
"divisa no se actualizará en OpenERP."
#. module: currency_rate_update
#: field:res.company,services_to_use:0
msgid "Currency update services"
msgstr "Servicios de actualización de la tasa de cambio"
#. module: currency_rate_update
#: constraint:currency.rate.update.service:0
msgid "'Max delta days' must be >= 0"
msgstr "Los días de diferencia máximos deben ser mayor o igual que 0"
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:89
#: sql_constraint:currency.rate.update.service:0
#, python-format
msgid "You can use a service one time per company !"
msgstr "Sólo puedes usar una vez un servicio por compañía"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Yahoo Finance "
msgstr "Yahoo Finance "
#. module: currency_rate_update
#: field:currency.rate.update.service,max_delta_days:0
msgid "Max delta days"
msgstr "Días de diferencia máximos"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Admin.ch"
msgstr "Admin.ch"
#. module: currency_rate_update
#: model:ir.model,name:currency_rate_update.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Currencies to update with this service"
msgstr "Monedas a actualizar con este servicio"
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Week(s)"
msgstr "Semana(s)"
#. module: currency_rate_update
#: help:res.company,multi_company_currency_enable:0
msgid ""
"if this case is not check you can not set currency is active on two company"
msgstr ""
"Si está casilla no está marcada, no podrá marcar que una moneda está activa "
"en dos compañías"
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:153
#: model:ir.model,name:currency_rate_update.model_currency_rate_update
#: model:ir.model,name:currency_rate_update.model_currency_rate_update_service
#, python-format
msgid "Currency Rate Update"
msgstr "Actualización del tipo de cambio"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Logs"
msgstr "Registro"
#. module: currency_rate_update
#: field:res.company,auto_currency_up:0
msgid "Automatical update of the currency this company"
msgstr "Actualización automática del tipo de cambio de esta compañía"
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Month(s)"
msgstr "Mes(es)"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "European Central Bank"
msgstr "Banco Central Europeo"
#. module: currency_rate_update
#: help:res.company,interval_type:0
msgid ""
"changing this value will\n"
" also affect other compagnies"
msgstr "cambiando este valor, también afectará a otras compañías"
#. module: currency_rate_update
#: view:res.company:0
msgid "Refresh currencies"
msgstr "Actualizar tipos de cambio"

View File

@@ -1,181 +0,0 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * c2c_currency_rate_update
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2013-10-18 17:52+0000\n"
"PO-Revision-Date: 2013-11-11 16:24+0000\n"
"Last-Translator: Alexandre Fayolle - camptocamp "
"<alexandre.fayolle@camptocamp.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-06-12 06:31+0000\n"
"X-Generator: Launchpad (build 17041)\n"
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency auto update configuration"
msgstr "Configuration de la mise à jour automatique des taux de change"
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency updates services"
msgstr "Services de mise à jour des taux de change"
#. module: currency_rate_update
#: field:currency.rate.update.service,company_id:0
msgid "linked company"
msgstr "Société liée"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rate"
msgstr "Taux de change"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rates"
msgstr "Taux de change"
#. module: currency_rate_update
#: field:res.company,multi_company_currency_enable:0
msgid "Multi company currency"
msgstr "Devies mutli société"
#. module: currency_rate_update
#: field:res.company,interval_type:0
msgid "Currency update frequence"
msgstr "Fréquence de mise à jour"
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Day(s)"
msgstr "Quotidien"
#. module: currency_rate_update
#: field:currency.rate.update.service,currency_to_update:0
msgid "currency to update with this service"
msgstr "Taux de change à mettre à jour avec ce service"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Narodowy Bank Polski"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,note:0
msgid "update notice"
msgstr "Notice de mise à jour"
#. module: currency_rate_update
#: field:currency.rate.update.service,service:0
msgid "Webservice to use"
msgstr "Service web à utliser"
#. module: currency_rate_update
#: help:currency.rate.update.service,max_delta_days:0
msgid ""
"If the time delta between the rate date given by the webservice and the "
"current date exeeds this value, then the currency rate is not updated in "
"OpenERP."
msgstr ""
#. module: currency_rate_update
#: field:res.company,services_to_use:0
msgid "Currency update services"
msgstr "Service de mise à jour des taux de change"
#. module: currency_rate_update
#: constraint:currency.rate.update.service:0
msgid "'Max delta days' must be >= 0"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:89
#: sql_constraint:currency.rate.update.service:0
#, python-format
msgid "You can use a service one time per company !"
msgstr "Vous ne pouvez utiliser un service qu'une fois par société"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Yahoo Finance "
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,max_delta_days:0
msgid "Max delta days"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Admin.ch"
msgstr ""
#. module: currency_rate_update
#: model:ir.model,name:currency_rate_update.model_res_company
msgid "Companies"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Currencies to update with this service"
msgstr ""
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Week(s)"
msgstr "Hebdomadaire"
#. module: currency_rate_update
#: help:res.company,multi_company_currency_enable:0
msgid ""
"if this case is not check you can not set currency is active on two company"
msgstr ""
"Si cette case n'est pas cochée vous ne pouvez pas utiliser la mise à jour "
"sur plusieurs sociétés"
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:153
#: model:ir.model,name:currency_rate_update.model_currency_rate_update
#: model:ir.model,name:currency_rate_update.model_currency_rate_update_service
#, python-format
msgid "Currency Rate Update"
msgstr "Mise à jour des taux de change"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Logs"
msgstr ""
#. module: currency_rate_update
#: field:res.company,auto_currency_up:0
msgid "Automatical update of the currency this company"
msgstr "Mise à jour automatique des taux de change"
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Month(s)"
msgstr "Mensuelle"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "European Central Bank"
msgstr ""
#. module: currency_rate_update
#: help:res.company,interval_type:0
msgid ""
"changing this value will\n"
" also affect other compagnies"
msgstr "Modifier cette devise va aussi affecter les autre sociétés"
#. module: currency_rate_update
#: view:res.company:0
msgid "Refresh currencies"
msgstr "Mettre à jour les taux de change"

View File

@@ -1,180 +0,0 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * c2c_currency_rate_update
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2013-10-18 17:52+0000\n"
"PO-Revision-Date: 2013-11-11 16:33+0000\n"
"Last-Translator: Grzegorz Grzelak (Cirrus) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-06-12 06:31+0000\n"
"X-Generator: Launchpad (build 17041)\n"
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency auto update configuration"
msgstr "Aktualizacja kursów walut"
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency updates services"
msgstr "Serwisy aktualizacji kursów"
#. module: currency_rate_update
#: field:currency.rate.update.service,company_id:0
msgid "linked company"
msgstr "dla firmy"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rate"
msgstr "Kurs"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rates"
msgstr "Kursy"
#. module: currency_rate_update
#: field:res.company,multi_company_currency_enable:0
msgid "Multi company currency"
msgstr "Waluta dla wielu firm"
#. module: currency_rate_update
#: field:res.company,interval_type:0
msgid "Currency update frequence"
msgstr "Częstotliwość aktualizacji kursów"
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Day(s)"
msgstr "Codziennie"
#. module: currency_rate_update
#: field:currency.rate.update.service,currency_to_update:0
msgid "currency to update with this service"
msgstr "Waluty aktualizowane tym serwisem"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Narodowy Bank Polski"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,note:0
msgid "update notice"
msgstr "Notatka aktualizacji"
#. module: currency_rate_update
#: field:currency.rate.update.service,service:0
msgid "Webservice to use"
msgstr "Strona web do zastosowania"
#. module: currency_rate_update
#: help:currency.rate.update.service,max_delta_days:0
msgid ""
"If the time delta between the rate date given by the webservice and the "
"current date exeeds this value, then the currency rate is not updated in "
"OpenERP."
msgstr ""
#. module: currency_rate_update
#: field:res.company,services_to_use:0
msgid "Currency update services"
msgstr "Serwisy aktualizacji kursów"
#. module: currency_rate_update
#: constraint:currency.rate.update.service:0
msgid "'Max delta days' must be >= 0"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:89
#: sql_constraint:currency.rate.update.service:0
#, python-format
msgid "You can use a service one time per company !"
msgstr "Możesz stosować jeden serwis na firmę !"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Yahoo Finance "
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,max_delta_days:0
msgid "Max delta days"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Admin.ch"
msgstr ""
#. module: currency_rate_update
#: model:ir.model,name:currency_rate_update.model_res_company
msgid "Companies"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Currencies to update with this service"
msgstr ""
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Week(s)"
msgstr "Co tydzień"
#. module: currency_rate_update
#: help:res.company,multi_company_currency_enable:0
msgid ""
"if this case is not check you can not set currency is active on two company"
msgstr ""
"Jeśli nie zaznaczysz, to nie będziesz mógł ustawić waluty jako aktywnej dla "
"dwóch firm"
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:153
#: model:ir.model,name:currency_rate_update.model_currency_rate_update
#: model:ir.model,name:currency_rate_update.model_currency_rate_update_service
#, python-format
msgid "Currency Rate Update"
msgstr "Aktualizacja kursów walut"
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Logs"
msgstr ""
#. module: currency_rate_update
#: field:res.company,auto_currency_up:0
msgid "Automatical update of the currency this company"
msgstr "Automatyczna aktualizacja kursów walut dla tej firmy"
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Month(s)"
msgstr "Co miesiąc"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "European Central Bank"
msgstr ""
#. module: currency_rate_update
#: help:res.company,interval_type:0
msgid ""
"changing this value will\n"
" also affect other compagnies"
msgstr "Zmiana tej wartości wpłynie również na inne firmy"
#. module: currency_rate_update
#: view:res.company:0
msgid "Refresh currencies"
msgstr "Aktualizuj kursy"

View File

@@ -1,192 +0,0 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * c2c_currency_rate_update
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-06-17 08:25:57+0000\n"
"PO-Revision-Date: 2009-11-12 11:39+0100\n"
"Last-Translator: Grzegorz Grzelak (Cirrus) <grzegorz.grzelak@cirrus.pl>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: \n"
#. module: c2c_currency_rate_update
#: view:res.company:0
msgid "Currency auto update configuration"
msgstr "Aktualizacja kursów walut"
#. module: c2c_currency_rate_update
#: view:res.company:0
msgid "Currency updates services"
msgstr "Serwisy aktualizacji kursów"
#. module: c2c_currency_rate_update
#: field:currency.rate.update.service,company_id:0
msgid "linked company"
msgstr "dla firmy"
#. module: c2c_currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rates"
msgstr "Kursy"
#. module: c2c_currency_rate_update
#: constraint:ir.model:0
msgid "The Object name must start with x_ and not contain any special character !"
msgstr "Nazwa obiektu musi zaczynać się od x_ oraz nie może zawierać znaków specjalnych !"
#. module: c2c_currency_rate_update
#: field:res.company,multi_company_currency_enable:0
msgid "Multi company currency"
msgstr "Waluta dla wielu firm"
#. module: c2c_currency_rate_update
#: field:res.company,interval_type:0
msgid "Currency update frequence"
msgstr "Częstotliwość aktualizacji kursów"
#. module: c2c_currency_rate_update
#: selection:res.company,interval_type:0
msgid "Day(s)"
msgstr "Codziennie"
#. module: c2c_currency_rate_update
#: field:currency.rate.update.service,currency_to_update:0
msgid "currency to update with this service"
msgstr "Waluty aktualizowane tym serwisem"
#. module: c2c_currency_rate_update
#: field:currency.rate.update.service,note:0
msgid "update notice"
msgstr "Notatka aktualizacji"
#. module: c2c_currency_rate_update
#: field:currency.rate.update.service,service:0
msgid "Webservice to use"
msgstr "Strona web do zastosowania"
#. module: c2c_currency_rate_update
#: selection:res.company,interval_type:0
msgid "Month(s)"
msgstr "Co miesiąc"
#. module: c2c_currency_rate_update
#: view:currency.rate.update.service:0
msgid "note"
msgstr "Notatka"
#. module: c2c_currency_rate_update
#: field:res.company,services_to_use:0
msgid "Currency update services"
msgstr "Serwisy aktualizacji kursów"
#. module: c2c_currency_rate_update
#: view:currency.rate.update.service:0
msgid "Currencies to update with this services"
msgstr "Waluty aktualizowane tymi serwisami"
#. module: c2c_currency_rate_update
#: code:addons/c2c_currency_rate_update/currency_rate_update.py:0
#, python-format
msgid "You can use a service one time per company !"
msgstr "Możesz stosować jeden serwis na firmę !"
#. module: c2c_currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Yahoo Finance "
msgstr ""
#. module: c2c_currency_rate_update
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML niewłaściwy dla tej architektury wyświetlania!"
#. module: c2c_currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Admin.ch"
msgstr ""
#. module: c2c_currency_rate_update
#: selection:res.company,interval_type:0
msgid "Week(s)"
msgstr "Co tydzień"
#. module: c2c_currency_rate_update
#: help:res.company,multi_company_currency_enable:0
msgid "if this case is not check you can not set currency is active on two company"
msgstr "Jeśli nie zaznaczysz, to nie będziesz mógł ustawić waluty jako aktywnej dla dwóch firm"
#. module: c2c_currency_rate_update
#: code:addons/c2c_currency_rate_update/currency_rate_update.py:0
#: model:ir.model,name:c2c_currency_rate_update.model_currency_rate_update
#: model:ir.model,name:c2c_currency_rate_update.model_currency_rate_update_service
#: model:ir.module.module,shortdesc:c2c_currency_rate_update.module_name_translation
#, python-format
msgid "Currency Rate Update"
msgstr "Aktualizacja kursów walut"
#. module: c2c_currency_rate_update
#: model:ir.module.module,description:c2c_currency_rate_update.module_name_translation
msgid ""
"\n"
"Import exchange rates from three different sources on the internet :\n"
"\n"
"1. Admin.ch\n"
" Updated daily, source in CHF. Source type is XML based.\n"
"\n"
"2. Federal Reserve Bank of New York\n"
" Daily 12 noon buying rates in New York are certified by the\n"
" New York Federal Reserve Bank for customs purposes.\n"
" Source in USD.\n"
" http://www.newyorkfed.org/markets/pilotfx.html\n"
"\n"
"3. European Central Bank\n"
" The reference rates are based on the regular daily concertation procedure between\n"
" central banks within and outside the European System of Central Banks,\n"
" which normally takes place at 2.15 p.m. (14:15) ECB time. Source in EUR.\n"
" http://www.ecb.europa.eu/stats/exchange/eurofxref/html/index.en.html\n"
"\n"
"4. Google Finance\n"
" Updated daily from Citibank N.A., source in EUR. Information may be delayed.\n"
" This is parsed from an HTML page, so it may be broken at anytime.\n"
"\n"
"5. Bank of Canada\n"
" Updated daily at 12:30 am, source in CAD, nominal rate. Source type is CSV based.\n"
"\n"
"You can set time cycle for getting updates, 'first execute date' define when to start\n"
"the import and you can add a comment that describe why you use that particular service.\n"
"\n"
"The module uses internal ir_cron feature from OpenERP, so the job is launched once\n"
"the server starts if the 'first execute date' is before the current day.\n"
"\n"
"If in multi-company mode, the base currency will be the first company's currency\n"
"found in database.\n"
msgstr ""
#. module: c2c_currency_rate_update
#: field:res.company,auto_currency_up:0
msgid "Automatical update of the currency this company"
msgstr "Automatyczna aktualizacja kursów walut dla tej firmy"
#. module: c2c_currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rate"
msgstr "Kurs"
#. module: c2c_currency_rate_update
#: help:res.company,interval_type:0
msgid ""
"changing this value will\n"
" also affect other compagnies"
msgstr "Zmiana tej wartości wpłynie również na inne firmy"
#. module: c2c_currency_rate_update
#: view:res.company:0
msgid "Refresh currencies"
msgstr "Aktualizuj kursy"

View File

@@ -1,179 +0,0 @@
# Brazilian Portuguese translation for account-financial-tools
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the account-financial-tools package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: account-financial-tools\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-10-18 17:52+0000\n"
"PO-Revision-Date: 2014-01-10 11:21+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-06-12 06:31+0000\n"
"X-Generator: Launchpad (build 17041)\n"
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency auto update configuration"
msgstr ""
#. module: currency_rate_update
#: view:res.company:0
msgid "Currency updates services"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,company_id:0
msgid "linked company"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rate"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Rates"
msgstr ""
#. module: currency_rate_update
#: field:res.company,multi_company_currency_enable:0
msgid "Multi company currency"
msgstr ""
#. module: currency_rate_update
#: field:res.company,interval_type:0
msgid "Currency update frequence"
msgstr ""
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Day(s)"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,currency_to_update:0
msgid "currency to update with this service"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Narodowy Bank Polski"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,note:0
msgid "update notice"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,service:0
msgid "Webservice to use"
msgstr ""
#. module: currency_rate_update
#: help:currency.rate.update.service,max_delta_days:0
msgid ""
"If the time delta between the rate date given by the webservice and the "
"current date exeeds this value, then the currency rate is not updated in "
"OpenERP."
msgstr ""
#. module: currency_rate_update
#: field:res.company,services_to_use:0
msgid "Currency update services"
msgstr ""
#. module: currency_rate_update
#: constraint:currency.rate.update.service:0
msgid "'Max delta days' must be >= 0"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:89
#: sql_constraint:currency.rate.update.service:0
#, python-format
msgid "You can use a service one time per company !"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Yahoo Finance "
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,max_delta_days:0
msgid "Max delta days"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Admin.ch"
msgstr ""
#. module: currency_rate_update
#: model:ir.model,name:currency_rate_update.model_res_company
msgid "Companies"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Currencies to update with this service"
msgstr ""
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Week(s)"
msgstr ""
#. module: currency_rate_update
#: help:res.company,multi_company_currency_enable:0
msgid ""
"if this case is not check you can not set currency is active on two company"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/currency_rate_update.py:153
#: model:ir.model,name:currency_rate_update.model_currency_rate_update
#: model:ir.model,name:currency_rate_update.model_currency_rate_update_service
#, python-format
msgid "Currency Rate Update"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:0
msgid "Logs"
msgstr ""
#. module: currency_rate_update
#: field:res.company,auto_currency_up:0
msgid "Automatical update of the currency this company"
msgstr ""
#. module: currency_rate_update
#: selection:res.company,interval_type:0
msgid "Month(s)"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "European Central Bank"
msgstr ""
#. module: currency_rate_update
#: help:res.company,interval_type:0
msgid ""
"changing this value will\n"
" also affect other compagnies"
msgstr ""
#. module: currency_rate_update
#: view:res.company:0
msgid "Refresh currencies"
msgstr ""

View File

@@ -1,67 +0,0 @@
<?xml version="1.0" ?>
<openerp>
<data noupdate="1">
<record id="ir_model_access_currencyrateupdate0" model="ir.model.access">
<field name="model_id" ref="currency_rate_update.model_currency_rate_update"/>
<field eval="1" name="perm_read"/>
<field eval="&quot;&quot;&quot;Currency Rate Update&quot;&quot;&quot;" name="name"/>
<field eval="0" name="perm_unlink"/>
<field eval="0" name="perm_write"/>
<field eval="0" name="perm_create"/>
</record>
</data>
<data>
<record id="ir_model_access_currencyrateupdate1" model="ir.model.access">
<field name="model_id" ref="currency_rate_update.model_currency_rate_update"/>
<field eval="1" name="perm_read"/>
<field eval="&quot;&quot;&quot;Currency Rate Update&quot;&quot;&quot;" name="name"/>
<field eval="1" name="perm_unlink"/>
<field eval="1" name="perm_write"/>
<field eval="1" name="perm_create"/>
<field name="group_id" ref="account.group_account_manager"/>
</record>
</data>
<data>
<record id="ir_model_access_currencyrateupdate2" model="ir.model.access">
<field name="model_id" ref="currency_rate_update.model_currency_rate_update"/>
<field eval="1" name="perm_read"/>
<field eval="&quot;&quot;&quot;Currency Rate Update&quot;&quot;&quot;" name="name"/>
<field eval="1" name="perm_unlink"/>
<field eval="1" name="perm_write"/>
<field eval="1" name="perm_create"/>
<field name="group_id" ref="base.group_system"/>
</record>
</data>
<data>
<record id="ir_model_access_currencyrateupdate3" model="ir.model.access">
<field name="model_id" ref="currency_rate_update.model_currency_rate_update_service"/>
<field eval="1" name="perm_read"/>
<field eval="&quot;&quot;&quot;Currency Rate Update&quot;&quot;&quot;" name="name"/>
<field eval="1" name="perm_unlink"/>
<field eval="1" name="perm_write"/>
<field eval="1" name="perm_create"/>
<field name="group_id" ref="account.group_account_manager"/>
</record>
</data>
<data>
<record id="ir_model_access_currencyrateupdate4" model="ir.model.access">
<field name="model_id" ref="currency_rate_update.model_currency_rate_update_service"/>
<field eval="1" name="perm_read"/>
<field eval="&quot;&quot;&quot;Currency Rate Update&quot;&quot;&quot;" name="name"/>
<field eval="0" name="perm_unlink"/>
<field eval="0" name="perm_write"/>
<field eval="0" name="perm_create"/>
</record>
</data>
<data>
<record id="ir_model_access_currencyrateupdate5" model="ir.model.access">
<field name="model_id" ref="currency_rate_update.model_currency_rate_update_service"/>
<field eval="1" name="perm_read"/>
<field eval="&quot;&quot;&quot;Currency Rate Update&quot;&quot;&quot;" name="name"/>
<field eval="1" name="perm_unlink"/>
<field eval="1" name="perm_write"/>
<field eval="1" name="perm_create"/>
<field name="group_id" ref="base.group_system"/>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,63 @@
Import exchange rates from the Internet.
The module is able to use 4 different sources:
1. Admin.ch
Updated daily, source in CHF.
2. European Central Bank (ported by Grzegorz Grzelak)
The reference rates are based on the regular daily concertation
procedure between central banks within and outside the European
System of Central Banks, which normally takes place at 2.15 p.m.
(14:15) ECB time. Source in EUR.
http://www.ecb.europa.eu/stats/exchange/eurofxref/html/index.en.html
3. Yahoo Finance
Updated daily
4. Polish National Bank (Narodowy Bank Polski)
Takes official rates from www.nbp.pl. Adds rate table symbol in log.
You should check when rates should apply to bookkeeping.
If next day you should change the update hour in schedule settings
because in OpenERP they apply from date of update (date - no hours).
5. Banxico for USD & MXN (created by Agustín Cruz)
Updated daily
6. Bank of Canada
7. National Bank of Romania (Banca Nationala a Romaniei)
In the roadmap :
Google Finance.
Updated daily from Citibank N.A., source in EUR. Information may be delayed.
This is parsed from an HTML page, so it may be broken at anytime.
The update can be set under the company form.
You can set for each services which currency you want to update.
The logs of the update are visible under the service note.
You can active or deactivate the update.
The module uses internal ir-cron feature from OpenERP, so the job is
launched once the server starts if the 'first execute date' is before
the current day.
The module supports multi-company currency in two ways:
* the currencies are shared, you can set currency update only on one
company
* the currency are separated, you can set currency on every company
separately
A function field lets you know your currency configuration.
If in multi-company mode, the base currency will be the first company's
currency found in database.
Thanks to main contributors:
* Joel Grand-Guillaume
* JB Aubort
* Grzegorz Grzelak - grzegorz.grzelak@birdglobe.com (ECB, NBP)
* Alexis de Lattre - alexis@via.ecp.fr
* Lorenzo Battistini - lorenzo.battistini@agilebg.com (Port to V7)
* Agustin Cruz - openpyme.mx (BdM)
* Dorin Hongu - dhongu@gmail.com (BNR)
* Fekete Mihai - feketemihai@gmail.com (Port to V8)

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import model

View File

@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
"name": "Currency Rate Update",
"version": "0.7",
"author": "Camptocamp",
"website": "http://camptocamp.com",
"category": "Financial Management/Configuration",
"depends": [
"base",
"account", # Added to ensure account security groups are present
],
"data": [
"view/service_cron_data.xml",
"view/currency_rate_update.xml",
"view/company_view.xml",
"security/ir.model.access.csv",
],
"demo": [],
"active": False,
'installable': True
}

View File

@@ -0,0 +1,246 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * currency_rate_update
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-11-19 11:15+0000\n"
"PO-Revision-Date: 2014-11-19 11:15+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Admin.ch"
msgstr ""
#. module: currency_rate_update
#: field:res.company,auto_currency_up:0
msgid "Automatic Update"
msgstr ""
#. module: currency_rate_update
#: help:res.company,auto_currency_up:0
msgid "Automatical update of the currencies for this company"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Bank of Canada - noon rates"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Bank of Mexico"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/model/currency_rate_update.py:241
#, python-format
msgid "Base currency rate should be 1.00!"
msgstr ""
#. module: currency_rate_update
#: model:ir.model,name:currency_rate_update.model_res_company
msgid "Companies"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,create_uid:0
msgid "Created by"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,create_date:0
msgid "Created on"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,currency_list:0
msgid "Currencies available"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:currency_rate_update.currency_rate_update_form
#: field:currency.rate.update.service,currency_to_update:0
msgid "Currencies to update with this service"
msgstr ""
#. module: currency_rate_update
#: model:ir.model,name:currency_rate_update.model_currency_rate_update_service
msgid "Currency Rate Update"
msgstr ""
#. module: currency_rate_update
#: view:res.company:currency_rate_update.currency_auto_comp
msgid "Currency update configuration"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,interval_type:0
msgid "Currency update frequency"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:currency_rate_update.currency_rate_update_form
#: view:currency.rate.update.service:currency_rate_update.currency_rate_update_tree
#: view:res.company:currency_rate_update.currency_auto_comp
#: field:res.company,services_to_use:0
msgid "Currency update services"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,interval_type:0
msgid "Day(s)"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/services/update_service_CA_BOC.py:73
#: code:addons/currency_rate_update/services/update_service_CA_BOC.py:94
#, python-format
msgid "Error !"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "European Central Bank"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/services/update_service_CA_BOC.py:75
#, python-format
msgid "Exchange data for %s is not reported by Bank of Canada."
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/services/update_service_CA_BOC.py:96
#, python-format
msgid "Exchange data format error for Bank of Canada - %s !"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,interval_number:0
msgid "Frequency"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,id:0
msgid "ID"
msgstr ""
#. module: currency_rate_update
#: help:currency.rate.update.service,max_delta_days:0
msgid "If the time delta between the rate date given by the webservice and the current date exceeds this value, then the currency rate is not updated in OpenERP."
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/model/currency_rate_update.py:123
#, python-format
msgid "Interval number must be >= 0"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,write_uid:0
msgid "Last Updated by"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,write_date:0
msgid "Last Updated on"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,company_id:0
msgid "Linked Company"
msgstr ""
#. module: currency_rate_update
#: view:currency.rate.update.service:currency_rate_update.currency_rate_update_form
msgid "Logs"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,max_delta_days:0
msgid "Max delta days"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/model/currency_rate_update.py:117
#, python-format
msgid "Max delta days must be >= 0"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,interval_type:0
msgid "Month(s)"
msgstr ""
#. module: currency_rate_update
#: field:res.company,multi_company_currency_enable:0
msgid "Multi company currency"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "National Bank of Poland"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "National Bank of Romania"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,next_run:0
msgid "Next run on"
msgstr ""
#. module: currency_rate_update
#: view:res.company:currency_rate_update.currency_auto_comp
msgid "Refresh currencies"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/model/currency_rate_update.py:239
#, python-format
msgid "There is no base currency set!"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,note:0
msgid "Update logs"
msgstr ""
#. module: currency_rate_update
#: field:currency.rate.update.service,service:0
msgid "Webservice to use"
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,interval_type:0
msgid "Week(s)"
msgstr ""
#. module: currency_rate_update
#: help:res.company,multi_company_currency_enable:0
msgid "When this option is unchecked it will allow users to set a distinct currency updates on each company."
msgstr ""
#. module: currency_rate_update
#: selection:currency.rate.update.service,service:0
msgid "Yahoo Finance"
msgstr ""
#. module: currency_rate_update
#: code:addons/currency_rate_update/model/currency_rate_update.py:216
#: sql_constraint:currency.rate.update.service:0
#, python-format
msgid "You can use a service only one time per company !"
msgstr ""

View File

@@ -1,11 +1,8 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2008 Camtocamp SA
# @author JB Aubort, Nicolas Bessi, Joel Grand-Guillaume
# European Central Bank and Polish National Bank
# invented by Grzegorz Grzelak
# Banxico implemented by Agustin Cruz openpyme.mx
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as

View File

@@ -0,0 +1,60 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields, api
class res_company(models.Model):
"""override company to add currency update"""
@api.multi
def _compute_multi_curr_enable(self):
"check if multi company currency is enabled"
company_currency = self.env['res.currency'].search([('company_id',
'!=', False)])
for company in self:
company.multi_company_currency_enable = \
1 if company_currency else 0
@api.one
def button_refresh_currency(self):
"""Refresh the currencies rates !!for all companies now"""
self.services_to_use.refresh_currency()
_inherit = "res.company"
# Activate the currency update
auto_currency_up = fields.Boolean(
string='Automatic Update',
help="Automatical update of the currencies for this company")
# Function field that allows to know the
# multi company currency implementation
multi_company_currency_enable = fields.Boolean(
string='Multi company currency', translate=True,
compute="_compute_multi_curr_enable",
help="When this option is unchecked it will allow users "
"to set a distinct currency updates on each company."
)
# List of services to fetch rates
services_to_use = fields.One2many(
'currency.rate.update.service',
'company_id',
string='Currency update services')

View File

@@ -0,0 +1,325 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import logging
from datetime import datetime, time
from dateutil.relativedelta import relativedelta
from openerp import models, fields, api, _
from openerp import exceptions
from ..services.currency_getter import Currency_getter_factory
_logger = logging.getLogger(__name__)
_intervalTypes = {
'days': lambda interval: relativedelta(days=interval),
'weeks': lambda interval: relativedelta(days=7*interval),
'months': lambda interval: relativedelta(months=interval),
}
supported_currency_array = [
"AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN",
"BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BRL",
"BSD", "BTN", "BWP", "BYR", "BZD", "CAD", "CDF", "CHF", "CLP", "CNY",
"COP", "CRC", "CUP", "CVE", "CYP", "CZK", "DJF", "DKK", "DOP", "DZD",
"EEK", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GGP",
"GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG",
"HUF", "IDR", "ILS", "IMP", "INR", "IQD", "IRR", "ISK", "JEP", "JMD",
"JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD",
"KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LTL", "LVL", "LYD", "MAD",
"MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MTL", "MUR", "MVR",
"MWK", "MXN", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD",
"OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON",
"RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP",
"SLL", "SOS", "SPL", "SRD", "STD", "SVC", "SYP", "SZL", "THB", "TJS",
"TMM", "TND", "TOP", "TRY", "TTD", "TVD", "TWD", "TZS", "UAH", "UGX",
"USD", "UYU", "UZS", "VEB", "VEF", "VND", "VUV", "WST", "XAF", "XAG",
"XAU", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT", "YER", "ZAR", "ZMK",
"ZWD"
]
YAHOO_supported_currency_array = [
"AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN",
"BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BRL",
"BSD", "BTN", "BWP", "BYR", "BZD", "CAD", "CDF", "CHF", "CLF", "CLP",
"CNH", "CNY", "COP", "CRC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP",
"DZD", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GHS",
"GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG", "HUF",
"IDR", "IEP", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY",
"KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK",
"LBP", "LKR", "LRD", "LSL", "LTL", "LVL", "LYD", "MAD", "MDL", "MGA",
"MKD", "MMK", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MXV",
"MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB",
"PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB",
"RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS",
"SRD", "STD", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP",
"TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "UYU", "UZS", "VEF",
"VND", "VUV", "WST", "XAF", "XAG", "XAU", "XCD", "XCP", "XDR", "XOF",
"XPD", "XPF", "XPT", "YER", "ZAR", "ZMW", "ZWL"]
RO_BNR_supported_currency_array = [
"AED", "AUD", "BGN", "BRL", "CAD", "CHF", "CNY", "CZK", "DKK", "EGP",
"EUR", "GBP", "HUF", "INR", "JPY", "KRW", "MDL", "MXN", "NOK", "NZD",
"PLN", "RON", "RSD", "RUB", "SEK", "TRY", "UAH", "USD", "XAU", "XDR",
"ZAR"]
CA_BOC_supported_currency_array = [
"AED", "ANG", "ARS", "AUD", "BOC", "BRL", "BSD", "CHF", "CLP", "CNY",
"COP", "CZK", "DKK", "EUR", "FJD", "GBP", "GHS", "GTQ", "HKD", "HNL",
"HRK", "HUF", "IDR", "ILS", "INR", "ISK", "JMD", "JPY", "KRW", "LKR",
"MAD", "MMK", "MXN", "MYR", "NOK", "NZD", "PAB", "PEN", "PHP", "PKR",
"PLN", "RON", "RSD", "RUB", "SEK", "SGD", "THB", "TND", "TRY", "TTD",
"TWD", "USD", "VEF", "VND", "XAF", "XCD", "XPF", "ZAR"]
CH_ADMIN_supported_currency_array = [
"AED", "ALL", "ARS", "AUD", "AZN", "BAM", "BDT", "BGN", "BHD", "BRL",
"CAD", "CHF", "CLP", "CNY", "COP", "CRC", "CZK", "DKK", "DOP", "EGP",
"ETB", "EUR", "GBP", "GTQ", "HKD", "HNL", "HRK", "HUF", "IDR", "ILS",
"INR", "ISK", "JPY", "KES", "KHR", "KRW", "KWD", "KYD", "KZT", "LBP",
"LKR", "LTL", "LVL", "LYD", "MAD", "MUR", "MXN", "MYR", "NGN", "NOK",
"NZD", "OMR", "PAB", "PEN", "PHP", "PKR", "PLN", "QAR", "RON", "RSD",
"RUB", "SAR", "SEK", "SGD", "THB", "TND", "TRY", "TWD", "TZS", "UAH",
"USD", "UYU", "VEF", "VND", "ZAR"]
ECB_supported_currency_array = [
"AUD", "BGN", "BRL", "CAD", "CHF", "CNY", "CZK", "DKK", "GBP", "HKD",
"HRK", "HUF", "IDR", "ILS", "INR", "JPY", "KRW", "LTL", "MXN", "MYR",
"NOK", "NZD", "PHP", "PLN", "RON", "RUB", "SEK", "SGD", "THB", "TRY",
"USD", "ZAR"]
MX_BdM_supported_currency_array = [
"ARS", "AUD", "BBD", "BMD", "BOB", "BRL", "BSD", "BZD", "CAD", "CHF",
"CLP", "CNH", "CNY", "COP", "CRC", "CUP", "CZK", "DKK", "DOP", "DZD",
"EGP", "ESD", "EUR", "FJD", "GBP", "GTQ", "GYD", "HKD", "HNL", "HUF",
"IDR", "ILS", "INR", "IQD", "JMD", "JPY", "KES", "KRW", "KWD", "MAD",
"MYR", "NGN", "NIC", "NOK", "NZD", "PAB", "PEN", "PHP", "PLN", "PYG",
"RON", "RUB", "SAR", "SEK", "SGD", "SVC", "THB", "TRY", "TTD", "TWD",
"UAH", "USD", "USD", "UYP", "VEF", "VND", "ZAR"]
PL_NBP_supported_currency_array = [
"AUD", "BGN", "BRL", "CAD", "CHF", "CLP", "CNY", "CZK", "DKK", "EUR",
"GBP", "HKD", "HRK", "HUF", "IDR", "ILS", "INR", "ISK", "JPY", "KRW",
"LTL", "MXN", "MYR", "NOK", "NZD", "PHP", "PLN", "RON", "RUB", "SEK",
"SGD", "THB", "TRY", "UAH", "USD", "XDR", "ZAR"]
supported_currecies = {
'YAHOO_getter': YAHOO_supported_currency_array,
'ECB_getter': ECB_supported_currency_array,
'RO_BNR_getter': RO_BNR_supported_currency_array,
'CA_BOC_getter': CA_BOC_supported_currency_array,
'CH_ADMIN_getter': CH_ADMIN_supported_currency_array,
'MX_BdM_getter': MX_BdM_supported_currency_array,
'PL_NBP_getter': PL_NBP_supported_currency_array,
}
class Currency_rate_update_service(models.Model):
"""Class keep services and currencies that
have to be updated"""
_name = "currency.rate.update.service"
_description = "Currency Rate Update"
@api.one
@api.constrains('max_delta_days')
def _check_max_delta_days(self):
if self.max_delta_days < 0:
raise exceptions.Warning(_('Max delta days must be >= 0'))
@api.one
@api.constrains('interval_number')
def _check_interval_number(self):
if self.interval_number < 0:
raise exceptions.Warning(_('Interval number must be >= 0'))
@api.onchange('interval_number')
def _onchange_interval_number(self):
if self.interval_number == 0:
self.note = '%s Service deactivated. Currencies will no longer ' \
'be updated. \n%s' % (fields.Datetime.now(),
self.note and self.note or '')
@api.onchange('service')
def _onchange_service(self):
currency_list = ''
if self.service:
currencies = []
currency_list = supported_currency_array
company_id = False
if self.company_id.multi_company_currency_enable:
company_id = self.company_id.id
currency_list = supported_currecies[self.service]
if company_id:
currencies = self.env['res.currency'].search(
[('name', 'in', currency_list),
'|', ('company_id', '=', company_id),
('company_id', '=', False)])
else:
currencies = self.env['res.currency'].search(
[('name', 'in', currency_list),
('company_id', '=', False)])
self.currency_list = [(6, 0, [curr.id for curr in currencies])]
# List of webservicies the value sould be a class name
service = fields.Selection(
[('CH_ADMIN_getter', 'Admin.ch'),
('ECB_getter', 'European Central Bank'),
('YAHOO_getter', 'Yahoo Finance'),
# Added for polish rates
('PL_NBP_getter', 'National Bank of Poland'),
# Added for mexican rates
('MX_BdM_getter', 'Bank of Mexico'),
# Bank of Canada is using RSS-CB
# http://www.cbwiki.net/wiki/index.php/Specification_1.1
# This RSS format is used by other national banks
# (Thailand, Malaysia, Mexico...)
('CA_BOC_getter', 'Bank of Canada - noon rates'),
# Added for romanian rates
('RO_BNR_getter', 'National Bank of Romania')
],
string="Webservice to use",
required=True)
# List of currencies available on webservice
currency_list = fields.Many2many('res.currency',
'res_currency_update_avail_rel',
'service_id',
'currency_id',
string='Currencies available')
# List of currency to update
currency_to_update = fields.Many2many('res.currency',
'res_currency_auto_update_rel',
'service_id',
'currency_id',
string='Currencies to update with '
'this service')
# Link with company
company_id = fields.Many2one('res.company', 'Linked Company')
# Note fileds that will be used as a logger
note = fields.Text('Update logs')
max_delta_days = fields.Integer(
string='Max delta days', default=4, required=True,
help="If the time delta between the rate date given by the "
"webservice and the current date exceeds this value, "
"then the currency rate is not updated in OpenERP.")
interval_type = fields.Selection([
('days', 'Day(s)'),
('weeks', 'Week(s)'),
('months', 'Month(s)')],
string='Currency update frequency',
default='days')
interval_number = fields.Integer(string='Frequency', default=1)
next_run = fields.Date(string='Next run on', default=fields.Date.today())
_sql_constraints = [('curr_service_unique',
'unique (service, company_id)',
_('You can use a service only one time per '
'company !'))]
@api.one
def refresh_currency(self):
"""Refresh the currencies rates !!for all companies now"""
factory = Currency_getter_factory()
curr_obj = self.env['res.currency']
rate_obj = self.env['res.currency.rate']
company = self.company_id
# The multi company currency can be set or no so we handle
# The two case
if company.auto_currency_up:
main_currency = curr_obj.search(
[('base', '=', True), ('company_id', '=', company.id)],
limit=1)
if not main_currency:
# If we can not find a base currency for this company
# we look for one with no company set
main_currency = curr_obj.search(
[('base', '=', True), ('company_id', '=', False)],
limit=1)
if not main_currency:
raise exceptions.Warning(_('There is no base currency set!'))
if main_currency.rate != 1:
raise exceptions.Warning(_('Base currency rate should '
'be 1.00!'))
note = self.note or ''
try:
# We initalize the class that will handle the request
# and return a dict of rate
getter = factory.register(self.service)
curr_to_fetch = map(lambda x: x.name,
self.currency_to_update)
res, log_info = getter.get_updated_currency(
curr_to_fetch,
main_currency.name,
self.max_delta_days
)
rate_name = \
fields.Datetime.to_string(datetime.utcnow().replace(
hour=0, minute=0, second=0, microsecond=0))
for curr in self.currency_to_update:
if curr.id == main_currency.id:
continue
do_create = True
for rate in curr.rate_ids:
if rate.name == rate_name:
rate.rate = res[curr.name]
do_create = False
break
if do_create:
vals = {
'currency_id': curr.id,
'rate': res[curr.name],
'name': rate_name
}
rate_obj.create(vals)
# Show the most recent note at the top
msg = '%s \n%s currency updated. %s' % (
log_info or '',
fields.Datetime.to_string(datetime.today()),
note
)
self.write({'note': msg})
except Exception as exc:
error_msg = '\n%s ERROR : %s %s' % (
fields.Datetime.to_string(datetime.today()),
repr(exc),
note
)
_logger.info(repr(exc))
self.write({'note': error_msg})
if self._context.get('cron', False):
midnight = time(0, 0)
next_run = (datetime.combine(
fields.Date.from_string(self.next_run),
midnight) +
_intervalTypes[str(self.interval_type)]
(self.interval_number)).date()
self.next_run = next_run
@api.multi
def run_currency_update(self):
# Update currency at the given frequence
services = self.search([('next_run', '=', fields.Date.today())])
services.with_context(cron=True).refresh_currency()
@api.model
def _run_currency_update(self):
self.run_currency_update()

View File

@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_account_currency_rate_update_service_settings,currency.rate.update.service,model_currency_rate_update_service,account.group_account_manager,1,1,1,1
access_account_currency_rate_update_service_financial,currency.rate.update.service,model_currency_rate_update_service,base.group_system,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_account_currency_rate_update_service_settings currency.rate.update.service model_currency_rate_update_service account.group_account_manager 1 1 1 1
3 access_account_currency_rate_update_service_financial currency.rate.update.service model_currency_rate_update_service base.group_system 1 1 1 1

View File

@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################

View File

@@ -0,0 +1,81 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
class AbstractClassError(Exception):
def __str__(self):
return 'Abstract Class'
def __repr__(self):
return 'Abstract Class'
class AbstractMethodError(Exception):
def __str__(self):
return 'Abstract Method'
def __repr__(self):
return 'Abstract Method'
class UnknowClassError(Exception):
def __str__(self):
return 'Unknown Class'
def __repr__(self):
return 'Unknown Class'
class UnsuportedCurrencyError(Exception):
def __init__(self, value):
self.curr = value
def __str__(self):
return 'Unsupported currency %s' % self.curr
def __repr__(self):
return 'Unsupported currency %s' % self.curr
class Currency_getter_factory():
"""Factory pattern class that will return
a currency getter class base on the name passed
to the register method
"""
def register(self, class_name):
allowed = [
'CH_ADMIN_getter',
'PL_NBP_getter',
'ECB_getter',
'GOOGLE_getter',
'YAHOO_getter',
'MX_BdM_getter',
'CA_BOC_getter',
'RO_BNR_getter',
]
if class_name in allowed:
exec "from .update_service_%s import %s" % \
(class_name.replace('_getter', ''), class_name)
class_def = eval(class_name)
return class_def()
else:
raise UnknowClassError

View File

@@ -0,0 +1,144 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import logging
from datetime import datetime
from openerp import fields
from openerp.exceptions import except_orm
_logger = logging.getLogger(__name__)
class AbstractClassError(Exception):
def __str__(self):
return 'Abstract Class'
def __repr__(self):
return 'Abstract Class'
class AbstractMethodError(Exception):
def __str__(self):
return 'Abstract Method'
def __repr__(self):
return 'Abstract Method'
class UnknowClassError(Exception):
def __str__(self):
return 'Unknown Class'
def __repr__(self):
return 'Unknown Class'
class UnsuportedCurrencyError(Exception):
def __init__(self, value):
self.curr = value
def __str__(self):
return 'Unsupported currency %s' % self.curr
def __repr__(self):
return 'Unsupported currency %s' % self.curr
class Currency_getter_interface(object):
"Abstract class of currency getter"
log_info = " "
supported_currency_array = [
'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN',
'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BRL',
'BSD', 'BTN', 'BWP', 'BYR', 'BZD', 'CAD', 'CDF', 'CHF', 'CLP', 'CNY',
'COP', 'CRC', 'CUP', 'CVE', 'CYP', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD',
'EEK', 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GGP',
'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG',
'HUF', 'IDR', 'ILS', 'IMP', 'INR', 'IQD', 'IRR', 'ISK', 'JEP', 'JMD',
'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD',
'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LTL', 'LVL', 'LYD', 'MAD',
'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRO', 'MTL', 'MUR', 'MVR',
'MWK', 'MXN', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NZD',
'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', 'RON',
'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', 'SHP',
'SLL', 'SOS', 'SPL', 'SRD', 'STD', 'SVC', 'SYP', 'SZL', 'THB', 'TJS',
'TMM', 'TND', 'TOP', 'TRY', 'TTD', 'TVD', 'TWD', 'TZS', 'UAH', 'UGX',
'USD', 'UYU', 'UZS', 'VEB', 'VEF', 'VND', 'VUV', 'WST', 'XAF', 'XAG',
'XAU', 'XCD', 'XDR', 'XOF', 'XPD', 'XPF', 'XPT', 'YER', 'ZAR', 'ZMK',
'ZWD'
]
# Updated currency this arry will contain the final result
updated_currency = {}
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""Interface method that will retrieve the currency
This function has to be reinplemented in child
"""
raise AbstractMethodError
def validate_cur(self, currency):
"""Validate if the currency to update is supported"""
if currency not in self.supported_currency_array:
raise UnsuportedCurrencyError(currency)
def get_url(self, url):
"""Return a string of a get url query"""
try:
import urllib
objfile = urllib.urlopen(url)
rawfile = objfile.read()
objfile.close()
return rawfile
except ImportError:
raise except_orm(
'Error !',
self.MOD_NAME + 'Unable to import urllib !'
)
except IOError:
raise except_orm(
'Error !',
self.MOD_NAME + 'Web Service does not exist !'
)
def check_rate_date(self, rate_date, max_delta_days):
"""Check date constrains. rate_date must be of datetime type"""
days_delta = (datetime.today() - rate_date).days
if days_delta > max_delta_days:
raise Exception(
'The rate timestamp %s is %d days away from today, '
'which is over the limit (%d days). '
'Rate not updated in OpenERP.' % (rate_date,
days_delta,
max_delta_days)
)
# We always have a warning when rate_date != today
if rate_date.date() != datetime.today().date():
rate_date_str = fields.Date.to_string(rate_date)
msg = "The rate timestamp %s is not today's date %s" % \
(rate_date_str, fields.Date.today())
self.log_info = ("\n WARNING : %s") % msg
_logger.warning(msg)

View File

@@ -0,0 +1,98 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# Abstract class to fetch rates from Bank of Canada
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from .currency_getter_interface import Currency_getter_interface
from openerp import _
from openerp.exceptions import except_orm
import logging
_logger = logging.getLogger(__name__)
class CA_BOC_getter(Currency_getter_interface):
"""Implementation of Curreny_getter_factory interface
for Bank of Canada RSS service
"""
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""implementation of abstract method of Curreny_getter_interface"""
# as of Jan 2014 BOC is publishing noon rates for about 60 currencies
url = ('http://www.bankofcanada.ca/stats/assets/'
'rates_rss/noon/en_%s.xml')
# closing rates are available as well (please note there are only 12
# currencies reported):
# http://www.bankofcanada.ca/stats/assets/rates_rss/closing/en_%s.xml
# We do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
import feedparser
import pytz
from dateutil import parser
for curr in currency_array:
_logger.debug("BOC currency rate service : connecting...")
dom = feedparser.parse(url % curr)
self.validate_cur(curr)
# check if BOC service is running
if dom.bozo and dom.status != 404:
_logger.error("Bank of Canada - service is down - try again\
later...")
# check if BOC sent a valid response for this currency
if dom.status != 200:
_logger.error("Exchange data for %s is not reported by Bank\
of Canada." % curr)
raise except_orm(_('Error !'), _('Exchange data for %s is not '
'reported by Bank of Canada.'
% str(curr)))
_logger.debug("BOC sent a valid RSS file for: " + curr)
# check for valid exchange data
if (dom.entries[0].cb_basecurrency == main_currency) and \
(dom.entries[0].cb_targetcurrency == curr):
rate = dom.entries[0].cb_exchangerate.split('\n', 1)[0]
rate_date_datetime = parser.parse(dom.entries[0].updated)\
.astimezone(pytz.utc).replace(tzinfo=None)
self.check_rate_date(rate_date_datetime, max_delta_days)
self.updated_currency[curr] = rate
_logger.debug("BOC Rate retrieved : %s = %s %s" %
(main_currency, rate, curr))
else:
_logger.error(
"Exchange data format error for Bank of Canada -"
"%s. Please check provider data format "
"and/or source code." % curr)
raise except_orm(_('Error !'),
_('Exchange data format error for '
'Bank of Canada - %s !' % str(curr)))
return self.updated_currency, self.log_info

View File

@@ -0,0 +1,113 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# Abstract class to fetch rates from Swiss Federal Authorities
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from .currency_getter_interface import Currency_getter_interface
import logging
_logger = logging.getLogger(__name__)
from datetime import datetime
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT
class CH_ADMIN_getter(Currency_getter_interface):
"""Implementation of Currency_getter_factory interface
for Admin.ch service
"""
def rate_retrieve(self, dom, ns, curr):
"""Parse a dom node to retrieve currencies data"""
res = {}
xpath_rate_currency = ("/def:wechselkurse/def:devise[@code='%s']/"
"def:kurs/text()") % (curr.lower())
xpath_rate_ref = ("/def:wechselkurse/def:devise[@code='%s']/"
"def:waehrung/text()") % (curr.lower())
res['rate_currency'] = float(
dom.xpath(xpath_rate_currency, namespaces=ns)[0]
)
res['rate_ref'] = float(
(dom.xpath(xpath_rate_ref, namespaces=ns)[0]).split(' ')[0]
)
return res
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""Implementation of abstract method of Curreny_getter_interface"""
url = ('http://www.afd.admin.ch/publicdb/newdb/'
'mwst_kurse/wechselkurse.php')
# We do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
# Move to new XML lib cf Launchpad bug #645263
from lxml import etree
_logger.debug("Admin.ch currency rate service : connecting...")
rawfile = self.get_url(url)
dom = etree.fromstring(rawfile)
_logger.debug("Admin.ch sent a valid XML file")
adminch_ns = {
'def': 'http://www.afd.admin.ch/publicdb/newdb/mwst_kurse'
}
rate_date = dom.xpath(
'/def:wechselkurse/def:datum/text()',
namespaces=adminch_ns
)
rate_date = rate_date[0]
rate_date_datetime = datetime.strptime(rate_date,
DEFAULT_SERVER_DATE_FORMAT)
self.check_rate_date(rate_date_datetime, max_delta_days)
# we dynamically update supported currencies
self.supported_currency_array = dom.xpath(
"/def:wechselkurse/def:devise/@code",
namespaces=adminch_ns
)
self.supported_currency_array = [x.upper() for x
in self.supported_currency_array]
self.supported_currency_array.append('CHF')
_logger.debug(
"Supported currencies = " + str(self.supported_currency_array)
)
self.validate_cur(main_currency)
if main_currency != 'CHF':
main_curr_data = self.rate_retrieve(dom, adminch_ns, main_currency)
# 1 MAIN_CURRENCY = main_rate CHF
rate_curr = main_curr_data['rate_currency']
rate_ref = main_curr_data['rate_ref']
main_rate = rate_curr / rate_ref
for curr in currency_array:
self.validate_cur(curr)
if curr == 'CHF':
rate = main_rate
else:
curr_data = self.rate_retrieve(dom, adminch_ns, curr)
# 1 MAIN_CURRENCY = rate CURR
if main_currency == 'CHF':
rate = curr_data['rate_ref'] / curr_data['rate_currency']
else:
rate = (main_rate * curr_data['rate_ref'] /
curr_data['rate_currency'])
self.updated_currency[curr] = rate
_logger.debug(
"Rate retrieved : 1 %s = %s %s" % (main_currency, rate, curr)
)
return self.updated_currency, self.log_info

View File

@@ -0,0 +1,103 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# Abstract class to fetch rates from European Central Bank
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from .currency_getter_interface import Currency_getter_interface
from datetime import datetime
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT
import logging
_logger = logging.getLogger(__name__)
class ECB_getter(Currency_getter_interface):
"""Implementation of Currency_getter_factory interface
for ECB service
"""
def rate_retrieve(self, dom, ns, curr):
"""Parse a dom node to retrieve-
currencies data
"""
res = {}
xpath_curr_rate = ("/gesmes:Envelope/def:Cube/def:Cube/"
"def:Cube[@currency='%s']/@rate") % (curr.upper())
res['rate_currency'] = float(
dom.xpath(xpath_curr_rate, namespaces=ns)[0]
)
return res
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""implementation of abstract method of Curreny_getter_interface"""
url = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'
# Important : as explained on the ECB web site, the currencies are
# at the beginning of the afternoon ; so, until 3 p.m. Paris time
# the currency rates are the ones of trading day N-1
# http://www.ecb.europa.eu/stats/exchange/eurofxref/html/index.en.html
# We do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
# Move to new XML lib cf Launchpad bug #645263
from lxml import etree
_logger.debug("ECB currency rate service : connecting...")
rawfile = self.get_url(url)
dom = etree.fromstring(rawfile)
_logger.debug("ECB sent a valid XML file")
ecb_ns = {
'gesmes': 'http://www.gesmes.org/xml/2002-08-01',
'def': 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref'
}
rate_date = dom.xpath('/gesmes:Envelope/def:Cube/def:Cube/@time',
namespaces=ecb_ns)[0]
rate_date_datetime = datetime.strptime(rate_date,
DEFAULT_SERVER_DATE_FORMAT)
self.check_rate_date(rate_date_datetime, max_delta_days)
# We dynamically update supported currencies
self.supported_currency_array = dom.xpath(
"/gesmes:Envelope/def:Cube/def:Cube/def:Cube/@currency",
namespaces=ecb_ns
)
self.supported_currency_array.append('EUR')
_logger.debug("Supported currencies = %s " %
self.supported_currency_array)
self.validate_cur(main_currency)
if main_currency != 'EUR':
main_curr_data = self.rate_retrieve(dom, ecb_ns, main_currency)
for curr in currency_array:
self.validate_cur(curr)
if curr == 'EUR':
rate = 1 / main_curr_data['rate_currency']
else:
curr_data = self.rate_retrieve(dom, ecb_ns, curr)
if main_currency == 'EUR':
rate = curr_data['rate_currency']
else:
rate = (curr_data['rate_currency'] /
main_curr_data['rate_currency'])
self.updated_currency[curr] = rate
_logger.debug(
"Rate retrieved : 1 %s = %s %s" % (main_currency, rate, curr)
)
return self.updated_currency, self.log_info

View File

@@ -0,0 +1,82 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# Abstract class to fetch rates from Banco de México
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from .currency_getter_interface import Currency_getter_interface
import logging
_logger = logging.getLogger(__name__)
class MX_BdM_getter(Currency_getter_interface):
"""Implementation of Currency_getter_factory interface
for Banco de México service
"""
def rate_retrieve(self):
""" Get currency exchange from Banxico.xml and proccess it
TODO: Get correct data from xml instead of process string
"""
url = ('http://www.banxico.org.mx/rsscb/rss?'
'BMXC_canal=pagos&BMXC_idioma=es')
from xml.dom.minidom import parse
from StringIO import StringIO
logger = logging.getLogger(__name__)
logger.debug("Banxico currency rate service : connecting...")
rawfile = self.get_url(url)
dom = parse(StringIO(rawfile))
logger.debug("Banxico sent a valid XML file")
value = dom.getElementsByTagName('cb:value')[0]
rate = value.firstChild.nodeValue
return float(rate)
def get_updated_currency(self, currency_array, main_currency,
max_delta_days=1):
"""implementation of abstract method of Curreny_getter_interface"""
logger = logging.getLogger(__name__)
# we do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
# Suported currencies
suported = ['MXN', 'USD']
for curr in currency_array:
if curr in suported:
# Get currency data
main_rate = self.rate_retrieve()
if main_currency == 'MXN':
rate = 1 / main_rate
else:
rate = main_rate
else:
# No other currency supported
continue
self.updated_currency[curr] = rate
logger.debug("Rate retrieved : %s = %s %s" %
(main_currency, rate, curr))

View File

@@ -0,0 +1,101 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# Abstract class to fetch rates from National Bank of Poland
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from .currency_getter_interface import Currency_getter_interface
from datetime import datetime
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT
import logging
_logger = logging.getLogger(__name__)
class PL_NBP_getter(Currency_getter_interface):
"""Implementation of Currency_getter_factory interface
for PL NBP service
"""
def rate_retrieve(self, dom, ns, curr):
""" Parse a dom node to retrieve
currencies data"""
res = {}
xpath_rate_currency = ("/tabela_kursow/pozycja[kod_waluty='%s']/"
"kurs_sredni/text()") % (curr.upper())
xpath_rate_ref = ("/tabela_kursow/pozycja[kod_waluty='%s']/"
"przelicznik/text()") % (curr.upper())
res['rate_currency'] = float(
dom.xpath(xpath_rate_currency, namespaces=ns)[0].replace(',', '.')
)
res['rate_ref'] = float(dom.xpath(xpath_rate_ref, namespaces=ns)[0])
return res
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""implementation of abstract method of Curreny_getter_interface"""
# LastA.xml is always the most recent one
url = 'http://www.nbp.pl/kursy/xml/LastA.xml'
# We do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
# Move to new XML lib cf Launchpad bug #645263
from lxml import etree
_logger.debug("NBP.pl currency rate service : connecting...")
rawfile = self.get_url(url)
dom = etree.fromstring(rawfile)
ns = {} # Cool, there are no namespaces !
_logger.debug("NBP.pl sent a valid XML file")
rate_date = dom.xpath('/tabela_kursow/data_publikacji/text()',
namespaces=ns)[0]
rate_date_datetime = datetime.strptime(rate_date,
DEFAULT_SERVER_DATE_FORMAT)
self.check_rate_date(rate_date_datetime, max_delta_days)
# We dynamically update supported currencies
self.supported_currency_array = dom.xpath(
'/tabela_kursow/pozycja/kod_waluty/text()',
namespaces=ns
)
self.supported_currency_array.append('PLN')
_logger.debug("Supported currencies = %s" %
self.supported_currency_array)
self.validate_cur(main_currency)
if main_currency != 'PLN':
main_curr_data = self.rate_retrieve(dom, ns, main_currency)
# 1 MAIN_CURRENCY = main_rate PLN
main_rate = (main_curr_data['rate_currency'] /
main_curr_data['rate_ref'])
for curr in currency_array:
self.validate_cur(curr)
if curr == 'PLN':
rate = main_rate
else:
curr_data = self.rate_retrieve(dom, ns, curr)
# 1 MAIN_CURRENCY = rate CURR
if main_currency == 'PLN':
rate = curr_data['rate_ref'] / curr_data['rate_currency']
else:
rate = (main_rate * curr_data['rate_ref'] /
curr_data['rate_currency'])
self.updated_currency[curr] = rate
_logger.debug("Rate retrieved : %s = %s %s" %
(main_currency, rate, curr))
return self.updated_currency, self.log_info

View File

@@ -0,0 +1,98 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# Abstract class to fetch rates from National Bank of Romania
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from .currency_getter_interface import Currency_getter_interface
from datetime import datetime, timedelta
import logging
_logger = logging.getLogger(__name__)
class RO_BNR_getter(Currency_getter_interface):
"""Implementation of Currency_getter_factory interface for BNR service"""
def rate_retrieve(self, dom, ns, curr):
""" Parse a dom node to retrieve-
currencies data"""
res = {}
xpath_rate_currency = "/def:DataSet/def:Body/def:Cube/def:Rate" + \
"[@currency='%s']/text()" % (curr.upper())
xpath_rate_ref = "/def:DataSet/def:Body/def:Cube/def:Rate" + \
"[@currency='%s']/@multiplier" % (curr.upper())
res['rate_currency'] = float(dom.xpath(xpath_rate_currency,
namespaces=ns)[0])
try:
res['rate_ref'] = float(dom.xpath(xpath_rate_ref,
namespaces=ns)[0])
except:
res['rate_ref'] = 1
return res
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""implementation of abstract method of Curreny_getter_interface"""
url = 'http://www.bnr.ro/nbrfxrates.xml'
# we do not want to update the main currency
if main_currency in currency_array:
currency_array.remove(main_currency)
# Move to new XML lib cf Launchpad bug #645263
from lxml import etree
_logger.debug("BNR currency rate service : connecting...")
rawfile = self.get_url(url)
dom = etree.fromstring(rawfile)
adminch_ns = {'def': 'http://www.bnr.ro/xsd'}
rate_date = dom.xpath('/def:DataSet/def:Body/def:Cube/@date',
namespaces=adminch_ns)[0]
rate_date_datetime = datetime.strptime(rate_date, '%Y-%m-%d') + \
timedelta(days=1)
self.check_rate_date(rate_date_datetime, max_delta_days)
# we dynamically update supported currencies
self.supported_currency_array = dom.xpath(
"/def:DataSet/def:Body/" + "def:Cube/def:Rate/@currency",
namespaces=adminch_ns)
self.supported_currency_array = [
x.upper() for x in self.supported_currency_array]
self.supported_currency_array.append('RON')
self.validate_cur(main_currency)
if main_currency != 'RON':
main_curr_data = self.rate_retrieve(dom, adminch_ns, main_currency)
# 1 MAIN_CURRENCY = main_rate RON
main_rate = main_curr_data['rate_currency'] / \
main_curr_data['rate_ref']
for curr in currency_array:
self.validate_cur(curr)
if curr == 'RON':
rate = main_rate
else:
curr_data = self.rate_retrieve(dom, adminch_ns, curr)
# 1 MAIN_CURRENCY = rate CURR
if main_currency == 'RON':
rate = curr_data['rate_ref'] / curr_data['rate_currency']
else:
rate = main_rate * curr_data['rate_ref'] / \
curr_data['rate_currency']
self.updated_currency[curr] = rate
_logger.debug("BNR Rate retrieved : 1 " + main_currency + ' = ' +
str(rate) + ' ' + curr)
return self.updated_currency, self.log_info

View File

@@ -0,0 +1,49 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 CamptoCamp. All rights reserved.
# @author Nicolas Bessi
#
# Abstract class to fetch rates from Yahoo Financial
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from .currency_getter_interface import Currency_getter_interface
class YAHOO_getter(Currency_getter_interface):
"""Implementation of Currency_getter_factory interface
for Yahoo finance service
"""
def get_updated_currency(self, currency_array, main_currency,
max_delta_days):
"""implementation of abstract method of curreny_getter_interface"""
self.validate_cur(main_currency)
url = ('http://download.finance.yahoo.com/d/'
'quotes.txt?s="%s"=X&f=sl1c1abg')
if main_currency in currency_array:
currency_array.remove(main_currency)
for curr in currency_array:
self.validate_cur(curr)
res = self.get_url(url % (main_currency + curr))
val = res.split(',')[1]
if val:
self.updated_currency[curr] = val
else:
raise Exception('Could not update the %s' % (curr))
return self.updated_currency, self.log_info

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -6,13 +6,12 @@
<field name="inherit_id" ref="base.view_company_form"/>
<field name="arch" type="xml">
<notebook position="inside">
<page string="Currency auto update configuration">
<page string="Currency update configuration">
<group>
<field name="auto_currency_up" on_change="on_change_auto_currency_up(auto_currency_up)"/>
<field name="interval_type" on_change="on_change_intervall(interval_type)"/>
<field name="multi_company_currency_enable"/>
<field name="auto_currency_up"/>
<field name="multi_company_currency_enable"/>
</group>
<separator string="Currency updates services" colspan="4"/>
<separator string="Currency update services" colspan="4"/>
<field name="services_to_use" colspan="4" nolabel="1"/>
<button name="button_refresh_currency" string="Refresh currencies" type='object' />
</page>
@@ -21,3 +20,4 @@
</record>
</data>
</openerp>

View File

@@ -5,10 +5,12 @@
<field name="name">Update Rates service</field>
<field name="model">currency.rate.update.service</field>
<field name="arch" type="xml">
<tree string="Rates">
<tree string="Currency update services">
<field name="service"/>
<field name="currency_to_update"/>
<field name="interval_type"/>
<field name="interval_number"/>
<field name="next_run"/>
</tree>
</field>
</record>
@@ -17,11 +19,21 @@
<field name="name">Update Rates</field>
<field name="model">currency.rate.update.service</field>
<field name="arch" type="xml">
<form string="Rate">
<field name="service"/>
<field name="max_delta_days"/>
<form string="Currency update services">
<group>
<group>
<field name="service"/>
<field name="max_delta_days"/>
</group>
<group>
<field name="interval_type"/>
<field name="interval_number"/>
<field name="next_run"/>
</group>
</group>
<separator string="Currencies to update with this service" colspan="4"/>
<field name="currency_to_update" colspan="4" nolabel="1"/>
<field name="currency_list" invisible="1"/>
<field name="currency_to_update" colspan="4" nolabel="1" domain="[('id','in', currency_list[0][2])]"/>
<separator string="Logs" colspan="4"/>
<field name="note" colspan="4" nolabel="1"/>
</form>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" ?>
<openerp>
<data>
<record model="ir.cron" id="ir_cron_currency_update_every_day">
<field name="name">Currency Rate Update</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field><!-- it s every day -->
<field name="numbercall">-1</field>
<field name="doall" eval="False"/>
<field name="model" eval="'currency.rate.update.service'"/>
<field name="function" eval="'_run_currency_update'"/>
<field name="args">(None,)</field>
</record>
</data>
</openerp>