using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Policy; 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.View.Windows; using BeWo.ViewModel; using BeWo.ViewModel.ListViewModel; using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.DataContracts.MikePHPContracts; 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 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 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(); 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(); 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(); 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(); var lContent = new List>(); 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 { 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(); var items = datagrid_invoices.ItemsSource as IList; 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(); var items = datagrid_invoices.ItemsSource as IList; 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(); var items = datagrid_invoices.ItemsSource as IList; 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(); var items = datagrid_invoices.ItemsSource as IList; 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(); var items = datagrid_invoices.ItemsSource as IList; 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 list, String function) { var dcList = new List(); 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 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 GetVisibleVMs() { var list = new List(); var items = datagrid_invoices.ItemsSource as IList; 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 test = ServiceFacade.DoOperationsEnhancedServiceSnyc(x => x.HelloWorld()); BeWoApp.MainControl.WindowService.ShowTextViewerWindow("Test", test); } private void btn_xRechnung_Click(object sender, RoutedEventArgs e) { var vm = this.datagrid_invoices.GetCurrentValue(); if (vm is null) { MessageBox.Show("vm is null"); return; } var invoice_base_oid = vm.DataContract.InvoiceBaseOid ?? -1; var invoice_type = (int)vm.DataContract.Type; var report_link = vm.ReportLink; ServiceFacade.DoAccountingEnhancedServiceAsnyc>( x => x.GetXRechnung(invoice_base_oid, invoice_type, report_link), response => { if (response.Success) { BeWoApp.MainControl.WindowService.ShowERechnungWindow(new MemoryStream(response.Data)); } else { MessageBox.Show(response.ToErrorString()); } } ); } } }