New docs/FEATURES.md covers all 15 feature areas: dashboard, attendance, work history, payroll, payments, adjustments, loans, worker lookup, worker management, team schedules, receipts, emails/PDFs, auth, exports, and deployment tools. CLAUDE.md updated with accurate line count. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
16 KiB
16 KiB
FoxFitt LabourPay v5 — Features Guide
A complete guide to every feature in the payroll management system for FoxFitt Construction.
1. Dashboard (Home Page)
URL: / (after login)
Admin View
- Outstanding Payments stat card — total unpaid wages with breakdown (wages + additions - deductions)
- Paid This Month stat card — total payments made in current month
- Active Loans & Advances stat card — count and total balance
- Outstanding by Project — breakdown of unpaid amounts per project
- Quick Action buttons — Log Work, Run Payroll, View History
- This Week Summary — count of work logs created this week
- Recent Activity — last 10 work logs with project, date, worker count, supervisor badge
- Manage Resources — tabbed panel (Workers / Projects / Teams) with:
- Active / Inactive / All filter buttons
- Toggle switches to activate/deactivate items (AJAX, no page reload)
- Export Workers CSV button
Supervisor View (simplified)
- My Projects, My Teams, My Workers counts
- This Week Summary and Recent Activity (limited to their own projects/teams)
- No payroll access, no resource management toggles
2. Attendance Logging
URL: /attendance/log/
Access: Supervisors and Admins
Features
- Date Range Support — set a start date and optional end date to log multiple days at once
- Weekend Controls — checkboxes to include Saturdays and/or Sundays in date range
- Project Selection — dropdown of active projects (supervisors see only their assigned projects)
- Team Auto-Select — choosing a team auto-checks all its members in the worker list
- Worker Multi-Select — scrollable checkbox list of active workers
- Overtime — dropdown: None, 1/4 Day, 1/2 Day, 3/4 Day, Full Day
- Notes — free text field for any additional info
- Conflict Detection — if any selected worker already has a log on the selected date+project:
- Warning shown with list of conflicts
- Two options: "Skip Conflicts" (create only non-conflicting) or "Overwrite Existing"
- Estimated Cost (Admin only) — live-updating card showing: R amount, N workers x M days. Recalculates as selections change. Does not include overtime.
3. Work History
URL: /history/
Access: All logged-in users (supervisors see only their projects)
List View
- Table: Date, Project, Team, Workers (count), Supervisor, Amount, Payment Status (Paid/Unpaid badge)
- Filters: Worker dropdown, Project dropdown, Payment Status (All / Paid / Unpaid)
- Filter feedback bar: "Showing X of Y work logs" with active filter badges and clear button
- CSV export button (preserves active filters)
Calendar View
- Monthly grid with previous/next navigation
- Each day shows: work log count badge, first 3 project indicators, "+X more" for overflow
- Colour coding: green checkmark (paid), orange clock (unpaid)
- Today's cell highlighted
- Click a day to see full details in a panel below
- Multi-day selection: click multiple days to see combined totals
- Footer: total days, total logs, unique workers, total amount (admin only)
CSV Export
- Work Logs CSV (
/history/export/) — Date, Project, Team, Workers, Supervisor, Worker Count, Daily Cost, Payment Status - Workers CSV (
/workers/export/, admin only) — Name, ID Number, Phone, Monthly Salary, Daily Rate, Employment Date, Active, Notes, Shoe Size, Overall Top Size, Pants Size, T-Shirt Size, Has Drivers License
4. Payroll Dashboard
URL: /payroll/
Access: Admin only
Header Buttons
- Worker Lookup — opens modal to view any worker's financial report card
- Batch Pay — pay multiple workers at once based on pay schedules
- Add Adjustment — create bonuses, deductions, loans, advances
- Price Overtime — convert unpriced overtime entries into Overtime adjustments
Analytics Cards
- Outstanding Payments — total unpaid with breakdown (wages + additions - deductions)
- Paid (Last 60 Days) — recent payment total
- Active Loans & Advances — count + total remaining balance
- Outstanding by Project — per-project unpaid amounts
Charts
- Monthly Payroll — line chart of monthly totals, with toggle to view by individual worker (dropdown selector)
- Cost by Project — monthly project cost breakdown
Three Tabs
Tab 1: Pending Payments
- Filter Bar:
- Team dropdown (All Teams or specific team)
- "Overdue only" checkbox (shows workers with unpaid work from completed pay periods)
- Loan filter dropdown (All Workers / With loans only / Without loans)
- Table Columns: Worker, Days, Day Rate, Log Amount, Adjustments (colour-coded badges), Net Adj, Total, Actions
- Row Badges:
- Red "Overdue" — worker has unpaid work from a completed pay period
- Yellow "Loan" — worker has an active loan or advance
- Action Buttons per Worker:
- Preview (eye icon) — opens Payslip Preview modal
- Adjust (slider icon) — opens Add Adjustment modal pre-filled with this worker and their last project
- Pay (green button) — processes payment for all pending items immediately
Tab 2: Payment History
- Table: Date, Worker, Amount Paid, Work Logs (count), Adjustments (badges), View Payslip link
- Worker names are clickable (opens Worker Lookup modal)
Tab 3: Loans & Advances
- Sub-filter: Active / History toggle buttons
- Table: Worker, Type (Loan/Advance badge), Principal, Balance, Date, Reason, Status (Active/Paid Off)
- Worker names are clickable (opens Worker Lookup modal)
5. Payment Processing
Individual Payment
- Click "Pay" on a worker's pending row — processes all unpaid work logs and adjustments
- Creates a PayrollRecord linking the worker, their work logs, and adjustments
- Generates HTML + PDF payslip and emails to Spark Receipt
- Atomic transaction with
select_for_update()to prevent duplicate payments
Payslip Preview Modal ("Worker Payment Hub")
- Opened via the Preview (eye) button on pending payments
- Shows: worker name, ID, days worked, day rate, log amount
- Work Logs list with checkboxes (all checked by default) — uncheck to exclude from payment
- Adjustments list with checkboxes — uncheck to exclude
- Split at Pay Date button — auto-unchecks items after the last completed pay period cutoff (useful for paying only what's due)
- Active Loans section — shows outstanding balances with inline repayment forms
- Net Pay total — updates live as items are checked/unchecked
- Pay Selected button — processes only checked items (split payslip)
Batch Pay
- Opened via "Batch Pay" button in header
- Two modes (radio buttons):
- Until Last Paydate (default) — splits at each worker's last completed pay period; workers without team schedules are skipped
- Pay All — includes all unpaid items regardless of date
- Team filter — pay only workers in a specific team
- Loan filter (3 options) — All Workers / With loans only / Without loans
- Preview shows list of workers and amounts before confirming
- Processes each worker in independent atomic transactions
- Emails sent after all payments complete
6. Payroll Adjustments
Types
| Type | Effect | Auto-created? | Details |
|---|---|---|---|
| Bonus | Additive (+) | No | Requires a linked project |
| Deduction | Deductive (-) | No | Requires a linked project |
| Overtime | Additive (+) | Yes | Created by "Price Overtime" from unpriced OT entries |
| New Loan | Additive (+) | No | Creates a Loan record. "Pay Immediately" checkbox (default: checked) auto-processes and emails payslip |
| Advance Payment | Additive (+) | No | Auto-processed immediately (never sits in pending). Creates Loan + PayrollRecord + emails payslip. Auto-creates an Advance Repayment for next salary |
| Loan Repayment | Deductive (-) | Yes | Created from payslip preview inline form. Linked to a Loan |
| Advance Repayment | Deductive (-) | Yes | Auto-created when an advance is paid |
Add Adjustment Modal
- Type dropdown, Project (required for some types), Amount, Date, Description
- Worker multi-select with checkboxes (team helper to select all team members)
- "Pay Immediately" checkbox appears for New Loan type (checked by default)
Quick Adjust Button
- Each pending payments row has an "Adjust" button (slider icon)
- Opens Add Adjustment modal with the worker pre-checked and their most recent project pre-selected
- Header "Add Adjustment" button resets modal to clean state
Edit/Delete Adjustments
- Click any adjustment badge in the pending payments table to edit
- Can change type, project, amount, date, description
- Delete button with confirmation modal
- Only unpaid adjustments can be edited/deleted
Price Overtime
- Opens modal showing all unpriced overtime work log entries
- Filter by worker name
- Table: Worker, Date, Project, OT Amount, Day Rate, Total
- Checkboxes to select which entries to price
- Price multiplier input (default 1.5x)
- Creates Overtime-type PayrollAdjustments for selected entries
7. Loans & Advances
New Loan Flow
- Create via Add Adjustment → type "New Loan"
- "Pay Immediately" checkbox (checked by default):
- Checked: Creates Loan + PayrollRecord + emails payslip to Spark immediately
- Unchecked: Creates Loan, sits in Pending Payments for next pay cycle
- Editing a loan adjustment syncs amount/balance/reason on the Loan record
- Deleting cascades to Loan + any unpaid repayments
Advance Payment Flow
- Create via Add Adjustment → type "Advance Payment"
- Always auto-processed immediately (no pending state)
- Creates Loan (type='advance') + PayrollRecord + emails payslip
- Auto-creates an "Advance Repayment" adjustment for next salary cycle
- Requires at least one unpaid work log (otherwise use New Loan)
Repayments
- From Payslip Preview: Inline form to add repayment against any active loan
- Loan Repayment: Manual deduction linked to a specific loan
- Advance Repayment: Auto-created, deducts from advance balance during payment processing
- Partial Repayment: If an advance is only partially repaid, the Loan's type changes from 'advance' to 'loan' so the remainder is tracked as a regular loan
Loans Tab
- Active loans: shows all current outstanding loans/advances
- History: shows all loans including paid-off ones
- Columns: Worker, Type, Principal, Balance, Date, Reason, Status
8. Worker Lookup Modal
Trigger: Click any worker name on the payroll dashboard, or click the "Worker Lookup" button
Report Card Contents
- Identity: Name, ID number, phone, employment date, team, current project + days on project
- Quick Stats (4 cards):
- Amount Payable (unpaid earnings + net adjustments)
- Outstanding Loans (total remaining balance)
- Paid This Month
- Loans This Year (total principal issued)
- Recent Activity:
- Last payslip paid (date + amount)
- Last loan given (date + amount + reason)
- Last loan repayment (date + amount)
- Last advance paid (date + amount)
- Active Loans Table (if any): Type, Amount, Balance, Date, Reason
- Paid This Year total
- Sizing & Info: Shoe size, Overall Top, Pants, T-Shirt, Drivers License status, Notes
Features
- Searchable worker dropdown to switch between workers without closing the modal
- Worker names are clickable links throughout the dashboard (Pending Payments, Payment History, Loans tabs)
9. Worker Management
Location: Django Admin (/admin/core/worker/) and Dashboard Manage Resources panel
Worker Fields
| Section | Fields |
|---|---|
| Personal Info | Name, ID Number, Phone, Monthly Salary, Employment Date, Active, Notes |
| Sizing | Shoe Size, Overall Top Size, Pants Size, T-Shirt Size |
| Documents & License | Photo (image), ID Document (file), Has Drivers License (checkbox), Drivers License (file) |
Admin Features
- Fieldsets organise fields into 3 sections
- List view: Name, ID Number, Monthly Salary, Active
- Filters: Active status, Has Drivers License
- Search: Name, ID Number, Phone Number
Dashboard Toggle
- Manage Resources panel on main dashboard
- Toggle switches to activate/deactivate workers (AJAX)
- Active / Inactive / All filter buttons
Computed Properties
daily_rate= monthly_salary / 20 working days
10. Team Pay Schedules
Configuration
- Each team has optional
pay_frequency(Weekly / Fortnightly / Monthly) andpay_start_date(anchor date) - Set via Django Admin (editable directly in the team list view)
How It Works
pay_start_dateis an anchor — the first day of the very first pay period (never needs updating)- The system steps forward from the anchor to find the current period
- Weekly = 7 days, Fortnightly = 14 days, Monthly = calendar month stepping
- Handles month-length edge cases using
calendar.monthrange()
Impact on Features
- Overdue Detection: Workers with unpaid work from completed pay periods get a red "Overdue" badge
- Split at Pay Date: Preview modal button auto-unchecks items after the cutoff date
- Batch Pay (Until Last Paydate): Only pays items within completed pay periods
- Cutoff date = last day of the most recently completed period (includes ALL overdue work)
11. Expense Receipts
URL: /receipts/create/
Access: All staff (admin + supervisors)
Form Fields
- Date, Vendor Name, Payment Method (Cash/Card/EFT/Other), Description
- Dynamic Line Items — add/remove rows with Product Name + Amount
- VAT Options — radio buttons: Included (15% extracted) / Excluded (15% added) / None
Live Calculations
- Subtotal, VAT amount, and Total update in real-time as you type
- VAT calculation adjusts based on Included/Excluded selection
On Submit
- Saves ExpenseReceipt + ExpenseLineItems to database
- Generates HTML email + PDF attachment
- Emails to Spark Receipt (spark@sparkreceipthq.com)
12. Email & PDF Generation
Payslip Email
- Sent to: Spark Receipt (for record-keeping)
- Content: Worker name, ID, payment date, base pay, all adjustments, net pay
- Attachment: PDF payslip
- Three variants: Regular (work + adjustments), Advance-only, Loan-only
Receipt Email
- Sent to: Spark Receipt
- Content: Vendor, date, payment method, line items, VAT breakdown, total
- Attachment: PDF receipt
Payslip Detail Page
- URL:
/payroll/payslip/<id>/ - Print-friendly view of a completed payslip
- Accessible from Payment History tab "View" button
13. Authentication & Permissions
Roles
| Role | Access |
|---|---|
| Admin (is_staff or is_superuser) | Full access: payroll, adjustments, resource management, exports |
| Supervisor (assigned to projects) | Attendance logging, work history (own projects only), expense receipts |
Permission Groups (created by setup_groups command)
- Admin — full CRUD on all core models
- Work Logger — add/change/view WorkLog; view-only on Project/Worker/Team
Authentication
- Django built-in auth at
/accounts/login/ - All views require login except
/import-data/ - Login redirects to dashboard (
/)
14. Data Exports
| Export | URL | Format | Access | Contents |
|---|---|---|---|---|
| Work Logs | /history/export/ |
CSV | Supervisor+ | Date, Project, Team, Workers, Supervisor, Cost, Status |
| Workers | /workers/export/ |
CSV | Admin | Name, ID, Phone, Salary, Rate, Dates, Sizes, License |
Both exports respect active filters (work log export preserves filter parameters in URL).
15. Setup & Deployment Tools
| Feature | URL | Purpose |
|---|---|---|
| Import Data | /import-data/ |
One-time: loads production worker data from JSON fixtures |
| Run Migrate | /run-migrate/ |
Applies pending database migrations on production (for when Flatlogic doesn't auto-apply) |
| Setup Groups | manage.py setup_groups |
Creates Admin + Work Logger permission groups |
| Setup Test Data | manage.py setup_test_data |
Populates sample workers, projects, teams, work logs |
| Import Production Data | manage.py import_production_data |
Imports real production data (14 workers) |