diff --git a/__unported__/currency_rate_update/__openerp__.py b/__unported__/currency_rate_update/__openerp__.py deleted file mode 100644 index 6d7ba3bf9..000000000 --- a/__unported__/currency_rate_update/__openerp__.py +++ /dev/null @@ -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 -# -# 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 . -# -############################################################################## -{ - "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 -} diff --git a/__unported__/currency_rate_update/company.py b/__unported__/currency_rate_update/company.py deleted file mode 100644 index 8c8b66feb..000000000 --- a/__unported__/currency_rate_update/company.py +++ /dev/null @@ -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 . -# -############################################################################## -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" - ), - } diff --git a/__unported__/currency_rate_update/currency_rate_update.py b/__unported__/currency_rate_update/currency_rate_update.py deleted file mode 100644 index 91419dfdc..000000000 --- a/__unported__/currency_rate_update/currency_rate_update.py +++ /dev/null @@ -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 -# -# -# 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 . -# -############################################################################## - -# 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 diff --git a/__unported__/currency_rate_update/i18n/ab.po b/__unported__/currency_rate_update/i18n/ab.po deleted file mode 100644 index 9206a22e5..000000000 --- a/__unported__/currency_rate_update/i18n/ab.po +++ /dev/null @@ -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) \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" diff --git a/__unported__/currency_rate_update/i18n/currency_rate_update.pot b/__unported__/currency_rate_update/i18n/currency_rate_update.pot deleted file mode 100644 index 4f0548074..000000000 --- a/__unported__/currency_rate_update/i18n/currency_rate_update.pot +++ /dev/null @@ -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 "" - diff --git a/__unported__/currency_rate_update/i18n/es.po b/__unported__/currency_rate_update/i18n/es.po deleted file mode 100644 index 7e01c95f8..000000000 --- a/__unported__/currency_rate_update/i18n/es.po +++ /dev/null @@ -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 , 2014. -# -msgid "" -msgstr "" -"Project-Id-Version: account-financial-tools\n" -"Report-Msgid-Bugs-To: FULL NAME \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 \n" -"Language-Team: Spanish \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" diff --git a/__unported__/currency_rate_update/i18n/fr_FR.po b/__unported__/currency_rate_update/i18n/fr_FR.po deleted file mode 100644 index ff5d54088..000000000 --- a/__unported__/currency_rate_update/i18n/fr_FR.po +++ /dev/null @@ -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 " -"\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" diff --git a/__unported__/currency_rate_update/i18n/pl.po b/__unported__/currency_rate_update/i18n/pl.po deleted file mode 100644 index 4c7777944..000000000 --- a/__unported__/currency_rate_update/i18n/pl.po +++ /dev/null @@ -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) \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" diff --git a/__unported__/currency_rate_update/i18n/pl_PL.po b/__unported__/currency_rate_update/i18n/pl_PL.po deleted file mode 100644 index 2cba33598..000000000 --- a/__unported__/currency_rate_update/i18n/pl_PL.po +++ /dev/null @@ -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) \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" - diff --git a/__unported__/currency_rate_update/i18n/pt_BR.po b/__unported__/currency_rate_update/i18n/pt_BR.po deleted file mode 100644 index 79b78bc64..000000000 --- a/__unported__/currency_rate_update/i18n/pt_BR.po +++ /dev/null @@ -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 , 2014. -# -msgid "" -msgstr "" -"Project-Id-Version: account-financial-tools\n" -"Report-Msgid-Bugs-To: FULL NAME \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 \n" -"Language-Team: Brazilian Portuguese \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 "" diff --git a/__unported__/currency_rate_update/security/security.xml b/__unported__/currency_rate_update/security/security.xml deleted file mode 100644 index 57ae7e316..000000000 --- a/__unported__/currency_rate_update/security/security.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/currency_rate_update/README.md b/currency_rate_update/README.md new file mode 100644 index 000000000..6420cec58 --- /dev/null +++ b/currency_rate_update/README.md @@ -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) diff --git a/currency_rate_update/__init__.py b/currency_rate_update/__init__.py new file mode 100644 index 000000000..75d7d0aa3 --- /dev/null +++ b/currency_rate_update/__init__.py @@ -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 . +# +############################################################################## + +from . import model diff --git a/currency_rate_update/__openerp__.py b/currency_rate_update/__openerp__.py new file mode 100644 index 000000000..a76020e10 --- /dev/null +++ b/currency_rate_update/__openerp__.py @@ -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 . +# +############################################################################## +{ + "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 +} diff --git a/currency_rate_update/i18n/currency_rate_update.pot b/currency_rate_update/i18n/currency_rate_update.pot new file mode 100755 index 000000000..78874a702 --- /dev/null +++ b/currency_rate_update/i18n/currency_rate_update.pot @@ -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 "" + diff --git a/__unported__/currency_rate_update/__init__.py b/currency_rate_update/model/__init__.py similarity index 79% rename from __unported__/currency_rate_update/__init__.py rename to currency_rate_update/model/__init__.py index 952ce0fea..e8bdb9041 100644 --- a/__unported__/currency_rate_update/__init__.py +++ b/currency_rate_update/model/__init__.py @@ -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 diff --git a/currency_rate_update/model/company.py b/currency_rate_update/model/company.py new file mode 100644 index 000000000..23ee79467 --- /dev/null +++ b/currency_rate_update/model/company.py @@ -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 . +# +############################################################################## + +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') diff --git a/currency_rate_update/model/currency_rate_update.py b/currency_rate_update/model/currency_rate_update.py new file mode 100644 index 000000000..5680a729a --- /dev/null +++ b/currency_rate_update/model/currency_rate_update.py @@ -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 . +# +############################################################################## + +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() diff --git a/currency_rate_update/security/ir.model.access.csv b/currency_rate_update/security/ir.model.access.csv new file mode 100644 index 000000000..b623fefba --- /dev/null +++ b/currency_rate_update/security/ir.model.access.csv @@ -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 diff --git a/currency_rate_update/services/__init__.py b/currency_rate_update/services/__init__.py new file mode 100644 index 000000000..5c70dd472 --- /dev/null +++ b/currency_rate_update/services/__init__.py @@ -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 . +# +############################################################################## diff --git a/currency_rate_update/services/currency_getter.py b/currency_rate_update/services/currency_getter.py new file mode 100644 index 000000000..833d89d60 --- /dev/null +++ b/currency_rate_update/services/currency_getter.py @@ -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 . +# +############################################################################## + + +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 diff --git a/currency_rate_update/services/currency_getter_interface.py b/currency_rate_update/services/currency_getter_interface.py new file mode 100644 index 000000000..fc2b045bb --- /dev/null +++ b/currency_rate_update/services/currency_getter_interface.py @@ -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 . +# +############################################################################## + +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) diff --git a/currency_rate_update/services/update_service_CA_BOC.py b/currency_rate_update/services/update_service_CA_BOC.py new file mode 100644 index 000000000..5cd0e3e49 --- /dev/null +++ b/currency_rate_update/services/update_service_CA_BOC.py @@ -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 . +# +############################################################################## +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 diff --git a/currency_rate_update/services/update_service_CH_ADMIN.py b/currency_rate_update/services/update_service_CH_ADMIN.py new file mode 100644 index 000000000..1dd1d025a --- /dev/null +++ b/currency_rate_update/services/update_service_CH_ADMIN.py @@ -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 . +# +############################################################################## +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 diff --git a/currency_rate_update/services/update_service_ECB.py b/currency_rate_update/services/update_service_ECB.py new file mode 100644 index 000000000..d5e815030 --- /dev/null +++ b/currency_rate_update/services/update_service_ECB.py @@ -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 . +# +############################################################################## +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 diff --git a/currency_rate_update/services/update_service_MX_BdM.py b/currency_rate_update/services/update_service_MX_BdM.py new file mode 100644 index 000000000..f923bce38 --- /dev/null +++ b/currency_rate_update/services/update_service_MX_BdM.py @@ -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 . +# +############################################################################## + +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)) diff --git a/currency_rate_update/services/update_service_PL_NBP.py b/currency_rate_update/services/update_service_PL_NBP.py new file mode 100644 index 000000000..e354540b4 --- /dev/null +++ b/currency_rate_update/services/update_service_PL_NBP.py @@ -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 . +# +############################################################################## +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 diff --git a/currency_rate_update/services/update_service_RO_BNR.py b/currency_rate_update/services/update_service_RO_BNR.py new file mode 100644 index 000000000..c27d2b971 --- /dev/null +++ b/currency_rate_update/services/update_service_RO_BNR.py @@ -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 . +# +############################################################################## +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 diff --git a/currency_rate_update/services/update_service_YAHOO.py b/currency_rate_update/services/update_service_YAHOO.py new file mode 100644 index 000000000..e0b8bdd51 --- /dev/null +++ b/currency_rate_update/services/update_service_YAHOO.py @@ -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 . +# +############################################################################## + +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 diff --git a/__unported__/currency_rate_update/static/src/img/icon.png b/currency_rate_update/static/src/img/icon.png similarity index 100% rename from __unported__/currency_rate_update/static/src/img/icon.png rename to currency_rate_update/static/src/img/icon.png diff --git a/__unported__/currency_rate_update/company_view.xml b/currency_rate_update/view/company_view.xml similarity index 61% rename from __unported__/currency_rate_update/company_view.xml rename to currency_rate_update/view/company_view.xml index 1a2c79b5f..60ebb8a27 100644 --- a/__unported__/currency_rate_update/company_view.xml +++ b/currency_rate_update/view/company_view.xml @@ -6,13 +6,12 @@ - + - - - + + - +