feat: Mise à jour du modèle (possibilité d'associer une réduciton à un

frais d'inscription [#18]
This commit is contained in:
N3WT DE COMPET
2025-01-20 20:42:51 +01:00
parent 5a0e65bb75
commit 8d1a41e269
9 changed files with 224 additions and 151 deletions

View File

@ -68,6 +68,11 @@ class Planning(models.Model):
def __str__(self):
return f'Planning for {self.level} of {self.school_class.atmosphere_name}'
class PaymentOptions(models.IntegerChoices):
SINGLE_PAYMENT = 0, _('Paiement en une seule fois')
FOUR_TIME_PAYMENT = 1, _('Paiement en 4 fois')
TEN_TIME_PAYMENT = 2, _('Paiement en 10 fois')
class Discount(models.Model):
name = models.CharField(max_length=255, unique=True)
amount = models.DecimalField(max_digits=10, decimal_places=2)
@ -78,25 +83,23 @@ class Discount(models.Model):
class Fee(models.Model):
name = models.CharField(max_length=255, unique=True)
amount = models.DecimalField(max_digits=10, decimal_places=2)
description = models.TextField(blank=True)
base_amount = models.DecimalField(max_digits=10, decimal_places=2, default=0)
currency = models.CharField(max_length=3, default='EUR')
discounts = models.ManyToManyField('Discount', blank=True)
payment_option = models.IntegerField(choices=PaymentOptions, default=PaymentOptions.SINGLE_PAYMENT)
is_active = models.BooleanField(default=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class TuitionFee(models.Model):
class PaymentOptions(models.IntegerChoices):
SINGLE_PAYMENT = 0, _('Paiement en une seule fois')
FOUR_TIME_PAYMENT = 1, _('Paiement en 4 fois')
TEN_TIME_PAYMENT = 2, _('Paiement en 10 fois')
name = models.CharField(max_length=255, unique=True)
description = models.TextField(blank=True)
base_amount = models.DecimalField(max_digits=10, decimal_places=2)
base_amount = models.DecimalField(max_digits=10, decimal_places=2, default=0)
currency = models.CharField(max_length=3, default='EUR')
discounts = models.ManyToManyField('Discount', blank=True)
validity_start_date = models.DateField()
validity_end_date = models.DateField()
payment_option = models.IntegerField(choices=PaymentOptions, default=PaymentOptions.SINGLE_PAYMENT)
is_active = models.BooleanField(default=True)
updated_at = models.DateTimeField(auto_now=True)
@ -107,16 +110,3 @@ class TuitionFee(models.Model):
def clean(self):
if self.validity_end_date <= self.validity_start_date:
raise ValidationError(_('La date de fin de validité doit être après la date de début de validité.'))
def calculate_final_amount(self):
amount = self.base_amount
# Apply fees (supplements and taxes)
# for fee in self.fees.all():
# amount += fee.amount
# Apply discounts
for discount in self.discounts.all():
amount -= discount.amount
return amount

View File

@ -180,21 +180,48 @@ class DiscountSerializer(serializers.ModelSerializer):
fields = '__all__'
class FeeSerializer(serializers.ModelSerializer):
discounts = serializers.PrimaryKeyRelatedField(queryset=Discount.objects.all(), many=True)
class Meta:
model = Fee
fields = '__all__'
def create(self, validated_data):
discounts_data = validated_data.pop('discounts', [])
# Create the Fee instance
fee = Fee.objects.create(**validated_data)
# Add discounts if provided
fee.discounts.set(discounts_data)
return fee
def update(self, instance, validated_data):
discounts_data = validated_data.pop('discounts', [])
# Update the Fee instance
instance.name = validated_data.get('name', instance.name)
instance.description = validated_data.get('description', instance.description)
instance.base_amount = validated_data.get('base_amount', instance.base_amount)
instance.currency = validated_data.get('currency', instance.currency)
instance.payment_option = validated_data.get('payment_option', instance.payment_option)
instance.is_active = validated_data.get('is_active', instance.is_active)
instance.updated_at = validated_data.get('updated_at', instance.updated_at)
instance.save()
# Update discounts if provided
instance.discounts.set(discounts_data)
return instance
class TuitionFeeSerializer(serializers.ModelSerializer):
discounts = serializers.PrimaryKeyRelatedField(queryset=Discount.objects.all(), many=True)
final_amount = serializers.SerializerMethodField()
class Meta:
model = TuitionFee
fields = '__all__'
def get_final_amount(self, obj):
return obj.calculate_final_amount()
def create(self, validated_data):
discounts_data = validated_data.pop('discounts', [])
@ -202,8 +229,7 @@ class TuitionFeeSerializer(serializers.ModelSerializer):
tuition_fee = TuitionFee.objects.create(**validated_data)
# Add discounts if provided
for discount in discounts_data:
tuition_fee.discounts.add(discount)
tuition_fee.discounts.set(discounts_data)
return tuition_fee
@ -215,14 +241,12 @@ class TuitionFeeSerializer(serializers.ModelSerializer):
instance.description = validated_data.get('description', instance.description)
instance.base_amount = validated_data.get('base_amount', instance.base_amount)
instance.currency = validated_data.get('currency', instance.currency)
instance.validity_start_date = validated_data.get('validity_start_date', instance.validity_start_date)
instance.validity_end_date = validated_data.get('validity_end_date', instance.validity_end_date)
instance.payment_option = validated_data.get('payment_option', instance.payment_option)
instance.is_active = validated_data.get('is_active', instance.is_active)
instance.updated_at = validated_data.get('updated_at', instance.updated_at)
instance.save()
# Update discounts if provided
if discounts_data:
instance.discounts.set(discounts_data)
instance.discounts.set(discounts_data)
return instance