From: Yoan Le Clanche Date: Tue, 13 Jan 2026 15:46:18 +0000 (+0100) Subject: Set amount fields as text and auto add optional fees https://trackers.pilotsystems... X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=62ca6d72f7570096bbcff2ee46bf5e59e0426d70;p=teleforma.git Set amount fields as text and auto add optional fees https://trackers.pilotsystems.net/prebarreau/0965 --- diff --git a/teleforma/admin.py b/teleforma/admin.py index 5f28db25..dc65bc83 100644 --- a/teleforma/admin.py +++ b/teleforma/admin.py @@ -35,6 +35,8 @@ from .views.core import get_periods from django.contrib.admin.helpers import ActionForm from django import forms +from django.forms.widgets import TextInput +from django.db import models class PeriodListFilter(SimpleListFilter): @@ -69,21 +71,33 @@ class PeriodListFilter(SimpleListFilter): class PaymentInline(admin.StackedInline): model = Payment + formfield_overrides = { + models.FloatField: {'widget': TextInput(attrs={'autocomplete': 'on'})}, + } class OptionalFeeInline(admin.StackedInline): model = OptionalFee extra = 1 + formfield_overrides = { + models.FloatField: {'widget': TextInput(attrs={'autocomplete': 'on'})}, + } class DiscountInline(admin.StackedInline): model = Discount extra = 1 + formfield_overrides = { + models.FloatField: {'widget': TextInput(attrs={'autocomplete': 'on'})}, + } class PaybackInline(admin.StackedInline): model = Payback extra = 1 + formfield_overrides = { + models.FloatField: {'widget': TextInput(attrs={'autocomplete': 'on'})}, + } class StudentAdminMixin: diff --git a/teleforma/migrations/0036_period_optional_fees.py b/teleforma/migrations/0036_period_optional_fees.py new file mode 100644 index 00000000..208c47d9 --- /dev/null +++ b/teleforma/migrations/0036_period_optional_fees.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teleforma', '0035_auto_20250924_1031'), + ] + + operations = [ + migrations.AddField( + model_name='period', + name='fascicule_fee', + field=models.FloatField(default=110, help_text="Montant en € ajouté automatiquement si l'étudiant choisit l'envoi de fascicules", verbose_name="Frais d'envoi de fascicules"), + ), + migrations.AddField( + model_name='period', + name='oral_option_fee', + field=models.FloatField(default=250, help_text="Montant en € ajouté automatiquement si l'étudiant choisit l'option oral de langue", verbose_name="Frais option oral de langue"), + ), + ] diff --git a/teleforma/models/core.py b/teleforma/models/core.py index f870443a..d4957de9 100644 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -206,10 +206,16 @@ class Period(models.Model): "date d'ouverture des inscriptions", null=True, blank=True) date_inscription_end = models.DateField( "date de fermeture des inscriptions", null=True, blank=True) - corrections_from = models.ForeignKey('Period', - verbose_name="Récupérer les séminaires de correction depuis", - help_text="Permet d'afficher les séminaires de corrections d'une autre période. Il faut aussi cocher la case relative dans les matières pour autoriser celles-ci à partager leur contenu.", + corrections_from = models.ForeignKey('Period', + verbose_name="Récupérer les séminaires de correction depuis", + help_text="Permet d'afficher les séminaires de corrections d'une autre période. Il faut aussi cocher la case relative dans les matières pour autoriser celles-ci à partager leur contenu.", blank=True, null=True, on_delete=models.SET_NULL) + fascicule_fee = models.FloatField( + "Frais d'envoi de fascicules", default=110, + help_text="Montant en € ajouté automatiquement si l'étudiant choisit l'envoi de fascicules") + oral_option_fee = models.FloatField( + "Frais option oral de langue", default=250, + help_text="Montant en € ajouté automatiquement si l'étudiant choisit l'option oral de langue") def __str__(self): return self.name diff --git a/teleforma/models/crfpa.py b/teleforma/models/crfpa.py index 6a71b83e..a2561df9 100644 --- a/teleforma/models/crfpa.py +++ b/teleforma/models/crfpa.py @@ -442,8 +442,35 @@ def purge_courses_cache(sender, instance, *args, **kwargs): # print(f"purging {cache_key}") cache.delete(cache_key) +def create_optional_fees(sender, instance, created, *args, **kwargs): + """Create optional fees for fascicule and oral option when a student is created""" + if not created: + return + + period = instance.period + if not period: + return + + # Frais d'envoi de fascicules + if instance.fascicule and period.fascicule_fee: + OptionalFee.objects.create( + student=instance, + value=period.fascicule_fee, + description="Envoi de fascicules" + ) + + # Frais option oral de langue + if instance.oral_1 and instance.oral_1.title != 'Aucune' and period.oral_option_fee: + OptionalFee.objects.create( + student=instance, + value=period.oral_option_fee, + description="Option anglais" + ) + + signals.post_save.connect(update_balance_signal) signals.post_save.connect(create_payment_objects, sender=Student) +signals.post_save.connect(create_optional_fees, sender=Student) signals.post_save.connect(purge_courses_cache, sender=Student) signals.post_delete.connect(update_balance_signal)