|
@@ -7,6 +7,7 @@ using MTWorkHR.Core.UnitOfWork;
|
|
|
using MTWorkHR.Application.Services.Interfaces;
|
|
|
using MTWorkHR.Core.Entities;
|
|
|
using System.Linq.Dynamic.Core;
|
|
|
+using System.Globalization;
|
|
|
|
|
|
namespace MTWorkHR.Application.Services
|
|
|
{
|
|
@@ -41,6 +42,13 @@ namespace MTWorkHR.Application.Services
|
|
|
throw new AppException(ExceptionEnum.MapperIssue);
|
|
|
}
|
|
|
entity.MeetingUsers = input.MeetingUserIds?.Select(s => new MeetingUser { AssignedUserId = s, AssignedUserName = _userService.GetUserFullName(s).Result }).ToList();
|
|
|
+ //-----------Time conversion to utc
|
|
|
+ var startTime = DateTime.Parse( entity.StartTime);
|
|
|
+
|
|
|
+ entity.StartTime = ConvertToUtc(entity.StartTime, entity.MeetingDate);
|
|
|
+ entity.EndTime = ConvertToUtc(entity.EndTime, entity.MeetingDate);
|
|
|
+
|
|
|
+
|
|
|
|
|
|
var team = await _unitOfWork.Meeting.AddAsync(entity);
|
|
|
await _unitOfWork.CompleteAsync();
|
|
@@ -60,8 +68,8 @@ namespace MTWorkHR.Application.Services
|
|
|
entity.Title = input.Title;
|
|
|
entity.MeetingLink = input.MeetingLink;
|
|
|
entity.MeetingDate = input.MeetingDate;
|
|
|
- entity.StartTime = input.StartTime;
|
|
|
- entity.EndTime = input.EndTime;
|
|
|
+ entity.StartTime = ConvertToUtc(input.StartTime, input.MeetingDate);
|
|
|
+ entity.EndTime = ConvertToUtc(input.EndTime, input.MeetingDate);
|
|
|
entity.RepeatId = input.RepeatId;
|
|
|
var oldUsers = entity.MeetingUsers?.Select(s => s.AssignedUserId);
|
|
|
|
|
@@ -119,6 +127,56 @@ namespace MTWorkHR.Application.Services
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Converts a local time and date to UTC based on the specified time zone.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="startTime">Time string (e.g., "7:00 PM").</param>
|
|
|
+ /// <param name="date">Date as DateTime (e.g., 2025-04-22).</param>
|
|
|
+ /// <param name="timeZoneId">Time zone ID (e.g., "Eastern Standard Time").</param>
|
|
|
+ /// <returns>UTC DateTime with Kind = DateTimeKind.Utc.</returns>
|
|
|
+ /// <exception cref="ArgumentException">Thrown if timeZoneId or input formats are invalid.</exception>
|
|
|
+ public static string ConvertToUtc(string startTime, DateTime date)
|
|
|
+ {
|
|
|
+ string timeZoneId = GlobalInfo.timeZone;
|
|
|
+ if (string.IsNullOrWhiteSpace(startTime))
|
|
|
+ {
|
|
|
+ throw new ArgumentException("Start time cannot be null or empty.");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (string.IsNullOrWhiteSpace(timeZoneId))
|
|
|
+ {
|
|
|
+ throw new ArgumentException("Time zone ID cannot be null or empty.");
|
|
|
+ }
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ // Parse the time string
|
|
|
+ DateTime parsedTime = DateTime.Parse(startTime, new CultureInfo("en-US"), DateTimeStyles.NoCurrentDateDefault);
|
|
|
+
|
|
|
+ // Combine date from DateTime and time from parsedTime
|
|
|
+ DateTime localDateTime = new DateTime(
|
|
|
+ date.Year, date.Month, date.Day,
|
|
|
+ parsedTime.Hour, parsedTime.Minute, parsedTime.Second, parsedTime.Millisecond,
|
|
|
+ DateTimeKind.Unspecified);
|
|
|
+
|
|
|
+ // Get source time zone
|
|
|
+ TimeZoneInfo sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
|
|
|
+
|
|
|
+ // Convert to UTC
|
|
|
+ DateTime utcDateTime = TimeZoneInfo.ConvertTimeToUtc(localDateTime, sourceTimeZone);
|
|
|
+
|
|
|
+ return utcDateTime.ToShortTimeString();
|
|
|
+ }
|
|
|
+ catch (TimeZoneNotFoundException)
|
|
|
+ {
|
|
|
+ throw new ArgumentException($"Invalid time zone ID: {timeZoneId}");
|
|
|
+ }
|
|
|
+ catch (FormatException)
|
|
|
+ {
|
|
|
+ throw new ArgumentException("Invalid time format. Use 'h:mm tt' (e.g., '7:00 PM').");
|
|
|
+ }
|
|
|
+ }
|
|
|
//public override async Task Delete(long id)
|
|
|
//{
|
|
|
// var entity = await _unitOfWork.Meeting.GetByIdAsync(id);
|