Don't delete Sogé credits if the user don't have enough money on its note, stay positive :)

This commit is contained in:
Yohann D'ANELLO 2020-04-22 03:57:19 +02:00
parent b23814aef0
commit 640f0f9a31
4 changed files with 212 additions and 146 deletions

View File

@ -240,7 +240,7 @@ class SogeCredit(models.Model):
@property @property
def amount(self): def amount(self):
return sum(transaction.quantity * transaction.amount for transaction in self.transactions.all()) return sum(transaction.total for transaction in self.transactions.all())
def invalidate(self): def invalidate(self):
""" """
@ -249,11 +249,14 @@ class SogeCredit(models.Model):
""" """
if self.valid: if self.valid:
self.credit_transaction.valid = False self.credit_transaction.valid = False
self.credit_transaction._force_save = True
self.credit_transaction.save() self.credit_transaction.save()
self.credit_transaction._force_delete = True
self.credit_transaction.delete() self.credit_transaction.delete()
self.credit_transaction = None self.credit_transaction = None
for transaction in self.transactions.all(): for transaction in self.transactions.all():
transaction.valid = False transaction.valid = False
transaction._force_save = True
transaction.save() transaction.save()
def validate(self, force=False): def validate(self, force=False):
@ -277,6 +280,7 @@ class SogeCredit(models.Model):
for transaction in self.transactions.all(): for transaction in self.transactions.all():
transaction.valid = True transaction.valid = True
transaction._force_save = True
transaction.created_at = datetime.now() transaction.created_at = datetime.now()
transaction.save() transaction.save()
@ -286,8 +290,15 @@ class SogeCredit(models.Model):
Treasurers must know what they do, this is difficult to undo this operation. Treasurers must know what they do, this is difficult to undo this operation.
With Great Power Comes Great Responsibility... With Great Power Comes Great Responsibility...
""" """
total_fee = sum(transaction.total for transaction in self.transactions.all() if not transaction.valid)
if self.user.note.balance < total_fee:
raise ValidationError(_("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."))
self.invalidate() self.invalidate()
for transaction in self.transactions.all(): for transaction in self.transactions.all():
transaction._force_save = True
transaction.valid = True transaction.valid = True
transaction.created_at = datetime.now() transaction.created_at = datetime.now()
transaction.save() transaction.save()

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-22 03:07+0200\n" "POT-Creation-Date: 2020-04-22 03:51+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"
@ -83,8 +83,8 @@ msgid "type"
msgstr "" msgstr ""
#: apps/activity/models.py:66 apps/logs/models.py:21 apps/member/models.py:225 #: apps/activity/models.py:66 apps/logs/models.py:21 apps/member/models.py:225
#: apps/note/models/notes.py:117 apps/treasury/models.py:220 #: apps/note/models/notes.py:117 apps/treasury/models.py:221
#: apps/wei/models.py:155 templates/treasury/sogecredit_detail.html:13 #: apps/wei/models.py:155 templates/treasury/sogecredit_detail.html:14
#: templates/wei/survey.html:16 #: templates/wei/survey.html:16
msgid "user" msgid "user"
msgstr "" msgstr ""
@ -181,7 +181,7 @@ msgstr ""
msgid "remove" msgid "remove"
msgstr "" msgstr ""
#: apps/activity/tables.py:75 apps/treasury/models.py:139 #: apps/activity/tables.py:75 apps/treasury/models.py:140
msgid "Type" msgid "Type"
msgstr "" msgstr ""
@ -351,7 +351,7 @@ msgstr ""
msgid "user profile" msgid "user profile"
msgstr "" msgstr ""
#: apps/member/models.py:105 templates/member/club_info.html:51 #: apps/member/models.py:105 templates/member/club_info.html:57
#: 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"
@ -369,15 +369,15 @@ msgstr ""
msgid "Uncheck if this club don't require memberships." msgid "Uncheck if this club don't require memberships."
msgstr "" msgstr ""
#: apps/member/models.py:127 templates/member/club_info.html:35 #: apps/member/models.py:127 templates/member/club_info.html:41
msgid "membership fee (paid students)" msgid "membership fee (paid students)"
msgstr "" msgstr ""
#: apps/member/models.py:132 templates/member/club_info.html:38 #: apps/member/models.py:132 templates/member/club_info.html:44
msgid "membership fee (unpaid students)" msgid "membership fee (unpaid students)"
msgstr "" msgstr ""
#: apps/member/models.py:138 templates/member/club_info.html:28 #: apps/member/models.py:138 templates/member/club_info.html:33
msgid "membership duration" msgid "membership duration"
msgstr "" msgstr ""
@ -385,7 +385,7 @@ msgstr ""
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:146 templates/member/club_info.html:22 #: apps/member/models.py:146 templates/member/club_info.html:23
msgid "membership start" msgid "membership start"
msgstr "" msgstr ""
@ -393,7 +393,7 @@ msgstr ""
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:154 templates/member/club_info.html:25 #: apps/member/models.py:154 templates/member/club_info.html:28
msgid "membership end" msgid "membership end"
msgstr "" msgstr ""
@ -432,11 +432,11 @@ msgstr ""
msgid "fee" msgid "fee"
msgstr "" msgstr ""
#: apps/member/models.py:268 apps/member/views.py:494 apps/wei/views.py:726 #: apps/member/models.py:268 apps/member/views.py:505 apps/wei/views.py:727
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:278 apps/member/views.py:503 #: apps/member/models.py:278 apps/member/views.py:514
msgid "User is already a member of the club" msgid "User is already a member of the club"
msgstr "" msgstr ""
@ -471,25 +471,25 @@ msgstr ""
msgid "An alias with a similar name already exists." msgid "An alias with a similar name already exists."
msgstr "" msgstr ""
#: apps/member/views.py:180 #: apps/member/views.py:181
msgid "Search user" msgid "Search user"
msgstr "" msgstr ""
#: apps/member/views.py:489 apps/wei/views.py:717 #: apps/member/views.py:500 apps/wei/views.py:718
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:507 #: apps/member/views.py:518
msgid "The membership must start after {:%m-%d-%Y}." msgid "The membership must start after {:%m-%d-%Y}."
msgstr "" msgstr ""
#: apps/member/views.py:512 #: apps/member/views.py:523
msgid "The membership must begin before {:%m-%d-%Y}." msgid "The membership must begin before {:%m-%d-%Y}."
msgstr "" msgstr ""
#: apps/member/views.py:522 apps/member/views.py:524 apps/member/views.py:526 #: apps/member/views.py:533 apps/member/views.py:535 apps/member/views.py:537
#: apps/registration/views.py:288 apps/registration/views.py:290 #: apps/registration/views.py:288 apps/registration/views.py:290
#: apps/registration/views.py:292 #: apps/registration/views.py:292
msgid "This field is required." msgid "This field is required."
@ -596,7 +596,7 @@ msgstr ""
msgid "alias" msgid "alias"
msgstr "" msgstr ""
#: apps/note/models/notes.py:211 templates/member/club_info.html:48 #: apps/note/models/notes.py:211 templates/member/club_info.html:54
#: templates/member/profile_info.html:36 templates/wei/weiclub_info.html:48 #: templates/member/profile_info.html:36 templates/wei/weiclub_info.html:48
msgid "aliases" msgid "aliases"
msgstr "" msgstr ""
@ -667,7 +667,7 @@ msgid "transaction"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:154 #: apps/note/models/transactions.py:154
#: templates/treasury/sogecredit_detail.html:16 #: templates/treasury/sogecredit_detail.html:22
msgid "transactions" msgid "transactions"
msgstr "" msgstr ""
@ -704,7 +704,7 @@ msgstr ""
msgid "membership transaction" msgid "membership transaction"
msgstr "" msgstr ""
#: apps/note/models/transactions.py:283 apps/treasury/models.py:226 #: apps/note/models/transactions.py:283 apps/treasury/models.py:227
msgid "membership transactions" msgid "membership transactions"
msgstr "" msgstr ""
@ -721,13 +721,13 @@ 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/treasury/sogecredit_detail.html:59
#: templates/wei/weiregistration_confirm_delete.html:32 #: templates/wei/weiregistration_confirm_delete.html:32
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
#: apps/note/tables.py:146 apps/wei/tables.py:42 apps/wei/tables.py:43 #: apps/note/tables.py:146 apps/wei/tables.py:42 apps/wei/tables.py:43
#: templates/member/club_info.html:60 templates/note/conso_form.html:121 #: templates/member/club_info.html:67 templates/note/conso_form.html:121
#: templates/wei/bus_tables.html:15 templates/wei/busteam_tables.html:15 #: templates/wei/bus_tables.html:15 templates/wei/busteam_tables.html:15
#: templates/wei/busteam_tables.html:33 templates/wei/weiclub_info.html:66 #: templates/wei/busteam_tables.html:33 templates/wei/weiclub_info.html:66
msgid "Edit" msgid "Edit"
@ -863,122 +863,128 @@ msgstr ""
msgid "Amount" msgid "Amount"
msgstr "" msgstr ""
#: apps/treasury/models.py:19 #: apps/treasury/models.py:20
msgid "Invoice identifier" msgid "Invoice identifier"
msgstr "" msgstr ""
#: apps/treasury/models.py:33 #: apps/treasury/models.py:34
msgid "BDE" msgid "BDE"
msgstr "" msgstr ""
#: apps/treasury/models.py:38 #: apps/treasury/models.py:39
msgid "Object" msgid "Object"
msgstr "" msgstr ""
#: apps/treasury/models.py:42 #: apps/treasury/models.py:43
msgid "Description" msgid "Description"
msgstr "" msgstr ""
#: apps/treasury/models.py:47 templates/note/transaction_form.html:91 #: apps/treasury/models.py:48 templates/note/transaction_form.html:91
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: apps/treasury/models.py:51 #: apps/treasury/models.py:52
msgid "Address" msgid "Address"
msgstr "" msgstr ""
#: apps/treasury/models.py:56 #: apps/treasury/models.py:57
msgid "Place" msgid "Place"
msgstr "" msgstr ""
#: apps/treasury/models.py:60 #: apps/treasury/models.py:61
msgid "Acquitted" msgid "Acquitted"
msgstr "" msgstr ""
#: apps/treasury/models.py:64 #: apps/treasury/models.py:65
msgid "invoice" msgid "invoice"
msgstr "" msgstr ""
#: apps/treasury/models.py:65 #: apps/treasury/models.py:66
msgid "invoices" msgid "invoices"
msgstr "" msgstr ""
#: apps/treasury/models.py:80 #: apps/treasury/models.py:81
msgid "Designation" msgid "Designation"
msgstr "" msgstr ""
#: apps/treasury/models.py:84 #: apps/treasury/models.py:85
msgid "Quantity" msgid "Quantity"
msgstr "" msgstr ""
#: apps/treasury/models.py:88 #: apps/treasury/models.py:89
msgid "Unit price" msgid "Unit price"
msgstr "" msgstr ""
#: apps/treasury/models.py:104 #: apps/treasury/models.py:105
msgid "product" msgid "product"
msgstr "" msgstr ""
#: apps/treasury/models.py:105 #: apps/treasury/models.py:106
msgid "products" msgid "products"
msgstr "" msgstr ""
#: apps/treasury/models.py:122 #: apps/treasury/models.py:123
msgid "remittance type" msgid "remittance type"
msgstr "" msgstr ""
#: apps/treasury/models.py:123 #: apps/treasury/models.py:124
msgid "remittance types" msgid "remittance types"
msgstr "" msgstr ""
#: apps/treasury/models.py:133 #: apps/treasury/models.py:134
msgid "Date" msgid "Date"
msgstr "" msgstr ""
#: apps/treasury/models.py:144 #: apps/treasury/models.py:145
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: apps/treasury/models.py:149 #: apps/treasury/models.py:150
msgid "Closed" msgid "Closed"
msgstr "" msgstr ""
#: apps/treasury/models.py:153 #: apps/treasury/models.py:154
msgid "remittance" msgid "remittance"
msgstr "" msgstr ""
#: apps/treasury/models.py:154 #: apps/treasury/models.py:155
msgid "remittances" msgid "remittances"
msgstr "" msgstr ""
#: apps/treasury/models.py:186 #: apps/treasury/models.py:187
msgid "Remittance #{:d}: {}" msgid "Remittance #{:d}: {}"
msgstr "" msgstr ""
#: apps/treasury/models.py:205 apps/treasury/tables.py:76 #: apps/treasury/models.py:206 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 #: templates/treasury/sogecredit_list.html:13
msgid "Remittance" msgid "Remittance"
msgstr "" msgstr ""
#: apps/treasury/models.py:209 #: apps/treasury/models.py:210
msgid "special transaction proxy" msgid "special transaction proxy"
msgstr "" msgstr ""
#: apps/treasury/models.py:210 #: apps/treasury/models.py:211
msgid "special transaction proxies" msgid "special transaction proxies"
msgstr "" msgstr ""
#: apps/treasury/models.py:232 #: apps/treasury/models.py:233
msgid "credit transaction" msgid "credit transaction"
msgstr "" msgstr ""
#: apps/treasury/models.py:294 templates/treasury/sogecredit_detail.html:9 #: apps/treasury/models.py:292
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."
msgstr ""
#: apps/treasury/models.py:303 templates/treasury/sogecredit_detail.html:10
msgid "Credit from the Société générale" msgid "Credit from the Société générale"
msgstr "" msgstr ""
#: apps/treasury/models.py:295 #: apps/treasury/models.py:304
msgid "Credits from the Société générale" msgid "Credits from the Société générale"
msgstr "" msgstr ""
@ -1212,7 +1218,7 @@ 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 #: templates/treasury/sogecredit_detail.html:57
msgid "Validate" msgid "Validate"
msgstr "" msgstr ""
@ -1221,41 +1227,41 @@ msgstr ""
msgid "Teams" msgid "Teams"
msgstr "" msgstr ""
#: apps/wei/views.py:165 #: apps/wei/views.py:166
msgid "Find WEI Membership" msgid "Find WEI Membership"
msgstr "" msgstr ""
#: apps/wei/views.py:200 #: apps/wei/views.py:201
msgid "Find WEI Registration" msgid "Find WEI Registration"
msgstr "" msgstr ""
#: apps/wei/views.py:409 templates/wei/weiclub_info.html:62 #: apps/wei/views.py:410 templates/wei/weiclub_info.html:62
msgid "Register 1A" msgid "Register 1A"
msgstr "" msgstr ""
#: apps/wei/views.py:430 apps/wei/views.py:498 #: apps/wei/views.py:431 apps/wei/views.py:499
msgid "This user is already registered to this WEI." msgid "This user is already registered to this WEI."
msgstr "" msgstr ""
#: apps/wei/views.py:435 #: apps/wei/views.py:436
msgid "" msgid ""
"This user can't be in her/his first year since he/she has already participed " "This user can't be in her/his first year since he/she has already participed "
"to a WEI." "to a WEI."
msgstr "" msgstr ""
#: apps/wei/views.py:463 templates/wei/weiclub_info.html:63 #: apps/wei/views.py:464 templates/wei/weiclub_info.html:63
msgid "Register 2A+" msgid "Register 2A+"
msgstr "" msgstr ""
#: apps/wei/views.py:481 apps/wei/views.py:564 #: apps/wei/views.py:482 apps/wei/views.py:565
msgid "You already opened an account in the Société générale." msgid "You already opened an account in the Société générale."
msgstr "" msgstr ""
#: apps/wei/views.py:721 #: apps/wei/views.py:722
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:790 apps/wei/views.py:810 apps/wei/views.py:820 #: apps/wei/views.py:791 apps/wei/views.py:811 apps/wei/views.py:821
#: 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"
@ -1422,24 +1428,25 @@ msgstr ""
msgid "Club Parent" msgid "Club Parent"
msgstr "" msgstr ""
#: templates/member/club_info.html:29 #: templates/member/club_info.html:34
msgid "days" msgid "days"
msgstr "" msgstr ""
#: templates/member/club_info.html:32 templates/wei/weiclub_info.html:27 #: templates/member/club_info.html:38 templates/wei/weiclub_info.html:27
msgid "membership fee" msgid "membership fee"
msgstr "" msgstr ""
#: templates/member/club_info.html:44 templates/member/profile_info.html:33 #: templates/member/club_info.html:50 templates/member/profile_info.html:33
#: templates/treasury/sogecredit_detail.html:18
#: templates/wei/weiclub_info.html:43 #: templates/wei/weiclub_info.html:43
msgid "balance" msgid "balance"
msgstr "" msgstr ""
#: templates/member/club_info.html:57 #: templates/member/club_info.html:64
msgid "Add member" msgid "Add member"
msgstr "" msgstr ""
#: templates/member/club_info.html:64 templates/member/profile_info.html:48 #: templates/member/club_info.html:71 templates/member/profile_info.html:48
msgid "View Profile" msgid "View Profile"
msgstr "" msgstr ""
@ -1854,37 +1861,47 @@ msgstr ""
msgid "Closed remittances" msgid "Closed remittances"
msgstr "" msgstr ""
#: templates/treasury/sogecredit_detail.html:23 #: templates/treasury/sogecredit_detail.html:29
msgid "total amount" msgid "total amount"
msgstr "" msgstr ""
#: templates/treasury/sogecredit_detail.html:29 #: templates/treasury/sogecredit_detail.html:35
msgid "" msgid ""
"Warning: Validating this credit implies that all membership transactions " "Warning: Validating this credit implies that all membership transactions "
"will be validated." "will be validated."
msgstr "" msgstr ""
#: templates/treasury/sogecredit_detail.html:30 #: templates/treasury/sogecredit_detail.html:36
msgid "" msgid ""
"If you delete this credit, there all membership transactions will be also " "If you delete this credit, there all membership transactions will be also "
"validated, but no credit will be operated." "validated, but no credit will be operated."
msgstr "" msgstr ""
#: templates/treasury/sogecredit_detail.html:31 #: templates/treasury/sogecredit_detail.html:37
msgid "" msgid ""
"If this credit is validated, then the user won't be able to ask for a credit " "If this credit is validated, then the user won't be able to ask for a credit "
"from the Société générale." "from the Société générale."
msgstr "" msgstr ""
#: templates/treasury/sogecredit_detail.html:32 #: templates/treasury/sogecredit_detail.html:38
msgid "If you think there is an error, please contact the \"respos info\"." msgid "If you think there is an error, please contact the \"respos info\"."
msgstr "" msgstr ""
#: templates/treasury/sogecredit_detail.html:38 #: templates/treasury/sogecredit_detail.html:44
msgid "This credit is already validated." msgid "This credit is already validated."
msgstr "" msgstr ""
#: templates/treasury/sogecredit_detail.html:49 #: templates/treasury/sogecredit_detail.html:49
msgid ""
"Warning: if you don't validate this credit, the note of the user doesn't "
"have enough money to pay its memberships."
msgstr ""
#: templates/treasury/sogecredit_detail.html:50
msgid "Please ask the user to credit its note before deleting this credit."
msgstr ""
#: templates/treasury/sogecredit_detail.html:64
msgid "Return to credit list" msgid "Return to credit list"
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-22 03:07+0200\n" "POT-Creation-Date: 2020-04-22 03:51+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"
@ -79,8 +79,8 @@ msgid "type"
msgstr "type" msgstr "type"
#: apps/activity/models.py:66 apps/logs/models.py:21 apps/member/models.py:225 #: apps/activity/models.py:66 apps/logs/models.py:21 apps/member/models.py:225
#: apps/note/models/notes.py:117 apps/treasury/models.py:220 #: apps/note/models/notes.py:117 apps/treasury/models.py:221
#: apps/wei/models.py:155 templates/treasury/sogecredit_detail.html:13 #: apps/wei/models.py:155 templates/treasury/sogecredit_detail.html:14
#: templates/wei/survey.html:16 #: templates/wei/survey.html:16
msgid "user" msgid "user"
msgstr "utilisateur" msgstr "utilisateur"
@ -177,7 +177,7 @@ msgstr "Entré le "
msgid "remove" msgid "remove"
msgstr "supprimer" msgstr "supprimer"
#: apps/activity/tables.py:75 apps/treasury/models.py:139 #: apps/activity/tables.py:75 apps/treasury/models.py:140
msgid "Type" msgid "Type"
msgstr "Type" msgstr "Type"
@ -347,7 +347,7 @@ msgstr "inscription valid"
msgid "user profile" msgid "user profile"
msgstr "profil utilisateur" msgstr "profil utilisateur"
#: apps/member/models.py:105 templates/member/club_info.html:51 #: apps/member/models.py:105 templates/member/club_info.html:57
#: 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"
@ -365,15 +365,15 @@ msgstr "nécessite des adhésions"
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:127 templates/member/club_info.html:35 #: apps/member/models.py:127 templates/member/club_info.html:41
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:132 templates/member/club_info.html:38 #: apps/member/models.py:132 templates/member/club_info.html:44
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:138 templates/member/club_info.html:28 #: apps/member/models.py:138 templates/member/club_info.html:33
msgid "membership duration" msgid "membership duration"
msgstr "durée de l'adhésion" msgstr "durée de l'adhésion"
@ -381,7 +381,7 @@ msgstr "durée de l'adhésion"
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:146 templates/member/club_info.html:22 #: apps/member/models.py:146 templates/member/club_info.html:23
msgid "membership start" msgid "membership start"
msgstr "début de l'adhésion" msgstr "début de l'adhésion"
@ -391,7 +391,7 @@ 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:154 templates/member/club_info.html:25 #: apps/member/models.py:154 templates/member/club_info.html:28
msgid "membership end" msgid "membership end"
msgstr "fin de l'adhésion" msgstr "fin de l'adhésion"
@ -432,11 +432,11 @@ msgstr "l'adhésion finit le"
msgid "fee" msgid "fee"
msgstr "cotisation" msgstr "cotisation"
#: apps/member/models.py:268 apps/member/views.py:494 apps/wei/views.py:726 #: apps/member/models.py:268 apps/member/views.py:505 apps/wei/views.py:727
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:278 apps/member/views.py:503 #: apps/member/models.py:278 apps/member/views.py:514
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"
@ -471,11 +471,11 @@ msgstr "Modifier le profil"
msgid "An alias with a similar name already exists." msgid "An alias with a similar name already exists."
msgstr "Un alias avec un nom similaire existe déjà." msgstr "Un alias avec un nom similaire existe déjà."
#: apps/member/views.py:180 #: apps/member/views.py:181
msgid "Search user" msgid "Search user"
msgstr "Chercher un utilisateur" msgstr "Chercher un utilisateur"
#: apps/member/views.py:489 apps/wei/views.py:717 #: apps/member/views.py:500 apps/wei/views.py:718
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."
@ -483,15 +483,15 @@ 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:507 #: apps/member/views.py:518
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:512 #: apps/member/views.py:523
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:522 apps/member/views.py:524 apps/member/views.py:526 #: apps/member/views.py:533 apps/member/views.py:535 apps/member/views.py:537
#: apps/registration/views.py:288 apps/registration/views.py:290 #: apps/registration/views.py:288 apps/registration/views.py:290
#: apps/registration/views.py:292 #: apps/registration/views.py:292
msgid "This field is required." msgid "This field is required."
@ -599,7 +599,7 @@ msgstr "Alias invalide"
msgid "alias" msgid "alias"
msgstr "alias" msgstr "alias"
#: apps/note/models/notes.py:211 templates/member/club_info.html:48 #: apps/note/models/notes.py:211 templates/member/club_info.html:54
#: templates/member/profile_info.html:36 templates/wei/weiclub_info.html:48 #: templates/member/profile_info.html:36 templates/wei/weiclub_info.html:48
msgid "aliases" msgid "aliases"
msgstr "alias" msgstr "alias"
@ -670,7 +670,7 @@ msgid "transaction"
msgstr "transaction" msgstr "transaction"
#: apps/note/models/transactions.py:154 #: apps/note/models/transactions.py:154
#: templates/treasury/sogecredit_detail.html:16 #: templates/treasury/sogecredit_detail.html:22
msgid "transactions" msgid "transactions"
msgstr "transactions" msgstr "transactions"
@ -707,7 +707,7 @@ msgstr "Débit"
msgid "membership transaction" msgid "membership transaction"
msgstr "Transaction d'adhésion" msgstr "Transaction d'adhésion"
#: apps/note/models/transactions.py:283 apps/treasury/models.py:226 #: apps/note/models/transactions.py:283 apps/treasury/models.py:227
msgid "membership transactions" msgid "membership transactions"
msgstr "Transactions d'adhésion" msgstr "Transactions d'adhésion"
@ -724,13 +724,13 @@ 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/treasury/sogecredit_detail.html:59
#: templates/wei/weiregistration_confirm_delete.html:32 #: templates/wei/weiregistration_confirm_delete.html:32
msgid "Delete" msgid "Delete"
msgstr "Supprimer" msgstr "Supprimer"
#: apps/note/tables.py:146 apps/wei/tables.py:42 apps/wei/tables.py:43 #: apps/note/tables.py:146 apps/wei/tables.py:42 apps/wei/tables.py:43
#: templates/member/club_info.html:60 templates/note/conso_form.html:121 #: templates/member/club_info.html:67 templates/note/conso_form.html:121
#: templates/wei/bus_tables.html:15 templates/wei/busteam_tables.html:15 #: templates/wei/bus_tables.html:15 templates/wei/busteam_tables.html:15
#: templates/wei/busteam_tables.html:33 templates/wei/weiclub_info.html:66 #: templates/wei/busteam_tables.html:33 templates/wei/weiclub_info.html:66
msgid "Edit" msgid "Edit"
@ -871,122 +871,130 @@ msgstr "Vous ne pouvez pas changer le type de la remise."
msgid "Amount" msgid "Amount"
msgstr "Montant" msgstr "Montant"
#: apps/treasury/models.py:19 #: apps/treasury/models.py:20
msgid "Invoice identifier" msgid "Invoice identifier"
msgstr "Numéro de facture" msgstr "Numéro de facture"
#: apps/treasury/models.py:33 #: apps/treasury/models.py:34
msgid "BDE" msgid "BDE"
msgstr "BDE" msgstr "BDE"
#: apps/treasury/models.py:38 #: apps/treasury/models.py:39
msgid "Object" msgid "Object"
msgstr "Objet" msgstr "Objet"
#: apps/treasury/models.py:42 #: apps/treasury/models.py:43
msgid "Description" msgid "Description"
msgstr "Description" msgstr "Description"
#: apps/treasury/models.py:47 templates/note/transaction_form.html:91 #: apps/treasury/models.py:48 templates/note/transaction_form.html:91
msgid "Name" msgid "Name"
msgstr "Nom" msgstr "Nom"
#: apps/treasury/models.py:51 #: apps/treasury/models.py:52
msgid "Address" msgid "Address"
msgstr "Adresse" msgstr "Adresse"
#: apps/treasury/models.py:56 #: apps/treasury/models.py:57
msgid "Place" msgid "Place"
msgstr "Lieu" msgstr "Lieu"
#: apps/treasury/models.py:60 #: apps/treasury/models.py:61
msgid "Acquitted" msgid "Acquitted"
msgstr "Acquittée" msgstr "Acquittée"
#: apps/treasury/models.py:64 #: apps/treasury/models.py:65
msgid "invoice" msgid "invoice"
msgstr "facture" msgstr "facture"
#: apps/treasury/models.py:65 #: apps/treasury/models.py:66
msgid "invoices" msgid "invoices"
msgstr "factures" msgstr "factures"
#: apps/treasury/models.py:80 #: apps/treasury/models.py:81
msgid "Designation" msgid "Designation"
msgstr "Désignation" msgstr "Désignation"
#: apps/treasury/models.py:84 #: apps/treasury/models.py:85
msgid "Quantity" msgid "Quantity"
msgstr "Quantité" msgstr "Quantité"
#: apps/treasury/models.py:88 #: apps/treasury/models.py:89
msgid "Unit price" msgid "Unit price"
msgstr "Prix unitaire" msgstr "Prix unitaire"
#: apps/treasury/models.py:104 #: apps/treasury/models.py:105
msgid "product" msgid "product"
msgstr "produit" msgstr "produit"
#: apps/treasury/models.py:105 #: apps/treasury/models.py:106
msgid "products" msgid "products"
msgstr "produits" msgstr "produits"
#: apps/treasury/models.py:122 #: apps/treasury/models.py:123
msgid "remittance type" msgid "remittance type"
msgstr "type de remise" msgstr "type de remise"
#: apps/treasury/models.py:123 #: apps/treasury/models.py:124
msgid "remittance types" msgid "remittance types"
msgstr "types de remises" msgstr "types de remises"
#: apps/treasury/models.py:133 #: apps/treasury/models.py:134
msgid "Date" msgid "Date"
msgstr "Date" msgstr "Date"
#: apps/treasury/models.py:144 #: apps/treasury/models.py:145
msgid "Comment" msgid "Comment"
msgstr "Commentaire" msgstr "Commentaire"
#: apps/treasury/models.py:149 #: apps/treasury/models.py:150
msgid "Closed" msgid "Closed"
msgstr "Fermée" msgstr "Fermée"
#: apps/treasury/models.py:153 #: apps/treasury/models.py:154
msgid "remittance" msgid "remittance"
msgstr "remise" msgstr "remise"
#: apps/treasury/models.py:154 #: apps/treasury/models.py:155
msgid "remittances" msgid "remittances"
msgstr "remises" msgstr "remises"
#: apps/treasury/models.py:186 #: apps/treasury/models.py:187
msgid "Remittance #{:d}: {}" msgid "Remittance #{:d}: {}"
msgstr "Remise n°{:d} : {}" msgstr "Remise n°{:d} : {}"
#: apps/treasury/models.py:205 apps/treasury/tables.py:76 #: apps/treasury/models.py:206 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 #: templates/treasury/sogecredit_list.html:13
msgid "Remittance" msgid "Remittance"
msgstr "Remise" msgstr "Remise"
#: apps/treasury/models.py:209 #: apps/treasury/models.py:210
msgid "special transaction proxy" msgid "special transaction proxy"
msgstr "Proxy de transaction spéciale" msgstr "Proxy de transaction spéciale"
#: apps/treasury/models.py:210 #: apps/treasury/models.py:211
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 #: apps/treasury/models.py:233
msgid "credit transaction" msgid "credit transaction"
msgstr "transaction de crédit" msgstr "transaction de crédit"
#: apps/treasury/models.py:294 templates/treasury/sogecredit_detail.html:9 #: apps/treasury/models.py:292
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."
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:303 templates/treasury/sogecredit_detail.html:10
msgid "Credit from the Société générale" msgid "Credit from the 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/treasury/models.py:295 #: apps/treasury/models.py:304
msgid "Credits from the Société générale" msgid "Credits from the Société générale"
msgstr "Crédits de la Société générale" msgstr "Crédits de la Société générale"
@ -1235,7 +1243,7 @@ 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 #: templates/treasury/sogecredit_detail.html:57
msgid "Validate" msgid "Validate"
msgstr "Valider" msgstr "Valider"
@ -1244,23 +1252,23 @@ msgstr "Valider"
msgid "Teams" msgid "Teams"
msgstr "Équipes" msgstr "Équipes"
#: apps/wei/views.py:165 #: apps/wei/views.py:166
msgid "Find WEI Membership" msgid "Find WEI Membership"
msgstr "Trouver une adhésion au WEI" msgstr "Trouver une adhésion au WEI"
#: apps/wei/views.py:200 #: apps/wei/views.py:201
msgid "Find WEI Registration" msgid "Find WEI Registration"
msgstr "Trouver une inscription au WEI" msgstr "Trouver une inscription au WEI"
#: apps/wei/views.py:409 templates/wei/weiclub_info.html:62 #: apps/wei/views.py:410 templates/wei/weiclub_info.html:62
msgid "Register 1A" msgid "Register 1A"
msgstr "Inscrire un 1A" msgstr "Inscrire un 1A"
#: apps/wei/views.py:430 apps/wei/views.py:498 #: apps/wei/views.py:431 apps/wei/views.py:499
msgid "This user is already registered to this WEI." msgid "This user is already registered to this WEI."
msgstr "Cette personne est déjà inscrite au WEI." msgstr "Cette personne est déjà inscrite au WEI."
#: apps/wei/views.py:435 #: apps/wei/views.py:436
msgid "" msgid ""
"This user can't be in her/his first year since he/she has already participed " "This user can't be in her/his first year since he/she has already participed "
"to a WEI." "to a WEI."
@ -1268,19 +1276,19 @@ msgstr ""
"Cet utilisateur ne peut pas être en première année puisqu'iel a déjà " "Cet utilisateur ne peut pas être en première année puisqu'iel a déjà "
"participé à un WEI." "participé à un WEI."
#: apps/wei/views.py:463 templates/wei/weiclub_info.html:63 #: apps/wei/views.py:464 templates/wei/weiclub_info.html:63
msgid "Register 2A+" msgid "Register 2A+"
msgstr "Inscrire un 2A+" msgstr "Inscrire un 2A+"
#: apps/wei/views.py:481 apps/wei/views.py:564 #: apps/wei/views.py:482 apps/wei/views.py:565
msgid "You already opened an account in the Société générale." 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." msgstr "Vous avez déjà ouvert un compte auprès de la société générale."
#: apps/wei/views.py:721 #: apps/wei/views.py:722
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:790 apps/wei/views.py:810 apps/wei/views.py:820 #: apps/wei/views.py:791 apps/wei/views.py:811 apps/wei/views.py:821
#: 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"
@ -1451,24 +1459,25 @@ msgstr "Ajouter un alias"
msgid "Club Parent" msgid "Club Parent"
msgstr "Club parent" msgstr "Club parent"
#: templates/member/club_info.html:29 #: templates/member/club_info.html:34
msgid "days" msgid "days"
msgstr "jours" msgstr "jours"
#: templates/member/club_info.html:32 templates/wei/weiclub_info.html:27 #: templates/member/club_info.html:38 templates/wei/weiclub_info.html:27
msgid "membership fee" msgid "membership fee"
msgstr "cotisation pour adhérer" msgstr "cotisation pour adhérer"
#: templates/member/club_info.html:44 templates/member/profile_info.html:33 #: templates/member/club_info.html:50 templates/member/profile_info.html:33
#: templates/treasury/sogecredit_detail.html:18
#: templates/wei/weiclub_info.html:43 #: templates/wei/weiclub_info.html:43
msgid "balance" msgid "balance"
msgstr "solde du compte" msgstr "solde du compte"
#: templates/member/club_info.html:57 #: templates/member/club_info.html:64
msgid "Add member" msgid "Add member"
msgstr "Ajouter un membre" msgstr "Ajouter un membre"
#: templates/member/club_info.html:64 templates/member/profile_info.html:48 #: templates/member/club_info.html:71 templates/member/profile_info.html:48
msgid "View Profile" msgid "View Profile"
msgstr "Voir le profil" msgstr "Voir le profil"
@ -1898,11 +1907,11 @@ msgstr "Il n'y a pas de transaction associée à une remise ouverte."
msgid "Closed remittances" msgid "Closed remittances"
msgstr "Remises fermées" msgstr "Remises fermées"
#: templates/treasury/sogecredit_detail.html:23 #: templates/treasury/sogecredit_detail.html:29
msgid "total amount" msgid "total amount"
msgstr "montant total" msgstr "montant total"
#: templates/treasury/sogecredit_detail.html:29 #: templates/treasury/sogecredit_detail.html:35
msgid "" msgid ""
"Warning: Validating this credit implies that all membership transactions " "Warning: Validating this credit implies that all membership transactions "
"will be validated." "will be validated."
@ -1910,7 +1919,7 @@ msgstr ""
"Attention : Valider ce crédit implique que les transactions d'adhésion " "Attention : Valider ce crédit implique que les transactions d'adhésion "
"seront validées." "seront validées."
#: templates/treasury/sogecredit_detail.html:30 #: templates/treasury/sogecredit_detail.html:36
msgid "" msgid ""
"If you delete this credit, there all membership transactions will be also " "If you delete this credit, there all membership transactions will be also "
"validated, but no credit will be operated." "validated, but no credit will be operated."
@ -1919,7 +1928,7 @@ msgstr ""
"d'adhésion seront aussi validées, but il n'y aura pas de transaction de " "d'adhésion seront aussi validées, but il n'y aura pas de transaction de "
"crédit créée." "crédit créée."
#: templates/treasury/sogecredit_detail.html:31 #: templates/treasury/sogecredit_detail.html:37
msgid "" msgid ""
"If this credit is validated, then the user won't be able to ask for a credit " "If this credit is validated, then the user won't be able to ask for a credit "
"from the Société générale." "from the Société générale."
@ -1927,15 +1936,29 @@ msgstr ""
"Si ce crédit est validé, alors l'utilisateur ne pourra plus demander d'être " "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." "crédité par la Société générale à l'avenir."
#: templates/treasury/sogecredit_detail.html:32 #: templates/treasury/sogecredit_detail.html:38
msgid "If you think there is an error, please contact the \"respos info\"." 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." msgstr "Si vous pensez qu'il y a une erreur, merci de contacter un respo info."
#: templates/treasury/sogecredit_detail.html:38 #: templates/treasury/sogecredit_detail.html:44
msgid "This credit is already validated." msgid "This credit is already validated."
msgstr "Ce crédit a déjà été validé." msgstr "Ce crédit a déjà été validé."
#: templates/treasury/sogecredit_detail.html:49 #: templates/treasury/sogecredit_detail.html:49
msgid ""
"Warning: if you don't validate this credit, the note of the user doesn't "
"have enough money to pay its memberships."
msgstr ""
"Attention : si vous ne validez pas ce crédit, la note de l'utilisateur n'a "
"pas assez d'argent pour payer les adhésions."
#: templates/treasury/sogecredit_detail.html:50
msgid "Please ask the user to credit its note before deleting this credit."
msgstr ""
"Merci de demander à l'utilisateur de recharger sa note avant de "
"supprimer la demande de crédit."
#: templates/treasury/sogecredit_detail.html:64
msgid "Return to credit list" msgid "Return to credit list"
msgstr "Retour à la liste des crédits" msgstr "Retour à la liste des crédits"

View File

@ -2,6 +2,7 @@
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
{% load pretty_money %} {% load pretty_money %}
{% load perms %}
{% block content %} {% block content %}
<div class="card bg-light shadow"> <div class="card bg-light shadow">
@ -13,6 +14,11 @@
<dt class="col-xl-6 text-right">{% trans 'user'|capfirst %}</dt> <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> <dd class="col-xl-6"><a href="{% url 'member:user_detail' pk=object.user.pk %}">{{ object.user }}</a></dd>
{% if "note.view_note_balance"|has_perm:object.user.note %}
<dt class="col-xl-6 text-right">{% trans 'balance'|capfirst %}</dt>
<dd class="col-xl-6">{{ object.user.note.balance|pretty_money }}</dd>
{% endif %}
<dt class="col-xl-6 text-right">{% trans 'transactions'|capfirst %}</dt> <dt class="col-xl-6 text-right">{% trans 'transactions'|capfirst %}</dt>
<dd class="col-xl-6"> <dd class="col-xl-6">
{% for transaction in object.transactions.all %} {% for transaction in object.transactions.all %}
@ -38,11 +44,20 @@
{% trans "This credit is already validated." %} {% trans "This credit is already validated." %}
</div> </div>
{% else %} {% else %}
{% if object.user.note.balance < object.amount %}
<div class="alert alert-warning">
{% trans "Warning: if you don't validate this credit, the note of the user doesn't have enough money to pay its memberships." %}
{% trans "Please ask the user to credit its note before deleting this credit." %}
</div>
{% endif %}
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<div class="btn-group btn-block"> <div class="btn-group btn-block">
<button name="validate" class="btn btn-success">{% trans "Validate" %}</button> <button name="validate" class="btn btn-success">{% trans "Validate" %}</button>
<button name="delete" class="btn btn-danger">{% trans "Delete" %}</button> {% if object.user.note.balance >= object.amount %}
<button name="delete" class="btn btn-danger">{% trans "Delete" %}</button>
{% endif %}
</div> </div>
</form> </form>
{% endif %} {% endif %}