# Task 18 — Sales Reports

## Goal
Build comprehensive sales reporting: revenue by period, customer aging, salesperson performance.

---

## Reports to Build

### 1. Sales Revenue Report (upgrade existing)
Already exists. Upgrade to include:
- Discount amounts, tax breakdown
- Payment status filter
- Export option

### 2. Customer Aging Report (NEW — Critical)
Shows how much each customer owes and for how long.

**Query:**
```php
Invoice::join('customers', 'customers.id', '=', 'invoices.customer_id')
    ->where('invoices.payment_status', '!=', 'paid')
    ->whereIn('invoices.status', ['posted', 'partially_paid'])
    ->select([
        'customers.code', 'customers.name',
        'invoices.invoice_number', 'invoices.invoice_date', 'invoices.due_date',
        'invoices.total_amount', 'invoices.paid_amount', 'invoices.balance_amount',
        DB::raw('DATEDIFF(CURDATE(), invoices.due_date) as days_overdue'),
        DB::raw('CASE
            WHEN DATEDIFF(CURDATE(), invoices.due_date) <= 0 THEN "current"
            WHEN DATEDIFF(CURDATE(), invoices.due_date) <= 30 THEN "1_30"
            WHEN DATEDIFF(CURDATE(), invoices.due_date) <= 60 THEN "31_60"
            WHEN DATEDIFF(CURDATE(), invoices.due_date) <= 90 THEN "61_90"
            ELSE "over_90"
        END as aging_bucket'),
    ])
    ->orderBy('customers.code')
    ->orderByDesc('days_overdue')
```

**View columns:** Customer | Invoice # | Date | Due Date | Days | Current | 1-30 | 31-60 | 61-90 | >90 | Total

### 3. Outstanding Invoices
All unpaid/partial invoices for a customer or date range.

### 4. Invoice Register
All invoices for a period — number, date, customer, total, tax, status.

### 5. Payment Register
All payments for a period — number, date, customer, amount, method.

---

## Service: `app/Services/Sales/SalesReportService.php` (extend existing)

Add methods:
```php
public function getAgingReport(array $filters = []): Collection
public function getOutstandingInvoices(array $filters = []): LengthAwarePaginator
public function getInvoiceRegister(array $filters = []): Collection
public function getPaymentRegister(array $filters = []): Collection
public function getRevenueSummary(array $filters = []): array
```

---

## Controller: `app/Http/Controllers/Admin/Sales/SalesReportController.php` (extend existing)

Add methods: aging(), outstanding(), invoiceRegister(), paymentRegister()

---

## Permissions
```
sales.reports.aging.view
sales.reports.outstanding.view
sales.reports.invoice_register.view
sales.reports.payment_register.view
```

---

## Routes
```php
Route::prefix('sales/reports')->as('sales.reports.')->group(function () {
    Route::get('/revenue', [SalesReportController::class, 'revenue'])->name('revenue');
    Route::get('/aging', [SalesReportController::class, 'aging'])->name('aging');
    Route::get('/outstanding', [SalesReportController::class, 'outstanding'])->name('outstanding');
    Route::get('/invoice-register', [SalesReportController::class, 'invoiceRegister'])->name('invoice-register');
    Route::get('/payment-register', [SalesReportController::class, 'paymentRegister'])->name('payment-register');
});
```
