StudentSubjects Documentation

Student Subjects Controller Documentation

File: /controllers/studentSubjectsController.php

Purpose: Manages academic subjects, groups, schedules, and income types for student management system

Last Updated: December 21, 2024

Total Functions: 5

Lines of Code: ~316

---

๐Ÿ“‹ Overview

The Student Subjects Controller handles the creation and management of academic subjects and their associated groups and schedules. It provides functionality for:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**studentsubjects**Main subjectsid, subjectname, subjectprice, deviceid, ipaddress, incometypeid, useit, del
**studentsubjectgroups**Subject groups/classesid, studentsubjectid, subjectgroupname, subjectgroupprice, useit, del
**studentsubjectgroupdays**Class schedulesid, studentsubjectid, studentsubjectgroupid, day, dayar, dayen, timeform, timeto, useit, del
**incometype**Income categories for billingincometypeid, incomeTypeName, defaultValue, parent, studentsubjectid
### Related Tables

Table NamePurposeKey Columns
**studentaddsubjects**Student assignmentsstudentaddsubjectid, studentsubjectid, studentsubjectgroupid, del
**studentaddsubjectdetails**Assignment detailsstudentaddsubjectdetailid, studentsubjectid, studentsubjectgroupid, del
**studentsexams**Subject examsstudentsexamid, studentsubjectid, studentsubjectgroupid, del
**studentsexamsval**Exam valuesstudentsexamsvalid, studentsubjectid, studentsubjectgroupid, del
**studentspaymentsystems**Payment systemsstudentspaymentsystemid, studentsubjectid, del
**studentspays**Student paymentsstudentspayid, studentsubjectid, studentsubjectgroupid, del
**user**System usersuserid, employeename
---

๐Ÿ”‘ Key Functions

1. Default Action - Add Subject Form

Location: Lines 7-11

Purpose: Display the subject creation form

Process Flow:

1. Display header template

2. Show subject add form

3. Set student flag for navigation

4. Display footer template

---

2. savedata() - Subject and Schedule Management

Location: Lines 55-163

Purpose: Create or update subjects with groups and schedules

Function Signature:

function savedata()

Process Flow:

1. Extract subject data from POST

2. Create/update subject record

3. Create/update income type for billing

4. Process each subject group iteration

5. Process each schedule day iteration

6. Handle Arabic/English day names

7. Set usage flags and audit information

Subject Processing:

if (!$subjectid) {
    $subjects = R::dispense('studentsubjects');
    // Set creation fields
} else {
    $subjects = R::load('studentsubjects', $subjectid);
    // Set update fields
}

Income Type Integration:

if (!$incometype) {
    R::exec("INSERT INTO `incometype`(`incomeTypeName`, `defaultValue`, `parent`, `incomeTypeDate`, `userid`, `conditions`, `studentsubjectid`) 
             VALUES ('$subjectname', '$subjectprice', 0, '$date', $userid, 0, $subjectid)");
} else {
    R::exec("UPDATE `incometype` SET `incomeTypeName`='$subjectname', `defaultValue`='$subjectprice' 
             WHERE incometypeid = $subjects->incometypeid");
}

Schedule Processing:

$dayar = ['','ุงู„ุณุจุช','ุงู„ุฃุญุฏ','ุงู„ุงุซู†ูŠู†','ุงู„ุซู„ุงุซุงุก','ุงู„ุงุฑุจุนุงุก','ุงู„ุฎู…ูŠุณ','ุงู„ุฌู…ุนุฉ'];
$dayen = ['','Saturday','Sunday','Monday','Tuesday','Wednesday','Thursday','Friday'];

---

3. showajax() - AJAX Data Table

Location: Lines 167-251

Purpose: Provide data for DataTables AJAX listing

Function Signature:

function showajax()

Process Flow:

1. Define column mappings for sorting

2. Build search query with filters

3. Apply date range filters

4. Process search terms

5. Execute query with pagination

6. Format results for DataTables

7. Return JSON response

Search Query Building:

if ($data1 != '') {
    $searchQuery .= " and studentsubjects.id = " . $data1 . " ";
}
if ($del == '') {
    $searchQuery .= " and studentsubjects.del < 2 ";
}

Action Buttons:

if ($row["del"] < 2) {
    $sub_array[] = '<a href="studentSubjectsController.php?do=edit&id='. $row["id"] .'" 
                        type="button" class="btn btn-default btn-lg editicon"></a>';
    $sub_array[] = '<a href="javascript:;" data-id="'. $row["id"] .'" 
                        data-controll="studentSubjectsController" 
                        type="button" class="btn btn-default btn-lg deleteicon removecontroller"></a>';
}

---

4. removecontroller() - Cascade Deletion

Location: Lines 254-278

Purpose: Soft delete subject and all related records

Function Signature:

function removecontroller()

Process Flow:

1. Load subject record

2. Set deletion flags and audit info

3. Cascade delete all related records

4. Disable related income type

5. Return success status

Cascade Deletion Logic:

R::exec("UPDATE `studentsubjectgroups` SET `del`= 3, `deltoday`= '$today', `deluserid`= $userid 
         WHERE studentsubjectid = '" . $id . "' ");
R::exec("UPDATE `studentsubjectgroupdays` SET `del`= 3, `deltoday`= '$today', `deluserid`= $userid 
         WHERE studentsubjectid = '" . $id . "' ");
R::exec("UPDATE `studentaddsubjects` SET `del`= 3, `deltoday`= '$today', `deluserid`= $userid 
         WHERE studentsubjectid = '" . $id . "' ");
// ... more related tables
R::exec("UPDATE `incometype` SET `conditions`= 1 WHERE studentsubjectid = '" . $id . "' ");

---

5. removeappend() - Group/Schedule Deletion

Location: Lines 281-305

Purpose: Remove specific groups or schedule entries

Function Signature:

function removeappend()

Process Flow:

1. Get record ID and table type

2. Load and mark record as deleted

3. If group deletion, cascade to related records

4. Return success status

Conditional Cascading:

if ($table == 'studentsubjectgroups') {
    R::exec("UPDATE `studentsubjectgroupdays` SET `del`= 3 WHERE studentsubjectgroupid = '" . $id . "' ");
    R::exec("UPDATE `studentaddsubjects` SET `del`= 3 WHERE studentsubjectgroupid = '" . $id . "' ");
    // ... more related tables
}

---

๐Ÿ”„ Workflows

Workflow 1: Subject Creation with Groups and Schedules

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Create New Subject
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Subject Basic Info
- Enter subject name
- Set subject price
- Configure device/IP settings
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Create Subject Record
- Insert/update studentsubjects table
- Create corresponding income type
- Set audit fields (user, date)
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Process Subject Groups
FOR EACH group iteration:
โ”‚
โ†’ Create/update group record
โ”‚ โ”œโ”€ Set group name and price
โ”‚ โ”œโ”€ Link to parent subject
โ”‚ โ”‚ โ””โ”€ Set usage flags โ”‚
โ”‚
โ†’ Process group schedule days
โ”‚ FOR EACH day iteration:
โ”‚ โ”œโ”€ Set day number (1-7)
โ”‚ โ”œโ”€ Set Arabic/English day names
โ”‚ โ”œโ”€ Set time from/to
โ”‚ โ”‚ โ””โ”€ Link to parent group โ”‚
โ”‚
โ”‚ โ””โ”€โ†’ Continue to next group โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Finalize and Save
- Commit all changes
- Return success status
- Display updated subject list
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

Workflow 2: Subject Deletion Cascade

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Delete Subject
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Mark Subject as Deleted
- Set del = 2 on studentsubjects
- Set deletion audit fields
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Cascade Delete Related Records
- studentsubjectgroups (del = 3)
- studentsubjectgroupdays (del = 3)
- studentaddsubjects (del = 3)
- studentaddsubjectdetails (del = 3)
- studentsexams (del = 3)
- studentsexamsval (del = 3)
- studentspaymentsystems (del = 3)
- studentspays (del = 3)
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Disable Income Type
- Set conditions = 1 on incometype
- Preserve for historical records
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty)Default actionDisplay subject creation form
`do=addappend`Row generatorGenerate additional form rows
`do=show`Show viewDisplay subject listing interface
`do=edit`Edit formLoad subject data for editing
`do=savedata``savedata()`Process subject creation/update
`do=showajax``showajax()`AJAX data for DataTables
`do=removecontroller``removecontroller()`Delete subject
`do=removeappend``removeappend()`Delete group/schedule
### Required Parameters by Action

Subject Creation/Edit (do=savedata):

Group Configuration (dynamic):

Schedule Configuration (dynamic):

AJAX Data Table:

---

๐Ÿงฎ Calculation Methods

Day Name Mapping

$dayar = ['','ุงู„ุณุจุช','ุงู„ุฃุญุฏ','ุงู„ุงุซู†ูŠู†','ุงู„ุซู„ุงุซุงุก','ุงู„ุงุฑุจุนุงุก','ุงู„ุฎู…ูŠุณ','ุงู„ุฌู…ุนุฉ'];
$dayen = ['','Saturday','Sunday','Monday','Tuesday','Wednesday','Thursday','Friday'];

$subjectgroupdays->dayar = $dayar[$day]; 
$subjectgroupdays->dayen = $dayen[$day];

Price Inheritance

// If no group price specified, use subject price
$subjectgroupprice = empty($subjectgroupprice) ? $subjectprice : $subjectgroupprice;

Usage Flag Management

// New records start as unused (useit = 0)
$subjects->useit = 0;
$subjectgroups->useit = 0;
$subjectgroupdays->useit = 0;

---

๐Ÿ”’ Security & Permissions

Input Validation

// Skip groups without required data
if (!$subjectgroupname || $subjectgroupsdayitr < 1) {continue;}

// Skip schedule entries without required data
if (!$day || !$timeform || !$timeto) {continue;}

Authentication Check

include_once("../public/authentication.php");

Audit Trail

- addtoday / updatetoday - Timestamp tracking

- adduserid / updateuserid - User tracking

- deltoday / deluserid - Deletion tracking

- del - Soft deletion status

---

๐Ÿ“Š Performance Considerations

Database Optimization

1. Efficient Queries: Direct primary key loads where possible

2. Soft Deletion: Uses del flags instead of hard deletes

3. Cascade Updates: Single SQL statements for bulk updates

Potential Issues

Optimization Recommendations

-- Recommended indexes
CREATE INDEX idx_studentsubjects_del ON studentsubjects(del);
CREATE INDEX idx_studentsubjectgroups_subject_del ON studentsubjectgroups(studentsubjectid, del);
CREATE INDEX idx_studentsubjectgroupdays_group_del ON studentsubjectgroupdays(studentsubjectgroupid, del);

---

๐Ÿ› Common Issues & Troubleshooting

1. Groups Not Saving

Issue: Subject groups don't appear after creation

Cause: Group name validation or day iteration count = 0

Debug:

if (!$subjectgroupname || $subjectgroupsdayitr < 1) {
    echo "Group skipped - Name: " . $subjectgroupname . " Days: " . $subjectgroupsdayitr;
    continue;
}

2. Schedule Times Invalid

Issue: Class schedule entries missing or incorrect

Cause: Time format validation fails

Fix:

// Ensure proper time format
if (!$day || !$timeform || !$timeto) {
    echo "Schedule invalid - Day: " . $day . " From: " . $timeform . " To: " . $timeto;
    continue;
}

3. Income Type Creation Fails

Issue: Billing integration broken

Cause: SQL injection or missing data

Debug:

-- Check income type creation
SELECT * FROM incometype WHERE studentsubjectid = [SUBJECT_ID];

4. Cascade Deletion Issues

Issue: Related records not properly deleted

Cause: Foreign key constraints or deletion level inconsistency

Fix:

// Verify deletion levels
// Level 2: Primary record deleted
// Level 3: Related records deleted

---

๐Ÿงช Testing Scenarios

Test Case 1: Complete Subject Creation

1. Create subject with basic info
2. Add multiple groups with different prices
3. Set various schedules for each group
4. Verify all records created correctly
5. Check income type integration

Test Case 2: Subject Edit and Update

1. Load existing subject for editing
2. Modify groups and schedules
3. Add new groups/remove existing
4. Save changes
5. Verify updates applied correctly

Test Case 3: Cascade Deletion

1. Create subject with full hierarchy
2. Delete subject
3. Verify all related records marked as deleted
4. Check income type disabled
5. Confirm no orphaned records

Test Case 4: AJAX Data Table

1. Create multiple subjects
2. Test search functionality
3. Test date range filtering
4. Test sorting and pagination
5. Verify action buttons work

---

๐Ÿ“š Related Documentation

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When major changes occur