From a46769f158a7f144272fd82221c0267f80e2988c Mon Sep 17 00:00:00 2001 From: jbpenrath Date: Wed, 9 Oct 2024 15:42:59 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=96(minor)=20release=20minor=20version?= =?UTF-8?q?=20of=20joanie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added - Debit installment on pending order transition if due date is on current day - Display order credit card detail in the back office - Send an email reminder to the user when an installment will be debited on his credit card on his order's payment schedule - Send an email to the user when an installment debit has been refused - Send an email to the user when an installment is successfully paid - Support of payment_schedule for certificate products - Display payment schedule in contract template Changed - Updated `OrderPaymentScheduleDecoder` to return a `date` object for the `due_date` attribute and a `Money` object for `amount` attribute in the payment_schedule, instead of string values - Bind payment_schedule into `OrderLightSerializer` - Generate payment schedule for any kind of product - Sort credit card list by is_main then descending creation date - Rework order statuses - Update the task `debit_pending_installment` to catch up on late payments of installments that are in the past - Deprecated field `has_consent_to_terms` for `Order` model - Move signature fields before appendices in contract definition template - Update `handle_notification` signature backend to confirm signature Fixed - Prevent duplicate Address objects for a user or an organization Removed - Remove the `has_consent_to_terms` field from the `Order` edit view in the back office application --- CHANGELOG.md | 5 +- arnold.yml | 2 +- .../tests/core/tasks/test_payment_schedule.py | 8 +- .../joanie/tests/payment/base_payment.py | 25 +- .../joanie/tests/payment/test_backend_base.py | 1 + .../locale/es_ES/LC_MESSAGES/django.mo | Bin 463 -> 463 bytes .../locale/es_ES/LC_MESSAGES/django.po | 676 +++++++++++------ .../locale/fr_CA/LC_MESSAGES/django.mo | Bin 469 -> 469 bytes .../locale/fr_CA/LC_MESSAGES/django.po | 676 +++++++++++------ .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 34996 -> 42770 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 696 ++++++++++++------ src/backend/pyproject.toml | 2 +- src/frontend/admin/i18n/locales/es-ES.json | 60 +- src/frontend/admin/i18n/locales/fr-CA.json | 60 +- src/frontend/admin/i18n/locales/fr-FR.json | 60 +- src/frontend/admin/package.json | 2 +- .../admin/src/translations/es-ES.json | 16 +- .../admin/src/translations/fr-CA.json | 16 +- .../admin/src/translations/fr-FR.json | 16 +- src/mail/package.json | 2 +- src/openApiClientJs/package.json | 2 +- src/tray/tray.yml | 2 +- src/tray/vars/all/main.yml | 4 +- 23 files changed, 1566 insertions(+), 765 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a25c956a..99530ab62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to ## [Unreleased] +## [2.8.0] - 2024-10-16 + ### Added - Debit installment on pending order transition if due date is on current day @@ -450,7 +452,8 @@ and this project adheres to - First working version serving sellable micro-credentials for multiple organizations synchronized to a remote catalog -[unreleased]: https://github.com/openfun/joanie/compare/v2.7.1...main +[unreleased]: https://github.com/openfun/joanie/compare/v2.8.0...main +[2.8.0]: https://github.com/openfun/joanie/compare/v2.7.1...v2.8.0 [2.7.1]: https://github.com/openfun/joanie/compare/v2.7.0...v2.7.1 [2.7.0]: https://github.com/openfun/joanie/compare/v2.6.1...v2.7.0 [2.6.1]: https://github.com/openfun/joanie/compare/v2.6.0...v2.6.1 diff --git a/arnold.yml b/arnold.yml index 9690a4e9c..c83ffe053 100644 --- a/arnold.yml +++ b/arnold.yml @@ -1,6 +1,6 @@ # arnold.yml metadata: name: joanie - version: 2.7.1 + version: 2.8.0 source: path: src/tray diff --git a/src/backend/joanie/tests/core/tasks/test_payment_schedule.py b/src/backend/joanie/tests/core/tasks/test_payment_schedule.py index 7168f502d..6b9fab86e 100644 --- a/src/backend/joanie/tests/core/tasks/test_payment_schedule.py +++ b/src/backend/joanie/tests/core/tasks/test_payment_schedule.py @@ -353,11 +353,11 @@ def test_payment_scheduled_send_mail_reminder_installment_debit_task_full_cycle( first_name="John", last_name="Doe", email="john.doe@acme.org", - language="fr-fr", + language="en-us", ) UserAddressFactory(owner=owner_1) owner_2 = UserFactory( - first_name="Sam", last_name="Doe", email="sam@fun-test.fr", language="fr-fr" + first_name="Sam", last_name="Doe", email="sam@fun-test.fr", language="en-us" ) UserAddressFactory(owner=owner_2) order_1 = OrderGeneratorFactory( @@ -431,7 +431,7 @@ def test_payment_scheduled_send_mail_reminder_installment_debit_task_full_cycle( self.assertIn(f"Hello {fullname_1}", email_content_1) self.assertIn("installment will be withdrawn on 2 days", email_content_1) self.assertIn("We will try to debit an amount of", email_content_1) - self.assertIn("3,5", email_content_1) + self.assertIn("3.5", email_content_1) self.assertIn("Product 1", email_content_1) # Trigger now the task `send_mail_reminder_installment_debit_task` for order_2 @@ -447,5 +447,5 @@ def test_payment_scheduled_send_mail_reminder_installment_debit_task_full_cycle( self.assertIn(f"Hello {fullname_2}", email_content_2) self.assertIn("installment will be withdrawn on 2 days", email_content_2) self.assertIn("We will try to debit an amount of", email_content_2) - self.assertIn("1,5", email_content_2) + self.assertIn("1.5", email_content_2) self.assertIn("Product 2", email_content_2) diff --git a/src/backend/joanie/tests/payment/base_payment.py b/src/backend/joanie/tests/payment/base_payment.py index bdf938850..ae759d281 100644 --- a/src/backend/joanie/tests/payment/base_payment.py +++ b/src/backend/joanie/tests/payment/base_payment.py @@ -49,16 +49,27 @@ def _check_installment_refused_email_sent(self, email, order): # Check we send it to the right email self.assertEqual(mail.outbox[0].to[0], email) - self.assertIn("An installment debit has failed", mail.outbox[0].subject) - # Check body email_content = " ".join(mail.outbox[0].body.split()) fullname = order.owner.get_full_name() - self.assertIn(f"Hello {fullname}", email_content) - self.assertIn("installment debit has failed.", email_content) - self.assertIn( - "Please correct the failed payment as soon as possible using", email_content - ) + + if "fr" in order.owner.language: + self.assertRegex( + mail.outbox[0].subject, + "Le prélèvement d'une échéance d'un montant de .* a échoué", + ) + self.assertIn(f"Bonjour {fullname}", email_content) + self.assertIn( + "Merci de régulariser le paiement en échec dès que possible depuis de", + email_content, + ) + else: + self.assertIn("An installment debit has failed", mail.outbox[0].subject) + self.assertIn(f"Hello {fullname}", email_content) + self.assertIn( + "Please correct the failed payment as soon as possible using", + email_content, + ) # Check the product title is in the correct language with switch_language(order.product, order.owner.language): self.assertIn(order.product.title, email_content) diff --git a/src/backend/joanie/tests/payment/test_backend_base.py b/src/backend/joanie/tests/payment/test_backend_base.py index 7e0ff38c3..b2f8cac77 100644 --- a/src/backend/joanie/tests/payment/test_backend_base.py +++ b/src/backend/joanie/tests/payment/test_backend_base.py @@ -460,6 +460,7 @@ def test_payment_backend_base_do_on_payment_failure_with_installment(self): """ backend = TestBasePaymentBackend() order = OrderFactory( + owner__language="en-us", payment_schedule=[ { "id": "d9356dd7-19a6-4695-b18e-ad93af41424a", diff --git a/src/backend/locale/es_ES/LC_MESSAGES/django.mo b/src/backend/locale/es_ES/LC_MESSAGES/django.mo index e0c792509fb495e682b57f85d76218f305296b85..853ad5e99172392b276c7d578c09b84c4f88e3e4 100755 GIT binary patch delta 22 dcmX@le4cqi6Stv(uA!NNfu)s+*~VTcMgULX24w&M delta 22 dcmX@le4cqi6Ssk-u92~Vfu)s^!Ny)EMgUL{24esK diff --git a/src/backend/locale/es_ES/LC_MESSAGES/django.po b/src/backend/locale/es_ES/LC_MESSAGES/django.po index 5aed5f799..690e4f567 100644 --- a/src/backend/locale/es_ES/LC_MESSAGES/django.po +++ b/src/backend/locale/es_ES/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: joanie\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-19 12:20+0000\n" -"PO-Revision-Date: 2024-09-23 09:20\n" +"POT-Creation-Date: 2024-10-16 09:22+0000\n" +"PO-Revision-Date: 2024-10-16 09:46\n" "Last-Translator: \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -110,11 +110,11 @@ msgstr[0] "" msgstr[1] "" #: joanie/core/admin.py:64 joanie/core/models/course_wishes.py:25 -#: joanie/core/models/courses.py:496 +#: joanie/core/models/courses.py:497 msgid "Course" msgstr "" -#: joanie/core/admin.py:71 joanie/core/models/products.py:107 +#: joanie/core/admin.py:71 joanie/core/models/products.py:113 #: joanie/core/templates/issuers/invoice.html:78 msgid "Product" msgstr "" @@ -129,7 +129,7 @@ msgstr "" msgid "Owner" msgstr "" -#: joanie/core/admin.py:106 joanie/core/models/courses.py:812 +#: joanie/core/admin.py:106 joanie/core/models/courses.py:831 msgid "Course run" msgstr "" @@ -166,23 +166,23 @@ msgstr "" msgid "Important dates" msgstr "" -#: joanie/core/admin.py:592 +#: joanie/core/admin.py:591 msgid "Cancel selected orders" msgstr "" -#: joanie/core/admin.py:644 +#: joanie/core/admin.py:643 msgid "To get results, choose a user on the right" msgstr "" -#: joanie/core/admin.py:688 +#: joanie/core/admin.py:687 msgid "To get results, choose an owner or an organization on the right" msgstr "" -#: joanie/core/admin.py:717 +#: joanie/core/admin.py:716 msgid "Config field" msgstr "" -#: joanie/core/admin.py:718 +#: joanie/core/admin.py:717 msgid "Config fields" msgstr "" @@ -198,148 +198,155 @@ msgstr "" msgid "Credential" msgstr "" -#: joanie/core/enums.py:34 joanie/core/enums.py:151 -#: joanie/core/models/courses.py:1014 +#: joanie/core/enums.py:34 joanie/core/enums.py:159 +#: joanie/core/models/courses.py:1033 msgid "Enrollment" msgstr "" -#: joanie/core/enums.py:37 joanie/core/enums.py:142 +#: joanie/core/enums.py:37 joanie/core/enums.py:150 #: joanie/core/models/certifications.py:116 #: joanie/core/templates/issuers/degree.html:27 msgid "Certificate" msgstr "" -#: joanie/core/enums.py:71 +#: joanie/core/enums.py:75 msgid "Draft" msgstr "" -#: joanie/core/enums.py:72 -msgid "Submitted" +#: joanie/core/enums.py:76 +msgid "Assigned" msgstr "" -#: joanie/core/enums.py:73 joanie/core/enums.py:183 -msgid "Pending" +#: joanie/core/enums.py:77 +msgid "To save payment method" msgstr "" -#: joanie/core/enums.py:74 -msgctxt "As in: the order is cancelled." -msgid "Canceled" +#: joanie/core/enums.py:78 +msgid "To sign" msgstr "" -#: joanie/core/enums.py:77 -msgctxt "As in: the order is validated." -msgid "Validated" +#: joanie/core/enums.py:79 +msgid "Signing" +msgstr "" + +#: joanie/core/enums.py:80 joanie/core/enums.py:191 +msgid "Pending" msgstr "" #: joanie/core/enums.py:81 +msgctxt "As in: the order is canceled." +msgid "Canceled" +msgstr "" + +#: joanie/core/enums.py:84 msgctxt "As in: the order payment is pending." msgid "Pending payment" msgstr "" -#: joanie/core/enums.py:85 +#: joanie/core/enums.py:88 msgctxt "As in: the last order payment has failed." msgid "Failed payment" msgstr "" -#: joanie/core/enums.py:89 +#: joanie/core/enums.py:92 msgctxt "As in: the first order payment has failed." msgid "No payment" msgstr "" -#: joanie/core/enums.py:93 +#: joanie/core/enums.py:96 msgctxt "As in: the order is completed." msgid "Completed" msgstr "" -#: joanie/core/enums.py:110 +#: joanie/core/enums.py:118 msgctxt "As in: the enrollment was successfully set on the LMS." msgid "Set" msgstr "" -#: joanie/core/enums.py:114 +#: joanie/core/enums.py:122 msgctxt "As in: the enrollment failed on the LMS." msgid "Failed" msgstr "" -#: joanie/core/enums.py:121 +#: joanie/core/enums.py:129 msgid "Contract Definition" msgstr "" -#: joanie/core/enums.py:129 +#: joanie/core/enums.py:137 msgid "Unsigned" msgstr "" -#: joanie/core/enums.py:132 +#: joanie/core/enums.py:140 msgid "Partially signed" msgstr "" -#: joanie/core/enums.py:134 +#: joanie/core/enums.py:142 msgid "Signed" msgstr "" -#: joanie/core/enums.py:143 +#: joanie/core/enums.py:151 msgid "Degree" msgstr "" -#: joanie/core/enums.py:150 joanie/core/models/products.py:518 +#: joanie/core/enums.py:158 joanie/core/models/products.py:531 msgid "Order" msgstr "" -#: joanie/core/enums.py:161 +#: joanie/core/enums.py:169 msgid "Info" msgstr "" -#: joanie/core/enums.py:162 +#: joanie/core/enums.py:170 msgid "Success" msgstr "" -#: joanie/core/enums.py:163 +#: joanie/core/enums.py:171 msgid "Warning" msgstr "" -#: joanie/core/enums.py:164 +#: joanie/core/enums.py:172 msgid "Error" msgstr "" -#: joanie/core/enums.py:173 +#: joanie/core/enums.py:181 msgid "Notification" msgstr "" -#: joanie/core/enums.py:174 +#: joanie/core/enums.py:182 msgid "Payment succeeded" msgstr "" -#: joanie/core/enums.py:175 +#: joanie/core/enums.py:183 msgid "Payment failed" msgstr "" -#: joanie/core/enums.py:184 joanie/payment/enums.py:28 +#: joanie/core/enums.py:192 joanie/payment/enums.py:28 msgid "Paid" msgstr "" -#: joanie/core/enums.py:185 +#: joanie/core/enums.py:193 msgid "Refused" msgstr "" -#: joanie/core/factories.py:801 joanie/core/utils/contract_definition.py:107 +#: joanie/core/factories.py:1141 joanie/core/utils/contract_definition.py:101 msgid "" msgstr "" -#: joanie/core/factories.py:806 joanie/core/utils/contract_definition.py:108 +#: joanie/core/factories.py:1146 joanie/core/utils/contract_definition.py:102 msgid "" msgstr "" -#: joanie/core/factories.py:813 +#: joanie/core/factories.py:1153 msgid "" msgstr "" #: joanie/core/fields/multiselect.py:28 -#: joanie/core/templatetags/extra_tags.py:32 +#: joanie/core/templatetags/extra_tags.py:38 msgid "{:s} and {:s}" msgstr "" #: joanie/core/fields/multiselect.py:32 -#: joanie/core/templatetags/extra_tags.py:36 +#: joanie/core/templatetags/extra_tags.py:42 msgid " and " msgstr "" @@ -411,8 +418,8 @@ msgstr "" #: joanie/core/models/accounts.py:154 joanie/core/models/certifications.py:33 #: joanie/core/models/contracts.py:29 joanie/core/models/courses.py:170 -#: joanie/core/models/courses.py:470 joanie/core/models/courses.py:783 -#: joanie/core/models/products.py:68 joanie/payment/models.py:394 +#: joanie/core/models/courses.py:471 joanie/core/models/courses.py:802 +#: joanie/core/models/products.py:74 joanie/payment/models.py:394 msgid "title" msgstr "" @@ -440,14 +447,14 @@ msgstr "" msgid "last name" msgstr "" -#: joanie/core/models/accounts.py:163 joanie/core/models/courses.py:357 -#: joanie/core/models/courses.py:587 joanie/core/models/products.py:463 +#: joanie/core/models/accounts.py:163 joanie/core/models/courses.py:358 +#: joanie/core/models/courses.py:606 joanie/core/models/products.py:466 #: joanie/payment/models.py:403 msgid "owner" msgstr "" #: joanie/core/models/accounts.py:171 joanie/core/models/certifications.py:97 -#: joanie/core/models/products.py:406 +#: joanie/core/models/products.py:409 msgid "organization" msgstr "" @@ -475,11 +482,11 @@ msgstr "" msgid "Main address must be reusable." msgstr "" -#: joanie/core/models/accounts.py:231 +#: joanie/core/models/accounts.py:255 msgid "Demote a main address is forbidden" msgstr "" -#: joanie/core/models/activity_logs.py:63 joanie/core/models/courses.py:992 +#: joanie/core/models/activity_logs.py:63 joanie/core/models/courses.py:1011 msgid "user" msgstr "" @@ -488,12 +495,12 @@ msgid "level" msgstr "" #: joanie/core/models/activity_logs.py:74 -#: joanie/core/models/certifications.py:108 joanie/core/models/contracts.py:90 +#: joanie/core/models/certifications.py:108 joanie/core/models/contracts.py:96 #: joanie/payment/models.py:74 msgid "context" msgstr "" -#: joanie/core/models/activity_logs.py:78 joanie/core/models/products.py:65 +#: joanie/core/models/activity_logs.py:78 joanie/core/models/products.py:71 msgid "type" msgstr "" @@ -550,7 +557,7 @@ msgid "name" msgstr "" #: joanie/core/models/certifications.py:34 joanie/core/models/contracts.py:30 -#: joanie/core/models/products.py:69 +#: joanie/core/models/products.py:75 msgid "description" msgstr "" @@ -571,16 +578,16 @@ msgstr "" msgid "Date of issuance" msgstr "" -#: joanie/core/models/certifications.py:82 joanie/core/models/contracts.py:80 -#: joanie/core/models/products.py:1143 joanie/payment/models.py:54 +#: joanie/core/models/certifications.py:82 joanie/core/models/contracts.py:86 +#: joanie/core/models/products.py:1276 joanie/payment/models.py:54 msgid "order" msgstr "" -#: joanie/core/models/certifications.py:91 joanie/core/models/products.py:428 +#: joanie/core/models/certifications.py:91 joanie/core/models/products.py:431 msgid "enrollment" msgstr "" -#: joanie/core/models/certifications.py:102 +#: joanie/core/models/certifications.py:102 joanie/core/models/contracts.py:46 msgid "images" msgstr "" @@ -600,48 +607,48 @@ msgstr "" msgid "Language of the contract definition" msgstr "" -#: joanie/core/models/contracts.py:40 +#: joanie/core/models/contracts.py:39 msgid "template name" msgstr "" -#: joanie/core/models/contracts.py:48 joanie/core/models/contracts.py:73 -#: joanie/core/models/products.py:99 +#: joanie/core/models/contracts.py:54 joanie/core/models/contracts.py:79 +#: joanie/core/models/products.py:105 msgid "Contract definition" msgstr "" -#: joanie/core/models/contracts.py:49 +#: joanie/core/models/contracts.py:55 msgid "Contract definitions" msgstr "" -#: joanie/core/models/contracts.py:92 +#: joanie/core/models/contracts.py:98 msgid "Localized data snapshot on contract signature" msgstr "" -#: joanie/core/models/contracts.py:102 +#: joanie/core/models/contracts.py:108 msgid "Reference in the external signature backend" msgstr "" -#: joanie/core/models/contracts.py:107 +#: joanie/core/models/contracts.py:113 msgid "Date and time we send the contract to signature provider" msgstr "" -#: joanie/core/models/contracts.py:115 +#: joanie/core/models/contracts.py:121 msgid "Date and time of issuance" msgstr "" -#: joanie/core/models/contracts.py:121 +#: joanie/core/models/contracts.py:127 msgid "organization signatory" msgstr "" -#: joanie/core/models/contracts.py:129 +#: joanie/core/models/contracts.py:135 msgid "Date and time the organization signed the contract" msgstr "" -#: joanie/core/models/contracts.py:137 +#: joanie/core/models/contracts.py:143 msgid "Contract" msgstr "" -#: joanie/core/models/contracts.py:138 +#: joanie/core/models/contracts.py:144 msgid "Contracts" msgstr "" @@ -689,7 +696,7 @@ msgstr "" msgid "forever open" msgstr "" -#: joanie/core/models/courses.py:168 joanie/core/models/courses.py:467 +#: joanie/core/models/courses.py:168 joanie/core/models/courses.py:468 msgid "code" msgstr "" @@ -761,388 +768,396 @@ msgstr "" msgid "Both signatory representative fields must be set." msgstr "" -#: joanie/core/models/courses.py:358 joanie/core/models/courses.py:588 +#: joanie/core/models/courses.py:359 joanie/core/models/courses.py:607 msgid "administrator" msgstr "" -#: joanie/core/models/courses.py:359 +#: joanie/core/models/courses.py:360 msgid "member" msgstr "" -#: joanie/core/models/courses.py:374 +#: joanie/core/models/courses.py:375 msgid "Organization access" msgstr "" -#: joanie/core/models/courses.py:375 +#: joanie/core/models/courses.py:376 msgid "Organization accesses" msgstr "" -#: joanie/core/models/courses.py:468 +#: joanie/core/models/courses.py:469 msgid "cover" msgstr "" -#: joanie/core/models/courses.py:475 joanie/core/models/courses.py:718 +#: joanie/core/models/courses.py:476 joanie/core/models/courses.py:737 msgid "organizations" msgstr "" -#: joanie/core/models/courses.py:482 +#: joanie/core/models/courses.py:483 msgid "products" msgstr "" -#: joanie/core/models/courses.py:497 +#: joanie/core/models/courses.py:498 msgid "Courses" msgstr "" -#: joanie/core/models/courses.py:589 +#: joanie/core/models/courses.py:608 msgid "instructor" msgstr "" -#: joanie/core/models/courses.py:590 +#: joanie/core/models/courses.py:609 msgid "manager" msgstr "" -#: joanie/core/models/courses.py:607 +#: joanie/core/models/courses.py:626 msgid "Course access" msgstr "" -#: joanie/core/models/courses.py:608 +#: joanie/core/models/courses.py:627 msgid "Course accesses" msgstr "" -#: joanie/core/models/courses.py:705 joanie/core/models/courses.py:777 -#: joanie/core/models/products.py:275 joanie/core/models/products.py:421 -#: joanie/core/models/products.py:1131 +#: joanie/core/models/courses.py:724 joanie/core/models/courses.py:796 +#: joanie/core/models/products.py:281 joanie/core/models/products.py:424 +#: joanie/core/models/products.py:1264 msgid "course" msgstr "" -#: joanie/core/models/courses.py:711 joanie/core/models/products.py:281 -#: joanie/core/models/products.py:413 +#: joanie/core/models/courses.py:730 joanie/core/models/products.py:287 +#: joanie/core/models/products.py:416 msgid "product" msgstr "" -#: joanie/core/models/courses.py:724 +#: joanie/core/models/courses.py:743 msgid "Course relation to a product" msgstr "" -#: joanie/core/models/courses.py:725 +#: joanie/core/models/courses.py:744 msgid "Courses relations to products" msgstr "" -#: joanie/core/models/courses.py:739 +#: joanie/core/models/courses.py:758 msgid "You cannot delete this course product relation." msgstr "" -#: joanie/core/models/courses.py:781 +#: joanie/core/models/courses.py:800 msgid "resource link" msgstr "" -#: joanie/core/models/courses.py:786 +#: joanie/core/models/courses.py:805 msgid "course start" msgstr "" -#: joanie/core/models/courses.py:787 +#: joanie/core/models/courses.py:806 msgid "course end" msgstr "" -#: joanie/core/models/courses.py:789 +#: joanie/core/models/courses.py:808 msgid "enrollment date" msgstr "" -#: joanie/core/models/courses.py:790 +#: joanie/core/models/courses.py:809 msgid "enrollment end" msgstr "" -#: joanie/core/models/courses.py:798 +#: joanie/core/models/courses.py:817 msgid "The list of languages in which the course content is available." msgstr "" -#: joanie/core/models/courses.py:800 +#: joanie/core/models/courses.py:819 msgid "is gradable" msgstr "" -#: joanie/core/models/courses.py:802 +#: joanie/core/models/courses.py:821 msgid "is listed" msgstr "" -#: joanie/core/models/courses.py:805 +#: joanie/core/models/courses.py:824 msgid "If checked the course run will be included in the list of course runs available for enrollment on the related course page." msgstr "" -#: joanie/core/models/courses.py:813 +#: joanie/core/models/courses.py:832 msgid "Course runs" msgstr "" -#: joanie/core/models/courses.py:946 +#: joanie/core/models/courses.py:965 msgid "This course run relies on a product relation. So you cannot modify its course." msgstr "" -#: joanie/core/models/courses.py:986 +#: joanie/core/models/courses.py:1005 msgid "course run" msgstr "" -#: joanie/core/models/courses.py:997 +#: joanie/core/models/courses.py:1016 msgid "Ticked if the user is enrolled to the course run." msgstr "" -#: joanie/core/models/courses.py:1001 +#: joanie/core/models/courses.py:1020 msgid "state" msgstr "" -#: joanie/core/models/courses.py:1005 +#: joanie/core/models/courses.py:1024 msgid "Ticked if the enrollment has been initially created in the scope of an order." msgstr "" -#: joanie/core/models/courses.py:1007 +#: joanie/core/models/courses.py:1026 msgid "was created by order" msgstr "" -#: joanie/core/models/courses.py:1015 +#: joanie/core/models/courses.py:1034 msgid "Enrollments" msgstr "" -#: joanie/core/models/courses.py:1023 +#: joanie/core/models/courses.py:1042 msgid "active" msgstr "" -#: joanie/core/models/courses.py:1023 +#: joanie/core/models/courses.py:1042 msgid "inactive" msgstr "" -#: joanie/core/models/courses.py:1093 +#: joanie/core/models/courses.py:1112 msgid "You are not allowed to enroll to a course run not opened for enrollment." msgstr "" -#: joanie/core/models/courses.py:1109 +#: joanie/core/models/courses.py:1128 msgid "You are already enrolled to an opened course run " msgstr "" -#: joanie/core/models/courses.py:1120 +#: joanie/core/models/courses.py:1139 msgid "You cannot enroll to a non-listed course run out of the scope of an order." msgstr "" -#: joanie/core/models/courses.py:1145 +#: joanie/core/models/courses.py:1164 msgid "Course run \"{self.course_run.id!s}\" requires a valid order to enroll." msgstr "" -#: joanie/core/models/courses.py:1150 +#: joanie/core/models/courses.py:1169 msgid "You are not allowed to enroll to a course run not listed." msgstr "" -#: joanie/core/models/products.py:70 +#: joanie/core/models/products.py:76 msgid "instructions" msgstr "" -#: joanie/core/models/products.py:71 +#: joanie/core/models/products.py:77 msgid "call to action" msgstr "" -#: joanie/core/models/products.py:78 +#: joanie/core/models/products.py:84 msgid "target courses" msgstr "" -#: joanie/core/models/products.py:82 joanie/core/models/products.py:452 +#: joanie/core/models/products.py:88 joanie/core/models/products.py:455 msgid "price" msgstr "" -#: joanie/core/models/products.py:83 joanie/core/models/products.py:454 +#: joanie/core/models/products.py:89 joanie/core/models/products.py:457 msgid "tax included" msgstr "" -#: joanie/core/models/products.py:92 +#: joanie/core/models/products.py:98 msgid "certificate definition" msgstr "" -#: joanie/core/models/products.py:108 +#: joanie/core/models/products.py:114 msgid "Products" msgstr "" -#: joanie/core/models/products.py:255 +#: joanie/core/models/products.py:261 msgid "Certificate definition is only allowed for product kinds: " msgstr "" -#: joanie/core/models/products.py:290 joanie/core/models/products.py:1137 +#: joanie/core/models/products.py:296 joanie/core/models/products.py:1270 msgid "course runs" msgstr "" -#: joanie/core/models/products.py:293 +#: joanie/core/models/products.py:299 msgid "position in product" msgstr "" -#: joanie/core/models/products.py:295 joanie/core/models/products.py:1149 +#: joanie/core/models/products.py:301 joanie/core/models/products.py:1282 msgid "take into account for certification" msgstr "" -#: joanie/core/models/products.py:296 joanie/core/models/products.py:1150 +#: joanie/core/models/products.py:302 joanie/core/models/products.py:1283 msgid "Take into account the course grade for certification." msgstr "" -#: joanie/core/models/products.py:304 +#: joanie/core/models/products.py:310 msgid "Target course relation to a product with a position" msgstr "" -#: joanie/core/models/products.py:305 +#: joanie/core/models/products.py:311 msgid "Target courses relations to products with a position" msgstr "" -#: joanie/core/models/products.py:336 +#: joanie/core/models/products.py:342 msgid "Number of seats" msgstr "" -#: joanie/core/models/products.py:338 +#: joanie/core/models/products.py:344 msgid "The maximum number of orders that can be validated for a given order group" msgstr "" -#: joanie/core/models/products.py:343 +#: joanie/core/models/products.py:349 msgid "course product relation" msgstr "" -#: joanie/core/models/products.py:347 +#: joanie/core/models/products.py:353 msgid "is active" msgstr "" -#: joanie/core/models/products.py:437 +#: joanie/core/models/products.py:440 msgid "order group" msgstr "" -#: joanie/core/models/products.py:448 +#: joanie/core/models/products.py:451 msgid "courses" msgstr "" -#: joanie/core/models/products.py:469 +#: joanie/core/models/products.py:472 msgid "has consent to terms" msgstr "" -#: joanie/core/models/products.py:472 +#: joanie/core/models/products.py:475 msgid "User has consented to the platform terms and conditions." msgstr "" -#: joanie/core/models/products.py:480 +#: joanie/core/models/products.py:484 msgid "payment schedule" msgstr "" -#: joanie/core/models/products.py:481 +#: joanie/core/models/products.py:485 msgid "Payment schedule for the order." msgstr "" -#: joanie/core/models/products.py:519 +#: joanie/core/models/products.py:494 +msgid "credit card" +msgstr "" + +#: joanie/core/models/products.py:532 msgid "Orders" msgstr "" -#: joanie/core/models/products.py:604 +#: joanie/core/models/products.py:643 #, python-brace-format msgid "{required_field} field should be set for {self.product.type} products." msgstr "" -#: joanie/core/models/products.py:610 +#: joanie/core/models/products.py:649 #, python-brace-format msgid "{empty_field} field should be left empty for {self.product.type} products." msgstr "" -#: joanie/core/models/products.py:617 +#: joanie/core/models/products.py:656 msgid "The enrollment should belong to the owner of this order." msgstr "" -#: joanie/core/models/products.py:622 +#: joanie/core/models/products.py:661 msgid "Orders can't be placed on enrollments originating from an order." msgstr "" -#: joanie/core/models/products.py:633 +#: joanie/core/models/products.py:672 msgid "The order cannot be created on course run that is in archived state." msgstr "" -#: joanie/core/models/products.py:652 +#: joanie/core/models/products.py:691 #, python-brace-format msgid "This order cannot be linked to the product \"{product_title}\", " msgstr "" -#: joanie/core/models/products.py:658 +#: joanie/core/models/products.py:697 #, python-brace-format msgid "This order cannot be linked to the product \"{product_title}\" and " msgstr "" -#: joanie/core/models/products.py:852 +#: joanie/core/models/products.py:909 #, python-brace-format msgid "Product {self.product.title} does not allow to generate a certificate." msgstr "" -#: joanie/core/models/products.py:867 +#: joanie/core/models/products.py:924 msgid "No graded courses found." msgstr "" -#: joanie/core/models/products.py:883 +#: joanie/core/models/products.py:940 msgid "This order is not ready for gradation." msgstr "" -#: joanie/core/models/products.py:893 +#: joanie/core/models/products.py:950 msgid "Course run " msgstr "" -#: joanie/core/models/products.py:1147 +#: joanie/core/models/products.py:1280 msgid "position in order" msgstr "" -#: joanie/core/models/products.py:1158 +#: joanie/core/models/products.py:1291 msgid "Course relation to an order with a position" msgstr "" -#: joanie/core/models/products.py:1159 +#: joanie/core/models/products.py:1292 msgid "Courses relations to orders with a position" msgstr "" -#: joanie/core/models/site.py:21 +#: joanie/core/models/site.py:18 msgid "site" msgstr "" -#: joanie/core/models/site.py:27 +#: joanie/core/models/site.py:24 msgid "terms and conditions" msgstr "" -#: joanie/core/models/site.py:28 +#: joanie/core/models/site.py:25 msgid "Terms and conditions for the site in Markdown format." msgstr "" -#: joanie/core/models/site.py:35 +#: joanie/core/models/site.py:32 msgid "Site config" msgstr "" -#: joanie/core/models/site.py:36 +#: joanie/core/models/site.py:33 msgid "Site configs" msgstr "" -#: joanie/core/serializers/client.py:155 joanie/core/serializers/client.py:270 +#: joanie/core/serializers/client.py:156 joanie/core/serializers/client.py:271 msgid "You are only allowed to set role to {', '.join(can_set_role_to)}" msgstr "" -#: joanie/core/serializers/client.py:158 joanie/core/serializers/client.py:273 +#: joanie/core/serializers/client.py:159 joanie/core/serializers/client.py:274 msgid "You are not allowed to set this role for this course." msgstr "" -#: joanie/core/serializers/client.py:169 +#: joanie/core/serializers/client.py:170 msgid "You must set a course ID in context to create a new course access." msgstr "" -#: joanie/core/serializers/client.py:179 +#: joanie/core/serializers/client.py:180 msgid "You are not allowed to manage accesses for this course." msgstr "" -#: joanie/core/serializers/client.py:284 +#: joanie/core/serializers/client.py:285 msgid "You must set a organization ID in context to create a new organization access." msgstr "" -#: joanie/core/serializers/client.py:295 +#: joanie/core/serializers/client.py:296 msgid "You are not allowed to manage accesses for this organization." msgstr "" -#: joanie/core/serializers/client.py:1172 -msgid "You must accept the terms and conditions to proceed." -msgstr "" - #: joanie/core/templates/admin/base.html:5 msgid "Sentry tools" msgstr "" #: joanie/core/templates/certificate/verify.html:9 +#: joanie/core/templates/mail/html/installment_paid.html:159 +#: joanie/core/templates/mail/html/installment_refused.html:159 +#: joanie/core/templates/mail/html/installment_reminder.html:159 +#: joanie/core/templates/mail/html/installments_fully_paid.html:159 #: joanie/core/templates/mail/html/order_validated.html:159 +#: joanie/core/templates/mail/text/installment_paid.txt:3 +#: joanie/core/templates/mail/text/installment_refused.txt:3 +#: joanie/core/templates/mail/text/installment_reminder.txt:3 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:3 #: joanie/core/templates/mail/text/order_validated.txt:3 msgid "Company logo" msgstr "" @@ -1316,24 +1331,44 @@ msgstr "" msgid "Price of the course: " msgstr "" -#: joanie/core/templates/issuers/contract_definition.html:127 +#: joanie/core/templates/issuers/contract_definition.html:128 +msgid "Learner's signature :" +msgstr "" + +#: joanie/core/templates/issuers/contract_definition.html:134 +msgid "University representative's signature :" +msgstr "" + +#: joanie/core/templates/issuers/contract_definition.html:141 msgid "Appendices" msgstr "" -#: joanie/core/templates/issuers/contract_definition.html:130 -msgid "Terms and conditions" +#: joanie/core/templates/issuers/contract_definition.html:144 +#: joanie/core/templates/mail/html/installment_paid.html:259 +#: joanie/core/templates/mail/html/installment_refused.html:235 +#: joanie/core/templates/mail/html/installment_reminder.html:235 +#: joanie/core/templates/mail/html/installments_fully_paid.html:259 +#: joanie/core/templates/mail/text/installment_paid.txt:18 +#: joanie/core/templates/mail/text/installment_refused.txt:15 +#: joanie/core/templates/mail/text/installment_reminder.txt:15 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:17 +msgid "Payment schedule" msgstr "" -#: joanie/core/templates/issuers/contract_definition.html:134 -msgid "Catalog syllabus" +#: joanie/core/templates/issuers/contract_definition.html:148 +msgid "Due date" msgstr "" -#: joanie/core/templates/issuers/contract_definition.html:140 -msgid "Learner's signature :" +#: joanie/core/templates/issuers/contract_definition.html:149 +msgid "Amount" msgstr "" -#: joanie/core/templates/issuers/contract_definition.html:146 -msgid "University representative's signature :" +#: joanie/core/templates/issuers/contract_definition.html:155 +msgid "Total :" +msgstr "" + +#: joanie/core/templates/issuers/contract_definition.html:173 +msgid "Catalog syllabus" msgstr "" #: joanie/core/templates/issuers/degree.html:29 @@ -1417,6 +1452,124 @@ msgstr "" msgid "Sales Tax VAT" msgstr "" +#: joanie/core/templates/mail/html/installment_paid.html:187 +#: joanie/core/templates/mail/html/installment_refused.html:187 +#: joanie/core/templates/mail/html/installment_reminder.html:187 +#: joanie/core/templates/mail/html/installments_fully_paid.html:187 +#: joanie/core/templates/mail/text/installment_paid.txt:7 +#: joanie/core/templates/mail/text/installment_refused.txt:7 +#: joanie/core/templates/mail/text/installment_reminder.txt:7 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:7 +#, python-format +msgid " Hello %(name)s, " +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:187 +#: joanie/core/templates/mail/html/installment_refused.html:187 +#: joanie/core/templates/mail/html/installment_reminder.html:187 +#: joanie/core/templates/mail/html/installments_fully_paid.html:187 +#: joanie/core/templates/mail/text/installment_paid.txt:9 +#: joanie/core/templates/mail/text/installment_refused.txt:9 +#: joanie/core/templates/mail/text/installment_reminder.txt:9 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:9 +msgid "Hello," +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:211 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment has been successfully paid.
" +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:235 +#, python-format +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.
Currently, it remains %(remaining_balance_to_pay)s to be paid. The next installment will be debited on %(date_next_installment_to_pay)s. " +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:293 +#: joanie/core/templates/mail/html/installment_refused.html:269 +#: joanie/core/templates/mail/html/installment_reminder.html:269 +#: joanie/core/templates/mail/html/installments_fully_paid.html:293 +#: joanie/core/templates/mail/text/installment_paid.txt:22 +#: joanie/core/templates/mail/text/installment_refused.txt:19 +#: joanie/core/templates/mail/text/installment_reminder.txt:19 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:21 +#, python-format +msgid " Withdrawn on %(installment_date)s " +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:297 +#: joanie/core/templates/mail/html/installment_paid.html:299 +#: joanie/core/templates/mail/html/installment_paid.html:301 +#: joanie/core/templates/mail/html/installment_refused.html:273 +#: joanie/core/templates/mail/html/installment_refused.html:275 +#: joanie/core/templates/mail/html/installment_refused.html:277 +#: joanie/core/templates/mail/html/installment_reminder.html:273 +#: joanie/core/templates/mail/html/installment_reminder.html:275 +#: joanie/core/templates/mail/html/installment_reminder.html:277 +#: joanie/core/templates/mail/html/installments_fully_paid.html:297 +#: joanie/core/templates/mail/html/installments_fully_paid.html:299 +#: joanie/core/templates/mail/html/installments_fully_paid.html:301 +#: joanie/core/templates/mail/text/installment_paid.txt:26 +#: joanie/core/templates/mail/text/installment_paid.txt:30 +#: joanie/core/templates/mail/text/installment_paid.txt:34 +#: joanie/core/templates/mail/text/installment_refused.txt:23 +#: joanie/core/templates/mail/text/installment_refused.txt:27 +#: joanie/core/templates/mail/text/installment_refused.txt:31 +#: joanie/core/templates/mail/text/installment_reminder.txt:23 +#: joanie/core/templates/mail/text/installment_reminder.txt:27 +#: joanie/core/templates/mail/text/installment_reminder.txt:31 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:25 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:29 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:33 +#, python-format +msgid "%(state)s" +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:344 +#: joanie/core/templates/mail/html/installments_fully_paid.html:344 +#, python-format +msgid " See order details on your dashboard " +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:374 +#: joanie/core/templates/mail/html/installment_refused.html:350 +#: joanie/core/templates/mail/html/installment_reminder.html:350 +#: joanie/core/templates/mail/html/installments_fully_paid.html:374 +#: joanie/core/templates/mail/html/order_validated.html:278 +#, python-format +msgid "This mail has been sent to %(email)s by %(name)s" +msgstr "" + +#: joanie/core/templates/mail/html/installment_refused.html:211 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment debit has failed.
We have tried to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr "" + +#: joanie/core/templates/mail/html/installment_refused.html:320 +#, python-format +msgid " Please correct the failed payment as soon as possible using your dashboard. " +msgstr "" + +#: joanie/core/templates/mail/html/installment_reminder.html:211 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment will be withdrawn on %(days_until_debit)s days.
We will try to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr "" + +#: joanie/core/templates/mail/html/installment_reminder.html:320 +#, python-format +msgid " See order details on your dashboard : dashboard " +msgstr "" + +#: joanie/core/templates/mail/html/installments_fully_paid.html:211 +#, python-format +msgid " For the course %(title)s, we have just debited the last installment. Your order is now fully paid! " +msgstr "" + +#: joanie/core/templates/mail/html/installments_fully_paid.html:235 +#, python-format +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.
" +msgstr "" + #: joanie/core/templates/mail/html/order_validated.html:188 #: joanie/core/templates/mail/text/order_validated.txt:5 #, python-format @@ -1448,157 +1601,211 @@ msgstr "" msgid "We wish you plenty of success in your training. 🎉" msgstr "" -#: joanie/core/templates/mail/html/order_validated.html:278 +#: joanie/core/templates/mail/text/installment_paid.txt:12 #, python-format -msgid "This mail has been sent to %(email)s by %(name)s" +msgid " For the course %(title)s, the %(targeted_installment_index)s installment has been successfully paid.\n" msgstr "" -#: joanie/core/templates/mail/text/order_validated.txt:11 +#: joanie/core/templates/mail/text/installment_paid.txt:15 #, python-format -msgid "You have bought %(title)s for a price of %(price)s." +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.\n" +"Currently, it remains %(remaining_balance_to_pay)s to be paid. The next installment will be debited on %(date_next_installment_to_pay)s. " msgstr "" +#: joanie/core/templates/mail/text/installment_paid.txt:41 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:40 +#, python-format +msgid " See order details on your dashboard [%(dashboard_order_link)s] " +msgstr "" + +#: joanie/core/templates/mail/text/installment_paid.txt:43 +#: joanie/core/templates/mail/text/installment_refused.txt:40 +#: joanie/core/templates/mail/text/installment_reminder.txt:40 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:42 #: joanie/core/templates/mail/text/order_validated.txt:16 #, python-format msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" msgstr "" -#: joanie/core/utils/contract_definition.py:17 +#: joanie/core/templates/mail/text/installment_refused.txt:12 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment debit has failed.\n" +"We have tried to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr "" + +#: joanie/core/templates/mail/text/installment_refused.txt:38 +#, python-format +msgid " Please correct the failed payment as soon as possible using your dashboard [%(dashboard_order_link)s]. " +msgstr "" + +#: joanie/core/templates/mail/text/installment_reminder.txt:12 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment will be withdrawn on %(days_until_debit)s days.\n" +"We will try to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr "" + +#: joanie/core/templates/mail/text/installment_reminder.txt:38 +#, python-format +msgid " See order details on your dashboard : dashboard [%(dashboard_order_link)s] " +msgstr "" + +#: joanie/core/templates/mail/text/installments_fully_paid.txt:12 +#, python-format +msgid " For the course %(title)s, we have just debited the last installment. Your order is now fully paid! " +msgstr "" + +#: joanie/core/templates/mail/text/installments_fully_paid.txt:14 +#, python-format +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.\n" +msgstr "" + +#: joanie/core/templates/mail/text/order_validated.txt:11 +#, python-format +msgid "You have bought %(title)s for a price of %(price)s." +msgstr "" + +#: joanie/core/utils/contract_definition.py:20 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:18 +#: joanie/core/utils/contract_definition.py:21 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:19 +#: joanie/core/utils/contract_definition.py:22 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:20 +#: joanie/core/utils/contract_definition.py:23 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:21 +#: joanie/core/utils/contract_definition.py:24 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:22 +#: joanie/core/utils/contract_definition.py:25 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:23 +#: joanie/core/utils/contract_definition.py:26 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:29 +#: joanie/core/utils/contract_definition.py:37 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:30 +#: joanie/core/utils/contract_definition.py:38 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:31 +#: joanie/core/utils/contract_definition.py:39 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:32 +#: joanie/core/utils/contract_definition.py:40 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:33 +#: joanie/core/utils/contract_definition.py:41 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:34 +#: joanie/core/utils/contract_definition.py:42 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:35 +#: joanie/core/utils/contract_definition.py:43 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:93 +#: joanie/core/utils/contract_definition.py:87 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:94 +#: joanie/core/utils/contract_definition.py:88 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:95 +#: joanie/core/utils/contract_definition.py:89 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:96 +#: joanie/core/utils/contract_definition.py:90 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:97 +#: joanie/core/utils/contract_definition.py:91 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:98 +#: joanie/core/utils/contract_definition.py:92 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:99 +#: joanie/core/utils/contract_definition.py:93 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:100 +#: joanie/core/utils/contract_definition.py:94 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:101 +#: joanie/core/utils/contract_definition.py:95 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:102 +#: joanie/core/utils/contract_definition.py:96 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:105 +#: joanie/core/utils/contract_definition.py:99 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:106 +#: joanie/core/utils/contract_definition.py:100 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:109 +#: joanie/core/utils/contract_definition.py:103 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:110 +#: joanie/core/utils/contract_definition.py:104 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:112 +#: joanie/core/utils/contract_definition.py:106 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:113 +#: joanie/core/utils/contract_definition.py:107 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:114 +#: joanie/core/utils/contract_definition.py:108 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:117 +#: joanie/core/utils/contract_definition.py:112 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:118 +#: joanie/core/utils/contract_definition.py:113 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:119 +#: joanie/core/utils/contract_definition.py:114 msgid "" msgstr "" +#: joanie/core/utils/payment_schedule.py:213 +#: joanie/payment/backends/base.py:102 +#, python-brace-format +msgid "{settings.JOANIE_CATALOG_NAME} - {product_title} - " +msgstr "" + #: joanie/payment/admin.py:230 msgid "To get results, choose an owner on the right" msgstr "" @@ -1607,8 +1814,23 @@ msgstr "" msgid "Joanie payment application" msgstr "" -#: joanie/payment/backends/base.py:87 joanie/payment/backends/base.py:103 -msgid "Purchase order confirmed!" +#: joanie/payment/backends/base.py:75 joanie/payment/backends/base.py:77 +msgid "Subscription confirmed!" +msgstr "" + +#: joanie/payment/backends/base.py:107 +#, python-brace-format +msgid "An installment has been successfully paid of {installment_amount} {currency}" +msgstr "" + +#: joanie/payment/backends/base.py:111 +#, python-brace-format +msgid "Order completed ! The last installment of {installment_amount} {currency} has been debited" +msgstr "" + +#: joanie/payment/backends/base.py:154 +#, python-brace-format +msgid "{catalog_name} - {product_title} - An installment debit has failed {installment_amount:.2f} {currency}" msgstr "" #: joanie/payment/enums.py:26 @@ -1627,19 +1849,19 @@ msgstr "" msgid "Cannot create a payment." msgstr "" -#: joanie/payment/exceptions.py:30 +#: joanie/payment/exceptions.py:30 joanie/payment/exceptions.py:38 msgid "Cannot register this payment." msgstr "" -#: joanie/payment/exceptions.py:38 +#: joanie/payment/exceptions.py:46 msgid "Cannot refund this payment." msgstr "" -#: joanie/payment/exceptions.py:46 +#: joanie/payment/exceptions.py:54 msgid "Cannot parse notification." msgstr "" -#: joanie/payment/exceptions.py:54 +#: joanie/payment/exceptions.py:62 msgid "Payment provider API error." msgstr "" diff --git a/src/backend/locale/fr_CA/LC_MESSAGES/django.mo b/src/backend/locale/fr_CA/LC_MESSAGES/django.mo index d04ad70f8ef47b047af206116bae595a29b30326..4fea18224d7a9a02082e21590b0d6351dedaf9a0 100755 GIT binary patch delta 22 dcmcc0e3f}Z6Stv(uA!NNfu)s+*~VTEMgUOg26q4e delta 22 dcmcc0e3f}Z6Ssk-u92~Vfu)s^;l^GMMgUPA26g}d diff --git a/src/backend/locale/fr_CA/LC_MESSAGES/django.po b/src/backend/locale/fr_CA/LC_MESSAGES/django.po index f2e7bf81f..0a64cb0a6 100644 --- a/src/backend/locale/fr_CA/LC_MESSAGES/django.po +++ b/src/backend/locale/fr_CA/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: joanie\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-19 12:20+0000\n" -"PO-Revision-Date: 2024-09-23 09:21\n" +"POT-Creation-Date: 2024-10-16 09:22+0000\n" +"PO-Revision-Date: 2024-10-16 09:46\n" "Last-Translator: \n" "Language-Team: French, Canada\n" "Language: fr_CA\n" @@ -110,11 +110,11 @@ msgstr[0] "" msgstr[1] "" #: joanie/core/admin.py:64 joanie/core/models/course_wishes.py:25 -#: joanie/core/models/courses.py:496 +#: joanie/core/models/courses.py:497 msgid "Course" msgstr "" -#: joanie/core/admin.py:71 joanie/core/models/products.py:107 +#: joanie/core/admin.py:71 joanie/core/models/products.py:113 #: joanie/core/templates/issuers/invoice.html:78 msgid "Product" msgstr "" @@ -129,7 +129,7 @@ msgstr "" msgid "Owner" msgstr "" -#: joanie/core/admin.py:106 joanie/core/models/courses.py:812 +#: joanie/core/admin.py:106 joanie/core/models/courses.py:831 msgid "Course run" msgstr "" @@ -166,23 +166,23 @@ msgstr "" msgid "Important dates" msgstr "" -#: joanie/core/admin.py:592 +#: joanie/core/admin.py:591 msgid "Cancel selected orders" msgstr "" -#: joanie/core/admin.py:644 +#: joanie/core/admin.py:643 msgid "To get results, choose a user on the right" msgstr "" -#: joanie/core/admin.py:688 +#: joanie/core/admin.py:687 msgid "To get results, choose an owner or an organization on the right" msgstr "" -#: joanie/core/admin.py:717 +#: joanie/core/admin.py:716 msgid "Config field" msgstr "" -#: joanie/core/admin.py:718 +#: joanie/core/admin.py:717 msgid "Config fields" msgstr "" @@ -198,148 +198,155 @@ msgstr "" msgid "Credential" msgstr "" -#: joanie/core/enums.py:34 joanie/core/enums.py:151 -#: joanie/core/models/courses.py:1014 +#: joanie/core/enums.py:34 joanie/core/enums.py:159 +#: joanie/core/models/courses.py:1033 msgid "Enrollment" msgstr "" -#: joanie/core/enums.py:37 joanie/core/enums.py:142 +#: joanie/core/enums.py:37 joanie/core/enums.py:150 #: joanie/core/models/certifications.py:116 #: joanie/core/templates/issuers/degree.html:27 msgid "Certificate" msgstr "" -#: joanie/core/enums.py:71 +#: joanie/core/enums.py:75 msgid "Draft" msgstr "" -#: joanie/core/enums.py:72 -msgid "Submitted" +#: joanie/core/enums.py:76 +msgid "Assigned" msgstr "" -#: joanie/core/enums.py:73 joanie/core/enums.py:183 -msgid "Pending" +#: joanie/core/enums.py:77 +msgid "To save payment method" msgstr "" -#: joanie/core/enums.py:74 -msgctxt "As in: the order is cancelled." -msgid "Canceled" +#: joanie/core/enums.py:78 +msgid "To sign" msgstr "" -#: joanie/core/enums.py:77 -msgctxt "As in: the order is validated." -msgid "Validated" +#: joanie/core/enums.py:79 +msgid "Signing" +msgstr "" + +#: joanie/core/enums.py:80 joanie/core/enums.py:191 +msgid "Pending" msgstr "" #: joanie/core/enums.py:81 +msgctxt "As in: the order is canceled." +msgid "Canceled" +msgstr "" + +#: joanie/core/enums.py:84 msgctxt "As in: the order payment is pending." msgid "Pending payment" msgstr "" -#: joanie/core/enums.py:85 +#: joanie/core/enums.py:88 msgctxt "As in: the last order payment has failed." msgid "Failed payment" msgstr "" -#: joanie/core/enums.py:89 +#: joanie/core/enums.py:92 msgctxt "As in: the first order payment has failed." msgid "No payment" msgstr "" -#: joanie/core/enums.py:93 +#: joanie/core/enums.py:96 msgctxt "As in: the order is completed." msgid "Completed" msgstr "" -#: joanie/core/enums.py:110 +#: joanie/core/enums.py:118 msgctxt "As in: the enrollment was successfully set on the LMS." msgid "Set" msgstr "" -#: joanie/core/enums.py:114 +#: joanie/core/enums.py:122 msgctxt "As in: the enrollment failed on the LMS." msgid "Failed" msgstr "" -#: joanie/core/enums.py:121 +#: joanie/core/enums.py:129 msgid "Contract Definition" msgstr "" -#: joanie/core/enums.py:129 +#: joanie/core/enums.py:137 msgid "Unsigned" msgstr "" -#: joanie/core/enums.py:132 +#: joanie/core/enums.py:140 msgid "Partially signed" msgstr "" -#: joanie/core/enums.py:134 +#: joanie/core/enums.py:142 msgid "Signed" msgstr "" -#: joanie/core/enums.py:143 +#: joanie/core/enums.py:151 msgid "Degree" msgstr "" -#: joanie/core/enums.py:150 joanie/core/models/products.py:518 +#: joanie/core/enums.py:158 joanie/core/models/products.py:531 msgid "Order" msgstr "" -#: joanie/core/enums.py:161 +#: joanie/core/enums.py:169 msgid "Info" msgstr "" -#: joanie/core/enums.py:162 +#: joanie/core/enums.py:170 msgid "Success" msgstr "" -#: joanie/core/enums.py:163 +#: joanie/core/enums.py:171 msgid "Warning" msgstr "" -#: joanie/core/enums.py:164 +#: joanie/core/enums.py:172 msgid "Error" msgstr "" -#: joanie/core/enums.py:173 +#: joanie/core/enums.py:181 msgid "Notification" msgstr "" -#: joanie/core/enums.py:174 +#: joanie/core/enums.py:182 msgid "Payment succeeded" msgstr "" -#: joanie/core/enums.py:175 +#: joanie/core/enums.py:183 msgid "Payment failed" msgstr "" -#: joanie/core/enums.py:184 joanie/payment/enums.py:28 +#: joanie/core/enums.py:192 joanie/payment/enums.py:28 msgid "Paid" msgstr "" -#: joanie/core/enums.py:185 +#: joanie/core/enums.py:193 msgid "Refused" msgstr "" -#: joanie/core/factories.py:801 joanie/core/utils/contract_definition.py:107 +#: joanie/core/factories.py:1141 joanie/core/utils/contract_definition.py:101 msgid "" msgstr "" -#: joanie/core/factories.py:806 joanie/core/utils/contract_definition.py:108 +#: joanie/core/factories.py:1146 joanie/core/utils/contract_definition.py:102 msgid "" msgstr "" -#: joanie/core/factories.py:813 +#: joanie/core/factories.py:1153 msgid "" msgstr "" #: joanie/core/fields/multiselect.py:28 -#: joanie/core/templatetags/extra_tags.py:32 +#: joanie/core/templatetags/extra_tags.py:38 msgid "{:s} and {:s}" msgstr "" #: joanie/core/fields/multiselect.py:32 -#: joanie/core/templatetags/extra_tags.py:36 +#: joanie/core/templatetags/extra_tags.py:42 msgid " and " msgstr "" @@ -411,8 +418,8 @@ msgstr "" #: joanie/core/models/accounts.py:154 joanie/core/models/certifications.py:33 #: joanie/core/models/contracts.py:29 joanie/core/models/courses.py:170 -#: joanie/core/models/courses.py:470 joanie/core/models/courses.py:783 -#: joanie/core/models/products.py:68 joanie/payment/models.py:394 +#: joanie/core/models/courses.py:471 joanie/core/models/courses.py:802 +#: joanie/core/models/products.py:74 joanie/payment/models.py:394 msgid "title" msgstr "" @@ -440,14 +447,14 @@ msgstr "" msgid "last name" msgstr "" -#: joanie/core/models/accounts.py:163 joanie/core/models/courses.py:357 -#: joanie/core/models/courses.py:587 joanie/core/models/products.py:463 +#: joanie/core/models/accounts.py:163 joanie/core/models/courses.py:358 +#: joanie/core/models/courses.py:606 joanie/core/models/products.py:466 #: joanie/payment/models.py:403 msgid "owner" msgstr "" #: joanie/core/models/accounts.py:171 joanie/core/models/certifications.py:97 -#: joanie/core/models/products.py:406 +#: joanie/core/models/products.py:409 msgid "organization" msgstr "" @@ -475,11 +482,11 @@ msgstr "" msgid "Main address must be reusable." msgstr "" -#: joanie/core/models/accounts.py:231 +#: joanie/core/models/accounts.py:255 msgid "Demote a main address is forbidden" msgstr "" -#: joanie/core/models/activity_logs.py:63 joanie/core/models/courses.py:992 +#: joanie/core/models/activity_logs.py:63 joanie/core/models/courses.py:1011 msgid "user" msgstr "" @@ -488,12 +495,12 @@ msgid "level" msgstr "" #: joanie/core/models/activity_logs.py:74 -#: joanie/core/models/certifications.py:108 joanie/core/models/contracts.py:90 +#: joanie/core/models/certifications.py:108 joanie/core/models/contracts.py:96 #: joanie/payment/models.py:74 msgid "context" msgstr "" -#: joanie/core/models/activity_logs.py:78 joanie/core/models/products.py:65 +#: joanie/core/models/activity_logs.py:78 joanie/core/models/products.py:71 msgid "type" msgstr "" @@ -550,7 +557,7 @@ msgid "name" msgstr "" #: joanie/core/models/certifications.py:34 joanie/core/models/contracts.py:30 -#: joanie/core/models/products.py:69 +#: joanie/core/models/products.py:75 msgid "description" msgstr "" @@ -571,16 +578,16 @@ msgstr "" msgid "Date of issuance" msgstr "" -#: joanie/core/models/certifications.py:82 joanie/core/models/contracts.py:80 -#: joanie/core/models/products.py:1143 joanie/payment/models.py:54 +#: joanie/core/models/certifications.py:82 joanie/core/models/contracts.py:86 +#: joanie/core/models/products.py:1276 joanie/payment/models.py:54 msgid "order" msgstr "" -#: joanie/core/models/certifications.py:91 joanie/core/models/products.py:428 +#: joanie/core/models/certifications.py:91 joanie/core/models/products.py:431 msgid "enrollment" msgstr "" -#: joanie/core/models/certifications.py:102 +#: joanie/core/models/certifications.py:102 joanie/core/models/contracts.py:46 msgid "images" msgstr "" @@ -600,48 +607,48 @@ msgstr "" msgid "Language of the contract definition" msgstr "" -#: joanie/core/models/contracts.py:40 +#: joanie/core/models/contracts.py:39 msgid "template name" msgstr "" -#: joanie/core/models/contracts.py:48 joanie/core/models/contracts.py:73 -#: joanie/core/models/products.py:99 +#: joanie/core/models/contracts.py:54 joanie/core/models/contracts.py:79 +#: joanie/core/models/products.py:105 msgid "Contract definition" msgstr "" -#: joanie/core/models/contracts.py:49 +#: joanie/core/models/contracts.py:55 msgid "Contract definitions" msgstr "" -#: joanie/core/models/contracts.py:92 +#: joanie/core/models/contracts.py:98 msgid "Localized data snapshot on contract signature" msgstr "" -#: joanie/core/models/contracts.py:102 +#: joanie/core/models/contracts.py:108 msgid "Reference in the external signature backend" msgstr "" -#: joanie/core/models/contracts.py:107 +#: joanie/core/models/contracts.py:113 msgid "Date and time we send the contract to signature provider" msgstr "" -#: joanie/core/models/contracts.py:115 +#: joanie/core/models/contracts.py:121 msgid "Date and time of issuance" msgstr "" -#: joanie/core/models/contracts.py:121 +#: joanie/core/models/contracts.py:127 msgid "organization signatory" msgstr "" -#: joanie/core/models/contracts.py:129 +#: joanie/core/models/contracts.py:135 msgid "Date and time the organization signed the contract" msgstr "" -#: joanie/core/models/contracts.py:137 +#: joanie/core/models/contracts.py:143 msgid "Contract" msgstr "" -#: joanie/core/models/contracts.py:138 +#: joanie/core/models/contracts.py:144 msgid "Contracts" msgstr "" @@ -689,7 +696,7 @@ msgstr "" msgid "forever open" msgstr "" -#: joanie/core/models/courses.py:168 joanie/core/models/courses.py:467 +#: joanie/core/models/courses.py:168 joanie/core/models/courses.py:468 msgid "code" msgstr "" @@ -761,388 +768,396 @@ msgstr "" msgid "Both signatory representative fields must be set." msgstr "" -#: joanie/core/models/courses.py:358 joanie/core/models/courses.py:588 +#: joanie/core/models/courses.py:359 joanie/core/models/courses.py:607 msgid "administrator" msgstr "" -#: joanie/core/models/courses.py:359 +#: joanie/core/models/courses.py:360 msgid "member" msgstr "" -#: joanie/core/models/courses.py:374 +#: joanie/core/models/courses.py:375 msgid "Organization access" msgstr "" -#: joanie/core/models/courses.py:375 +#: joanie/core/models/courses.py:376 msgid "Organization accesses" msgstr "" -#: joanie/core/models/courses.py:468 +#: joanie/core/models/courses.py:469 msgid "cover" msgstr "" -#: joanie/core/models/courses.py:475 joanie/core/models/courses.py:718 +#: joanie/core/models/courses.py:476 joanie/core/models/courses.py:737 msgid "organizations" msgstr "" -#: joanie/core/models/courses.py:482 +#: joanie/core/models/courses.py:483 msgid "products" msgstr "" -#: joanie/core/models/courses.py:497 +#: joanie/core/models/courses.py:498 msgid "Courses" msgstr "" -#: joanie/core/models/courses.py:589 +#: joanie/core/models/courses.py:608 msgid "instructor" msgstr "" -#: joanie/core/models/courses.py:590 +#: joanie/core/models/courses.py:609 msgid "manager" msgstr "" -#: joanie/core/models/courses.py:607 +#: joanie/core/models/courses.py:626 msgid "Course access" msgstr "" -#: joanie/core/models/courses.py:608 +#: joanie/core/models/courses.py:627 msgid "Course accesses" msgstr "" -#: joanie/core/models/courses.py:705 joanie/core/models/courses.py:777 -#: joanie/core/models/products.py:275 joanie/core/models/products.py:421 -#: joanie/core/models/products.py:1131 +#: joanie/core/models/courses.py:724 joanie/core/models/courses.py:796 +#: joanie/core/models/products.py:281 joanie/core/models/products.py:424 +#: joanie/core/models/products.py:1264 msgid "course" msgstr "" -#: joanie/core/models/courses.py:711 joanie/core/models/products.py:281 -#: joanie/core/models/products.py:413 +#: joanie/core/models/courses.py:730 joanie/core/models/products.py:287 +#: joanie/core/models/products.py:416 msgid "product" msgstr "" -#: joanie/core/models/courses.py:724 +#: joanie/core/models/courses.py:743 msgid "Course relation to a product" msgstr "" -#: joanie/core/models/courses.py:725 +#: joanie/core/models/courses.py:744 msgid "Courses relations to products" msgstr "" -#: joanie/core/models/courses.py:739 +#: joanie/core/models/courses.py:758 msgid "You cannot delete this course product relation." msgstr "" -#: joanie/core/models/courses.py:781 +#: joanie/core/models/courses.py:800 msgid "resource link" msgstr "" -#: joanie/core/models/courses.py:786 +#: joanie/core/models/courses.py:805 msgid "course start" msgstr "" -#: joanie/core/models/courses.py:787 +#: joanie/core/models/courses.py:806 msgid "course end" msgstr "" -#: joanie/core/models/courses.py:789 +#: joanie/core/models/courses.py:808 msgid "enrollment date" msgstr "" -#: joanie/core/models/courses.py:790 +#: joanie/core/models/courses.py:809 msgid "enrollment end" msgstr "" -#: joanie/core/models/courses.py:798 +#: joanie/core/models/courses.py:817 msgid "The list of languages in which the course content is available." msgstr "" -#: joanie/core/models/courses.py:800 +#: joanie/core/models/courses.py:819 msgid "is gradable" msgstr "" -#: joanie/core/models/courses.py:802 +#: joanie/core/models/courses.py:821 msgid "is listed" msgstr "" -#: joanie/core/models/courses.py:805 +#: joanie/core/models/courses.py:824 msgid "If checked the course run will be included in the list of course runs available for enrollment on the related course page." msgstr "" -#: joanie/core/models/courses.py:813 +#: joanie/core/models/courses.py:832 msgid "Course runs" msgstr "" -#: joanie/core/models/courses.py:946 +#: joanie/core/models/courses.py:965 msgid "This course run relies on a product relation. So you cannot modify its course." msgstr "" -#: joanie/core/models/courses.py:986 +#: joanie/core/models/courses.py:1005 msgid "course run" msgstr "" -#: joanie/core/models/courses.py:997 +#: joanie/core/models/courses.py:1016 msgid "Ticked if the user is enrolled to the course run." msgstr "" -#: joanie/core/models/courses.py:1001 +#: joanie/core/models/courses.py:1020 msgid "state" msgstr "" -#: joanie/core/models/courses.py:1005 +#: joanie/core/models/courses.py:1024 msgid "Ticked if the enrollment has been initially created in the scope of an order." msgstr "" -#: joanie/core/models/courses.py:1007 +#: joanie/core/models/courses.py:1026 msgid "was created by order" msgstr "" -#: joanie/core/models/courses.py:1015 +#: joanie/core/models/courses.py:1034 msgid "Enrollments" msgstr "" -#: joanie/core/models/courses.py:1023 +#: joanie/core/models/courses.py:1042 msgid "active" msgstr "" -#: joanie/core/models/courses.py:1023 +#: joanie/core/models/courses.py:1042 msgid "inactive" msgstr "" -#: joanie/core/models/courses.py:1093 +#: joanie/core/models/courses.py:1112 msgid "You are not allowed to enroll to a course run not opened for enrollment." msgstr "" -#: joanie/core/models/courses.py:1109 +#: joanie/core/models/courses.py:1128 msgid "You are already enrolled to an opened course run " msgstr "" -#: joanie/core/models/courses.py:1120 +#: joanie/core/models/courses.py:1139 msgid "You cannot enroll to a non-listed course run out of the scope of an order." msgstr "" -#: joanie/core/models/courses.py:1145 +#: joanie/core/models/courses.py:1164 msgid "Course run \"{self.course_run.id!s}\" requires a valid order to enroll." msgstr "" -#: joanie/core/models/courses.py:1150 +#: joanie/core/models/courses.py:1169 msgid "You are not allowed to enroll to a course run not listed." msgstr "" -#: joanie/core/models/products.py:70 +#: joanie/core/models/products.py:76 msgid "instructions" msgstr "" -#: joanie/core/models/products.py:71 +#: joanie/core/models/products.py:77 msgid "call to action" msgstr "" -#: joanie/core/models/products.py:78 +#: joanie/core/models/products.py:84 msgid "target courses" msgstr "" -#: joanie/core/models/products.py:82 joanie/core/models/products.py:452 +#: joanie/core/models/products.py:88 joanie/core/models/products.py:455 msgid "price" msgstr "" -#: joanie/core/models/products.py:83 joanie/core/models/products.py:454 +#: joanie/core/models/products.py:89 joanie/core/models/products.py:457 msgid "tax included" msgstr "" -#: joanie/core/models/products.py:92 +#: joanie/core/models/products.py:98 msgid "certificate definition" msgstr "" -#: joanie/core/models/products.py:108 +#: joanie/core/models/products.py:114 msgid "Products" msgstr "" -#: joanie/core/models/products.py:255 +#: joanie/core/models/products.py:261 msgid "Certificate definition is only allowed for product kinds: " msgstr "" -#: joanie/core/models/products.py:290 joanie/core/models/products.py:1137 +#: joanie/core/models/products.py:296 joanie/core/models/products.py:1270 msgid "course runs" msgstr "" -#: joanie/core/models/products.py:293 +#: joanie/core/models/products.py:299 msgid "position in product" msgstr "" -#: joanie/core/models/products.py:295 joanie/core/models/products.py:1149 +#: joanie/core/models/products.py:301 joanie/core/models/products.py:1282 msgid "take into account for certification" msgstr "" -#: joanie/core/models/products.py:296 joanie/core/models/products.py:1150 +#: joanie/core/models/products.py:302 joanie/core/models/products.py:1283 msgid "Take into account the course grade for certification." msgstr "" -#: joanie/core/models/products.py:304 +#: joanie/core/models/products.py:310 msgid "Target course relation to a product with a position" msgstr "" -#: joanie/core/models/products.py:305 +#: joanie/core/models/products.py:311 msgid "Target courses relations to products with a position" msgstr "" -#: joanie/core/models/products.py:336 +#: joanie/core/models/products.py:342 msgid "Number of seats" msgstr "" -#: joanie/core/models/products.py:338 +#: joanie/core/models/products.py:344 msgid "The maximum number of orders that can be validated for a given order group" msgstr "" -#: joanie/core/models/products.py:343 +#: joanie/core/models/products.py:349 msgid "course product relation" msgstr "" -#: joanie/core/models/products.py:347 +#: joanie/core/models/products.py:353 msgid "is active" msgstr "" -#: joanie/core/models/products.py:437 +#: joanie/core/models/products.py:440 msgid "order group" msgstr "" -#: joanie/core/models/products.py:448 +#: joanie/core/models/products.py:451 msgid "courses" msgstr "" -#: joanie/core/models/products.py:469 +#: joanie/core/models/products.py:472 msgid "has consent to terms" msgstr "" -#: joanie/core/models/products.py:472 +#: joanie/core/models/products.py:475 msgid "User has consented to the platform terms and conditions." msgstr "" -#: joanie/core/models/products.py:480 +#: joanie/core/models/products.py:484 msgid "payment schedule" msgstr "" -#: joanie/core/models/products.py:481 +#: joanie/core/models/products.py:485 msgid "Payment schedule for the order." msgstr "" -#: joanie/core/models/products.py:519 +#: joanie/core/models/products.py:494 +msgid "credit card" +msgstr "" + +#: joanie/core/models/products.py:532 msgid "Orders" msgstr "" -#: joanie/core/models/products.py:604 +#: joanie/core/models/products.py:643 #, python-brace-format msgid "{required_field} field should be set for {self.product.type} products." msgstr "" -#: joanie/core/models/products.py:610 +#: joanie/core/models/products.py:649 #, python-brace-format msgid "{empty_field} field should be left empty for {self.product.type} products." msgstr "" -#: joanie/core/models/products.py:617 +#: joanie/core/models/products.py:656 msgid "The enrollment should belong to the owner of this order." msgstr "" -#: joanie/core/models/products.py:622 +#: joanie/core/models/products.py:661 msgid "Orders can't be placed on enrollments originating from an order." msgstr "" -#: joanie/core/models/products.py:633 +#: joanie/core/models/products.py:672 msgid "The order cannot be created on course run that is in archived state." msgstr "" -#: joanie/core/models/products.py:652 +#: joanie/core/models/products.py:691 #, python-brace-format msgid "This order cannot be linked to the product \"{product_title}\", " msgstr "" -#: joanie/core/models/products.py:658 +#: joanie/core/models/products.py:697 #, python-brace-format msgid "This order cannot be linked to the product \"{product_title}\" and " msgstr "" -#: joanie/core/models/products.py:852 +#: joanie/core/models/products.py:909 #, python-brace-format msgid "Product {self.product.title} does not allow to generate a certificate." msgstr "" -#: joanie/core/models/products.py:867 +#: joanie/core/models/products.py:924 msgid "No graded courses found." msgstr "" -#: joanie/core/models/products.py:883 +#: joanie/core/models/products.py:940 msgid "This order is not ready for gradation." msgstr "" -#: joanie/core/models/products.py:893 +#: joanie/core/models/products.py:950 msgid "Course run " msgstr "" -#: joanie/core/models/products.py:1147 +#: joanie/core/models/products.py:1280 msgid "position in order" msgstr "" -#: joanie/core/models/products.py:1158 +#: joanie/core/models/products.py:1291 msgid "Course relation to an order with a position" msgstr "" -#: joanie/core/models/products.py:1159 +#: joanie/core/models/products.py:1292 msgid "Courses relations to orders with a position" msgstr "" -#: joanie/core/models/site.py:21 +#: joanie/core/models/site.py:18 msgid "site" msgstr "" -#: joanie/core/models/site.py:27 +#: joanie/core/models/site.py:24 msgid "terms and conditions" msgstr "" -#: joanie/core/models/site.py:28 +#: joanie/core/models/site.py:25 msgid "Terms and conditions for the site in Markdown format." msgstr "" -#: joanie/core/models/site.py:35 +#: joanie/core/models/site.py:32 msgid "Site config" msgstr "" -#: joanie/core/models/site.py:36 +#: joanie/core/models/site.py:33 msgid "Site configs" msgstr "" -#: joanie/core/serializers/client.py:155 joanie/core/serializers/client.py:270 +#: joanie/core/serializers/client.py:156 joanie/core/serializers/client.py:271 msgid "You are only allowed to set role to {', '.join(can_set_role_to)}" msgstr "" -#: joanie/core/serializers/client.py:158 joanie/core/serializers/client.py:273 +#: joanie/core/serializers/client.py:159 joanie/core/serializers/client.py:274 msgid "You are not allowed to set this role for this course." msgstr "" -#: joanie/core/serializers/client.py:169 +#: joanie/core/serializers/client.py:170 msgid "You must set a course ID in context to create a new course access." msgstr "" -#: joanie/core/serializers/client.py:179 +#: joanie/core/serializers/client.py:180 msgid "You are not allowed to manage accesses for this course." msgstr "" -#: joanie/core/serializers/client.py:284 +#: joanie/core/serializers/client.py:285 msgid "You must set a organization ID in context to create a new organization access." msgstr "" -#: joanie/core/serializers/client.py:295 +#: joanie/core/serializers/client.py:296 msgid "You are not allowed to manage accesses for this organization." msgstr "" -#: joanie/core/serializers/client.py:1172 -msgid "You must accept the terms and conditions to proceed." -msgstr "" - #: joanie/core/templates/admin/base.html:5 msgid "Sentry tools" msgstr "" #: joanie/core/templates/certificate/verify.html:9 +#: joanie/core/templates/mail/html/installment_paid.html:159 +#: joanie/core/templates/mail/html/installment_refused.html:159 +#: joanie/core/templates/mail/html/installment_reminder.html:159 +#: joanie/core/templates/mail/html/installments_fully_paid.html:159 #: joanie/core/templates/mail/html/order_validated.html:159 +#: joanie/core/templates/mail/text/installment_paid.txt:3 +#: joanie/core/templates/mail/text/installment_refused.txt:3 +#: joanie/core/templates/mail/text/installment_reminder.txt:3 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:3 #: joanie/core/templates/mail/text/order_validated.txt:3 msgid "Company logo" msgstr "" @@ -1316,24 +1331,44 @@ msgstr "" msgid "Price of the course: " msgstr "" -#: joanie/core/templates/issuers/contract_definition.html:127 +#: joanie/core/templates/issuers/contract_definition.html:128 +msgid "Learner's signature :" +msgstr "" + +#: joanie/core/templates/issuers/contract_definition.html:134 +msgid "University representative's signature :" +msgstr "" + +#: joanie/core/templates/issuers/contract_definition.html:141 msgid "Appendices" msgstr "" -#: joanie/core/templates/issuers/contract_definition.html:130 -msgid "Terms and conditions" +#: joanie/core/templates/issuers/contract_definition.html:144 +#: joanie/core/templates/mail/html/installment_paid.html:259 +#: joanie/core/templates/mail/html/installment_refused.html:235 +#: joanie/core/templates/mail/html/installment_reminder.html:235 +#: joanie/core/templates/mail/html/installments_fully_paid.html:259 +#: joanie/core/templates/mail/text/installment_paid.txt:18 +#: joanie/core/templates/mail/text/installment_refused.txt:15 +#: joanie/core/templates/mail/text/installment_reminder.txt:15 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:17 +msgid "Payment schedule" msgstr "" -#: joanie/core/templates/issuers/contract_definition.html:134 -msgid "Catalog syllabus" +#: joanie/core/templates/issuers/contract_definition.html:148 +msgid "Due date" msgstr "" -#: joanie/core/templates/issuers/contract_definition.html:140 -msgid "Learner's signature :" +#: joanie/core/templates/issuers/contract_definition.html:149 +msgid "Amount" msgstr "" -#: joanie/core/templates/issuers/contract_definition.html:146 -msgid "University representative's signature :" +#: joanie/core/templates/issuers/contract_definition.html:155 +msgid "Total :" +msgstr "" + +#: joanie/core/templates/issuers/contract_definition.html:173 +msgid "Catalog syllabus" msgstr "" #: joanie/core/templates/issuers/degree.html:29 @@ -1417,6 +1452,124 @@ msgstr "" msgid "Sales Tax VAT" msgstr "" +#: joanie/core/templates/mail/html/installment_paid.html:187 +#: joanie/core/templates/mail/html/installment_refused.html:187 +#: joanie/core/templates/mail/html/installment_reminder.html:187 +#: joanie/core/templates/mail/html/installments_fully_paid.html:187 +#: joanie/core/templates/mail/text/installment_paid.txt:7 +#: joanie/core/templates/mail/text/installment_refused.txt:7 +#: joanie/core/templates/mail/text/installment_reminder.txt:7 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:7 +#, python-format +msgid " Hello %(name)s, " +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:187 +#: joanie/core/templates/mail/html/installment_refused.html:187 +#: joanie/core/templates/mail/html/installment_reminder.html:187 +#: joanie/core/templates/mail/html/installments_fully_paid.html:187 +#: joanie/core/templates/mail/text/installment_paid.txt:9 +#: joanie/core/templates/mail/text/installment_refused.txt:9 +#: joanie/core/templates/mail/text/installment_reminder.txt:9 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:9 +msgid "Hello," +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:211 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment has been successfully paid.
" +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:235 +#, python-format +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.
Currently, it remains %(remaining_balance_to_pay)s to be paid. The next installment will be debited on %(date_next_installment_to_pay)s. " +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:293 +#: joanie/core/templates/mail/html/installment_refused.html:269 +#: joanie/core/templates/mail/html/installment_reminder.html:269 +#: joanie/core/templates/mail/html/installments_fully_paid.html:293 +#: joanie/core/templates/mail/text/installment_paid.txt:22 +#: joanie/core/templates/mail/text/installment_refused.txt:19 +#: joanie/core/templates/mail/text/installment_reminder.txt:19 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:21 +#, python-format +msgid " Withdrawn on %(installment_date)s " +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:297 +#: joanie/core/templates/mail/html/installment_paid.html:299 +#: joanie/core/templates/mail/html/installment_paid.html:301 +#: joanie/core/templates/mail/html/installment_refused.html:273 +#: joanie/core/templates/mail/html/installment_refused.html:275 +#: joanie/core/templates/mail/html/installment_refused.html:277 +#: joanie/core/templates/mail/html/installment_reminder.html:273 +#: joanie/core/templates/mail/html/installment_reminder.html:275 +#: joanie/core/templates/mail/html/installment_reminder.html:277 +#: joanie/core/templates/mail/html/installments_fully_paid.html:297 +#: joanie/core/templates/mail/html/installments_fully_paid.html:299 +#: joanie/core/templates/mail/html/installments_fully_paid.html:301 +#: joanie/core/templates/mail/text/installment_paid.txt:26 +#: joanie/core/templates/mail/text/installment_paid.txt:30 +#: joanie/core/templates/mail/text/installment_paid.txt:34 +#: joanie/core/templates/mail/text/installment_refused.txt:23 +#: joanie/core/templates/mail/text/installment_refused.txt:27 +#: joanie/core/templates/mail/text/installment_refused.txt:31 +#: joanie/core/templates/mail/text/installment_reminder.txt:23 +#: joanie/core/templates/mail/text/installment_reminder.txt:27 +#: joanie/core/templates/mail/text/installment_reminder.txt:31 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:25 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:29 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:33 +#, python-format +msgid "%(state)s" +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:344 +#: joanie/core/templates/mail/html/installments_fully_paid.html:344 +#, python-format +msgid " See order details on your dashboard " +msgstr "" + +#: joanie/core/templates/mail/html/installment_paid.html:374 +#: joanie/core/templates/mail/html/installment_refused.html:350 +#: joanie/core/templates/mail/html/installment_reminder.html:350 +#: joanie/core/templates/mail/html/installments_fully_paid.html:374 +#: joanie/core/templates/mail/html/order_validated.html:278 +#, python-format +msgid "This mail has been sent to %(email)s by %(name)s" +msgstr "" + +#: joanie/core/templates/mail/html/installment_refused.html:211 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment debit has failed.
We have tried to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr "" + +#: joanie/core/templates/mail/html/installment_refused.html:320 +#, python-format +msgid " Please correct the failed payment as soon as possible using your dashboard. " +msgstr "" + +#: joanie/core/templates/mail/html/installment_reminder.html:211 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment will be withdrawn on %(days_until_debit)s days.
We will try to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr "" + +#: joanie/core/templates/mail/html/installment_reminder.html:320 +#, python-format +msgid " See order details on your dashboard : dashboard " +msgstr "" + +#: joanie/core/templates/mail/html/installments_fully_paid.html:211 +#, python-format +msgid " For the course %(title)s, we have just debited the last installment. Your order is now fully paid! " +msgstr "" + +#: joanie/core/templates/mail/html/installments_fully_paid.html:235 +#, python-format +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.
" +msgstr "" + #: joanie/core/templates/mail/html/order_validated.html:188 #: joanie/core/templates/mail/text/order_validated.txt:5 #, python-format @@ -1448,157 +1601,211 @@ msgstr "" msgid "We wish you plenty of success in your training. 🎉" msgstr "" -#: joanie/core/templates/mail/html/order_validated.html:278 +#: joanie/core/templates/mail/text/installment_paid.txt:12 #, python-format -msgid "This mail has been sent to %(email)s by %(name)s" +msgid " For the course %(title)s, the %(targeted_installment_index)s installment has been successfully paid.\n" msgstr "" -#: joanie/core/templates/mail/text/order_validated.txt:11 +#: joanie/core/templates/mail/text/installment_paid.txt:15 #, python-format -msgid "You have bought %(title)s for a price of %(price)s." +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.\n" +"Currently, it remains %(remaining_balance_to_pay)s to be paid. The next installment will be debited on %(date_next_installment_to_pay)s. " msgstr "" +#: joanie/core/templates/mail/text/installment_paid.txt:41 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:40 +#, python-format +msgid " See order details on your dashboard [%(dashboard_order_link)s] " +msgstr "" + +#: joanie/core/templates/mail/text/installment_paid.txt:43 +#: joanie/core/templates/mail/text/installment_refused.txt:40 +#: joanie/core/templates/mail/text/installment_reminder.txt:40 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:42 #: joanie/core/templates/mail/text/order_validated.txt:16 #, python-format msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" msgstr "" -#: joanie/core/utils/contract_definition.py:17 +#: joanie/core/templates/mail/text/installment_refused.txt:12 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment debit has failed.\n" +"We have tried to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr "" + +#: joanie/core/templates/mail/text/installment_refused.txt:38 +#, python-format +msgid " Please correct the failed payment as soon as possible using your dashboard [%(dashboard_order_link)s]. " +msgstr "" + +#: joanie/core/templates/mail/text/installment_reminder.txt:12 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment will be withdrawn on %(days_until_debit)s days.\n" +"We will try to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr "" + +#: joanie/core/templates/mail/text/installment_reminder.txt:38 +#, python-format +msgid " See order details on your dashboard : dashboard [%(dashboard_order_link)s] " +msgstr "" + +#: joanie/core/templates/mail/text/installments_fully_paid.txt:12 +#, python-format +msgid " For the course %(title)s, we have just debited the last installment. Your order is now fully paid! " +msgstr "" + +#: joanie/core/templates/mail/text/installments_fully_paid.txt:14 +#, python-format +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.\n" +msgstr "" + +#: joanie/core/templates/mail/text/order_validated.txt:11 +#, python-format +msgid "You have bought %(title)s for a price of %(price)s." +msgstr "" + +#: joanie/core/utils/contract_definition.py:20 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:18 +#: joanie/core/utils/contract_definition.py:21 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:19 +#: joanie/core/utils/contract_definition.py:22 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:20 +#: joanie/core/utils/contract_definition.py:23 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:21 +#: joanie/core/utils/contract_definition.py:24 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:22 +#: joanie/core/utils/contract_definition.py:25 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:23 +#: joanie/core/utils/contract_definition.py:26 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:29 +#: joanie/core/utils/contract_definition.py:37 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:30 +#: joanie/core/utils/contract_definition.py:38 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:31 +#: joanie/core/utils/contract_definition.py:39 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:32 +#: joanie/core/utils/contract_definition.py:40 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:33 +#: joanie/core/utils/contract_definition.py:41 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:34 +#: joanie/core/utils/contract_definition.py:42 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:35 +#: joanie/core/utils/contract_definition.py:43 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:93 +#: joanie/core/utils/contract_definition.py:87 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:94 +#: joanie/core/utils/contract_definition.py:88 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:95 +#: joanie/core/utils/contract_definition.py:89 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:96 +#: joanie/core/utils/contract_definition.py:90 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:97 +#: joanie/core/utils/contract_definition.py:91 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:98 +#: joanie/core/utils/contract_definition.py:92 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:99 +#: joanie/core/utils/contract_definition.py:93 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:100 +#: joanie/core/utils/contract_definition.py:94 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:101 +#: joanie/core/utils/contract_definition.py:95 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:102 +#: joanie/core/utils/contract_definition.py:96 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:105 +#: joanie/core/utils/contract_definition.py:99 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:106 +#: joanie/core/utils/contract_definition.py:100 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:109 +#: joanie/core/utils/contract_definition.py:103 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:110 +#: joanie/core/utils/contract_definition.py:104 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:112 +#: joanie/core/utils/contract_definition.py:106 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:113 +#: joanie/core/utils/contract_definition.py:107 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:114 +#: joanie/core/utils/contract_definition.py:108 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:117 +#: joanie/core/utils/contract_definition.py:112 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:118 +#: joanie/core/utils/contract_definition.py:113 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:119 +#: joanie/core/utils/contract_definition.py:114 msgid "" msgstr "" +#: joanie/core/utils/payment_schedule.py:213 +#: joanie/payment/backends/base.py:102 +#, python-brace-format +msgid "{settings.JOANIE_CATALOG_NAME} - {product_title} - " +msgstr "" + #: joanie/payment/admin.py:230 msgid "To get results, choose an owner on the right" msgstr "" @@ -1607,8 +1814,23 @@ msgstr "" msgid "Joanie payment application" msgstr "" -#: joanie/payment/backends/base.py:87 joanie/payment/backends/base.py:103 -msgid "Purchase order confirmed!" +#: joanie/payment/backends/base.py:75 joanie/payment/backends/base.py:77 +msgid "Subscription confirmed!" +msgstr "" + +#: joanie/payment/backends/base.py:107 +#, python-brace-format +msgid "An installment has been successfully paid of {installment_amount} {currency}" +msgstr "" + +#: joanie/payment/backends/base.py:111 +#, python-brace-format +msgid "Order completed ! The last installment of {installment_amount} {currency} has been debited" +msgstr "" + +#: joanie/payment/backends/base.py:154 +#, python-brace-format +msgid "{catalog_name} - {product_title} - An installment debit has failed {installment_amount:.2f} {currency}" msgstr "" #: joanie/payment/enums.py:26 @@ -1627,19 +1849,19 @@ msgstr "" msgid "Cannot create a payment." msgstr "" -#: joanie/payment/exceptions.py:30 +#: joanie/payment/exceptions.py:30 joanie/payment/exceptions.py:38 msgid "Cannot register this payment." msgstr "" -#: joanie/payment/exceptions.py:38 +#: joanie/payment/exceptions.py:46 msgid "Cannot refund this payment." msgstr "" -#: joanie/payment/exceptions.py:46 +#: joanie/payment/exceptions.py:54 msgid "Cannot parse notification." msgstr "" -#: joanie/payment/exceptions.py:54 +#: joanie/payment/exceptions.py:62 msgid "Payment provider API error." msgstr "" diff --git a/src/backend/locale/fr_FR/LC_MESSAGES/django.mo b/src/backend/locale/fr_FR/LC_MESSAGES/django.mo index 0ecee5628e55f1b4ce9722a530e917bfe3403d20..21447a8484320692dc72d852c516e38d00260520 100755 GIT binary patch literal 42770 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 delta 9293 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 diff --git a/src/backend/locale/fr_FR/LC_MESSAGES/django.po b/src/backend/locale/fr_FR/LC_MESSAGES/django.po index 28f674f36..a15b42b02 100644 --- a/src/backend/locale/fr_FR/LC_MESSAGES/django.po +++ b/src/backend/locale/fr_FR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: joanie\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-19 12:20+0000\n" -"PO-Revision-Date: 2024-09-23 09:24\n" +"POT-Creation-Date: 2024-10-16 09:22+0000\n" +"PO-Revision-Date: 2024-10-16 09:46\n" "Last-Translator: \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -110,11 +110,11 @@ msgstr[0] "{:d} certificat a été généré." msgstr[1] "{:d} certificats ont été générés." #: joanie/core/admin.py:64 joanie/core/models/course_wishes.py:25 -#: joanie/core/models/courses.py:496 +#: joanie/core/models/courses.py:497 msgid "Course" msgstr "Cours" -#: joanie/core/admin.py:71 joanie/core/models/products.py:107 +#: joanie/core/admin.py:71 joanie/core/models/products.py:113 #: joanie/core/templates/issuers/invoice.html:78 msgid "Product" msgstr "Produit" @@ -129,7 +129,7 @@ msgstr "Établissement" msgid "Owner" msgstr "Propriétaire" -#: joanie/core/admin.py:106 joanie/core/models/courses.py:812 +#: joanie/core/admin.py:106 joanie/core/models/courses.py:831 msgid "Course run" msgstr "Session de cours" @@ -166,23 +166,23 @@ msgstr "Permissions" msgid "Important dates" msgstr "Dates importantes" -#: joanie/core/admin.py:592 +#: joanie/core/admin.py:591 msgid "Cancel selected orders" msgstr "Annuler les commandes sélectionnées" -#: joanie/core/admin.py:644 +#: joanie/core/admin.py:643 msgid "To get results, choose a user on the right" msgstr "Pour obtenir des résultats, choisissez un utilisateur sur la droite" -#: joanie/core/admin.py:688 +#: joanie/core/admin.py:687 msgid "To get results, choose an owner or an organization on the right" msgstr "Pour obtenir des résultats, choisissez un propriétaire ou un établissement à droite" -#: joanie/core/admin.py:717 +#: joanie/core/admin.py:716 msgid "Config field" msgstr "Champ de configuration" -#: joanie/core/admin.py:718 +#: joanie/core/admin.py:717 msgid "Config fields" msgstr "Champs de configuration" @@ -198,148 +198,155 @@ msgstr "Le token ne contient aucun identifiant utilisateur reconnaissable" msgid "Credential" msgstr "Diplôme" -#: joanie/core/enums.py:34 joanie/core/enums.py:151 -#: joanie/core/models/courses.py:1014 +#: joanie/core/enums.py:34 joanie/core/enums.py:159 +#: joanie/core/models/courses.py:1033 msgid "Enrollment" msgstr "Inscription" -#: joanie/core/enums.py:37 joanie/core/enums.py:142 +#: joanie/core/enums.py:37 joanie/core/enums.py:150 #: joanie/core/models/certifications.py:116 #: joanie/core/templates/issuers/degree.html:27 msgid "Certificate" msgstr "Certificat" -#: joanie/core/enums.py:71 +#: joanie/core/enums.py:75 msgid "Draft" msgstr "Brouillon" -#: joanie/core/enums.py:72 -msgid "Submitted" -msgstr "Soumise" +#: joanie/core/enums.py:76 +msgid "Assigned" +msgstr "Assignée" + +#: joanie/core/enums.py:77 +msgid "To save payment method" +msgstr "Moyen de paiement à définir" -#: joanie/core/enums.py:73 joanie/core/enums.py:183 +#: joanie/core/enums.py:78 +msgid "To sign" +msgstr "À signer" + +#: joanie/core/enums.py:79 +msgid "Signing" +msgstr "En cours de signature" + +#: joanie/core/enums.py:80 joanie/core/enums.py:191 msgid "Pending" msgstr "En attente" -#: joanie/core/enums.py:74 -msgctxt "As in: the order is cancelled." +#: joanie/core/enums.py:81 +msgctxt "As in: the order is canceled." msgid "Canceled" msgstr "Annulée" -#: joanie/core/enums.py:77 -msgctxt "As in: the order is validated." -msgid "Validated" -msgstr "Validée" - -#: joanie/core/enums.py:81 +#: joanie/core/enums.py:84 msgctxt "As in: the order payment is pending." msgid "Pending payment" msgstr "En attente de paiement" -#: joanie/core/enums.py:85 +#: joanie/core/enums.py:88 msgctxt "As in: the last order payment has failed." msgid "Failed payment" msgstr "Paiement échoué" -#: joanie/core/enums.py:89 +#: joanie/core/enums.py:92 msgctxt "As in: the first order payment has failed." msgid "No payment" msgstr "Aucun paiement" -#: joanie/core/enums.py:93 +#: joanie/core/enums.py:96 msgctxt "As in: the order is completed." msgid "Completed" msgstr "Complété" -#: joanie/core/enums.py:110 +#: joanie/core/enums.py:118 msgctxt "As in: the enrollment was successfully set on the LMS." msgid "Set" msgstr "Défini" -#: joanie/core/enums.py:114 +#: joanie/core/enums.py:122 msgctxt "As in: the enrollment failed on the LMS." msgid "Failed" msgstr "En échec" -#: joanie/core/enums.py:121 +#: joanie/core/enums.py:129 msgid "Contract Definition" msgstr "Définition de contrat" -#: joanie/core/enums.py:129 +#: joanie/core/enums.py:137 msgid "Unsigned" msgstr "Non signé" -#: joanie/core/enums.py:132 +#: joanie/core/enums.py:140 msgid "Partially signed" msgstr "Partiellement signé" -#: joanie/core/enums.py:134 +#: joanie/core/enums.py:142 msgid "Signed" msgstr "Signé" -#: joanie/core/enums.py:143 +#: joanie/core/enums.py:151 msgid "Degree" msgstr "Diplôme" -#: joanie/core/enums.py:150 joanie/core/models/products.py:518 +#: joanie/core/enums.py:158 joanie/core/models/products.py:531 msgid "Order" msgstr "Commande" -#: joanie/core/enums.py:161 +#: joanie/core/enums.py:169 msgid "Info" msgstr "Info" -#: joanie/core/enums.py:162 +#: joanie/core/enums.py:170 msgid "Success" msgstr "Succès" -#: joanie/core/enums.py:163 +#: joanie/core/enums.py:171 msgid "Warning" msgstr "Avertissement" -#: joanie/core/enums.py:164 +#: joanie/core/enums.py:172 msgid "Error" msgstr "Erreur" -#: joanie/core/enums.py:173 +#: joanie/core/enums.py:181 msgid "Notification" msgstr "Notification" -#: joanie/core/enums.py:174 +#: joanie/core/enums.py:182 msgid "Payment succeeded" msgstr "Paiement réussi" -#: joanie/core/enums.py:175 +#: joanie/core/enums.py:183 msgid "Payment failed" msgstr "Échec du paiement" -#: joanie/core/enums.py:184 joanie/payment/enums.py:28 +#: joanie/core/enums.py:192 joanie/payment/enums.py:28 msgid "Paid" msgstr "Payée" -#: joanie/core/enums.py:185 +#: joanie/core/enums.py:193 msgid "Refused" msgstr "Refusé" -#: joanie/core/factories.py:801 joanie/core/utils/contract_definition.py:107 +#: joanie/core/factories.py:1141 joanie/core/utils/contract_definition.py:101 msgid "" msgstr "" -#: joanie/core/factories.py:806 joanie/core/utils/contract_definition.py:108 +#: joanie/core/factories.py:1146 joanie/core/utils/contract_definition.py:102 msgid "" msgstr "" -#: joanie/core/factories.py:813 +#: joanie/core/factories.py:1153 msgid "" msgstr "" #: joanie/core/fields/multiselect.py:28 -#: joanie/core/templatetags/extra_tags.py:32 +#: joanie/core/templatetags/extra_tags.py:38 msgid "{:s} and {:s}" msgstr "{:s} et {:s}" #: joanie/core/fields/multiselect.py:32 -#: joanie/core/templatetags/extra_tags.py:36 +#: joanie/core/templatetags/extra_tags.py:42 msgid " and " msgstr " et " @@ -411,8 +418,8 @@ msgstr "Utilisateurs" #: joanie/core/models/accounts.py:154 joanie/core/models/certifications.py:33 #: joanie/core/models/contracts.py:29 joanie/core/models/courses.py:170 -#: joanie/core/models/courses.py:470 joanie/core/models/courses.py:783 -#: joanie/core/models/products.py:68 joanie/payment/models.py:394 +#: joanie/core/models/courses.py:471 joanie/core/models/courses.py:802 +#: joanie/core/models/products.py:74 joanie/payment/models.py:394 msgid "title" msgstr "titre" @@ -440,14 +447,14 @@ msgstr "prénom" msgid "last name" msgstr "nom de famille" -#: joanie/core/models/accounts.py:163 joanie/core/models/courses.py:357 -#: joanie/core/models/courses.py:587 joanie/core/models/products.py:463 +#: joanie/core/models/accounts.py:163 joanie/core/models/courses.py:358 +#: joanie/core/models/courses.py:606 joanie/core/models/products.py:466 #: joanie/payment/models.py:403 msgid "owner" msgstr "propriétaire" #: joanie/core/models/accounts.py:171 joanie/core/models/certifications.py:97 -#: joanie/core/models/products.py:406 +#: joanie/core/models/products.py:409 msgid "organization" msgstr "établissement" @@ -475,11 +482,11 @@ msgstr "Le propriétaire ou l'établissement doit être défini." msgid "Main address must be reusable." msgstr "L'adresse principale doit être réutilisable." -#: joanie/core/models/accounts.py:231 +#: joanie/core/models/accounts.py:255 msgid "Demote a main address is forbidden" msgstr "Rétrograder une adresse principale est interdit" -#: joanie/core/models/activity_logs.py:63 joanie/core/models/courses.py:992 +#: joanie/core/models/activity_logs.py:63 joanie/core/models/courses.py:1011 msgid "user" msgstr "utilisateur" @@ -488,12 +495,12 @@ msgid "level" msgstr "niveau" #: joanie/core/models/activity_logs.py:74 -#: joanie/core/models/certifications.py:108 joanie/core/models/contracts.py:90 +#: joanie/core/models/certifications.py:108 joanie/core/models/contracts.py:96 #: joanie/payment/models.py:74 msgid "context" msgstr "contexte" -#: joanie/core/models/activity_logs.py:78 joanie/core/models/products.py:65 +#: joanie/core/models/activity_logs.py:78 joanie/core/models/products.py:71 msgid "type" msgstr "type" @@ -550,7 +557,7 @@ msgid "name" msgstr "nom" #: joanie/core/models/certifications.py:34 joanie/core/models/contracts.py:30 -#: joanie/core/models/products.py:69 +#: joanie/core/models/products.py:75 msgid "description" msgstr "description" @@ -571,16 +578,16 @@ msgstr "Définitions de certificat" msgid "Date of issuance" msgstr "Date de délivrance" -#: joanie/core/models/certifications.py:82 joanie/core/models/contracts.py:80 -#: joanie/core/models/products.py:1143 joanie/payment/models.py:54 +#: joanie/core/models/certifications.py:82 joanie/core/models/contracts.py:86 +#: joanie/core/models/products.py:1276 joanie/payment/models.py:54 msgid "order" msgstr "commande" -#: joanie/core/models/certifications.py:91 joanie/core/models/products.py:428 +#: joanie/core/models/certifications.py:91 joanie/core/models/products.py:431 msgid "enrollment" msgstr "inscription" -#: joanie/core/models/certifications.py:102 +#: joanie/core/models/certifications.py:102 joanie/core/models/contracts.py:46 msgid "images" msgstr "images" @@ -600,48 +607,48 @@ msgstr "contenu" msgid "Language of the contract definition" msgstr "Langue de la définition de contrat" -#: joanie/core/models/contracts.py:40 +#: joanie/core/models/contracts.py:39 msgid "template name" msgstr "nom du modèle" -#: joanie/core/models/contracts.py:48 joanie/core/models/contracts.py:73 -#: joanie/core/models/products.py:99 +#: joanie/core/models/contracts.py:54 joanie/core/models/contracts.py:79 +#: joanie/core/models/products.py:105 msgid "Contract definition" msgstr "Définition de contrat" -#: joanie/core/models/contracts.py:49 +#: joanie/core/models/contracts.py:55 msgid "Contract definitions" msgstr "Définitions de contrat" -#: joanie/core/models/contracts.py:92 +#: joanie/core/models/contracts.py:98 msgid "Localized data snapshot on contract signature" msgstr "Instantané des données internationalisées à la signature du contrat" -#: joanie/core/models/contracts.py:102 +#: joanie/core/models/contracts.py:108 msgid "Reference in the external signature backend" msgstr "Référence sur la plateforme de signature externe" -#: joanie/core/models/contracts.py:107 +#: joanie/core/models/contracts.py:113 msgid "Date and time we send the contract to signature provider" msgstr "Date et heure d'envoi du contrat sur la plateforme de signature" -#: joanie/core/models/contracts.py:115 +#: joanie/core/models/contracts.py:121 msgid "Date and time of issuance" msgstr "Date et heure de signature du contrat par l'établissement" -#: joanie/core/models/contracts.py:121 +#: joanie/core/models/contracts.py:127 msgid "organization signatory" msgstr "signataire de l'établissement" -#: joanie/core/models/contracts.py:129 +#: joanie/core/models/contracts.py:135 msgid "Date and time the organization signed the contract" msgstr "Date et heure de signature du contrat par l'établissement" -#: joanie/core/models/contracts.py:137 +#: joanie/core/models/contracts.py:143 msgid "Contract" msgstr "Contrat" -#: joanie/core/models/contracts.py:138 +#: joanie/core/models/contracts.py:144 msgid "Contracts" msgstr "Contrats" @@ -689,7 +696,7 @@ msgstr "à planifier" msgid "forever open" msgstr "ouvert indéfiniment" -#: joanie/core/models/courses.py:168 joanie/core/models/courses.py:467 +#: joanie/core/models/courses.py:168 joanie/core/models/courses.py:468 msgid "code" msgstr "code" @@ -761,388 +768,396 @@ msgstr "Email du responsable de la protection des données" msgid "Both signatory representative fields must be set." msgstr "Les deux champs du représentant signataire doivent être définis." -#: joanie/core/models/courses.py:358 joanie/core/models/courses.py:588 +#: joanie/core/models/courses.py:359 joanie/core/models/courses.py:607 msgid "administrator" msgstr "administrateur" -#: joanie/core/models/courses.py:359 +#: joanie/core/models/courses.py:360 msgid "member" msgstr "membre" -#: joanie/core/models/courses.py:374 +#: joanie/core/models/courses.py:375 msgid "Organization access" msgstr "Droit d'accès à l'établissement" -#: joanie/core/models/courses.py:375 +#: joanie/core/models/courses.py:376 msgid "Organization accesses" msgstr "Droits d'accès aux établissements" -#: joanie/core/models/courses.py:468 +#: joanie/core/models/courses.py:469 msgid "cover" msgstr "couverture" -#: joanie/core/models/courses.py:475 joanie/core/models/courses.py:718 +#: joanie/core/models/courses.py:476 joanie/core/models/courses.py:737 msgid "organizations" msgstr "établissements" -#: joanie/core/models/courses.py:482 +#: joanie/core/models/courses.py:483 msgid "products" msgstr "produits" -#: joanie/core/models/courses.py:497 +#: joanie/core/models/courses.py:498 msgid "Courses" msgstr "Cours" -#: joanie/core/models/courses.py:589 +#: joanie/core/models/courses.py:608 msgid "instructor" msgstr "formateur" -#: joanie/core/models/courses.py:590 +#: joanie/core/models/courses.py:609 msgid "manager" msgstr "gestionnaire" -#: joanie/core/models/courses.py:607 +#: joanie/core/models/courses.py:626 msgid "Course access" msgstr "Droit d'accès au cours" -#: joanie/core/models/courses.py:608 +#: joanie/core/models/courses.py:627 msgid "Course accesses" msgstr "Droits d'accès aux cours" -#: joanie/core/models/courses.py:705 joanie/core/models/courses.py:777 -#: joanie/core/models/products.py:275 joanie/core/models/products.py:421 -#: joanie/core/models/products.py:1131 +#: joanie/core/models/courses.py:724 joanie/core/models/courses.py:796 +#: joanie/core/models/products.py:281 joanie/core/models/products.py:424 +#: joanie/core/models/products.py:1264 msgid "course" msgstr "cours" -#: joanie/core/models/courses.py:711 joanie/core/models/products.py:281 -#: joanie/core/models/products.py:413 +#: joanie/core/models/courses.py:730 joanie/core/models/products.py:287 +#: joanie/core/models/products.py:416 msgid "product" msgstr "produit" -#: joanie/core/models/courses.py:724 +#: joanie/core/models/courses.py:743 msgid "Course relation to a product" msgstr "Relation d'un cours à un produit" -#: joanie/core/models/courses.py:725 +#: joanie/core/models/courses.py:744 msgid "Courses relations to products" msgstr "Relations de cours à des produits" -#: joanie/core/models/courses.py:739 +#: joanie/core/models/courses.py:758 msgid "You cannot delete this course product relation." msgstr "Vous ne pouvez pas supprimer cette relation cours / produit." -#: joanie/core/models/courses.py:781 +#: joanie/core/models/courses.py:800 msgid "resource link" msgstr "lien de la ressource" -#: joanie/core/models/courses.py:786 +#: joanie/core/models/courses.py:805 msgid "course start" msgstr "début du cours" -#: joanie/core/models/courses.py:787 +#: joanie/core/models/courses.py:806 msgid "course end" msgstr "fin du cours" -#: joanie/core/models/courses.py:789 +#: joanie/core/models/courses.py:808 msgid "enrollment date" msgstr "date d'inscription" -#: joanie/core/models/courses.py:790 +#: joanie/core/models/courses.py:809 msgid "enrollment end" msgstr "date de fermeture des inscriptions" -#: joanie/core/models/courses.py:798 +#: joanie/core/models/courses.py:817 msgid "The list of languages in which the course content is available." msgstr "La liste des langues dans lesquelles le contenu du cours est disponible." -#: joanie/core/models/courses.py:800 +#: joanie/core/models/courses.py:819 msgid "is gradable" msgstr "est évaluable" -#: joanie/core/models/courses.py:802 +#: joanie/core/models/courses.py:821 msgid "is listed" msgstr "est répertorié" -#: joanie/core/models/courses.py:805 +#: joanie/core/models/courses.py:824 msgid "If checked the course run will be included in the list of course runs available for enrollment on the related course page." msgstr "Si coché, la session de cours sera incluse dans la liste des sessions de cours disponibles à l'inscription sur la page de cours correspondante." -#: joanie/core/models/courses.py:813 +#: joanie/core/models/courses.py:832 msgid "Course runs" msgstr "Sessions de cours" -#: joanie/core/models/courses.py:946 +#: joanie/core/models/courses.py:965 msgid "This course run relies on a product relation. So you cannot modify its course." msgstr "Cette session de cours est liée à une relation produit. Vous ne pouvez donc pas modifier son cours." -#: joanie/core/models/courses.py:986 +#: joanie/core/models/courses.py:1005 msgid "course run" msgstr "session de cours" -#: joanie/core/models/courses.py:997 +#: joanie/core/models/courses.py:1016 msgid "Ticked if the user is enrolled to the course run." msgstr "Coché si l'utilisateur est inscrit à la session de cours." -#: joanie/core/models/courses.py:1001 +#: joanie/core/models/courses.py:1020 msgid "state" msgstr "état" -#: joanie/core/models/courses.py:1005 +#: joanie/core/models/courses.py:1024 msgid "Ticked if the enrollment has been initially created in the scope of an order." msgstr "Coché si l'inscription a été initialement créée dans le cadre d'une commande." -#: joanie/core/models/courses.py:1007 +#: joanie/core/models/courses.py:1026 msgid "was created by order" msgstr "a été créé pour une commande" -#: joanie/core/models/courses.py:1015 +#: joanie/core/models/courses.py:1034 msgid "Enrollments" msgstr "Inscriptions" -#: joanie/core/models/courses.py:1023 +#: joanie/core/models/courses.py:1042 msgid "active" msgstr "active" -#: joanie/core/models/courses.py:1023 +#: joanie/core/models/courses.py:1042 msgid "inactive" msgstr "inactive" -#: joanie/core/models/courses.py:1093 +#: joanie/core/models/courses.py:1112 msgid "You are not allowed to enroll to a course run not opened for enrollment." msgstr "Vous n'êtes pas autorisé à vous inscrire à une session de cours qui n'est pas ouverte à l'inscription." -#: joanie/core/models/courses.py:1109 +#: joanie/core/models/courses.py:1128 msgid "You are already enrolled to an opened course run " msgstr "Vous êtes déjà inscrit à une session de cours ouverte " -#: joanie/core/models/courses.py:1120 +#: joanie/core/models/courses.py:1139 msgid "You cannot enroll to a non-listed course run out of the scope of an order." msgstr "Vous ne pouvez pas vous inscrire à un cours non listé en dehors d'une commande." -#: joanie/core/models/courses.py:1145 +#: joanie/core/models/courses.py:1164 msgid "Course run \"{self.course_run.id!s}\" requires a valid order to enroll." msgstr "La session de cours \"{self.course_run.resource_link:s}\" nécessite une commande valide pour s'inscrire." -#: joanie/core/models/courses.py:1150 +#: joanie/core/models/courses.py:1169 msgid "You are not allowed to enroll to a course run not listed." msgstr "Vous n'êtes pas autorisé à vous inscrire à une session de cours non répertoriée." -#: joanie/core/models/products.py:70 +#: joanie/core/models/products.py:76 msgid "instructions" msgstr "instructions" -#: joanie/core/models/products.py:71 +#: joanie/core/models/products.py:77 msgid "call to action" msgstr "appel à action" -#: joanie/core/models/products.py:78 +#: joanie/core/models/products.py:84 msgid "target courses" msgstr "cours ciblés" -#: joanie/core/models/products.py:82 joanie/core/models/products.py:452 +#: joanie/core/models/products.py:88 joanie/core/models/products.py:455 msgid "price" msgstr "prix" -#: joanie/core/models/products.py:83 joanie/core/models/products.py:454 +#: joanie/core/models/products.py:89 joanie/core/models/products.py:457 msgid "tax included" msgstr "taxe incluse" -#: joanie/core/models/products.py:92 +#: joanie/core/models/products.py:98 msgid "certificate definition" msgstr "définition de certificat" -#: joanie/core/models/products.py:108 +#: joanie/core/models/products.py:114 msgid "Products" msgstr "Produits" -#: joanie/core/models/products.py:255 +#: joanie/core/models/products.py:261 msgid "Certificate definition is only allowed for product kinds: " msgstr "La définition de certificat n'est autorisée que pour les produits de types : " -#: joanie/core/models/products.py:290 joanie/core/models/products.py:1137 +#: joanie/core/models/products.py:296 joanie/core/models/products.py:1270 msgid "course runs" msgstr "sessions de cours" -#: joanie/core/models/products.py:293 +#: joanie/core/models/products.py:299 msgid "position in product" msgstr "position dans le produit" -#: joanie/core/models/products.py:295 joanie/core/models/products.py:1149 +#: joanie/core/models/products.py:301 joanie/core/models/products.py:1282 msgid "take into account for certification" msgstr "prendre en compte pour la certification" -#: joanie/core/models/products.py:296 joanie/core/models/products.py:1150 +#: joanie/core/models/products.py:302 joanie/core/models/products.py:1283 msgid "Take into account the course grade for certification." msgstr "Prendre en compte la note du cours pour la certification." -#: joanie/core/models/products.py:304 +#: joanie/core/models/products.py:310 msgid "Target course relation to a product with a position" msgstr "Relation d'un cours cible à un produit avec une position" -#: joanie/core/models/products.py:305 +#: joanie/core/models/products.py:311 msgid "Target courses relations to products with a position" msgstr "Relation de cours cibles à des produits avec une position" -#: joanie/core/models/products.py:336 +#: joanie/core/models/products.py:342 msgid "Number of seats" msgstr "Nombre de sièges" -#: joanie/core/models/products.py:338 +#: joanie/core/models/products.py:344 msgid "The maximum number of orders that can be validated for a given order group" msgstr "Le nombre maximum de commandes pouvant être validées pour un groupe de commandes donné" -#: joanie/core/models/products.py:343 +#: joanie/core/models/products.py:349 msgid "course product relation" msgstr "relation cours produit" -#: joanie/core/models/products.py:347 +#: joanie/core/models/products.py:353 msgid "is active" msgstr "est actif" -#: joanie/core/models/products.py:437 +#: joanie/core/models/products.py:440 msgid "order group" msgstr "groupe de commandes" -#: joanie/core/models/products.py:448 +#: joanie/core/models/products.py:451 msgid "courses" msgstr "cours" -#: joanie/core/models/products.py:469 +#: joanie/core/models/products.py:472 msgid "has consent to terms" msgstr "a consenti aux conditions" -#: joanie/core/models/products.py:472 +#: joanie/core/models/products.py:475 msgid "User has consented to the platform terms and conditions." msgstr "L'utilisateur a consenti aux conditions générales de vente de la plateforme." -#: joanie/core/models/products.py:480 +#: joanie/core/models/products.py:484 msgid "payment schedule" msgstr "échéancier" -#: joanie/core/models/products.py:481 +#: joanie/core/models/products.py:485 msgid "Payment schedule for the order." msgstr "Échéancier pour la commande." -#: joanie/core/models/products.py:519 +#: joanie/core/models/products.py:494 +msgid "credit card" +msgstr "carte de crédit" + +#: joanie/core/models/products.py:532 msgid "Orders" msgstr "Commandes" -#: joanie/core/models/products.py:604 +#: joanie/core/models/products.py:643 #, python-brace-format msgid "{required_field} field should be set for {self.product.type} products." msgstr "Le champ {required_field} doit être défini pour les produits {self.product.type}." -#: joanie/core/models/products.py:610 +#: joanie/core/models/products.py:649 #, python-brace-format msgid "{empty_field} field should be left empty for {self.product.type} products." msgstr "Le champ {empty_field} devrait être laissé vide pour les produits {self.product.type}." -#: joanie/core/models/products.py:617 +#: joanie/core/models/products.py:656 msgid "The enrollment should belong to the owner of this order." msgstr "L'inscription devrait appartenir au propriétaire de cette commande." -#: joanie/core/models/products.py:622 +#: joanie/core/models/products.py:661 msgid "Orders can't be placed on enrollments originating from an order." msgstr "Des commandes ne peuvent pas être passées sur des inscriptions créées à partir d'une commande." -#: joanie/core/models/products.py:633 +#: joanie/core/models/products.py:672 msgid "The order cannot be created on course run that is in archived state." msgstr "La commande ne peut pas être créée en lien avec une session archivée." -#: joanie/core/models/products.py:652 +#: joanie/core/models/products.py:691 #, python-brace-format msgid "This order cannot be linked to the product \"{product_title}\", " msgstr "Cette commande ne peut pas être liée au produit \"{product_title}\", " -#: joanie/core/models/products.py:658 +#: joanie/core/models/products.py:697 #, python-brace-format msgid "This order cannot be linked to the product \"{product_title}\" and " msgstr "Cette commande ne peut pas être liée au produit \"{product_title}\" et " -#: joanie/core/models/products.py:852 +#: joanie/core/models/products.py:909 #, python-brace-format msgid "Product {self.product.title} does not allow to generate a certificate." msgstr "Le produit {self.product.title} ne permet pas de générer un certificat." -#: joanie/core/models/products.py:867 +#: joanie/core/models/products.py:924 msgid "No graded courses found." msgstr "Aucun cours noté trouvé." -#: joanie/core/models/products.py:883 +#: joanie/core/models/products.py:940 msgid "This order is not ready for gradation." msgstr "Cette commande n'est pas prête à être évaluée." -#: joanie/core/models/products.py:893 +#: joanie/core/models/products.py:950 msgid "Course run " msgstr "Session de cours " -#: joanie/core/models/products.py:1147 +#: joanie/core/models/products.py:1280 msgid "position in order" msgstr "position dans la commande" -#: joanie/core/models/products.py:1158 +#: joanie/core/models/products.py:1291 msgid "Course relation to an order with a position" msgstr "Relation d'un cours à une commande avec une position" -#: joanie/core/models/products.py:1159 +#: joanie/core/models/products.py:1292 msgid "Courses relations to orders with a position" msgstr "Relations de cours à des commandes avec une position" -#: joanie/core/models/site.py:21 +#: joanie/core/models/site.py:18 msgid "site" msgstr "site" -#: joanie/core/models/site.py:27 +#: joanie/core/models/site.py:24 msgid "terms and conditions" msgstr "conditions générales de vente" -#: joanie/core/models/site.py:28 +#: joanie/core/models/site.py:25 msgid "Terms and conditions for the site in Markdown format." msgstr "Conditions générales de vente du site au format Markdown." -#: joanie/core/models/site.py:35 +#: joanie/core/models/site.py:32 msgid "Site config" msgstr "Paramètre du site" -#: joanie/core/models/site.py:36 +#: joanie/core/models/site.py:33 msgid "Site configs" msgstr "Paramètres du site" -#: joanie/core/serializers/client.py:155 joanie/core/serializers/client.py:270 +#: joanie/core/serializers/client.py:156 joanie/core/serializers/client.py:271 msgid "You are only allowed to set role to {', '.join(can_set_role_to)}" msgstr "Vous n'êtes autorisé qu'à définir le rôle à {', '.join(can_set_role_to)}" -#: joanie/core/serializers/client.py:158 joanie/core/serializers/client.py:273 +#: joanie/core/serializers/client.py:159 joanie/core/serializers/client.py:274 msgid "You are not allowed to set this role for this course." msgstr "Vous n'êtes pas autorisé à définir ce rôle pour ce cours." -#: joanie/core/serializers/client.py:169 +#: joanie/core/serializers/client.py:170 msgid "You must set a course ID in context to create a new course access." msgstr "Vous devez définir un ID de cours dans le contexte pour créer un nouveau droit d'accès au cours." -#: joanie/core/serializers/client.py:179 +#: joanie/core/serializers/client.py:180 msgid "You are not allowed to manage accesses for this course." msgstr "Vous n'êtes pas autorisé à gérer les droits d'accès à ce cours." -#: joanie/core/serializers/client.py:284 +#: joanie/core/serializers/client.py:285 msgid "You must set a organization ID in context to create a new organization access." msgstr "Vous devez définir un ID d'établissement dans le contexte pour créer un nouveau droit d'accès à l'établissement." -#: joanie/core/serializers/client.py:295 +#: joanie/core/serializers/client.py:296 msgid "You are not allowed to manage accesses for this organization." msgstr "Vous n'êtes pas autorisé à gérer les droits d'accès à cet établissement." -#: joanie/core/serializers/client.py:1172 -msgid "You must accept the terms and conditions to proceed." -msgstr "Vous devez accepter les conditions générales de vente pour continuer." - #: joanie/core/templates/admin/base.html:5 msgid "Sentry tools" msgstr "Sentry" #: joanie/core/templates/certificate/verify.html:9 +#: joanie/core/templates/mail/html/installment_paid.html:159 +#: joanie/core/templates/mail/html/installment_refused.html:159 +#: joanie/core/templates/mail/html/installment_reminder.html:159 +#: joanie/core/templates/mail/html/installments_fully_paid.html:159 #: joanie/core/templates/mail/html/order_validated.html:159 +#: joanie/core/templates/mail/text/installment_paid.txt:3 +#: joanie/core/templates/mail/text/installment_refused.txt:3 +#: joanie/core/templates/mail/text/installment_reminder.txt:3 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:3 #: joanie/core/templates/mail/text/order_validated.txt:3 msgid "Company logo" msgstr "Logo de l'établissement" @@ -1316,26 +1331,46 @@ msgstr "Date de fin de la session : " msgid "Price of the course: " msgstr "Prix : " -#: joanie/core/templates/issuers/contract_definition.html:127 -msgid "Appendices" -msgstr "Annexes" - -#: joanie/core/templates/issuers/contract_definition.html:130 -msgid "Terms and conditions" -msgstr "Conditions générales de vente" - -#: joanie/core/templates/issuers/contract_definition.html:134 -msgid "Catalog syllabus" -msgstr "Syllabus de la formation" - -#: joanie/core/templates/issuers/contract_definition.html:140 +#: joanie/core/templates/issuers/contract_definition.html:128 msgid "Learner's signature :" msgstr "Signature du stagiaire :" -#: joanie/core/templates/issuers/contract_definition.html:146 +#: joanie/core/templates/issuers/contract_definition.html:134 msgid "University representative's signature :" msgstr "Signature du représentant de l'université :" +#: joanie/core/templates/issuers/contract_definition.html:141 +msgid "Appendices" +msgstr "Annexes" + +#: joanie/core/templates/issuers/contract_definition.html:144 +#: joanie/core/templates/mail/html/installment_paid.html:259 +#: joanie/core/templates/mail/html/installment_refused.html:235 +#: joanie/core/templates/mail/html/installment_reminder.html:235 +#: joanie/core/templates/mail/html/installments_fully_paid.html:259 +#: joanie/core/templates/mail/text/installment_paid.txt:18 +#: joanie/core/templates/mail/text/installment_refused.txt:15 +#: joanie/core/templates/mail/text/installment_reminder.txt:15 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:17 +msgid "Payment schedule" +msgstr "Échéancier" + +#: joanie/core/templates/issuers/contract_definition.html:148 +msgid "Due date" +msgstr "Date d’échéance" + +#: joanie/core/templates/issuers/contract_definition.html:149 +msgid "Amount" +msgstr "Montant" + +#: joanie/core/templates/issuers/contract_definition.html:155 +msgid "Total :" +msgstr "Total :" + +#: joanie/core/templates/issuers/contract_definition.html:173 +msgid "Catalog syllabus" +msgstr "Syllabus de la formation" + #: joanie/core/templates/issuers/degree.html:29 #, python-format msgid "Issued on %(creation_date)s" @@ -1421,6 +1456,124 @@ msgstr "Sous-total" msgid "Sales Tax VAT" msgstr "TVA" +#: joanie/core/templates/mail/html/installment_paid.html:187 +#: joanie/core/templates/mail/html/installment_refused.html:187 +#: joanie/core/templates/mail/html/installment_reminder.html:187 +#: joanie/core/templates/mail/html/installments_fully_paid.html:187 +#: joanie/core/templates/mail/text/installment_paid.txt:7 +#: joanie/core/templates/mail/text/installment_refused.txt:7 +#: joanie/core/templates/mail/text/installment_reminder.txt:7 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:7 +#, python-format +msgid " Hello %(name)s, " +msgstr " Bonjour %(name)s, " + +#: joanie/core/templates/mail/html/installment_paid.html:187 +#: joanie/core/templates/mail/html/installment_refused.html:187 +#: joanie/core/templates/mail/html/installment_reminder.html:187 +#: joanie/core/templates/mail/html/installments_fully_paid.html:187 +#: joanie/core/templates/mail/text/installment_paid.txt:9 +#: joanie/core/templates/mail/text/installment_refused.txt:9 +#: joanie/core/templates/mail/text/installment_reminder.txt:9 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:9 +msgid "Hello," +msgstr "Bonjour," + +#: joanie/core/templates/mail/html/installment_paid.html:211 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment has been successfully paid.
" +msgstr " Pour le cours %(title)s, la %(targeted_installment_index)s échéance a été payée avec succès.
" + +#: joanie/core/templates/mail/html/installment_paid.html:235 +#, python-format +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.
Currently, it remains %(remaining_balance_to_pay)s to be paid. The next installment will be debited on %(date_next_installment_to_pay)s. " +msgstr " Un montant de %(installment_amount)s a été débité sur la carte de crédit •••• •••• •••• %(credit_card_last_numbers)s.
Actuellement, il reste %(remaining_balance_to_pay)s à payer. La prochaine échéance sera débitée le %(date_next_installment_to_pay)s. " + +#: joanie/core/templates/mail/html/installment_paid.html:293 +#: joanie/core/templates/mail/html/installment_refused.html:269 +#: joanie/core/templates/mail/html/installment_reminder.html:269 +#: joanie/core/templates/mail/html/installments_fully_paid.html:293 +#: joanie/core/templates/mail/text/installment_paid.txt:22 +#: joanie/core/templates/mail/text/installment_refused.txt:19 +#: joanie/core/templates/mail/text/installment_reminder.txt:19 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:21 +#, python-format +msgid " Withdrawn on %(installment_date)s " +msgstr " Prélevée le %(installment_date)s " + +#: joanie/core/templates/mail/html/installment_paid.html:297 +#: joanie/core/templates/mail/html/installment_paid.html:299 +#: joanie/core/templates/mail/html/installment_paid.html:301 +#: joanie/core/templates/mail/html/installment_refused.html:273 +#: joanie/core/templates/mail/html/installment_refused.html:275 +#: joanie/core/templates/mail/html/installment_refused.html:277 +#: joanie/core/templates/mail/html/installment_reminder.html:273 +#: joanie/core/templates/mail/html/installment_reminder.html:275 +#: joanie/core/templates/mail/html/installment_reminder.html:277 +#: joanie/core/templates/mail/html/installments_fully_paid.html:297 +#: joanie/core/templates/mail/html/installments_fully_paid.html:299 +#: joanie/core/templates/mail/html/installments_fully_paid.html:301 +#: joanie/core/templates/mail/text/installment_paid.txt:26 +#: joanie/core/templates/mail/text/installment_paid.txt:30 +#: joanie/core/templates/mail/text/installment_paid.txt:34 +#: joanie/core/templates/mail/text/installment_refused.txt:23 +#: joanie/core/templates/mail/text/installment_refused.txt:27 +#: joanie/core/templates/mail/text/installment_refused.txt:31 +#: joanie/core/templates/mail/text/installment_reminder.txt:23 +#: joanie/core/templates/mail/text/installment_reminder.txt:27 +#: joanie/core/templates/mail/text/installment_reminder.txt:31 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:25 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:29 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:33 +#, python-format +msgid "%(state)s" +msgstr "%(state)s" + +#: joanie/core/templates/mail/html/installment_paid.html:344 +#: joanie/core/templates/mail/html/installments_fully_paid.html:344 +#, python-format +msgid " See order details on your
dashboard " +msgstr " Voir les détails de la commande sur votre tableau de bord " + +#: joanie/core/templates/mail/html/installment_paid.html:374 +#: joanie/core/templates/mail/html/installment_refused.html:350 +#: joanie/core/templates/mail/html/installment_reminder.html:350 +#: joanie/core/templates/mail/html/installments_fully_paid.html:374 +#: joanie/core/templates/mail/html/order_validated.html:278 +#, python-format +msgid "This mail has been sent to %(email)s by %(name)s" +msgstr "Ce courriel a été envoyé à %(email)s par %(name)s" + +#: joanie/core/templates/mail/html/installment_refused.html:211 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment debit has failed.
We have tried to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr " Pour le cours %(title)s, le prélèvement de la %(targeted_installment_index)s échéance a échoué.
Nous avons essayé de prélever un montant de %(installment_amount)s avec la carte de crédit •••• •••• •••• %(credit_card_last_numbers)s. " + +#: joanie/core/templates/mail/html/installment_refused.html:320 +#, python-format +msgid " Please correct the failed payment as soon as possible using your dashboard. " +msgstr " Merci de régulariser le paiement en échec dès que possible depuis de votre tableau de bord. " + +#: joanie/core/templates/mail/html/installment_reminder.html:211 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment will be withdrawn on %(days_until_debit)s days.
We will try to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr " Pour le cours %(title)s, la %(targeted_installment_index)s échéance sera prélevée dans %(days_until_debit)s jours.
Nous tenterons de prélevée un montant de %(installment_amount)s avec la carte de crédit •••• •••• •••• %(credit_card_last_numbers)s. " + +#: joanie/core/templates/mail/html/installment_reminder.html:320 +#, python-format +msgid " See order details on your dashboard : dashboard " +msgstr " Voir les détails de la commande sur votre tableau de bord " + +#: joanie/core/templates/mail/html/installments_fully_paid.html:211 +#, python-format +msgid " For the course %(title)s, we have just debited the last installment. Your order is now fully paid! " +msgstr " Pour le cours %(title)s, nous venons de prélever la dernière échéance. Votre commande est maintenant entièrement payée ! " + +#: joanie/core/templates/mail/html/installments_fully_paid.html:235 +#, python-format +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.
" +msgstr " Un montant de %(installment_amount)s a été prélevé avec la carte de crédit •••• •••• •••• %(credit_card_last_numbers)s.
" + #: joanie/core/templates/mail/html/order_validated.html:188 #: joanie/core/templates/mail/text/order_validated.txt:5 #, python-format @@ -1452,157 +1605,211 @@ msgstr "Vous avez acheté %(title)s
pour un prix de %(name)s" -msgstr "Ce courriel a été envoyé à %(email)s par %(name)s" +msgid " For the course %(title)s, the %(targeted_installment_index)s installment has been successfully paid.\n" +msgstr " Pour le cours %(title)s, la %(targeted_installment_index)s échéance a été payée avec succès.\n" -#: joanie/core/templates/mail/text/order_validated.txt:11 +#: joanie/core/templates/mail/text/installment_paid.txt:15 #, python-format -msgid "You have bought %(title)s for a price of %(price)s." -msgstr "Vous avez acheté %(title)s pour un prix de %(price)s." +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.\n" +"Currently, it remains %(remaining_balance_to_pay)s to be paid. The next installment will be debited on %(date_next_installment_to_pay)s. " +msgstr " Un montant de %(installment_amount)s a été prélevé avec la carte de crédit •••• •••• •••• %(credit_card_last_numbers)s. Actuellement, il reste %(remaining_balance_to_pay)s à payer. La prochaine échéance sera prélevée le %(date_next_installment_to_pay)s. " +#: joanie/core/templates/mail/text/installment_paid.txt:41 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:40 +#, python-format +msgid " See order details on your dashboard [%(dashboard_order_link)s] " +msgstr " Voir les détails de la commande sur votre tableau de bord [%(dashboard_order_link)s] " + +#: joanie/core/templates/mail/text/installment_paid.txt:43 +#: joanie/core/templates/mail/text/installment_refused.txt:40 +#: joanie/core/templates/mail/text/installment_reminder.txt:40 +#: joanie/core/templates/mail/text/installments_fully_paid.txt:42 #: joanie/core/templates/mail/text/order_validated.txt:16 #, python-format msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" msgstr "Ce courriel a été envoyé à %(email)s par %(name)s [%(href)s]" -#: joanie/core/utils/contract_definition.py:17 +#: joanie/core/templates/mail/text/installment_refused.txt:12 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment debit has failed.\n" +"We have tried to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr " Pour le cours %(title)s, le prélèvement de la %(targeted_installment_index)s échéance a échoué. Nous avons essayé de prélever un montant de %(installment_amount)s avec la carte de crédit •••• •••• •••• %(credit_card_last_numbers)s. " + +#: joanie/core/templates/mail/text/installment_refused.txt:38 +#, python-format +msgid " Please correct the failed payment as soon as possible using your dashboard [%(dashboard_order_link)s]. " +msgstr " Merci de régulariser le paiement en échec dès que possible depuis de votre tableau de bord [%(dashboard_order_link)s]. " + +#: joanie/core/templates/mail/text/installment_reminder.txt:12 +#, python-format +msgid " For the course %(title)s, the %(targeted_installment_index)s installment will be withdrawn on %(days_until_debit)s days.\n" +"We will try to debit an amount of %(installment_amount)s on the credit card •••• •••• •••• %(credit_card_last_numbers)s. " +msgstr " Pour le cours %(title)s, la %(targeted_installment_index)s échéance sera prélevée dans %(days_until_debit)s jours. Nous tenterons de prélever un montant de %(installment_amount)s avec la carte de crédit •••• •••• •••• %(credit_card_last_numbers)s. " + +#: joanie/core/templates/mail/text/installment_reminder.txt:38 +#, python-format +msgid " See order details on your dashboard : dashboard [%(dashboard_order_link)s] " +msgstr " Voir les détails de la commande dans votre tableau de bord [%(dashboard_order_link)s] " + +#: joanie/core/templates/mail/text/installments_fully_paid.txt:12 +#, python-format +msgid " For the course %(title)s, we have just debited the last installment. Your order is now fully paid! " +msgstr " Pour le cours %(title)s, nous venons de prélever la dernière échéance. Votre commande est maintenant entièrement payée ! " + +#: joanie/core/templates/mail/text/installments_fully_paid.txt:14 +#, python-format +msgid " An amount of %(installment_amount)s has been debited on the credit card •••• •••• •••• %(credit_card_last_numbers)s.\n" +msgstr " Un montant de %(installment_amount)s a été prélevé avec la carte de crédit •••• •••• •••• %(credit_card_last_numbers)s.\n" + +#: joanie/core/templates/mail/text/order_validated.txt:11 +#, python-format +msgid "You have bought %(title)s for a price of %(price)s." +msgstr "Vous avez acheté %(title)s pour un prix de %(price)s." + +#: joanie/core/utils/contract_definition.py:20 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:18 +#: joanie/core/utils/contract_definition.py:21 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:19 +#: joanie/core/utils/contract_definition.py:22 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:20 +#: joanie/core/utils/contract_definition.py:23 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:21 +#: joanie/core/utils/contract_definition.py:24 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:22 +#: joanie/core/utils/contract_definition.py:25 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:23 +#: joanie/core/utils/contract_definition.py:26 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:29 +#: joanie/core/utils/contract_definition.py:37 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:30 +#: joanie/core/utils/contract_definition.py:38 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:31 +#: joanie/core/utils/contract_definition.py:39 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:32 +#: joanie/core/utils/contract_definition.py:40 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:33 +#: joanie/core/utils/contract_definition.py:41 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:34 +#: joanie/core/utils/contract_definition.py:42 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:35 +#: joanie/core/utils/contract_definition.py:43 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:93 +#: joanie/core/utils/contract_definition.py:87 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:94 +#: joanie/core/utils/contract_definition.py:88 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:95 +#: joanie/core/utils/contract_definition.py:89 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:96 +#: joanie/core/utils/contract_definition.py:90 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:97 +#: joanie/core/utils/contract_definition.py:91 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:98 +#: joanie/core/utils/contract_definition.py:92 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:99 +#: joanie/core/utils/contract_definition.py:93 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:100 +#: joanie/core/utils/contract_definition.py:94 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:101 +#: joanie/core/utils/contract_definition.py:95 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:102 +#: joanie/core/utils/contract_definition.py:96 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:105 +#: joanie/core/utils/contract_definition.py:99 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:106 +#: joanie/core/utils/contract_definition.py:100 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:109 +#: joanie/core/utils/contract_definition.py:103 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:110 +#: joanie/core/utils/contract_definition.py:104 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:112 +#: joanie/core/utils/contract_definition.py:106 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:113 +#: joanie/core/utils/contract_definition.py:107 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:114 +#: joanie/core/utils/contract_definition.py:108 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:117 +#: joanie/core/utils/contract_definition.py:112 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:118 +#: joanie/core/utils/contract_definition.py:113 msgid "" msgstr "" -#: joanie/core/utils/contract_definition.py:119 +#: joanie/core/utils/contract_definition.py:114 msgid "" msgstr "" +#: joanie/core/utils/payment_schedule.py:213 +#: joanie/payment/backends/base.py:102 +#, python-brace-format +msgid "{settings.JOANIE_CATALOG_NAME} - {product_title} - " +msgstr "{settings.JOANIE_CATALOG_NAME} - {product_title} - " + #: joanie/payment/admin.py:230 msgid "To get results, choose an owner on the right" msgstr "Pour obtenir des résultats, choisissez un propriétaire sur la droite" @@ -1611,9 +1818,24 @@ msgstr "Pour obtenir des résultats, choisissez un propriétaire sur la droite" msgid "Joanie payment application" msgstr "Application de paiement de Joanie" -#: joanie/payment/backends/base.py:87 joanie/payment/backends/base.py:103 -msgid "Purchase order confirmed!" -msgstr "Commande confirmée !" +#: joanie/payment/backends/base.py:75 joanie/payment/backends/base.py:77 +msgid "Subscription confirmed!" +msgstr "Souscription confirmée !" + +#: joanie/payment/backends/base.py:107 +#, python-brace-format +msgid "An installment has been successfully paid of {installment_amount} {currency}" +msgstr "Une échéance d'un montant de {installment_amount} {currency} a été payée avec succès" + +#: joanie/payment/backends/base.py:111 +#, python-brace-format +msgid "Order completed ! The last installment of {installment_amount} {currency} has been debited" +msgstr "Commande complétée ! La dernière échéance d'un montant de {installment_amount} {currency} a été prélevée" + +#: joanie/payment/backends/base.py:154 +#, python-brace-format +msgid "{catalog_name} - {product_title} - An installment debit has failed {installment_amount:.2f} {currency}" +msgstr "{catalog_name} - {product_title} - Le prélèvement d'une échéance d'un montant de {installment_amount:.2f} {currency} a échoué" #: joanie/payment/enums.py:26 msgid "Unpaid" @@ -1631,19 +1853,19 @@ msgstr "Impossible d'annuler ce paiement." msgid "Cannot create a payment." msgstr "Impossible de créer un paiement." -#: joanie/payment/exceptions.py:30 +#: joanie/payment/exceptions.py:30 joanie/payment/exceptions.py:38 msgid "Cannot register this payment." msgstr "Impossible d'enregistrer ce paiement." -#: joanie/payment/exceptions.py:38 +#: joanie/payment/exceptions.py:46 msgid "Cannot refund this payment." msgstr "Impossible de rembourser ce paiement." -#: joanie/payment/exceptions.py:46 +#: joanie/payment/exceptions.py:54 msgid "Cannot parse notification." msgstr "Impossible d'analyser la notification." -#: joanie/payment/exceptions.py:54 +#: joanie/payment/exceptions.py:62 msgid "Payment provider API error." msgstr "Erreur API du fournisseur de paiement." diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index 80cfa7f52..3886790db 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta" [project] name = "joanie" -version = "2.7.1" +version = "2.8.0" authors = [{ "name" = "Open FUN (France Université Numérique)", "email" = "fun.dev@fun-mooc.fr" }] classifiers = [ "Development Status :: 5 - Production/Stable", diff --git a/src/frontend/admin/i18n/locales/es-ES.json b/src/frontend/admin/i18n/locales/es-ES.json index 833c019e4..878e44743 100644 --- a/src/frontend/admin/i18n/locales/es-ES.json +++ b/src/frontend/admin/i18n/locales/es-ES.json @@ -11,6 +11,14 @@ "description": "None value label for the BasicSelect", "message": "None" }, + "components.presentational.card.CreditCard.expired": { + "description": "Expired label", + "message": "Expired" + }, + "components.presentational.card.CreditCard.paymentMethod": { + "description": "Payment method label", + "message": "Payment method" + }, "components.presentational.dnd.DndList.emptyList": { "description": "Text when the drag n drop list is empty", "message": "No line to display, click add to add one" @@ -683,14 +691,6 @@ "description": "Enrollment field", "message": "{courseRunTitle} ({courseRunState}) Registered on: {registerOn}" }, - "components.templates.orders.view.hasConsentToTerms": { - "description": "Text for the has consent to term label", - "message": "The user has accepted the terms and conditions when purchasing" - }, - "components.templates.orders.view.hasNotConsentToTerms": { - "description": "Text for the has consent to term label", - "message": "The user has not accepted the terms and conditions when purchasing" - }, "components.templates.orders.view.invoiceBalance": { "description": "Invoice balance field", "message": "Balance" @@ -723,6 +723,10 @@ "description": "Invoice updated on field", "message": "Updated on" }, + "components.templates.orders.view.noPaymentMethod": { + "description": "Message displayed when order has no payment method", + "message": "No payment method has been defined." + }, "components.templates.orders.view.orderDetailsSectionAlert": { "description": "Text for the order details alert", "message": "In this view, you can see the details of an order, such as the user concerned, their status etc." @@ -735,25 +739,49 @@ "description": "Order group field", "message": "Order group" }, + "components.templates.orders.view.orderStatesMessages.assigned": { + "description": "Text for assigned order state", + "message": "Assigned" + }, "components.templates.orders.view.orderStatesMessages.canceled": { "description": "Text for canceled order state", "message": "Canceled" }, + "components.templates.orders.view.orderStatesMessages.completed": { + "description": "Text for completed order state", + "message": "Completed" + }, "components.templates.orders.view.orderStatesMessages.draft": { "description": "Text for draft order state", "message": "Draft" }, + "components.templates.orders.view.orderStatesMessages.failed_payment": { + "description": "Text for failed payment order state", + "message": "Failed payment" + }, + "components.templates.orders.view.orderStatesMessages.no_payment": { + "description": "Text for no payment order state", + "message": "No payment" + }, "components.templates.orders.view.orderStatesMessages.pending": { "description": "Text for pending order state", "message": "Pending" }, - "components.templates.orders.view.orderStatesMessages.submitted": { - "description": "Text for submitted order state", - "message": "Submitted" + "components.templates.orders.view.orderStatesMessages.pending_payment": { + "description": "Text for pending payment order state", + "message": "Pending payment" }, - "components.templates.orders.view.orderStatesMessages.validated": { - "description": "Text for validated order state", - "message": "Validated" + "components.templates.orders.view.orderStatesMessages.signing": { + "description": "Text for signing order state", + "message": "Signing" + }, + "components.templates.orders.view.orderStatesMessages.to_save_payment_method": { + "description": "Text for to save payment method order state", + "message": "To save payment method" + }, + "components.templates.orders.view.orderStatesMessages.to_sign": { + "description": "Text for to sign order state", + "message": "To sign" }, "components.templates.orders.view.orderStatus.paid": { "description": "Text for paid status", @@ -787,6 +815,10 @@ "description": "Owner field", "message": "Owner" }, + "components.templates.orders.view.paymentSchedule": { + "description": "Payment schedule title", + "message": "Payment schedule" + }, "components.templates.orders.view.price": { "description": "Price field", "message": "Price" diff --git a/src/frontend/admin/i18n/locales/fr-CA.json b/src/frontend/admin/i18n/locales/fr-CA.json index 833c019e4..878e44743 100644 --- a/src/frontend/admin/i18n/locales/fr-CA.json +++ b/src/frontend/admin/i18n/locales/fr-CA.json @@ -11,6 +11,14 @@ "description": "None value label for the BasicSelect", "message": "None" }, + "components.presentational.card.CreditCard.expired": { + "description": "Expired label", + "message": "Expired" + }, + "components.presentational.card.CreditCard.paymentMethod": { + "description": "Payment method label", + "message": "Payment method" + }, "components.presentational.dnd.DndList.emptyList": { "description": "Text when the drag n drop list is empty", "message": "No line to display, click add to add one" @@ -683,14 +691,6 @@ "description": "Enrollment field", "message": "{courseRunTitle} ({courseRunState}) Registered on: {registerOn}" }, - "components.templates.orders.view.hasConsentToTerms": { - "description": "Text for the has consent to term label", - "message": "The user has accepted the terms and conditions when purchasing" - }, - "components.templates.orders.view.hasNotConsentToTerms": { - "description": "Text for the has consent to term label", - "message": "The user has not accepted the terms and conditions when purchasing" - }, "components.templates.orders.view.invoiceBalance": { "description": "Invoice balance field", "message": "Balance" @@ -723,6 +723,10 @@ "description": "Invoice updated on field", "message": "Updated on" }, + "components.templates.orders.view.noPaymentMethod": { + "description": "Message displayed when order has no payment method", + "message": "No payment method has been defined." + }, "components.templates.orders.view.orderDetailsSectionAlert": { "description": "Text for the order details alert", "message": "In this view, you can see the details of an order, such as the user concerned, their status etc." @@ -735,25 +739,49 @@ "description": "Order group field", "message": "Order group" }, + "components.templates.orders.view.orderStatesMessages.assigned": { + "description": "Text for assigned order state", + "message": "Assigned" + }, "components.templates.orders.view.orderStatesMessages.canceled": { "description": "Text for canceled order state", "message": "Canceled" }, + "components.templates.orders.view.orderStatesMessages.completed": { + "description": "Text for completed order state", + "message": "Completed" + }, "components.templates.orders.view.orderStatesMessages.draft": { "description": "Text for draft order state", "message": "Draft" }, + "components.templates.orders.view.orderStatesMessages.failed_payment": { + "description": "Text for failed payment order state", + "message": "Failed payment" + }, + "components.templates.orders.view.orderStatesMessages.no_payment": { + "description": "Text for no payment order state", + "message": "No payment" + }, "components.templates.orders.view.orderStatesMessages.pending": { "description": "Text for pending order state", "message": "Pending" }, - "components.templates.orders.view.orderStatesMessages.submitted": { - "description": "Text for submitted order state", - "message": "Submitted" + "components.templates.orders.view.orderStatesMessages.pending_payment": { + "description": "Text for pending payment order state", + "message": "Pending payment" }, - "components.templates.orders.view.orderStatesMessages.validated": { - "description": "Text for validated order state", - "message": "Validated" + "components.templates.orders.view.orderStatesMessages.signing": { + "description": "Text for signing order state", + "message": "Signing" + }, + "components.templates.orders.view.orderStatesMessages.to_save_payment_method": { + "description": "Text for to save payment method order state", + "message": "To save payment method" + }, + "components.templates.orders.view.orderStatesMessages.to_sign": { + "description": "Text for to sign order state", + "message": "To sign" }, "components.templates.orders.view.orderStatus.paid": { "description": "Text for paid status", @@ -787,6 +815,10 @@ "description": "Owner field", "message": "Owner" }, + "components.templates.orders.view.paymentSchedule": { + "description": "Payment schedule title", + "message": "Payment schedule" + }, "components.templates.orders.view.price": { "description": "Price field", "message": "Price" diff --git a/src/frontend/admin/i18n/locales/fr-FR.json b/src/frontend/admin/i18n/locales/fr-FR.json index a33e90c6a..42bcc6f53 100644 --- a/src/frontend/admin/i18n/locales/fr-FR.json +++ b/src/frontend/admin/i18n/locales/fr-FR.json @@ -11,6 +11,14 @@ "description": "None value label for the BasicSelect", "message": "Aucun" }, + "components.presentational.card.CreditCard.expired": { + "description": "Expired label", + "message": "Expirée" + }, + "components.presentational.card.CreditCard.paymentMethod": { + "description": "Payment method label", + "message": "Moyen de paiement" + }, "components.presentational.dnd.DndList.emptyList": { "description": "Text when the drag n drop list is empty", "message": "Aucune ligne à afficher, cliquez sur Ajouter pour en ajouter une" @@ -683,14 +691,6 @@ "description": "Enrollment field", "message": "{courseRunTitle} ({courseRunState}) inscrit le : {registerOn}" }, - "components.templates.orders.view.hasConsentToTerms": { - "description": "Text for the has consent to term label", - "message": "L'utilisateur a accepté les conditions générales de vente lors de l'achat" - }, - "components.templates.orders.view.hasNotConsentToTerms": { - "description": "Text for the has consent to term label", - "message": "L'utilisateur n'a pas accepté les conditions générales de vente lors de l'achat" - }, "components.templates.orders.view.invoiceBalance": { "description": "Invoice balance field", "message": "Solde" @@ -723,6 +723,10 @@ "description": "Invoice updated on field", "message": "Modifié le" }, + "components.templates.orders.view.noPaymentMethod": { + "description": "Message displayed when order has no payment method", + "message": "Aucun moyen de paiement n'a été défini." + }, "components.templates.orders.view.orderDetailsSectionAlert": { "description": "Text for the order details alert", "message": "Dans cette vue, vous pouvez voir les détails d'une commande, comme son propriétaire, son statut, etc." @@ -735,25 +739,49 @@ "description": "Order group field", "message": "Groupe de commande" }, + "components.templates.orders.view.orderStatesMessages.assigned": { + "description": "Text for assigned order state", + "message": "Assignée" + }, "components.templates.orders.view.orderStatesMessages.canceled": { "description": "Text for canceled order state", "message": "Annulée" }, + "components.templates.orders.view.orderStatesMessages.completed": { + "description": "Text for completed order state", + "message": "Complétée" + }, "components.templates.orders.view.orderStatesMessages.draft": { "description": "Text for draft order state", "message": "Brouillon" }, + "components.templates.orders.view.orderStatesMessages.failed_payment": { + "description": "Text for failed payment order state", + "message": "Paiement échoué" + }, + "components.templates.orders.view.orderStatesMessages.no_payment": { + "description": "Text for no payment order state", + "message": "Aucun paiement" + }, "components.templates.orders.view.orderStatesMessages.pending": { "description": "Text for pending order state", "message": "En attente" }, - "components.templates.orders.view.orderStatesMessages.submitted": { - "description": "Text for submitted order state", - "message": "Soumise" + "components.templates.orders.view.orderStatesMessages.pending_payment": { + "description": "Text for pending payment order state", + "message": "En attente de paiement" }, - "components.templates.orders.view.orderStatesMessages.validated": { - "description": "Text for validated order state", - "message": "Validée" + "components.templates.orders.view.orderStatesMessages.signing": { + "description": "Text for signing order state", + "message": "En cours de signature" + }, + "components.templates.orders.view.orderStatesMessages.to_save_payment_method": { + "description": "Text for to save payment method order state", + "message": "Moyen de paiement à définir" + }, + "components.templates.orders.view.orderStatesMessages.to_sign": { + "description": "Text for to sign order state", + "message": "À signer" }, "components.templates.orders.view.orderStatus.paid": { "description": "Text for paid status", @@ -787,6 +815,10 @@ "description": "Owner field", "message": "Propriétaire" }, + "components.templates.orders.view.paymentSchedule": { + "description": "Payment schedule title", + "message": "Échéancier" + }, "components.templates.orders.view.price": { "description": "Price field", "message": "Prix" diff --git a/src/frontend/admin/package.json b/src/frontend/admin/package.json index aac5fc5e0..b9b4e5e5e 100644 --- a/src/frontend/admin/package.json +++ b/src/frontend/admin/package.json @@ -1,6 +1,6 @@ { "name": "admin", - "version": "2.7.1", + "version": "2.8.0", "private": true, "scripts": { "dev": "next dev -p 8072", diff --git a/src/frontend/admin/src/translations/es-ES.json b/src/frontend/admin/src/translations/es-ES.json index 759de21c4..eb68b159f 100644 --- a/src/frontend/admin/src/translations/es-ES.json +++ b/src/frontend/admin/src/translations/es-ES.json @@ -2,6 +2,8 @@ "components.modal.alterModal.cancel": "Cancel", "components.modal.alterModal.validate": "Validate", "components.presentational.button.popover.ButtonPopover.none": "None", + "components.presentational.card.CreditCard.expired": "Expired", + "components.presentational.card.CreditCard.paymentMethod": "Payment method", "components.presentational.dnd.DndList.emptyList": "No line to display, click add to add one", "components.presentational.filters.searchFilters.clear": "Clear", "components.presentational.filters.searchFilters.filtersLabelButton": "Filters", @@ -170,8 +172,6 @@ "components.templates.orders.view.enrollment": "Enrollment", "components.templates.orders.view.enrollmentAt": "Registered on", "components.templates.orders.view.enrollmentValue": "{courseRunTitle} ({courseRunState}) Registered on: {registerOn}", - "components.templates.orders.view.hasConsentToTerms": "The user has accepted the terms and conditions when purchasing", - "components.templates.orders.view.hasNotConsentToTerms": "The user has not accepted the terms and conditions when purchasing", "components.templates.orders.view.invoiceBalance": "Balance", "components.templates.orders.view.invoiceCreatedOn": "Created on", "components.templates.orders.view.invoiceDetailsSectionAlert": "In this section, you have access to the main invoice with its total and balance, as well as sub-invoices (such as credit notes for example)", @@ -180,14 +180,21 @@ "components.templates.orders.view.invoiceState": "State", "components.templates.orders.view.invoiceType": "Type", "components.templates.orders.view.invoiceUpdatedOn": "Updated on", + "components.templates.orders.view.noPaymentMethod": "No payment method has been defined.", "components.templates.orders.view.orderDetailsSectionAlert": "In this view, you can see the details of an order, such as the user concerned, their status etc.", "components.templates.orders.view.orderDetailsSectionTitle": "Order informations", "components.templates.orders.view.orderGroup": "Order group", + "components.templates.orders.view.orderStatesMessages.assigned": "Assigned", "components.templates.orders.view.orderStatesMessages.canceled": "Canceled", + "components.templates.orders.view.orderStatesMessages.completed": "Completed", "components.templates.orders.view.orderStatesMessages.draft": "Draft", + "components.templates.orders.view.orderStatesMessages.failed_payment": "Failed payment", + "components.templates.orders.view.orderStatesMessages.no_payment": "No payment", "components.templates.orders.view.orderStatesMessages.pending": "Pending", - "components.templates.orders.view.orderStatesMessages.submitted": "Submitted", - "components.templates.orders.view.orderStatesMessages.validated": "Validated", + "components.templates.orders.view.orderStatesMessages.pending_payment": "Pending payment", + "components.templates.orders.view.orderStatesMessages.signing": "Signing", + "components.templates.orders.view.orderStatesMessages.to_save_payment_method": "To save payment method", + "components.templates.orders.view.orderStatesMessages.to_sign": "To sign", "components.templates.orders.view.orderStatus.paid": "Paid", "components.templates.orders.view.orderStatus.refunded": "Refunded", "components.templates.orders.view.orderStatus.unpaid": "Unpaid", @@ -196,6 +203,7 @@ "components.templates.orders.view.organization": "Organization", "components.templates.orders.view.organizationSignedOn": "Organization signature date", "components.templates.orders.view.owner": "Owner", + "components.templates.orders.view.paymentSchedule": "Payment schedule", "components.templates.orders.view.price": "Price", "components.templates.orders.view.product": "Product", "components.templates.orders.view.state": "State", diff --git a/src/frontend/admin/src/translations/fr-CA.json b/src/frontend/admin/src/translations/fr-CA.json index 759de21c4..eb68b159f 100644 --- a/src/frontend/admin/src/translations/fr-CA.json +++ b/src/frontend/admin/src/translations/fr-CA.json @@ -2,6 +2,8 @@ "components.modal.alterModal.cancel": "Cancel", "components.modal.alterModal.validate": "Validate", "components.presentational.button.popover.ButtonPopover.none": "None", + "components.presentational.card.CreditCard.expired": "Expired", + "components.presentational.card.CreditCard.paymentMethod": "Payment method", "components.presentational.dnd.DndList.emptyList": "No line to display, click add to add one", "components.presentational.filters.searchFilters.clear": "Clear", "components.presentational.filters.searchFilters.filtersLabelButton": "Filters", @@ -170,8 +172,6 @@ "components.templates.orders.view.enrollment": "Enrollment", "components.templates.orders.view.enrollmentAt": "Registered on", "components.templates.orders.view.enrollmentValue": "{courseRunTitle} ({courseRunState}) Registered on: {registerOn}", - "components.templates.orders.view.hasConsentToTerms": "The user has accepted the terms and conditions when purchasing", - "components.templates.orders.view.hasNotConsentToTerms": "The user has not accepted the terms and conditions when purchasing", "components.templates.orders.view.invoiceBalance": "Balance", "components.templates.orders.view.invoiceCreatedOn": "Created on", "components.templates.orders.view.invoiceDetailsSectionAlert": "In this section, you have access to the main invoice with its total and balance, as well as sub-invoices (such as credit notes for example)", @@ -180,14 +180,21 @@ "components.templates.orders.view.invoiceState": "State", "components.templates.orders.view.invoiceType": "Type", "components.templates.orders.view.invoiceUpdatedOn": "Updated on", + "components.templates.orders.view.noPaymentMethod": "No payment method has been defined.", "components.templates.orders.view.orderDetailsSectionAlert": "In this view, you can see the details of an order, such as the user concerned, their status etc.", "components.templates.orders.view.orderDetailsSectionTitle": "Order informations", "components.templates.orders.view.orderGroup": "Order group", + "components.templates.orders.view.orderStatesMessages.assigned": "Assigned", "components.templates.orders.view.orderStatesMessages.canceled": "Canceled", + "components.templates.orders.view.orderStatesMessages.completed": "Completed", "components.templates.orders.view.orderStatesMessages.draft": "Draft", + "components.templates.orders.view.orderStatesMessages.failed_payment": "Failed payment", + "components.templates.orders.view.orderStatesMessages.no_payment": "No payment", "components.templates.orders.view.orderStatesMessages.pending": "Pending", - "components.templates.orders.view.orderStatesMessages.submitted": "Submitted", - "components.templates.orders.view.orderStatesMessages.validated": "Validated", + "components.templates.orders.view.orderStatesMessages.pending_payment": "Pending payment", + "components.templates.orders.view.orderStatesMessages.signing": "Signing", + "components.templates.orders.view.orderStatesMessages.to_save_payment_method": "To save payment method", + "components.templates.orders.view.orderStatesMessages.to_sign": "To sign", "components.templates.orders.view.orderStatus.paid": "Paid", "components.templates.orders.view.orderStatus.refunded": "Refunded", "components.templates.orders.view.orderStatus.unpaid": "Unpaid", @@ -196,6 +203,7 @@ "components.templates.orders.view.organization": "Organization", "components.templates.orders.view.organizationSignedOn": "Organization signature date", "components.templates.orders.view.owner": "Owner", + "components.templates.orders.view.paymentSchedule": "Payment schedule", "components.templates.orders.view.price": "Price", "components.templates.orders.view.product": "Product", "components.templates.orders.view.state": "State", diff --git a/src/frontend/admin/src/translations/fr-FR.json b/src/frontend/admin/src/translations/fr-FR.json index f79f4c20d..c98f25874 100644 --- a/src/frontend/admin/src/translations/fr-FR.json +++ b/src/frontend/admin/src/translations/fr-FR.json @@ -2,6 +2,8 @@ "components.modal.alterModal.cancel": "Annuler", "components.modal.alterModal.validate": "Valider", "components.presentational.button.popover.ButtonPopover.none": "Aucun", + "components.presentational.card.CreditCard.expired": "Expirée", + "components.presentational.card.CreditCard.paymentMethod": "Moyen de paiement", "components.presentational.dnd.DndList.emptyList": "Aucune ligne à afficher, cliquez sur Ajouter pour en ajouter une", "components.presentational.filters.searchFilters.clear": "Supprimer", "components.presentational.filters.searchFilters.filtersLabelButton": "Filtres", @@ -170,8 +172,6 @@ "components.templates.orders.view.enrollment": "Inscription", "components.templates.orders.view.enrollmentAt": "Inscrit le", "components.templates.orders.view.enrollmentValue": "{courseRunTitle} ({courseRunState}) inscrit le : {registerOn}", - "components.templates.orders.view.hasConsentToTerms": "L'utilisateur a accepté les conditions générales de vente lors de l'achat", - "components.templates.orders.view.hasNotConsentToTerms": "L'utilisateur n'a pas accepté les conditions générales de vente lors de l'achat", "components.templates.orders.view.invoiceBalance": "Solde", "components.templates.orders.view.invoiceCreatedOn": "Créée le", "components.templates.orders.view.invoiceDetailsSectionAlert": "Dans cette section, vous avez accès à la facture principale avec son montant total et son solde, ainsi qu'aux sous-factures (des avoirs par exemple)", @@ -180,14 +180,21 @@ "components.templates.orders.view.invoiceState": "État", "components.templates.orders.view.invoiceType": "Type", "components.templates.orders.view.invoiceUpdatedOn": "Modifié le", + "components.templates.orders.view.noPaymentMethod": "Aucun moyen de paiement n'a été défini.", "components.templates.orders.view.orderDetailsSectionAlert": "Dans cette vue, vous pouvez voir les détails d'une commande, comme son propriétaire, son statut, etc.", "components.templates.orders.view.orderDetailsSectionTitle": "Informations de la commande", "components.templates.orders.view.orderGroup": "Groupe de commande", + "components.templates.orders.view.orderStatesMessages.assigned": "Assignée", "components.templates.orders.view.orderStatesMessages.canceled": "Annulée", + "components.templates.orders.view.orderStatesMessages.completed": "Complétée", "components.templates.orders.view.orderStatesMessages.draft": "Brouillon", + "components.templates.orders.view.orderStatesMessages.failed_payment": "Paiement échoué", + "components.templates.orders.view.orderStatesMessages.no_payment": "Aucun paiement", "components.templates.orders.view.orderStatesMessages.pending": "En attente", - "components.templates.orders.view.orderStatesMessages.submitted": "Soumise", - "components.templates.orders.view.orderStatesMessages.validated": "Validée", + "components.templates.orders.view.orderStatesMessages.pending_payment": "En attente de paiement", + "components.templates.orders.view.orderStatesMessages.signing": "En cours de signature", + "components.templates.orders.view.orderStatesMessages.to_save_payment_method": "Moyen de paiement à définir", + "components.templates.orders.view.orderStatesMessages.to_sign": "À signer", "components.templates.orders.view.orderStatus.paid": "Payée", "components.templates.orders.view.orderStatus.refunded": "Remboursée", "components.templates.orders.view.orderStatus.unpaid": "Impayée", @@ -196,6 +203,7 @@ "components.templates.orders.view.organization": "Établissement", "components.templates.orders.view.organizationSignedOn": "Date de signature de l'établissement", "components.templates.orders.view.owner": "Propriétaire", + "components.templates.orders.view.paymentSchedule": "Échéancier", "components.templates.orders.view.price": "Prix", "components.templates.orders.view.product": "Produit", "components.templates.orders.view.state": "État", diff --git a/src/mail/package.json b/src/mail/package.json index fb46246ba..c339273b3 100644 --- a/src/mail/package.json +++ b/src/mail/package.json @@ -1,6 +1,6 @@ { "name": "mail_mjml", - "version": "2.7.1", + "version": "2.8.0", "description": "An util to generate html and text django's templates from mjml templates", "type": "module", "dependencies": { diff --git a/src/openApiClientJs/package.json b/src/openApiClientJs/package.json index 8757b797c..e504bff01 100644 --- a/src/openApiClientJs/package.json +++ b/src/openApiClientJs/package.json @@ -1,6 +1,6 @@ { "name": "joanie-openapi-client-ts", - "version": "2.7.1", + "version": "2.8.0", "private": true, "description": "Tool to generate Typescript api client for joanie", "scripts": { diff --git a/src/tray/tray.yml b/src/tray/tray.yml index 81657ca39..07153af83 100644 --- a/src/tray/tray.yml +++ b/src/tray/tray.yml @@ -1,3 +1,3 @@ metadata: name: joanie - version: 2.7.1 + version: 2.8.0 diff --git a/src/tray/vars/all/main.yml b/src/tray/vars/all/main.yml index 79e95afef..c8d4dc261 100644 --- a/src/tray/vars/all/main.yml +++ b/src/tray/vars/all/main.yml @@ -21,7 +21,7 @@ joanie_nginx_static_cache_expires: "1M" # -- admin nginx joanie_admin_nginx_image_name: "fundocker/joanie-admin" -joanie_admin_nginx_image_tag: "2.7.1" +joanie_admin_nginx_image_tag: "2.8.0" joanie_admin_nginx_port: 8061 joanie_admin_nginx_replicas: 1 joanie_admin_nginx_healthcheck_port: 5000 @@ -41,7 +41,7 @@ joanie_database_secret_name: "joanie-postgresql-{{ joanie_vault_checksum | defau # -- joanie joanie_image_name: "fundocker/joanie" -joanie_image_tag: "2.7.1" +joanie_image_tag: "2.8.0" # The image pull secret name should match the name of your secret created to # login to your private docker registry joanie_image_pull_secret_name: ""