public static void RegisterMonthlyGiftLesson <TEntity>(this ModelSource <TEntity> models, int?[] uid = null)
            where TEntity : class, new()
        {
            var      price     = models.GetTable <LessonPriceType>().Where(l => l.IsWelfareGiftLesson != null).FirstOrDefault();
            DateTime startDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
            DateTime endDate   = startDate.AddMonths(1);

            if (price != null)
            {
                var items = models.GetTable <EmployeeWelfare>()
                            .Where(m => m.MonthlyGiftLessons > 0)
                            .Where(y => !y.UserProfile.RegisterLesson.Any(r => r.ClassLevel == price.PriceID &&
                                                                          r.RegisterDate >= startDate && r.RegisterDate < endDate));

                if (uid != null && uid.Length > 0)
                {
                    items = items.Where(m => uid.Contains(m.UID));
                }

                if (items.Count() > 0)
                {
                    var table = models.GetTable <RegisterLesson>();

                    foreach (var item in items.ToList())
                    {
                        var lastLesson = table.Where(r => r.UID == item.UID && r.ClassLevel == price.PriceID &&
                                                     r.RegisterDate < startDate && r.Attended != (int)Naming.LessonStatus.課程結束).FirstOrDefault();

                        var lesson = new RegisterLesson
                        {
                            UID                 = item.UID,
                            RegisterDate        = DateTime.Now,
                            GroupingMemberCount = 1,
                            Lessons             = item.MonthlyGiftLessons.Value,
                            ClassLevel          = price.PriceID,
                            IntuitionCharge     = new IntuitionCharge
                            {
                                ByInstallments = 1,
                                Payment        = "Cash",
                                FeeShared      = 0
                            },
                            Attended        = (int)Naming.LessonStatus.準備上課,
                            AdvisorID       = Settings.Default.DefaultCoach,
                            AttendedLessons = 0,
                            GroupingLesson  = new GroupingLesson {
                            }
                        };
                        table.InsertOnSubmit(lesson);

                        if (lastLesson != null)
                        {
                            lastLesson.Attended = (int)Naming.LessonStatus.課程結束;
                            //lesson.Lessons += (lastLesson.Lessons - lastLesson.GroupingLesson.LessonTime.Count);
                        }
                    }

                    models.SubmitChanges();
                }
            }
        }
        private void matchGroup(EnterpriseCourseMember groupUser, EnterpriseCourseMember profile)
        {
            if (groupUser.ContractID != profile.ContractID)
            {
                return;
            }

            foreach (var course in groupUser.EnterpriseCourseContract.EnterpriseCourseContent.Where(c => c.EnterpriseLessonType.Status == (int)Naming.LessonPriceStatus.團體學員課程))
            {
                RegisterLesson groupLesson = course.RegisterLessonEnterprise
                                             .Select(t => t.RegisterLesson)
                                             .Where(r => r.UID == groupUser.UID).FirstOrDefault();

                if (groupLesson == null)
                {
                    continue;
                }

                RegisterLesson lesson = course.RegisterLessonEnterprise
                                        .Select(t => t.RegisterLesson)
                                        .Where(r => r.UID == profile.UID).FirstOrDefault();

                if (lesson == null)
                {
                    continue;
                }

                if (groupLesson.RegisterGroupID != lesson.RegisterGroupID)
                {
                    lesson.RegisterGroupID = groupLesson.RegisterGroupID;
                    models.SubmitChanges();
                }
            }
        }
        public async Task <ActionResult> UpdateLessonFeedBackAsync(int lessonID, String feedBack)
        {
            UserProfile profile = await HttpContext.GetUserAsync();

            if (profile == null)
            {
                return(Redirect($"~{Startup.Properties["LoginUrl"]}"));
            }

            LessonTime lesson = models.GetTable <LessonTime>().Where(l => l.LessonID == lessonID).FirstOrDefault();

            if (lesson == null)
            {
                return(new EmptyResult());
            }

            LessonFeedBack item = lesson.LessonFeedBack.Where(f => f.RegisterLesson.UID == profile.UID).FirstOrDefault();

            if (item == null)
            {
                if (lesson.RegisterLesson.GroupingMemberCount > 1)
                {
                    RegisterLesson regItem = lesson.GroupingLesson.RegisterLesson.Where(r => r.UID == profile.UID).FirstOrDefault();
                    if (regItem == null)
                    {
                        return(new EmptyResult());
                    }

                    item = new LessonFeedBack
                    {
                        LessonID   = lessonID,
                        RegisterID = regItem.RegisterID,
                        //Status = (int)Naming.IncommingMessageStatus.未讀
                    };
                }
                else
                {
                    item = new LessonFeedBack
                    {
                        LessonID   = lessonID,
                        RegisterID = lesson.RegisterID,
                        //Status = (int)Naming.IncommingMessageStatus.未讀
                    };
                }

                models.GetTable <LessonFeedBack>().InsertOnSubmit(item);
            }

            item.FeedBack     = feedBack;
            item.FeedBackDate = DateTime.Now;
            item.Status       = (int)Naming.IncommingMessageStatus.未讀;
            models.SubmitChanges();

            return(View("LessonFeedBackItem", item));
        }
        private void checkMemberLesson(EnterpriseCourseMember profile)
        {
            var priceType = models.GetTable <LessonPriceType>().Where(p => p.Status == (int)Naming.LessonPriceStatus.企業合作方案).FirstOrDefault();

            foreach (var course in profile.EnterpriseCourseContract.EnterpriseCourseContent)
            {
                RegisterLesson lesson = course.RegisterLessonEnterprise
                                        .Select(t => t.RegisterLesson)
                                        .Where(r => r.UID == profile.UID).FirstOrDefault();
                if (lesson == null)
                {
                    lesson = new RegisterLesson
                    {
                        RegisterDate = DateTime.Now,
                        //Lessons = course.Lessons.Value,
                        Attended            = (int)Naming.LessonStatus.準備上課,
                        GroupingMemberCount = course.EnterpriseLessonType.Status == (int)Naming.LessonPriceStatus.團體學員課程
                            ? course.EnterpriseCourseContract.GroupingMemberCount : 1,
                        IntuitionCharge = new IntuitionCharge
                        {
                            Payment        = "CreditCard",
                            FeeShared      = 0,
                            ByInstallments = 1
                        },
                        LessonPriceType = priceType,
                        AdvisorID       = Settings.Default.DefaultCoach,
                        AttendedLessons = 0,
                        UID             = profile.UID
                    };

                    course.RegisterLessonEnterprise.Add(new RegisterLessonEnterprise
                    {
                        RegisterLesson = lesson
                    });
                }

                lesson.Lessons = course.Lessons.Value;
                if (!lesson.RegisterGroupID.HasValue)
                {
                    lesson.GroupingLesson = new GroupingLesson {
                    }
                }
                ;
                models.SubmitChanges();
            }
        }
        public static void RegisterSpecialGivingLesson2021 <TEntity>(this ModelSource <TEntity> models, int[] items)
            where TEntity : class, new()
        {
            var table = models.GetTable <RegisterLesson>();

            foreach (var uid in items)
            {
                foreach (var priceID in SpecialGivingLesson2021)
                {
                    var givingLesson = table
                                       .Where(r => r.ClassLevel == priceID)
                                       .Where(r => r.UID == uid)
                                       .FirstOrDefault();

                    if (givingLesson == null)
                    {
                        givingLesson = new RegisterLesson
                        {
                            UID                 = uid,
                            RegisterDate        = DateTime.Now,
                            GroupingMemberCount = 1,
                            Lessons             = 1,
                            ClassLevel          = priceID,
                            IntuitionCharge     = new IntuitionCharge
                            {
                                ByInstallments = 1,
                                Payment        = "Cash",
                                FeeShared      = 0
                            },
                            Attended        = (int)Naming.LessonStatus.準備上課,
                            AdvisorID       = Settings.Default.DefaultCoach,
                            AttendedLessons = 0,
                            GroupingLesson  = new GroupingLesson {
                            },
                        };

                        table.InsertOnSubmit(givingLesson);
                    }

                    models.SubmitChanges();
                }
            }
        }
        public static void RegisterSpecialGivingLesson2021(this GenericManager <BFDataContext> models, int[] items)

        {
            var table = models.GetTable <RegisterLesson>();

            foreach (var uid in items)
            {
                foreach (var priceID in SpecialGivingLesson2021)
                {
                    var givingLesson = table
                                       .Where(r => r.ClassLevel == priceID)
                                       .Where(r => r.UID == uid)
                                       .FirstOrDefault();

                    if (givingLesson == null)
                    {
                        givingLesson = new RegisterLesson
                        {
                            UID                 = uid,
                            RegisterDate        = DateTime.Now,
                            GroupingMemberCount = 1,
                            Lessons             = 1,
                            ClassLevel          = priceID,
                            IntuitionCharge     = new IntuitionCharge
                            {
                                ByInstallments = 1,
                                Payment        = "Cash",
                                FeeShared      = 0
                            },
                            Attended        = (int)Naming.LessonStatus.準備上課,
                            AdvisorID       = Startup.Properties.GetValue <int?>("DefaultCoach"),
                            AttendedLessons = 0,
                            GroupingLesson  = new GroupingLesson {
                            },
                        };

                        table.InsertOnSubmit(givingLesson);
                    }

                    models.SubmitChanges();
                }
            }
        }
        public static void RegisterRemoteFeedbackLesson <TEntity>(this ModelSource <TEntity> models, IQueryable <LessonTime> items = null)
            where TEntity : class, new()
        {
            var catalog = models.GetTable <ObjectiveLessonCatalog>().Where(c => c.CatalogID == (int)ObjectiveLessonCatalog.CatalogDefinition.OnLineFeedback)
                          .FirstOrDefault();

            var price = catalog?.ObjectiveLessonPrice.FirstOrDefault();

            if (price == null)
            {
                return;
            }

            var exceptive      = models.GetTable <UserRole>().Where(r => r.RoleID == (int)Naming.RoleID.Dietitian);
            var exceptivePrice = models.GetTable <ObjectiveLessonPrice>()
                                 .Where(b => b.CatalogID == (int)ObjectiveLessonCatalog.CatalogDefinition.OnLineFeedback ||
                                        b.CatalogID == (int)ObjectiveLessonCatalog.CatalogDefinition.OnLine)
                                 .Select(b => b.PriceID)
                                 .ToArray();

            if (items == null)
            {
                items = models.GetTable <LessonTime>();
            }

            items = items
                    .Where(l => !exceptive.Any(x => x.UID == l.AttendingCoach))
                    .Join(models.PromptVirtualClassOccurrence(),
                          l => l.BranchID, b => b.BranchID, (l, b) => l);

            DateTime startDate = new DateTime(2021, 8, 9);

            items = items
                    .Join(models.GetTable <V_LessonTime>()
                          .Where(t => t.ClassTime >= startDate)
                          .Where(t => t.CoachAttendance.HasValue)
                          .Where(t => t.CommitAttendance.HasValue)
                          .Where(t => !exceptivePrice.Contains(t.PriceID))
                          .Where(t => SessionScopeForRemoteFeedback.Contains(t.PriceStatus)),
                          l => l.LessonID, t => t.LessonID, (l, t) => l);

            var calcItems = items.GroupBy(l => l.GroupID);
            var table     = models.GetTable <RegisterLesson>();

            var groupingCount = calcItems.Select(g => new
            {
                g.First().GroupingLesson,
                UID        = g.First().GroupingLesson.RegisterLesson.Select(r => r.UID).OrderBy(u => u).ToArray(),
                TotalCount = g.Count()
            })
                                .ToList()
                                .GroupBy(g => g.UID.JsonStringify())
                                .Select(g => new
            {
                g.First().GroupingLesson,
                UID        = g.Key,
                TotalCount = g.Sum(v => v.TotalCount),
            });

            foreach (var g in groupingCount)
            {
                var            lesson      = g.GroupingLesson;
                var            item        = lesson.RegisterLesson.First();
                GroupingLesson groupLesson = null;
                foreach (var uid in JsonConvert.DeserializeObject <int[]>(g.UID))
                {
                    var currentFeedback = table
                                          .Where(r => r.RegisterDate >= startDate)
                                          .Where(r => r.ClassLevel == price.PriceID)
                                          .Where(r => r.UID == uid)
                                          .FirstOrDefault();

                    if (currentFeedback == null)
                    {
                        if (groupLesson == null)
                        {
                            groupLesson = new GroupingLesson {
                            };
                        }

                        currentFeedback = new RegisterLesson
                        {
                            UID                 = uid,
                            RegisterDate        = DateTime.Now,
                            BranchID            = item.BranchID,
                            GroupingMemberCount = item.GroupingMemberCount,
                            ClassLevel          = price.PriceID,
                            IntuitionCharge     = new IntuitionCharge
                            {
                                ByInstallments = 1,
                                Payment        = "Cash",
                                FeeShared      = 0
                            },
                            Attended        = (int)Naming.LessonStatus.準備上課,
                            AdvisorID       = item.AdvisorID,
                            AttendedLessons = 0,
                            GroupingLesson  = groupLesson,
                        };

                        table.InsertOnSubmit(currentFeedback);
                    }

                    int availableCount = g.TotalCount / 2;
                    if (currentFeedback.Lessons < availableCount)
                    {
                        currentFeedback.Lessons  = availableCount;
                        currentFeedback.Attended = (int)Naming.LessonStatus.準備上課;
                    }

                    models.SubmitChanges();
                }
            }
        }
        public ActionResult ExchangeBonusPoint(int uid, int itemID, int?recipientID)
        {
            var profile = models.GetTable <UserProfile>().Where(u => u.UID == uid).FirstOrDefault();

            if (profile == null)
            {
                return(Json(new { result = false, message = "學員資料錯誤!!" }, JsonRequestBehavior.AllowGet));
            }

            var item = models.GetTable <BonusAwardingItem>().Where(i => i.ItemID == itemID).FirstOrDefault();

            if (item == null)
            {
                return(Json(new { result = false, message = "兌換商品錯誤!!" }, JsonRequestBehavior.AllowGet));
            }

            if (profile.BonusPoint(models) < item.PointValue)
            {
                return(Json(new { result = false, message = "累積點數不足!!" }, JsonRequestBehavior.AllowGet));
            }

            var award = new LearnerAward
            {
                UID       = profile.UID,
                AwardDate = DateTime.Now,
                ItemID    = item.ItemID,
                ActorID   = HttpContext.GetUser().UID
            };

            models.GetTable <LearnerAward>().InsertOnSubmit(award);

            int usedPoints = item.PointValue;

            foreach (var bounsItem in profile.BonusPointList(models))
            {
                if (usedPoints <= 0)
                {
                    break;
                }
                award.BonusExchange.Add(new BonusExchange
                {
                    TaskID = bounsItem.TaskID
                });
                usedPoints -= bounsItem.PDQTask.PDQQuestion.PDQQuestionExtension.BonusPoint.Value;
            }

            ///兌換課程
            ///
            if (item.BonusAwardingLesson != null)
            {
                var lesson = models.GetTable <RegisterLesson>().Where(r => r.UID == uid).OrderByDescending(r => r.RegisterID).First();

                if (item.BonusAwardingIndication != null && item.BonusAwardingIndication.Indication == "AwardingLessonGift")
                {
                    if (!recipientID.HasValue)
                    {
                        return(Json(new { result = false, message = "請選擇受贈學員!!" }, JsonRequestBehavior.AllowGet));
                    }

                    var giftLesson = new RegisterLesson
                    {
                        RegisterDate        = DateTime.Now,
                        GroupingMemberCount = 1,
                        ClassLevel          = item.BonusAwardingLesson.PriceID,
                        Lessons             = 1,
                        UID            = recipientID.Value,
                        AdvisorID      = lesson.AdvisorID,
                        Attended       = (int)Naming.LessonStatus.準備上課,
                        GroupingLesson = new GroupingLesson {
                        }
                    };
                    award.AwardingLessonGift = new AwardingLessonGift
                    {
                        RegisterLesson = giftLesson
                    };
                    models.GetTable <RegisterLesson>().InsertOnSubmit(giftLesson);
                }
                else
                {
                    var awardLesson = new RegisterLesson
                    {
                        RegisterDate        = DateTime.Now,
                        GroupingMemberCount = 1,
                        ClassLevel          = item.BonusAwardingLesson.PriceID,
                        Lessons             = 1,
                        UID            = profile.UID,
                        AdvisorID      = lesson.AdvisorID,
                        Attended       = (int)Naming.LessonStatus.準備上課,
                        GroupingLesson = new GroupingLesson {
                        }
                    };
                    award.AwardingLesson = new AwardingLesson
                    {
                        RegisterLesson = awardLesson
                    };
                    models.GetTable <RegisterLesson>().InsertOnSubmit(awardLesson);
                }
            }

            models.SubmitChanges();
            return(Json(new { result = true }, JsonRequestBehavior.AllowGet));
        }
예제 #9
0
        public ActionResult CommitEnterpriseBookingByCoach(LessonTimeViewModel viewModel)
        {
            ViewBag.ViewModel = viewModel;

            ValidateCommonBooking(viewModel, out ServingCoach coach, out BranchStore branch);

            RegisterLesson lesson = models.GetTable <RegisterLesson>().Where(r => r.RegisterID == viewModel.RegisterID).FirstOrDefault();

            if (lesson == null)
            {
                ModelState.AddModelError("RegisterID", "學員未購買課程!!");
            }

            if (lesson.Attended == (int)Naming.LessonStatus.課程結束)
            {
                ModelState.AddModelError("RegisterID", "學員課程已結束!!");
            }

            var lessonCount = lesson.GroupingLesson.LessonTime.Count;

            if (lessonCount + (lesson.AttendedLessons ?? 0) >= lesson.Lessons)
            {
                ModelState.AddModelError("RegisterID", "學員上課堂數已滿!!");
            }

            var contract = lesson.RegisterLessonEnterprise.EnterpriseCourseContract;

            if (contract.Expiration.Value < DateTime.Today)
            {
                ModelState.AddModelError("RegisterID", "企業方案合約已過期!!");
            }

            if (!this.ModelState.IsValid)
            {
                ViewBag.ModelState = this.ModelState;
                return(View(Properties.Settings.Default.ReportInputError));
            }

            if (branch?.IsVirtualClassroom() != true && !models.GetTable <CoachWorkplace>()
                .Any(c => c.BranchID == viewModel.BranchID &&
                     c.CoachID == viewModel.CoachID) &&
                viewModel.ClassDate.Value < DateTime.Today.AddDays(1))
            {
                return(View("~/Views/ConsoleHome/Shared/JsAlert.cshtml", model: "此時段不允許跨店預約!!"));
            }

            LessonTime timeItem = new LessonTime
            {
                InvitedCoach   = viewModel.CoachID,
                AttendingCoach = viewModel.CoachID,
                //ClassTime = viewModel.ClassDate.Add(viewModel.ClassTime),
                ClassTime         = viewModel.ClassDate,
                DurationInMinutes = lesson.RegisterLessonEnterprise.EnterpriseCourseContent.DurationInMinutes,
                RegisterID        = lesson.RegisterID,
                LessonPlan        = new LessonPlan
                {
                },
                BranchID             = viewModel.BranchID,
                LessonTimeSettlement = new LessonTimeSettlement
                {
                    ProfessionalLevelID = coach.LevelID.Value,
                    MarkedGradeIndex    = coach.ProfessionalLevel.GradeIndex,
                    CoachWorkPlace      = coach.WorkBranchID(),
                },
                Place = viewModel.Place,
            };

            if (models.GetTable <DailyWorkingHour>().Any(d => d.Hour == viewModel.ClassDate.Value.Hour))
            {
                timeItem.HourOfClassTime = viewModel.ClassDate.Value.Hour;
            }


            if (lesson.RegisterLessonEnterprise.EnterpriseCourseContent.EnterpriseLessonType.Status == (int)Naming.LessonPriceStatus.自主訓練)
            {
                timeItem.TrainingBySelf = 1;
            }

            var users = models.CheckOverlapedBooking(timeItem, lesson);

            if (users.Count() > 0)
            {
                ModelState.AddModelError("UID", "學員(" + String.Join("、", users.Select(u => u.RealName)) + ")上課時間重複!!");
                ViewBag.ModelState = this.ModelState;
                return(View("~/Views/Shared/ReportInputError.ascx"));
            }

            if (lesson.GroupingMemberCount > 1)
            {
                timeItem.GroupID = lesson.RegisterGroupID;
                timeItem.LessonFitnessAssessment.AddRange(
                    lesson.GroupingLesson.RegisterLesson.Select(
                        r => new LessonFitnessAssessment
                {
                    UID = r.UID
                }));
            }
            else
            {
                timeItem.LessonFitnessAssessment.Add(new LessonFitnessAssessment
                {
                    UID = lesson.UID
                });
                if (!lesson.RegisterGroupID.HasValue)
                {
                    timeItem.GroupingLesson = lesson.GroupingLesson = new GroupingLesson {
                    };
                }
                else
                {
                    timeItem.GroupID = lesson.RegisterGroupID;
                }
            }

            models.GetTable <LessonTime>().InsertOnSubmit(timeItem);

            try
            {
                models.SubmitChanges();

                timeItem.BookingLessonTimeExpansion(models, timeItem.ClassTime.Value, timeItem.DurationInMinutes.Value);
                timeItem.ProcessBookingWhenCrossBranch(models);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                return(View("~/Views/ConsoleHome/Shared/JsAlert.cshtml", model: "預約未完成,請重新預約!!"));
            }

            return(Json(new { result = true, message = "上課時間預約完成!!" }));
        }
예제 #10
0
        private ActionResult CommitRemoteTrialLesson(LessonTimeViewModel viewModel, BranchStore branch, ServingCoach coach)
        {
            RegisterLesson lesson;
            UserProfile    profileItem = models.GetTable <UserProfile>().Where(u => u.UID == viewModel.UID).FirstOrDefault();

            if (profileItem == null)
            {
                return(View("~/Views/ConsoleHome/Shared/JsAlert.cshtml", model: "體驗學員資料錯誤!!"));
            }

            var priceType = models.CurrentTrialLessonPrice(true, viewModel.PriceID);

            if (priceType == null)
            {
                return(View("~/Views/ConsoleHome/Shared/JsAlert.cshtml", model: "體驗課程類型錯誤!!"));
            }

            lesson = new RegisterLesson
            {
                UID                 = viewModel.UID.Value,
                RegisterDate        = DateTime.Now,
                GroupingMemberCount = 1,
                Lessons             = 1,
                ClassLevel          = priceType.PriceID,
                IntuitionCharge     = new IntuitionCharge
                {
                    ByInstallments = 1,
                    Payment        = "Cash",
                    FeeShared      = 0
                },
                AdvisorID      = viewModel.CoachID,
                BranchID       = branch.BranchID,
                GroupingLesson = new GroupingLesson {
                }
            };
            //var installment = new TuitionInstallment
            //{
            //    PayoffDate = viewModel.ClassDate,
            //    PayoffAmount = priceType.ListPrice,
            //    Payment = new Payment
            //    {
            //        PayoffAmount = priceType.ListPrice,
            //        PayoffDate = viewModel.ClassDate
            //    }
            //};
            //installment.Payment.TuitionAchievement.Add(new TuitionAchievement
            //{
            //    CoachID = lesson.AdvisorID.Value,
            //    ShareAmount = installment.PayoffAmount
            //});

            //lesson.IntuitionCharge.TuitionInstallment.Add(installment);
            models.GetTable <RegisterLesson>().InsertOnSubmit(lesson);
            models.SubmitChanges();


            LessonTime timeItem = new LessonTime
            {
                InvitedCoach      = viewModel.CoachID,
                AttendingCoach    = viewModel.CoachID,
                ClassTime         = viewModel.ClassDate,
                DurationInMinutes = priceType.DurationInMinutes,
                TrainingBySelf    = (int)Naming.LessonSelfTraining.體驗課程,
                RegisterID        = lesson.RegisterID,
                LessonPlan        = new LessonPlan
                {
                },
                BranchID             = branch.BranchID,
                LessonTimeSettlement = new LessonTimeSettlement
                {
                    ProfessionalLevelID = coach.LevelID.Value,
                    MarkedGradeIndex    = coach.LevelID.HasValue ? coach.ProfessionalLevel.GradeIndex : null,
                    CoachWorkPlace      = coach.WorkBranchID(),
                }
            };

            if (models.GetTable <DailyWorkingHour>().Any(d => d.Hour == viewModel.ClassDate.Value.Hour))
            {
                timeItem.HourOfClassTime = viewModel.ClassDate.Value.Hour;
            }

            timeItem.GroupID = lesson.RegisterGroupID;
            timeItem.LessonFitnessAssessment.Add(new LessonFitnessAssessment
            {
                UID = lesson.UID
            });
            models.GetTable <LessonTime>().InsertOnSubmit(timeItem);

            try
            {
                models.SubmitChanges();
                timeItem.BookingLessonTimeExpansion(models, timeItem.ClassTime.Value, timeItem.DurationInMinutes.Value);
            }
            catch (Exception ex)
            {
                models.ExecuteCommand("delete RegisterLesson where RegisterID = {0}", lesson.RegisterID);

                Logger.Error(ex);
                ViewBag.Message = "預約未完成,請重新預約!!";
                return(View("~/Views/ConsoleHome/Shared/JsAlert.cshtml"));
            }

            return(Json(new { result = true, message = "上課時間預約完成!!" }));
        }
예제 #11
0
        public ActionResult CommitTrialLesson(LessonTimeViewModel viewModel, TrialLearnerViewModel newTrialLearner)
        {
            var profile = HttpContext.GetUser();

            ViewBag.ViewModel = viewModel;

            if (!viewModel.ClassDate.HasValue)
            {
                ModelState.AddModelError("ClassDate", "請選擇上課日期!!");
            }
            else if (viewModel.ClassDate < DateTime.Today)
            {
                ModelState.AddModelError("ClassDate", "預約時間不可早於今天!!");
            }

            var branch = models.GetTable <BranchStore>().Where(b => b.BranchID == viewModel.BranchID).FirstOrDefault();

            if (branch == null)
            {
                ModelState.AddModelError("BranchID", "請選擇上課地點!!");
            }

            if (!this.ModelState.IsValid)
            {
                ViewBag.ModelState = this.ModelState;
                return(View(Settings.Default.ReportInputError));
            }

            var coach = models.GetTable <ServingCoach>().Where(s => s.CoachID == viewModel.CoachID).FirstOrDefault();

            if (coach == null)
            {
                ViewBag.Message = "未指定體能顧問!!";
                return(View("~/Views/ConsoleHome/Shared/JsAlert.cshtml"));
            }

            if (branch.IsVirtualClassroom())
            {
                return(CommitRemoteTrialLesson(viewModel, branch, coach));
            }
            else if (!models.GetTable <CoachWorkplace>()
                     .Any(c => c.BranchID == viewModel.BranchID &&
                          c.CoachID == viewModel.CoachID) &&
                     viewModel.ClassDate.Value < DateTime.Today.AddDays(1))
            {
                return(View("~/Views/ConsoleHome/Shared/JsAlert.cshtml", model: "此時段不允許跨店預約!!"));
            }

            RegisterLesson lesson;

            if (!viewModel.UID.HasValue)
            {
                newTrialLearner.RealName = newTrialLearner.RealName.GetEfficientString();
                if (newTrialLearner.RealName == null)
                {
                    this.ModelState.AddModelError("realName", "請輸入學員姓名!!");
                    ViewBag.ModelState = this.ModelState;
                    return(View(Settings.Default.ReportInputError));
                }
                else
                {
                    var profileItem = models.CreateLearner(new LearnerViewModel
                    {
                        RealName     = newTrialLearner.RealName,
                        Phone        = newTrialLearner.Phone.GetEfficientString(),
                        Gender       = newTrialLearner.Gender,
                        CurrentTrial = 1,
                        RoleID       = Naming.RoleID.Preliminary
                    });

                    if (profileItem == null)
                    {
                        return(View("~/Views/ConsoleHome/Shared/JsAlert.cshtml", model: "無法新增體驗學員!!"));
                    }
                    viewModel.UID = profile.UID;
                }
            }

            var priceType = models.CurrentTrialLessonPrice();

            lesson = new RegisterLesson
            {
                UID                 = viewModel.UID.Value,
                RegisterDate        = DateTime.Now,
                GroupingMemberCount = 1,
                Lessons             = 1,
                ClassLevel          = priceType != null ? priceType.PriceID : (int?)null,
                IntuitionCharge     = new IntuitionCharge
                {
                    ByInstallments = 1,
                    Payment        = "Cash",
                    FeeShared      = 0
                },
                AdvisorID      = viewModel.CoachID,
                GroupingLesson = new GroupingLesson {
                }
            };
            //var installment = new TuitionInstallment
            //{
            //    PayoffDate = viewModel.ClassDate,
            //    PayoffAmount = priceType.ListPrice,
            //    Payment = new Payment
            //    {
            //        PayoffAmount = priceType.ListPrice,
            //        PayoffDate = viewModel.ClassDate
            //    }
            //};
            //installment.Payment.TuitionAchievement.Add(new TuitionAchievement
            //{
            //    CoachID = lesson.AdvisorID.Value,
            //    ShareAmount = installment.PayoffAmount
            //});

            //lesson.IntuitionCharge.TuitionInstallment.Add(installment);
            models.GetTable <RegisterLesson>().InsertOnSubmit(lesson);
            models.SubmitChanges();


            LessonTime timeItem = new LessonTime
            {
                InvitedCoach   = viewModel.CoachID,
                AttendingCoach = viewModel.CoachID,
                //ClassTime = viewModel.ClassDate.Add(viewModel.ClassTime),
                ClassTime         = viewModel.ClassDate,
                DurationInMinutes = priceType.DurationInMinutes,
                TrainingBySelf    = (int)Naming.LessonSelfTraining.體驗課程,
                RegisterID        = lesson.RegisterID,
                LessonPlan        = new LessonPlan
                {
                },
                BranchID             = viewModel.BranchID,
                LessonTimeSettlement = new LessonTimeSettlement
                {
                    ProfessionalLevelID = coach.LevelID.Value,
                    MarkedGradeIndex    = coach.LevelID.HasValue ? coach.ProfessionalLevel.GradeIndex : null,
                    CoachWorkPlace      = coach.WorkBranchID(),
                }
            };

            if (models.GetTable <DailyWorkingHour>().Any(d => d.Hour == viewModel.ClassDate.Value.Hour))
            {
                timeItem.HourOfClassTime = viewModel.ClassDate.Value.Hour;
            }

            timeItem.GroupID = lesson.RegisterGroupID;
            timeItem.LessonFitnessAssessment.Add(new LessonFitnessAssessment
            {
                UID = lesson.UID
            });
            models.GetTable <LessonTime>().InsertOnSubmit(timeItem);

            try
            {
                models.SubmitChanges();

                timeItem.BookingLessonTimeExpansion(models, timeItem.ClassTime.Value, timeItem.DurationInMinutes.Value);
                timeItem.ProcessBookingWhenCrossBranch(models);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                ViewBag.Message = "預約未完成,請重新預約!!";
                return(View("~/Views/ConsoleHome/Shared/JsAlert.cshtml"));
            }

            return(Json(new { result = true, message = "上課時間預約完成!!" }));
        }
예제 #12
0
        public static DataTable CreateLessonAchievementDetails <TEntity>(this ModelSource <TEntity> models, IQueryable <LessonTime> items)
            where TEntity : class, new()
        {
            DataTable table = new DataTable();

            table.Columns.Add(new DataColumn("合約編號", typeof(String)));
            table.Columns.Add(new DataColumn("體能顧問", typeof(String)));
            table.Columns.Add(new DataColumn("簽約場所", typeof(String)));
            table.Columns.Add(new DataColumn("學員", typeof(String)));
            table.Columns.Add(new DataColumn("合約名稱", typeof(String)));
            table.Columns.Add(new DataColumn("課程單價", typeof(int)));
            table.Columns.Add(new DataColumn("全價計算堂數", typeof(int)));
            table.Columns.Add(new DataColumn("半價計算堂數", typeof(int)));
            table.Columns.Add(new DataColumn("上課地點", typeof(String)));
            table.Columns.Add(new DataColumn("累計上課金額", typeof(int)));
            table.Columns.Add(new DataColumn("是否信託", typeof(String)));
            table.Columns.Add(new DataColumn("課程代碼", typeof(int)));
            table.Columns.Add(new DataColumn("體能顧問所屬分店", typeof(String)));

            var details = items.Where(t => t.RegisterLesson.RegisterLessonContract != null)
                          .GroupBy(t => new
            {
                t.AttendingCoach,
                t.RegisterLesson.RegisterLessonContract.ContractID,
                t.BranchID
            });

            foreach (var item in details)
            {
                CourseContract contract = models.GetTable <CourseContract>().Where(u => u.ContractID == item.Key.ContractID).First();
                ServingCoach   coach    = models.GetTable <ServingCoach>().Where(c => c.CoachID == item.Key.AttendingCoach).First();
                var            branch   = models.GetTable <BranchStore>().Where(b => b.BranchID == item.Key.BranchID).First();

                var r = table.NewRow();
                r[0] = contract.ContractNo();
                r[1] = coach.UserProfile.FullName();
                r[2] = contract.CourseContractExtension.BranchStore.BranchName;

                if (contract.CourseContractType.IsGroup == true)
                {
                    r[3] = String.Join("/", contract.CourseContractMember.Select(m => m.UserProfile).ToArray().Select(m => m.FullName()));
                }
                else
                {
                    r[3] = contract.ContractOwner.FullName();
                }

                r[4] = contract.CourseContractType.TypeName
                       + " (" + contract.LessonPriceType.DurationInMinutes + " 分鐘)";
                r[5] = contract.LessonPriceType.ListPrice;

                var count     = item.Count();
                var halfCount = item.Count(t => t.LessonAttendance == null || !t.LessonPlan.CommitAttendance.HasValue);
                r[6] = count - halfCount;
                r[7] = halfCount;
                r[8] = branch.BranchName;
                var discount = contract.CourseContractType.GroupingLessonDiscount;
                r[9]  = item.Sum(l => l.RegisterLesson.LessonPriceType.ListPrice) * discount.GroupingMemberCount * discount.PercentageOfDiscount / 100;
                r[10] = contract.Entrusted == true
                    ? "是"
                    : contract.Entrusted == false
                        ? "否"
                        : "";
                if (contract.LessonPriceType.Status.HasValue)
                {
                    r[11] = contract.LessonPriceType.Status.Value;
                }
                r[12] = coach.WorkPlace();
                table.Rows.Add(r);
            }

            var enterprise = items.Where(t => t.RegisterLesson.RegisterLessonEnterprise != null)
                             .GroupBy(t => new
            {
                t.AttendingCoach,
                t.RegisterLesson.RegisterLessonEnterprise.ContractID,
                t.RegisterID,
                t.BranchID
            });

            foreach (var item in enterprise)
            {
                EnterpriseCourseContract contract = models.GetTable <EnterpriseCourseContract>().Where(u => u.ContractID == item.Key.ContractID).First();
                ServingCoach             coach    = models.GetTable <ServingCoach>().Where(c => c.CoachID == item.Key.AttendingCoach).First();
                RegisterLesson           lesson   = models.GetTable <RegisterLesson>().Where(g => g.RegisterID == item.Key.RegisterID).First();
                var branch = models.GetTable <BranchStore>().Where(b => b.BranchID == item.Key.BranchID).First();

                var r = table.NewRow();

                r[0] = contract.ContractNo;
                r[1] = coach.UserProfile.FullName();
                r[2] = contract.BranchStore.BranchName;

                if (lesson.GroupingMemberCount > 1)
                {
                    r[3] = String.Join("/", lesson.GroupingLesson.RegisterLesson.Select(s => s.UserProfile).ToArray().Select(m => m.FullName()));
                }
                else
                {
                    r[3] = lesson.UserProfile.FullName();
                }

                r[4] = contract.Subject;
                r[5] = contract.EnterpriseCourseContent.OrderByDescending(c => c.ListPrice).First().ListPrice;
                var count     = item.Count();
                var halfCount = item.Count(t => t.LessonAttendance == null || !t.LessonPlan.CommitAttendance.HasValue);
                r[6] = count - halfCount;
                r[7] = halfCount;
                r[8] = branch.BranchName;
                r[9] = count * lesson.RegisterLessonEnterprise.EnterpriseCourseContent.ListPrice
                       * lesson.GroupingLessonDiscount.PercentageOfDiscount / 100;
                r[11] = (int)Naming.LessonPriceStatus.企業合作方案;
                r[12] = coach.WorkPlace();
                table.Rows.Add(r);
            }

            var others = items.Where(t => t.RegisterLesson.RegisterLessonContract == null && t.RegisterLesson.RegisterLessonEnterprise == null);

            foreach (var item in others)
            {
                var coach = item.AsAttendingCoach;
                var r     = table.NewRow();
                r[0] = "--";
                r[1] = coach.UserProfile.FullName();
                if (item.BranchID.HasValue)
                {
                    r[2] = item.BranchStore.BranchName;
                }

                r[3] = item.RegisterLesson.UserProfile.FullName();

                r[4] = item.RegisterLesson.LessonPriceType.Description
                       + " (" + item.RegisterLesson.LessonPriceType.DurationInMinutes + " 分鐘)";
                r[9] = r[5] = item.RegisterLesson.LessonPriceType.ListPrice;
                var halfCount = item.LessonAttendance == null || item.LessonPlan.CommitAttendance.HasValue ? 1 : 0;
                r[6] = 1 - halfCount;
                r[7] = halfCount;
                if (item.BranchID.HasValue)
                {
                    r[8] = item.BranchStore.BranchName;
                }
                if (item.RegisterLesson.LessonPriceType.Status.HasValue)
                {
                    r[11] = item.RegisterLesson.LessonPriceType.Status.Value;
                }
                r[12] = coach.WorkPlace();
                table.Rows.Add(r);
            }

            table.TableName = "上課統計表-人員明細";

            return(table);
        }
예제 #13
0
        public static DataTable CreateLessonAchievementDetails <TEntity>(this ModelSource <TEntity> models, IQueryable <V_Tuition> items)
            where TEntity : class, new()
        {
            DataTable table = new DataTable();

            table.Columns.Add(new DataColumn("合約編號", typeof(String)));
            table.Columns.Add(new DataColumn("上課體能顧問", typeof(String)));
            table.Columns.Add(new DataColumn("簽約場所", typeof(String)));
            table.Columns.Add(new DataColumn("學生", typeof(String)));
            table.Columns.Add(new DataColumn("合約名稱", typeof(String)));
            table.Columns.Add(new DataColumn("課程單價", typeof(int)));
            table.Columns.Add(new DataColumn("已完成上課", typeof(int)));
            table.Columns.Add(new DataColumn("學員打卡", typeof(int)));
            table.Columns.Add(new DataColumn("上課場所", typeof(String)));
            table.Columns.Add(new DataColumn("上課金額", typeof(int)));
            table.Columns.Add(new DataColumn("是否信託", typeof(String)));
            table.Columns.Add(new DataColumn("課程代碼", typeof(int)));
            table.Columns.Add(new DataColumn("體能顧問所屬分店", typeof(String)));
            table.Columns.Add(new DataColumn("預約上課數", typeof(int)));
            table.Columns.Add(new DataColumn("SettlementID", typeof(int)));
            table.Columns.Add(new DataColumn("簽約體能顧問", typeof(String)));

            var details = items.Where(t => t.ContractID.HasValue)
                          .GroupBy(t => new
            {
                t.AttendingCoach,
                t.ContractID,
                t.BranchID,
                t.SettlementID,
            });

            var branchItems = models.GetTable <BranchStore>().ToArray();

            foreach (var item in details)
            {
                CourseContract contract = models.GetTable <CourseContract>().Where(u => u.ContractID == item.Key.ContractID).First();
                ServingCoach   coach    = models.GetTable <ServingCoach>().Where(c => c.CoachID == item.Key.AttendingCoach).First();
                var            branch   = branchItems.Where(b => b.BranchID == item.Key.BranchID).First();

                var r = table.NewRow();
                r[0] = contract.ContractNo();
                r[1] = coach.UserProfile.FullName();
                r[2] = contract.CourseContractExtension.BranchStore.BranchName;

                if (contract.CourseContractType.IsGroup == true)
                {
                    r[3] = String.Join("/", contract.CourseContractMember.Select(m => m.UserProfile).ToArray().Select(m => m.FullName()));
                }
                else
                {
                    r[3] = contract.ContractOwner.FullName();
                }

                r[4] = contract.CourseContractType.TypeName
                       + " (" + contract.LessonPriceType.DurationInMinutes + " 分鐘)";
                r[5] = contract.LessonPriceType.ListPrice;

                r[6] = item.Where(l => l.CoachAttendance.HasValue).Count();         //item.Where(l => l.AchievementIndex == 1m).Count();
                r[7] = item.Join(models.GetTable <Settlement>(), l => l.SettlementID, s => s.SettlementID, (l, s) => new { l.CommitAttendance, s.SettlementDate })
                       .Where(l => l.CommitAttendance <= l.SettlementDate).Count(); //item.Where(l => l.AchievementIndex == 0.5m).Count();
                r[8]  = branch.BranchName;
                r[9]  = item.Sum(l => l.ListPrice * l.GroupingMemberCount * l.PercentageOfDiscount / 100);
                r[10] = contract.Entrusted == true
                    ? "是"
                    : contract.Entrusted == false
                        ? "否"
                        : "";
                if (contract.LessonPriceType.Status.HasValue)
                {
                    r[11] = contract.LessonPriceType.Status.Value;
                }

                var sample = item.First();
                r[12] = branchItems.Where(b => b.BranchID == sample.CoachWorkPlace)
                        .Select(b => b.BranchName).FirstOrDefault() ?? "其他";
                r[13] = item.Count();
                if (item.Key.SettlementID.HasValue)
                {
                    r[14] = item.Key.SettlementID;
                }
                r[15] = contract.ServingCoach.UserProfile.FullName();
                table.Rows.Add(r);
            }

            var enterprise = items.Where(t => t.EnterpriseContractID.HasValue)
                             .GroupBy(t => new
            {
                t.AttendingCoach,
                ContractID = t.EnterpriseContractID,
                t.RegisterID,
                t.BranchID,
                t.SettlementID,
            });

            foreach (var item in enterprise)
            {
                EnterpriseCourseContract contract = models.GetTable <EnterpriseCourseContract>().Where(u => u.ContractID == item.Key.ContractID).First();
                ServingCoach             coach    = models.GetTable <ServingCoach>().Where(c => c.CoachID == item.Key.AttendingCoach).First();
                RegisterLesson           lesson   = models.GetTable <RegisterLesson>().Where(g => g.RegisterID == item.Key.RegisterID).First();
                var branch = models.GetTable <BranchStore>().Where(b => b.BranchID == item.Key.BranchID).First();

                var r = table.NewRow();

                r[0] = contract.ContractNo;
                r[1] = coach.UserProfile.FullName();
                r[2] = contract.BranchStore.BranchName;

                if (lesson.GroupingMemberCount > 1)
                {
                    r[3] = String.Join("/", lesson.GroupingLesson.RegisterLesson.Select(s => s.UserProfile).ToArray().Select(m => m.FullName()));
                }
                else
                {
                    r[3] = lesson.UserProfile.FullName();
                }

                r[4] = contract.Subject;
                r[5] = contract.EnterpriseCourseContent.OrderByDescending(c => c.ListPrice).First().ListPrice;
                r[6] = item.Where(l => l.CoachAttendance.HasValue).Count();         //item.Where(l => l.AchievementIndex == 1m).Count();
                r[7] = item.Join(models.GetTable <Settlement>(), l => l.SettlementID, s => s.SettlementID, (l, s) => new { l.CommitAttendance, s.SettlementDate })
                       .Where(l => l.CommitAttendance <= l.SettlementDate).Count(); //item.Where(l => l.AchievementIndex == 0.5m).Count();
                r[8] = branch.BranchName;
                r[9] = item.Sum(l => l.EnterpriseListPrice * l.GroupingMemberCount
                                * l.PercentageOfDiscount / 100);
                r[11] = item.FirstOrDefault()?.ELStatus;    //(int)Naming.LessonPriceStatus.企業合作方案;
                var sample = item.First();
                r[12] = branchItems.Where(b => b.BranchID == sample.CoachWorkPlace)
                        .Select(b => b.BranchName).FirstOrDefault() ?? "其他";
                r[13] = item.Count();
                if (item.Key.SettlementID.HasValue)
                {
                    r[14] = item.Key.SettlementID;
                }

                table.Rows.Add(r);
            }

            var others = items.Where(t => !t.ContractID.HasValue && !t.EnterpriseRegisterID.HasValue);

            foreach (var item in others)
            {
                ServingCoach coach  = models.GetTable <ServingCoach>().Where(c => c.CoachID == item.AttendingCoach).First();
                var          branch = models.GetTable <BranchStore>().Where(b => b.BranchID == item.BranchID).FirstOrDefault();
                var          lesson = models.GetTable <RegisterLesson>().Where(g => g.RegisterID == item.RegisterID).First();

                var r = table.NewRow();
                r[0] = "--";
                r[1] = coach.UserProfile.FullName();
                if (item.BranchID.HasValue)
                {
                    r[2] = branch.BranchName;
                }

                r[3] = lesson.UserProfile.FullName();

                r[4] = lesson.LessonPriceType.Description
                       + " (" + lesson.LessonPriceType.DurationInMinutes + " 分鐘)";
                r[9] = r[5] = item.ListPrice;
                r[6] = item.CoachAttendance.HasValue ? 1 : 0;                                                         //item.AchievementIndex == 1m ? 1 : 0;
                var settlement = models.GetTable <Settlement>().Where(s => s.SettlementID == item.SettlementID).FirstOrDefault();
                r[7] = item.CommitAttendance.HasValue && item.CommitAttendance <= settlement?.SettlementDate ? 1 : 0; //item.AchievementIndex == 0.5m ? 1 : 0;
                if (branch != null)
                {
                    r[8] = branch.BranchName;
                }
                r[11] = item.PriceStatus;
                r[12] = branchItems.Where(b => b.BranchID == item.CoachWorkPlace)
                        .Select(b => b.BranchName).FirstOrDefault() ?? "其他";
                r[13] = 1;
                if (item.SettlementID.HasValue)
                {
                    r[14] = item.SettlementID;
                }

                table.Rows.Add(r);
            }

            table.TableName = "上課統計表-人員明細";

            return(table);
        }