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 alleFreigaben = null; //Liste aller Freigabemöglichkeiten private List fachlicheFreigaben = new List(); //Liste aller Freigabemöglichkeiten für fachliche Freigaben private List konditionsFreigaben = new List(); //liste aller Freigabemöglichkeiten für konditionelle Freigaben private List kostenstellenFreigaben = new List(); //Liste aller Freigabemöglichkeiten für Kostenstellen Freigaben private List zusätzlichefreigaben = new List(); //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 unterschiedlicheFreigeberOhneKostenstellen = null; //Liste aller Freigeber VOR betrachtung der Kostenstellenfreigaben (für 4-Augen-Prüfung) // private Dictionary freigabenProKostenstelle = new Dictionary(); //Freigaben in Bezug auf jede Kostenstelle // private int kennzahl = 0; // private string sessionId = ""; /// /// Status der Freigabe einer Bestellung in Bezug auf die drei Freigabearten /// /// public FreigabeStatus(ODALBestellung bestellung) : this(bestellung, null) { } public FreigabeStatus(ODALBestellung bestellung, List freigaben) { this.sessionId = KernParameterSingelton.GetInstance().SessionID; this.bestellung = bestellung; this.bestellungBerechnen(freigaben); } /// /// Splittet die Liste aller Freigaben auf die drei Bereiche auf und bestimmt den Status pro Bereich /// sowie den Gesamtsatus /// private void bestellungBerechnen(List 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(); 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 AlleFreigaben { get { return alleFreigaben; } } public List FachlicheFreigaben { get { return fachlicheFreigaben; } } public List KonditionsFreigaben { get { return konditionsFreigaben; } } public List KostenstellenFreigaben { get { return kostenstellenFreigaben; } } public Status FachlicheFreigabeStatus { get { return fachlicheFreigabeStatus; } } public Status KonditionsFreigabeStatus { get { return konditionsFreigabeStatus; } } public Status KostenstellenFreigabeStatusGesamt { get { return kostenstellenFreigabeStatusGesamt; } } /// /// Gibt den Status der Kostenstellenfreigabe mit Berücksichtigung der anderen Freigaben /// zur 4-Augenkontrolle /// /// /// 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; } /// /// STATIC!!!!! /// Hilfsmethode zum zentralen mappen von Farben zu Stati /// /// /// 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 FreigabenProKostenstelle { get { return freigabenProKostenstelle; } } public List UnterschiedlicheFreigeberOhneKostenstellen { get { return unterschiedlicheFreigeberOhneKostenstellen; } } public List Zusätzlichefreigaben { get => zusätzlichefreigaben; set => zusätzlichefreigaben = value; } } }