public async Task <CreatePackageRs> AddForMember(CreatePackageRq rq) { if (!(await _dbContext.Users.AnyAsync(x => x.Id == rq.UserId))) { throw new Exception("Học viên không tồn tại"); } var package = new DataAccess.Entities.Package { UserId = rq.UserId }; if (rq.DefaultPackageId.HasValue) { int defaultPackageId = rq.DefaultPackageId.Value; var defaultPackage = await _dbContext.DefaultPackages.FirstOrDefaultAsync(p => p.Id == defaultPackageId); package.DefaultPackageId = defaultPackageId; package.DefaultPackage = defaultPackage ?? throw new Exception("Gói tập đang chọn không tồn tại"); package.RemainingSessions = defaultPackage.NumberOfSessions; package.NumberOfSessions = defaultPackage.NumberOfSessions; package.Price = defaultPackage.Price; package.Months = defaultPackage.Months; } else { package.RemainingSessions = rq.NumberOfSessions; package.NumberOfSessions = rq.NumberOfSessions; package.Price = rq.Price; package.Months = rq.Months; } var membership = await _dbContext.Memberships.SingleAsync(x => x.UserId == rq.UserId); var addedMonths = package.Months; if (membership.ExpiryDate >= DateTime.Now.Date && membership.RemainingSessions > 0) { var expiryDate = membership.ExpiryDate.AddMonths(addedMonths); membership.ExpiryDate = expiryDate; package.ExpiryDate = expiryDate; } else { package.IsActive = true; var currentPackage = await _dbContext.Packages.FirstOrDefaultAsync(m => m.UserId == rq.UserId && m.IsActive); if (currentPackage != null) { currentPackage.IsActive = false; } // Since it is expired, reset remaining session to 0 membership.RemainingSessions = 0; var expiryDate = DateTime.Now.AddMonths(addedMonths); membership.ExpiryDate = expiryDate; package.ExpiryDate = expiryDate; } membership.RemainingSessions += package.NumberOfSessions; _dbContext.Packages.Add(package); await _dbContext.SaveChangesAsync(); _dbContext.Entry(membership).State = EntityState.Detached; var rs = new CreatePackageRs(); rs.Membership = _mapper.Map <MembershipDTO>(membership); return(rs); }
public async Task <CreateRegistrationRs> Create(CreateRegistrationRq rq) { int userId = rq.Registration.UserId; // Decrease remaining sessions of the user var membership = await _dbContext.Memberships.FirstOrDefaultAsync(x => x.UserId == userId); if (membership == null) { throw new Exception("Học viên chưa đăng ký gói tập"); } if (membership.RemainingSessions <= 0) { throw new Exception("Bạn đã dùng hết số buổi của gói tập hiện tại."); } if (membership.ExpiryDate < DateTime.Now.Date) { throw new Exception("Gói tập của bạn đã hết hạn."); } membership.RemainingSessions--; // Keep track of what package is being used var activePackage = _dbContext.Packages.FirstOrDefault(x => x.UserId == userId && x.IsActive); if (activePackage == null) { throw new Exception("Học viên chưa đăng ký gói tập hoặc có gì đó không đúng! Vui lòng liên hệ admin tại 0943619526"); } DataAccess.Entities.Package nextActivePackage = null; if (activePackage.RemainingSessions > 0) { activePackage.RemainingSessions--; } else { nextActivePackage = _dbContext.Packages.FirstOrDefault(p => p.UserId == userId && p.Id > activePackage.Id && p.RemainingSessions > 0); if (nextActivePackage != null) { activePackage.IsActive = false; nextActivePackage.IsActive = true; nextActivePackage.RemainingSessions--; } } var logs = new List <IFieldChangeLog> { membership, activePackage }; if (nextActivePackage != null) { logs.Add(nextActivePackage); } LogLatestAction(logs); // Add registration DataAccess.Entities.Registration registration = _mapper.Map <DataAccess.Entities.Registration>(rq.Registration); var session = await _dbContext.ScheduleDetails.FirstOrDefaultAsync(x => x.Id == registration.ScheduleDetailId); if (session == null) { throw new Exception("Buổi học không tồn tại"); } bool isAdmin = HttpContext.Current.User.IsInRole("Admin"); if (!isAdmin && session.Registrations.Count() == MAX_MEMBERS_PER_SESSION) { throw new Exception("Buổi học đã đủ số lượng người đăng ký rồi.<br />Bạn có thể liên hệ với admin qua facebook: <a href=\"https://www.facebook.com/mistake.dance\" target=\"_blank\">Mistake Dance Studio</a> hoặc số điện thoại 0943619526 để được xem xét đăng ký buổi học"); } registration.Status = RegistrationStatus.Registered; registration.DateRegistered = DateTime.Now; _dbContext.Registrations.Add(registration); await _dbContext.SaveChangesAsync(); var registrationDTO = await _dbContext.Registrations .ProjectTo <RegistrationDTO>(_mappingConfig, dest => dest.User) .FirstOrDefaultAsync(u => u.Id == registration.Id); CreateRegistrationRs rs = new CreateRegistrationRs() { Registration = registrationDTO }; return(rs); }