# การตั้งค่าวันหมดอายุของแบบประเมิน (Survey Expiration)

## 📋 สารบัญ

1. [ภาพรวม](#ภาพรวม)
2. [วิธีการปรับอายุแบบประเมิน](#วิธีการปรับอายุแบบประเมิน)
3. [ตัวอย่างการตั้งค่า](#ตัวอย่างการตั้งค่า)
4. [การตรวจสอบค่า](#การตรวจสอบค่า)
5. [การอัปเดตข้อมูลเก่า](#การอัปเดตข้อมูลเก่า)
6. [FAQ](#faq)

---

## ภาพรวม

อายุของแบบประเมิน (Expiration Days) กำหนดว่าแบบประเมินที่ส่งให้ผู้ใช้จะหมดอายุภายในกี่วัน หลังจากวันที่ส่ง

**ค่าเริ่มต้น**: 7 วัน

**ตำแหน่งที่ใช้**:
- `config/survey.php` - ไฟล์ config หลัก
- `.env` - ไฟล์ environment variables
- `app/Http/Controllers/ServiceRequestController.php` - ใช้ค่าดังกล่าวเมื่อสร้าง survey invitation

---

## วิธีการปรับอายุแบบประเมิน

### วิธีที่ 1: ผ่านไฟล์ `.env` (แนะนำ)

#### ขั้นตอนที่ 1: เปิดไฟล์ `.env`

```bash
nano .env
# หรือ
vi .env
```

#### ขั้นตอนที่ 2: เพิ่มหรือแก้ไขค่า `SURVEY_EXPIRATION_DAYS`

```env
# กำหนดอายุแบบประเมิน (วัน)
# ตัวอย่าง: 7 วัน
SURVEY_EXPIRATION_DAYS=7

# ตัวอย่างอื่นๆ:
# SURVEY_EXPIRATION_DAYS=14   # 14 วัน (2 สัปดาห์)
# SURVEY_EXPIRATION_DAYS=30   # 30 วัน (1 เดือน)
# SURVEY_EXPIRATION_DAYS=3    # 3 วัน
```

#### ขั้นตอนที่ 3: บันทึกไฟล์

- สำหรับ `nano`: กด `Ctrl + X` แล้วกด `Y` แล้วกด `Enter`
- สำหรับ `vi/vim`: กด `Esc` แล้วพิมพ์ `:wq` แล้วกด `Enter`

#### ขั้นตอนที่ 4: Clear Config Cache

```bash
php artisan config:clear
```

### วิธีที่ 2: แก้ไขใน `config/survey.php` โดยตรง

⚠️ **ไม่แนะนำ** เพราะค่าจะถูก overwrite เมื่อรัน `php artisan config:cache`

เปิดไฟล์ `config/survey.php` และแก้ไข:

```php
'expiration_days' => env('SURVEY_EXPIRATION_DAYS', 7),  // เปลี่ยน 7 เป็นค่าที่ต้องการ
```

---

## ตัวอย่างการตั้งค่า

### ตัวอย่างที่ 1: ตั้งเป็น 14 วัน (2 สัปดาห์)

```env
SURVEY_EXPIRATION_DAYS=14
```

```bash
php artisan config:clear
```

### ตัวอย่างที่ 2: ตั้งเป็น 30 วัน (1 เดือน)

```env
SURVEY_EXPIRATION_DAYS=30
```

```bash
php artisan config:clear
```

### ตัวอย่างที่ 3: ตั้งเป็น 3 วัน (สำหรับแบบประเมินเร่งด่วน)

```env
SURVEY_EXPIRATION_DAYS=3
```

```bash
php artisan config:clear
```

---

## การตรวจสอบค่า

### วิธีที่ 1: ตรวจสอบจาก Config

```bash
php artisan tinker --execute="echo config('survey.expiration_days');"
```

### วิธีที่ 2: ตรวจสอบจาก Environment Variable

```bash
php artisan tinker --execute="echo env('SURVEY_EXPIRATION_DAYS', 'default (7)');"
```

### วิธีที่ 3: ตรวจสอบใน Code

```bash
php artisan tinker --execute="
\$days = config('survey.expiration_days');
echo 'Expiration Days: ' . \$days . ' วัน\n';
echo 'Expires at: ' . now()->addDays(\$days)->format('Y-m-d H:i:s') . '\n';
"
```

### วิธีที่ 4: ตรวจสอบจาก Database

ตรวจสอบแบบประเมินที่สร้างล่าสุด:

```bash
php artisan tinker --execute="
use App\Models\SurveyInvitation;
\$latest = SurveyInvitation::latest('Invitation_ID')->first();
if (\$latest) {
    echo 'Invitation ID: ' . \$latest->Invitation_ID . '\n';
    echo 'Created: ' . \$latest->DtmIns . '\n';
    echo 'Expires at: ' . \$latest->expires_at . '\n';
    echo 'Days: ' . \$latest->DtmIns->diffInDays(\$latest->expires_at) . ' วัน\n';
}
"
```

---

## การอัปเดตข้อมูลเก่า

⚠️ **คำเตือน**: การเปลี่ยนแปลง `SURVEY_EXPIRATION_DAYS` จะมีผลกับแบบประเมินที่**สร้างใหม่เท่านั้น**

**แบบประเมินที่สร้างไปแล้วจะยังคงใช้ค่า `expires_at` เดิม**

### ถ้าต้องการอัปเดตแบบประเมินเก่า

#### วิธีที่ 1: อัปเดตผ่าน Tinker (สำหรับทีละรายการ)

```bash
php artisan tinker --execute="
use App\Models\SurveyInvitation;
\$days = config('survey.expiration_days');
\$invitation = SurveyInvitation::find(INVITATION_ID);  // เปลี่ยน INVITATION_ID
if (\$invitation) {
    \$invitation->expires_at = \$invitation->DtmIns->copy()->addDays(\$days);
    \$invitation->save();
    echo 'Updated: ' . \$invitation->Invitation_ID . '\n';
    echo 'New expires_at: ' . \$invitation->expires_at . '\n';
}
"
```

#### วิธีที่ 2: อัปเดตทุกรายการที่ยังไม่หมดอายุ (Script)

```bash
php artisan tinker --execute="
use App\Models\SurveyInvitation;
\$days = config('survey.expiration_days');
\$invitations = SurveyInvitation::where('expires_at', '>', now())->get();
\$count = 0;
foreach (\$invitations as \$inv) {
    \$newExpiresAt = \$inv->DtmIns->copy()->addDays(\$days);
    if (\$inv->expires_at != \$newExpiresAt) {
        \$inv->expires_at = \$newExpiresAt;
        \$inv->save();
        \$count++;
    }
}
echo 'Updated: ' . \$count . ' invitations\n';
"
```

---

## FAQ

### Q: การเปลี่ยนค่า `SURVEY_EXPIRATION_DAYS` จะมีผลกับแบบประเมินเก่าหรือไม่?

**A**: ไม่มีผลครับ การเปลี่ยนแปลงจะมีผลกับแบบประเมินที่**สร้างใหม่เท่านั้น** แบบประเมินเก่ายังคงใช้ค่า `expires_at` เดิม

### Q: ฉันต้องการตั้งค่าแตกต่างกันสำหรับแต่ละแบบประเมิน ทำได้ไหม?

**A**: ตอนนี้ยังไม่รองรับ แต่สามารถแก้ไขโค้ดใน `ServiceRequestController.php` เพื่อให้รับค่าแตกต่างกันได้:

```php
// ใน ServiceRequestController.php
$surveyExpirationDays = $survey->expiration_days ?? config('survey.expiration_days', 7);
```

### Q: ควรตั้งค่าเป็นกี่วัน?

**A**: ขึ้นอยู่กับความต้องการ:
- **3-7 วัน**: เหมาะสำหรับแบบประเมินเร่งด่วน
- **7-14 วัน**: เหมาะสำหรับแบบประเมินทั่วไป
- **30 วัน**: เหมาะสำหรับแบบประเมินที่ต้องการให้ผู้ใช้มีเวลาในการตอบ

### Q: ฉันเปลี่ยนค่าแล้วแต่ไม่ได้ผล ทำอย่างไร?

**A**: ลองทำตามลำดับนี้:
1. ตรวจสอบว่าเพิ่มใน `.env` แล้ว: `cat .env | grep SURVEY_EXPIRATION_DAYS`
2. Clear config cache: `php artisan config:clear`
3. Clear cache cache: `php artisan cache:clear`
4. ตรวจสอบค่า: `php artisan tinker --execute="echo config('survey.expiration_days');"`

### Q: สามารถตั้งเป็นชั่วโมงหรือนาทีได้ไหม?

**A**: ตอนนี้ระบบรองรับเฉพาะ "วัน" แต่สามารถแก้ไขโค้ดใน `ServiceRequestController.php` เพื่อรองรับชั่วโมงหรือนาทีได้:

```php
// แทน
'expires_at' => now()->addDays($surveyExpirationDays),

// ใช้
'expires_at' => now()->addHours(24 * $surveyExpirationDays),  // แปลงวันเป็นชั่วโมง
// หรือ
'expires_at' => now()->addMinutes(60 * 24 * $surveyExpirationDays),  // แปลงวันเป็นนาที
```

---

## ไฟล์ที่เกี่ยวข้อง

- `config/survey.php` - ไฟล์ config หลัก
- `.env` - ไฟล์ environment variables
- `app/Http/Controllers/ServiceRequestController.php` - ใช้ค่าดังกล่าวเมื่อสร้าง survey invitation
- `app/Models/SurveyInvitation.php` - Model สำหรับ survey invitations

---

## ตัวอย่างการใช้งาน

### ตรวจสอบอายุของแบบประเมินที่ส่งไปแล้ว

```bash
php artisan tinker --execute="
use App\Models\SurveyInvitation;
\$inv = SurveyInvitation::latest('Invitation_ID')->first();
if (\$inv) {
    echo 'Invitation ID: ' . \$inv->Invitation_ID . '\n';
    echo 'Created: ' . \$inv->DtmIns . '\n';
    echo 'Expires at: ' . \$inv->expires_at . '\n';
    echo 'Days until expiry: ' . now()->diffInDays(\$inv->expires_at, false) . '\n';
    echo 'Is expired: ' . (\$inv->isExpired() ? 'Yes' : 'No') . '\n';
}
"
```

### ดูแบบประเมินทั้งหมดที่หมดอายุแล้ว

```bash
php artisan tinker --execute="
use App\Models\SurveyInvitation;
\$expired = SurveyInvitation::where('expires_at', '<', now())->count();
echo 'Expired invitations: ' . \$expired . '\n';
"
```

---

**อัปเดตล่าสุด**: 2025-11-01
**เวอร์ชัน**: 1.0

