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.

 

 

Comments