public async Task <bool> PayForMembership(PaymentCreateModelView model, ClientsMembership clientsMembership, Client client, long employeeId)
        {
            int sum     = (int)model.CashSum + (int)model.CardSum;
            int balance = client.Balance;

            if (balance < 0)
            {
                balance = 0;
            }
            Membership membership = client.Membership;
            int        debts      = membership.Price - sum - balance;
            Payment    payment    = new Payment()
            {
                Comment             = model.Comment,
                ClientsMembershipId = clientsMembership.Id,
                CreatorId           = employeeId,
                CashSum             = (int)model.CashSum,
                CardSum             = (int)model.CardSum,
                Type     = model.Type,
                BranchId = model.BranchId
            };
            CurrentSum currentSum = _db.CurrentSums.FirstOrDefault(p => p.BranchId == model.BranchId);

            currentSum.CashSum         += model.CashSum;
            currentSum.CreditSum       += model.CardSum;
            _db.Entry(currentSum).State = EntityState.Modified;

            SetParams(ref payment, ref client, debts, model.Type, sum);
            _db.Entry(client).State  = EntityState.Modified;
            _db.Entry(payment).State = EntityState.Added;

            await _db.SaveChangesAsync();

            return(true);
        }
        public async Task <string> CreatePayment(PaymentCreateModelView model, ClientsMembership clientsMembership, Client client, long employeeId)
        {
            model.BranchId = client.Group.BranchId;
            int sum = model.CashSum + model.CardSum;

            if (sum == 0 || sum < 0)
            {
                return("negativeOrZero");
            }

            if (client.Balance < 0 && model.Type == PaymentType.Pay)
            {
                return("false");
            }
            if (client.Membership is null && model.Type == PaymentType.Pay)
            {
                return("false");
            }
            int balance = client.Balance;

            if (balance < 0)
            {
                balance = 0;
            }
            Membership membership = client.Membership;
            int        debts      = membership.Price - sum - balance;

            if (clientsMembership is null)
            {
                return("false");
            }
            Payment payment = new Payment()
            {
                Comment             = model.Comment,
                ClientsMembershipId = clientsMembership.Id,
                CreatorId           = employeeId,
                CashSum             = (int)model.CashSum,
                CardSum             = (int)model.CardSum,
                Type     = model.Type,
                BranchId = model.BranchId
            };
            CurrentSum currentSum = _db.CurrentSums.FirstOrDefault(p => p.BranchId == model.BranchId);

            currentSum.CashSum         += model.CashSum;
            currentSum.CreditSum       += model.CardSum;
            _db.Entry(currentSum).State = EntityState.Modified;

            SetParams(ref payment, ref client, debts, model.Type, sum);
            _db.Entry(client).State  = EntityState.Modified;
            _db.Entry(payment).State = EntityState.Added;

            await _db.SaveChangesAsync();

            return("success");
        }
        public async Task <IActionResult> MembershipExtension(long clientId, string date)
        {
            Client client = await _db.Clients.FindAsync(clientId);

            if (client is null)
            {
                return(NotFound());
            }
            long branchId = client.Group.BranchId;

            ViewBag.Memberships = await _db.Memberships.ToArrayAsync();

            if (User.IsInRole("admin"))
            {
                Employee employee = await _userManager.GetUserAsync(User);

                Branch branch = await _db.Branches.FirstOrDefaultAsync(b => b.AdminId == employee.Id);

                if (employee != null)
                {
                    ViewBag.Schedules =
                        await _db.Schedules.Where(s => s.BranchId == branch.Id).ToListAsync();
                }

                else
                {
                    return(NotFound());
                }
            }
            else if (User.IsInRole("chief") || User.IsInRole("manager"))
            {
                ViewBag.Schedules = await _db.Schedules.Where(s => s.BranchId == branchId).ToListAsync();
            }
            else
            {
                return(NotFound());
            }

            ViewBag.Date = Convert.ToDateTime(date);
            if (date is null)
            {
                ClientsMembership clientsMembership = _db.ClientsMemberships.ToList().Last(c => c.ClientId == clientId);
                ViewBag.Date = clientsMembership.DateOfExpiry;
            }
            return(PartialView(new MembershipExtendModelView()
            {
                ClientId = client.Id, Client = client, BranchId = branchId
            }));
        }
        public async Task <IActionResult> BuyMembership(long clientId, long membershipId, long groupId, string firstDay)
        {
            Client client = _db.Clients.FirstOrDefault(p => p.Id == clientId);

            if (clientId != 0 && membershipId != 0 && groupId != 0 && firstDay != null)
            {
                Console.WriteLine(groupId);
                DateTime startDate = DateTime.Parse(firstDay).Date;
                Console.WriteLine(startDate);

                client.Paid          = Paid.Есть_долг;
                client.GroupId       = groupId;
                client.MembershipId  = membershipId;
                client.ClientType    = ClientType.AreEngaged;
                client.CreatorId     = GetUserId.GetCurrentUserId(this.HttpContext);
                client.HasMembership = true;
                Models.Group group = _db.Groups.FirstOrDefault(g => g.Id == groupId);
                if (group != null && group.Clients.Count == 0)
                {
                    group.Clients = new List <Client>()
                    {
                        client
                    }
                }
                ;
                else
                {
                    group?.Clients.Add(client);
                }

                Membership membership = _db.Memberships.FirstOrDefault(m => m.Id == membershipId);
                client.Balance = -membership.Price;
                DateTime endDate = _clientServices.EndDateForClientsMembership(
                    startDate,
                    group.Id,
                    membership.AttendanceDays);

                Console.WriteLine(endDate);

                ClientsMembership clientsMembership = new ClientsMembership()
                {
                    Client            = client,
                    MembershipId      = membership.Id,
                    DateOfPurchase    = DateTime.Now,
                    DateOfExpiry      = endDate,
                    FirstDateOfLesson = startDate
                };

                _db.Entry(clientsMembership).State = EntityState.Added;
                int daysFrozen = 0;
                if (membership.AttendanceDays == 12)
                {
                    daysFrozen = 3;
                }
                else if (membership.AttendanceDays == 8)
                {
                    daysFrozen = 2;
                }
                else
                {
                    daysFrozen = 0;
                }
                var datesOfAttendance = _clientServices.DatesForAttendance(
                    startDate, groupId,
                    membership.AttendanceDays + daysFrozen);
                AttendanceCount attendanceCount = new AttendanceCount()
                {
                    AttendingTimes = membership.AttendanceDays,
                    AbsenceTimes   = 0,
                    FrozenTimes    = daysFrozen
                };
                _db.Entry(attendanceCount).State = EntityState.Added;
                for (int i = 0; i < membership?.AttendanceDays; i++)
                {
                    Attendance attendance = new Attendance()
                    {
                        Client            = client,
                        MembershipId      = membership.Id,
                        Date              = datesOfAttendance[i],
                        AttendanceState   = AttendanceState.notcheked,
                        GroupId           = groupId,
                        AttendanceCount   = attendanceCount,
                        ClientsMembership = clientsMembership
                    };
                    _db.Entry(attendance).State = EntityState.Added;
                }

                _db.Entry(client).State = EntityState.Modified;
                _db.Entry(group).State  = EntityState.Modified;
                await _db.SaveChangesAsync();

                await Task.Delay(500);

                return(RedirectToAction("RegularClients", "Clients", new { branchId = client.Group.BranchId }));
            }
            else
            {
                Console.WriteLine("");
            }

            await Task.Delay(500);

            return(RedirectToAction("RegularClients", "Clients", new { branchId = client.Group.BranchId }));
        }
        public async Task <IActionResult> ExtendAjax(MembershipExtendModelView model)
        {
            Client client = await _db.Clients.FirstOrDefaultAsync(p => p.Id == model.ClientId);

            Membership membership = await _db.Memberships.FirstOrDefaultAsync(p => p.Id == model.MembershipId);

            if (-client.Balance > model.CashSum + model.CardSum)
            {
                return(Content("errorNotEnoughSum"));
            }
            foreach (var attendanceUnActive in _db.Attendances.Where(a => a.ClientId == model.ClientId))
            {
                attendanceUnActive.IsNotActive = true;
            }
            int daysFrozen = 0;

            if (membership.AttendanceDays == 12)
            {
                daysFrozen = 3;
            }
            else if (membership.AttendanceDays == 8)
            {
                daysFrozen = 2;
            }
            else
            {
                daysFrozen = 0;
            }

            List <DateTime> datesOfAttendance = _clientServices.DatesForAttendance(
                model.Date, model.GroupId,
                membership.AttendanceDays);

            AttendanceCount attendanceCount = new AttendanceCount()
            {
                AttendingTimes = membership.AttendanceDays,
                AbsenceTimes   = 0,
                FrozenTimes    = daysFrozen
            };

            _db.Entry(attendanceCount).State = EntityState.Added;

            client.MembershipId     = membership.Id;
            client.GroupId          = model.GroupId;
            client.Membership       = membership;
            client.LessonNumbers    = membership.AttendanceDays;
            client.HasMembership    = true;
            _db.Entry(client).State = EntityState.Modified;

            DateTime endDate = _clientServices.EndDateForClientsMembership(
                model.Date, model.GroupId,
                membership.AttendanceDays);
            ClientsMembership clientsMembership = new ClientsMembership()
            {
                ClientId          = client.Id,
                MembershipId      = membership.Id,
                DateOfPurchase    = DateTime.Now,
                DateOfExpiry      = endDate,
                FirstDateOfLesson = model.Date
            };

            _db.Entry(clientsMembership).State = EntityState.Added;
            foreach (var date in datesOfAttendance)
            {
                Attendance attendance = new Attendance()
                {
                    ClientId          = client.Id,
                    MembershipId      = membership.Id,
                    Date              = date,
                    AttendanceState   = AttendanceState.notcheked,
                    GroupId           = model.GroupId,
                    AttendanceCount   = attendanceCount,
                    ClientsMembership = clientsMembership
                };
                _db.Entry(attendance).State = EntityState.Added;
            }
            Employee employee = await _userManager.GetUserAsync(User);

            await _db.SaveChangesAsync();

            model.BranchId = client.Group.BranchId;
            bool check = await _paymentsService.PayForMembership(model, clientsMembership, client, employee.Id);

            if (!check)
            {
                return(Content("error"));
            }
            return(Content("success"));
        }