75 lines
4.1 KiB
Markdown
75 lines
4.1 KiB
Markdown
# PLAN: Payroll Parallel Fixes
|
|
|
|
## Overview
|
|
This plan addresses the UI navigation and core payroll computation errors discovered during the parallel testing phase (from `Payroll-Parallel-1.pdf`). It covers resolving the inline PDF download issue, synchronizing LWOP/Leaves/Undertime with the payroll engine, correcting phantom holiday pay, and properly branching computations for Rank & File (Daily Wage) vs. Fixed Salary employees.
|
|
|
|
## Project Type
|
|
**WEB** (Backend & Frontend)
|
|
|
|
## Success Criteria
|
|
- [ ] Users can download payslips properly and navigate back without refreshing the page.
|
|
- [ ] Tardiness, LWOP, Undertime, and Approved Leaves reflect accurately in the payslip's deduction and summary sections.
|
|
- [ ] Holiday Pay only applies when actual holidays are set and valid.
|
|
- [ ] Rank & File (Daily Wage) employees have their salary computed correctly `(Daily Rate x Days Worked)` instead of `(Monthly / 2)`.
|
|
|
|
## Tech Stack
|
|
- **Frontend:** React, TypeScript, Inertia.js (for UI/Navigation fixes)
|
|
- **Backend:** Laravel, PHP, MySQL (for `PayrollService.php` computations)
|
|
|
|
## File Structure (Anticipated Changes)
|
|
- `app/Http/Controllers/PayslipController.php` (or equivalent backend file returning PDF)
|
|
- `resources/js/pages/...` (Frontend view component handling the Payslip UI)
|
|
- `app/Services/PayrollService.php`
|
|
|
|
## Task Breakdown
|
|
|
|
### Phase 1: UI / Navigation Fix
|
|
- **task_id:** 1.1
|
|
- **name:** Fix Payslip Download Header & Navigation
|
|
- **agent:** `@frontend-specialist`
|
|
- **skills:** `react-best-practices`
|
|
- **priority:** HIGH
|
|
- **dependencies:** None
|
|
- **INPUT:** `PayslipController` PDF response and frontend payslip view component.
|
|
- **OUTPUT:** Change `inline` to `attachment` header (or add a distinct download endpoint). Implement `window.history.back()` or Inertia Link for the back button.
|
|
- **VERIFY:** Clicking download saves the PDF to the user's local disk; users can click "Back" to return to the list without a hard refresh.
|
|
|
|
### Phase 2: Native Attendance Recalculation (No Legacy DB)
|
|
- **task_id:** 2.1
|
|
- **name:** Recalculate Late/Undertime Natively
|
|
- **agent:** `@backend-specialist`
|
|
- **skills:** `clean-code`
|
|
- **priority:** CRITICAL
|
|
- **dependencies:** None
|
|
- **INPUT:** `AttendanceRecord` and `Shift` models
|
|
- **OUTPUT:** Write a one-time script/command that loops through all current local `attendance_records`. It will compare the actual `clock_in` time against the assigned `Shift`'s `start_time`, and natively compute and save the exact `late_hours` and `is_late` values directly. No legacy database needed.
|
|
- **VERIFY:** Generate a test payslip for Paul Rei Paas and verify the late penalty precisely matches his tardiness minutes based on his local clock-in data.
|
|
|
|
### Phase 3: Leave and Holiday Reconciliation
|
|
- **task_id:** 3.1
|
|
- **name:** Correct Leave Display and Phantom Holiday Pay
|
|
- **agent:** `@backend-specialist`
|
|
- **skills:** `clean-code`
|
|
- **priority:** HIGH
|
|
- **dependencies:** Task 2.1
|
|
- **INPUT:** `PayrollService.php`
|
|
- **OUTPUT:** Fix the holiday calculation query to only include system-defined holidays for the specific cut-off date range. Ensure Sick, Vacation, and Birthday leaves are pulled into the attendance summary payload.
|
|
- **VERIFY:** Generate a payslip for Ana Regina Mariano and confirm zero Holiday Pay is added, and her Birthday Leave is reflected in the summary.
|
|
|
|
### Phase 4: Daily Wage Computation Branching
|
|
- **task_id:** 4.1
|
|
- **name:** Branch Logic for Rank & File Earners
|
|
- **agent:** `@backend-specialist`
|
|
- **skills:** `clean-code`
|
|
- **priority:** CRITICAL
|
|
- **dependencies:** None
|
|
- **INPUT:** `PayrollService.php`
|
|
- **OUTPUT:** Implement an `if ($employee->type === 'daily_wage')` branch. Calculate gross pay as `(Daily Rate x Days Worked)` instead of the default fixed cut-off logic.
|
|
- **VERIFY:** Run a test generation for Dinh Chavez (Rank & File) and verify the gross pay explicitly equals their specific Daily Rate multiplied by their exact days worked.
|
|
|
|
## Phase X: Verification
|
|
- [ ] Run `python .agent/scripts/lint_runner.py .`
|
|
- [ ] Run `python .agent/scripts/test_runner.py .`
|
|
- [ ] Manual test: Verify Payslip UI.
|
|
- [ ] Manual test: Verify PDF data calculations match expected outputs.
|