<commit_before>from crispy_forms import layout
from crispy_forms.helper import FormHelper
from django import forms
from django.conf import settings
from django.db.models import Sum
from django.db.models.functions import Coalesce
from django.forms import HiddenInput
from django.utils.text import format_lazy
from django.utils.translation import ugettext_lazy as _
from django_countries import countries
from django_countries.fields import LazyTypedChoiceField

from agir.donations.base_forms import SimpleDonationForm, SimpleDonorForm
from agir.donations.form_fields import AskAmountField
from agir.europeennes.apps import EuropeennesConfig
from agir.lib.data import departements_choices
from agir.lib.form_fields import IBANField
from agir.payments.models import Payment
from agir.payments.payment_modes import PaymentModeField, PAYMENT_MODES
from agir.people.models import Person


class LoanForm(SimpleDonationForm):
    button_label = "Je prête !"

    amount = AskAmountField(
        label="Montant du prêt",
        max_value=settings.LOAN_MAXIMUM,
        min_value=settings.LOAN_MINIMUM,
        decimal_places=2,
        required=True,
        error_messages={
            "invalid": _("Indiquez le montant à prêter."),
            "min_value": format_lazy(
                _("Les prêts de moins de 400 € ne sont pas acceptés."),
                min=settings.LOAN_MINIMUM,
            ),
            "max_value": format_lazy(
                _(
                    "Les prêts de plus de {max} € ne peuvent être faits par carte bleue."
                ),
                max=settings.LOAN_MAXIMUM,
            ),
        },
        amount_choices=[10000, 5000, 2000, 1000, 400],
        show_tax_credit=False,
    )


class LenderForm(SimpleDonorForm):
    button_label = "Je prête {amount}"

    country_of_birth = LazyTypedChoiceField(
        required=True,
        label="Pays de naissance",
        choices=[("", "Sélectionnez votre pays de naissance")] + list(countries),
    )
    city_of_birth = forms.CharField(label="Ville de naissance", required=True)
    departement_of_birth = forms.ChoiceField(
        label="Département de naissance (France uniquement)",
        choices=(("", "Indiquez votre département de naissance"),)
        + departements_choices,
        required=False,
    )

    amount = forms.IntegerField(
        max_value=settings.LOAN_MAXIMUM * 100,
        min_value=settings.LOAN_MINIMUM * 100,
        required=True,
        widget=forms.HiddenInput,
    )

    payment_mode = PaymentModeField(
        payment_modes=[
            PAYMENT_MODES["system_pay_afce_pret"],
            PAYMENT_MODES["check_afce"],
        ],
        label="Comment souhaitez-vous prêter l'argent ?",
    )

    iban = IBANField(
        label="Votre IBAN",
        required=True,
        allowed_countries=["FR"],
        help_text="Le numéro IBAN du compte sur lequel le remboursement du prêt sera effectué.",
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields["gender"].required = True
        self.fields["date_of_birth"].required = True
        self.fields["declaration"].label = _(
            "Je certifie sur l'honneur être une personne physique et que le réglement de mon prêt ne provient pas d'une"
            " personne morale mais de mon compte en banque personnel."
        )
        # retirer le help_text qui indique qu'un reçu fiscal sera émis (ce qui n'est pas le cas pour un prêt)
        self.fields["declaration"].help_text = None

        del self.fields["fiscal_resident"]

        if (
            Payment.objects.filter(type=EuropeennesConfig.LOAN_PAYMENT_TYPE).aggregate(
                amount=Coalesce(Sum("price"), 0)
            )["amount"]
            > settings.LOAN_MAXIMUM_TOTAL
        ):
            self.fields["payment_mode"].payment_modes = [
                PAYMENT_MODES["system_pay_afce_pret"]
            ]
            self.fields["payment_mode"].initial = PAYMENT_MODES[
                "system_pay_afce_pret"
            ].id
            self.fields["payment_mode"].widget = HiddenInput()

        fields = ["amount"]<commit_msg>corrige le calcul du plafond des prets en attente<commit_after>from crispy_forms import layout
from crispy_forms.helper import FormHelper
from django import forms
from django.conf import settings
from django.db.models import Sum, Q
from django.db.models.functions import Coalesce
from django.forms import HiddenInput
from django.utils.text import format_lazy
from django.utils.translation import ugettext_lazy as _
from django_countries import countries
from django_countries.fields import LazyTypedChoiceField

from agir.donations.base_forms import SimpleDonationForm, SimpleDonorForm
from agir.donations.form_fields import AskAmountField
from agir.europeennes.apps import EuropeennesConfig
from agir.lib.data import departements_choices
from agir.lib.form_fields import IBANField
from agir.payments.models import Payment
from agir.payments.payment_modes import PaymentModeField, PAYMENT_MODES
from agir.people.models import Person


class LoanForm(SimpleDonationForm):
    button_label = "Je prête !"

    amount = AskAmountField(
        label="Montant du prêt",
        max_value=settings.LOAN_MAXIMUM,
        min_value=settings.LOAN_MINIMUM,
        decimal_places=2,
        required=True,
        error_messages={
            "invalid": _("Indiquez le montant à prêter."),
            "min_value": format_lazy(
                _("Les prêts de moins de 400 € ne sont pas acceptés."),
                min=settings.LOAN_MINIMUM,
            ),
            "max_value": format_lazy(
                _(
                    "Les prêts de plus de {max} € ne peuvent être faits par carte bleue."
                ),
                max=settings.LOAN_MAXIMUM,
            ),
        },
        amount_choices=[10000, 5000, 2000, 1000, 400],
        show_tax_credit=False,
    )


class LenderForm(SimpleDonorForm):
    button_label = "Je prête {amount}"

    country_of_birth = LazyTypedChoiceField(
        required=True,
        label="Pays de naissance",
        choices=[("", "Sélectionnez votre pays de naissance")] + list(countries),
    )
    city_of_birth = forms.CharField(label="Ville de naissance", required=True)
    departement_of_birth = forms.ChoiceField(
        label="Département de naissance (France uniquement)",
        choices=(("", "Indiquez votre département de naissance"),)
        + departements_choices,
        required=False,
    )

    amount = forms.IntegerField(
        max_value=settings.LOAN_MAXIMUM * 100,
        min_value=settings.LOAN_MINIMUM * 100,
        required=True,
        widget=forms.HiddenInput,
    )

    payment_mode = PaymentModeField(
        payment_modes=[
            PAYMENT_MODES["system_pay_afce_pret"],
            PAYMENT_MODES["check_afce"],
        ],
        label="Comment souhaitez-vous prêter l'argent ?",
    )

    iban = IBANField(
        label="Votre IBAN",
        required=True,
        allowed_countries=["FR"],
        help_text="Le numéro IBAN du compte sur lequel le remboursement du prêt sera effectué.",
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields["gender"].required = True
        self.fields["date_of_birth"].required = True
        self.fields["declaration"].label = _(
            "Je certifie sur l'honneur être une personne physique et que le réglement de mon prêt ne provient pas d'une"
            " personne morale mais de mon compte en banque personnel."
        )
        # retirer le help_text qui indique qu'un reçu fiscal sera émis (ce qui n'est pas le cas pour un prêt)
        self.fields["declaration"].help_text = None

        del self.fields["fiscal_resident"]

        if (
            Payment.objects.filter(
                Q(type=EuropeennesConfig.LOAN_PAYMENT_TYPE)
                & (
                    Q(status=Payment.STATUS_COMPLETED)
                    | Q(status=Payment.STATUS_WAITING, mode="check_afce")
                )
            ).aggregate(amount=Coalesce(Sum("price"), 0))["amount"]
            > settings.LOAN_MAXIMUM_TOTAL
        ):
            self.fields["payment_mode"].payment_modes = [
                PAYMENT_MODES["system_pay_afce_pret"]
            ]
            self.fields["payment_mode"].initial = PAYMENT_MODES[
                "system_pay_afce_pret"
            ].id
            self.fields["payment_mode"].widget = HiddenInput()

        fields = ["amount"]
{'fraction_non_alphanumeric': 0.0890740523412745, 'fraction_numerical': 0.007276141297969722, 'mean_word_length': 2.606432501057977, 'pattern_counts': {'":': 6, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5184075', 'n_tokens_mistral': 2627, 'n_tokens_neox': 2488, 'n_words': 591}