コード例 #1
0
        private static MemoryStream ProcessReportCard(SchoolPeriod schoolPeriod, IEnumerable<GradingStandard> gradingStandards, ReportCardTemplate template, ClassEnrollment enrollment)
        {
            var parser = GetParser(template.FileType);

            parser.Initialize(schoolPeriod, schoolPeriod.GradingTerms, gradingStandards, template.TemplateData);
            return parser.Process(enrollment, enrollment.Student.ClassEnrollments.SelectMany(p => p.StudentGrades));
        }
        public MemoryStream Process(ClassEnrollment enrollment, IEnumerable<StudentGrade> grades)
        {
            using (var doc = WordprocessingDocument.Open(TemplateStream, true))
            {
                var text = string.Empty;

                //Get Text
                using (var reader = new StreamReader(doc.MainDocumentPart.GetStream()))
                {
                    text = reader.ReadToEnd();
                }

                //Modify Text
                text = ProcessText(text, enrollment, grades);

                //Write text
                using (var writer = new StreamWriter(doc.MainDocumentPart.GetStream(FileMode.Create)))
                {
                    writer.Write(text);
                }
            }

            return TemplateStream;
        }
        private string ProcessText(string input, ClassEnrollment enrollment, IEnumerable<StudentGrade> grades)
        {
            while (PlaceholderPattern.IsMatch(input))
            {
                Match match = PlaceholderPattern.Match(input);

                string key = match.Groups["ph"].Value;
                int term = 1;

                Group termGroup = match.Groups["term"];
                if (termGroup.Success)
                {
                    term = int.Parse(termGroup.Value);
                }

                var standard = Standards.FirstOrDefault(p => p.Placeholder == key);

                if (standard == null)
                {
                    input = RemovePlaceholder(input, match);
                    continue;
                }

                var grade = grades.FirstOrDefault(p => p.GradingStandard == standard);

                if (grade == null)
                {
                    input = RemovePlaceholder(input, match);
                    continue;
                }

                input = ReplacePlaceholder(input, match, grade.Grade);
            }

            return input;
        }
コード例 #4
0
        public MemoryStream Process(ClassEnrollment enrollment, IEnumerable<StudentGrade> grades)
        {
            var gradeList = grades.ToList();
            var placeholderHelper = new CommonPlaceholderHelper();
            placeholderHelper.SetValues(enrollment.Student, enrollment.Class.Teacher);
            placeholderHelper.SetValues(Period, Period.ReportingPeriod, Period.School, Period.School.SchoolDistrict);

            //string filename = String.Format("{0}{2} {1}.pdf", @"d:\cards\", enrollment.Student.LastName, enrollment.Student.FirstName);

            //FileStream stream = new FileStream(filename, FileMode.Create);
            var stream = new MemoryStream();
            var reader = new PdfReader(Template);
            var stamper = new PdfStamper(reader, stream);

            var form = stamper.AcroFields;
            var fieldKeys = form.Fields.Keys;

            foreach (var fieldKey in fieldKeys)
            {
                var match = KeyPattern.Match(fieldKey);

                if (match.Success)
                {
                    var key = match.Groups["ph"].Value;
                    var term = 1;

                    var termGroup = match.Groups["term"];
                    if (termGroup.Success)
                    {
                        int.TryParse(termGroup.Value, out term);
                    }

                    var standard = Standards.FirstOrDefault(p => p.Placeholder == key);

                    if (standard == null)
                    {
                        form.SetField(fieldKey, placeholderHelper.GetValue(fieldKey));
                        continue;
                    }

                    var gradingTerm = Terms.FirstOrDefault(p => p.TermNum == term);

                    if (gradingTerm == null)
                    {
                        form.SetField(fieldKey, string.Empty);
                        continue;
                    }

                    var grade = gradeList.FirstOrDefault(p => p.GradingStandard == standard && p.GradingTermID == gradingTerm.GradingTermID);

                    if (grade == null)
                    {
                        form.SetField(fieldKey, string.Empty);
                        continue;
                    }

                    form.SetField(fieldKey, grade.Grade);
                }
                else
                {
                    form.SetField(fieldKey, string.Empty);
                }
            }

            // "Flatten" the form so it wont be editable/usable anymore
            stamper.FormFlattening = true;

            stamper.Close();
            reader.Close();

            return stream;
        }
コード例 #5
0
        private void MatchClasses(int districtID, int schoolPeriodID, IEnumerable<NewStudentImport> newStudentImports)
        {
            var teachers = _repo.GetTeachers(districtID);

            foreach (var newStudentImport in newStudentImports)
            {
                if (String.IsNullOrWhiteSpace(newStudentImport.ImportRecord.TeacherID)) continue;

                var teacher = teachers.FirstOrDefault(p => p.ImportID == newStudentImport.ImportRecord.TeacherID);
                if (teacher != null)
                {
                    var clas = FindOrCreateClass(districtID, newStudentImport.Student.School, schoolPeriodID, teacher, newStudentImport);
                    var enrollment = new ClassEnrollment();
                    enrollment.Class = clas;
                    enrollment.Student = newStudentImport.Student;
                    newStudentImport.Student.ClassEnrollments.Add(enrollment);

                    _repo.AddClassEnrollment(enrollment, false);
                }
            }
        }
コード例 #6
0
        public StudentImportResult ImportStudents(int districtID, int reportingPeriodID, IEnumerable<StudentImportRecord> importRecords, params StudentImportOptions[] importOptions)
        {
            //Create the result object, and mark the start time
            var result = new StudentImportResult();
            result.MarkStart();

            //Get the list of schools for the School District, along with each schools list of teachers and school periods
            var schools = _repo.GetSchools(districtID, SchoolInclude.Teachers, SchoolInclude.SchoolPeriods).ToList();

            //Get a list of the class sessions in this school district, that are in the school period specifieid, and include the Class Type for each class
            var existingClasses = _repo.GetClasses(ClassInclude.ClassType, ClassInclude.ClassEnrollments).Where(p => p.SchoolPeriod.ReportingPeriodID == reportingPeriodID).ToList();

            //Also get a dedicated list of class types for the district (including the ones that are unique to specific schools in this district)
            var classTypes = _repo.GetClassTypes(districtID, false).ToList();

            //Get a list of all the students in this district
            var students = _repo.GetStudents(districtID).ToList();

            //Loop through each reacord in the imported data set
            foreach (var record in importRecords)
            {
                result.NumRecordsProcessed++;

                //Create a new student record
                //If we find an existing student later, we will use this object to update the existing student
                var newStudent = new Student
                {
                    ImportID = record.StudentID,
                    FirstName = record.FirstName,
                    MiddleName = record.MiddleName,
                    LastName = record.LastName,
                    IDNumber = record.IDNumber,
                    GradeLevel = (byte)record.GradeLevel
                };

                //Skip if there is no school to link the imported record to
                if (String.IsNullOrWhiteSpace(record.SchoolID))
                {
                    result.SkippedRecords.Add(newStudent, ImportRecordSkipReason.NoSystemSchoolIdAvailable);
                    continue;
                }

                //Skip if there is no teacher to link the imported record to
                if (String.IsNullOrWhiteSpace(record.TeacherID))
                {
                    result.SkippedRecords.Add(newStudent, ImportRecordSkipReason.NoSystemTeacherIDAvailable);
                    continue;
                }

                //Skip if the grade level is out of range
                if (record.GradeLevel < 0 || record.GradeLevel > 12)
                {
                    result.SkippedRecords.Add(newStudent, ImportRecordSkipReason.GradeLevelOutOfRange);
                    continue;
                }

                //Find school the student belongs to
                var school = schools.FirstOrDefault(p => p.ImportID == record.SchoolID);

                //Skip if the school could not be found
                if (school == null)
                {
                    result.SkippedRecords.Add(newStudent, ImportRecordSkipReason.SchoolNotFound);
                    continue;
                }

                //Find the school period
                var schoolPeriod = school.SchoolPeriods.FirstOrDefault(p => p.ReportingPeriodID == reportingPeriodID);

                //Create the school period if necessary
                if (schoolPeriod == null && importOptions.Contains(StudentImportOptions.AutoCreateSchoolPeriods))
                {
                    //TODO: Somehow determine how many terms we should create
                    schoolPeriod = new SchoolPeriod { NumTerms = 3, School = school, ReportingPeriodID = reportingPeriodID };

                    //link to school
                    foreach (int i in Enumerable.Range(1, 3))
                    {
                        var term = new GradingTerm { TermNum = (byte)i, GradingOpen = false };
                        schoolPeriod.GradingTerms.Add(term);
                    }

                    //Add to repo for persistance
                    //(Linking to school should do this anyway, but just in case)
                    _repo.AddSchoolPeriod(schoolPeriod, false);

                    //Add new school period to result object
                    result.SchoolPeriodsCreated.Add(schoolPeriod);
                }
                else if (schoolPeriod == null)
                {
                    //Skip if the school period couldn't be found, and we aren't suppose to auto create it
                    result.SkippedRecords.Add(newStudent, ImportRecordSkipReason.NoSchoolPeriodAvailable);
                    continue;
                }

                //Try and find an existing student
                var existingStudent = students.FirstOrDefault(p => p.ImportID == record.StudentID && p.SchoolID == school.SchoolID);

                //Alternatively, if selected, try to find the student by their ID number
                if (existingStudent == null && importOptions.Contains(StudentImportOptions.AllowStudentMatchOnIdNumber) && !String.IsNullOrWhiteSpace(record.IDNumber) && record.IDNumber.Length > 1)
                {
                    existingStudent = students.FirstOrDefault(p => p.IDNumber == record.IDNumber && p.SchoolID == school.SchoolID);
                }

                if (existingStudent != null)
                {
                    //Update existing student
                    existingStudent.ImportID = newStudent.ImportID;
                    existingStudent.FirstName = newStudent.FirstName;
                    existingStudent.MiddleName = newStudent.MiddleName;
                    existingStudent.LastName = newStudent.LastName;
                    existingStudent.IDNumber = newStudent.IDNumber;
                    existingStudent.GradeLevel = newStudent.GradeLevel;

                    result.UpdatedRecords.Add(existingStudent);
                }
                else
                {
                    //Link student to school
                    newStudent.School = school;

                    //Add to repo for persistance
                    //(which would probably happen anyway now that they are linked to a school)
                    _repo.AddStudent(newStudent, false);

                    result.InsertedRecords.Add(newStudent);
                }

                //Use either the existing student, or new student, depending on
                var student = existingStudent ?? newStudent;

                //Get the teacher that is teaching the enrolled class
                var teacher = school.Teachers.FirstOrDefault(p => p.ImportID == record.TeacherID);

                //Skip if teacher was not found
                if (teacher == null)
                {
                    result.SkippedRecords.Add(newStudent, ImportRecordSkipReason.TeacherNotFound);
                    continue;
                }

                //Find or create the class the student would be enrolled in
                Class enrolledClass = existingClasses.FirstOrDefault(p => (p.TeacherID == teacher.TeacherID || p.Teacher == teacher) && p.ClassType.GradeLevel == record.GradeLevel);

                if (enrolledClass == null && importOptions.Contains(StudentImportOptions.AutoCreateClasses))
                {
                    ClassType classType = classTypes.FirstOrDefault(p => p.GradeLevel == record.GradeLevel && (p.SchoolID == null || p.SchoolID == school.SchoolID));

                    //Create the class type if necessary as well
                    if (classType == null)
                    {
                        classType = new ClassType();
                        classType.GradeLevel = (byte)record.GradeLevel;
                        classType.Name = classType.GradeLevelLong;
                        classType.SchoolDistrictID = school.SchoolDistrictID; //link to district
                        classType.SchoolID = null; //make available district wide

                        //Add class type creation to result object
                        result.ClassTypesCreated.Add(classType);

                        //persist the new class type
                        _repo.AddClassType(classType, false);

                        //Add the new class type to the local collection for future use
                        classTypes.Add(classType);
                    }

                    enrolledClass = new Class();
                    enrolledClass.ClassType = classType;
                    enrolledClass.Name = String.Format("{0}'s {1}", teacher.FullName, student.GradeLevelLong);
                    enrolledClass.Teacher = teacher;
                    enrolledClass.SchoolPeriod = schoolPeriod;

                    //add new class to result object
                    result.ClassesCreated.Add(enrolledClass);

                    //persist new class
                    _repo.AddClass(enrolledClass, false);

                    //add new class to local collection for future use
                    existingClasses.Add(enrolledClass);
                }
                else if (enrolledClass == null)
                {
                    result.SkippedRecords.Add(newStudent, ImportRecordSkipReason.ClassNotAvailable);
                    continue;
                }

                //Find existing enrollment
                var enrollment = enrolledClass.ClassEnrollments.FirstOrDefault(p => p.Student == student);

                //Create the class enrollment if necessary
                if (enrollment == null)
                {
                    enrollment = new ClassEnrollment();
                    enrollment.Student = student;
                    enrollment.Class = enrolledClass;

                    //persist
                    _repo.AddClassEnrollment(enrollment, false);

                    result.EnrollmentsCreated.Add(enrollment);
                }
            }

            //Save changes
            _repo.Save();

            result.MarkEnd();

            return result;
        }