Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 05416780780d50c432047a749999fb50b04fd589
  • 14.0 par défaut
  • 12.0 protégée
  • 13.0
4 résultats

main.py

Blame
  • account_statement_import.py 6,26 Kio
    import datetime
    import logging
    import re
    
    from odoo import _, api, models
    from odoo.exceptions import UserError
    
    _logger = logging.getLogger(__name__)
    
    
    class AccountStatementImport(models.TransientModel):
        _inherit = "account.statement.import"
    
        regexp_version = {
            "line_1": r"^Code de la banque : (?P<bank_group_code>\d{5});Code de l'agence : (?P<bank_local_code>\d{5});Date de début de téléchargement : (?P<opening_date>\d{2}/\d{2}/\d{4});Date de fin de téléchargement : (?P<closing_date>\d{2}/\d{2}/\d{4});$",
            "line_2": r"^Numéro de compte : (?P<bank_account_number>\d{11});Nom du compte : (?P<nom_compte>.*);Devise : (?P<currency>.{3});$",
            "line_closing_balance": r"^Solde en fin de période;;;;(?P<balance>(\+|-)?\d+(,\d{1,2})?)$",
            "line_opening_balance": r"^Solde en début de période;;;;(?P<balance>(\+|-)?\d+(,\d{1,2})?)$",
            "line_credit": r"^(?P<date>\d{2}/\d{2}/\d{2});(?P<ref>.*);(?P<name>.*);;\+(?P<credit>\d+(,\d{1,2})?);(?P<note>.*);$",
            "line_debit": r"^(?P<date>\d{2}/\d{2}/\d{2});(?P<ref>.*);(?P<name>.*);(?P<debit>-\d+(,\d{1,2})?);;(?P<note>.*);$",
            "line_date_format": "%d/%m/%y",
        }
    
        @api.model
        def _find_bank_account_id(self, account_number):
            """Get res.partner.bank ID"""
            bank_account_id = None
            if account_number and len(account_number) > 4:
                bank_account_ids = self.env["res.partner.bank"].search(
                    [("acc_number", "=", account_number)], limit=1
                )
                if bank_account_ids:
                    bank_account_id = bank_account_ids[0].id
            return bank_account_id
    
        @api.model
        def _check_file(self, data_file):
            try:
                parse_line_1 = re.compile(self.regexp_version["line_1"]).search(
                    data_file[0]
                )
                bank_group_code = parse_line_1.group("bank_group_code")
                opening_date = parse_line_1.group("opening_date")
                closing_date = parse_line_1.group("closing_date")
    
                parse_line_2 = re.compile(self.regexp_version["line_2"]).search(
                    data_file[1]
                )
                bank_account_number = parse_line_2.group("bank_account_number")
                currency = parse_line_2.group("currency")
    
                closing_balance = float(
                    re.compile(self.regexp_version["line_closing_balance"])
                    .search(data_file[3])
                    .group("balance")
                    .replace(",", ".")
                )
                opening_balance = float(
                    re.compile(self.regexp_version["line_opening_balance"])
                    .search(data_file[len(data_file) - 1])
                    .group("balance")
                    .replace(",", ".")
                )
    
            except Exception as e:
                _logger.debug(e)
                return False
            return (
                bank_group_code,
                opening_date,
                closing_date,
                bank_account_number,
                opening_balance,
                closing_balance,
                currency,
            )
    
        @api.model
        def _parse_file(self, data_file):
            data_file_split = data_file.decode("iso-8859-1").splitlines()
            result = self._check_file(data_file_split)
            if not result:
                return super()._parse_file(data_file)
    
            (
                bank_group_code,
                opening_date,
                closing_date,
                bank_account_number,
                opening_balance,
                closing_balance,
                currency,
            ) = result
            transactions = []
            total_amt = 0.00
            try:
                index = 0
                for line in data_file_split[5 : len(data_file_split) - 1]:
                    transaction = re.compile(self.regexp_version["line_debit"]).search(line)
                    if transaction is not None:
                        transaction_amount = float(
                            transaction.group("debit").replace(",", ".")
                        )
                    else:
                        transaction = re.compile(self.regexp_version["line_credit"]).search(
                            line
                        )
                        transaction_amount = float(
                            transaction.group("credit").replace(",", ".")
                        )
    
                    libelle = transaction.group("name")
                    if transaction.group("note") != "":
                        libelle += " */* " + transaction.group("note")
                    vals_line = {
                        "date": datetime.datetime.strptime(
                            transaction.group("date"),
                            self.regexp_version["line_date_format"],
                        ).strftime("%Y-%m-%d"),
                        "payment_ref": libelle,
                        # 'ref': transaction.group('unique_import_id'),
                        "amount": transaction_amount,
                        # 'note': transaction.group('note'),
                        "unique_import_id": str(index)
                        + transaction.group("date")
                        + transaction.group("name")
                        + str(transaction_amount)
                        + transaction.group("note"),
                        # Removed account_number since it forces all partner_id to current company
                        # "account_number": bank_account_number,
                    }
                    total_amt += transaction_amount
                    transactions.append(vals_line)
                    index = index + 1
    
                if abs(opening_balance + total_amt - closing_balance) > 0.00001:
                    raise ValueError(
                        _(
                            "Sum of opening balance and transaction lines is not equel to closing balance."
                        )
                    )
    
            except Exception as e:
                raise UserError(
                    _(
                        "The following problem occurred during import. The file might not be valid.\n\n %s"
                    )
                    % str(e)
                ) from e
    
            vals_bank_statement = {
                "name": bank_account_number + "/" + opening_date,
                "date": datetime.datetime.strptime(opening_date, "%d/%m/%Y").strftime(
                    "%Y-%m-%d"
                ),
                "transactions": list(reversed(transactions)),
                "balance_start": opening_balance,
                "balance_end_real": closing_balance,
            }
            return currency, bank_account_number, [vals_bank_statement]