public static string GetIES(this KAction action) { string label = null; // Amélioration if (action.Reduced != null) { // Amélioration I/E/S if (ActionsTimingsMoveManagement.IsActionInternal(action)) { label = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Reduced_Internal"); } else if (ActionsTimingsMoveManagement.IsActionExternal(action)) { label = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Reduced_External"); } else if (ActionsTimingsMoveManagement.IsActionDeleted(action)) { label = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Reduced_Deleted"); } else { throw new ArgumentOutOfRangeException(); } } return(label); }
/// <summary> /// Exporte les actions spécifiées. /// </summary> /// <param name="actions">Les actions.</param> /// <param name="cellReference">La référence de la cellule.</param> /// <param name="sheet">La feuille.</param> private void ExportActions(ICollection <KAction> actions, WorksheetPart sheet, ref CellReference cellReference) { var timeFormatService = IoC.Resolve <IServiceBus>().Get <ITimeTicksFormatService>(); var timeScale = _data.Project.TimeScale; #region Format pour les actions // Actions var actionsFormats = new List <ColumnFormat>() { // Thumbnail new ColumnFormat() { Header = string.Empty }, // Label new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Task") }, // Start new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Start") }, // Duration new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Duration") }, // Finish new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Finish") }, // BuildStart new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_BuildStart") }, // BuildDuration new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_BuildDuration") }, // BuildFinish new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_BuildFinish") }, // WBS new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_WBS") }, // Category new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Category") }, // Resource new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Resource") }, // Video new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Video") }, // Predecessors new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Predecessors") }, // Original new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Original") }, }; // Ref1 if (_referentialsUse[ProcessReferentialIdentifier.Ref1].IsEnabled) { actionsFormats.Add(new ColumnFormat() { Header = IoC.Resolve <IReferentialsUseService>().GetLabel(ProcessReferentialIdentifier.Ref1) }); } // Ref2 if (_referentialsUse[ProcessReferentialIdentifier.Ref2].IsEnabled) { actionsFormats.Add(new ColumnFormat() { Header = IoC.Resolve <IReferentialsUseService>().GetLabel(ProcessReferentialIdentifier.Ref2) }); } // Ref3 if (_referentialsUse[ProcessReferentialIdentifier.Ref3].IsEnabled) { actionsFormats.Add(new ColumnFormat() { Header = IoC.Resolve <IReferentialsUseService>().GetLabel(ProcessReferentialIdentifier.Ref3) }); } // Ref4 if (_referentialsUse[ProcessReferentialIdentifier.Ref4].IsEnabled) { actionsFormats.Add(new ColumnFormat() { Header = IoC.Resolve <IReferentialsUseService>().GetLabel(ProcessReferentialIdentifier.Ref4) }); } // Ref5 if (_referentialsUse[ProcessReferentialIdentifier.Ref5].IsEnabled) { actionsFormats.Add(new ColumnFormat() { Header = IoC.Resolve <IReferentialsUseService>().GetLabel(ProcessReferentialIdentifier.Ref5) }); } // Ref6 if (_referentialsUse[ProcessReferentialIdentifier.Ref6].IsEnabled) { actionsFormats.Add(new ColumnFormat() { Header = IoC.Resolve <IReferentialsUseService>().GetLabel(ProcessReferentialIdentifier.Ref6) }); } // Ref7 if (_referentialsUse[ProcessReferentialIdentifier.Ref7].IsEnabled) { actionsFormats.Add(new ColumnFormat() { Header = IoC.Resolve <IReferentialsUseService>().GetLabel(ProcessReferentialIdentifier.Ref7) }); } // IsRandom actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_IsRandom") }); // Custom Text actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_CustomValue_Text1") }); actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_CustomValue_Text2") }); actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_CustomValue_Text3") }); actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_CustomValue_Text4") }); // Custom Numeric actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_CustomValue_Numeric1") }); actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_CustomValue_Numeric2") }); actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_CustomValue_Numeric3") }); actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_CustomValue_Numeric4") }); // DifferenceReason actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_DifferenceReason") }); // Amélioration I/E/S actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Reduced_IES") }); // Solution actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Reduced_Solution") }); // Reduction ratio actionsFormats.Add(new ColumnFormat() { Header = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Reduced_ReductionRatio") }); #endregion CellContent[][] data = new CellContent[actions.Count][]; uint tableRowIndex = cellReference.RowIndex; int i = 0; foreach (var action in actions) { CellContent[] row = new CellContent[actionsFormats.Count]; // Mettre à jour IsGroup action.IsGroup = WBSHelper.HasChildren(action, actions); int j = 0; #region Data pour les actions // Thumbnail j++; // Label row[j++] = action.Label; if (!action.IsGroup) { // Start row[j++] = CellContent.TimeSpan(timeFormatService.RoundTime(action.Start, timeScale)); // Duration row[j++] = CellContent.TimeSpan(timeFormatService.RoundTime(action.Duration, timeScale)); // Finish row[j++] = CellContent.TimeSpan(timeFormatService.RoundTime(action.Finish, timeScale)); } else { j += 3; // Nombre de colonnes précédentes } // BuildStart row[j++] = CellContent.TimeSpan(timeFormatService.RoundTime(action.BuildStart, timeScale)); // BuildDuration row[j++] = CellContent.TimeSpan(timeFormatService.RoundTime(action.BuildDuration, timeScale)); // BuildFinish row[j++] = CellContent.TimeSpan(timeFormatService.RoundTime(action.BuildFinish, timeScale)); // WBS row[j++] = action.WBS; if (!action.IsGroup) { // Category if (action.Category != null) { row[j++] = action.Category.Label; } else { row[j++] = null; } // Resource if (action.Resource != null) { row[j++] = action.Resource.Label; } else { row[j++] = null; } // Video if (action.Video != null) { row[j++] = action.Video.Filename; } else { row[j++] = null; } // Predecessors row[j++] = FormatPredecessorsString(action); // Original if (action.Original != null) { row[j++] = action.Original.Label; } else { row[j++] = null; } // Ref1 if (_referentialsUse[ProcessReferentialIdentifier.Ref1].IsEnabled) { row[j++] = GetMultiReferentialLabels(action.Ref1, ProcessReferentialIdentifier.Ref1); } // Ref2 if (_referentialsUse[ProcessReferentialIdentifier.Ref2].IsEnabled) { row[j++] = GetMultiReferentialLabels(action.Ref2, ProcessReferentialIdentifier.Ref2); } // Ref3 if (_referentialsUse[ProcessReferentialIdentifier.Ref3].IsEnabled) { row[j++] = GetMultiReferentialLabels(action.Ref3, ProcessReferentialIdentifier.Ref3); } // Ref4 if (_referentialsUse[ProcessReferentialIdentifier.Ref4].IsEnabled) { row[j++] = GetMultiReferentialLabels(action.Ref4, ProcessReferentialIdentifier.Ref4); } // Ref5 if (_referentialsUse[ProcessReferentialIdentifier.Ref5].IsEnabled) { row[j++] = GetMultiReferentialLabels(action.Ref5, ProcessReferentialIdentifier.Ref5); } // Ref6 if (_referentialsUse[ProcessReferentialIdentifier.Ref6].IsEnabled) { row[j++] = GetMultiReferentialLabels(action.Ref6, ProcessReferentialIdentifier.Ref6); } // Ref7 if (_referentialsUse[ProcessReferentialIdentifier.Ref7].IsEnabled) { row[j++] = GetMultiReferentialLabels(action.Ref7, ProcessReferentialIdentifier.Ref7); } // IsRandom row[j++] = action.IsRandom.ToString(); // Custom Text row[j++] = action.CustomTextValue; row[j++] = action.CustomTextValue2; row[j++] = action.CustomTextValue3; row[j++] = action.CustomTextValue4; // Custom Numeric row[j++] = action.CustomNumericValue; row[j++] = action.CustomNumericValue2; row[j++] = action.CustomNumericValue3; row[j++] = action.CustomNumericValue4; // DifferenceReason row[j++] = action.DifferenceReason; // Amélioration if (action.Reduced != null) { // Amélioration I/E/S string label; if (ActionsTimingsMoveManagement.IsActionInternal(action)) { label = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Reduced_Internal"); } else if (ActionsTimingsMoveManagement.IsActionExternal(action)) { label = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Reduced_External"); } else if (ActionsTimingsMoveManagement.IsActionDeleted(action)) { label = LocalizationManager.GetString("ViewModel_AnalyzeRestitution_Export_Action_Reduced_Deleted"); } else { throw new ArgumentOutOfRangeException(); } row[j++] = label; row[j++] = action.Reduced.Solution; row[j++] = CellContent.Percentage(action.Reduced.ReductionRatio); } else { row[j++] = null; row[j++] = null; row[j++] = null; } } #endregion data[i] = row; i++; } _file.AddTable(sheet, actionsFormats.ToArray(), data, cellReference); // Ajouter une image cellReference.NewLine(); i = 0; foreach (var action in actions) { if (action.Thumbnail != null) { // Ajout du libellé du lien var tableCellRef = new CellReference(1, tableRowIndex + (uint)i + 1); _file.SetCellValue(sheet, tableCellRef, new CellContent(action.ActionId.ToString(), CellDataType.Hyperlink)); // Ajout du lien string definedName = string.Format("Action.{0}", action.ActionId); _file.CreateDefinedName(sheet, cellReference, definedName); _file.AddHyperlinkToDefinedName(sheet, tableCellRef, definedName, ""); // Ajout du libellé _file.SetCellValue(sheet, cellReference, string.Format("{0} {1}", action.WBS, action.Label ?? string.Empty)); cellReference.MoveRight(); // Ajout de l'image using (var ms = new System.IO.MemoryStream(action.Thumbnail.Data)) { var decoder = System.Windows.Media.Imaging.BitmapDecoder.Create(ms, System.Windows.Media.Imaging.BitmapCreateOptions.PreservePixelFormat, System.Windows.Media.Imaging.BitmapCacheOption.OnLoad); var size = new System.Windows.Size(decoder.Frames[0].PixelWidth, decoder.Frames[0].PixelHeight); var mimeTypes = decoder.CodecInfo.MimeTypes; ImagePartType imageType; if (mimeTypes.Contains("image/jpeg")) { imageType = ImagePartType.Jpeg; } else if (mimeTypes.Contains("image/bmp")) { imageType = ImagePartType.Bmp; } else if (mimeTypes.Contains("image/png")) { imageType = ImagePartType.Png; } else { continue; } string pictureName = string.Format("Thumbnail.{0}", action.ActionId); uint rowsLength = _file.AddImage(sheet, action.Thumbnail.Data, imageType, action.ActionId.ToString(), pictureName, size, cellReference); // On déplace la cellule active à après l'image cellReference = new CellReference(1, cellReference.RowIndex + rowsLength); } } i++; } }
/// <summary> /// Filtre les actions et met à jour leurs prédécesseurs et succésseurs managés. /// </summary> /// <param name="allActions">Toutes les actions.</param> /// <param name="excludedActionsFilter">Le filtre excluant les actions.</param> /// <param name="includedActionsPredSuccFilter">Le filtre incluant les actions prédécesseurs et succ.</param> /// <returns>Les actions filtrées.</returns> private ActionsDisplayResults FilterActionsUpdatePredSuccManaged(IEnumerable <KAction> allActions, Func <KAction, bool> excludedActionsFilter, Func <KAction, bool> includedActionsPredSuccFilter) { var results = new ActionsDisplayResults(); var newTimings = new List <ActionTiming>(); var actionsSorted = allActions .OrderBy(a => a.WBSParts, new WBSHelper.WBSComparer()) .ToArray(); #if DEBUG foreach (var action in allActions) { // S'assurer qu'une action soit un seul de : I/E/S/Group var isI = ActionsTimingsMoveManagement.IsActionInternal(action); var isE = ActionsTimingsMoveManagement.IsActionExternal(action); var isS = ActionsTimingsMoveManagement.IsActionDeleted(action); var isG = action.IsGroup; if (!(isI | isE | isS | isG)) { throw new InvalidOperationException("Impossible qu'une action soit à la fois I ou E ou S ou G"); } } #endif var actionsFinal = new List <KAction>(); foreach (var action in actionsSorted) { action.PredecessorsManaged.Clear(); action.SuccessorsManaged.Clear(); } foreach (var action in actionsSorted) { if (excludedActionsFilter(action)) { // Déplacer tous les pred vers ses succ ActionsTimingsMoveManagement.MapAllPredToSucc(action, includedActionsPredSuccFilter, newTimings, true); } else if (!action.IsGroup) { foreach (var pred in action.Predecessors) { if (includedActionsPredSuccFilter(pred)) { pred.SuccessorsManaged.Add(action); action.PredecessorsManaged.Add(pred); } } actionsFinal.Add(action); } else { System.Diagnostics.Debug.Assert(action.IsGroup); actionsFinal.Add(action); } } // Supprimer les liens pour les actions non présentes dans la collection foreach (var action in actionsFinal) { foreach (var pred in action.PredecessorsManaged.ToArray()) { if (!actionsFinal.Contains(pred)) { action.PredecessorsManaged.Remove(pred); pred.SuccessorsManaged.Remove(action); } } foreach (var succ in action.SuccessorsManaged.ToArray()) { if (!actionsFinal.Contains(succ)) { action.SuccessorsManaged.Remove(succ); succ.PredecessorsManaged.Remove(action); } } } // Il faut automatiquement supprimer les groupes qui ne contiennent plus d'enfants // Les groupes n'ayant ni précédesseurs ni successeurs, on peut les supprimer sans réel impact var copy = actionsFinal.ToArray(); foreach (var action in copy) { if (action.IsGroup && !WBSHelper.HasChildren(action, copy)) { actionsFinal.Remove(action); } } results.Actions = actionsFinal; results.NewTimings = newTimings; return(results); }
/// <summary> /// Enregistre des actions déjà existantes et construit les éléments. /// </summary> /// <param name="allActions">Toutes les actions.</param> /// <param name="filter">Les filtre I/E/S.</param> public void RegisterInitialActions(IEnumerable <KAction> allActions, IESFilterValue filter) { Func <ActionsDisplayResults> displayedActions; bool isCriticalPathEnabled; bool useManagedPredSucc; bool useGanttItemsTimingsOnly; bool fixPredSuccTimings; bool refreshTimings; foreach (var action in allActions) { action.IsGroup = WBSHelper.HasChildren(action, allActions); action.IsLinkToProcess = action.LinkedProcessId != null; } switch (filter) { case IESFilterValue.IES: useManagedPredSucc = false; isCriticalPathEnabled = true; displayedActions = () => new ActionsDisplayResults { Actions = allActions }; useGanttItemsTimingsOnly = false; fixPredSuccTimings = true; refreshTimings = true; break; case IESFilterValue.I: useManagedPredSucc = true; isCriticalPathEnabled = true; displayedActions = () => FilterActionsUpdatePredSuccManaged(allActions, a => ActionsTimingsMoveManagement.IsActionExternal(a) || ActionsTimingsMoveManagement.IsActionDeleted(a), a => ActionsTimingsMoveManagement.IsActionInternal(a)); useGanttItemsTimingsOnly = true; fixPredSuccTimings = true; refreshTimings = false; break; case IESFilterValue.IE: useManagedPredSucc = true; isCriticalPathEnabled = false; displayedActions = () => FilterActionsUpdatePredSuccManaged(allActions, a => ActionsTimingsMoveManagement.IsActionDeleted(a), a => ActionsTimingsMoveManagement.IsActionExternal(a) || ActionsTimingsMoveManagement.IsActionInternal(a)); useGanttItemsTimingsOnly = true; fixPredSuccTimings = true; refreshTimings = false; break; default: throw new ArgumentOutOfRangeException("filter"); } _useGanttItemsTimingsOnly = useGanttItemsTimingsOnly; this.IsCriticalPathEnabled = isCriticalPathEnabled; var results = displayedActions(); this.UseManagedPredecessorsSuccessors = useManagedPredSucc; if (filter == IESFilterValue.IES && useManagedPredSucc) { ActionsTimingsMoveManagement.DebugCheckAllWBS(results.Actions); } this.RegisterInitialActionsImpl(results.Actions); if (results.NewTimings != null) { foreach (var timing in results.NewTimings) { SetBuildStart(timing.Action, timing.Start); SetBuildFinish(timing.Action, timing.Finish); } } if (refreshTimings) { foreach (var item in this.ItemsOfTypeAction) { _updatingitem = item; item.Start = GanttDates.ToDateTime(item.Action.BuildStart); item.Finish = GanttDates.ToDateTime(item.Action.BuildFinish); _updatingitem = null; } } if (fixPredSuccTimings) { this.FixPredecessorsSuccessorsTimings(); this.UpdateResourcesLoad(); } }
public void TestsIsActionInternalExternalDeletedMutuallyExclusive() { SampleData.ClearDatabaseThenImportDefaultProject(); // Vérifie dans toutes les actions de la BDD si les actions sont soi I, E ou S et jamais aucun des trois ou plus d'un des 3 à la fois. var prepareService = new PrepareService(); var analyzeService = new AnalyzeService(); var mre = new System.Threading.ManualResetEvent(false); ProjectsData pData = null; Exception exception = null; prepareService.GetProjects(d => { pData = d; mre.Set(); }, ex => { exception = ex; mre.Set(); }); mre.WaitOne(); AssertExt.IsExceptionNull(exception); foreach (var project in pData.Projects) { mre.Reset(); RestitutionData rData = null; analyzeService.GetFullProjectDetails(project.ProjectId, d => { rData = d; mre.Set(); }, ex => { exception = ex; mre.Set(); }); mre.WaitOne(); AssertExt.IsExceptionNull(exception); foreach (var scenario in rData.Scenarios) { foreach (var action in scenario.Actions) { bool i = ActionsTimingsMoveManagement.IsActionInternal(action); bool e = ActionsTimingsMoveManagement.IsActionExternal(action); bool s = ActionsTimingsMoveManagement.IsActionDeleted(action); Assert.IsTrue(i || e || s); if (i) { Assert.IsFalse(e || s); } else if (e) { Assert.IsFalse(i || s); } else { Assert.IsFalse(i || e); } } } } }