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

262 lines
8.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using De.Lambertz.Essentials;
6
namespace De.Lambertz.ODAL
{
public class WährungsSingelton : ISingelton
{
private static WährungsSingelton me = null;
private String sessionId = "";
static readonly object padlock0 = new object(); //Threadsafe!!
static readonly object padlock1 = new object(); //Threadsafe!!
//
LamDictionary<int, Dictionary<string, WährungsUmrechnung>> umrechnungen = null;
LamDictionary<int, DateTime> geladenenFirmen = null;
Dictionary<string, string> druckZeichen = null;
private WährungsSingelton()
{
umrechnungen = new LamDictionary<int, Dictionary<string, WährungsUmrechnung>>();
geladenenFirmen = new LamDictionary<int, DateTime>();
this.sessionId = KernParameterSingelton.GetInstance().SessionID;
druckZeichen = new Dictionary<string, string>();
druckZeichen.Add("EUR", "€");
druckZeichen.Add("USD", "$");
}
private String getKey(int firmenNr, string firmenWährung)
{
return firmenNr.ToString("000") + firmenWährung;
}
public String DruckZeichenFür(String wkz)
{
String result = wkz;
if (wkz == null)
{
wkz = "EUR";
}
if (druckZeichen.ContainsKey(wkz))
{
result = druckZeichen[wkz];
}
return result;
}
public WährungsUmrechnung WährungsUmrechnungFür(int firmenNr, String wkz)
{
WährungsUmrechnung result = null;
check(firmenNr);
if (umrechnungen.ContainsKey(firmenNr))
{
Dictionary<string, WährungsUmrechnung> temp = umrechnungen[firmenNr];
if (temp.ContainsKey(wkz))
{
result = temp[wkz];
}
}
if(result == null)
{
throw new Exception("Keine Währung mit WKZ: " + wkz + " für Firma " + firmenNr.ToString());
}
return result;
}
public string FirmenWährungFür(int firmenNr)
{
String result = null;
check(firmenNr);
try
{
Dictionary<string, WährungsUmrechnung> temp = umrechnungen[firmenNr];
foreach (WährungsUmrechnung wu in temp.Values)
{
result = wu.FirmenWährung;
break;
}
}
catch (Exception)
{
throw new Exception("Keine Firmenwährung für Firma " + firmenNr.ToString());
}
return result;
}
/// <summary>
/// Erste Währung ist immer Firmen-Währung
/// </summary>
/// <param name="firmenNr"></param>
/// <returns></returns>
public List<WährungsUmrechnung> WährungslisteFür(int firmenNr)
{
List<WährungsUmrechnung> result = new List<WährungsUmrechnung>();
check(firmenNr);
Dictionary<string, WährungsUmrechnung> temp = umrechnungen[firmenNr];
bool firmenWährungGefunden = false;
foreach (WährungsUmrechnung wu in temp.Values)
{
if (!result.Contains(wu))
{
if (wu.FirmenWährung == wu.FremdWährung)
{
result.Insert(0, wu);
firmenWährungGefunden = true;
}
else
{
result.Add(wu);
}
}
}
if (!firmenWährungGefunden && result.Count>0)
{
WährungsUmrechnung wu = new WährungsUmrechnung();
wu.FirmenNr = firmenNr;
wu.FirmenWährung = result[0].FirmenWährung;
wu.FirmenWährungsFaktor = result[0].FirmenWährungsFaktor;
wu.FremdWährung = result[0].FirmenWährung;
wu.FremdWährungsFaktor = result[0].FirmenWährungsFaktor;
wu.Umrechnungsfaktor = 1;
result.Insert(0, wu);
}
return result;
}
public double Umrechnen(double originalWert, int firmenNr, string startWährung, string ziehlWährung)
{
double result = originalWert;
check(firmenNr);
Dictionary<string, WährungsUmrechnung> z = umrechnungen[firmenNr];
if (!z.ContainsKey(ziehlWährung) && z.Count>0)
{
WährungsUmrechnung wu = new WährungsUmrechnung();
WährungsUmrechnung wu1 = null;
foreach(WährungsUmrechnung x in z.Values)
{
wu1 = x;
break;
}
if (ziehlWährung == wu1.FirmenWährung)
{
wu.FirmenNr = firmenNr;
wu.FirmenWährung = wu1.FirmenWährung;
wu.FirmenWährungsFaktor = wu1.FirmenWährungsFaktor;
wu.FremdWährung = wu1.FirmenWährung;
wu.FirmenWährungsFaktor = wu1.FirmenWährungsFaktor;
wu.Umrechnungsfaktor = 1;
z.Add(ziehlWährung, wu);
}
}
if (z.ContainsKey(ziehlWährung))
{
WährungsUmrechnung ziehl = z[ziehlWährung];
if (startWährung == null)
{
startWährung = ziehl.FirmenWährung;
}
if (startWährung == ziehl.FirmenWährung)
{
result = Math.Round(originalWert * ziehl.Umrechnungsfaktor * ziehl.FremdWährungsFaktor / ziehl.FirmenWährungsFaktor ,4);
}
else
{
if (z.ContainsKey(startWährung))
{
WährungsUmrechnung start = z[startWährung];
//Erst in Firmenwährung umrechnen
double temp = Math.Round(originalWert * start.FirmenWährungsFaktor / (start.Umrechnungsfaktor * start.FremdWährungsFaktor) , 4);
//Dann in Ziehlwährung umrechnen
result = Math.Round(temp * ziehl.Umrechnungsfaktor * ziehl.FremdWährungsFaktor / ziehl.FirmenWährungsFaktor, 4);
}
else
{
throw new Exception("Unmögliche Startwährung");
}
}
}
else
{
throw new Exception("Unmögliche Ziehlwährung");
}
return result;
}
private void check(int firmenNr)
{
lock (padlock1)
{
bool neuLaden = true;
if (geladenenFirmen.ContainsKey(firmenNr))
{
if (geladenenFirmen[firmenNr] > DateTime.Now)
{
neuLaden = false;
}
else
{
geladenenFirmen.Remove(firmenNr);
umrechnungen.Remove(firmenNr);
}
}
if (neuLaden)
{
//Dictionary<string, WährungsUmrechnung> liste = AS400DataLoader.GetWährungsUmrechnungen(firmenNr, this.sessionId);
//geladenenFirmen.Add(firmenNr, EssentialTools.TagEnde(DateTime.Now));
//umrechnungen.Add(firmenNr, liste);
}
}
}
public static WährungsSingelton GetInstance()
{
lock (padlock0)
{
if (me == null)
{
me = new WährungsSingelton();
SingeltonManager.GetInstance().RegisterSingelton(me);
}
return me;
}
}
void ISingelton.ManagedReset(string userName)
{
}
void ISingelton.ManagedKill()
{
}
}
}