//Complete the registration
        private async Task <bool> CompleteRegistration(string orderId)
        {
            var order = await _context.InitiatedOrders.FindAsync(orderId);

            if (order == null)
            {
                return(false);
            }

            var course = _courseService.GetCourse(order.CourseId);
            var user   = await _context.Users.FindAsync(order.UserId);

            //Check if user or course is null
            if (user == null || order.Reason != EnumList.PaymentReason.Register || course == null)
            {
                return(false);
            }


            //Add the device made the registration

            var isNew       = _info.IsDeviceNew(user.Id, order.AuthCookies, order.Ip);
            var groupNumber = _info.GetDeviceGroupNumber(user.Id, order.AuthCookies, order.Ip);
            var device      = new UserDevice
            {
                User = user, Activity = EnumList.Activity.CourseRegister, Ip = order.Ip, DeviceType = order.DeviceType, AuthCookies = order.AuthCookies,
                New  = isNew, GroupNumber = groupNumber, OperatingSystem = order.OperatingSystem
            };
            await _context.AddAsync(device);

            await _context.SaveChangesAsync();

            //Add payment activity
            var device2 = new UserDevice
            {
                User = user, Activity = EnumList.Activity.Payment, Ip = order.Ip, DeviceType = order.DeviceType, AuthCookies = order.AuthCookies,
                New  = isNew, GroupNumber = groupNumber, OperatingSystem = order.OperatingSystem
            };

            _context.Add(device2);
            await _context.SaveChangesAsync();

            //Determine registration expire date
            var expireDate = _courseService.EstimateRegExpireDate(order.CourseId);

            //Add registration
            await _courseService.AddOrRenewRegistration(order.CourseId, order.UserId, device);



            //Add invoices

            var paidInvoice = new MatterixInvoice();

            if (order.PayAllNow)
            {
                paidInvoice = new MatterixInvoice
                {
                    Course = course, User = user, Amount = course.Price, CurrentAmount = course.Price, Paid = true, Reason = EnumList.InvoiceReason.Registration, OriginalDeadline = Format.NorwayDateTimeNow().AddDays(15), CurrentDeadline = Format.NorwayDateTimeNow().AddDays(15), OriginalDueDate = Format.NorwayDateTimeNow().Date, CurrentDueDate = Format.NorwayDateTimeNow().Date, InvoiceType = EnumList.InvoiceType.Invoice,
                };
//                paidInvoice = paidInvoice;

                //This invoice is paid now
                await _context.AddAsync(paidInvoice);

                await _context.SaveChangesAsync();
            }
            else
            {
                var invoices = _paymentService.CreateOnRegisterInvoices(order.CourseId, user);

                foreach (var inv in invoices)
                {
                    if (inv.Reason == EnumList.InvoiceReason.Registration)
                    {
                        paidInvoice = inv;
                        await _context.AddAsync(paidInvoice);

                        await _context.SaveChangesAsync();
                    }
                    else if (inv.Reason == EnumList.InvoiceReason.MonthlyPayment)
                    {
                        await _context.AddAsync(inv);

                        await _context.SaveChangesAsync();
                    }
                }
            }

            //Add Payment
            var payment = new MatterixPayment
            {
                Course = course, User = user, Reason = EnumList.PaymentReason.Register, Invoice = paidInvoice,
                Amount = paidInvoice.Amount, Method = order.PaymentMethod, PaymentServiceRef = orderId
            };

            await _context.AddAsync(payment);

            await _context.SaveChangesAsync();

            paidInvoice.Paid             = true;
            paidInvoice.PaymentId        = payment.Id;
            paidInvoice.NextNotification = DateTime.MaxValue;

            _context.Update(paidInvoice);
            await _context.SaveChangesAsync();


            //Here the invoice and payments are done -- send the email
            await _email.InvoicePaidEmail(paidInvoice.Number);


            //Here the registration is done -- send email

            await _email.CourseRegisterCompletedEmail(order.UserId, order.CourseId, expireDate);

            order.Status = EnumList.OrderStatus.Completed;
            _context.Update(order);
            await _context.SaveChangesAsync();

            return(true);
        }
Beispiel #2
0
        public static void Initialize(ApplicationDbContext context, UserManager <ApplicationUser> userManager, bool isDevelop)
        {
            if (!isDevelop || StaticInformation.AdvancedDevelopment)
            {
                context.Database.Migrate();
                return;
            }

            Console.WriteLine("Development Initializer run --------------------------------------------");
            context.Database.EnsureDeleted();
            context.Database.EnsureCreated();
            context.SaveChanges();


            //Test Area

            //*** Users ***//
            var admin1 = new ApplicationUser()
            {
                UserName        = "******",
                Email           = "*****@*****.**",
                Role            = EnumList.Role.Admin,
                CurrentPassword = "******",
                FirstName       = "Aamer",
                PhoneNumber     = "45525288",
                LastName        = "Harata",
                Gender          = EnumList.Gender.Male,
                BirthDate       = new DateTime(1989, 5, 30),
                Language        = EnumList.Language.Arabic,
                SignUpDate      = DateTime.Now,
                SecurityStamp   = "SecurityStamp1231231sadasda21e123dasdasda"
            };

            admin1.ProfileUserName = admin1.FirstName + "." + admin1.LastName + admin1.BirthDate.Year;
            userManager.CreateAsync(admin1, "Mmmm4444").Wait();
            context.SaveChanges();

            userManager.AddClaimAsync(admin1, new Claim("Role", "Admin"));
            var myAddress1 = new Address()
            {
                User = admin1, Street = "Krossmyrveien 4a", ZipCode = "4640", City = "Søgne"
            };

            context.Add(myAddress1);
            context.SaveChanges();


            var student1 = new ApplicationUser()
            {
                UserName        = "******",
                Email           = "*****@*****.**",
                CurrentPassword = "******",
                Role            = EnumList.Role.Student,
                FirstName       = "Aamer",
                PhoneNumber     = "45525288",
                LastName        = "Student",
                Gender          = EnumList.Gender.Male,
                BirthDate       = new DateTime(1989, 5, 30),
                Language        = EnumList.Language.English
            };

            student1.ProfileUserName = student1.FirstName + "." + student1.LastName + student1.BirthDate.Year;
            userManager.CreateAsync(student1, "Mmmm4444").Wait();

            var teacher1 = new ApplicationUser()
            {
                UserName        = "******",
                CurrentPassword = "******",
                Email           = "*****@*****.**",
                Role            = EnumList.Role.Teacher,
                FirstName       = "Aamer",
                PhoneNumber     = "45525288",
                LastName        = "Teacher",
                BirthDate       = new DateTime(1989, 5, 30),
                Gender          = EnumList.Gender.Male,
                Language        = EnumList.Language.English
            };

            teacher1.ProfileUserName = teacher1.FirstName + "." + teacher1.LastName + teacher1.BirthDate.Year;
            userManager.CreateAsync(teacher1, "Mmmm4444").Wait();
            context.SaveChanges();
            userManager.AddClaimAsync(teacher1, new Claim("Role", "Teacher"));


            var admin2 = new ApplicationUser()
            {
                UserName        = "******",
                Email           = "*****@*****.**",
                CurrentPassword = "******",
                Role            = EnumList.Role.Admin,
                PhoneNumber     = "45525288",
                FirstName       = "Aamer",
                LastName        = "Admin",
                BirthDate       = new DateTime(1989, 5, 30),
                Gender          = EnumList.Gender.Female,
                Language        = EnumList.Language.English
            };

            admin2.ProfileUserName = admin2.FirstName + "." + admin2.LastName + admin2.BirthDate.Year;
            userManager.CreateAsync(admin2, "Mmmm4444").Wait();
            context.SaveChanges();
            userManager.AddClaimAsync(admin2, new Claim("Role", "Admin"));


            var address = new Address()
            {
                User = teacher1, Street = "Krossmyrveien 4a", ZipCode = "4640", City = "Søgne"
            };

            var address1 = new Address()
            {
                User = student1, Street = "Krossmyrveien 4a", ZipCode = "4640", City = "Søgne"
            };

            var address2 = new Address()
            {
                User = admin2, Street = "Krossmyrveien 4a", ZipCode = "4640", City = "Søgne"
            };

            context.Add(address);
            context.Add(address1);
            context.Add(address2);
            context.SaveChanges();

            //*** END OF USERS ***//



            //*** Courses ***//
            var courseR1 = new Course()
            {
                Subject          = "Math R1", Language = EnumList.Language.English, Price = 2100, StartDate = DateTime.Now,
                EndDate          = DateTime.Now.AddMonths(3), Teacher = teacher1, Code = "Matte-R1-H2019",
                ExtraDescription = "hei#%bye"
            };

            context.Add(courseR1);
            context.SaveChanges();
            var scheduleR11 = new Schedule()
            {
                Number = 1, Course = courseR1, Day = EnumList.Days.Thursday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };
            var scheduleR12 = new Schedule()
            {
                Number = 2, Course = courseR1, Day = EnumList.Days.Friday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };

            context.Add(scheduleR11);
            context.Add(scheduleR12);
            context.SaveChanges();
            CreateLectures(courseR1.Id, new List <Schedule>()
            {
                scheduleR11, scheduleR12
            });



            var courseF1 = new Course()
            {
                Subject = "Fysikk F1", Language = EnumList.Language.English, Price = 0, StartDate = DateTime.Now,
                EndDate = DateTime.Now.AddMonths(4), Teacher = admin2, Code = "F1-H2019"
            };

            context.Add(courseF1);
            context.SaveChanges();


            var scheduleF11 = new Schedule()
            {
                Number = 1, Course = courseF1, Day = EnumList.Days.Thursday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };
            var scheduleF12 = new Schedule()
            {
                Number = 2, Course = courseF1, Day = EnumList.Days.Friday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };

            context.Add(scheduleF11);
            context.Add(scheduleF12);
            context.SaveChanges();
            CreateLectures(courseF1.Id, new List <Schedule>()
            {
                scheduleF11, scheduleF12
            });



            var courseK1 = new Course()
            {
                Subject = "Kjemi K1", Language = EnumList.Language.English, Price = 2100, StartDate = new DateTime(2019, 3, 30),
                EndDate = new DateTime(2019, 6, 20), Teacher = admin1, Code = "K1-H2019"
            };

            context.Add(courseK1);
            context.SaveChanges();


            var scheduleK11 = new Schedule()
            {
                Number = 1, Course = courseK1, Day = EnumList.Days.Thursday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };
            var scheduleK12 = new Schedule()
            {
                Number = 2, Course = courseK1, Day = EnumList.Days.Friday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };

            context.Add(scheduleK11);
            context.Add(scheduleK12);
            context.SaveChanges();
            CreateLectures(courseK1.Id, new List <Schedule>()
            {
                scheduleK11, scheduleK12
            });



            var course1P = new Course()
            {
                Subject = "Matte 1P", Language = EnumList.Language.English, Price = 2100, StartDate = new DateTime(2019, 3, 30),
                EndDate = new DateTime(2019, 6, 20), Teacher = admin1, Code = "1P-H2019"
            };

            context.Add(course1P);
            context.SaveChanges();


            var schedule1P1 = new Schedule()
            {
                Number = 1, Course = course1P, Day = EnumList.Days.Thursday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };
            var schedule1P2 = new Schedule()
            {
                Number = 2, Course = course1P, Day = EnumList.Days.Friday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };

            context.Add(schedule1P1);
            context.Add(schedule1P2);
            context.SaveChanges();
            CreateLectures(course1P.Id, new List <Schedule>()
            {
                schedule1P1, schedule1P2
            });



            var courseNOR3 = new Course()
            {
                Subject = "Matte NOR3", Language = EnumList.Language.English, Price = 2100, StartDate = new DateTime(2019, 3, 30),
                EndDate = new DateTime(2019, 6, 20), Teacher = admin1, Code = "NOR3-H2019"
            };

            context.Add(courseNOR3);
            context.SaveChanges();


            var scheduleNOR31 = new Schedule()
            {
                Number = 1, Course = courseNOR3, Day = EnumList.Days.Thursday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };
            var scheduleNOR32 = new Schedule()
            {
                Number = 2, Course = courseNOR3, Day = EnumList.Days.Friday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };

            context.Add(scheduleNOR31);
            context.Add(scheduleNOR32);
            context.SaveChanges();
            CreateLectures(courseNOR3.Id, new List <Schedule>()
            {
                scheduleNOR31, scheduleNOR32
            });



            var courseENG1 = new Course()
            {
                Subject = "Matte ENG1", Language = EnumList.Language.English, Price = 2100, StartDate = new DateTime(2019, 3, 30),
                EndDate = new DateTime(2019, 6, 20), Teacher = admin1, Code = "ENG1-H2019"
            };

            context.Add(courseENG1);
            context.SaveChanges();


            var scheduleENG11 = new Schedule()
            {
                Number = 1, Course = courseENG1, Day = EnumList.Days.Thursday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };
            var scheduleENG12 = new Schedule()
            {
                Number = 2, Course = courseENG1, Day = EnumList.Days.Friday, From = new TimeSpan(10, 5, 0), To = new TimeSpan(11, 5, 0)
            };

            context.Add(scheduleENG11);
            context.Add(scheduleENG12);
            context.SaveChanges();
            CreateLectures(courseENG1.Id, new List <Schedule>()
            {
                scheduleENG11, scheduleENG12
            });



//            CreateLectures(context, course2, schedule20, schedule21);

            var registration = new Registration()
            {
                Student = student1, Course = courseR1, Price = courseR1.Price, RegisterDate = DateTime.Now.AddYears(-1), AdminComment = "This student is me", AuthCookies = "1234567891011121314151617181920", IpAddress = "192.168.2.1", ExpireDate = DateTime.Now, Expire = true
            };

            context.Add(registration);
            context.SaveChanges();

            var registration1 = new Registration()
            {
                Student = student1, Course = courseK1, Price = courseK1.Price, RegisterDate = DateTime.Now, AdminComment = "This student is me", AuthCookies = "1234567891011121314151617181920", IpAddress = "192.168.2.1", ExpireDate = DateTime.Now.AddYears(1),
            };

            context.Add(registration1);
            context.SaveChanges();



            var registration10 = new Registration()
            {
                Student = teacher1, Course = courseF1, Price = courseF1.Price, RegisterDate = DateTime.Now, AdminComment = "This student is teacher", AuthCookies = "1234567891011121314151617181920", IpAddress = "192.168.2.1", ExpireDate = DateTime.Now.AddYears(1)
            };

            context.Add(registration10);
            context.SaveChanges();


            var registration2 = new Registration()
            {
                Student = teacher1, Course = courseENG1, Price = courseF1.Price, RegisterDate = DateTime.Now, AdminComment = "This student is teacher", AuthCookies = "1234567891011121314151617181920", IpAddress = "192.168.2.1", ExpireDate = DateTime.Now
            };

            context.Add(registration2);
            context.SaveChanges();



            var invoice1 = new MatterixInvoice()
            {
                User          = student1, Course = courseK1, Amount = 600, OriginalDueDate = DateTime.Now.AddDays(-1), OriginalDeadline = DateTime.Now.AddDays(15), Reason = EnumList.InvoiceReason.MonthlyPayment,
                CurrentAmount = 600, CurrentDeadline = DateTime.Now.AddDays(15), CurrentDueDate = DateTime.Now.AddDays(-1)
            };

            context.Add(invoice1);
            context.SaveChanges();

            var invoice2 = new MatterixInvoice()
            {
                User          = student1, Course = courseK1, Amount = 800, OriginalDueDate = DateTime.Now.AddDays(-15), OriginalDeadline = DateTime.Now.AddDays(-1), Reason = EnumList.InvoiceReason.MonthlyPayment,
                CurrentAmount = 600, CurrentDeadline = DateTime.Now.AddDays(-1), CurrentDueDate = DateTime.Now.AddDays(-15)
            };

            context.Add(invoice2);
            context.SaveChanges();



            void CreateLectures(string courseId, List <Schedule> schedules)
            {
                var coursee = context.Courses.Find(courseId);

                if (coursee == null)
                {
                    return;
                }

                //Order schedules by number
                schedules = schedules.OrderBy(x => x.Number).ToList();
                var count = schedules.Count;


                var lectureDate   = coursee.StartDate;
                var lectures      = new List <Lecture>();
                var lectureNumber = 1;

                while (lectureDate <= coursee.EndDate)
                {
                    foreach (var schedule in schedules)
                    {
                        if (string.Compare(schedule.Day.ToString(), lectureDate.DayOfWeek.ToString(), StringComparison.CurrentCultureIgnoreCase) == 0)
                        {
                            var lecture = new Lecture()
                            {
                                Course = coursee, Number = lectureNumber, Day = schedule.Day, From = schedule.From,
                                To     = schedule.To, Date = lectureDate
                            };

                            context.Add(lecture);
                            context.SaveChanges();
                            lectureNumber++;
                        }
                    }

                    lectureDate = lectureDate.AddDays(1);
                }
            }
        }