# סיכום סשן — 0003
תאריך: 2026-05-08
אפליקציה: VitPMIS
נושא: הרצה ראשונה + Sprint 2

---

## מה נבנה/הושלם

### הרצה ראשונה (המשך מסשן 0002)
- פתרון bug קריטי: `flutter.bat` תלוי בכתיבה לתיקייה `C:\Program Files\src\flutter\bin\cache` — lock mechanism ב-`shared.bat` נכשל בשקט כי אין הרשאות כתיבה
- יצירת junction `C:\flutter` → `C:\Program Files\src\flutter` כך ש-dart.exe נקרא ללא רווחים בנתיב
- עדכון `local.properties` → `flutter.sdk=C:\flutter`
- הרצה מוצלחת: `√ Built app-debug.apk`, האפליקציה עלתה על Pixel 6 API 34

### Firebase Setup
- SHA-1 fingerprint של debug keystore נוסף ל-Firebase Console דרך MCP
  - SHA-1: `53:A5:D6:82:D1:0A:D6:71:BA:46:38:7F:06:45:9C:F3:16:BE:2B:FF`
  - App ID: `1:226531913115:android:6b0bc5fde0074d6027c53e`
- Firestore Security Rules פורסו: `allow read, write: if request.auth != null`
- firebase.json עודכן עם Firestore config
- Firestore database נוצר אוטומטית בעת הפריסה

### Sprint 2 — מסכים חדשים
- **ProjectDetailScreen** (`lib/screens/projects/project_detail_screen.dart`)
  - ערכי סטטוס ועדיפות עם bottom sheet picker
  - בחירת תאריך התחלה/יעד עם DatePicker
  - רשימת משימות live מ-Firestore stream
  - ניווט ל-TaskDetailScreen בלחיצה על משימה
- **TaskDetailScreen** (`lib/screens/tasks/task_detail_screen.dart`)
  - עריכת כותרת ותיאור inline
  - שינוי סטטוס/עדיפות
  - בחירת due date
  - מחיקה עם confirmation
  - כפתורי "סמן הושלם" / "פתח מחדש"
- **TimelineScreen** (`lib/screens/timeline/timeline_screen.dart`)
  - ציר זמן אופקי Gantt-style
  - קנה מידה: 20px לכל יום
  - header חודשים עם CustomPainter
  - קו "היום" אדום
  - bars צבעוניים לפי ProjectStatus
  - scroll אל "היום" אוטומטי

### Sprint 2 — שירותים חדשים
- **VoiceService** (`lib/services/voice_service.dart`)
  - Singleton wrapper על speech_to_text
  - locale: `he_IL` (עברית)
  - onResult + onDone callbacks
- **CalendarService** (`lib/services/calendar_service.dart`)
  - GoogleSignIn עם scope `CalendarApi.calendarScope`
  - upsertProjectEvent: יצירה/עדכון event
  - מיפוי ProjectStatus → Google Calendar colorId
  - deleteProjectEvent
- **NotificationService** (`lib/services/notification_service.dart`)
  - FCM init + requestPermission
  - flutter_local_notifications עם channel `vitpmis_default`
  - foreground message handler
  - scheduleTaskReminder helper

### Wiring
- `main.dart`: נוסף tab ציר זמן (סה"כ 5 tabs), NotificationService.init()
- `tasks_screen.dart`: voice FAB קטן מעל FAB הוספה, `_openDetail` מחובר ל-TaskDetailScreen
- `projects_screen.dart`: `onTap` מחובר ל-ProjectDetailScreen
- `firestore_service.dart`: נוסף `addTask(Task)`, `tasksForProject()`, `projects` getter

### Build upgrades
- Gradle: 8.4 → 8.11.1
- AGP: 8.3.0 → 8.9.1
- coreLibraryDesugaring enabled + `desugar_jdk_libs:2.1.4`

---

## החלטות שהתקבלו

1. **addTask(Task)** — החלפת named-params API ב-Task object. יותר גמיש.
2. **collections top-level** — domains/projects/tasks ללא uid prefix. מתאים לשלב פיתוח. בעתיד יש להוסיף uid filter ולעדכן rules.
3. **VoiceService projectId='voice'** — זמני. בעתיד: dialog לבחירת פרויקט אחרי זיהוי.
4. **CalendarService.signIn** — נפרד מ-AuthService (scopes שונים). דורש לחיצת כפתור נפרדת.

---

## בעיות שנפתרו

| בעיה | פתרון |
|------|--------|
| `dart compile kernel` fails with "C:\Program is not recognized" | Junction `C:\flutter` → `C:\Program Files\src\flutter` |
| AGP 8.3.0 + `flutter_local_notifications 18` fails — androidx.core:1.17.0 requires AGP 8.9.1 | AGP 8.9.1 + Gradle 8.11.1 |
| flutter_local_notifications requires coreLibraryDesugaring | `coreLibraryDesugaringEnabled true` + `desugar_jdk_libs:2.1.4` |
| `VitColors.textMid` not found | Renamed to `VitColors.textMuted` |
| `VitColors.lineSubtle` not found | Renamed to `VitColors.lineFaint` |
| Duplicate `addTask` methods (named-params + Task object) | הסרת named-params version |
| `_toggleVoice` inside `_TaskCard` | הזזה ל-`_TasksScreenState` |
| `FirestoreService().addTask(projectId:, title:)` in tree_screen | עדכון ל-`addTask(Task(...))` |

---

## קבצים שנוצרו/שונו

| קובץ | שינוי |
|------|--------|
| `lib/screens/projects/project_detail_screen.dart` | **חדש** — Sprint 2 |
| `lib/screens/tasks/task_detail_screen.dart` | **חדש** — Sprint 2 |
| `lib/screens/timeline/timeline_screen.dart` | **חדש** — Sprint 2 |
| `lib/services/voice_service.dart` | **חדש** — Sprint 2 |
| `lib/services/calendar_service.dart` | **חדש** — Sprint 2 |
| `lib/services/notification_service.dart` | **חדש** — Sprint 2 |
| `lib/main.dart` | Tab 5 (ציר זמן) + NotificationService.init() |
| `lib/screens/tasks/tasks_screen.dart` | Voice FAB, _openDetail, addTask fix |
| `lib/screens/projects/projects_screen.dart` | onTap → ProjectDetailScreen |
| `lib/services/firestore_service.dart` | addTask(Task), tasksForProject(), projects getter |
| `pubspec.yaml` | firebase_messaging, speech_to_text, flutter_local_notifications, googleapis, intl, url_launcher |
| `android/app/build.gradle` | coreLibraryDesugaringEnabled + desugar_jdk_libs |
| `android/app/src/main/AndroidManifest.xml` | RECORD_AUDIO, POST_NOTIFICATIONS, INTERNET, FCM channel |
| `android/settings.gradle` | AGP 8.9.1, Kotlin 1.9.23 |
| `android/gradle/wrapper/gradle-wrapper.properties` | Gradle 8.11.1 |
| `android/local.properties` | flutter.sdk=C:\flutter |
| `firestore.rules` | **חדש** — auth != null |
| `firestore.indexes.json` | **חדש** — empty |
| `firebase.json` | נוסף firestore config |

---

## מה לא עבד / צריך להיזהר

- **אל תשתמש ב-`C:\Program Files\src\flutter\bin\flutter.bat`** — רווח בנתיב שובר את ה-dart hooks. תמיד השתמש ב-`C:\flutter\bin\flutter.bat`
- **`addTask` signature** — רק `addTask(Task task)` קיים. אין named-params.
- **VoiceService.startListening locale** — `he_IL` נדרש. בלי locale יחזור ל-en.
- **Gradle 8.11.1** — download ראשון לוקח ~30 שניות.

---

## הצעד הבא (Sprint 3)

1. **בדיקת Google Sign-In** — לחיצה על "המשך עם Google" → בדוק שהאמולטור מציג account picker
2. **Calendar Integration** — button בproject_detail_screen: `CalendarService.instance.signIn()` → `upsertProjectEvent(project)`
3. **Voice → Project Dialog** — אחרי `onResult`, הצג `showDialog` עם רשימת פרויקטים לבחירה
4. **Sprint 3 per planning doc v2.0**
