Пример #1
0
        public Consideration ConsiderQuestion(string TitleCode, int QuestionNumber, [FromBody] Consideration consideration)
        {
            var _consideration = new InActive.Consideration()
            {
                _id            = repoForApprove.GetNewGuid("").ToString(),
                CreateDateTime = DateTime.Now,
                RejectComment  = consideration?.RejectComment,
                IsAccept       = consideration?.IsAccept ?? false,
                UserName       = consideration?.UserName, //TODO : userName ??
                ExamSuiteId    = consideration.ExamSuiteId,
                QuestionNumber = QuestionNumber,
            };

            var preConsiderationExamSuite = repoQ.GetQuestionSuite(consideration.ExamSuiteId);
            var preStatus = repoForApprove.GetConsiderationStatus(preConsiderationExamSuite);

            repoForApprove.CreateConsideration(_consideration);
            var postConsiderationExamSuite = repoQ.GetQuestionSuite(consideration.ExamSuiteId);
            var postStatus = repoForApprove.GetConsiderationStatus(postConsiderationExamSuite);

            var examSuite = repoQ.GetQuestionSuite(consideration.ExamSuiteId);
            var subject = repoQ.GetInActiveSubject(examSuite.SubjectId);
            int ExamSuiteAcceptCount = subject.ExamSuiteAcceptCount, ExamSuiteRejectCount = subject.ExamSuiteRejectCount;

            if (preStatus == "Accepted" && postStatus == "Rejected")
            {
                ExamSuiteAcceptCount--;
                ExamSuiteRejectCount++;
            }
            else if (preStatus == "Rejected" && postStatus == "Accepted")
            {
                ExamSuiteAcceptCount++;
                ExamSuiteRejectCount--;
            }
            else if (preStatus == "Wait" && postStatus == "Accepted")
            {
                ExamSuiteAcceptCount++;
            }
            else if (preStatus == "Wait" && postStatus == "Rejected")
            {
                ExamSuiteRejectCount++;
            }
            repoQ.UpdateQuestionCountComment(examSuite.SubjectId, ExamSuiteAcceptCount, ExamSuiteRejectCount);

            consideration.id             = _consideration._id;
            consideration.CreateDateTime = _consideration.CreateDateTime;
            consideration.ExamSuiteId    = consideration.ExamSuiteId;
            consideration.QuestionNumber = QuestionNumber;
            return(consideration);
        }
Пример #2
0
        public void ConAllQ(string ExamSuiteId)
        {
            var examSuite      = repoQ.GetQuestionSuite(ExamSuiteId);
            var Considerations = new List <InActive.Consideration>();

            foreach (var item in examSuite.Questions)
            {
                Considerations.Add(new InActive.Consideration()
                {
                    _id            = repoForApprove.GetNewGuid("").ToString(),
                    CreateDateTime = DateTime.Now,
                    IsAccept       = true,
                    UserName       = "******", //TODO : userName ??
                    ExamSuiteId    = ExamSuiteId,
                    QuestionNumber = item.No,
                });
            }
            repoForApprove.CreateManyConsideration(Considerations);

            Response.Redirect("/#!/inactiveexamsuiteview/" + ExamSuiteId);
        }
Пример #3
0
        public IActionResult VerifyMarkdown(IEnumerable <IFormFile> files, string Language)
        {
            var    mdFi = files.FirstOrDefault(f => System.IO.Path.GetExtension(ContentDispositionHeaderValue.Parse(f.ContentDisposition).FileName.Trim('"')) == ".md");
            string md   = string.Empty;

            if (mdFi != null)
            {
                using (var fi = new System.IO.StreamReader(mdFi.OpenReadStream()))
                {
                    md = fi.ReadToEnd();
                }
            }

            List <string> fileList  = new List <string>();
            var           subjectId = string.Empty;

            foreach (var f in files)
            {
                using (var fi = f.OpenReadStream())
                {
                    if (ZipFile.IsZipFile(fi, true))
                    {
                        fi.Seek(0, System.IO.SeekOrigin.Begin);
                        var assets = TheS.ExamBank.Parsers.AssetFileUtil.ReadZipEntries(fi).ToArray();
                        var parser = new TheS.ExamBank.Parsers.MarkdownParser();
                        if (parser.CheckAssets(md, assets))
                        {
                            fileList = assets.ToList();
                            assets   = parser.GetAssetLinks(md).ToArray();

                            fi.Seek(0, System.IO.SeekOrigin.Begin);
                            var assetFiles = TheS.ExamBank.Parsers.AssetFileUtil.GetAssets(fi, assets);
                            try
                            {
                                var questions = parser.ParseQuestionsFromString(md);
                                var header    = parser.ParseHeaderFromString(md);
                                subjectId = string.Concat(header.SubjectCode + "L" + header.Level, Language);

                                var qcode  = (header.Code ?? string.Empty).Trim();
                                var qid    = string.Concat(qcode, Language);
                                var qsuite = new TheS.ExamBank.DataFormats.QuestionSuite()
                                {
                                    _id         = qid,
                                    Code        = qcode,
                                    Title       = header.Title,
                                    SubjectName = header.SubjectName,
                                    Description = header.Description,
                                    SubjectId   = subjectId,
                                    SubjectCode = header.SubjectCode,
                                    Level       = header.Level,
                                    LayoutCode  = header.LayoutCode,

                                    Questions = questions,
                                };

                                var inActiveSubject = repoQ.GetInActiveSubject(subjectId);
                                var suite           = repoQ.GetQuestionSuite(qid);

                                //no suite and no subject  : create new suite and subject
                                if (suite == null && inActiveSubject == null)
                                {
                                    if (inActiveSubject == null)
                                    {
                                        var newSubject = new InActive.InactiveSubject
                                        {
                                            _id                  = subjectId,
                                            SubjectCode          = qsuite.SubjectCode,
                                            SubjectName          = qsuite.SubjectName,
                                            CreateDateTime       = DateTime.Now,
                                            IsEReadiness         = false, //Hack
                                            ContentLanguage      = Language,
                                            SiteId               = HomeController._centerdata.SiteId,
                                            QuestionCount        = questions.Count(),
                                            ExamSuiteCount       = 1,
                                            ExamSuiteAcceptCount = 0,
                                            ExamSuiteRejectCount = 0,
                                            ExamSuiteGroups      = new List <InActive.ExamSuiteGroup>()
                                            {
                                                new InActive.ExamSuiteGroup {
                                                    _id = "ก",
                                                    ExamSuiteGroupName = "ก", // HACK
                                                    IsUsed             = true,
                                                    PassScore          = null,
                                                    ExamDuration       = null,
                                                    ExamSuiteGroupMaps = new List <InActive.ExamSuiteGroupMap>
                                                    {
                                                        new InActive.ExamSuiteGroupMap
                                                        {
                                                            _id         = Guid.NewGuid().ToString(),
                                                            ExamSuiteId = qid,
                                                            RandomCount = 0,
                                                        }
                                                    },
                                                }
                                            },
                                        };
                                        repoQ.InsertInActiveSubject(newSubject);
                                    }
                                }
                                //has old suite and already has subject  : upsert suite   add groupmap to new suite
                                //ใช้ group map เดิม
                                else if (inActiveSubject != null && suite != null)
                                {
                                    //suite upsert ปกติ  subject ไม่เปลี่ยนอะไร
                                }
                                //new suite and already has subject : add groupmap to new suite
                                //เพิ่ม group map ใหม่
                                else if (inActiveSubject != null && suite == null)
                                {
                                    foreach (var item in inActiveSubject.ExamSuiteGroups)
                                    {
                                        item.ExamSuiteGroupMaps.Add(new InActive.ExamSuiteGroupMap
                                        {
                                            _id         = repoExamForApprove.GetNewGuid("").ToString(),
                                            ExamSuiteId = qid,
                                            RandomCount = 0,
                                        });
                                    }

                                    repoQ.UpsertInActiveSubject(inActiveSubject);
                                }

                                if (inActiveSubject != null)
                                {
                                    //update SubjectName and ContentLanguage
                                    repoQ.UpdateSubjectNameAndContentLanguage(inActiveSubject._id, qsuite.SubjectName, Language);
                                    //UpdateQuestionCount UpdateExamSuiteCount
                                    var examSuites    = repoQ.GetAllQuestionSuiteBySubjectId(subjectId);
                                    var questionCount = examSuites.Sum(es => es.Questions.Count());
                                    repoQ.UpdateQuestionCount(subjectId,
                                                              questionCount + questions.Count(),
                                                              examSuites.Count() + 1);
                                }

                                repoQ.Upsert(qsuite);
                                repoQ.UploadAssets(assetFiles, qid, this.iCloudStorage);
                            }
                            finally
                            {
                                TheS.ExamBank.Parsers.AssetFileUtil.CleanUpAssets(assetFiles, iFile);
                            }
                        }
                    }
                }
            }

            ViewData["files"] = fileList;

            return(Redirect("~/#!/inactivesubjectview/" + subjectId));
        }
        public InactiveApiResponse ActivateSubject(string SubjectId, string ActivateOption)
        {
            // ActivateOption : New ExamSuite Mode: , New or replace ExamSuite Mode , Replace Subject Mode:

            //InActive.SubjectId IS InActive.SubjectCode
            var    siteId           = HomeController._centerdata.SiteId;
            var    _inActiveSubject = repoForApprove.GetInActiveSubject(SubjectId);
            string SubjectCode      = _inActiveSubject.SubjectCode;
            var    now = DateTime.Now;

            if (_inActiveSubject == null)
            {
                return(new InactiveApiResponse {
                    Message = "ไม่มีวิชานี้", Code = InactiveApiResponse.ResponseCode.noinactivesubject
                });
            }

            //get ActivedSubject
            var _activatedSubject = repoForApprove.GetActivatedSubjectBySubjectCode(SubjectCode, _inActiveSubject.ContentLanguage);

            if (_activatedSubject == null)
            {
                _activatedSubject = new ViewModels.ExamBankModelsBack.ShareData.ActivatedSubject
                {
                    _id                = repoForApprove.GetNewGuid("").ToString(),
                    SubjectCode        = SubjectCode,
                    SiteId             = siteId,
                    CreateDateTime     = now,
                    LastUpdateDateTime = now,
                    IsEReadiness       = false,
                    DisabledDateTime   = null,
                    SubjectId          = "",//จะถูกใส่ตอน Upsert
                    ContentLanguage    = _inActiveSubject.ContentLanguage,
                };
            }

            //Get InActive for Convert
            var _inActiveExamSuite = repoQ.GetAllQuestionSuiteBySubjectId(SubjectId);
            //get old Subject
            var _oldSubject = repoForApprove.GetSubject(_activatedSubject.SubjectId);

            //var inActCtrl = new InActiveController(repoForApprove, null, null);
            foreach (var es in _inActiveExamSuite)
            {
                if (repoForApprove.GetConsiderationStatus(es) == "Wait")
                {
                    return(new InactiveApiResponse {
                        Message = "ยังตรวจข้อสอบไม่ครบ", Code = InactiveApiResponse.ResponseCode.notacceptallquestion
                    });
                }
                else if (repoForApprove.GetConsiderationStatus(es) == "Rejected")
                {
                    return(new InactiveApiResponse {
                        Message = "มีข้อสอบที่ถูกปฏิเสธ", Code = InactiveApiResponse.ResponseCode.notacceptallquestion
                    });
                }
            }

            // New ExamSuite Mode
            if (ActivateOption == "INS")
            {
                // Check ต้องเป็น suite ใหม่ทั้งหมด ถ้ามี return false
                var _allNewTitleCode = _inActiveExamSuite.Select(x => x.Code)?.ToList();
                //if has exist
                var isExistExamSuite = _oldSubject?.ExamSuites?.Any(es => _allNewTitleCode?.Any(code => code == es.TitleCode) ?? true) ?? false;
                if (isExistExamSuite)
                {
                    return(new InactiveApiResponse {
                        Message = "ไม่สามารถเริ่มใช้รายวิชาได้ เนื่องจากมีหมวดข้อสอบซ้ำกันในรายวิชาที่เริ่มใช้งานอยู่แล้ว", Code = InactiveApiResponse.ResponseCode.existingexamsuite
                    });
                }
            }


            var _newQuestion           = new List <Activated.Question>();
            var _newSubject            = this.ConvertToActivatedSubject(_inActiveSubject, _inActiveExamSuite, now, out _newQuestion);
            var _lastestSubjectVersion = repoForApprove.ListSubjectBySubjectCode(_activatedSubject.SubjectCode, _newSubject.ContentLanguage)
                                         ?.OrderByDescending(sub => sub.CreateDateTime)
                                         ?.FirstOrDefault()?.Version ?? this.ManageVersion(string.Empty, VersionModifyOption.InitialVersion);

            //Update ActivedSubject
            _activatedSubject.SubjectId = _newSubject._id;

            if (_oldSubject == null)
            {
                //Update Version
                _newSubject.Version = this.ManageVersion(string.Empty, VersionModifyOption.InitialVersion);
                //Create ActivedSubject
                repoForApprove.CreateActivatedSubject(_activatedSubject);
            }
            // New ExamSuite Mode
            // New or replace ExamSuite Mode (upsert)
            else if (ActivateOption == "INS" || ActivateOption == "UPS")
            {
                // Add Old suite
                var _newSuite       = _newSubject.ExamSuites.Where(x => _oldSubject.ExamSuites.All(y => y.TitleCode != x.TitleCode))?.ToList();
                var _oldAndDupSuite = _oldSubject.ExamSuites.Except(_newSuite)?.ToList();
                var _oldSuite       = _oldAndDupSuite.Where(x => _newSubject.ExamSuites.All(y => y.TitleCode != x.TitleCode))?.ToList();
                //_newSubject.ExamSuites = _oldAndDupSuite.Concat(_newSuite).ToList();
                _newSubject.ExamSuites.AddRange(_oldSuite);

                //add old group
                var _oldGroup        = _oldSubject.ExamSuiteGroups.Where(x => _newSubject.ExamSuiteGroups.All(y => y._id != x._id))?.ToList();
                var _dupGroupFromNew = _newSubject.ExamSuiteGroups.Where(og => _oldSubject.ExamSuiteGroups.Any(ng => ng._id == og._id))?.ToList();
                //var _newGroup = _newSubject.ExamSuiteGroups.Except(_oldSubject.ExamSuiteGroups);
                //var _newAndDupGroup = _newSubject.ExamSuiteGroups.Except(_oldGroup);
                var _newGroup = _newSubject.ExamSuiteGroups.Where(x => _oldSubject.ExamSuiteGroups.All(y => y._id != x._id))?.ToList();

                //add new map to _oldGroup
                foreach (var group in _oldGroup)
                {
                    group.ExamSuiteGroupMaps.AddRange(_newSuite.Select(es => new Activated.ExamSuiteGroupMap()
                    {
                        _id         = Guid.NewGuid().ToString(),
                        ExamSuiteId = es._id,
                        RandomCount = 0,
                    }).ToList());
                }

                //add old map to _dupGroupFromNew
                foreach (var group in _dupGroupFromNew)
                {
                    group.ExamSuiteGroupMaps.AddRange(_oldSuite.Select(es => new Activated.ExamSuiteGroupMap()
                    {
                        _id         = Guid.NewGuid().ToString(),
                        ExamSuiteId = es._id,
                        RandomCount = _oldSubject.ExamSuiteGroups?.Select(g => g.ExamSuiteGroupMaps?.FirstOrDefault(m => m.ExamSuiteId == es._id))?.FirstOrDefault()?.RandomCount ?? 0,
                    }).ToList());
                }

                //add old map to _newGroup
                foreach (var group in _newGroup)
                {
                    group.ExamSuiteGroupMaps.AddRange(_oldSuite.Select(es => new Activated.ExamSuiteGroupMap()
                    {
                        _id         = Guid.NewGuid().ToString(),
                        ExamSuiteId = es._id,
                        RandomCount = 0,
                    }).ToList());
                }

                _newSubject.ExamSuiteGroups = _oldGroup.Concat(_dupGroupFromNew).Concat(_newGroup).ToList();

                //Update Version
                _newSubject.Version = this.ManageVersion(_lastestSubjectVersion, VersionModifyOption.IncreaseMinor);
                //Update ActivedSubject
                repoForApprove.UpsertActivatedSubject(_activatedSubject);
            }
            //Replace Subject Mode
            else if (ActivateOption == "REP")
            {
                //Update Version
                _newSubject.Version = ManageVersion(_lastestSubjectVersion, VersionModifyOption.IncreaseMajor);
                //Update ActivedSubject
                repoForApprove.UpdateActivatedSubject(_activatedSubject);
            }
            else
            {
                return(new InactiveApiResponse {
                    Message = "กรุณาเลือกวิธีการ Activate", Code = InactiveApiResponse.ResponseCode.nooption
                });
            }

            //All option must create newSubject and newQuestion
            repoForApprove.CreateSubject(_newSubject);
            repoForApprove.CreateQuestion(_newQuestion);

            //All option must delete InActiveSubject and Considerratio
            repoForApprove.DeleteAllInSubject(SubjectId);
            repoForApprove.DeleteAllConsiderration(_newSubject.ExamSuites.Select(es => es._id).ToList());
            return(new InactiveApiResponse {
                Message = "เริ่มใช้รายวิชาสำเร็จ", Code = InactiveApiResponse.ResponseCode.success
            });
        }