EmployeeAttendanceSystems Documentation

Employee Attendance Systems Controller Documentation

File: /controllers/employeeAttendanceSystems.php

Purpose: Manages attendance system configurations and weekly schedules for employee groups

Last Updated: December 20, 2024

Total Functions: 4+

Lines of Code: ~262

---

๐Ÿ“‹ Overview

The Employee Attendance Systems Controller manages the configuration and administration of attendance systems within the ERP. It handles:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**employeeattendancesystem**Attendance system configurationsid, name, numberOfMinutesOfDelayAllowed, takeVacationDays, various discount fields, userid, del, sysdate
**employeeattendancesystemweek**Weekly schedule definitionsid, employeeattendancesystem_id, employee_id, attendancedaynum, attendancedayar, attendancedayen, attendancetime, departuretime, chosseday
### Reference Tables

Table NamePurposeKey Columns
**youtubelink**Tutorial video linksyoutubelinkid, title, url
**user**System usersuserid, username
---

๐Ÿ”‘ Key Functions

1. Default Action / show() - System Management Interface

Location: Line 60

Purpose: Display the main attendance system management interface

Process Flow:

1. Include authentication check

2. Set up Arabic weekday array

3. Assign week data to Smarty template

4. Display add form template

Weekday Configuration:

$week = array(
    "7" => "ุงู„ุณุจุช",   // Saturday
    "1" => "ุงู„ุงุญุฏ",    // Sunday  
    "2" => "ุงู„ุงุซู†ูŠู†",  // Monday
    "3" => "ุงู„ุซู„ุงุซุงุก",  // Tuesday
    "4" => "ุงู„ุงุฑุจุนุงุก", // Wednesday
    "5" => "ุงู„ุฎู…ูŠุณ",   // Thursday
    "6" => "ุงู„ุฌู…ุนู‡"    // Friday
);

---

2. add() - Create New Attendance System

Location: Line 150

Purpose: Create a comprehensive attendance system with penalty structure and weekly schedule

Function Signature:

function add() {
    global $employeeAttendanceSystem;
    global $employeeAttendanceSystemDAO;
}

Process Flow:

1. Populate attendance system object with penalty rates

2. Insert main system record

3. Create 7 weekly schedule records (one per day)

4. Link weekly records to main system

Penalty Configuration Fields:

Weekly Schedule Creation:

for ($i = 1; $i < 8; $i++) {
    $attendancedaynum = (int)filter_input(INPUT_POST, 'attendancedaynum_' . $i);
    $attendancedayar = filter_input(INPUT_POST, 'attendancedayar_' . $i);
    $attendancetime = filter_input(INPUT_POST, 'attendancetime_' . $i);
    $departuretime = filter_input(INPUT_POST, 'departuretime_' . $i);
    $chosseday = filter_input(INPUT_POST, 'chosseday_' . $i);
    
    $week = array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
    
    $employeeattendancesystemweek = R::dispense('employeeattendancesystemweek');
    $employeeattendancesystemweek->attendancedaynum = $attendancedaynum;
    $employeeattendancesystemweek->attendancedayar = $attendancedayar;
    $employeeattendancesystemweek->attendancedayen = $week[$attendancedaynum - 1];
    $employeeattendancesystemweek->attendancetime = $attendancetime;
    $employeeattendancesystemweek->departuretime = $departuretime;
    $employeeattendancesystemweek->employeeattendancesystem_id = $employeeAttendanceid;
    $employeeattendancesystemweek->chosseday = $chosseday;
    $employeeattendancesystemweek->employee_id = 0;
    R::store($employeeattendancesystemweek);
}

---

3. show() - List All Attendance Systems

Location: Line 77

Purpose: Display all configured attendance systems with management options

Process Flow:

1. Include authentication check

2. Query all non-deleted attendance systems

3. Load YouTube tutorial links

4. Assign data to template

5. Display via show.html template

---

4. edit() - Edit Existing Attendance System

Location: Line 102

Purpose: Load and display attendance system for editing

Process Flow:

1. Get system ID from URL parameter

2. Load attendance system data

3. Load associated weekly schedule records

4. Assign data to edit template

Weekly Schedule Loading:

$employeeattendancesystemweek = R::findAll(
    'employeeattendancesystemweek',
    'employeeattendancesystem_id = ? and employee_id = 0',
    [$id]
);

---

5. update() - Update Existing Attendance System

Location: Line 209

Purpose: Update attendance system configuration and weekly schedules

Process Flow:

1. Load existing attendance system

2. Update penalty and configuration fields

3. Update associated weekly schedule records

4. Save changes to database

Weekly Schedule Update:

for ($i = 1; $i < 8; $i++) {
    $employeeattendancesystemweekid = (int)filter_input(INPUT_POST, 'employeeattendancesystemweekid_' . $i);
    $attendancetime = filter_input(INPUT_POST, 'attendancetime_' . $i);
    $departuretime = filter_input(INPUT_POST, 'departuretime_' . $i);
    $chosseday = filter_input(INPUT_POST, 'chosseday_' . $i);

    $employeeattendancesystemweek = R::load('employeeattendancesystemweek', $employeeattendancesystemweekid);
    $employeeattendancesystemweek->attendancetime = $attendancetime;
    $employeeattendancesystemweek->departuretime = $departuretime;
    $employeeattendancesystemweek->chosseday = $chosseday;
    R::store($employeeattendancesystemweek);
}

---

6. delete() - Remove Attendance System

Location: Line 90

Purpose: Delete attendance system by ID

Process Flow:

1. Get system ID from URL parameter

2. Call DAO delete method

3. Redirect to success/error page

---

๐Ÿ”„ Workflows

Workflow 1: Creating New Attendance System

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Create Attendance System
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Display System Configuration Form
- Load weekday translations
- Show penalty structure fields
- Display weekly schedule grid
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Process Main System Configuration
- Set system name and basic settings
- Configure delay allowances
- Set penalty rates for various scenarios
- Define vacation day allowances
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Create Weekly Schedule (7 days)
FOR each day of week (1-7):
โ”‚
โ†’ Set day number and names (AR/EN)
โ†’ Configure attendance time
โ†’ Configure departure time
โ†’ Set work/non-work day flag
โ”‚ โ””โ”€โ†’ Link to main attendance system โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Save Complete Configuration
- Insert main system record
- Insert 7 weekly schedule records
- Set audit fields (userid, sysdate)
- Redirect to success page
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

Workflow 2: Editing Attendance System

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Edit Attendance System
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Load Existing Configuration
- Get system ID from URL parameter
- Load main attendance system record
- Load associated weekly schedule records
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Display Pre-filled Edit Form
- Show current penalty configuration
- Display current weekly schedule
- Allow modification of all settings
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Process Updates
- Update main system configuration
- Update weekly schedule records
- Preserve existing IDs and relationships
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Save Changes
- Update system record via DAO
- Update weekly records via RedBean
- Update audit fields
- Redirect to success page
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty)Default actionDisplay attendance system creation form
`do=add``add()`Create new attendance system
`do=show`List viewDisplay all attendance systems
`do=edit`Edit formDisplay edit form for specific system
`do=update``update()`Update existing attendance system
`do=delete``delete()`Delete attendance system
`do=sucess`Success pageDisplay success message
`do=error`Error pageDisplay error message
### Required Parameters by Action

Edit System (do=edit):

Update System (do=update):

- employeeattendancesystemweekid_{i} - Week record ID

- attendancetime_{i} - Start time

- departuretime_{i} - End time

- chosseday_{i} - Work/non-work flag

Delete System (do=delete):

---

๐Ÿงฎ Calculation Methods

Penalty Rate Configuration

// Example penalty structure for various lateness scenarios
$employeeAttendanceSystem->halfHourLateWithoutPermissionDisount = (float) filter_input(INPUT_POST, 'halfHourLateWithoutPermissionDisount');
$employeeAttendanceSystem->hourLateWithoutPermissionDisount = (float) filter_input(INPUT_POST, 'hourLateWithoutPermissionDisount');
$employeeAttendanceSystem->hourAndHalfLateWithoutPermissionDisount = (float) filter_input(INPUT_POST, 'hourAndHalfLateWithoutPermissionDisount');

Weekly Schedule Time Management

// Default working hours (8:00 AM - 4:00 PM)
$timeNow = "08:00:00";
$timeNowsum8 = "16:00:00";

$smarty->assign('timeNow', $timeNow);
$smarty->assign('timeNowsum8', $timeNowsum8);

Day Number to Name Mapping

$week = array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
$employeeattendancesystemweek->attendancedayen = $week[$attendancedaynum - 1];

---

๐Ÿ”’ Security & Permissions

Authentication

Input Validation

Database Security

---

๐Ÿ“Š Performance Considerations

Database Optimization

1. Efficient Queries:

- Direct loads by ID for edit operations

- Simple queries for non-deleted records

- RedBean ORM for weekly schedule management

2. Index Requirements:

- employeeattendancesystem(id, del)

- employeeattendancesystemweek(employeeattendancesystem_id, employee_id)

Known Performance Issues

---

๐Ÿ› Common Issues & Troubleshooting

1. Weekly Schedule Not Created

Issue: Attendance system created but weekly schedule missing

Cause: Loop counter issue or POST data missing

Debug:

// Check if all 7 days are processed
for ($i = 1; $i < 8; $i++) {
    echo "Processing day: " . $i . "<br>";
    // ... rest of loop
}

2. Penalty Rates Not Saving

Issue: Penalty amounts show as 0 or NULL

Cause: Float conversion failure or field name mismatch

Fix:

// Validate float conversion
$value = filter_input(INPUT_POST, 'halfHourLateWithoutPermissionDisount');
if ($value === false || $value === null) {
    $value = 0.0;
}
$employeeAttendanceSystem->halfHourLateWithoutPermissionDisount = (float) $value;

3. Arabic Weekdays Not Displaying

Issue: Weekday names show as question marks or corrupted

Cause: Character encoding issue

Fix: Ensure UTF-8 encoding in templates and database:

header('Content-Type: text/html; charset=UTF-8');

4. Edit Form Not Loading Data

Issue: Edit form shows empty fields

Cause: System ID not passed correctly or record not found

Debug:

$id = (int) $_GET['id'];
echo "Loading system ID: " . $id;
$loadData = $employeeAttendanceSystemDAO->load($id);
if (!$loadData) {
    echo "System not found!";
}

---

๐Ÿงช Testing Scenarios

Test Case 1: Create Complete Attendance System

1. Access default form (no parameters)
2. Fill in system name and penalty rates
3. Configure weekly schedule for all 7 days
4. Submit form and verify creation
5. Check database for main record and 7 weekly records
6. Verify all penalty amounts saved correctly

Test Case 2: Edit Existing System

1. Create test attendance system
2. Access edit form with system ID
3. Verify all fields pre-filled correctly
4. Modify penalty rates and weekly schedule
5. Submit update and verify changes saved
6. Check that weekly record IDs preserved

Test Case 3: Weekly Schedule Configuration

1. Create system with mixed work/non-work days
2. Set different start/end times per day
3. Verify Arabic and English day names
4. Test with edge cases (midnight times, etc.)
5. Confirm schedule applied to employee groups

Test Case 4: Penalty Structure Validation

1. Test with various penalty amount formats
2. Verify float conversion for different locales
3. Test extreme values (0, negative, very large)
4. Confirm penalty rates applied correctly in attendance

---

๐Ÿ“š Related Documentation

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When major changes occur