]> git.parisson.com Git - teleforma.git/commitdiff
Set amount fields as text and auto add optional fees https://trackers.pilotsystems...
authorYoan Le Clanche <yoanl@pilotsystems.net>
Tue, 13 Jan 2026 15:46:18 +0000 (16:46 +0100)
committerGuillaume Pellerin <guillaume.pellerin@parisson.com>
Wed, 14 Jan 2026 15:37:37 +0000 (16:37 +0100)
teleforma/admin.py
teleforma/migrations/0036_period_optional_fees.py [new file with mode: 0644]
teleforma/models/core.py
teleforma/models/crfpa.py

index 5f28db25303a40cbb0fecfbc148742c48cf83169..dc65bc83496f05e47e1e1e79eb1c51eef0b2b6ef 100644 (file)
@@ -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 (file)
index 0000000..208c47d
--- /dev/null
@@ -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"),
+        ),
+    ]
index f870443a32c7106f81aaac29fea670edd50e9e55..d4957de962cd016c950cdadefebd2cb5bf103331 100644 (file)
@@ -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
index 6a71b83e77844f67ea85be663ddb4f37e5b452e4..a2561df9531ae9cdffd8a717ed73a450aea0db15 100644 (file)
@@ -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)