Outcomes
Outcome definitions are managed by the Sitecore.Marketing.Definitions.Outcomes.OutcomeDefinitionManager
class.
Outcomes are specialized events. IOutcomeDefinition
inherits IEventDefinition
.
Accessing the OutcomeDefinitionManager
The OutcomeDefinitionManager
is available from the Sitecore DI container. It is preferable to include a parameter of type DefinitionManagerBase<IOutcomeDefinition, OutcomeDefinitionRecord>
in the constructor of your class and pull your class from the container, allowing the container to resolve the instance for you:
public MyClass(DefinitionManagerBase<IOutcomeDefinition, OutcomeDefinitionRecord> outcomeDefinitionManager)
{
...
}
If you cannot use the container to construct your class, you can use the service locator. This class is also available in the Sitecore DI container:
using Sitecore.DependencyInjection;
using Sitecore.Marketing.Definitions;
ServiceLocator.ServiceProvider.GetDefinitionManagerFactory().GetDefinitionManager<IOutcomeDefinition>();
Defining a outcome
A outcome is defined using types from the Sitecore.Marketing.Definitions.Outcomes.Model
namespace.
Guid outcomeId = Guid.NewGuid(); // Outcome ID
CultureInfo outcomeCulture = new CultureInfo("es"); // Outcome culture
string outcomeName = "Newly created outcome"; // Outcome name
DateTime creationDate = DateTime.UtcNow; // Outcome creation date
string createdBy = "sitecore\admin"; // Outcome creator
OutcomeDefinition outcome = new OutcomeDefinition(outcomeId, "Outcome item name", outcomeCulture, outcomeName, creationDate, createdBy);
outcome.IsMonetaryValueApplicable = true;
IsMonetaryValueApplicable
is used in reporting. It is valid to have an outcome with no meaningful monetary value, such as a contract signed or commitment made. In these instances, set IsMonetaryValueApplicable
to false.
AdditionalRegistrationsAreIgnored
was used by the OutcomeManager
and is no longer in use. Please remove this property from your code.
Live events
The IsLiveEvent
property is part of the base EventDefinition
class and is used by Marketing Automation to determine if an event should be processed immediately rather than on session end. Read more about live event processing.
Saving a outcome
Once you have defined a outcome you may save it by calling the SaveAsync()
method on the definition manager.
Guid outcomeId = Guid.NewGuid(); // Outcome ID
CultureInfo outcomeCulture = new CultureInfo("es"); // Outcome culture
string outcomeName = "Newly created outcome"; // Outcome name
DateTime creationDate = DateTime.UtcNow; // Outcome creation date
string createdBy = "sitecore\admin"; // Outcome creator
OutcomeDefinition outcome = new OutcomeDefinition(outcomeId, "Outcome item name", outcomeCulture, outcomeName, creationDate, createdBy);
outcome.IsMonetaryValueApplicable = true;
OutcomeDefinitionManager manager = ServiceLocator.ServiceProvider.GetDefinitionManagerFactory().GetDefinitionManager<IOutcomeDefinition>();
manager.SaveAsync(outcome);
You can also optionally activate the outcome during save by passing true
to the second parameter of the SaveAsync()
method:
manager.SaveAsync(outcome, true);
Activating a outcome
Outcomes must be activated before they are available for use outside of management. Outcomes can be activated when they’re saved by passing true
to the activate
(second) parameter of the SaveAsync()
method:
manager.SaveAsync(outcome, true);
Outcomes can also be activated without calling save, using the ActivateAsync()
method:
manager.ActivateAsync(outcomeId);
The ActivateAsync()
method takes the ID of the outcome and does not require the outcome definition model.
Deleting a outcome
To delete a outcome, use the Delete()
method on the manager. Individual cultures cannot be deleted from the definition, only the entire definition. The culture provided to the method call should be either null (default value) or CultureInfo.InvariantCulture
.
manager.Delete(outcomeId);
Retrieve a outcome
A single outcome can be retrieved by its ID using one of the Get()
methods on the manager.
Guid outcomeId = Guid.NewGuid(); // Ensure this is the ID of an existing outcome
// Get by ID and culture. Will get the latest active version
IOutcomeDefinition outcome = manager.Get(outcomeId, new CultureInfo("da"));
// Get by ID and culture. Will get the latest version, including if the version is inactive
IOutcomeDefinition outcome = manager.Get(outcomeId, new CultureInfo("da"), true);
Retrieve an outcome by its alias
You can also retrieve an outcome by its alias:
CultureInfo outcomeCulture = new CultureInfo("fr-fr");
var outcomeDefinitionByAlias = definitionManager.GetByAlias("My alias", outcomeCulture);
Update an existing outcome
To update an existing outcome definition, retrieve the outcome by ID, edit the outcome
Guid outcomeId = Guid.NewGuid(); // Ensure this is the ID of an existing outcome
// Get by ID and culture. Will get the latest active version
IOutcomeDefinition outcome = manager.Get(outcomeId, new CultureInfo("da"));
// Make updates to outcome
outcome.Name = "Updated name";
// Save to update
manager.SaveAsync(outcome);
Retrieving all outcomes
The GetAll()
method can be used to get all outcomes from the manager. As there may be a large number of definitions, this method supports paging. The return value is a single page of results.
// Get All with defaults which will be first page, page size 20, latest active versions only
ResultSet<DefinitionResult<IOutcomeDefinition>> outcomes = manager.GetAll(new CultureInfo("da"), new RetrievalParameters<IOutcomeDefinition, string>());
// Get page 2
ResultSet<DefinitionResult<IOutcomeDefinition>> page2Outcomes = manager.GetAll(new CultureInfo("da"), new RetrievalParameters<IOutcomeDefinition, string>(pageNumber: 2));
// Include inactive versions
ResultSet<DefinitionResult<IOutcomeDefinition>> page1Outcomes = manager.GetAll(new CultureInfo("da"), new RetrievalParameters<IOutcomeDefinition, string>(), true);
To access the results, use the DataPage
property of the result.
IOutcomeDefinition outcome = page1Outcomes.DataPage.ElementAt(0);
The result also includes properties to expose the total number of definitions and the current page index and page size.
long totalDefinitionCount = page1Outcomes.Total;
int pageNumber = page1Outcomes.PageNumber;
int pageSize = page1Outcomes.Count;