150 lines
5.5 KiB
C#
150 lines
5.5 KiB
C#
using Newtonsoft.Json;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.DataAnnotations.Schema;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using taloyhtio.idp.parser.common.domain;
|
|
using taloyhtio.idp.parser.common.events;
|
|
//using webapi.Domain.Events;
|
|
//using webapi.Domain.SeedWork;
|
|
|
|
namespace taloyhtio.idp.parser.common.model
|
|
{
|
|
[Table("mdbFlats")]
|
|
public class Flat : Entity, IAggregateRoot
|
|
{
|
|
public Flat() { }
|
|
|
|
public Flat(Guid taloyhtioPMCId, string pmsCondoName, string flatTitle, Guid id)
|
|
{
|
|
PMCTaloyhtioId = taloyhtioPMCId;
|
|
CondoPMS = pmsCondoName;
|
|
FlatTitle = flatTitle;
|
|
|
|
Id = id;
|
|
PartitionKey = PMCTaloyhtioId.ToString();
|
|
//RowKey = Id.ToString();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Guid for identifying the flat
|
|
/// </summary>
|
|
//public Guid Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// i.e.
|
|
/// Church street 4 A 1 (usually high-rise has this form)
|
|
/// Church street 4 A(usually terraced house has this form, letter actually points to a flat)
|
|
/// NOTE: flat titles which are loaded to AzureDB table should be the same as used in PMS
|
|
/// </summary>
|
|
public string FlatTitle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Parent Condo of the flat in the same format as returned from PMS
|
|
/// </summary>
|
|
public string CondoPMS { get; set; }
|
|
|
|
/// <summary>
|
|
/// Taloyhtio PMC Id of condo to which current flat belongs to
|
|
/// </summary>
|
|
public Guid PMCTaloyhtioId { get; set; }
|
|
|
|
List<FlatUser> _users = new List<FlatUser>();
|
|
public List<FlatUser> Users => _users;
|
|
|
|
/// <summary>
|
|
///Depending on actual method which will be used for loading flats to AzureDB (see below) there also may be information about users which live in each flat
|
|
/// </summary>
|
|
public string FlatUsers
|
|
{
|
|
get { return _users == null || !_users.Any() ? null : JsonConvert.SerializeObject(_users); }
|
|
set
|
|
{
|
|
try
|
|
{
|
|
_users = JsonConvert.DeserializeObject<List<FlatUser>>(value);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
_users = new List<FlatUser>();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void SendApproval(Guid pmcId, Guid userId)
|
|
{
|
|
AddDomainEvent(new UserMappingApproveDomainEvent(pmcId, this.Id, userId));
|
|
}
|
|
|
|
public void AssignUser(Guid userId, string pmsUserName = null)
|
|
{
|
|
AddDomainEvent(new AddUserToFlatMappingDomainEvent(this, userId, pmsUserName));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Revoke user to flat mapping
|
|
/// </summary>
|
|
public void RevokeUserAssignment(string userName, Guid condoId)
|
|
{
|
|
AddDomainEvent(new RevokeUserAssignmentDomainEvent(userName, condoId, this));
|
|
}
|
|
|
|
public bool CompareUsersByPMSUserName(string pmsUserName)
|
|
{
|
|
if (!Users?.Any() ?? false) return false;
|
|
|
|
foreach (var user in Users)
|
|
{
|
|
//Check by full matched name
|
|
if (!string.IsNullOrEmpty(user.DisplayName) && user.DisplayName.Equals(pmsUserName, StringComparison.InvariantCultureIgnoreCase))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool CompareUsersByPIN(string pin, string userFirstName, string userLastName, DateTime? userBirthday, out string matchedPMSUserName)
|
|
{
|
|
matchedPMSUserName = null;
|
|
|
|
if (!Users?.Any() ?? true) return false;
|
|
|
|
foreach (var user in Users)
|
|
{
|
|
//Check by full matched PIN
|
|
if (!string.IsNullOrEmpty(user.PIN) && user.PIN.Equals(pin, StringComparison.InvariantCultureIgnoreCase))
|
|
{
|
|
matchedPMSUserName = user.DisplayName;
|
|
return true;
|
|
}
|
|
|
|
//Check by partly matched PIN
|
|
//var pmsUserName = user.DisplayName;
|
|
var pinParts = user.PIN.Split('-')?[0];
|
|
if (DateTime.TryParseExact(pinParts, "ddMMyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var userPINBirthDate))
|
|
{
|
|
var result = (userBirthday.HasValue && userPINBirthDate.Date == userBirthday.Value.Date);
|
|
if (result)
|
|
{
|
|
var userNameParts = userFirstName.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
|
var pmsLastName = userNameParts.Last();
|
|
for (var i = 0; i < userNameParts.Count() - 1; i++)
|
|
{
|
|
var pmsFirstName = userNameParts[i];
|
|
var userDispalyName = $"{userFirstName} {userLastName}";
|
|
if (userDispalyName.Equals($"{pmsFirstName} {pmsLastName}", StringComparison.InvariantCultureIgnoreCase) ||
|
|
(userDispalyName.Equals($"{pmsLastName} {pmsFirstName}", StringComparison.InvariantCultureIgnoreCase)))
|
|
{
|
|
matchedPMSUserName = user.DisplayName;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
} |