[MIG] account_bank_statement_import_online: Backport to 11.0

This commit is contained in:
Alexey Pelykh
2020-04-25 08:15:54 +02:00
parent 07fc79e7be
commit 95f7427a89
7 changed files with 65 additions and 70 deletions

View File

@@ -4,7 +4,7 @@
{ {
'name': 'Online Bank Statements', 'name': 'Online Bank Statements',
'version': '12.0.1.4.1', 'version': '11.0.1.0.0',
'author': 'author':
'Brainbean Apps, ' 'Brainbean Apps, '
'Dataplug, ' 'Dataplug, '

View File

@@ -12,6 +12,9 @@ _logger = logging.getLogger(__name__)
class AccountJournal(models.Model): class AccountJournal(models.Model):
_inherit = 'account.journal' _inherit = 'account.journal'
bank_statements_source = fields.Selection(
selection_add=[('online', 'Online (OCA)')],
)
online_bank_statement_provider = fields.Selection( online_bank_statement_provider = fields.Selection(
selection=lambda self: self.env[ selection=lambda self: self.env[
'account.journal' 'account.journal'
@@ -24,11 +27,6 @@ class AccountJournal(models.Model):
copy=False, copy=False,
) )
def __get_bank_statements_available_sources(self):
result = super().__get_bank_statements_available_sources()
result.append(('online', _('Online (OCA)')))
return result
@api.model @api.model
def _selection_online_bank_statement_provider(self): def _selection_online_bank_statement_provider(self):
return self.env[ return self.env[
@@ -70,7 +68,7 @@ class AccountJournal(models.Model):
@api.model @api.model
def create(self, vals): def create(self, vals):
rec = super().create(vals) rec = super(AccountJournal, self).create(vals)
if 'bank_statements_source' in vals \ if 'bank_statements_source' in vals \
or 'online_bank_statement_provider' in vals: or 'online_bank_statement_provider' in vals:
rec._update_online_bank_statement_provider_id() rec._update_online_bank_statement_provider_id()
@@ -78,7 +76,7 @@ class AccountJournal(models.Model):
@api.multi @api.multi
def write(self, vals): def write(self, vals):
res = super().write(vals) res = super(AccountJournal, self).write(vals)
if 'bank_statements_source' in vals \ if 'bank_statements_source' in vals \
or 'online_bank_statement_provider' in vals: or 'online_bank_statement_provider' in vals:
self._update_online_bank_statement_provider_id() self._update_online_bank_statement_provider_id()

View File

@@ -11,8 +11,8 @@ from pytz import timezone, utc
from sys import exc_info from sys import exc_info
from odoo import models, fields, api, _ from odoo import models, fields, api, _
from odoo.addons.base.models.res_bank import sanitize_account_number from odoo.addons.base.res.res_bank import sanitize_account_number
from odoo.addons.base.models.res_partner import _tz_get from odoo.addons.base.res.res_partner import _tz_get
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@@ -24,6 +24,7 @@ class OnlineBankStatementProvider(models.Model):
company_id = fields.Many2one( company_id = fields.Many2one(
related='journal_id.company_id', related='journal_id.company_id',
readonly=True,
store=True, store=True,
) )
active = fields.Boolean() active = fields.Boolean()
@@ -43,9 +44,11 @@ class OnlineBankStatementProvider(models.Model):
) )
currency_id = fields.Many2one( currency_id = fields.Many2one(
related='journal_id.currency_id', related='journal_id.currency_id',
readonly=True,
) )
account_number = fields.Char( account_number = fields.Char(
related='journal_id.bank_account_id.sanitized_acc_number' related='journal_id.bank_account_id.sanitized_acc_number',
readonly=True,
) )
tz = fields.Selection( tz = fields.Selection(
selection=_tz_get, selection=_tz_get,
@@ -220,15 +223,17 @@ class OnlineBankStatementProvider(models.Model):
statement = AccountBankStatement.search([ statement = AccountBankStatement.search([
('journal_id', '=', provider.journal_id.id), ('journal_id', '=', provider.journal_id.id),
('state', '=', 'open'), ('state', '=', 'open'),
('date', '=', statement_date), ('date', '=', fields.Date.to_string(statement_date)),
], limit=1) ], limit=1)
if not statement: if not statement:
statement_values.update({ statement_values.update({
'name': provider.journal_id.sequence_id.with_context( 'name': provider.journal_id.sequence_id.with_context(
ir_sequence_date=statement_date, ir_sequence_date=fields.Date.to_string(
statement_date
),
).next_by_id(), ).next_by_id(),
'journal_id': provider.journal_id.id, 'journal_id': provider.journal_id.id,
'date': statement_date, 'date': fields.Date.to_string(statement_date),
}) })
statement = AccountBankStatement.with_context( statement = AccountBankStatement.with_context(
journal_id=provider.journal_id.id, journal_id=provider.journal_id.id,
@@ -269,7 +274,7 @@ class OnlineBankStatementProvider(models.Model):
date = date.replace(tzinfo=utc) date = date.replace(tzinfo=utc)
date = date.astimezone(provider_tz).replace(tzinfo=None) date = date.astimezone(provider_tz).replace(tzinfo=None)
line_values['date'] = date line_values['date'] = fields.Datetime.to_string(date)
unique_import_id = line_values.get('unique_import_id') unique_import_id = line_values.get('unique_import_id')
if unique_import_id: if unique_import_id:
@@ -315,7 +320,8 @@ class OnlineBankStatementProvider(models.Model):
def _schedule_next_run(self): def _schedule_next_run(self):
self.ensure_one() self.ensure_one()
self.last_successful_run = self.next_run self.last_successful_run = self.next_run
self.next_run += self._get_next_run_period() self.next_run = fields.Datetime.from_string(self.next_run) \
+ self._get_next_run_period()
@api.multi @api.multi
def _get_statement_date_since(self, date): def _get_statement_date_since(self, date):
@@ -413,12 +419,13 @@ class OnlineBankStatementProvider(models.Model):
providers.mapped('journal_id.name') providers.mapped('journal_id.name')
)) ))
for provider in providers.with_context({'scheduled': True}): for provider in providers.with_context({'scheduled': True}):
date_since = ( next_run = fields.Datetime.from_string(provider.next_run)
date_since = fields.Datetime.from_string(
provider.last_successful_run provider.last_successful_run
) if provider.last_successful_run else ( ) if provider.last_successful_run else (
provider.next_run - provider._get_next_run_period() next_run - provider._get_next_run_period()
) )
date_until = provider.next_run date_until = next_run
provider._pull(date_since, date_until) provider._pull(date_since, date_until)
_logger.info('Scheduled pull of online bank statements complete.') _logger.info('Scheduled pull of online bank statements complete.')

View File

@@ -17,10 +17,11 @@ class OnlineBankStatementProviderDummy(models.Model):
def _obtain_statement_data(self, date_since, date_until): def _obtain_statement_data(self, date_since, date_until):
self.ensure_one() self.ensure_one()
if self.service != 'dummy': if self.service != 'dummy':
return super()._obtain_statement_data( return super(OnlineBankStatementProviderDummy, self) \
date_since, ._obtain_statement_data(
date_until, date_since,
) # pragma: no cover date_until,
) # pragma: no cover
if self.env.context.get('crash', False): if self.env.context.get('crash', False):
exception = self.env.context.get( exception = self.env.context.get(

View File

@@ -2,7 +2,7 @@
# Copyright 2019-2020 Dataplug (https://dataplug.io) # Copyright 2019-2020 Dataplug (https://dataplug.io)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from datetime import date, datetime from datetime import datetime
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from psycopg2 import IntegrityError from psycopg2 import IntegrityError
from urllib.error import HTTPError from urllib.error import HTTPError
@@ -15,9 +15,9 @@ from odoo import fields
class TestAccountBankAccountStatementImportOnline(common.TransactionCase): class TestAccountBankAccountStatementImportOnline(common.TransactionCase):
def setUp(self): def setUp(self):
super().setUp() super(TestAccountBankAccountStatementImportOnline, self).setUp()
self.now = fields.Datetime.now() self.now = fields.Datetime.from_string(fields.Datetime.now())
self.AccountJournal = self.env['account.journal'] self.AccountJournal = self.env['account.journal']
self.OnlineBankStatementProvider = self.env[ self.OnlineBankStatementProvider = self.env[
'online.bank.statement.provider' 'online.bank.statement.provider'
@@ -34,10 +34,8 @@ class TestAccountBankAccountStatementImportOnline(common.TransactionCase):
'type': 'bank', 'type': 'bank',
'code': 'BANK', 'code': 'BANK',
}) })
with common.Form(journal) as journal_form: journal.bank_statements_source = 'online'
journal_form.bank_statements_source = 'online' journal.online_bank_statement_provider = 'dummy'
journal_form.online_bank_statement_provider = 'dummy'
journal_form.save()
with self.assertRaises(IntegrityError), mute_logger('odoo.sql_db'): with self.assertRaises(IntegrityError), mute_logger('odoo.sql_db'):
journal.online_bank_statement_provider_id.unlink() journal.online_bank_statement_provider_id.unlink()
@@ -48,10 +46,8 @@ class TestAccountBankAccountStatementImportOnline(common.TransactionCase):
'type': 'bank', 'type': 'bank',
'code': 'BANK', 'code': 'BANK',
}) })
with common.Form(journal) as journal_form: journal.bank_statements_source = 'online'
journal_form.bank_statements_source = 'online' journal.online_bank_statement_provider = 'dummy'
journal_form.online_bank_statement_provider = 'dummy'
journal_form.save()
self.assertTrue(journal.online_bank_statement_provider_id) self.assertTrue(journal.online_bank_statement_provider_id)
journal.unlink() journal.unlink()
@@ -63,16 +59,12 @@ class TestAccountBankAccountStatementImportOnline(common.TransactionCase):
'type': 'bank', 'type': 'bank',
'code': 'BANK', 'code': 'BANK',
}) })
with common.Form(journal) as journal_form: journal.bank_statements_source = 'online'
journal_form.bank_statements_source = 'online' journal.online_bank_statement_provider = 'dummy'
journal_form.online_bank_statement_provider = 'dummy'
journal_form.save()
self.assertTrue(journal.online_bank_statement_provider_id) self.assertTrue(journal.online_bank_statement_provider_id)
with common.Form(journal) as journal_form: journal.bank_statements_source = 'undefined'
journal_form.bank_statements_source = 'undefined'
journal_form.save()
self.assertFalse(journal.online_bank_statement_provider_id) self.assertFalse(journal.online_bank_statement_provider_id)
self.assertFalse(self.OnlineBankStatementProvider.search([])) self.assertFalse(self.OnlineBankStatementProvider.search([]))
@@ -512,10 +504,10 @@ class TestAccountBankAccountStatementImportOnline(common.TransactionCase):
lines = statement.mapped('line_ids').sorted() lines = statement.mapped('line_ids').sorted()
self.assertEqual(len(lines), 4) self.assertEqual(len(lines), 4)
self.assertEqual(lines[0].date, date(2020, 4, 17)) self.assertEqual(lines[0].date, '2020-04-17')
self.assertEqual(lines[1].date, date(2020, 4, 17)) self.assertEqual(lines[1].date, '2020-04-17')
self.assertEqual(lines[2].date, date(2020, 4, 18)) self.assertEqual(lines[2].date, '2020-04-18')
self.assertEqual(lines[3].date, date(2020, 4, 18)) self.assertEqual(lines[3].date, '2020-04-18')
def test_tz_non_utc(self): def test_tz_non_utc(self):
journal = self.AccountJournal.create({ journal = self.AccountJournal.create({
@@ -544,10 +536,10 @@ class TestAccountBankAccountStatementImportOnline(common.TransactionCase):
lines = statement.mapped('line_ids').sorted() lines = statement.mapped('line_ids').sorted()
self.assertEqual(len(lines), 4) self.assertEqual(len(lines), 4)
self.assertEqual(lines[0].date, date(2020, 4, 18)) self.assertEqual(lines[0].date, '2020-04-18')
self.assertEqual(lines[1].date, date(2020, 4, 18)) self.assertEqual(lines[1].date, '2020-04-18')
self.assertEqual(lines[2].date, date(2020, 4, 18)) self.assertEqual(lines[2].date, '2020-04-18')
self.assertEqual(lines[3].date, date(2020, 4, 18)) self.assertEqual(lines[3].date, '2020-04-18')
def test_other_tz_to_utc(self): def test_other_tz_to_utc(self):
journal = self.AccountJournal.create({ journal = self.AccountJournal.create({
@@ -577,10 +569,10 @@ class TestAccountBankAccountStatementImportOnline(common.TransactionCase):
lines = statement.mapped('line_ids').sorted() lines = statement.mapped('line_ids').sorted()
self.assertEqual(len(lines), 4) self.assertEqual(len(lines), 4)
self.assertEqual(lines[0].date, date(2020, 4, 17)) self.assertEqual(lines[0].date, '2020-04-17')
self.assertEqual(lines[1].date, date(2020, 4, 17)) self.assertEqual(lines[1].date, '2020-04-17')
self.assertEqual(lines[2].date, date(2020, 4, 18)) self.assertEqual(lines[2].date, '2020-04-18')
self.assertEqual(lines[3].date, date(2020, 4, 18)) self.assertEqual(lines[3].date, '2020-04-18')
def test_timestamp_date_only(self): def test_timestamp_date_only(self):
journal = self.AccountJournal.create({ journal = self.AccountJournal.create({
@@ -608,10 +600,10 @@ class TestAccountBankAccountStatementImportOnline(common.TransactionCase):
lines = statement.line_ids lines = statement.line_ids
self.assertEqual(len(lines), 4) self.assertEqual(len(lines), 4)
self.assertEqual(lines[0].date, date(2020, 4, 18)) self.assertEqual(lines[0].date, '2020-04-18')
self.assertEqual(lines[1].date, date(2020, 4, 18)) self.assertEqual(lines[1].date, '2020-04-18')
self.assertEqual(lines[2].date, date(2020, 4, 18)) self.assertEqual(lines[2].date, '2020-04-18')
self.assertEqual(lines[3].date, date(2020, 4, 18)) self.assertEqual(lines[3].date, '2020-04-18')
def test_timestamp_date_only(self): def test_timestamp_date_only(self):
journal = self.AccountJournal.create({ journal = self.AccountJournal.create({
@@ -639,7 +631,7 @@ class TestAccountBankAccountStatementImportOnline(common.TransactionCase):
lines = statement.line_ids lines = statement.line_ids
self.assertEqual(len(lines), 4) self.assertEqual(len(lines), 4)
self.assertEqual(lines[0].date, date(2020, 4, 18)) self.assertEqual(lines[0].date, '2020-04-18')
self.assertEqual(lines[1].date, date(2020, 4, 18)) self.assertEqual(lines[1].date, '2020-04-18')
self.assertEqual(lines[2].date, date(2020, 4, 18)) self.assertEqual(lines[2].date, '2020-04-18')
self.assertEqual(lines[3].date, date(2020, 4, 18)) self.assertEqual(lines[3].date, '2020-04-18')

View File

@@ -101,14 +101,11 @@
<field name="model">account.journal</field> <field name="model">account.journal</field>
<field name="inherit_id" ref="account_bank_statement_import.journal_dashboard_view_inherit"/> <field name="inherit_id" ref="account_bank_statement_import.journal_dashboard_view_inherit"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<div name="bank_statement_create_button" position="attributes"> <xpath expr="//div[@name='bank_cash_commands']//a[@name='create_bank_statement']" position="attributes">
<attribute name="t-if">dashboard.bank_statements_source != 'online_sync' and dashboard.bank_statements_source != 'online'</attribute> <attribute name="t-if">dashboard.bank_statements_source == 'file_import'</attribute>
</div>
<xpath expr="//a[@name='create_bank_statement']" position="attributes">
<attribute name="t-if">dashboard.bank_statements_source != 'online_sync' and dashboard.bank_statements_source != 'online'</attribute>
</xpath> </xpath>
<xpath expr="//a[@name='import_statement']" position="attributes"> <xpath expr="//div[@name='bank_cash_commands']/..//a[@name='import_statement']" position="attributes">
<attribute name="t-if">dashboard.bank_statements_source != 'online_sync' and dashboard.bank_statements_source != 'online'</attribute> <attribute name="t-if">dashboard.bank_statements_source == 'file_import'</attribute>
</xpath> </xpath>
</field> </field>
</record> </record>

View File

@@ -33,7 +33,7 @@ class OnlineBankStatementPullWizard(models.TransientModel):
self.with_context( self.with_context(
active_test=False, active_test=False,
).provider_ids._pull( ).provider_ids._pull(
self.date_since, fields.Datetime.from_string(self.date_since),
self.date_until fields.Datetime.from_string(self.date_until)
) )
return {'type': 'ir.actions.act_window_close'} return {'type': 'ir.actions.act_window_close'}