Entwicklung_BLAZOR/InterneDLLs/LambertzPortalODAL/FreigabeStatus.cs
2025-08-23 19:30:21 +02:00

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; }
}
}