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:
Sayyid Hamid Mahdavi 2025-11-15 06:10:23 -05:00
commit 47718531bf
5 changed files with 38 additions and 15 deletions

View file

@ -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):

View file

@ -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)

View file

@ -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'),
] ]

View file

@ -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
View 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