diff --git a/account_statement_import_online/__manifest__.py b/account_statement_import_online/__manifest__.py index 2bb5aff0..0f58bf6b 100644 --- a/account_statement_import_online/__manifest__.py +++ b/account_statement_import_online/__manifest__.py @@ -23,6 +23,7 @@ "wizards/online_bank_statement_pull_wizard.xml", "views/actions.xml", "views/account_journal.xml", + "views/account_bank_statement_line.xml", "views/online_bank_statement_provider.xml", ], "installable": True, diff --git a/account_statement_import_online/models/__init__.py b/account_statement_import_online/models/__init__.py index 56bd827c..d3f9d0d6 100644 --- a/account_statement_import_online/models/__init__.py +++ b/account_statement_import_online/models/__init__.py @@ -1,4 +1,5 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import account_journal +from . import account_bank_statement_line from . import online_bank_statement_provider diff --git a/account_statement_import_online/models/account_bank_statement_line.py b/account_statement_import_online/models/account_bank_statement_line.py new file mode 100644 index 00000000..7f0c7f08 --- /dev/null +++ b/account_statement_import_online/models/account_bank_statement_line.py @@ -0,0 +1,18 @@ +# Copyright 2021 Therp BV . +# @author: Ronald Portier . +# Licence LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0). +"""Add raw data to statement line, to solve import issues.""" + +from odoo import fields, models + + +class AccountBankStatementLine(models.Model): + """Add raw data to statement line, to solve import issues.""" + + _inherit = "account.bank.statement.line" + + online_raw_data = fields.Text( + help="The complete data retrieved online for this transaction", + readonly=True, + copy=False, + ) diff --git a/account_statement_import_online/models/online_bank_statement_provider.py b/account_statement_import_online/models/online_bank_statement_provider.py index 00cdb6b4..2366fb72 100644 --- a/account_statement_import_online/models/online_bank_statement_provider.py +++ b/account_statement_import_online/models/online_bank_statement_provider.py @@ -292,13 +292,11 @@ class OnlineBankStatementProvider(models.Model): continue bank_account_number = line_values.get("account_number") if bank_account_number: - line_values.update( - { - "account_number": ( - self._sanitize_bank_account_number(bank_account_number) - ), - } + sanitized_account_number = self._sanitize_bank_account_number( + bank_account_number ) + line_values["account_number"] = sanitized_account_number + self._update_partner_from_account_number(line_values) if not line_values.get("payment_ref"): line_values["payment_ref"] = line_values.get("ref") filtered_lines.append(line_values) @@ -365,6 +363,22 @@ class OnlineBankStatementProvider(models.Model): self.ensure_one() return sanitize_account_number(bank_account_number) + def _update_partner_from_account_number(self, line_values): + """Lookup partner using account number.""" + self.ensure_one() + partner_bank = self.env["res.partner.bank"].search( + [ + ("acc_number", "=", line_values["account_number"]), + "|", + ("company_id", "=", False), + ("company_id", "=", self.company_id.id), + ], + limit=1, + ) + if partner_bank: + line_values["partner_bank_id"] = partner_bank.id + line_values["partner_id"] = partner_bank.partner_id.id + def _get_next_run_period(self): self.ensure_one() if self.interval_type == "minutes": diff --git a/account_statement_import_online/views/account_bank_statement_line.xml b/account_statement_import_online/views/account_bank_statement_line.xml new file mode 100644 index 00000000..1b7dd2f9 --- /dev/null +++ b/account_statement_import_online/views/account_bank_statement_line.xml @@ -0,0 +1,25 @@ + + + + account.bank.statement.line + + + + + + + + + + + + + + diff --git a/account_statement_import_online_ponto/models/online_bank_statement_provider_ponto.py b/account_statement_import_online_ponto/models/online_bank_statement_provider_ponto.py index cba280a9..b962ae96 100644 --- a/account_statement_import_online_ponto/models/online_bank_statement_provider_ponto.py +++ b/account_statement_import_online_ponto/models/online_bank_statement_provider_ponto.py @@ -156,34 +156,32 @@ class OnlineBankStatementProviderPonto(models.Model): response = requests.get( page_url, params=params, headers=self._ponto_header() ) - if response.status_code == 200: - if params.get("before"): - params.pop("before") - data = json.loads(response.text) - links = data.get("links", {}) - if page_next: - page_url = links.get("next", False) - else: - page_url = links.get("prev", False) - transactions = data.get("data", []) - if transactions: - current_transactions = [] - for transaction in transactions: - date = self._ponto_date_from_string( - transaction.get("attributes", {}).get("executionDate") - ) - if date_since <= date < date_until: - current_transactions.append(transaction) - - if current_transactions: - if not page_next or (page_next and not latest_identifier): - latest_identifier = current_transactions[0].get("id") - transaction_lines.extend(current_transactions) - else: + if response.status_code != 200: raise UserError( _("Error during get transaction.\n\n%s \n\n %s") % (response.status_code, response.text) ) + if params.get("before"): + params.pop("before") + data = json.loads(response.text) + links = data.get("links", {}) + if page_next: + page_url = links.get("next", False) + else: + page_url = links.get("prev", False) + transactions = data.get("data", []) + if transactions: + current_transactions = [] + for transaction in transactions: + date = self._ponto_date_from_string( + transaction.get("attributes", {}).get("executionDate") + ) + if date_since <= date < date_until: + current_transactions.append(transaction) + if current_transactions: + if not page_next or (page_next and not latest_identifier): + latest_identifier = current_transactions[0].get("id") + transaction_lines.extend(current_transactions) if latest_identifier: self.ponto_last_identifier = latest_identifier return transaction_lines @@ -197,6 +195,7 @@ class OnlineBankStatementProviderPonto(models.Model): return dt.replace(tzinfo=None) def _ponto_obtain_statement_data(self, date_since, date_until): + """Translate information from Ponto to Odoo bank statement lines.""" self.ensure_one() account_ids = self._ponto_get_account_ids() journal = self.journal_id @@ -215,27 +214,33 @@ class OnlineBankStatementProviderPonto(models.Model): sequence = 0 for transaction in transaction_lines: sequence += 1 - attributes = transaction.get("attributes", {}) - ref_list = [ - attributes.get(x) - for x in {"description", "counterpartName", "counterpartReference"} - if attributes.get(x) - ] - ref = " ".join(ref_list) - date = self._ponto_date_from_string(attributes.get("executionDate")) - vals_line = { - "sequence": sequence, - "date": date, - "ref": re.sub(" +", " ", ref) or "/", - "payment_ref": attributes.get("remittanceInformation", ref), - "unique_import_id": transaction["id"], - "amount": attributes["amount"], - } - if attributes.get("counterpartReference"): - vals_line["account_number"] = attributes["counterpartReference"] - if attributes.get("counterpartName"): - vals_line["partner_name"] = attributes["counterpartName"] + vals_line = self._ponto_get_transaction_vals(transaction, sequence) new_transactions.append(vals_line) if new_transactions: return new_transactions, {} return + + def _ponto_get_transaction_vals(self, transaction, sequence): + """Translate information from Ponto to statement line vals.""" + attributes = transaction.get("attributes", {}) + ref_list = [ + attributes.get(x) + for x in {"description", "counterpartName", "counterpartReference"} + if attributes.get(x) + ] + ref = " ".join(ref_list) + date = self._ponto_date_from_string(attributes.get("executionDate")) + vals_line = { + "sequence": sequence, + "date": date, + "ref": re.sub(" +", " ", ref) or "/", + "payment_ref": attributes.get("remittanceInformation", ref), + "unique_import_id": transaction["id"], + "amount": attributes["amount"], + "online_raw_data": transaction, + } + if attributes.get("counterpartReference"): + vals_line["account_number"] = attributes["counterpartReference"] + if attributes.get("counterpartName"): + vals_line["partner_name"] = attributes["counterpartName"] + return vals_line