Merge branch 'develop' of github.com:Frappet/BMA-EHR-BackEnd into develop
This commit is contained in:
commit
7876063288
2 changed files with 411 additions and 271 deletions
|
|
@ -2557,7 +2557,7 @@ namespace BMA.EHR.Application.Repositories.Commands
|
|||
{
|
||||
case "C-PM-01":
|
||||
case "C-PM-02":
|
||||
await ExecuteCommand01_02Async(command);
|
||||
await ExecuteCommand01_02Async(command, token);
|
||||
break;
|
||||
case "C-PM-03":
|
||||
await ExecuteCommand03Async(command);
|
||||
|
|
@ -2675,7 +2675,7 @@ namespace BMA.EHR.Application.Repositories.Commands
|
|||
/// </summary>
|
||||
/// <param name="command">object ของรายการคำสั่ง</param>
|
||||
/// <returns></returns>
|
||||
private async Task ExecuteCommand01_02Async(Command command)
|
||||
private async Task ExecuteCommand01_02Async(Command command, string token="")
|
||||
{
|
||||
try
|
||||
{
|
||||
|
|
@ -2756,228 +2756,363 @@ namespace BMA.EHR.Application.Repositories.Commands
|
|||
throw new Exception("Invalid placement profile: " + recv.RefPlacementProfileId);
|
||||
|
||||
// ใส่ฟีลจากข้อมูล
|
||||
var profile = new Profile
|
||||
////var profile = new Profile
|
||||
////{
|
||||
//// ProfileType = "officer",
|
||||
//// CitizenId = placementProfile.CitizenId,
|
||||
//// Prefix = placementProfile.Prefix,
|
||||
//// FirstName = placementProfile.Firstname,
|
||||
//// LastName = placementProfile.Lastname,
|
||||
//// Gender = placementProfile.Gender,
|
||||
//// Nationality = placementProfile.Nationality,
|
||||
//// BirthDate = placementProfile.DateOfBirth == null ? DateTime.MinValue : placementProfile.DateOfBirth.Value,
|
||||
//// RelationshipId = placementProfile.Relationship == null ? Guid.Empty : placementProfile.Relationship!.Id,
|
||||
//// TelephoneNumber = placementProfile.Telephone,
|
||||
//// Race = placementProfile.Race,
|
||||
//// ReligionId = placementProfile.Religion == null ? Guid.Empty : placementProfile.Religion.Id,
|
||||
//// BloodGroupId = placementProfile.BloodGroup == null ? Guid.Empty : placementProfile.BloodGroup.Id,
|
||||
|
||||
//// DateAppoint = placementProfile.RecruitDate == null ? null : placementProfile.RecruitDate.Value,
|
||||
//// DateStart = placementProfile.RecruitDate == null ? null : placementProfile.RecruitDate.Value,
|
||||
|
||||
//// RegistrationAddress = placementProfile.RegistAddress,
|
||||
//// RegistrationSubDistrictId = placementProfile.RegistSubDistrict == null ? Guid.Empty : placementProfile.RegistSubDistrict!.Id,
|
||||
//// RegistrationDistrictId = placementProfile.RegistDistrict == null ? Guid.Empty : placementProfile.RegistDistrict!.Id,
|
||||
//// RegistrationProvinceId = placementProfile.RegistProvince == null ? Guid.Empty : placementProfile.RegistProvince!.Id,
|
||||
//// RegistrationZipCode = placementProfile.RegistSubDistrict == null ? null : placementProfile.RegistSubDistrict!.ZipCode,
|
||||
|
||||
//// CurrentAddress = placementProfile.CurrentAddress,
|
||||
//// CurrentSubDistrictId = placementProfile.CurrentSubDistrict == null ? Guid.Empty : placementProfile.CurrentSubDistrict!.Id,
|
||||
//// CurrentDistrictId = placementProfile.CurrentDistrict == null ? Guid.Empty : placementProfile.CurrentDistrict!.Id,
|
||||
//// CurrentProvinceId = placementProfile.CurrentProvince == null ? Guid.Empty : placementProfile.CurrentProvince!.Id,
|
||||
//// CurrentZipCode = placementProfile.CurrentSubDistrict == null ? null : placementProfile.CurrentSubDistrict!.ZipCode,
|
||||
|
||||
//// FatherPrefixId = placementProfile.FatherPrefix == null ? null : placementProfile.FatherPrefix.Id,
|
||||
//// FatherFirstName = placementProfile.FatherFirstName,
|
||||
//// FatherLastName = placementProfile.FatherLastName,
|
||||
//// FatherCareer = placementProfile.FatherOccupation,
|
||||
//// FatherLive = true,
|
||||
|
||||
//// MotherPrefixId = placementProfile.MotherPrefix == null ? null : placementProfile.MotherPrefix.Id,
|
||||
//// MotherFirstName = placementProfile.MotherFirstName,
|
||||
//// MotherLastName = placementProfile.MotherLastName,
|
||||
//// MotherCareer = placementProfile.MotherOccupation,
|
||||
//// MotherLive = true,
|
||||
|
||||
//// Couple = placementProfile.MarryPrefix == null ? false : true,
|
||||
//// CouplePrefixId = placementProfile.MarryPrefix == null ? null : placementProfile.MarryPrefix.Id,
|
||||
//// CoupleFirstName = placementProfile.MarryFirstName,
|
||||
//// CoupleLastName = placementProfile.MarryLastName,
|
||||
//// CoupleCareer = placementProfile.MarryOccupation,
|
||||
//// CoupleLive = placementProfile.MarryPrefix == null ? false : true,
|
||||
|
||||
//// Position = placementProfile.PositionPath,
|
||||
//// PositionPathSideId = placementProfile.PositionPathSide == null ? Guid.Empty : placementProfile.PositionPathSide.Id,
|
||||
//// PositionType = placementProfile.PositionType,
|
||||
//// PositionLevel = placementProfile.PositionLevel,
|
||||
//// //PositionEmployeeLevel = placementProfile.PositionLevel,
|
||||
//// PositionLineId = placementProfile.PositionLine == null ? Guid.Empty : placementProfile.PositionLine.Id,
|
||||
//// PositionLine = placementProfile.PositionLine == null ? "" : placementProfile.PositionLine.Name,
|
||||
//// PosNo = placementProfile.OrganizationPosition!.PositionNumber,
|
||||
|
||||
//// IsVerified = true,
|
||||
//// IsProbation = true,
|
||||
//// Physical = "",
|
||||
//// Ability = "",
|
||||
//// AvatarRef = "",
|
||||
//// GovAgeAbsent = 0,
|
||||
//// GovAgePlus = 0,
|
||||
//// EntryStatus = "",
|
||||
//// IsTransfer = false,
|
||||
//// IsActive = true,
|
||||
//// IsLeave = false,
|
||||
//// VerifiedUser = "",
|
||||
//// FirstNameOld = "",
|
||||
//// LastNameOld = "",
|
||||
//// // CoupleLive = false,
|
||||
//// // FatherLive = false,
|
||||
//// // MotherLive = false,
|
||||
//// CreatedUser = "",
|
||||
|
||||
//// Educations = new List<ProfileEducation>(),
|
||||
//// Certificates = new List<ProfileCertificate>(),
|
||||
//// Salaries = new List<ProfileSalary>(),
|
||||
//// CreatedAt = DateTime.Now,
|
||||
//// CreatedFullName = FullName ?? "System Administrator",
|
||||
//// CreatedUserId = UserId ?? "",
|
||||
//// LastUpdatedAt = DateTime.Now,
|
||||
//// LastUpdateFullName = FullName ?? "System Administrator",
|
||||
//// LastUpdateUserId = UserId ?? "",
|
||||
|
||||
//// // organization
|
||||
//// OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id,
|
||||
//// OrganizationShortName = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Name,
|
||||
//// OrganizationOrganizationId = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Id,
|
||||
//// OrganizationOrganization = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Name,
|
||||
//// OcId = placementProfile.OrganizationPosition!.Organization!.Id,
|
||||
//// Oc = _organizationCommonRepository.GetOrganizationNameFullPath(placementProfile.OrganizationPosition!.Organization!.Id, false, false, "/"),
|
||||
|
||||
////};
|
||||
|
||||
/*ข้อมูล Profile ใหม่*/
|
||||
var apiUrl = $"{_configuration["API"]}/org/profile/all";
|
||||
var profileId = string.Empty;
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
ProfileType = "officer",
|
||||
CitizenId = placementProfile.CitizenId,
|
||||
Prefix = placementProfile.Prefix,
|
||||
FirstName = placementProfile.Firstname,
|
||||
LastName = placementProfile.Lastname,
|
||||
Gender = placementProfile.Gender,
|
||||
Nationality = placementProfile.Nationality,
|
||||
BirthDate = placementProfile.DateOfBirth == null ? DateTime.MinValue : placementProfile.DateOfBirth.Value,
|
||||
RelationshipId = placementProfile.Relationship == null ? Guid.Empty : placementProfile.Relationship!.Id,
|
||||
TelephoneNumber = placementProfile.Telephone,
|
||||
Race = placementProfile.Race,
|
||||
ReligionId = placementProfile.Religion == null ? Guid.Empty : placementProfile.Religion.Id,
|
||||
BloodGroupId = placementProfile.BloodGroup == null ? Guid.Empty : placementProfile.BloodGroup.Id,
|
||||
|
||||
DateAppoint = placementProfile.RecruitDate == null ? null : placementProfile.RecruitDate.Value,
|
||||
DateStart = placementProfile.RecruitDate == null ? null : placementProfile.RecruitDate.Value,
|
||||
|
||||
RegistrationAddress = placementProfile.RegistAddress,
|
||||
RegistrationSubDistrictId = placementProfile.RegistSubDistrict == null ? Guid.Empty : placementProfile.RegistSubDistrict!.Id,
|
||||
RegistrationDistrictId = placementProfile.RegistDistrict == null ? Guid.Empty : placementProfile.RegistDistrict!.Id,
|
||||
RegistrationProvinceId = placementProfile.RegistProvince == null ? Guid.Empty : placementProfile.RegistProvince!.Id,
|
||||
RegistrationZipCode = placementProfile.RegistSubDistrict == null ? null : placementProfile.RegistSubDistrict!.ZipCode,
|
||||
|
||||
CurrentAddress = placementProfile.CurrentAddress,
|
||||
CurrentSubDistrictId = placementProfile.CurrentSubDistrict == null ? Guid.Empty : placementProfile.CurrentSubDistrict!.Id,
|
||||
CurrentDistrictId = placementProfile.CurrentDistrict == null ? Guid.Empty : placementProfile.CurrentDistrict!.Id,
|
||||
CurrentProvinceId = placementProfile.CurrentProvince == null ? Guid.Empty : placementProfile.CurrentProvince!.Id,
|
||||
CurrentZipCode = placementProfile.CurrentSubDistrict == null ? null : placementProfile.CurrentSubDistrict!.ZipCode,
|
||||
|
||||
FatherPrefixId = placementProfile.FatherPrefix == null ? null : placementProfile.FatherPrefix.Id,
|
||||
FatherFirstName = placementProfile.FatherFirstName,
|
||||
FatherLastName = placementProfile.FatherLastName,
|
||||
FatherCareer = placementProfile.FatherOccupation,
|
||||
FatherLive = true,
|
||||
|
||||
MotherPrefixId = placementProfile.MotherPrefix == null ? null : placementProfile.MotherPrefix.Id,
|
||||
MotherFirstName = placementProfile.MotherFirstName,
|
||||
MotherLastName = placementProfile.MotherLastName,
|
||||
MotherCareer = placementProfile.MotherOccupation,
|
||||
MotherLive = true,
|
||||
|
||||
Couple = placementProfile.MarryPrefix == null ? false : true,
|
||||
CouplePrefixId = placementProfile.MarryPrefix == null ? null : placementProfile.MarryPrefix.Id,
|
||||
CoupleFirstName = placementProfile.MarryFirstName,
|
||||
CoupleLastName = placementProfile.MarryLastName,
|
||||
CoupleCareer = placementProfile.MarryOccupation,
|
||||
CoupleLive = placementProfile.MarryPrefix == null ? false : true,
|
||||
|
||||
Position = placementProfile.PositionPath,
|
||||
PositionPathSideId = placementProfile.PositionPathSide == null ? Guid.Empty : placementProfile.PositionPathSide.Id,
|
||||
PositionType = placementProfile.PositionType,
|
||||
PositionLevel = placementProfile.PositionLevel,
|
||||
//PositionEmployeeLevel = placementProfile.PositionLevel,
|
||||
PositionLineId = placementProfile.PositionLine == null ? Guid.Empty : placementProfile.PositionLine.Id,
|
||||
PositionLine = placementProfile.PositionLine == null ? "" : placementProfile.PositionLine.Name,
|
||||
PosNo = placementProfile.OrganizationPosition!.PositionNumber,
|
||||
|
||||
IsVerified = true,
|
||||
IsProbation = true,
|
||||
Physical = "",
|
||||
Ability = "",
|
||||
AvatarRef = "",
|
||||
GovAgeAbsent = 0,
|
||||
GovAgePlus = 0,
|
||||
EntryStatus = "",
|
||||
IsTransfer = false,
|
||||
IsActive = true,
|
||||
IsLeave = false,
|
||||
VerifiedUser = "",
|
||||
FirstNameOld = "",
|
||||
LastNameOld = "",
|
||||
// CoupleLive = false,
|
||||
// FatherLive = false,
|
||||
// MotherLive = false,
|
||||
CreatedUser = "",
|
||||
|
||||
Educations = new List<ProfileEducation>(),
|
||||
Certificates = new List<ProfileCertificate>(),
|
||||
Salaries = new List<ProfileSalary>(),
|
||||
CreatedAt = DateTime.Now,
|
||||
CreatedFullName = FullName ?? "System Administrator",
|
||||
CreatedUserId = UserId ?? "",
|
||||
LastUpdatedAt = DateTime.Now,
|
||||
LastUpdateFullName = FullName ?? "System Administrator",
|
||||
LastUpdateUserId = UserId ?? "",
|
||||
|
||||
// organization
|
||||
OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id,
|
||||
OrganizationShortName = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Name,
|
||||
OrganizationOrganizationId = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Id,
|
||||
OrganizationOrganization = placementProfile.OrganizationPosition!.Organization!.OrganizationOrganization!.Name,
|
||||
OcId = placementProfile.OrganizationPosition!.Organization!.Id,
|
||||
Oc = _organizationCommonRepository.GetOrganizationNameFullPath(placementProfile.OrganizationPosition!.Organization!.Id, false, false, "/"),
|
||||
|
||||
};
|
||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
|
||||
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
|
||||
var _res = await client.PostAsJsonAsync(apiUrl, new
|
||||
{
|
||||
rank = string.Empty,
|
||||
prefix = placementProfile.Prefix.Name == null ? string.Empty : placementProfile.Prefix.Name,
|
||||
firstName = placementProfile.Firstname == null ? string.Empty : placementProfile.Firstname,
|
||||
lastName = placementProfile.Lastname == null ? string.Empty : placementProfile.Lastname,
|
||||
citizenId = placementProfile.CitizenId == null ? string.Empty : placementProfile.CitizenId,
|
||||
position = placementProfile.positionName == null ? string.Empty : placementProfile.positionName,
|
||||
posLevelId = placementProfile.posLevelId == null ? string.Empty : placementProfile.posLevelId,
|
||||
posTypeId = placementProfile.posTypeId == null ? string.Empty : placementProfile.posTypeId,
|
||||
email = placementProfile.Email == null ? string.Empty : placementProfile.Email,
|
||||
phone = placementProfile.MobilePhone == null ? string.Empty : placementProfile.MobilePhone,
|
||||
keycloak = string.Empty,
|
||||
isProbation = false,
|
||||
isLeave = false,
|
||||
dateRetire = (DateTime?)null,
|
||||
dateAppoint = placementProfile.RecruitDate == null ? (DateTime?)null : placementProfile.RecruitDate,
|
||||
dateStart = (DateTime?)null,
|
||||
govAgeAbsent = 0,
|
||||
govAgePlus = 0,
|
||||
birthDate = placementProfile.DateOfBirth == null ? (DateTime?)null : placementProfile.DateOfBirth,
|
||||
reasonSameDate = (DateTime?)null,
|
||||
ethnicity = placementProfile.Race == null ? string.Empty : placementProfile.Race,
|
||||
telephoneNumber = placementProfile.Telephone == null ? string.Empty : placementProfile.Telephone,
|
||||
nationality = placementProfile.Nationality == null ? string.Empty : placementProfile.Nationality,
|
||||
gender = placementProfile.Gender == null ? string.Empty : placementProfile.Gender.Name,
|
||||
relationship = placementProfile.Relationship == null ? string.Empty : placementProfile.Relationship.Name,
|
||||
religion = placementProfile.Religion == null ? string.Empty : placementProfile.Religion.Name,
|
||||
bloodGroup = string.Empty,
|
||||
registrationAddress = placementProfile.RegistAddress == null ? string.Empty : placementProfile.RegistAddress,
|
||||
registrationProvinceId = (String?)null,
|
||||
registrationDistrictId = (String?)null,
|
||||
registrationSubDistrictId = (String?)null,
|
||||
registrationZipCode = placementProfile.RegistZipCode == null ? string.Empty : placementProfile.RegistZipCode,
|
||||
currentAddress = placementProfile.CurrentAddress == null ? string.Empty : placementProfile.CurrentAddress,
|
||||
currentProvinceId = (String?)null,
|
||||
currentDistrictId = (String?)null,
|
||||
currentSubDistrictId = (String?)null,
|
||||
currentZipCode = placementProfile.CurrentZipCode == null ? string.Empty : placementProfile.CurrentZipCode,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
profileId = JsonConvert.DeserializeObject<PlacementProfileId>(_result).result;
|
||||
}
|
||||
|
||||
// add profile education
|
||||
foreach (var edu in placementProfile.PlacementEducations)
|
||||
////foreach (var edu in placementProfile.PlacementEducations)
|
||||
////{
|
||||
//// profile.Educations.Add(new ProfileEducation
|
||||
//// {
|
||||
//// Country = edu.Country,
|
||||
//// Degree = edu.Degree,
|
||||
//// Duration = edu.Duration,
|
||||
//// DurationYear = edu.DurationYear == null ? 0 : edu.DurationYear.Value,
|
||||
//// EducationLevelId = edu.EducationLevel == null ? Guid.Empty : edu.EducationLevel.Id,
|
||||
//// EducationLevel = edu.EducationLevel == null ? "" : edu.EducationLevel.Name,
|
||||
//// StartDate = edu.StartDate,
|
||||
//// EndDate = edu.EndDate,
|
||||
//// Field = edu.Field,
|
||||
//// FinishDate = edu.FinishDate,
|
||||
//// FundName = edu.FundName,
|
||||
//// Gpa = edu.Gpa,
|
||||
//// Institute = edu.Institute,
|
||||
//// IsActive = true,
|
||||
//// CreatedAt = DateTime.Now,
|
||||
//// CreatedFullName = FullName ?? "System Administrator",
|
||||
//// CreatedUserId = UserId ?? "",
|
||||
//// LastUpdatedAt = DateTime.Now,
|
||||
//// LastUpdateFullName = FullName ?? "System Administrator",
|
||||
//// LastUpdateUserId = UserId ?? "",
|
||||
//// });
|
||||
////}
|
||||
|
||||
if (placementProfile.PlacementEducations != null)
|
||||
{
|
||||
profile.Educations.Add(new ProfileEducation
|
||||
var apiUrlEdu = $"{_configuration["API"]}/org/profile/educations";
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
Country = edu.Country,
|
||||
Degree = edu.Degree,
|
||||
Duration = edu.Duration,
|
||||
DurationYear = edu.DurationYear == null ? 0 : edu.DurationYear.Value,
|
||||
EducationLevelId = edu.EducationLevel == null ? Guid.Empty : edu.EducationLevel.Id,
|
||||
EducationLevel = edu.EducationLevel == null ? "" : edu.EducationLevel.Name,
|
||||
StartDate = edu.StartDate,
|
||||
EndDate = edu.EndDate,
|
||||
Field = edu.Field,
|
||||
FinishDate = edu.FinishDate,
|
||||
FundName = edu.FundName,
|
||||
Gpa = edu.Gpa,
|
||||
Institute = edu.Institute,
|
||||
IsActive = true,
|
||||
CreatedAt = DateTime.Now,
|
||||
CreatedFullName = FullName ?? "System Administrator",
|
||||
CreatedUserId = UserId ?? "",
|
||||
LastUpdatedAt = DateTime.Now,
|
||||
LastUpdateFullName = FullName ?? "System Administrator",
|
||||
LastUpdateUserId = UserId ?? "",
|
||||
});
|
||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
|
||||
foreach (var edu in placementProfile.PlacementEducations)
|
||||
{
|
||||
var _res = await client.PostAsJsonAsync(apiUrlEdu, new
|
||||
{
|
||||
profileId = profileId,
|
||||
country = edu.Country == null ? string.Empty : edu.Country,
|
||||
degree = edu.Degree == null ? string.Empty : edu.Degree,
|
||||
duration = edu.Duration == null ? string.Empty : edu.Duration,
|
||||
durationYear = edu.DurationYear == null ? 0 : edu.DurationYear,
|
||||
field = edu.Field == null ? string.Empty : edu.Field,
|
||||
finishDate = edu.FinishDate == null ? (DateTime?)null : edu.FinishDate,
|
||||
fundName = edu.FundName == null ? string.Empty : edu.FundName,
|
||||
gpa = edu.Gpa == null ? string.Empty : edu.Gpa,
|
||||
institute = edu.Institute == null ? string.Empty : edu.Institute,
|
||||
other = edu.Other == null ? string.Empty : edu.Other,
|
||||
startDate = edu.StartDate == null ? (DateTime?)null : edu.StartDate,
|
||||
endDate = edu.EndDate == null ? (DateTime?)null : edu.EndDate,
|
||||
educationLevel = edu.EducationLevel == null ? string.Empty : edu.EducationLevel.Name,
|
||||
educationLevelId = string.Empty,
|
||||
positionPath = edu.PositionPath == null ? null : edu.PositionPath,
|
||||
positionPathId = string.Empty,
|
||||
isDate = edu.IsDate,
|
||||
isEducation = edu.IsEducation,
|
||||
note = string.Empty,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// add profile certificate
|
||||
foreach (var cert in placementProfile.PlacementCertificates)
|
||||
////foreach (var cert in placementProfile.PlacementCertificates)
|
||||
////{
|
||||
//// profile.Certificates.Add(new ProfileCertificate
|
||||
//// {
|
||||
//// CertificateNo = cert.CertificateNo,
|
||||
//// IssueDate = cert.IssueDate,
|
||||
//// Issuer = cert.Issuer,
|
||||
//// CertificateType = cert.CertificateType,
|
||||
//// ExpireDate = cert.ExpireDate,
|
||||
//// IsActive = true,
|
||||
//// CreatedAt = DateTime.Now,
|
||||
//// CreatedFullName = FullName ?? "System Administrator",
|
||||
//// CreatedUserId = UserId ?? "",
|
||||
//// LastUpdatedAt = DateTime.Now,
|
||||
//// LastUpdateFullName = FullName ?? "System Administrator",
|
||||
//// LastUpdateUserId = UserId ?? "",
|
||||
//// });
|
||||
////}
|
||||
|
||||
if (placementProfile.PlacementCertificates != null)
|
||||
{
|
||||
profile.Certificates.Add(new ProfileCertificate
|
||||
var apiUrlCer = $"{_configuration["API"]}/org/profile/certificate";
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
CertificateNo = cert.CertificateNo,
|
||||
IssueDate = cert.IssueDate,
|
||||
Issuer = cert.Issuer,
|
||||
CertificateType = cert.CertificateType,
|
||||
ExpireDate = cert.ExpireDate,
|
||||
IsActive = true,
|
||||
CreatedAt = DateTime.Now,
|
||||
CreatedFullName = FullName ?? "System Administrator",
|
||||
CreatedUserId = UserId ?? "",
|
||||
LastUpdatedAt = DateTime.Now,
|
||||
LastUpdateFullName = FullName ?? "System Administrator",
|
||||
LastUpdateUserId = UserId ?? "",
|
||||
});
|
||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
|
||||
foreach (var cer in placementProfile.PlacementCertificates)
|
||||
{
|
||||
var _res = await client.PostAsJsonAsync(apiUrlCer, new
|
||||
{
|
||||
profileId = profileId,
|
||||
expireDate = cer.ExpireDate == null ? (DateTime?)null : cer.ExpireDate,
|
||||
issueDate = cer.IssueDate == null ? (DateTime?)null : cer.IssueDate,
|
||||
certificateNo = cer.CertificateNo == null ? string.Empty : cer.CertificateNo,
|
||||
certificateType = cer.CertificateType == null ? string.Empty : cer.CertificateType,
|
||||
issuer = cer.Issuer == null ? string.Empty : cer.Issuer,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// add profile document
|
||||
foreach (var doc in placementProfile.PlacementProfileDocs)
|
||||
{
|
||||
profile.Papers.Add(new ProfilePaper
|
||||
{
|
||||
CategoryName = "Profile Documents",
|
||||
Document = doc.Document,
|
||||
Detail = doc.Document.FileName,
|
||||
CreatedAt = DateTime.Now,
|
||||
CreatedFullName = FullName ?? "System Administrator",
|
||||
CreatedUserId = UserId ?? "",
|
||||
LastUpdatedAt = DateTime.Now,
|
||||
LastUpdateFullName = FullName ?? "System Administrator",
|
||||
LastUpdateUserId = UserId ?? "",
|
||||
});
|
||||
}
|
||||
////foreach (var doc in placementProfile.PlacementProfileDocs)
|
||||
////{
|
||||
//// profile.Papers.Add(new ProfilePaper
|
||||
//// {
|
||||
//// CategoryName = "Profile Documents",
|
||||
//// Document = doc.Document,
|
||||
//// Detail = doc.Document.FileName,
|
||||
//// CreatedAt = DateTime.Now,
|
||||
//// CreatedFullName = FullName ?? "System Administrator",
|
||||
//// CreatedUserId = UserId ?? "",
|
||||
//// LastUpdatedAt = DateTime.Now,
|
||||
//// LastUpdateFullName = FullName ?? "System Administrator",
|
||||
//// LastUpdateUserId = UserId ?? "",
|
||||
//// });
|
||||
////}
|
||||
|
||||
|
||||
// add profile salary
|
||||
|
||||
var oc = _dbContext.Set<OrganizationEntity>()
|
||||
.FirstOrDefault(x => x.Id == placementProfile.OrganizationPosition!.Organization!.Id);
|
||||
////var oc = _dbContext.Set<OrganizationEntity>()
|
||||
//// .FirstOrDefault(x => x.Id == placementProfile.OrganizationPosition!.Organization!.Id);
|
||||
|
||||
var position = placementProfile.PositionPath;
|
||||
////var position = placementProfile.PositionPath;
|
||||
|
||||
var positionNumber = placementProfile.PositionNumber;
|
||||
////var positionNumber = placementProfile.PositionNumber;
|
||||
|
||||
var positionType = placementProfile.PositionType;
|
||||
////var positionType = placementProfile.PositionType;
|
||||
|
||||
var positionLevel = placementProfile.PositionLevel;
|
||||
////var positionLevel = placementProfile.PositionLevel;
|
||||
|
||||
|
||||
var salary = new ProfileSalary
|
||||
////var salary = new ProfileSalary
|
||||
////{
|
||||
//// Order = 1,
|
||||
//// Date = command.CommandAffectDate,
|
||||
//// Amount = placementProfile.Amount == null ? 0 : placementProfile.Amount,
|
||||
//// PositionSalaryAmount = placementProfile.PositionSalaryAmount == null ? 0 : placementProfile.PositionSalaryAmount,
|
||||
//// MouthSalaryAmount = placementProfile.MouthSalaryAmount == null ? 0 : placementProfile.MouthSalaryAmount,
|
||||
//// SalaryClass = "",
|
||||
//// SalaryRef = "บรรจุและแต่งตั้งผู้สอบแข่งขันได้วุฒิ คำสั่ง" + command.IssuerOrganizationName + "ที่ " + $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate!.Value.ToThaiFullDate3()}",
|
||||
|
||||
//// OcId = oc == null ? Guid.Empty : oc.Id,
|
||||
|
||||
//// PositionId = position!.Id,
|
||||
|
||||
//// PositionLevel = placementProfile.PositionLevel,
|
||||
//// PositionLineId = placementProfile.PositionLine!.Id,
|
||||
//// PositionTypeId = placementProfile.PositionType!.Id,
|
||||
//// OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id,
|
||||
//// PosNoId = positionNumber!.Id,
|
||||
|
||||
//// CommandNo = $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()}",
|
||||
//// RefCommandNo = $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()}",
|
||||
//// CommandTypeName = command.CommandType.Name,
|
||||
|
||||
|
||||
//// PositionEmployeeGroupId = null,
|
||||
//// PositionEmployeeLevelId = null,
|
||||
//// PositionEmployeePositionId = null,
|
||||
//// PositionEmployeePositionSideId = null,
|
||||
//// PosNoEmployee = "",
|
||||
|
||||
|
||||
//// PositionPathSideId = placementProfile.PositionPathSide! == null ? null : placementProfile.PositionPathSide!.Id,
|
||||
//// PositionExecutiveId = placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutive! == null ? null : placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutive!.Id,
|
||||
//// PositionExecutiveSideId = placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutiveSide! == null ? null : placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutiveSide!.Id,
|
||||
|
||||
//// IsActive = true,
|
||||
//// CreatedAt = DateTime.Now,
|
||||
//// CreatedFullName = FullName ?? "System Administrator",
|
||||
//// CreatedUserId = UserId ?? "",
|
||||
//// LastUpdatedAt = DateTime.Now,
|
||||
//// LastUpdateFullName = FullName ?? "System Administrator",
|
||||
//// LastUpdateUserId = UserId ?? "",
|
||||
|
||||
////};
|
||||
|
||||
var apiUrlSalary = $"{_configuration["API"]}/org/profile/salary";
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
Order = 1,
|
||||
Date = command.CommandAffectDate,
|
||||
Amount = placementProfile.Amount == null ? 0 : placementProfile.Amount,
|
||||
PositionSalaryAmount = placementProfile.PositionSalaryAmount == null ? 0 : placementProfile.PositionSalaryAmount,
|
||||
MouthSalaryAmount = placementProfile.MouthSalaryAmount == null ? 0 : placementProfile.MouthSalaryAmount,
|
||||
SalaryClass = "",
|
||||
SalaryRef = "บรรจุและแต่งตั้งผู้สอบแข่งขันได้วุฒิ คำสั่ง" + command.IssuerOrganizationName + "ที่ " + $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate!.Value.ToThaiFullDate3()}",
|
||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
|
||||
var _res = await client.PostAsJsonAsync(apiUrlSalary, new
|
||||
{
|
||||
profileId = profileId,
|
||||
date = command.CommandAffectDate == null ? (DateTime?)null : command.CommandAffectDate,
|
||||
amount = placementProfile.Amount == null ? null : placementProfile.Amount,
|
||||
positionSalaryAmount = placementProfile.PositionSalaryAmount == null ? null : placementProfile.PositionSalaryAmount,
|
||||
mouthSalaryAmount = placementProfile.MouthSalaryAmount == null ? null : placementProfile.MouthSalaryAmount,
|
||||
posNo = placementProfile.PosNumber == null ? string.Empty : placementProfile.PosNumber.ToString(),
|
||||
position = placementProfile.positionName == null ? string.Empty : placementProfile.positionName,
|
||||
positionLine = string.Empty,
|
||||
positionPathSide = string.Empty,
|
||||
positionExecutive = string.Empty,
|
||||
positionType = placementProfile.posTypeName == null ? string.Empty : placementProfile.posTypeName,
|
||||
positionLevel = placementProfile.PositionLevel == null ? string.Empty : placementProfile.PositionLevel.Name,
|
||||
refCommandNo = string.Empty,
|
||||
templateDoc = string.Empty,
|
||||
});
|
||||
var _result = await _res.Content.ReadAsStringAsync();
|
||||
}
|
||||
|
||||
OcId = oc == null ? Guid.Empty : oc.Id,
|
||||
|
||||
PositionId = position!.Id,
|
||||
|
||||
PositionLevel = placementProfile.PositionLevel,
|
||||
PositionLineId = placementProfile.PositionLine!.Id,
|
||||
PositionTypeId = placementProfile.PositionType!.Id,
|
||||
OrganizationShortNameId = placementProfile.OrganizationPosition!.Organization!.OrganizationShortName!.Id,
|
||||
PosNoId = positionNumber!.Id,
|
||||
|
||||
CommandNo = $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()}",
|
||||
RefCommandNo = $"{command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()}",
|
||||
CommandTypeName = command.CommandType.Name,
|
||||
|
||||
|
||||
PositionEmployeeGroupId = null,
|
||||
PositionEmployeeLevelId = null,
|
||||
PositionEmployeePositionId = null,
|
||||
PositionEmployeePositionSideId = null,
|
||||
PosNoEmployee = "",
|
||||
|
||||
|
||||
PositionPathSideId = placementProfile.PositionPathSide! == null ? null : placementProfile.PositionPathSide!.Id,
|
||||
PositionExecutiveId = placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutive! == null ? null : placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutive!.Id,
|
||||
PositionExecutiveSideId = placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutiveSide! == null ? null : placementProfile.OrganizationPosition!.PositionMaster!.PositionExecutiveSide!.Id,
|
||||
|
||||
IsActive = true,
|
||||
CreatedAt = DateTime.Now,
|
||||
CreatedFullName = FullName ?? "System Administrator",
|
||||
CreatedUserId = UserId ?? "",
|
||||
LastUpdatedAt = DateTime.Now,
|
||||
LastUpdateFullName = FullName ?? "System Administrator",
|
||||
LastUpdateUserId = UserId ?? "",
|
||||
|
||||
};
|
||||
|
||||
//if (placementProfile.PositionPathSide! != null)
|
||||
//{
|
||||
|
|
@ -2996,97 +3131,97 @@ namespace BMA.EHR.Application.Repositories.Commands
|
|||
//}
|
||||
|
||||
// add profile position
|
||||
var profilePosition = new ProfilePosition
|
||||
{
|
||||
Profile = profile,
|
||||
OrganizationPosition = placementProfile.OrganizationPosition,
|
||||
IsActive = true,
|
||||
IsPublished = true,
|
||||
};
|
||||
_dbContext.Set<ProfilePosition>().Add(profilePosition);
|
||||
////var profilePosition = new ProfilePosition
|
||||
////{
|
||||
//// Profile = profile,
|
||||
//// OrganizationPosition = placementProfile.OrganizationPosition,
|
||||
//// IsActive = true,
|
||||
//// IsPublished = true,
|
||||
////};
|
||||
////_dbContext.Set<ProfilePosition>().Add(profilePosition);
|
||||
|
||||
profile.Salaries.Add(salary);
|
||||
////profile.Salaries.Add(salary);
|
||||
|
||||
_dbContext.Set<Profile>().Add(profile);
|
||||
////_dbContext.Set<Profile>().Add(profile);
|
||||
|
||||
// update placementstatus
|
||||
placementProfile.PlacementStatus = "CONTAIN";
|
||||
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
// TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่
|
||||
// Send noti inbox and email
|
||||
var subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}";
|
||||
var body = $"คุณได้รับรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ ตามคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}";
|
||||
_emailSenderService.SendMail(subject, body, "dev@frappet.com");
|
||||
////// TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่
|
||||
////// Send noti inbox and email
|
||||
////var subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}";
|
||||
////var body = $"คุณได้รับรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ ตามคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}";
|
||||
////_emailSenderService.SendMail(subject, body, "dev@frappet.com");
|
||||
|
||||
|
||||
var inbox = new Inbox
|
||||
{
|
||||
Subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
Body = $"คุณได้รับรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ ตามคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
ReceiverUserId = profile.Id,
|
||||
Payload = payload_str,
|
||||
};
|
||||
_dbContext.Set<Inbox>().Add(inbox);
|
||||
////var inbox = new Inbox
|
||||
////{
|
||||
//// Subject = $"คุณได้รับคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
//// Body = $"คุณได้รับรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ ตามคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
//// ReceiverUserId = profile.Id,
|
||||
//// Payload = payload_str,
|
||||
////};
|
||||
////_dbContext.Set<Inbox>().Add(inbox);
|
||||
|
||||
var noti = new Notification
|
||||
{
|
||||
Body = $"คุณได้รับรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ ตามคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
ReceiverUserId = profile.Id,
|
||||
Type = "LINK",
|
||||
Payload = payload_str,
|
||||
};
|
||||
_dbContext.Set<Notification>().Add(noti);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
////var noti = new Notification
|
||||
////{
|
||||
//// Body = $"คุณได้รับรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ ตามคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
//// ReceiverUserId = profile.Id,
|
||||
//// Type = "LINK",
|
||||
//// Payload = payload_str,
|
||||
////};
|
||||
////_dbContext.Set<Notification>().Add(noti);
|
||||
////await _dbContext.SaveChangesAsync();
|
||||
|
||||
|
||||
}
|
||||
|
||||
// send cc noti inbox
|
||||
foreach (var cc in command.Deployments)
|
||||
{
|
||||
var pf = await _dbContext.Set<Profile>().FirstOrDefaultAsync(x => x.CitizenId == cc.CitizenId);
|
||||
if (pf != null)
|
||||
{
|
||||
if (cc.IsSendInbox)
|
||||
{
|
||||
var inbox = new Inbox
|
||||
{
|
||||
Subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
Body = $"คำสั่งบรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
ReceiverUserId = pf.Id,
|
||||
Payload = payload_str,
|
||||
};
|
||||
_dbContext.Set<Inbox>().Add(inbox);
|
||||
}
|
||||
//// send cc noti inbox
|
||||
////foreach (var cc in command.Deployments)
|
||||
////{
|
||||
//// var pf = await _dbContext.Set<Profile>().FirstOrDefaultAsync(x => x.CitizenId == cc.CitizenId);
|
||||
//// if (pf != null)
|
||||
//// {
|
||||
//// if (cc.IsSendInbox)
|
||||
//// {
|
||||
//// var inbox = new Inbox
|
||||
//// {
|
||||
//// Subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
//// Body = $"คำสั่งบรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
//// ReceiverUserId = pf.Id,
|
||||
//// Payload = payload_str,
|
||||
//// };
|
||||
//// _dbContext.Set<Inbox>().Add(inbox);
|
||||
//// }
|
||||
|
||||
if (cc.IsSendMail)
|
||||
{
|
||||
// TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่
|
||||
// Send noti inbox and email
|
||||
var subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}";
|
||||
var body = $"คำสั่งบรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}";
|
||||
_emailSenderService.SendMail(subject, body, "dev@frappet.com");
|
||||
}
|
||||
//// if (cc.IsSendMail)
|
||||
//// {
|
||||
//// // TODO: ต้องเปลี่ยนเป็น Email จริงนะ ตอนนี้ Hardcode อยู่
|
||||
//// // Send noti inbox and email
|
||||
//// var subject = $"คุณได้รับสำเนาคำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}";
|
||||
//// var body = $"คำสั่งบรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}";
|
||||
//// _emailSenderService.SendMail(subject, body, "dev@frappet.com");
|
||||
//// }
|
||||
|
||||
|
||||
var noti = new Notification
|
||||
{
|
||||
Body = $"คำสั่งบรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
ReceiverUserId = pf.Id,
|
||||
Type = "LINK",
|
||||
Payload = payload_str,
|
||||
};
|
||||
_dbContext.Set<Notification>().Add(noti);
|
||||
}
|
||||
}
|
||||
//// var noti = new Notification
|
||||
//// {
|
||||
//// Body = $"คำสั่งบรรจุเป็นข้าราชการกรุงเทพมหานครสามัญ คำสั่งเลขที่ {command.CommandNo}/{command.CommandYear.ToInteger().ToThaiYear()} ลงวันที่ {command.CommandExcecuteDate.Value.ToThaiFullDate3()}",
|
||||
//// ReceiverUserId = pf.Id,
|
||||
//// Type = "LINK",
|
||||
//// Payload = payload_str,
|
||||
//// };
|
||||
//// _dbContext.Set<Notification>().Add(noti);
|
||||
//// }
|
||||
////}
|
||||
|
||||
// change command status
|
||||
var cmdStatus = await _dbContext.Set<CommandStatus>().FirstOrDefaultAsync(x => x.Sequence == 5);
|
||||
command.CommandStatusId = cmdStatus!.Id;
|
||||
////// change command status
|
||||
////var cmdStatus = await _dbContext.Set<CommandStatus>().FirstOrDefaultAsync(x => x.Sequence == 5);
|
||||
////command.CommandStatusId = cmdStatus!.Id;
|
||||
|
||||
await _dbContext.SaveChangesAsync();
|
||||
////await _dbContext.SaveChangesAsync();
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
|
|
|||
|
|
@ -7,6 +7,11 @@ using BMA.EHR.Domain.Models.Documents;
|
|||
|
||||
namespace BMA.EHR.Domain.Models.Placement
|
||||
{
|
||||
public class PlacementProfileId
|
||||
{
|
||||
[Comment("Id Profile")]
|
||||
public string result { get; set; }
|
||||
}
|
||||
public class PlacementProfile : EntityBase
|
||||
{
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue