# แนวทางในการทำส่วน "ผลสะท้อนกลับของลูกค้า" (Comparison Chart)

## โครงสร้างข้อมูลปัจจุบัน

### Tables ที่เกี่ยวข้อง:
- `survey_responses` - เก็บคะแนน (`average_score`) และวันที่ตอบ (`DtmIns`)
- `survey_invitations` - เชื่อม `Service_Request_ID` กับ `Survey_ID`
- `service` - เก็บ `Masterproduct_ID` (ประเภทผลิตภัณฑ์) และ `ServiceRequest_BY` (ปีงบประมาณ)
- `masterproduct` - เก็บชื่อประเภทผลิตภัณฑ์ (`Masterproduct_Name`)
- `surveys` - เก็บแบบประเมิน (`Survey_Name`)

## แนวทางที่ 1: ใช้ข้อมูลจาก survey_responses โดยตรง (แนะนำ)

### ข้อดี:
- ✅ ข้อมูลล่าสุด ตรงกับความเป็นจริง
- ✅ ไม่ต้องรอการคำนวณสรุป
- ✅ ทำงานได้ทันที

### ข้อเสีย:
- ⚠️ อาจช้าเมื่อข้อมูลเยอะ (แต่สามารถ optimize ได้)

### โครงสร้าง Chart:
```
แกน Y (Categories): ประเภทผลิตภัณฑ์ (Masterproduct_Name)
แกน X (Values): คะแนนเฉลี่ย (Average Score)
Series: แต่ละแบบประเมิน (Survey_Name)
Group by: ปีงบประมาณ (Budget Year) หรือปีปฏิทิน (Calendar Year)
```

### SQL Query Concept:
```sql
SELECT 
    mp.Masterproduct_Name AS product_type,
    s.Survey_Name AS survey_name,
    YEAR(sr.DtmIns) + 543 AS budget_year, -- แปลงเป็นปี พ.ศ.
    AVG(sr.average_score) AS average_score
FROM survey_responses sr
JOIN survey_invitations si ON sr.Invitation_ID = si.Invitation_ID
JOIN surveys s ON sr.Survey_ID = s.Survey_ID
JOIN service sv ON si.Service_Request_ID = sv.ServiceRequestID
JOIN masterproduct mp ON sv.Masterproduct_ID = mp.Masterproduct_ID
WHERE sr.average_score IS NOT NULL
GROUP BY mp.Masterproduct_ID, s.Survey_ID, YEAR(sr.DtmIns) + 543
ORDER BY budget_year DESC, mp.Masterproduct_Name, s.Survey_Name
```

### API Response Format:
```json
{
  "success": true,
  "data": {
    "2567": {
      "ระบบซอฟต์แวร์": {
        "แบบประเมินความพึงพอใจ": 8.5,
        "แบบประเมินคุณภาพบริการ": 7.8
      },
      "Mobile Application": {
        "แบบประเมินความพึงพอใจ": 8.2,
        "แบบประเมินคุณภาพบริการ": 7.5
      }
    },
    "2566": {
      "ระบบซอฟต์แวร์": {
        "แบบประเมินความพึงพอใจ": 8.0,
        "แบบประเมินคุณภาพบริการ": 7.2
      }
    }
  },
  "available_years": [2567, 2566, 2565, 2564, 2563],
  "product_types": ["ระบบซอฟต์แวร์", "Mobile Application", "Web Application"],
  "surveys": ["แบบประเมินความพึงพอใจ", "แบบประเมินคุณภาพบริการ"]
}
```

## แนวทางที่ 2: ใช้ข้อมูลจาก survey_annual_summary

### ข้อดี:
- ✅ เร็ว (ข้อมูลถูกสรุปล่วงหน้า)
- ✅ ประสิทธิภาพดีเมื่อข้อมูลเยอะ

### ข้อเสีย:
- ⚠️ ต้องรอการคำนวณสรุป (อาจใช้ command หรือ scheduled task)
- ⚠️ ข้อมูลอาจไม่ล่าสุดถ้ายังไม่ได้อัพเดต

### โครงสร้าง Chart:
เหมือนกับแนวทางที่ 1 แต่ใช้ `Budget_year` จาก `survey_annual_summary`

## แนวทางที่ 3: Hybrid (แนะนำสำหรับ Production)

### การทำงาน:
1. ใช้ `survey_annual_summary` เป็นหลัก
2. ถ้าข้อมูลปีปัจจุบันยังไม่มี หรือวันที่ยังไม่ได้สรุป ให้ใช้ `survey_responses` เป็น fallback
3. สามารถแสดง "กำลังคำนวณ..." สำหรับปีปัจจุบัน

## ข้อเสนอแนะสำหรับ Implementation

### Step 1: สร้าง API Endpoint
```php
Route::get('/admin/chart-comparison-data', [SurveyController::class, 'getChartComparisonData']);
```

### Step 2: สร้าง Controller Method
```php
public function getChartComparisonData(Request $request)
{
    // รับ parameters: startYear, endYear (optional)
    // Query ข้อมูลตามแนวทางที่เลือก
    // Return JSON ในรูปแบบที่ Chart ต้องการ
}
```

### Step 3: Query Logic
- จัดกลุ่มตาม: ปี → ประเภทผลิตภัณฑ์ → แบบประเมิน
- คำนวณคะแนนเฉลี่ยสำหรับแต่ละกลุ่ม
- ใช้ `AVG()` สำหรับคำนวณคะแนนเฉลี่ย

### Step 4: Frontend Integration
- แทนที่ `comparisonData` mock data ด้วย API call
- Handle loading state
- Handle empty data
- Update chart เมื่อเปลี่ยนปี

## คำถามสำหรับการตัดสินใจ

1. **ต้องการใช้ปีอะไร?**
   - ปีงบประมาณ (Budget Year) จาก `ServiceRequest_BY` หรือ `survey_annual_summary.Budget_year`
   - ปีปฏิทิน (Calendar Year) จาก `YEAR(survey_responses.DtmIns)`

2. **ต้องการแสดงกี่ปี?**
   - แสดงย้อนหลังกี่ปี? (เช่น 5 ปี)
   - ต้องแสดงปีปัจจุบันด้วยหรือไม่?

3. **ต้องการกรองข้อมูลหรือไม่?**
   - กรองตาม Agency?
   - กรองตามสถานะ Service?
   - กรองตามแบบประเมิน?

4. **Performance Considerations:**
   - ข้อมูลมีประมาณเท่าไหร่? (survey_responses, services)
   - ต้องการใช้ caching หรือไม่?

5. **การแสดงผล:**
   - ต้องการแสดงทุกแบบประเมิน หรือแสดงเฉพาะแบบประเมินที่เลือก?
   - ต้องการแสดงทุกประเภทผลิตภัณฑ์ หรือแสดงเฉพาะบางประเภท?

## ตัวอย่าง Implementation Plan

### Phase 1: Basic Implementation
1. สร้าง API endpoint `/admin/chart-comparison-data`
2. Query ข้อมูลจาก `survey_responses` โดยตรง
3. จัดกลุ่มตาม: ปีปฏิทิน → ประเภทผลิตภัณฑ์ → แบบประเมิน
4. คำนวณคะแนนเฉลี่ย
5. Return JSON ในรูปแบบที่ Chart ต้องการ
6. แก้ไข Frontend ให้ใช้ข้อมูลจริงแทน mock data

### Phase 2: Optimization (ถ้าจำเป็น)
1. เพิ่ม caching (Redis หรือ Laravel Cache)
2. เพิ่ม index ใน database (ถ้าจำเป็น)
3. พิจารณาใช้ `survey_annual_summary` สำหรับข้อมูลย้อนหลัง

### Phase 3: Advanced Features
1. เพิ่ม filter options (Agency, Product Type, Survey)
2. เพิ่ม date range selector
3. เพิ่ม export functionality

