Advertisement
afterlife88

Untitled

Nov 27th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 84.61 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Reflection;
  7. using AbsenceService.Contracts;
  8. using AbsenceService.Contracts.Models.DTO;
  9. using AbsenceService.Contracts.Models.Enumerations;
  10. using AbsenceService.Contracts.Models.Service.Absence;
  11. using AdministrationService.Contracts;
  12. using AdministrationService.Contracts.Models.Service.Account;
  13. using AutoMapper;
  14. using Common.ServiceExceptions;
  15. using Common.Utilities;
  16. using ConfigurationService.Contracts;
  17. using ConfigurationService.Contracts.Models.Service.Country;
  18. using ConfigurationService.Contracts.Models.Service.Template;
  19. using CustomerService.Contracts;
  20. using CustomerService.Contracts.Models.Service.Customer;
  21. using CustomerService.Contracts.Models.Service.Department;
  22. using log4net;
  23. using SettingsService.Contracts;
  24. using SettingsService.Contracts.Models.DTO;
  25. using SettingsService.Contracts.Models.Service.Settings;
  26. using SettingsService.Contracts.Models.Service.Version;
  27. using SettingsService.Data;
  28. using SettingsService.Data.Contracts;
  29. using SettingsService.Data.Models;
  30. using SettingsService.Data.Models.Enumerations;
  31. using SettingsService.Helpers;
  32. using SettingsService.Infrastructure;
  33. using TimeRegistrationService.Contracts;
  34. using TimeRegistrationService.Contracts.Models.DTO;
  35. using TimeRegistrationService.Contracts.Models.Enumerations;
  36. using TimeRegistrationService.Contracts.Models.Service;
  37. using AbsenceTypeDTO = SettingsService.Contracts.Models.DTO.AbsenceTypeDTO;
  38. using DepartmentDTO = CustomerService.Contracts.Models.DTO.DepartmentDTO;
  39. using ServiceStatus = SettingsService.Contracts.Models.Service.ServiceStatus;
  40. using VersionInfoDTO = SettingsService.Contracts.Models.DTO.VersionInfoDTO;
  41.  
  42. namespace SettingsService
  43. {
  44.     /// <summary>
  45.     /// Service for managing customer settings
  46.     /// </summary>
  47.     [AutomapServiceBehavior]
  48.     public class SettingsService : ISettingsService
  49.     {
  50.         #region Variables
  51.         private readonly ILog _log = LogManager.GetLogger(typeof(SettingsService));
  52.         private readonly IUnitOfWork _unitOfWork;
  53.         private readonly DataDbContext _dbContext;
  54.         private readonly IAbsenceService _absenceService;
  55.         private readonly ICustomerService _customerService;
  56.         private readonly ITimeRegistrationService _timeRegistrationService;
  57.         private readonly IAdministrationService _administrationService;
  58.         private readonly IConfigurationService _configurationService;
  59.         #endregion
  60.  
  61.         #region Constructors
  62.  
  63.         /// <summary>
  64.         /// Default constructor
  65.         /// </summary>
  66.         /// <param name="unitOfWork"></param>
  67.         /// <param name="absenceService"></param>
  68.         /// <param name="customerService"></param>
  69.         /// <param name="timeRegistrationService"></param>
  70.         /// <param name="administrationService"></param>
  71.         /// <param name="configurationService"></param>
  72.         /// <param name="dbContext"></param>
  73.         public SettingsService(IUnitOfWork unitOfWork, IAbsenceService absenceService,
  74.             ICustomerService customerService,
  75.             ITimeRegistrationService timeRegistrationService,
  76.             IAdministrationService administrationService,
  77.             IConfigurationService configurationService,
  78.             DataDbContext dbContext)
  79.         {
  80.             _unitOfWork = unitOfWork;
  81.             _dbContext = dbContext;
  82.             _absenceService = absenceService;
  83.             _customerService = customerService;
  84.             _timeRegistrationService = timeRegistrationService;
  85.             _administrationService = administrationService;
  86.             _configurationService = configurationService;
  87.         }
  88.         #endregion
  89.  
  90.         #region Methods
  91.  
  92.         public SettingsListVersionInfoResponse GetListVersions(SettingsListVersionInfoRequest request)
  93.         {
  94.             try
  95.             {
  96.                 var assemblyName = Assembly.GetExecutingAssembly().GetName().Version.ToString();
  97.                 var serviceName = Assembly.GetExecutingAssembly().GetName().Name;
  98.                 var databaseName = _dbContext.Database.Connection.Database;
  99.  
  100.                 var databaseVersion = _dbContext.Database.SqlQuery<string>(
  101.                          "SELECT TOP 1 MigrationId FROM setting.__MigrationHistory ORDER BY LEFT(MigrationId, 15) DESC")
  102.                          .FirstOrDefault();
  103.  
  104.                 if (databaseVersion == null)
  105.                 {
  106.                     return new SettingsListVersionInfoResponse(null, ServiceStatus.ServiceError, "Can't find version of database");
  107.                 }
  108.                 databaseVersion = databaseVersion.Substring(0, databaseVersion.IndexOf("_", StringComparison.Ordinal)).Substring(8);
  109.                 ICollection<VersionInfoDTO> informationsCollection = new List<VersionInfoDTO>
  110.                 {
  111.                     // assembly
  112.                     new VersionInfoDTO()
  113.                     {
  114.                         Description = serviceName,
  115.                         Version = assemblyName
  116.                     },
  117.                     // database
  118.                     new VersionInfoDTO()
  119.                     {
  120.                         Description = databaseName,
  121.                         Version = databaseVersion
  122.                     }
  123.                 };
  124.                 return new SettingsListVersionInfoResponse(informationsCollection, ServiceStatus.Success, string.Empty);
  125.             }
  126.             catch (Exception ex)
  127.             {
  128.                 _log.LogErrorWithParameters(request, ex);
  129.                 throw;
  130.             }
  131.         }
  132.  
  133.         /// <summary>
  134.         /// Get user settings
  135.         /// </summary>
  136.         /// <param name="request"></param>
  137.         /// <returns></returns>
  138.         public GetUserSettingsResponse GetUserSettings(GetUserSettingsRequest request)
  139.         {
  140.             Stopwatch stopwatch = new Stopwatch();
  141.             _log.Info($"Entry {GetType().FullName}.{MethodBase.GetCurrentMethod().Name}");
  142.  
  143.             try
  144.             {
  145.                 _log.Info($"Getting user settings by userID {request.UserId}");
  146.                 stopwatch.Start();
  147.                 var userSettings = Mapper.Map<UserSettingDTO>(_unitOfWork.UserSettings.GetByUserId(request.UserId));
  148.                 _log.Info($"Got user settings from db in {stopwatch.ElapsedMilliseconds}");
  149.                 if (userSettings?.NotificationSettings == null || userSettings.LanguageSettings == null || userSettings.WorkScheduleSettings == null || userSettings.PublicHolidays == null || userSettings.ForcedAbsences == null || userSettings.AbsenceTypes == null)
  150.                 {
  151.                     if (userSettings == null)
  152.                     {
  153.                         userSettings = new UserSettingDTO();
  154.                     }
  155.                     stopwatch.Restart();
  156.                     _log.Info($"Getting user departments by userID: {request.UserId} by calling Customer service");
  157.                     var getUserDefaultDepartment = _customerService.GetDefaultUserDepartment(new GetDefaultUserDepartmentRequest()
  158.                     {
  159.                         UserId = request.UserId
  160.                     });
  161.  
  162.                     if (getUserDefaultDepartment.ServiceStatus != CustomerService.Contracts.Models.Service.ServiceStatus.Success)
  163.                     {
  164.                         _log.Info($"Received service status from Customer service are not successful");
  165.                         return new GetUserSettingsResponse(null, ServiceStatus.ServiceError, getUserDefaultDepartment.ErrorMessage);
  166.                     }
  167.  
  168.                     var departmentId = getUserDefaultDepartment.DepartmentId ?? 0;
  169.  
  170.                     _log.Info($"Getting department entity by departmentID: {departmentId} by calling Customer service");
  171.                     var getDepartmentByIdResponse = _customerService.GetDepartmentById(new GetDepartmentByIdServiceRequest() { DepartmentId = departmentId });
  172.                     if (getDepartmentByIdResponse.ServiceStatus != CustomerService.Contracts.Models.Service.ServiceStatus.Success)
  173.                     {
  174.                         _log.Info($"Received service status from Customer service are not successful");
  175.                         return new GetUserSettingsResponse(null, ServiceStatus.ServiceError, getDepartmentByIdResponse.ErrorMessage);
  176.                     }
  177.                     _log.Info($"Building department settings");
  178.                     var departmentSettings = BuildDepartmentSettings(getDepartmentByIdResponse.Department.CustomerId, departmentId);
  179.                     if (departmentSettings == null)
  180.                     {
  181.                         return new GetUserSettingsResponse(null, ServiceStatus.ServiceError, getDepartmentByIdResponse.ErrorMessage);
  182.                     }
  183.                     _log.Info($"Filling user settings from department settings");
  184.                     userSettings = FillUserSettingsFromDepartmentSettings(userSettings, departmentSettings);
  185.                     _log.Info($"Built user settings in {stopwatch.ElapsedMilliseconds} ms");
  186.                 }
  187.                 _log.Info($"Returning user settings successfully");
  188.                 return new GetUserSettingsResponse(userSettings, ServiceStatus.Success, string.Empty);
  189.             }
  190.             catch (Exception ex)
  191.             {
  192.                 _log.LogErrorWithParameters(request, ex);
  193.                 throw;
  194.             }
  195.             finally
  196.             {
  197.                 stopwatch.Stop();
  198.                 _log.Info($"Exit {GetType().FullName}.{MethodBase.GetCurrentMethod().Name}");
  199.             }
  200.         }
  201.  
  202.         /// <summary>
  203.         /// Update user allocations directly
  204.         /// </summary>
  205.         /// <param name="request"></param>
  206.         /// <returns></returns>
  207.         public UpdateUserAllocationsResponse UpdateUserAllocations(UpdateUserAllocationsRequest request)
  208.         {
  209.             try
  210.             {
  211.                 if (string.IsNullOrEmpty(request.UserId))
  212.                 {
  213.                     return new UpdateUserAllocationsResponse(ServiceStatus.ServiceError, "WRONG_USER_ID");
  214.                 }
  215.  
  216.                 var exsitedUserSettings = _unitOfWork.UserSettings.GetByUserId(request.UserId);
  217.  
  218.                 // If not user settings, create the new one with absence allocation only
  219.                 if (exsitedUserSettings == null || exsitedUserSettings.Id == 0)
  220.                 {
  221.  
  222.                     var userSettings = new UserSetting()
  223.                     {
  224.                         UserId = request.UserId,
  225.                         AbsenceTypeAllocations =
  226.                             Mapper.Map<ICollection<AbsenceTypeAllocation>>(request.AbsenceTypeAllocations)
  227.                     };
  228.                     if (request.AbsenceTypeAllocations != null)
  229.                     {
  230.                         foreach (var absenceTypeAllocation in userSettings.AbsenceTypeAllocations)
  231.                         {
  232.                             var absenceType = _unitOfWork.AbsenceTypes.GetById(absenceTypeAllocation.AbsenceType.Id);
  233.                             absenceTypeAllocation.AbsenceType = absenceType;
  234.                         }
  235.                     }
  236.  
  237.                     _log.Info($"Updating user settings with ID: {userSettings.Id}");
  238.                     _unitOfWork.UserSettings.Add(userSettings);
  239.                 }
  240.                 else
  241.                 {
  242.  
  243.                     if (request.AbsenceTypeAllocations != null)
  244.                     {
  245.                         var usrsSettings = _unitOfWork.UserSettings.GetByUserId(request.UserId);
  246.                         UpdateAbsenceTypeAllocations(exsitedUserSettings.AbsenceTypeAllocations, request.AbsenceTypeAllocations);
  247.                     }
  248.                     _unitOfWork.UserSettings.Update(exsitedUserSettings);
  249.                 }
  250.                 _unitOfWork.Commit();
  251.                 _log.Info($"User settings updated in database");
  252.                 _log.Info($"Recalculating user absences");
  253.                 RecalculateUserAbsences(request.UserId);
  254.                 _log.Info($"User settings updated successfully");
  255.                 return new UpdateUserAllocationsResponse(ServiceStatus.Success, string.Empty);
  256.  
  257.  
  258.             }
  259.             catch (Exception ex)
  260.             {
  261.                 _log.LogErrorWithParameters(request, ex, $"{GetType().FullName}.{MethodBase.GetCurrentMethod().Name}");
  262.                 throw;
  263.             }
  264.         }
  265.  
  266.  
  267.         /// <summary>
  268.         /// Update user settings
  269.         /// </summary>
  270.         /// <param name="request"></param>
  271.         /// <returns></returns>
  272.         public UpdateUserSettingsResponse UpdateUserSettings(UpdateUserSettingsRequest request)
  273.         {
  274.             _log.Info($"Entry {GetType().FullName}.{MethodBase.GetCurrentMethod().Name}");
  275.  
  276.             try
  277.             {
  278.                 if (string.IsNullOrEmpty(request.UserId))
  279.                 {
  280.                     return new UpdateUserSettingsResponse(ServiceStatus.ServiceError, "WRONG_USER_ID");
  281.                 }
  282.  
  283.                 #region Check if some settings not overriden
  284.                 if (request.NotificationSettingsOverride == false)
  285.                 {
  286.                     request.NotificationSettings = null;
  287.                 }
  288.                 if (request.LanguageSettingsOverride == false)
  289.                 {
  290.                     request.LanguageSettings = null;
  291.                 }
  292.                 if (request.WorkScheduleSettingsOverride == false)
  293.                 {
  294.                     request.WorkScheduleSettings = null;
  295.                 }
  296.                 if (request.PublicHolidaysOverride == false)
  297.                 {
  298.                     request.PublicHolidays = null;
  299.                 }
  300.                 if (request.ForcedAbsencesOverride == false)
  301.                 {
  302.                     request.ForcedAbsences = null;
  303.                 }
  304.                 if (request.AbsenceTypesOverride == false)
  305.                 {
  306.                     request.AbsenceTypes = null;
  307.                 }
  308.                 #endregion
  309.                 _log.Info($"Getting user settings by userID {request.UserId}");
  310.                 var userSettings = _unitOfWork.UserSettings.GetByUserId(request.UserId);
  311.                 if (userSettings == null || userSettings.Id == 0)
  312.                 {
  313.                     userSettings = Mapper.Map<UserSetting>(request);
  314.                     if (request.AbsenceTypeAllocations != null)
  315.                     {
  316.                         foreach (var absenceTypeAllocation in userSettings.AbsenceTypeAllocations)
  317.                         {
  318.                             var absenceType = _unitOfWork.AbsenceTypes.GetById(absenceTypeAllocation.AbsenceType.Id);
  319.                             absenceTypeAllocation.AbsenceType = absenceType;
  320.                         }
  321.                     }
  322.  
  323.                     _log.Info($"Updating user settings with ID: {userSettings.Id}");
  324.                     _unitOfWork.UserSettings.Add(userSettings);
  325.                     _unitOfWork.Commit();
  326.                     if (request.CalendarSettings.Any())
  327.                     {
  328.                         userSettings.DefaultCalendar = userSettings.CalendarSettings.FirstOrDefault();
  329.                         _unitOfWork.UserSettings.Update(userSettings);
  330.                     }
  331.                 }
  332.                 else
  333.                 {
  334.                     // Is user uncheck ovveride checkbox on work schedule settings
  335.                     if (request.WorkScheduleSettings == null && userSettings.WorkScheduleSettingsId.HasValue)
  336.                     {
  337.                         var daysToDelete = userSettings.WorkScheduleSettings.WorkingDays.ToList();
  338.                         foreach (var workingDay in daysToDelete)
  339.                         {
  340.                             _unitOfWork.WorkingDays.Delete(workingDay);
  341.                         }
  342.                         _unitOfWork.WorkScheduleSettings.Delete(userSettings.WorkScheduleSettings);
  343.  
  344.                         userSettings.WorkScheduleSettingsId = null;
  345.                         userSettings.WorkScheduleSettings = null;
  346.                     }
  347.                     else
  348.                     {
  349.                         if (request.WorkScheduleSettingsOverride)
  350.                         {
  351.                             // If user uncheck before work schedule settings then create again and update user settings with new one
  352.                             if (userSettings.WorkScheduleSettings == null)
  353.                             {
  354.                                 userSettings.WorkScheduleSettings =
  355.                                     Mapper.Map<WorkScheduleSetting>(request.WorkScheduleSettings);
  356.                                 var idOfWSS = _unitOfWork.WorkScheduleSettings.Add(userSettings.WorkScheduleSettings);
  357.                                 userSettings.WorkScheduleSettingsId = idOfWSS;
  358.                             }
  359.                             else
  360.                             {
  361.                                 UpdateWorkingTimeSchedule(userSettings.WorkScheduleSettings, request.WorkScheduleSettings, null, userSettings, false);
  362.                             }
  363.                         }
  364.                     }
  365.                     if (request.CalendarSettings != null)
  366.                     {
  367.                         UpdateCalendarSettings(userSettings.CalendarSettings, request.CalendarSettings);
  368.                         var defaultCalendar = userSettings.CalendarSettings.FirstOrDefault(r => r.Id == request.DefaultCalendar.Id);
  369.                         if (defaultCalendar != null)
  370.                             userSettings.DefaultCalendar = defaultCalendar;
  371.  
  372.  
  373.                     }
  374.                     if (request.AbsenceTypeAllocations != null)
  375.                     {
  376.                         UpdateAbsenceTypeAllocations(userSettings.AbsenceTypeAllocations, request.AbsenceTypeAllocations);
  377.                     }
  378.                     _unitOfWork.UserSettings.Update(userSettings);
  379.                 }
  380.                 _unitOfWork.Commit();
  381.                 _log.Info($"User settings updated in database");
  382.                 RecalculateUserAbsences(userSettings.UserId);
  383.                 _log.Info($"Recalculating user absences");
  384.                 _log.Info($"User settings updated successfully");
  385.                 return new UpdateUserSettingsResponse(ServiceStatus.Success, string.Empty);
  386.             }
  387.             catch (Exception ex)
  388.             {
  389.                 _log.LogErrorWithParameters(request, ex);
  390.                 throw;
  391.             }
  392.             finally
  393.             {
  394.                 _log.Info($"Exit {GetType().FullName}.{MethodBase.GetCurrentMethod().Name}");
  395.             }
  396.         }
  397.  
  398.         /// <summary>
  399.         /// Get department settings
  400.         /// </summary>
  401.         /// <param name="request"></param>
  402.         /// <returns></returns>
  403.         public GetDepartmentSettingsResponse GetDepartmentSettings(GetDepartmentSettingsRequest request)
  404.         {
  405.             Stopwatch stopwatch = new Stopwatch();
  406.             _log.Info($"Entry {GetType().FullName}.{MethodBase.GetCurrentMethod().Name}");
  407.  
  408.             try
  409.             {
  410.                 _log.Info($"Gettimg department entity with ID: {request.DepartmentId} by calling Customer service");
  411.                 stopwatch.Start();
  412.                 var getDepartmentByIdResponse = _customerService.GetDepartmentById(new GetDepartmentByIdServiceRequest() { DepartmentId = request.DepartmentId });
  413.                 _log.Info($"Got department by id in {stopwatch.ElapsedMilliseconds}");
  414.                 if (getDepartmentByIdResponse.ServiceStatus != CustomerService.Contracts.Models.Service.ServiceStatus.Success)
  415.                 {
  416.                     _log.Info($"Received service status from Customer service are not successful");
  417.                     return new GetDepartmentSettingsResponse(null, ServiceStatus.ServiceError, getDepartmentByIdResponse.ErrorMessage);
  418.                 }
  419.                 _log.Info($"Building department settings for departmentID: {request.DepartmentId}");
  420.                 stopwatch.Restart();
  421.                 var departmentSettings = BuildDepartmentSettings(getDepartmentByIdResponse.Department.CustomerId, request.DepartmentId);
  422.                 if (departmentSettings == null)
  423.                 {
  424.                     return new GetDepartmentSettingsResponse(null, ServiceStatus.ServiceError, "UNABLE_TO_GET_SETTINGS_FROM_SETTING_SERVCE");
  425.                 }
  426.                 _log.Info($"Built department settings in {stopwatch.ElapsedMilliseconds}");
  427.                 _log.Info($"Returning department settings successfully");
  428.                 return new GetDepartmentSettingsResponse(departmentSettings, ServiceStatus.Success, string.Empty);
  429.             }
  430.             catch (Exception ex)
  431.             {
  432.                 _log.LogErrorWithParameters(request, ex);
  433.                 throw;
  434.             }
  435.             finally
  436.             {
  437.                 stopwatch.Stop();
  438.                 _log.Info($"Exit {GetType().FullName}.{MethodBase.GetCurrentMethod().Name}");
  439.             }
  440.         }
  441.  
  442.         //ToDo: Refactor!!!!!!!!!!!
  443.         /// <summary>
  444.         /// Update department settings
  445.         /// </summary>
  446.         /// <param name="request"></param>
  447.         /// <returns></returns>
  448.         public UpdateDepartmentSettingsResponse UpdateDepartmentSettings(UpdateDepartmentSettingsRequest request)
  449.         {
  450.             _log.Info($"Entry {GetType().FullName}.{MethodBase.GetCurrentMethod().Name}");
  451.  
  452.             try
  453.             {
  454.                 if (request.DepartmentId < 1)
  455.                 {
  456.                     return new UpdateDepartmentSettingsResponse(ServiceStatus.ServiceError, "WRONG_DEPARTMENT_ID");
  457.                 }
  458.  
  459.                 #region Check if some settings not overriden
  460.  
  461.                 if (request.NotificationSettingsOverride == false)
  462.                 {
  463.                     request.NotificationSettings = null;
  464.                 }
  465.                 if (request.LanguageSettingsOverride == false)
  466.                 {
  467.                     request.LanguageSettings = null;
  468.                 }
  469.                 if (request.WorkScheduleSettingsOverride == false)
  470.                 {
  471.                     request.WorkScheduleSettings = null;
  472.                 }
  473.                 if (request.PublicHolidaysOverride == false)
  474.                 {
  475.                     request.PublicHolidays = null;
  476.                 }
  477.                 if (request.ForcedAbsencesOverride == false)
  478.                 {
  479.                     request.ForcedAbsences = null;
  480.                 }
  481.                 if (request.AbsenceTypesOverride == false)
  482.                 {
  483.                     request.AbsenceTypes = null;
  484.                 }
  485.  
  486.                 #endregion
  487.  
  488.                 _log.Info($"Getting department settings entity by departmentID: {request.DepartmentId}");
  489.                 var departmentSettings = _unitOfWork.DepartmentSettings.GetByDepartmentId(request.DepartmentId);
  490.                 _log.Info($"Getting department entity for departmentID: {request.DepartmentId} by calling Customer service");
  491.                 var departmentEntity = _customerService.GetDepartmentById(new GetDepartmentByIdServiceRequest()
  492.                 {
  493.                     DepartmentId = request.DepartmentId
  494.                 });
  495.                 ResponseStatus<CustomerService.Contracts.Models.Service.ServiceResponse>
  496.                     .CheckSuccess(departmentEntity, _log);
  497.  
  498.                 bool isSettingExistAlreadyForDepartment = departmentSettings != null && departmentSettings.Id != 0;
  499.                 bool isDepartmentSettingIsBlank = departmentSettings == null || departmentSettings.Id == 0;
  500.  
  501.                 if (isSettingExistAlreadyForDepartment)
  502.                 {
  503.                     bool isNeedRemoveExistedWorkScheduleSettings =
  504.                         departmentSettings.WorkScheduleSettings != null && request.WorkScheduleSettings == null;
  505.                     bool isNeedRemoveExistedAbsenceTypes = departmentSettings.AbsenceTypes.Any() &&
  506.                                                       request.AbsenceTypes == null;
  507.                     bool isNeedRemoveExistedPublicHolidays = departmentSettings.PublicHolidays.Any() &&
  508.                                                              request.PublicHolidays == null;
  509.                     bool isNeedRemoveExistedForcedAbsences = departmentSettings.ForcedAbsences.Any() &&
  510.                                                              request.ForcedAbsences == null;
  511.  
  512.                     _log.Info("Department settings are not empty");
  513.                     UpdateWorkingTimeSchedule(departmentSettings.WorkScheduleSettings, request.WorkScheduleSettings,
  514.                         departmentSettings, null, isNeedRemoveExistedWorkScheduleSettings);
  515.                     UpdateCalendarSettings(departmentSettings.CalendarSettings, request.CalendarSettings);
  516.  
  517.                     departmentSettings.NotificationSettings = Mapper.Map<NotificationSetting>(request.NotificationSettings);
  518.                     departmentSettings.LanguageSettings = Mapper.Map<LanguageSetting>(request.LanguageSettings);
  519.  
  520.                     UpdateAbsenceTypes(isNeedRemoveExistedAbsenceTypes, departmentEntity, departmentSettings, request);
  521.                     UpdateForcedAbsences(departmentSettings, request, departmentSettings.DepartmentId, isNeedRemoveExistedForcedAbsences);
  522.                     UpdateHolidays(departmentSettings, request.PublicHolidays, isNeedRemoveExistedPublicHolidays);
  523.  
  524.                     departmentSettings.DefaultCalendarId = request.DefaultCalendar.Id;
  525.                     _log.Info($"Updating department settings with ID: {departmentSettings}");
  526.                     _unitOfWork.DepartmentSettings.Update(departmentSettings);
  527.                 }
  528.  
  529.                 if (isDepartmentSettingIsBlank)
  530.                 {
  531.                     var departmentSettingsRequest = Mapper.Map<DepartmentSetting>(request);
  532.                     var users = GetUserList(departmentEntity.Department.CustomerId);
  533.                     bool isRootDep = IsRootDepartmentOfCompany(departmentEntity.Department.CustomerId,
  534.                                         request.DepartmentId);
  535.                     foreach (var absenceType in departmentSettingsRequest.AbsenceTypes)
  536.                     {
  537.                         var requestedToUpdateProject = Mapper.Map<AbsenceType>(absenceType);
  538.                         if (!isRootDep)
  539.                             requestedToUpdateProject.Name =
  540.                                 $"{requestedToUpdateProject.Name} ({departmentEntity.Department.Name})";
  541.                         _log.Info($"Creating of updating project with department settings, calling TimeRegistration project");
  542.                         var createUpdateResponse = CreateOrUpdateProject(requestedToUpdateProject,
  543.                             departmentEntity.Department.CustomerId, users);
  544.  
  545.                         ResponseStatus<ServiceResponse>.CheckSuccess(createUpdateResponse.Item1, _log);
  546.  
  547.                         absenceType.ProjectId = (int)createUpdateResponse.Item2;
  548.                     }
  549.                     _log.Info("Adding department settings to database");
  550.                     departmentSettingsRequest.DefaultCalendarId = null;
  551.  
  552.                     // Case when user remove some absence after checking ovveride, then remove absence that connected with removed absence type
  553.                     var departmentAbsences =
  554.                             _absenceService.GetDepartmentAbsences(new GetDepartmentAbsencesRequest()
  555.                             {
  556.                                 DepartmentId = request.DepartmentId
  557.                             });
  558.  
  559.                     ResponseStatus<AbsenceService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(departmentAbsences, _log);
  560.  
  561.                     if (departmentAbsences.Absences != null)
  562.                     {
  563.                         foreach (var absence in departmentAbsences.Absences.ToList())
  564.                         {
  565.                             var absenceType = _unitOfWork.AbsenceTypes.GetById(absence.AbsenceTypeId);
  566.                             var removedAbsenceType = departmentSettingsRequest.AbsenceTypes.FirstOrDefault(r => r.Name == absenceType.Name);
  567.                             if (removedAbsenceType == null)
  568.                             {
  569.                                 RemoveAbsence(absence);
  570.                             }
  571.                         }
  572.                     }
  573.                     _unitOfWork.DepartmentSettings.Add(departmentSettingsRequest);
  574.  
  575.                     _log.Info(
  576.                         $"Getting department entity by departmentID: {request.DepartmentId} by calling Customer service");
  577.                     var department = _customerService.GetDepartmentById(new GetDepartmentByIdServiceRequest
  578.                     {
  579.                         DepartmentId = request.DepartmentId
  580.                     });
  581.  
  582.                     if (department.ServiceStatus != CustomerService.Contracts.Models.Service.ServiceStatus.Success)
  583.                     {
  584.                         _log.Info($"Received service status from Customer service are not successful");
  585.                         return new UpdateDepartmentSettingsResponse(ServiceStatus.ServiceError, department.ErrorMessage);
  586.                     }
  587.                     if (request.ForcedAbsences != null)
  588.                     {
  589.                         var absences = new List<AbsenceDTO>();
  590.                         var parentSettings = GetParentSettings(request, department);
  591.  
  592.                         foreach (var forcedAbsence in departmentSettingsRequest.ForcedAbsences)
  593.                         {
  594.                             _log.Info(
  595.                                 $"Creating of updating project with department settings, calling TimeRegistration project");
  596.                             var createUpdateResponse = CreateOrUpdateProject(forcedAbsence.AbsenceType,
  597.                                 departmentEntity.Department.CustomerId, users);
  598.  
  599.                             ResponseStatus<ServiceResponse>.CheckSuccess(createUpdateResponse.Item1, _log);
  600.  
  601.                             AbsenceTypeDTO absenceType = null;
  602.                             if (parentSettings != null && forcedAbsence.AbsenceType.Id == 0)
  603.                             {
  604.                                 absenceType =
  605.                            parentSettings.DepartmentSettings.AbsenceTypes.FirstOrDefault(
  606.                                r => r.Name == forcedAbsence.AbsenceType.Name);
  607.                             }
  608.  
  609.  
  610.                             foreach (var user in department.Department.Users)
  611.                             {
  612.                                 absences.Add(new AbsenceDTO
  613.                                 {
  614.                                     UserId = user,
  615.                                     State = AbsenceState.Approved,
  616.                                     From = forcedAbsence.From,
  617.                                     To = forcedAbsence.To,
  618.                                     Comment = forcedAbsence.Name,
  619.                                     AbsenceTypeId = absenceType.Id,
  620.                                     AbsenceLenghtDay = 1,
  621.                                     Reason = "Forced absence"
  622.                                 });
  623.                             }
  624.                         }
  625.                         _log.Info($"Creating absences in transaction for: {absences.Count} absences");
  626.                         var transactionResponse =
  627.                             _absenceService.CreateAbsencesInTransaction(new CreateAbsencesInTransactionRequest
  628.                             {
  629.                                 Absences = absences
  630.                             });
  631.  
  632.                         ResponseStatus<AbsenceService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(transactionResponse, _log);
  633.  
  634.                         var transactionRetryResponse =
  635.                             _absenceService.CreateAbsencesInTransaction(new CreateAbsencesInTransactionRequest
  636.                             {
  637.                                 Absences = absences
  638.                             });
  639.  
  640.                         ResponseStatus<AbsenceService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(transactionRetryResponse, _log);
  641.  
  642.                     }
  643.                     _unitOfWork.Commit();
  644.                     departmentSettingsRequest.DefaultCalendar = departmentSettingsRequest.CalendarSettings.FirstOrDefault();
  645.                     _unitOfWork.DepartmentSettings.Update(departmentSettingsRequest);
  646.                     ReasignOldAbsenceTypeOnDepartmentAbsence(request.DepartmentId);
  647.                 }
  648.  
  649.                 if (isSettingExistAlreadyForDepartment)
  650.                 {
  651.                     _log.Info($"Recalculating department absences for department {departmentSettings.DepartmentId}");
  652.                     RecalculateDepartmentAbsences(departmentSettings.DepartmentId);
  653.                 }
  654.                 _unitOfWork.Commit();
  655.                 _log.Info($"Department settings updated successfully");
  656.                 return new UpdateDepartmentSettingsResponse(ServiceStatus.Success, string.Empty);
  657.             }
  658.             catch (SettingServiceException ex)
  659.             {
  660.                 return new UpdateDepartmentSettingsResponse(ServiceStatus.ServiceError, ex.Message);
  661.             }
  662.             catch (Exception ex)
  663.             {
  664.                 _log.LogErrorWithParameters(request, ex);
  665.                 throw;
  666.             }
  667.             finally
  668.             {
  669.                 _log.Info($"Exit {GetType().FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}");
  670.             }
  671.         }
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.         /// <summary>
  679.         /// Call this method only at environment initializations.
  680.         /// Need to assign missing default calendars on old customers
  681.         /// </summary>
  682.         /// <param name="request"></param>
  683.         /// <returns></returns>
  684.         public AssignDefaultCalendarsToDepartmentsResponse AssignDefaultCalendarsToDepartments(AssignDefaultCalendarsToDepartmentsRequest request)
  685.         {
  686.             _log.Info($"Entry {GetType().FullName}.{MethodBase.GetCurrentMethod().Name}");
  687.             try
  688.             {
  689.                 var allCustomers = _customerService.GetAllCustomers(new GetAllCustomersServiceRequest());
  690.  
  691.                 ResponseStatus<CustomerService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(allCustomers, _log);
  692.  
  693.                 foreach (var customer in allCustomers.Customers.ToList())
  694.                 {
  695.                     var customerTemplateResponse =
  696.                         _configurationService.GetCustomerTemplatesByAbbreviation(new GetCustomerTemplatesByAbbreviationRequest
  697.                             ()
  698.                         {
  699.                             Abbreviation = customer.Country
  700.                         });
  701.  
  702.                     ResponseStatus<ConfigurationService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(customerTemplateResponse, _log);
  703.                     var customerTemplate = customerTemplateResponse.CustomerTemplates.FirstOrDefault();
  704.  
  705.                     var departmentsOfCustomerResponse =
  706.                         _customerService.GetAllDepartments(new GetAllDepartmentsServiceRequest()
  707.                         {
  708.                             CustomerId = customer.Id
  709.                         });
  710.  
  711.                     ResponseStatus<CustomerService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(departmentsOfCustomerResponse, _log);
  712.  
  713.                     var departmentsOfCustomer = departmentsOfCustomerResponse.Departments.ToList();
  714.                     foreach (var department in departmentsOfCustomer)
  715.                     {
  716.                         var getDepSetting = _unitOfWork.DepartmentSettings.GetByDepartmentId(department.Id);
  717.                         if (getDepSetting != null && customerTemplate != null)
  718.                         {
  719.                             var calendarSettings = getDepSetting.CalendarSettings.FirstOrDefault();
  720.                             var defaultCalendar = customerTemplate.CalendarSettings.FirstOrDefault();
  721.  
  722.                             if (calendarSettings == null && defaultCalendar != null)
  723.                             {
  724.                                 var defaultClaendarModel =
  725.                                     Mapper.Map<CalendarSetting>(defaultCalendar);
  726.  
  727.                                 getDepSetting.CalendarSettings = new List<CalendarSetting>()
  728.                                 {
  729.                                    defaultClaendarModel
  730.                                 };
  731.                                 getDepSetting.DefaultCalendar = defaultClaendarModel;
  732.                             }
  733.                         }
  734.                     }
  735.                 }
  736.                 _unitOfWork.Commit();
  737.  
  738.                 return new AssignDefaultCalendarsToDepartmentsResponse(ServiceStatus.Success, string.Empty);
  739.             }
  740.             catch (Exception ex)
  741.             {
  742.                 _log.LogErrorWithParameters(request, ex);
  743.                 throw;
  744.             }
  745.             finally
  746.             {
  747.                 _log.Info($"Exit {GetType().FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}");
  748.             }
  749.         }
  750.  
  751.  
  752.  
  753.         /// <summary>
  754.         /// Get customer settings
  755.         /// </summary>
  756.         /// <param name="request"></param>
  757.         /// <returns></returns>
  758.         public GetCustomerSettingsResponse GetCustomerSettings(GetCustomerSettingsRequest request)
  759.         {
  760.             _log.Info($"Entry {GetType().FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}");
  761.  
  762.             try
  763.             {
  764.                 _log.Info($"Getting all departments for customerID {request.CustomerId} by calling Customer service");
  765.                 var getDepartmentsByCustomerIdResponse = _customerService.GetAllDepartments(new GetAllDepartmentsServiceRequest
  766.                 {
  767.                     CustomerId = request.CustomerId
  768.                 });
  769.  
  770.                 ResponseStatus<CustomerService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(getDepartmentsByCustomerIdResponse, _log);
  771.  
  772.                 var departmentsSettings = new List<DepartmentSettingDTO>();
  773.  
  774.                 foreach (var department in getDepartmentsByCustomerIdResponse.Departments)
  775.                 {
  776.                     BuildCustomerSettings(departmentsSettings, department, request.CustomerId);
  777.                 }
  778.                 _log.Info($"Returning customer settings successfully");
  779.                 return new GetCustomerSettingsResponse(departmentsSettings, ServiceStatus.Success, string.Empty);
  780.             }
  781.             catch (Exception ex)
  782.             {
  783.                 _log.LogErrorWithParameters(request, ex);
  784.                 throw;
  785.             }
  786.             finally
  787.             {
  788.                 _log.Info($"Exit {GetType().FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}");
  789.             }
  790.         }
  791.  
  792.         /// <summary>
  793.         /// Delete customer settings
  794.         /// </summary>
  795.         /// <param name="request"></param>
  796.         /// <returns></returns>
  797.         public DeleteCustomerSettingsResponse DeleteCustomerSettings(DeleteCustomerSettingsRequest request)
  798.         {
  799.             _log.Info($"Entry {GetType().FullName}.{MethodBase.GetCurrentMethod().Name}");
  800.  
  801.             try
  802.             {
  803.                 var departmentSettings = _unitOfWork.DepartmentSettings.GetAll()
  804.                     .Where(x => request.Departments.Contains(x.DepartmentId));
  805.                 var userSettings = _unitOfWork.UserSettings.GetAll()
  806.                     .Where(x => request.Users.Contains(x.UserId));
  807.                 foreach (var userSetting in userSettings.ToList())
  808.                 {
  809.                     if (userSetting.DefaultCalendar != null)
  810.                         _unitOfWork.CalendarSettings.Delete(userSetting.DefaultCalendar);
  811.                     foreach (var absenceType in userSetting.AbsenceTypes.ToList())
  812.                         _unitOfWork.AbsenceTypes.Delete(absenceType);
  813.                     foreach (var absenceType in userSetting.AbsenceTypeAllocations.ToList())
  814.                         _unitOfWork.AbsenceTypeAllocations.Delete(absenceType);
  815.                     foreach (var absenceType in userSetting.ForcedAbsences.ToList())
  816.                         _unitOfWork.ForcedAbsences.Delete(absenceType);
  817.                     foreach (var absenceType in userSetting.PublicHolidays.ToList())
  818.                         _unitOfWork.Holidays.Delete(absenceType);
  819.                     foreach (var calendarSetting in userSetting.CalendarSettings.ToList())
  820.                         _unitOfWork.CalendarSettings.Delete(calendarSetting);
  821.                 }
  822.                 foreach (var departmentSetting in departmentSettings.ToList())
  823.                 {
  824.                     if (departmentSetting.DefaultCalendar != null)
  825.                         _unitOfWork.CalendarSettings.Delete(departmentSetting.DefaultCalendar);
  826.                     foreach (var absenceType in departmentSetting.AbsenceTypes.ToList())
  827.                         _unitOfWork.AbsenceTypes.Delete(absenceType);
  828.                     foreach (var absenceType in departmentSetting.ForcedAbsences.ToList())
  829.                         _unitOfWork.ForcedAbsences.Delete(absenceType);
  830.                     foreach (var absenceType in departmentSetting.PublicHolidays.ToList())
  831.                         _unitOfWork.Holidays.Delete(absenceType);
  832.                     foreach (var calendarSetting in departmentSetting.CalendarSettings.ToList())
  833.                         _unitOfWork.CalendarSettings.Delete(calendarSetting);
  834.                     foreach (var calendarSetting in departmentSetting.CalendarSettings.ToList())
  835.                         _unitOfWork.CalendarSettings.Delete(calendarSetting);
  836.                 }
  837.                 _unitOfWork.Commit();
  838.  
  839.                 foreach (var departmentSetting in departmentSettings)
  840.                 {
  841.                     _unitOfWork.DepartmentSettings.Delete(departmentSetting);
  842.                 }
  843.  
  844.                 foreach (var userSetting in userSettings)
  845.                 {
  846.                     _unitOfWork.UserSettings.Delete(userSetting);
  847.                 }
  848.                 _unitOfWork.Commit();
  849.  
  850.  
  851.  
  852.                 return new DeleteCustomerSettingsResponse(ServiceStatus.Success, string.Empty);
  853.             }
  854.             catch (Exception ex)
  855.             {
  856.                 _log.LogErrorWithParameters(request, ex);
  857.                 throw;
  858.             }
  859.             finally
  860.             {
  861.                 _log.Info($"Exit {GetType().FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}");
  862.             }
  863.         }
  864.         #endregion
  865.  
  866.         #region Helpers
  867.  
  868.         private Tuple<ServiceResponse, int?> CreateOrUpdateProject(AbsenceType absenceType, int departmentId, string[] users)
  869.         {
  870.             if (absenceType.Id == 0)
  871.             {
  872.                 return CreateProject(absenceType.Name, departmentId, users);
  873.             }
  874.             var currProject = _timeRegistrationService.GetProjectById(new GetProjectByIdServiceRequest()
  875.             {
  876.                 Id = absenceType.ProjectId
  877.             });
  878.             if (currProject.Project == null)
  879.             {
  880.                 return CreateProject(absenceType.Name, departmentId, users);
  881.             }
  882.             if (currProject.ServiceStatus != TimeRegistrationService.Contracts.Models.Service.ServiceStatus.Success)
  883.             {
  884.                 return new Tuple<ServiceResponse, int?>(new ServiceResponse(
  885.                     TimeRegistrationService.Contracts.Models.Service.ServiceStatus.ServiceError, currProject.ErrorMessage),
  886.                     null);
  887.             }
  888.             var updateResponse = _timeRegistrationService.UpdateProject(new UpdateProjectServiceRequest
  889.             {
  890.                 Project = new ProjectDTO
  891.                 {
  892.                     Id = absenceType.ProjectId,
  893.                     Name = absenceType.Name,
  894.                     State = currProject.Project.State,
  895.                     Children = currProject.Project.Children,
  896.                     Budget = currProject.Project.Budget,
  897.                     CustomerId = currProject.Project.CustomerId,
  898.                     ProjectType = currProject.Project.ProjectType
  899.                 }
  900.             });
  901.             if (updateResponse.ServiceStatus != TimeRegistrationService.Contracts.Models.Service.ServiceStatus.Success)
  902.             {
  903.                 return new Tuple<ServiceResponse, int?>(new ServiceResponse(
  904.                     TimeRegistrationService.Contracts.Models.Service.ServiceStatus.ServiceError, updateResponse.ErrorMessage),
  905.                     null);
  906.             }
  907.             return new Tuple<ServiceResponse, int?>(new ServiceResponse(
  908.                 TimeRegistrationService.Contracts.Models.Service.ServiceStatus.Success, updateResponse.ErrorMessage),
  909.                 updateResponse.Project.Id);
  910.         }
  911.  
  912.         private Tuple<ServiceResponse, int?> CreateProject(string name, int departmentId, string[] users)
  913.         {
  914.             var createResponse = _timeRegistrationService.CreateProject(new CreateProjectServiceRequest
  915.             {
  916.                 Name = name,
  917.                 State = ProjectState.Active,
  918.                 Budget = 0,
  919.                 CustomerId = departmentId,
  920.                 Children = null,
  921.                 ProjectType = new ProjectTypeDTO
  922.                 {
  923.                     Name = name,
  924.                     CustomerId = departmentId
  925.                 },
  926.                 BuiltIn = true
  927.             });
  928.             if (createResponse.ServiceStatus != TimeRegistrationService.Contracts.Models.Service.ServiceStatus.Success)
  929.             {
  930.                 return new Tuple<ServiceResponse, int?>(new ServiceResponse(
  931.                     TimeRegistrationService.Contracts.Models.Service.ServiceStatus.ServiceError,
  932.                     createResponse.ErrorMessage), null);
  933.             }
  934.             foreach (var user in users)
  935.             {
  936.                 _timeRegistrationService.AddUserProject(new AddUserProjectServiceRequest()
  937.                 {
  938.                     UserId = user,
  939.                     ProjectId = createResponse.Project.Id
  940.                 });
  941.             }
  942.             return new Tuple<ServiceResponse, int?>(new ServiceResponse(
  943.                 TimeRegistrationService.Contracts.Models.Service.ServiceStatus.Success, createResponse.ErrorMessage),
  944.                 createResponse.Project.Id);
  945.         }
  946.  
  947.         private ServiceResponse DeleteProject(int id)
  948.         {
  949.             var response = _timeRegistrationService.DeleteProject(new DeleteProjectServiceRequest
  950.             {
  951.                 Id = id
  952.             });
  953.             if (response.ServiceStatus != TimeRegistrationService.Contracts.Models.Service.ServiceStatus.Success)
  954.             {
  955.                 return new ServiceResponse(TimeRegistrationService.Contracts.Models.Service.ServiceStatus.ServiceError, response.ErrorMessage);
  956.             }
  957.             return new ServiceResponse(TimeRegistrationService.Contracts.Models.Service.ServiceStatus.Success, string.Empty);
  958.         }
  959.  
  960.         /// <summary>
  961.         /// Check if any absences can be recalculated after changed user settings
  962.         /// </summary>
  963.         /// <param name="userId"></param>
  964.         private void RecalculateUserAbsences(string userId)
  965.         {
  966.             var recalculateUserAbsencesResponse = _absenceService.RecalculateUserAbsences(new RecalculateUserAbsencesRequest() { UserId = userId });
  967.         }
  968.  
  969.         /// <summary>
  970.         /// Check if any absences can be recalculated after changed department settings
  971.         /// </summary>
  972.         /// <param name="departmentId"></param>
  973.         private void RecalculateDepartmentAbsences(int departmentId)
  974.         {
  975.             var recalculateDepartmentAbsencesResponse = _absenceService.RecalculateDepartmentAbsences(new RecalculateDepartmentAbsencesRequest() { DepartmentId = departmentId });
  976.         }
  977.  
  978.         /// <summary>
  979.         /// Fill user settings from department with inheritance
  980.         /// </summary>
  981.         /// <param name="userSettings"></param>
  982.         /// <param name="departmentSettings"></param>
  983.         /// <returns></returns>
  984.         private UserSettingDTO FillUserSettingsFromDepartmentSettings(UserSettingDTO userSettings, DepartmentSettingDTO departmentSettings)
  985.         {
  986.             if (userSettings.NotificationSettings == null)
  987.             {
  988.                 userSettings.NotificationSettings = departmentSettings.NotificationSettings;
  989.                 userSettings.NotificationSettingsOverride = false;
  990.             }
  991.             else
  992.             {
  993.                 userSettings.NotificationSettingsOverride = true;
  994.             }
  995.             if (userSettings.LanguageSettings == null)
  996.             {
  997.                 userSettings.LanguageSettings = departmentSettings.LanguageSettings;
  998.                 userSettings.LanguageSettingsOverride = false;
  999.             }
  1000.             else
  1001.             {
  1002.                 userSettings.LanguageSettingsOverride = true;
  1003.             }
  1004.             if (userSettings.WorkScheduleSettings == null)
  1005.             {
  1006.                 userSettings.WorkScheduleSettings = departmentSettings.WorkScheduleSettings;
  1007.                 userSettings.WorkScheduleSettingsOverride = false;
  1008.             }
  1009.             else
  1010.             {
  1011.                 userSettings.WorkScheduleSettingsOverride = true;
  1012.             }
  1013.             if (userSettings.PublicHolidays != null && userSettings.PublicHolidays.Any())
  1014.             {
  1015.                 userSettings.PublicHolidaysOverride = true;
  1016.             }
  1017.             else
  1018.             {
  1019.                 userSettings.PublicHolidays = departmentSettings.PublicHolidays;
  1020.                 userSettings.PublicHolidaysOverride = false;
  1021.             }
  1022.             if (userSettings.ForcedAbsences != null && userSettings.ForcedAbsences.Any())
  1023.             {
  1024.                 userSettings.ForcedAbsencesOverride = true;
  1025.             }
  1026.             else
  1027.             {
  1028.                 userSettings.ForcedAbsences = departmentSettings.ForcedAbsences;
  1029.                 userSettings.ForcedAbsencesOverride = false;
  1030.             }
  1031.             if (userSettings.AbsenceTypes != null && userSettings.AbsenceTypes.Any())
  1032.             {
  1033.                 userSettings.AbsenceTypesOverride = true;
  1034.             }
  1035.             else
  1036.             {
  1037.                 userSettings.AbsenceTypes = departmentSettings.AbsenceTypes;
  1038.                 userSettings.AbsenceTypesOverride = false;
  1039.             }
  1040.             if (userSettings.CalendarSettings == null || !userSettings.CalendarSettings.Any())
  1041.             {
  1042.                 userSettings.CalendarSettings = departmentSettings.CalendarSettings;
  1043.             }
  1044.             if (userSettings.DefaultCalendar == null)
  1045.             {
  1046.                 userSettings.DefaultCalendar = departmentSettings.DefaultCalendar;
  1047.             }
  1048.             return userSettings;
  1049.         }
  1050.  
  1051.         /// <summary>
  1052.         /// Build department full settings using all inheritance
  1053.         /// Get root department find branch for selected department, go from up to down and write settings
  1054.         /// If selected department has own settings set Override for own settings blocks
  1055.         /// </summary>
  1056.         /// <param name="customerId"></param>
  1057.         /// <param name="departmentId"></param>
  1058.         /// <returns></returns>
  1059.         private DepartmentSettingDTO BuildDepartmentSettings(int customerId, int departmentId)
  1060.         {
  1061.             var buildedSettings = new DepartmentSettingDTO()
  1062.             {
  1063.                 DepartmentId = departmentId
  1064.             };
  1065.             var getCustomerByIdResponse = _customerService.GetCustomerById(new GetCustomerByIdServiceRequest() { CustomerId = customerId });
  1066.             if (getCustomerByIdResponse.ServiceStatus != CustomerService.Contracts.Models.Service.ServiceStatus.Success)
  1067.             {
  1068.                 return null;
  1069.             }
  1070.             var customerRootDepartment = getCustomerByIdResponse.Customer.Department;
  1071.  
  1072.             bool isRootDepartmentOfTheCompany = false;
  1073.             if (customerRootDepartment == null)
  1074.             {
  1075.                 throw new Exception("ERROR_NO_ROOT_DEPARTMENT");
  1076.             }
  1077.             if (customerRootDepartment.Id == departmentId)
  1078.                 isRootDepartmentOfTheCompany = true;
  1079.             CleanTree(departmentId, customerRootDepartment);
  1080.             return DepartmentSettingsByCheckingTree(buildedSettings, customerRootDepartment, departmentId, isRootDepartmentOfTheCompany);
  1081.         }
  1082.  
  1083.         /// <summary>
  1084.         /// Build final settings through all tree paths
  1085.         /// </summary>
  1086.         /// <param name="departmentSetting"></param>
  1087.         /// <param name="department"></param>
  1088.         /// <param name="requestedDepartmentId"></param>
  1089.         /// <returns></returns>
  1090.         private DepartmentSettingDTO DepartmentSettingsByCheckingTree(DepartmentSettingDTO departmentSetting, DepartmentDTO department, int requestedDepartmentId, bool isRootDepartmentOfTheCompany)
  1091.         {
  1092.             var currentDepartmentSettings = _unitOfWork.DepartmentSettings.GetByDepartmentId(department.Id);
  1093.             if (currentDepartmentSettings != null)
  1094.             {
  1095.                 departmentSetting.NotificationSettings = Mapper.Map<NotificationSettingDTO>(currentDepartmentSettings.NotificationSettings) ?? departmentSetting.NotificationSettings;
  1096.                 departmentSetting.NotificationSettingsOverride = currentDepartmentSettings.NotificationSettings != null && currentDepartmentSettings.DepartmentId == requestedDepartmentId;
  1097.                 departmentSetting.LanguageSettings = Mapper.Map<LanguageSettingDTO>(currentDepartmentSettings.LanguageSettings) ?? departmentSetting.LanguageSettings;
  1098.                 departmentSetting.LanguageSettingsOverride = currentDepartmentSettings.LanguageSettings != null && currentDepartmentSettings.DepartmentId == requestedDepartmentId;
  1099.                 departmentSetting.WorkScheduleSettings = Mapper.Map<WorkScheduleSettingDTO>(currentDepartmentSettings.WorkScheduleSettings) ?? departmentSetting.WorkScheduleSettings;
  1100.                 departmentSetting.WorkScheduleSettingsOverride = currentDepartmentSettings.WorkScheduleSettings != null && currentDepartmentSettings.DepartmentId == requestedDepartmentId;
  1101.                 departmentSetting.PublicHolidays = currentDepartmentSettings.PublicHolidays.Any() ? Mapper.Map<ICollection<Contracts.Models.DTO.HolidayDTO>>(currentDepartmentSettings.PublicHolidays) : departmentSetting.PublicHolidays;
  1102.                 if (departmentSetting.PublicHolidays != null)
  1103.                 {
  1104.                     foreach (var publicHoliday in departmentSetting.PublicHolidays)
  1105.                     {
  1106.                         publicHoliday.Day += publicHoliday.EasterOffset;
  1107.                     }
  1108.                 }
  1109.                 departmentSetting.PublicHolidaysOverride = currentDepartmentSettings.PublicHolidays.Any() && currentDepartmentSettings.DepartmentId == requestedDepartmentId;
  1110.                 departmentSetting.ForcedAbsences = currentDepartmentSettings.ForcedAbsences.Any() ? Mapper.Map<ICollection<ForcedAbsenceDTO>>(currentDepartmentSettings.ForcedAbsences) : departmentSetting.ForcedAbsences;
  1111.                 // If department is root (company) then forced absence is always true, if request is child department we check any forced absences and is department have own settings
  1112.                 departmentSetting.ForcedAbsencesOverride = isRootDepartmentOfTheCompany || currentDepartmentSettings.ForcedAbsences.Any() && currentDepartmentSettings.DepartmentId == requestedDepartmentId;
  1113.                 departmentSetting.AbsenceTypes = currentDepartmentSettings.AbsenceTypes.Any() ? Mapper.Map<ICollection<Contracts.Models.DTO.AbsenceTypeDTO>>(currentDepartmentSettings.AbsenceTypes) : departmentSetting.AbsenceTypes;
  1114.                 departmentSetting.AbsenceTypesOverride = currentDepartmentSettings.AbsenceTypes.Any() && currentDepartmentSettings.DepartmentId == requestedDepartmentId;
  1115.                 departmentSetting.CalendarSettings = currentDepartmentSettings.CalendarSettings.Any() ? Mapper.Map<ICollection<CalendarSettingDTO>>(currentDepartmentSettings.CalendarSettings) : departmentSetting.CalendarSettings;
  1116.                 departmentSetting.DefaultCalendar = currentDepartmentSettings.DefaultCalendar != null ? Mapper.Map<CalendarSettingDTO>(currentDepartmentSettings.DefaultCalendar) : departmentSetting.DefaultCalendar;
  1117.                 if (department.Departments != null && department.Departments.Any())
  1118.                 {
  1119.                     departmentSetting = DepartmentSettingsByCheckingTree(departmentSetting, department.Departments.FirstOrDefault(), requestedDepartmentId, false);
  1120.                 }
  1121.             }
  1122.             return departmentSetting;
  1123.         }
  1124.         private void BuildCustomerSettings(List<DepartmentSettingDTO> departmentSettingsList, DepartmentDTO department, int customerId)
  1125.         {
  1126.             _log.Info($"Building department settings for department with ID {department.Id}");
  1127.             var departmentSettings = BuildDepartmentSettings(customerId, department.Id);
  1128.             if (departmentSettings == null)
  1129.             {
  1130.                 throw new Exception("UNABLE_TO_GET_SETTINGS_FROM_SETTING_SERVCE");
  1131.             }
  1132.             departmentSettings.DepartmentName = department.Name;
  1133.             departmentSettingsList.Add(departmentSettings);
  1134.             foreach (var departmentDTO in department.Departments)
  1135.             {
  1136.                 BuildCustomerSettings(departmentSettingsList, departmentDTO, customerId);
  1137.             }
  1138.         }
  1139.         /// <summary>
  1140.         /// Cleaning department tree, stays only branches with department
  1141.         /// </summary>
  1142.         /// <param name="departmentId"></param>
  1143.         /// <param name="department"></param>
  1144.         private void CleanTree(int departmentId, DepartmentDTO department)
  1145.         {
  1146.             for (int i = department.Departments.Count() - 1; i >= 0; i--)
  1147.             {
  1148.                 CleanTree(departmentId, department.Departments[i]);
  1149.                 if (department.Departments[i].Departments.Count == 0)
  1150.                 {
  1151.                     if (department.Departments[i].Id != departmentId)
  1152.                     {
  1153.                         department.Departments.RemoveAt(i);
  1154.                     }
  1155.                 }
  1156.             }
  1157.         }
  1158.  
  1159.         private void UpdateHolidays(DepartmentSetting departmentSetting, ICollection<HolidayDTO> reqHolidays, bool isNeedRemoveSettings)
  1160.         {
  1161.             // If no request settings and no need to remove existed one - just pass this method.
  1162.             if (reqHolidays == null && !isNeedRemoveSettings)
  1163.                 return;
  1164.  
  1165.             if (isNeedRemoveSettings)
  1166.             {
  1167.                 departmentSetting.PublicHolidays = null;
  1168.                 return;
  1169.             }
  1170.  
  1171.             _log.Info("Updating Holidays");
  1172.             var holidaysToDelete = new List<Holiday>();
  1173.             foreach (var holiday in departmentSetting.PublicHolidays)
  1174.             {
  1175.                 var reqAbsence = reqHolidays.FirstOrDefault(x => x.Id == holiday.Id);
  1176.                 if (reqAbsence != null)
  1177.                 {
  1178.                     holiday.Name = reqAbsence.Name;
  1179.                     holiday.Day = reqAbsence.Day;
  1180.                     holiday.DayLength = reqAbsence.DayLength;
  1181.                     holiday.EasterOffset = reqAbsence.EasterOffset;
  1182.                     holiday.Month = reqAbsence.Month;
  1183.                     holiday.Year = reqAbsence.Year;
  1184.                     holiday.Type = Mapper.Map<HolidayTypeEnum>(reqAbsence.Type);
  1185.                     _unitOfWork.Holidays.Update(holiday);
  1186.                 }
  1187.                 else
  1188.                 {
  1189.                     holidaysToDelete.Add(holiday);
  1190.                 }
  1191.             }
  1192.  
  1193.             foreach (var holiday in holidaysToDelete)
  1194.             {
  1195.                 _unitOfWork.Holidays.Delete(holiday);
  1196.             }
  1197.  
  1198.             foreach (var holiday in reqHolidays)
  1199.             {
  1200.                 if (holiday.Id == 0)
  1201.                 {
  1202.                     var mappedHoliday = Mapper.Map<Holiday>(holiday);
  1203.                     departmentSetting.PublicHolidays.Add(mappedHoliday);
  1204.                 }
  1205.             }
  1206.         }
  1207.  
  1208.         private void RemoveAbsence(AbsenceExtendedDTO absence)
  1209.         {
  1210.             // Absence removal
  1211.             var absenceDeleteRequest =
  1212.                 _absenceService.DeleteAbsence(new DeleteAbsenceRequest() { AbsenceId = absence.Id });
  1213.             ResponseStatus<AbsenceService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(absenceDeleteRequest, _log);
  1214.         }
  1215.  
  1216.         private void UpdateCalendars(ICollection<CalendarSetting> calendars,
  1217.             ICollection<CalendarSettingDTO> reqCalendars)
  1218.         {
  1219.             List<CalendarSetting> calendarsToDelete = new List<CalendarSetting>();
  1220.             foreach (var calendar in calendars)
  1221.             {
  1222.                 var reqCalendar = reqCalendars.FirstOrDefault(x => x.Id == calendar.Id);
  1223.                 if (reqCalendar != null)
  1224.                 {
  1225.                     calendar.Name = reqCalendar.Name;
  1226.                     calendar.BuiltIn = reqCalendar.BuiltIn;
  1227.                     calendar.Day = reqCalendar.Day;
  1228.                     calendar.Month = reqCalendar.Month;
  1229.                     _unitOfWork.CalendarSettings.Update(calendar);
  1230.                 }
  1231.                 else
  1232.                 {
  1233.                     calendarsToDelete.Add(calendar);
  1234.                 }
  1235.             }
  1236.  
  1237.             foreach (var calendar in calendarsToDelete)
  1238.             {
  1239.                 if (!calendar.BuiltIn)
  1240.                     _unitOfWork.CalendarSettings.Delete(calendar);
  1241.             }
  1242.  
  1243.             foreach (var calendar in reqCalendars)
  1244.             {
  1245.                 if (calendar.Id == 0)
  1246.                 {
  1247.                     var mappedHoliday = Mapper.Map<CalendarSetting>(calendar);
  1248.                     calendars.Add(mappedHoliday);
  1249.                 }
  1250.             }
  1251.         }
  1252.  
  1253.         private void ReasignOldAbsenceTypeOnDepartmentAbsence(int departmentId)
  1254.         {
  1255.             var departmentAbsences =
  1256.                        _absenceService.GetDepartmentAbsences(new GetDepartmentAbsencesRequest()
  1257.                        {
  1258.                            DepartmentId = departmentId
  1259.                        });
  1260.             if (departmentAbsences.Absences == null) return;
  1261.  
  1262.             var depSettingsAfterSave = _unitOfWork.DepartmentSettings.GetByDepartmentId(departmentId);
  1263.             foreach (var absence in departmentAbsences.Absences.ToList())
  1264.             {
  1265.                 var oldAbsenceType = _unitOfWork.AbsenceTypes.GetById(absence.AbsenceTypeId);
  1266.                 if (oldAbsenceType == null) continue;
  1267.  
  1268.                 var newAbsenceType =
  1269.                     depSettingsAfterSave.AbsenceTypes.First(
  1270.                         r => r.Name == oldAbsenceType.Name);
  1271.  
  1272.                 // Replace absence type id of absence to parent absence type ID
  1273.                 var absenceTypeUpdateRequest =
  1274.                     _absenceService.UpdateAbsenceTypeId(new UpdateAbsenceTypeOfAbsenceRequest()
  1275.                     {
  1276.                         AbsenceTypeId = newAbsenceType.Id,
  1277.                         AbsenceId = absence.Id
  1278.                     });
  1279.                 ResponseStatus<AbsenceService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(absenceTypeUpdateRequest, _log);
  1280.             }
  1281.         }
  1282.  
  1283.         private void UpdateAbsenceTypes(bool isNeedRemoveExistedAbsenceTypes, GetDepartmentByIdServiceResponse
  1284.            getDepartmentByIdResponse, DepartmentSetting departmentSetting, UpdateDepartmentSettingsRequest updateDepartmentSettingsRequest
  1285.            )
  1286.         {
  1287.             if (updateDepartmentSettingsRequest.AbsenceTypes == null && !isNeedRemoveExistedAbsenceTypes)
  1288.                 return;
  1289.  
  1290.             _log.Info("Updating absence types");
  1291.             _log.Info("Getting user liset");
  1292.             var users = GetUserList(getDepartmentByIdResponse.Department.CustomerId);
  1293.             bool isRootDep = IsRootDepartmentOfCompany(getDepartmentByIdResponse.Department.CustomerId,
  1294.                 updateDepartmentSettingsRequest.DepartmentId);
  1295.             _log.Info($"Total users:{users.Length}");
  1296.             List<AbsenceType> absenceTypesToDelete = new List<AbsenceType>();
  1297.             _log.Info($"Total absence types: {departmentSetting.AbsenceTypes.Count}");
  1298.             foreach (var absenceType in departmentSetting.AbsenceTypes)
  1299.             {
  1300.                 if (updateDepartmentSettingsRequest.AbsenceTypes != null)
  1301.                 {
  1302.                     var reqAbsence = updateDepartmentSettingsRequest.AbsenceTypes.FirstOrDefault(x => x.Id == absenceType.Id);
  1303.                     //reqAbsence.
  1304.                     if (reqAbsence != null)
  1305.                     {
  1306.                         _log.Info($"Updating absence type: {reqAbsence.Id}");
  1307.                         absenceType.Color = reqAbsence.Color;
  1308.                         absenceType.Name = reqAbsence.Name;
  1309.                         absenceType.RequiresApproval = reqAbsence.RequiresApproval;
  1310.                         absenceType.YearlyAllocations = reqAbsence.YearlyAllocations;
  1311.                         absenceType.PastRegistrationAllowed = reqAbsence.PastRegistrationAllowed;
  1312.                         _log.Info(
  1313.                             $"Creating of updating project with department settings, calling TimeRegistration project");
  1314.                         var updateResponse = CreateOrUpdateProject(absenceType,
  1315.                             getDepartmentByIdResponse.Department.CustomerId, users);
  1316.                         ResponseStatus<ServiceResponse>.CheckSuccess(updateResponse.Item1, _log);
  1317.                         absenceType.ProjectId = (int)updateResponse.Item2;
  1318.                         _unitOfWork.AbsenceTypes.Update(absenceType);
  1319.                     }
  1320.                     else
  1321.                         absenceTypesToDelete.Add(absenceType);
  1322.  
  1323.                 }
  1324.                 else
  1325.                 {
  1326.                     _log.Info($"Deleting absence type {absenceType.Id}");
  1327.                     absenceTypesToDelete.Add(absenceType);
  1328.                 }
  1329.             }
  1330.  
  1331.             var departmentAbsences =
  1332.                _absenceService.GetDepartmentAbsences(new GetDepartmentAbsencesRequest()
  1333.                {
  1334.                    DepartmentId = departmentSetting.DepartmentId
  1335.                });
  1336.  
  1337.             ResponseStatus<AbsenceService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(departmentAbsences, _log);
  1338.  
  1339.             GetDepartmentSettingsResponse parentDepartmentSettings = null;
  1340.             // If requested department not root get parent dep settings
  1341.             if (!isRootDep)
  1342.             {
  1343.                 // Get parent department
  1344.                 var parentDepartment = _customerService.GetParentDepartment(new GetParentDepartmentRequest()
  1345.                 {
  1346.                     DepartmentId = getDepartmentByIdResponse.Department.Id
  1347.                 });
  1348.  
  1349.                 ResponseStatus<CustomerService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(parentDepartment, _log);
  1350.                 // Parent dep settings
  1351.                 parentDepartmentSettings = GetDepartmentSettings(new GetDepartmentSettingsRequest() { DepartmentId = parentDepartment.Department.Id });
  1352.                 ResponseStatus<Contracts.Models.Service.ServiceResponse>.CheckSuccess(parentDepartmentSettings, _log);
  1353.             }
  1354.  
  1355.  
  1356.             _log.Info("Deleting absence types");
  1357.             foreach (var absenceType in absenceTypesToDelete)
  1358.             {
  1359.                 if (departmentAbsences.Absences != null)
  1360.                 {
  1361.                     var absenceToDelete =
  1362.                     departmentAbsences.Absences.Where(r => r.AbsenceTypeId == absenceType.Id);
  1363.  
  1364.                     foreach (var absence in absenceToDelete.ToList())
  1365.                     {
  1366.                         // If no parent dep or user not unchecked ovveride settings then just remove absence that connected with absence type
  1367.                         if (parentDepartmentSettings == null | !isNeedRemoveExistedAbsenceTypes)
  1368.                         {
  1369.                             // Absence removal
  1370.                             RemoveAbsence(absence);
  1371.                             continue;
  1372.                         }
  1373.  
  1374.                         // Find absence type from removed absence type list
  1375.                         var absenceTypeOfCurrentAbsence = absenceTypesToDelete.FirstOrDefault(r => r.Id == absence.AbsenceTypeId);
  1376.  
  1377.                         // RELINK PART
  1378.                         // Find matched by name absence type of parent absence types
  1379.                         var matchedParentAbsenceType = parentDepartmentSettings.DepartmentSettings.AbsenceTypes.FirstOrDefault(
  1380.                             r => string.Equals(r.Name, absenceTypeOfCurrentAbsence?.Name, StringComparison.CurrentCultureIgnoreCase));
  1381.  
  1382.                         // If no matched absence type by name then remove all absences that connected with removed absence type
  1383.                         if (matchedParentAbsenceType == null)
  1384.                         {
  1385.                             RemoveAbsence(absence);
  1386.                         }
  1387.                         else
  1388.                         {
  1389.                             // Replace absence type id of absence to parent absence type ID
  1390.                             var absenceTypeUpdateRequest =
  1391.                                 _absenceService.UpdateAbsenceTypeId(new UpdateAbsenceTypeOfAbsenceRequest()
  1392.                                 {
  1393.                                     AbsenceTypeId = matchedParentAbsenceType.Id,
  1394.                                     AbsenceId = absence.Id
  1395.                                 });
  1396.  
  1397.                             ResponseStatus<AbsenceService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(absenceTypeUpdateRequest, _log);
  1398.                         }
  1399.  
  1400.                     }
  1401.                 }
  1402.  
  1403.                 // TODO: Disqus this part with Kristian!!!
  1404.                 _log.Info($"Deleting project with projectID: {absenceType.ProjectId}, calling TimeRegistration project");
  1405.                 var deleteResponse = DeleteProject(absenceType.ProjectId);
  1406.                 ResponseStatus<ServiceResponse>.CheckSuccess(deleteResponse, _log);
  1407.                 _log.Info($"Deleting absenceType with absenceTypeID: {absenceType.Id}");
  1408.                 _unitOfWork.AbsenceTypes.Delete(absenceType);
  1409.             }
  1410.  
  1411.             if (isNeedRemoveExistedAbsenceTypes)
  1412.                 departmentSetting.AbsenceTypes = null;
  1413.  
  1414.             _log.Info("Adding new absence types");
  1415.             if (updateDepartmentSettingsRequest.AbsenceTypes != null)
  1416.             {
  1417.                 foreach (var absenceType in updateDepartmentSettingsRequest.AbsenceTypes.ToList())
  1418.                 {
  1419.                     if (absenceType.Id == 0)
  1420.                     {
  1421.                         _log.Info($"Adding new absence type: {absenceType.Name}");
  1422.                         var mappedAbsenceType = Mapper.Map<AbsenceType>(absenceType);
  1423.                         var requestToCreateProject = Mapper.Map<AbsenceType>(absenceType);
  1424.                         if (!isRootDep)
  1425.                             requestToCreateProject.Name =
  1426.                                 $"{requestToCreateProject.Name} ({getDepartmentByIdResponse.Department.Name})";
  1427.                         _log.Info($"Creating of updating project with department settings, calling TimeRegistration project");
  1428.                         var createUpdateResponse = CreateOrUpdateProject(requestToCreateProject, getDepartmentByIdResponse.Department.CustomerId, users);
  1429.                         ResponseStatus<ServiceResponse>.CheckSuccess(createUpdateResponse.Item1, _log);
  1430.                         mappedAbsenceType.ProjectId = (int)createUpdateResponse.Item2;
  1431.                         departmentSetting.AbsenceTypes.Add(mappedAbsenceType);
  1432.                     }
  1433.                 }
  1434.             }
  1435.         }
  1436.  
  1437.         private string[] GetUserList(int customerId)
  1438.         {
  1439.             var usersResponse = _administrationService.GetAllUsersForCustomer(new GetAllUsersForCustomerServiceRequest()
  1440.             {
  1441.                 CompanyId = customerId
  1442.             });
  1443.             return usersResponse.Users.Select(x => x.Id).ToArray();
  1444.         }
  1445.  
  1446.         private void UpdateWorkingTimeSchedule(WorkScheduleSetting workScheduleSetting, WorkScheduleSettingDTO workScheduleDto,
  1447.             DepartmentSetting departmentSetting, UserSetting userSetting, bool isNeedRemoveSettings)
  1448.         {
  1449.             // If no request settings and no need to remove existed one - just pass this method.
  1450.             if (workScheduleDto == null && !isNeedRemoveSettings)
  1451.                 return;
  1452.  
  1453.             if (isNeedRemoveSettings)
  1454.             {
  1455.                 departmentSetting.WorkScheduleSettings = null;
  1456.                 return;
  1457.             }
  1458.  
  1459.             _log.Info("Updating working time schedule");
  1460.             if (workScheduleSetting == null || workScheduleSetting.Id == 0)
  1461.             {
  1462.                 workScheduleSetting = Mapper.Map<WorkScheduleSetting>(workScheduleDto);
  1463.                 _dbContext.Entry(workScheduleSetting).State = EntityState.Added;
  1464.                 if (departmentSetting != null)
  1465.                     departmentSetting.WorkScheduleSettingsId = workScheduleSetting.Id;
  1466.                 else
  1467.                     userSetting.WorkScheduleSettingsId = workScheduleSetting.Id;
  1468.             }
  1469.             else
  1470.             {
  1471.                 var workScheduleSettings = Mapper.Map<WorkScheduleSetting>(workScheduleDto);
  1472.                 workScheduleSetting.WorkingHours = workScheduleSettings.WorkingHours;
  1473.                 List<WorkingDay> daysToDelete = workScheduleSetting.WorkingDays.ToList();
  1474.                 foreach (var workingDay in daysToDelete)
  1475.                 {
  1476.                     _unitOfWork.WorkingDays.Delete(workingDay);
  1477.                 }
  1478.                 workScheduleSetting.WorkingDays = workScheduleSettings.WorkingDays;
  1479.             }
  1480.         }
  1481.  
  1482.  
  1483.         private void UpdateCalendarSettings(ICollection<CalendarSetting> calendarSettings,
  1484.             ICollection<CalendarSettingDTO> requestCalendarSettingDto)
  1485.         {
  1486.             if (requestCalendarSettingDto == null)
  1487.                 return;
  1488.  
  1489.             List<CalendarSetting> settingsToDelete = new List<CalendarSetting>();
  1490.             foreach (var settings in calendarSettings)
  1491.             {
  1492.                 var reqSetting = requestCalendarSettingDto.FirstOrDefault(x => x.Id == settings.Id);
  1493.                 if (reqSetting != null)
  1494.                 {
  1495.                     settings.BuiltIn = reqSetting.BuiltIn;
  1496.                     settings.Day = reqSetting.Day;
  1497.                     settings.Month = reqSetting.Month;
  1498.                     settings.Name = reqSetting.Name;
  1499.                     _unitOfWork.CalendarSettings.Update(settings);
  1500.                 }
  1501.                 else
  1502.                 {
  1503.                     settingsToDelete.Add(settings);
  1504.                 }
  1505.             }
  1506.  
  1507.             foreach (var setting in settingsToDelete)
  1508.             {
  1509.                 _unitOfWork.CalendarSettings.Delete(setting);
  1510.             }
  1511.  
  1512.             foreach (var requestSetting in requestCalendarSettingDto)
  1513.             {
  1514.                 if (requestSetting.Id == 0)
  1515.                 {
  1516.                     var mappedCalendarSettings = Mapper.Map<CalendarSetting>(requestSetting);
  1517.                     calendarSettings.Add(mappedCalendarSettings);
  1518.                 }
  1519.             }
  1520.         }
  1521.  
  1522.         private void UpdateAbsenceTypeAllocations(ICollection<AbsenceTypeAllocation> absenceTypeAllocations,
  1523.             ICollection<AbsenceTypeAllocationDTO> reqAbsenceTypeAllocations)
  1524.         {
  1525.             List<AbsenceTypeAllocation> absenceAllocationsToDelete = new List<AbsenceTypeAllocation>();
  1526.             foreach (var absenceAllocation in absenceTypeAllocations)
  1527.             {
  1528.                 var absenceType = _unitOfWork.AbsenceTypes.GetById(absenceAllocation.AbsenceType.Id);
  1529.                 var reqAbsence = reqAbsenceTypeAllocations.FirstOrDefault(x => x.Id == absenceAllocation.Id);
  1530.                 if (reqAbsence != null)
  1531.                 {
  1532.                     absenceAllocation.Year = reqAbsence.Year;
  1533.                     absenceAllocation.YearlyAllocations = reqAbsence.YearlyAllocations;
  1534.                     absenceAllocation.AbsenceTypeId = absenceType.Id;
  1535.                     absenceAllocation.AbsenceType = absenceType;
  1536.                     _unitOfWork.AbsenceTypeAllocations.Update(absenceAllocation);
  1537.                 }
  1538.                 else if (reqAbsenceTypeAllocations.Any() && reqAbsenceTypeAllocations.FirstOrDefault().Year == absenceAllocation.Year)
  1539.                 {
  1540.                     absenceAllocationsToDelete.Add(absenceAllocation);
  1541.                 }
  1542.             }
  1543.  
  1544.             foreach (var absenceAllocation in absenceAllocationsToDelete)
  1545.             {
  1546.                 _unitOfWork.AbsenceTypeAllocations.Delete(absenceAllocation);
  1547.             }
  1548.  
  1549.             foreach (var absenceAllocation in reqAbsenceTypeAllocations)
  1550.             {
  1551.                 if (absenceAllocation.Id == 0)
  1552.                 {
  1553.                     var absenceType = _unitOfWork.AbsenceTypes.GetById(absenceAllocation.AbsenceType.Id);
  1554.                     var mappedAbsenceTypeAllocation = Mapper.Map<AbsenceTypeAllocation>(absenceAllocation);
  1555.                     mappedAbsenceTypeAllocation.AbsenceType = absenceType;
  1556.                     mappedAbsenceTypeAllocation.AbsenceTypeId = absenceType.Id;
  1557.                     absenceTypeAllocations.Add(mappedAbsenceTypeAllocation);
  1558.                 }
  1559.             }
  1560.         }
  1561.  
  1562.         private void UpdateForcedAbsences(DepartmentSetting departmentSetting,
  1563.             UpdateDepartmentSettingsRequest request, int departmentId, bool isNeedRemoveSettings)
  1564.         {
  1565.             // If no request settings and no need to remove existed one - just pass this method.
  1566.             if (request.ForcedAbsences == null && !isNeedRemoveSettings)
  1567.                 return;
  1568.  
  1569.             if (isNeedRemoveSettings)
  1570.             {
  1571.                 departmentSetting.ForcedAbsences = null;
  1572.                 return;
  1573.             }
  1574.  
  1575.             _log.Info("Updating forced absences");
  1576.             var forcedAbsencesToDelete = new List<ForcedAbsence>();
  1577.             var absences = new List<AbsenceDTO>();
  1578.             foreach (var forcedAbsence in departmentSetting.ForcedAbsences)
  1579.             {
  1580.                 var reqAbsence = request.ForcedAbsences.FirstOrDefault(x => x.Id == forcedAbsence.Id);
  1581.                 if (reqAbsence != null)
  1582.                 {
  1583.                     forcedAbsence.Name = reqAbsence.Name;
  1584.                     forcedAbsence.AbsenceType = Mapper.Map<AbsenceType>(reqAbsence.AbsenceType);
  1585.                     forcedAbsence.From = reqAbsence.From;
  1586.                     forcedAbsence.To = reqAbsence.To;
  1587.                     _unitOfWork.ForcedAbsences.Update(forcedAbsence);
  1588.                 }
  1589.                 else
  1590.                 {
  1591.                     forcedAbsencesToDelete.Add(forcedAbsence);
  1592.                 }
  1593.             }
  1594.  
  1595.             foreach (var forcedAbsence in forcedAbsencesToDelete)
  1596.             {
  1597.                 _unitOfWork.ForcedAbsences.Delete(forcedAbsence);
  1598.             }
  1599.  
  1600.             var departmentById = _customerService.GetDepartmentById(new GetDepartmentByIdServiceRequest()
  1601.             {
  1602.                 DepartmentId = departmentId
  1603.             });
  1604.  
  1605.             var departmentUsers = new List<string>();
  1606.             GetAllUnoverridenDepartmentsUsers(departmentById.Department, departmentUsers, true);
  1607.             var parentSettings = GetParentSettings(request, departmentById);
  1608.             foreach (var forcedAbsence in request.ForcedAbsences)
  1609.             {
  1610.                 if (forcedAbsence.Id == 0)
  1611.                 {
  1612.                     var mappedForcedAbsence = Mapper.Map<ForcedAbsence>(forcedAbsence);
  1613.  
  1614.                     if (parentSettings != null && forcedAbsence.AbsenceType.Id == 0)
  1615.                     {
  1616.                         var absenceType =
  1617.                             parentSettings.DepartmentSettings.AbsenceTypes.FirstOrDefault(
  1618.                                 r => r.Name == forcedAbsence.AbsenceType.Name);
  1619.  
  1620.                         mappedForcedAbsence.AbsenceType = Mapper.Map<AbsenceType>(absenceType);
  1621.                         mappedForcedAbsence.AbsenceTypeId = mappedForcedAbsence.AbsenceType.Id;
  1622.                         departmentSetting.ForcedAbsences.Add(mappedForcedAbsence);
  1623.                         foreach (var user in departmentUsers)
  1624.                         {
  1625.                             absences.Add(new AbsenceDTO()
  1626.                             {
  1627.                                 UserId = user,
  1628.                                 State = AbsenceState.Approved,
  1629.                                 From = forcedAbsence.From,
  1630.                                 To = forcedAbsence.To,
  1631.                                 Comment = forcedAbsence.Name,
  1632.                                 AbsenceTypeId = absenceType.Id,
  1633.                                 AbsenceLenghtDay = 1,
  1634.                                 Reason = "Forced absence"
  1635.                             });
  1636.                         }
  1637.                     }
  1638.                     else
  1639.                     {
  1640.                         mappedForcedAbsence.AbsenceType = Mapper.Map<AbsenceType>(forcedAbsence.AbsenceType);
  1641.  
  1642.                         departmentSetting.ForcedAbsences.Add(mappedForcedAbsence);
  1643.                         foreach (var user in departmentUsers)
  1644.                         {
  1645.                             absences.Add(new AbsenceDTO()
  1646.                             {
  1647.                                 UserId = user,
  1648.                                 State = AbsenceState.Approved,
  1649.                                 From = forcedAbsence.From,
  1650.                                 To = forcedAbsence.To,
  1651.                                 Comment = forcedAbsence.Name,
  1652.                                 AbsenceTypeId = forcedAbsence.AbsenceType.Id,
  1653.                                 AbsenceLenghtDay = 1,
  1654.                                 Reason = "Forced absence"
  1655.                             });
  1656.                         }
  1657.                     }
  1658.                 }
  1659.             }
  1660.             _absenceService.DeleteAbsencesInTransaction(new DeleteAbsencesInTransactionRequest()
  1661.             {
  1662.                 Absences = Mapper.Map<ICollection<ForcedAbsenceDTO>>(forcedAbsencesToDelete),
  1663.                 Users = departmentUsers
  1664.             });
  1665.             _absenceService.CreateAbsencesInTransaction(new CreateAbsencesInTransactionRequest()
  1666.             {
  1667.                 Absences = absences
  1668.             });
  1669.         }
  1670.  
  1671.         private void GetAllUnoverridenDepartmentsUsers(DepartmentDTO department, List<string> users, bool isRoot)
  1672.         {
  1673.             var depSettings = _unitOfWork.DepartmentSettings.GetByDepartmentId(department.Id);
  1674.             if ((depSettings?.ForcedAbsences != null && depSettings.ForcedAbsences.Count < 1) || isRoot)
  1675.             {
  1676.                 users.AddRange(department.Users);
  1677.             }
  1678.             foreach (var childDepartment in department.Departments)
  1679.             {
  1680.                 GetAllUnoverridenDepartmentsUsers(childDepartment, users, false);
  1681.             }
  1682.         }
  1683.  
  1684.         private bool IsRootDepartmentOfCompany(int customerId, int departmentId)
  1685.         {
  1686.             var getCustomerByIdResponse = _customerService.GetCustomerById(new GetCustomerByIdServiceRequest() { CustomerId = customerId });
  1687.             ResponseStatus<CustomerService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(getCustomerByIdResponse, _log);
  1688.             var customerRootDepartment = getCustomerByIdResponse.Customer.Department;
  1689.             bool isRootDepartmentOfTheCompany = false;
  1690.             if (customerRootDepartment == null)
  1691.             {
  1692.                 throw new Exception("ERROR_NO_ROOT_DEPARTMENT");
  1693.             }
  1694.             if (customerRootDepartment.Id == departmentId)
  1695.                 isRootDepartmentOfTheCompany = true;
  1696.  
  1697.             return isRootDepartmentOfTheCompany;
  1698.         }
  1699.  
  1700.         private GetDepartmentSettingsResponse GetParentSettings(UpdateDepartmentSettingsRequest request, GetDepartmentByIdServiceResponse getDepartmentByIdResponse)
  1701.         {
  1702.             bool isRootDep = IsRootDepartmentOfCompany(getDepartmentByIdResponse.Department.CustomerId,
  1703.               request.DepartmentId);
  1704.  
  1705.             if (!isRootDep)
  1706.             {
  1707.                 // Get parent department
  1708.                 var parentDepartment = _customerService.GetParentDepartment(new GetParentDepartmentRequest()
  1709.                 {
  1710.                     DepartmentId = getDepartmentByIdResponse.Department.Id
  1711.                 });
  1712.  
  1713.                 ResponseStatus<CustomerService.Contracts.Models.Service.ServiceResponse>.CheckSuccess(parentDepartment, _log);
  1714.                 // Parent dep settings
  1715.                 var parentDepartmentSettings = GetDepartmentSettings(new GetDepartmentSettingsRequest() { DepartmentId = parentDepartment.Department.Id });
  1716.                 ResponseStatus<Contracts.Models.Service.ServiceResponse>.CheckSuccess(parentDepartmentSettings, _log);
  1717.                 return parentDepartmentSettings;
  1718.             }
  1719.             return null;
  1720.         }
  1721.         #endregion
  1722.     }
  1723. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement