Files
BeWoPlaner/BeWo/View/Detail/EmployeeView.xaml.cs
2019-08-09 16:40:41 +02:00

678 lines
22 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using BeWo.Core;
using BeWo.Core.Service;
using BeWo.ownChat;
using BeWo.SchulbegleitenderDienst;
using BeWo.ServiceProxy;
using BeWo.Validation;
using BeWo.ViewModel;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using DevExpress.Xpf.Editors.Settings;
using DevExpress.Xpf.Grid;
using Button = System.Windows.Controls.Button;
using MessageBox = System.Windows.MessageBox;
using Point = System.Windows.Point;
namespace BeWo.View.Detail
{
public partial class EmployeeView
{
private EmployeeVM _ViewModel;
private GridControl grid_AbsenceTimes;
private GridControl grid_Overtimes;
private GridControl grid_Customers;
private bool DoOwnChatSync;
private bool initTabIndex;
private ObservableSortCollection<ValueListEntryDC> _EintragKategorien;
public EmployeeView(EmployeeVM pEmployeeDC)
{
InitializeComponent();
combobox_brush.ItemTemplateSelector = new ComboBoxTemplateSelector(combobox_brush);
ViewModel = pEmployeeDC;
bool noticeVisible = false;
bool extendedPropsVisible = false;
if (BeWoApp.Mandator.BeWoClientType == 3)
{
//Köln Ring
extendedPropsVisible = true;
}
else if (BeWoApp.Mandator.BeWoClientType == 4)
{
//Betreuwo
if (BeWoApp.LoggedOnUser.HasRight(UserRightType.Employee_AllowEditExtendedProperties))
noticeVisible = true;
}
if (!noticeVisible)
noticeGroup.Visibility = Visibility.Collapsed;
if (!extendedPropsVisible)
extendedPropertyGroup.Visibility = Visibility.Collapsed;
if (!BeWoApp.LoggedOnUser.HasRight(UserRightType.ChatSettings) || !BeWoApp.AppSettings.IsChatAllowed)
{
tabitem_chatservice.Visibility = Visibility.Collapsed;
}
if (!BeWoApp.LoggedOnUser.HasRight(UserRightType.Employee_AllowEditContracts))
tabitem_contract.Visibility = Visibility.Collapsed;
if (BeWoApp.LoggedOnUser.HasRight(UserRightType.OvertimeView))
{
OvertimeTabItem.Visibility = Visibility.Visible;
}
else
OvertimeTabItem.Visibility = Visibility.Collapsed;
if ((BeWoApp.Mandator != null && BeWoApp.Mandator.AllowSbd) || BeWoApp.AppSettings.ShowArbeitszeiten)
{
tabitem_arbeitszeit.Visibility = Visibility.Visible;
}
else
{
tabitem_arbeitszeit.Visibility = Visibility.Collapsed;
}
if (pEmployeeDC.VarFields == null || pEmployeeDC.VarFields.VMList.Count == 0)
{
tabitem_varFields.Visibility = Visibility.Collapsed;
}
if (BeWoApp.Mandator != null && BeWoApp.Mandator.AllowSbd)
{
tabitem_schuldienst.Visibility = Visibility.Visible;
}
else
{
tabitem_schuldienst.Visibility = Visibility.Collapsed;
}
#if DEBUG
tabitem_arbeitszeit.Visibility = Visibility.Visible;
#endif
// HACK: Force the devexpress grid to end editing when the mouse is over savebutton
// by setting the focus to another element.
MouseMove += (s, e) =>
{
if ((grid_AbsenceTimes == null || !grid_AbsenceTimes.IsVisible) &&
(grid_Customers == null || !grid_Customers.IsVisible) && (grid_Overtimes == null || !grid_Overtimes.IsVisible))
{
return;
}
Point p = e.GetPosition(BtnSave);
if (p.X >= 0 && p.X < BtnSave.ActualWidth && p.Y >= 0 && p.Y < BtnSave.ActualHeight)
{
root.Focus();
}
};
tabcontrol_contracts.Loaded += tabcontrol_contracts_Loaded;
chkArchiviert.IsChecked = ViewModel.IsArchived;
if (!BeWoApp.LoggedOnUser.HasRight(UserRightType.Employee_AllowArchiving))
{
lblArchiviert.Visibility = Visibility.Hidden;
chkArchiviert.Visibility = Visibility.Hidden;
}
tabitem_documents.Visibility = Visibility.Collapsed;
if (BeWoApp.LoggedOnUser.HasRight(UserRightType.DocumentsAllowViewAll) || (BeWoApp.LoggedOnUser.HasRight(UserRightType.DokumenteMitarbeiter) && BeWoApp.LoggedOnEmployee.EmployeeOid == pEmployeeDC.DataContract.EmployeeOid))
{
tabitem_documents.Visibility = Visibility.Visible;
}
//Employee Image
if (_ViewModel.EmployeeImage != null)
{
using (var ms = new System.IO.MemoryStream(_ViewModel.EmployeeImage))
{
var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad; // here
image.StreamSource = ms;
image.EndInit();
Img.Source = image;
}
}
Img.EditValueChanged += Image_EditValueChanged;
_EintragKategorien = pEmployeeDC.EintragKategorien;
}
public void Image_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
{
_ViewModel.EmployeeImage = Img.EditValue as byte[];
}
public override bool IsDirty
{
get { return ViewModel != null && ViewModel.IsDirty; }
}
public override string Title
{
get { return "Mitarbeiter"; }
}
internal override DependencyObject ValidationOnSaveRootElement
{
get { return grid_details; }
}
internal EmployeeVM ViewModel
{
get { return _ViewModel; }
set
{
_ViewModel = value;
DataContext = value;
if (tabcontrol_contracts.Items.Count == 0 && _ViewModel.Contracts.VMList.Count > 0)
initTabIndex = true;
else
SetTabIndexToLastContract();
if (tabitem_arbeitszeit.Content != null)
{
var view = tabitem_arbeitszeit.Content as EmployeeArbeitszeitView;
if (view != null)
{
view.ViewModel = value;
view.RefreshView();
}
}
}
}
private void tabcontrol_contracts_Loaded(object sender, RoutedEventArgs e)
{
if (initTabIndex)
{
SetTabIndexToLastContract();
initTabIndex = false;
}
}
private void SetTabIndexToLastContract()
{
//DateTime maxDate = DateTime.MinValue;
if (tabcontrol_contracts.Items.Count > 0)
tabcontrol_contracts.SelectedIndex = tabcontrol_contracts.Items.Count - 1;
}
protected override UserRightType[] GetSaveDemands()
{
if (ViewModel.IsNew)
return new[] {UserRightType.CreateAll, UserRightType.EmployeeView_Create};
if (ViewModel.DataContract.EmployeeOid == BeWoApp.LoggedOnEmployee.EmployeeOid)
return new[] {UserRightType.EditAll, UserRightType.EmployeeView_Edit, UserRightType.Employee_AllowEditOwnEmployees};
return new[] {UserRightType.EditAll, UserRightType.EmployeeView_Edit};
}
protected override void Save()
{
if(!ValidateContracts())
{
return;
}
if(BeWoApp.AppSettings.IsChatAllowed)
{
if (ViewModel.DataContract.FirstName != ViewModel.FirstName || ViewModel.DataContract.LastName != ViewModel.LastName)
{
DoOwnChatSync = true;
}
}
var lDataContract = ViewModel.CommitToDataContract();
try
{
if(ViewModel.IsNew)
{
IsDoneWithInsertOrUpdate = false;
DoOwnChatSync = true;
ServiceFacade.DoEmployeeServiceAsync(s => s.InsertNewEmployee(lDataContract), ReloadViewModel);
}
else
{
IsDoneWithInsertOrUpdate = false;
ServiceFacade.DoEmployeeServiceAsync(s => s.UpdateEmployee(lDataContract), ReloadViewModel);
}
Cache.GetInstance().ClearEmployees();
BeWoApp.MainControl.ResetView(UIContext.Employee);
}
catch(FaultException<BeWoFault>)
{
MessageBox.Show("Dieser Datensatz wurde in der Zwischenzeit von einem anderen Benutzer geändert. Klicken Sie Ok, um den Datansatz erneut zu laden. Ihre Änderungen gehen dabei leider verloren.");
ReloadViewModel(lDataContract.EmployeeOid.Value);
}
}
private bool ValidateContracts()
{
var count = ViewModel.Contracts.VMList.Count(c => !c.ContractEndDate.HasValue);
if (count > 1)
{
MessageBox.Show(String.Format("Es darf nur ein unbefristeter Vetrag angelegt werden. Bitte überprüfen Sie das \"Befristet bis\" Datum der angelegten Verträge."), "Ungültiger Vetrag", MessageBoxButton.OK);
return false;
}
foreach (var contract in ViewModel.Contracts.VMList)
{
if (contract.EntryDate.HasValue && contract.ContractEndDate.HasValue &&
contract.EntryDate.Value > contract.ContractEndDate.Value)
{
MessageBox.Show(String.Format("Das Startdatum eines Vertrags ist größer als das Enddatum. Bitte überprüfen Sie die angelegten Verträge."), "Ungültiger Vetrag", MessageBoxButton.OK);
return false;
}
}
return true;
}
private void CustomerSearchView_CustomerSelected(object sender, EventArgs<CompactCustomerDC> e)
{
PopupCustomer.IsOpen = false;
ViewModel.CustomerRelations.NewVM.Customer = e.Data;
popupedit_customerRelations.Focus();
}
private void ReloadViewModel(long pOid)
{
if (pOid == -1)
{
this.Dispatch(
delegate
{
MessageBox.Show("Leider besitzen Sie nicht genügend Lizenzen, um einen neuen Benutzer anzulegen!", "Benutzer anlegen", MessageBoxButton.OK, MessageBoxImage.Information);
});
}
else
{
VMFactory.CreateEmployeeVMAsync(pOid, cb => this.Dispatch(delegate
{
var list = cb.Arbeitszeiten;
ViewModel = cb;
if (tabitem_schuldienst.Content != null)
{
var view = tabitem_schuldienst.Content as SchulbegleitenderDienstEmployeeView;
if (view != null)
{
view.ViewModel = cb;
}
}
ModalEditViewUpdateCallback?.Invoke();
PreselectEmployeeBrush();
if (DoOwnChatSync && BeWoApp.AppSettings.IsChatAllowed)
{
BeWoUtils.OwnChatSynchronisationVeranlassen();
}
}));
}
IsDoneWithInsertOrUpdate = true;
}
private void PreselectEmployeeBrush()
{
if (ViewModel.EmployeeBrush == null)
{
return;
}
var element118 = ((List<SolidColorBrush>)combobox_brush.ItemsSource).FirstOrDefault(f => f.Color.Equals(ViewModel.EmployeeBrush.Color));
combobox_brush.SelectedItem = element118;
}
public void ReloadViewModel()
{
ReloadViewModel(ViewModel.DataContract.EmployeeOid.Value);
}
private void TabItemAbsenceTimes_Selected(object sender, RoutedEventArgs e)
{
if (grid_AbsenceTimes == null)
{
grid_AbsenceTimes = rootGrid.Resources["datagrid_absences"] as GridControl;
//var col = this.grid_AbsenceTimes.Columns["EndDT"];
//var settings = col.EditSettings;
//DateEditSettings des = (DateEditSettings)settings;
//des.DisplayTextConverter = new DateNullValueToEmptyStringConverter();
GroupBoxAbsenceTimes.Content = grid_AbsenceTimes;
if (ViewModel.AbsenceTimes != null)
{
grid_AbsenceTimes.Columns["Reason"].EditSettings = new ComboBoxEditSettings
{
ItemsSource = ViewModel.AbsenceTimes.PossibleReasons
};
}
}
}
private void TabItemCustomers_Selected(object sender, RoutedEventArgs e)
{
if (grid_Customers == null)
{
grid_Customers = rootGrid.Resources["grid_CustomerRelation"] as GridControl;
GroupBoxCustomers.Content = grid_Customers;
if (ViewModel.CustomerRelations != null)
{
grid_Customers.Columns["Role"].EditSettings = new ComboBoxEditSettings
{
ItemsSource = ViewModel.CustomerRelations.PossibleRoles
};
}
}
}
private void UserControl_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.Equals(this))
{
textbox_first.Focus();
}
}
private void button_addAbsence_Click(object sender, RoutedEventArgs e)
{
if (ValidationTrigger.Validate(groupbox_newAbsenceTime))
{
ViewModel.AbsenceTimes.AddNewVMToList();
}
}
private void button_addCustomerRelation_Click(object sender, RoutedEventArgs e)
{
if (ValidationTrigger.Validate(groupbox_newCustomerRel))
{
ViewModel.CustomerRelations.AddNewVMToList();
}
}
private void button_addFocus_Click(object sender, RoutedEventArgs e)
{
var lFocus = listbox_possibleFocuses.SelectedItem as ValueListEntryDC;
ViewModel.PossibleFocuses.Remove(lFocus);
ViewModel.Focuses.Add(lFocus);
ViewModel.Focuses.Sort();
}
private void button_addQualification_Click(object sender, RoutedEventArgs e)
{
var lQualification = listbox_possibleQualification.SelectedItem as ValueListEntryDC;
ViewModel.PossibleQualifications.Remove(lQualification);
ViewModel.Qualifications.Add(lQualification);
ViewModel.Qualifications.Sort();
}
private void button_removeAbsence_Click(object sender, RoutedEventArgs e)
{
ViewModel.AbsenceTimes.VMList.Remove(grid_AbsenceTimes.GetCurrentValue<AbsenceTimeVM>());
BeWoWpfUtils.RefreshDXGrid(grid_AbsenceTimes);
}
private void button_removeCustomerRelation_Click(object sender, RoutedEventArgs e)
{
ViewModel.CustomerRelations.VMList.Remove(grid_Customers.GetCurrentValue<CustomerEmployeeRelationVM>());
BeWoWpfUtils.RefreshDXGrid(grid_Customers);
}
private void button_removeFocus_Click(object sender, RoutedEventArgs e)
{
var lFocus = listbox_focuses.SelectedItem as ValueListEntryDC;
ViewModel.Focuses.Remove(lFocus);
ViewModel.PossibleFocuses.Add(lFocus);
ViewModel.PossibleFocuses.Sort();
}
private void button_removeQualificeation_Click(object sender, RoutedEventArgs e)
{
var lQualification = listbox_qualifications.SelectedItem as ValueListEntryDC;
ViewModel.Qualifications.Remove(lQualification);
ViewModel.PossibleQualifications.Add(lQualification);
ViewModel.PossibleQualifications.Sort();
}
private void popupedit_customerRelations_PopUpClick(object sender, RoutedEventArgs e)
{
PopupCustomer.IsOpen = true;
}
private void tabitem_documents_Selected(object sender, RoutedEventArgs e)
{
if (ViewModel.IsNew)
{
MessageBox.Show("Bevor zu einem Datensatz Dokumente hinterlegt werden können, muss dieser gespeichert werden.",
"Erst speichern bitte", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
if (tabitem_documents.Content == null)
{
tabitem_documents.Content = new BeWoFileView(TableID.Employee, ViewModel.DataContract.EmployeeOid.Value);
}
}
private void tabitem_arbeitszeit_Selected(object sender, RoutedEventArgs e)
{
if (tabitem_arbeitszeit.Content == null)
{
tabitem_arbeitszeit.Content = new EmployeeArbeitszeitView(_ViewModel, ViewModel.DataContract.EmployeeOid.Value);
}
}
private void tabitem_chatservice_Selected(object sender, RoutedEventArgs e)
{
if (tabitem_chatservice.Content == null)
{
tabitem_chatservice.Content = new ChatServiceEmployee(TableID.Employee, ViewModel.DataContract.EmployeeOid.Value,ViewModel.DataContract.PersonOid);
}
}
private void tabitem_SchulDienst_Selected(object sender, RoutedEventArgs e)
{
if (ViewModel.IsNew)
{
MessageBox.Show("Bevor Sie Angaben zum Schulbegleitenden Dienst hinterlegen können, muss dieser Datensatz zuerst gespeichert werden.", "Erst speichern bitte", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
if (tabitem_schuldienst.Content == null)
{
tabitem_schuldienst.Content = new SchulbegleitenderDienstEmployeeView(ViewModel);
}
}
private void button_addContract_Click(object sender, RoutedEventArgs e)
{
ViewModel.Contracts.AddNewVMToList();
tabcontrol_contracts.SelectedIndex = tabcontrol_contracts.Items.Count - 1;
}
private void btn_deleteContract_Click(object sender, RoutedEventArgs e)
{
var contract = tabcontrol_contracts.SelectedItem as ContractVM;
ViewModel.Contracts.VMList.Remove(contract);
}
private void tabitem_notizen_Selected(object sender, RoutedEventArgs e)
{
if (ViewModel.IsNew)
{
MessageBox.Show("Bevor Sie Notizen anlegen können, muss dieser Datensatz zuerst gespeichert werden.", "Erst speichern bitte", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
if (tabitem_notizen.Content == null)
{
tabitem_notizen.Content = new NotizenView(TableID.Employee, ViewModel.DataContract.EmployeeOid.Value, _EintragKategorien);
}
}
private void TableView_OnRowDoubleClick(object sender, RowDoubleClickEventArgs e)
{
var grid_CustomerRelation = (GridControl) rootGrid.Resources["grid_CustomerRelation"];
var selectedCustomerEmployeeRelationVM =
grid_CustomerRelation.GetRow(e.HitInfo.RowHandle) as CustomerEmployeeRelationVM;
if (selectedCustomerEmployeeRelationVM == null || !BeWoApp.LoggedOnUser.HasRight(UserRightType.CustomerView_View))
return;
VMFactory.CreateCustomerVMAsync(selectedCustomerEmployeeRelationVM.Customer.CustomerOid,
cb => this.Dispatch(
() => BeWoUtils.OpenModalViewWindow<CustomerVM, CustomerDC, EmployeeView>(cb, this, () => this.Dispatch(
delegate
{
CompactCustomerDC customerToUpdate = selectedCustomerEmployeeRelationVM.Customer;
//ServiceFacade.DoCustomerServiceSync(
// s => customerToUpdate = s.GetCompactCustomerDC(customerToUpdate.CustomerOid));
//foreach (var item in((BindingList<CustomerEmployeeRelationVM>) grid_CustomerRelation.ItemsSource).Where(item => item.Customer.Equals(customerToUpdate)))
//{
// item.Customer = null;
// item.Customer = customerToUpdate;
//}
//grid_CustomerRelation.RefreshData();
BeWoUtils.UpdateAllViews(customerToUpdate);
}))));
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
string emailAddress = (sender as Button).Name.Equals("EMailSendBtn") ? ViewModel.EMail : ViewModel.PrivateEMail;
BeWoUtils.OpenMailClient(emailAddress);
}
private void TabItemOvertimes_Selected(object sender, RoutedEventArgs e)
{
if (grid_Overtimes == null)
{
grid_Overtimes = rootGrid.Resources["datagrid_overtimes"] as GridControl;
GroupBoxOvertimes.Content = grid_Overtimes;
if (ViewModel.AbsenceTimes != null && grid_Overtimes != null)
{
grid_Overtimes.Columns["Auszahlungsart"].EditSettings = new ComboBoxEditSettings
{
ItemsSource = ViewModel.PossibleAuszahlungsarten
};
}
}
}
private void button_addOvertime_Click(object sender, RoutedEventArgs e)
{
if (ValidationTrigger.Validate(groupbox_newOvertime))
{
ViewModel.Overtimes.AddNewVMToList();
}
}
private void button_removeOvertime_Click(object sender, RoutedEventArgs e)
{
ViewModel.Overtimes.VMList.Remove(grid_Overtimes.GetCurrentValue<OvertimeVM>());
BeWoWpfUtils.RefreshDXGrid(grid_Overtimes);
}
private void ChkArchiviert_OnChecked(object sender, RoutedEventArgs e)
{
ViewModel.IsArchived = true;
}
private void ChkArchiviert_OnUnchecked(object sender, RoutedEventArgs e)
{
if (ViewModel.DataContract.ActivationType == ActivationTypeId.Archived)
{
var licenseInfo = ServiceFacade.DoOperationsServiceSync(s => s.GetLicenseInfo());
if (licenseInfo.EmployeeCount >= licenseInfo.MaxEmployeeCount)
{
MessageBox.Show("Leider verfügen Sie nicht über genügend Lizenzen, um diese/n Mitarbeiter/in aus dem Archiv zu holen.\n\n" +
string.Format("Sie verfügen derzeit über {0} kostenpflichtige Benutzerlizenzen, somit können Sie maximal {1} Mitarbeiter anlegen.\n({0} Benutzer + {2} % = {1} Mitarbeiterlizenzen).", licenseInfo.MaxLicenseCount, licenseInfo.MaxEmployeeCount, licenseInfo.PercentFreeEmployee) +
"\n\nSie können nun entweder Mitarbeiter archivieren oder im Modul \"Benutzer\" neue Benutzerlizenzen bestellen. Bitte beachten Sie, dass hierfür das Recht \"Neue Lizenz bestellen\" erforderlich ist.", "Mitarbeiter anlegen", MessageBoxButton.OK,
MessageBoxImage.Information);
chkArchiviert.IsChecked = true;
}
else
{
ViewModel.IsArchived = false;
}
}
}
private void Combobox_brush_OnLoaded(object sender, RoutedEventArgs e)
{
PreselectEmployeeBrush();
}
private void Img_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
BeWoUtils.ShowImageForm(Img.Source);
}
private void PrintContract(object sender, MouseButtonEventArgs e)
{
var textBlock = (TextBlock)sender;
var c = ((ContractVM)textBlock.Tag).CommitToDataContract();
string url = BeWoApp.SiteOfOrigin + "/ReportView.aspx?cOid=" + c.ContractOid + "&type=" + Utils.EnumName(ReportTypes.Contract);
BeWoUtils.NavigateToReportUri(url, "Druckvorschau");
}
}
}