From c8a77e36114d15463d54150b754d95c0345b82cf Mon Sep 17 00:00:00 2001 From: Luc De Meyer Date: Thu, 3 Dec 2020 22:36:30 +0100 Subject: [PATCH 1/4] [13.0]generic order type --- account_ebics/__manifest__.py | 2 +- account_ebics/models/ebics_file_format.py | 58 ++--------- account_ebics/wizards/ebics_xfer.py | 121 ++++++++++------------ account_ebics/wizards/ebics_xfer.xml | 1 + 4 files changed, 63 insertions(+), 119 deletions(-) diff --git a/account_ebics/__manifest__.py b/account_ebics/__manifest__.py index 004b2cb..2a428e6 100644 --- a/account_ebics/__manifest__.py +++ b/account_ebics/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'EBICS banking protocol', - 'version': '13.0.1.2.1', + 'version': '13.0.1.3.0', 'license': 'LGPL-3', 'author': 'Noviat', 'website': 'www.noviat.com', diff --git a/account_ebics/models/ebics_file_format.py b/account_ebics/models/ebics_file_format.py index 55a9945..e11f9e3 100644 --- a/account_ebics/models/ebics_file_format.py +++ b/account_ebics/models/ebics_file_format.py @@ -1,7 +1,7 @@ # Copyright 2009-2020 Noviat. # License LGPL-3 or later (http://www.gnu.org/licenses/lpgl). -from odoo import api, fields, models +from odoo import fields, models class EbicsFileFormat(models.Model): @@ -9,17 +9,19 @@ class EbicsFileFormat(models.Model): _description = 'EBICS File Formats' _order = 'type,name' - name = fields.Selection( - selection=lambda self: self._selection_name(), - string='Request Type', required=True) + name = fields.Char( + string='Request Type', + required=True, + help="E.g. camt.053.001.02.stm, camt.xxx.cfonb120.stm, " + "pain.001.001.03.sct (check your EBICS contract).\n") type = fields.Selection( selection=[('down', 'Download'), ('up', 'Upload')], required=True) - order_type = fields.Selection( - selection=lambda self: self._selection_order_type(), + order_type = fields.Char( string='Order Type', - help="For most banks is France you should use the " + help="E.g. C53 (check your EBICS contract).\n" + "For most banks in France you should use the " "format neutral Order Types 'FUL' for upload " "and 'FDL' for download.") signature_class = fields.Selection( @@ -36,45 +38,3 @@ class EbicsFileFormat(models.Model): required=True, help="Specify the filename suffix for this File Format." "\nE.g. camt.053.xml") - - @api.model - def _selection_order_type(self): - up = self._supported_upload_order_types() - down = self._supported_download_order_types() - selection = [(x, x) for x in up + down] - return selection - - def _supported_upload_order_types(self): - return ['FUL', 'CCT', 'CDD', 'CDB', 'XE2', 'XE3'] - - def _supported_download_order_types(self): - return ['FDL', 'C52', 'C53', 'C54'] - - @api.model - def _selection_name(self): - """ - List of supported EBICS Request Types. - Extend this method via a custom module when testing - a new Request Type and make a PR for the - account_ebics module when this new Request Type - is working correctly. - This PR should include at least updates to - - 'data/ebics_file_format.xml' - - 'models/ebics_file_format.py' - An overview of the EBICS Request Types can be found in - the doc folder of this module (EBICS_Annex2). - """ - request_types = [ - 'camt.052.001.02.stm', - 'camt.053.001.02.stm', - 'pain.001.001.03.sct', - 'pain.008.001.02.sdd', - 'pain.008.001.02.sbb', - 'camt.xxx.cfonb120.stm', - 'pain.001.001.02.sct', - 'camt.053', - 'pain.001', - 'pain.008', - ] - selection = [(x, x) for x in request_types] - return selection diff --git a/account_ebics/wizards/ebics_xfer.py b/account_ebics/wizards/ebics_xfer.py index 8166462..0f97f08 100644 --- a/account_ebics/wizards/ebics_xfer.py +++ b/account_ebics/wizards/ebics_xfer.py @@ -64,12 +64,10 @@ class EbicsXfer(models.TransientModel): format_id = fields.Many2one( comodel_name='ebics.file.format', string='EBICS File Format', - help="Select EBICS File Format to upload/download." - "\nLeave blank to download all available files.") - order_type = fields.Selection( - selection=lambda self: self._selection_order_type(), + help="Select EBICS File Format to upload/download.") + order_type = fields.Char( string='Order Type', - help="For most banks is France you should use the " + help="For most banks in France you should use the " "format neutral Order Types 'FUL' for upload " "and 'FDL' for download.") test_mode = fields.Boolean( @@ -91,10 +89,6 @@ class EbicsXfer(models.TransientModel): else: return cfg_mod - @api.model - def _selection_order_type(self): - return self.env['ebics.file.format']._selection_order_type() - @api.onchange('ebics_config_id') def _onchange_ebics_config_id(self): ebics_userids = self.ebics_config_id.ebics_userid_ids @@ -166,63 +160,56 @@ class EbicsXfer(models.TransientModel): self.note = '' client = self._setup_client() if client: - download_formats = self.format_id \ - or self.ebics_config_id.ebics_file_format_ids.filtered( - lambda r: r.type == 'down') ebics_files = self.env['ebics.file'] - for df in download_formats: - success = False - order_type = df.order_type or 'FDL' - params = {} + success = False + order_type = self.order_type or 'FDL' + date_from = self.date_from and self.date_from.isoformat() or None + date_to = self.date_to and self.date_to.isoformat() or None + try: if order_type == 'FDL': - params['filetype'] = df.name - if order_type in ['FDL', 'C52', 'C53', 'C54']: - params.update({ - 'start': - self.date_from and self.date_from.isoformat() - or None, - 'end': - self.date_to and self.date_to.isoformat() - or None, - }) - kwargs = {k: v for k, v in params.items() if v} - try: - method = getattr(client, order_type) - data = method(**kwargs) - ebics_files += self._handle_download_data(data, df) - success = True - except EbicsFunctionalError: - e = exc_info() - self.note += '\n' - self.note += _("EBICS Functional Error:") - self.note += '\n' - self.note += '%s (code: %s)' % (e[1].message, e[1].code) - except EbicsTechnicalError: - e = exc_info() - self.note += '\n' - self.note += _("EBICS Technical Error:") - self.note += '\n' - self.note += '%s (code: %s)' % (e[1].message, e[1].code) - except EbicsVerificationError: - self.note += '\n' - self.note += _("EBICS Verification Error:") - self.note += '\n' - self.note += _("The EBICS response could not be verified.") - except UserError as e: - self.note += '\n' - self.note += _("Warning:") - self.note += '\n' - self.note += e.name - except Exception: - self.note += '\n' - self.note += _("Unknown Error") - tb = ''.join(format_exception(*exc_info())) - self.note += '\n%s' % tb + data = client.FDL(self.format_id.name, date_from, date_to) else: - # mark received data so that it is not included in further - # downloads - trans_id = client.last_trans_id - client.confirm_download(trans_id=trans_id, success=success) + params = None + if date_from and date_to: + params = {'DateRange': { + 'Start': date_from, + 'End': date_to, + }} + data = client.download(order_type, params=params) + ebics_files += self._handle_download_data(data, self.format_id) + success = True + except EbicsFunctionalError: + e = exc_info() + self.note += '\n' + self.note += _("EBICS Functional Error:") + self.note += '\n' + self.note += '%s (code: %s)' % (e[1].message, e[1].code) + except EbicsTechnicalError: + e = exc_info() + self.note += '\n' + self.note += _("EBICS Technical Error:") + self.note += '\n' + self.note += '%s (code: %s)' % (e[1].message, e[1].code) + except EbicsVerificationError: + self.note += '\n' + self.note += _("EBICS Verification Error:") + self.note += '\n' + self.note += _("The EBICS response could not be verified.") + except UserError as e: + self.note += '\n' + self.note += _("Warning:") + self.note += '\n' + self.note += e.name + except Exception: + self.note += '\n' + self.note += _("Unknown Error") + tb = ''.join(format_exception(*exc_info())) + self.note += '\n%s' % tb + else: + # mark received data so that it is not included in further + # downloads + trans_id = client.last_trans_id + client.confirm_download(trans_id=trans_id, success=success) ctx['ebics_file_ids'] = ebics_files._ids @@ -271,7 +258,7 @@ class EbicsXfer(models.TransientModel): ef_format = self.format_id OrderID = False try: - order_type = ef_format.order_type or 'FUL' + order_type = self.order_type or 'FUL' method = hasattr(client, order_type) \ and getattr(client, order_type) if order_type == 'FUL': @@ -285,12 +272,8 @@ class EbicsXfer(models.TransientModel): OrderID = method(ef_format.name, upload_data, **kwargs) elif order_type in ['CCT', 'CDD', 'CDB']: OrderID = method(upload_data) - elif order_type in ['XE2', 'XE3']: - OrderID = client.upload(order_type, upload_data) else: - # TODO: investigate if it makes sense to support - # a generic upload for a non-predefined order_type - pass + OrderID = client.upload(order_type, upload_data) if OrderID: self.note += '\n' self.note += _( diff --git a/account_ebics/wizards/ebics_xfer.xml b/account_ebics/wizards/ebics_xfer.xml index 66b16f6..60b5369 100644 --- a/account_ebics/wizards/ebics_xfer.xml +++ b/account_ebics/wizards/ebics_xfer.xml @@ -17,6 +17,7 @@ +