401 lines
14 KiB
C#
401 lines
14 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
using De.Lambertz.Tools;
|
|
|
|
namespace De.Lambertz.ODAL
|
|
{
|
|
public class FreigabeStatus
|
|
{
|
|
|
|
public enum Status
|
|
{
|
|
Komplett,
|
|
Teilweise,
|
|
VierAugenVerletzung,
|
|
NichtFreigegeben
|
|
}
|
|
|
|
private ODALBestellung bestellung = null;
|
|
private FachBereich fachbereich = null; //Fachbereich aus der Bestellung (zum einfachen Zugriff)
|
|
//
|
|
private List<FreigabeOption> alleFreigaben = null; //Liste aller Freigabemöglichkeiten
|
|
private List<FreigabeOption> fachlicheFreigaben = new List<FreigabeOption>(); //Liste aller Freigabemöglichkeiten für fachliche Freigaben
|
|
private List<FreigabeOption> konditionsFreigaben = new List<FreigabeOption>(); //liste aller Freigabemöglichkeiten für konditionelle Freigaben
|
|
private List<FreigabeOption> kostenstellenFreigaben = new List<FreigabeOption>(); //Liste aller Freigabemöglichkeiten für Kostenstellen Freigaben
|
|
private List<int> zusätzlichefreigaben = new List<int>(); //Liste aller User für Zusäzliche verkürzte Freigaben (gehandhabt wie Vertretungen)
|
|
//
|
|
private Status fachlicheFreigabeStatus = Status.NichtFreigegeben; //Status der Bestellung im Bezug auf
|
|
private Status konditionsFreigabeStatus = Status.NichtFreigegeben; //Status der Bestellung im Bezug auf
|
|
private Status kostenstellenFreigabeStatusGesamt = Status.NichtFreigegeben; //Status der Bestellung im Bezug auf
|
|
//
|
|
private List<int> unterschiedlicheFreigeberOhneKostenstellen = null; //Liste aller Freigeber VOR betrachtung der Kostenstellenfreigaben (für 4-Augen-Prüfung)
|
|
//
|
|
private Dictionary<string, KostenstellenFreigabe> freigabenProKostenstelle = new Dictionary<string, KostenstellenFreigabe>(); //Freigaben in Bezug auf jede Kostenstelle
|
|
//
|
|
private int kennzahl = 0;
|
|
//
|
|
private string sessionId = "";
|
|
|
|
/// <summary>
|
|
/// Status der Freigabe einer Bestellung in Bezug auf die drei Freigabearten
|
|
/// </summary>
|
|
/// <param name="bestellung"></param>
|
|
public FreigabeStatus(ODALBestellung bestellung) : this(bestellung, null)
|
|
{
|
|
|
|
}
|
|
|
|
public FreigabeStatus(ODALBestellung bestellung, List<FreigabeOption> freigaben)
|
|
{
|
|
this.sessionId = KernParameterSingelton.GetInstance().SessionID;
|
|
this.bestellung = bestellung;
|
|
this.bestellungBerechnen(freigaben);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Splittet die Liste aller Freigaben auf die drei Bereiche auf und bestimmt den Status pro Bereich
|
|
/// sowie den Gesamtsatus
|
|
/// </summary>
|
|
private void bestellungBerechnen(List<FreigabeOption> freigabenVorgabe)
|
|
{
|
|
if (freigabenVorgabe == null)
|
|
{
|
|
FreigabenHandler fh = new FreigabenHandler();
|
|
alleFreigaben = fh.FreigabenEinerBestellung(this.bestellung);
|
|
}
|
|
else
|
|
{
|
|
alleFreigaben = freigabenVorgabe;
|
|
}
|
|
foreach (FreigabeOption f in alleFreigaben)
|
|
{
|
|
switch (f.FreigabeArt)
|
|
{
|
|
case FreigabenHandler.FREIGABE_ART_FACHLICH:
|
|
fachlicheFreigaben.Add(f);
|
|
break;
|
|
case FreigabenHandler.FREIGABE_ART_KONDITION:
|
|
konditionsFreigaben.Add(f);
|
|
break;
|
|
case FreigabenHandler.FREIGABE_ART_KOSTENSTELLE:
|
|
kostenstellenFreigaben.Add(f);
|
|
|
|
//Zusammenfassen der einzelenen Freigaben auf Kostenstelleneben
|
|
//(Intern in den KostenstellenFreigaben -> Aufsplittung auf Hierachieebene)
|
|
KostenstellenFreigabe kf;
|
|
if (freigabenProKostenstelle.ContainsKey(f.Kostenstelle))
|
|
{
|
|
kf = freigabenProKostenstelle[f.Kostenstelle];
|
|
freigabenProKostenstelle.Remove(f.Kostenstelle);
|
|
}
|
|
else
|
|
{
|
|
kf = new KostenstellenFreigabe(f.Kostenstelle);
|
|
}
|
|
kf.Add(f);
|
|
freigabenProKostenstelle.Add(f.Kostenstelle, kf);
|
|
break;
|
|
}
|
|
}
|
|
//Bestimmen aller unterschiedlicher Freigeber VOR Kostenstellenbetrachtung
|
|
unterschiedlicheFreigeberOhneKostenstellen = new List<int>();
|
|
foreach (FreigabeOption f in fachlicheFreigaben) //Fachlich
|
|
{
|
|
if (f.FreigabeVon != 0)
|
|
{
|
|
if (!unterschiedlicheFreigeberOhneKostenstellen.Contains(f.MöglichVon))
|
|
{
|
|
unterschiedlicheFreigeberOhneKostenstellen.Add(f.MöglichVon);
|
|
}
|
|
}
|
|
}
|
|
foreach (FreigabeOption f in konditionsFreigaben) //Konditionell
|
|
{
|
|
if (f.FreigabeVon != 0)
|
|
{
|
|
if (!unterschiedlicheFreigeberOhneKostenstellen.Contains(f.MöglichVon))
|
|
{
|
|
unterschiedlicheFreigeberOhneKostenstellen.Add(f.MöglichVon);
|
|
}
|
|
}
|
|
}
|
|
// (unbedingt vor Statusbestimmung!)
|
|
this.fachbereich = UserSingelton.GetInstance().FachBereiche[bestellung.Bereich];
|
|
//
|
|
fachlicheFreigabeStatus = this.fachlicheFreigabeStatusBestimmen();
|
|
konditionsFreigabeStatus = this.konditionsFreigabeStatusBestimmen();
|
|
kostenstellenFreigabeStatusGesamt = this.kostenstellenFreigabeStatusBestimmen(!this.fachbereich.IstFachBereichMitVereinfachterFreigabe);
|
|
|
|
if(this.fachbereich.IstFachBereichMitVereinfachterFreigabe)
|
|
{
|
|
Zusätzlichefreigaben.AddRange(this.fachbereich.VereinfachteFreigabeFreigeber);
|
|
}
|
|
|
|
this.kennzahl = 0;
|
|
if (fachlicheFreigabeStatus == Status.Komplett)
|
|
{
|
|
this.kennzahl = this.kennzahl + 1;
|
|
}
|
|
if (konditionsFreigabeStatus == Status.Komplett)
|
|
{
|
|
this.kennzahl = this.kennzahl + 2;
|
|
}
|
|
if (kostenstellenFreigabeStatusGesamt == Status.Komplett)
|
|
{
|
|
this.kennzahl = this.kennzahl + 8;
|
|
}
|
|
else if (kostenstellenFreigabeStatusGesamt == Status.Teilweise || kostenstellenFreigabeStatusGesamt == Status.VierAugenVerletzung)
|
|
{
|
|
this.kennzahl = this.kennzahl + 4;
|
|
}
|
|
if (!String.IsNullOrEmpty(bestellung.SonderGrund))
|
|
{
|
|
this.kennzahl = 11;
|
|
}
|
|
}
|
|
|
|
public Status[] GetStati()
|
|
{
|
|
Status[] result = new Status[3];
|
|
result[0] = Status.NichtFreigegeben;
|
|
result[1] = Status.NichtFreigegeben;
|
|
result[2] = Status.NichtFreigegeben;
|
|
|
|
double temp = this.kennzahl;
|
|
double teiler = 8;
|
|
int index = -1;
|
|
Status tempStat = Status.NichtFreigegeben;
|
|
do
|
|
{
|
|
if (teiler == 8)
|
|
{
|
|
index = 2;
|
|
tempStat = Status.Komplett;
|
|
}
|
|
else if (teiler == 4)
|
|
{
|
|
index = 2;
|
|
tempStat = Status.Teilweise;
|
|
}
|
|
else if (teiler == 2)
|
|
{
|
|
index = 1;
|
|
tempStat = Status.Komplett;
|
|
}
|
|
else if (teiler == 1)
|
|
{
|
|
index = 0;
|
|
tempStat = Status.Komplett;
|
|
}
|
|
if (temp >= teiler)
|
|
{
|
|
result[index] = tempStat;
|
|
temp = temp - teiler;
|
|
}
|
|
|
|
teiler = teiler / 2;
|
|
} while (teiler > 0.5 && temp > 0);
|
|
|
|
return result;
|
|
}
|
|
|
|
public Status fachlicheFreigabeStatusBestimmen()
|
|
{
|
|
Status result = Status.NichtFreigegeben;
|
|
foreach (FreigabeOption f in fachlicheFreigaben)
|
|
{
|
|
if (f.FreigabeVon != 0)
|
|
{
|
|
result = Status.Komplett;
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public Status konditionsFreigabeStatusBestimmen()
|
|
{
|
|
Status result = Status.NichtFreigegeben;
|
|
foreach (FreigabeOption f in konditionsFreigaben)
|
|
{
|
|
if (f.FreigabeVon != 0)
|
|
{
|
|
result = Status.Komplett;
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public Status kostenstellenFreigabeStatusBestimmen(bool mitVierAugenPrintip)
|
|
{
|
|
Status result = Status.NichtFreigegeben;
|
|
int komplett = 0;
|
|
int vierAugen = 0;
|
|
int teilweise = 0;
|
|
int nicht = 0;
|
|
int anzahlKostenstellen = freigabenProKostenstelle.Count;
|
|
|
|
foreach (KostenstellenFreigabe kf in freigabenProKostenstelle.Values)
|
|
{
|
|
Status fdk = kf.FreigabeStatusDieserKostenstelle(unterschiedlicheFreigeberOhneKostenstellen, mitVierAugenPrintip);
|
|
if (fdk == Status.Komplett)
|
|
{
|
|
komplett++;
|
|
}
|
|
else if (fdk == Status.NichtFreigegeben)
|
|
{
|
|
nicht++;
|
|
}
|
|
else if (fdk == Status.Teilweise)
|
|
{
|
|
teilweise++;
|
|
}
|
|
else if (fdk == Status.VierAugenVerletzung)
|
|
{
|
|
vierAugen++;
|
|
}
|
|
}
|
|
|
|
//Gesamtstatus ermitteln
|
|
if (komplett == anzahlKostenstellen)
|
|
{
|
|
result = Status.Komplett;
|
|
}
|
|
else
|
|
{
|
|
if (vierAugen != 0)
|
|
{
|
|
result = Status.VierAugenVerletzung;
|
|
}
|
|
else if (teilweise != 0)
|
|
{
|
|
result = Status.Teilweise;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public FachBereich Fachbereich
|
|
{
|
|
get { return fachbereich; }
|
|
}
|
|
|
|
public List<FreigabeOption> AlleFreigaben
|
|
{
|
|
get { return alleFreigaben; }
|
|
}
|
|
|
|
public List<FreigabeOption> FachlicheFreigaben
|
|
{
|
|
get { return fachlicheFreigaben; }
|
|
}
|
|
|
|
public List<FreigabeOption> KonditionsFreigaben
|
|
{
|
|
get { return konditionsFreigaben; }
|
|
}
|
|
|
|
public List<FreigabeOption> KostenstellenFreigaben
|
|
{
|
|
get { return kostenstellenFreigaben; }
|
|
}
|
|
|
|
public Status FachlicheFreigabeStatus
|
|
{
|
|
get { return fachlicheFreigabeStatus; }
|
|
}
|
|
|
|
public Status KonditionsFreigabeStatus
|
|
{
|
|
get { return konditionsFreigabeStatus; }
|
|
}
|
|
|
|
public Status KostenstellenFreigabeStatusGesamt
|
|
{
|
|
get { return kostenstellenFreigabeStatusGesamt; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gibt den Status der Kostenstellenfreigabe mit Berücksichtigung der anderen Freigaben
|
|
/// zur 4-Augenkontrolle
|
|
/// </summary>
|
|
/// <param name="kst"></param>
|
|
/// <returns></returns>
|
|
public Status KostenstellenStatus(string kst)
|
|
{
|
|
Status result = Status.NichtFreigegeben;
|
|
|
|
if (freigabenProKostenstelle.ContainsKey(kst))
|
|
{
|
|
bool mitVierAugenPrinzip = true;
|
|
|
|
FachBereich fb = null;
|
|
if(UserSingelton.GetInstance().FachBereiche.ContainsKey(this.bestellung.Bereich))
|
|
{
|
|
fb = UserSingelton.GetInstance().FachBereiche[this.bestellung.Bereich];
|
|
mitVierAugenPrinzip = !fb.IstFachBereichMitVereinfachterFreigabe;
|
|
}
|
|
|
|
result = freigabenProKostenstelle[kst].FreigabeStatusDieserKostenstelle(unterschiedlicheFreigeberOhneKostenstellen, mitVierAugenPrinzip);
|
|
}
|
|
else
|
|
{
|
|
//throw new ODALException("Kostenstelle " + kst + " nicht in Bestellung vorhanden!");
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// STATIC!!!!!
|
|
/// Hilfsmethode zum zentralen mappen von Farben zu Stati
|
|
/// </summary>
|
|
/// <param name="status"></param>
|
|
/// <returns></returns>
|
|
public static Color StatusFarbe(Status status)
|
|
{
|
|
Color result = Color.Black;
|
|
|
|
if (status == Status.Komplett)
|
|
{
|
|
result = Color.Green;
|
|
}
|
|
else if (status == Status.NichtFreigegeben)
|
|
{
|
|
result = Color.Red;
|
|
}
|
|
else if (status == Status.VierAugenVerletzung)
|
|
{
|
|
result = Color.LightPink;
|
|
}
|
|
else if (status == Status.Teilweise)
|
|
{
|
|
result = Color.Chocolate;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public int Kennzahl
|
|
{
|
|
get { return kennzahl; }
|
|
}
|
|
|
|
public Dictionary<string, KostenstellenFreigabe> FreigabenProKostenstelle
|
|
{
|
|
get { return freigabenProKostenstelle; }
|
|
}
|
|
public List<int> UnterschiedlicheFreigeberOhneKostenstellen
|
|
{
|
|
get { return unterschiedlicheFreigeberOhneKostenstellen; }
|
|
}
|
|
|
|
public List<int> Zusätzlichefreigaben { get => zusätzlichefreigaben; set => zusätzlichefreigaben = value; }
|
|
}
|
|
}
|