A FulfillmentOption is used to hold information about a particular type of Fulfillment implementation. Third-party fulfillment implementations should extend this to provide their own configuration options particular to that implementation. For instance, a UPS shipping calculator might want an admin user to be able to specify which type of UPS shipping this FulfillmentOption represents.
This entity will be presented to the user to allow them to specify which shipping they want. A possible scenario is that say a site can ship with both UPS and Fedex. They will import both the Fedex and UPS third-party modules, each of which will have a unique definition of FulfillmentOption (for instance, FedexFulfillmentOption and UPSFulfillmentOption). Let's say the site can do 2-day shipping with UPS, and next-day shipping with Fedex. What they would do in the admin is create an instance of FedexFulfillmentOption entity and give it the name "Overnight" (along with any needed Fedex configuration properties), then create an instance of UPSFulfillmentOption and give it the name "2 Day". When the user goes to check out, they will then see a list with "Overnight" and "2 day" in it. A FulfillmentPricingProvider can then be used to estimate the fulfillment cost (and calculate the fulfillment cost) for that particular option.
FulfillmentOptions are also inherently related to FulfillmentProcessors, in that specific types of FulfillmentOption implementations should also have a FulfillmentPricingProvider that can handle operations (estimation and calculation) for pricing a FulfillmentGroup. Typical third-party implementations of this paradigm would have a 1 FulfillmentOption entity implementation and 1 FulfillmentPricingProvider implementation for that particular service.
Note: even though the default Broadleaf implementation of this is non-abstract ( {@link FulfillmentOptionImpl}), it is very rare that you would actually want to instantiate a raw {@link FulfillmentOptionImpl} rather than usinga subclass of this.
@author Phillip Verheyden
@see {@link FulfillmentPricingProvider}, {@link FulfillmentGroup}