mirror of
https://github.com/bringout/oca-ocb-sale.git
synced 2026-04-26 23:12:09 +02:00
19.0 vanilla
This commit is contained in:
parent
79f83631d5
commit
73afc09215
6267 changed files with 1534193 additions and 1130106 deletions
|
|
@ -0,0 +1,86 @@
|
|||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from psycopg2.errors import LockNotAvailable
|
||||
|
||||
from odoo import _
|
||||
from odoo.exceptions import AccessError, MissingError, UserError, ValidationError
|
||||
from odoo.fields import Command
|
||||
from odoo.http import request, route
|
||||
from odoo.tools import SQL
|
||||
|
||||
from odoo.addons.payment.controllers import portal as payment_portal
|
||||
|
||||
|
||||
# TODO ANVFE part of payment routes ? /shop/payment ? express_checkout ?
|
||||
|
||||
class PaymentPortal(payment_portal.PaymentPortal):
|
||||
|
||||
def _validate_transaction_for_order(self, transaction, sale_order):
|
||||
"""
|
||||
Perform final checks against the transaction & sale_order.
|
||||
Override me to apply payment unrelated checks & processing
|
||||
"""
|
||||
return
|
||||
|
||||
@route('/shop/payment/transaction/<int:order_id>', type='jsonrpc', auth='public', website=True)
|
||||
def shop_payment_transaction(self, order_id, access_token, **kwargs):
|
||||
""" Create a draft transaction and return its processing values.
|
||||
|
||||
:param int order_id: The sales order to pay, as a `sale.order` id
|
||||
:param str access_token: The access token used to authenticate the request
|
||||
:param dict kwargs: Locally unused data passed to `_create_transaction`
|
||||
:return: The mandatory values for the processing of the transaction
|
||||
:rtype: dict
|
||||
:raise: UserError if the order has already been paid or has an ongoing transaction
|
||||
:raise: ValidationError if the access token is invalid or the order is not in the expected
|
||||
state/configuration.
|
||||
"""
|
||||
# Check the order id and the access token
|
||||
# Then lock it during the transaction to prevent concurrent payments
|
||||
try:
|
||||
order_sudo = self._document_check_access('sale.order', order_id, access_token)
|
||||
request.env.cr.execute(
|
||||
SQL('SELECT 1 FROM sale_order WHERE id = %s FOR NO KEY UPDATE NOWAIT', order_id)
|
||||
)
|
||||
except MissingError:
|
||||
raise
|
||||
except AccessError as e:
|
||||
raise ValidationError(_("The access token is invalid.")) from e
|
||||
except LockNotAvailable:
|
||||
raise UserError(_("Payment is already being processed."))
|
||||
|
||||
if order_sudo.state == "cancel":
|
||||
raise ValidationError(_("The order has been cancelled."))
|
||||
|
||||
order_sudo._check_cart_is_ready_to_be_paid()
|
||||
|
||||
self._validate_transaction_kwargs(kwargs)
|
||||
kwargs.update({
|
||||
'partner_id': order_sudo.partner_invoice_id.id,
|
||||
'currency_id': order_sudo.currency_id.id,
|
||||
'sale_order_id': order_id, # Include the SO to allow Subscriptions to tokenize the tx
|
||||
})
|
||||
if not kwargs.get('amount'):
|
||||
kwargs['amount'] = order_sudo.amount_total
|
||||
|
||||
compare_amounts = order_sudo.currency_id.compare_amounts
|
||||
if compare_amounts(kwargs['amount'], order_sudo.amount_total):
|
||||
raise ValidationError(_("The cart has been updated. Please refresh the page."))
|
||||
if compare_amounts(order_sudo.amount_paid, order_sudo.amount_total) == 0:
|
||||
raise UserError(_("The cart has already been paid. Please refresh the page."))
|
||||
|
||||
if delay_token_charge := kwargs.get('flow') == 'token':
|
||||
request.update_context(delay_token_charge=True) # wait until after tx validation
|
||||
tx_sudo = self._create_transaction(
|
||||
custom_create_values={'sale_order_ids': [Command.set([order_id])]}, **kwargs,
|
||||
)
|
||||
|
||||
# Store the new transaction into the transaction list and if there's an old one, we remove
|
||||
# it until the day the ecommerce supports multiple orders at the same time.
|
||||
request.session['__website_sale_last_tx_id'] = tx_sudo.id
|
||||
|
||||
self._validate_transaction_for_order(tx_sudo, order_sudo)
|
||||
if delay_token_charge:
|
||||
tx_sudo._charge_with_token()
|
||||
|
||||
return tx_sudo._get_processing_values()
|
||||
Loading…
Add table
Add a link
Reference in a new issue