Skip to content

Commit 5e5da76

Browse files
authored
Merge pull request #29 from carfup/1.2021.10.8
v1.2021.10.8
2 parents c33efc2 + d4cd6b5 commit 5e5da76

File tree

5 files changed

+372
-162
lines changed

5 files changed

+372
-162
lines changed

BPFManager/AppCode/DataManager.cs

Lines changed: 69 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,19 @@ public class DataManager
2121
public CrmServiceClient service { get; set; } = null;
2222
public int recordToRetrieveEachRound = 5000;
2323
public EntityMetadata[] entitiesMetadata = null;
24+
public int majorVersion = 9;
2425

25-
public DataManager(CrmServiceClient service)
26+
public DataManager(CrmServiceClient service, int majorVersion)
2627
{
2728
this.service = service;
29+
this.majorVersion = majorVersion;
2830
}
2931

3032
public List<Entity> GetRecordsToMigrate(string fetchXmlQuery, BackgroundWorker worker = null)
3133
{
3234
List<Entity> recordToMigrate = new List<Entity>();
3335
QueryExpression query = ConvertFetchXMLtoQueryExpression(fetchXmlQuery);
36+
query.ColumnSet.AddColumn("statecode");
3437
query.NoLock = true;
3538

3639
if(query.TopCount == null)
@@ -59,15 +62,8 @@ public List<Entity> GetRecordsToMigrate(string fetchXmlQuery, BackgroundWorker w
5962

6063

6164
recordToMigrate.AddRange(ec.Entities);
62-
//foreach (var record in ec.Entities)
63-
//{
64-
// recordToMigrate.Add(record);
65-
66-
//}
6765
} while (ec.MoreRecords /*&& Cancel == false*/);
6866

69-
//var result = this.service.RetrieveMultiple(query);
70-
7167
return recordToMigrate;
7268
}
7369

@@ -178,10 +174,27 @@ public List<Entity> GetProperBPFList(string bpfSelectedEntityTarget, List<Entity
178174
public List<Entity> GetRelatedBPF(string recordEntityToMigrate)
179175
{
180176
List<Entity> workflowsToKeep = new List<Entity>();
177+
178+
ColumnSet cols = new ColumnSet("name", "uniquename", "primaryentity");
179+
FilterExpression filter = null;
180+
181+
if (majorVersion >= 9)
182+
{
183+
cols.AddColumn("uidata");
184+
filter = new FilterExpression()
185+
{
186+
Conditions =
187+
{
188+
new ConditionExpression("uidata", ConditionOperator.Like,
189+
$"%EntityLogicalName\":\"{recordEntityToMigrate}%")
190+
}
191+
};
192+
}
193+
181194
var potentialWorkdlows = service.RetrieveMultiple(new QueryExpression()
182195
{
183196
EntityName = "workflow",
184-
ColumnSet = new ColumnSet("name", "uniquename", "uidata", "primaryentity", "name"),
197+
ColumnSet = new ColumnSet("name", "uniquename", "uidata", "primaryentity"),
185198
Criteria =
186199
{
187200
Filters =
@@ -199,13 +212,7 @@ public List<Entity> GetRelatedBPF(string recordEntityToMigrate)
199212
new ConditionExpression("primaryentity", ConditionOperator.Equal, recordEntityToMigrate)
200213
}
201214
},
202-
new FilterExpression()
203-
{
204-
Conditions =
205-
{
206-
new ConditionExpression("uidata", ConditionOperator.Like, $"%EntityLogicalName\":\"{recordEntityToMigrate}%")
207-
}
208-
}
215+
filter
209216
}
210217
}
211218
}
@@ -278,10 +285,18 @@ public List<EntityDetailledName> GetEntitiesWithBPF()
278285
if (entitiesMetadata == null)
279286
RetrieveMetadataEntity();
280287

288+
ColumnSet cols = new ColumnSet( "primaryentity");
289+
FilterExpression filter = null;
290+
291+
if (majorVersion >= 9)
292+
{
293+
cols.AddColumn("uidata");
294+
}
295+
281296
var query = new QueryExpression()
282297
{
283298
EntityName = "workflow",
284-
ColumnSet = new ColumnSet("primaryentity"),
299+
ColumnSet = cols,
285300
Criteria =
286301
{
287302
Conditions =
@@ -294,14 +309,44 @@ public List<EntityDetailledName> GetEntitiesWithBPF()
294309
var result = this.service.RetrieveMultiple(query).Entities;
295310

296311
List<EntityDetailledName> edn = new List<EntityDetailledName>();
297-
foreach (var r in result.GroupBy(x => x.Attributes["primaryentity"]).Select(w => (string)w.Key))
312+
//foreach (var r in result.GroupBy(x => x.Attributes["primaryentity"]).Select(w => (string)w.Key))
313+
foreach(var r in result.ToList())
298314
{
299-
edn.Add(new EntityDetailledName()
315+
if (r.Contains("uidata"))
300316
{
301-
logicalName = r,
302-
schemaName = entitiesMetadata.FirstOrDefault(x => x.LogicalName == r)?.SchemaName,
303-
displayName = entitiesMetadata.FirstOrDefault(x => x.LogicalName == r)?.DisplayName.UserLocalizedLabel.Label
304-
});
317+
var jsonDefinition = JObject.Parse(r.GetAttributeValue<string>("uidata"));
318+
var relatedEntities =
319+
jsonDefinition.SelectTokens(
320+
$"$.BusinessProcessFlowEntities.['$values']..EntityLogicalName");
321+
322+
foreach (var entity in relatedEntities.GroupBy(x => x).Select(x => (string)x.Key))
323+
{
324+
if (edn.Any(x => x.logicalName == entity))
325+
continue;
326+
327+
edn.Add(new EntityDetailledName()
328+
{
329+
logicalName = entity,
330+
schemaName = entitiesMetadata.FirstOrDefault(x => x.LogicalName == entity)?.SchemaName,
331+
displayName = entitiesMetadata.FirstOrDefault(x => x.LogicalName == entity)?.DisplayName.UserLocalizedLabel.Label
332+
});
333+
}
334+
}
335+
else
336+
{
337+
if (edn.Any(x => x.logicalName == r.GetAttributeValue<string>("primaryentity")))
338+
continue;
339+
340+
edn.Add(new EntityDetailledName()
341+
{
342+
logicalName = r.GetAttributeValue<string>("primaryentity"),
343+
schemaName = entitiesMetadata.FirstOrDefault(x => x.LogicalName == r.GetAttributeValue<string>("primaryentity"))?.SchemaName,
344+
displayName = entitiesMetadata.FirstOrDefault(x => x.LogicalName == r.GetAttributeValue<string>("primaryentity"))?.DisplayName.UserLocalizedLabel.Label
345+
});
346+
}
347+
348+
349+
305350
}
306351

307352
return edn; //result.GroupBy(x => x.Attributes["primaryentity"]).Select(w => (string)w.Key).ToArray();
@@ -413,7 +458,7 @@ public Entity GetExistingBpfInstance(string bpfEntityName, string referencingAtt
413458
var queryUserViews = this.service.RetrieveMultiple(new QueryExpression()
414459
{
415460
EntityName = bpfEntityName,
416-
ColumnSet = new ColumnSet(false),
461+
ColumnSet = new ColumnSet("statecode"),
417462
Criteria =
418463
{
419464
Conditions =

BPFManager/BPFManager.cs

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public partial class BPFManager : PluginControlBase, IMessageBusHost, IGitHubPlu
2626
private List<Entity> entityViews = null;
2727
private List<MigrationError> migrationErrors = null;
2828
private Entity bpfSelected = null;
29+
private Entity bpfStageSelected = null;
2930
private MessageBusEventArgs callerArgs = null;
3031
private string fetchxmlQuery = null;
3132
private string recordEntityToMigrate = null;
@@ -53,7 +54,7 @@ public BPFManager()
5354

5455
public override void UpdateConnection(IOrganizationService newService, ConnectionDetail detail, string actionName, object parameter)
5556
{
56-
dm = new DataManager(detail.ServiceClient);
57+
dm = new DataManager(detail.ServiceClient, detail.OrganizationMajorVersion);
5758
IsVersionSupported(detail);
5859

5960
base.UpdateConnection(newService, detail, actionName, parameter);
@@ -104,6 +105,7 @@ private void BPFMigration_Load(object sender, EventArgs e)
104105

105106
//displaying the proper control for query
106107
radioButtonQueryView.Checked = true;
108+
rbEnabledDisabledRecordsNo.Checked = true;
107109
}
108110

109111
private void LoadSetting()
@@ -290,7 +292,7 @@ private void btnLoadBPFs_Click(object sender, EventArgs evt)
290292

291293
foreach (var record in bpfList)
292294
{
293-
cbTargetBPFList.Items.Add(record.Attributes["name"]);
295+
cbTargetBPFList.Items.Add(record.GetAttributeValue<string>("name"));
294296
}
295297

296298
cbTargetBPFList.Enabled = true;
@@ -305,7 +307,8 @@ private void cbTargetBPFList_SelectedIndexChanged(object sender, EventArgs evt)
305307
cbTargetBPFStages.Items.Clear();
306308
cbTargetBPFStages.SelectedIndex = -1;
307309
stageList = new List<Entity>();
308-
bpfSelected = bpfList.FirstOrDefault(x => x.Attributes["name"] == cbTargetBPFList.SelectedItem);
310+
bpfSelected = bpfList.FirstOrDefault(x => x.GetAttributeValue<string>("name") == cbTargetBPFList.SelectedItem.ToString());
311+
lblTargetStageEntityDiff.Visible = false;
309312

310313
WorkAsync(new WorkAsyncInfo
311314
{
@@ -331,9 +334,7 @@ private void cbTargetBPFList_SelectedIndexChanged(object sender, EventArgs evt)
331334
}
332335

333336
foreach (var stage in stageList)
334-
{
335-
cbTargetBPFStages.Items.Add(stage.Attributes["stagename"]);
336-
}
337+
cbTargetBPFStages.Items.Add($"{stage.GetAttributeValue<string>("stagename")} ({stage.GetAttributeValue<string>("primaryentitytypecode")})");
337338

338339
cbTargetBPFStages.Enabled = true;
339340

@@ -349,9 +350,20 @@ private void cbTargetBPFStages_SelectedIndexChanged(object sender, EventArgs e)
349350

350351
btnMigrateRecordBPF.Enabled = (cbTargetBPFStages.SelectedItem != null || cbTargetBPFStages.SelectedItem.ToString() != "");
351352

352-
if (recordToMigrateList != null && cbTargetBPFStages.SelectedItem != null &&
353-
cbTargetBPFList.SelectedItem != null)
354-
btnMigrateRecordBPF.Enabled = true;
353+
if (recordToMigrateList != null && cbTargetBPFStages.SelectedItem != null &&
354+
cbTargetBPFList.SelectedItem != null)
355+
{
356+
btnMigrateRecordBPF.Enabled = true;
357+
rbEnabledDisabledRecordsNo.Enabled = true;
358+
rbEnabledDisabledRecordsYes.Enabled = true;
359+
360+
string targetStage = cbTargetBPFStages.SelectedItem.ToString().Split('(')[0];
361+
targetStage = targetStage.Remove(targetStage.Length - 1);
362+
bpfStageSelected = stageList.FirstOrDefault(w => w.GetAttributeValue<string>("stagename") == targetStage);
363+
364+
lblTargetStageEntityDiff.Visible = bpfSelected.GetAttributeValue<string>("primaryentity") != bpfStageSelected.GetAttributeValue<string>("primaryentitytypecode");
365+
}
366+
355367
}
356368

357369
public bool AllowMigrateButton()
@@ -382,10 +394,7 @@ private void btnMigrateRecordBPF_Click(object sender, EventArgs evt)
382394
if (!AllowMigrateButton())
383395
return;
384396

385-
string bpfSelectedEntityTarget = bpfSelected.GetAttributeValue<string>("uniquename");
386-
var stageId = stageList.FirstOrDefault(w => w.Attributes["stagename"] == cbTargetBPFStages.SelectedItem);
387397
List<string> traversedpath = new List<string>();
388-
string targetStage = cbTargetBPFStages.SelectedItem.ToString();
389398
var totalRecordMigrated = 0;
390399
totalRecordToMigrate = recordToMigrateList.Count;
391400
migrationErrors = new List<MigrationError>();
@@ -453,10 +462,40 @@ private void btnMigrateRecordBPF_Click(object sender, EventArgs evt)
453462

454463
var bpfInstanceExist = this.dm.GetExistingBpfInstance(bpfSelectedEntityName, referencingAttributeEntityBpf, record.Id);
455464

465+
if (rbEnabledDisabledRecordsYes.Checked)
466+
{
467+
if (record.GetAttributeValue<OptionSetValue>("statecode").Value == 1) {
468+
record["statecode"] = new OptionSetValue(0);
469+
UpsertRequest activateRecordRequest = new UpsertRequest()
470+
{
471+
Target = record
472+
};
473+
474+
executeMultipleRequestSetBPF.Requests.Add(activateRecordRequest);
475+
}
476+
477+
if (bpfInstanceExist != null && bpfInstanceExist.GetAttributeValue<OptionSetValue>("statecode").Value == 1)
478+
{
479+
var bpfToUpdateActivate = new Entity(bpfSelectedEntityName);
480+
bpfToUpdateActivate.Id = bpfInstanceExist.Id;
481+
482+
bpfToUpdateActivate["statecode"] = new OptionSetValue(0);
483+
bpfToUpdateActivate["statuscode"] = new OptionSetValue(1);
484+
485+
UpsertRequest upsertRequestBPFActivation = new UpsertRequest()
486+
{
487+
Target = bpfToUpdateActivate
488+
};
489+
490+
executeMultipleRequestSetBPF.Requests.Add(upsertRequestBPFActivation);
491+
}
492+
}
493+
456494
var bpfToUpdate = new Entity(bpfSelectedEntityName);
457495
if (bpfInstanceExist != null) bpfToUpdate.Id = bpfInstanceExist.Id;
458496
bpfToUpdate[referencingAttributeEntityBpf] = record.ToEntityReference();
459-
bpfToUpdate["activestageid"] = stageId.ToEntityReference();
497+
bpfToUpdate["activestageid"] = bpfStageSelected.ToEntityReference();
498+
460499
UpsertRequest upsertRequest = new UpsertRequest()
461500
{
462501
Target = bpfToUpdate
@@ -628,9 +667,9 @@ private void comboBoxChooseEntity_SelectedIndexChanged(object sender, EventArgs
628667

629668
entityViews.AddRange(systemViews.Union(personalViews));
630669
comboBoxChooseView.Items.Add("####### System Views #######");
631-
comboBoxChooseView.Items.AddRange(systemViews.Select(x => x.Attributes["name"]).OrderBy(x => x).ToArray());
670+
comboBoxChooseView.Items.AddRange(systemViews.Select(x => x.GetAttributeValue<string>("name")).OrderBy(x => x).ToArray());
632671
comboBoxChooseView.Items.Add("####### Personal Views #######");
633-
comboBoxChooseView.Items.AddRange(personalViews.Select(x => x.Attributes["name"]).OrderBy(x => x).ToArray());
672+
comboBoxChooseView.Items.AddRange(personalViews.Select(x => x.GetAttributeValue<string>("name")).OrderBy(x => x).ToArray());
634673
this.log.LogData(EventType.Event, LogAction.BPFEntityViewsRetrieved);
635674
},
636675
ProgressChanged = e => { SetWorkingMessage(e.UserState.ToString()); }
@@ -690,7 +729,7 @@ private void comboBoxChooseView_SelectedIndexChanged(object sender, EventArgs e)
690729
return;
691730
}
692731

693-
var selectedView = entityViews.FirstOrDefault(x => x.Attributes["name"] == comboBoxChooseView.SelectedItem);
732+
var selectedView = entityViews.FirstOrDefault(x => x.GetAttributeValue<string>("name") == comboBoxChooseView.SelectedItem);
694733
fetchxmlQuery = selectedView.GetAttributeValue<string>("fetchxml");
695734

696735
btnRetrieveRecordsFetchQuery.Enabled = !String.IsNullOrEmpty(fetchxmlQuery);
@@ -741,11 +780,19 @@ private void manageEnablingOfControls(bool enabled)
741780
tsbCancel.Visible = !enabled;
742781
tssCancel.Visible = !enabled;
743782
pictureBoxPatience.Visible = !enabled;
783+
rbEnabledDisabledRecordsNo.Enabled = enabled;
784+
rbEnabledDisabledRecordsYes.Enabled = enabled;
785+
744786
}
745787

746788
private void tsbCancel_Click(object sender, EventArgs e)
747789
{
748790
CancelWorker();
749791
}
792+
793+
private void radioButton1_CheckedChanged(object sender, EventArgs e)
794+
{
795+
796+
}
750797
}
751798
}

0 commit comments

Comments
 (0)