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 = ""; String url = "";
#if DEBUG #if DEBUG
url = String.Format("http://localhost:3777/Host"); //url = String.Format("http://localhost:3777/Host");
//return new Uri("https://app5.bewoplaner.de/service"); //return new Uri("https://app5.bewoplaner.de/service");
//url = String.Format("app1.bewoplaner.de/service"); //url = String.Format("app1.bewoplaner.de/service");
#endif #endif

View File

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

View File

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

View File

@@ -2097,7 +2097,7 @@ namespace BeWo.ServiceProxy
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.InvoiceNumberDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.InvoiceNumberDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<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.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.GkvAbrechnungApp8RequestTypeDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC>))] [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(BS.Shared.DataContracts.InvoiceNumberDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<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.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.GkvAbrechnungApp8RequestTypeDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC>))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC>))]

View File

@@ -58,7 +58,7 @@
x:Name="radioFilterByAccountingDate" x:Name="radioFilterByAccountingDate"
Click="radioFilterByInvoiceDate_Click" Click="radioFilterByInvoiceDate_Click"
Content="Nach Abrechnungszeitraum filtern" 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> </StackPanel>
<Grid Grid.Column="2"> <Grid Grid.Column="2">
<Grid.Resources> <Grid.Resources>

View File

@@ -121,18 +121,28 @@ namespace BeWo.View.Detail.Accounting
} }
private void NewGkvAbrechnungPopUpViewCreateButtonClicked(object sender, EventArgs<GkvAbrechnungDC> e) 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); // 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; 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(); MainControl.CloseCurrentPopUp();
var gkv_abrechnung = e.Data; var gkv_abrechnung = e.Data;
var gkv_filter = new GkvAbrechnungRequestDC(gkv_abrechnung); 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), ServiceFacade.DoAccountingServiceAsync(x => x.CreateNewGkvAbrechnung(gkv_filter),
cb => Dispatcher.BeginInvoke(DispatcherPriority.Normal, cb => Dispatcher.BeginInvoke(DispatcherPriority.Normal,
@@ -205,24 +215,6 @@ namespace BeWo.View.Detail.Accounting
can_send |= state == GkvState.ErrorFatal; can_send |= state == GkvState.ErrorFatal;
#endif #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?"; string text = "Sind Sie sicher, dass Sie die gewählte GKV-Abrechnung senden möchten?";
if (state == GkvState.Error) if (state == GkvState.Error)
@@ -306,12 +298,12 @@ namespace BeWo.View.Detail.Accounting
if (gkvAbrechnungVM is null) if (gkvAbrechnungVM is null)
return; return;
if (gkvAbrechnungVM.GkvState == GkvState.OldAndNoFeedback) if (gkvAbrechnungVM.GkvState == GkvState.WaitingForKrankenkasseTooLong)
{ {
e.Result = Brushes.Orange; e.Result = Brushes.Orange;
e.Handled = true; e.Handled = true;
} }
else if (gkvAbrechnungVM.GkvState == GkvState.Waiting4Urbelege) else if (gkvAbrechnungVM.GkvState == GkvState.WaitingForUrbelege)
{ {
e.Result = Brushes.Green; e.Result = Brushes.Green;
e.Handled = true; e.Handled = true;

View File

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

View File

@@ -162,7 +162,7 @@ namespace BeWo.View.Detail.Accounting
{ {
_LoadedInvoiceBaseOid = costOid; _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) private void IKRequestCallback(GkvApp8GetIKRequest req, GkvApp8GetIKResponse response)
{ {
if(response is null || !response.Success)
{
MessageBox.Show($"Interner Serverfehler.", "Fehler");
return;
}
if (!response.Gefunden) if (!response.Gefunden)
{ {
MessageBox.Show($"Für die Organisation mit dem IK \"{req.IKKrankenkasse}\" und Leistungserbringergruppe \"{req.Leistungserbringergruppe}\" konnte keine Datenannahmestelle gefunden werden. " + 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 " + $"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; return;
} }

View File

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

View File

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

View File

@@ -13,13 +13,15 @@
<basicHttpBinding> <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"> <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" /> <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--> <!-- mode="Transport" für https und "None" sonst-->
</binding> </binding>
<binding name="BeWoStreamingEndpoint" receiveTimeout="10:10:00" sendTimeout="10:01:00" maxBufferSize="65536" maxReceivedMessageSize="67108864" transferMode="StreamedRequest" useDefaultWebProxy="true" messageEncoding="Text"> <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" /> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None" /> <!--<security mode="None" />-->
<!-- mode="Transport" für https --> <security mode="Transport" />
<!-- mode="Transport" für https und "None" sonst-->
</binding> </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"> <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" /> <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />

View File

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

View File

@@ -198,7 +198,12 @@ namespace DakotaSender
error = e.ToString(); 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); PrintLine(error);
MoveQueueToFailed(file); MoveQueueToFailed(file);
@@ -206,8 +211,12 @@ namespace DakotaSender
if (copied) if (copied)
DeleteDakotaFile(file); DeleteDakotaFile(file);
CreateResultXmlFile(file, error); CreateResultFehlerXmlFile(file, error);
} }
else
{
CreateResultSuccessXmlFile(file);
}
} }
static string ProcessFile(DakotaSystemFile file, out bool copied) static string ProcessFile(DakotaSystemFile file, out bool copied)
{ {
@@ -233,7 +242,7 @@ namespace DakotaSender
DeleteDakotaFile(file); DeleteDakotaFile(file);
return null; return string.Empty;
} }
if (!AcceptSendCodes.Contains(code)) if (!AcceptSendCodes.Contains(code))
@@ -243,24 +252,29 @@ namespace DakotaSender
DeleteQueueFile(file); DeleteQueueFile(file);
return null; 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; var result = new ResultXml();
fehler.Titel = "Dakota Fehler";
fehler.Nachricht = error; result.Datum = DateTime.Now;
fehler.Level = 1; result.Titel = title;
fehler.Oid = file.ProtokollOid; result.Nachricht = nachricht;
result.Level = fehler_level;
result.Oid = file.ProtokollOid;
var folder = GetResultFolderTenant(file.Tenant).FullName; var folder = GetResultFolderTenant(file.Tenant).FullName;
var path = Path.Combine(folder, $"P{file.ProtokollOid}.xml"); 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."); PrintLine("Ok.");
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -5940,7 +5940,7 @@ namespace BeWo.Data.Access
public int GetNextDatenaustauschreferenz(string datenannahmestelle) public int GetNextDatenaustauschreferenz(string datenannahmestelle)
{ {
var criteria = CreateCriteria<GkvTransferProtokoll>() 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")); .SetProjection(Projections.Max("Datenaustauschreferenz"));
var t = criteria.List<int?>().SingleOrDefault(); var t = criteria.List<int?>().SingleOrDefault();
@@ -5951,7 +5951,7 @@ namespace BeWo.Data.Access
public int GetNextTransfernummer(string datenannahmestelle) public int GetNextTransfernummer(string datenannahmestelle)
{ {
var criteria = CreateCriteria<GkvTransferProtokoll>() 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")); .SetProjection(Projections.Max("Transfernummer"));
var t = criteria.List<int?>().SingleOrDefault(); var t = criteria.List<int?>().SingleOrDefault();

View File

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

View File

@@ -2,10 +2,11 @@
using System.Collections.Generic; using System.Collections.Generic;
using BS.Shared; using BS.Shared;
using BS.Shared.Interface;
namespace BeWo.Data.Entities namespace BeWo.Data.Entities
{ {
public class GkvTransferProtokoll : BeWoEntityBase public class GkvTransferProtokoll : BeWoEntityBase, IGkvTransferProtokoll
{ {
public GkvTransferProtokoll() public GkvTransferProtokoll()
{ {
@@ -36,11 +37,12 @@ namespace BeWo.Data.Entities
public virtual string Nutzdatendatei { get; set; } public virtual string Nutzdatendatei { get; set; }
public virtual string Auftragsdatei { 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 string Fehlertitel { get; set; }
public virtual DateTime? Fehlerdatum { get; set; } public virtual DateTime? Fehlerdatum { get; set; }
public virtual string Fehlernachricht { 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="Transfernummer" type="int" name="Transfernummer" />
<property column="ErstelltAm" type="DateTime" name="ErstelltAm" /> <property column="ErstelltAm" type="DateTime" name="ErstelltAm" />
<property column="SentSuccess" type="Boolean" name="SentSuccess" /> <property column="SentApp8Success" type="Boolean" name="SentApp8Success" />
<property column="Fehlertitel" type="string" name="Fehlertitel" /> <property column="SentDakotaSuccess" type="Boolean" name="SentDakotaSuccess" />
<property column="Fehlerdatum" type="DateTime" name="Fehlerdatum" /> <property column="ResultType" type="BS.Shared.GkvTransferResultType, BS.Shared" name="ResultType" />
<property column="Fehlernachricht" type="string" name="Fehlernachricht" /> <property column="Fehlertitel" type="string" name="Fehlertitel" />
<property column="Fehlerlevel" type="BS.Shared.GkvTransferFehlerlevel, BS.Shared" name="Fehlerlevel" /> <property column="Fehlerdatum" type="DateTime" name="Fehlerdatum" />
<property column="Fehlernachricht" type="string" name="Fehlernachricht" />
</class> </class>
</hibernate-mapping> </hibernate-mapping>

View File

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

View File

@@ -23,15 +23,24 @@ namespace Host
if (string.IsNullOrEmpty(password)) if (string.IsNullOrEmpty(password))
password = null; password = null;
var user = DAOFactory.UserDAO.FindUserByLoginName(username); var b = false;
try
{
var user = DAOFactory.UserDAO.FindUserByLoginName(username);
var result = user.BCryptPassword == password; b = user.BCryptPassword == password;
}
if (!result) catch(Exception exc)
{ {
System.Threading.Thread.Sleep(3000);
} }
if (!b)
{
System.Threading.Thread.Sleep(5000);
}
string result = b ? "True" : "False";
Response.Write(result); Response.Write(result);
Response.End(); 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: case BS.Shared.GkvState.NoSend:
isReady = true; isReady = true;
tooltip = "Senden"; tooltip = "Senden";
break;
case BS.Shared.GkvState.Waiting:
isReady = false;
tooltip = "Warte";
break; break;
case BS.Shared.GkvState.Waiting4Urbelege:
isReady = false;
tooltip = "Warte, Urbelege noch nicht gesendet";
break;
case BS.Shared.GkvState.Error: case BS.Shared.GkvState.Error:
isReady = true; isReady = true;
tooltip = "Erneut senden"; tooltip = "Erneut senden";
break; break;
case BS.Shared.GkvState.ErrorFatal: case BS.Shared.GkvState.ErrorFatal:
isReady = false; isReady = true;
tooltip = "Fataler Fehler"; tooltip = "Fataler Fehler";
break; break;
case BS.Shared.GkvState.Paid: case BS.Shared.GkvState.Paid:
isReady = false; isReady = false;
tooltip = "Bereits bezahlt"; tooltip = "Bereits bezahlt";
break; break;
case BS.Shared.GkvState.OldAndNoFeedback: case BS.Shared.GkvState.WaitingForDakota:
isReady = false; isReady = false;
tooltip = "Informieren sie sich bei der jeweiligen GKV"; tooltip = "Warte auf Übertragung";
break; 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) if (isReady)

View File

@@ -37,11 +37,12 @@ namespace BeWo.Service.DCEntityMapper
pDataContract.ErstelltAm = pEntity.ErstelltAm; 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.Fehlerdatum = pEntity.Fehlerdatum;
pDataContract.Fehlerlevel = pEntity.Fehlerlevel;
pDataContract.Fehlernachricht = pEntity.Fehlernachricht; pDataContract.Fehlernachricht = pEntity.Fehlernachricht;
pDataContract.Fehlertitel = pEntity.Fehlertitel; pDataContract.Fehlertitel = pEntity.Fehlertitel;
@@ -76,9 +77,11 @@ namespace BeWo.Service.DCEntityMapper
pEntity.ErstelltAm = pDataContract.ErstelltAm; 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.Fehlerdatum = pDataContract.Fehlerdatum;
pEntity.Fehlerlevel = pDataContract.Fehlerlevel;
pEntity.Fehlernachricht = pDataContract.Fehlernachricht; pEntity.Fehlernachricht = pDataContract.Fehlernachricht;
pEntity.Fehlertitel = pDataContract.Fehlertitel; pEntity.Fehlertitel = pDataContract.Fehlertitel;

View File

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

View File

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

View File

@@ -1,56 +1,31 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using BS.Shared.DataContracts.Compact; using BS.Shared.DataContracts.Compact;
using BS.Shared.Interface;
namespace BS.Shared.DataContracts.GkvAbrechnung namespace BS.Shared.DataContracts.GkvAbrechnung
{ {
[DataContract] [DataContract]
public class GkvAbrechnungDC : IDataContract public class GkvAbrechnungDC : IDataContract, IGkvAbrechnung
{ {
[DataMember] [DataMember] public long? GkvAbrechnungOid { get; set; }
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 IGkvTransferProtokoll LastTransferProtokoll => TransferProtokolle?.Last();
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; }
}
} }

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

View File

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

View File

@@ -2,88 +2,41 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using BS.Shared.DataContracts.Compact; using BS.Shared.DataContracts.Compact;
using BS.Shared.Interface;
namespace BS.Shared.DataContracts.GkvAbrechnung namespace BS.Shared.DataContracts.GkvAbrechnung
{ {
[DataContract] [DataContract]
public class GkvTransferProtokollDC : IDataContract public class GkvTransferProtokollDC : IDataContract, IGkvTransferProtokoll
{ {
[DataMember] [DataMember] public long? GkvTransferProtokollOid { get; set; }
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] [DataMember] public GkvTransferResultType? ResultType { get; set; }
public long? GkvTransferProtokollVersion { get; set; } [DataMember] public string Fehlertitel { get; set; }
[DataMember] public DateTime? Fehlerdatum { get; set; }
[DataMember] [DataMember] public string Fehlernachricht { get; set; }
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; }
}
} }

View File

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

View File

@@ -1,4 +1,5 @@
using BS.Shared.DataContracts.GkvAbrechnung; using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Interface;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -7,80 +8,52 @@ using System.Threading.Tasks;
namespace BS.Shared.Extensions namespace BS.Shared.Extensions
{ {
public static class GkvAbrechnungExtensions public static class GkvAbrechnungExtensions
{ {
/// <summary> public static GkvState GetState(this IGkvAbrechnung gkvAbrechnung)
/// Lässt sich besser über Interface lösen.... {
/// </summary> if (gkvAbrechnung.Bezahlt)
/// <param name="gkvAbrechnungDC"></param> return GkvState.Paid;
/// <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 GkvState GetState<T2>( if (gkvAbrechnung.LastTransferProtokoll is null)
object gkvAbrechnung, return GkvState.NoSend;
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 (bezahlt()) if (gkvAbrechnung.LastTransferProtokoll.ResultType == GkvTransferResultType.Soft)
return GkvState.Paid; return GkvState.Error;
var protokolle = protokoll(); if (gkvAbrechnung.LastTransferProtokoll.ResultType == GkvTransferResultType.Fatal)
if (protokolle is null || !protokolle.Any()) return GkvState.ErrorFatal;
return GkvState.NoSend;
var last_transfer = protokolle.Last(); if (gkvAbrechnung.LastTransferProtokoll.ResultType is null)
if (fehlerdatum(last_transfer).HasValue) return GkvState.WaitingForDakota;
{
if (fehlerlevel(last_transfer) == GkvTransferFehlerlevel.Fatal)
return GkvState.ErrorFatal;
else
return GkvState.Error;
}
// Kein Fehler if (!gkvAbrechnung.UrbelegeGesendet)
if (!urbelege()) return GkvState.WaitingForUrbelege;
return GkvState.Waiting4Urbelege;
if (DateTime.Now - created(last_transfer) > TimeSpan.FromDays(28)) if (DateTime.Now - gkvAbrechnung.ErstelltAm <= TimeSpan.FromDays(28))
{ return GkvState.WaitingForKrankenkasse;
return GkvState.OldAndNoFeedback;
}
return GkvState.Waiting; return GkvState.WaitingForKrankenkasseTooLong;
} }
public static bool IsWaiting(this GkvAbrechnungDC gkvAbrechnungDC) public static bool IsWaiting(this IGkvAbrechnung gkvAbrechnung)
{ => gkvAbrechnung.GetState().IsWaiting();
var state = gkvAbrechnungDC.GetState(); public static bool IsWaiting(this GkvState state)
{
if (state == GkvState.WaitingForKrankenkasse || state == GkvState.WaitingForKrankenkasseTooLong)
return true;
if (state == GkvState.Waiting || state == GkvState.OldAndNoFeedback) return false;
return true; }
return false; public static bool IsSent(this IGkvAbrechnung gkvAbrechnung)
} {
return gkvAbrechnung.LastTransferProtokoll is object;
}
public static bool IsSend(this GkvAbrechnungDC gkvAbrechnung) public static bool IsSameState(this IGkvAbrechnung gkvAbrechnung, IGkvAbrechnung compareTo)
{ {
return gkvAbrechnung.TransferProtokolle is object && gkvAbrechnung.TransferProtokolle.Any(); return gkvAbrechnung.GetState() == compareTo.GetState();
} }
}
public static bool IsUpToDate(this GkvAbrechnungDC gkvAbrechnungDC, GkvAbrechnungDC compareTo)
{
return gkvAbrechnungDC.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\DokumentvorlageDC.cs" />
<Compile Include="DataContracts\AdditionalServiceNoticeDC.cs" /> <Compile Include="DataContracts\AdditionalServiceNoticeDC.cs" />
<Compile Include="DataContracts\GeschenkterUrlaubstagDC.cs" /> <Compile Include="DataContracts\GeschenkterUrlaubstagDC.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvApp8FehlerDC.cs" /> <Compile Include="DataContracts\GkvAbrechnung\GkvApp8ResultDC.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvApp8FehlerXml.cs" /> <Compile Include="DataContracts\GkvAbrechnung\GkvApp8ResultXml.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvApp8SendNewResponse.cs" /> <Compile Include="DataContracts\GkvAbrechnung\GkvApp8SendNewResponse.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvTransferProtokollDC.cs" /> <Compile Include="DataContracts\GkvAbrechnung\GkvTransferProtokollDC.cs" />
<Compile Include="DataContracts\GkvAbrechnung\GkvApp8GetIKRequest.cs" /> <Compile Include="DataContracts\GkvAbrechnung\GkvApp8GetIKRequest.cs" />
@@ -347,6 +347,8 @@
<Compile Include="Extensions\ICollectionExtensions.cs" /> <Compile Include="Extensions\ICollectionExtensions.cs" />
<Compile Include="Extensions\IDictionaryTExtensions.cs" /> <Compile Include="Extensions\IDictionaryTExtensions.cs" />
<Compile Include="Extensions\TimeIntervalExtensions.cs" /> <Compile Include="Extensions\TimeIntervalExtensions.cs" />
<Compile Include="Interface\IGkvAbrechnung.cs" />
<Compile Include="Interface\IGkvTransferProtokoll.cs" />
<Compile Include="Packet.cs" /> <Compile Include="Packet.cs" />
<Compile Include="Rss\RssManager.cs" /> <Compile Include="Rss\RssManager.cs" />
<Compile Include="Services\BillingData.cs" /> <Compile Include="Services\BillingData.cs" />