Add option to add a posteriori a Sogé credit

Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
This commit is contained in:
Yohann D'ANELLO 2021-09-06 00:47:11 +02:00
parent b646f549d6
commit 4e1ba1447a
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
6 changed files with 213 additions and 126 deletions

View File

@ -1,6 +1,6 @@
# Copyright (C) 2018-2021 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from django.db import transaction
from rest_framework import serializers
from note.api.serializers import SpecialTransactionSerializer
@ -68,6 +68,14 @@ class SogeCreditSerializer(serializers.ModelSerializer):
The djangorestframework plugin will analyse the model `SogeCredit` and parse all fields in the API.
"""
@transaction.atomic
def save(self, **kwargs):
# Update soge transactions after creating a credit
instance = super().save(**kwargs)
instance.update_transactions()
instance.save()
return instance
class Meta:
model = SogeCredit
fields = '__all__'

View File

@ -4,11 +4,12 @@
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit
from django import forms
from django.contrib.auth.models import User
from django.db import transaction
from django.utils.translation import gettext_lazy as _
from note_kfet.inputs import AmountInput
from note_kfet.inputs import AmountInput, Autocomplete
from .models import Invoice, Product, Remittance, SpecialTransactionProxy
from .models import Invoice, Product, Remittance, SpecialTransactionProxy, SogeCredit
class InvoiceForm(forms.ModelForm):
@ -161,3 +162,19 @@ class LinkTransactionToRemittanceForm(forms.ModelForm):
class Meta:
model = SpecialTransactionProxy
fields = ('remittance', )
class SogeCreditForm(forms.ModelForm):
class Meta:
model = SogeCredit
fields = ('user', )
widgets = {
"user": Autocomplete(
User,
attrs={
'api_url': '/api/user/',
'name_field': 'username',
'placeholder': 'Nom ...',
},
),
}

View File

@ -289,6 +289,7 @@ class SogeCredit(models.Model):
transactions = models.ManyToManyField(
MembershipTransaction,
related_name="+",
blank=True,
verbose_name=_("membership transactions"),
)
@ -313,7 +314,7 @@ class SogeCredit(models.Model):
The Sogé credit may be created after the user already paid its memberships.
We query transactions and update the credit, if it is unvalid.
"""
if self.valid:
if self.valid or not self.pk:
return
bde = Club.objects.get(name="BDE")
@ -402,7 +403,8 @@ class SogeCredit(models.Model):
self.credit_transaction.amount = self.amount
self.credit_transaction._force_save = True
self.credit_transaction.save()
super().save(*args, **kwargs)
return super().save(*args, **kwargs)
def delete(self, **kwargs):
"""

View File

@ -3,6 +3,7 @@
SPDX-License-Identifier: GPL-3.0-or-later
{% endcomment %}
{% load render_table from django_tables2 %}
{% load crispy_forms_filters %}
{% load i18n %}
{% block content %}
@ -27,7 +28,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
{{ title }}
</h3>
<div class="card-body">
<input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note ...">
<div class="input-group">
<input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note ...">
<div class="input-group-append">
<button id="add_sogecredit" class="btn btn-success" data-toggle="modal" data-target="#add-sogecredit-modal">{% trans "Add" %}</button>
</div>
</div>
<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" checked>
@ -47,28 +53,65 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% endif %}
</div>
</div>
{# Popup to add new Soge credits manually if needed #}
<div class="modal fade" id="add-sogecredit-modal" tabindex="-1" role="dialog" aria-labelledby="addSogeCredit"
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="lockNote">{% trans "Add credit from the Société générale" %}</h5>
<button type="button" class="close btn-modal" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
{{ form|crispy }}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary btn-modal" data-dismiss="modal">{% trans "Close" %}</button>
<button type="button" class="btn btn-success btn-modal" data-dismiss="modal" onclick="addSogeCredit()">{% trans "Add" %}</button>
</div>
</div>
</div>
</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");
let old_pattern = null;
let searchbar_obj = $("#searchbar");
let invalid_only_obj = $("#invalid_only");
function reloadTable() {
let pattern = searchbar_obj.val();
function reloadTable() {
let pattern = searchbar_obj.val();
$("#credits_table").load(location.pathname + "?search=" + pattern.replace(" ", "%20") + (
invalid_only_obj.is(':checked') ? "" : "&valid=1") + " #credits_table");
$("#credits_table").load(location.pathname + "?search=" + pattern.replace(" ", "%20") + (
invalid_only_obj.is(':checked') ? "" : "&valid=1") + " #credits_table");
$(".table-row").click(function () {
window.document.location = $(this).data("href");
});
}
$(".table-row").click(function () {
window.document.location = $(this).data("href");
});
}
searchbar_obj.keyup(reloadTable);
invalid_only_obj.change(reloadTable);
});
searchbar_obj.keyup(reloadTable);
invalid_only_obj.change(reloadTable);
function addSogeCredit() {
let user_pk = $('#id_user_pk').val()
if (!user_pk)
return
$.post('/api/treasury/soge_credit/?format=json', {
csrfmiddlewaretoken: CSRF_TOKEN,
user: user_pk,
}).done(function() {
addMsg("{% trans "Credit successfully registered" %}", 'success', 10000)
reloadTable()
}).fail(function (xhr) {
errMsg(xhr.responseJSON, 30000)
reloadTable()
})
}
</script>
{% endblock %}

View File

@ -25,7 +25,8 @@ from note_kfet.settings.base import BASE_DIR
from permission.backends import PermissionBackend
from permission.views import ProtectQuerysetMixin, ProtectedCreateView
from .forms import InvoiceForm, ProductFormSet, ProductFormSetHelper, RemittanceForm, LinkTransactionToRemittanceForm
from .forms import InvoiceForm, ProductFormSet, ProductFormSetHelper, RemittanceForm, \
LinkTransactionToRemittanceForm, SogeCreditForm
from .models import Invoice, Product, Remittance, SpecialTransactionProxy, SogeCredit
from .tables import InvoiceTable, RemittanceTable, SpecialTransactionTable, SogeCreditTable
@ -433,6 +434,11 @@ class SogeCreditListView(LoginRequiredMixin, ProtectQuerysetMixin, SingleTableVi
return qs
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['form'] = SogeCreditForm(self.request.POST or None)
return context
class SogeCreditManageView(LoginRequiredMixin, ProtectQuerysetMixin, BaseFormView, DetailView):
"""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-15 21:17+0200\n"
"POT-Creation-Date: 2021-09-06 00:45+0200\n"
"PO-Revision-Date: 2020-11-16 20:02+0000\n"
"Last-Translator: Yohann D'ANELLO <ynerant@crans.org>\n"
"Language-Team: French <http://translate.ynerant.fr/projects/nk20/nk20/fr/>\n"
@ -111,7 +111,7 @@ msgid "type"
msgstr "type"
#: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:305
#: apps/note/models/notes.py:148 apps/treasury/models.py:283
#: apps/note/models/notes.py:148 apps/treasury/models.py:286
#: apps/wei/models.py:165 apps/wei/templates/wei/survey.html:15
msgid "user"
msgstr "utilisateur"
@ -251,19 +251,19 @@ msgstr "Entré le "
msgid "remove"
msgstr "supprimer"
#: apps/activity/tables.py:80 apps/note/forms.py:68 apps/treasury/models.py:197
#: apps/activity/tables.py:80 apps/note/forms.py:68 apps/treasury/models.py:200
msgid "Type"
msgstr "Type"
#: apps/activity/tables.py:82 apps/member/forms.py:186
#: apps/registration/forms.py:90 apps/treasury/forms.py:130
#: apps/registration/forms.py:90 apps/treasury/forms.py:131
#: apps/wei/forms/registration.py:96
msgid "Last name"
msgstr "Nom de famille"
#: apps/activity/tables.py:84 apps/member/forms.py:191
#: apps/note/templates/note/transaction_form.html:134
#: apps/registration/forms.py:95 apps/treasury/forms.py:132
#: apps/registration/forms.py:95 apps/treasury/forms.py:133
#: apps/wei/forms/registration.py:101
msgid "First name"
msgstr "Prénom"
@ -327,7 +327,7 @@ msgstr "Entrée effectuée !"
#: apps/member/templates/member/add_members.html:46
#: apps/member/templates/member/club_form.html:16
#: apps/note/templates/note/transactiontemplate_form.html:18
#: apps/treasury/forms.py:88 apps/treasury/forms.py:142
#: apps/treasury/forms.py:89 apps/treasury/forms.py:143
#: apps/treasury/templates/treasury/invoice_form.html:74
#: apps/wei/templates/wei/bus_form.html:17
#: apps/wei/templates/wei/busteam_form.html:17
@ -540,8 +540,8 @@ msgstr "Taille maximale : 2 Mo"
msgid "This image cannot be loaded."
msgstr "Cette image ne peut pas être chargée."
#: apps/member/forms.py:141 apps/member/views.py:100
#: apps/registration/forms.py:33 apps/registration/views.py:254
#: apps/member/forms.py:141 apps/member/views.py:102
#: apps/registration/forms.py:33 apps/registration/views.py:259
msgid "An alias with a similar name already exists."
msgstr "Un alias avec un nom similaire existe déjà."
@ -573,7 +573,7 @@ msgid "Credit amount"
msgstr "Montant à créditer"
#: apps/member/forms.py:196 apps/note/templates/note/transaction_form.html:140
#: apps/registration/forms.py:100 apps/treasury/forms.py:134
#: apps/registration/forms.py:100 apps/treasury/forms.py:135
#: apps/wei/forms/registration.py:106
msgid "Bank"
msgstr "Banque"
@ -835,7 +835,7 @@ msgstr "Le rôle {role} ne s'applique pas au club {club}."
msgid "User is already a member of the club"
msgstr "L'utilisateur est déjà membre du club"
#: apps/member/models.py:443 apps/member/views.py:661
#: apps/member/models.py:443 apps/member/views.py:660
msgid "User is not a member of the parent club"
msgstr "L'utilisateur n'est pas membre du club parent"
@ -944,7 +944,8 @@ msgstr ""
"déverrouiller lui-même."
#: apps/member/templates/member/base.html:110
#: apps/member/templates/member/base.html:137 apps/treasury/forms.py:90
#: apps/member/templates/member/base.html:137 apps/treasury/forms.py:91
#: apps/treasury/templates/treasury/sogecredit_list.html:72
msgid "Close"
msgstr "Fermer"
@ -968,6 +969,8 @@ msgstr "Alias de la note"
#: apps/member/templates/member/club_alias.html:20
#: apps/member/templates/member/profile_alias.html:19
#: apps/treasury/tables.py:99
#: apps/treasury/templates/treasury/sogecredit_list.html:34
#: apps/treasury/templates/treasury/sogecredit_list.html:73
msgid "Add"
msgstr "Ajouter"
@ -1133,7 +1136,7 @@ msgstr "Inscriptions"
msgid "This address must be valid."
msgstr "Cette adresse doit être valide."
#: apps/member/views.py:138
#: apps/member/views.py:139
msgid "Profile detail"
msgstr "Détails de l'utilisateur"
@ -1169,7 +1172,7 @@ msgstr "Modifier le club"
msgid "Add new member to the club"
msgstr "Ajouter un nouveau membre au club"
#: apps/member/views.py:642 apps/wei/views.py:917
#: apps/member/views.py:642 apps/wei/views.py:932
msgid ""
"This user don't have enough money to join this club, and can't have a "
"negative balance."
@ -1177,19 +1180,19 @@ msgstr ""
"Cet utilisateur n'a pas assez d'argent pour rejoindre ce club et ne peut pas "
"avoir un solde négatif."
#: apps/member/views.py:665
#: apps/member/views.py:664
msgid "The membership must start after {:%m-%d-%Y}."
msgstr "L'adhésion doit commencer après le {:%d/%m/%Y}."
#: apps/member/views.py:670
#: apps/member/views.py:669
msgid "The membership must begin before {:%m-%d-%Y}."
msgstr "L'adhésion doit commencer avant le {:%d/%m/%Y}."
#: apps/member/views.py:816
#: apps/member/views.py:815
msgid "Manage roles of an user in the club"
msgstr "Gérer les rôles d'un utilisateur dans le club"
#: apps/member/views.py:841
#: apps/member/views.py:840
msgid "Members of the club"
msgstr "Membres du club"
@ -1475,8 +1478,8 @@ msgstr ""
"mode de paiement et un utilisateur ou un club"
#: apps/note/models/transactions.py:355 apps/note/models/transactions.py:358
#: apps/note/models/transactions.py:361 apps/wei/views.py:922
#: apps/wei/views.py:926
#: apps/note/models/transactions.py:361 apps/wei/views.py:937
#: apps/wei/views.py:941
msgid "This field is required."
msgstr "Ce champ est requis."
@ -1492,7 +1495,7 @@ msgstr "Transactions de crédit/retrait"
msgid "membership transaction"
msgstr "transaction d'adhésion"
#: apps/note/models/transactions.py:385 apps/treasury/models.py:289
#: apps/note/models/transactions.py:385 apps/treasury/models.py:293
msgid "membership transactions"
msgstr "transactions d'adhésion"
@ -1599,14 +1602,14 @@ msgid "Action"
msgstr "Action"
#: apps/note/templates/note/transaction_form.html:112
#: apps/treasury/forms.py:136 apps/treasury/tables.py:67
#: apps/treasury/forms.py:137 apps/treasury/tables.py:67
#: apps/treasury/tables.py:132
#: apps/treasury/templates/treasury/remittance_form.html:23
msgid "Amount"
msgstr "Montant"
#: apps/note/templates/note/transaction_form.html:128
#: apps/treasury/models.py:52
#: apps/treasury/models.py:55
msgid "Name"
msgstr "Nom"
@ -2064,18 +2067,18 @@ msgstr "Utilisateurs en attente d'inscription"
msgid "Registration detail"
msgstr "Détails de l'inscription"
#: apps/registration/views.py:278
#: apps/registration/views.py:279
msgid "You must join the BDE."
msgstr "Vous devez adhérer au BDE."
#: apps/registration/views.py:302
#: apps/registration/views.py:303
msgid ""
"The entered amount is not enough for the memberships, should be at least {}"
msgstr ""
"Le montant crédité est trop faible pour adhérer, il doit être au minimum de "
"{}"
#: apps/registration/views.py:383
#: apps/registration/views.py:384
msgid "Invalidate pre-registration"
msgstr "Invalider l'inscription"
@ -2083,145 +2086,145 @@ msgstr "Invalider l'inscription"
msgid "Treasury"
msgstr "Trésorerie"
#: apps/treasury/forms.py:25 apps/treasury/models.py:91
#: apps/treasury/forms.py:26 apps/treasury/models.py:94
#: apps/treasury/templates/treasury/invoice_form.html:22
msgid "This invoice is locked and can no longer be edited."
msgstr "Cette facture est verrouillée et ne peut plus être éditée."
#: apps/treasury/forms.py:99
#: apps/treasury/forms.py:100
msgid "Remittance is already closed."
msgstr "La remise est déjà fermée."
#: apps/treasury/forms.py:104
#: apps/treasury/forms.py:105
msgid "You can't change the type of the remittance."
msgstr "Vous ne pouvez pas changer le type de la remise."
#: apps/treasury/forms.py:124 apps/treasury/models.py:265
#: apps/treasury/forms.py:125 apps/treasury/models.py:268
#: apps/treasury/tables.py:97 apps/treasury/tables.py:105
#: apps/treasury/templates/treasury/invoice_list.html:16
#: apps/treasury/templates/treasury/remittance_list.html:16
#: apps/treasury/templates/treasury/sogecredit_list.html:16
#: apps/treasury/templates/treasury/sogecredit_list.html:17
msgid "Remittance"
msgstr "Remise"
#: apps/treasury/forms.py:125
#: apps/treasury/forms.py:126
msgid "No attached remittance"
msgstr "Pas de remise associée"
#: apps/treasury/models.py:24
#: apps/treasury/models.py:27
msgid "Invoice identifier"
msgstr "Numéro de facture"
#: apps/treasury/models.py:38
#: apps/treasury/models.py:41
msgid "BDE"
msgstr "BDE"
#: apps/treasury/models.py:43
#: apps/treasury/models.py:46
msgid "Object"
msgstr "Objet"
#: apps/treasury/models.py:47
#: apps/treasury/models.py:50
msgid "Description"
msgstr "Description"
#: apps/treasury/models.py:56
#: apps/treasury/models.py:59
msgid "Address"
msgstr "Adresse"
#: apps/treasury/models.py:61 apps/treasury/models.py:191
#: apps/treasury/models.py:64 apps/treasury/models.py:194
msgid "Date"
msgstr "Date"
#: apps/treasury/models.py:65
#: apps/treasury/models.py:68
msgid "Acquitted"
msgstr "Acquittée"
#: apps/treasury/models.py:70
#: apps/treasury/models.py:73
msgid "Locked"
msgstr "Verrouillée"
#: apps/treasury/models.py:71
#: apps/treasury/models.py:74
msgid "An invoice can't be edited when it is locked."
msgstr "Une facture ne peut plus être modifiée si elle est verrouillée."
#: apps/treasury/models.py:77
#: apps/treasury/models.py:80
msgid "tex source"
msgstr "fichier TeX source"
#: apps/treasury/models.py:111 apps/treasury/models.py:127
#: apps/treasury/models.py:114 apps/treasury/models.py:130
msgid "invoice"
msgstr "facture"
#: apps/treasury/models.py:112
#: apps/treasury/models.py:115
msgid "invoices"
msgstr "factures"
#: apps/treasury/models.py:115
#: apps/treasury/models.py:118
#, python-brace-format
msgid "Invoice #{id}"
msgstr "Facture n°{id}"
#: apps/treasury/models.py:132
#: apps/treasury/models.py:135
msgid "Designation"
msgstr "Désignation"
#: apps/treasury/models.py:138
#: apps/treasury/models.py:141
msgid "Quantity"
msgstr "Quantité"
#: apps/treasury/models.py:143
#: apps/treasury/models.py:146
msgid "Unit price"
msgstr "Prix unitaire"
#: apps/treasury/models.py:159
#: apps/treasury/models.py:162
msgid "product"
msgstr "produit"
#: apps/treasury/models.py:160
#: apps/treasury/models.py:163
msgid "products"
msgstr "produits"
#: apps/treasury/models.py:180
#: apps/treasury/models.py:183
msgid "remittance type"
msgstr "type de remise"
#: apps/treasury/models.py:181
#: apps/treasury/models.py:184
msgid "remittance types"
msgstr "types de remises"
#: apps/treasury/models.py:202
#: apps/treasury/models.py:205
msgid "Comment"
msgstr "Commentaire"
#: apps/treasury/models.py:207
#: apps/treasury/models.py:210
msgid "Closed"
msgstr "Fermée"
#: apps/treasury/models.py:211
#: apps/treasury/models.py:214
msgid "remittance"
msgstr "remise"
#: apps/treasury/models.py:212
#: apps/treasury/models.py:215
msgid "remittances"
msgstr "remises"
#: apps/treasury/models.py:245
#: apps/treasury/models.py:248
msgid "Remittance #{:d}: {}"
msgstr "Remise n°{:d} : {}"
#: apps/treasury/models.py:269
#: apps/treasury/models.py:272
msgid "special transaction proxy"
msgstr "proxy de transaction spéciale"
#: apps/treasury/models.py:270
#: apps/treasury/models.py:273
msgid "special transaction proxies"
msgstr "proxys de transactions spéciales"
#: apps/treasury/models.py:295
#: apps/treasury/models.py:299
msgid "credit transaction"
msgstr "transaction de crédit"
#: apps/treasury/models.py:379
#: apps/treasury/models.py:418
msgid ""
"This user doesn't have enough money to pay the memberships with its note. "
"Please ask her/him to credit the note before invalidating this credit."
@ -2229,16 +2232,16 @@ msgstr ""
"Cet utilisateur n'a pas assez d'argent pour payer les adhésions avec sa "
"note. Merci de lui demander de recharger sa note avant d'invalider ce crédit."
#: apps/treasury/models.py:399
#: apps/treasury/models.py:438
#: apps/treasury/templates/treasury/sogecredit_detail.html:10
msgid "Credit from the Société générale"
msgstr "Crédit de la Société générale"
#: apps/treasury/models.py:400
#: apps/treasury/models.py:439
msgid "Credits from the Société générale"
msgstr "Crédits de la Société générale"
#: apps/treasury/models.py:403
#: apps/treasury/models.py:442
#, python-brace-format
msgid "Soge credit for {user}"
msgstr "Crédit de la société générale pour l'utilisateur {user}"
@ -2250,7 +2253,7 @@ msgstr "Facture n°{:d}"
#: apps/treasury/tables.py:25
#: apps/treasury/templates/treasury/invoice_list.html:13
#: apps/treasury/templates/treasury/remittance_list.html:13
#: apps/treasury/templates/treasury/sogecredit_list.html:13
#: apps/treasury/templates/treasury/sogecredit_list.html:14
msgid "Invoice"
msgstr "Facture"
@ -2267,12 +2270,12 @@ msgid "Yes"
msgstr "Oui"
#: apps/treasury/templates/treasury/invoice_confirm_delete.html:10
#: apps/treasury/views.py:179
#: apps/treasury/views.py:180
msgid "Delete invoice"
msgstr "Supprimer la facture"
#: apps/treasury/templates/treasury/invoice_confirm_delete.html:15
#: apps/treasury/views.py:183
#: apps/treasury/views.py:184
msgid "This invoice is locked and can't be deleted."
msgstr "Cette facture est verrouillée et ne peut pas être supprimée."
@ -2306,7 +2309,7 @@ msgstr "Retirer produit"
#: apps/treasury/templates/treasury/invoice_list.html:19
#: apps/treasury/templates/treasury/remittance_list.html:19
#: apps/treasury/templates/treasury/sogecredit_list.html:19
#: apps/treasury/templates/treasury/sogecredit_list.html:20
msgid "Société générale credits"
msgstr "Crédits de la Société générale"
@ -2426,54 +2429,62 @@ msgstr "Valider"
msgid "Return to credit list"
msgstr "Retour à la liste des crédits"
#: apps/treasury/templates/treasury/sogecredit_list.html:34
#: apps/treasury/templates/treasury/sogecredit_list.html:40
msgid "Filter with unvalidated credits only"
msgstr "Filtrer avec uniquement les crédits non valides"
#: apps/treasury/templates/treasury/sogecredit_list.html:44
#: apps/treasury/templates/treasury/sogecredit_list.html:50
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."
#: apps/treasury/views.py:39
#: apps/treasury/templates/treasury/sogecredit_list.html:63
msgid "Add credit from the Société générale"
msgstr "Ajouter un crédit de la Société générale"
#: apps/treasury/templates/treasury/sogecredit_list.html:109
msgid "Credit successfully registered"
msgstr "Le crédit a bien été enregistré"
#: apps/treasury/views.py:40
msgid "Create new invoice"
msgstr "Créer une nouvelle facture"
#: apps/treasury/views.py:96
#: apps/treasury/views.py:97
msgid "Invoices list"
msgstr "Liste des factures"
#: apps/treasury/views.py:111 apps/treasury/views.py:285
#: apps/treasury/views.py:411
#: apps/treasury/views.py:112 apps/treasury/views.py:286
#: apps/treasury/views.py:412
msgid "You are not able to see the treasury interface."
msgstr "Vous n'êtes pas autorisé à voir l'interface de trésorerie."
#: apps/treasury/views.py:121
#: apps/treasury/views.py:122
msgid "Update an invoice"
msgstr "Modifier la facture"
#: apps/treasury/views.py:246
#: apps/treasury/views.py:247
msgid "Create a new remittance"
msgstr "Créer une nouvelle remise"
#: apps/treasury/views.py:273
#: apps/treasury/views.py:274
msgid "Remittances list"
msgstr "Liste des remises"
#: apps/treasury/views.py:336
#: apps/treasury/views.py:337
msgid "Update a remittance"
msgstr "Modifier la remise"
#: apps/treasury/views.py:359
#: apps/treasury/views.py:360
msgid "Attach a transaction to a remittance"
msgstr "Joindre une transaction à une remise"
#: apps/treasury/views.py:403
#: apps/treasury/views.py:404
msgid "List of credits from the Société générale"
msgstr "Liste des crédits de la Société générale"
#: apps/treasury/views.py:443
#: apps/treasury/views.py:449
msgid "Manage credits from the Société générale"
msgstr "Gérer les crédits de la Société générale"
@ -2713,11 +2724,11 @@ msgstr "Prix du WEI (étudiants)"
msgid "WEI list"
msgstr "Liste des WEI"
#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:510
#: apps/wei/templates/wei/base.html:81 apps/wei/views.py:517
msgid "Register 1A"
msgstr "Inscrire un 1A"
#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:578
#: apps/wei/templates/wei/base.html:85 apps/wei/views.py:592
msgid "Register 2A+"
msgstr "Inscrire un 2A+"
@ -2746,8 +2757,8 @@ msgstr "Télécharger au format PDF"
#: apps/wei/templates/wei/survey.html:11
#: apps/wei/templates/wei/survey_closed.html:11
#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:973
#: apps/wei/views.py:1028 apps/wei/views.py:1038
#: apps/wei/templates/wei/survey_end.html:11 apps/wei/views.py:988
#: apps/wei/views.py:1043 apps/wei/views.py:1053
msgid "Survey WEI"
msgstr "Questionnaire WEI"
@ -2985,11 +2996,11 @@ msgstr "Gérer l'équipe WEI"
msgid "Register first year student to the WEI"
msgstr "Inscrire un 1A au WEI"
#: apps/wei/views.py:532 apps/wei/views.py:613
#: apps/wei/views.py:539 apps/wei/views.py:627
msgid "This user is already registered to this WEI."
msgstr "Cette personne est déjà inscrite au WEI."
#: apps/wei/views.py:537
#: apps/wei/views.py:544
msgid ""
"This user can't be in her/his first year since he/she has already "
"participated to a WEI."
@ -2997,27 +3008,27 @@ msgstr ""
"Cet utilisateur ne peut pas être en première année puisqu'il a déjà "
"participé à un WEI."
#: apps/wei/views.py:554
#: apps/wei/views.py:561
msgid "Register old student to the WEI"
msgstr "Inscrire un 2A+ au WEI"
#: apps/wei/views.py:597 apps/wei/views.py:686
#: apps/wei/views.py:611 apps/wei/views.py:700
msgid "You already opened an account in the Société générale."
msgstr "Vous avez déjà ouvert un compte auprès de la société générale."
#: apps/wei/views.py:643
#: apps/wei/views.py:657
msgid "Update WEI Registration"
msgstr "Modifier l'inscription WEI"
#: apps/wei/views.py:746
#: apps/wei/views.py:761
msgid "Delete WEI registration"
msgstr "Supprimer l'inscription WEI"
#: apps/wei/views.py:757
#: apps/wei/views.py:772
msgid "You don't have the right to delete this WEI registration."
msgstr "Vous n'avez pas la permission de supprimer cette inscription au WEI."
#: apps/wei/views.py:776
#: apps/wei/views.py:791
msgid "Validate WEI registration"
msgstr "Valider l'inscription WEI"
@ -3141,13 +3152,7 @@ msgstr ""
"Vous n'êtes plus adhérent BDE. Merci de réadhérer si vous voulez profiter de "
"la note."
#: note_kfet/templates/base.html:164
msgid "You are not a Kfet member, so you can't use your note account."
msgstr ""
"Vous n'êtes pas adhérent Kfet, vous ne pouvez par conséquent pas utiliser "
"votre compte note."
#: note_kfet/templates/base.html:170
#: note_kfet/templates/base.html:166
msgid ""
"Your e-mail address is not validated. Please check your mail inbox and click "
"on the validation link."
@ -3155,7 +3160,7 @@ msgstr ""
"Votre adresse e-mail n'est pas validée. Merci de vérifier votre boîte mail "
"et de cliquer sur le lien de validation."
#: note_kfet/templates/base.html:176
#: note_kfet/templates/base.html:172
msgid ""
"You declared that you opened a bank account in the Société générale. The "
"bank did not validate the creation of the account to the BDE, so the "
@ -3170,7 +3175,7 @@ msgstr ""
"durer quelques jours. Merci de vous assurer de bien aller au bout de vos "
"démarches."
#: note_kfet/templates/base.html:199
#: note_kfet/templates/base.html:195
msgid "Contact us"
msgstr "Nous contacter"
@ -3218,9 +3223,10 @@ msgid ""
"link templates and convert permissions to scope numbers with the permissions "
"that you want to grant for your application."
msgstr ""
"Vous pouvez aller <a href=\"%(scopes_url)s\">ici</a> pour générer des modèles "
"de liens d'autorisation et convertir des permissions en identifiants de "
"scopes avec les permissions que vous souhaitez attribuer à votre application."
"Vous pouvez aller <a href=\"%(scopes_url)s\">ici</a> pour générer des "
"modèles de liens d'autorisation et convertir des permissions en identifiants "
"de scopes avec les permissions que vous souhaitez attribuer à votre "
"application."
#: note_kfet/templates/oauth2_provider/application_detail.html:37
#: note_kfet/templates/oauth2_provider/application_form.html:23
@ -3400,3 +3406,8 @@ msgstr ""
"vous connecter. Vous devez vous rendre à la Kfet et payer les frais "
"d'adhésion. Vous devez également valider votre adresse email en suivant le "
"lien que vous avez reçu."
#~ msgid "You are not a Kfet member, so you can't use your note account."
#~ msgstr ""
#~ "Vous n'êtes pas adhérent Kfet, vous ne pouvez par conséquent pas utiliser "
#~ "votre compte note."