When you retrieve the accounts list, there is no paging and so, we don't get the full list when there are more than 10 accounts.
I fixed it but I've no clue how to make a pull_request. If somebody wants to do it, it would be a good idea (I'm in 14.0 though...):
def _update_ponto_accounts(self, method='add'):
url = '/accounts'
paging_forward = True
accounts = []
while url:
resp_json = self._ponto_fetch('GET', url, {}, {})
# 'prev' page contains newer transactions, 'next' page contains older ones.
# we read from last known transaction to newer ones when we know such a transaction
# else we read from the newest transaction back to our date limit
url = resp_json.get('links', {}).get('next' if paging_forward else 'prev', False)
data_lines = resp_json.get('data', [])
accounts += data_lines
res = {'added': self.env['account.online.journal']}
# When we are trying to add a new institution, add all existing account_online_journal that are not currently linked
# The reason is that a user can first synchronize for journal A and receive 3 bank accounts, he only link one bank account
# and does nothing with the 2 others, then later he create a new journal and synchronize again with the same ponto token
# because he would like to link one of the two remaining account to his journal. Since the accounts were already fetched in
# Odoo, we have to show it to him so that he can link them.
if method == 'add':
res['added'] = self.account_online_journal_ids.filtered(lambda j: len(j.journal_ids) == 0)
for account in accounts:
# Fetch accounts
vals = {
'balance': account.get('attributes', {}).get('currentBalance', 0)
}
account_search = self.env['account.online.journal'].search([('account_online_provider_id', '=', self.id), ('online_identifier', '=', account.get('id'))], limit=1)
if len(account_search) == 0:
# Since we just create account, set last sync to 15 days in the past to retrieve transaction from latest 15 days
last_sync = self.last_refresh - datetime.timedelta(days=15)
journal = False
journal_id = self.env['account.journal'].search([('type', '=', 'bank'), ('bank_acc_number', '=', account.get('attributes', {}).get('reference', {}))])
if journal_id:
journal = [(6, 0, journal_id.ids)]
vals.update({
'name': account.get('attributes', {}).get('description', False) or _('Account'),
'online_identifier': account.get('id'),
'account_online_provider_id': self.id,
'account_number': account.get('attributes', {}).get('reference', {}),
'journal_ids': journal,
'last_sync': last_sync,
})
acc = self.env['account.online.journal'].create(vals)
res['added'] += acc
self.write({'status': 'SUCCESS', 'action_required': False})
res.update({'status': 'SUCCESS',
'message': '',
'method': method,
'number_added': len(res['added']),
'journal_id': self.env.context.get('journal_id', False)})
return self.show_result(res)
I also added a functionality to retrieve the existing journals but it doesn't work with the wizard yet => You need to cancel and to synchronize afterwards.