using SOG.Base.Attributes;
using SOG.Base.Helper;
using SOG.Base.SOGMessage;
using SOG.ERP.Entity.Bewegungsdaten;
using SOG.ERP.Entity.Workflow;
using System;
namespace SOG.ERP.Modules.Aufgabensystem
{
/// <summary>
/// </summary>
public class AufgabenWorkflowBspStern : AufgabenWorkflow
{
// =================================================
// Eingabefelder
// =================================================
/// <summary>
/// </summary>
[InputPrompt("Benutzer 1", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_1 { get; set; }
/// <summary>
/// </summary>
[InputPrompt("Benutzer 2", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_2 { get; set; }
/// <summary>
/// </summary>
[InputPrompt("Benutzer 3", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_3 { get; set; }
/// <summary>
/// </summary>
[InputPrompt("Benutzer 4", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_4 { get; set; }
/// <summary>
/// </summary>
[InputPrompt("Benutzer 5", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_5 { get; set; }
/// <summary>
/// </summary>
[InputPrompt("Benutzer 6", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_6 { get; set; }
// =================================================
// Referenzen
// =================================================
/// <summary>
/// </summary>
[SOGSerialize(true)]
// ReSharper disable once InconsistentNaming
public string m_user_aufgabe_1 { get; set; }
/// <summary>
/// </summary>
[SOGSerialize(true)]
// ReSharper disable once InconsistentNaming
public string m_user_aufgabe_2 { get; set; }
/// <summary>
/// </summary>
[SOGSerialize(true)]
// ReSharper disable once InconsistentNaming
public string m_user_aufgabe_3 { get; set; }
/// <summary>
/// </summary>
[SOGSerialize(true)]
// ReSharper disable once InconsistentNaming
public string m_user_aufgabe_4 { get; set; }
/// <summary>
/// </summary>
[SOGSerialize(true)]
// ReSharper disable once InconsistentNaming
public string m_user_aufgabe_5 { get; set; }
/// <summary>
/// </summary>
[SOGSerialize(true)]
// ReSharper disable once InconsistentNaming
public string m_user_aufgabe_6 { get; set; }
readonly TypeHelperArray<string> _user;
readonly TypeHelperArray<string> _userAufgabe;
// =================================================
// Initialisierung
// =================================================
/// <summary>
/// </summary>
/// <param name="wfId"></param>
/// <param name="wfClass"></param>
public AufgabenWorkflowBspStern(string wfId, string wfClass)
: base(wfId, wfClass)
{
Status = "dlg1";
//FreieFelder.Add("m_zusatz_1");
FreieFelder.Add("m_status");
FreieFelder.Add("m_prio");
_user = new TypeHelperArray<string>( this, "m_user", 6 );
_userAufgabe = new TypeHelperArray<string>(this, "m_user_aufgabe", 6);
}
// =================================================
// Workflow fortsetzen
// =================================================
/// <summary>
/// </summary>
/// <param name="sender"></param>
/// <param name="feargs"></param>
public override void SOGEventHandler_WorkflowFortsetzen(object sender, SOGFireEventArgs feargs)
{
switch (Status)
{
case "dlg1":
feargs.Redirect = new SOGRedirect("AufgabenWorkflowBspStern_dlg1", WFId);
break;
case "stern":
EndeVerarbeiten(sender, feargs);
break;
default:
throw new ArgumentException();
}
}
// =================================================
// Maskeneingabe verarbeiten
// =================================================
/// <summary>
/// </summary>
/// <param name="sender"></param>
/// <param name="feargs"></param>
public override void SOGEventHandler_MaskePositivBeenden(object sender, SOGFireEventArgs feargs)
{
if (Status == "dlg1")
{
bool found = false;
// Jedem Benutzer einen Aufgaben-Clone erzeugen
for (int i = 0; i < _user.Length; i++)
{
if (_user[i]?.Length > 0)
{
Aufgaben auneu = RefAufgabe.CloneAufgabe();
auneu.SetZustaendig(_user[i]);
auneu.AssignWorkflow(WFId);
_userAufgabe[i] = auneu.GetUniqKey();
found = true;
}
}
if (found)
{
// Nun Basisaufgabe zurückstellen:
RefAufgabe.SetStatus(Aufgaben.BearbeitungsStati.WartenAufJemandAnderen);
Status = "stern";
WriteLog(Aph.Format("Status={0}", Status));
for (int i = 0; i < _user.Length; i++)
if (_user[i]?.Length > 0)
WriteLog(Aph.Format(" Benutzer {0}:{1} ({2})", i+1, _user[i], _userAufgabe[i]));
Save();
feargs.Changed = true;
}
else
{
EndWorkflow();
feargs.Changed = true;
}
}
}
// =================================================
// Ende-Signal einer Aufgabe verarbeiten
// =================================================
/// <summary>
/// </summary>
/// <param name="sender"></param>
/// <param name="feargs"></param>
protected void EndeVerarbeiten(object sender, SOGFireEventArgs feargs)
{
Aufgaben ausend = sender as Aufgaben;
if (ausend != null)
{
ausend.TransRegister();
WriteLog(Aph.Format("EndeVerarbeiten {0}:{1}", ausend.GetType().Name, ausend.GetUniqKey()));
string suchkey = ausend.GetUniqKey();
// Suchen der Aufgabe in der Liste der Stern-Aufgaben
for (int i=0; i<_userAufgabe.Length; i++)
{
if (suchkey == _userAufgabe[i])
{
// Diese Aufgabe nun erledigen:
WriteLog(Aph.Format(" Benutzer: {0}", _user[i]));
// Dokumente umhzängen
ausend.CopyDocRefs(RefAufgabe);
ausend.Erledigen(feargs);
ausend.ClearWorkflow();
_userAufgabe[i] = "";
}
}
}
// Status sichern
Save();
// Nun Kontrolle, ob noch Aufgaben ausstehen:
bool waitForMore = false;
for (int i = 0; i < _userAufgabe.Length; i++)
{
if (_userAufgabe[i]?.Length > 0)
{
waitForMore = true;
WriteLog(Aph.Format(" Ausstehend Benutzer: {0} ({1})", _user[i], _userAufgabe[i]));
}
}
// Ansonsten: Basisaufgabe wieder
if (!waitForMore)
{
if ( RefAufgabe.m_status == Aufgaben.BearbeitungsStati.WartenAufJemandAnderen )
RefAufgabe.SetStatus(Aufgaben.BearbeitungsStati.NichtInBearbeitung);
EndWorkflow();
}
}
// =================================================
// Aktionen beim Abbrechen des Workflows
// =================================================
/// <summary>
/// </summary>
protected override void AbortWorkflow()
{
// Stern-Aufgaben vom Workflow befreien:
foreach (string aufgKey in _userAufgabe)
{
if (aufgKey.Length > 0)
Dbs.GetTable<AufgabenTable>().GetAufgabenNoEx(aufgKey)?.ClearWorkflow();
}
// Rest ist in Basisklasse definiert:
base.AbortWorkflow();
}
// =================================================
// Erlauben des Importierens von Dokumenten
// =================================================
/// <summary>
/// </summary>
/// <param name="aufgabe"></param>
/// <param name="state"></param>
public override void HandleEventStateDocImport(Aufgaben aufgabe, SOGMaskState state)
{
}
}
}
Die Workflow-Klasse ist von der Basisklasse "AufgabenWorkflow" abgeleitet, und erbt damit die Möglichkeit im Aufgabendialog einer Aufgabe zugewiesen zu werden, und anschließend die Eingabemaske der Aufgabe beeinflussen zu können. "AufgabenWorkflow" selbst ist von "VacosWorkflow" abgeleitet, die wiederum von "SOGWorkflow" abgeleitet ist. In diesen Basisklassen wird die "Persistenz" der Workflowinstanz implementiert. Also: Das Speichern und Laden des Workflows in und aus der Datenbank.
Im Bereich "Eingabefelder" werden Datenfelder definiert, die in der Eingabemaske des Workflows zur Verfügung stehen, und somit direkt vom Benutzer eingegeben werden können.
Über "InputPrompt" werden die Dialogeigenschaften der Datenfelder festgelegt.
"Referenzen" legt die Referenzen auf weitere SOG ERP (VACOS)-Objekte fest. In diesem Beispiel: die Zeiger auf bis zu 6 Aufgaben, die an dem Stern beteiligt sind.
Über das Attribut "SOGSerialize" wird die Persistenz der Datenfelder festgelegt.
Alle Datenfelder mit InputPrompt oder SOGSerialize-Attribut sind persistent.
"Workflow fortsetzen" wertet den aktuellen "Status" des Workflow aus, und schickt den Benutzer entweder auf die aktuelle Eingabemaske, oder Verarbeitet die "Ende" Meldung der verbundenen Aufgaben.
"Maskeneingabe verarbeiten" legt für einen eingegebenen Benutzer eine neue Aufgabe an, und weisst diesem dem eingegebenen Benutzer zu. Der Workflow-Status wird auf "stern" gesetzt, und die Hauptaufgabe in den Zustand "WartenAufJemandAnderen" eingestellt.
Die folgenden "Workflow fortsetzen" sind dann "Ende-Meldungen" der verbundenen Aufgaben (alle Aufgaben sind mit dem gleichen Workflow-Objekt verbunden).
Die signalisiert Aufgabe wird in der Liste der Referenzen gesucht, und wenn gefunden, erledigt. Vor Erledigung werden evt. importierte Dokumente an die Hauptaufgabe verkettet.
Der verwendete Dialogschritt "AufgabenWorkflowBspStern_dlg1" hat keine eigene Implementierung, sondern nur einen Eintrag in c084/c083:
Typ = "VacosObjectDefinition"
Id = "AufgabenWorkflowBspStern_dlg1"
Text = "Aufgabenworkflow Beispiel Stern"
Classname = "SOG.ERP.Entity.Dialog.Workflow.DlgVacosWorkflow"
Assembly = "SOG.ERP.Entity.Dialog.dll"
sichtbar = Invisible
Außerdem ist ein weiterer Eintrag für die Definition des Workflow selbst im c084 notwendig
Typ = "Workflow"
Id = "BeispielAufgabeStern"
Text = "Beispielworkflow für sternförmige Aufgabenverteilung"
Classname = "SOG.ERP.Modules.Aufgabensystem.AufgabenWorkflowBspStern"
Dataobject = "Aufgaben"
Assembly = "SOG.ERP.Modules.Aufgabensystem.dll"
sichtbar = Visibile
Hier wird also der Workflow-Klasse "BeispielAufgabeStern" eine CSharp-Klasse "SOG.ERP.Modules.Aufgabensystem.AufgabenWorkflowBspStern" zugeordnet.
Durch Anpassung dieses Eintrags kann auch eine Workflow-Klasse aus einem SOG ActiveSkin Script angesteuert werden.
Durch das Setzen des Parameters "Dataobject" auf den Wert "Aufgaben" wird erreicht, dass dieser Workflow in der Auswahlliste der für Aufgaben geeigneten Workflows mit angezeigt wird.
Daneben kann über Sichtbarkeit, Rechte und Lizenzen gesteuert werden, ob der Eintrag in dieser Liste sichtbar ist.