# Fix Request Cancelled Error - Production Configuration

## 🔍 Problem
Error "request cancelled" terjadi pada tombol Resend Approval di production karena:
1. Request ke SAP timeout (tidak ada timeout configuration)
2. Operasi yang memakan waktu lama (fetch SAP + database operations)
3. Server timeout lebih kecil dari waktu yang dibutuhkan

## ✅ Solutions Implemented

### 1. **Code Level (TrsrjcController.php)**
- ✅ Menambahkan `stream_context` dengan timeout 120 detik pada SAP HTTP requests
- ✅ Menambahkan logging untuk debugging (Log::info dan Log::error)
- ✅ Improved error handling dengan pesan yang lebih informatif
- ✅ Menggunakan SweetAlert untuk error messages

### 2. **Server Configuration (Required in Production)**

#### A. PHP Configuration (`php.ini`)
Pastikan setting berikut di production:

```ini
# Maximum execution time (in seconds)
max_execution_time = 300

# Maximum input time (in seconds)
max_input_time = 300

# Memory limit
memory_limit = 512M
```

**Cara apply:**
1. Edit `/etc/php/8.x/fpm/php.ini` (sesuaikan versi PHP)
2. Restart PHP-FPM: `sudo systemctl restart php8.x-fpm`

#### B. Nginx Configuration
Jika menggunakan Nginx, tambahkan timeout settings:

```nginx
server {
    # ... existing config
    
    # Timeout settings
    fastcgi_read_timeout 300;
    fastcgi_send_timeout 300;
    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;
}
```

**Cara apply:**
1. Edit `/etc/nginx/sites-available/your-site`
2. Test config: `sudo nginx -t`
3. Reload: `sudo systemctl reload nginx`

#### C. Apache Configuration (Jika menggunakan Apache)
```apache
<VirtualHost *:80>
    # ... existing config
    
    # Timeout settings
    Timeout 300
    ProxyTimeout 300
</VirtualHost>
```

**Cara apply:**
1. Edit `/etc/apache2/sites-available/your-site.conf`
2. Reload: `sudo systemctl reload apache2`

### 3. **Environment Variables**
Pastikan SAP connection di `.env` sudah benar:

```env
SAP_BASE_URL=http://your-sap-server:port/sap/opu/odata/sap
SAP_CLIENT=100
SAP_USER=your_sap_user
SAP_PASSWORD=your_sap_password
SAP_LANGUAGE=EN
```

## 📊 Monitoring & Debugging

### Check Laravel Logs
```bash
tail -f storage/logs/laravel.log
```

Akan menampilkan:
- `Fetching SAP Header for SO: XXX` - Ketika mulai fetch header
- `Fetching SAP Items for SO: XXX` - Ketika mulai fetch items
- Error messages jika ada masalah

### Check PHP-FPM Logs
```bash
tail -f /var/log/php8.x-fpm.log
```

### Check Nginx/Apache Logs
```bash
# Nginx
tail -f /var/log/nginx/error.log

# Apache
tail -f /var/log/apache2/error.log
```

## 🧪 Testing

### Test di Development
```bash
# Pastikan development juga menggunakan timeout yang sama
php artisan serve
```

### Test di Production
1. Backup database terlebih dahulu
2. Test dengan 1 SO terlebih dahulu
3. Monitor logs saat proses berjalan
4. Verifikasi hasil di database

## 🚨 Troubleshooting

### Jika masih timeout:
1. **Increase timeout** - Ubah dari 120 menjadi 180 atau 300 detik
2. **Check SAP connection** - Pastikan network ke SAP lancar
3. **Optimize database** - Index pada tables yang sering diquery
4. **Consider Queue** - Gunakan Laravel Queue untuk operasi berat

### Jika muncul error lain:
1. Check logs di `storage/logs/laravel.log`
2. Check `sys_log` table di database
3. Contact developer dengan error message lengkap

## 📝 Notes
- Timeout 120 detik sudah cukup untuk kebanyakan kasus
- Jika SAP sangat lambat, pertimbangkan untuk increase menjadi 180-300 detik
- Monitor performance secara berkala
- Pertimbangkan Queue Jobs jika operasi sering timeout

## 🔄 Rollback Plan
Jika ada masalah setelah deployment:
1. Restore dari backup
2. Revert code changes via git
3. Restart services

```bash
# Rollback code
git checkout <previous-commit-hash>

# Restart services
sudo systemctl restart php8.x-fpm
sudo systemctl reload nginx
```

---
**Last Updated:** February 12, 2026
**Author:** GitHub Copilot
**Issue:** Request Cancelled on Resend Button in Production
