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 import forms
 | 
				
			||||||
from django.contrib.auth.forms import AuthenticationForm
 | 
					from django.contrib.auth.forms import AuthenticationForm
 | 
				
			||||||
from django.contrib.auth.models import User
 | 
					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 note_kfet.inputs import Autocomplete, AmountInput, DatePickerInput
 | 
				
			||||||
from permission.models import PermissionMask
 | 
					from permission.models import PermissionMask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -48,6 +51,36 @@ class ClubForm(forms.ModelForm):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class MembershipForm(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:
 | 
					    class Meta:
 | 
				
			||||||
        model = Membership
 | 
					        model = Membership
 | 
				
			||||||
        fields = ('user', 'roles', 'date_start')
 | 
					        fields = ('user', 'roles', 'date_start')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ from django_tables2.views import SingleTableView
 | 
				
			|||||||
from rest_framework.authtoken.models import Token
 | 
					from rest_framework.authtoken.models import Token
 | 
				
			||||||
from note.forms import ImageForm
 | 
					from note.forms import ImageForm
 | 
				
			||||||
from note.models import Alias, NoteUser
 | 
					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 note.tables import HistoryTable, AliasTable
 | 
				
			||||||
from permission.backends import PermissionBackend
 | 
					from permission.backends import PermissionBackend
 | 
				
			||||||
from permission.views import ProtectQuerysetMixin
 | 
					from permission.views import ProtectQuerysetMixin
 | 
				
			||||||
@@ -355,6 +355,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
 | 
				
			|||||||
            .get(pk=self.kwargs["pk"])
 | 
					            .get(pk=self.kwargs["pk"])
 | 
				
			||||||
        context = super().get_context_data(**kwargs)
 | 
					        context = super().get_context_data(**kwargs)
 | 
				
			||||||
        context['club'] = club
 | 
					        context['club'] = club
 | 
				
			||||||
 | 
					        context['form'].fields['credit_amount'].initial = club.membership_fee_paid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -364,11 +365,20 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
 | 
				
			|||||||
        user = form.instance.user
 | 
					        user = form.instance.user
 | 
				
			||||||
        form.instance.club = club
 | 
					        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:
 | 
					        if user.profile.paid:
 | 
				
			||||||
            fee = club.membership_fee_paid
 | 
					            fee = club.membership_fee_paid
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            fee = club.membership_fee_unpaid
 | 
					            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",
 | 
					                club__name="Kfet",
 | 
				
			||||||
                user=user,
 | 
					                user=user,
 | 
				
			||||||
                date_start__lte=datetime.now().date(),
 | 
					                date_start__lte=datetime.now().date(),
 | 
				
			||||||
@@ -405,6 +415,28 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
 | 
				
			|||||||
                           .format(form.instance.club.membership_start))
 | 
					                           .format(form.instance.club.membership_start))
 | 
				
			||||||
            return super().form_invalid(form)
 | 
					            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)
 | 
					        return super().form_valid(form)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_success_url(self):
 | 
					    def get_success_url(self):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,9 @@ $(document).ready(function () {
 | 
				
			|||||||
                $("#" + prefix + "_" + obj.id).click(function() {
 | 
					                $("#" + prefix + "_" + obj.id).click(function() {
 | 
				
			||||||
                    target.val(obj[name_field]);
 | 
					                    target.val(obj[name_field]);
 | 
				
			||||||
                    $("#" + prefix + "_pk").val(obj.id);
 | 
					                    $("#" + prefix + "_pk").val(obj.id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (typeof autocompleted != 'undefined')
 | 
				
			||||||
 | 
					                        autocompleted(obj, prefix)
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (input === obj[name_field])
 | 
					                if (input === obj[name_field])
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,5 +17,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
{% block extrajavascript %}
 | 
					{% block extrajavascript %}
 | 
				
			||||||
<script>
 | 
					<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>
 | 
					</script>
 | 
				
			||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user