using Simple.OData.Client; namespace JSONParser.Structure { public class Employee : Entity { public Person Person { get; set; } public Login Login { get; set; } public string Email { get; set; } public Department Department { get; set; } public JobTitle JobTitle { get; set; } public string JobTitleName { get; set; } public bool Status { get; set; } public override string ToString() { if (Person != null) { var fullname = $"{Person.LastName} {Person.FirstName}"; if (!string.IsNullOrEmpty(Person.MiddleName)) { fullname += $" {Person.MiddleName}"; } return fullname; } return base.ToString(); } public async Task FindByLogin(ODataClient client) { if (Login == null) return 0; var byLogin = await client .For("IEmployees") .Expand("Login") .Filter($"tolower(Login/LoginName) eq '{Login.LoginName?.ToLower()}'") .FindEntryAsync(); if (byLogin == null) return 0; return (long)byLogin["Id"]; } public async override Task Create(ODataClient client) { var newEmployee = new { ExternalId = Sid, Person = new { Id = Person.DirectumId }, Department = new { Id = Department.DirectumId }, JobTitle = new { Id = JobTitle.DirectumId }, Login = new { Id = Login == null ? 0 : Login.DirectumId }, Email = Email, NeedNotifyExpiredAssignments = false, NeedNotifyNewAssignments = false, NeedNotifyAssignmentsSummary = false, Status = "Active" }; var created = await client .For("IEmployees") .Set(newEmployee) .InsertEntryAsync(); this.DirectumId = (long)created["Id"]; return (long)created["Id"]; } public async override Task Update(ODataClient client, long id) { var newEmployee = new { ExternalId = Sid, Person = new { Id = Person.DirectumId }, Department = new { Id = Department.DirectumId }, JobTitle = new { Id = JobTitle.DirectumId }, Login = new { Id = Login == null ? 0 : Login.DirectumId }, Email = Email, NeedNotifyExpiredAssignments = false, NeedNotifyNewAssignments = false, NeedNotifyAssignmentsSummary = false, Status = Status ? "Active" : "Closed" }; var updated = await client .For("IEmployees") .Key(id) .Set(newEmployee) .UpdateEntryAsync(); this.DirectumId = (long)updated["Id"]; return (long)updated["Id"]; } public async Task CloseRecord(ODataClient client, long id) { var update = new { Login = new { Id = 0 }, Status = "Closed" }; await client .For("IEmployees") .Key(id) .Set(update) .UpdateEntryAsync(); } internal bool IsEqual(IDictionary? emp) { bool result = false; long? personId = null; long? loginId = null; long? departmentId = null; long? jobTitleId = null; bool status = false; if (emp["Person"] != null) { personId = emp["Person"]["Id"]; } if (emp["Login"] != null) { loginId = emp["Login"]["Id"]; } if (emp["Department"] != null) { departmentId = emp["Department"]["Id"]; } if (emp["JobTitle"] != null) { jobTitleId = emp["JobTitle"]["Id"]; } if (emp["Status"] != null) { status = emp["Status"] == "Active" ? true : false; } if (Person?.DirectumId == personId && Login?.DirectumId == loginId && Email == (string)emp["Email"] && Department?.DirectumId == departmentId && JobTitle?.DirectumId == jobTitleId && Status == status) { result = true; } return result; } public async Task TryFindBySid(ODataClient client) { long result = 0; var employee = await client .For("IEmployees") .Filter($"ExternalId eq '{Sid}' and Status eq 'Active'") .FindEntryAsync(); if (employee != null) { result = (long)employee["Id"]; } return result; } } }