| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- ========
- Shipping
- ========
-
- Shipping can be very complicated. Depending on the domain, a wide variety of shipping
- scenarios are found in the wild. For instance, calculation of shipping costs can depend on:
-
- * Shipping method (eg standard, courier)
- * Shipping address
- * Time of day of order (eg if requesting next-day delivery)
- * Weight of items in basket
- * Customer type (eg business accounts get discounted shipping rates)
- * Offers and vouchers that give free or discounted shipping
-
- Further complications can arise such as:
-
- * Only making certain shipping methods available to certain customers
- * Tax is only applicable in certain situations
-
- Oscar can handle all of these shipping scenarios.
-
- Shipping in oscar
- -----------------
-
- Shipping is handled using "method" objects which represent a means of shipping
- an order (eg "standard" or "next-day" delivery). Each method is essentially a
- named calculator that takes a basket and is able to calculate the shipping
- costs with and without tax.
-
- For example, you may model "standard" delivery by having a calculator object
- that charges a fixed price for each item in the basket. The method object
- could be configured by passing the fixed price to be used for calculation.
-
- Shipping within checkout
- ------------------------
-
- Shipping is first encountered by customers within the checkout flow, on the "shipping
- method" view.
-
- It is the responsibility of this class to either:
-
- 1. Offer an a set of delivery methods for the customer to choose from, displaying
- the cost of each.
- 2. If there is only one method available, to construct the appropriate shipping method
- and set it within the checkout session context.
-
- The ``ShippingMethodView`` class handles this behaviour. Its core
- implementation looks up a list of available shipping methods using the
- ``oscar.shipping.repository.Repository`` class. If there is only one, then
- this is written out to the session and a redirect is issued to the next step of
- the checkout. If more than one, then each available method is displayed so the
- customer can choose.
-
- Default behaviour
- -----------------
- Oscar ships with a simple model for calculating shipping based on a charge per
- order, and a charge per item. This is the ``OrderAndItemLevelChargeMethod``
- class and is configured by setting the two charges used for the calculation.
- You can use this model to provide multiple methods - each identified by a code.
-
- The core ``Repository`` class will load all defined
- ``OrderAndItemLevelChargeMethod`` models and make them available to the
- customer. If none are set, then a `FreeShipping` method object will be
- returned.
-
- Shipping method classes
- -----------------------
-
- Each method object must subclass ``ShippingMethod`` from
- ``oscar.shipping.methods`` which provides the required interface. Note that the interface
- does not depend on the many other factors that can affect shipping (eg shipping address). The
- way to handle this is within your "factory" method which returns availables shipping methods.
-
- Writing your own shipping method
- --------------------------------
-
- Simple really - follow these steps:
-
- 1. Subclass ``oscar.shipping.methods.ShippingMethod`` and implement
- the methods ``basket_charge_incl_tax`` and ``basket_charge_excl_tax`` for calculating shipping costs.
- 2. Override the default ``shipping.repository.Repository`` class and implement your domain logic
- for determining which shipping methods are returned based on the user, basket and shipping address
- passed in.
|