示例#1
0
        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);
        }