mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-29 07:53:23 +00:00
feat: Mise en place des paiements en plusieurs fois - partie BACK [#25]
This commit is contained in:
@ -68,10 +68,11 @@ class Planning(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'Planning for {self.level} of {self.school_class.atmosphere_name}'
|
return f'Planning for {self.level} of {self.school_class.atmosphere_name}'
|
||||||
|
|
||||||
class PaymentOptions(models.IntegerChoices):
|
class PaymentPlanType(models.IntegerChoices):
|
||||||
SINGLE_PAYMENT = 0, _('Paiement en une seule fois')
|
ONE_TIME = 1, '1 fois'
|
||||||
FOUR_TIME_PAYMENT = 1, _('Paiement en 4 fois')
|
THREE_TIMES = 3, '3 fois'
|
||||||
TEN_TIME_PAYMENT = 2, _('Paiement en 10 fois')
|
TEN_TIMES = 10, '10 fois'
|
||||||
|
TWELVE_TIMES = 12, '12 fois'
|
||||||
|
|
||||||
class DiscountType(models.IntegerChoices):
|
class DiscountType(models.IntegerChoices):
|
||||||
CURRENCY = 0, 'Currency'
|
CURRENCY = 0, 'Currency'
|
||||||
@ -102,3 +103,9 @@ class Fee(models.Model):
|
|||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
class PaymentPlan(models.Model):
|
||||||
|
frequency = models.IntegerField(choices=PaymentPlanType.choices, default=PaymentPlanType.ONE_TIME)
|
||||||
|
due_dates = ArrayField(models.DateField(), blank=True)
|
||||||
|
type = models.IntegerField(choices=FeeType.choices, default=FeeType.REGISTRATION_FEE)
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from .models import Teacher, Speciality, SchoolClass, Planning, LEVEL_CHOICES, Discount, Fee
|
from .models import Teacher, Speciality, SchoolClass, Planning, LEVEL_CHOICES, Discount, Fee, PaymentPlan
|
||||||
from Auth.models import Profile
|
from Auth.models import Profile
|
||||||
from N3wtSchool import settings, bdd
|
from N3wtSchool import settings, bdd
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
@ -191,3 +191,8 @@ class FeeSerializer(serializers.ModelSerializer):
|
|||||||
local_tz = pytz.timezone(settings.TZ_APPLI)
|
local_tz = pytz.timezone(settings.TZ_APPLI)
|
||||||
local_time = utc_time.astimezone(local_tz)
|
local_time = utc_time.astimezone(local_tz)
|
||||||
return local_time.strftime("%d-%m-%Y %H:%M")
|
return local_time.strftime("%d-%m-%Y %H:%M")
|
||||||
|
|
||||||
|
class PaymentPlanSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = PaymentPlan
|
||||||
|
fields = '__all__'
|
||||||
@ -13,6 +13,8 @@ from School.views import (
|
|||||||
FeeView,
|
FeeView,
|
||||||
DiscountsView,
|
DiscountsView,
|
||||||
DiscountView,
|
DiscountView,
|
||||||
|
PaymentPlansView,
|
||||||
|
PaymentPlanView
|
||||||
)
|
)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@ -39,4 +41,8 @@ urlpatterns = [
|
|||||||
re_path(r'^discounts/(?P<_filter>[a-zA-z]+)$$', DiscountsView.as_view(), name="discounts"),
|
re_path(r'^discounts/(?P<_filter>[a-zA-z]+)$$', DiscountsView.as_view(), name="discounts"),
|
||||||
re_path(r'^discount$', DiscountView.as_view(), name="discount"),
|
re_path(r'^discount$', DiscountView.as_view(), name="discount"),
|
||||||
re_path(r'^discount/([0-9]+)$', DiscountView.as_view(), name="discount"),
|
re_path(r'^discount/([0-9]+)$', DiscountView.as_view(), name="discount"),
|
||||||
|
|
||||||
|
re_path(r'^paymentPlans/(?P<_filter>[a-zA-z]+)$', PaymentPlansView.as_view(), name="paymentPlans"),
|
||||||
|
re_path(r'^paymentPlan$', PaymentPlanView.as_view(), name="paymentPlan"),
|
||||||
|
re_path(r'^paymentPlan/([0-9]+)$', PaymentPlanView.as_view(), name="paymentPlan"),
|
||||||
]
|
]
|
||||||
@ -5,8 +5,8 @@ from rest_framework.parsers import JSONParser
|
|||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from .models import Teacher, Speciality, SchoolClass, Planning, Discount, Fee
|
from .models import Teacher, Speciality, SchoolClass, Planning, Discount, Fee, PaymentPlan
|
||||||
from .serializers import TeacherSerializer, SpecialitySerializer, SchoolClassSerializer, PlanningSerializer, DiscountSerializer, FeeSerializer
|
from .serializers import TeacherSerializer, SpecialitySerializer, SchoolClassSerializer, PlanningSerializer, DiscountSerializer, FeeSerializer, PaymentPlanSerializer
|
||||||
from N3wtSchool import bdd
|
from N3wtSchool import bdd
|
||||||
from N3wtSchool.bdd import delete_object, getAllObjects, getObject
|
from N3wtSchool.bdd import delete_object, getAllObjects, getObject
|
||||||
|
|
||||||
@ -308,3 +308,51 @@ class FeeView(APIView):
|
|||||||
|
|
||||||
def delete(self, request, _id):
|
def delete(self, request, _id):
|
||||||
return delete_object(Fee, _id)
|
return delete_object(Fee, _id)
|
||||||
|
|
||||||
|
@method_decorator(csrf_protect, name='dispatch')
|
||||||
|
@method_decorator(ensure_csrf_cookie, name='dispatch')
|
||||||
|
class PaymentPlansView(APIView):
|
||||||
|
def get(self, request, _filter, *args, **kwargs):
|
||||||
|
|
||||||
|
if _filter not in ['registration', 'tuition']:
|
||||||
|
return JsonResponse({"error": "Invalid type parameter. Must be 'registration' or 'tuition'."}, safe=False, status=400)
|
||||||
|
|
||||||
|
type_value = 0 if _filter == 'registration' else 1
|
||||||
|
paymentPlans = PaymentPlan.objects.filter(type=type_value)
|
||||||
|
payment_plans_serializer = PaymentPlanSerializer(paymentPlans, many=True)
|
||||||
|
|
||||||
|
return JsonResponse(payment_plans_serializer.data, safe=False, status=200)
|
||||||
|
|
||||||
|
@method_decorator(csrf_protect, name='dispatch')
|
||||||
|
@method_decorator(ensure_csrf_cookie, name='dispatch')
|
||||||
|
class PaymentPlanView(APIView):
|
||||||
|
def get(self, request, _id):
|
||||||
|
try:
|
||||||
|
payment_plan = PaymentPlan.objects.get(id=_id)
|
||||||
|
payment_plan_serializer = PaymentPlanSerializer(payment_plan)
|
||||||
|
return JsonResponse(payment_plan_serializer.data, safe=False)
|
||||||
|
except PaymentPlan.DoesNotExist:
|
||||||
|
return JsonResponse({'error': 'No object found'}, status=404)
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
payment_plan_data = JSONParser().parse(request)
|
||||||
|
payment_plan_serializer = PaymentPlanSerializer(data=payment_plan_data)
|
||||||
|
if payment_plan_serializer.is_valid():
|
||||||
|
payment_plan_serializer.save()
|
||||||
|
return JsonResponse(payment_plan_serializer.data, safe=False, status=201)
|
||||||
|
return JsonResponse(payment_plan_serializer.errors, safe=False, status=400)
|
||||||
|
|
||||||
|
def put(self, request, _id):
|
||||||
|
payment_plan_data = JSONParser().parse(request)
|
||||||
|
try:
|
||||||
|
payment_plan = PaymentPlan.objects.get(id=_id)
|
||||||
|
except PaymentPlan.DoesNotExist:
|
||||||
|
return JsonResponse({'error': 'No object found'}, status=404)
|
||||||
|
payment_plan_serializer = PaymentPlanSerializer(payment_plan, data=payment_plan_data, partial=True)
|
||||||
|
if payment_plan_serializer.is_valid():
|
||||||
|
payment_plan_serializer.save()
|
||||||
|
return JsonResponse(payment_plan_serializer.data, safe=False)
|
||||||
|
return JsonResponse(payment_plan_serializer.errors, safe=False, status=400)
|
||||||
|
|
||||||
|
def delete(self, request, _id):
|
||||||
|
return delete_object(PaymentPlan, _id)
|
||||||
Reference in New Issue
Block a user