Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,6 @@

7. **[Шаблон кода для работы с S3-хранилищем](S3Connector/)**
- Шаблон с методами получения файлов из хранилища, работающего по протоколу S3.

7. **[Шаблон обработки ответов от коннектора к SAP](SAPConnector/)**
- Шаблон с методами синхронизации орг. структуры с SAP.
161 changes: 161 additions & 0 deletions SAPConnector/ImportRuleDepartmentManagerServerFunctions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using DirRX.SapIntegration.ImportRuleDepartmentManager;

namespace DirRX.SapIntegration.Server
{
partial class ImportRuleDepartmentManagerFunctions
{
/// <summary>
/// Выполнить сохранение полученных данных в RX.
/// </summary>
/// <param name="response">Матрица с ответом от SAP.</param>
/// <param name="logs">Структурированный лог.</param>
public override void SaveData(List<System.Collections.Generic.Dictionary<string, string>> response, List<DirRX.SapIntegration.Structures.Module.LogStruct> logs)
{
var managers = new List<DirRX.SapIntegration.Structures.ImportRuleDepartmentManager.DepartmentManager>();

// Получить руководящие должности, где OType = S, Vrsign = B и Vrelat = 012.
var filteredResponse = response.Where(x =>
x.Any(y => y.Key == Constants.ImportRuleBase.IsStructuralExist && y.Value == "1") &&
x.Any(y => y.Key == Constants.ImportRuleBase.SAPStructuralFields.Otype && y.Value == "S") &&
x.Any(y => y.Key == Constants.ImportRuleBase.SAPStructuralFields.Vrsign && y.Value == "B") &&
x.Any(y => y.Key == Constants.ImportRuleBase.SAPStructuralFields.Vrelat && y.Value == "012")
);
foreach (var responseItem in filteredResponse)
{
var manager = ParseResponseItem(responseItem, response, logs);
if (manager != null)
managers.Add(manager);
}

if (managers.Any())
{
ImportDepartmentManagers(managers, logs);
}
}

/// <summary>
/// Обработка строки матрицы с ответом от SAP.
/// </summary>
/// <param name="responseItem">Строка матрицы с ответом от SAP.</param>
/// <param name="response">Полная матрица с ответом от SAP.</param>
/// <param name="logs">Структурированный лог.</param>
/// <returns>Свойства сущности в структурированном виде.</returns>
public virtual DirRX.SapIntegration.Structures.ImportRuleDepartmentManager.DepartmentManager ParseResponseItem(System.Collections.Generic.Dictionary<string, string> responseItem,
List<System.Collections.Generic.Dictionary<string, string>> response,
List<DirRX.SapIntegration.Structures.Module.LogStruct> logs)
{
var departmentSapId = string.Empty;
var managerSapId = string.Empty;
var jobTitleSapId = responseItem[Constants.ImportRuleBase.SAPObjectFields.SapID];
// Получить вышестоящий элемент - подразделение.
var parentId = responseItem[Constants.ImportRuleBase.SAPStructuralFields.Pup];
if (parentId != "0")
{
var parentNode = response.FirstOrDefault(x => x.Any(y => y.Key == Constants.ImportRuleBase.SAPStructuralFields.Seqnr && y.Value == parentId));
if (parentNode != null)
{
departmentSapId = parentNode[Constants.ImportRuleBase.SAPObjectFields.SapID];
}
}
else
{
var errorMessage = string.Format("Нет вышестоящих элементов (подразделений) для должности {0}.", jobTitleSapId);
Logger.Error(errorMessage);
logs.Add(DirRX.SapIntegration.Functions.Module.CreateLogItem(_obj.Name,
DirRX.SapIntegration.Constants.Module.Logging.MessageLevel.ResponseLevel,
DirRX.SapIntegration.Constants.Module.Logging.MessageType.Error,
errorMessage));
}

// Получить сотрудника по штатной должности.
var jobTitle = Solution.JobTitles.GetAll().Where(x => x.IDSAP != null && x.IDSAP == jobTitleSapId).FirstOrDefault();
var managers = Solution.Employees.GetAll().Where(x => Solution.JobTitles.Equals(x.JobTitle, jobTitle) && x.Status == Sungero.CoreEntities.DatabookEntry.Status.Active);
if (managers.Count() > 1)
{
var errorMessage = string.Format("Найдено больше одного сотрудника для должности {0}.", jobTitleSapId);
Logger.Error(errorMessage);
logs.Add(DirRX.SapIntegration.Functions.Module.CreateLogItem(_obj.Name,
DirRX.SapIntegration.Constants.Module.Logging.MessageLevel.ResponseLevel,
DirRX.SapIntegration.Constants.Module.Logging.MessageType.Error,
errorMessage));
}
else
{
var manager = managers.FirstOrDefault();
if (manager != null)
managerSapId = manager.IDSAP;
else
{
var errorMessage = string.Format("Не найдено ни одного сотрудника для должности {0}.", jobTitleSapId);
Logger.Error(errorMessage);
logs.Add(DirRX.SapIntegration.Functions.Module.CreateLogItem(_obj.Name,
DirRX.SapIntegration.Constants.Module.Logging.MessageLevel.ResponseLevel,
DirRX.SapIntegration.Constants.Module.Logging.MessageType.Error,
errorMessage));

}
}

if (!string.IsNullOrWhiteSpace(departmentSapId) && !string.IsNullOrWhiteSpace(managerSapId))
{
var managerData = new DirRX.SapIntegration.Structures.ImportRuleDepartmentManager.DepartmentManager();
managerData.DepartmentSapId = departmentSapId;
managerData.ManagerSapId = managerSapId;
return managerData;
}
else
return null;
}

/// <summary>
/// Процедура импорта руководителей подразделений.
/// </summary>
/// <param name="items">Структурированный набор данных по импортируемым руководителям подразделений.</param>
/// <returns>Список структурированных логов.</returns>
[Remote]
public virtual void ImportDepartmentManagers(List<DirRX.SapIntegration.Structures.ImportRuleDepartmentManager.DepartmentManager>
items, List<DirRX.SapIntegration.Structures.Module.LogStruct> logs)
{
var i = 0;
var total = items.Count;
foreach (var item in items)
{
i++;
var department = Solution.Departments.GetAll().Where(d => d.IDSAP == item.DepartmentSapId).FirstOrDefault();
if (department != null)
{
var manager = Solution.Employees.Null;
if (!string.IsNullOrWhiteSpace(item.ManagerSapId))
manager = Solution.Employees.GetAll().Where(x => x.IDSAP == item.ManagerSapId).FirstOrDefault();
if (!Solution.Departments.Equals(department.Manager, manager))
department.Manager = manager;
}

try
{
if (department.State.IsChanged)
{
Logger.DebugFormat("Обновление руководителей подразделений: {0}/{1}", i, total);
department.Save();
Logger.Debug(string.Format("Заполнение руководителя Подразделения {0}.", department.Name));
}
}
catch (Exception ex)
{
var errorMessage = string.Format("Ошибка при заполнении руководителя Подразделения {0}. Подробности: {1}.", department.Name, ex.Message);
Logger.Error(errorMessage, ex);
logs.Add(DirRX.SapIntegration.Functions.Module.CreateLogItem(_obj.Name,
DirRX.SapIntegration.Constants.Module.Logging.MessageLevel.ResponseLevel,
DirRX.SapIntegration.Constants.Module.Logging.MessageType.Error,
errorMessage));
}
}
}

}
}
Loading