mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 09:12:11 +01:00 
			
		
		
		
	Credit note for new memberships
This commit is contained in:
		@@ -4,6 +4,9 @@
 | 
			
		||||
from django import forms
 | 
			
		||||
from django.contrib.auth.forms import AuthenticationForm
 | 
			
		||||
from django.contrib.auth.models import User
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from note.models import NoteSpecial
 | 
			
		||||
from note_kfet.inputs import Autocomplete, AmountInput, DatePickerInput
 | 
			
		||||
from permission.models import PermissionMask
 | 
			
		||||
 | 
			
		||||
@@ -48,6 +51,36 @@ class ClubForm(forms.ModelForm):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MembershipForm(forms.ModelForm):
 | 
			
		||||
    credit_type = forms.ModelChoiceField(
 | 
			
		||||
        queryset=NoteSpecial.objects,
 | 
			
		||||
        label=_("Credit type"),
 | 
			
		||||
        empty_label=_("No credit"),
 | 
			
		||||
        required=False,
 | 
			
		||||
        help_text=_("You can credit the note of the user."),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    credit_amount = forms.IntegerField(
 | 
			
		||||
        label=_("Credit amount"),
 | 
			
		||||
        required=False,
 | 
			
		||||
        initial=0,
 | 
			
		||||
        widget=AmountInput(),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    last_name = forms.CharField(
 | 
			
		||||
        label=_("Last name"),
 | 
			
		||||
        required=False,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    first_name = forms.CharField(
 | 
			
		||||
        label=_("First name"),
 | 
			
		||||
        required=False,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    bank = forms.CharField(
 | 
			
		||||
        label=_("Bank"),
 | 
			
		||||
        required=False,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = Membership
 | 
			
		||||
        fields = ('user', 'roles', 'date_start')
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ from django_tables2.views import SingleTableView
 | 
			
		||||
from rest_framework.authtoken.models import Token
 | 
			
		||||
from note.forms import ImageForm
 | 
			
		||||
from note.models import Alias, NoteUser
 | 
			
		||||
from note.models.transactions import Transaction
 | 
			
		||||
from note.models.transactions import Transaction, SpecialTransaction
 | 
			
		||||
from note.tables import HistoryTable, AliasTable
 | 
			
		||||
from permission.backends import PermissionBackend
 | 
			
		||||
from permission.views import ProtectQuerysetMixin
 | 
			
		||||
@@ -355,6 +355,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
 | 
			
		||||
            .get(pk=self.kwargs["pk"])
 | 
			
		||||
        context = super().get_context_data(**kwargs)
 | 
			
		||||
        context['club'] = club
 | 
			
		||||
        context['form'].fields['credit_amount'].initial = club.membership_fee_paid
 | 
			
		||||
 | 
			
		||||
        return context
 | 
			
		||||
 | 
			
		||||
@@ -364,11 +365,20 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
 | 
			
		||||
        user = form.instance.user
 | 
			
		||||
        form.instance.club = club
 | 
			
		||||
 | 
			
		||||
        credit_type = form.cleaned_data["credit_type"]
 | 
			
		||||
        credit_amount = form.cleaned_data["credit_amount"]
 | 
			
		||||
        last_name = form.cleaned_data["last_name"]
 | 
			
		||||
        first_name = form.cleaned_data["first_name"]
 | 
			
		||||
        bank = form.cleaned_data["bank"]
 | 
			
		||||
 | 
			
		||||
        if credit_type is None:
 | 
			
		||||
            credit_amount = 0
 | 
			
		||||
 | 
			
		||||
        if user.profile.paid:
 | 
			
		||||
            fee = club.membership_fee_paid
 | 
			
		||||
        else:
 | 
			
		||||
            fee = club.membership_fee_unpaid
 | 
			
		||||
        if user.note.balance < fee and not Membership.objects.filter(
 | 
			
		||||
        if user.note.balance + credit_amount < fee and not Membership.objects.filter(
 | 
			
		||||
                club__name="Kfet",
 | 
			
		||||
                user=user,
 | 
			
		||||
                date_start__lte=datetime.now().date(),
 | 
			
		||||
@@ -405,6 +415,28 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
 | 
			
		||||
                           .format(form.instance.club.membership_start))
 | 
			
		||||
            return super().form_invalid(form)
 | 
			
		||||
 | 
			
		||||
        if credit_amount > 0:
 | 
			
		||||
            if not last_name or not first_name or not bank:
 | 
			
		||||
                if not last_name:
 | 
			
		||||
                    form.add_error('last_name', _("This field is required."))
 | 
			
		||||
                if not first_name:
 | 
			
		||||
                    form.add_error('first_name', _("This field is required."))
 | 
			
		||||
                if not bank:
 | 
			
		||||
                    form.add_error('bank', _("This field is required."))
 | 
			
		||||
                return self.form_invalid(form)
 | 
			
		||||
 | 
			
		||||
            SpecialTransaction.objects.create(
 | 
			
		||||
                source=credit_type,
 | 
			
		||||
                destination=user.note,
 | 
			
		||||
                quantity=1,
 | 
			
		||||
                amount=credit_amount,
 | 
			
		||||
                reason="Crédit " + credit_type.special_type + " (Adhésion " + club.name + ")",
 | 
			
		||||
                last_name=last_name,
 | 
			
		||||
                first_name=first_name,
 | 
			
		||||
                bank=bank,
 | 
			
		||||
                valid=True,
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        return super().form_valid(form)
 | 
			
		||||
 | 
			
		||||
    def get_success_url(self):
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,9 @@ $(document).ready(function () {
 | 
			
		||||
                $("#" + prefix + "_" + obj.id).click(function() {
 | 
			
		||||
                    target.val(obj[name_field]);
 | 
			
		||||
                    $("#" + prefix + "_pk").val(obj.id);
 | 
			
		||||
 | 
			
		||||
                    if (typeof autocompleted != 'undefined')
 | 
			
		||||
                        autocompleted(obj, prefix)
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                if (input === obj[name_field])
 | 
			
		||||
 
 | 
			
		||||
@@ -17,5 +17,13 @@
 | 
			
		||||
 | 
			
		||||
{% block extrajavascript %}
 | 
			
		||||
<script>
 | 
			
		||||
    function autocompleted(user) {
 | 
			
		||||
        $("#id_last_name").val(user.last_name);
 | 
			
		||||
        $("#id_first_name").val(user.first_name);
 | 
			
		||||
        $.getJSON("/api/members/profile/" + user.id + "/", function(profile) {
 | 
			
		||||
            let fee = profile.paid ? {{ club.membership_fee_paid }} : {{ club.membership_fee_unpaid }};
 | 
			
		||||
            $("#id_credit_amount").val((fee / 100).toFixed(2));
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
</script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user