Merge branch 'feature_rene_13_dakota'

This commit is contained in:
2025-09-23 12:56:29 +02:00
19 changed files with 290 additions and 16 deletions

View File

@@ -0,0 +1,59 @@
using BeWo.Data.Entities;
using BS.Shared;
using NHibernate;
using NHibernate.Criterion;
using NHibernate.SqlCommand;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Data.Access.Criterias
{
public class GkvTransferprotokollCriteria
{
//public static ICriterion GetGkvTransferProtokollKostenpflichtigRestriction()
//{
// var isEchtverfahren = Restrictions.Eq(Projections.Property<GkvAbrechnung>(a => a.Verfahrensstufe), GkvVerfahrensstufe.Echt);
// var isErprobung = Restrictions.Eq(Projections.Property<GkvAbrechnung>(a => a.Verfahrensstufe), GkvVerfahrensstufe.Erprobung);
// var isKnappschaft = Restrictions.Not(Restrictions.Like(Projections.Property<GkvTransferProtokoll>(x => x.EmpfangerBezeichnung), "knappschaft"));
// return Restrictions.Or(isEchtverfahren, Restrictions.And(isErprobung, isKnappschaft));
//}
//public static IQueryable<GkvTransferProtokoll> GetGkvTransferProtokolle(ICriteria criteria)
//{
//}
//public static IQueryable<GkvTransferProtokoll> GetGkvTransferprotokoll(ICriteria criteria)
//{
// var
// var query = criteria
// .Join("gkvabrechnung", JoinType.InnerJoin) // a1.Oid = t1.GkvAbrechnungOid
// .Where(restriction =>
// restriction.Ge("DATE(ErstelltAm)", new DateTime(2025, 1, 1)) // DATE(t1.ErstelltAm) >= '2025-01-01'
// .And(restriction.Le("DATE(ErstelltAm)", new DateTime(2025, 2, 28))) // DATE(t1.ErstelltAm) <= '2025-02-28'
// .And(restriction.Eq("Oid", GetMinOidSubquery(restriction))) // t1.Oid = (SELECT MIN(Oid)...)
// .And(restriction.Or(
// restriction.And(restriction.Eq("Verfahrensstufe", 1), restriction.NotLike("EmpfangerBezeichnung", "knappschaft%")), // a1.Verfahrensstufe = 1 AND t1.EmpfangerBezeichnung NOT LIKE 'knappschaft%'
// restriction.Eq("Verfahrensstufe", 2))) // OR a1.Verfahrensstufe = 2
// );
// return query;
//}
//private static Subquery GetMinOidSubquery(ICriteriaBuilder criteriaBuilder)
//{
// var subquery = criteriaBuilder.CreateSubquery<GkvTransferProtokoll>()
// .Select(x => x.Oid)
// .Group(x => x.GkvAbrechnungOid)
// .Having(x => x.Min(t => t.Oid));
// return subquery;
//}
}
}

View File

@@ -10,6 +10,7 @@ namespace BeWo.Data.Access
/// Kleiner Fix bzgl Threadsafe
private static readonly Lazy<AdoDAO> _AdoDAO = new Lazy<AdoDAO>(() => new AdoDAO());
private static readonly Lazy<GenericDAO> _GenericDAO = new Lazy<GenericDAO>(() => new GenericDAO());
private static readonly Lazy<GenericSearchDAO> _GenericSearchDAO = new Lazy<GenericSearchDAO>(() => new GenericSearchDAO());
private static readonly Lazy<FinanceDAO> _FinanceDAO = new Lazy<FinanceDAO>(() => new FinanceDAO());
private static readonly Lazy<OrganisationDAO> _OrganisationDAO = new Lazy<OrganisationDAO>(() => new OrganisationDAO());
private static readonly Lazy<ScriptDAO> _ScriptDAO = new Lazy<ScriptDAO>(() => new ScriptDAO());
@@ -18,6 +19,7 @@ namespace BeWo.Data.Access
public static AdoDAO AdoDAO => _AdoDAO.Value;
public static GenericDAO GenericDAO => _GenericDAO.Value;
public static GenericSearchDAO GenericSearchDAO => _GenericSearchDAO.Value;
public static FinanceDAO FinanceDAO => _FinanceDAO.Value;
public static OrganisationDAO OrganisationDAO => _OrganisationDAO.Value;
public static ScriptDAO ScriptDAO => _ScriptDAO.Value;

View File

@@ -0,0 +1,35 @@
using BeWo.Data.Entities;
using BS.Shared;
using NHibernate.Criterion;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Data.Access
{
public class GenericSearchDAO : AbstractBaseDAO
{
internal GenericSearchDAO() { }
public virtual T LoadEntityByProperty<T>(Func<T, object> propertyFunc, string propertyName = null) where T : BeWoEntityBase, new()
{
if (propertyName is null)
propertyName = nameof(propertyFunc);
var criteria = CreateCriteria<T>()
.Add(Restrictions.Eq(propertyName, propertyFunc));
var candidates = criteria.List<T>();
if(candidates.Count == 1)
return candidates[0];
if (candidates.Count == 0)
throw new NotImplementedException("Count == 0");
throw new NotImplementedException("Count > 1");
}
}
}

View File

@@ -1,4 +1,5 @@
using BS.Shared;
using BeWo.Data.Entities;
using BS.Shared;
using DevExpress.XtraPrinting;
using System;
using System.Collections.Generic;
@@ -41,5 +42,17 @@ namespace BeWo.Data.Access
return rtn;
}
public IEnumerable<long> GetGkvSumByDateRange2(DateTime? start, DateTime? end)
{
var sql = LoadSQLStatement("GetGkvSumByDateRange2.sql");
var rtn = Session.CreateSQLQuery(sql)
.SetParameter(0, start ?? DateTime.MinValue)
.SetParameter(1, end ?? DateTime.MaxValue)
.List<long>();
return rtn;
}
}
}

View File

@@ -2,8 +2,8 @@
FROM gkvtransferprotokoll AS t1
JOIN gkvabrechnung a1
ON a1.Oid = t1.GkvAbrechnungOid
WHERE DATE(t1.ErstelltAm) >= ?
AND DATE(t1.ErstelltAm) <= ?
WHERE DATE(a1.ErstelltAm) >= ?
AND DATE(a1.ErstelltAm) <= ?
AND t1.Oid = (
SELECT MIN(Oid)
FROM gkvtransferprotokoll AS t2

View File

@@ -0,0 +1,18 @@
SELECT t1.Oid
FROM gkvtransferprotokoll AS t1
JOIN gkvabrechnung a1
ON a1.Oid = t1.GkvAbrechnungOid
WHERE DATE(a1.ErstelltAm) >= ?
AND DATE(a1.ErstelltAm) <= ?
AND t1.Oid = (
SELECT MIN(Oid)
FROM gkvtransferprotokoll AS t2
WHERE t1.GkvAbrechnungOid = t2.GkvAbrechnungOid
GROUP BY t2.GkvAbrechnungOid
)
AND
(
(a1.Verfahrensstufe = 1 AND t1.EmpfangerBezeichnung NOT LIKE 'knappschaft')
OR
a1.Verfahrensstufe = 2
)

View File

@@ -1,9 +1,9 @@
SELECT *
SELECT a1.Oid as 'a1.oid', t1.Oid as 't1.oid', a1.ErstelltAm as 'a1.ErstelltAm', t1.EmpfangerBezeichnung, a1.AbrechnungsZeitraumStart, a1.AbrechnungsZeitraumEnde, a1.Verfahrensstufe, a1.UrbelegeGesendet, a1.Bezahlt, a1.Betrag
FROM gkvtransferprotokoll AS t1
JOIN gkvabrechnung a1
ON a1.Oid = t1.GkvAbrechnungOid
WHERE DATE(t1.ErstelltAm) >= '2025-01-01'
AND DATE(t1.ErstelltAm) <= '2025-02-28'
WHERE DATE(a1.ErstelltAm) >= '2025-01-01'
AND DATE(a1.ErstelltAm) <= '2025-02-28'
AND t1.Oid = (
SELECT MIN(Oid)
FROM gkvtransferprotokoll AS t2

View File

@@ -1812,7 +1812,7 @@ WHERE sc.Billable = 1 and sr.StartDate >= '{0:yyyy-MM-dd}' and sr.StartDate < '{
return lCriteria.List<GkvTransferProtokoll>();
}
public IEnumerable<InvoiceBase> GetInvoiceBases(DateTime? startDate, DateTime? endDate, long costBearerOid, String invoiceId)
public IEnumerable<InvoiceBase> GetInvoiceBases(DateTime? startDate, DateTime? endDate, long costBearerOid, String invoiceId)
{
var lCriteria = CreateCriteriaIsActive<InvoiceBase>();

View File

@@ -221,9 +221,11 @@
<ItemGroup>
<Compile Include="Access\AbstractBaseDAO.cs" />
<Compile Include="Access\AdoDAO.cs" />
<Compile Include="Access\Criterias\GkvCriterias.cs" />
<Compile Include="Access\DAOFactory.cs" />
<Compile Include="Access\GenericDAO.cs" />
<Compile Include="Access\FinanceDAO.cs" />
<Compile Include="Access\GenericSearchDAO.cs" />
<Compile Include="Access\OrganisationDAO.cs" />
<Compile Include="Access\ScriptDAO.cs" />
<Compile Include="Access\SearchDAO.cs" />
@@ -739,6 +741,7 @@
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Access\Scripts\GetGkvSumByDateRange.sql" />
<EmbeddedResource Include="Access\Scripts\GetGkvSumByDateRange2.sql" />
<Content Include="Access\Scripts\GetGkvSumByDateRangeDebug.sql" />
<Content Include="ICD10\icd10.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

View File

@@ -7,4 +7,10 @@
<appSettings>
<add key="OpenWebUIKey" value=""/>
<add key="OllamaKey" value=""/>
<add key="GetGkvSumApiKey" value=""/>
<add key="DownloadReportApiKey" value=""/>
<add key="OpenrouteServiceApiKey" value="" />
<add key="GoogleDistanceMatrixApiKey" value="" />
<add key="GkvSecretKey" value="" />
</appSettings>

View File

@@ -263,7 +263,7 @@
<appSettings>
<add key="AdminServiceIPAddress" value="::1" />
<add key="AdminServiceIPAddress2" value="::1" />
<add key="AdminServiceAPIKey" value="HasteGedachteWa" />
<add key="AdminServiceAPIKey" value="2BOtqzjmVQ1Yrg7NZyvS87JRfppGn02dgBr3us736TUTPamTV6MPokZTxqcSNmWY" />
<add key="AdminServiceEnableStackTrace" value="true" />
<add key="SendMailOnError" value="false" />

View File

@@ -8,6 +8,7 @@ using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using BeWo.Data;
using BeWo.Service.Core;
namespace BeWo.Service.ServiceBehavior
{
@@ -34,7 +35,7 @@ namespace BeWo.Service.ServiceBehavior
}
// Hole erlaubten API Key aus den appSettings
string allowedApikey = ConfigurationManager.AppSettings["AdminServiceAPIKey"];
string allowedApikey = MergedConfig.GetSetting("AdminServiceAPIKey");
// Extrahiert den API Key von Remote
var prop = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];

View File

@@ -24,7 +24,7 @@ namespace BeWo.Service.ServiceContracts
string Echo(string echo);
[OperationContract]
[WebInvoke(UriTemplate = "/GetGkvSum", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
object GetGkvAbrechnungSumme(AdminServiceSumReqDC request);
[WebInvoke(UriTemplate = "/GetGkvSum?detail={flag}", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
AdminServiceSumResponseDC GetGkvAbrechnungSumme(AdminServiceSumReqDC request, string flag);
}
}

View File

@@ -1,11 +1,17 @@
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Data.Entities.Light;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.ServiceContracts;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts.AdminService;
using BS.Shared.Extensions;
using DevExpress.Pdf.Native.BouncyCastle.Ocsp;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.ServiceModel;
using System.Text;
@@ -26,7 +32,7 @@ namespace BeWo.Service.ServiceImplementations
return echo;
}
public object GetGkvAbrechnungSumme(AdminServiceSumReqDC request)
public AdminServiceSumResponseDC GetGkvAbrechnungSumme(AdminServiceSumReqDC request, string detail)
{
if (request == null)
{
@@ -42,12 +48,54 @@ namespace BeWo.Service.ServiceImplementations
{
throw new ArgumentException("end entspricht nicht ISO8601 Norm.");
}
var res = new AdminServiceSumResponseDC();
res.Sum = DAOFactory.ScriptDAO.GetGkvSumByDateRange(start, end);
var sum = DAOFactory.ScriptDAO.GetGkvSumByDateRange(start, end);
if (detail != "true")
{
return res;
}
var json = JsonUtils.ToSimpleJson("sum", sum);
string detail_res;
return json;
var protokolle_oids = DAOFactory.ScriptDAO.GetGkvSumByDateRange2(start, end);
if (protokolle_oids.HasContent())
{
var protokolle = DAOFactory.GenericDAO.LoadByIDs<GkvTransferProtokollLight>(protokolle_oids);
var abrechnung_oids = protokolle.Select(x => x.GkvAbrechnungOid).Distinct();
var abrechnung = DAOFactory.GenericDAO.LoadByIDs<GkvAbrechnungLight>(abrechnung_oids);
var abrechnung_dc = MapperFactory.GkvAbrechnungLight.MapToNewDCs(abrechnung);
res.Details = abrechnung_dc.Select(x =>
{
var t = x.TransferProtokolle.First();
var state = x.GetState();
return new AdminServiceSumResponseDetailDC()
{
Oid = x.Oid,
ProtokollOid = t.Oid.Value,
ErstelltAm = x.ErstelltAm.ToString("o", CultureInfo.InvariantCulture),
Empfanger = t.BezDatenannahmestelle,
AbrechnungsZeitraumStart = x.AbrechnungsZeitraumStart?.ToString("o", CultureInfo.InvariantCulture),
AbrechnungsZeitraumEnde = x.AbrechnungsZeitraumEnde?.ToString("o", CultureInfo.InvariantCulture),
VerfahrensstufeInt = x.Verfahrensstufe,
Verfahrensstufe = ((GkvVerfahrensstufe)x.Verfahrensstufe).ToString(),
StateInt = (int)state,
State = state.ToString(),
UrbelegeGesendet = x.UrbelegeGesendet,
Bezahlt = x.Bezahlt,
Betrag = x.Betrag
};
});
}
else
{
res.Details = new List<AdminServiceSumResponseDetailDC>();
}
return res;
}
}
}

View File

@@ -19,11 +19,18 @@ namespace BS.Shared.Core
return JsonConvert.SerializeObject(dict);
}
public static string ToJson(Dictionary<string, object> dict)
public static string ConvertToJson(Dictionary<string, object> dict)
{
var json = JsonConvert.SerializeObject(dict);
return json;
}
public static string ConvertToJson(dynamic payload, Formatting formatting = Formatting.None)
{
var json = JsonConvert.SerializeObject((object)payload, formatting);
return json;
}
}
}

View File

@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace BS.Shared.DataContracts.AdminService
{
[DataContract]
public class AdminServiceSumResponseDC : IAdminServiceDC
{
[DataMember(Name = "sum", Order = 1)]
public decimal? Sum { get; set; }
[DataMember(Name = "details", EmitDefaultValue = false, Order = 2)]
public IEnumerable<AdminServiceSumResponseDetailDC> Details { get; set; }
}
}

View File

@@ -0,0 +1,55 @@
using BS.Shared.Interface;
using DevExpress.Mvvm.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace BS.Shared.DataContracts.AdminService
{
[DataContract]
public class AdminServiceSumResponseDetailDC : IAdminServiceDC
{
[DataMember(Name = "a.oid", Order = 1)]
public long Oid { get; set; }
[DataMember(Name = "t.oid", Order = 2)]
public long ProtokollOid { get; set; }
[DataMember(Name = "sum", Order = 3)]
public decimal Betrag { get; set; }
[DataMember(Name = "paid", Order = 4)]
public bool Bezahlt { get; set; }
[DataMember(Name = "urbelege_sent", Order = 5)]
public bool UrbelegeGesendet { get; set; }
[DataMember(Name = "receiver", Order = 6)]
public string Empfanger { get; set; }
[DataMember(Name = "create", Order = 7)]
public string ErstelltAm { get; set; }
[DataMember(Name = "gkv_start", Order = 8)]
public string AbrechnungsZeitraumStart { get; set; }
[DataMember(Name = "gkv_end", Order = 9)]
public string AbrechnungsZeitraumEnde { get; set; }
[DataMember(Name = "level", Order = 10)]
public int VerfahrensstufeInt { get; set; }
[DataMember(Name = "level_string", Order = 11)]
public string Verfahrensstufe { get; set; }
[DataMember(Name = "state", Order = 20)]
public int StateInt { get; set; }
[DataMember(Name = "state_string", Order = 21)]
public string State { get; set; }
}
}

View File

@@ -10,6 +10,12 @@ namespace BS.Shared.Extensions
{
public static class IEnumerableTExtensions
{
public static bool HasNoContent<T>(this IEnumerable<T> values)
=> !HasContent(values);
public static bool HasContent<T>(this IEnumerable<T> values)
=> values is IEnumerable<T> && values.Any();
public static bool ContainsSameItemsAs<T>(this IEnumerable<T> p1, IEnumerable<T> pList)
{
if ((p1 == null || p1.Count() == 0) && (pList == null || pList.Count() == 0))

View File

@@ -178,6 +178,8 @@
<Compile Include="Core\WohnheimbuchungsIntervall.cs" />
<Compile Include="DataContracts\AbsenceOverviewFilterDC.cs" />
<Compile Include="DataContracts\AddressDC.cs" />
<Compile Include="DataContracts\AdminService\AdminServiceSumResponseDC.cs" />
<Compile Include="DataContracts\AdminService\AdminServiceSumResponseDetailDC.cs" />
<Compile Include="DataContracts\AdminService\IAdminServiceDC.cs" />
<Compile Include="DataContracts\AdminService\AdminServiceSumReqDC.cs" />
<Compile Include="DataContracts\Feature\AI\AiConfigDC.cs" />