1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/payment_sepa_direct_debit/controllers/main.py
2024-12-10 09:04:09 +07:00

61 lines
2.5 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from werkzeug.exceptions import NotFound
from odoo import _
from odoo.exceptions import ValidationError
from odoo.http import Controller, request, route
from odoo.addons.base.models.res_bank import sanitize_account_number
from odoo.addons.base_iban.models.res_partner_bank import validate_iban
from odoo.addons.payment import utils as payment_utils
class SepaDirectDebitController(Controller):
@route('/payment/sepa_direct_debit/set_mandate', type='json', auth='public')
def sdd_set_mandate(self, reference, iban, access_token):
""" Assign the SDD mandate corresponding to the given IBAN to the transaction.
:param str reference: The reference of the transaction.
:param str iban: The IBAN of the partner's bank account.
:param str access_token: The access token used to verify the transaction's reference.
:return: None
:raise ValidationError: If the transaction wasn't found.
:raise ValidationError: If the IBAN is invalid.
:raise NotFound: If the access token is invalid.
"""
tx_sudo = request.env['payment.transaction'].sudo()._get_tx_from_notification_data(
'sepa_direct_debit', {'reference': reference}
)
if not payment_utils.check_access_token(access_token, tx_sudo.reference):
raise NotFound()
# Verify that all configuration-specific required parameters are provided.
iban = self._sdd_validate_and_format_iban(iban)
# Get the mandate from the IBAN
tx_sudo.mandate_id = tx_sudo.provider_id._sdd_find_or_create_mandate(
tx_sudo.partner_id.id, iban
)
# Set the transaction as pending until a matching bank statement is found. Transactions
# created from the form with an IBAN corresponding to an existing mandate are set pending as
# well to force the customer to actually make the payment.
tx_sudo._set_pending()
def _sdd_validate_and_format_iban(self, iban):
""" Validate the provided IBAN and return its formatted value.
:param str iban: The IBAN to validate and format
:return: The formatted IBAN
:rtype: str
:raise: ValidationError if the IBAN is invalid
"""
iban = sanitize_account_number(iban)
validate_iban(iban)
if not iban:
raise ValidationError("SEPA: " + _("Missing or invalid IBAN."))
return iban