eccbf43235
Merged code for Student Attendance against Course Schedule and Student Batch Student Attendance Tool now shows marked student attendance as well. Fixed validation login in Student Attendance for duplicate Student Attendance Record validation"
166 lines
5.6 KiB
Python
166 lines
5.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright (c) 2015, Frappe Technologies and contributors
|
|
# For license information, please see license.txt
|
|
|
|
from __future__ import unicode_literals
|
|
import frappe
|
|
import json
|
|
from frappe import _
|
|
from frappe.model.mapper import get_mapped_doc
|
|
from frappe.utils import flt
|
|
|
|
@frappe.whitelist()
|
|
def enroll_student(source_name):
|
|
"""Creates a Student Record and returns a Program Enrollment.
|
|
|
|
:param source_name: Student Applicant.
|
|
"""
|
|
student = get_mapped_doc("Student Applicant", source_name,
|
|
{"Student Applicant": {
|
|
"doctype": "Student",
|
|
"field_map": {
|
|
"name": "student_applicant"
|
|
}
|
|
}}, ignore_permissions=True)
|
|
student.save()
|
|
program_enrollment = frappe.new_doc("Program Enrollment")
|
|
program_enrollment.student = student.name
|
|
program_enrollment.student_name = student.title
|
|
program_enrollment.program = frappe.db.get_value("Student Applicant", source_name, "program")
|
|
return program_enrollment
|
|
|
|
@frappe.whitelist()
|
|
def check_attendance_records_exist(course_schedule=None, student_batch=None, date=None):
|
|
"""Check if Attendance Records are made against the specified Course Schedule or Student Batch for given date.
|
|
|
|
:param course_schedule: Course Schedule.
|
|
:param student_batch: Student Batch.
|
|
:param date: Date.
|
|
"""
|
|
if course_schedule:
|
|
return frappe.get_list("Student Attendance", filters={"course_schedule": course_schedule})
|
|
else:
|
|
return frappe.get_list("Student Attendance", filters={"student_batch": student_batch, "date": date})
|
|
|
|
@frappe.whitelist()
|
|
def mark_attendance(students_present, students_absent, course_schedule=None, student_batch=None, date=None):
|
|
"""Creates Multiple Attendance Records.
|
|
|
|
:param students_present: Students Present JSON.
|
|
:param students_absent: Students Absent JSON.
|
|
:param course_schedule: Course Schedule.
|
|
:param student_batch: Student Batch.
|
|
:param date: Date.
|
|
"""
|
|
|
|
present = json.loads(students_present)
|
|
absent = json.loads(students_absent)
|
|
|
|
for d in present:
|
|
make_attendance_records(d["student"], d["student_name"], "Present", course_schedule, student_batch, date)
|
|
|
|
for d in absent:
|
|
make_attendance_records(d["student"], d["student_name"], "Absent", course_schedule, student_batch, date)
|
|
|
|
frappe.db.commit()
|
|
frappe.msgprint(_("Attendance has been marked successfully."))
|
|
|
|
def make_attendance_records(student, student_name, status, course_schedule=None, student_batch=None, date=None):
|
|
"""Creates Attendance Record.
|
|
|
|
:param student: Student.
|
|
:param student_name: Student Name.
|
|
:param course_schedule: Course Schedule.
|
|
:param status: Status (Present/Absent)
|
|
"""
|
|
student_attendance = frappe.new_doc("Student Attendance")
|
|
student_attendance.student = student
|
|
student_attendance.student_name = student_name
|
|
student_attendance.course_schedule = course_schedule
|
|
student_attendance.student_batch = student_batch
|
|
student_attendance.date = date
|
|
student_attendance.status = status
|
|
student_attendance.submit()
|
|
|
|
@frappe.whitelist()
|
|
def get_student_batch_students(student_batch):
|
|
"""Returns List of student, student_name in Student Batch.
|
|
|
|
:param student_batch: Student Batch.
|
|
"""
|
|
students = frappe.get_list("Student Batch Student", fields=["student", "student_name", "idx"] , filters={"parent": student_batch}, order_by= "idx")
|
|
return students
|
|
|
|
@frappe.whitelist()
|
|
def get_student_group_students(student_group):
|
|
"""Returns List of student, student_name in Student Group.
|
|
|
|
:param student_group: Student Group.
|
|
"""
|
|
students = frappe.get_list("Student Group Student", fields=["student", "student_name"] , filters={"parent": student_group}, order_by= "idx")
|
|
return students
|
|
|
|
@frappe.whitelist()
|
|
def get_fee_structure(program, academic_term=None):
|
|
"""Returns Fee Structure.
|
|
|
|
:param program: Program.
|
|
:param academic_term: Academic Term.
|
|
"""
|
|
fee_structure = frappe.db.get_values("Fee Structure", {"program": program,
|
|
"academic_term": academic_term}, 'name', as_dict=True)
|
|
return fee_structure[0].name if fee_structure else None
|
|
|
|
@frappe.whitelist()
|
|
def get_fee_components(fee_structure):
|
|
"""Returns Fee Components.
|
|
|
|
:param fee_structure: Fee Structure.
|
|
"""
|
|
if fee_structure:
|
|
fs = frappe.get_list("Fee Component", fields=["fees_category", "amount"] , filters={"parent": fee_structure}, order_by= "idx")
|
|
return fs
|
|
|
|
@frappe.whitelist()
|
|
def get_fee_schedule(program, student_category=None):
|
|
"""Returns Fee Schedule.
|
|
|
|
:param program: Program.
|
|
:param student_category: Student Category
|
|
"""
|
|
fs = frappe.get_list("Program Fee", fields=["academic_term", "fee_structure", "due_date", "amount"] ,
|
|
filters={"parent": program, "student_category": student_category }, order_by= "idx")
|
|
return fs
|
|
|
|
@frappe.whitelist()
|
|
def collect_fees(fees, amt):
|
|
paid_amount = flt(amt) + flt(frappe.db.get_value("Fees", fees, "paid_amount"))
|
|
total_amount = flt(frappe.db.get_value("Fees", fees, "total_amount"))
|
|
frappe.db.set_value("Fees", fees, "paid_amount", paid_amount)
|
|
frappe.db.set_value("Fees", fees, "outstanding_amount", (total_amount - paid_amount))
|
|
return paid_amount
|
|
|
|
@frappe.whitelist()
|
|
def get_course_schedule_events(start, end, filters=None):
|
|
"""Returns events for Course Schedule Calendar view rendering.
|
|
|
|
:param start: Start date-time.
|
|
:param end: End date-time.
|
|
:param filters: Filters (JSON).
|
|
"""
|
|
from frappe.desk.calendar import get_event_conditions
|
|
conditions = get_event_conditions("Course Schedule", filters)
|
|
|
|
data = frappe.db.sql("""select name, course,
|
|
timestamp(schedule_date, from_time) as from_datetime,
|
|
timestamp(schedule_date, to_time) as to_datetime,
|
|
room, student_group, 0 as 'allDay'
|
|
from `tabCourse Schedule`
|
|
where ( schedule_date between %(start)s and %(end)s )
|
|
{conditions}""".format(conditions=conditions), {
|
|
"start": start,
|
|
"end": end
|
|
}, as_dict=True, update={"allDay": 0})
|
|
|
|
return data
|