I only have 1 Business Rule in the application and I deactivated it. I only have a JavaScript file to open a new Extra Cost record as a centered dialog and a JavaScript file to add icons in a grid.
Here's a code snippet of the Update TraineeBudget Record:
public class UpdateTraineeBudgets : IPlugin
{
private static IOrganizationService _service;
private IOrganizationServiceFactory _serviceFactory;
private IPluginExecutionContext _context;
public void Execute(IServiceProvider serviceProvider)
{
_context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
if (_context.Depth > 1)
{
return;
}
_serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
_service = _serviceFactory.CreateOrganizationService(_context.UserId);
if (_context.MessageName == "Update")
{
UpdateBudgets();
}
}
private void UpdateBudgets()
{
{
var targetEntity = _context.InputParameters["Target"] as Entity;
var preUpdate = EntityMapper.Map(_context.PreEntityImages["cref8_jaarlijkbudget"]);
var budget = EntityMapper.Map(_service.Retrieve(targetEntity.LogicalName, targetEntity.Id, new ColumnSet("cref8_jaarlijkbudgetid","cref8_overigebudget","cref8_overigedagen","cref8_startbudget","cref8_startdagen")));
var budgetToSave = new Entity("cref8_jaarlijkbudget");
budgetToSave["cref8_jaarlijkbudgetid"] = budget.Id;
if (budget.StartDays != 0)
{
double? newDays = budget.StartDays - (preUpdate.StartDays - budget.RemainingDays);
budgetToSave["cref8_overigedagen"] = newDays;
}
if (budget.StartBudget != 0)
{
double? newBudget = budget.StartBudget - (preUpdate.StartBudget - budget.RemainingBudget);
budgetToSave["cref8_overigebudget"] = newBudget;
}
_service.Update(budgetToSave);
}
}
}
Here's a code snippet of the Update TrainingCost:
public class UpdateTrainingCost : IPlugin
{
private static IOrganizationService _service;
private IOrganizationServiceFactory _serviceFactory;
private IPluginExecutionContext _context;
public void Execute(IServiceProvider serviceProvider)
{
_context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
if (_context.Depth > 1)
{
return;
}
_serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
_service = _serviceFactory.CreateOrganizationService(_context.UserId);
if (_context.MessageName == "Update")
{
UpdateBudgets();
}
}
private void UpdateBudgets()
{
var targetEntity = _context.InputParameters["Target"] as Entity;
var preUpdate = EntityMapper.Map(_context.PreEntityImages["cref8_opleiding"]);
var training = EntityMapper.Map(_service.Retrieve(targetEntity.LogicalName, targetEntity.Id, new ColumnSet("cref8_jaarstartopleiding", "cref8_opleidingid", "cref8_prijs")));
var cursists = GetCursists("cref8_cursist", "cref8_opleiding_cref8_cursist", "cref8_cursistid", "cref8_opleidingid", training.Id);
foreach (var cursist in cursists)
{
var traineeBudget = GetTraineeBudget(cursist, training);
double nieuwBudget = traineeBudget.RemainingBudget preUpdate.Price - training.Price;
Entity budget = new Entity("cref8_jaarlijkbudget");
budget["cref8_jaarlijkbudgetid"] = traineeBudget.Id;
budget["cref8_overigebudget"] = nieuwBudget;
_service.Update(budget);
}
}
private static TraineeBudget GetTraineeBudget(Cursist cursist, Training training)
{
ConditionExpression ceYearlyBudgetFromTrainee = new ConditionExpression("cref8_cursist", ConditionOperator.Equal, cursist.Id);
ConditionExpression ceYearlyBudgetYear = new ConditionExpression("cref8_jaar", ConditionOperator.Equal, (int)training.Year);
FilterExpression filter = new FilterExpression();
filter.Conditions.Add(ceYearlyBudgetFromTrainee);
filter.Conditions.Add(ceYearlyBudgetYear);
QueryExpression qeYearlyBudget = new QueryExpression("cref8_jaarlijkbudget");
qeYearlyBudget.ColumnSet = new ColumnSet("cref8_jaarlijkbudgetid", "cref8_overigebudget");
qeYearlyBudget.Criteria.AddFilter(filter);
EntityCollection yearlyBudgetResult = _service.RetrieveMultiple(qeYearlyBudget);
return EntityMapper.Map(yearlyBudgetResult.Entities.First());
}
private static List GetCursists(string entityName, string linkToEntityName, string linkAttributeName, string attributeName, Guid id)
{
var query = new QueryExpression()
{
EntityName = entityName,
ColumnSet = new ColumnSet("cref8_cursistid", "cref8_fullname"),
};
var link = query.AddLink(linkToEntityName, linkAttributeName, linkAttributeName);
link.LinkCriteria = new FilterExpression()
{
Conditions =
{
new ConditionExpression(attributeName, ConditionOperator.Equal, id)
}
};
return _service.RetrieveMultiple(query).Entities.Select(e => EntityMapper.Map(e)).ToList();
}
}