56 lines
2.1 KiB
Python
56 lines
2.1 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):
|
|
success_re = r"^(000\.000\.|000\.100\.1|000\.[36]|000\.400\.1[12]0|000\.400\.0[^3]|000\.400\.100)"
|
|
pending_re = r"^(000\.200|800\.400\.5|100\.400\.500)"
|
|
|
|
result = data.get('result')
|
|
result_code = result.get('code')
|
|
res = {
|
|
'acquirer_reference': data.get('id'),
|
|
'state_message': f"{result.get('description', '')}\n{','.join([str(s) for s in data.get('parameterErrors', [])])}"
|
|
}
|
|
|
|
if re.match(success_re, result_code):
|
|
date_validate = dateutil.parser.parse(data.get('timestamp')).astimezone(pytz.utc).replace(tzinfo=None)
|
|
res.update(date=date_validate)
|
|
self._set_transaction_done()
|
|
elif re.match(pending_re, result_code):
|
|
self._set_transaction_pending()
|
|
else:
|
|
self._set_transaction_error(result.get('description', ''))
|
|
return self.write(res)
|
|
|