Odoo18-Base/addons/pos_razorpay/models/pos_payment_method.py

82 lines
4.9 KiB
Python
Raw Permalink Normal View History

2025-01-06 10:57:38 +07:00
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'))