using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using GCHR.Model; using GCHR.Model.Konto; using GCHR.View; namespace GCHR.Control.Tasks { class TaskManager { public ThreadXData Data = ThreadXData.CreateInstance(); private List _taskList; private readonly Konfiguration _config = Konfiguration.GetInstance(); public void CreateTasks(RunWorkerCompletedEventHandler completed, Periode periode) { HaendlerKonto.AktuellePeriode = periode; _config.AktuellePeriode = periode; Data.SetDepartmentCase(CreateDepartmentCaseInstance()); Data.JahresergebnisKonto = _config.JahresergebnisKonto; completed += Ablaufsteuerung; _taskList = new List { Task.CreateInstance(0, "Kontenrahmen", completed, new[] { -1 }), Task.CreateInstance(1, "UebersetzungSuSa", completed, new[] { 0 }), Task.CreateInstance(2, "UebersetzungStat", completed, new[] { 0 }), Task.CreateInstance(3, "ManuelleKonten", completed, new[] { 2 }), Task.CreateInstance(4, "DatenimportSuSa", completed, new[] { 1, 2 }), Task.CreateInstance(5, "DatenimportStat", completed, new[] { 4 }), Task.CreateInstance(6, "Verarbeitung", completed, new[] { 5 }), Task.CreateInstance(7, "Verrechnung", completed, new[] { 3 }), Task.CreateInstance(8, "Export", completed, new[] { 7 }) }; Logger.ExportLog = periode.LogDatei; var info = new FileInfo(Logger.ExportLog); if (info.Directory != null) info.Directory.Create(); Logger.Info(DateTime.Now + " - " + periode.Klartext); Logger.Info(string.Format("Prozess gestartet. Weitere Infos siehe '{0}'", Logger.ExportLog)); Logger.Progress(DateTime.Now + " Prozess gestartet."); } private void Ablaufsteuerung(object s, RunWorkerCompletedEventArgs e) { var aktuellerWorker = (BackgroundWorker)s; var aktuelleAufgabe = GetAufgabeByWorker(aktuellerWorker); if (e.Error == null) { if (aktuelleAufgabe.Ampel != null && aktuelleAufgabe.Ampel.Message.Equals("")) { aktuelleAufgabe.Ampel.Message = "Die Verarbeitung war erfolgreich."; } SetWorkerCompleted(aktuelleAufgabe.ID); var weitereAufgabe = TryRunNextWorker(); if (!weitereAufgabe) { _config.ManuelleKontenSpeichern(); } } else { if (aktuelleAufgabe.Ampel != null) { aktuelleAufgabe.Ampel.Status = Ampelstatus.Rot; aktuelleAufgabe.Ampel.Message += e.Error.Message; } Logger.Info(e.Error.ToString()); Logger.Progress(e.Error.ToString()); } } public Task GetAufgabeByWorker(BackgroundWorker worker) { var aufgabe = (from a in _taskList where a.Worker == worker select a).First(); return aufgabe; } private void SetWorkerCompleted(int aufgabeId) { foreach (var aufgabe in _taskList) { aufgabe.WartelisteAktualisieren(aufgabeId); } } public bool TryRunNextWorker() { return (_taskList.Where(aufgabe => aufgabe.TryRun())).Count() > 0; } public void RegisterAmpeln(Ampel[] ampeln) { for (var i = 0; i < Math.Min(ampeln.Count(), _taskList.Count); i++) { _taskList[i].RegisterAmpel(ampeln[i]); } } private DepartmentCase CreateDepartmentCaseInstance() { return new DepartmentCase(_config.Hauptmarke, _config.Hauptbetrieb, _config.BilanzMarke, _config.BilanzBetrieb, _config.HerstellerKontenrahmenStellen); } } }