# BUG REPORT & ISSUES FOUND

---

## 🔴 CRITICAL BUGS (Fix Immediately)

### 1. **Password Reset View Missing**
**Location:** `routes/web.php` line ~60  
**Severity:** 🔴 CRITICAL

**Issue:**
```php
Route::get('/forgot-password', fn() => view('auth.forgot-password'))->name('password.request');
```

**Problem:**
- View file does not exist: `resources/views/auth/forgot-password.blade.php`
- User gets 500 error or blank page when clicking "Forgot Password"
- Password reset workflow incomplete

**Impact:** Users cannot reset password, support requests increase

**Fix:**
```
1. Create: resources/views/auth/forgot-password.blade.php
2. Create: resources/views/auth/reset-password.blade.php
3. Implement: PasswordResetController
4. Add: Mail notification for password reset
5. Test: Full flow end-to-end
```

---

### 2. **Email System Not Configured for Production**
**Location:** `config/mail.php`  
**Severity:** 🔴 CRITICAL

**Issue:**
```php
'default' => env('MAIL_MAILER', 'log'),
```

**Problem:**
- Default is 'log' driver (development)
- ALL emails only written to log files, not sent
- Users never receive:
  - Welcome emails
  - Payment confirmations
  - Password reset links
  - Any notifications

**Current Status:**
```
.env: 
MAIL_MAILER=log  // ← DEFAULT, should not be this for production
MAIL_HOST=
MAIL_USER=
MAIL_PASSWORD=
```

**Impact:** Complete email system failure in production

**Fix:**
```env
# .env.example and .env must have:
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io  # or your SMTP provider
MAIL_PORT=587
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_FROM_ADDRESS=noreply@finanalysis.id
MAIL_FROM_NAME="FIN-Analysis"

# Document in README
# Create .env.example dengan template yang benar
```

---

### 3. **User Banning Not Enforced**
**Location:** Multiple files  
**Severity:** 🔴 CRITICAL

**Issue:**
```php
// User model has is_banned field
public function isBanned(): bool
{
    return (bool) $this->is_banned;
}

// But NOT USED ANYWHERE to block access
```

**Problem:**
- Admin can ban user but user can still login
- Banned user can still make analyses
- Banned user can still access all features
- No middleware to enforce ban

**Current Implementation:**
```
✅ Field dalam database
✅ Helper method
❌ No middleware check
❌ No route protection
❌ No controller enforcement
```

**Impact:** Security issue - banned users can abuse system

**Fix:**
```php
// Create middleware: app/Http/Middleware/CheckUserBanned.php
class CheckUserBanned
{
    public function handle(Request $request, Closure $next)
    {
        if (auth()->check() && auth()->user()->isBanned()) {
            auth()->logout();
            return redirect('/login')
                ->with('error', 'Your account has been banned.');
        }
        return $next($request);
    }
}

// Register in Kernel:
protected $middleware = [
    // ...
    \App\Http\Middleware\CheckUserBanned::class,
];

// Or on routes:
Route::middleware(['auth', 'check.user.banned'])...
```

---

### 4. **Dashboard Export Button Non-Functional**
**Location:** `app/Http/Controllers/DashboardController.php` line ~145  
**Severity:** 🔴 CRITICAL

**Issue:**
```php
public function export()
{
    // Stub — implementasi export di sini
    return back()->with('info', 'Fitur export sedang dalam pengembangan.');
}
```

**Problem:**
- Button in UI but no functionality
- User clicks → message "Feature in development"
- False expectations

**Impact:** User frustration, incomplete feature

**Fix:**
**Option A:** Implement export feature (see FITUR_YANG_MISSING.md)
**Option B:** Hide button until ready:
```html
<!-- In dashboard view -->
<!-- Hide button if feature not ready -->
@if(false) <!-- @if(feature_enabled('dashboard_export')) -->
    <a href="{{ route('dashboard.export') }}" class="btn-export">
        Export Data
    </a>
@endif
```

---

### 5. **Division by Zero in Z-Score Calculation**
**Location:** `app/Services/AltmanZScoreService.php` line 32-33  
**Severity:** 🔴 CRITICAL

**Issue:**
```php
public function calculateComponents(array $financialData): array
{
    $totalAset = $financialData['total_aset'] ?? 1;  // ← Masks problem
    
    // Later...
    $totalUtang = $financialData['total_utang'] ?? 1;  // ← Masks problem
    
    // If both are 0, X4 calculation could fail
    $x4 = $financialData['nilai_buku_ekuitas'] / $totalUtang;
}
```

**Problem:**
- Defaulting to 1 hides data validation errors
- Invalid financial data proceeds silently
- Results are mathematically wrong
- No error reporting

**Impact:** Silent calculation errors, wrong analysis results

**Fix:**
```php
public function calculateComponents(array $financialData): array
{
    // Validate required fields
    $requiredFields = [
        'aset_lancar', 'utang_lancar', 'total_aset', 
        'total_utang', 'nilai_buku_ekuitas', 'pendapatan'
    ];
    
    foreach ($requiredFields as $field) {
        if (!isset($financialData[$field]) || $financialData[$field] < 0) {
            throw new \InvalidArgumentException(
                "Invalid financial data: {$field} is missing or negative"
            );
        }
    }
    
    // Validate total asset > 0
    if ($financialData['total_aset'] <= 0) {
        throw new \InvalidArgumentException('Total aset harus lebih dari 0');
    }
    
    // Calculate safely
    $x1 = ($financialData['aset_lancar'] - $financialData['utang_lancar'])
        / $financialData['total_aset'];
    
    // ... etc
}
```

---

### 6. **Admin Routes Incomplete**
**Location:** `routes/web.php` lines 150-180  
**Severity:** 🔴 CRITICAL

**Issue:**
```php
// Only these admin controllers imported:
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Admin\AnalysisController;
use App\Http\Controllers\Admin\SettingsController;
use App\Http\Controllers\Admin\ContactController;

// But missing routes for CRUD operations
// Routes not defined properly
```

**Problem:**
- Admin cannot fully manage users (edit endpoint missing?)
- Admin cannot delete analyses or companies
- No admin page to manage contact messages
- Incomplete admin functionality

**Impact:** Admin cannot properly moderate/manage system

**Fix:**
```php
// Complete admin routes:
Route::middleware(['auth', 'admin'])->prefix('admin')->name('admin.')->group(function () {
    Route::get('/', [AdminDashboardController::class, 'index'])->name('dashboard');
    
    // User Management
    Route::resource('users', AdminUserController::class);  // Creates all CRUD routes
    Route::post('users/{user}/ban', [AdminUserController::class, 'ban'])->name('users.ban');
    Route::post('users/{user}/unban', [AdminUserController::class, 'unban'])->name('users.unban');
    
    // Analysis Monitoring
    Route::resource('analyses', AdminAnalysisController::class, ['only' => ['index', 'show', 'destroy']]);
    
    // Settings
    Route::resource('settings', AdminSettingsController::class);
    
    // Contact Messages
    Route::resource('contacts', AdminContactController::class, ['only' => ['index', 'show', 'destroy']]);
    Route::post('contacts/{contact}/mark-read', [AdminContactController::class, 'markRead']);
});
```

---

### 7. **Session-Based Analysis Can Cause Data Loss**
**Location:** `app/Http/Controllers/AnalysisController.php`  
**Severity:** 🟡 HIGH

**Issue:**
```php
public function saveStep1(Request $request)
{
    // Validation...
    Session::put('analysis.company', $validated);  // ← Stored in session
    return redirect()->route('analysis.step2');
}

public function saveStep2(FinancialDataRequest $request)
{
    // Validation...
    Session::put('analysis.financial', $data);  // ← Stored in session
    return redirect()->route('analysis.result');
}

public function result()
{
    // Get from session
    $companyData = Session::get('analysis.company');
    $financialData = Session::get('analysis.financial');
    
    // Only THEN create in database
    AnalysisResult::create([...]);
}
```

**Problem:**
- If session expires between steps → data lost
- If user closes browser → session cleared
- If server restarts → session data might be lost
- Bad UX: have to start over

**Impact:** User frustrates, data loss

**Fix:**
```php
// Store directly in database instead:
// Create 'draft' analyses

public function saveStep1(Request $request)
{
    $draft = DraftAnalysis::create([
        'user_id' => Auth::id(),
        'company_data' => $request->validated(),
    ]);
    return redirect()->route('analysis.step2', $draft->id);
}

public function saveStep2(Request $request, $draftId)
{
    $draft = DraftAnalysis::findOrFail($draftId);
    $draft->update(['financial_data' => $request->validated()]);
    return redirect()->route('analysis.result', $draft->id);
}

public function result($draftId)
{
    $draft = DraftAnalysis::findOrFail($draftId);
    
    // Create final analysis from draft
    $analysis = AnalysisResult::create([...]);
    
    // Delete draft
    $draft->delete();
}

// Benefits:
// ✅ Auto-save capability
// ✅ Data persistence
// ✅ Recovery from crashes
// ✅ Track analytics
// ✅ Ability to continue later
```

---

## 🟡 MEDIUM PRIORITY ISSUES

### 8. **No Middleware to Protect Admin Routes**
```php
// Admin routes have NO middleware to check if user is admin!
// Anyone logged in could access if they guess URL

Fix:
Route::middleware(['auth', 'admin'])->prefix('admin')->group(function () {
    // ...
});

// And create middleware:
class CheckAdmin {
    public function handle($request, $next) {
        if (!auth()->user()?->isAdmin()) {
            abort(403);
        }
        return $next($request);
    }
}
```

---

### 9. **No Rate Limiting**
```
Missing protection against:
- Brute force login attacks
- API spam
- File upload attacks
- Form submission spam

Fix: Add to controllers:
public function login(LoginRequest $request)
{
    RateLimiter::hit('login-attempts:' . $request->ip());
    
    if (RateLimiter::tooManyAttempts('login-attempts:' . $request->ip(), 5)) {
        throw ValidationException::withMessages([
            'email' => 'Too many login attempts. Try again in 1 minute.',
        ]);
    }
    
    // ... login logic
}
```

---

### 10. **Two-Factor Authentication Missing**
```
Users with admin access should require 2FA
Or at least optional 2FA for all users

Missing:
- TOTP setup (authenticator apps)
- Backup codes
- 2FA enforcement policy
```

---

### 11. **No Input Validation on Search**
```php
// SearchController doesn't exist or incomplete
// Could have:
- SQL injection vulnerabilities
- Large input attacks
- Invalid filter values
```

---

### 12. **No Email Verification**
```
User model has email_verified_at field but:
- Never verified
- Non-verified users can access everything
- Allows fake email registrations
- Could be abuse vector
```

---

### 13. **Webhook Signature Not Verified**
```php
// MidtransService::handleNotification() incomplete
// Webhook could be spoofed by attacker
// Payment status could be faked

Fix: Verify signature before processing
```

---

### 14. **Database Relationships Incomplete**
```
Missing relationships:
- User → Company (user has many companies)
- User → Subscription (relationship exists but incomplete)

Table creation appears minimal:
Schema::create('companies', function (Blueprint $table) {
    $table->id();
    $table->timestamps();
});
// ✗ Missing all fields!
```

---

## 🟠 LOW PRIORITY ISSUES

### 15. **No Automated Tests**
```
Tests directory exists but:
- tests/Feature/ empty
- tests/Unit/ empty
- No test coverage
- No CI/CD integration
```

---

### 16. **Missing Views/Partial Implementation**
```
- resources/views/auth/forgot-password.blade.php (missing)
- resources/views/auth/reset-password.blade.php (missing)
- Some admin views might be incomplete
```

---

### 17. **No Database Indexes**
```
Performance issue: Queries without indexes

Should add:
- users: email, created_at
- analysis_results: user_id, company_id, z_category, created_at
- subscriptions: user_id, status, expired_at
- companies: user_id, business_field
```

---

### 18. **No Error Monitoring**
```
No integration with:
- Sentry (error tracking)
- Rollbar (error reporting)
- New Relic (performance)
- DataDog (monitoring)
```

---

### 19. **Incomplete Payment Flow**
```
MidtransService has:
- createSnapToken() ✅
- handleNotification() ❌ incomplete

Missing:
- Payment retry logic
- Failed payment handling
- Payment timeout handling
- Payment status checking
```

---

### 20. **No User Activity Logging**
```
Cannot track:
- When user created analysis
- When user downloaded report
- When user logged in/out
- When user changed settings
```

---

## 📋 QUICK FIX CHECKLIST

### This Week (Critical):
- [ ] Create password reset view
- [ ] Configure mail driver for SMTP
- [ ] Add user ban enforcement middleware
- [ ] Remove or hide export button
- [ ] Add input validation validation to Z-Score calculation
- [ ] Complete admin routes
- [ ] Add admin middleware protection
- [ ] Fix session-based analysis storage

### Next Week (Important):
- [ ] Add rate limiting
- [ ] Implement email verification
- [ ] Verify Midtrans webhook signatures
- [ ] Add database indexes
- [ ] Fix incomplete relationships
- [ ] Write unit tests

### Later (Nice-to-have):
- [ ] Add 2FA
- [ ] Implement audit logging
- [ ] Setup error monitoring
- [ ] Add activity logging
- [ ] Optimize queries

---

## 🧪 Testing Checklist

Before production, test these:

```
Authentication:
[ ] Register new user → verify email sent
[ ] Login with correct password → success
[ ] Login with wrong password → fail
[ ] Forgot password → email sent → reset works
[ ] Ban user → cannot login

Analysis:
[ ] Step 1 → Step 2 → Result flow
[ ] Session persistence
[ ] Z-Score calculation accuracy
[ ] Invalid data handling

Payment:
[ ] Choose plan → Midtrans popup
[ ] Complete payment → subscription active
[ ] Failed payment → proper error
[ ] Webhook received → status updated

Admin:
[ ] Login as admin → dashboard visible
[ ] Non-admin access admin → 403 error
[ ] User management CRUD
[ ] User banning works
[ ] Message management

Security:
[ ] Brute force protection
[ ] SQL injection tests
[ ] XSS protection
[ ] CSRF protection
[ ] File upload validation
```

---

## 🔍 RECOMMENDED TOOLS FOR QA

```
- Laravel Dusk (browser testing)
- PHPUnit (unit testing)  
- Postman (API testing)
- OWASP ZAP (security scanning)
- Load testing: Apache JMeter
- Code analysis: PHPStan, Psalm
```

