changes
This commit is contained in:
@@ -442,6 +442,51 @@ class PaymentTransaction(models.Model):
|
||||
|
||||
return tx
|
||||
|
||||
def _extract_amount_data(self, payment_data):
|
||||
"""Override of `payment` for the Odoo 19 amount-tamper check.
|
||||
|
||||
Odoo's ``_validate_amount`` calls this and KErrors if the dict
|
||||
doesn't contain ``amount`` + ``currency_code``. Other providers
|
||||
always include these in their ``payment_data``; we historically
|
||||
didn't. Extract from the Clover charge response shape:
|
||||
|
||||
- source token charges (Ecommerce):
|
||||
``{'amount': <cents>, 'currency': 'usd', ...}`` (raw Clover
|
||||
response usually shoved into ``payment_data['raw']``)
|
||||
- terminal payments: ``payment_data['amount']`` (we set this
|
||||
explicitly when we build the dict)
|
||||
|
||||
Returns ``None`` to opt out of the amount check when no usable
|
||||
amount field is present — the alternative (hard-failing the
|
||||
transaction) is worse than skipping validation, and our charge
|
||||
amounts are server-controlled (we send them; Clover doesn't
|
||||
invent new amounts).
|
||||
"""
|
||||
if self.provider_code != 'clover':
|
||||
return super()._extract_amount_data(payment_data)
|
||||
|
||||
amount_minor = payment_data.get('amount')
|
||||
currency_code = payment_data.get('currency')
|
||||
# Some code paths put the raw Clover response under 'raw' or pass
|
||||
# the whole charge dict — try those fallbacks before opting out.
|
||||
if amount_minor is None and isinstance(payment_data.get('raw'), dict):
|
||||
amount_minor = payment_data['raw'].get('amount')
|
||||
currency_code = payment_data['raw'].get('currency') or currency_code
|
||||
if amount_minor is None or not currency_code:
|
||||
return None # opt out of amount validation (server-controlled)
|
||||
|
||||
# Clover amounts are in minor units (cents for USD/CAD, no
|
||||
# decimals for JPY/KRW). Convert back to major units using the
|
||||
# transaction's currency to know the divisor.
|
||||
from odoo.addons.fusion_clover import utils as clover_utils
|
||||
amount_major = clover_utils.parse_clover_amount(
|
||||
int(amount_minor), self.currency_id,
|
||||
)
|
||||
return {
|
||||
'amount': float(amount_major),
|
||||
'currency_code': str(currency_code).upper(),
|
||||
}
|
||||
|
||||
def _apply_updates(self, payment_data):
|
||||
"""Override of `payment` to update the transaction based on Clover data."""
|
||||
if self.provider_code != 'clover':
|
||||
|
||||
Reference in New Issue
Block a user