Merge pull request 'FEAT(pg): ipg commission calculation' (#7) from FEATURE/payment-commission into master
Reviewed-on: addwin/pg#7 Reviewed-by: Sayyid Hamid Mahdavi <sahama@noreply.localhost>
This commit is contained in:
commit
47718531bf
5 changed files with 38 additions and 15 deletions
|
|
@ -15,6 +15,7 @@ from apps.pg.constans import StateChoices
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from utils.clients.wallet_client import deposit_to_user_wallet_submit, deposit_to_user_wallet_verify
|
from utils.clients.wallet_client import deposit_to_user_wallet_submit, deposit_to_user_wallet_verify
|
||||||
|
from utils.commons import calculate_pna_commission
|
||||||
from main import settings
|
from main import settings
|
||||||
|
|
||||||
from utils.pna import PNAClient
|
from utils.pna import PNAClient
|
||||||
|
|
@ -69,12 +70,8 @@ class PaymentRequest(models.Model):
|
||||||
|
|
||||||
return to_jalali(self.created_at)
|
return to_jalali(self.created_at)
|
||||||
|
|
||||||
def calculate_commission(self):
|
def save_commission(self):
|
||||||
self.commission = settings.COMMISSION_LEVEL1
|
self.commission = calculate_pna_commission(self.amount)
|
||||||
if settings.COMMISSION_LEVEL2_MIN_AMOUNT <= self.amount <= settings.COMMISSION_LEVEL2_MAX_AMOUNT:
|
|
||||||
self.commission = settings.COMMISSION_LEVEL2_RATE * self.amount
|
|
||||||
elif settings.COMMISSION_LEVEL2_MAX_AMOUNT < self.amount:
|
|
||||||
self.commission = settings.COMMISSION_LEVEL3
|
|
||||||
self.save(update_fields=['commission'])
|
self.save(update_fields=['commission'])
|
||||||
|
|
||||||
def get_gateway_tools(self):
|
def get_gateway_tools(self):
|
||||||
|
|
|
||||||
|
|
@ -39,3 +39,7 @@ class ApplicationPaymentRequestSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
read_only_fields = ['uuid', 'updated_at', 'state', 'created_at']
|
read_only_fields = ['uuid', 'updated_at', 'state', 'created_at']
|
||||||
|
|
||||||
|
|
||||||
|
class CommissionSerializer(serializers.Serializer):
|
||||||
|
amount = serializers.IntegerField()
|
||||||
|
commission = serializers.IntegerField(read_only=True)
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from .views import PaymentRequestView, PaymentRequestCreateApiView, PaymentConfirmView, \
|
from .views import PaymentRequestView, PaymentRequestCreateApiView, PaymentConfirmView, \
|
||||||
ApplicationPaymentRequestCreateApiView
|
ApplicationPaymentRequestCreateApiView, CalculateCommissionView
|
||||||
|
|
||||||
app_name = "pg"
|
app_name = "pg"
|
||||||
|
|
||||||
|
|
@ -9,4 +9,5 @@ urlpatterns = [
|
||||||
path('page/pna_callback/<uuid>/', PaymentConfirmView.as_view(), name='payment-confirm-view'),
|
path('page/pna_callback/<uuid>/', PaymentConfirmView.as_view(), name='payment-confirm-view'),
|
||||||
path('api/charge_create/', PaymentRequestCreateApiView.as_view(), name='charge-request-create-api-view'),
|
path('api/charge_create/', PaymentRequestCreateApiView.as_view(), name='charge-request-create-api-view'),
|
||||||
path('api/application/charge_create/<uuid>', ApplicationPaymentRequestCreateApiView.as_view(), name='application-user-charge-request-create-api-view'),
|
path('api/application/charge_create/<uuid>', ApplicationPaymentRequestCreateApiView.as_view(), name='application-user-charge-request-create-api-view'),
|
||||||
|
path('api/calculate_commission/', CalculateCommissionView.as_view(), name='calculate-commission-view'),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,35 @@
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth.decorators import login_required
|
|
||||||
from django.http import HttpResponseRedirect, HttpResponse
|
from django.http import HttpResponseRedirect, HttpResponse
|
||||||
from django.shortcuts import render
|
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
from django.views.generic import UpdateView, DetailView
|
from django.views.generic import UpdateView
|
||||||
from oauth2_provider.contrib.rest_framework import TokenHasScope, IsAuthenticatedOrTokenHasScope
|
from oauth2_provider.contrib.rest_framework import IsAuthenticatedOrTokenHasScope
|
||||||
from rest_framework import generics
|
from rest_framework import generics
|
||||||
|
from rest_framework.response import Response
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
from .forms import PaymentRequestForm
|
from utils.commons import calculate_pna_commission
|
||||||
from .models import PaymentRequest, GatewayChoise
|
|
||||||
from .serializers import PaymentRequestSerializer, ApplicationPaymentRequestSerializer
|
|
||||||
from .constans import StateChoices
|
from .constans import StateChoices
|
||||||
|
from .forms import PaymentRequestForm
|
||||||
|
from .models import PaymentRequest
|
||||||
|
from .serializers import PaymentRequestSerializer, CommissionSerializer
|
||||||
from ..gooyal_oauth2.utils import get_application
|
from ..gooyal_oauth2.utils import get_application
|
||||||
from ..users.models import User
|
from ..users.models import User
|
||||||
|
|
||||||
|
|
||||||
|
class CalculateCommissionView(APIView):
|
||||||
|
def get(self, request):
|
||||||
|
serializer = CommissionSerializer(data=request.query_params)
|
||||||
|
serializer.is_valid(raise_exception=True)
|
||||||
|
amount = serializer.validated_data['amount']
|
||||||
|
commission = calculate_pna_commission(amount)
|
||||||
|
serializer = CommissionSerializer({
|
||||||
|
"amount": amount,
|
||||||
|
"commission": commission
|
||||||
|
})
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
class PaymentRequestCreateApiView(generics.CreateAPIView):
|
class PaymentRequestCreateApiView(generics.CreateAPIView):
|
||||||
permission_classes = [IsAuthenticatedOrTokenHasScope]
|
permission_classes = [IsAuthenticatedOrTokenHasScope]
|
||||||
serializer_class = PaymentRequestSerializer
|
serializer_class = PaymentRequestSerializer
|
||||||
|
|
@ -59,7 +71,7 @@ class PaymentRequestView(UpdateView):
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
charge_request: PaymentRequest = self.get_object()
|
charge_request: PaymentRequest = self.get_object()
|
||||||
charge_request.set_gateway({'pna': True})
|
charge_request.set_gateway({'pna': True})
|
||||||
charge_request.calculate_commission()
|
charge_request.save_commission()
|
||||||
tool = charge_request.get_gateway_tools()
|
tool = charge_request.get_gateway_tools()
|
||||||
tool.make_request()
|
tool.make_request()
|
||||||
redirect_url = tool.get_pg_page_url()
|
redirect_url = tool.get_pg_page_url()
|
||||||
|
|
|
||||||
9
utils/commons.py
Normal file
9
utils/commons.py
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
from main import settings
|
||||||
|
|
||||||
|
def calculate_pna_commission(amount: int) -> int:
|
||||||
|
commission = settings.COMMISSION_LEVEL1
|
||||||
|
if settings.COMMISSION_LEVEL2_MIN_AMOUNT <= amount <= settings.COMMISSION_LEVEL2_MAX_AMOUNT:
|
||||||
|
commission = settings.COMMISSION_LEVEL2_RATE * amount
|
||||||
|
elif settings.COMMISSION_LEVEL2_MAX_AMOUNT < amount:
|
||||||
|
commission = settings.COMMISSION_LEVEL3
|
||||||
|
return commission
|
||||||
Loading…
Add table
Reference in a new issue