diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 83918d1..e0140fb 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -11,7 +11,8 @@ on: env: REGISTRY: docker.frappet.com IMAGE_NAME: ehr/bma-ehr-recruit-exam-service - DEPLOY_HOST: 49.0.91.80 + DEPLOY_HOST: frappet.com + DEPLOY_PORT: 10102 COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-recruit-exam TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0 @@ -60,27 +61,27 @@ jobs: host: ${{env.DEPLOY_HOST}} username: frappet password: ${{ secrets.SSH_PASSWORD }} - port: 10102 + port: ${{env.DEPLOY_PORT}} script: | cd "${{env.COMPOSE_PATH}}" docker compose pull docker compose up -d echo "${{ steps.gen_ver.outputs.image_ver }}"> success - - uses: snow-actions/line-notify@v1.1.0 - if: success() - with: - access_token: ${{ env.TOKEN_LINE }} - message: | - -Success✅✅✅ - Image: ${{env.IMAGE_NAME}} - Version: ${{ github.event.inputs.IMAGE_VER }} - By: ${{secrets.DOCKER_USER}} - - uses: snow-actions/line-notify@v1.1.0 - if: failure() - with: - access_token: ${{ env.TOKEN_LINE }} - message: | - -Failure❌❌❌ - Image: ${{env.IMAGE_NAME}} - Version: ${{ github.event.inputs.IMAGE_VER }} - By: ${{secrets.DOCKER_USER}} + # - uses: snow-actions/line-notify@v1.1.0 + # if: success() + # with: + # access_token: ${{ env.TOKEN_LINE }} + # message: | + # -Success✅✅✅ + # Image: ${{env.IMAGE_NAME}} + # Version: ${{ github.event.inputs.IMAGE_VER }} + # By: ${{secrets.DOCKER_USER}} + # - uses: snow-actions/line-notify@v1.1.0 + # if: failure() + # with: + # access_token: ${{ env.TOKEN_LINE }} + # message: | + # -Failure❌❌❌ + # Image: ${{env.IMAGE_NAME}} + # Version: ${{ github.event.inputs.IMAGE_VER }} + # By: ${{secrets.DOCKER_USER}} diff --git a/BMA.EHR.Recurit.Exam.Service.csproj b/BMA.EHR.Recurit.Exam.Service.csproj index 2cd6169..f2f6177 100644 --- a/BMA.EHR.Recurit.Exam.Service.csproj +++ b/BMA.EHR.Recurit.Exam.Service.csproj @@ -24,8 +24,8 @@ - - + diff --git a/Controllers/BaseController.cs b/Controllers/BaseController.cs index 9dda347..63f4346 100644 --- a/Controllers/BaseController.cs +++ b/Controllers/BaseController.cs @@ -1,4 +1,4 @@ -using BMA.EHR.Core; +// using BMA.EHR.Core; using BMA.EHR.Recurit.Exam.Service.Response; using BMA.EHR.Recurit.Exam.Service.Services; using Microsoft.AspNetCore.Http; @@ -39,7 +39,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers protected virtual ActionResult Success(object? result = null) { - return Success(GlobalMessages.Success, result); + return Success("สำเร็จ", result); } protected virtual ActionResult Error(string message, string result, int statusCode = StatusCodes.Status500InternalServerError) diff --git a/Controllers/DisableController.cs b/Controllers/DisableController.cs index bbf456e..b1c3fc2 100644 --- a/Controllers/DisableController.cs +++ b/Controllers/DisableController.cs @@ -1,5 +1,5 @@ using Amazon.S3.Model; -using BMA.EHR.Extensions; +using BMA.EHR.Recurit.Exam.Service.Extensions; using BMA.EHR.Recurit.Exam.Service.Controllers; using BMA.EHR.Recurit.Exam.Service.Core; using BMA.EHR.Recurit.Exam.Service.Data; diff --git a/Controllers/DisableReportController.cs b/Controllers/DisableReportController.cs index bd39370..7131bc8 100644 --- a/Controllers/DisableReportController.cs +++ b/Controllers/DisableReportController.cs @@ -1,4 +1,4 @@ -using BMA.EHR.Extensions; +using BMA.EHR.Recurit.Exam.Service.Extensions; using BMA.EHR.Recurit.Exam.Service.Controllers; using BMA.EHR.Recurit.Exam.Service.Services; using BMA.EHR.Recurit.Exam.Service.Data; diff --git a/Controllers/TestController.cs b/Controllers/TestController.cs index 24cd6ba..316d131 100644 --- a/Controllers/TestController.cs +++ b/Controllers/TestController.cs @@ -1,4 +1,4 @@ -using BMA.EHR.Core; +// using BMA.EHR.Core; using BMA.EHR.Recurit.Exam.Service.Request; using BMA.EHR.Recurit.Exam.Service.Response; using BMA.EHR.Recurit.Exam.Service.Services; @@ -43,7 +43,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers { try { - return Success(GlobalMessages.Success, "ผ่าน"); + return Success("สำเร็จ", "ผ่าน"); } catch (Exception ex) { diff --git a/Data/DatabaseSeeder.cs b/Data/DatabaseSeeder.cs index 87cd5c9..e966ec7 100644 --- a/Data/DatabaseSeeder.cs +++ b/Data/DatabaseSeeder.cs @@ -1,5 +1,5 @@ -using BMA.EHR.Core; -using BMA.EHR.Extensions; +// using BMA.EHR.Core; +using BMA.EHR.Recurit.Exam.Service.Extensions; using BMA.EHR.Recurit.Exam.Service.Models; using BMA.EHR.Recurit.Exam.Service.Services; using Newtonsoft.Json; diff --git a/Extensions/DataReaderExtension.cs b/Extensions/DataReaderExtension.cs new file mode 100644 index 0000000..ec779ae --- /dev/null +++ b/Extensions/DataReaderExtension.cs @@ -0,0 +1,13 @@ +using System.Data.Common; + +namespace BMA.EHR.Recurit.Exam.Service.Extensions +{ + public static class DataReaderExtension + { + public static bool IsDbNull(this DbDataReader dataReader, string columnName) + { + return dataReader[columnName] == DBNull.Value; + } + + } +} \ No newline at end of file diff --git a/Extensions/DateTimeExtension.cs b/Extensions/DateTimeExtension.cs new file mode 100644 index 0000000..32620a2 --- /dev/null +++ b/Extensions/DateTimeExtension.cs @@ -0,0 +1,415 @@ +using System; +using System.Globalization; +using System.Text; + +namespace BMA.EHR.Recurit.Exam.Service.Extensions +{ + public static class DateTimeExtension + { + private static CultureInfo _culture = new CultureInfo("th-TH"); + + #region " Methods " + + #region " Public " + + public static int DiffDay(this DateTime startDate, DateTime endDate) + { + if (endDate.Date < startDate.Date) + { + throw new ArgumentException("End Date must greater than start date."); + } + return (int)(endDate.Date - startDate.Date).TotalDays + 1; + } + + public static double DiffYear(this DateTime currentDate) + { + return (DateTime.Today - currentDate).TotalDays / 365.2425; + } + + public static int ToUnixTimeStamp(this DateTime value) + { + return (int)Math.Truncate((value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds); + } + + public static string ToThaiFullDate(this DateTime value) + { + var yy = value.Year < 2400 ? value.Year + 543 : value.Year; + return $"วันที่ {value.Day} เดือน {value.ToString("MMMM", _culture.DateTimeFormat)} พ.ศ. {yy}"; + } + + public static string ToThaiFullDate2(this DateTime value) + { + var yy = value.Year < 2400 ? value.Year + 543 : value.Year; + return $"{value.Day} {value.ToString("MMMM", _culture.DateTimeFormat)} พ.ศ. {yy}"; + } + + public static string ToThaiFullDate3(this DateTime value) + { + var yy = value.Year < 2400 ? value.Year + 543 : value.Year; + return $"{value.Day} {value.ToString("MMMM", _culture.DateTimeFormat)} {yy}"; + } + + public static string ToThaiShortDateTime(this DateTime value) + { + var yy = value.Year < 2400 ? value.Year + 543 : value.Year; + return $"{value.Day} {value.ToString("MMM", _culture.DateTimeFormat)} {yy} {value.ToString("HH:mm:ss")}"; + } + + public static string ToThaiShortDate(this DateTime value) + { + var yy = value.Year < 2400 ? value.Year + 543 : value.Year; + return $"{value.Day} {value.ToString("MMM", _culture.DateTimeFormat)} {yy}"; + } + + public static string ToThaiShortDate2(this DateTime value) + { + var yy = value.Year < 2400 ? value.Year + 543 : value.Year; + return $"{value.Day} {value.ToString("MMM", _culture.DateTimeFormat)} {yy.ToString().Right(2)}"; + } + + public static string ToThaiDate(this DateTime value) + { + var yy = value.Year < 2400 ? value.Year + 543 : value.Year; + return $"{value.Day}/{value.Month}/{yy}"; + } + + public static string ToCeDate(this DateTime value) + { + var yy = value.Year >= 2400 ? value.Year - 543 : value.Year; + return $"{value.Day}/{value.Month}/{yy}"; + } + + public static string ToThaiDateFullDigit(this DateTime value) + { + var yy = value.Year < 2400 ? value.Year + 543 : value.Year; + return $"{value.Day.ToString("00")}/{value.Month.ToString("00")}/{yy.ToString("00")}"; + } + + public static string GetDay(this DateTime value) + { + return value.Day.ToString(); + } + + public static string GetMonth(this DateTime value) + { + return value.ToString("MMMM", _culture.DateTimeFormat); + } + + public static string GetYear(this DateTime value) + { + return value.Year.ToThaiYear().ToString(); + } + + public static string CalculateAgeStrV2(this DateTime date, int plusYear = 0, int subtractYear = 0) + { + try + { + var currentDate = DateTime.Now; + var age = currentDate - date; + + + if (date > currentDate) + { + throw new ArgumentException("วันเกิดต้องไม่มากกว่าวันที่ปัจจุบัน"); + } + + int years = currentDate.Year - date.Year; + int months = 0; + int days = 0; + + if (currentDate.Month < date.Month || + (currentDate.Month == date.Month && currentDate.Day < date.Day)) + { + years--; + months = 12 - date.Month + currentDate.Month; + + if (currentDate.Day < date.Day) + { + months--; + int lastMonthDays = 0; + if (currentDate.Month == 1) + lastMonthDays = DateTime.DaysInMonth(currentDate.Year - 1, 12); + else + lastMonthDays = DateTime.DaysInMonth(currentDate.Year, currentDate.Month - 1); + days = lastMonthDays - date.Day + currentDate.Day; + } + else + { + days = currentDate.Day - date.Day; + } + } + else + { + months = currentDate.Month - date.Month; + + if (currentDate.Day < date.Day) + { + months--; + int lastMonthDays = 0; + if (currentDate.Month == 1) + lastMonthDays = DateTime.DaysInMonth(currentDate.Year - 1, 12); + else + lastMonthDays = DateTime.DaysInMonth(currentDate.Year, currentDate.Month - 1); + days = lastMonthDays - date.Day + currentDate.Day; + } + else + { + days = currentDate.Day - date.Day; + } + } + + //return new Age(years, months, days); + + + //// แปลงเป็นอายุในรูปแบบวันที่ + //int years = (int)(age.Days / 365.25) + plusYear - subtractYear; + //int months = (int)((age.Days % 365.25) / 30.436875); + //int days = (int)((age.Days % 365.25) % 30.436875); + + return $"{years} ปี {months} เดือน {days} วัน"; + } + catch + { + throw; + } + } + + public static int CalculateAge(this DateTime date, int plusYear = 0, int subtractYear = 0) + { + try + { + var currentDate = DateTime.Now; + var age = currentDate - date; + + // แปลงเป็นอายุในรูปแบบวันที่ + int years = (int)(age.Days / 365.25) + plusYear - subtractYear; + + return years; + } + catch + { + throw; + } + } + + public static int CalculateGovAge(this DateTime appointDate, int plusYear = 0, int subtractYear = 0) + { + if (DateTime.Now.Month - appointDate.Month >= 6) + return (DateTime.Now.Year - appointDate.Year) + 1 + plusYear - subtractYear; + else + return (DateTime.Now.Year - appointDate.Year) + plusYear - subtractYear; + } + + + public static string CalculateGovAgeStr(this DateTime appointDate, int plusYear = 0, int subtractYear = 0) + { + var d2 = DateTime.Now; + TimeSpan sp = d2.Subtract(appointDate); + var alldays = sp.Days + ((plusYear - subtractYear) * 365); + + int yy = alldays / 365; + int mm = (alldays - (yy * 365)) / 30; + int dd = (alldays - (yy * 365) - (mm * 30)); + + var sb = new StringBuilder(); + sb.Clear(); + sb.Append(yy == 0 ? "" : $"{yy} ปี "); + sb.Append(mm == 0 ? "" : $"{mm} เดือน "); + sb.Append(dd == 0 ? "" : $"{dd} วัน "); + + return sb.ToString(); + } + + public static string CalculateGovAgeInYear(this DateTime appointDate, int plusYear = 0, int subtractYear = 0) + { + var d2 = DateTime.Now; + TimeSpan sp = d2.Subtract(appointDate); + var alldays = sp.Days + ((plusYear - subtractYear) * 365); + + int yy = alldays / 365; + + return yy.ToString(); + } + + public static int GetDifferenceInYears(this DateTime startDate, DateTime endDate) + { + int finalResult = 0; + + const int daysInYear = 365; + + //DateTime endDate = DateTime.Now; + + TimeSpan timeSpan = endDate - startDate; + + if (timeSpan.TotalDays > 365) + { + finalResult = (int)Math.Round((timeSpan.TotalDays / daysInYear), MidpointRounding.ToEven); + } + + return finalResult; + } + + public static DateTime CalculateRetireDate(this DateTime birthDate) + { + var dd = birthDate.Day; + var mm = birthDate.Month; + var yy = birthDate.Year; + + var g1 = true; + switch (mm) + { + case 10: if (dd >= 2) g1 = false; break; + case 11: + case 12: g1 = false; break; + } + + if (g1) + return new DateTime(yy + 60, 9, 30); + else + return new DateTime(yy + 61, 9, 30); + } + + public static bool IsBetween(this DateTime now, TimeSpan start, TimeSpan end) + { + var time = now.TimeOfDay; + // Scenario 1: If the start time and the end time are in the same day. + if (start <= end) + return time >= start && time <= end; + // Scenario 2: The start time and end time is on different days. + return time >= start || time <= end; + } + + public static string CalculateBetweenDate(this DateTime startDate, DateTime endDate) + { + // var d2 = DateTime.Now; + TimeSpan sp = endDate.Subtract(startDate); + var alldays = sp.Days; + + int yy = alldays / 365; + int mm = (alldays - (yy * 365)) / 30; + int dd = (alldays - (yy * 365) - (mm * 30)); + + var sb = new StringBuilder(); + sb.Clear(); + sb.Append(yy == 0 ? "" : $"{yy} ปี "); + sb.Append(mm == 0 ? "" : $"{mm} เดือน "); + sb.Append(dd == 0 ? "" : $"{dd} วัน "); + + return sb.ToString(); + } + + public static string CalculateBetweenDateV2(this DateTime startDate, DateTime endDate) + { + if (startDate == null || endDate == null) + return "-"; + + DateTime today = endDate; + DateTime birthDate = Convert.ToDateTime(startDate).AddDays(-1); + int years = new DateTime(endDate.Subtract(birthDate).Ticks).Year - 1; + DateTime pastYearDate = birthDate.AddYears(years); + int months = 0; + for (int i = 1; i <= 12; i++) + { + if (pastYearDate.AddMonths(i) == today) + { + months = i; + break; + } + else if (pastYearDate.AddMonths(i) >= today) + { + months = i - 1; + break; + } + } + int days = today.Subtract(pastYearDate.AddMonths(months)).Days; + if (today.Day < pastYearDate.Day) + { + if (System.DateTime.DaysInMonth(pastYearDate.Year, pastYearDate.Month) > System.DateTime.DaysInMonth(pastYearDate.AddMonths(months).Year, pastYearDate.AddMonths(months).Month)) + { + days += 1; + } + if (System.DateTime.DaysInMonth(pastYearDate.Year, pastYearDate.Month) < System.DateTime.DaysInMonth(pastYearDate.AddMonths(months).Year, pastYearDate.AddMonths(months).Month)) + { + days -= 1; + } + } + // int Hours = Today.Subtract(PastYearDate).Hours; + // int Minutes = Today.Subtract(PastYearDate).Minutes; + // int Seconds = Today.Subtract(PastYearDate).Seconds; + Console.WriteLine(today); + Console.WriteLine(pastYearDate); + Console.WriteLine(months); + Console.WriteLine(pastYearDate.AddMonths(months)); + var sb = new StringBuilder(); + sb.Clear(); + sb.Append(years == 0 ? "" : $"{years} ปี "); + sb.Append(months == 0 ? "" : $"{months} เดือน "); + sb.Append(days == 0 ? "" : $"{days} วัน "); + return sb.ToString(); + } + public static CalculateBetweenDateV2ValueObj CalculateBetweenDateV2Value(this DateTime startDate, DateTime endDate) + { + // if (startDate == null || endDate == null) + // return null; + DateTime today = endDate.AddDays(1); + DateTime birthDate = startDate; + int years = new DateTime(endDate.Subtract(birthDate).Ticks).Year - 1; + DateTime pastYearDate = birthDate.AddYears(years); + int months = 0; + for (int i = 1; i <= 12; i++) + { + if (pastYearDate.AddMonths(i) == today) + { + months = i; + break; + } + else if (pastYearDate.AddMonths(i) >= today) + { + months = i - 1; + break; + } + } + int days = today.Subtract(pastYearDate.AddMonths(months)).Days; + if (today.Day < pastYearDate.Day) + { + if (System.DateTime.DaysInMonth(pastYearDate.Year, pastYearDate.Month) > System.DateTime.DaysInMonth(pastYearDate.AddMonths(months).Year, pastYearDate.AddMonths(months).Month)) + { + days += 1; + } + if (System.DateTime.DaysInMonth(pastYearDate.Year, pastYearDate.Month) < System.DateTime.DaysInMonth(pastYearDate.AddMonths(months).Year, pastYearDate.AddMonths(months).Month)) + { + days -= 1; + } + } + if (days >= 30) + { + months = months + 1; + days = 0; + if (months >= 12) + { + years = years + 1; + months = 0; + } + } + + var sb = new StringBuilder(); + sb.Clear(); + sb.Append(years == 0 ? "" : $"{years} ปี "); + sb.Append(months == 0 ? "" : $"{months} เดือน "); + sb.Append(days == 0 ? "" : $"{days} วัน "); + return new CalculateBetweenDateV2ValueObj { years = years, months = months, days = days }; + } + public class CalculateBetweenDateV2ValueObj + { + public int years { get; set; } + + public int months { get; set; } + + public int days { get; set; } + } + + #endregion + + #endregion + } +} \ No newline at end of file diff --git a/Extensions/DoubleExtension.cs b/Extensions/DoubleExtension.cs new file mode 100644 index 0000000..ec6c8eb --- /dev/null +++ b/Extensions/DoubleExtension.cs @@ -0,0 +1,256 @@ +using System; +using System.Text; + +namespace BMA.EHR.Recurit.Exam.Service.Extensions +{ + public static class DoubleExtension + { + #region " Fields " + private static string[] _ones = + { + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine" + }; + + private static string[] _teens = + { + "ten", + "eleven", + "twelve", + "thirteen", + "fourteen", + "fifteen", + "sixteen", + "seventeen", + "eighteen", + "nineteen" + }; + + private static string[] _tens = + { + "", + "ten", + "twenty", + "thirty", + "forty", + "fifty", + "sixty", + "seventy", + "eighty", + "ninety" + }; + + // US Nnumbering: + private static string[] _thousands = + { + "", + "thousand", + "million", + "billion", + "trillion", + "quadrillion" + }; + + #endregion + + #region " Methods " + + #region " Conversion " + + public static string ToNumericText(this double number) + { + return number.ToString("#,##0.00"); + } + public static string ToNumericNoDecimalText(this double number) + { + return number.ToString("#,##"); + } + + public static string ToReadText(this double value) + { + string digits, temp; + bool showThousands = false; + bool allZeros = true; + + // Use StringBuilder to build result + StringBuilder builder = new StringBuilder(); + // Convert integer portion of value to string + digits = ((long)value).ToString(); + // Traverse characters in reverse order + for (int i = digits.Length - 1; i >= 0; i--) + { + int ndigit = (int)(digits[i] - '0'); + int column = (digits.Length - (i + 1)); + + // Determine if ones, tens, or hundreds column + switch (column % 3) + { + case 0: // Ones position + showThousands = true; + if (i == 0) + { + // First digit in number (last in loop) + temp = String.Format("{0} ", _ones[ndigit]); + } + else if (digits[i - 1] == '1') + { + // This digit is part of "teen" value + temp = String.Format("{0} ", _teens[ndigit]); + // Skip tens position + i--; + } + else if (ndigit != 0) + { + // Any non-zero digit + temp = String.Format("{0} ", _ones[ndigit]); + } + else + { + // This digit is zero. If digit in tens and hundreds + // column are also zero, don't show "thousands" + temp = String.Empty; + // Test for non-zero digit in this grouping + if (digits[i - 1] != '0' || (i > 1 && digits[i - 2] != '0')) + showThousands = true; + else + showThousands = false; + } + + // Show "thousands" if non-zero in grouping + if (showThousands) + { + if (column > 0) + { + temp = String.Format("{0}{1}{2}", + temp, + _thousands[column / 3], + allZeros ? " " : ", "); + } + // Indicate non-zero digit encountered + allZeros = false; + } + builder.Insert(0, temp); + break; + + case 1: // Tens column + if (ndigit > 0) + { + temp = String.Format("{0}{1}", + _tens[ndigit], + (digits[i + 1] != '0') ? "-" : " "); + builder.Insert(0, temp); + } + break; + + case 2: // Hundreds column + if (ndigit > 0) + { + temp = String.Format("{0} hundred ", _ones[ndigit]); + builder.Insert(0, temp); + } + break; + } + } + + // Append fractional portion/cents + double val = (value - (long)value) * 100; + if (val > 0) + builder.AppendFormat("and {0:00}/100", (value - (long)value) * 100); + + // Capitalize first letter + return String.Format("{0}{1}", + Char.ToUpper(builder[0]), + builder.ToString(1, builder.Length - 1)); + } + + #endregion + + #region " Round " + + public static double RoundUp(this double input) + { + return Math.Ceiling(input); + } + + public static double RoundDown(this double input) + { + return Math.Floor(input); + } + + + public static double RoundUpStang(this double input) + { + string temp = ""; + temp = input.ToNumericText(); + string[] floating = temp.Split('.'); + if (double.Parse(floating[1]) == 0) + { + return input; + } + if (double.Parse(floating[1]) >= 1 && double.Parse(floating[1]) <= 24) + { + return (double.Parse(floating[0])) + 0.25; + } + else if (double.Parse(floating[1]) >= 26 && double.Parse(floating[1]) <= 49) + { + return (double.Parse(floating[0])) + 0.5; + } + else if (double.Parse(floating[1]) >= 51 && double.Parse(floating[1]) <= 74) + { + return (double.Parse(floating[0])) + 0.75; + } + else if (double.Parse(floating[1]) >= 76 && double.Parse(floating[1]) <= 99) + { + return (double.Parse(floating[0])) + 1; + } + else + { + return input; + } + } + + public static double RoundDownStang(this double input) + { + string temp = ""; + temp = input.ToNumericText(); + string[] floating = temp.Split('.'); + if (double.Parse(floating[1]) == 0) + { + return input; + } + if (double.Parse(floating[1]) >= 1 && double.Parse(floating[1]) <= 24) + { + return Math.Floor(input); + } + else if (double.Parse(floating[1]) >= 26 && double.Parse(floating[1]) <= 49) + { + return (double.Parse(floating[0])) + 0.25; + } + else if (double.Parse(floating[1]) >= 51 && double.Parse(floating[1]) <= 74) + { + return (double.Parse(floating[0])) + 0.5; + } + else if (double.Parse(floating[1]) >= 76 && double.Parse(floating[1]) <= 99) + { + return (double.Parse(floating[0])) + 0.75; + } + else + { + return input; + } + } + + #endregion + + #endregion + + } +} \ No newline at end of file diff --git a/Extensions/IntegerExtension.cs b/Extensions/IntegerExtension.cs new file mode 100644 index 0000000..5ccc256 --- /dev/null +++ b/Extensions/IntegerExtension.cs @@ -0,0 +1,74 @@ +using System.Text; +// using GreatFriends.ThaiBahtText; + +namespace BMA.EHR.Recurit.Exam.Service.Extensions +{ + public static class IntegerExtension + { + // public static string ToThaiBahtText(this int value, bool appendBahtOnly) + // { + // var decValue = (decimal)value; + + // return decValue.ThaiBahtText(appendBahtOnly: appendBahtOnly); + // } + + public static string ToThaiMonth(this int value) + { + switch (value) + { + case 1: return "มกราคม"; + case 2: return "กุมภาพันธ์"; + case 3: return "มีนาคม"; + case 4: return "เมษายน"; + case 5: return "พฤษภาคม"; + case 6: return "มิถุนายน"; + case 7: return "กรกฎาคม"; + case 8: return "สิงหาคม"; + case 9: return "กันยายน"; + case 10: return "ตุลาคม"; + case 11: return "พฤศจิกายน"; + case 12: return "ธันวาคม"; + default: return ""; + } + } + + public static int ToThaiYear(this int value) + { + if (value < 2400) + return value + 543; + else return value; + } + + public static int ToCeYear(this int value) + { + if (value >= 2400) + return value - 543; + else return value; + } + + public static string ToNumericText(this int number) + { + return number.ToString("#,##0"); + } + + public static string ToThaiNumber(this string value) + { + string arabicNumbers = "0123456789"; + string thaiNumbers = "๐๑๒๓๔๕๖๗๘๙"; + StringBuilder result = new StringBuilder(); + foreach (char digit in value) + { + int index = arabicNumbers.IndexOf(digit); + if (index >= 0) + { + result.Append(thaiNumbers[index]); + } + else + { + result.Append(digit); + } + } + return result.ToString(); + } + } +} \ No newline at end of file diff --git a/Extensions/ListExtension.cs b/Extensions/ListExtension.cs new file mode 100644 index 0000000..e3e0d66 --- /dev/null +++ b/Extensions/ListExtension.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; + +namespace BMA.EHR.Recurit.Exam.Service.Extensions +{ + public static class ListExtension + { + #region " Methods " + + #region " Convert " + + public static DataTable ToDataTable(this List list) + { + PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); + DataTable table = new DataTable(); + for (int i = 0; i < props.Count; i++) + { + PropertyDescriptor prop = props[i]; + table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); + } + object[] values = new object[props.Count]; + foreach (T item in list) + { + for (int i = 0; i < values.Length; i++) + values[i] = props[i].GetValue(item) ?? DBNull.Value; table.Rows.Add(values); + } + return table; + } + + #endregion + + #endregion + + } +} \ No newline at end of file diff --git a/Extensions/ObjectExtension.cs b/Extensions/ObjectExtension.cs new file mode 100644 index 0000000..ce9405f --- /dev/null +++ b/Extensions/ObjectExtension.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BMA.EHR.Recurit.Exam.Service.Extensions +{ + public static class ObjectExtension + { + public static bool DeepCompare(this object obj, object another) + { + if (ReferenceEquals(obj, another)) return true; + if ((obj == null) || (another == null)) return false; + //Compare two object's class, return false if they are difference + if (obj.GetType() != another.GetType()) return false; + + var result = true; + //Get all properties of obj + //And compare each other + foreach (var property in obj.GetType().GetProperties()) + { + var objValue = property.GetValue(obj); + var anotherValue = property.GetValue(another); + if (!objValue.Equals(anotherValue)) result = false; + } + + return result; + } + + public static bool Compare(this object obj, object another) + { + if (ReferenceEquals(obj, another)) return true; + if ((obj == null) || (another == null)) return false; + if (obj.GetType() != another.GetType()) return false; + + //properties: int, double, DateTime, etc, not class + if (!obj.GetType().IsClass) return obj.Equals(another); + + var result = true; + foreach (var property in obj.GetType().GetProperties()) + { + var objValue = property.GetValue(obj); + var anotherValue = property.GetValue(another); + //Recursion + if (!objValue.DeepCompare(anotherValue)) result = false; + } + return result; + } + } +} diff --git a/Extensions/StreamExtension.cs b/Extensions/StreamExtension.cs new file mode 100644 index 0000000..dd74346 --- /dev/null +++ b/Extensions/StreamExtension.cs @@ -0,0 +1,29 @@ +using System; +using System.IO; + +namespace BMA.EHR.Recurit.Exam.Service.Extensions +{ + public static class StreamExtension + { + #region " Methods " + + #region " Public " + + public static string ToBase64(this MemoryStream stream) + { + stream.Seek(0, SeekOrigin.Begin); + byte[] bytes; + using (var memoryStream = new MemoryStream()) + { + stream.CopyTo(memoryStream); + bytes = memoryStream.ToArray(); + } + + return Convert.ToBase64String(bytes); + } + + #endregion + + #endregion + } +} \ No newline at end of file diff --git a/Extensions/StringExtension.cs b/Extensions/StringExtension.cs new file mode 100644 index 0000000..5c33d94 --- /dev/null +++ b/Extensions/StringExtension.cs @@ -0,0 +1,301 @@ +using System; +using System.Globalization; +using System.IO; +using System.Text.RegularExpressions; + +namespace BMA.EHR.Recurit.Exam.Service.Extensions +{ + public enum DateTimeFormat + { + Dmy, + Mdy, + Ymd + } + + public static partial class StringExtension + { + #region " Methods " + + #region " Utilities " + + public static string Format(this string input, int digit) + { + var fmt = $"D{digit}"; + return input.ToInteger().ToString(fmt); + + } + + public static string RemoveComma(this string value) + { + string ret; + if (value.Contains(",")) + { + ret = value.Replace(",", ""); + return ret; + } + else + { + if (value != "") + { + return value; + } + else + return "0.00"; + } + } + + public static string RemoveSpace(this string value) + { + string ret; + if (value.Contains(",")) + { + ret = value.Replace(" ", ""); + return ret; + } + else + { + if (value != "") + { + return value; + } + else + return ""; + } + } + + public static string Left(this string input, int length) + { + if (length > 0 && input.Length >= length) + { + return input.Substring(0, length); + } + else + { + return input; + } + } + + public static string Right(this string input, int length) + { + if (length > 0 && input.Length >= length) + { + return input.Substring(input.Length - length, length); + } + else + { + return input; + } + } + + #endregion + + #region " Validation " + + public static bool IsDateTime(this string input) + { + try + { + var d = Convert.ToDateTime(input); + return true; + } + catch + { + return false; + } + } + + public static bool IsUrl(this string input) + { + if (input.Trim() != "") + { + if ((input.Left(7).ToLower() != "http://") || (input.Left(8).ToLower() != "https://")) + { + input = "http://" + input; + } + Regex reg = new Regex("http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?"); + return reg.Match(input).Success; + } + else + { + return false; + } + } + + /// + /// Determines whether this instance is email. + /// + /// The input. + /// + public static bool IsEmail(this string input) + { + if (input.Trim() != "") + { + Regex reg = new Regex("\\w+([-+.\']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"); + return reg.Match(input).Success; + } + else + { + return false; + } + } + + /// + /// Determines whether this instance is numeric. + /// + /// The input. + /// + public static bool IsNumeric(this string input) + { + if (input.Length > 0) + { + double tempDouble = (double)(NumberStyles.Number); + return double.TryParse(input, out tempDouble); + } + else + { + return false; + } + } + + public static string IsNull(this string input, string value) + { + if (input == null) + return value; + else + return input; + } + + #endregion + + #region " Conversion " + + public static DateTime ToDateTime(this string input, DateTimeFormat format, string seperator = "/") + { + try + { + var dd = input.Split(seperator); + switch (format) + { + case DateTimeFormat.Dmy: + return new DateTime(dd[2].ToInteger().ToCeYear(), dd[1].ToInteger(), dd[0].ToInteger()); + case DateTimeFormat.Mdy: + return new DateTime(dd[2].ToInteger().ToCeYear(), dd[0].ToInteger(), dd[1].ToInteger()); + case DateTimeFormat.Ymd: + return new DateTime(dd[0].ToInteger().ToCeYear(), dd[1].ToInteger(), dd[2].ToInteger()); + default: + return DateTime.MinValue; + } + } + catch + { + return DateTime.MinValue; + } + + } + + public static string ValueOrBlank(this string input) + { + if (input == null) return ""; + + if (input == "0") + return ""; + else + return input; + } + + public static MemoryStream ToMemoryStream(this string base64String) + { + if (base64String == null || base64String == String.Empty) return null; + + var bytes = Convert.FromBase64String(base64String); + var stream = new MemoryStream(bytes); + + return stream; + } + + public static double ToDouble(this string input) + { + if (input == null) return 0.0; + + if (input == "") return 0.0; + + double ret = 0.0; + input = input.RemoveComma(); + if (input.IsNumeric()) + { + ret = double.Parse(input); + } + return ret; + } + + public static float ToFloat(this string input) + { + if (input == null) return 0F; + + if (input == "") return 0F; + + float ret = 0F; + input = input.RemoveComma(); + if (input.IsNumeric()) + { + ret = float.Parse(input); + } + return ret; + } + + public static int ToInteger(this string input) + { + if (input == null) return 0; + + if (input == "") return 0; + + int ret = 0; + input = input.RemoveComma(); + int.TryParse(input, out ret); + return ret; + } + + public static string ToBlank(this string value) + { + if (value == "0") + return ""; + else + return value; + } + + public static DateTime ToCeDateTime(this string date) + { + try + { + DateTime dddd; + if (!DateTime.TryParse(date, out dddd)) + return DateTime.MinValue; + + + if (date == "01/01/0001") + return Convert.ToDateTime(date); + + string[] dd = date.Split('/'); + + int yy = 0; + if (dd[2].Length == 2) + yy = dd[2].Left(2).ToInteger() + 2500; + else + yy = dd[2].Left(4).ToInteger(); + if (yy >= 2400) yy -= 543; + DateTime birthdate = new DateTime(yy, dd[1].ToInteger(), dd[0].ToInteger()); + return birthdate; + } + catch + { + return DateTime.MinValue; + } + + } + + #endregion + + #endregion + } + +} \ No newline at end of file diff --git a/Extensions/TimeSpanExtension.cs b/Extensions/TimeSpanExtension.cs new file mode 100644 index 0000000..68cf5b7 --- /dev/null +++ b/Extensions/TimeSpanExtension.cs @@ -0,0 +1,127 @@ +using System; + +namespace BMA.EHR.Recurit.Exam.Service.Extensions +{ + public static class TimeSpanExtension + { + #region " To days " + + public static double ConvertMillisecondsToDays(this double milliseconds) + { + return TimeSpan.FromMilliseconds(milliseconds).TotalDays; + } + + public static double ConvertSecondsToDays(this double seconds) + { + return TimeSpan.FromSeconds(seconds).TotalDays; + } + + public static double ConvertMinutesToDays(this double minutes) + { + return TimeSpan.FromMinutes(minutes).TotalDays; + } + + public static double ConvertHoursToDays(this double hours) + { + return TimeSpan.FromHours(hours).TotalDays; + } + + #endregion + + #region " To hours " + + public static double ConvertMillisecondsToHours(this double milliseconds) + { + return TimeSpan.FromMilliseconds(milliseconds).TotalHours; + } + + public static double ConvertSecondsToHours(this double seconds) + { + return TimeSpan.FromSeconds(seconds).TotalHours; + } + + public static double ConvertMinutesToHours(this double minutes) + { + return TimeSpan.FromMinutes(minutes).TotalHours; + } + + public static double ConvertDaysToHours(this double days) + { + return TimeSpan.FromHours(days).TotalHours; + } + + #endregion + + #region " To minutes " + + public static double ConvertMillisecondsToMinutes(this double milliseconds) + { + return TimeSpan.FromMilliseconds(milliseconds).TotalMinutes; + } + + public static double ConvertSecondsToMinutes(this double seconds) + { + return TimeSpan.FromSeconds(seconds).TotalMinutes; + } + + public static double ConvertHoursToMinutes(this double hours) + { + return TimeSpan.FromHours(hours).TotalMinutes; + } + + public static double ConvertDaysToMinutes(this double days) + { + return TimeSpan.FromDays(days).TotalMinutes; + } + + #endregion + + #region " To seconds " + + public static double ConvertMillisecondsToSeconds(this double milliseconds) + { + return TimeSpan.FromMilliseconds(milliseconds).TotalSeconds; + } + + public static double ConvertMinutesToSeconds(this double minutes) + { + return TimeSpan.FromMinutes(minutes).TotalSeconds; + } + + public static double ConvertHoursToSeconds(this double hours) + { + return TimeSpan.FromHours(hours).TotalSeconds; + } + + public static double ConvertDaysToSeconds(this double days) + { + return TimeSpan.FromDays(days).TotalSeconds; + } + + #endregion + + #region " To milliseconds " + + public static double ConvertSecondsToMilliseconds(this double seconds) + { + return TimeSpan.FromSeconds(seconds).TotalMilliseconds; + } + + public static double ConvertMinutesToMilliseconds(this double minutes) + { + return TimeSpan.FromMinutes(minutes).TotalMilliseconds; + } + + public static double ConvertHoursToMilliseconds(this double hours) + { + return TimeSpan.FromHours(hours).TotalMilliseconds; + } + + public static double ConvertDaysToMilliseconds(this double days) + { + return TimeSpan.FromDays(days).TotalMilliseconds; + } + + #endregion + } +} \ No newline at end of file diff --git a/Models/Placement/PlacementProfile.cs b/Models/Placement/PlacementProfile.cs index 59ce081..038c5a5 100644 --- a/Models/Placement/PlacementProfile.cs +++ b/Models/Placement/PlacementProfile.cs @@ -11,13 +11,13 @@ namespace BMA.EHR.Domain.Models.Placement [Comment("Id บรรจุ")] public Placement? Placement { get; set; } [Comment("Id คำนำหน้า")] - public Prefix? Prefix { get; set; } + public string? Prefix { get; set; } [Comment("ชื่อ")] public string? Firstname { get; set; } [Comment("นามสกุล")] public string? Lastname { get; set; } [Comment("Id เพศ")] - public Gender? Gender { get; set; } + public string? Gender { get; set; } [Comment("Id ตำแหน่งที่สอบได้")] public PositionPath? PositionCandidate { get; set; } @@ -62,11 +62,11 @@ namespace BMA.EHR.Domain.Models.Placement public DateTime? DateOfBirth { get; set; } [Comment("Id สถานภาพ")] - public Relationship? Relationship { get; set; } + public string? Relationship { get; set; } // [Comment("Id กลุ่มเลือด")] // public BloodGroup? BloodGroup { get; set; } [Comment("Id ศาสนา")] - public Religion? Religion { get; set; } + public string? Religion { get; set; } [MaxLength(200), Comment("อีเมล")] public string? Email { get; set; } @@ -75,10 +75,10 @@ namespace BMA.EHR.Domain.Models.Placement public string? CitizenId { get; set; } [Comment("Id เขตที่ออกบัตรประชาชน")] - public District? CitizenDistrict { get; set; } + public string? CitizenDistrictId { get; set; } [Comment("Id จังหวัดที่ออกบัตรประชาชน")] - public Province? CitizenProvince { get; set; } + public string? CitizenProvinceId { get; set; } [Comment("วันที่ออกบัตร")] public DateTime? CitizenDate { get; set; } @@ -96,13 +96,13 @@ namespace BMA.EHR.Domain.Models.Placement public string? RegistAddress { get; set; } [Comment("Id จังหวัดที่อยู่ตามทะเบียนบ้าน")] - public Province? RegistProvince { get; set; } + public string? RegistProvinceId { get; set; } [Comment("Id อำเภอที่อยู่ตามทะเบียนบ้าน")] - public District? RegistDistrict { get; set; } + public string? RegistDistrictId { get; set; } [Comment("Id ตำบลที่อยู่ตามทะเบียนบ้าน")] - public SubDistrict? RegistSubDistrict { get; set; } + public string? RegistSubDistrictId { get; set; } [MaxLength(10), Comment("รหัสไปรษณีย์ที่อยู่ตามทะเบียนบ้าน")] public string? RegistZipCode { get; set; } @@ -114,13 +114,13 @@ namespace BMA.EHR.Domain.Models.Placement public string? CurrentAddress { get; set; } [Comment("Id จังหวัดที่อยู่ปัจจุบัน")] - public Province? CurrentProvince { get; set; } + public string? CurrentProvinceId { get; set; } [Comment("Id อำเภอที่อยู่ปัจจุบัน")] - public District? CurrentDistrict { get; set; } + public string? CurrentDistrictId { get; set; } [Comment("Id ตำบลที่อยู่ปัจจุบัน")] - public SubDistrict? CurrentSubDistrict { get; set; } + public string? CurrentSubDistrictId { get; set; } [MaxLength(10), Comment("รหัสไปรษณีย์ที่อยู่ปัจจุบัน")] public string? CurrentZipCode { get; set; } @@ -129,7 +129,7 @@ namespace BMA.EHR.Domain.Models.Placement public bool? Marry { get; set; } [Comment("Id คำนำหน้าชื่อคู่สมรส")] - public Prefix? MarryPrefix { get; set; } + public string? MarryPrefix { get; set; } [MaxLength(100), Comment("ชื่อจริงคู่สมรส")] public string? MarryFirstName { get; set; } @@ -144,7 +144,7 @@ namespace BMA.EHR.Domain.Models.Placement public string? MarryNationality { get; set; } [Comment("Id คำนำหน้าชื่อบิดา")] - public Prefix? FatherPrefix { get; set; } + public string? FatherPrefix { get; set; } [MaxLength(100), Comment("ชื่อจริงบิดา")] public string? FatherFirstName { get; set; } @@ -159,7 +159,7 @@ namespace BMA.EHR.Domain.Models.Placement public string? FatherNationality { get; set; } [Comment("Id คำนำหน้าชื่อมารดา")] - public Prefix? MotherPrefix { get; set; } + public string? MotherPrefix { get; set; } [MaxLength(100), Comment("ชื่อจริงมารดา")] public string? MotherFirstName { get; set; } diff --git a/Services/CMSCandidateService.cs b/Services/CMSCandidateService.cs index 50bb5fe..c62adcc 100644 --- a/Services/CMSCandidateService.cs +++ b/Services/CMSCandidateService.cs @@ -1,6 +1,6 @@ using System.Security.Claims; using System.Text.Json; -using BMA.EHR.Extensions; +using BMA.EHR.Recurit.Exam.Service.Extensions; using BMA.EHR.Recurit.Exam.Service.Core; using BMA.EHR.Recurit.Exam.Service.Data; using BMA.EHR.Recurit.Exam.Service.Models; diff --git a/Services/CandidateService.cs b/Services/CandidateService.cs index e25820f..17111c1 100644 --- a/Services/CandidateService.cs +++ b/Services/CandidateService.cs @@ -1,6 +1,6 @@ using System.Security.Claims; using BMA.EHR.Domain.Models.Placement; -using BMA.EHR.Extensions; +using BMA.EHR.Recurit.Exam.Service.Extensions; using BMA.EHR.Recurit.Exam.Service.Core; using BMA.EHR.Recurit.Exam.Service.Data; using BMA.EHR.Recurit.Exam.Service.Models; @@ -664,7 +664,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services EditorCondition = exam.EditorCondition, EditorConfirm = exam.EditorConfirm, Position = candidatePosition == null ? false : true, - CanRegister = exam.RegisterStartDate == null || exam.RegisterEndDate == null ? true :DateOnly.FromDateTime(exam.RegisterStartDate.Value) <= DateOnly.FromDateTime(DateTime.Now) && DateOnly.FromDateTime(exam.RegisterEndDate.Value) >= DateOnly.FromDateTime(DateTime.Now), + CanRegister = exam.RegisterStartDate == null || exam.RegisterEndDate == null ? true : DateOnly.FromDateTime(exam.RegisterStartDate.Value) <= DateOnly.FromDateTime(DateTime.Now) && DateOnly.FromDateTime(exam.RegisterEndDate.Value) >= DateOnly.FromDateTime(DateTime.Now), RegisterEndDate = exam.RegisterEndDate, RegisterStartDate = exam.RegisterStartDate, }; diff --git a/Services/PeriodExamService.cs b/Services/PeriodExamService.cs index c3f5eac..da0c321 100644 --- a/Services/PeriodExamService.cs +++ b/Services/PeriodExamService.cs @@ -1,7 +1,7 @@ using System.Security.Claims; using System.Text.Json; using BMA.EHR.Domain.Models.Placement; -using BMA.EHR.Extensions; +using BMA.EHR.Recurit.Exam.Service.Extensions; using BMA.EHR.Recurit.Exam.Service.Core; using BMA.EHR.Recurit.Exam.Service.Data; using BMA.EHR.Recurit.Exam.Service.Models; @@ -2100,48 +2100,61 @@ namespace BMA.EHR.Recurit.Exam.Service.Services var profile = await _contextMetadata.Profiles .Include(x => x.Salaries) .FirstOrDefaultAsync(p => p.CitizenId == candidate.CitizenId); + var Prefix = await _contextMetadata.Prefixes.Where(x => x.Id == candidate.PrefixId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.PrefixId).FirstOrDefaultAsync(); + var Religion = await _contextMetadata.Religions.Where(x => x.Id == candidate.ReligionId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.ReligionId).FirstOrDefaultAsync(); + var CitizenDistrict = await _contextMetadata.Districts.Where(x => x.Id == candidate.CitizenDistrictId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.CitizenDistrictId).FirstOrDefaultAsync(); + var CitizenProvince = await _contextMetadata.Provinces.Where(x => x.Id == candidate.CitizenProvinceId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.CitizenProvinceId).FirstOrDefaultAsync(); + var RegistProvince = await _contextMetadata.Provinces.Where(x => x.Id == candidate.RegistProvinceId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.RegistProvinceId).FirstOrDefaultAsync(); + var RegistDistrict = await _contextMetadata.Districts.Where(x => x.Id == candidate.RegistDistrictId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.RegistDistrictId).FirstOrDefaultAsync(); + var RegistSubDistrict = await _contextMetadata.SubDistricts.Where(x => x.Id == candidate.RegistSubDistrictId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.RegistSubDistrictId).FirstOrDefaultAsync(); + var CurrentProvince = await _contextMetadata.Provinces.Where(x => x.Id == candidate.CurrentProvinceId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.CurrentProvinceId).FirstOrDefaultAsync(); + var CurrentDistrict = await _contextMetadata.Districts.Where(x => x.Id == candidate.CurrentDistrictId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.CurrentDistrictId).FirstOrDefaultAsync(); + var CurrentSubDistrict = await _contextMetadata.SubDistricts.Where(x => x.Id == candidate.CurrentSubDistrictId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.CurrentSubDistrictId).FirstOrDefaultAsync(); + var MarryPrefix = await _contextMetadata.Prefixes.Where(x => x.Id == candidate.MarryPrefixId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.MarryPrefixId).FirstOrDefaultAsync(); + var FatherPrefix = await _contextMetadata.Prefixes.Where(x => x.Id == candidate.FatherPrefixId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.FatherPrefixId).FirstOrDefaultAsync(); + var MotherPrefix = await _contextMetadata.Prefixes.Where(x => x.Id == candidate.MotherPrefixId).FirstOrDefaultAsync() == null ? null : await _contextMetadata.Prefixes.Where(x => x.Id == candidate.MotherPrefixId).FirstOrDefaultAsync(); var placementProfile = new PlacementProfile { Placement = placement, PositionCandidate = await _contextMetadata.PositionPaths.FirstOrDefaultAsync(x => x.Id == (candidate.PositionExam == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : candidate.PositionExam.PositionId)), - Prefix = await _contextMetadata.Prefixes.FirstOrDefaultAsync(x => x.Id == candidate.PrefixId), + Prefix = Prefix == null ? null : Prefix.Name, ProfileImg = candidate.ProfileImg, Firstname = candidate.FirstName, Lastname = candidate.LastName, Nationality = candidate.Nationality, DateOfBirth = candidate.DateOfBirth, - Religion = await _contextMetadata.Religions.FirstOrDefaultAsync(x => x.Id == candidate.ReligionId), + Religion = Religion == null ? null : Religion.Name, Email = candidate.Email, CitizenId = candidate.CitizenId, - CitizenDistrict = await _contextMetadata.Districts.FirstOrDefaultAsync(x => x.Id == candidate.CitizenDistrictId), - CitizenProvince = await _contextMetadata.Provinces.FirstOrDefaultAsync(x => x.Id == candidate.CitizenProvinceId), + CitizenDistrictId = CitizenDistrict == null ? null : CitizenDistrict.Id.ToString(), + CitizenProvinceId = CitizenProvince == null ? null : CitizenProvince.Id.ToString(), CitizenDate = candidate.CitizenDate, Telephone = candidate.Telephone, MobilePhone = candidate.MobilePhone, Knowledge = candidate.Knowledge, RegistAddress = candidate.RegistAddress, - RegistProvince = await _contextMetadata.Provinces.FirstOrDefaultAsync(x => x.Id == candidate.RegistProvinceId), - RegistDistrict = await _contextMetadata.Districts.FirstOrDefaultAsync(x => x.Id == candidate.RegistDistrictId), - RegistSubDistrict = await _contextMetadata.SubDistricts.FirstOrDefaultAsync(x => x.Id == candidate.RegistSubDistrictId), + RegistProvinceId = RegistProvince == null ? null : RegistProvince.Id.ToString(), + RegistDistrictId = RegistDistrict == null ? null : RegistDistrict.Id.ToString(), + RegistSubDistrictId = RegistSubDistrict == null ? null : RegistSubDistrict.Id.ToString(), RegistZipCode = candidate.RegistZipCode, RegistSame = candidate.RegistSame, CurrentAddress = candidate.CurrentAddress, - CurrentProvince = await _contextMetadata.Provinces.FirstOrDefaultAsync(x => x.Id == candidate.CurrentProvinceId), - CurrentDistrict = await _contextMetadata.Districts.FirstOrDefaultAsync(x => x.Id == candidate.CurrentDistrictId), - CurrentSubDistrict = await _contextMetadata.SubDistricts.FirstOrDefaultAsync(x => x.Id == candidate.CurrentSubDistrictId), + CurrentProvinceId = CurrentProvince == null ? null : CurrentProvince.Id.ToString(), + CurrentDistrictId = CurrentDistrict == null ? null : CurrentDistrict.Id.ToString(), + CurrentSubDistrictId = CurrentSubDistrict == null ? null : CurrentSubDistrict.Id.ToString(), CurrentZipCode = candidate.CurrentZipCode, Marry = candidate.Marry, - MarryPrefix = await _contextMetadata.Prefixes.FirstOrDefaultAsync(x => x.Id == candidate.MarryPrefixId), + MarryPrefix = MarryPrefix == null ? null : MarryPrefix.Name, MarryFirstName = candidate.MarryFirstName, MarryLastName = candidate.MarryLastName, MarryOccupation = candidate.MarryOccupation, MarryNationality = candidate.MarryNationality, - FatherPrefix = await _contextMetadata.Prefixes.FirstOrDefaultAsync(x => x.Id == candidate.FatherPrefixId), + FatherPrefix = FatherPrefix == null ? null : FatherPrefix.Name, FatherFirstName = candidate.FatherFirstName, FatherLastName = candidate.FatherLastName, FatherOccupation = candidate.FatherOccupation, FatherNationality = candidate.FatherNationality, - MotherPrefix = await _contextMetadata.Prefixes.FirstOrDefaultAsync(x => x.Id == candidate.MotherPrefixId), + MotherPrefix = MotherPrefix == null ? null : MotherPrefix.Name, MotherFirstName = candidate.MotherFirstName, MotherLastName = candidate.MotherLastName, MotherOccupation = candidate.MotherOccupation, @@ -2261,37 +2274,44 @@ namespace BMA.EHR.Recurit.Exam.Service.Services var profile = await _contextMetadata.Profiles .Include(x => x.Salaries) .FirstOrDefaultAsync(p => p.CitizenId == candidate.CitizenId); + var CitizenProvince = await _contextMetadata.Provinces.Where(x => x.Name == candidate.CitizenCardIssuer).FirstOrDefaultAsync(); + var RegistProvince = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Provinces.Where(x => x.Name == candidate.Addresses.FirstOrDefault().Province).FirstOrDefaultAsync(); + var RegistDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Districts.Where(x => x.Name == candidate.Addresses.FirstOrDefault().District).FirstOrDefaultAsync(); + var RegistSubDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.SubDistricts.Where(x => x.Name == candidate.Addresses.FirstOrDefault().Amphur).FirstOrDefaultAsync(); + var CurrentProvince = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Provinces.Where(x => x.Name == candidate.Addresses.FirstOrDefault().Province1).FirstOrDefaultAsync(); + var CurrentDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Districts.Where(x => x.Name == candidate.Addresses.FirstOrDefault().District1).FirstOrDefaultAsync(); + var CurrentSubDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.SubDistricts.Where(x => x.Name == candidate.Addresses.FirstOrDefault().Amphur1).FirstOrDefaultAsync(); var placementProfile = new PlacementProfile { Placement = placement, PositionCandidate = await _contextMetadata.PositionPaths.FirstOrDefaultAsync(x => x.Name == candidate.PositionName), - Prefix = await _contextMetadata.Prefixes.FirstOrDefaultAsync(x => x.Name == candidate.Prefix), + Prefix = candidate.Prefix, Firstname = candidate.FirstName, Lastname = candidate.LastName, - Gender = await _contextMetadata.Genders.FirstOrDefaultAsync(x => x.Name == candidate.Gendor), + Gender = candidate.Gendor, Nationality = candidate.National, Race = candidate.Race, - Religion = await _contextMetadata.Religions.FirstOrDefaultAsync(x => x.Name == candidate.Religion), + Religion = candidate.Religion, DateOfBirth = candidate.DateOfBirth, - Relationship = await _contextMetadata.Relationships.FirstOrDefaultAsync(x => x.Name == candidate.Marry), + Relationship = candidate.Marry, // Email = candidate.Email, CitizenId = candidate.CitizenId, // CitizenDistrict = await _contextMetadata.Districts.FirstOrDefaultAsync(x => x.Id == candidate.CitizenDistrictId), - CitizenProvince = await _contextMetadata.Provinces.FirstOrDefaultAsync(x => x.Name == candidate.CitizenCardIssuer), + CitizenProvinceId = CitizenProvince == null ? null : CitizenProvince.Id.ToString(), CitizenDate = candidate.CitizenCardExpireDate, Telephone = candidate.Addresses.FirstOrDefault() == null ? null : candidate.Addresses.FirstOrDefault().Telephone, MobilePhone = candidate.Addresses.FirstOrDefault() == null ? null : candidate.Addresses.FirstOrDefault().Mobile, // Knowledge = candidate.Knowledge, RegistAddress = $"{Address}{Moo}{Soi}{Road}", - RegistProvince = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Provinces.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().Province), - RegistDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Districts.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().District), - RegistSubDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.SubDistricts.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().Amphur), + RegistProvinceId = RegistProvince == null ? null : RegistProvince.Id.ToString(), + RegistDistrictId = RegistDistrict == null ? null : RegistDistrict.Id.ToString(), + RegistSubDistrictId = RegistSubDistrict == null ? null : RegistSubDistrict.Id.ToString(), RegistZipCode = candidate.Addresses.FirstOrDefault() == null ? null : candidate.Addresses.FirstOrDefault().ZipCode, RegistSame = false, CurrentAddress = $"{Address1}{Moo1}{Soi1}{Road1}", - CurrentProvince = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Provinces.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().Province1), - CurrentDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.Districts.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().District1), - CurrentSubDistrict = candidate.Addresses.FirstOrDefault() == null ? null : await _contextMetadata.SubDistricts.FirstOrDefaultAsync(x => x.Name == candidate.Addresses.FirstOrDefault().Amphur1), + CurrentProvinceId = CurrentProvince == null ? null : CurrentProvince.Id.ToString(), + CurrentDistrictId = CurrentDistrict == null ? null : CurrentDistrict.Id.ToString(), + CurrentSubDistrictId = CurrentSubDistrict == null ? null : CurrentSubDistrict.Id.ToString(), CurrentZipCode = candidate.Addresses.FirstOrDefault() == null ? null : candidate.Addresses.FirstOrDefault().ZipCode1, Marry = candidate.Marry.Contains("สมรส"), // MarryPrefix = await _contextMetadata.Prefixes.FirstOrDefaultAsync(x => x.Id == candidate.MarryPrefixId),