mirror of
https://github.com/OCA/bank-statement-import.git
synced 2025-01-20 12:37:43 +02:00
[MIG] account_bank_statement_import_online: Backport to 11.0
This commit is contained in:
@@ -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, '
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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.')
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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'}
|
||||||
|
|||||||
Reference in New Issue
Block a user