Before this commit, the validation flow with verification (payment of a small amount with immediate refund) was performed with the use of validation routes: after payment, the customer was redirected to the validation route stored on the transaction to trigger the refund. This implementation had an issue: if the customer never reached the validation route, they were not refunded their validation amount. This could happen if the customer closed the tab after paying with an acquirer offering payments with redirection, or if the validation payment was asynchronously confirmed through a webhook notification. This commit gets rid of validation routes and requires acquirers to immediately refund the validation amount when the payment is confirmed. This way, a payment confirmation coming from a webhook can trigger the refund too. As the only acquirer that implements the validation with verification flow, Authorize.net now voids validation transactions as soon as they are authorized. While we're at it, the logging of processing values is adapted to only log specific rendering values if a redirect form is rendered. task-2612977 closes odoo/odoo#74707 Related: odoo/enterprise#20060 Related: odoo/upgrade#2710 Signed-off-by: Antoine Vandevenne (anv) <AntoineVDV@users.noreply.github.com>
72 lines
3.2 KiB
Python
72 lines
3.2 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.tests import tagged
|
|
from odoo.tools import mute_logger
|
|
|
|
from odoo.addons.payment.tests.http_common import PaymentHttpCommon
|
|
from odoo.addons.payment.tests.multicompany_common import PaymentMultiCompanyCommon
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestMultiCompanyFlows(PaymentMultiCompanyCommon, PaymentHttpCommon):
|
|
|
|
def test_pay_logged_in_another_company(self):
|
|
"""User pays for an amount in another company."""
|
|
# for another res.partner than the user's one
|
|
route_values = self._prepare_pay_values(partner=self.user_company_b.partner_id)
|
|
|
|
# Log in as user from Company A
|
|
self.authenticate(self.user_company_a.login, self.user_company_a.login)
|
|
|
|
# Pay in company B
|
|
route_values['company_id'] = self.company_b.id
|
|
|
|
tx_context = self.get_tx_checkout_context(**route_values)
|
|
for key, val in tx_context.items():
|
|
if key in route_values:
|
|
if key == 'access_token':
|
|
continue # access_token was modified due to the change of partner.
|
|
elif key == 'partner_id':
|
|
# The partner is replaced by the partner of the user paying.
|
|
self.assertEqual(val, self.user_company_a.partner_id.id)
|
|
else:
|
|
self.assertEqual(val, route_values[key])
|
|
|
|
available_acquirers = self.env['payment.acquirer'].sudo().browse(tx_context['acquirer_ids'])
|
|
self.assertIn(self.acquirer_company_b, available_acquirers)
|
|
self.assertEqual(available_acquirers.company_id, self.company_b)
|
|
|
|
validation_values = {
|
|
k: tx_context[k]
|
|
for k in [
|
|
'amount',
|
|
'currency_id',
|
|
'reference_prefix',
|
|
'partner_id',
|
|
'access_token',
|
|
'landing_route',
|
|
]
|
|
}
|
|
validation_values.update({
|
|
'flow': 'direct',
|
|
'payment_option_id': self.acquirer_company_b.id,
|
|
'tokenization_requested': False,
|
|
})
|
|
with mute_logger('odoo.addons.payment.models.payment_transaction'):
|
|
processing_values = self.get_processing_values(**validation_values)
|
|
tx_sudo = self._get_tx(processing_values['reference'])
|
|
|
|
# Tx values == given values
|
|
self.assertEqual(tx_sudo.acquirer_id.id, self.acquirer_company_b.id)
|
|
self.assertEqual(tx_sudo.amount, self.amount)
|
|
self.assertEqual(tx_sudo.currency_id.id, self.currency.id)
|
|
self.assertEqual(tx_sudo.partner_id.id, self.user_company_a.partner_id.id)
|
|
self.assertEqual(tx_sudo.reference, self.reference)
|
|
self.assertEqual(tx_sudo.company_id, self.company_b)
|
|
# processing_values == given values
|
|
self.assertEqual(processing_values['acquirer_id'], self.acquirer_company_b.id)
|
|
self.assertEqual(processing_values['amount'], self.amount)
|
|
self.assertEqual(processing_values['currency_id'], self.currency.id)
|
|
self.assertEqual(processing_values['partner_id'], self.user_company_a.partner_id.id)
|
|
self.assertEqual(processing_values['reference'], self.reference)
|