[14.0][MIG]account_ebics

This commit is contained in:
Luc De Meyer 2020-12-14 09:32:49 -08:00
parent f097880a32
commit 488517b6b3
8 changed files with 28 additions and 88 deletions

View File

@ -51,11 +51,11 @@ We also recommend to consider the installation of the following modules:
| |
- account_bank_statement_import_fr_cfonb - account_statement_import_fr_cfonb
Required to handle french CFONB files. Required to handle french CFONB files.
Cf. https://github.com/OCA/l10n_fr Cf. https://github.com/OCA/l10n_france
| |

View File

@ -3,7 +3,7 @@
{ {
'name': 'EBICS banking protocol', 'name': 'EBICS banking protocol',
'version': '13.0.1.3.0', 'version': '14.0.1.0.0',
'license': 'LGPL-3', 'license': 'LGPL-3',
'author': 'Noviat', 'author': 'Noviat',
'website': 'www.noviat.com', 'website': 'www.noviat.com',

View File

@ -103,8 +103,8 @@ class EbicsFile(models.Model):
def action_open_bank_statements(self): def action_open_bank_statements(self):
self.ensure_one() self.ensure_one()
action = self.env['ir.actions.act_window'].for_xml_id( action = self.env['ir.actions.act_window']._for_xml_id(
'account', 'action_bank_statement_tree') 'account.action_bank_statement_tree')
domain = eval(action.get('domain') or '[]') domain = eval(action.get('domain') or '[]')
domain += [('id', 'in', self._context.get('statement_ids'))] domain += [('id', 'in', self._context.get('statement_ids'))]
action.update({'domain': domain}) action.update({'domain': domain})
@ -220,12 +220,12 @@ class EbicsFile(models.Model):
We do not support the standard _journal_creation_wizard since a single We do not support the standard _journal_creation_wizard since a single
cfonb120 file may contain statements from different legal entities. cfonb120 file may contain statements from different legal entities.
""" """
import_module = 'account_bank_statement_import_fr_cfonb' import_module = 'account_statement_import_fr_cfonb'
self._check_import_module(import_module) self._check_import_module(import_module)
wiz_model = 'account.bank.statement.import' wiz_model = 'account.statement.import'
data_file = base64.b64decode(self.data) data_file = base64.b64decode(self.data)
lines = data_file.split(b'\n') lines = data_file.split(b'\n')
attachments_vals = [] wiz_vals_list = []
st_lines = b'' st_lines = b''
transactions = False transactions = False
for line in lines: for line in lines:
@ -237,10 +237,9 @@ class EbicsFile(models.Model):
if rec_type == b'07': if rec_type == b'07':
if transactions: if transactions:
fn = '_'.join([acc_number.decode(), self.name]) fn = '_'.join([acc_number.decode(), self.name])
attachments_vals.append({ wiz_vals_list.append({
'name': fn, 'statement_filename': fn,
'store_fname': fn, 'statement_file': base64.b64encode(st_lines)
'datas': base64.b64encode(st_lines)
}) })
st_lines = b'' st_lines = b''
transactions = False transactions = False
@ -252,10 +251,9 @@ class EbicsFile(models.Model):
'notifications': []}, 'notifications': []},
} }
wiz_ctx = dict(self.env.context, active_model='ebics.file') wiz_ctx = dict(self.env.context, active_model='ebics.file')
for i, attachment_vals in enumerate(attachments_vals, start=1): for i, wiz_vals in enumerate(wiz_vals_list, start=1):
wiz_vals = {'attachment_ids': [(0, 0, attachment_vals)]}
wiz = self.env[wiz_model].with_context(wiz_ctx).create(wiz_vals) wiz = self.env[wiz_model].with_context(wiz_ctx).create(wiz_vals)
res = wiz.import_file() res = wiz.import_file_button()
ctx = res.get('context') ctx = res.get('context')
if (res.get('res_model') if (res.get('res_model')
== 'account.bank.statement.import.journal.creation'): == 'account.bank.statement.import.journal.creation'):
@ -272,6 +270,7 @@ class EbicsFile(models.Model):
'details': details, 'details': details,
}]) }])
continue continue
import pdb; pdb.set_trace()
result['context']['statement_line_ids'].extend( result['context']['statement_line_ids'].extend(
ctx['statement_line_ids']) ctx['statement_line_ids'])
result['context']['notifications'].extend( result['context']['notifications'].extend(

View File

@ -7,3 +7,6 @@ access_ebics_file_format_manager,ebics_file_format manager,model_ebics_file_form
access_ebics_file_format_user,ebics_file_format user,model_ebics_file_format,account.group_account_invoice,1,0,0,0 access_ebics_file_format_user,ebics_file_format user,model_ebics_file_format,account.group_account_invoice,1,0,0,0
access_ebics_file_manager,ebics_file manager,model_ebics_file,group_ebics_manager,1,1,1,1 access_ebics_file_manager,ebics_file manager,model_ebics_file,group_ebics_manager,1,1,1,1
access_ebics_file_user,ebics_file user,model_ebics_file,account.group_account_invoice,1,1,1,0 access_ebics_file_user,ebics_file user,model_ebics_file,account.group_account_invoice,1,1,1,0
access_ebics_change_passphrase,access_ebics_change_passphrase,model_ebics_change_passphrase,group_ebics_manager,1,1,1,0
access_ebics_xfer,access_ebics_xfer,model_ebics_xfer,account.group_account_invoice,1,1,1,0

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
7 access_ebics_file_format_user ebics_file_format user model_ebics_file_format account.group_account_invoice 1 0 0 0
8 access_ebics_file_manager ebics_file manager model_ebics_file group_ebics_manager 1 1 1 1
9 access_ebics_file_user ebics_file user model_ebics_file account.group_account_invoice 1 1 1 0
10 access_ebics_change_passphrase access_ebics_change_passphrase model_ebics_change_passphrase group_ebics_manager 1 1 1 0
11 access_ebics_xfer access_ebics_xfer model_ebics_xfer account.group_account_invoice 1 1 1 0
12

View File

@ -1,3 +1,2 @@
from . import account_bank_statement_import
from . import ebics_change_passphrase from . import ebics_change_passphrase
from . import ebics_xfer from . import ebics_xfer

View File

@ -1,62 +0,0 @@
# Copyright 2009-2020 Noviat.
# License LGPL-3 or later (http://www.gnu.org/licenses/lpgl).
import logging
from odoo import models, _
_logger = logging.getLogger(__name__)
class AccountBankStatementImport(models.TransientModel):
_inherit = 'account.bank.statement.import'
def _check_parsed_data(self, stmts_vals, account_number):
""" Basic and structural verifications """
if self.env.context.get('active_model') == 'ebics.file':
message = False
if len(stmts_vals) == 0:
message = _("This file doesn't contain any statement.")
if not message:
no_st_line = True
for vals in stmts_vals:
if vals['transactions'] and len(vals['transactions']) > 0:
no_st_line = False
break
if no_st_line:
message = _('This file doesn\'t contain any transaction.')
if message:
log_msg = _(
"Error detected while processing and EBICS File"
) + ':\n' + message
_logger.warn(log_msg)
return
super()._check_parsed_data(stmts_vals, account_number)
def _create_bank_statements(self, stmts_vals):
"""
Return error message to ebics.file when handling empty camt.
Remarks/TODO:
We could add more info to the message (e.g. date, balance, ...)
and write this to the ebics.file, note field.
We could also create empty bank statement (in state done) to clearly
show days without transactions via the bank statement list view.
"""
if self.env.context.get('active_model') == 'ebics.file':
transactions = False
for st_vals in stmts_vals:
if st_vals.get('transactions'):
transactions = True
break
if not transactions:
message = _('This file doesn\'t contain any transaction.')
st_line_ids = []
notifications = {
'type': 'warning',
'message': message,
'details': ''
}
return st_line_ids, [notifications]
return super()._create_bank_statements(stmts_vals)

View File

@ -66,6 +66,9 @@ class EbicsXfer(models.TransientModel):
string='EBICS File Format', string='EBICS File Format',
help="Select EBICS File Format to upload/download." help="Select EBICS File Format to upload/download."
"\nLeave blank to download all available files.") "\nLeave blank to download all available files.")
allowed_format_ids = fields.Many2many(
related='ebics_config_id.ebics_file_format_ids',
string='Allowed EBICS File Formats')
order_type = fields.Char( order_type = fields.Char(
related='format_id.order_type', related='format_id.order_type',
string='Order Type', string='Order Type',
@ -94,14 +97,11 @@ class EbicsXfer(models.TransientModel):
@api.onchange('ebics_config_id') @api.onchange('ebics_config_id')
def _onchange_ebics_config_id(self): def _onchange_ebics_config_id(self):
ebics_userids = self.ebics_config_id.ebics_userid_ids ebics_userids = self.ebics_config_id.ebics_userid_ids
domain = {'ebics_userid_id': [('id', 'in', ebics_userids.ids)]}
if self._context.get('ebics_download'): if self._context.get('ebics_download'):
download_formats = self.ebics_config_id.ebics_file_format_ids\ download_formats = self.ebics_config_id.ebics_file_format_ids\
.filtered(lambda r: r.type == 'down') .filtered(lambda r: r.type == 'down')
if len(download_formats) == 1: if len(download_formats) == 1:
self.format_id = download_formats self.format_id = download_formats
domain['format_id'] = [('type', '=', 'down'),
('id', 'in', download_formats.ids)]
if len(ebics_userids) == 1: if len(ebics_userids) == 1:
self.ebics_userid_id = ebics_userids self.ebics_userid_id = ebics_userids
else: else:
@ -114,11 +114,8 @@ class EbicsXfer(models.TransientModel):
.filtered(lambda r: r.type == 'up') .filtered(lambda r: r.type == 'up')
if len(upload_formats) == 1: if len(upload_formats) == 1:
self.format_id = upload_formats self.format_id = upload_formats
domain['format_id'] = [('type', '=', 'up'),
('id', 'in', upload_formats.ids)]
if len(ebics_userids) == 1: if len(ebics_userids) == 1:
self.ebics_userid_id = ebics_userids self.ebics_userid_id = ebics_userids
return {'domain': domain}
@api.onchange('upload_data') @api.onchange('upload_data')
def _onchange_upload_data(self): def _onchange_upload_data(self):
@ -262,8 +259,8 @@ class EbicsXfer(models.TransientModel):
def view_ebics_file(self): def view_ebics_file(self):
self.ensure_one() self.ensure_one()
module = __name__.split('addons.')[1].split('.')[0] module = __name__.split('addons.')[1].split('.')[0]
act = self.env['ir.actions.act_window'].for_xml_id( act = self.env['ir.actions.act_window']._for_xml_id(
module, 'ebics_file_action_download') '{}.ebics_file_action_download'.format(module))
act['domain'] = [('id', 'in', self._context['ebics_file_ids'])] act['domain'] = [('id', 'in', self._context['ebics_file_ids'])]
return act return act

View File

@ -16,8 +16,10 @@
options="{'no_create': True, 'no_open': True}"/> options="{'no_create': True, 'no_open': True}"/>
<field name="date_from"/> <field name="date_from"/>
<field name="date_to"/> <field name="date_to"/>
<field name="format_id"/> <field name="format_id"
domain="[('type', '=', 'down'), ('id', 'in', allowed_format_ids)]"/>
<field name="order_type"/> <field name="order_type"/>
<field name="allowed_format_ids" invisible="1"/>
</group> </group>
<footer> <footer>
<button name="ebics_download" string="Download Files" type="object" class="oe_highlight"/> <button name="ebics_download" string="Download Files" type="object" class="oe_highlight"/>
@ -45,9 +47,11 @@
<field name="upload_data" filename="upload_fname" required="1"/> <field name="upload_data" filename="upload_fname" required="1"/>
<field name="upload_fname" invisible="1"/> <field name="upload_fname" invisible="1"/>
<field name="upload_fname_dummy"/> <field name="upload_fname_dummy"/>
<field name="format_id" required="1"/> <field name="format_id" required="1"
domain="[('type', '=', 'up'), ('id', 'in', allowed_format_ids)]"/>
<field name="order_type"/> <field name="order_type"/>
<field name="test_mode" attrs="{'invisible': [('order_type', '!=', 'FUL')]}"/> <field name="test_mode" attrs="{'invisible': [('order_type', '!=', 'FUL')]}"/>
<field name="allowed_format_ids" invisible="1"/>
</group> </group>
<footer> <footer>
<button name="ebics_upload" string="Upload File" type="object" class="oe_highlight"/> <button name="ebics_upload" string="Upload File" type="object" class="oe_highlight"/>