Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
 E.TList<C.GroupAccount> targetgroupAccount = new E.TList<GroupAccount>();

 foreach (var bri in CurrentWorkflow.ValidateBRIs.ClaimedBusinessRequestItems)
 {
     var ac = C.Account.GetByAccountGUID(bri.RequestDataAssigneeID.Value);
     var gr = C.Group.GetByGroupGUID(bri.RequestDataTargetResourceID.Value);
     var ga = new C.GroupAccount() { AccountID = ac.AccountID, GroupID = gr.GroupID };
     targetgroupAccount.Add(ga);
 }

...

SetOperationInputs_ExecuteCode.cs

Code Block
languagec#
 // Initialize a list to hold target group accounts that need to be added.
 E.TList<C.GroupAccount> targetGroupAccounts = new E.TList<GroupAccount>();

 // Extract distinct Assignee GUIDs from the claimed business request items.
 var acGuids = CurrentWorkflow.ValidateBRIs.ClaimedBusinessRequestItems
     .Select(bri => bri.RequestDataAssigneeID)      // Select the Assignee IDs
     .Where(guid => guid.HasValue)                  // Ensure the GUID is not null
     .Select(guid => guid.Value)                    // Extract the GUID value
     .Distinct()                                     // Remove duplicates
     .ToList();                                      // Convert to a list

 // Extract distinct Target Resource GUIDs from the claimed business request items.
 var grGuids = CurrentWorkflow.ValidateBRIs.ClaimedBusinessRequestItems
     .Select(bri => bri.RequestDataTargetResourceID) // Select the Target Resource IDs
     .Where(guid => guid.HasValue)                    // Ensure the GUID is not null
     .Select(guid => guid.Value)                      // Extract the GUID value
     .Distinct()                                       // Remove duplicates
     .ToList();                                        // Convert to a list

 // Retrieve Account objects based on the extracted Assignee GUIDs.
 var targetAccounts = C.Account.GetByAccountGuids(acGuids);

 // Create a dictionary for quick lookup of Account objects by their GUID.
 Dictionary<Guid, C.Account> accountDictionary = targetAccounts
     .ToList()
     .ToDictionary(a => a.AccountGUID, a => a);

 // Retrieve Group objects based on the extracted Target Resource GUIDs.
 var targetGroups = C.Group.GetByGroupGUIDs(grGuids);

 // Create a dictionary for quick lookup of Group objects by their GUID.
 Dictionary<Guid, C.Group> groupDictionary = targetGroups
     .ToList()
     .ToDictionary(a => a.GroupGUID, a => a);

 // Retrieve existing GroupAccount associations based on the current business request items.
 var existingGroupAccount = C.GroupAccount.GetByBusinessRequestItemList(
     CurrentWorkflow.ValidateBRIs.ClaimedBusinessRequestItems.ToXml().ToString()
 );

 // Initialize a dictionary to map a composite key to its corresponding BusinessRequestItem.
 CurrentWorkflow.BriGroupAccountDictionary = new Dictionary<string, C.BusinessRequestItem>();

 // Iterate through each claimed business request item to process group-account associations.
 foreach (var bri in CurrentWorkflow.ValidateBRIs.ClaimedBusinessRequestItems)
 {
     // Create a unique key combining Assignee ID and Target Resource ID.
     var key = string.Format("{0}_{1}", bri.RequestDataAssigneeID.Value, bri.RequestDataTargetResourceID.Value);

     // Map the unique key to the current BusinessRequestItem.
     CurrentWorkflow.BriGroupAccountDictionary[key] = bri;

     // Retrieve the AccountID using the Assignee GUID from the account dictionary.
     int acID = accountDictionary[bri.RequestDataAssigneeID.Value].AccountID;

     // Retrieve the GroupID using the Target Resource GUID from the group dictionary.
     int grID = groupDictionary[bri.RequestDataTargetResourceID.Value].GroupID;

     // Create a new GroupAccount instance with the retrieved AccountID and GroupID.
     var ga = new C.GroupAccount()
     {
         AccountID = acID,
         GroupID = grID
     };

     // Check if the GroupAccount already exists to avoid duplicates.
     bool groupAccountExists = existingGroupAccount
         .Any(a => a.AccountID == acID && a.GroupID == grID);

     if (groupAccountExists)
     {
         // If the GroupAccount exists, update the BusinessRequestItem's process status to indicate duplication.
         bri.ProcessStatus = 4; // TODO: Replace magic number with an enum for better readability.
     }
     else
     {
         // If the GroupAccount does not exist, add it to the list of target group accounts to be added.
         targetGroupAccounts.Add(ga);
     }
 }

 // Assign the list of new GroupAccounts to the workflow's AddAccountToGroup target.
 CurrentWorkflow.AddAccountToGroup.TargetGroupAccounts = targetGroupAccounts;

 // Initialize a dictionary to map Target Resource GUIDs to their corresponding BusinessRequestItems.
 CurrentWorkflow.BusinessRequestItemDictionary = new Dictionary<Guid, BusinessRequestItem>();

 // Populate the BusinessRequestItemDictionary with entries from the claimed business request items.
 foreach (var bri in CurrentWorkflow.ValidateBRIs.ClaimedBusinessRequestItems)
 {
     // Map the Target Resource GUID to the corresponding BusinessRequestItem.
     // Note: This assumes that each Target Resource GUID is unique. If not, consider using a list.
     CurrentWorkflow.BusinessRequestItemDictionary[bri.RequestDataTargetResourceID.Value] = bri;
 }

SetOperationInputs_ExecuteCode.cs

Code Block
 // TODO: Implementation goes here!
 // Initialize a list to hold the results of operation executions.
 List<Framework.Common.Shared.Workflow.OperationExecutionSummary> oplist = new List<Framework.Common.Shared.Workflow.OperationExecutionSummary>();

 // TODO: Assign the operation execution results from the current workflow's AddToGroupOperation.
 // Example:
 // oplist = CurrentWorkflow.AddToGroupOperation.OperationExecutionResults;

 // Iterate through each operation execution summary in the operation list.
 foreach (Framework.Common.Shared.Workflow.OperationExecutionSummary op in oplist)
 {
     // NOTE: To retrieve a new Business Request, a new dictionary is needed.
     // The following line is commented out as it's not currently in use.
     // var bri = CurrentWorkflow.BusinessRequestItemDictionary[op.TargetResourceGUID];

     // Create a unique key by combining the LeftResourceGUID and RightResourceGUID.
     string key = string.Format("{0},{1}", op.LeftResourceGUID, op.RightResourceGUID);

     // Retrieve the corresponding BusinessRequestItem from the BriGroupAccountDictionary using the generated key.
     C.BusinessRequestItem bri = CurrentWorkflow.BriGroupAccountDictionary[key];

     // Update the process status of the BusinessRequestItem to '2' indicating it is being processed.
     bri.ProcessStatus = 2;

     // Check if the operation was executed successfully.
     if (op.OperationExecuted)
     {
         // If the operation succeeded, set the fulfillment status to '3' indicating success.
         bri.BusinessRequestItemFulfillmentStatusID = 3; // Success
     }
     else
     {
         // If the operation failed, set the fulfillment status to '4' indicating failure.
         bri.BusinessRequestItemFulfillmentStatusID = 4; // Fail

         // Update the process status to '3' indicating an error occurred during processing.
         bri.ProcessStatus = 3;

         // Increment the failed attempt count for this BusinessRequestItem.
         bri.FailedCount += 1;

         // Record the timestamp of the last failure.
         bri.LastFailed = DateTime.UtcNow;

         // Schedule the next attempt based on the number of failed attempts (exponential backoff).
         bri.NextAttempt = DateTime.UtcNow.AddMinutes(10 * bri.FailedCount * bri.FailedCount);

         // Store the error message returned from the operation execution.
         bri.LastFailedError = op.ExecutionResultMessage;
     }
 }

 // Create a list of all BusinessRequestItems from the BriGroupAccountDictionary.
 var bris = new E.TList<C.BusinessRequestItem>(
     CurrentWorkflow.BriGroupAccountDictionary.Select(a => a.Value).ToList()
 );

 // Persist the updated BusinessRequestItems to the database.
 BusinessRequestItem.Update(bris);