feat(plans): משיכת תב"ע מ-מנהל-התכנון (mavat) — Phase C backend-slice
ליבת-המשיכה למרשם-התכניות (V38): מספר-תכנית → זהות+תוקף מ-mavat דרך גשר-Camoufox הקיים (G2 — אותו שירות/פורט/סוד כמו X13, בלי חדשים). - court_fetch_service/mavat_client.py (חדש): דרייבר Camoufox מול mavat — עוקף F5-ASM (דפדפן-JS), search→auto-nav ל-SV4, לוכד GET /rest/api/SV4/1, מפענח planDetails (E_NAME/AUTH/ENTITY_SUBTYPE/GOALS) + rsInternet (פרסום-לאישור→ED_PUBLICATION_FILE=י"פ + DETAILS→תאריך/עמוד). מלכודת- דרייבר: init-script window.onerror swallow. reCAPTCHA נשאר דלוק (token). - court_fetch_service/server.py: POST /plan-fetch (אותו Bearer). - services/plans_fetch.py (חדש): צד-קונטיינר — httpx לגשר, מנרמל שדות. - tools/plans.py + server.py: כלי-MCP plan_fetch (מועמד, לא כותב). - web/app.py: POST /api/plans/fetch (503 גשר-למטה, 404 לא-נמצא). אומת חי מול mavat: 101-1031020→י"פ 13697 (עמ' 8758, 30/07/2025), 101-1053933→י"פ 13836. מקור-אמת עשיר מתב"ע-עכשיו (שחסר י"פ). INV-AH: כל ערך נושא source_url; שדה-חסר ריק לא מומצא. G10: מחזיר מועמד בלבד — שער-יו"ר (review_status) נשמר. G2: מרחיב גשר+מרשם קיימים. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -37,6 +37,28 @@ async def extract_plans(case_number: str) -> str:
|
||||
return err(str(e))
|
||||
|
||||
|
||||
async def plan_fetch(plan_number: str) -> str:
|
||||
"""משיכת זהות+תוקף של תב"ע מ-מנהל-התכנון (mavat) — מועמד-לאישור, לא כתיבה.
|
||||
|
||||
מחזיר את שדות-התכנית כפי שנמשכו (display_name/plan_type/purpose/gazette_date/
|
||||
yalkut_number/source_url). כל ערך נושא source_url (INV-AH); שדה שהמקור אינו
|
||||
חושף חוזר ריק — לא מומצא. אינו כותב למרשם: הקורא (טופס-היו"ר / plan_upsert)
|
||||
מחליט; הרשומה תמיד עוברת שער-יו"ר (review_status) לפני ציטוט בבלוק ט.
|
||||
|
||||
Args:
|
||||
plan_number: מספר-התכנית למשיכה (למשל "101-1031020", "מי/820")
|
||||
"""
|
||||
from legal_mcp.services import plans_fetch
|
||||
|
||||
try:
|
||||
plan = await plans_fetch.fetch_plan(plan_number)
|
||||
return ok(plan)
|
||||
except plans_fetch.PlanFetchUnavailable as e:
|
||||
return err(f"שירות-המשיכה אינו זמין: {e}")
|
||||
except Exception as e: # noqa: BLE001 — surface, don't swallow
|
||||
return err(str(e))
|
||||
|
||||
|
||||
async def plan_get(plan_number: str) -> str:
|
||||
"""קריאת תכנית מהמרשם לפי מספר (מנורמל; נופל ל-alias). ה-get הזול."""
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user