1
0
mirror of https://gitlab.crans.org/bde/nk20 synced 2024-11-26 18:37:12 +00:00

Handle credits from the Société générale

This commit is contained in:
Yohann D'ANELLO 2020-04-22 03:26:45 +02:00
parent f83f6da79a
commit b23814aef0
25 changed files with 954 additions and 500 deletions

View File

@ -28,7 +28,7 @@ class ProfileForm(forms.ModelForm):
class Meta: class Meta:
model = Profile model = Profile
fields = '__all__' fields = '__all__'
exclude = ('user', 'email_confirmed', 'registration_valid', 'soge', ) exclude = ('user', 'email_confirmed', 'registration_valid', )
class ClubForm(forms.ModelForm): class ClubForm(forms.ModelForm):

View File

@ -64,11 +64,12 @@ class Profile(models.Model):
default=False, default=False,
) )
soge = models.BooleanField( @property
verbose_name=_("Société générale"), def soge(self):
help_text=_("Has the user ever be paid by the Société générale?"), if "treasury" in settings.INSTALLED_APPS:
default=False, from treasury.models import SogeCredit
) return SogeCredit.objects.filter(user=self.user, credit_transaction=None).exists()
return False
class Meta: class Meta:
verbose_name = _('user profile') verbose_name = _('user profile')
@ -309,7 +310,20 @@ class Membership(models.Model):
reason="Adhésion " + self.club.name, reason="Adhésion " + self.club.name,
) )
transaction._force_save = True transaction._force_save = True
transaction.save(force_insert=True) print(hasattr(self, '_soge'))
if hasattr(self, '_soge') and "treasury" in settings.INSTALLED_APPS:
# If the soge pays, then the transaction is unvalidated in a first time, then submitted for control
# to treasurers.
transaction.valid = False
from treasury.models import SogeCredit
soge_credit = SogeCredit.objects.get_or_create(user=self.user)[0]
soge_credit.refresh_from_db()
transaction.save(force_insert=True)
transaction.refresh_from_db()
soge_credit.transactions.add(transaction)
soge_credit.save()
else:
transaction.save(force_insert=True)
def __str__(self): def __str__(self):
return _("Membership of {user} for the club {club}").format(user=self.user.username, club=self.club.name, ) return _("Membership of {user} for the club {club}").format(user=self.user.username, club=self.club.name, )

View File

@ -18,7 +18,7 @@ from django.views.generic.edit import FormMixin
from django_tables2.views import SingleTableView 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, NoteSpecial from note.models import Alias, NoteUser
from note.models.transactions import Transaction, SpecialTransaction 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
@ -128,7 +128,8 @@ class UserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
user = context['user_object'] user = context['user_object']
history_list = \ history_list = \
Transaction.objects.all().filter(Q(source=user.note) | Q(destination=user.note)).order_by("-id")\ Transaction.objects.all().filter(Q(source=user.note) | Q(destination=user.note))\
.order_by("-created_at", "-id")\
.filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view")) .filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view"))
history_table = HistoryTable(history_list, prefix='transaction-') history_table = HistoryTable(history_list, prefix='transaction-')
history_table.paginate(per_page=20, page=self.request.GET.get("transaction-page", 1)) history_table.paginate(per_page=20, page=self.request.GET.get("transaction-page", 1))
@ -314,7 +315,8 @@ class ClubDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
club.update_membership_dates() club.update_membership_dates()
club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note))\ club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note))\
.filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view")).order_by('-id') .filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view"))\
.order_by('-created_at', '-id')
history_table = HistoryTable(club_transactions, prefix="history-") history_table = HistoryTable(club_transactions, prefix="history-")
history_table.paginate(per_page=20, page=self.request.GET.get('history-page', 1)) history_table.paginate(per_page=20, page=self.request.GET.get('history-page', 1))
context['history_list'] = history_table context['history_list'] = history_table
@ -365,6 +367,15 @@ class ClubUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
form_class = ClubForm form_class = ClubForm
template_name = "member/club_form.html" template_name = "member/club_form.html"
def get_queryset(self, **kwargs):
qs = super().get_queryset(**kwargs)
# Don't update a WEI club through this view
if "wei" in settings.INSTALLED_APPS:
qs = qs.filter(weiclub=None)
return qs
def get_success_url(self): def get_success_url(self):
return reverse_lazy("member:club_detail", kwargs={"pk": self.object.pk}) return reverse_lazy("member:club_detail", kwargs={"pk": self.object.pk})
@ -396,7 +407,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
if "club_pk" in self.kwargs: if "club_pk" in self.kwargs:
# We create a new membership. # We create a new membership.
club = Club.objects.filter(PermissionBackend.filter_queryset(self.request.user, Club, "view"))\ club = Club.objects.filter(PermissionBackend.filter_queryset(self.request.user, Club, "view"))\
.get(pk=self.kwargs["club_pk"]) .get(pk=self.kwargs["club_pk"], weiclub=None)
form.fields['credit_amount'].initial = club.membership_fee_paid form.fields['credit_amount'].initial = club.membership_fee_paid
form.fields['roles'].initial = Role.objects.filter(name="Membre de club").all() form.fields['roles'].initial = Role.objects.filter(name="Membre de club").all()
@ -463,17 +474,11 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
bank = form.cleaned_data["bank"] bank = form.cleaned_data["bank"]
soge = form.cleaned_data["soge"] and not user.profile.soge and club.name == "BDE" soge = form.cleaned_data["soge"] and not user.profile.soge and club.name == "BDE"
# If Société générale pays, then we auto-fill some data # If Société générale pays, then we store that information but the payment must be controlled by treasurers
# later. The membership transaction will be invalidated.
if soge: if soge:
credit_type = NoteSpecial.objects.get(special_type="Virement bancaire") credit_type = None
bde = club form.instance._soge = True
kfet = Club.objects.get(name="Kfet")
if user.profile.paid:
fee = bde.membership_fee_paid + kfet.membership_fee_paid
else:
fee = bde.membership_fee_unpaid + kfet.membership_fee_unpaid
credit_amount = fee
bank = "Société générale"
if credit_type is None: if credit_type is None:
credit_amount = 0 credit_amount = 0
@ -546,11 +551,9 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
ret = super().form_valid(form) ret = super().form_valid(form)
# If Société générale pays, then we store the information: the bank can't pay twice to a same person. # If Société générale pays, then we assume that this is the BDE membership, and we auto-renew the
# Kfet membership.
if soge: if soge:
user.profile.soge = True
user.profile.save()
kfet = Club.objects.get(name="Kfet") kfet = Club.objects.get(name="Kfet")
kfet_fee = kfet.membership_fee_paid if user.profile.paid else kfet.membership_fee_unpaid kfet_fee = kfet.membership_fee_paid if user.profile.paid else kfet.membership_fee_unpaid
@ -562,13 +565,16 @@ class ClubAddMemberView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
date_end__gte=datetime.today(), date_end__gte=datetime.today(),
) )
membership = Membership.objects.create( membership = Membership(
club=kfet, club=kfet,
user=user, user=user,
fee=kfet_fee, fee=kfet_fee,
date_start=old_membership.get().date_end + timedelta(days=1) date_start=old_membership.get().date_end + timedelta(days=1)
if old_membership.exists() else form.instance.date_start, if old_membership.exists() else form.instance.date_start,
) )
membership._soge = True
membership.save()
membership.refresh_from_db()
if old_membership.exists(): if old_membership.exists():
membership.roles.set(old_membership.get().roles.all()) membership.roles.set(old_membership.get().roles.all())
else: else:

View File

@ -8,6 +8,7 @@ from django.utils.translation import gettext_lazy as _
from polymorphic.models import PolymorphicModel from polymorphic.models import PolymorphicModel
from .notes import Note, NoteClub, NoteSpecial from .notes import Note, NoteClub, NoteSpecial
from ..templatetags.pretty_money import pretty_money
""" """
Defines transactions Defines transactions
@ -198,6 +199,14 @@ class Transaction(PolymorphicModel):
self.source.save() self.source.save()
self.destination.save() self.destination.save()
def delete(self, **kwargs):
"""
Whenever we want to delete a transaction (caution with this), we ensure the transaction is invalid first.
"""
self.valid = False
self.save(**kwargs)
super().delete(**kwargs)
@property @property
def total(self): def total(self):
return self.amount * self.quantity return self.amount * self.quantity
@ -206,6 +215,10 @@ class Transaction(PolymorphicModel):
def type(self): def type(self):
return _('Transfer') return _('Transfer')
def __str__(self):
return self.__class__.__name__ + " from " + str(self.source) + " to " + str(self.destination) + " of "\
+ pretty_money(self.quantity * self.amount) + ("" if self.valid else " invalid")
class RecurrentTransaction(Transaction): class RecurrentTransaction(Transaction):
""" """

View File

@ -10,7 +10,7 @@ def save_user_note(instance, raw, **_kwargs):
# When provisionning data, do not try to autocreate # When provisionning data, do not try to autocreate
return return
if (instance.is_superuser or instance.profile.registration_valid) and instance.is_active: if instance.is_superuser or instance.profile.registration_valid:
# Create note only when the registration is validated # Create note only when the registration is validated
from note.models import NoteUser from note.models import NoteUser
NoteUser.objects.get_or_create(user=instance) NoteUser.objects.get_or_create(user=instance)

View File

@ -30,7 +30,7 @@ class TransactionCreateView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTabl
table_class = HistoryTable table_class = HistoryTable
def get_queryset(self, **kwargs): def get_queryset(self, **kwargs):
return super().get_queryset(**kwargs).order_by("-id").all()[:20] return super().get_queryset(**kwargs).order_by("-created_at", "-id").all()[:20]
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
""" """
@ -93,7 +93,7 @@ class ConsoView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
table_class = HistoryTable table_class = HistoryTable
def get_queryset(self, **kwargs): def get_queryset(self, **kwargs):
return super().get_queryset(**kwargs).order_by("-id").all()[:20] return super().get_queryset(**kwargs).order_by("-created_at", "-id").all()[:20]
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
""" """

View File

@ -16,13 +16,12 @@ from django.views.generic.edit import FormMixin
from django_tables2 import SingleTableView from django_tables2 import SingleTableView
from member.forms import ProfileForm from member.forms import ProfileForm
from member.models import Membership, Club, Role from member.models import Membership, Club, Role
from note.models import SpecialTransaction, NoteSpecial from note.models import SpecialTransaction
from note.templatetags.pretty_money import pretty_money from note.templatetags.pretty_money import pretty_money
from permission.backends import PermissionBackend from permission.backends import PermissionBackend
from permission.views import ProtectQuerysetMixin from permission.views import ProtectQuerysetMixin
from wei.models import WEIClub
from .forms import SignUpForm, ValidationForm, WEISignupForm from .forms import SignUpForm, ValidationForm
from .tables import FutureUserTable from .tables import FutureUserTable
from .tokens import email_validation_token from .tokens import email_validation_token
@ -40,16 +39,6 @@ class UserCreateView(CreateView):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context["profile_form"] = self.second_form() context["profile_form"] = self.second_form()
if "wei" in settings.INSTALLED_APPS:
from wei.forms import WEIRegistrationForm
wei_form = WEIRegistrationForm()
del wei_form.fields["user"]
del wei_form.fields["caution_check"]
del wei_form.fields["first_year"]
del wei_form.fields["information_json"]
context["wei_form"] = wei_form
context["wei_registration_form"] = WEISignupForm()
return context return context
def form_valid(self, form): def form_valid(self, form):
@ -62,23 +51,6 @@ class UserCreateView(CreateView):
if not profile_form.is_valid(): if not profile_form.is_valid():
return self.form_invalid(form) return self.form_invalid(form)
wei_form = None
self.wei = False
if "wei" in settings.INSTALLED_APPS:
wei_signup_form = WEISignupForm(self.request.POST)
if wei_signup_form.is_valid() and wei_signup_form.cleaned_data["wei_registration"]:
from wei.forms import WEIRegistrationForm
wei_form = WEIRegistrationForm(self.request.POST)
del wei_form.fields["user"]
del wei_form.fields["caution_check"]
del wei_form.fields["first_year"]
if not wei_form.is_valid():
return self.form_invalid(wei_form)
self.wei = True
# Save the user and the profile # Save the user and the profile
user = form.save(commit=False) user = form.save(commit=False)
user.is_active = False user.is_active = False
@ -92,21 +64,10 @@ class UserCreateView(CreateView):
user.profile.send_email_validation_link() user.profile.send_email_validation_link()
if self.wei:
wei_registration = wei_form.instance
wei_registration.user = user
wei_registration.wei = WEIClub.objects.order_by('date_start').last()
wei_registration.caution_check = False
wei_registration.first_year = True
wei_registration.save()
return super().form_valid(form) return super().form_valid(form)
def get_success_url(self): def get_success_url(self):
if self.wei: return reverse_lazy('registration:email_validation_sent')
return reverse_lazy('registration:email_validation_sent') # TODO Load WEI survey
else:
return reverse_lazy('registration:email_validation_sent')
class UserValidateView(TemplateView): class UserValidateView(TemplateView):
@ -304,17 +265,17 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin,
fee += kfet_fee fee += kfet_fee
if soge: if soge:
# Fill payment information if Société Générale pays the inscription # If the bank pays, then we don't credit now. Treasurers will validate the transaction
credit_type = NoteSpecial.objects.get(special_type="Virement bancaire") # and credit the note later.
credit_amount = fee credit_type = None
bank = "Société générale"
print("OK") if credit_type is None:
credit_amount = 0
if join_Kfet and not join_BDE: if join_Kfet and not join_BDE:
form.add_error('join_Kfet', _("You must join BDE club before joining Kfet club.")) form.add_error('join_Kfet', _("You must join BDE club before joining Kfet club."))
if fee > credit_amount: if fee > credit_amount and not soge:
# Check if the user credits enough money # Check if the user credits enough money
form.add_error('credit_type', form.add_error('credit_type',
_("The entered amount is not enough for the memberships, should be at least {}") _("The entered amount is not enough for the memberships, should be at least {}")
@ -336,10 +297,9 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin,
ret = super().form_valid(form) ret = super().form_valid(form)
user.is_active = user.profile.email_confirmed or user.is_superuser user.is_active = user.profile.email_confirmed or user.is_superuser
user.profile.registration_valid = True user.profile.registration_valid = True
# Store if Société générale paid for next years
user.profile.soge = soge
user.save() user.save()
user.profile.save() user.profile.save()
user.refresh_from_db()
if credit_type is not None and credit_amount > 0: if credit_type is not None and credit_amount > 0:
# Credit the note # Credit the note
@ -357,21 +317,29 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin,
if join_BDE: if join_BDE:
# Create membership for the user to the BDE starting today # Create membership for the user to the BDE starting today
membership = Membership.objects.create( membership = Membership(
club=bde, club=bde,
user=user, user=user,
fee=bde_fee, fee=bde_fee,
) )
if soge:
membership._soge = True
membership.save()
membership.refresh_from_db()
membership.roles.add(Role.objects.get(name="Adhérent BDE")) membership.roles.add(Role.objects.get(name="Adhérent BDE"))
membership.save() membership.save()
if join_Kfet: if join_Kfet:
# Create membership for the user to the Kfet starting today # Create membership for the user to the Kfet starting today
membership = Membership.objects.create( membership = Membership(
club=kfet, club=kfet,
user=user, user=user,
fee=kfet_fee, fee=kfet_fee,
) )
if soge:
membership._soge = True
membership.save()
membership.refresh_from_db()
membership.roles.add(Role.objects.get(name="Adhérent Kfet")) membership.roles.add(Role.objects.get(name="Adhérent Kfet"))
membership.save() membership.save()

View File

@ -3,7 +3,7 @@
from django.contrib import admin from django.contrib import admin
from .models import RemittanceType, Remittance from .models import RemittanceType, Remittance, SogeCredit
@admin.register(RemittanceType) @admin.register(RemittanceType)
@ -25,3 +25,6 @@ class RemittanceAdmin(admin.ModelAdmin):
if not obj: if not obj:
return True return True
return not obj.closed and super().has_change_permission(request, obj) return not obj.closed and super().has_change_permission(request, obj)
admin.site.register(SogeCredit)

View File

@ -4,7 +4,7 @@
from rest_framework import serializers from rest_framework import serializers
from note.api.serializers import SpecialTransactionSerializer from note.api.serializers import SpecialTransactionSerializer
from ..models import Invoice, Product, RemittanceType, Remittance from ..models import Invoice, Product, RemittanceType, Remittance, SogeCredit
class ProductSerializer(serializers.ModelSerializer): class ProductSerializer(serializers.ModelSerializer):
@ -60,3 +60,14 @@ class RemittanceSerializer(serializers.ModelSerializer):
def get_transactions(self, obj): def get_transactions(self, obj):
return serializers.ListSerializer(child=SpecialTransactionSerializer()).to_representation(obj.transactions) return serializers.ListSerializer(child=SpecialTransactionSerializer()).to_representation(obj.transactions)
class SogeCreditSerializer(serializers.ModelSerializer):
"""
REST API Serializer for SogeCredit types.
The djangorestframework plugin will analyse the model `SogeCredit` and parse all fields in the API.
"""
class Meta:
model = SogeCredit
fields = '__all__'

View File

@ -1,7 +1,7 @@
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from .views import InvoiceViewSet, ProductViewSet, RemittanceViewSet, RemittanceTypeViewSet from .views import InvoiceViewSet, ProductViewSet, RemittanceViewSet, RemittanceTypeViewSet, SogeCreditViewSet
def register_treasury_urls(router, path): def register_treasury_urls(router, path):
@ -12,3 +12,4 @@ def register_treasury_urls(router, path):
router.register(path + '/product', ProductViewSet) router.register(path + '/product', ProductViewSet)
router.register(path + '/remittance_type', RemittanceTypeViewSet) router.register(path + '/remittance_type', RemittanceTypeViewSet)
router.register(path + '/remittance', RemittanceViewSet) router.register(path + '/remittance', RemittanceViewSet)
router.register(path + '/soge_credit', SogeCreditViewSet)

View File

@ -5,8 +5,9 @@ from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter from rest_framework.filters import SearchFilter
from api.viewsets import ReadProtectedModelViewSet from api.viewsets import ReadProtectedModelViewSet
from .serializers import InvoiceSerializer, ProductSerializer, RemittanceTypeSerializer, RemittanceSerializer from .serializers import InvoiceSerializer, ProductSerializer, RemittanceTypeSerializer, RemittanceSerializer,\
from ..models import Invoice, Product, RemittanceType, Remittance SogeCreditSerializer
from ..models import Invoice, Product, RemittanceType, Remittance, SogeCredit
class InvoiceViewSet(ReadProtectedModelViewSet): class InvoiceViewSet(ReadProtectedModelViewSet):
@ -39,7 +40,7 @@ class RemittanceTypeViewSet(ReadProtectedModelViewSet):
The djangorestframework plugin will get all `RemittanceType` objects, serialize it to JSON with the given serializer The djangorestframework plugin will get all `RemittanceType` objects, serialize it to JSON with the given serializer
then render it on /api/treasury/remittance_type/ then render it on /api/treasury/remittance_type/
""" """
queryset = RemittanceType.objects.all() queryset = RemittanceType.objects
serializer_class = RemittanceTypeSerializer serializer_class = RemittanceTypeSerializer
@ -49,5 +50,15 @@ class RemittanceViewSet(ReadProtectedModelViewSet):
The djangorestframework plugin will get all `Remittance` objects, serialize it to JSON with the given serializer, The djangorestframework plugin will get all `Remittance` objects, serialize it to JSON with the given serializer,
then render it on /api/treasury/remittance/ then render it on /api/treasury/remittance/
""" """
queryset = Remittance.objects.all() queryset = Remittance.objects
serializer_class = RemittanceSerializer serializer_class = RemittanceSerializer
class SogeCreditViewSet(ReadProtectedModelViewSet):
"""
REST API View set.
The djangorestframework plugin will get all `SogeCredit` objects, serialize it to JSON with the given serializer,
then render it on /api/treasury/soge_credit/
"""
queryset = SogeCredit.objects
serializer_class = SogeCreditSerializer

View File

@ -1,11 +1,13 @@
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from datetime import datetime
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from note.models import NoteSpecial, SpecialTransaction from note.models import NoteSpecial, SpecialTransaction, MembershipTransaction
class Invoice(models.Model): class Invoice(models.Model):
@ -207,3 +209,90 @@ class SpecialTransactionProxy(models.Model):
class Meta: class Meta:
verbose_name = _("special transaction proxy") verbose_name = _("special transaction proxy")
verbose_name_plural = _("special transaction proxies") verbose_name_plural = _("special transaction proxies")
class SogeCredit(models.Model):
"""
Manage the credits from the Société générale.
"""
user = models.OneToOneField(
User,
on_delete=models.PROTECT,
verbose_name=_("user"),
)
transactions = models.ManyToManyField(
MembershipTransaction,
related_name="+",
verbose_name=_("membership transactions"),
)
credit_transaction = models.OneToOneField(
SpecialTransaction,
on_delete=models.SET_NULL,
verbose_name=_("credit transaction"),
null=True,
)
@property
def valid(self):
return self.credit_transaction is not None
@property
def amount(self):
return sum(transaction.quantity * transaction.amount for transaction in self.transactions.all())
def invalidate(self):
"""
Invalidating a Société générale delete the transaction of the bank if it was already created.
Treasurers must know what they do, With Great Power Comes Great Responsibility...
"""
if self.valid:
self.credit_transaction.valid = False
self.credit_transaction.save()
self.credit_transaction.delete()
self.credit_transaction = None
for transaction in self.transactions.all():
transaction.valid = False
transaction.save()
def validate(self, force=False):
if self.valid and not force:
# The credit is already done
return
# First invalidate all transaction and delete the credit if already did (and force mode)
self.invalidate()
self.credit_transaction = SpecialTransaction.objects.create(
source=NoteSpecial.objects.get(special_type="Virement bancaire"),
destination=self.user.note,
quantity=1,
amount=self.amount,
reason="Crédit société générale",
last_name=self.user.last_name,
first_name=self.user.first_name,
bank="Société générale",
)
self.save()
for transaction in self.transactions.all():
transaction.valid = True
transaction.created_at = datetime.now()
transaction.save()
def delete(self, **kwargs):
"""
Deleting a SogeCredit is equivalent to say that the Société générale didn't pay.
Treasurers must know what they do, this is difficult to undo this operation.
With Great Power Comes Great Responsibility...
"""
self.invalidate()
for transaction in self.transactions.all():
transaction.valid = True
transaction.created_at = datetime.now()
transaction.save()
super().delete(**kwargs)
class Meta:
verbose_name = _("Credit from the Société générale")
verbose_name_plural = _("Credits from the Société générale")

View File

@ -7,7 +7,7 @@ from django_tables2 import A
from note.models import SpecialTransaction from note.models import SpecialTransaction
from note.templatetags.pretty_money import pretty_money from note.templatetags.pretty_money import pretty_money
from .models import Invoice, Remittance from .models import Invoice, Remittance, SogeCredit
class InvoiceTable(tables.Table): class InvoiceTable(tables.Table):
@ -101,3 +101,28 @@ class SpecialTransactionTable(tables.Table):
model = SpecialTransaction model = SpecialTransaction
template_name = 'django_tables2/bootstrap4.html' template_name = 'django_tables2/bootstrap4.html'
fields = ('id', 'source', 'destination', 'last_name', 'first_name', 'bank', 'amount', 'reason',) fields = ('id', 'source', 'destination', 'last_name', 'first_name', 'bank', 'amount', 'reason',)
class SogeCreditTable(tables.Table):
user = tables.LinkColumn(
'treasury:manage_soge_credit',
args=[A('pk')],
)
amount = tables.Column(
verbose_name=_("Amount"),
)
valid = tables.Column(
verbose_name=_("Valid"),
)
def render_amount(self, value):
return pretty_money(value)
def render_valid(self, value):
return _("Yes") if value else _("No")
class Meta:
model = SogeCredit
fields = ('user', 'amount', 'valid', )

View File

@ -4,7 +4,8 @@
from django.urls import path from django.urls import path
from .views import InvoiceCreateView, InvoiceListView, InvoiceUpdateView, InvoiceRenderView, RemittanceListView,\ from .views import InvoiceCreateView, InvoiceListView, InvoiceUpdateView, InvoiceRenderView, RemittanceListView,\
RemittanceCreateView, RemittanceUpdateView, LinkTransactionToRemittanceView, UnlinkTransactionToRemittanceView RemittanceCreateView, RemittanceUpdateView, LinkTransactionToRemittanceView, UnlinkTransactionToRemittanceView,\
SogeCreditListView, SogeCreditManageView
app_name = 'treasury' app_name = 'treasury'
urlpatterns = [ urlpatterns = [
@ -21,4 +22,7 @@ urlpatterns = [
path('remittance/link_transaction/<int:pk>/', LinkTransactionToRemittanceView.as_view(), name='link_transaction'), path('remittance/link_transaction/<int:pk>/', LinkTransactionToRemittanceView.as_view(), name='link_transaction'),
path('remittance/unlink_transaction/<int:pk>/', UnlinkTransactionToRemittanceView.as_view(), path('remittance/unlink_transaction/<int:pk>/', UnlinkTransactionToRemittanceView.as_view(),
name='unlink_transaction'), name='unlink_transaction'),
path('soge-credits/list/', SogeCreditListView.as_view(), name='soge_credits'),
path('soge-credits/manage/<int:pk>/', SogeCreditManageView.as_view(), name='manage_soge_credit'),
] ]

View File

@ -10,21 +10,23 @@ from crispy_forms.helper import FormHelper
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db.models import Q from django.db.models import Q
from django.forms import Form
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.views.generic import CreateView, UpdateView from django.views.generic import CreateView, UpdateView, DetailView
from django.views.generic.base import View, TemplateView from django.views.generic.base import View, TemplateView
from django.views.generic.edit import BaseFormView
from django_tables2 import SingleTableView from django_tables2 import SingleTableView
from note.models import SpecialTransaction, NoteSpecial from note.models import SpecialTransaction, NoteSpecial, Alias
from note_kfet.settings.base import BASE_DIR from note_kfet.settings.base import BASE_DIR
from permission.backends import PermissionBackend from permission.backends import PermissionBackend
from permission.views import ProtectQuerysetMixin from permission.views import ProtectQuerysetMixin
from .forms import InvoiceForm, ProductFormSet, ProductFormSetHelper, RemittanceForm, LinkTransactionToRemittanceForm from .forms import InvoiceForm, ProductFormSet, ProductFormSetHelper, RemittanceForm, LinkTransactionToRemittanceForm
from .models import Invoice, Product, Remittance, SpecialTransactionProxy from .models import Invoice, Product, Remittance, SpecialTransactionProxy, SogeCredit
from .tables import InvoiceTable, RemittanceTable, SpecialTransactionTable from .tables import InvoiceTable, RemittanceTable, SpecialTransactionTable, SogeCreditTable
class InvoiceCreateView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView): class InvoiceCreateView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
@ -307,3 +309,61 @@ class UnlinkTransactionToRemittanceView(LoginRequiredMixin, View):
transaction.save() transaction.save()
return redirect('treasury:remittance_list') return redirect('treasury:remittance_list')
class SogeCreditListView(LoginRequiredMixin, ProtectQuerysetMixin, SingleTableView):
"""
List all Société Générale credits
"""
model = SogeCredit
table_class = SogeCreditTable
def get_queryset(self, **kwargs):
"""
Filter the table with the given parameter.
:param kwargs:
:return:
"""
qs = super().get_queryset()
if "search" in self.request.GET:
pattern = self.request.GET["search"]
if not pattern:
return qs.none()
qs = qs.filter(
Q(user__first_name__iregex=pattern)
| Q(user__last_name__iregex=pattern)
| Q(user__note__alias__name__iregex="^" + pattern)
| Q(user__note__alias__normalized_name__iregex="^" + Alias.normalize(pattern))
)
else:
qs = qs.none()
if "valid" in self.request.GET:
q = Q(credit_transaction=None)
if not self.request.GET["valid"]:
q = ~q
qs = qs.filter(q)
return qs[:20]
class SogeCreditManageView(LoginRequiredMixin, ProtectQuerysetMixin, BaseFormView, DetailView):
"""
Manage credits from the Société générale.
"""
model = SogeCredit
form_class = Form
def form_valid(self, form):
if "validate" in form.data:
self.get_object().validate(True)
elif "delete" in form.data:
self.get_object().delete()
return super().form_valid(form)
def get_success_url(self):
if "validate" in self.request.POST:
return reverse_lazy('treasury:manage_soge_credit', args=(self.get_object().pk,))
return reverse_lazy('treasury:soge_credits')

View File

@ -3,6 +3,7 @@
import json import json
from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -312,3 +313,14 @@ class WEIMembership(Membership):
) )
transaction._force_save = True transaction._force_save = True
transaction.save(force_insert=True) transaction.save(force_insert=True)
if self.registration.soge_credit and "treasury" in settings.INSTALLED_APPS:
# If the soge pays, then the transaction is unvalidated in a first time, then submitted for control
# to treasurers.
transaction.refresh_from_db()
from treasury.models import SogeCredit
soge_credit = SogeCredit.objects.get_or_create(user=self.user)[0]
soge_credit.refresh_from_db()
transaction.save()
soge_credit.transactions.add(transaction)
soge_credit.save()

View File

@ -73,7 +73,8 @@ class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
club = context["club"] club = context["club"]
club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note)) \ club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note)) \
.filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view")).order_by('-id') .filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view"))\
.order_by('-created_at', '-id')
history_table = HistoryTable(club_transactions, prefix="history-") history_table = HistoryTable(club_transactions, prefix="history-")
history_table.paginate(per_page=20, page=self.request.GET.get('history-page', 1)) history_table.paginate(per_page=20, page=self.request.GET.get('history-page', 1))
context['history_list'] = history_table context['history_list'] = history_table
@ -742,9 +743,10 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Crea
return reverse_lazy("wei:wei_detail", kwargs={"pk": self.object.club.pk}) return reverse_lazy("wei:wei_detail", kwargs={"pk": self.object.club.pk})
class WEISurveyView(BaseFormView, DetailView): class WEISurveyView(LoginRequiredMixin, BaseFormView, DetailView):
""" """
Display the survey for the WEI for first Display the survey for the WEI for first year members.
Warning: this page is accessible for anyone that is connected, the view doesn't extend ProtectQuerySetMixin.
""" """
model = WEIRegistration model = WEIRegistration
template_name = "wei/survey.html" template_name = "wei/survey.html"
@ -800,7 +802,7 @@ class WEISurveyView(BaseFormView, DetailView):
return reverse_lazy('wei:wei_survey', args=(self.get_object().pk,)) return reverse_lazy('wei:wei_survey', args=(self.get_object().pk,))
class WEISurveyEndView(TemplateView): class WEISurveyEndView(LoginRequiredMixin, TemplateView):
template_name = "wei/survey_end.html" template_name = "wei/survey_end.html"
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@ -810,7 +812,7 @@ class WEISurveyEndView(TemplateView):
return context return context
class WEIClosedView(TemplateView): class WEIClosedView(LoginRequiredMixin, TemplateView):
template_name = "wei/survey_closed.html" template_name = "wei/survey_closed.html"
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-21 17:47+0200\n" "POT-Creation-Date: 2020-04-22 03:07+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -44,10 +44,10 @@ msgid "You can't invite more than 3 people to this activity."
msgstr "" msgstr ""
#: apps/activity/models.py:23 apps/activity/models.py:48 #: apps/activity/models.py:23 apps/activity/models.py:48
#: apps/member/models.py:99 apps/member/models.py:203 #: apps/member/models.py:100 apps/member/models.py:204
#: apps/note/models/notes.py:188 apps/note/models/transactions.py:24 #: apps/note/models/notes.py:188 apps/note/models/transactions.py:25
#: apps/note/models/transactions.py:44 apps/note/models/transactions.py:237 #: apps/note/models/transactions.py:45 apps/note/models/transactions.py:250
#: apps/wei/models.py:61 templates/member/club_info.html:13 #: apps/wei/models.py:62 templates/member/club_info.html:13
#: templates/member/profile_info.html:14 #: templates/member/profile_info.html:14
#: templates/registration/future_profile_detail.html:16 #: templates/registration/future_profile_detail.html:16
#: templates/wei/weiclub_info.html:13 templates/wei/weimembership_form.html:18 #: templates/wei/weiclub_info.html:13 templates/wei/weimembership_form.html:18
@ -70,20 +70,21 @@ msgstr ""
msgid "activity types" msgid "activity types"
msgstr "" msgstr ""
#: apps/activity/models.py:53 apps/note/models/transactions.py:74 #: apps/activity/models.py:53 apps/note/models/transactions.py:75
#: apps/permission/models.py:103 apps/wei/models.py:67 apps/wei/models.py:123 #: apps/permission/models.py:103 apps/wei/models.py:68 apps/wei/models.py:124
#: templates/activity/activity_detail.html:16 #: templates/activity/activity_detail.html:16
msgid "description" msgid "description"
msgstr "" msgstr ""
#: apps/activity/models.py:60 apps/note/models/notes.py:164 #: apps/activity/models.py:60 apps/note/models/notes.py:164
#: apps/note/models/transactions.py:64 #: apps/note/models/transactions.py:65
#: templates/activity/activity_detail.html:19 #: templates/activity/activity_detail.html:19
msgid "type" msgid "type"
msgstr "" msgstr ""
#: apps/activity/models.py:66 apps/logs/models.py:21 apps/member/models.py:224 #: apps/activity/models.py:66 apps/logs/models.py:21 apps/member/models.py:225
#: apps/note/models/notes.py:117 apps/wei/models.py:154 #: apps/note/models/notes.py:117 apps/treasury/models.py:220
#: apps/wei/models.py:155 templates/treasury/sogecredit_detail.html:13
#: templates/wei/survey.html:16 #: templates/wei/survey.html:16
msgid "user" msgid "user"
msgstr "" msgstr ""
@ -104,7 +105,7 @@ msgstr ""
msgid "end date" msgid "end date"
msgstr "" msgstr ""
#: apps/activity/models.py:93 apps/note/models/transactions.py:139 #: apps/activity/models.py:93 apps/note/models/transactions.py:140
#: templates/activity/activity_detail.html:47 #: templates/activity/activity_detail.html:47
msgid "valid" msgid "valid"
msgstr "" msgstr ""
@ -180,7 +181,7 @@ msgstr ""
msgid "remove" msgid "remove"
msgstr "" msgstr ""
#: apps/activity/tables.py:75 apps/treasury/models.py:138 #: apps/activity/tables.py:75 apps/treasury/models.py:139
msgid "Type" msgid "Type"
msgstr "" msgstr ""
@ -346,117 +347,109 @@ msgstr ""
msgid "registration valid" msgid "registration valid"
msgstr "" msgstr ""
#: apps/member/models.py:68 #: apps/member/models.py:75 apps/member/models.py:76
msgid "Société générale"
msgstr ""
#: apps/member/models.py:69
msgid "Has the user ever be paid by the Société générale?"
msgstr ""
#: apps/member/models.py:74 apps/member/models.py:75
msgid "user profile" msgid "user profile"
msgstr "" msgstr ""
#: apps/member/models.py:104 templates/member/club_info.html:51 #: apps/member/models.py:105 templates/member/club_info.html:51
#: templates/registration/future_profile_detail.html:22 #: templates/registration/future_profile_detail.html:22
#: templates/wei/weiclub_info.html:52 templates/wei/weimembership_form.html:24 #: templates/wei/weiclub_info.html:52 templates/wei/weimembership_form.html:24
msgid "email" msgid "email"
msgstr "" msgstr ""
#: apps/member/models.py:111 #: apps/member/models.py:112
msgid "parent club" msgid "parent club"
msgstr "" msgstr ""
#: apps/member/models.py:120 #: apps/member/models.py:121
msgid "require memberships" msgid "require memberships"
msgstr "" msgstr ""
#: apps/member/models.py:121 #: apps/member/models.py:122
msgid "Uncheck if this club don't require memberships." msgid "Uncheck if this club don't require memberships."
msgstr "" msgstr ""
#: apps/member/models.py:126 templates/member/club_info.html:35 #: apps/member/models.py:127 templates/member/club_info.html:35
msgid "membership fee (paid students)" msgid "membership fee (paid students)"
msgstr "" msgstr ""
#: apps/member/models.py:131 templates/member/club_info.html:38 #: apps/member/models.py:132 templates/member/club_info.html:38
msgid "membership fee (unpaid students)" msgid "membership fee (unpaid students)"
msgstr "" msgstr ""
#: apps/member/models.py:137 templates/member/club_info.html:28 #: apps/member/models.py:138 templates/member/club_info.html:28
msgid "membership duration" msgid "membership duration"
msgstr "" msgstr ""
#: apps/member/models.py:138 #: apps/member/models.py:139
msgid "The longest time (in days) a membership can last (NULL = infinite)." msgid "The longest time (in days) a membership can last (NULL = infinite)."
msgstr "" msgstr ""
#: apps/member/models.py:145 templates/member/club_info.html:22 #: apps/member/models.py:146 templates/member/club_info.html:22
msgid "membership start" msgid "membership start"
msgstr "" msgstr ""
#: apps/member/models.py:146 #: apps/member/models.py:147
msgid "How long after January 1st the members can renew their membership." msgid "How long after January 1st the members can renew their membership."
msgstr "" msgstr ""
#: apps/member/models.py:153 templates/member/club_info.html:25 #: apps/member/models.py:154 templates/member/club_info.html:25
msgid "membership end" msgid "membership end"
msgstr "" msgstr ""
#: apps/member/models.py:154 #: apps/member/models.py:155
msgid "" msgid ""
"How long the membership can last after January 1st of the next year after " "How long the membership can last after January 1st of the next year after "
"members can renew their membership." "members can renew their membership."
msgstr "" msgstr ""
#: apps/member/models.py:188 apps/member/models.py:230 #: apps/member/models.py:189 apps/member/models.py:231
#: apps/note/models/notes.py:139 #: apps/note/models/notes.py:139
msgid "club" msgid "club"
msgstr "" msgstr ""
#: apps/member/models.py:189 #: apps/member/models.py:190
msgid "clubs" msgid "clubs"
msgstr "" msgstr ""
#: apps/member/models.py:209 apps/permission/models.py:294 #: apps/member/models.py:210 apps/permission/models.py:294
msgid "role" msgid "role"
msgstr "" msgstr ""
#: apps/member/models.py:210 apps/member/models.py:235 #: apps/member/models.py:211 apps/member/models.py:236
msgid "roles" msgid "roles"
msgstr "" msgstr ""
#: apps/member/models.py:240 #: apps/member/models.py:241
msgid "membership starts on" msgid "membership starts on"
msgstr "" msgstr ""
#: apps/member/models.py:244 #: apps/member/models.py:245
msgid "membership ends on" msgid "membership ends on"
msgstr "" msgstr ""
#: apps/member/models.py:249 #: apps/member/models.py:250
msgid "fee" msgid "fee"
msgstr "" msgstr ""
#: apps/member/models.py:267 apps/member/views.py:500 apps/wei/views.py:726 #: apps/member/models.py:268 apps/member/views.py:494 apps/wei/views.py:726
msgid "User is not a member of the parent club" msgid "User is not a member of the parent club"
msgstr "" msgstr ""
#: apps/member/models.py:277 apps/member/views.py:509 #: apps/member/models.py:278 apps/member/views.py:503
msgid "User is already a member of the club" msgid "User is already a member of the club"
msgstr "" msgstr ""
#: apps/member/models.py:315 #: apps/member/models.py:329
#, python-brace-format #, python-brace-format
msgid "Membership of {user} for the club {club}" msgid "Membership of {user} for the club {club}"
msgstr "" msgstr ""
#: apps/member/models.py:318 #: apps/member/models.py:332
msgid "membership" msgid "membership"
msgstr "" msgstr ""
#: apps/member/models.py:319 #: apps/member/models.py:333
msgid "memberships" msgid "memberships"
msgstr "" msgstr ""
@ -482,32 +475,32 @@ msgstr ""
msgid "Search user" msgid "Search user"
msgstr "" msgstr ""
#: apps/member/views.py:495 apps/wei/views.py:717 #: apps/member/views.py:489 apps/wei/views.py:717
msgid "" msgid ""
"This user don't have enough money to join this club, and can't have a " "This user don't have enough money to join this club, and can't have a "
"negative balance." "negative balance."
msgstr "" msgstr ""
#: apps/member/views.py:513 #: apps/member/views.py:507
msgid "The membership must start after {:%m-%d-%Y}." msgid "The membership must start after {:%m-%d-%Y}."
msgstr "" msgstr ""
#: apps/member/views.py:518 #: apps/member/views.py:512
msgid "The membership must begin before {:%m-%d-%Y}." msgid "The membership must begin before {:%m-%d-%Y}."
msgstr "" msgstr ""
#: apps/member/views.py:528 apps/member/views.py:530 apps/member/views.py:532 #: apps/member/views.py:522 apps/member/views.py:524 apps/member/views.py:526
#: apps/registration/views.py:327 apps/registration/views.py:329 #: apps/registration/views.py:288 apps/registration/views.py:290
#: apps/registration/views.py:331 #: apps/registration/views.py:292
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: apps/note/admin.py:120 apps/note/models/transactions.py:99 #: apps/note/admin.py:120 apps/note/models/transactions.py:100
msgid "source" msgid "source"
msgstr "" msgstr ""
#: apps/note/admin.py:128 apps/note/admin.py:170 #: apps/note/admin.py:128 apps/note/admin.py:170
#: apps/note/models/transactions.py:54 apps/note/models/transactions.py:112 #: apps/note/models/transactions.py:55 apps/note/models/transactions.py:113
msgid "destination" msgid "destination"
msgstr "" msgstr ""
@ -549,7 +542,7 @@ msgstr ""
msgid "display image" msgid "display image"
msgstr "" msgstr ""
#: apps/note/models/notes.py:53 apps/note/models/transactions.py:122 #: apps/note/models/notes.py:53 apps/note/models/transactions.py:123
msgid "created at" msgid "created at"
msgstr "" msgstr ""
@ -620,97 +613,98 @@ msgstr ""
msgid "You can't delete your main alias." msgid "You can't delete your main alias."
msgstr "" msgstr ""
#: apps/note/models/transactions.py:30 #: apps/note/models/transactions.py:31
msgid "transaction category" msgid "transaction category"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:31 #: apps/note/models/transactions.py:32
msgid "transaction categories" msgid "transaction categories"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:47 #: apps/note/models/transactions.py:48
msgid "A template with this name already exist" msgid "A template with this name already exist"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:58 apps/note/models/transactions.py:130 #: apps/note/models/transactions.py:59 apps/note/models/transactions.py:131
msgid "amount" msgid "amount"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:59 #: apps/note/models/transactions.py:60
msgid "in centimes" msgid "in centimes"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:70 #: apps/note/models/transactions.py:71
msgid "display" msgid "display"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:80 #: apps/note/models/transactions.py:81
msgid "transaction template" msgid "transaction template"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:81 #: apps/note/models/transactions.py:82
msgid "transaction templates" msgid "transaction templates"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:105 apps/note/models/transactions.py:118 #: apps/note/models/transactions.py:106 apps/note/models/transactions.py:119
#: apps/note/tables.py:33 apps/note/tables.py:42 #: apps/note/tables.py:33 apps/note/tables.py:42
msgid "used alias" msgid "used alias"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:126 #: apps/note/models/transactions.py:127
msgid "quantity" msgid "quantity"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:134 #: apps/note/models/transactions.py:135
msgid "reason" msgid "reason"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:144 apps/note/tables.py:95 #: apps/note/models/transactions.py:145 apps/note/tables.py:95
msgid "invalidity reason" msgid "invalidity reason"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:152 #: apps/note/models/transactions.py:153
msgid "transaction" msgid "transaction"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:153 #: apps/note/models/transactions.py:154
#: templates/treasury/sogecredit_detail.html:16
msgid "transactions" msgid "transactions"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:207 #: apps/note/models/transactions.py:216
#: templates/activity/activity_entry.html:13 templates/base.html:84 #: templates/activity/activity_entry.html:13 templates/base.html:84
#: templates/note/transaction_form.html:19 #: templates/note/transaction_form.html:19
#: templates/note/transaction_form.html:145 #: templates/note/transaction_form.html:145
msgid "Transfer" msgid "Transfer"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:227 #: apps/note/models/transactions.py:240
msgid "Template" msgid "Template"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:242 #: apps/note/models/transactions.py:255
msgid "first_name" msgid "first_name"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:247 #: apps/note/models/transactions.py:260
msgid "bank" msgid "bank"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:253 #: apps/note/models/transactions.py:266
#: templates/activity/activity_entry.html:17 #: templates/activity/activity_entry.html:17
#: templates/note/transaction_form.html:24 #: templates/note/transaction_form.html:24
msgid "Credit" msgid "Credit"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:253 templates/note/transaction_form.html:28 #: apps/note/models/transactions.py:266 templates/note/transaction_form.html:28
msgid "Debit" msgid "Debit"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:269 apps/note/models/transactions.py:274 #: apps/note/models/transactions.py:282 apps/note/models/transactions.py:287
msgid "membership transaction" msgid "membership transaction"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:270 #: apps/note/models/transactions.py:283 apps/treasury/models.py:226
msgid "membership transactions" msgid "membership transactions"
msgstr "" msgstr ""
@ -727,6 +721,7 @@ msgid "No reason specified"
msgstr "" msgstr ""
#: apps/note/tables.py:122 apps/note/tables.py:151 apps/wei/tables.py:66 #: apps/note/tables.py:122 apps/note/tables.py:151 apps/wei/tables.py:66
#: templates/treasury/sogecredit_detail.html:45
#: templates/wei/weiregistration_confirm_delete.html:32 #: templates/wei/weiregistration_confirm_delete.html:32
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
@ -806,31 +801,31 @@ msgstr ""
msgid "Join Kfet Club" msgid "Join Kfet Club"
msgstr "" msgstr ""
#: apps/registration/views.py:116 #: apps/registration/views.py:77
msgid "Email validation" msgid "Email validation"
msgstr "" msgstr ""
#: apps/registration/views.py:162 #: apps/registration/views.py:123
msgid "Email validation unsuccessful" msgid "Email validation unsuccessful"
msgstr "" msgstr ""
#: apps/registration/views.py:173 #: apps/registration/views.py:134
msgid "Email validation email sent" msgid "Email validation email sent"
msgstr "" msgstr ""
#: apps/registration/views.py:226 #: apps/registration/views.py:187
msgid "Unregistered users" msgid "Unregistered users"
msgstr "" msgstr ""
#: apps/registration/views.py:293 #: apps/registration/views.py:254
msgid "You must join the BDE." msgid "You must join the BDE."
msgstr "" msgstr ""
#: apps/registration/views.py:315 #: apps/registration/views.py:276
msgid "You must join BDE club before joining Kfet club." msgid "You must join BDE club before joining Kfet club."
msgstr "" msgstr ""
#: apps/registration/views.py:320 #: apps/registration/views.py:281
msgid "" msgid ""
"The entered amount is not enough for the memberships, should be at least {}" "The entered amount is not enough for the memberships, should be at least {}"
msgstr "" msgstr ""
@ -863,123 +858,137 @@ msgid "You can't change the type of the remittance."
msgstr "" msgstr ""
#: apps/treasury/forms.py:127 apps/treasury/tables.py:47 #: apps/treasury/forms.py:127 apps/treasury/tables.py:47
#: templates/note/transaction_form.html:133 #: apps/treasury/tables.py:113 templates/note/transaction_form.html:133
#: templates/treasury/remittance_form.html:18 #: templates/treasury/remittance_form.html:18
msgid "Amount" msgid "Amount"
msgstr "" msgstr ""
#: apps/treasury/models.py:18 #: apps/treasury/models.py:19
msgid "Invoice identifier" msgid "Invoice identifier"
msgstr "" msgstr ""
#: apps/treasury/models.py:32 #: apps/treasury/models.py:33
msgid "BDE" msgid "BDE"
msgstr "" msgstr ""
#: apps/treasury/models.py:37 #: apps/treasury/models.py:38
msgid "Object" msgid "Object"
msgstr "" msgstr ""
#: apps/treasury/models.py:41 #: apps/treasury/models.py:42
msgid "Description" msgid "Description"
msgstr "" msgstr ""
#: apps/treasury/models.py:46 templates/note/transaction_form.html:91 #: apps/treasury/models.py:47 templates/note/transaction_form.html:91
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: apps/treasury/models.py:50 #: apps/treasury/models.py:51
msgid "Address" msgid "Address"
msgstr "" msgstr ""
#: apps/treasury/models.py:55 #: apps/treasury/models.py:56
msgid "Place" msgid "Place"
msgstr "" msgstr ""
#: apps/treasury/models.py:59 #: apps/treasury/models.py:60
msgid "Acquitted" msgid "Acquitted"
msgstr "" msgstr ""
#: apps/treasury/models.py:63 #: apps/treasury/models.py:64
msgid "invoice" msgid "invoice"
msgstr "" msgstr ""
#: apps/treasury/models.py:64 #: apps/treasury/models.py:65
msgid "invoices" msgid "invoices"
msgstr "" msgstr ""
#: apps/treasury/models.py:79 #: apps/treasury/models.py:80
msgid "Designation" msgid "Designation"
msgstr "" msgstr ""
#: apps/treasury/models.py:83 #: apps/treasury/models.py:84
msgid "Quantity" msgid "Quantity"
msgstr "" msgstr ""
#: apps/treasury/models.py:87 #: apps/treasury/models.py:88
msgid "Unit price" msgid "Unit price"
msgstr "" msgstr ""
#: apps/treasury/models.py:103 #: apps/treasury/models.py:104
msgid "product" msgid "product"
msgstr "" msgstr ""
#: apps/treasury/models.py:104 #: apps/treasury/models.py:105
msgid "products" msgid "products"
msgstr "" msgstr ""
#: apps/treasury/models.py:121 #: apps/treasury/models.py:122
msgid "remittance type" msgid "remittance type"
msgstr "" msgstr ""
#: apps/treasury/models.py:122 #: apps/treasury/models.py:123
msgid "remittance types" msgid "remittance types"
msgstr "" msgstr ""
#: apps/treasury/models.py:132 #: apps/treasury/models.py:133
msgid "Date" msgid "Date"
msgstr "" msgstr ""
#: apps/treasury/models.py:143 #: apps/treasury/models.py:144
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: apps/treasury/models.py:148 #: apps/treasury/models.py:149
msgid "Closed" msgid "Closed"
msgstr "" msgstr ""
#: apps/treasury/models.py:152 #: apps/treasury/models.py:153
msgid "remittance" msgid "remittance"
msgstr "" msgstr ""
#: apps/treasury/models.py:153 #: apps/treasury/models.py:154
msgid "remittances" msgid "remittances"
msgstr "" msgstr ""
#: apps/treasury/models.py:185 #: apps/treasury/models.py:186
msgid "Remittance #{:d}: {}" msgid "Remittance #{:d}: {}"
msgstr "" msgstr ""
#: apps/treasury/models.py:204 apps/treasury/tables.py:76 #: apps/treasury/models.py:205 apps/treasury/tables.py:76
#: apps/treasury/tables.py:84 templates/treasury/invoice_list.html:13 #: apps/treasury/tables.py:84 templates/treasury/invoice_list.html:13
#: templates/treasury/remittance_list.html:13 #: templates/treasury/remittance_list.html:13
#: templates/treasury/sogecredit_list.html:13
msgid "Remittance" msgid "Remittance"
msgstr "" msgstr ""
#: apps/treasury/models.py:208 #: apps/treasury/models.py:209
msgid "special transaction proxy" msgid "special transaction proxy"
msgstr "" msgstr ""
#: apps/treasury/models.py:209 #: apps/treasury/models.py:210
msgid "special transaction proxies" msgid "special transaction proxies"
msgstr "" msgstr ""
#: apps/treasury/models.py:232
msgid "credit transaction"
msgstr ""
#: apps/treasury/models.py:294 templates/treasury/sogecredit_detail.html:9
msgid "Credit from the Société générale"
msgstr ""
#: apps/treasury/models.py:295
msgid "Credits from the Société générale"
msgstr ""
#: apps/treasury/tables.py:19 #: apps/treasury/tables.py:19
msgid "Invoice #{:d}" msgid "Invoice #{:d}"
msgstr "" msgstr ""
#: apps/treasury/tables.py:22 templates/treasury/invoice_list.html:10 #: apps/treasury/tables.py:22 templates/treasury/invoice_list.html:10
#: templates/treasury/remittance_list.html:10 #: templates/treasury/remittance_list.html:10
#: templates/treasury/sogecredit_list.html:10
msgid "Invoice" msgid "Invoice"
msgstr "" msgstr ""
@ -999,13 +1008,25 @@ msgstr ""
msgid "Remove" msgid "Remove"
msgstr "" msgstr ""
#: apps/wei/apps.py:10 apps/wei/models.py:44 apps/wei/models.py:45 #: apps/treasury/tables.py:117
#: apps/wei/models.py:56 apps/wei/models.py:161 templates/base.html:116 msgid "Valid"
msgstr ""
#: apps/treasury/tables.py:124
msgid "Yes"
msgstr ""
#: apps/treasury/tables.py:124
msgid "No"
msgstr ""
#: apps/wei/apps.py:10 apps/wei/models.py:45 apps/wei/models.py:46
#: apps/wei/models.py:57 apps/wei/models.py:162 templates/base.html:116
msgid "WEI" msgid "WEI"
msgstr "" msgstr ""
#: apps/wei/forms/registration.py:47 apps/wei/models.py:108 #: apps/wei/forms/registration.py:47 apps/wei/models.py:109
#: apps/wei/models.py:269 #: apps/wei/models.py:270
msgid "bus" msgid "bus"
msgstr "" msgstr ""
@ -1026,7 +1047,7 @@ msgid ""
msgstr "" msgstr ""
#: apps/wei/forms/registration.py:61 apps/wei/forms/registration.py:67 #: apps/wei/forms/registration.py:61 apps/wei/forms/registration.py:67
#: apps/wei/models.py:142 #: apps/wei/models.py:143
msgid "WEI Roles" msgid "WEI Roles"
msgstr "" msgstr ""
@ -1042,155 +1063,156 @@ msgstr ""
msgid "Attribute to each first year member a bus for the WEI" msgid "Attribute to each first year member a bus for the WEI"
msgstr "" msgstr ""
#: apps/wei/models.py:19 templates/wei/weiclub_info.html:23 #: apps/wei/models.py:20 templates/wei/weiclub_info.html:23
msgid "year" msgid "year"
msgstr "" msgstr ""
#: apps/wei/models.py:23 templates/wei/weiclub_info.html:17 #: apps/wei/models.py:24 templates/wei/weiclub_info.html:17
msgid "date start" msgid "date start"
msgstr "" msgstr ""
#: apps/wei/models.py:27 templates/wei/weiclub_info.html:20 #: apps/wei/models.py:28 templates/wei/weiclub_info.html:20
msgid "date end" msgid "date end"
msgstr "" msgstr ""
#: apps/wei/models.py:72 #: apps/wei/models.py:73
msgid "survey information" msgid "survey information"
msgstr "" msgstr ""
#: apps/wei/models.py:73 #: apps/wei/models.py:74
msgid "Information about the survey for new members, encoded in JSON" msgid "Information about the survey for new members, encoded in JSON"
msgstr "" msgstr ""
#: apps/wei/models.py:95 #: apps/wei/models.py:96
msgid "Bus" msgid "Bus"
msgstr "" msgstr ""
#: apps/wei/models.py:96 templates/wei/weiclub_tables.html:79 #: apps/wei/models.py:97 templates/wei/weiclub_tables.html:79
msgid "Buses" msgid "Buses"
msgstr "" msgstr ""
#: apps/wei/models.py:116 #: apps/wei/models.py:117
msgid "color" msgid "color"
msgstr "" msgstr ""
#: apps/wei/models.py:117 #: apps/wei/models.py:118
msgid "The color of the T-Shirt, stored with its number equivalent" msgid "The color of the T-Shirt, stored with its number equivalent"
msgstr "" msgstr ""
#: apps/wei/models.py:131 #: apps/wei/models.py:132
msgid "Bus team" msgid "Bus team"
msgstr "" msgstr ""
#: apps/wei/models.py:132 #: apps/wei/models.py:133
msgid "Bus teams" msgid "Bus teams"
msgstr "" msgstr ""
#: apps/wei/models.py:141 #: apps/wei/models.py:142
msgid "WEI Role" msgid "WEI Role"
msgstr "" msgstr ""
#: apps/wei/models.py:166 #: apps/wei/models.py:167
msgid "Credit from Société générale" msgid "Credit from Société générale"
msgstr "" msgstr ""
#: apps/wei/models.py:171 #: apps/wei/models.py:172
msgid "Caution check given" msgid "Caution check given"
msgstr "" msgstr ""
#: apps/wei/models.py:175 templates/wei/weimembership_form.html:56 #: apps/wei/models.py:176 templates/wei/weimembership_form.html:56
msgid "birth date" msgid "birth date"
msgstr "" msgstr ""
#: apps/wei/models.py:181 #: apps/wei/models.py:182
msgid "Male" msgid "Male"
msgstr "" msgstr ""
#: apps/wei/models.py:182 #: apps/wei/models.py:183
msgid "Female" msgid "Female"
msgstr "" msgstr ""
#: apps/wei/models.py:183 #: apps/wei/models.py:184
msgid "Non binary" msgid "Non binary"
msgstr "" msgstr ""
#: apps/wei/models.py:185 templates/wei/weimembership_form.html:53 #: apps/wei/models.py:186 templates/wei/weimembership_form.html:53
msgid "gender" msgid "gender"
msgstr "" msgstr ""
#: apps/wei/models.py:191 templates/wei/weimembership_form.html:59 #: apps/wei/models.py:192 templates/wei/weimembership_form.html:59
msgid "health issues" msgid "health issues"
msgstr "" msgstr ""
#: apps/wei/models.py:196 templates/wei/weimembership_form.html:62 #: apps/wei/models.py:197 templates/wei/weimembership_form.html:62
msgid "emergency contact name" msgid "emergency contact name"
msgstr "" msgstr ""
#: apps/wei/models.py:201 templates/wei/weimembership_form.html:65 #: apps/wei/models.py:202 templates/wei/weimembership_form.html:65
msgid "emergency contact phone" msgid "emergency contact phone"
msgstr "" msgstr ""
#: apps/wei/models.py:206 templates/wei/weimembership_form.html:68 #: apps/wei/models.py:207 templates/wei/weimembership_form.html:68
msgid "" msgid ""
"Register on the mailing list to stay informed of the events of the campus (1 " "Register on the mailing list to stay informed of the events of the campus (1 "
"mail/week)" "mail/week)"
msgstr "" msgstr ""
#: apps/wei/models.py:211 templates/wei/weimembership_form.html:71 #: apps/wei/models.py:212 templates/wei/weimembership_form.html:71
msgid "" msgid ""
"Register on the mailing list to stay informed of the sport events of the " "Register on the mailing list to stay informed of the sport events of the "
"campus (1 mail/week)" "campus (1 mail/week)"
msgstr "" msgstr ""
#: apps/wei/models.py:216 templates/wei/weimembership_form.html:74 #: apps/wei/models.py:217 templates/wei/weimembership_form.html:74
msgid "" msgid ""
"Register on the mailing list to stay informed of the art events of the " "Register on the mailing list to stay informed of the art events of the "
"campus (1 mail/week)" "campus (1 mail/week)"
msgstr "" msgstr ""
#: apps/wei/models.py:221 templates/wei/weimembership_form.html:50 #: apps/wei/models.py:222 templates/wei/weimembership_form.html:50
msgid "first year" msgid "first year"
msgstr "" msgstr ""
#: apps/wei/models.py:222 #: apps/wei/models.py:223
msgid "Tells if the user is new in the school." msgid "Tells if the user is new in the school."
msgstr "" msgstr ""
#: apps/wei/models.py:227 #: apps/wei/models.py:228
msgid "registration information" msgid "registration information"
msgstr "" msgstr ""
#: apps/wei/models.py:228 #: apps/wei/models.py:229
msgid "" msgid ""
"Information about the registration (buses for old members, survey fot the " "Information about the registration (buses for old members, survey fot the "
"new members), encoded in JSON" "new members), encoded in JSON"
msgstr "" msgstr ""
#: apps/wei/models.py:259 #: apps/wei/models.py:260
msgid "WEI User" msgid "WEI User"
msgstr "" msgstr ""
#: apps/wei/models.py:260 #: apps/wei/models.py:261
msgid "WEI Users" msgid "WEI Users"
msgstr "" msgstr ""
#: apps/wei/models.py:279 #: apps/wei/models.py:280
msgid "team" msgid "team"
msgstr "" msgstr ""
#: apps/wei/models.py:289 #: apps/wei/models.py:290
msgid "WEI registration" msgid "WEI registration"
msgstr "" msgstr ""
#: apps/wei/models.py:293 #: apps/wei/models.py:294
msgid "WEI membership" msgid "WEI membership"
msgstr "" msgstr ""
#: apps/wei/models.py:294 #: apps/wei/models.py:295
msgid "WEI memberships" msgid "WEI memberships"
msgstr "" msgstr ""
#: apps/wei/tables.py:53 apps/wei/tables.py:54 #: apps/wei/tables.py:53 apps/wei/tables.py:54
#: templates/treasury/sogecredit_detail.html:44
msgid "Validate" msgid "Validate"
msgstr "" msgstr ""
@ -1233,7 +1255,7 @@ msgstr ""
msgid "This user didn't give her/his caution check." msgid "This user didn't give her/his caution check."
msgstr "" msgstr ""
#: apps/wei/views.py:789 apps/wei/views.py:809 apps/wei/views.py:819 #: apps/wei/views.py:790 apps/wei/views.py:810 apps/wei/views.py:820
#: templates/wei/survey.html:12 templates/wei/survey_closed.html:12 #: templates/wei/survey.html:12 templates/wei/survey_closed.html:12
#: templates/wei/survey_end.html:12 #: templates/wei/survey_end.html:12
msgid "Survey WEI" msgid "Survey WEI"
@ -1745,22 +1767,16 @@ msgid "Reset my password"
msgstr "" msgstr ""
#: templates/registration/signup.html:5 templates/registration/signup.html:8 #: templates/registration/signup.html:5 templates/registration/signup.html:8
#: templates/registration/signup.html:28 #: templates/registration/signup.html:19
msgid "Sign up" msgid "Sign up"
msgstr "" msgstr ""
#: templates/registration/signup.html:11 #: templates/registration/signup.html:11
msgid "" msgid ""
"\n" "If you already signed up, your registration is taken into account. The BDE "
" If you already signed up, your registration is taken into " "must validate your account before your can log in. You have to go to the "
"account. The BDE must validate your account before\n" "Kfet and pay the registration fee. You must also validate your email address "
" your can log in. You have to go to the Kfet and pay the " "by following the link you received."
"registration fee. You must also validate your email\n"
" address by following the link you received. If you forgot to "
"register to the WEI, then you can pre-register\n"
" to the WEI after your account get validated, so please go to the "
"Kfet.\n"
" "
msgstr "" msgstr ""
#: templates/treasury/invoice_form.html:6 #: templates/treasury/invoice_form.html:6
@ -1775,7 +1791,13 @@ msgstr ""
msgid "Remove product" msgid "Remove product"
msgstr "" msgstr ""
#: templates/treasury/invoice_list.html:21 #: templates/treasury/invoice_list.html:16
#: templates/treasury/remittance_list.html:16
#: templates/treasury/sogecredit_list.html:16
msgid "Société générale credits"
msgstr ""
#: templates/treasury/invoice_list.html:24
msgid "New invoice" msgid "New invoice"
msgstr "" msgstr ""
@ -1800,38 +1822,80 @@ msgstr ""
msgid "There is no transaction linked with this remittance." msgid "There is no transaction linked with this remittance."
msgstr "" msgstr ""
#: templates/treasury/remittance_list.html:19 #: templates/treasury/remittance_list.html:22
msgid "Opened remittances" msgid "Opened remittances"
msgstr "" msgstr ""
#: templates/treasury/remittance_list.html:24 #: templates/treasury/remittance_list.html:27
msgid "There is no opened remittance." msgid "There is no opened remittance."
msgstr "" msgstr ""
#: templates/treasury/remittance_list.html:28 #: templates/treasury/remittance_list.html:31
msgid "New remittance" msgid "New remittance"
msgstr "" msgstr ""
#: templates/treasury/remittance_list.html:32 #: templates/treasury/remittance_list.html:35
msgid "Transfers without remittances" msgid "Transfers without remittances"
msgstr "" msgstr ""
#: templates/treasury/remittance_list.html:37 #: templates/treasury/remittance_list.html:40
msgid "There is no transaction without any linked remittance." msgid "There is no transaction without any linked remittance."
msgstr "" msgstr ""
#: templates/treasury/remittance_list.html:43 #: templates/treasury/remittance_list.html:46
msgid "Transfers with opened remittances" msgid "Transfers with opened remittances"
msgstr "" msgstr ""
#: templates/treasury/remittance_list.html:48 #: templates/treasury/remittance_list.html:51
msgid "There is no transaction with an opened linked remittance." msgid "There is no transaction with an opened linked remittance."
msgstr "" msgstr ""
#: templates/treasury/remittance_list.html:54 #: templates/treasury/remittance_list.html:57
msgid "Closed remittances" msgid "Closed remittances"
msgstr "" msgstr ""
#: templates/treasury/sogecredit_detail.html:23
msgid "total amount"
msgstr ""
#: templates/treasury/sogecredit_detail.html:29
msgid ""
"Warning: Validating this credit implies that all membership transactions "
"will be validated."
msgstr ""
#: templates/treasury/sogecredit_detail.html:30
msgid ""
"If you delete this credit, there all membership transactions will be also "
"validated, but no credit will be operated."
msgstr ""
#: templates/treasury/sogecredit_detail.html:31
msgid ""
"If this credit is validated, then the user won't be able to ask for a credit "
"from the Société générale."
msgstr ""
#: templates/treasury/sogecredit_detail.html:32
msgid "If you think there is an error, please contact the \"respos info\"."
msgstr ""
#: templates/treasury/sogecredit_detail.html:38
msgid "This credit is already validated."
msgstr ""
#: templates/treasury/sogecredit_detail.html:49
msgid "Return to credit list"
msgstr ""
#: templates/treasury/sogecredit_list.html:26
msgid "Filter with unvalidated credits only"
msgstr ""
#: templates/treasury/sogecredit_list.html:36
msgid "There is no matched user that have asked for a Société générale credit."
msgstr ""
#: templates/wei/bus_tables.html:16 templates/wei/busteam_tables.html:16 #: templates/wei/bus_tables.html:16 templates/wei/busteam_tables.html:16
msgid "Add team" msgid "Add team"
msgstr "" msgstr ""

View File

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-21 17:47+0200\n" "POT-Creation-Date: 2020-04-22 03:07+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -40,10 +40,10 @@ msgid "You can't invite more than 3 people to this activity."
msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité." msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité."
#: apps/activity/models.py:23 apps/activity/models.py:48 #: apps/activity/models.py:23 apps/activity/models.py:48
#: apps/member/models.py:99 apps/member/models.py:203 #: apps/member/models.py:100 apps/member/models.py:204
#: apps/note/models/notes.py:188 apps/note/models/transactions.py:24 #: apps/note/models/notes.py:188 apps/note/models/transactions.py:25
#: apps/note/models/transactions.py:44 apps/note/models/transactions.py:237 #: apps/note/models/transactions.py:45 apps/note/models/transactions.py:250
#: apps/wei/models.py:61 templates/member/club_info.html:13 #: apps/wei/models.py:62 templates/member/club_info.html:13
#: templates/member/profile_info.html:14 #: templates/member/profile_info.html:14
#: templates/registration/future_profile_detail.html:16 #: templates/registration/future_profile_detail.html:16
#: templates/wei/weiclub_info.html:13 templates/wei/weimembership_form.html:18 #: templates/wei/weiclub_info.html:13 templates/wei/weimembership_form.html:18
@ -66,20 +66,21 @@ msgstr "type d'activité"
msgid "activity types" msgid "activity types"
msgstr "types d'activité" msgstr "types d'activité"
#: apps/activity/models.py:53 apps/note/models/transactions.py:74 #: apps/activity/models.py:53 apps/note/models/transactions.py:75
#: apps/permission/models.py:103 apps/wei/models.py:67 apps/wei/models.py:123 #: apps/permission/models.py:103 apps/wei/models.py:68 apps/wei/models.py:124
#: templates/activity/activity_detail.html:16 #: templates/activity/activity_detail.html:16
msgid "description" msgid "description"
msgstr "description" msgstr "description"
#: apps/activity/models.py:60 apps/note/models/notes.py:164 #: apps/activity/models.py:60 apps/note/models/notes.py:164
#: apps/note/models/transactions.py:64 #: apps/note/models/transactions.py:65
#: templates/activity/activity_detail.html:19 #: templates/activity/activity_detail.html:19
msgid "type" msgid "type"
msgstr "type" msgstr "type"
#: apps/activity/models.py:66 apps/logs/models.py:21 apps/member/models.py:224 #: apps/activity/models.py:66 apps/logs/models.py:21 apps/member/models.py:225
#: apps/note/models/notes.py:117 apps/wei/models.py:154 #: apps/note/models/notes.py:117 apps/treasury/models.py:220
#: apps/wei/models.py:155 templates/treasury/sogecredit_detail.html:13
#: templates/wei/survey.html:16 #: templates/wei/survey.html:16
msgid "user" msgid "user"
msgstr "utilisateur" msgstr "utilisateur"
@ -100,7 +101,7 @@ msgstr "date de début"
msgid "end date" msgid "end date"
msgstr "date de fin" msgstr "date de fin"
#: apps/activity/models.py:93 apps/note/models/transactions.py:139 #: apps/activity/models.py:93 apps/note/models/transactions.py:140
#: templates/activity/activity_detail.html:47 #: templates/activity/activity_detail.html:47
msgid "valid" msgid "valid"
msgstr "valide" msgstr "valide"
@ -176,7 +177,7 @@ msgstr "Entré le "
msgid "remove" msgid "remove"
msgstr "supprimer" msgstr "supprimer"
#: apps/activity/tables.py:75 apps/treasury/models.py:138 #: apps/activity/tables.py:75 apps/treasury/models.py:139
msgid "Type" msgid "Type"
msgstr "Type" msgstr "Type"
@ -342,67 +343,59 @@ msgstr "adresse email confirmée"
msgid "registration valid" msgid "registration valid"
msgstr "inscription valid" msgstr "inscription valid"
#: apps/member/models.py:68 #: apps/member/models.py:75 apps/member/models.py:76
msgid "Société générale"
msgstr "Société générale"
#: apps/member/models.py:69
msgid "Has the user ever be paid by the Société générale?"
msgstr "Est-ce que l'utilisateur a déjà été payé par la Société Générale ?"
#: apps/member/models.py:74 apps/member/models.py:75
msgid "user profile" msgid "user profile"
msgstr "profil utilisateur" msgstr "profil utilisateur"
#: apps/member/models.py:104 templates/member/club_info.html:51 #: apps/member/models.py:105 templates/member/club_info.html:51
#: templates/registration/future_profile_detail.html:22 #: templates/registration/future_profile_detail.html:22
#: templates/wei/weiclub_info.html:52 templates/wei/weimembership_form.html:24 #: templates/wei/weiclub_info.html:52 templates/wei/weimembership_form.html:24
msgid "email" msgid "email"
msgstr "courriel" msgstr "courriel"
#: apps/member/models.py:111 #: apps/member/models.py:112
msgid "parent club" msgid "parent club"
msgstr "club parent" msgstr "club parent"
#: apps/member/models.py:120 #: apps/member/models.py:121
msgid "require memberships" msgid "require memberships"
msgstr "nécessite des adhésions" msgstr "nécessite des adhésions"
#: apps/member/models.py:121 #: apps/member/models.py:122
msgid "Uncheck if this club don't require memberships." msgid "Uncheck if this club don't require memberships."
msgstr "Décochez si ce club n'utilise pas d'adhésions." msgstr "Décochez si ce club n'utilise pas d'adhésions."
#: apps/member/models.py:126 templates/member/club_info.html:35 #: apps/member/models.py:127 templates/member/club_info.html:35
msgid "membership fee (paid students)" msgid "membership fee (paid students)"
msgstr "cotisation pour adhérer (normalien élève)" msgstr "cotisation pour adhérer (normalien élève)"
#: apps/member/models.py:131 templates/member/club_info.html:38 #: apps/member/models.py:132 templates/member/club_info.html:38
msgid "membership fee (unpaid students)" msgid "membership fee (unpaid students)"
msgstr "cotisation pour adhérer (normalien étudiant)" msgstr "cotisation pour adhérer (normalien étudiant)"
#: apps/member/models.py:137 templates/member/club_info.html:28 #: apps/member/models.py:138 templates/member/club_info.html:28
msgid "membership duration" msgid "membership duration"
msgstr "durée de l'adhésion" msgstr "durée de l'adhésion"
#: apps/member/models.py:138 #: apps/member/models.py:139
msgid "The longest time (in days) a membership can last (NULL = infinite)." msgid "The longest time (in days) a membership can last (NULL = infinite)."
msgstr "La durée maximale (en jours) d'une adhésion (NULL = infinie)." msgstr "La durée maximale (en jours) d'une adhésion (NULL = infinie)."
#: apps/member/models.py:145 templates/member/club_info.html:22 #: apps/member/models.py:146 templates/member/club_info.html:22
msgid "membership start" msgid "membership start"
msgstr "début de l'adhésion" msgstr "début de l'adhésion"
#: apps/member/models.py:146 #: apps/member/models.py:147
msgid "How long after January 1st the members can renew their membership." msgid "How long after January 1st the members can renew their membership."
msgstr "" msgstr ""
"Combien de temps après le 1er Janvier les adhérents peuvent renouveler leur " "Combien de temps après le 1er Janvier les adhérents peuvent renouveler leur "
"adhésion." "adhésion."
#: apps/member/models.py:153 templates/member/club_info.html:25 #: apps/member/models.py:154 templates/member/club_info.html:25
msgid "membership end" msgid "membership end"
msgstr "fin de l'adhésion" msgstr "fin de l'adhésion"
#: apps/member/models.py:154 #: apps/member/models.py:155
msgid "" msgid ""
"How long the membership can last after January 1st of the next year after " "How long the membership can last after January 1st of the next year after "
"members can renew their membership." "members can renew their membership."
@ -410,53 +403,53 @@ msgstr ""
"Combien de temps l'adhésion peut durer après le 1er Janvier de l'année " "Combien de temps l'adhésion peut durer après le 1er Janvier de l'année "
"suivante avant que les adhérents peuvent renouveler leur adhésion." "suivante avant que les adhérents peuvent renouveler leur adhésion."
#: apps/member/models.py:188 apps/member/models.py:230 #: apps/member/models.py:189 apps/member/models.py:231
#: apps/note/models/notes.py:139 #: apps/note/models/notes.py:139
msgid "club" msgid "club"
msgstr "club" msgstr "club"
#: apps/member/models.py:189 #: apps/member/models.py:190
msgid "clubs" msgid "clubs"
msgstr "clubs" msgstr "clubs"
#: apps/member/models.py:209 apps/permission/models.py:294 #: apps/member/models.py:210 apps/permission/models.py:294
msgid "role" msgid "role"
msgstr "rôle" msgstr "rôle"
#: apps/member/models.py:210 apps/member/models.py:235 #: apps/member/models.py:211 apps/member/models.py:236
msgid "roles" msgid "roles"
msgstr "rôles" msgstr "rôles"
#: apps/member/models.py:240 #: apps/member/models.py:241
msgid "membership starts on" msgid "membership starts on"
msgstr "l'adhésion commence le" msgstr "l'adhésion commence le"
#: apps/member/models.py:244 #: apps/member/models.py:245
msgid "membership ends on" msgid "membership ends on"
msgstr "l'adhésion finit le" msgstr "l'adhésion finit le"
#: apps/member/models.py:249 #: apps/member/models.py:250
msgid "fee" msgid "fee"
msgstr "cotisation" msgstr "cotisation"
#: apps/member/models.py:267 apps/member/views.py:500 apps/wei/views.py:726 #: apps/member/models.py:268 apps/member/views.py:494 apps/wei/views.py:726
msgid "User is not a member of the parent club" msgid "User is not a member of the parent club"
msgstr "L'utilisateur n'est pas membre du club parent" msgstr "L'utilisateur n'est pas membre du club parent"
#: apps/member/models.py:277 apps/member/views.py:509 #: apps/member/models.py:278 apps/member/views.py:503
msgid "User is already a member of the club" msgid "User is already a member of the club"
msgstr "L'utilisateur est déjà membre du club" msgstr "L'utilisateur est déjà membre du club"
#: apps/member/models.py:315 #: apps/member/models.py:329
#, python-brace-format #, python-brace-format
msgid "Membership of {user} for the club {club}" msgid "Membership of {user} for the club {club}"
msgstr "Adhésion de {user} pour le club {club}" msgstr "Adhésion de {user} pour le club {club}"
#: apps/member/models.py:318 #: apps/member/models.py:332
msgid "membership" msgid "membership"
msgstr "adhésion" msgstr "adhésion"
#: apps/member/models.py:319 #: apps/member/models.py:333
msgid "memberships" msgid "memberships"
msgstr "adhésions" msgstr "adhésions"
@ -482,7 +475,7 @@ msgstr "Un alias avec un nom similaire existe déjà."
msgid "Search user" msgid "Search user"
msgstr "Chercher un utilisateur" msgstr "Chercher un utilisateur"
#: apps/member/views.py:495 apps/wei/views.py:717 #: apps/member/views.py:489 apps/wei/views.py:717
msgid "" msgid ""
"This user don't have enough money to join this club, and can't have a " "This user don't have enough money to join this club, and can't have a "
"negative balance." "negative balance."
@ -490,26 +483,26 @@ msgstr ""
"Cet utilisateur n'a pas assez d'argent pour rejoindre ce club et ne peut pas " "Cet utilisateur n'a pas assez d'argent pour rejoindre ce club et ne peut pas "
"avoir un solde négatif." "avoir un solde négatif."
#: apps/member/views.py:513 #: apps/member/views.py:507
msgid "The membership must start after {:%m-%d-%Y}." msgid "The membership must start after {:%m-%d-%Y}."
msgstr "L'adhésion doit commencer après le {:%d/%m/%Y}." msgstr "L'adhésion doit commencer après le {:%d/%m/%Y}."
#: apps/member/views.py:518 #: apps/member/views.py:512
msgid "The membership must begin before {:%m-%d-%Y}." msgid "The membership must begin before {:%m-%d-%Y}."
msgstr "L'adhésion doit commencer avant le {:%d/%m/%Y}." msgstr "L'adhésion doit commencer avant le {:%d/%m/%Y}."
#: apps/member/views.py:528 apps/member/views.py:530 apps/member/views.py:532 #: apps/member/views.py:522 apps/member/views.py:524 apps/member/views.py:526
#: apps/registration/views.py:327 apps/registration/views.py:329 #: apps/registration/views.py:288 apps/registration/views.py:290
#: apps/registration/views.py:331 #: apps/registration/views.py:292
msgid "This field is required." msgid "This field is required."
msgstr "Ce champ est requis." msgstr "Ce champ est requis."
#: apps/note/admin.py:120 apps/note/models/transactions.py:99 #: apps/note/admin.py:120 apps/note/models/transactions.py:100
msgid "source" msgid "source"
msgstr "source" msgstr "source"
#: apps/note/admin.py:128 apps/note/admin.py:170 #: apps/note/admin.py:128 apps/note/admin.py:170
#: apps/note/models/transactions.py:54 apps/note/models/transactions.py:112 #: apps/note/models/transactions.py:55 apps/note/models/transactions.py:113
msgid "destination" msgid "destination"
msgstr "destination" msgstr "destination"
@ -552,7 +545,7 @@ msgstr ""
msgid "display image" msgid "display image"
msgstr "image affichée" msgstr "image affichée"
#: apps/note/models/notes.py:53 apps/note/models/transactions.py:122 #: apps/note/models/notes.py:53 apps/note/models/transactions.py:123
msgid "created at" msgid "created at"
msgstr "créée le" msgstr "créée le"
@ -623,97 +616,98 @@ msgstr "Un alias avec un nom similaire existe déjà : {}"
msgid "You can't delete your main alias." msgid "You can't delete your main alias."
msgstr "Vous ne pouvez pas supprimer votre alias principal." msgstr "Vous ne pouvez pas supprimer votre alias principal."
#: apps/note/models/transactions.py:30 #: apps/note/models/transactions.py:31
msgid "transaction category" msgid "transaction category"
msgstr "catégorie de transaction" msgstr "catégorie de transaction"
#: apps/note/models/transactions.py:31 #: apps/note/models/transactions.py:32
msgid "transaction categories" msgid "transaction categories"
msgstr "catégories de transaction" msgstr "catégories de transaction"
#: apps/note/models/transactions.py:47 #: apps/note/models/transactions.py:48
msgid "A template with this name already exist" msgid "A template with this name already exist"
msgstr "Un modèle de transaction avec un nom similaire existe déjà." msgstr "Un modèle de transaction avec un nom similaire existe déjà."
#: apps/note/models/transactions.py:58 apps/note/models/transactions.py:130 #: apps/note/models/transactions.py:59 apps/note/models/transactions.py:131
msgid "amount" msgid "amount"
msgstr "montant" msgstr "montant"
#: apps/note/models/transactions.py:59 #: apps/note/models/transactions.py:60
msgid "in centimes" msgid "in centimes"
msgstr "en centimes" msgstr "en centimes"
#: apps/note/models/transactions.py:70 #: apps/note/models/transactions.py:71
msgid "display" msgid "display"
msgstr "afficher" msgstr "afficher"
#: apps/note/models/transactions.py:80 #: apps/note/models/transactions.py:81
msgid "transaction template" msgid "transaction template"
msgstr "modèle de transaction" msgstr "modèle de transaction"
#: apps/note/models/transactions.py:81 #: apps/note/models/transactions.py:82
msgid "transaction templates" msgid "transaction templates"
msgstr "modèles de transaction" msgstr "modèles de transaction"
#: apps/note/models/transactions.py:105 apps/note/models/transactions.py:118 #: apps/note/models/transactions.py:106 apps/note/models/transactions.py:119
#: apps/note/tables.py:33 apps/note/tables.py:42 #: apps/note/tables.py:33 apps/note/tables.py:42
msgid "used alias" msgid "used alias"
msgstr "alias utilisé" msgstr "alias utilisé"
#: apps/note/models/transactions.py:126 #: apps/note/models/transactions.py:127
msgid "quantity" msgid "quantity"
msgstr "quantité" msgstr "quantité"
#: apps/note/models/transactions.py:134 #: apps/note/models/transactions.py:135
msgid "reason" msgid "reason"
msgstr "raison" msgstr "raison"
#: apps/note/models/transactions.py:144 apps/note/tables.py:95 #: apps/note/models/transactions.py:145 apps/note/tables.py:95
msgid "invalidity reason" msgid "invalidity reason"
msgstr "Motif d'invalidité" msgstr "Motif d'invalidité"
#: apps/note/models/transactions.py:152 #: apps/note/models/transactions.py:153
msgid "transaction" msgid "transaction"
msgstr "transaction" msgstr "transaction"
#: apps/note/models/transactions.py:153 #: apps/note/models/transactions.py:154
#: templates/treasury/sogecredit_detail.html:16
msgid "transactions" msgid "transactions"
msgstr "transactions" msgstr "transactions"
#: apps/note/models/transactions.py:207 #: apps/note/models/transactions.py:216
#: templates/activity/activity_entry.html:13 templates/base.html:84 #: templates/activity/activity_entry.html:13 templates/base.html:84
#: templates/note/transaction_form.html:19 #: templates/note/transaction_form.html:19
#: templates/note/transaction_form.html:145 #: templates/note/transaction_form.html:145
msgid "Transfer" msgid "Transfer"
msgstr "Virement" msgstr "Virement"
#: apps/note/models/transactions.py:227 #: apps/note/models/transactions.py:240
msgid "Template" msgid "Template"
msgstr "Bouton" msgstr "Bouton"
#: apps/note/models/transactions.py:242 #: apps/note/models/transactions.py:255
msgid "first_name" msgid "first_name"
msgstr "prénom" msgstr "prénom"
#: apps/note/models/transactions.py:247 #: apps/note/models/transactions.py:260
msgid "bank" msgid "bank"
msgstr "banque" msgstr "banque"
#: apps/note/models/transactions.py:253 #: apps/note/models/transactions.py:266
#: templates/activity/activity_entry.html:17 #: templates/activity/activity_entry.html:17
#: templates/note/transaction_form.html:24 #: templates/note/transaction_form.html:24
msgid "Credit" msgid "Credit"
msgstr "Crédit" msgstr "Crédit"
#: apps/note/models/transactions.py:253 templates/note/transaction_form.html:28 #: apps/note/models/transactions.py:266 templates/note/transaction_form.html:28
msgid "Debit" msgid "Debit"
msgstr "Débit" msgstr "Débit"
#: apps/note/models/transactions.py:269 apps/note/models/transactions.py:274 #: apps/note/models/transactions.py:282 apps/note/models/transactions.py:287
msgid "membership transaction" msgid "membership transaction"
msgstr "Transaction d'adhésion" msgstr "Transaction d'adhésion"
#: apps/note/models/transactions.py:270 #: apps/note/models/transactions.py:283 apps/treasury/models.py:226
msgid "membership transactions" msgid "membership transactions"
msgstr "Transactions d'adhésion" msgstr "Transactions d'adhésion"
@ -730,6 +724,7 @@ msgid "No reason specified"
msgstr "Pas de motif spécifié" msgstr "Pas de motif spécifié"
#: apps/note/tables.py:122 apps/note/tables.py:151 apps/wei/tables.py:66 #: apps/note/tables.py:122 apps/note/tables.py:151 apps/wei/tables.py:66
#: templates/treasury/sogecredit_detail.html:45
#: templates/wei/weiregistration_confirm_delete.html:32 #: templates/wei/weiregistration_confirm_delete.html:32
msgid "Delete" msgid "Delete"
msgstr "Supprimer" msgstr "Supprimer"
@ -812,31 +807,31 @@ msgstr "Adhérer au club BDE"
msgid "Join Kfet Club" msgid "Join Kfet Club"
msgstr "Adhérer au club Kfet" msgstr "Adhérer au club Kfet"
#: apps/registration/views.py:116 #: apps/registration/views.py:77
msgid "Email validation" msgid "Email validation"
msgstr "Validation de l'adresse mail" msgstr "Validation de l'adresse mail"
#: apps/registration/views.py:162 #: apps/registration/views.py:123
msgid "Email validation unsuccessful" msgid "Email validation unsuccessful"
msgstr " La validation de l'adresse mail a échoué" msgstr " La validation de l'adresse mail a échoué"
#: apps/registration/views.py:173 #: apps/registration/views.py:134
msgid "Email validation email sent" msgid "Email validation email sent"
msgstr "L'email de vérification de l'adresse email a bien été envoyé." msgstr "L'email de vérification de l'adresse email a bien été envoyé."
#: apps/registration/views.py:226 #: apps/registration/views.py:187
msgid "Unregistered users" msgid "Unregistered users"
msgstr "Utilisateurs en attente d'inscription" msgstr "Utilisateurs en attente d'inscription"
#: apps/registration/views.py:293 #: apps/registration/views.py:254
msgid "You must join the BDE." msgid "You must join the BDE."
msgstr "Vous devez adhérer au BDE." msgstr "Vous devez adhérer au BDE."
#: apps/registration/views.py:315 #: apps/registration/views.py:276
msgid "You must join BDE club before joining Kfet club." msgid "You must join BDE club before joining Kfet club."
msgstr "Vous devez adhérer au club BDE avant d'adhérer au club Kfet." msgstr "Vous devez adhérer au club BDE avant d'adhérer au club Kfet."
#: apps/registration/views.py:320 #: apps/registration/views.py:281
msgid "" msgid ""
"The entered amount is not enough for the memberships, should be at least {}" "The entered amount is not enough for the memberships, should be at least {}"
msgstr "" msgstr ""
@ -871,123 +866,137 @@ msgid "You can't change the type of the remittance."
msgstr "Vous ne pouvez pas changer le type de la remise." msgstr "Vous ne pouvez pas changer le type de la remise."
#: apps/treasury/forms.py:127 apps/treasury/tables.py:47 #: apps/treasury/forms.py:127 apps/treasury/tables.py:47
#: templates/note/transaction_form.html:133 #: apps/treasury/tables.py:113 templates/note/transaction_form.html:133
#: templates/treasury/remittance_form.html:18 #: templates/treasury/remittance_form.html:18
msgid "Amount" msgid "Amount"
msgstr "Montant" msgstr "Montant"
#: apps/treasury/models.py:18 #: apps/treasury/models.py:19
msgid "Invoice identifier" msgid "Invoice identifier"
msgstr "Numéro de facture" msgstr "Numéro de facture"
#: apps/treasury/models.py:32 #: apps/treasury/models.py:33
msgid "BDE" msgid "BDE"
msgstr "BDE" msgstr "BDE"
#: apps/treasury/models.py:37 #: apps/treasury/models.py:38
msgid "Object" msgid "Object"
msgstr "Objet" msgstr "Objet"
#: apps/treasury/models.py:41 #: apps/treasury/models.py:42
msgid "Description" msgid "Description"
msgstr "Description" msgstr "Description"
#: apps/treasury/models.py:46 templates/note/transaction_form.html:91 #: apps/treasury/models.py:47 templates/note/transaction_form.html:91
msgid "Name" msgid "Name"
msgstr "Nom" msgstr "Nom"
#: apps/treasury/models.py:50 #: apps/treasury/models.py:51
msgid "Address" msgid "Address"
msgstr "Adresse" msgstr "Adresse"
#: apps/treasury/models.py:55 #: apps/treasury/models.py:56
msgid "Place" msgid "Place"
msgstr "Lieu" msgstr "Lieu"
#: apps/treasury/models.py:59 #: apps/treasury/models.py:60
msgid "Acquitted" msgid "Acquitted"
msgstr "Acquittée" msgstr "Acquittée"
#: apps/treasury/models.py:63 #: apps/treasury/models.py:64
msgid "invoice" msgid "invoice"
msgstr "facture" msgstr "facture"
#: apps/treasury/models.py:64 #: apps/treasury/models.py:65
msgid "invoices" msgid "invoices"
msgstr "factures" msgstr "factures"
#: apps/treasury/models.py:79 #: apps/treasury/models.py:80
msgid "Designation" msgid "Designation"
msgstr "Désignation" msgstr "Désignation"
#: apps/treasury/models.py:83 #: apps/treasury/models.py:84
msgid "Quantity" msgid "Quantity"
msgstr "Quantité" msgstr "Quantité"
#: apps/treasury/models.py:87 #: apps/treasury/models.py:88
msgid "Unit price" msgid "Unit price"
msgstr "Prix unitaire" msgstr "Prix unitaire"
#: apps/treasury/models.py:103 #: apps/treasury/models.py:104
msgid "product" msgid "product"
msgstr "produit" msgstr "produit"
#: apps/treasury/models.py:104 #: apps/treasury/models.py:105
msgid "products" msgid "products"
msgstr "produits" msgstr "produits"
#: apps/treasury/models.py:121 #: apps/treasury/models.py:122
msgid "remittance type" msgid "remittance type"
msgstr "type de remise" msgstr "type de remise"
#: apps/treasury/models.py:122 #: apps/treasury/models.py:123
msgid "remittance types" msgid "remittance types"
msgstr "types de remises" msgstr "types de remises"
#: apps/treasury/models.py:132 #: apps/treasury/models.py:133
msgid "Date" msgid "Date"
msgstr "Date" msgstr "Date"
#: apps/treasury/models.py:143 #: apps/treasury/models.py:144
msgid "Comment" msgid "Comment"
msgstr "Commentaire" msgstr "Commentaire"
#: apps/treasury/models.py:148 #: apps/treasury/models.py:149
msgid "Closed" msgid "Closed"
msgstr "Fermée" msgstr "Fermée"
#: apps/treasury/models.py:152 #: apps/treasury/models.py:153
msgid "remittance" msgid "remittance"
msgstr "remise" msgstr "remise"
#: apps/treasury/models.py:153 #: apps/treasury/models.py:154
msgid "remittances" msgid "remittances"
msgstr "remises" msgstr "remises"
#: apps/treasury/models.py:185 #: apps/treasury/models.py:186
msgid "Remittance #{:d}: {}" msgid "Remittance #{:d}: {}"
msgstr "Remise n°{:d} : {}" msgstr "Remise n°{:d} : {}"
#: apps/treasury/models.py:204 apps/treasury/tables.py:76 #: apps/treasury/models.py:205 apps/treasury/tables.py:76
#: apps/treasury/tables.py:84 templates/treasury/invoice_list.html:13 #: apps/treasury/tables.py:84 templates/treasury/invoice_list.html:13
#: templates/treasury/remittance_list.html:13 #: templates/treasury/remittance_list.html:13
#: templates/treasury/sogecredit_list.html:13
msgid "Remittance" msgid "Remittance"
msgstr "Remise" msgstr "Remise"
#: apps/treasury/models.py:208 #: apps/treasury/models.py:209
msgid "special transaction proxy" msgid "special transaction proxy"
msgstr "Proxy de transaction spéciale" msgstr "Proxy de transaction spéciale"
#: apps/treasury/models.py:209 #: apps/treasury/models.py:210
msgid "special transaction proxies" msgid "special transaction proxies"
msgstr "Proxys de transactions spéciales" msgstr "Proxys de transactions spéciales"
#: apps/treasury/models.py:232
msgid "credit transaction"
msgstr "transaction de crédit"
#: apps/treasury/models.py:294 templates/treasury/sogecredit_detail.html:9
msgid "Credit from the Société générale"
msgstr "Crédit de la Société générale"
#: apps/treasury/models.py:295
msgid "Credits from the Société générale"
msgstr "Crédits de la Société générale"
#: apps/treasury/tables.py:19 #: apps/treasury/tables.py:19
msgid "Invoice #{:d}" msgid "Invoice #{:d}"
msgstr "Facture n°{:d}" msgstr "Facture n°{:d}"
#: apps/treasury/tables.py:22 templates/treasury/invoice_list.html:10 #: apps/treasury/tables.py:22 templates/treasury/invoice_list.html:10
#: templates/treasury/remittance_list.html:10 #: templates/treasury/remittance_list.html:10
#: templates/treasury/sogecredit_list.html:10
msgid "Invoice" msgid "Invoice"
msgstr "Facture" msgstr "Facture"
@ -1007,13 +1016,25 @@ msgstr "Ajouter"
msgid "Remove" msgid "Remove"
msgstr "supprimer" msgstr "supprimer"
#: apps/wei/apps.py:10 apps/wei/models.py:44 apps/wei/models.py:45 #: apps/treasury/tables.py:117
#: apps/wei/models.py:56 apps/wei/models.py:161 templates/base.html:116 msgid "Valid"
msgstr "Valide"
#: apps/treasury/tables.py:124
msgid "Yes"
msgstr "Oui"
#: apps/treasury/tables.py:124
msgid "No"
msgstr "Non"
#: apps/wei/apps.py:10 apps/wei/models.py:45 apps/wei/models.py:46
#: apps/wei/models.py:57 apps/wei/models.py:162 templates/base.html:116
msgid "WEI" msgid "WEI"
msgstr "WEI" msgstr "WEI"
#: apps/wei/forms/registration.py:47 apps/wei/models.py:108 #: apps/wei/forms/registration.py:47 apps/wei/models.py:109
#: apps/wei/models.py:269 #: apps/wei/models.py:270
msgid "bus" msgid "bus"
msgstr "Bus" msgstr "Bus"
@ -1039,7 +1060,7 @@ msgstr ""
"bus ou électron libre)" "bus ou électron libre)"
#: apps/wei/forms/registration.py:61 apps/wei/forms/registration.py:67 #: apps/wei/forms/registration.py:61 apps/wei/forms/registration.py:67
#: apps/wei/models.py:142 #: apps/wei/models.py:143
msgid "WEI Roles" msgid "WEI Roles"
msgstr "Rôles au WEI" msgstr "Rôles au WEI"
@ -1055,97 +1076,97 @@ msgstr "Cette équipe n'appartient pas à ce bus."
msgid "Attribute to each first year member a bus for the WEI" msgid "Attribute to each first year member a bus for the WEI"
msgstr "Attribuer à chaque première année un bus pour le WEI" msgstr "Attribuer à chaque première année un bus pour le WEI"
#: apps/wei/models.py:19 templates/wei/weiclub_info.html:23 #: apps/wei/models.py:20 templates/wei/weiclub_info.html:23
msgid "year" msgid "year"
msgstr "année" msgstr "année"
#: apps/wei/models.py:23 templates/wei/weiclub_info.html:17 #: apps/wei/models.py:24 templates/wei/weiclub_info.html:17
msgid "date start" msgid "date start"
msgstr "début" msgstr "début"
#: apps/wei/models.py:27 templates/wei/weiclub_info.html:20 #: apps/wei/models.py:28 templates/wei/weiclub_info.html:20
msgid "date end" msgid "date end"
msgstr "fin" msgstr "fin"
#: apps/wei/models.py:72 #: apps/wei/models.py:73
msgid "survey information" msgid "survey information"
msgstr "informations sur le questionnaire" msgstr "informations sur le questionnaire"
#: apps/wei/models.py:73 #: apps/wei/models.py:74
msgid "Information about the survey for new members, encoded in JSON" msgid "Information about the survey for new members, encoded in JSON"
msgstr "" msgstr ""
"Informations sur le sondage pour les nouveaux membres, encodées en JSON" "Informations sur le sondage pour les nouveaux membres, encodées en JSON"
#: apps/wei/models.py:95 #: apps/wei/models.py:96
msgid "Bus" msgid "Bus"
msgstr "Bus" msgstr "Bus"
#: apps/wei/models.py:96 templates/wei/weiclub_tables.html:79 #: apps/wei/models.py:97 templates/wei/weiclub_tables.html:79
msgid "Buses" msgid "Buses"
msgstr "Bus" msgstr "Bus"
#: apps/wei/models.py:116 #: apps/wei/models.py:117
msgid "color" msgid "color"
msgstr "couleur" msgstr "couleur"
#: apps/wei/models.py:117 #: apps/wei/models.py:118
msgid "The color of the T-Shirt, stored with its number equivalent" msgid "The color of the T-Shirt, stored with its number equivalent"
msgstr "" msgstr ""
"La couleur du T-Shirt, stocké sous la forme de son équivalent numérique" "La couleur du T-Shirt, stocké sous la forme de son équivalent numérique"
#: apps/wei/models.py:131 #: apps/wei/models.py:132
msgid "Bus team" msgid "Bus team"
msgstr "Équipe de bus" msgstr "Équipe de bus"
#: apps/wei/models.py:132 #: apps/wei/models.py:133
msgid "Bus teams" msgid "Bus teams"
msgstr "Équipes de bus" msgstr "Équipes de bus"
#: apps/wei/models.py:141 #: apps/wei/models.py:142
msgid "WEI Role" msgid "WEI Role"
msgstr "Rôle au WEI" msgstr "Rôle au WEI"
#: apps/wei/models.py:166 #: apps/wei/models.py:167
msgid "Credit from Société générale" msgid "Credit from Société générale"
msgstr "Crédit de la Société générale" msgstr "Crédit de la Société générale"
#: apps/wei/models.py:171 #: apps/wei/models.py:172
msgid "Caution check given" msgid "Caution check given"
msgstr "Chèque de caution donné" msgstr "Chèque de caution donné"
#: apps/wei/models.py:175 templates/wei/weimembership_form.html:56 #: apps/wei/models.py:176 templates/wei/weimembership_form.html:56
msgid "birth date" msgid "birth date"
msgstr "date de naissance" msgstr "date de naissance"
#: apps/wei/models.py:181 #: apps/wei/models.py:182
msgid "Male" msgid "Male"
msgstr "Homme" msgstr "Homme"
#: apps/wei/models.py:182 #: apps/wei/models.py:183
msgid "Female" msgid "Female"
msgstr "Femme" msgstr "Femme"
#: apps/wei/models.py:183 #: apps/wei/models.py:184
msgid "Non binary" msgid "Non binary"
msgstr "Non-binaire" msgstr "Non-binaire"
#: apps/wei/models.py:185 templates/wei/weimembership_form.html:53 #: apps/wei/models.py:186 templates/wei/weimembership_form.html:53
msgid "gender" msgid "gender"
msgstr "genre" msgstr "genre"
#: apps/wei/models.py:191 templates/wei/weimembership_form.html:59 #: apps/wei/models.py:192 templates/wei/weimembership_form.html:59
msgid "health issues" msgid "health issues"
msgstr "problèmes de santé" msgstr "problèmes de santé"
#: apps/wei/models.py:196 templates/wei/weimembership_form.html:62 #: apps/wei/models.py:197 templates/wei/weimembership_form.html:62
msgid "emergency contact name" msgid "emergency contact name"
msgstr "Nom du contact en cas d'urgence" msgstr "Nom du contact en cas d'urgence"
#: apps/wei/models.py:201 templates/wei/weimembership_form.html:65 #: apps/wei/models.py:202 templates/wei/weimembership_form.html:65
msgid "emergency contact phone" msgid "emergency contact phone"
msgstr "Téléphone du contact en cas d'urgence" msgstr "Téléphone du contact en cas d'urgence"
#: apps/wei/models.py:206 templates/wei/weimembership_form.html:68 #: apps/wei/models.py:207 templates/wei/weimembership_form.html:68
msgid "" msgid ""
"Register on the mailing list to stay informed of the events of the campus (1 " "Register on the mailing list to stay informed of the events of the campus (1 "
"mail/week)" "mail/week)"
@ -1153,7 +1174,7 @@ msgstr ""
"S'inscrire sur la liste de diffusion pour rester informé des événements sur " "S'inscrire sur la liste de diffusion pour rester informé des événements sur "
"le campus (1 mail par semaine)" "le campus (1 mail par semaine)"
#: apps/wei/models.py:211 templates/wei/weimembership_form.html:71 #: apps/wei/models.py:212 templates/wei/weimembership_form.html:71
msgid "" msgid ""
"Register on the mailing list to stay informed of the sport events of the " "Register on the mailing list to stay informed of the sport events of the "
"campus (1 mail/week)" "campus (1 mail/week)"
@ -1161,7 +1182,7 @@ msgstr ""
"S'inscrire sur la liste de diffusion pour rester informé des actualités " "S'inscrire sur la liste de diffusion pour rester informé des actualités "
"sportives sur le campus (1 mail par semaine)" "sportives sur le campus (1 mail par semaine)"
#: apps/wei/models.py:216 templates/wei/weimembership_form.html:74 #: apps/wei/models.py:217 templates/wei/weimembership_form.html:74
msgid "" msgid ""
"Register on the mailing list to stay informed of the art events of the " "Register on the mailing list to stay informed of the art events of the "
"campus (1 mail/week)" "campus (1 mail/week)"
@ -1169,19 +1190,19 @@ msgstr ""
"S'inscrire sur la liste de diffusion pour rester informé des actualités " "S'inscrire sur la liste de diffusion pour rester informé des actualités "
"artistiques sur le campus (1 mail par semaine)" "artistiques sur le campus (1 mail par semaine)"
#: apps/wei/models.py:221 templates/wei/weimembership_form.html:50 #: apps/wei/models.py:222 templates/wei/weimembership_form.html:50
msgid "first year" msgid "first year"
msgstr "première année" msgstr "première année"
#: apps/wei/models.py:222 #: apps/wei/models.py:223
msgid "Tells if the user is new in the school." msgid "Tells if the user is new in the school."
msgstr "Indique si l'utilisateur est nouveau dans l'école." msgstr "Indique si l'utilisateur est nouveau dans l'école."
#: apps/wei/models.py:227 #: apps/wei/models.py:228
msgid "registration information" msgid "registration information"
msgstr "informations sur l'inscription" msgstr "informations sur l'inscription"
#: apps/wei/models.py:228 #: apps/wei/models.py:229
msgid "" msgid ""
"Information about the registration (buses for old members, survey fot the " "Information about the registration (buses for old members, survey fot the "
"new members), encoded in JSON" "new members), encoded in JSON"
@ -1189,31 +1210,32 @@ msgstr ""
"Informations sur l'inscription (bus pour les 2A+, questionnaire pour les " "Informations sur l'inscription (bus pour les 2A+, questionnaire pour les "
"1A), encodées en JSON" "1A), encodées en JSON"
#: apps/wei/models.py:259 #: apps/wei/models.py:260
msgid "WEI User" msgid "WEI User"
msgstr "Participant au WEI" msgstr "Participant au WEI"
#: apps/wei/models.py:260 #: apps/wei/models.py:261
msgid "WEI Users" msgid "WEI Users"
msgstr "Participants au WEI" msgstr "Participants au WEI"
#: apps/wei/models.py:279 #: apps/wei/models.py:280
msgid "team" msgid "team"
msgstr "équipe" msgstr "équipe"
#: apps/wei/models.py:289 #: apps/wei/models.py:290
msgid "WEI registration" msgid "WEI registration"
msgstr "inscription au WEI" msgstr "inscription au WEI"
#: apps/wei/models.py:293 #: apps/wei/models.py:294
msgid "WEI membership" msgid "WEI membership"
msgstr "adhésion au WEI" msgstr "adhésion au WEI"
#: apps/wei/models.py:294 #: apps/wei/models.py:295
msgid "WEI memberships" msgid "WEI memberships"
msgstr "adhésions au WEI" msgstr "adhésions au WEI"
#: apps/wei/tables.py:53 apps/wei/tables.py:54 #: apps/wei/tables.py:53 apps/wei/tables.py:54
#: templates/treasury/sogecredit_detail.html:44
msgid "Validate" msgid "Validate"
msgstr "Valider" msgstr "Valider"
@ -1258,7 +1280,7 @@ msgstr "Vous avez déjà ouvert un compte auprès de la société générale."
msgid "This user didn't give her/his caution check." msgid "This user didn't give her/his caution check."
msgstr "Cet utilisateur n'a pas donné son chèque de caution." msgstr "Cet utilisateur n'a pas donné son chèque de caution."
#: apps/wei/views.py:789 apps/wei/views.py:809 apps/wei/views.py:819 #: apps/wei/views.py:790 apps/wei/views.py:810 apps/wei/views.py:820
#: templates/wei/survey.html:12 templates/wei/survey_closed.html:12 #: templates/wei/survey.html:12 templates/wei/survey_closed.html:12
#: templates/wei/survey_end.html:12 #: templates/wei/survey_end.html:12
msgid "Survey WEI" msgid "Survey WEI"
@ -1784,34 +1806,22 @@ msgid "Reset my password"
msgstr "" msgstr ""
#: templates/registration/signup.html:5 templates/registration/signup.html:8 #: templates/registration/signup.html:5 templates/registration/signup.html:8
#: templates/registration/signup.html:28 #: templates/registration/signup.html:19
msgid "Sign up" msgid "Sign up"
msgstr "Inscription" msgstr "Inscription"
#: templates/registration/signup.html:11 #: templates/registration/signup.html:11
msgid "" msgid ""
"\n" "If you already signed up, your registration is taken into account. The BDE "
" If you already signed up, your registration is taken into " "must validate your account before your can log in. You have to go to the "
"account. The BDE must validate your account before\n" "Kfet and pay the registration fee. You must also validate your email address "
" your can log in. You have to go to the Kfet and pay the " "by following the link you received."
"registration fee. You must also validate your email\n"
" address by following the link you received. If you forgot to "
"register to the WEI, then you can pre-register\n"
" to the WEI after your account get validated, so please go to the "
"Kfet.\n"
" "
msgstr "" msgstr ""
"\n" "Si vous vous êtes déjà inscrits, votre inscription a bien été prise en "
" Si vous vous êtes déjà inscrits, votre inscription a bien été " "compte. Le BDE doit d'abord valider votre compte avantque vous puissiez vous "
"prise en compte. Le BDE doit d'abord valider votre compte avant\n" "connecter. Vous devez vous rendre à la Kfet et payer les frais d'adhésion. "
" que vous puissiez vous connecter. Vous devez vous rendre à la " "Vous devez également valider votre adresse email en suivant le lien que vous "
"Kfet et payer les frais d'adhésion. Vous devez également valider votre " "avez reçu."
"adresse\n"
" email en suivant le lien que vous avez reçu. Si vous aviez "
"oublié de vous inscrire au WEI, vous pourrez vous pré-inscrire à nouveau\n"
" après avoir validé votre compte, merci alors de vous rendre à la "
"Kfet.\n"
" "
#: templates/treasury/invoice_form.html:6 #: templates/treasury/invoice_form.html:6
msgid "Invoices list" msgid "Invoices list"
@ -1825,7 +1835,13 @@ msgstr "Ajouter produit"
msgid "Remove product" msgid "Remove product"
msgstr "Retirer produit" msgstr "Retirer produit"
#: templates/treasury/invoice_list.html:21 #: templates/treasury/invoice_list.html:16
#: templates/treasury/remittance_list.html:16
#: templates/treasury/sogecredit_list.html:16
msgid "Société générale credits"
msgstr "Crédits de la Société générale"
#: templates/treasury/invoice_list.html:24
msgid "New invoice" msgid "New invoice"
msgstr "Nouvelle facture" msgstr "Nouvelle facture"
@ -1850,38 +1866,89 @@ msgstr "Transactions liées"
msgid "There is no transaction linked with this remittance." msgid "There is no transaction linked with this remittance."
msgstr "Il n'y a pas de transaction liée à cette remise." msgstr "Il n'y a pas de transaction liée à cette remise."
#: templates/treasury/remittance_list.html:19 #: templates/treasury/remittance_list.html:22
msgid "Opened remittances" msgid "Opened remittances"
msgstr "Remises ouvertes" msgstr "Remises ouvertes"
#: templates/treasury/remittance_list.html:24 #: templates/treasury/remittance_list.html:27
msgid "There is no opened remittance." msgid "There is no opened remittance."
msgstr "Il n'y a pas de remise ouverte." msgstr "Il n'y a pas de remise ouverte."
#: templates/treasury/remittance_list.html:28 #: templates/treasury/remittance_list.html:31
msgid "New remittance" msgid "New remittance"
msgstr "Nouvelle remise" msgstr "Nouvelle remise"
#: templates/treasury/remittance_list.html:32 #: templates/treasury/remittance_list.html:35
msgid "Transfers without remittances" msgid "Transfers without remittances"
msgstr "Transactions sans remise associée" msgstr "Transactions sans remise associée"
#: templates/treasury/remittance_list.html:37 #: templates/treasury/remittance_list.html:40
msgid "There is no transaction without any linked remittance." msgid "There is no transaction without any linked remittance."
msgstr "Il n'y a pas de transactions sans remise associée." msgstr "Il n'y a pas de transactions sans remise associée."
#: templates/treasury/remittance_list.html:43 #: templates/treasury/remittance_list.html:46
msgid "Transfers with opened remittances" msgid "Transfers with opened remittances"
msgstr "Transactions associées à une remise ouverte" msgstr "Transactions associées à une remise ouverte"
#: templates/treasury/remittance_list.html:48 #: templates/treasury/remittance_list.html:51
msgid "There is no transaction with an opened linked remittance." msgid "There is no transaction with an opened linked remittance."
msgstr "Il n'y a pas de transaction associée à une remise ouverte." msgstr "Il n'y a pas de transaction associée à une remise ouverte."
#: templates/treasury/remittance_list.html:54 #: templates/treasury/remittance_list.html:57
msgid "Closed remittances" msgid "Closed remittances"
msgstr "Remises fermées" msgstr "Remises fermées"
#: templates/treasury/sogecredit_detail.html:23
msgid "total amount"
msgstr "montant total"
#: templates/treasury/sogecredit_detail.html:29
msgid ""
"Warning: Validating this credit implies that all membership transactions "
"will be validated."
msgstr ""
"Attention : Valider ce crédit implique que les transactions d'adhésion "
"seront validées."
#: templates/treasury/sogecredit_detail.html:30
msgid ""
"If you delete this credit, there all membership transactions will be also "
"validated, but no credit will be operated."
msgstr ""
"Si vous supprimez cette demande de crédit, alors toutes les transactions "
"d'adhésion seront aussi validées, but il n'y aura pas de transaction de "
"crédit créée."
#: templates/treasury/sogecredit_detail.html:31
msgid ""
"If this credit is validated, then the user won't be able to ask for a credit "
"from the Société générale."
msgstr ""
"Si ce crédit est validé, alors l'utilisateur ne pourra plus demander d'être "
"crédité par la Société générale à l'avenir."
#: templates/treasury/sogecredit_detail.html:32
msgid "If you think there is an error, please contact the \"respos info\"."
msgstr "Si vous pensez qu'il y a une erreur, merci de contacter un respo info."
#: templates/treasury/sogecredit_detail.html:38
msgid "This credit is already validated."
msgstr "Ce crédit a déjà été validé."
#: templates/treasury/sogecredit_detail.html:49
msgid "Return to credit list"
msgstr "Retour à la liste des crédits"
#: templates/treasury/sogecredit_list.html:26
msgid "Filter with unvalidated credits only"
msgstr "Filtrer avec uniquement les crédits non valides"
#: templates/treasury/sogecredit_list.html:36
msgid "There is no matched user that have asked for a Société générale credit."
msgstr ""
"Il n'y a pas d'utilisateur trouvé ayant demandé un crédit de la Société "
"générale."
#: templates/wei/bus_tables.html:16 templates/wei/busteam_tables.html:16 #: templates/wei/bus_tables.html:16 templates/wei/busteam_tables.html:16
msgid "Add team" msgid "Add team"
msgstr "Ajouter une équipe" msgstr "Ajouter une équipe"

View File

@ -19,14 +19,20 @@
{% endif %} {% endif %}
{% if club.require_memberships %} {% if club.require_memberships %}
<dt class="col-xl-6">{% trans 'membership start'|capfirst %}</dt> {% if club.membership_start %}
<dd class="col-xl-6">{{ club.membership_start }}</dd> <dt class="col-xl-6">{% trans 'membership start'|capfirst %}</dt>
<dd class="col-xl-6">{{ club.membership_start }}</dd>
{% endif %}
<dt class="col-xl-6">{% trans 'membership end'|capfirst %}</dt> {% if club.membership_end %}
<dd class="col-xl-6">{{ club.membership_end }}</dd> <dt class="col-xl-6">{% trans 'membership end'|capfirst %}</dt>
<dd class="col-xl-6">{{ club.membership_end }}</dd>
{% endif %}
<dt class="col-xl-6">{% trans 'membership duration'|capfirst %}</dt> {% if club.membership_duration %}
<dd class="col-xl-6">{{ club.membership_duration }} {% trans "days" %}</dd> <dt class="col-xl-6">{% trans 'membership duration'|capfirst %}</dt>
<dd class="col-xl-6">{{ club.membership_duration }} {% trans "days" %}</dd>
{% endif %}
{% if club.membership_fee_paid == club.membership_fee_unpaid %} {% if club.membership_fee_paid == club.membership_fee_unpaid %}
<dt class="col-xl-6">{% trans 'membership fee'|capfirst %}</dt> <dt class="col-xl-6">{% trans 'membership fee'|capfirst %}</dt>
@ -52,15 +58,18 @@
<dd class="col-xl-8"><a href="mailto:{{ club.email }}">{{ club.email }}</a></dd> <dd class="col-xl-8"><a href="mailto:{{ club.email }}">{{ club.email }}</a></dd>
</dl> </dl>
</div> </div>
<div class="card-footer text-center"> {% if not club.weiclub %}
{% if can_add_members %} <div class="card-footer text-center">
<a class="btn btn-primary btn-sm my-1" href="{% url 'member:club_add_member' club_pk=club.pk %}"> {% trans "Add member" %}</a> {% if can_add_members %}
{% endif %} <a class="btn btn-primary btn-sm my-1" href="{% url 'member:club_add_member' club_pk=club.pk %}"> {% trans "Add member" %}</a>
{% if ".change_"|has_perm:club %} {% endif %}
<a class="btn btn-primary btn-sm my-1" href="{% url 'member:club_update' pk=club.pk %}"> {% trans "Edit" %}</a> {% if ".change_"|has_perm:club %}
{% endif %} <a class="btn btn-primary btn-sm my-1" href="{% url 'member:club_update' pk=club.pk %}"> {% trans "Edit" %}</a>
{% url 'member:club_detail' club.pk as club_detail_url %} {% endif %}
{%if request.path_info != club_detail_url %} {% url 'member:club_detail' club.pk as club_detail_url %}
<a class="btn btn-primary btn-sm my-1" href="{{ club_detail_url }}">{% trans 'View Profile' %}</a> {%if request.path_info != club_detail_url %}
{% endif %} </div> <a class="btn btn-primary btn-sm my-1" href="{{ club_detail_url }}">{% trans 'View Profile' %}</a>
{% endif %}
</div>
{% endif %}
</div> </div>

View File

@ -8,44 +8,15 @@
<h2>{% trans "Sign up" %}</h2> <h2>{% trans "Sign up" %}</h2>
<div class="alert alert-warning"> <div class="alert alert-warning">
{% blocktrans %} {% blocktrans %}If you already signed up, your registration is taken into account. The BDE must validate your account before your can log in. You have to go to the Kfet and pay the registration fee. You must also validate your email address by following the link you received.{% endblocktrans %}
If you already signed up, your registration is taken into account. The BDE must validate your account before
your can log in. You have to go to the Kfet and pay the registration fee. You must also validate your email
address by following the link you received. If you forgot to register to the WEI, then you can pre-register
to the WEI after your account get validated, so please go to the Kfet.
{% endblocktrans %}
</div> </div>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{{ form|crispy }} {{ form|crispy }}
{{ profile_form|crispy }} {{ profile_form|crispy }}
{{ wei_registration_form|crispy }}
<div id="wei_form_div" class="d-none">
{{ wei_form|crispy }}
</div>
<button class="btn btn-success" type="submit"> <button class="btn btn-success" type="submit">
{% trans "Sign up" %} {% trans "Sign up" %}
</button> </button>
</form> </form>
{% endblock %} {% endblock %}
{% block extrajavascript %}
<script>
$("#id_wei_registration").change(function () {
if ($(this).is(":checked")) {
$("#wei_form_div").removeClass('d-none');
$("#wei_form_div .form-control").removeAttr('disabled');
}
else {
$("#wei_form_div").addClass('d-none');
$("#wei_form_div .form-control").attr('disabled', true);
}
});
if ($("#id_wei_registration").is(":checked")) {
$("#wei_form_div").removeClass('d-none');
$("#wei_form_div .form-control").removeAttr('disabled');
}
</script>
{% endblock %}

View File

@ -12,6 +12,9 @@
<a href="{% url "treasury:remittance_list" %}" class="btn btn-sm btn-outline-primary"> <a href="{% url "treasury:remittance_list" %}" class="btn btn-sm btn-outline-primary">
{% trans "Remittance" %}s {% trans "Remittance" %}s
</a> </a>
<a href="{% url "treasury:soge_credits" %}" class="btn btn-sm btn-outline-primary">
{% trans "Société générale credits" %}
</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -12,6 +12,9 @@
<a href="#" class="btn btn-sm btn-outline-primary active"> <a href="#" class="btn btn-sm btn-outline-primary active">
{% trans "Remittance" %}s {% trans "Remittance" %}s
</a> </a>
<a href="{% url "treasury:soge_credits" %}" class="btn btn-sm btn-outline-primary">
{% trans "Société générale credits" %}
</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,52 @@
{% extends "base.html" %}
{% load static %}
{% load i18n %}
{% load pretty_money %}
{% block content %}
<div class="card bg-light shadow">
<div class="card-header text-center">
<h4>{% trans "Credit from the Société générale" %}</h4>
</div>
<div class="card-body">
<dl class="row">
<dt class="col-xl-6 text-right">{% trans 'user'|capfirst %}</dt>
<dd class="col-xl-6"><a href="{% url 'member:user_detail' pk=object.user.pk %}">{{ object.user }}</a></dd>
<dt class="col-xl-6 text-right">{% trans 'transactions'|capfirst %}</dt>
<dd class="col-xl-6">
{% for transaction in object.transactions.all %}
{{ transaction.membership.club }} ({{ transaction.amount|pretty_money }})<br>
{% endfor %}
</dd>
<dt class="col-xl-6 text-right">{% trans 'total amount'|capfirst %}</dt>
<dd class="col-xl-6">{{ object.amount|pretty_money }}</dd>
</dl>
</div>
<div class="alert alert-warning">
{% trans 'Warning: Validating this credit implies that all membership transactions will be validated.' %}
{% trans 'If you delete this credit, there all membership transactions will be also validated, but no credit will be operated.' %}
{% trans "If this credit is validated, then the user won't be able to ask for a credit from the Société générale." %}
{% trans 'If you think there is an error, please contact the "respos info".' %}
</div>
<div class="card-footer text-center" id="buttons_footer">
{% if object.valid %}
<div class="alert alert-danger">
{% trans "This credit is already validated." %}
</div>
{% else %}
<form method="post">
{% csrf_token %}
<div class="btn-group btn-block">
<button name="validate" class="btn btn-success">{% trans "Validate" %}</button>
<button name="delete" class="btn btn-danger">{% trans "Delete" %}</button>
</div>
</form>
{% endif %}
<a href="{% url 'treasury:soge_credits' %}"><button class="btn btn-primary btn-block">{% trans "Return to credit list" %}</button></a>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,66 @@
{% extends "base.html" %}
{% load render_table from django_tables2 %}
{% load i18n %}
{% block content %}
<div class="row">
<div class="col-xl-12">
<div class="btn-group btn-group-toggle" style="width: 100%; padding: 0 0 2em 0" data-toggle="buttons">
<a href="{% url "treasury:invoice_list" %}" class="btn btn-sm btn-outline-primary">
{% trans "Invoice" %}s
</a>
<a href="{% url "treasury:remittance_list" %}" class="btn btn-sm btn-outline-primary">
{% trans "Remittance" %}s
</a>
<a href="#" class="btn btn-sm btn-outline-primary active">
{% trans "Société générale credits" %}
</a>
</div>
</div>
</div>
<input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note ...">
<div class="form-check">
<label for="invalid_only" class="form-check-label">
<input id="invalid_only" name="invalid_only" type="checkbox" class="checkboxinput form-check-input">
{% trans "Filter with unvalidated credits only" %}
</label>
</div>
<hr>
<div id="credits_table">
{% if table.data %}
{% render_table table %}
{% else %}
<div class="alert alert-warning">
{% trans "There is no matched user that have asked for a Société générale credit." %}
</div>
{% endif %}
</div>
{% endblock %}
{% block extrajavascript %}
<script type="text/javascript">
$(document).ready(function() {
let old_pattern = null;
let searchbar_obj = $("#searchbar");
let invalid_only_obj = $("#invalid_only");
function reloadTable() {
let pattern = searchbar_obj.val();
if (pattern === old_pattern || pattern === "")
return;
$("#credits_table").load(location.pathname + "?search=" + pattern.replace(" ", "%20") + (invalid_only_obj.is(':checked') ? "&valid=false" : "") + " #credits_table");
$(".table-row").click(function() {
window.document.location = $(this).data("href");
});
}
searchbar_obj.keyup(reloadTable);
invalid_only_obj.change(reloadTable);
});
</script>
{% endblock %}