Files
BeWoPlaner/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs

403 lines
16 KiB
C#

using System;
using System.Activities.Statements;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Navigation;
using System.Windows.Threading;
using BeWo.Core;
using BeWo.ServiceProxy;
using BeWo.View.Controls;
using BeWo.ViewModel;
using BeWo.ViewModel.ListViewModel;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Extensions;
using DevExpress.Data.Filtering;
using DevExpress.Mvvm;
using DevExpress.Xpf.Editors;
using DevExpress.Xpf.Grid;
using Microsoft.Win32;
namespace BeWo.View.Detail.Accounting
{
public partial class GkvAbrechnungOverview : BeWoView
{
private readonly NewGkvAbrechnungPopUpView _NewGkvAbrechnungPopUpView;
private readonly GkvAbrechnungListVM _Viewmodel;
public GkvAbrechnungOverview()
{
UpdateDataGridFilterCommand = new DelegateCommand(UpdateDataGridFilter);
InitializeComponent();
DownloadLinkEngine = new DownloadLinkEngine();
_Viewmodel = new GkvAbrechnungListVM();
_Viewmodel.VMList.ListChanged += (s, e) => gridView.BestFitColumns();
DataContext = _Viewmodel;
//datagrid_gkvAbrechnungen.FixedFilter = new BinaryOperator("Datenaustauschreferenz", 1);
_NewGkvAbrechnungPopUpView = new NewGkvAbrechnungPopUpView();
_NewGkvAbrechnungPopUpView.CancelButtonClicked += NewGkvAbrechnungPopUpViewCancelButtonClicked;
_NewGkvAbrechnungPopUpView.CreateButtonClicked += NewGkvAbrechnungPopUpViewCreateButtonClicked;
_Viewmodel.DateTimeSpanFilter = yearMonthFilter.FilterSpan;
}
public DownloadLinkEngine DownloadLinkEngine { get; set; }
public DelegateCommand UpdateDataGridFilterCommand { get; set; }
private bool ShowAllInvoices => _Viewmodel.DateTimeSpanFilter is null;
private void RefreshGkvAbrechnungenList()
{
ServiceFacade.DoAccountingServiceAsync(s => s.GetFilteredGkvAbrechnungen(null), UpdateGkvAbrechnungList);
}
private void UpdateGkvAbrechnungList(IList<GkvAbrechnungDC> dcList)
{
this.Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
(Action)delegate
{
_Viewmodel.UpdateList(dcList);
if (datagrid_gkvAbrechnungen.Visibility != Visibility.Visible)
datagrid_gkvAbrechnungen.Visibility = Visibility.Visible;
UpdateDataGridFilter();
gridView.BestFitColumn(ColumnButtons);
});
}
private void UpdateDataGridFilter()
{
datagrid_gkvAbrechnungen.FixedFilter = null;
if (ShowAllInvoices)
{
datagrid_gkvAbrechnungen.FixedFilter = null;
}
else
{
var filterByInvoiceDate = radioFilterByInvoiceDate.IsChecked.Value;
var filter_start = _Viewmodel.DateTimeSpanFilter.StartDate;
var filter_ende = _Viewmodel.DateTimeSpanFilter.EndDate.AddDays(1).AddMilliseconds(-1);
if (filterByInvoiceDate)
{
datagrid_gkvAbrechnungen.FixedFilter = CriteriaOperator.And(
CriteriaOperator.FromLambda<GkvAbrechnungDC>(gkv => gkv.ErstelltAm >= filter_start),
CriteriaOperator.FromLambda<GkvAbrechnungDC>(gkv => gkv.ErstelltAm <= filter_ende));
}
else
{
datagrid_gkvAbrechnungen.FixedFilter = CriteriaOperator.Or(
CriteriaOperator.FromLambda<GkvAbrechnungDC>(gkv => filter_start <= gkv.AbrechnungsZeitraumStart && gkv.AbrechnungsZeitraumStart <= filter_ende),
CriteriaOperator.FromLambda<GkvAbrechnungDC>(gkv => filter_start <= gkv.AbrechnungsZeitraumEnde && gkv.AbrechnungsZeitraumEnde <= filter_ende),
CriteriaOperator.FromLambda<GkvAbrechnungDC>(gkv => gkv.AbrechnungsZeitraumStart <= filter_start && filter_ende <= gkv.AbrechnungsZeitraumEnde));
}
}
}
private void NewGkvAbrechnungPopUpViewCancelButtonClicked(object sender, EventArgs e)
{
MainControl.CloseCurrentPopUp();
}
private void NewGkvAbrechnungPopUpViewCreateButtonClicked(object sender, EventArgs<GkvAbrechnungDC> e)
{
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.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 GkvAbrechnungCreateRequestDC
{
GkvAbrechnungDC = gkv_abrechnung,
SelectedInvoiceBases = checked_invoice_bases.Select(x => x.DataContract.InvoiceBaseOid.Value).ToList()
};
ServiceFacade.DoAccountingServiceAsync(x => x.CreateNewGkvAbrechnung(gkv_filter),
cb => Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(Action)delegate
{
if (cb.Success)
{
RefreshGkvAbrechnungenList();
}
else
{
BeWoWindowBuilder.ShowErrorMessageBox(cb.Message);
}
}));
}
private void YearMonthFilter_FilterSpanChanged(object sender, EventArgs<DateTimeSpan> e)
{
_Viewmodel.DateTimeSpanFilter = e.Data;
UpdateDataGridFilter();
}
private void btn_details_Click(object sender, RoutedEventArgs e)
{
var vm = this.datagrid_gkvAbrechnungen.GetCurrentValue<GkvAbrechnungVM>();
var window = BeWoWindowBuilder.GetGkvAbrechnungDetailWindow(vm);
window.Closing += Detail_Window_Closing;
window.ShowDialog();
}
private void Detail_Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
var bewo_window = sender as BeWoWindow;
var detail_control = bewo_window.GroupBoxContent as GkvAbrechnungDetailControl;
var vm = detail_control.DataContext as GkvAbrechnungVM;
var checkbox_checked = detail_control.Checkbox_Bezahlt.IsChecked;
var textbox_text = detail_control.Textbox_Notice.Text;
vm.Notice = textbox_text;
if (vm.IsDirty)
{
var dc_in = vm.CommitToDataContract();
ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
{
Dispatcher.Invoke(() => {
vm.UpdateByDataContract(dc_out);
});
}, false);
}
}
private void btn_send_Click(object sender, RoutedEventArgs e)
{
var vm = datagrid_gkvAbrechnungen.GetCurrentValue<GkvAbrechnungVM>();
var state = vm.GetState();
string text = "Sind Sie sicher, dass Sie die gewählte GKV-Abrechnung senden möchten?";
if (state == GkvState.ErrorSoft)
text = "Die gewählte GKV-Abrechnung wurde nicht erfolgreich an die Krankenkasse übertragen. Möchten Sie sie erneut senden?";
if (MessageBox.Show(text, "GKV-Abrechnung senden", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
vm.SendGkvAbrechnung();
}
}
private void btn_delete_Click(object sender, RoutedEventArgs e)
{
var vm = datagrid_gkvAbrechnungen.GetCurrentValue<GkvAbrechnungVM>();
if (MessageBox.Show("Sind Sie sicher, dass Sie die gewählte GKV-Abrechnung löschen möchten?", "GKV-Abrechnung löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
_Viewmodel.VMList.Remove(vm);
ServiceFacade.DoAccountingServiceAsync(s => s.DeleteGkvAbrechnung(vm.CommitToDataContract()));
}
}
private void NewButton_OnClick(object sender, RoutedEventArgs e)
{
GkvAbrechnungDC gkvAbrechnungDC = new GkvAbrechnungDC();
int year = DateTime.Now.Year;
int month = DateTime.Now.Month - 1;
gkvAbrechnungDC.AbrechnungsZeitraumStart = new DateTime(year, month, 1);
gkvAbrechnungDC.AbrechnungsZeitraumEnde = new DateTime(year, month, DateTime.DaysInMonth(year, month));
GkvAbrechnungVM gkvAbrechnungVM = new GkvAbrechnungVM(gkvAbrechnungDC);
_NewGkvAbrechnungPopUpView.Clear();
_NewGkvAbrechnungPopUpView.ViewModel = gkvAbrechnungVM;
this.MainControl.ShowControlAsModalPopup(this._NewGkvAbrechnungPopUpView);
}
private void ReloadButton_OnClick(object sender, RoutedEventArgs e)
{
RefreshGkvAbrechnungenList();
}
private void gridView_Loaded(object sender, RoutedEventArgs e)
{
this.gridView.BestFitColumns();
}
private void gridView_ShownEditor(object sender, EditorEventArgs e)
{
if (e.Editor is CheckEdit)
{
var ed = (CheckEdit)e.Editor;
ed.Tag = e.Row;
}
else if (int.TryParse(datagrid_gkvAbrechnungen.CurrentColumn.Tag?.ToString(), out int tag) && gridView.ActiveEditor is TextEdit)
{
((TextEdit)gridView.ActiveEditor).SetPropertyValue("MaxLength", tag);
}
}
private void gridView_CellValueChanging(object sender, CellValueChangedEventArgs e)
{
if (e.Column is null)
return;
if (e.Column.FieldName == nameof(GkvAbrechnungVM.Bezahlt))
{
if (e.Value is bool b && e.Row is GkvAbrechnungVM vm)
{
SaveBezahltChange(vm, b);
}
}
else if (e.Column.FieldName == nameof(GkvAbrechnungVM.UrbelegeGesendet))
{
if (e.Value is bool b && e.Row is GkvAbrechnungVM vm)
{
SaveUrbelegeGesendetChange(vm, b);
}
}
}
private void TableView_OnCustomRowAppearance(object sender, CustomRowAppearanceEventArgs e)
{
if (e.Property != null && e.Property.Name == "Background")
{
var gkvAbrechnungVM = datagrid_gkvAbrechnungen.GetRow(e.RowHandle) as GkvAbrechnungVM;
if (gkvAbrechnungVM is null)
return;
if (gkvAbrechnungVM.GkvState == GkvState.WaitingForKrankenkasseTooLong)
{
e.Result = Brushes.Orange;
e.Handled = true;
}
else if (gkvAbrechnungVM.GkvState == GkvState.WaitingForUrbelege)
{
e.Result = Brushes.Green;
e.Handled = true;
}
}
}
private void radioFilterByInvoiceDate_Click(object sender, RoutedEventArgs e)
{
UpdateDataGridFilter();
}
private void SaveBezahltChange(GkvAbrechnungVM vm, bool b)
{
var dc_in = vm.CommitToDataContract();
dc_in.Bezahlt = b;
ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
{
Dispatcher.Invoke(() => {
vm.UpdateByDataContract(dc_out);
});
}, false);
}
private void SaveUrbelegeGesendetChange(GkvAbrechnungVM vm, bool b)
{
var dc_in = vm.CommitToDataContract();
dc_in.UrbelegeGesendet = b;
ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
{
Dispatcher.Invoke(() => {
vm.UpdateByDataContract(dc_out);
});
}, false);
}
private void SaveNoticeChange(GkvAbrechnungVM vm, string notice)
{
var dc_in = vm.CommitToDataContract();
ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
{
Dispatcher.Invoke(() => {
vm.UpdateByDataContract(dc_out);
});
}, false);
}
private void gridView_CellValueChanged_1(object sender, CellValueChangedEventArgs e)
{
if (e.Column != null && e.Column.FieldName == "Notice")
{
if (e.Value is string s && e.Row is GkvAbrechnungVM vm)
{
SaveNoticeChange(vm, s);
}
}
}
private void BeWoView_Loaded(object sender, RoutedEventArgs e)
{
_Viewmodel.FirePropertyChangedItself();
if (_NewGkvAbrechnungPopUpView.PopupObjectList is object)
_NewGkvAbrechnungPopUpView.PopupObjectList = null;
RefreshGkvAbrechnungenList();
}
private void Hyperlink_OnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
var vm = datagrid_gkvAbrechnungen.GetCurrentValue<GkvAbrechnungVM>();
string what2send = "Leistungsnachweise";
if (vm.Verfahrensstufe != GkvVerfahrensstufe.Echt)
what2send += " und Rechnungen";
BeWoApp.ShowInfoMessage($"Begleitzettel bitte inklusive der enthaltenen Urbelege ({what2send}) ausdrucken, " +
$"Anzahl der Urbelege noch eintragen und alles zusammen versenden.");
BeWoUtils.NavigateToReportUri(vm.ReportLink, "Druckvorschau");
}
private void Hyperlink_OnRequestNavigate2(object sender, RequestNavigateEventArgs e)
{
var vm = datagrid_gkvAbrechnungen.GetCurrentValue<GkvAbrechnungVM>();
string what2send = "Leistungsnachweise";
if (vm.Verfahrensstufe != GkvVerfahrensstufe.Echt)
what2send += " und Rechnungen";
BeWoApp.ShowInfoMessage($"Begleitzettel bitte inklusive der enthaltenen Urbelege ({what2send}) ausdrucken, " +
$"Anzahl der Urbelege noch eintragen und alles zusammen versenden.");
BeWoUtils.NavigateToReportUri(vm.ReportLink2, "Druckvorschau");
}
}
}