Files
BeWoPlaner/BeWo/View/Detail/Accounting/InvoiceOverview.xaml.cs
2025-01-29 10:47:18 +01:00

645 lines
26 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
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.Extensions;
using BS.Shared.Translation;
using DevExpress.Xpf.Editors;
using DevExpress.Xpf.Grid;
using Microsoft.Win32;
using Newtonsoft.Json;
namespace BeWo.View.Detail.Accounting
{
public partial class InvoiceOverview : BeWoView
{
private readonly EquityInvoiceItemEditView _EquityInvoiceItemEditView;
private readonly GeneralInvoiceItemEditView _GeneralInvoiceItemEditView;
private readonly SettlementInvoiceItemEditView _SettlementInvoiceItemEditView;
private readonly SettlementInvoiceItemEditView2 _SettlementInvoiceItemEditView2;
private readonly ServiceInvoiceItemEditView _ServiceInvoiceItemEditView;
private InvoiceBaseListVM _Viewmodel;
private bool mIgnoreCheckChanges = false;
public InvoiceOverview(InvoiceBaseListVM vm)
{
this.InitializeComponent();
this.ViewModel = vm;
this.DownloadLinkEngine = new DownloadLinkEngine();
this.linkExcelExport.NavigateUri = this.DownloadLinkEngine.GenerateNewExcelLink();
this.linkPdfExport.NavigateUri = new Uri("http://www.ownsoft.de");
this.gridView.ShownEditor += this.gridView_ShownEditor;
//this.gridView.HiddenEditor += new EditorEventHandler(gridView_HiddenEditor);
this._EquityInvoiceItemEditView = new EquityInvoiceItemEditView();
this._GeneralInvoiceItemEditView = new GeneralInvoiceItemEditView();
this._SettlementInvoiceItemEditView = new SettlementInvoiceItemEditView();
this._SettlementInvoiceItemEditView2 = new SettlementInvoiceItemEditView2();
this._ServiceInvoiceItemEditView = new ServiceInvoiceItemEditView();
this.ViewModel.DateTimeSpanFilter = this.yearMonthFilter.FilterSpan;
RefreshInvoiceList();
CheckRights();
this._EquityInvoiceItemEditView.EditingFinished += (s, e) =>
{
this.MainControl.CloseCurrentPopUp();
ServiceFacade.DoAccountingServiceAsync(se => se.LoadInvoiceBaseByOid(this._EquityInvoiceItemEditView.ViewModel.DataContract.InvoiceBaseOid.Value), cb => this.RefreshItemInList(cb));
};
this._GeneralInvoiceItemEditView.EditingFinished += (s, e) =>
{
this.MainControl.CloseCurrentPopUp();
ServiceFacade.DoAccountingServiceAsync(se => se.LoadInvoiceBaseByOid(this._GeneralInvoiceItemEditView.ViewModel.DataContract.InvoiceBaseOid.Value), cb => this.RefreshItemInList(cb));
};
this._SettlementInvoiceItemEditView.EditingFinished += (s, e) =>
{
this.MainControl.CloseCurrentPopUp();
ServiceFacade.DoAccountingServiceAsync(se => se.LoadInvoiceBaseByOid(this._SettlementInvoiceItemEditView.ViewModel.DataContract.InvoiceBaseOid.Value), cb => this.RefreshItemInList(cb));
};
this._SettlementInvoiceItemEditView2.EditingFinished += (s, e) =>
{
this.MainControl.CloseCurrentPopUp();
ServiceFacade.DoAccountingServiceAsync(se => se.LoadInvoiceBaseByOid(this._SettlementInvoiceItemEditView2.ViewModel.DataContract.InvoiceBaseOid.Value), cb => this.RefreshItemInList(cb));
};
this._ServiceInvoiceItemEditView.EditingFinished += (s, e) =>
{
this.MainControl.CloseCurrentPopUp();
ServiceFacade.DoAccountingServiceAsync(se => se.LoadInvoiceBaseByOid(this._ServiceInvoiceItemEditView.ViewModel.DataContract.InvoiceBase.InvoiceBaseOid.Value), cb => this.RefreshItemInList(cb));
};
}
private void CheckRights()
{
if (!BeWoApp.AppSettings.AllowStorno)
{
ColumnButtons.MinWidth = 67;
}
}
private void RefreshInvoiceList()
{
DateTime? start = null;
DateTime? end = null;
if (ViewModel.DateTimeSpanFilter != null)
{
start = ViewModel.DateTimeSpanFilter.StartDate;
end = ViewModel.DateTimeSpanFilter.EndDate;
}
bool filterByInvoiceDate = radioFilterByInvoiceDate.IsChecked.Value;
ServiceFacade.DoAccountingServiceAsync(s => s.GetInvoiceBases2(start, end, filterByInvoiceDate), UpdateInvoiceList);
}
private void UpdateInvoiceList(IList<InvoiceBaseDC> dcList)
{
this.Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
(Action)delegate
{
ViewModel.UpdateList(dcList);
this.gridView.BestFitColumns();
});
}
public DownloadLinkEngine DownloadLinkEngine { get; set; }
private InvoiceBaseListVM ViewModel
{
get
{
return this._Viewmodel;
}
set
{
this.DataContext = value;
this._Viewmodel = value;
}
}
private void RefreshItemInList(InvoiceBaseDC cb)
{
this.Dispatch(
delegate
{
var old = this.ViewModel.VMList.Single(i => i.DataContract.InvoiceBaseOid.Equals(cb.InvoiceBaseOid));
var lNew = new InvoiceBaseVM(cb);
this.ViewModel.VMList.Remove(old);
this.ViewModel.VMList.Add(lNew);
this.datagrid_invoices.RefreshData();
this.gridView.FocusedRow = lNew;
});
}
private void YearMonthFilter_FilterSpanChanged(object sender, EventArgs<DateTimeSpan> e)
{
mIgnoreCheckChanges = true;
this.ViewModel.DateTimeSpanFilter = e.Data;
RefreshInvoiceList();
mIgnoreCheckChanges = false;
}
private void btn_delete_Click(object sender, RoutedEventArgs e)
{
var vm = this.datagrid_invoices.GetCurrentValue<InvoiceBaseVM>();
if (vm.IsSent && !BeWoApp.LoggedOnUser.HasRight(UserRightType.FinanzenRechnungenNachVersandBearbeiten))
{
MessageBox.Show(Translator.Translate("Sie besitzen nicht das Recht Rechnungen nach Versand zu bearbeiten. Bitte wenden Sie sich an den Administrator!"), "BeWoPlaner", MessageBoxButton.OK, MessageBoxImage.Exclamation);
return;
}
mIgnoreCheckChanges = true;
if (MessageBox.Show("Sind Sie sicher, dass Sie die gewählte Rechnung löschen möchten?", "Rechnung löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
if (vm.DataContract.Type == InvoiceType.Settlement)
{
this.ViewModel.VMList.Remove(vm);
ServiceFacade.DoAccountingServiceAsync(s => s.GetSettlementByInvoiceBaseOid(vm.DataContract.InvoiceBaseOid.Value), cb => ServiceFacade.DoAccountingServiceAsync(s1 => s1.DeactivateSettlementInvoice(new[] { cb }.ToList())));
}
else
{
this.ViewModel.VMList.Remove(vm);
ServiceFacade.DoAccountingServiceAsync(s => s.DeactivateInvoiceBases(new[] { vm.DataContract }.ToList()));
}
}
mIgnoreCheckChanges = false;
}
private void btn_storno_Click(object sender, RoutedEventArgs e)
{
mIgnoreCheckChanges = true;
var vm = this.datagrid_invoices.GetCurrentValue<InvoiceBaseVM>();
if (MessageBox.Show("Sind Sie sicher, dass Sie die gewählte Rechnung stornieren möchten?", "Rechnung stornieren", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
ServiceFacade.DoAccountingServiceAsync(s => s.StorniereInvoiceBases(new[] { vm.DataContract }.ToList()),
() => this.Dispatch(
delegate
{
RefreshInvoiceList();
}));
}
mIgnoreCheckChanges = false;
}
private void btn_edit_Click(object sender, RoutedEventArgs e)
{
var vm = this.datagrid_invoices.GetCurrentValue<InvoiceBaseVM>();
if (vm.IsSent && !BeWoApp.LoggedOnUser.HasRight(UserRightType.FinanzenRechnungenNachVersandBearbeiten))
{
MessageBox.Show(Translator.Translate("Sie besitzen nicht das Recht Rechnungen nach Versand zu bearbeiten. Bitte wenden Sie sich an den Administrator!"), "BeWoPlaner", MessageBoxButton.OK, MessageBoxImage.Exclamation);
return;
}
switch (vm.DataContract.Type)
{
case InvoiceType.CustomerEquity:
this._EquityInvoiceItemEditView.ViewModel = vm;
this.MainControl.ShowControlAsModalPopup(this._EquityInvoiceItemEditView);
break;
case InvoiceType.General:
this._GeneralInvoiceItemEditView.ViewModel = vm;
this.MainControl.ShowControlAsModalPopup(this._GeneralInvoiceItemEditView);
break;
case InvoiceType.Settlement:
ServiceFacade.DoAccountingServiceAsync(
s => s.GetSettlementByInvoiceBaseOid(vm.DataContract.InvoiceBaseOid.Value),
cb => this.Dispatch(
delegate
{
if (cb.InvoiceItems == null || cb.InvoiceItems.Count == 0 || cb.DifferentHourlyRateCount > 0)
{
this._SettlementInvoiceItemEditView.ViewModel = new SettlementVM(cb);
this.MainControl.ShowControlAsModalPopup(this._SettlementInvoiceItemEditView);
}
else
{
this._SettlementInvoiceItemEditView2.ViewModel = new SettlementVM(cb);
this.MainControl.ShowControlAsModalPopup(this._SettlementInvoiceItemEditView2);
}
}));
break;
case InvoiceType.Service:
ServiceFacade.DoAccountingServiceAsync(
s => s.GetServiceInvoiceByInvoiceBaseOid(vm.DataContract.InvoiceBaseOid.Value),
cb => this.Dispatch(
delegate
{
this._ServiceInvoiceItemEditView.ViewModel = new ServiceInvoiceVM(cb);
this.MainControl.ShowControlAsModalPopup(this._ServiceInvoiceItemEditView);
}));
break;
}
}
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;
//ed.Unchecked -= this.checked_changed;
//ed.Unchecked += this.checked_changed;
//ed.Checked -= this.checked_changed;
//ed.Checked += this.checked_changed;
}
}
//void gridView_HiddenEditor(object sender, EditorEventArgs e)
//{
// //if (e.Column != null && e.Column.FieldName == "IsPaid")
// //{
// // if (e.Value is bool b && e.Row is InvoiceBaseVM vm)
// // {
// // SaveIsPaidChange(vm, b);
// // }
// //}
//}
private void linkExcelExport_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
var list = ViewModel.VMList;
var lHeaderCaptions = new List<string>();
var lContent = new List<List<string>>();
lHeaderCaptions.Add("Art der Rechnung");
lHeaderCaptions.Add("Klient/in");
lHeaderCaptions.Add("Zeitraum");
lHeaderCaptions.Add("Nummer");
lHeaderCaptions.Add("Datum");
lHeaderCaptions.Add(BS.Shared.Translation.Translator.Translate("EmpfängerSingular"));
lHeaderCaptions.Add("Betrag");
lHeaderCaptions.Add("Bemerkung");
lHeaderCaptions.Add("Geprüft");
lHeaderCaptions.Add("Versendet");
lHeaderCaptions.Add("Exportiert");
lHeaderCaptions.Add("Bezahlt");
lHeaderCaptions.Add("Teilzahlung");
if (list != null)
{
lContent.AddRange(list.Select(vm => new List<string>
{
vm.TypeString, vm.CustomerName, vm.AccountingPeriodString, vm.InvoiceNumber, vm.InvoiceDate.Value.ToShortDateString(),
vm.RecipientString, string.Format("{0:0.00}", vm.TotalAmount), vm.Notice, vm.IsReviewed ? "Ja" : "", vm.IsSent ? "Ja" : "",
vm.IsExported ? "Ja" : "", vm.IsPaid ? "Ja" : "", vm.PartialPayment
}));
}
var path = BeWoApp.GetAndCreateUserAppDataPath() + "\\Rechnungen.xls";
var sf = new SaveFileDialog { FileName = Path.GetFileName(path), Filter = "Microsoft Excel 97-2003-Arbeitsblatt|*.xls|Alle Dateien|*.*" };
if (sf.ShowDialog() != true)
return;
ServiceFacade.DoDownloadServiceSync(s => BeWoUtils.WriteExcelFile(s.PrepareExcelFile(DownloadLinkEngine.ExcelFileId, lHeaderCaptions, lContent), sf.FileName));
}
private void linkPdfExport_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
var list = ViewModel.VMList;
var oids = list.Select(r => r.DataContract.InvoiceBaseOid.Value).ToList();
ServiceFacade.DoReportServiceAsync(s => s.CreateInvoiceOverviewReport(oids), r =>
{
this.Dispatch(() =>
{
BeWoUtils.ShowReportWindow(r, Translator.Translate("Rechnungen"));
});
});
}
private void Hyperlink_OnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
BeWoUtils.NavigateToReportUri(((Hyperlink)sender).NavigateUri.ToString(), "Druckvorschau");
}
private void ReloadButton_OnClick(object sender, RoutedEventArgs e)
{
RefreshInvoiceList();
}
private void btn_storno_Initialized(object sender, EventArgs e)
{
if (!BeWoApp.AppSettings.AllowStorno)
{
Button btn = sender as Button;
btn.Visibility = Visibility.Collapsed;
}
}
private void gridView_CellValueChanged(object sender, CellValueChangedEventArgs e)
{
var vm = e.Row as InvoiceBaseVM;
if (vm != null)
{
if (e.Column != null && e.Column.FieldName == "PartialPayment")
{
var dc = vm.CommitToDataContract();
dc.PartialPayment = (String)e.Value;
ServiceFacade.DoAccountingServiceAsync(s => s.UpdateInvoiceBases(new[] { dc }.ToList()), cb => vm.DataContract.InvoiceBaseVersion = cb[0], false);
}
}
}
private void gridView_CellValueChanging(object sender, CellValueChangedEventArgs e)
{
var vm = e.Row as InvoiceBaseVM;
if (vm != null)
{
bool save = false;
var dc = vm.CommitToDataContract();
if (e.Column != null && e.Column.FieldName == "IsPaid")
{
dc.IsPaid = (bool)e.Value;
save = true;
}
if (e.Column != null && e.Column.FieldName == "IsReviewed")
{
dc.IsReviewed = (bool)e.Value;
save = true;
}
if (e.Column != null && e.Column.FieldName == "IsSent")
{
if (vm.IsSent && (bool)e.Value == false && !BeWoApp.LoggedOnUser.HasRight(UserRightType.FinanzenRechnungenNachVersandBearbeiten))
{
MessageBox.Show(Translator.Translate("Sie besitzen nicht das Recht Rechnungen nach Versand zu bearbeiten. Bitte wenden Sie sich an den Administrator!"), "BeWoPlaner", MessageBoxButton.OK, MessageBoxImage.Exclamation);
RefreshInvoiceList();
return;
}
dc.IsSent = (bool)e.Value;
save = true;
}
if (e.Column != null && e.Column.FieldName == "IsExported")
{
dc.IsExported = (bool)e.Value;
save = true;
}
if (save)
{
ServiceFacade.DoAccountingServiceAsync(s => s.UpdateInvoiceBases(new[] { dc }.ToList()), cb => vm.DataContract.InvoiceBaseVersion = cb[0], false);
}
}
}
private void TableView_OnCustomRowAppearance(object sender, CustomRowAppearanceEventArgs e)
{
if (e.Property != null && e.Property.Name == "Background")
{
var ib = datagrid_invoices.GetRow(e.RowHandle) as InvoiceBaseVM;
if (ib != null && !String.IsNullOrEmpty(ib.BackgroundColor))
{
e.Result = new SolidColorBrush((Color)ColorConverter.ConvertFromString(ib.BackgroundColor));
e.Handled = true;
}
}
//var data = srGridControl.rowhan
}
private void button_checkAll_Click(object sender, RoutedEventArgs e)
{
var visible = GetVisibleVMs();
foreach (var item in visible)
{
item.IsChecked = true;
}
}
private void button_uncheckAll_Click(object sender, RoutedEventArgs e)
{
var visible = GetVisibleVMs();
foreach (var item in visible)
{
item.IsChecked = false;
}
}
private void button_printInvoices_Click(object sender, RoutedEventArgs e)
{
var list = new List<InvoiceBaseVM>();
var items = datagrid_invoices.ItemsSource as IList<InvoiceBaseVM>;
if (items != null)
{
for (int i = 0; i < items.Count; i++)
{
var vm = datagrid_invoices.GetRow(i) as InvoiceBaseVM;
if (vm != null && vm.IsChecked)
{
list.Add(vm);
}
}
}
PrintInvoices(list);
}
private void button_reviewInvoices_Click(object sender, RoutedEventArgs e)
{
var list = new List<InvoiceBaseVM>();
var items = datagrid_invoices.ItemsSource as IList<InvoiceBaseVM>;
if (items != null)
{
for (int i = 0; i < items.Count; i++)
{
var vm = datagrid_invoices.GetRow(i) as InvoiceBaseVM;
if (vm != null && vm.IsChecked)
{
list.Add(vm);
}
}
}
ChangeAllInvoices(list, "reviewed");
}
private void button_sentInvoices_Click(object sender, RoutedEventArgs e)
{
var list = new List<InvoiceBaseVM>();
var items = datagrid_invoices.ItemsSource as IList<InvoiceBaseVM>;
if (items != null)
{
for (int i = 0; i < items.Count; i++)
{
var vm = datagrid_invoices.GetRow(i) as InvoiceBaseVM;
if (vm != null && vm.IsChecked)
{
list.Add(vm);
}
}
}
ChangeAllInvoices(list, "sent");
}
private void button_exportedInvoices_Click(object sender, RoutedEventArgs e)
{
var list = new List<InvoiceBaseVM>();
var items = datagrid_invoices.ItemsSource as IList<InvoiceBaseVM>;
if (items != null)
{
for (int i = 0; i < items.Count; i++)
{
var vm = datagrid_invoices.GetRow(i) as InvoiceBaseVM;
if (vm != null && vm.IsChecked)
{
list.Add(vm);
}
}
}
ChangeAllInvoices(list, "export");
}
private void button_paidInvoices_Click(object sender, RoutedEventArgs e)
{
var list = new List<InvoiceBaseVM>();
var items = datagrid_invoices.ItemsSource as IList<InvoiceBaseVM>;
if (items != null)
{
for (int i = 0; i < items.Count; i++)
{
var vm = datagrid_invoices.GetRow(i) as InvoiceBaseVM;
if (vm != null && vm.IsChecked)
{
list.Add(vm);
}
}
}
ChangeAllInvoices(list, "paid");
}
private void ChangeAllInvoices(List<InvoiceBaseVM> list, String function)
{
var dcList = new List<InvoiceBaseDC>();
foreach (var item in list)
{
if (function == "reviewed" && !item.IsReviewed)
{
item.IsReviewed = true;
var dc = item.CommitToDataContract();
dc.IsReviewed = true;
dcList.Add(dc);
}
else if (function == "sent" && !item.IsSent)
{
item.IsSent = true;
var dc = item.CommitToDataContract();
dc.IsSent = true;
dcList.Add(dc);
}
else if (function == "export" && !item.IsExported)
{
item.IsExported = true;
var dc = item.CommitToDataContract();
dc.IsExported = true;
dcList.Add(dc);
}
else if (function == "paid" && !item.IsPaid)
{
item.IsPaid = true;
var dc = item.CommitToDataContract();
dc.IsPaid = true;
dcList.Add(dc);
}
}
if (dcList.Count > 0)
{
ServiceFacade.DoAccountingServiceSync(s => s.UpdateInvoiceBases(dcList));
foreach (var item in dcList)
{
item.InvoiceBaseVersion++;
}
}
}
private void PrintInvoices(List<InvoiceBaseVM> list)
{
var oidList = list.Select(i => i.DataContract.InvoiceBaseOid.Value).ToList();
ServiceFacade.DoReportServiceAsync(s => s.CreateInvoiceListReport(oidList), ms => BeWoApp.MainControl.Dispatch(() => BeWoUtils.ShowReportWindow(ms, "Rechnungen")));
}
private IList<InvoiceBaseVM> GetVisibleVMs()
{
var list = new List<InvoiceBaseVM>();
var items = datagrid_invoices.ItemsSource as IList<InvoiceBaseVM>;
if (items != null)
{
for (int i = 0; i < items.Count; i++)
{
if (datagrid_invoices.IsRowVisible(i))
{
var vm = datagrid_invoices.GetRow(i) as InvoiceBaseVM;
if (vm != null)
{
list.Add(vm);
}
}
}
}
return list;
}
private void button_eRechnung_Click(object sender, RoutedEventArgs e)
{
var res = ServiceFacade.DoAccountingServiceSync(x => x.GetXRechnung(null));
if (res.HasErrors)
BeWoApp.ShowErrorMessage("Fehler: " + res.ResponseString);
else
BeWoUtils.ShowPdfWindow(res.ResponseBytes);
}
private void btn_xRechnung_Click(object sender, RoutedEventArgs e)
{
}
}
}