using System.Threading.Tasks; using System; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Logging; using AyaNova.Models; using AyaNova.Api.ControllerHelpers; using AyaNova.Biz; using Microsoft.EntityFrameworkCore; using System.Linq; using System.Collections.Generic; namespace AyaNova.Api.Controllers { [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/schedule")] [Produces("application/json")] [Authorize] public class ScheduleController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; private readonly ApiServerState serverState; /// /// ctor /// /// /// /// public ScheduleController(AyContext dbcontext, ILogger logger, ApiServerState apiServerState) { ct = dbcontext; log = logger; serverState = apiServerState; } /// /// Get personal schedule for parameters specified /// /// Personal schedule parameters /// From route path /// [HttpPost("personal")] public async Task PostPersonalSchedule([FromBody] PersonalScheduleParams p, ApiVersion apiVersion) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); List r = new List(); var UserId = UserIdFromContext.Id(HttpContext.Items); var UType = UserTypeFromContext.Type(HttpContext.Items); //this covers the largest possible window that could display due to nearly a week of the last or next month showing DateTime dtStart = p.Start.AddDays(-6); DateTime dtEnd = p.End.AddDays(6); //WORKORDERS if (p.WorkOrders && (UType == UserType.Service || UType == UserType.ServiceContractor)) { r.AddRange(await ct.ViewSchedulePersonalWorkOrder.Where(x => x.SchedUserId == UserId && x.StartDate > dtStart && x.StopDate < dtEnd) .Select(x => new PersonalScheduleListItem() { Id = x.WoItemSchedUserId, Color = ColorFromWOItem(x, p), Start = EpochSeconds(x.StartDate), End = EpochSeconds(x.StopDate), Type = AyaType.WorkOrderItemScheduledUser, Name = NameFromWOItem(x, p) }) .ToListAsync()); } return Ok(ApiOkResponse.Response(r)); } private static long? EpochSeconds(DateTime? dt) { if (dt == null) return null; DateTimeOffset dto = new DateTimeOffset((DateTime)dt); return dto.ToUnixTimeMilliseconds(); } private static string ColorFromWOItem(ViewSchedulePersonalWorkOrder v, PersonalScheduleParams p) { switch (p.ColorSource) { case PersonalScheduleWorkOrderColorSource.WorkOrderStatus: return v.WorkOrderStatusColor; case PersonalScheduleWorkOrderColorSource.WorkOrderItemStatus: return v.WorkOrderItemStatusColor; case PersonalScheduleWorkOrderColorSource.WorkOrderItemPriority: return v.WorkOrderItemPriorityColor; } return string.Empty; } private static string NameFromWOItem(ViewSchedulePersonalWorkOrder v, PersonalScheduleParams p) { // Name=[wonumber customername] return v.Serial.ToString() + " " + v.CustomerName; } public enum PersonalScheduleWorkOrderColorSource : int { None = 0, WorkOrderStatus = 2, WorkOrderItemStatus = 3, WorkOrderItemPriority = 4 } public class PersonalScheduleParams { public DateTime Start { get; set; } public DateTime End { get; set; } public PersonalScheduleWorkOrderColorSource ColorSource { get; set; } public bool WorkOrders { get; set; } public bool Reviews { get; set; } public bool Reminders { get; set; } } public class PersonalScheduleListItem { public long? Start { get; set; } public long? End { get; set; } public bool Timed { get { return true; } } public string Name { get; set; } public string Color { get; set; } public AyaType Type { get; set; } public long Id { get; set; } } //------------ }//eoc }//eons