- GesendetAm Feld hinzugefügt

- GesendetDisplay mit Senden und Fehlgeschlagen -> erste Fehlererkennung
- Erneutes Senden bekommt speziellen Text
- Bezahlt Flag Fehler
This commit is contained in:
2024-05-07 16:55:53 +02:00
parent 46e3c3f4bd
commit c817b1eacf
12 changed files with 211 additions and 28 deletions

View File

@@ -41,7 +41,7 @@
<dxg:GridControl Margin="3" Grid.ColumnSpan="3" Grid.Row="1" DataSource="{Binding VMList}" x:Name="datagrid_gkvAbrechnungen" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<dxg:GridControl.Columns>
<dxg:GridColumn x:Name="ColumnChecked" FieldName="IsChecked" Header=" " MinWidth="30"></dxg:GridColumn>
<dxg:GridColumn x:Name="ColumnChecked" FieldName="IsChecked" Header=" " MinWidth="30" Visible="False"></dxg:GridColumn>
<dxg:GridColumn x:Name="ColumnButtons" AllowEditing="False" Width="auto" FieldName="ReportLink" Header=" ">
<dxg:GridColumn.DisplayTemplate>
<ControlTemplate>
@@ -113,6 +113,11 @@
<dxe:TextEditSettings HorizontalContentAlignment="Right"/>
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
<dxg:GridColumn ReadOnly="True" AllowEditing="False" FieldName="GesendetDisplay" Header="Gesendet" Width="80">
<dxg:GridColumn.EditSettings>
<dxe:TextEditSettings HorizontalContentAlignment="Right"/>
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
<dxg:GridColumn ReadOnly="True" AllowEditing="False" FieldName="Betrag" Header="Betrag" MinWidth="70">
<dxg:GridColumn.EditSettings>
<dxe:TextEditSettings DisplayFormat="c" Mask="c" MaskType="Numeric" HorizontalContentAlignment="Right"></dxe:TextEditSettings>

View File

@@ -184,13 +184,49 @@ namespace BeWo.View.Detail.Accounting
{
var vm = datagrid_gkvAbrechnungen.GetCurrentValue<GkvAbrechnungVM>();
if (MessageBox.Show("Sind Sie sicher, dass Sie die gewählte GKV-Abrechnung senden möchten?", "GKV-Abrechnung senden", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
string text;
if (vm.GesendetAm.HasValue)
text = "Die gewählte GKV-Abrechnung wurde bereits gesendet. Möchten Sie sie erneut senden?";
else
text = "Sind Sie sicher, dass Sie die gewählte GKV-Abrechnung senden möchten?";
if (MessageBox.Show(text, "GKV-Abrechnung senden", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
vm.IsSendingRequestCurrently = true;
vm.SendAndFailed = false;
var req = new GkvAbrechnungSendRequestDC();
req.GkvAbrechnungDC = vm.CommitToDataContract();
ServiceFacade.DoAccountingServiceAsync(s => s.SendNewGkvAbrechnung(req));
ServiceFacade.DoAccountingServiceAsync(s => s.SendNewGkvAbrechnung(req),
cb =>
{
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
{
vm.IsSendingRequestCurrently = false;
if (cb.Successful)
{
var dc = cb.GkvAbrechnungDC;
vm.GkvAbrechnungVersion = dc.GkvAbrechnungVersion;
vm.GesendetAm = dc.GesendetAm;
vm.AntwortEntschluesseltAm = dc.AntwortEntschluesseltAm;
vm.AntwortErhaltenAm = dc.AntwortErhaltenAm;
vm.UebertragenAm = dc.UebertragenAm;
vm.VerschluesseltAm = dc.VerschluesseltAm;
}
else
{
vm.SendAndFailed = true;
MessageBox.Show(cb.Message);
}
}));
}, false);
}
}
private void btn_delete_Click(object sender, RoutedEventArgs e)
@@ -271,14 +307,16 @@ namespace BeWo.View.Detail.Accounting
var dc = ServiceFacade.DoAccountingServiceSync(x => x.UpdateGkvAbrechnung(dc_in));
vm.Update(dc);
vm.GkvAbrechnungVersion = dc.GkvAbrechnungVersion;
vm.Bezahlt = dc.Bezahlt;
}
private void SaveNoticeChange(GkvAbrechnungVM vm, string notice)
{
var dc = ServiceFacade.DoAccountingServiceSync(x => x.UpdateGkvAbrechnung(vm.CommitToDataContract()));
vm.Update(dc);
vm.GkvAbrechnungVersion = dc.GkvAbrechnungVersion;
vm.Notice = dc.Notice;
}
private void gridView_CellValueChanged_1(object sender, CellValueChangedEventArgs e)

View File

@@ -91,7 +91,7 @@
<dxe:TextEditSettings TextWrapping="Wrap" />
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
<dxg:GridColumn x:Name="PaidColumn" FieldName="IsPaid" Header="Bezahlt"></dxg:GridColumn>
<dxg:GridColumn x:Name="PaidColumn" FieldName="IsPaid" Header="Bezahlt" ReadOnly="True"></dxg:GridColumn>
</dxg:GridControl.Columns>
<dxg:GridControl.View >
<dxg:TableView x:Name="gridView" ShowGroupPanel="False" CellValueChanging="TableView_CellValueChanging"/>

View File

@@ -36,6 +36,7 @@ AntwortEntschluesseltAm
public static string PropertyName_Auftragsdatei = "Auftragsdatei";
public static string PropertyName_Transfername = "Transfername";
public static string PropertyName_GesendetAm = "GesendetAm";
public static string PropertyName_ErstelltAm = "ErstelltAm";
public static string PropertyName_VerschluesseltAm = "VerschluesseltAm";
public static string PropertyName_UebertragenAm = "UebertragenAm";
@@ -59,6 +60,7 @@ AntwortEntschluesseltAm
private string _Transfername;
private int _Datenaustauschreferenz;
private DateTime? _GesendetAm;
private DateTime? _ErstelltAm;
private DateTime? _VerschluesseltAm;
private DateTime? _UebertragenAm;
@@ -69,6 +71,8 @@ AntwortEntschluesseltAm
private bool _Bezahlt;
internal bool _IsChecked;
internal bool _IsSendingRequestCurrently;
internal bool _SendAndFailed;
private List<InvoiceBaseVM> _InvoiceBases2;
private BindingList<InvoiceBaseVM> _InvoiceBases;
@@ -262,6 +266,41 @@ AntwortEntschluesseltAm
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public string GesendetDisplay
{
get
{
if (IsSendingRequestCurrently)
return "Sendet";
if (SendAndFailed)
return "Fehlgeschlagen";
if (GesendetAm.HasValue)
return GesendetAm.Value.ToString();
else
return "-";
}
}
public DateTime? GesendetAm
{
get { return this._GesendetAm; }
set
{
if (this.AreDifferent(this._GesendetAm, value))
{
this._GesendetAm = value;
this.StoreDirtyInformation(this.AreDifferent(this.DataContract.GesendetAm, value), nameof(GesendetAm));
this.FirePropertyChanged(nameof(GesendetAm));
this.FirePropertyChanged(nameof(GesendetDisplay));
}
}
}
[Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)]
public DateTime? VerschluesseltAm
{
@@ -419,6 +458,36 @@ AntwortEntschluesseltAm
}
}
public bool IsSendingRequestCurrently
{
get { return _IsSendingRequestCurrently; }
set
{
if (AreDifferent(_IsSendingRequestCurrently, value))
{
_IsSendingRequestCurrently = value;
FirePropertyChanged("IsSendingRequestCurrently");
FirePropertyChanged("GesendetDisplay");
}
}
}
public bool SendAndFailed
{
get { return _SendAndFailed; }
set
{
if (AreDifferent(_SendAndFailed, value))
{
_SendAndFailed = value;
FirePropertyChanged("SendAndFailed");
FirePropertyChanged("GesendetDisplay");
}
}
}
public List<InvoiceBaseVM> InvoiceBases2
{
get { return _InvoiceBases2; }
@@ -478,6 +547,7 @@ AntwortEntschluesseltAm
_AntwortEntschluesseltAm = pDataContract.AntwortEntschluesseltAm;
_ErstelltAm = pDataContract.ErstelltAm;
_Datenaustauschreferenz = pDataContract.Datenaustauschreferenz;
_GesendetAm = pDataContract.GesendetAm;
_GkvAbrechnungOid = pDataContract.GkvAbrechnungOid;
_GkvAbrechnungVersion = pDataContract.GkvAbrechnungVersion;
@@ -505,11 +575,14 @@ AntwortEntschluesseltAm
pDataContract.Nutzdatendatei = _Nutzdatendatei;
pDataContract.Auftragsdatei = _Auftragsdatei;
pDataContract.Transfername = _Transfername;
pDataContract.VerschluesseltAm = _VerschluesseltAm;
pDataContract.UebertragenAm = _UebertragenAm;
pDataContract.AntwortErhaltenAm = _AntwortErhaltenAm;
pDataContract.AntwortEntschluesseltAm = _AntwortEntschluesseltAm;
pDataContract.ErstelltAm = _ErstelltAm;
pDataContract.GesendetAm = _GesendetAm;
pDataContract.GkvAbrechnungOid = _GkvAbrechnungOid;
pDataContract.GkvAbrechnungVersion = _GkvAbrechnungVersion;
@@ -530,10 +603,11 @@ AntwortEntschluesseltAm
Notice = dc.Notice;
Bezahlt = dc.Bezahlt;
if(Notice != dc.Notice || Bezahlt != dc.Bezahlt)
{
throw new NotImplementedException("Notiz/Bezahlt wurde nicht korrekt übernommen");
}
VerschluesseltAm = dc.VerschluesseltAm;
UebertragenAm = dc.UebertragenAm;
AntwortErhaltenAm = dc.AntwortErhaltenAm;
AntwortEntschluesseltAm = dc.AntwortEntschluesseltAm;
GesendetAm = dc.GesendetAm;
}
}
}

View File

@@ -36,6 +36,8 @@ namespace BeWo.Data.Entities
public virtual DateTime? ErstelltAm { get; set; }
public virtual DateTime? GesendetAm { get; set; }
public virtual DateTime? VerschluesseltAm { get; set; }
public virtual DateTime? UebertragenAm { get; set; }

View File

@@ -17,8 +17,9 @@
<property column="Nutzdatendatei" type="string" name="Nutzdatendatei" />
<property column="Auftragsdatei" type="string" name="Auftragsdatei" />
<property column="Transfername" type="string" name="Transfername" />
<property column="Datenaustauschreferenz" type="int" name="Datenaustauschreferenz" />
<property column="ErstelltAm" type="DateTime" name="ErstelltAm" />
<property column="Datenaustauschreferenz" type="int" name="Datenaustauschreferenz" />
<property column="ErstelltAm" type="DateTime" name="ErstelltAm" />
<property column="GesendetAm" type="DateTime" name="GesendetAm" />
<property column="VerschluesseltAm" type="DateTime" name="VerschluesseltAm" />
<property column="UebertragenAm" type="DateTime" name="UebertragenAm" />
<property column="AntwortErhaltenAm" type="DateTime" name="AntwortErhaltenAm" />

View File

@@ -25,6 +25,7 @@ using BeWo.Data.Access;
using BeWo.Service.DCEntityMapper;
using BeWo.Data.Entities;
using BS.Shared.Extensions;
using System.Threading;
namespace Host
{
@@ -69,6 +70,12 @@ namespace Host
SendErrorResponse("GkvAbrechnungType unbekannt.");
return;
}
SendErrorResponse("Unbekannter Fehler");
}
catch(ThreadAbortException eee)
{
}
catch (Exception ex)
{
@@ -76,8 +83,6 @@ namespace Host
SendErrorResponse(ex_text);
return;
}
SendErrorResponse("Unbekannter Fehler");
}
private void SendErrorResponse(string message)
@@ -94,7 +99,8 @@ namespace Host
{
Response.Write(str);
Context.ApplicationInstance.CompleteRequest();
Response.End();
//Context.ApplicationInstance.CompleteRequest();
}
private bool CheckValues() => CheckValues(GkvRequest);
@@ -150,11 +156,11 @@ namespace Host
SaveFileInFileSystem(req, debug_mode);
// Make DB Entry
var entry = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewEntity(req.GkvAbrechnung);
//var entry = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewEntity(req.GkvAbrechnung);
entry.Kundennummer = req.Tenant;
//entry.Kundennummer = req.Tenant;
DAOFactory.GenericDAO.Insert(entry);
// DAOFactory.GenericDAO.Insert(entry);
// Dakota Send
@@ -200,7 +206,9 @@ namespace Host
// Get Entry
var entries = DAOFactory.GenericDAO.GetAllActive<GkvAbrechnung>();
var tuples = req.Tuples;
entries.DoForEach(x => x.Kundennummer = req.Kundennummer);
var tuples =req.Tuples;
var tuples_len = tuples.Length;
var response_tuples = new Tuple<bool, GkvAbrechnungDC>[tuples_len];

View File

@@ -0,0 +1,31 @@
CREATE TABLE `gkvabrechnung` (
`Oid` bigint NOT NULL AUTO_INCREMENT,
`Tid` int NOT NULL,
`Notice` varchar(1024) DEFAULT NULL,
`InsTs` datetime DEFAULT NULL,
`InsUser` varchar(256) DEFAULT NULL,
`Version` bigint DEFAULT NULL,
`UdpUser` varchar(256) DEFAULT NULL,
`IsActive` tinyint DEFAULT NULL,
`SystemEntryID` int DEFAULT NULL,
`Kundennummer` varchar(256) DEFAULT NULL,
`IKLeistungserbringer` varchar(256) DEFAULT NULL,
`IKVersichertenKarte` varchar(256) DEFAULT NULL,
`IKKostentrager` varchar(256) DEFAULT NULL,
`IKDatenannahmestelle` varchar(256) DEFAULT NULL,
`AbrechnungsZeitraumStart` datetime DEFAULT NULL,
`AbrechnungsZeitraumEnde` datetime DEFAULT NULL,
`Nutzdatendatei` text,
`Auftragsdatei` varchar(1024) DEFAULT NULL,
`Transfername` varchar(256) DEFAULT NULL,
`Datenaustauschreferenz` int DEFAULT NULL,
`ErstelltAm` datetime DEFAULT NULL,
`GesendetAm` datetime DEFAULT NULL,
`VerschluesseltAm` datetime DEFAULT NULL,
`UebertragenAm` datetime DEFAULT NULL,
`AntwortErhaltenAm` datetime DEFAULT NULL,
`AntwortEntschluesseltAm` datetime DEFAULT NULL,
`Betrag` decimal(18,10) DEFAULT NULL,
`Bezahlt` tinyint DEFAULT NULL,
PRIMARY KEY (`Oid`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=latin1

View File

@@ -32,11 +32,12 @@ namespace BeWo.Service.DCEntityMapper
pDataContract.Transfername = pEntity.Transfername;
pDataContract.Datenaustauschreferenz = pEntity.Datenaustauschreferenz;
pDataContract.UebertragenAm = pEntity.UebertragenAm;
pDataContract.VerschluesseltAm = pEntity.VerschluesseltAm;
pDataContract.AntwortErhaltenAm = pEntity.AntwortErhaltenAm;
pDataContract.AntwortEntschluesseltAm = pEntity.AntwortEntschluesseltAm;
pDataContract.UebertragenAm = pEntity.UebertragenAm;
pDataContract.ErstelltAm = pEntity.ErstelltAm;
pDataContract.GesendetAm = pEntity.GesendetAm;
pDataContract.Betrag = pEntity.Betrag;
pDataContract.Bezahlt = pEntity.Bezahlt;
@@ -70,6 +71,7 @@ namespace BeWo.Service.DCEntityMapper
pEntity.Datenaustauschreferenz = pDataContract.Datenaustauschreferenz;
pEntity.ErstelltAm = pDataContract.ErstelltAm;
pEntity.GesendetAm = pDataContract.GesendetAm;
pEntity.VerschluesseltAm = pDataContract.VerschluesseltAm;
pEntity.UebertragenAm = pDataContract.UebertragenAm;
pEntity.AntwortErhaltenAm = pDataContract.AntwortErhaltenAm;

View File

@@ -720,7 +720,7 @@ namespace BeWo.Service.ServiceImplementations
var dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entries);
var updateables = dcs.Where(x => !x.IsStatusComplete()).ToArray();
var updateables = dcs.Where(x => !x.IsStatusComplete() && x.GesendetAm.HasValue).ToArray();
var isUpToDate = SendApp8GetStatusRequest(updateables, user.LoginName, user.RC2EncryptedHash);
@@ -770,10 +770,15 @@ namespace BeWo.Service.ServiceImplementations
request.Tuples[id] = new Tuple<GkvAbrechnungDC, long>(gkv_abrechnung, gkv_abrechnung_oid);
}
var response_app8_str = SendApp8Request(url, request);
var response_app8_str = SendApp8Request(url, JsonConvert.SerializeObject(request));
var response_app8 = JsonConvert.DeserializeObject<GkvApp8GetStatusResponse>(response_app8_str);
if (!response_app8.Success)
{
throw new NotImplementedException("App 8 Anfrage nicht erfolgreich");
}
bool allAreUpToDate = true;
for (int id = 0; id < updateables_len; id++)
{
@@ -978,10 +983,22 @@ namespace BeWo.Service.ServiceImplementations
response.Successful = response_app8.Success;
if (!response.Successful)
response.Message = response_app8.Message;
else
if (response_app8.Success)
{
var entity = DAOFactory.GenericDAO.GetByID<GkvAbrechnung>(req.GkvAbrechnungDC.GkvAbrechnungOid.Value);
entity.GesendetAm = DateTime.Now;
DAOFactory.GenericDAO.Update(entity);
response.Message = "Erfolgreich gesendet";
response.GkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(entity);
}
else
{
response.Message = response_app8.Message;
}
return response;
}
@@ -989,8 +1006,6 @@ namespace BeWo.Service.ServiceImplementations
{
throw Utils.CreateBeWoFaultException(e);
}
throw new NotImplementedException();
}
private string SendApp8SendNewRequest(long oid, string loginName, string hashed_password)
{
@@ -1004,7 +1019,6 @@ namespace BeWo.Service.ServiceImplementations
var request_app8 = new GkvApp8SendNewRequest
{
GkvAbrechnung = gkv_abrechnung_dc,
Type = GkvAbrechnungApp8RequestTypeDC.SendNew,
Username = loginName,
Password = hashed_password,
Tenant = MultitenancyOperationContextExt.Current.Tenant
@@ -1016,6 +1030,8 @@ namespace BeWo.Service.ServiceImplementations
private string SendApp8Request(string url, object request) => SendApp8Request(url, JsonConvert.SerializeObject(request));
private string SendApp8Request(string url, string dataString)
{
url += "?tenant=" + MultitenancyOperationContextExt.Current.Tenant;
string response_app8_str;
using (WebClient client = new WebClient())
{

View File

@@ -50,6 +50,9 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[DataMember]
public DateTime? ErstelltAm { get; set; }
[DataMember]
public DateTime? GesendetAm { get; set; }
[DataMember]
public DateTime? VerschluesseltAm { get; set; }

View File

@@ -15,5 +15,8 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[DataMember]
public string Message { get; set; }
[DataMember]
public GkvAbrechnungDC GkvAbrechnungDC { get; set; }
}
}