82 lines
4.9 KiB
Python
82 lines
4.9 KiB
Python
|
from odoo.exceptions import UserError
|
||
|
from odoo import fields, models, api, _
|
||
|
|
||
|
from .razorpay_pos_request import RazorpayPosRequest
|
||
|
|
||
|
class PosPaymentMethod(models.Model):
|
||
|
_inherit = 'pos.payment.method'
|
||
|
|
||
|
razorpay_tid = fields.Char(string='Razorpay Device Serial No', help='Device Serial No \n ex: 7000012300')
|
||
|
razorpay_allowed_payment_modes = fields.Selection(selection=[('all', 'All'), ('card', 'Card'), ('upi', 'UPI'), ('bharatqr', 'BHARATQR')], default='all', help='Choose allow payment mode: \n All/Card/UPI or QR')
|
||
|
razorpay_username = fields.Char(string='Razorpay Username', help='Username(Device Login) \n ex: 1234500121')
|
||
|
razorpay_api_key = fields.Char(string='Razorpay API Key', help='Used when connecting to Razorpay: https://razorpay.com/docs/payments/dashboard/account-settings/api-keys/')
|
||
|
razorpay_test_mode = fields.Boolean(string='Razorpay Test Mode', default=False, help='Turn it on when in Test Mode')
|
||
|
|
||
|
def _get_payment_terminal_selection(self):
|
||
|
return super()._get_payment_terminal_selection() + [('razorpay', 'Razorpay')]
|
||
|
|
||
|
def razorpay_make_payment_request(self, data):
|
||
|
razorpay = RazorpayPosRequest(self)
|
||
|
body = razorpay._razorpay_get_payment_request_body(payment_mode=True)
|
||
|
body.update({
|
||
|
'amount': data.get('amount'),
|
||
|
'externalRefNumber': data.get('referenceId')
|
||
|
})
|
||
|
response = razorpay._call_razorpay(endpoint='pay', payload=body)
|
||
|
if response.get('success') and not response.get('errorCode'):
|
||
|
return {
|
||
|
'success': True,
|
||
|
'p2pRequestId': str(response.get('p2pRequestId'))
|
||
|
}
|
||
|
default_error_msg = _('Razorpay POS payment request expected errorCode not found in the response')
|
||
|
error = response.get('errorMessage') or default_error_msg
|
||
|
return {'error': str(error)}
|
||
|
|
||
|
def razorpay_fetch_payment_status(self, data):
|
||
|
razorpay = RazorpayPosRequest(self)
|
||
|
body = razorpay._razorpay_get_payment_status_request_body()
|
||
|
body.update({'origP2pRequestId': data.get('p2pRequestId')})
|
||
|
response = razorpay._call_razorpay(endpoint='status', payload=body)
|
||
|
if response.get('success') and not response.get('errorCode'):
|
||
|
payment_status = response.get('status')
|
||
|
payment_messageCode = response.get('messageCode')
|
||
|
if payment_status == 'AUTHORIZED' and payment_messageCode == 'P2P_DEVICE_TXN_DONE':
|
||
|
return {
|
||
|
'status': response.get('status'),
|
||
|
'authCode': response.get('authCode'),
|
||
|
'cardLastFourDigit': response.get('cardLastFourDigit'),
|
||
|
'externalRefNumber': response.get('externalRefNumber'),
|
||
|
'reverseReferenceNumber': response.get('reverseReferenceNumber'),
|
||
|
'txnId': response.get('txnId'),
|
||
|
'paymentMode': response.get('paymentMode'),
|
||
|
'paymentCardType': response.get('paymentCardType'),
|
||
|
'paymentCardBrand': response.get('paymentCardBrand'),
|
||
|
'nameOnCard': response.get('nameOnCard'),
|
||
|
'acquirerCode': response.get('acquirerCode'),
|
||
|
'createdTime': response.get('createdTime'),
|
||
|
}
|
||
|
elif payment_status == 'FAILED' or payment_messageCode == 'P2P_DEVICE_CANCELED':
|
||
|
return {'error': str(response.get('message', _('Razorpay POS transaction failed'))),
|
||
|
'payment_messageCode': payment_messageCode}
|
||
|
elif payment_messageCode in ['P2P_DEVICE_RECEIVED', 'P2P_DEVICE_SENT', 'P2P_STATUS_QUEUED']:
|
||
|
return {'status': payment_messageCode.split('_')[-1]}
|
||
|
default_error_msg = _('Razorpay POS payment status request expected errorCode not found in the response')
|
||
|
error = response.get('errorMessage') or default_error_msg
|
||
|
return {'error': str(error)}
|
||
|
|
||
|
def razorpay_cancel_payment_request(self, data):
|
||
|
razorpay = RazorpayPosRequest(self)
|
||
|
body = razorpay._razorpay_get_payment_request_body(payment_mode=False)
|
||
|
body.update({'origP2pRequestId': data.get('p2pRequestId')})
|
||
|
response = razorpay._call_razorpay(endpoint='cancel', payload=body)
|
||
|
if response.get('success') and not response.get('errorCode'):
|
||
|
return {'error': _('Razorpay POS transaction canceled successfully')}
|
||
|
default_error_msg = _('Razorpay POS payment cancel request expected errorCode not found in the response')
|
||
|
errorMessage = response.get('errorMessage') or default_error_msg
|
||
|
return {'errorMessage': str(errorMessage)}
|
||
|
|
||
|
@api.constrains('use_payment_terminal')
|
||
|
def _check_razorpay_terminal(self):
|
||
|
if any(record.use_payment_terminal == 'razorpay' and record.company_id.currency_id.name != 'INR' for record in self):
|
||
|
raise UserError(_('This Payment Terminal is only valid for INR Currency'))
|