All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Property
is_ready_for_paymentreturns True when the state of batch order is inprocess_payment - Property
is_signed_by_buyerreturns True when buyer and organization both signed agreement of batch order - Cancel a batch order through Joanie's backoffice aborts signing procedure at the signature provider
3.2.0 - 2026-02-25
- Add organization logo into quote template for batch order
- Add essential actions to batch order detail view in admin backoffice
- Batch order export to csv in admin API
- Generate zip archive of agreements for an organization client API
- Expose related orders generate by a batch order in admin backoffice
- Add batch order detail page in admin backoffice
- Add filter to batch order admin backoffice
- Agreement viewset for organizations client API
- Add filter by batch order in order admin backoffice
- Update batch order reference in order export csv for admin API
- Add contract definition for batch order for product configuration in admin backoffice
- Add batch order export csv for admin backoffice
- Add quote definitions admin in the back office
- Add purchase order reference modal in batch order view
- Add support for keycloak openid token
- Invitation link to sign agreement sent by signature provider to signatory recipient for batch order
- Validate course-product relation with voucher code from batch order on order creation
- Generate quote's context at batch order creation
- Fix CSS in default and Unicamp micro-credentials after WeasyPrint update
- Fix CSS and HTML structure of agreement and contract after WeasyPrint update
- Send voucher codes generated from batch order to administrative email and owner email
- Signatory fields of batch order are required
- Relation of batch order and contract in
Contractmodel - Send batch order signature link to signatory email
3.1.2 - 2025-11-06
- Rename contract_definition to contract_definition_order in the back office
3.1.1 - 2025-11-03
- Generate unique code in voucher create page
3.1.0 - 2025-11-03
- Orders with a voucher discount of 100% should always create a main invoice
- Prevent duplicate order generation for batch orders
- Add professional training agreement templates for batch order
- Add contract definition for batch order field to Product model
- Add admin API endpoints for batch orders to confirm quote, purchase order and bank transfer
- Add payment methods for batch orders
- Add unique reference for a quote once generated
- Add Voucher admin API
- Add Voucher admin in the back office
3.0.4 - 2025-09-25
- Batch order signatory to sign the contract of a signature procedure
- Changed background color for micro-credential default template
- Style issues in micro-credentials templates
- Handle long title and more teachers in micro-credentials templates
3.0.3 - 2025-09-04
- Exclude archived course runs from synchronization
3.0.2 - 2025-09-01
- Fix cache collision between Serializers
3.0.1 - 2025-08-26
- Update backend translations
3.0.0 - 2025-08-26
- Add template micro credential without Unicamp brand
- Update payment schedule endpoint to return discounted amount and schedule with voucher code
- Add nested Organization Quote client api
- Add admin API endpoint for quote definitions
- Add quote and quote definition models for batch orders
- Added
handle_notificationfor batch order in dummy payment backend - Added discount column to csv order export
- Added actions in admin api endpoints
BatchOrderto validate payment, generate orders and send voucher codes, and send invitation signature link - Add admin api endpoints for
BatchOrderresources to create, read, list and cancel - Claim an order generated from a batch order through voucher code
- Add description to order group model
- Add discounted price to course product relation serializer
- Add description to order group form in the back office
- Sync discount str representation
- Sync course run related discount
- Trigger sync when an offering rule is saved
- Add Offer rules to ProductRelationSerializer
- Add cron task to sync offering rules
- Language tab for offering rule
- Rename
payment_scheduleendpoint topayment_plan - Update contract definition template to move course section into contract body before articles
- Update limits for payment schedule for credential products and for certificate product should always be a one-off payment
- Upgrade
djangorestframeworkto 3.16.0 - Use discounted_price in payment_schedule
- Replace order groups from the client API with course product relations properties
- Rename
OrderGrouptoOfferRule - Rename
CourseProductRelationtoOffer - Rename
OffertoOfferingandOfferRuletoOfferingRule - Update
descriptionfield ofOfferingRuleto be translatable
- Render discounted price in installment emails when one is present
- Invalidate course product relation cache on order group update
- Compute offer rule properties instead of returning the first one
- Offering rule form date time picker and discount
- Offering rule description field
2.18.1 - 2025-05-28
- Downgrade
djangorestframeworkto 3.15.2 to fix payzen notifications
2.18.0 - 2025-05-23
- Add course offer information into course webhook synchronization payload
- Update organization assignation logic to ignore order with pending signature or without payment method defined.
2.17.1 - 2025-03-06
- Allow to configure the Sarbacane API retry total and backoff factor from environment variables
2.17.0 - 2025-03-05
- Add
Discountrelation toOrderGroupmodel - Add
startandenddatetime fields on order group model - Add Sarbacane newsletter client
- Remove
generate_certificatesaction in django admin views - Remove
ownerandis_mainin CreditCard model permanently - Remove
is_activeon order group client serializer
- Internationalization of certificate verification view
- BO: generate certificates for orders with product of type certificate
2.16.0 - 2025-02-13
ownerandis_mainfields onCreditCardmodel are deprecated and been replaced with many-to-manyownersfield instead- Add a management command to delete unused credit cards
- Catch
PaymentProviderAPIExceptionon CreditCardpost_deletesignal - Delete credit card once all orders installments are paid
- Sorting data in front office is now server-side
2.15.0 - 2025-02-05
- JOANIE_LMS_BACKENDS is now configurable through env vars as a JSON string array of LMS Backends
2.14.1 - 2025-02-03
- Take in account
errorinstallment in debit logic - Add missing field
updated_ontoAdminOrderLightSerializer - Fix payment check before retrying
2.14.0 - 2025-01-29
- Add management command to delete orders stuck in signing states and orders
stuck in
to_save_payment_methodto purchase a product of type certificate - BD: Add
updated_ondate field to the order list view
- BO: Set properly the
is_gradedproperty on target course creation - BO: Allow to use nested TranslatableForms
- Allow a user to create a new order when the previous order already
exists but it is in
refundingorrefundedstate - Prevent multiple payments if the provider server has a problem
- Fix the logic to get the organization with the least active orders to assign which could have duplicated orders in its sum.
2.13.0 - 2025-01-15
- Add order export to CSV in back office
- Branded Unicamp degrees
- Fix moodle
get_gradesmethod - Fix order filtering by creation date
- Changed behavior of
cancel_or_refundmethod in payment backends to update objects after call
2.12.0 - 2024-12-18
- Add template name field into ContractDefinition edit view in the Back office application
- Prevent to index certificate verification page
- Update the model
Certificateordering to descending order on the fieldissued_on
2.11.0 - 2024-12-11
- Add a default contract definition template without a branded logo
- Add filters for the admin viewset through the field
created_onto search orders on exact date, before date, after date and range of dates. - Add filter for admin order viewset by product type
- Add button in back office for refunding an order
- Add
teachers,skillsandcertification_levelfields toProductmodel - Add admin api endpoints to CRUD
TeacherandSkillresources. - Add certification section in back office product detail view
- Update product endpoint to CRUD
teachers,skillsandcertification levelfields
- Fix order update on archived course run
2.10.0 - 2024-11-20
- Allow staff user to create and update an enrollment for a user on closed course runs and opened course runs
- Add link to back office in Django admin topbar
- Add boolean field
has_waived_withdrawal_rightto theOrdermodel - Add
is_withdrawabletoCourseProductRelationmodel - Prevent a user to create an order for a product without withdrawal period if the user has not waived his withdrawal right
- Display
has_waived_withdrawal_rightin back office Order view - Add dark theme to back office
- Send an email to the user when an order has been refunded
- Ignore archived course runs to process payment schedule and withdrawable state
2.9.2 - 2024-10-24
- Update order flow to allow transition from
no_paymenttocompleted
2.9.1 - 2024-10-23
- Manage zero click refused payment
2.9.0 - 2024-10-22
- Add index on
templatefield of theCertificateDefinitionmodel - Add
appendixfield onContractDefinitionmodel - Allow to edit
appendixContractDefinitionfield through the back office
- Improve performance of the certificate client API endpoint
- Make payment backend request timeout configurable
2.8.0 - 2024-10-16
- Added
refundstate to order flow and added refund action on payment backends and cancel/refund endpoint for admin users - 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
- Updated
OrderPaymentScheduleDecoderto return adateobject for thedue_dateattribute and aMoneyobject foramountattribute 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_installmentto catch up on late payments of installments that are in the past - Deprecated field
has_consent_to_termsforOrdermodel - Move signature fields before appendices in contract definition template
- Update
handle_notificationsignature backend to confirm signature
- Prevent duplicate Address objects for a user or an organization
- Remove the
has_consent_to_termsfield from theOrderedit view in the back office application
2.7.1 - 2024-10-02
- Downgrade to django-storages 1.14.3
2.7.0 - 2024-09-23
- Update round robin logic to favor author organizations
- Reassign organization for pending orders
- Improve signature backend
handle_notificationerror catching - Allow to cancel an enrollment order linked to an archived course run
2.6.1 - 2024-07-25
- Improve error catching in the
populate_certificate_signatorycommand
2.6.0 - 2024-07-24
- Add management command to fix imported certificates without signatory
- Fix signatories retrieval logic in edx certificate import
- Fix OpenEdX enrollment mode choice logic
2.5.0 - 2024-06-25
- Add
created_oncolumn to theOrderlist view in the backoffice
- Do not update OpenEdX enrollment if this one is already up-to-date on the remote lms
2.4.0 - 2024-06-21
- Add settings configuration for the contract's country calendar to manage the payment schedule and the withdrawal period in days
- Catch all exceptions raised by enroll_user_to_course_run method
- Fix enrollment mode update on order validation
2.3.0 - 2024-06-18
- Add
payment_providerattribute toCreditCardmodel - Allow to tokenize a card endpoint for a user
- Add
statefield to NestedOrderSerializer
- Update certificate template to render logo of organization if it has a value.
- Add
currencyfield toOrderPaymentSerializerserializer - Allow an order with
no_paymentstate to pay for failed installment on a payment schedule - Order certificate filter now returns also legacy degree certificates linked to an enrollment
- Ensure when API requests fails with payment provider, it raises
an error for
create_payment,create_one_click_paymentandcreate_zero_click_payment - Improve error management of
set_enrollmentmethod of MoodleBackend. - Bind properly organizations in a certificate template sentence
2.2.0 - 2024-05-22
- Allow to pay failed installment on a payment schedule of an order
- BO : Highlight graded target courses in product detail view
- Add
payment_scheduleproperty toOrderSerializer - Allow to filter enrollment through
is_activefield on the client API - Add the possibility to add a syllabus inside the product form
- Add a command to trigger the daily due payments
- Complete Lyra payment creation payload
- Lyra backend save card logic
- Manage invalid logging secret key
- Accesses list layout
- Product target course layout
- Update DatePicker with keyboard
- Order view when organization is not defined
2.1.0 - 2024-05-02
- Add accessibility section from Richie course syllabus in contract definition template through RDF attributes
- Update signatories for organization owners and student on ongoing signature procedures
- Add enrollments pages
- Addition of clickable columns value in the different lists
- Add admin page to decrypt additional data sent to Sentry
- Allow to link a syllabus inside the product detail view
- Add Lyra payment backend
- BO : Add the possibility to add a syllabus inside the course form
- Use
NestedGenericViewSetclass for nested routes on API viewsets (client and admin) - Migrate from
django-fsmtoviewflow.fsm - Store certificate images through a new DocumentImage model
- Migrate to Sentry SDK 2.0
- Add required filter by
Organizationand search through query on learner for certificate view in django admin - Migrate from
django-fsmtoviewflow.fsm - Use generic AdminCourseProductRelationSerializer
- Make editing forms in auto save mode
- Format all displayed date to the format "10/14/1983, 1:30 PM"
- Nested Order Course API client viewset returns the orders where the user has access to organization
- Contract's context
course_start,course_end,course_effortandcourse_priceare strings for template tags formatting - Prevent newsletter subscription on user save failure
- Query string search for enrollment in django admin backoffice
- Encrypt sentry additional data (may contain sensitive data)
2.0.1 - 2024-04-16
- Ignore conflicts when creating batch of enrollments
- Fix translation content logic
2.0.0 - 2024-04-10
- Add a new endpoint to withdraw an order
- Endpoint to retrieve the first course_run related to a course_link
- Add order payment schedule
- Manage commercial newsletter subscriptions
- Allow backoffice to generate certificates from a course and product relation
- Bind remote catalog syllabus to contract template
- Add redis backend to cache configuration
- Add generate certificate button in Back Office
- Add admin Enrollment endpoint
- Add tabs layout on back offices forms
- Filter admin resources list through their pk
- Allow backoffice to generate certificate if order is eligible
- Allow backoffice admin user to cancel an order
- Add filter tag
iso8601_to_date - Allow student to download his owned contract once fully signed
- Allow to filter course product relation by organization title or product title or by course code on the client API.
- Allow to filter courses by course code or title on the client API
- Allow to filter orders by product title on the client API
- Allow to filter enrollments by course title on the client API
- Debug app to preview template (certificate, degree, invoice, contract definition)
- Allow to filter out organization through course product relation id on the client API
- Add custom template tag to convert ISO 8601 duration to a specified time unit.
- Add custom serializer field for duration field to format ISO 8601
- Add effort duration field for the Course Model
- Add phone number field for the User Model
- Add property
verification_uritoCertificatemodel - Add a certificate verification view
- Add
has_consent_termsboolean field toOrdermodel - Bind terms and conditions to the contract definition template
- Extend Site model to store terms and conditions
- Add
join_andandlist_keytemplate tags - Add address and new properties on client OrganizationSerializer
- Add admin endpoints to create/update/delete organization addresses
- Add several admin api endpoint filters
- Filter course product relation client api endpoint by product type
- Link Organization to Address Model
- New properties on Organization model to complete contract definition context
- Allow to bulk sign contracts by training
- Filtering orders by organization, product, and course product relation
- Allow to set CSRF_COOKIE_DOMAIN through env vars
- Dedicated storage for easy_thumbnail using boto3
- Allow to override settings in tray
- Add API endpoints for other services to fetch data on course run
- Allow to filter contracts by signature state, product, course and organization, id and course product relation id
- Add bulk download of signed contracts to generate ZIP archive with command
- Add read-only api admin endpoint to list/retrieve orders
- Add a management command to synchronize course run or product on a remote catalog
- Install and configure celery with redis
- Add CachedModelSerializer
- Allow to leave organization empty while order is in draft
- Add API client signature provider to sign contract from an order
- Add admin route to add and modify OrderGroups
- Allow to filter contracts through their signature state
- Allow filtering orders by state or product type exclusion
- Allow filtering orders by enrollment
- Create missing courses automatically on course run sync
- Create
certificatetemplate - Add contract and contract definition models with related API endpoints
- Add
instructionsmarkdown field toProductmodel - Add filter course by product type
- Enroll as "verified" mode in OpenEdX when enrolling via an order
- Add mermaid graph for Order workflow
- Add a route to reorder target_courses
- Add target_course route and list view for products
- Add multiples product, order, certificates and enrollment in the database
that's initialized with the
make demo-dev - Add client api filter to filter
Orderresource byproduct__type - Add a backoffice redirect view to redirect to the frontend admin backoffice
- Add filters to CourseRun list for a given course on admin api
- Allow issuing a certificate directly for an enrollment (without an order)
- Generate certificates for products of type
certificate - Add route detailing current user
- Add related certificate products and orders to enrollment API endpoint
- Add admin endpoints to create/update/delete organization/course accesses
- Add admin endpoint to search users
- Add endpoints to get course product relations and courses from organization
- Add order groups to allow limiting the number of seats on a product course
- Add api endpoint to retrieve course product relations
- Add
get_selling_organizationsmethod to Course model - Add courses client api endpoint
- Add ThumbnailImageField "cover" to Course model
- Add abilities to courses/organizations and their accesses
- Add ID field to the course serializer
- Add course and organization accesses with roles
- CRUD admin API for organizations, products, course runs, certificate definitions, courses and retrieve enabled languages
- Allow on-demand page size on the order and enrollment endpoints
- Add yarn cli to generate joanie api client in TypeScript
- Display course runs into the admin course change view
- Display password field into admin user change view
- Automatically allocate organization equitably on order creation according to their active order count per organization for the course/product couple
- Add many admin api filters with text search
- Add a nested endpoint to retrieve all the course runs of a course
- Filter courses according to whether they have listed course runs or not
- Add some objects to demo-dev command. A credit card, a billing address and one order of each state. Also add some order target courses.
- Add markdown editor inside the BO
- Add admin endpoint to manage course product relations
- Add organization contract signature
- Add moodle LMS backend
- Make the target course card title clickable
- Add contract details inside order view
- Add playwright component stack
- Update network name in docker-compose file in order to fit richie and openedx-docker naming.
- Update the certificate viewset for the API client to return certificates from orders and from enrollments owned by a user.
- Update demo-dev command to add a second product purchase with learner signature.
- Improve
degreecertificate template - Bind organization course author into certificate context instead of organization order
- Prevent to create an order with course run that has ended
- Debug view for Certificate, Degree, Contract Definition and Invoice
- Internalize invoice template
- Use HTTPStatus instead of raw HTTP code value
- If a product has a contract, delay auto enroll logic on leaner signature
- Prevent to enroll to not listed course runs related to an order awaiting signature of a contract by the learner
- Use Invoice.recipient_address to populate Contract address context
- Link Invoice to Address object
- Update psycopg to version 3
- Update contract api endpoint to retrieve contracts by ownership
- Internalize degree template
- Allow to download enrollment certificate from related download api endpoint
- Data returned by product admin serializer
- Refactor the Order FSM to make a better use of transitions
- Allow to get course product relation anonymously through a course id / product id pair
- Take products in account to process Course state
- Update OrderSerializer to bind Course information
- Use ThumbnailImageField instead of ImageField for Organization logo
- Refactor how the user is authenticated and passed throughout the request
- Normalize the organization code field
- Activate pagination by default on all endpoints (20 items per page)
- Use user fullname instead of username in order confirmation email
- Rename certificate field into certificate_definition for the ProductSerializer
- Improve certificate serializer
- Upgrade to Django 4.2
- Add model and API endpoint for course wishes
- Change order viewset filter "state" to accept multiple choices.
- Product and Order serializers now return Contract and ContractDefinition object instead of ids.
- Rename nested order serializer attributes to be more descriptive
- Update nested order serializer to return enrollment
- Update order serializer to return enrollment
- Rename serializers attributes to be more descriptive:
- EnrollmentSerializer
- OrderSerializer
- OrderLightSerializer
- CourseSerializer
- CourseAccessSerializer
- OrganizationAccessSerializer
- Rename query parameters to be more descriptive:
- OrderViewSetFilter
- ProductViewSetFilter
- EnrollmentViewSetFilter
- Update admin course serializer to return course runs
- Allow group order deletion through course product relation
- Delete group orders when deleting a course product relation
- Rename admin api payload parameters to be more descriptive:
- AdminOrganizationAccessSerializer
- AdminCourseAccessSerializer
- AdminCourseSerializer
- AdminCourseRunSerializer
- Update the course runs list
- delete the resource link column and move it to the options
- format start and end date
- add course code colum
- Add an order cancellation action in the order detail view
- Preserve query params filters on page refresh
- Remove mypy
- Product API endpoint
- Remove djmoney and Moneyfields
- Badge providers now live in the obc python package
- Remove unused
OrderLiteSerializer
- Fix unenrollment issue on closed course runs
- Fix auto enrollment with closed and specific course runs
- Fix demo-dev command synchronization error.
- Add missing django dockerflow middleware
- Fix translation content logic
1.2.0 - 2023-08-28
- Add languages to the
CourseRunserializer - Rename
certificatefield tocertificate_definitioninto theProductSerializer
1.1.0 - 2023-02-22
- Encode image in base64 in order validated mail template
- Store full name in user profile through firstname field
- Set CourseRun
is_listedto False by default - Improve order confirmation email template
- Include course information into course runs representation
- Add synchronization for course runs
- Add make dbshell cmd to access database in cli
- Catch error if the max retries synchronization webhook gets reached
- Prevent server error when CourseRun instance has no start and end dates.
- Prevent to enroll on several opened course runs of the same course
- Prevent internal server error when certificate document is unprocessable
- Fix a bug that raise an error when user is automatically enrolled to a course run on which they have already an inactive enrollment
1.0.0 - 2023-01-31
- First working version serving sellable micro-credentials for multiple organizations synchronized to a remote catalog