diff --git a/__manifest__.py b/__manifest__.py index bbb62df..4082d64 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -11,20 +11,18 @@ 'views/subject.xml', 'views/course.xml', 'views/course_attendance.xml', - 'views/school_subject_teacher_info_views.xml', + 'views/school_subject_teacher_views.xml', 'views/application.xml', 'views/enrollment.xml', 'views/assignment_views.xml', 'views/lesson_views.xml', - 'views/timeoff_views.xml', + 'views/timeoff_views.xml', + 'views/teacher_attendance_view.xml', + 'views/school_misc_views.xml', + 'views/school_reporting_views.xml', 'views/menu.xml', ], - 'assets': { - 'web.assets_frontend': [ - 'school_management/static/src/**/*', - ], - }, 'installable': True, 'application': True, } diff --git a/models/__init__.py b/models/__init__.py index f9de574..873b274 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -13,4 +13,7 @@ from . import school_course_schedule from . import school_course_assignment from . import school_subject_lesson from . import school_subject_teacher_info +from . import teacher_attendance +from . import school_misc_menus + diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc index ff98799..c92e7ab 100644 Binary files a/models/__pycache__/__init__.cpython-310.pyc and b/models/__pycache__/__init__.cpython-310.pyc differ diff --git a/models/__pycache__/enrollment_fee_summary.cpython-310.pyc b/models/__pycache__/enrollment_fee_summary.cpython-310.pyc index faebe4e..d39457a 100644 Binary files a/models/__pycache__/enrollment_fee_summary.cpython-310.pyc and b/models/__pycache__/enrollment_fee_summary.cpython-310.pyc differ diff --git a/models/__pycache__/school_misc_menus.cpython-310.pyc b/models/__pycache__/school_misc_menus.cpython-310.pyc new file mode 100644 index 0000000..b8dd894 Binary files /dev/null and b/models/__pycache__/school_misc_menus.cpython-310.pyc differ diff --git a/models/__pycache__/school_subject_teacher_info.cpython-310.pyc b/models/__pycache__/school_subject_teacher_info.cpython-310.pyc index a5a6ae6..e3725f4 100644 Binary files a/models/__pycache__/school_subject_teacher_info.cpython-310.pyc and b/models/__pycache__/school_subject_teacher_info.cpython-310.pyc differ diff --git a/models/__pycache__/teacher_attendance.cpython-310.pyc b/models/__pycache__/teacher_attendance.cpython-310.pyc new file mode 100644 index 0000000..2b00848 Binary files /dev/null and b/models/__pycache__/teacher_attendance.cpython-310.pyc differ diff --git a/models/enrollment_fee_summary.py b/models/enrollment_fee_summary.py index ba2c6d6..dfbd60c 100644 --- a/models/enrollment_fee_summary.py +++ b/models/enrollment_fee_summary.py @@ -11,8 +11,6 @@ class EnrollmentFeeSummary(models.Model): fee_slip_amount = fields.Float(string="Fee Slip Amount") due_fees = fields.Float(string="Due Fees") fee_element = fields.Char(string="Fee Element") - - frequency = fields.Selection([ ('monthly', 'Monthly'), ('quarterly', 'Quarterly'), diff --git a/models/school_misc_menus.py b/models/school_misc_menus.py new file mode 100644 index 0000000..bbcce01 --- /dev/null +++ b/models/school_misc_menus.py @@ -0,0 +1,62 @@ +from odoo import models, fields + +class SchoolNotice(models.Model): + _name = 'school.notice.board' + _description = 'School Notice Board' + + title = fields.Char("Title", required=True) + start_date = fields.Date("Start Date", required=True) + end_date = fields.Date("End Date") + description = fields.Text("Description") + school_id = fields.Many2one('res.company', string="School", default=lambda self: self.env.company) + visible_to = fields.Selection([ + ('all', 'All'), + ('students', 'Students'), + ('teachers', 'Teachers') + ], string="Visible To", default='all', required=True) + +class SchoolReportDummy(models.Model): + _name = 'school.reporting.dummy' + _description = 'Reporting Dummy' + + name = fields.Char("Report Name") + date_generated = fields.Date("Generated On", default=fields.Date.today) + + + +class SchoolFeesReport(models.Model): + _name = 'school.fees.report' + _description = 'Fees Report' + + name = fields.Char("Report Name") + amount = fields.Float("Amount") + +class SchoolTranscriptReport(models.Model): + _name = 'school.transcript.report' + _description = 'Transcript Report' + + student_id = fields.Many2one('school.application', string="Student", ondelete='set null') + grade = fields.Char("Grade") + +class SchoolScholarshipReport(models.Model): + _name = 'school.scholarship.report' + _description = 'Scholarship Report' + + student_id = fields.Many2one('school.application', string="Student", ondelete='set null') + scholarship_name = fields.Char("Scholarship Name") + awarded_amount = fields.Float("Awarded Amount") + +class SchoolReportCard(models.Model): + _name = 'school.report.card' + _description = 'Report Card' + + student_id = fields.Many2one('school.application', string="Student", ondelete='set null') + subject_id = fields.Many2one('school.subject', string="Subject Name", required=True) + score = fields.Float("Score") + +class SchoolConfigSettings(models.Model): + _name = 'school.config.settings' + _description = 'School Configuration Settings' + + key = fields.Char("Setting Key", required=True) + value = fields.Char("Setting Value") diff --git a/models/teacher_attendance.py b/models/teacher_attendance.py new file mode 100644 index 0000000..080edfc --- /dev/null +++ b/models/teacher_attendance.py @@ -0,0 +1,28 @@ +from odoo import models, fields, api +from odoo.exceptions import ValidationError + +class TeacherAttendance(models.Model): + _name = 'school.teacher.attendance' + _description = 'Teacher Attendance' + _order = 'date desc' + + teacher_id = fields.Many2one('school.subject.teacher.info', string='Teacher', required=True) + date = fields.Date(string='Date', required=True, default=fields.Date.today) + attendance_status = fields.Selection([ + ('present', 'Present'), + ('absent', 'Absent'), + ('on_leave', 'On Leave'), + ('late', 'Late') + ], string='Status', required=True, default='present') + remarks = fields.Text(string='Remarks') + + @api.constrains('date', 'teacher_id') + def _check_duplicate_attendance(self): + for rec in self: + existing = self.search([ + ('teacher_id', '=', rec.teacher_id.id), + ('date', '=', rec.date), + ('id', '!=', rec.id) + ]) + if existing: + raise ValidationError("Attendance for this teacher already exists on this date.") diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 5be56be..dc9143f 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -15,3 +15,11 @@ access_school_course_assignment,School Course Assignment,model_school_course_ass access_school_subject_lesson,School Subject Lesson,model_school_subject_lesson,,1,1,1,1 access_school_subject_teacher_info,School Subject Teacher Info,model_school_subject_teacher_info,,1,1,1,1 access_school_subject_teacher_info_admin,Subject Teacher Info,model_school_subject_teacher_info,school_management.group_school_admin,1,1,1,1 +access_teacher_attendance,Teacher Attendance,model_school_teacher_attendance,,1,1,1,1 +access_school_notice_board,School Notice Board,model_school_notice_board,,1,1,1,1 +access_school_reporting_dummy,School Reporting Dummy,model_school_reporting_dummy,,1,1,1,1 +access_school_config_settings,School Config Settings,model_school_config_settings,,1,1,1,1 +access_school_fees_report,Fees Report,model_school_fees_report,,1,1,1,1 +access_school_transcript_report,Transcript Report,model_school_transcript_report,,1,1,1,1 +access_school_scholarship_report,Scholarship Report,model_school_scholarship_report,,1,1,1,1 +access_school_report_card,Report Card,model_school_report_card,,1,1,1,1 \ No newline at end of file diff --git a/static/src/description/icon.png b/static/src/description/icon.png deleted file mode 100644 index e69de29..0000000 diff --git a/static/src/description/login.js b/static/src/description/login.js deleted file mode 100644 index aa96c78..0000000 --- a/static/src/description/login.js +++ /dev/null @@ -1,16 +0,0 @@ -// odoo.define('school_management.login_script', function (require) { -// "use strict"; - -// document.addEventListener("DOMContentLoaded", function () { -// const toggleBtn = document.querySelector("#toggle-password"); -// const pwField = document.querySelector("#password"); - -// if (toggleBtn && pwField) { -// toggleBtn.addEventListener("click", function () { -// const type = pwField.type === "password" ? "text" : "password"; -// pwField.type = type; -// toggleBtn.innerText = type === "password" ? "👁️" : "🙈"; -// }); -// } -// }); -// }); diff --git a/static/src/style.css b/static/src/style.css deleted file mode 100644 index 18fab5e..0000000 --- a/static/src/style.css +++ /dev/null @@ -1,650 +0,0 @@ -/* style.css - Main stylesheet for EduManage system */ - -/* Reset and Base Styles */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -html { - font-size: 16px; - scroll-behavior: smooth; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - line-height: 1.6; - color: #333; - background-color: #f8fafc; -} - -/* Typography */ -h1, h2, h3, h4, h5, h6 { - color: #1a202c; - margin-bottom: 0.5rem; -} - -h1 { font-size: 2.5rem; font-weight: 700; } -h2 { font-size: 2rem; font-weight: 600; } -h3 { font-size: 1.5rem; font-weight: 600; } -h4 { font-size: 1.25rem; font-weight: 500; } -h5 { font-size: 1.125rem; font-weight: 500; } -h6 { font-size: 1rem; font-weight: 500; } - -p { - margin-bottom: 1rem; - color: #4a5568; -} - -a { - color: #3182ce; - text-decoration: none; - transition: color 0.2s ease; -} - -a:hover { - color: #2c5aa0; - text-decoration: underline; -} - -/* Layout Components */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 20px; -} - -.flex { - display: flex; -} - -.flex-column { - flex-direction: column; -} - -.justify-between { - justify-content: space-between; -} - -.justify-center { - justify-content: center; -} - -.align-center { - align-items: center; -} - -.text-center { - text-align: center; -} - -.text-right { - text-align: right; -} - -/* Header */ -.header { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 1rem 0; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - position: sticky; - top: 0; - z-index: 1000; -} - -.header .container { - display: flex; - justify-content: space-between; - align-items: center; -} - -.logo { - display: flex; - align-items: center; - font-size: 1.5rem; - font-weight: 700; -} - -.logo img { - height: 40px; - margin-right: 10px; -} - -.user-info { - display: flex; - align-items: center; - gap: 15px; -} - -.user-avatar { - width: 40px; - height: 40px; - border-radius: 50%; - border: 2px solid rgba(255, 255, 255, 0.3); -} - -.user-details h4 { - color: white; - margin: 0; -} - -.user-details span { - color: rgba(255, 255, 255, 0.8); - font-size: 0.875rem; -} - -/* Navigation */ -.sidebar { - background: white; - width: 250px; - min-height: calc(100vh - 80px); - box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1); - position: fixed; - left: 0; - top: 80px; - z-index: 999; - overflow-y: auto; -} - -.nav-menu { - padding: 20px 0; -} - -.nav-item { - display: flex; - align-items: center; - padding: 15px 25px; - color: #4a5568; - cursor: pointer; - transition: all 0.2s ease; - border-left: 3px solid transparent; -} - -.nav-item:hover { - background-color: #f7fafc; - color: #3182ce; - border-left-color: #3182ce; -} - -.nav-item.active { - background-color: #ebf8ff; - color: #3182ce; - border-left-color: #3182ce; - font-weight: 500; -} - -.nav-item i { - margin-right: 12px; - width: 20px; - text-align: center; -} - -/* Main Content */ -.main-content { - margin-left: 250px; - padding: 30px; - min-height: calc(100vh - 80px); -} - -.page-header { - margin-bottom: 30px; - padding-bottom: 20px; - border-bottom: 1px solid #e2e8f0; -} - -.page-title { - color: #1a202c; - margin-bottom: 5px; -} - -.page-subtitle { - color: #718096; - font-size: 0.875rem; -} - -/* Cards and Components */ -.card { - background: white; - border-radius: 8px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - margin-bottom: 20px; - overflow: hidden; - transition: box-shadow 0.2s ease; -} - -.card:hover { - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); -} - -.card-header { - padding: 20px; - background: #f7fafc; - border-bottom: 1px solid #e2e8f0; -} - -.card-title { - margin: 0; - color: #1a202c; -} - -.card-body { - padding: 20px; -} - -.card-footer { - padding: 15px 20px; - background: #f7fafc; - border-top: 1px solid #e2e8f0; -} - -/* Statistics Cards */ -.stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 20px; - margin-bottom: 30px; -} - -.stat-card { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 25px; - border-radius: 12px; - text-align: center; - box-shadow: 0 4px 12px rgba(102, 126, 234, 0.25); - transition: transform 0.2s ease; -} - -.stat-card:hover { - transform: translateY(-2px); -} - -.stat-card h3 { - color: rgba(255, 255, 255, 0.9); - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: 0.5px; - margin-bottom: 10px; -} - -.stat-value { - font-size: 2.5rem; - font-weight: 700; - color: white; -} - -.stat-change { - font-size: 0.875rem; - margin-top: 5px; - opacity: 0.8; -} - -/* Forms */ -.form-group { - margin-bottom: 20px; -} - -.form-label { - display: block; - margin-bottom: 5px; - color: #374151; - font-weight: 500; -} - -.form-input { - width: 100%; - padding: 12px 16px; - border: 1px solid #d1d5db; - border-radius: 6px; - font-size: 0.875rem; - transition: border-color 0.2s ease, box-shadow 0.2s ease; -} - -.form-input:focus { - outline: none; - border-color: #3182ce; - box-shadow: 0 0 0 3px rgba(49, 130, 206, 0.1); -} - -.form-select { - width: 100%; - padding: 12px 16px; - border: 1px solid #d1d5db; - border-radius: 6px; - background-color: white; - font-size: 0.875rem; - cursor: pointer; -} - -.form-textarea { - width: 100%; - padding: 12px 16px; - border: 1px solid #d1d5db; - border-radius: 6px; - font-size: 0.875rem; - resize: vertical; - min-height: 100px; -} - -/* Buttons */ -.btn { - display: inline-block; - padding: 12px 24px; - border: none; - border-radius: 6px; - font-size: 0.875rem; - font-weight: 500; - text-align: center; - cursor: pointer; - transition: all 0.2s ease; - text-decoration: none; -} - -.btn-primary { - background-color: #3182ce; - color: white; -} - -.btn-primary:hover { - background-color: #2c5aa0; - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(49, 130, 206, 0.25); -} - -.btn-secondary { - background-color: #e2e8f0; - color: #374151; -} - -.btn-secondary:hover { - background-color: #cbd5e0; -} - -.btn-success { - background-color: #38a169; - color: white; -} - -.btn-success:hover { - background-color: #2f855a; -} - -.btn-danger { - background-color: #e53e3e; - color: white; -} - -.btn-danger:hover { - background-color: #c53030; -} - -.btn-sm { - padding: 8px 16px; - font-size: 0.75rem; -} - -.btn-lg { - padding: 16px 32px; - font-size: 1rem; -} - -/* Tables */ -.table { - width: 100%; - border-collapse: collapse; - margin-top: 20px; -} - -.table th, -.table td { - padding: 12px 16px; - text-align: left; - border-bottom: 1px solid #e2e8f0; -} - -.table th { - background-color: #f7fafc; - font-weight: 600; - color: #374151; - text-transform: uppercase; - font-size: 0.75rem; - letter-spacing: 0.5px; -} - -.table tbody tr:hover { - background-color: #f7fafc; -} - -/* Login Page Styles */ -.login-container { - min-height: 100vh; - display: flex; - align-items: center; - justify-content: center; - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -} - -.login-card { - background: white; - padding: 40px; - border-radius: 12px; - box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); - width: 100%; - max-width: 400px; -} - -.login-header { - text-align: center; - margin-bottom: 30px; -} - -.login-logo { - height: 60px; - margin-bottom: 20px; -} - -/* Dashboard Specific Styles */ -.dashboard-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 20px; - margin-top: 20px; -} - -.activity-item { - padding: 15px; - border-left: 4px solid #3182ce; - background: #f7fafc; - margin-bottom: 10px; - border-radius: 0 6px 6px 0; -} - -.activity-time { - color: #718096; - font-size: 0.75rem; - margin-top: 5px; -} - -/* Modals */ -.modal { - display: none; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - z-index: 10000; -} - -.modal-content { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background: white; - padding: 30px; - border-radius: 12px; - box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25); - max-width: 500px; - width: 90%; -} - -.modal-header { - margin-bottom: 20px; - padding-bottom: 15px; - border-bottom: 1px solid #e2e8f0; -} - -.modal-title { - margin: 0; - color: #1a202c; -} - -.close-btn { - position: absolute; - top: 15px; - right: 20px; - background: none; - border: none; - font-size: 1.5rem; - cursor: pointer; - color: #718096; -} - -.close-btn:hover { - color: #1a202c; -} - -/* Notifications */ -.notification { - position: fixed; - top: 20px; - right: 20px; - padding: 15px 20px; - border-radius: 6px; - color: white; - font-weight: 500; - z-index: 10001; - animation: slideIn 0.3s ease; -} - -.notification.info { - background-color: #3182ce; -} - -.notification.success { - background-color: #38a169; -} - -.notification.warning { - background-color: #d69e2e; -} - -.notification.error { - background-color: #e53e3e; -} - -@keyframes slideIn { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } -} - -/* Responsive Design */ -@media (max-width: 768px) { - .sidebar { - transform: translateX(-100%); - transition: transform 0.3s ease; - } - - .sidebar.open { - transform: translateX(0); - } - - .main-content { - margin-left: 0; - padding: 20px 15px; - } - - .header .container { - padding: 0 15px; - } - - .stats-grid { - grid-template-columns: 1fr; - } - - .dashboard-grid { - grid-template-columns: 1fr; - } -} - -@media (max-width: 480px) { - .login-card { - margin: 20px; - padding: 30px 20px; - } - - .modal-content { - margin: 20px; - width: calc(100% - 40px); - } - - .stat-card { - padding: 20px; - } - - .stat-value { - font-size: 2rem; - } -} - -/* Utility Classes */ -.mt-10 { margin-top: 10px; } -.mt-20 { margin-top: 20px; } -.mb-10 { margin-bottom: 10px; } -.mb-20 { margin-bottom: 20px; } -.ml-10 { margin-left: 10px; } -.mr-10 { margin-right: 10px; } - -.p-10 { padding: 10px; } -.p-20 { padding: 20px; } -.pt-10 { padding-top: 10px; } -.pb-10 { padding-bottom: 10px; } - -.hidden { display: none; } -.visible { display: block; } - -.text-muted { color: #718096; } -.text-primary { color: #3182ce; } -.text-success { color: #38a169; } -.text-warning { color: #d69e2e; } -.text-danger { color: #e53e3e; } - -.bg-light { background-color: #f7fafc; } -.bg-primary { background-color: #3182ce; } -.bg-success { background-color: #38a169; } -.bg-warning { background-color: #d69e2e; } -.bg-danger { background-color: #e53e3e; } - -.border { border: 1px solid #e2e8f0; } -.border-top { border-top: 1px solid #e2e8f0; } -.border-bottom { border-bottom: 1px solid #e2e8f0; } -.border-left { border-left: 1px solid #e2e8f0; } -.border-right { border-right: 1px solid #e2e8f0; } - -.rounded { border-radius: 6px; } -.rounded-lg { border-radius: 12px; } -.rounded-full { border-radius: 50%; } - -.shadow { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } -.shadow-md { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } -.shadow-lg { box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); } \ No newline at end of file diff --git a/views/application.xml b/views/application.xml index 8200fcd..fb4e3c9 100644 --- a/views/application.xml +++ b/views/application.xml @@ -113,12 +113,9 @@
- -
+
- -


@@ -132,10 +129,36 @@
+ + + + school.application.pivot + school.application + + + + + + + + + + + + school.application.graph + school.application + + + + + + + + Applications school.application - list,form,kanban + list,form,kanban,graph,pivot diff --git a/views/enrollment.xml b/views/enrollment.xml index 33dcd4d..94fd5c9 100644 --- a/views/enrollment.xml +++ b/views/enrollment.xml @@ -119,11 +119,35 @@ + + school.enrollment.pivot + school.enrollment + + + + + + + + + + + + school.enrollment.graph + school.enrollment + + + + + + + + Enrollment school.enrollment - list,form,kanban + list,form,kanban,pivot,graph diff --git a/views/menu.xml b/views/menu.xml index d0fbf34..84b2502 100644 --- a/views/menu.xml +++ b/views/menu.xml @@ -28,40 +28,116 @@ action="action_school_class_schedule" sequence="50"/> + - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + sequence="40"/> diff --git a/views/schedule.xml b/views/schedule.xml index 1e294cd..6326a49 100644 --- a/views/schedule.xml +++ b/views/schedule.xml @@ -82,8 +82,8 @@ - - + + Class Schedule school.class.schedule diff --git a/views/school_misc_views.xml b/views/school_misc_views.xml new file mode 100644 index 0000000..eaf990c --- /dev/null +++ b/views/school_misc_views.xml @@ -0,0 +1,108 @@ + + + school.notice.board.list + school.notice.board + + + + + + + + + + + + school.notice.board.form + school.notice.board + +
+ + + + + + + + + + + + + + +
+
+
+ + + + All Notices + school.notice.board + list,form + + + + school.reporting.dummy.list + school.reporting.dummy + + + + + + + + + + school.reporting.dummy.form + school.reporting.dummy + +
+ + + + +
+
+
+ + + + General Report + school.reporting.dummy + list,form + + + + school.config.settings.list + school.config.settings + + + + + + + + + + school.config.settings.form + school.config.settings + +
+ + + + +
+
+
+ + + + + Settings + school.config.settings + list,form + + +
diff --git a/views/school_reporting_views.xml b/views/school_reporting_views.xml new file mode 100644 index 0000000..4248172 --- /dev/null +++ b/views/school_reporting_views.xml @@ -0,0 +1,142 @@ + + + + + school.fees.report.list + school.fees.report + + + + + + + + + school.fees.report.form + school.fees.report + +
+ + + + + + +
+
+
+ + + + Fees Report + school.fees.report + list,form + + + + + + school.transcript.report.list + school.transcript.report + + + + + + + + + school.transcript.report.form + school.transcript.report + +
+ + + + + + +
+
+
+ + + + Transcript Report + school.transcript.report + list,form + + + + + + school.scholarship.report.list + school.scholarship.report + + + + + + + + + + school.scholarship.report.form + school.scholarship.report + +
+ + + + + + + +
+
+
+ + + + Scholarship Report + school.scholarship.report + list,form + + + + + + school.report.card.list + school.report.card + + + + + + + + + + school.report.card.form + school.report.card + +
+ + + + + + + +
+
+
+ + + + Report Card + school.report.card + list,form + + +
diff --git a/views/school_subject_teacher_info_views.xml b/views/school_subject_teacher_views.xml similarity index 79% rename from views/school_subject_teacher_info_views.xml rename to views/school_subject_teacher_views.xml index a9698ba..b5b7e2a 100644 --- a/views/school_subject_teacher_info_views.xml +++ b/views/school_subject_teacher_views.xml @@ -1,9 +1,9 @@ - - - school.subject.teacher.info.list + + + school.subject.teacher.list school.subject.teacher.info @@ -19,8 +19,8 @@ - - school.subject.teacher.info.form + + school.subject.teacher.form school.subject.teacher.info
@@ -56,8 +56,8 @@ - - school.subject.teacher.info.kanban + + school.subject.teacher.kanban school.subject.teacher.info @@ -86,8 +86,8 @@ - - school.subject.teacher.info.pivot + + school.subject.teacher.pivot school.subject.teacher.info @@ -100,14 +100,26 @@ + + + school.subject.teacher.search + school.subject.teacher.info + + + + + + + + + + + - Subject Teacher Info + All Teachers school.subject.teacher.info - list,form - -

Create Subject Teacher Information.

-
+ kanban,search,pivot,list,form
\ No newline at end of file diff --git a/views/teacher_attendance_view.xml b/views/teacher_attendance_view.xml new file mode 100644 index 0000000..a78e149 --- /dev/null +++ b/views/teacher_attendance_view.xml @@ -0,0 +1,40 @@ + + + + + teacher.attendance.list + school.teacher.attendance + + + + + + + + + + + + teacher.attendance.form + school.teacher.attendance + + + + + + + + + + + + + + + + Teacher Attendance + school.teacher.attendance + list,form + + +