# 🚀 Soft Deletes - Quick Reference Card

## ⚡ For New Modules (Copy & Paste)

### **1. Model (REQUIRED)**
```php
use Illuminate\Database\Eloquent\SoftDeletes;

class YourModel extends Model
{
    use SoftDeletes;  // ← Add this line
}
```

### **2. Migration (REQUIRED)**
```php
Schema::create('your_table', function (Blueprint $table) {
    $table->id();
    // ... your columns ...
    $table->timestamps();
    $table->softDeletes();  // ← Add this line
});
```

### **3. Controller (RECOMMENDED)**
```php
use App\Http\Traits\SoftDeletesTrait;

class YourController extends Controller
{
    use SoftDeletesTrait;  // ← Add this line
    
    public function index(Request $request)
    {
        $query = YourModel::query();
        $items = $this->applySoftDeleteFilter($query, $request)
                      ->paginate(20);
        return view('...', compact('items'));
    }
    
    public function restore($id)
    {
        return $this->restoreModel(
            YourModel::class, 
            $id, 
            'admin.your-route.index',
            'Restored!'
        );
    }
}
```

### **4. Route (REQUIRED)**
```php
Route::resource('your-route', YourController::class);
Route::post('your-route/{id}/restore', [YourController::class, 'restore'])
     ->name('admin.your-route.restore');
```

### **5. View Header (RECOMMENDED)**
```blade
<div class="d-flex justify-content-between">
    <h2>Your Items</h2>
    <div>
        @if(request('trashed'))
            <a href="{{ route('admin.your-route.index') }}" class="btn btn-secondary">
                Back to Active
            </a>
        @else
            <a href="{{ route('admin.your-route.index', ['trashed' => 1]) }}" 
               class="btn btn-outline-danger">
                View Deleted
            </a>
            <a href="{{ route('admin.your-route.create') }}" class="btn btn-primary">
                Add New
            </a>
        @endif
    </div>
</div>
```

### **6. View Actions Column (REQUIRED)**
```blade
<td>
    @if(request('trashed'))
        <form action="{{ route('admin.your-route.restore', $item->id) }}" method="POST" class="d-inline">
            @csrf
            <button class="btn btn-sm btn-outline-success">Restore</button>
        </form>
    @else
        <a href="{{ route('admin.your-route.edit', $item) }}" class="btn btn-sm btn-outline-primary">
            Edit
        </a>
        <form action="{{ route('admin.your-route.destroy', $item) }}" method="POST" class="d-inline">
            @csrf
            @method('DELETE')
            <button class="btn btn-sm btn-outline-danger">Delete</button>
        </form>
    @endif
</td>
```

---

## 🔍 Query Cheat Sheet

```php
// Get active only (default)
YourModel::all();
YourModel::where('status', 'active')->get();

// Include deleted
YourModel::withTrashed()->get();
YourModel::withTrashed()->find(1);

// Only deleted
YourModel::onlyTrashed()->get();
YourModel::onlyTrashed()->find(1);

// Restore
$item = YourModel::withTrashed()->find(1);
$item->restore();

// Force delete (permanent!)
$item->forceDelete();

// Check if deleted
$item->trashed(); // returns true/false
```

---

## ✅ Checklist for New Module

- [ ] Added `use SoftDeletes;` to model
- [ ] Added `$table->softDeletes();` to migration  
- [ ] Added `use SoftDeletesTrait;` to controller
- [ ] Added restore method to controller
- [ ] Added restore route
- [ ] Added "View Deleted" button to view
- [ ] Added "Restore" button for deleted items
- [ ] Tested delete → view deleted → restore flow

---

## 🎯 Remember

- ✅ **NEVER** permanently delete (unless explicitly required)
- ✅ **ALWAYS** use soft deletes
- ✅ **ALL** tables must have deleted_at column
- ✅ **ALL** models must have SoftDeletes trait

---

**See `SOFT_DELETES_STANDARD.md` for complete documentation.**







