---
name: scan-edura-jobs
description: "סורק משרות הוראה — igm (ארגון המורים) + itu (הסתדרות המורים) + שתיל. כותב ל-data/jobs-pending.json ב-Edura (סטייג'ינג, לא חי). מיטל מאשרת ב-staging.html ואז פורסמת עם /publish-edura-approved. הפעל אוטומטית ב-06:00 IL או ידנית עם /scan-edura-jobs."
---

# סורק משרות יומי — Edura (סטייג'ינג)

סוכן שמעדכן את **מאגר ההמתנה** של Edura (edura.co.il) כל יום במקורות ציבוריים. **לא** נוגע בקובץ החי — מיטל מאשרת ידנית ב-staging.html.

**הריפו:** `c:/Users/meyta/Downloads/edura/`
**קובץ היעד:** `c:/Users/meyta/Downloads/edura/data/jobs-pending.json` (סטייג'ינג)
**קובץ חי (לקריאה בלבד):** `c:/Users/meyta/Downloads/edura/data/jobs.json`

---

## שלב 1 — קריאת המצב הנוכחי

קרא **את שני הקבצים**:
- `data/jobs.json` (החי) — לדה-דופ
- `data/jobs-pending.json` (סטייג'ינג) — אם קיים, להוסיף משרות שטרם הוחלט עליהן

בנה סט מאוחד של:
- `existingIds` = כל ה-IDs משני הקבצים
- `existingUrls` = כל ה-URLs משני הקבצים

אם `jobs-pending.json` לא קיים, התייחס אליו כ-`{ scanned_at: '', total_pending: 0, by_source: {}, jobs: [] }`.

הסכמה של רשומה (חובה למלא לכל משרה חדשה):
```json
{
  "id": "<source>-<unique>",
  "source": "igm | itu | shatil",
  "source_name": "ארגון המורים | הסתדרות המורים | שתיל",
  "school": "",
  "title": "",
  "subject": "",
  "role": "מורה | מחנך/ת | רכז/ת | יועץ/ת | ...",
  "level": "יסודי | חטיבת ביניים | תיכון | גן",
  "sector": "ממלכתי | ממ\"ד | ערבי | ...",
  "region": "מרכז | צפון | דרום | ירושלים | שפלה",
  "sub_area": "",
  "city": "",
  "scope": "מלאה | חלקית | X ימים | X%",
  "contact_name": "",
  "email": "",
  "phone": "",
  "date": "",
  "date_iso": "YYYY-MM-DD",
  "snippet": "",
  "description": "",
  "url": ""
}
```

---

## שלב 2 — סריקת מקורות (במקביל)

הרץ את שלוש הסריקות במקביל ב-WebFetch.

### 2A. ארגון המורים (igm)

**URL ראשי:** `https://www.igm.org.il/site/pg/igm_wanted_school_index&p1=20`
(השתמש ב-`&p1=20`, `&p1=21`, `&p1=22` וכו' לפגינציה — בדוק עד 4 דפים)

**פרומפט ל-WebFetch:**
> חלץ מטבלת המשרות את כל הרשומות עם השדות: id (data-id או מהקישור), כותרת המשרה, מקצוע, שכבה (יסודי/חט"ב/תיכון), בית ספר, עיר, אזור, היקף משרה, מייל, טלפון, תאריך פרסום (פורמט DD/MM/YYYY), טקסט מלא של המודעה. החזר JSON: `{ "jobs": [...] }`. אל תפסיק לפני שחילצת את כל הרשומות בדף.

חזור על כל דף עד שאין יותר רשומות חדשות (= כל ה-IDs כבר קיימים בסט).

### 2B. הסתדרות המורים (itu)

**URL:** `https://www.itu.org.il/לובי-ההסתדרות-בשבילך/משרות/`

**פרומפט ל-WebFetch:**
> חלץ את כל המשרות מהדף — לכל משרה: data-careerid (ID), title, subject (תחום), institute (מוסד/בית ספר), city, full description text, email, phone, date (DD/MM/YYYY HH:MM). החזר JSON: `{ "jobs": [...] }`.

הדף הוא טעינה דינמית — אם WebFetch לא מקבל הכל, נסה `https://www.itu.org.il/wp-json/...` (יש להם REST API פתוח). אם WebFetch מחזיר רק חלק, ציין זאת בלוג ותעצור על מה שיש.

### 2C. שתיל (shatil)

**URL:** `https://jobs.shatil.org.il/?searchType=jobs&jobType%5B%5D=40` (פילטר תפקיד הוראה=40)

**פרומפט ל-WebFetch:**
> חלץ כל משרה מהלוח: כותרת, ארגון, עיר, אזור, היקף משרה, תיאור, קישור מלא ל-permalink של המשרה (לא הדף הראשי), תאריך פרסום. החזר JSON: `{ "jobs": [...] }`.

חזור על דפי 1-5 דרך `&page=N`.

**הערה:** בעבר היו permalinks חסרים ב-shatil. אם permalink לא נמצא, השתמש ב-URL הראשי + hash של הכותרת כ-id.

---

## שלב 3 — נרמול ודה-דופ

לכל משרה שחילצת:

1. **בנה id ייחודי:**
   - igm: `igm-<job_id>` (לפי data-id מהאתר)
   - itu: `itu-<careerid>`
   - shatil: `shatil-<sha1(title+city)[:10]>` אם אין permalink, אחרת `shatil-<permalink_slug>`

2. **דה-דופ:** דלג על משרות שה-id או ה-URL שלהן כבר קיים ב-jobs.json **או** ב-jobs-pending.json. ספור כמה דילגת.

3. **סווג אזור** לפי עיר (אם חסר):
   - ירושלים, ביתר → ירושלים
   - תל אביב, רמת גן, פתח תקווה, רעננה, הרצליה, כפר סבא, ר"ג, חולון, ב"ב → מרכז
   - חיפה, נצרת, עכו, קריות, צפת, טבריה, גליל → צפון
   - באר שבע, אשדוד, אשקלון, דימונה, אילת → דרום
   - מודיעין, בית שמש, לוד, רמלה → שפלה

4. **סווג תפקיד** מהכותרת/תיאור (multi-label אם רלוונטי):
   - "מורה" → מורה; "מחנך/ת" → מחנך/ת; "רכז/ת" → רכז/ת; "יועץ/ת" → יועץ/ת

5. **סווג שכבה** מהטקסט:
   - "יסודי" / "א'-ו'" → יסודי
   - "חט"ב" / "חטיבה" / "ז'-ט'" → חטיבת ביניים
   - "תיכון" / "י'-יב'" → תיכון

---

## שלב 4 — עדכון jobs-pending.json (סטייג'ינג)

⚠️ **לא** לגעת ב-`data/jobs.json`. זה קובץ חי שמיטל מאשרת ידנית דרכו.

קרא את `data/jobs-pending.json` הקיים (אם יש), prepend את המשרות החדשות בתחילת `jobs[]`, וכתוב מחדש:

```js
{
  "scanned_at": "<היום, YYYY-MM-DD>",
  "total_pending": <jobs.length>,
  "by_source": { igm: X, itu: Y, shatil: Z },
  "jobs": [...]  // newest first
}
```

הוסף `_scanned_at` לכל רשומה חדשה.

**שמור** את הקובץ עם indent=2, UTF-8, עברית גולמית.

---

## שלב 4.5 — ניקוי AI אצוותי (חובה!)

לפני commit, הרץ ניקוי על `jobs-pending.json` שמתקן שדות גנריים/ריקים:

```bash
cd /c/Users/meyta/Downloads/edura
python data/cleanup-pending.py
```

הסקריפט מחלץ מ-`description`:
- **city** אם ריק (מילון 70+ ערים+מועצות, מטפל בקידומות עברית)
- **subject** אם גנרי ("מורה כולל/ת"/ריק) → מקצוע אמיתי
- **role** מועדף על "מורה" אם בתיאור: מחנך/יועץ/רכז/מתמחה/סייע
- **level** אם ריק (יסודי/חט"ב/תיכון/גן)

הסקריפט מדפיס "Cleaned: N jobs · M fixes". המשך רק אם ההרצה הצליחה.

---

## שלב 5 — Commit + Push

```bash
cd /c/Users/meyta/Downloads/edura
git add data/jobs-pending.json
git commit -m "auto: pending scan — +N new (igm:X itu:Y shatil:Z)"
git push
```

מיטל תיכנס ל-`https://edura.co.il/staging.html` לאישור, ואז תריץ `/publish-edura-approved`.

---

## שלב 6 — דוח סיכום

הדפס לקונסולה:

```
✓ סריקה הושלמה
─────────────────
ארגון המורים (igm): X משרות חדשות
הסתדרות המורים (itu): Y משרות חדשות
שתיל (shatil): Z משרות חדשות
─────────────────
סה״כ חדשות: N
סה״כ במאגר: <total>
מקור עם הכי הרבה: <source>
```

אם הצלחה חלקית (מקור אחד נפל), ציין במפורש איזה ולמה.

---

## טיפול בשגיאות

- אם WebFetch מחזיר 403/500 — נסה שוב פעם אחת. אם נכשל פעמיים, דלג על המקור עם דוח שגיאה.
- אם ה-HTML של אתר השתנה ולא מצליח לחלץ — אל תיצור משרות שגויות. דלג עם דיווח.
- אם 0 משרות חדשות מכל המקורות — זה תקין (סוף שבוע / חופש). דווח ולא תעשה commit.

---

## הערות חשובות

- **אסור** לסרוק קבוצות פייסבוק — צריך login. FB יוצא מהסקירה האוטומטית.
- **רק** משרות הוראה (מורה/מחנך/יועץ/רכז) — לא משרות שירות, מנהלה, אבטחה וכו'.
- **שמור על הסכמה המלאה** — אל תשמיט שדות גם אם ריקים (השאר string ריק).
- אם רשומה חסרה הרבה שדות (פחות מ-3 מתוך title/subject/city/email/phone) — דלג עליה.
