# Expense Personal/Business Split

**Date:** 2026-05-31  
**Status:** Draft  
**Spec:** 120  
**Tier:** All tiers  
**Depends on:** `expenses-module`, `foundation-auth-rbac`  
**Referenced by:** `expenses-module`, `profitability-reports`

---

## Overview

Expenses can be partially personal and partially business — e.g., a ₪500 dinner where ₪150 is personal. This spec adds a split percentage to each expense entry: the business portion is included in profitability calculations and reimbursement claims; the personal portion is excluded.

---

## Split Model

Each expense has a `business_percent` field (0–100, integer). Default: 100 (fully business).

```
expense.invoice_total = ₪500
expense.business_percent = 70
→ business_amount = ₪350
→ personal_amount = ₪150
```

Split stored on the expense record. Derived columns (`business_amount`, `personal_amount`) computed at query time, not stored.

---

## Expense Form — Split Field

In the expense create/edit form:

```
┌──────────────────────────────────────────────────────────────┐
│  Total amount (receipt)    [₪500.00__________]               │
│                                                              │
│  Business %     [100%]  ← slider + number input              │
│  ████████████████████████████████████████  100%              │
│                                                              │
│  Business amount:  ₪500.00    Personal: ₪0.00                │
│  (calculated live)                                           │
└──────────────────────────────────────────────────────────────┘
```

- Default: 100% business (slider at right, fully green)
- Slider shows: personal portion in red, business in green
- If `business_percent < 100`, "personal" label + amount appears in muted text
- Live calculation updates on every slider/input change

### Split Presets

Quick-select buttons below slider:

```
[100% Business]  [75/25]  [50/50]  [Custom]
```

Clicking a preset snaps the slider. "Custom" = manual input mode.

---

## Expense List View

| Column | Show when |
|--------|-----------|
| Amount (business) | Always |
| Amount (total) | business_percent < 100 — shown muted with "of ₪X.XX total" tooltip |
| Split badge | `business_percent < 100` — e.g., `70% biz` badge on row |

---

## Reporting Impact

All profitability reports, project cost calculations, and reimbursement exports use **business amount only**:

```sql
SUM(invoice_total * business_percent / 100.0) AS business_amount
```

Personal portion never appears in financial calculations.

---

## Reimbursement Claims

When generating reimbursement PDF/export:
- Shows business amount per expense (not total receipt amount)
- Note appended if split: "Receipt total: ₪X.XX (YY% business use)"

---

## Schema Delta

```sql
ALTER TABLE expenses ADD COLUMN business_percent INTEGER NOT NULL DEFAULT 100
  CHECK (business_percent >= 0 AND business_percent <= 100);
-- Split between business and personal use.
-- 100 = fully business (default), 0 = fully personal, 70 = 70% business.
```

Existing expenses default to 100 (no change in behavior).

---

## API

```
POST /api/expenses
     → create expense
       body: { ..., business_percent?: number (0-100, default 100) }
       Requires: expenses:write

PATCH /api/expenses/:id
      → update expense
        body: { ..., business_percent?: number }
        Requires: expenses:write

GET /api/expenses
    → list expenses
      Returns: includes business_percent, computed business_amount = invoice_total * business_percent / 100.0
      Requires: expenses:read
```

---

## Architecture Decisions

| Decision | Choice | Reason |
|----------|--------|--------|
| Integer percent | Not decimal | Granularity of 1% is sufficient; integer avoids floating-point drift in DB |
| Default 100% | Not ask on create | Most expenses are 100% business; requiring split entry for every expense adds friction |
| Computed business_amount | Not stored | Derived from two stored fields; computing at query avoids dual-write and ensures consistency |
| Slider + quick presets | Not text input only | Mixed-use expenses are common (70/30 meals, 50/50 travel); visual slider + presets speed entry significantly |
