public async Task <IActionResult> CheckRoomStatus(string code,
                                                          CheckRoomStatusModel model)
        {
            var entity = _service.Rooms.Code(code).FirstOrDefault();

            if (entity == null)
            {
                return(NotFound(AppResult.NotFound()));
            }
            var validationData = _service.ValidateCheckRoomStatus(User, entity, model);

            if (!validationData.IsValid)
            {
                return(BadRequest(AppResult.FailValidation(data: validationData)));
            }
            AppEvent ev;

            using (var trans = context.Database.BeginTransaction())
            {
                var oldNote   = entity.Note;
                var oldStatus = entity.IsAvailable;
                _service.CheckRoomStatus(model, entity);
                //log event
                ev = _sysService.GetEventForRoomProcessing(
                    $"{UserEmail} has changed the status of room {entity.Code}",
                    "Room_CheckStatus", UserId, new
                {
                    old_note   = oldNote,
                    old_status = oldStatus,
                    new_note   = entity.Note,
                    new_status = entity.IsAvailable
                });
                _sysService.CreateAppEvent(ev);
                //end log event
                trans.Commit();
                context.SaveChanges();
            }
            //notify managers
            var notiData = new Dictionary <string, string>
            {
                { "event", ev.Type },
                { "id", entity.Code.ToString() }
            };
            var managerIds = _memberService.QueryManagersOfDepartment(entity.DepartmentCode)
                             .Union(_memberService.QueryManagersOfArea(entity.BuildingAreaCode))
                             .Select(o => o.UserId).ToList();

            if (managerIds.Count > 0)
            {
                await NotiHelper.Notify(managerIds, new Notification
                {
                    Title = $"Status of room {entity.Code} has been changed",
                    Body  = $"{UserEmail} has changed the status of room {entity.Code}. Pressed for more detail"
                }, data : notiData);
            }
            return(NoContent());
        }
Ejemplo n.º 2
0
        public async Task <string> PushNotiToUser(AppUser entity, PushNotiModel model)
        {
            var result = await NotiHelper.Notify(entity.Id, new Notification
            {
                Body     = model.Body,
                ImageUrl = string.IsNullOrWhiteSpace(model.ImageUrl) ? null : model.ImageUrl,
                Title    = model.Title,
            }, model.Data);

            return(result);
        }
        public async Task <IActionResult> UpdateBooking(int id, UpdateBookingModel model)
        {
            var entity = _service.Bookings.Id(id).FirstOrDefault();

            if (entity == null)
            {
                return(NotFound(AppResult.NotFound()));
            }
            var member         = _memberService.Members.Id(UserId).FirstOrDefault();
            var validationData = _service.ValidateUpdateBooking(User, member, entity, model);

            if (!validationData.IsValid)
            {
                return(BadRequest(AppResult.FailValidation(data: validationData)));
            }
            var      fromStatus = entity.Status;
            AppEvent ev;

            using (var trans = context.Database.BeginTransaction())
            {
                _service.UpdateBooking(model, entity);
                var history = _service.CreateHistoryForUpdateBooking(entity, member);
                //log event
                ev = _sysService.GetEventForBookingProcessing(history);
                _sysService.CreateAppEvent(ev);
                //end log event
                context.SaveChanges();
                trans.Commit();
            }
            //notify using members
            var notiData = new Dictionary <string, string>
            {
                { "event", ev.Type },
                { "id", entity.Id.ToString() }
            };
            var updatePerson = fromStatus == BookingStatusValues.PROCESSING ? "department manager" :
                               "location manager";
            var usingMemberIds = entity.UsingMemberIds.Split('\n');
            var notiMemberIds  = usingMemberIds.Where(o => o != UserId).ToList();
            await NotiHelper.Notify(notiMemberIds, new Notification
            {
                Title = $"Booking {entity.Code} has been updated by your {updatePerson}",
                Body  = $"{UserEmail} has just updated your booking of room {entity.RoomCode}. Press for more detail"
            }, data : notiData);

            return(NoContent());
        }
        public async Task <IActionResult> ChangeApproveStatusOfBooking(int id, ChangeApprovalStatusOfBookingModel model)
        {
            var entity = _service.Bookings.Id(id).FirstOrDefault();

            if (entity == null)
            {
                return(NotFound(AppResult.NotFound()));
            }
            var member         = _memberService.Members.Id(UserId).FirstOrDefault();
            var validationData = _service.ValidateChangeApprovalStausOfBooking(User, member, entity, model);

            if (!validationData.IsValid)
            {
                return(BadRequest(AppResult.FailValidation(data: validationData)));
            }
            var      fromStatus = entity.Status;
            AppEvent ev;

            using (var trans = context.Database.BeginTransaction())
            {
                _service.ChangeApprovalStatusOfBooking(model, entity);
                var history = _service.CreateHistoryForChangeApprovalStatusOfBooking(
                    entity, fromStatus, model.IsApproved, member);
                //log event
                ev = _sysService.GetEventForBookingProcessing(history);
                _sysService.CreateAppEvent(ev);
                //end log event
                context.SaveChanges();
                trans.Commit();
            }
            //notify using members, managers (if any)
            var notiData = new Dictionary <string, string>
            {
                { "event", ev.Type },
                { "id", entity.Id.ToString() }
            };
            var approvePerson = fromStatus == BookingStatusValues.PROCESSING ? "department manager" :
                                "location manager";
            var action         = model.IsApproved ? "approved" : "denied";
            var usingMemberIds = entity.UsingMemberIds.Split('\n');
            var notiMemberIds  = usingMemberIds.Where(o => o != UserId).ToList();
            var notiMembers    = NotiHelper.Notify(notiMemberIds, new Notification
            {
                Title = $"Booking {entity.Code} has been {action} by your {approvePerson}",
                Body  = $"{UserEmail} has just {action} your booking. Press for more detail"
            }, data: notiData);

            if (entity.Status == BookingStatusValues.VALID && model.IsApproved)
            {
                var managerIds = _memberService.QueryManagersOfArea(entity.Room.BuildingAreaCode)
                                 .Select(o => o.UserId).ToList();
                if (managerIds.Count > 0)
                {
                    await NotiHelper.Notify(managerIds, new Notification
                    {
                        Title = $"There's a new booking request",
                        Body  = $"{UserEmail} has just {action} a booking of room {entity.RoomCode}. Press for more detail"
                    }, data : notiData);
                }
            }
            await notiMembers;

            return(NoContent());
        }
        public async Task <IActionResult> CancelBooking(int id, CancelBookingModel model)
        {
            var entity = _service.Bookings.Id(id).FirstOrDefault();

            if (entity == null)
            {
                return(NotFound(AppResult.NotFound()));
            }
            var validationData = _service.ValidateCancelBooking(User, entity, model);

            if (!validationData.IsValid)
            {
                return(BadRequest(AppResult.FailValidation(data: validationData)));
            }
            var      fromStatus = entity.Status;
            AppEvent ev;

            using (var trans = context.Database.BeginTransaction())
            {
                _service.CancelBooking(model, entity);
                var history = _service.CreateHistoryForCancelBooking(entity, fromStatus, entity.BookMember);
                //log event
                ev = _sysService.GetEventForBookingProcessing(history);
                _sysService.CreateAppEvent(ev);
                //end log event
                context.SaveChanges();
                trans.Commit();
            }
            //notify using members, managers (if any)
            var notiData = new Dictionary <string, string>
            {
                { "event", ev.Type },
                { "id", entity.Id.ToString() }
            };
            var notiMemberIds = entity.UsingMemberIds.Split('\n')
                                .Where(o => o != UserId).ToList();
            var notiMembers = notiMemberIds.Any() ? NotiHelper.Notify(notiMemberIds, new Notification
            {
                Title = $"Your booking {entity.Code} has been aborted",
                Body  = $"{UserEmail} has just aborted booking {entity.Code}. Press for more detail"
            }, data: notiData) : Task.CompletedTask;
            var managerNoti = new Notification
            {
                Title = $"A booking managed by you has been aborted",
                Body  = $"{UserEmail} has just aborted booking {entity.Code}. Press for more detail"
            };

            if (entity.Status == BookingStatusValues.VALID)
            {
                var managerIds = _memberService.QueryManagersOfMember(entity.BookMemberId)
                                 .Select(o => o.UserId).ToList();
                if (managerIds.Count > 0)
                {
                    await NotiHelper.Notify(managerIds, managerNoti, data : notiData);
                }
            }
            else if (entity.Status == BookingStatusValues.APPROVED)
            {
                var managerIds = _memberService.QueryManagersOfArea(entity.Room.BuildingAreaCode)
                                 .Select(o => o.UserId).ToList();
                if (managerIds.Count > 0)
                {
                    await NotiHelper.Notify(managerIds, managerNoti, data : notiData);
                }
            }
            await notiMembers;

            return(NoContent());
        }
        public async Task <IActionResult> Create(CreateBookingModel model)
        {
            var memberQuery    = _memberService.Members;
            var member         = _memberService.Members.Id(UserId).FirstOrDefault();
            var validationData = _service.ValidateCreateBooking(User, member, model);

            if (!validationData.IsValid)
            {
                return(BadRequest(AppResult.FailValidation(data: validationData)));
            }
            var      usingMemberIds = validationData.GetTempData <List <string> >("using_member_ids");
            var      bookedRoom = validationData.GetTempData <Room>("booked_room");
            AppEvent ev; Booking entity;

            using (var trans = context.Database.BeginTransaction())
            {
                entity = _service.CreateBooking(member, bookedRoom, model, usingMemberIds);
                var history = _service.CreateHistoryForCreateBooking(entity, member);
                _roomService.ChangeRoomHangingStatus(bookedRoom, false, UserId);
                //log event
                ev = _sysService.GetEventForBookingProcessing(history);
                _sysService.CreateAppEvent(ev);
                //end log event
                context.SaveChanges();
                trans.Commit();
            }
            //notify using members, managers (if any)
            var notiData = new Dictionary <string, string>
            {
                { "event", ev.Type },
                { "id", entity.Id.ToString() }
            };
            var notiMemberIds = usingMemberIds.Where(o => o != UserId).ToList();
            var notiMembers   = notiMemberIds.Any() ? NotiHelper.Notify(notiMemberIds, new Notification
            {
                Title = $"You have a new booking",
                Body  = $"{UserEmail} has just created a booking of room {entity.RoomCode} for you. Press for more detail"
            }, data: notiData) : Task.CompletedTask;
            var managerNoti = new Notification
            {
                Title = $"There's a new booking request",
                Body  = $"{UserEmail} has just created a booking of room {entity.RoomCode}. Press for more detail"
            };

            if (entity.Status == BookingStatusValues.PROCESSING)
            {
                var managerIds = _memberService.QueryManagersOfMember(member.UserId)
                                 .Select(o => o.UserId).ToList();
                if (managerIds.Count > 0)
                {
                    await NotiHelper.Notify(managerIds, managerNoti, data : notiData);
                }
            }
            else if (entity.Status == BookingStatusValues.VALID)
            {
                var managerIds = _memberService.QueryManagersOfArea(bookedRoom.BuildingAreaCode)
                                 .Select(o => o.UserId).ToList();
                if (managerIds.Count > 0)
                {
                    await NotiHelper.Notify(managerIds, managerNoti, data : notiData);
                }
            }
            await notiMembers;

            return(Created($"/{ApiEndpoint.BOOKING_API}/{entity.Id}",
                           AppResult.Success(data: entity.Id)));
        }