odex25_standard/odex25_donation/payment_applepay/models/payment_transaction.py

67 lines
2.7 KiB
Python

import logging
import dateutil.parser
import re
import pytz
from odoo import _, models,fields, api
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class PaymentTransaction(models.Model):
_inherit = 'payment.transaction'
applepay_checkout_id = fields.Char('Checkout Id', groups='base.group_user', help='Unique checkout id for every applepay transasction')
@api.model
def _applepay_form_get_tx_from_data(self, data):
reference, txn_id = data.get('ndc'), data.get('tx_id')
if not txn_id:
error_msg = _('ApplePay: received data with missing transaction id (%s)') % (txn_id)
_logger.info(error_msg)
raise ValidationError(error_msg)
txs = self.env['payment.transaction'].search([('id', '=', int(txn_id))])
if not txs or len(txs) > 1:
error_msg = 'ApplePay: received data for reference %s' % (reference)
if not txs:
error_msg += '; no order found'
else:
error_msg += '; multiple order found'
_logger.info(error_msg)
raise ValidationError(error_msg)
return txs[0]
def _applepay_form_validate(self, data):
_logger.info('Validated ApplePay payment for tx %s: set as pending' % (self.reference))
result = data.get('result')
status_code = data.get('result').get('code')
res = {
'acquirer_reference': data.get('id'),
'state_message': result.get('description', '')
}
success_regex_1 = re.compile(r'000\.000\.|000\.100\.1|000\.[36]').search(status_code)
success_regex_2 = re.compile(r'000\.400\.0[^3]|000\.400\.100').search(status_code)
pending_regex_1 = re.compile(r'000\.200').search(status_code)
pending_regex_2 = re.compile(r'800\.400\.5|100\.400\.500').search(status_code)
error_regex_1 = re.compile(r'000\.100\.2').search(status_code)
_logger.info("Apple Pay Status Code = %s",status_code)
if success_regex_1 or success_regex_2:
date_validate = dateutil.parser.parse(data.get('timestamp')).astimezone(pytz.utc).replace(tzinfo=None)
res.update(acquirer_reference=data.get('id'), date=date_validate)
self._set_transaction_done()
elif pending_regex_1 or pending_regex_2:
self._set_transaction_pending()
elif error_regex_1:
self._set_transaction_error()
else:
error = 'Received unrecognized status for ApplePay payment %s: %s, set as error' % (self.reference, status_code)
_logger.info(error)
self._set_transaction_cancel()
return self.write(res)