This commit is contained in:
2024-10-23 17:05:20 +02:00
parent 4ce1b499f2
commit 5802a0f38d
42 changed files with 379 additions and 478 deletions

View File

@@ -651,7 +651,7 @@ namespace BeWo
{
String url = "";
#if DEBUG
url = String.Format("http://localhost:3777/Host");
//url = String.Format("http://localhost:3777/Host");
//return new Uri("https://app5.bewoplaner.de/service");
//url = String.Format("app1.bewoplaner.de/service");
#endif

View File

@@ -18,18 +18,19 @@ namespace BeWo.Converter
if (state is null)
return null;
switch (state.Value)
{
case GkvState.NoSend: return "Erstellt";
case GkvState.Waiting: return "Gesendet";
case GkvState.Waiting4Urbelege: return "Urbelege per Post";
case GkvState.Error: return "Fehler";
case GkvState.ErrorFatal: return "Fataler Fehler";
case GkvState.Paid: return "Bezahlt";
case GkvState.OldAndNoFeedback: return "Keine Antwort";
}
switch (state.Value)
{
case GkvState.NoSend: return "Erstellt";
case GkvState.Error: return "Fehler";
case GkvState.ErrorFatal: return "Fataler Fehler";
case GkvState.Paid: return "Bezahlt";
case GkvState.WaitingForDakota: return "Warte auf Übertragung";
case GkvState.WaitingForKrankenkasse: return "Warte auf Gkv";
case GkvState.WaitingForKrankenkasseTooLong: return "Keine Antwort von Gkv";
case GkvState.WaitingForUrbelege: return "Sende Urbelege";
}
return state.ToString();
return state.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

View File

@@ -24,7 +24,7 @@ namespace BeWo
{
#if DEBUG
return _CurrentConfig ?? (_CurrentConfig = Feature_Dakota);
return _CurrentConfig ?? (_CurrentConfig = null);
#endif

View File

@@ -2097,7 +2097,7 @@ namespace BeWo.ServiceProxy
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.InvoiceNumberDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.InvoiceNumberDC>))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.InvoiceType))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvTransferFehlerlevel))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvTransferResultType))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvAbrechnungApp8RequestTypeDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC>))]
@@ -6335,7 +6335,7 @@ namespace BeWo.ServiceProxy
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.InvoiceNumberDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.InvoiceNumberDC>))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.InvoiceType))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvTransferFehlerlevel))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvTransferResultType))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvAbrechnungApp8RequestTypeDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC>))]

View File

@@ -58,7 +58,7 @@
x:Name="radioFilterByAccountingDate"
Click="radioFilterByInvoiceDate_Click"
Content="Nach Abrechnungszeitraum filtern"
ToolTip="Filtert die angezeigten GKV-Abrechnungen nach ihrem Abrechnungszeitraum. Es werden alle Abrechnungen angezeigt, die den ausgewählten Monat bzw. Jahr beinhalten." />
ToolTip="Filtert die angezeigten GKV-Abrechnungen nach ihrem Abrechnungszeitraum. Es werden alle Abrechnungen angezeigt, die den ausgewählten Monat bzw. das ausgewählte Jahr beinhalten." />
</StackPanel>
<Grid Grid.Column="2">
<Grid.Resources>

View File

@@ -121,18 +121,28 @@ namespace BeWo.View.Detail.Accounting
}
private void NewGkvAbrechnungPopUpViewCreateButtonClicked(object sender, EventArgs<GkvAbrechnungDC> e)
{
var checked_invoice_bases = _NewGkvAbrechnungPopUpView.ViewModel.InvoiceBases.Where(x => x.IsChecked).Select(x => x.DataContract.InvoiceBaseOid.Value).ToList();
var checked_invoice_bases = _NewGkvAbrechnungPopUpView.ViewModel.InvoiceBases.Where(x => x.IsChecked);
// MessageBox.Show("Sie haben keine Rechnung hinzugefügt.", "GKV-Abrechnung erstellen", MessageBoxButton.OK, MessageBoxImage.Warning);
if (checked_invoice_bases.Count == 0)
if (!checked_invoice_bases.Any())
return;
var already_used_invoices = checked_invoice_bases.Where(x => x.IsAlreadyInActiveGkvAbrechnung.Value);
if (already_used_invoices.Any())
{
var txt = "Sie haben eine oder mehrere Rechnungen ausgewählt, welche bereits in einer anderen aktiven GKV-Abrechnung enthalten sind. Möchten Sie fortfahren?";
var result = MessageBox.Show(txt, "Hinweis", MessageBoxButton.OKCancel);
if (result != MessageBoxResult.OK)
return;
}
MainControl.CloseCurrentPopUp();
var gkv_abrechnung = e.Data;
var gkv_filter = new GkvAbrechnungRequestDC(gkv_abrechnung);
gkv_filter.SelectedInvoiceBases = checked_invoice_bases;
gkv_filter.SelectedInvoiceBases = checked_invoice_bases.Select(x => x.DataContract.InvoiceBaseOid.Value).ToList();
ServiceFacade.DoAccountingServiceAsync(x => x.CreateNewGkvAbrechnung(gkv_filter),
cb => Dispatcher.BeginInvoke(DispatcherPriority.Normal,
@@ -205,24 +215,6 @@ namespace BeWo.View.Detail.Accounting
can_send |= state == GkvState.ErrorFatal;
#endif
if (!can_send)
{
string error;
if (state == GkvState.Waiting)
error = "Es wurde bereits übertragen ohne direkte Fehler.";
else if (state == GkvState.ErrorFatal)
error = "GKV-Abrechnung enthält schwere Fehler. Erstellen Sie die Rechnung erneut.";
else if (state == GkvState.Paid)
error = "GKV-Abrechnung ist bereits als bezahlt markiert.";
else if (state == GkvState.OldAndNoFeedback)
error = "GKV-Abrechnung ist älter als 28 Tage und als nicht bezahlt markiert. Wenden Sie sich bitte an Ihre Krankenkasse";
else
error = "def";
MessageBox.Show(error, "Übertragung nicht möglich");
return;
}
string text = "Sind Sie sicher, dass Sie die gewählte GKV-Abrechnung senden möchten?";
if (state == GkvState.Error)
@@ -306,12 +298,12 @@ namespace BeWo.View.Detail.Accounting
if (gkvAbrechnungVM is null)
return;
if (gkvAbrechnungVM.GkvState == GkvState.OldAndNoFeedback)
if (gkvAbrechnungVM.GkvState == GkvState.WaitingForKrankenkasseTooLong)
{
e.Result = Brushes.Orange;
e.Handled = true;
}
else if (gkvAbrechnungVM.GkvState == GkvState.Waiting4Urbelege)
else if (gkvAbrechnungVM.GkvState == GkvState.WaitingForUrbelege)
{
e.Result = Brushes.Green;
e.Handled = true;

View File

@@ -224,6 +224,11 @@
FieldName="IsPaid"
Header="Bezahlt"
IsEnabledBinding="{Binding Source=false}" />
<dxg:GridColumn
x:Name="AlreadyInActiveGkvAbrechnungColumn"
FieldName="IsAlreadyInActiveGkvAbrechnung"
Header="Bereits enthalten"
IsEnabledBinding="{Binding Source=false}" />
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView

View File

@@ -162,7 +162,7 @@ namespace BeWo.View.Detail.Accounting
{
_LoadedInvoiceBaseOid = costOid;
ServiceFacade.DoAccountingServiceAsync(s => s.GetInvoiceBasesForCostBearerAndId(start, ende, (long)costOid, "RechnungSoziotherapie"), UpdateInvoiceList);
ServiceFacade.DoAccountingServiceAsync(s => s.GetInvoiceBasesForCostBearerAndIdAndIsUsed(start, ende, (long)costOid, "RechnungSoziotherapie"), UpdateInvoiceList);
}
}

View File

@@ -324,11 +324,17 @@ namespace BeWo.View.Detail
private void IKRequestCallback(GkvApp8GetIKRequest req, GkvApp8GetIKResponse response)
{
if(response is null || !response.Success)
{
MessageBox.Show($"Interner Serverfehler.", "Fehler");
return;
}
if (!response.Gefunden)
{
MessageBox.Show($"Für die Organisation mit dem IK \"{req.IKKrankenkasse}\" und Leistungserbringergruppe \"{req.Leistungserbringergruppe}\" konnte keine Datenannahmestelle gefunden werden. " +
$"Bitte informieren Sie sich bei der Krankenkasse, ob zum elektronischen Datenaustausch " +
$"eine seperate Anmeldung benötigt wird.");
$"eine seperate Anmeldung benötigt wird.", "Fehler");
return;
}

View File

@@ -97,7 +97,10 @@ namespace BeWo.View.Master
}
private void RemoveView(TabItem pTabItem)
=> AddView(pTabItem, null);
{
_OpenViews.Remove(pTabItem);
pTabItem.Content = null;
}
private void InitRights()
{

View File

@@ -12,11 +12,12 @@ using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Extensions;
using BS.Shared.Interface;
using DevExpress.Xpf.Core;
namespace BeWo.ViewModel
{
public class GkvAbrechnungVM : AbstractDCMapperVM<GkvAbrechnungDC>
public class GkvAbrechnungVM : AbstractDCMapperVM<GkvAbrechnungDC>, IGkvAbrechnung
{
public static string PropertyName_AbrechnungsZeitraumStart = "AbrechnungsZeitraumStart";
public static string PropertyName_AbrechnungsZeitraumEnde = "AbrechnungsZeitraumEnde";
@@ -57,7 +58,6 @@ namespace BeWo.ViewModel
public string AbrechnungsZeitraum => $"{AbrechnungsZeitraumStart.Value.ToShortDateString()} - {AbrechnungsZeitraumEnde.Value.ToShortDateString()}";
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public DateTime? AbrechnungsZeitraumStart
{
get { return this._AbrechnungsZeitraumStart; }
@@ -76,8 +76,6 @@ namespace BeWo.ViewModel
}
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public DateTime? AbrechnungsZeitraumEnde
{
get { return this._AbrechnungsZeitraumEnde; }
@@ -92,8 +90,6 @@ namespace BeWo.ViewModel
}
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public DateTime ErstelltAm
{
get { return this._ErstelltAm; }
@@ -108,8 +104,6 @@ namespace BeWo.ViewModel
}
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public long? GkvAbrechnungOid
{
get { return this._GkvAbrechnungOid; }
@@ -124,8 +118,6 @@ namespace BeWo.ViewModel
}
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public long? GkvAbrechnungVersion
{
get { return this._GkvAbrechnungOid; }
@@ -140,7 +132,6 @@ namespace BeWo.ViewModel
}
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public string Notice
{
get { return this._Notice; }
@@ -155,8 +146,6 @@ namespace BeWo.ViewModel
}
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public decimal Betrag
{
get { return this._Betrag; }
@@ -171,8 +160,6 @@ namespace BeWo.ViewModel
}
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public bool Bezahlt
{
get { return _Bezahlt; }
@@ -189,7 +176,6 @@ namespace BeWo.ViewModel
}
}
}
public bool UrbelegeGesendet
{
get { return _UrbelegeGesendet; }
@@ -204,12 +190,9 @@ namespace BeWo.ViewModel
FirePropertyChanged(nameof(GkvState));
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public GkvState GkvState
{
get { return GetState(); }
get { return this.GetState(); }
}
public bool IsChecked
@@ -231,13 +214,11 @@ namespace BeWo.ViewModel
get { return _InvoiceBases2; }
set { _InvoiceBases2 = value; }
}
public BindingList<InvoiceBaseVM> InvoiceBases
{
get { return _InvoiceBases; }
set { _InvoiceBases = value; }
}
public List<GkvTransferProtokollDC> TransferProtokolle
{
get { return _TransferProtokolle; }
@@ -250,8 +231,6 @@ namespace BeWo.ViewModel
FirePropertyChanged(nameof(LastTransferDateTime));
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public OrganisationDC Organisation
{
get { return this._Organisation; }
@@ -266,7 +245,6 @@ namespace BeWo.ViewModel
}
}
}
public GkvVerfahrensstufe Verfahrensstufe
{
get { return this._Verfahrensstufe; }
@@ -281,7 +259,6 @@ namespace BeWo.ViewModel
}
}
}
public int VerfahrensstufeInt
{
get { return (int)Verfahrensstufe; }
@@ -296,6 +273,7 @@ namespace BeWo.ViewModel
}
}
#endregion
public IGkvTransferProtokoll LastTransferProtokoll => TransferProtokolle?.Last();
public string RecipientString
{
@@ -309,7 +287,6 @@ namespace BeWo.ViewModel
return string.Empty;
}
}
public string Fehlermeldung
{
get
@@ -325,7 +302,6 @@ namespace BeWo.ViewModel
return $"{last.Fehlertitel}: {last.Fehlernachricht}";
}
}
public DateTime? LastTransferDateTime
{
get
@@ -338,7 +314,6 @@ namespace BeWo.ViewModel
return last.ErstelltAm;
}
}
public bool IsReady2Send
{
get { return _IsReady2Send; }
@@ -351,7 +326,6 @@ namespace BeWo.ViewModel
FirePropertyChanged(nameof(IsReady2Send));
}
}
public string SendTooltip
{
get { return _SendTooltip; }
@@ -370,30 +344,6 @@ namespace BeWo.ViewModel
public bool IsReady2Create
=> InvoiceBases?.Where(x => x.IsChecked).Any() ?? false;
public GkvState GetState()
{
return GkvAbrechnungExtensions.GetState(
this,
() => Bezahlt,
() => UrbelegeGesendet,
() => TransferProtokolle,
(x) => x.Fehlerdatum,
(x) => x.Fehlerlevel,
(x) => x.ErstelltAm.Value);
}
public static GkvState GetState(GkvAbrechnungVM vm)
{
return GkvAbrechnungExtensions.GetState(
vm,
() => vm.Bezahlt,
() => vm.UrbelegeGesendet,
() => vm.TransferProtokolle,
(x) => x.Fehlerdatum,
(x) => x.Fehlerlevel,
(x) => x.ErstelltAm.Value);
}
public void UpdateByDataContract(GkvAbrechnungDC pDataContract)
{
GkvAbrechnungVersion = pDataContract.GkvAbrechnungVersion;
@@ -496,11 +446,11 @@ namespace BeWo.ViewModel
var protokoll = cb.TransferProtokoll;
if (protokoll.Fehlerlevel == GkvTransferFehlerlevel.Soft)
if (protokoll.ResultType == GkvTransferResultType.Soft)
{
MessageBox.Show(Application.Current.MainWindow, protokoll.Fehlernachricht, protokoll.Fehlertitel);
}
else if (protokoll.Fehlerlevel == GkvTransferFehlerlevel.Fatal)
else if (protokoll.ResultType == GkvTransferResultType.Fatal)
{
BeWoApp.ShowError(protokoll.Fehlertitel + ": " + protokoll.Fehlernachricht, null, false, false);
}

View File

@@ -207,6 +207,7 @@ namespace BeWo.ViewModel
public bool IsGkvValid { get; private set; }
public string IsGkvValidError { get; private set; }
public bool? IsAlreadyInActiveGkvAbrechnung { get; private set; }
public bool IsChecked
{
@@ -1018,6 +1019,7 @@ namespace BeWo.ViewModel
IsGkvValid = pDataContract.IsGkvValid;
IsGkvValidError = pDataContract.IsGkvValidError;
IsAlreadyInActiveGkvAbrechnung = pDataContract.IsAlreadyInActiveGkvAbrechnung;
}
protected override InvoiceBaseDC MapToDataContract(InvoiceBaseDC pDataContract, bool doCommit)

View File

@@ -13,13 +13,15 @@
<basicHttpBinding>
<binding name="BeWoBasicEndpoint" closeTimeout="00:05:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true" messageEncoding="Text">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None" />
<!--<security mode="None" />-->
<security mode="Transport" />
<!-- mode="Transport" für https und "None" sonst-->
</binding>
<binding name="BeWoStreamingEndpoint" receiveTimeout="10:10:00" sendTimeout="10:01:00" maxBufferSize="65536" maxReceivedMessageSize="67108864" transferMode="StreamedRequest" useDefaultWebProxy="true" messageEncoding="Text">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None" />
<!-- mode="Transport" für https -->
<!--<security mode="None" />-->
<security mode="Transport" />
<!-- mode="Transport" für https und "None" sonst-->
</binding>
<binding name="QueryServiceEndpoint" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true" messageEncoding="Text">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />

View File

@@ -45,7 +45,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="DakotaSystemFile.cs" />
<Compile Include="FehlerXml.cs" />
<Compile Include="ResultXml.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="XmlFileConverter.cs" />

View File

@@ -198,7 +198,12 @@ namespace DakotaSender
error = e.ToString();
}
if (error is string)
if (error == string.Empty)
{
// Dakota läuft bereits.
// Nächster Run
}
else if (error is string)
{
PrintLine(error);
MoveQueueToFailed(file);
@@ -206,8 +211,12 @@ namespace DakotaSender
if (copied)
DeleteDakotaFile(file);
CreateResultXmlFile(file, error);
CreateResultFehlerXmlFile(file, error);
}
else
{
CreateResultSuccessXmlFile(file);
}
}
static string ProcessFile(DakotaSystemFile file, out bool copied)
{
@@ -233,7 +242,7 @@ namespace DakotaSender
DeleteDakotaFile(file);
return null;
return string.Empty;
}
if (!AcceptSendCodes.Contains(code))
@@ -243,24 +252,29 @@ namespace DakotaSender
DeleteQueueFile(file);
return null;
}
static void CreateResultXmlFile(DakotaSystemFile file, string error)
{
Print("Speichere Fehler als Xml. ");
var fehler = new FehlerXml();
static void CreateResultSuccessXmlFile(DakotaSystemFile file)
=> CreateResultXmlFile(file, "Dakota Erfolg", "", 0);
static void CreateResultFehlerXmlFile(DakotaSystemFile file, string error)
=> CreateResultXmlFile(file, "Dakota Fehler", error, 1);
static void CreateResultXmlFile(DakotaSystemFile file, string title, string nachricht, int fehler_level)
{
Print($"Speichere {title} als Xml. ");
fehler.Datum = DateTime.Now;
fehler.Titel = "Dakota Fehler";
fehler.Nachricht = error;
fehler.Level = 1;
fehler.Oid = file.ProtokollOid;
var result = new ResultXml();
result.Datum = DateTime.Now;
result.Titel = title;
result.Nachricht = nachricht;
result.Level = fehler_level;
result.Oid = file.ProtokollOid;
var folder = GetResultFolderTenant(file.Tenant).FullName;
var path = Path.Combine(folder, $"P{file.ProtokollOid}.xml");
Print($"Path: {path}");
Print($"Path: {path}. ");
XmlFileConverter.Save(fehler, path);
XmlFileConverter.Save(result, path);
PrintLine("Ok.");
}

View File

@@ -9,8 +9,8 @@ using System.Xml.Serialization;
namespace DakotaSender
{
[Serializable()]
[XmlRoot("Fehler")]
public class FehlerXml
[XmlRoot("Result")]
public class ResultXml
{
[XmlAttribute("Oid")]
public long Oid { get; set; }

View File

@@ -12,10 +12,10 @@ namespace DakotaSender
/// <summary>
/// Saves to an xml file
/// </summary>
/// <param name="FileName">File path of the new xml file</param>
public static void Save<T>(T obj, string FileName) where T : class
/// <param name="fileName">File path of the new xml file</param>
public static void Save<T>(T obj, string fileName) where T : class
{
using (var writer = new System.IO.StreamWriter(FileName))
using (var writer = new System.IO.StreamWriter(fileName))
{
var serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(writer, obj);

View File

@@ -21,7 +21,7 @@ namespace DakotaUnitTest
[TestMethod]
public void ValidateXmlParse()
{
var convert = GkvApp8FehlerXml.GetFehlerXml("fehler_example.xml");
var convert = GkvApp8ResultXml.GetResultXml("fehler_example.xml");
Assert.IsNotNull(convert);
}

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Fehler Oid="31">
<Result Oid="31">
<Titel>31</Titel>
<Datum>2024-06-01T09:00:00</Datum>
<Nachricht>TestNach</Nachricht>
<Level>1</Level>
</Fehler>
</Result>

View File

@@ -5940,7 +5940,7 @@ namespace BeWo.Data.Access
public int GetNextDatenaustauschreferenz(string datenannahmestelle)
{
var criteria = CreateCriteria<GkvTransferProtokoll>()
.Add(Restrictions.Where<GkvTransferProtokoll>(x => x.SentSuccess && x.IKDatenannahmestelle == datenannahmestelle))
.Add(Restrictions.Where<GkvTransferProtokoll>(x => x.SentApp8Success && x.IKDatenannahmestelle == datenannahmestelle))
.SetProjection(Projections.Max("Datenaustauschreferenz"));
var t = criteria.List<int?>().SingleOrDefault();
@@ -5951,7 +5951,7 @@ namespace BeWo.Data.Access
public int GetNextTransfernummer(string datenannahmestelle)
{
var criteria = CreateCriteria<GkvTransferProtokoll>()
.Add(Restrictions.Where<GkvTransferProtokoll>(x => x.SentSuccess && x.IKDatenannahmestelle == datenannahmestelle))
.Add(Restrictions.Where<GkvTransferProtokoll>(x => x.SentApp8Success && x.IKDatenannahmestelle == datenannahmestelle))
.SetProjection(Projections.Max("Transfernummer"));
var t = criteria.List<int?>().SingleOrDefault();

View File

@@ -3,10 +3,11 @@ using System.Collections.Generic;
using System.Linq;
using BS.Shared;
using BS.Shared.Extensions;
using BS.Shared.Interface;
namespace BeWo.Data.Entities
{
public class GkvAbrechnung : BeWoEntityBase
public class GkvAbrechnung : BeWoEntityBase, IGkvAbrechnung
{
public GkvAbrechnung()
{
@@ -25,17 +26,9 @@ namespace BeWo.Data.Entities
public virtual IList<InvoiceBase> InvoiceBases { get; set; }
public virtual IList<GkvTransferProtokoll> GkvTransferProtokolle { get; set; }
public static GkvState GetState(GkvAbrechnung entity) =>
GkvAbrechnungExtensions.GetState(
entity,
() => entity.Bezahlt,
() => entity.UrbelegeGesendet,
() => entity.GkvTransferProtokolle,
(x) => x.Fehlerdatum,
(x) => x.Fehlerlevel,
(x) => x.ErstelltAm.Value);
public IGkvTransferProtokoll LastTransferProtokoll { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public virtual Organisation GetOrganisation()
public virtual Organisation GetOrganisation()
{
return InvoiceBases.First().CostBearer2SupportConcept.CostBearer.Organisation;
}

View File

@@ -2,10 +2,11 @@
using System.Collections.Generic;
using BS.Shared;
using BS.Shared.Interface;
namespace BeWo.Data.Entities
{
public class GkvTransferProtokoll : BeWoEntityBase
public class GkvTransferProtokoll : BeWoEntityBase, IGkvTransferProtokoll
{
public GkvTransferProtokoll()
{
@@ -36,11 +37,12 @@ namespace BeWo.Data.Entities
public virtual string Nutzdatendatei { get; set; }
public virtual string Auftragsdatei { get; set; }
public virtual bool SentSuccess { get; set; }
public virtual bool SentApp8Success { get; set; }
public virtual bool SentDakotaSuccess { get; set; }
public virtual GkvTransferResultType? ResultType { get; set; }
public virtual string Fehlertitel { get; set; }
public virtual DateTime? Fehlerdatum { get; set; }
public virtual string Fehlernachricht { get; set; }
public virtual GkvTransferFehlerlevel Fehlerlevel { get; set; }
}
}

View File

@@ -33,10 +33,11 @@
<property column="Transfernummer" type="int" name="Transfernummer" />
<property column="ErstelltAm" type="DateTime" name="ErstelltAm" />
<property column="SentSuccess" type="Boolean" name="SentSuccess" />
<property column="Fehlertitel" type="string" name="Fehlertitel" />
<property column="Fehlerdatum" type="DateTime" name="Fehlerdatum" />
<property column="Fehlernachricht" type="string" name="Fehlernachricht" />
<property column="Fehlerlevel" type="BS.Shared.GkvTransferFehlerlevel, BS.Shared" name="Fehlerlevel" />
<property column="SentApp8Success" type="Boolean" name="SentApp8Success" />
<property column="SentDakotaSuccess" type="Boolean" name="SentDakotaSuccess" />
<property column="ResultType" type="BS.Shared.GkvTransferResultType, BS.Shared" name="ResultType" />
<property column="Fehlertitel" type="string" name="Fehlertitel" />
<property column="Fehlerdatum" type="DateTime" name="Fehlerdatum" />
<property column="Fehlernachricht" type="string" name="Fehlernachricht" />
</class>
</hibernate-mapping>

View File

@@ -33,6 +33,7 @@ using System.Xml.Linq;
using System.Diagnostics;
using System.Xml.Serialization;
using Dakota.Logic;
using System.ComponentModel;
namespace Host
{
@@ -49,6 +50,8 @@ namespace Host
public GkvApp8Request GkvRequest { get; set; }
public void Sleep() => Thread.Sleep(5000);
protected void Page_Load(object sender, EventArgs e)
{
try
@@ -83,8 +86,6 @@ namespace Host
SendErrorResponse("GkvAbrechnungType unbekannt.");
return;
}
SendErrorResponse("Unbekannter Fehler");
}
catch (ThreadAbortException eee)
{
@@ -94,7 +95,6 @@ namespace Host
{
var ex_text = ex.Message + "\n" + ex.StackTrace;
SendErrorResponse(ex_text);
return;
}
}
@@ -105,6 +105,8 @@ namespace Host
response.Success = false;
response.Message = message;
Sleep();
SendResponse(JsonConvert.SerializeObject(response));
}
private void SendResponse(object res) => SendResponse(JsonConvert.SerializeObject(res));
@@ -139,21 +141,21 @@ namespace Host
private bool TryLogin() => TryLogin(GkvRequest);
private bool TryLogin(GkvApp8Request gkv_request)
{
if (gkv_request.Tenant == "demo" && gkv_request.Username == "demo" && gkv_request.DebugMode == "fozc4897b6ztvf978AFCRRG244fvFV2532fvf324AF")
{
gkv_request.Tenant = "7375324044";
return true;
}
var server = GetServerFromTenant(gkv_request.Tenant);
if (string.IsNullOrEmpty(server))
return false;
var loginurl = string.Format(LOGINSERVER_URL, $"https://{server}/service");
#if DEBUG
//loginurl = string.Format(LOGINSERVER_URL, "https://app4.bewoplaner.de");
loginurl = string.Format(LOGINSERVER_URL, "http://localhost:3777/Host");
if(server.IndexOf("localhost") > 0)
loginurl = string.Format(LOGINSERVER_URL, $"http://{server}/Host");
#endif
bool successful = false;
bool successful;
byte[] result;
string result_str;
try
{
@@ -164,9 +166,8 @@ namespace Host
nvc.Add("username", gkv_request.Username);
nvc.Add("tenant", gkv_request.Tenant);
var loginresponse = client.UploadValues(loginurl, "POST", nvc);
successful = BitConverter.ToBoolean(loginresponse, 0);
result = client.UploadValues(loginurl, "POST", nvc);
result_str = Encoding.Default.GetString(result);
}
}
catch (Exception e)
@@ -174,6 +175,8 @@ namespace Host
throw new DakotaException($"loginurl: {loginurl} | " + e.ToString());
}
successful = Convert.ToBoolean(result_str);
return successful;
}
@@ -186,16 +189,16 @@ namespace Host
try
{
SaveFileInFileSystem(req, true);
var finalpath = SaveFileInFileSystem(req);
req.GkvTransferProtokoll.SentSuccess = true;
req.GkvTransferProtokoll.SentApp8Success = true;
response.Success = true;
}
catch (DakotaException e)
{
protokoll.ResultType = GkvTransferResultType.Soft;
protokoll.Fehlerdatum = DateTime.Now;
protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft;
protokoll.Fehlertitel = "App8";
protokoll.Fehlernachricht = e.Message;
@@ -203,8 +206,8 @@ namespace Host
}
catch (Exception e)
{
protokoll.ResultType = GkvTransferResultType.Soft;
protokoll.Fehlerdatum = DateTime.Now;
protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft;
protokoll.Fehlertitel = "App8";
protokoll.Fehlernachricht = e.Message;
@@ -221,7 +224,7 @@ namespace Host
var tuple_count = req.Oids.Length;
response.Fehler = new GkvApp8FehlerDC[tuple_count];
response.Result = new GkvApp8ResultDC[tuple_count];
try
{
@@ -235,7 +238,7 @@ namespace Host
if (results.TryGetValue(gkv_transfer_oid, out var fehlerDC))
{
response.Fehler[i] = fehlerDC;
response.Result[i] = fehlerDC;
}
}
@@ -278,24 +281,13 @@ namespace Host
SendResponse(response);
}
private string SaveFileInFileSystem(GkvApp8SendNewRequest req, bool debug_mode = false)
private string SaveFileInFileSystem(GkvApp8SendNewRequest req)
=> SaveFileInFileSystem(req.GkvTransferProtokoll.GkvTransferProtokollOid.Value, GkvRequest.Tenant, req.GkvTransferProtokoll.IKDatenannahmestelle, req.GkvTransferProtokoll.Transfername,
req.GkvTransferProtokoll.Nutzdatendatei, req.GkvTransferProtokoll.Auftragsdatei, debug_mode);
private string SaveFileInFileSystem(long protokoll_oid, string tenant, string datenannahmestelle, string transfername, string nutzdaten, string auftragsdatei, bool debug_mode = false)
req.GkvTransferProtokoll.Nutzdatendatei, req.GkvTransferProtokoll.Auftragsdatei);
private string SaveFileInFileSystem(long protokoll_oid, string tenant, string datenannahmestelle, string transfername, string nutzdaten, string auftragsdatei)
{
string root_path;
string file_path;
if (debug_mode)
{
root_path = QueueFolderPath;
file_path = $@"{tenant}_{protokoll_oid}_{datenannahmestelle}_{transfername}";
}
else
{
throw new DakotaException("No Debugmode impl");
//root_path = $@"C:\GkvAbrechnung\{tenant}\{datenannahmestelle}\";
//file_path = $@"{transfername}";
}
string root_path = QueueFolderPath;
string file_path = $@"{tenant}_{protokoll_oid}_{datenannahmestelle}_{transfername}";
Directory.CreateDirectory(root_path);
@@ -316,9 +308,11 @@ namespace Host
private string GetServerFromTenant(string tenant)
{
#if DEBUG
// return "localhost:3777";
#endif
try
{
String url = String.Format(GETSERVER_URL, tenant);
using (WebClient client = new WebClient())
{
@@ -345,15 +339,15 @@ namespace Host
foreach (var file in folder.GetFiles())
{
var xml_obj = GkvApp8FehlerXml.GetFehlerXml(file.FullName);
var xml_obj = GkvApp8ResultXml.GetResultXml(file.FullName);
if (xml_obj is GkvApp8FehlerXml xml && oids.Contains(xml.Oid))
if (xml_obj is GkvApp8ResultXml xml && oids.Contains(xml.Oid))
continue;
file.Delete();
}
}
private Dictionary<long, GkvApp8FehlerDC> GetResultFile(string tenant)
private Dictionary<long, GkvApp8ResultDC> GetResultFile(string tenant)
{
try
{
@@ -372,15 +366,15 @@ namespace Host
return null;
}
var dict = new Dictionary<long, GkvApp8FehlerDC>();
var dict = new Dictionary<long, GkvApp8ResultDC>();
foreach (var file in folder.GetFiles("*.xml"))
{
var xml = GkvApp8FehlerXml.GetFehlerXml(file.FullName);
var xml = GkvApp8ResultXml.GetResultXml(file.FullName);
if (xml is null)
continue;
dict.Add(xml.Oid, GkvApp8FehlerXml.ToDC(xml));
dict.Add(xml.Oid, GkvApp8ResultXml.ToDC(xml));
}
return dict;
}

View File

@@ -23,15 +23,24 @@ namespace Host
if (string.IsNullOrEmpty(password))
password = null;
var user = DAOFactory.UserDAO.FindUserByLoginName(username);
var b = false;
try
{
var user = DAOFactory.UserDAO.FindUserByLoginName(username);
var result = user.BCryptPassword == password;
if (!result)
{
System.Threading.Thread.Sleep(3000);
b = user.BCryptPassword == password;
}
catch(Exception exc)
{
}
if (!b)
{
System.Threading.Thread.Sleep(5000);
}
string result = b ? "True" : "False";
Response.Write(result);
Response.End();
}

View File

@@ -0,0 +1,4 @@
ALTER TABLE `gkvtransferprotokoll`
ADD COLUMN `SentDakotaSuccess` TINYINT NOT NULL DEFAULT 0 AFTER `SentApp8Success`,
CHANGE COLUMN `Fehlerlevel` `ResultType` INT NULL DEFAULT NULL AFTER `SentDakotaSuccess`,
CHANGE COLUMN `SentSuccess` `SentApp8Success` TINYINT NOT NULL DEFAULT 0 ;

View File

@@ -48,32 +48,38 @@ namespace BeWo.Service.DCEntityMapper
{
case BS.Shared.GkvState.NoSend:
isReady = true;
tooltip = "Senden";
break;
case BS.Shared.GkvState.Waiting:
isReady = false;
tooltip = "Warte";
tooltip = "Senden";
break;
case BS.Shared.GkvState.Waiting4Urbelege:
isReady = false;
tooltip = "Warte, Urbelege noch nicht gesendet";
break;
case BS.Shared.GkvState.Error:
isReady = true;
tooltip = "Erneut senden";
break;
case BS.Shared.GkvState.ErrorFatal:
isReady = false;
isReady = true;
tooltip = "Fataler Fehler";
break;
case BS.Shared.GkvState.Paid:
isReady = false;
tooltip = "Bereits bezahlt";
break;
case BS.Shared.GkvState.OldAndNoFeedback:
case BS.Shared.GkvState.WaitingForDakota:
isReady = false;
tooltip = "Informieren sie sich bei der jeweiligen GKV";
tooltip = "Warte auf Übertragung";
break;
case BS.Shared.GkvState.WaitingForKrankenkasse:
isReady = false;
tooltip = "Warte auf Gkv";
break;
case BS.Shared.GkvState.WaitingForKrankenkasseTooLong:
isReady = false;
tooltip = "Informieren sie sich bei der jeweiligen Gkv";
break;
case BS.Shared.GkvState.WaitingForUrbelege:
isReady = false;
tooltip = "Urbelege noch nicht gesendet";
break;
default:
break;
}
if (isReady)

View File

@@ -37,11 +37,12 @@ namespace BeWo.Service.DCEntityMapper
pDataContract.ErstelltAm = pEntity.ErstelltAm;
pDataContract.SentSuccess = pEntity.SentSuccess;
pDataContract.SentApp8Success = pEntity.SentApp8Success;
pDataContract.SentDakotaSuccess = pEntity.SentDakotaSuccess;
pDataContract.HasFehler = pEntity.Fehlerdatum.HasValue || !string.IsNullOrWhiteSpace(pEntity.Fehlernachricht);
//pDataContract.HasFehler = pEntity.Fehlerdatum.HasValue || !string.IsNullOrWhiteSpace(pEntity.Fehlernachricht);
pDataContract.ResultType = pEntity.ResultType;
pDataContract.Fehlerdatum = pEntity.Fehlerdatum;
pDataContract.Fehlerlevel = pEntity.Fehlerlevel;
pDataContract.Fehlernachricht = pEntity.Fehlernachricht;
pDataContract.Fehlertitel = pEntity.Fehlertitel;
@@ -76,9 +77,11 @@ namespace BeWo.Service.DCEntityMapper
pEntity.ErstelltAm = pDataContract.ErstelltAm;
pEntity.SentSuccess = pDataContract.SentSuccess;
pEntity.SentApp8Success = pDataContract.SentApp8Success;
pEntity.SentDakotaSuccess = pDataContract.SentDakotaSuccess;
pEntity.ResultType = pDataContract.ResultType;
pEntity.Fehlerdatum = pDataContract.Fehlerdatum;
pEntity.Fehlerlevel = pDataContract.Fehlerlevel;
pEntity.Fehlernachricht = pDataContract.Fehlernachricht;
pEntity.Fehlertitel = pDataContract.Fehlertitel;

View File

@@ -905,9 +905,9 @@ namespace BeWo.Service.ServiceImplementations
var entity = DAOFactory.GenericDAO.LoadByID<GkvAbrechnung>(oid);
var state = GkvAbrechnung.GetState(entity);
var state = entity.GetState();
if (state == GkvState.Waiting || state == GkvState.OldAndNoFeedback || state == GkvState.Paid)
if (entity.IsWaiting() || state == GkvState.Paid)
{
response.Message = "Validierung fehlgeschlagen";
return response;
@@ -940,15 +940,15 @@ namespace BeWo.Service.ServiceImplementations
}
catch (DakotaException de)
{
protokoll.ResultType = GkvTransferResultType.Soft;
protokoll.Fehlerdatum = DateTime.Now;
protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft;
protokoll.Fehlernachricht = de.Message;
protokoll.Fehlertitel = de.Title ?? "Default";
}
catch (Exception e)
{
protokoll.ResultType = GkvTransferResultType.Fatal;
protokoll.Fehlerdatum = DateTime.Now;
protokoll.Fehlerlevel = GkvTransferFehlerlevel.Fatal;
protokoll.Fehlernachricht = e.ToString();
protokoll.Fehlertitel = "Erstellung (kritisch)";
}
@@ -1079,7 +1079,7 @@ namespace BeWo.Service.ServiceImplementations
var datenaustauschref = DAOFactory.SearchDAO.GetNextDatenaustauschreferenz(datenannahmestelle);
int transfernummer;
var state = GkvAbrechnung.GetState(gkvAbrechnung);
var state = gkvAbrechnung.GetState();
if (state == GkvState.NoSend)
{
@@ -1115,14 +1115,9 @@ namespace BeWo.Service.ServiceImplementations
var request_app8 = new GkvApp8SendNewRequest
{
SendDirect = true,
GkvTransferProtokoll = gkv_transfer_dc
};
#if DEBUG
request_app8.SendDirect = false;
#endif
var response_app8 = SendApp8Request<GkvApp8SendNewRequest, GkvApp8SendNewResponse>(request_app8);
if (!response_app8.Success)
@@ -1173,21 +1168,21 @@ namespace BeWo.Service.ServiceImplementations
for (int id = 0; id < updateables_len; id++)
{
var gkv_abrechnung = updateables[id];
var fehler = response_app8.Fehler[id];
var result = response_app8.Result[id];
if (fehler is null)
if (result is null)
continue;
allAreUpToDate = false;
var gkv_abrechnung_entity = DAOFactory.GenericDAO.LoadByID<GkvAbrechnung>(gkv_abrechnung.GkvAbrechnungOid.Value);
var protokoll = gkv_abrechnung_entity.GkvTransferProtokolle.First(x => x.Oid == fehler.Oid);
var protokoll = gkv_abrechnung_entity.GkvTransferProtokolle.First(x => x.Oid == result.Oid);
protokoll.Fehlerdatum = fehler.Datum;
protokoll.Fehlerlevel = fehler.Level;
protokoll.Fehlernachricht = fehler.Nachricht;
protokoll.Fehlertitel = fehler.Titel;
protokoll.ResultType = result.ResultType;
protokoll.Fehlerdatum = result.Datum;
protokoll.Fehlernachricht = result.Nachricht;
protokoll.Fehlertitel = result.Titel;
DAOFactory.GenericDAO.Update(gkv_abrechnung_entity);
}
@@ -1226,15 +1221,13 @@ namespace BeWo.Service.ServiceImplementations
return SendApp8Request<GkvApp8GetIKRequest, GkvApp8GetIKResponse>(request);
}
private T2 SendApp8Request<T, T2>(T request, string url = null) where T : GkvApp8Request where T2 : GkvApp8Response
private T2 SendApp8Request<T, T2>(T request) where T : GkvApp8Request where T2 : GkvApp8Response
{
if (url == null)
{
url = "https://app8.bewoplaner.de/service/GkvAbrechnungView.aspx";
string url = "https://app8.bewoplaner.de/service/GkvAbrechnungView.aspx";
#if DEBUG
url = "http://localhost:3777/Host/GkvAbrechnungView.aspx";
url = "http://localhost:3777/Host/GkvAbrechnungView.aspx";
#endif
}
var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser;
if (user == null)

View File

@@ -1268,7 +1268,7 @@ namespace BS.Shared
GetIKNumber
}
public enum GkvTransferFehlerlevel
public enum GkvTransferResultType
{
None = 0, // Kein Fehler
Soft = 1, // Kann erneut senden
@@ -1278,12 +1278,13 @@ namespace BS.Shared
public enum GkvState
{
NoSend,
Waiting,
Waiting4Urbelege,
Error,
ErrorFatal,
Paid,
OldAndNoFeedback
WaitingForDakota,
WaitingForKrankenkasse,
WaitingForKrankenkasseTooLong,
WaitingForUrbelege,
}
public enum GkvVerfahrensstufe

View File

@@ -1,56 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Interface;
namespace BS.Shared.DataContracts.GkvAbrechnung
{
[DataContract]
public class GkvAbrechnungDC : IDataContract
{
[DataMember]
public long? GkvAbrechnungOid { get; set; }
[DataContract]
public class GkvAbrechnungDC : IDataContract, IGkvAbrechnung
{
[DataMember] public long? GkvAbrechnungOid { get; set; }
[DataMember] public long? GkvAbrechnungVersion { get; set; }
[DataMember] public string Notice { get; set; }
[DataMember] public DateTime? AbrechnungsZeitraumStart { get; set; }
[DataMember] public DateTime? AbrechnungsZeitraumEnde { get; set; }
[DataMember] public decimal Betrag { get; set; }
[DataMember] public bool Bezahlt { get; set; }
[DataMember] public bool UrbelegeGesendet { get; set; }
[DataMember] public DateTime ErstelltAm { get; set; }
[DataMember] public GkvVerfahrensstufe Verfahrensstufe { get; set; }
[DataMember] public IList<InvoiceBaseDC> InvoiceBases { get; set; }
[DataMember] public OrganisationDC Organisation { get; set; }
[DataMember] public IList<GkvTransferProtokollDC> TransferProtokolle { get; set; }
[DataMember] public bool IsReady2Send { get; set; }
[DataMember] public string SendTooltip { get; set; }
[DataMember]
public long? GkvAbrechnungVersion { get; set; }
[DataMember]
public string Notice { get; set; }
[DataMember]
public DateTime? AbrechnungsZeitraumStart { get; set; }
[DataMember]
public DateTime? AbrechnungsZeitraumEnde { get; set; }
[DataMember]
public decimal Betrag { get; set; }
[DataMember]
public bool Bezahlt { get; set; }
[DataMember]
public bool UrbelegeGesendet { get; set; }
[DataMember]
public DateTime ErstelltAm { get; set; }
[DataMember]
public GkvVerfahrensstufe Verfahrensstufe { get; set; }
[DataMember]
public IList<InvoiceBaseDC> InvoiceBases { get; set; }
[DataMember]
public OrganisationDC Organisation { get; set; }
[DataMember]
public IList<GkvTransferProtokollDC> TransferProtokolle { get; set; }
[DataMember]
public bool IsReady2Send { get; set; }
[DataMember]
public string SendTooltip { get; set; }
}
public IGkvTransferProtokoll LastTransferProtokoll => TransferProtokolle?.Last();
}
}

View File

@@ -1,29 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace BS.Shared.DataContracts.GkvAbrechnung
{
[DataContract]
public class GkvApp8FehlerDC
{
[DataMember]
public long Oid { get; set; }
[DataMember]
public string Titel { get; set; }
[DataMember]
public DateTime? Datum { get; set; }
[DataMember]
public string Nachricht { get; set; }
[DataMember]
public GkvTransferFehlerlevel Level { get; set; }
}
}

View File

@@ -10,7 +10,7 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
public class GkvApp8GetStatusResponse : GkvApp8Response
{
[DataMember]
public GkvApp8FehlerDC[] Fehler { get; set; }
public GkvApp8ResultDC[] Result { get; set; }
public GkvApp8GetStatusResponse()
{

View File

@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace BS.Shared.DataContracts.GkvAbrechnung
{
[DataContract]
public class GkvApp8ResultDC
{
[DataMember] public long Oid { get; set; }
[DataMember] public string Titel { get; set; }
[DataMember] public DateTime? Datum { get; set; }
[DataMember] public string Nachricht { get; set; }
[DataMember] public GkvTransferResultType ResultType { get; set; }
}
}

View File

@@ -10,8 +10,8 @@ using System.Xml.Serialization;
namespace BS.Shared.DataContracts.GkvAbrechnung
{
[Serializable()]
[XmlRoot("Fehler")]
public class GkvApp8FehlerXml
[XmlRoot("Result")]
public class GkvApp8ResultXml
{
[XmlAttribute("Oid")]
public long Oid { get; set; }
@@ -28,33 +28,33 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[XmlElement("Level")]
public int Level { get; set; }
public static GkvApp8FehlerXml Parse(XElement element)
public static GkvApp8ResultXml Parse(XElement element)
{
var serializer = new XmlSerializer(typeof(GkvApp8FehlerXml));
return (GkvApp8FehlerXml)serializer.Deserialize(element.CreateReader());
var serializer = new XmlSerializer(typeof(GkvApp8ResultXml));
return (GkvApp8ResultXml)serializer.Deserialize(element.CreateReader());
}
public static GkvApp8FehlerDC ToDC(GkvApp8FehlerXml fehler)
public static GkvApp8ResultDC ToDC(GkvApp8ResultXml fehler)
{
var dc = new GkvApp8FehlerDC();
var dc = new GkvApp8ResultDC();
dc.Oid = fehler.Oid;
dc.Titel = fehler.Titel;
dc.Datum = fehler.Datum;
dc.Nachricht = fehler.Nachricht;
dc.Level = (GkvTransferFehlerlevel)fehler.Level;
dc.ResultType = (GkvTransferResultType)fehler.Level;
return dc;
}
public static GkvApp8FehlerXml GetFehlerXml(string file_path)
public static GkvApp8ResultXml GetResultXml(string file_path)
{
try
{
using (var stream = File.OpenRead(file_path))
{
var serializer = new XmlSerializer(typeof(GkvApp8FehlerXml));
return serializer.Deserialize(stream) as GkvApp8FehlerXml;
var serializer = new XmlSerializer(typeof(GkvApp8ResultXml));
return serializer.Deserialize(stream) as GkvApp8ResultXml;
}
}
catch (Exception)

View File

@@ -12,9 +12,6 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[DataMember]
public GkvTransferProtokollDC GkvTransferProtokoll { get; set; }
[DataMember]
public bool SendDirect { get; set; }
public GkvApp8SendNewRequest()
{
Type = GkvAbrechnungApp8RequestTypeDC.SendNew;

View File

@@ -2,88 +2,41 @@ using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Interface;
namespace BS.Shared.DataContracts.GkvAbrechnung
{
[DataContract]
public class GkvTransferProtokollDC : IDataContract
{
[DataMember]
public long? GkvTransferProtokollOid { get; set; }
[DataContract]
public class GkvTransferProtokollDC : IDataContract, IGkvTransferProtokoll
{
[DataMember] public long? GkvTransferProtokollOid { get; set; }
[DataMember] public long? GkvTransferProtokollVersion { get; set; }
[DataMember] public string Notice { get; set; }
[DataMember] public long GkvAbrechnungOid { get; set; }
[DataMember] public string AbsenderBezeichnung { get; set; }
[DataMember] public string EmpfangerBezeichnung { get; set; }
[DataMember] public string IKLeistungserbringer { get; set; }
[DataMember] public string IKKrankenkasse { get; set; }
[DataMember] public string IKKostentrager { get; set; }
[DataMember] public string IKDatenannahmestelle { get; set; }
[DataMember] public string Rechnungsnummer { get; set; }
[DataMember] public int Datenaustauschreferenz { get; set; }
[DataMember] public int Transfernummer { get; set; }
[DataMember] public string Transfername { get; set; }
[DataMember] public DateTime? ErstelltAm { get; set; }
[DataMember] public string Dateityp { get; set; }
[DataMember] public string Dateiname { get; set; }
[DataMember] public int Dateigrosse { get; set; }
[DataMember] public string Nutzdatendatei { get; set; }
[DataMember] public string Auftragsdatei { get; set; }
[DataMember] public bool SentApp8Success { get; set; }
[DataMember] public bool SentDakotaSuccess { get; set; }
//[DataMember]
//public bool HasFehler { get; set; }
[DataMember]
public long? GkvTransferProtokollVersion { get; set; }
[DataMember]
public string Notice { get; set; }
[DataMember]
public long GkvAbrechnungOid { get; set; }
[DataMember]
public string AbsenderBezeichnung { get; set; }
[DataMember]
public string EmpfangerBezeichnung { get; set; }
[DataMember]
public string IKLeistungserbringer { get; set; }
[DataMember]
public string IKKrankenkasse { get; set; }
[DataMember]
public string IKKostentrager { get; set; }
[DataMember]
public string IKDatenannahmestelle { get; set; }
[DataMember]
public string Rechnungsnummer { get; set; }
[DataMember]
public int Datenaustauschreferenz { get; set; }
[DataMember]
public int Transfernummer { get; set; }
[DataMember]
public string Transfername { get; set; }
[DataMember]
public DateTime? ErstelltAm { get; set; }
[DataMember]
public string Dateityp { get; set; }
[DataMember]
public string Dateiname { get; set; }
[DataMember]
public int Dateigrosse { get; set; }
[DataMember]
public string Nutzdatendatei { get; set; }
[DataMember]
public string Auftragsdatei { get; set; }
[DataMember]
public bool SentSuccess { get; set; }
[DataMember]
public bool HasFehler { get; set; }
[DataMember]
public string Fehlertitel { get; set; }
[DataMember]
public DateTime? Fehlerdatum { get; set; }
[DataMember]
public string Fehlernachricht { get; set; }
[DataMember]
public GkvTransferFehlerlevel Fehlerlevel { get; set; }
}
[DataMember] public GkvTransferResultType? ResultType { get; set; }
[DataMember] public string Fehlertitel { get; set; }
[DataMember] public DateTime? Fehlerdatum { get; set; }
[DataMember] public string Fehlernachricht { get; set; }
}
}

View File

@@ -26,7 +26,7 @@ namespace BS.Shared.DataContracts
public string CreatorLastName { get; set; }
[DataMember]
public bool IsAlreadyInActiveGkvAbrechnung { get; set; }
public bool? IsAlreadyInActiveGkvAbrechnung { get; set; }
[DataMember]
public bool IsGkvValid { get; set; }

View File

@@ -1,4 +1,5 @@
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -7,80 +8,52 @@ using System.Threading.Tasks;
namespace BS.Shared.Extensions
{
public static class GkvAbrechnungExtensions
{
/// <summary>
/// Lässt sich besser über Interface lösen....
/// </summary>
/// <param name="gkvAbrechnungDC"></param>
/// <returns></returns>
public static GkvState GetState(this GkvAbrechnungDC gkvAbrechnungDC) => GetState(
gkvAbrechnungDC,
() => gkvAbrechnungDC.Bezahlt,
() => gkvAbrechnungDC.UrbelegeGesendet,
() => gkvAbrechnungDC.TransferProtokolle,
(x) => x.Fehlerdatum,
(x) => x.Fehlerlevel,
(x) => x.ErstelltAm.Value);
public static class GkvAbrechnungExtensions
{
public static GkvState GetState(this IGkvAbrechnung gkvAbrechnung)
{
if (gkvAbrechnung.Bezahlt)
return GkvState.Paid;
public static GkvState GetState<T2>(
object gkvAbrechnung,
Func<bool> bezahlt,
Func<bool> urbelege,
Func<IList<T2>> protokoll,
Func<T2, DateTime?> fehlerdatum,
Func<T2, GkvTransferFehlerlevel> fehlerlevel,
Func<T2, DateTime> created)
{
if (gkvAbrechnung is null)
throw new ArgumentNullException(nameof(gkvAbrechnung));
if (gkvAbrechnung.LastTransferProtokoll is null)
return GkvState.NoSend;
if (bezahlt())
return GkvState.Paid;
if (gkvAbrechnung.LastTransferProtokoll.ResultType == GkvTransferResultType.Soft)
return GkvState.Error;
var protokolle = protokoll();
if (protokolle is null || !protokolle.Any())
return GkvState.NoSend;
if (gkvAbrechnung.LastTransferProtokoll.ResultType == GkvTransferResultType.Fatal)
return GkvState.ErrorFatal;
var last_transfer = protokolle.Last();
if (fehlerdatum(last_transfer).HasValue)
{
if (fehlerlevel(last_transfer) == GkvTransferFehlerlevel.Fatal)
return GkvState.ErrorFatal;
else
return GkvState.Error;
}
if (gkvAbrechnung.LastTransferProtokoll.ResultType is null)
return GkvState.WaitingForDakota;
// Kein Fehler
if (!urbelege())
return GkvState.Waiting4Urbelege;
if (!gkvAbrechnung.UrbelegeGesendet)
return GkvState.WaitingForUrbelege;
if (DateTime.Now - created(last_transfer) > TimeSpan.FromDays(28))
{
return GkvState.OldAndNoFeedback;
}
if (DateTime.Now - gkvAbrechnung.ErstelltAm <= TimeSpan.FromDays(28))
return GkvState.WaitingForKrankenkasse;
return GkvState.Waiting;
}
return GkvState.WaitingForKrankenkasseTooLong;
}
public static bool IsWaiting(this GkvAbrechnungDC gkvAbrechnungDC)
{
var state = gkvAbrechnungDC.GetState();
public static bool IsWaiting(this IGkvAbrechnung gkvAbrechnung)
=> gkvAbrechnung.GetState().IsWaiting();
public static bool IsWaiting(this GkvState state)
{
if (state == GkvState.WaitingForKrankenkasse || state == GkvState.WaitingForKrankenkasseTooLong)
return true;
if (state == GkvState.Waiting || state == GkvState.OldAndNoFeedback)
return true;
return false;
}
return false;
}
public static bool IsSent(this IGkvAbrechnung gkvAbrechnung)
{
return gkvAbrechnung.LastTransferProtokoll is object;
}
public static bool IsSend(this GkvAbrechnungDC gkvAbrechnung)
{
return gkvAbrechnung.TransferProtokolle is object && gkvAbrechnung.TransferProtokolle.Any();
}
public static bool IsUpToDate(this GkvAbrechnungDC gkvAbrechnungDC, GkvAbrechnungDC compareTo)
{
return gkvAbrechnungDC.GetState() == compareTo.GetState();
}
}
public static bool IsSameState(this IGkvAbrechnung gkvAbrechnung, IGkvAbrechnung compareTo)
{
return gkvAbrechnung.GetState() == compareTo.GetState();
}
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BS.Shared.Interface
{
public interface IGkvAbrechnung
{
bool Bezahlt { get; set; }
bool UrbelegeGesendet { get; set; }
DateTime ErstelltAm { get; set; }
IGkvTransferProtokoll LastTransferProtokoll { get; }
}
}

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BS.Shared.Interface
{
public interface IGkvTransferProtokoll
{
GkvTransferResultType? ResultType { get; set; }
}
}

View File

@@ -200,8 +200,8 @@
<Compile Include="DataContracts\DokumentvorlageDC.cs" />
<Compile Include="DataContracts\AdditionalServiceNoticeDC.cs" />
<Compile Include="DataContracts\GeschenkterUrlaubstagDC.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvApp8FehlerDC.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvApp8FehlerXml.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvApp8ResultDC.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvApp8ResultXml.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvApp8SendNewResponse.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvTransferProtokollDC.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvApp8GetIKRequest.cs" />
@@ -347,6 +347,8 @@
<Compile Include="Extensions\ICollectionExtensions.cs" />
<Compile Include="Extensions\IDictionaryTExtensions.cs" />
<Compile Include="Extensions\TimeIntervalExtensions.cs" />
<Compile Include="Interface\IGkvAbrechnung.cs" />
<Compile Include="Interface\IGkvTransferProtokoll.cs" />
<Compile Include="Packet.cs" />
<Compile Include="Rss\RssManager.cs" />
<Compile Include="Services\BillingData.cs" />