/
Order Fulfillment Strategy

Order Fulfillment Strategy

This page covers the design ideas for Order Fulfillment in Django-Oscar. 

General Idea:

  • Fulfill enrollments synchronously through the Enrollment API.
  • Persist fulfillment status in django-oscar based on success or failure of request to Enrollment API.
  • Allow manual resubmission of failed fulfillment from django-oscar, if the Enrollment API fails to enroll students.

Related Sections of Code in django-oscar

  • order.processing.EventHandler is responsible for fulfillment via the "handle_shipping_event()" function. 
  • For all our digital product types, "handle_shipping_event()" will need to be extended to handle fulfillment.
    • Each ProductType will require unique fulfillment actions, such as Enrollments requiring the Enrollment API.
    • Each ProductType must have a unique fulfillment strategy defined in a new fulfillment API.
  • We can use Order Status via order.abstract_models.AbstractOrder to have statuses for failed fulfillment.

Fulfillment API

  • order.processing.EventHandler#handler_shipping_event() calls fulfillment_api.fulfill(order)
  • settings.py has a configured mapping of ProductTypes to Fulfillment classes

fulfillment.py

  • New fulfillment API module that has two functions
    • fulfill(order)
    • refund(order)
  • Each function returns status on whether on success or failure.
    • TODO: Need to identify all failure scenarios and map them to Order Status

Fulfillment Modules

  • There will be a base fulfillment module that has the following interface:
    • fulfill_product(product)
    • refund_product(product)
  • There will be an implementation per ProductType of "Fulfillment"
  • For Q3 we only need the EnrollmentFulfillment implementation.
  • EnrollmentFulfillment will contain the logic to call the Enrollment API synchronously to enroll a student.

 

Remaining Work

  • Create a ProductType Definition (stories exist)
  • Fulfillment API
    • Wired into EventHandler
    • Takes an Order
    • Fulfills associated products
    • Updates Order status
  • Define order status
    • state machine
  • Update the Marketing Site to call into the new endpoint
  • Course Mode table with SKUs for checking whether to use the new or old order workflows (short term)
  • Login and Registration Pages
  • Third Party Enrollment
  • Bypassing Payment (via RESTful API work)
    • Need to extend for payment gateways
    • Can have additional logic for bypassing payment on free products
    • The sandbox store has business logic for bypassing payment of free products as well.

 

Other Concerns

  • Error Handling on order fulfillment
    • Need celery task (or other queue) to re-attempt fulfillment on failed orders
  • Incremental rollout means there will be a need to update the course modes table as well as Oscar
    • Have a SKU table in the LMS that references rows in course_modes table (or add a new column)
    • Pass the SKU through the Enrollment API
    • Allows Drupal to build URLs based on the Enrollment API that can be used to purchase enrollments through Oscar.

 

 

Related content

Course Enrollments
More like this
Setting up the Catalog
Setting up the Catalog
More like this
Ecommerce Integration
Ecommerce Integration
More like this
E-Commerce IDA (Otto)
E-Commerce IDA (Otto)
More like this
Enrollment / Discount Codes
Enrollment / Discount Codes
More like this
Asynchronous Order Fulfillment
Asynchronous Order Fulfillment
More like this