RACQUET · ספר ההפעלה

חוברת הדרכה למנהל המערכת

כל מסך במערכת, כל כפתור עליו, מי רשאי ללחוץ, מה משתנה — ומה כבר אי אפשר להחזיר. החוברת נכתבה מול המערכת החיה: כל צילום מסך כאן צולם מהמערכת עצמה, וכל שם של כפתור הוא השם שמופיע על המסך, מילה במילה.

מסכי ניהול
26בשבע קבוצות
תפקידים
105 פלטפורמה · 5 ארגון
הרשאות
3022 פלטפורמה · 8 ארגון
צילומי מסך
63
עודכן
8.9.2026

כל מה שתראה במערכת היום הוא נתוני הדגמה

המשתמשים, המועדונים, התחרויות, הקורסים, המחנות, הפרסומים בלוח יד שנייה והביקורות — כולם נזרעו לצורך הדגמה ולימוד. אין כאן אף לקוח אמיתי ואף כסף אמיתי. אפשר להתאמן על כל דבר בחוברת הזאת בלי לפחד, למעט הפעולות שמסומנות בפרק מה אי אפשר להחזיר — אותן כדאי לקרוא לפני שלוחצים, כי הן יתנהגו בדיוק אותו דבר גם ביום שהנתונים יהיו אמיתיים.

1. הכניסה למערכת

איפה זה גר, איך נכנסים, ומה קורה לפני שנכנסים.

האפליקציה מוגשת מהשרת בכתובת https://www.data-pulse.co.il/racquet/app/. הקבצים עצמם יושבים ב־C:\Racquet\public\app\index.html, ו־nginx מגיש את התיקייה C:\Racquet\public\ תחת הכינוי /racquet/. ה־API יושב מאחורי אותו שם, תחת /racquet/api/v1/, ומופנה פנימה אל 127.0.0.1:8790.

השם racquet.co.il עדיין לא מצביע אלינו

הדומיין רשום ושייך למוצר, אבל ה־DNS שלו מצביע כרגע לשרת אחר, ואין עליו תעודת אבטחה. עד שהמעבר יושלם — הכתובת לעבודה היא זו שלמעלה. פרטי המעבר ב־docs/DOMAIN_PLAN.md.

מסך הכניסה של RACQUET: שדה טלפון או אימייל, שדה סיסמה וכפתור כניסה
מסך הכניסה. שדה אחד לזיהוי — טלפון או אימייל, אפשר בכל אחד מהשניים — ושדה סיסמה. כניסה שולח. מתחת לטופס להרשמה מחליף את הטופס לטופס פתיחת חשבון.

שלוש נקודות שמנהל חייב להכיר במסך הזה:

ארבע קבוצות. כל פריט נתלה לפי הרשאה, ולכן שני אנשים לא רואים את אותו תפריט.

ראש העמוד עם התפריט הראשי סגור: ארבע קבוצות
התפריט הראשי סגור. מימין לשמאל: שירותים, לשחק, ניהול, שלי. בשורה שמעל: שם המשתמש, יציאה ומעבר ל־English.
קבוצהמה בתוכהלמי היא מוצגת
שירותים חיפוש שירותים · קורסים והשתלמויות · מחנות אימונים · לוח יד שנייה לכולם. לוח יד שנייה ו־חיפוש שירותים כתובים ישירות בדף; השניים האחרים נתלים בזמן ריצה.
לשחק תחרויות · הרמה שלי · SOS · מגרשים ברגע האחרון הרמה שלי — רק למי שמשובץ בליגה. SOS — רק לנותן שירות מאושר, או למנהל של מועדון מפורסם.
ניהול ניהול המערכת · תמיכה ובקשות שינוי מי שמחזיק platform.user.read, או מנהל מועדון מפורסם שהוא גם נותן שירות מאושר.
שלי הפרופיל שלי · ההזמנות שלי לכל מי שמחובר. ליד ההזמנות שלי מופיע מונה.
קבוצת שירותים פתוחה בתפריט
הקבוצה שירותים פתוחה.
קבוצת לשחק פתוחה בתפריט
הקבוצה לשחק.
קבוצת ניהול פתוחה בתפריט
הקבוצה ניהול — הדלת למסך שכל החוברת הזאת עוסקת בו.
קבוצת שלי פתוחה בתפריט
הקבוצה שלי.

המסכים שמאחורי התפריט

לפני שנכנסים לניהול, כדאי להכיר את המסכים שהמשתמשים רואים — כי כל החלטת ניהול משנה משהו באחד מהם.

מסך חיפוש שירותים
חיפוש שירותים — הלוח הציבורי של נותני השירות. סינון לפי ענף, קטגוריה ואזור. שירות מגיע לכאן רק אחרי שהאדם אושר כנותן שירות, בחר לפחות תת־אזור אחד, ופרסם.
מסך הפרופיל שלי, לשונית פרטים אישיים
הפרופיל שלי, לשונית פרטים אישיים. כאן נבחר גם התפקיד בפרופיל: שחקן/ית או נותן/ת שירות. הבחירה השנייה היא בקשה: היא מגיעה לתור בכרטיס נותני שירות בניהול וממתינה להחלטה.
לשונית הרמה שלי בפרופיל
הרמה שלי — רמה עצמית לכל ענף בנפרד.
לשונית מה אני מציע בפרופיל
מה אני מציע — נפתחת רק למי שסימן „נותן/ת שירות”.
לשונית המועדונים שלי בפרופיל
המועדונים שלי — כאן מנהל מועדון מפרסם מגרשים והצעות.
לשונית התעודות שלי בפרופיל
התעודות שלי — מה שנכנס לתור תעודות לאישור.
מסך לוח יד שנייה
לוח יד שנייה.
מסך קורסים והשתלמויות
קורסים והשתלמויות.
מסך מחנות אימונים
מחנות אימונים.
מסך מגרשים ברגע האחרון
מגרשים ברגע האחרון.
מסך ההזמנות שלי
ההזמנות שלי — וגם המקום היחיד שממנו נכתבת ביקורת.
מסך תמיכה ובקשות שינוי
תמיכה ובקשות שינוי — הצד של הפונה.

3. איך זה נראה בטלפון

רוב המשתמשים יגיעו מטלפון. שלושה דברים משתנים שם מהותית.

מסך הכניסה בטלפון
הכניסה בטלפון.
המסך הראשי בטלפון
המסך הראשי. התפריט מתקפל לכפתור תפריט.
תפריט ההמבורגר פתוח בטלפון
תפריט פתוח: ארבע הקבוצות זו מתחת לזו.
קבוצה פתוחה בתפריט הטלפון
קבוצה פתוחה בתוך התפריט.
מסך הניהול בטלפון
מסך הניהול בטלפון.
רצועת הכרטיסיות של הניהול בטלפון
רצועת הכרטיסיות בטלפון — 22 לשוניות במקום 26.

ארבע לשוניות ניהול נעלמות בטלפון, בכוונה

מתחת לרוחב 720px מוסרות מעקב בקשות, לאישור, בקשות שינוי ו־פניות תמיכה. ארבעתן טבלאות רחבות — מזהה, ממי, נושא, מצב ותאריך — ובמסך צר הן גורמות לתוכן לגלוש הצידה. גלילת רצועת הלשוניות מכוונת; גלילת הדף מתחתיה לא. כולן מסכי צוות שאיש לא עובד בהם מטלפון, ולכן הן מוסרות ולא נדחסות.

המשמעות המעשית: אישור בקשת שינוי או מענה לפנייה נעשים ממחשב בלבד. סיבוב הטלפון לרוחב מחזיר אותן, והלשונית שהייתה פתוחה נשמרת.

4. תפקידים והרשאות

מי רשאי מה — ולמה מנהל המערכת דווקא לא יכול לנהל מועדון.

יש עשרה תפקידים. חמישה בהיקף פלטפורמה — הם נצמדים לאדם — וחמישה בהיקף ארגון — הם נצמדים לחברות שלו במועדון או בעסק מסוים.

קודהשם על המסךהיקףמה הוא בפועל
sysadminמנהל מערכתפלטפורמה מחזיק את כל 22 הרשאות הפלטפורמה. התפקיד היחיד שמעניק תפקידים.
moderatorמנהל תוכןפלטפורמה דיווחים, תמונות פרופיל, ביקורות, והשהיית חשבון.
support_agentנציג תמיכהפלטפורמה קריאה ומענה בפניות תמיכה, וקריאת רשימת המשתמשים.
verifierמאשר תעודותפלטפורמה אישור ודחייה של תעודות בלבד.
content_editorעורך תוכןפלטפורמה הקטלוגים בלבד: ענפים, קטגוריות, סוגי תעודות, פורמטים, ערכי ניקוד.
org_ownerבעלים של מועדוןארגון כל שמונה הרשאות הארגון, כולל הסרת חברים והענקת תפקידים בתוכו.
org_managerמנהל מועדוןארגון שש: פרופיל, הזמנת חברים, פרסום שירותים, זמינות, קבלת בקשות, הצעות מגרש.
org_coachמאמן במועדוןארגון שתיים: ניהול זמינות וקבלת בקשות.
org_staffצוות המועדוןארגון אחת: קבלת בקשות.
org_customerלקוחארגון אפס הרשאות. זו אמירה „אני משחק כאן”, לא סמכות.

שימו לב: במסכי המועדון עצמם מופיעה גרסה מקוצרת של אותם שמות — בעלים, מנהל, מאמן, צוות, לקוח. אותו תפקיד, שני ניסוחים.

מטריצת ההרשאות

הרשאהמנהל מערכתנציג תמיכהמאשר תעודותמנהל תוכןעורך תוכן
platform.user.read
platform.user.suspend
platform.role.assign
platform.certificate.verify
platform.moderation.decide
platform.support.read
platform.support.respond
platform.catalog.approve
platform.feature_flag.toggle
platform.change_request.read
platform.change_request.decide
platform.audit.read

עשר הרשאות נוספות נולדו אחרי שהמטריצה נכתבה, וכולן מוחזקות במנהל מערכת בלבד: platform.user.create, platform.user.mail, platform.organisation.read, platform.organisation.manage, platform.provider.approve, platform.tournament.manage, platform.rating.manage, platform.setting.manage, platform.course.approve, platform.academy.curate.

שמונה הרשאות הארגון: org.profile.edit, org.member.invite, org.member.remove, org.member.role.assign, org.service.publish, org.availability.manage, org.request.accept, org.court_offer.publish.

שתי הרביעיות הריקות — העיקרון המרכזי במערכת ההרשאות

מנהל מערכת מחזיק את כל הרשאות הפלטפורמה ואפס הרשאות ארגון. להפעיל את הפלטפורמה אינו זהה ליכולת לפעול בתוך מועדון של לקוח משלם. לפרסם את שירותיו, לערוך את הפרופיל שלו, להסיר את חבריו — אלה החלטות של המועדון, שנעשות בידי אנשי המועדון.

זה נאכף במסד ולא רק בקוד: UserRoles.scope CHECK (scope='platform'), MembershipRoles.scope CHECK (scope='organisation'), ואילוץ ייחודיות על Roles(id, scope). מבנית בלתי אפשרי לחבר תפקיד פלטפורמה לחברות בארגון, או תפקיד ארגון ישירות לאדם.

יוצא מן הכלל אחד: מנהל פלטפורמה שפותח מועדון חדש הופך ל־בעלים שלו — כי החלופה משאירה מועדון בלי בעלים.

חמש הרשאות מוצגות באנגלית על מסך עברי

platform.user.create, platform.user.mail, platform.rating.manage, platform.setting.manage ו־platform.academy.curate אין להן שם עברי בשום מקום באפליקציה. הן יופיעו כקוד גולמי בכרטיס תפקידים והרשאות וגם בתוך משפט השגיאה של 403. לא באג מסוכן — אבל שווה לדעת לפני שמישהו שואל.

5. מסך הניהול — המבנה

הכניסה: תפריט ← ניהול ← ניהול המערכת. כותרת המסך היא ניהול, ומעליה הגדרות מערכת. בראש המסך יושבת שורה אחת שכדאי לקרוא פעם אחת ולזכור:

„המסך הזה נפתח רק למי שמחזיק הרשאות ניהול. הסתרה של כפתור היא נימוס, לא שמירה — כל פעולה כאן נבדקת שוב בשרת.”
מסך הניהול עם רצועת שבע קבוצות הכרטיסיות
מסך הניהול. מתחת לכותרת — רצועת שבעת ראשי הקבוצות.
רצועת הכרטיסיות: שבע קבוצות
הרצועה מקרוב: אנשים · ארגונים · תחרויות · קטלוגים · לאישור · פניות ודיווחים · מערכת.

שלושה כללים שחלים על כל 26 הכרטיסים:

שורת הכלים שחוזרת בכל טבלה

לרוב הכרטיסים יש אותה שורת כלים: שדה חיפוש, בורר מיון שמציע לכל עמודה „‹עמודה› — עולה” ו„‹עמודה› — יורד”, ומונה שאומר „N ‹פריטים›” או „N מתוך M ‹פריטים›”. בקטלוגים מצטרף רמז הגרירה: „גרור שורה, או השתמש בחיצים, כדי לשנות את הסדר.”

הקישור לחוברת הזאת נמצא בתוך המערכת

מעל רצועת הלשוניות יושב קישור ספר ההפעלה של המערכת, שנפתח בלשונית חדשה אל /racquet/docs/ADMIN_HANDBOOK_HE.html. הוא מוצג רק למי שמחזיק platform.setting.manage — כלומר למנהל מערכת. אם הקובץ עדיין לא הועלה לשרת, תיפתח במקומו הודעת „הדף לא נמצא”.

6. קבוצה: אנשים

ארבע לשוניות: משתמשים · תפקידים · נותני שירות · תפקידים והרשאות.

קבוצת אנשים פתוחה ברצועת הכרטיסיות
הקבוצה אנשים פתוחה.

6.1 משתמשים

הרשאה לפתיחה: platform.user.read. לעריכה ולהשהיה: platform.user.suspend. לפתיחת חשבון: platform.user.createמנהל מערכת בלבד.

כרטיס משתמשים: טבלה עם שם, טלפון ואימייל, מצב, תפקידים, ענפים, מועדונים
הכרטיס משתמשים. שמונה עמודות: בחירה · שם · טלפון ואימייל · מצב · תפקידים · ענפים · מועדונים · פעולות. עמודה תשיעית, תאריך הרשמה, קיימת בבורר המיון בלבד.

מסננים: מצב („כל המצבים”), תפקיד („כל התפקידים” / „ללא תפקיד”), ענף („כל הענפים” / „ללא ענף”), מועדון („כל המועדונים” / „ללא מועדון”). מצבי חשבון: ממתין · פעיל · מושהה.

הפעולות

כפתורמה קורהסיבהאישור
+ משתמש חדש פותח חשבון פעיל ומחזיר סיסמה זמנית שמוצגת פעם אחת.
עריכה פותח שדות שם תצוגה, טלפון, אימייל ואת שאר הפעולות מתחת לשורה. שמירה שולח.
השהיית החשבון / הפעלת החשבון מנתק מיד את כל הכניסות הפתוחות. „החשבון הושהה, והכניסות הפתוחות שלו בוטלו.” שדה סיבה להשהיהלא חובה אין
הסרת תמונה מוחק את קובץ התמונה. „להסיר את התמונה של ‹שם›? הקובץ יימחק, ובעל החשבון יראה שהתמונה הוסרה.” אין שדה סיבה כן, להסיר / ביטול
שליחת מייל לנבחרים מסמנים שורות בעמודת הבחירה, ממלאים נושא ותוכן ההודעה, ושולחים. דורש platform.user.mail. אין אין

הסיסמה הזמנית מוצגת פעם אחת

„הסיסמה הזאת מוצגת פעם אחת בלבד… העתק אותה עכשיו ומסור אותה לבעל החשבון בערוץ בטוח.” יש העתקה ו־סגירה ומחיקה מהמסך. היא אינה נשמרת בצורה קריאה בשום מקום ואי אפשר לשלוף אותה שוב — אם אבדה, הדרך היחידה היא לאפס סיסמה מחדש.

שתי נעילות ופער אחד

6.2 תפקידים

הרשאה: platform.role.assign — מנהל מערכת בלבד.

ראש כרטיס תפקידים והטקסט המסביר שבו
ראש הכרטיס תפקידים וההסבר שעליו. מתחת לשורה הזאת נפרש כרטיס לכל תפקיד פלטפורמה — לא טבלה — ובכל אחד מהם „אף אחד לא מחזיק בתפקיד הזה.” או „N מחזיקים בתפקיד.”, רשימת המחזיקים, ותיבת הוספת משתמש לתפקיד.
הצילום נחתך כאן: בצילום אוטומטי מדפדפן ללא חלון, חמשת כרטיסי התפקידים תופסים מקום בעמוד אך אינם מצטלמים, ושורת „טוען…” אינה נעלמת. בדפדפן רגיל הכרטיס נטען כראוי — התוכן קיים בעמוד, רק לא בצילום. שווה בדיקה.

6.3 נותני שירות

הרשאה: platform.provider.approve.

כרטיס נותני שירות: תור אישור עם מצב ופעולות
עמודות: שם · ביקש ב־ · תעודות · שירותים · מצב · פעולות. מצבים: ממתין · מאושר · נדחה · לא ביקש.

הכרטיס מסביר את עצמו: „מי שסימן בפרופיל „נותן/ת שירות” מופיע כאן עד שמנהל מחליט. עד האישור השירותים שלו נשמרים כטיוטה ואינם מופיעים בחיפוש. אישור לא צריך נימוק; דחייה וביטול אישור כן — הנימוק נשמר, והאדם קורא אותו בפרופיל שלו.”

מ־כפתוראלנימוק
ממתין / נדחה / מאושראישורמאושרלא
ממתיןדחייהנדחהחובה
מאושרביטול אישורנדחהחובה

שדות הנימוק נושאים את שם האדם: נימוק לדחייה (חובה — ‹שם› יקרא אותו בפרופיל) ו־נימוק לביטול האישור (חובה — ‹שם› יקרא אותו בפרופיל), ואישור בשני שלבים — אישור הדחייה / אישור הביטול.

מה קורה בפועל: אישור הוא על האדם, לא על כל שירות בנפרד — מאמן שאושר מוסיף שירות שני בלי בדיקה נוספת. ביטול אישור מוריד מיד את כל שירותיו המפורסמים מהחיפוש, כי providers.require_approved נבדק בכל פרסום.

אי אפשר להחליט על הבקשה של עצמך

נבדק ואומת מול המערכת החיה בעת כתיבת החוברת: חשבון שסימן את עצמו כנותן שירות ומחזיק platform.provider.approve מקבל 403 permission_denied עם reason: cannot_decide_your_own_provider_status. צריך מנהל שני. אותו כלל חל על תמונות לאישור: „אי אפשר להחליט על התמונה של עצמך. מנהל אחר יעשה את זה.”

פער: „אישור” מוצע גם על שורה שכבר נדחתה

דחייה מנומקת אפשר להפוך בלחיצה אחת, בלי אישור ובלי נימוק. אם מחזירים אישור למי שנדחה — כדאי לכתוב את הסיבה בפנייה או בבקשת שינוי, כי היומן יראה רק provider.approved בלי הסבר.

6.4 תפקידים והרשאות

הרשאה: platform.role.assign. לקריאה בלבד.

כרטיס תפקידים והרשאות: רשימת התפקידים וההרשאות שלהם
כל תפקיד נפתח ומראה את ההרשאות שלו בצורה „‹עברית› · ‹קוד›”. מסנן היקף: „כל ההיקפים” / פלטפורמה / ארגון.

ההערה שהמסך עצמו נושא

„הצעה שטרם אושרה. חלוקת ההרשאות לתפקידים שמוצגת כאן היא הצעה בלבד, ועדיין לא התקבלה עליה החלטת מוצר.” אין כאן יצירה, עריכה או מחיקה — זה מסך קריאה שנועד לענות על „מה בעצם מותר לנציג תמיכה”, לא לשנות את התשובה.

7. קבוצה: ארגונים

שתי לשוניות על אותו מנוע: מועדונים ו־עסקים וחנויות.

קבוצת ארגונים פתוחה
הקבוצה ארגונים.

הרשאה לקריאה: platform.organisation.read. לעריכה: platform.organisation.manage. שתיהן מנהל מערכת בלבד.

כרטיס מועדונים
מועדונים.
כרטיס עסקים וחנויות
עסקים וחנויות.

עמודות: שם · סוג · מצב · בעלים וחברים · פעולות. תא הבעלים כתוב „‹שם› · N חברים”, ובהיעדר בעלים „אין בעלים רשום”. סוגים: מועדון · עסק · חנות · אחר. מצבים: טיוטה · מפורסם · מושהה · בארכיון.

פרסום, השהיה וארכוב נעשים בלי אישור ובלי סיבת חובה

שלושתם הם בורר מצב ולחיצה על שמירת השינויים. זו החריגה הבולטת במסך: כל שאר הפעולות ההרסניות דורשות אישור דו־שלבי או סיבה, וזו לא. השהיית מועדון עוצרת מיד את יכולתו למכור הצעות מגרש ומורידה את שירותיו מהחיפוש.

באג ניסוח בלשונית „עסקים וחנויות”

הכותרת, המונה והודעת הריק מקודדים לתמיד למילה „מועדונים”. גם בלשונית העסקים המסך יאמר „N מועדונים” ו„אין מועדונים שמתאימים לסינון.” הנתונים נכונים — רק הטקסט שגוי.

8. קבוצה: תחרויות

חמש לשוניות: תחרויות · רמות (ליגות) · דירוגים · פורמטי משחק · ערכי ניקוד.

קבוצת תחרויות פתוחה
הקבוצה תחרויות.

8.1 תחרויות

הרשאה: platform.tournament.manage (תווית במסך: ניהול תחרויות), או מנהל של מועדון מפורסם שהוא גם נותן שירות מאושר. פרק שלם על ניהול תחרות נמצא בסעיף 13.

כרטיס תחרויות בניהול
עמודות: שם · ענף · תאריך · נרשמים · מצב · פעולות. מצבים: טיוטה · פורסמה · ההרשמה נסגרה · בוטלה.

הפעולות מתחת לכל שורה: עריכה · פרסום (או פתיחת ההרשמה מחדש) · סגירת ההרשמה · ביטול התחרות… · נרשמים · הגרלה (הופך ל־לוח אחרי ההגרלה, ולידו הגרלה מחדש) · לוח זמנים · יום התחרות. בטיוטה שלושת האחרונים מוצגים כטקסט מושבת: „הגרלה — אחרי הפרסום”, „לוח זמנים — אחרי הפרסום”, „יום התחרות — אחרי הפרסום”.

8.2 רמות (ליגות)

הרשאה: זהה לתחרויות.

כרטיס רמות (ליגות) בניהול
עמודות: רמה · עונה · ענף · שחקנים · מצב · פעולות. מצבים: טיוטה · פתוחה · פלייאוף · נסגרה.

ליגה היא עונה אחת של רמה אחת בענף אחד. חמש הרמות: רמה ד · רמה ג · רמה ב · רמה א · ליגת העל. 1–2 בתים, עד עשרה שחקנים בבית, כל אחד נגד כל אחד. ניצחון 2 נקודות, הפסד 1, ויתור 0 למוותר ו־2 למנצח.

הרצף המלא: יצירה → הוספת שחקנים (חשבונות קיימים בלבד — אין טופס הרשמה) → חלוקה לבתים (אוטומטית) → בניית לוח (מחשבת מארח לכל משחק לפי „בנק” אירוח) → תאריך יעד → אישור תוצאות שהמנצח דיווח, או הזנה ישירה → פלייאוףסגירת עונה… → העברת שחקנים לעונה הבאה.

סגירת עונה היא הפעולה המוגנת ביותר במסך — ואין ממנה חזרה

לפני האישור מוצגת תצוגה מקדימה מלאה: אלוף, „עולים ל‹רמה› (N)”, „יורדים ל‹רמה› (N)”, „נשארים (N)”, וגם הכללים „אין עלייה מליגת העל” ו„אין ירידה מרמה ד”. רק אז אישור וסגירת העונהכן, לסגור את העונה / לא. אין ביטול סגירה.

בלי אישור כלל: פתיחת הרמה, חלוקה לבתים (אוטומטית) (דורסת כל שיוך בתים קיים), הסרה של שחקן, ביטול המשחק. בניית לוח מחדש כן שואל, ונעלם ברגע שהוכרע משחק. פרישה… מציע בורר: „פרישה: המשחקים שנותרו מבוטלים” או „פרישה: הפסדים טכניים”.

8.3 דירוגים

לצפייה: platform.rating.manage או platform.tournament.manage. לשינוי: platform.rating.manage בלבד.

כרטיס דירוגים: סולם ELO לפי ענף וסוג
בוררי ענף ו־סוג (יחידים / זוגות), חיפוש, ו־עוד שורות. עמודות: מקום · שם · דירוג · רמה · משחקים · נצחונות/הפסדים · המשחק האחרון · פעולות.

הדירוג הוא ELO שמחושב מתוצאות משחקים — של תחרות או של רמה. K=40 בעשרת המשחקים הראשונים, 24 עד השלושים, 16 אחר כך. ויתור ועולה בלי משחק לעולם אינם מזיזים דירוג. שלושת סוגי השורות ביומן הדירוג: משחק · תיקון ידני · איפוס לרמה המוצהרת. טווח מותר לתיקון ידני: 500–2500.

לחיצה על שורה פותחת את יומן השחקן — „לפני ← אחרי” לכל משחק, והסיבה לכל תיקון. תיקון ידני דורש סיבה (חובה) של שלוש אותיות לפחות („צריך לכתוב סיבה — לפחות שלוש אותיות.”) ושואל „לשנות את הדירוג של ‹שם› מ־‹א› ל־‹ב›?” → כן, לתקן / לא.

חישוב מחדש לענף — הפעולה ההרסנית ביותר במערכת

האזהרה שהמסך נושא, מילה במילה:

„החישוב מוחק את יומן הדירוגים של הענף ובונה אותו מחדש מכל המשחקים ששוחקו, לפי סדר המשחק. כל תיקון ידני וכל איפוס בענף הזה יימחקו — הם אינם משחקים ואי אפשר לשחזר אותם. אם תיקנת דירוג בגלל תוצאה שגויה, תקן/י את התוצאה עצמה בלוח לפני ההרצה, אחרת התיקון יאבד והתוצאה השגויה תחזור.”

האישור: „לחשב מחדש את כל הדירוגים ב‹ענף›? כל תיקון ידני וכל איפוס בענף יימחקו ולא ניתן יהיה לשחזר אותם.” → כן, לחשב מחדש / לא. התשובה מחזירה כמה תיקונים נזרקו, והמספר נשמר ביומן.

אי־עקביות שכדאי להכיר: פאנל החישוב מחדש נשלט ב־platform.tournament.manage, לא ב־platform.rating.manage. כלומר מי שאינו רשאי לתקן דירוג יחיד כן רשאי למחוק את כל התיקונים בענף.

8.4 פורמטי משחק  ·  8.5 ערכי ניקוד

שניהם קטלוגים — ראו את מנוע הקטלוגים בסעיף הבא. שניהם דורשים platform.catalog.approve.

כרטיס פורמטי משחק
פורמטי משחק — „הטוב מ־3 עם סופר טיא ברייק” וכדומה. זה השדה היחיד בתחרות שאפשר לשנות גם אחרי ההגרלה.
כרטיס ערכי ניקוד
ערכי ניקוד — שבעה שדות מספר לכל טבלה.

בערכי ניקוד יש שתי עמודות מעבר לקטלוג הרגיל: ערכי ניקוד וברירת מחדל. כל שורה נפתחת לשבעה שדות מספר (0–10000) שנערכים במקום, עם שמירת הערכים, ותיבת ברירת מחדל — אחת לכל היותר. הטבלה הנזרעת נקראת ברירת מחדל. הערכים המקוריים: אלוף 100 · סגן 75 · חצי גמר 50 · רבע גמר 35 · שמינית 25 · סיבוב 32 = 15 · השתתפות 5.

סדר הקדימויות — הצר מנצח את הרחב: ערכים מיוחדים שהוקלדו לתחרות עצמה ← הטבלה בשם שנבחרה לה ← הטבלה המסומנת ברירת מחדל ← ברירת המחדל שבקוד.

9. קבוצה: קטלוגים

שלוש לשוניות: ענפים · סוגי תעודות · קטגוריות. יחד עם פורמטי משחק וערכי ניקוד מקבוצת התחרויות — חמישה קטלוגים על מנוע אחד.

קבוצת קטלוגים פתוחה
הקבוצה קטלוגים.

הרשאה לכל החמישה: platform.catalog.approve — תווית במסך ניהול הקטלוגים. זו ההרשאה היחידה של עורך תוכן.

כרטיס ענפים
ענפים.
כרטיס סוגי תעודות
סוגי תעודות.
כרטיס קטגוריות שירות
קטגוריות — כותרת הכרטיס היא קטגוריות שירות. שלוש עמודות נוספות: אייקון · ענפים · דורש תעודה.

ארבע הפעולות של כל קטלוג

עמודות הבסיס: סדר · ‹שם היחיד› · מזהה · זמין לבחירה · פעולות.

  1. הוספה+ ‹יחיד› חדש, שדה, הוספה. „נוסף: ‹שם› (מזהה ‹code›).”
  2. שינוי שםשינוי שם → שדה שםשמירה. ההערה הקבועה: „המזהה ‹code› נשאר כפי שהוא — כל מה שכבר נשמר מפנה אליו. השם הוא מה שרואים על המסך.”
  3. כיבוי — תיבת זמין לבחירה („זמין” / „כבוי”). הפיך, בלי אישור. כל כרטיס מוסיף משפט תוצאה משלו, למשל: „‹ענף› כובה. הוא נעלם מרשימות הבחירה, ו־12 שירותים ו־30 דירוגים שמפנים אליו נשארו כפי שהם.”
  4. מחיקה — שלוש שכבות הגנה, למטה.

המחיקה נבדקת מול השרת לפני שהיא מוצעת

  1. הלחיצה הראשונה שואלת את השרת מי מפנה לפריט.
  2. אם משהו מפנה — כפתור אישור לא מוצע כלל, וההודעה מפנה לכיבוי: „אי אפשר למחוק את ‹שם›: ‹ספירות› מפנים אליו. אפשר לכבות אותו — הוא ייעלם מרשימות הבחירה, וכל מה שכבר נשמר יישאר כפי שהוא.” הספירות מוצגות בעברית: שירותים, הזמנות, דירוגים, פרופילים, תעודות, מגרשים, סולמות דירוג, תת־קטגוריות, טורנירים, מודעות, משרות.
  3. רק כשאין תלות: „למחוק את ‹שם› לצמיתות?” → מחק / ביטול.
  4. ואם מישהו התחיל להשתמש בפריט בזמן שהמסך היה פתוח: „משהו התחיל להשתמש בפריט בזמן שהמסך היה פתוח. רענן את הרשימה ובדוק שוב.”

המסקנה המעשית: בקטלוג לא מוחקים — מכבים. מחיקה אפשרית רק על פריט שנולד בטעות ואיש עוד לא נגע בו.

שינוי סדר: גרירה, או החיצים ▲/▼ („להעלות את ‹שם› מקום אחד”). פעיל רק ברשימה מלאה שממוינת לפי סדר.

באג ניסוח בכל חמשת הקטלוגים

התבנית מקודדת בזכר: „+ קטגוריה חדש”, „אין קטגוריות שמתאימים לסינון”. צורם בעברית, לא מזיק.

10. קבוצה: לאישור

ארבע לשוניות: תעודות לאישור · תמונות לאישור · מפרסמי קורסים · לאישור מחשב בלבד.

קבוצת לאישור פתוחה, עם מונה על הלשונית
הקבוצה לאישור. שימו לב למונה על הלשונית עצמה — לאישור · 2. שלוש לשוניות נושאות מונה כזה.

10.1 תעודות לאישור

הרשאה: platform.certificate.verify.

כרטיס תעודות לאישור
רשימת כרטיסים, לא טבלה. מסננים ענף ו־סוג תעודה. ריק: „אין תעודות שממתינות לאישור.”

שדה נימוק (חובה בדחייה, לא באישור), וכפתורים אישור, דחייה, פתיחת המסמך. אין אישור דו־שלבי — הנימוק הוא כל ההגנה: „דחייה צריכה נימוק — הוא נשמר, והמעלה יקרא אותו.”

אין סורק וירוסים במערכת

אישור תעודה מסמן את המסמך כנקי ורושם ביומן במפורש "automated_scan": false ו־ "document_cleared_by": "manual_review". כלומר העין של המאשר היא הסריקה. אל תפתח מסמך שלא נראה נכון, ואל תאשר קובץ שלא פתחת.

הערה שנייה: זהו הכרטיס היחיד שלא משתמש במשפט השגיאה האחיד, ולכן 403 כאן קורא רק „אין הרשאה לפעולה הזאת.” בלי שם ההרשאה.

10.2 תמונות לאישור

הרשאה: platform.moderation.decide.

כרטיס תמונות לאישור
תור תמונות הפרופיל. שדה נימוק (לא חובה).

10.3 מפרסמי קורסים

הרשאה: platform.course.approve — מנהל מערכת בלבד.

כרטיס מפרסמי קורסים
עמודות: מי · סוג · טלפון · אימייל · נוסף · פעולות. אין כאן שורת כלים — בלי חיפוש, בלי סינון ובלי מיון.

רשימת ההיתרים שמפעילה שני מודולים

מי שנמצא כאן רשאי לפרסם קורסים והשתלמויות וגם מחנות אימונים. אין מסך נפרד למחנות והמחיר נאמר בגלוי: אי אפשר היום לאשר מישהו למחנות ולא לקורסים.

הוספה: שם · טלפון · אימייל · ארגון („ללא ארגון — אדם פרטי”) · הערההוספת מפרסם. מפרסם יכול להיות אדם — ואז הוא חייב להיות נותן שירות מאושר — או ארגון, ואז כל מי שמחזיק org.profile.edit בו מפרסם בשמו.

ביטול: ביטול ההרשאה… → הערה חובהביטול ההרשאה / להשאיר. „ביטול הרשאה דורש הערה — היא נשמרת ביומן.” ההרשאה מסומנת כמבוטלת ולא נמחקת, ו„קורסים שכבר פורסמו נשארים על כנם.” המפרסם פשוט לא יכול לגעת בהם יותר.

10.4 לאישור מחשב בלבד

הרשאה: platform.change_request.read, והחלטה דורשת platform.change_request.decide. כותרת הכרטיס: בקשות שינוי לאישור.

כרטיס בקשות שינוי לאישור
תור ההחלטה על בקשות שינוי. המונה על הלשונית הוא מספר הפריטים כאן.

שדות: הנחיות לעובד (רק אם מאשרים לעובד) והערת מנהל (חובה בדחייה). שלוש החלטות:

11. קבוצה: פניות ודיווחים

חמש לשוניות. שלוש מהן מחשב בלבד.

קבוצת פניות ודיווחים פתוחה
הקבוצה פניות ודיווחים.

11.1 מעקב בקשות מחשב בלבד

כרטיס מעקב בקשות
מסנן מצב: „הכל” · פתוחה · אושרה · בעבודה · הושלמה · נדחתה · בוטלה.

טופס פתיחה: כותרת · תחום · דחיפות · פירוטפתיחת הבקשה. אחר כך אישור הבקשה („הבקשה אושרה. עכשיו אפשר להעביר אותה לעבודה.”), ואז בורר מצב הבקשה („ללא שינוי מצב — שמירת הערה בלבד” / „העברה ל‹מצב›”) עם מה נעשה (הערה) ו־שמירה.

הסירוב המרכזי, ששווה להכיר לפני שהוא מפתיע: „הבקשה עוד לא אושרה, ולכן אי אפשר להעביר אותה לעבודה. לחץ קודם „אישור הבקשה” — האישור נרשם על שמך, בדיוק כמו לחיצה על הקישור במייל.”

11.2 בקשות שינוי מחשב בלבד

כרטיס בקשות שינוי
הכרטיס המלא של בקשת השינוי, כולל שיחה על הבקשה שבה כל הודעה מתויגת צוות או פונה.

בורר מצב העובד: בתור · בעבודה · תוקן · נכשל · הועלה לאוויר — דיווח של אדם. הבחירה האחרונה קיימת כדי שהיומן יידע מי אמר שהתיקון עלה: „נרשם שהתיקון הועלה לאוויר. הדיווח הזה נזקף לך, לא לעובד.”

11.3 פניות תמיכה מחשב בלבד

הרשאה: platform.support.read; מענה דורש platform.support.respond.

כרטיס פניות תמיכה
מצבים: חדשה · בטיפול · ממתינה ללקוח · נפתרה · סגורה. ברירת המחדל של המסנן היא „ממתינות לנו”.

שני כפתורים נפרדים, לא מתג — וזה מכוון

שליחת תשובה ללקוח → „התשובה נשלחה ללקוח.”
הערה פנימית → „ההערה נשמרה לצוות בלבד.”

כל הודעה בשרשור מסומנת במפורש הערה פנימית או תשובה ללקוח. זו הגנה מכוונת מפני היפוך בוליאני אחד שהיה מדליף הערכה פנימית ללקוח. קרא את התווית לפני שאתה שולח.

11.4 דיווחים

הרשאה: platform.moderation.decide.

כרטיס דיווחים
סוגי יעד: משתמש · הודעה · שירות · ביקורת. סיבות: הטרדה · ספאם · תוכן לא הולם · הונאה · התחזות · בטיחות · אחר.

שדה סיבה להחלטהחובה: „צריך לכתוב סיבה. היא נשמרת עם ההחלטה.” שלוש החלטות: טופל · לקחת לבדיקה · דחייה. „הדיווח כבר הוכרע.” — אין פתיחה מחדש.

11.5 ביקורות שדווחו

הרשאה: platform.moderation.decide.

כרטיס ביקורות שדווחו
ריק: „אין ביקורות שדווחו וממתינות להחלטה.”

הטקסט שהכרטיס נושא: „ביקורות שמישהו דיווח עליהן ואף אחד עוד לא הסיר. ההסרה מסתירה את הביקורת מהעמוד הציבורי ומהממוצע — היא לא מוחקת אותה, כדי שאפשר יהיה לבדוק את ההחלטה בדיעבד. סיבה היא חובה.”

שדה סיבת ההסרה (חובה, נשמרת עם ההחלטה), כפתור הסרת הביקורת → „להסיר את הביקורת מהעמוד הציבורי ומהממוצע?” → כן, להסיר.

12. קבוצה: מערכת

שלוש לשוניות: לוח יד שנייה · מתגי תכונות · יומן פעולות.

קבוצת מערכת פתוחה
הקבוצה מערכת.

12.1 לוח יד שנייה

כרטיס לוח יד שנייה בניהול
שלוש עבודות בכרטיס אחד, כל אחת עם הרשאה משלה.
מקטעהרשאהמה יש בו
מכסת פרסומים לחודשplatform.setting.manage מכסה לכל המשתמשים + שמירת המכסה (ברירת מחדל 5); מזהה ציבורי של המשתמש + המכסה שלו (ריק = ביטול החריגה) + שמירת החריגה.
קטגוריות הלוחplatform.catalog.approve קטלוג רגיל: הוספה, שינוי שם, סדר, כיבוי.
פרסומים שדווחוplatform.moderation.decide סיבת ההסרה (חובה, נשמרת עם ההחלטה והמוכר רואה אותה) + הסרת הפרסום.

הכרטיס מופיע אם מחזיקים לפחות אחת מהשלוש. הכלל שכדאי לזכור: „חשבון שמנהל חנות לא יכול לפרסם בלוח.”

הסרת פרסום מוחקת את קבצי התמונות

„להסיר את הפרסום ולמחוק את התמונות שלו?” → כן, להסיר. שורת הפרסום עצמה נשארת עם מי הסיר, מתי ולמה, והמוכר קורא את הסיבה. כשמנהל תוכן מסיר — „הפרסום הוסר והמקום במכסה הוחזר למוכר.” כשהמוכר מסיר בעצמו, המקום לא חוזר.

12.2 מתגי תכונות

הרשאה: platform.feature_flag.toggle. לתצוגה בלבד.

כרטיס מתגי תכונות: תשעה מתגים ומצבם
תשעה מתגים: לוח משרות · הזמנת צוות למועדון · מגרשים ברגע האחרון · לוח מודעות · טורנירים · מבצעים · תשלומים · שליחת פושים · שליחת קמפיינים. לכל שורה שם, קוד, שבב פעיל/כבוי, והערת אישור.

אין כאן מתג, ואין endpoint שכותב

„הדלקת מתג היא החלטת מוצר עם השלכות משפטיות וכספיות, והיא שלך בלבד. עמודת האישור ריקה בכולם, וזו התשובה.” המסך אומר מה דלוק ומה כבוי, ומי אישר — ותו לא. הדלקה או כיבוי נעשים בשרת, בתוך בסיס הנתונים, ורק אחרי החלטה מתועדת.

12.3 יומן פעולות

הרשאה: platform.audit.read — מנהל מערכת בלבד.

כרטיס יומן פעולות: רשימת פעולות עם מסננים
מסננים: סוג פעולה (עם ספירה לכל סוג), מי ביצע, מתאריך, עד תאריך ו־הצגה. בתחתית עוד שורות ומונה „מוצגות N מתוך M שורות.”

כל שורה נושאת: תיאור בעברית וגם את הקוד — מסך שמראה רק פרוזה אי אפשר להצליב מול בסיס הנתונים; זמן; „בוצע על ידי ‹שם›” או „ללא משתמש מזוהה”; הישות; הארגון; ו„סיבה: ‹טקסט›” כשיש.

המסנן החשוב ביותר הוא מזהה הבקשה

כל שורה שנכתבה בטיפול באותה בקשה נושאת את אותו מזהה בקשה. זה מה שהופך את „מה קרה כשזה השתבש” משעה של חיטוט לשאילתה אחת. המסך אינו חושף אותו כמסנן, אבל ה־API כן — וכך גם השאילתה הישירה בסעיף התפעול.

„אין דרך לכתוב, לערוך או למחוק שורת יומן.” POST, PATCH ו־DELETE כולם מוחזרים 405. יומן שאפשר לתקן אינו יומן.

13. תחרות מקצה לקצה

שני צירים נפרדים, ארבעה מצבים, הגרלה אחת שנועלת כמעט הכול.

אין „שבעה סוגי תחרות” במובן של מבנה

יש שבעה ערכים בבורר סוג התחרות — הם אומרים מי משחק — ובנפרד ארבעה ערכים בבורר מבנה, שאומרים איך הלוח בנוי. בלבול בין השניים הוא הטעות הנפוצה ביותר בשיחה על המודול הזה.

13.1 שבעת ערכי סוג התחרות

התווית במסךמה מייחד
יחידיםיחידים בלי הגבלת מגדר. ברירת המחדל של כל תחרות.
יחידים גבריםיחידים; המגדר בפרופיל נבדק בכשירות ההרשמה.
יחידים נשיםאותו כלל, הפוך.
זוגותהצד הוא זוג, בלי הגבלת מגדר.
זוגות גבריםמגבלת המגדר חלה על שני בני הזוג.
זוגות נשיםאותו כלל.
זוגות מעורבנדרש אחד מכל מגדר. מי שלא הצהיר מגדר בפרופיל פשוט אינו יכול להירשם.

הצירוף השמיני, „יחידים מעורב”, נדחה גם בשירות וגם באילוץ במסד — הוא לא קיים. הבחירה יחידים/זוגות ננעלת ברגע שיש נרשם ראשון.

13.2 ארבעת ערכי מבנה

התווית במסךאיך הלוח בנוימדריך
נוקאאוט הדחה ישירה. גודל הלוח הוא החזקה של 2 מעל מספר הנרשמים, עד 128. זה המבנה היחיד שבו קיימת הגרלת תנחומים. GUIDE_TOURNAMENT_KNOCKOUT_HE.html
בתים בתים בלבד, בלי שלב הדחה. אין דירוג חוצה־בתים, ולכן כולם מקבלים ניקוד השתתפות; אלוף נקבע רק אם יש בית אחד. אין מדריך
בתים ואז נוקאאוט שניים מכל בית עולים ללוח. הצלבה קבועה ל־2, 4 או 8 בתים; במספר אחר — הגרלה חוזרת עד שאין זוג מאותו בית בסיבוב הראשון. GUIDE_TOURNAMENT_GROUPS_KO_HE.html
בתים עם דירוג סופי כולם מדורגים יחד, הדירוג נחתך לרביעיות, וכל רביעייה משחקת על המקומות שלה. לכל משתתף יוצא מקום סופי מדויק. GUIDE_TOURNAMENT_POOLS20_HE.html

מדריך רביעי, GUIDE_TOURNAMENT_DOUBLES_HE.html, חוצה מבנים ומכסה את ארבעת סוגי הזוגות. ארבעת המדריכים יושבים לצד החוברת הזאת, בתיקיית docs/.

13.3 מחזור החיים

מ־הכפתוראלמה נדרש
טיוטהפרסוםפורסמה חובה תאריך התחלה, אחרת הטופס נעצר.
פורסמהסגירת ההרשמהההרשמה נסגרה
ההרשמה נסגרהפתיחת ההרשמה מחדשפורסמה
כל מצבביטול התחרות…בוטלה סיבת הביטול (תוצג לנרשמים) — חובה.
בוטלה קפואה. אי אפשר לערוך, אי אפשר להחזיר, ויום התחרות חסום.

סגירת ההרשמה האוטומטית לא משנה מצב

כשעובר מועד סגירת ההרשמה, או כשהתחרות מתחילה, ההרשמה נחסמת — אבל המצב נשאר פורסמה. רק לחיצה על סגירת ההרשמה כותבת ההרשמה נסגרה. אל תסיק מהמצב שההרשמה עדיין פתוחה.

שני צירים נוספים שמופיעים על המסך: טרם הוגרל · הוגרל · במשחק · הסתיימה למצב הלוח; ו־רשום/ה · ברשימת המתנה · ביטל/ה · נדחה/תה לנרשם. משחק: ממתין · נקבע · שוחק · ויתור · פרישה · עולה בלי משחק.

13.4 מי רשאי — שתי סמכויות, ואין שלישית

  1. מנהל מערכת עם platform.tournament.manage (ניהול תחרויות) — פועל על כל תחרות, ורשאי לפתוח תחרות בלי מועדון.
  2. מנהל של מועדון מפורסם שהוא גם נותן שירות מאושר — פועל רק על תחרויות המועדונים שלו. תחרות של מועדון אחר עונה 404, לא 403.

מי שלא אושר כנותן שירות מקבל סירוב עם provider_not_approved; מי שיש לו רק עסק או חנות, או מועדון בטיוטה, מקבל no_published_club.

„מנהל התחרות” אינו תפקיד במערכת. אלה ארבעה שדות טקסט בטופס — שם מנהל התחרות, טלפון, אימייל וכתובת — והטלפון והאימייל מוחזרים רק למי שמחובר. ברשימה הציבורית מוצג השם בלבד.

13.5 ההגרלה

מסך התחרויות של השחקן
מסך תחרויות. תחת שבבי הענפים יושב לוח תחרויות ל-PDF.
רשימת הנרשמים לתחרות
מי נרשם (N) — רשימת הנרשמים הפומבית, שמות בלבד. כשאין נרשמים הכפתור מושבת והטקסט הוא „עוד אף אחד לא נרשם”.
לוח התחרות פתוח בתוך כרטיס התחרות
לוח התחרות אינו ניווט — הוא מתג שפותח את גיליון ההגרלה בתוך הכרטיס עצמו.
מסך ניהול התחרות אחרי קפיצה מהכרטיס
לניהול התחרות (הגרלה, תוצאות) הוא כפתור קפיצה: הוא עובר למסך הניהול, פותח את הלשונית תחרויות ופורש את הפאנל של אותה תחרות. מוצג רק למי שיש לו סמכות עליה.

כמה מדורגים? המספר לא מוקלד — הוא נגזר מגודל הלוח: עד 8 → שניים, עד 16 → ארבעה, עד 32 → שמונה, עד 64 → שישה־עשר, מעבר → שלושים־ושניים.

איך מגרילים. הגרלה פותח רשימה ממוספרת שסדרה הוא סדר ההרשמה. סדר לפי דירוג מסדר לפי הדירוג המחושב מתוצאות (הגבוה ראשון; מי שאין לו — בסוף). החיצים ▲/▼ מזיזים שורה. בצע הגרלה שואל לפני שהוא מבצע: כן, להגריל / לא.

שיבוץ המדורגים בנוקאאוט: בלוח 8 — מספר 1 לשורה 1 ומספר 2 לשורה 8; בלוח 16 — 1 ו־16, והזוג 3–4 לשורות 5 ו־12; בלוח 32 — 1 ו־32, הזוג 3–4 ל־9 ו־24, והרביעייה 5–8 ל־8, 16, 17 ו־25. בתוך כל קבוצה ההגרלה אקראית. חופשים ממלאים את החוסר עד החזקה של 2, ניתנים למדורגים לפי הסדר, ולעולם לא שניים באותו משחק. מי שקיבל חופש עובר לסיבוב הבא כבר בזמן ההגרלה.

בבתים: מספר הבתים הוא תקרת (נרשמים ÷ גודל בית), והגדלים נבדלים ב־1 לכל היותר. ראשי הבתים הם המדורגים הבכירים, ואחריהם דרג נוסף אחד לכל בית באקראי. גודל בית: 3 שחקנים, 4 שחקנים או 5 שחקנים.

מה ההגרלה נועלת

הרמז שמופיע בטופס אחרי ההגרלה, מילה במילה:

„הלוח כבר הוגרל: המבנה, התנחומים, המדורגים וגודל הבית קפואים. רק הפורמט ניתן לשינוי.”

הגרלה מחדש מוחקת את הלוח הקיים ובונה אותו מאפס. אחרי התוצאה הראשונה הכפתור נעלם לגמרי — הלוח הוא היסטוריה, והדרך היחידה אחורה היא ביטול תוצאות אחת־אחת.

ביטול תוצאה אפשרי רק כל עוד אף אחד מהשניים לא שיחק הלאה. הזנת תוצאה על משחק ששוחק מסורבת — קודם ביטול, אחר כך הזנה מחדש.

היומן שומר את זרע ההגרלה בשורה tournament.draw, יחד עם המדורגים, החופשים, גודל הלוח והבתים — כך שאפשר לשחזר בדיוק כל הגרלה בדיעבד.

13.6 ניקוד ודירוג — שלושה מספרים שאסור לבלבל

המספרמה הואמתי משתנה
הניקוד שליהישגים בתחרויות בשנה האחרונה. פעם אחת, בסוף התחרות.
לפי תוצאות (ELO)דירוג מחושב ממשחק למשחק — תחרות ורמה כאחת. בכל תוצאה שנרשמת, לאורך כל הדרך.
רמההצהרה עצמית של השחקן בפרופיל. רק כשהוא משנה אותה בעצמו.

אף אחד משלושתם אינו קורא את השני.

מתי ניקוד נזקף: ברגע שהלוח מגיע להסתיימה, באותה טרנזקציה של התוצאה האחרונה. ביטול שמחזיר את הלוח אחורה מבטל גם את הניקוד. כישלון בזקיפת ניקוד לעולם לא חוסם הזנת תוצאה.

הערכים: אלוף 100 · סגן 75 · חצי גמר 50 · רבע גמר 35 · שמינית 25 · סיבוב 32 = 15 · השתתפות 5. מנצח התנחומים מורם לניקוד השמינית, לעולם לא מעבר לרבע גמר, ורק אם זה יותר ממה שהלוח הראשי כבר נתן.

פקיעה: הניקוד תקף מתאריך התחלת התחרות ועד אותו תאריך בשנה שאחריה, לא כולל. השורה לא נמחקת — היא נשארת ביומן ומפסיקה להיספר.

בזוגות: דירוג הזוג הוא ממוצע השניים, והתוצאה מזיזה את שניהם באותו הפרש. שחקן חדש בסולם הזוגות מתחיל מדירוג היחידים שלו אם יש לו. הסולמות לעולם לא מתערבבים. בניקוד — שני בני הזוג מקבלים את ניקוד השלב במלואו, לא חצי כל אחד.

13.7 לוח זמנים, PDF ודואר

לוח זמנים

PDF

שני כפתורי PDF שנראים אותו דבר ואינם אותו דבר

שני הכפתורים הנוספים באותו סרגל: סדר משחקים ל-PDF ו־ תוצאות ל-PDF, שניהם במקף רגיל.

דואר תחרויות

14. המודולים

מה כל מודול עושה, מה בו של המנהל, ומה בו קורה מעצמו.

14.1 מגרשים ברגע האחרון

„דקה 90”: מועדון מפרסם משבצת על מגרש שהתפנה, עם מחיר רגיל ומחיר מבצע, ושחקן לוקח אותה. רק מועדון שמצבו „מפורסם” יכול למכור; מנהל פלטפורמה אינו יכול לפרסם הצעה בשם מועדון. הלקיחה יוצרת הזמנה מסוג מגרש ברגע האחרון שנולדת ישר במצב אושרה — אין שלב „המועדון מאשר”.

אין לשונית ניהול למודול הזה. הכול נעשה מכרטיס המועדון בלשונית המועדונים שלי: + מגרש חדש, + פרסום הצעה, ו־ביטול ההצעהכן, לבטל / להשאיר. הצעה שנתפסה אי אפשר לבטל. הרשאות: org.profile.edit למגרשים, org.court_offer.publish להצעות.

המנהל נוגע במודול רק בעקיפין: השהיית מועדון עוצרת מכירה, ומתג מגרשים ברגע האחרון בכרטיס מתגי תכונות מחליט אם המודול קיים בכלל. אין worker ואין משימה מתוזמנת — הצעה שחלונה עבר פשוט מפסיקה להופיע.

שלב חיים נוסף קיים בקוד ואינו מתועד ב־docs/COURTS_HE.md: אחרי „נתפסה” המועדון מאשר תשלום ומוסר קוד שער לשחקן.

14.2 קורסים והשתלמויות

לוח קורסים, סדנאות והשתלמויות. הלב הוא רשימת ההיתרים — רק מי שנמצא בכרטיס מפרסמי קורסים יכול לפרסם. אין תשלום דרך המערכת; המחיר הוא מידע.

מצבים: טיוטה · פורסם · מלא · הסתיים · בוטל. מלא אינו החלטה של אף אחד — הוא נגזר מספירת הנרשמים וחוזר לפורסם כשמישהו מבטל. קורס מלא לא דוחה אלא מכניס לברשימת המתנה, בלי קידום אוטומטי — המפרסם מעביר ידנית.

המנהל אינו עורך, מפרסם או מבטל קורסים של אחרים — אין מסך כזה. הוא שולט ברשימת המפרסמים בלבד. ביטול קורס דורש סיבה, מקפיא את הקורס, משאיר את כל ההרשמות כפי שהן, ולא שולח שום הודעה.

14.3 לוח יד שנייה

לוח ציוד משומש בין אנשים פרטיים. הלוח עצמו ציבורי; הטלפון פשוט אינו קיים בתשובת השרת לקורא שאינו מחובר — הוא לא מוסתר בעיצוב.

מצבים: טיוטה · מפורסם · נמכר · פג תוקף · הוסר. מצב הפריט: חדש · כמו חדש · משומש · לחלקים. פרסום פג אחרי 60 יום — אין משימה מתוזמנת, הפקיעה מחושבת בקריאה.

המנהל שולט במכסה החודשית, בקטגוריות הלוח ובתור ההסרה — ראו סעיף 12.1.

14.4 ביקורות

דירוג חד־צדדי של לקוח על נותן שירות, 1–5 כוכבים וטקסט חופשי. ביקורת נולדת מבקשה שהושלמה, לא מכתיבה חופשית, ותוקפה 30 יום: „אפשר לכתוב ולערוך עד 30 יום מסיום השירות…”, ואחר כך „החלון לכתיבת ביקורת נסגר (30 יום מסיום השירות).”

אין למודול פריט תפריט. הכתיבה נעשית מההזמנות שלי, בכפתור כתיבת ביקורת / עריכת הביקורת. לנותן השירות מגיעה תגובה אחת בלבד לכל ביקורת.

הציון והביקורות מוצגים בפומבי רק אחרי חמש התקשרויות שהושלמו — התקשרויות, לא ביקורות. עד אז הכרטיס נושא את התג חדש. ביקורות לעולם לא משפיעות על סדר החיפוש.

התזכורות רצות מעצמן — אבל אין להן מסך

הסריקה שמזמינה לכתוב ביקורת, ומזכירה אחרי שבעה ימים, היא POST /admin/reviews/remind, והיא מתוזמנת: המשימה Racquet_Review_Sweep מריצה אותה כל יום ב־06:10 תחת חשבון SYSTEM. אומת מול השרת ב־8.9.2026.

מה שאין לה זה מסך. אין באפליקציה כפתור להריץ אותה עכשיו, ואין שום מקום שאומר מתי היא רצה לאחרונה או מה היא עשתה — התשובה היחידה נמצאת בקובץ C:\Racquet\logs\sweeps.log בשרת. שורה תקינה משם:

2026-09-08 00:55:03  reviews  200 {"considered":0,"invited":0,"reminded":0,
                                    "failed":0,"mail_configured":true}

הסריקה אידמפוטנטית — כל שורה מסומנת ברגע שהמייל יצא — ולכן בטוח להריץ אותה שוב ביד: schtasks /run /tn Racquet_Review_Sweep. דורשת platform.user.mail.

14.5 רמות (ליגות)

ראו סעיף 8.2. שוברי השוויון, לפי הסדר: המשחק ביניהם → אחוז מערכות → אחוז משחקונים → הגרלה עם זרע שנשמר. משחקי ליגה מזינים את ה־ELO בדיוק כמו משחקי תחרות. משחק שעבר את תאריך היעד מסומן „באיחור” — ההחלטה מה לעשות בו היא של המנהל, לא של המערכת.

14.6 דירוגים

ראו סעיף 8.3. הנקודה שחוזרת: תיקון ידני הוא שורה ביומן, לא עדכון שקט, והוא גם חוסם ביטול תוצאה בלוח אם נרשם אחריו. שני סולמות נפרדים — יחידים וזוגות — וחישוב מחדש מריץ את הסולם שנבחר בלבד.

14.7 SOS

קריאה דחופה: מנהל מועדון מפורסם או נותן שירות מאושר מפרסם צורך מיידי („המאמן חולה, צריך מחליף ל־17:00”), והמערכת מיידעת עד 30 נותני שירות מתאימים באזור. הפותח בוחר אחד — אין תשלום, אין הסלמה, אין SMS ואין פוש.

שלוש לשוניות: לפתוח SOS · SOS פתוחים בשבילי · ה־SOS שלי. מצבים: פתוח · נבחר מישהו · בוטל · פג. „אני זמין” אפשר לענות פעם אחת בלבד. הקריאה פגה אחרי שש שעות, והתפוגה מחושבת בקריאה — אין worker.

אין מסך ניהול ל־SOS, ולא הצלחנו לצלם את המסך

קיים מסלול שרת שמציג את כל הקריאות למי שמחזיק platform.support.read, אבל המסך לא נבנה ואין SOS בין 26 כרטיסי הניהול. היום מנהל עוקב אחרי SOS רק דרך יומן פעולות — קודי הפעולה מתחילים ב־sos..

בנוסף: פריט התפריט SOS נתלה רק לנותן שירות מאושר או למנהל מועדון מפורסם. חשבון ניהול נקי אינו רואה אותו, ולכן אין כאן צילום של המסך.

14.8 מחנות אימונים ואקדמיות

שני דברים נפרדים באותו מסך:

הקהל של מחנה נעול אחרי הנרשם הראשון

כל עוד אף אחד לא נרשם אפשר לתקן; מרגע ההרשמה הראשונה השדה קפוא. בנוסף, המסד עצמו מונע רישום קטין בלי שם, תאריך לידה, שם מלווה וטלפון מלווה — ויומן הביקורת לא נושא אף אחד מהפרטים האלה. אין במערכת שום מידע רפואי, ויש בדיקה אוטומטית שנופלת אם מישהו יוסיף שדה כזה.

אין לשונית ניהול לאקדמיות

התיעוד מבטיח לשונית אקדמיות מומלצות במסך הניהול — היא אינה קיימת. ניהול האקדמיות אפשרי היום רק דרך ה־API, ובלעדיו הרשימה הציבורית תישאר ריקה.

14.9 אזורי שירות

שבעה אזורים — צפון · חיפה והקריות · השרון · מרכז · ירושלים והסביבה · דרום · כל הארץ / אונליין — ומתחתם 32 תת־אזורים. זה הבסיס לכל סינון מיקום במוצר.

אין מסך ניהול לאזורים, בכוונה. הוספה, פיצול או שינוי שם דורשים מיגרציה בבסיס הנתונים, כי תת־אזור שמישהו כבר בחר מקושר משלוש טבלאות, ופיצול הוא החלטת מוצר — לאן עוברים מי שבחרו את הישן. משתמש בוחר עד 12 תת־אזורים.

כלל התנהגות אחד שכדאי לדעת: מי שלא בחר אזורים מוצג בכל סינון אזור — החיפוש קורא „אין אזור” כ„מוצע בכל מקום”.

14.10 נותני שירות ושירותים

ראו סעיף 6.3 לאישור האדם. מעבר שירות למצב מפורסם נחסם על שלושה שערים, וכולם צריכים להיפתח:

  1. האדם חייב להיות מאושר כנותן שירות.
  2. חייב להיות לו לפחות תת־אזור אחד. ההודעה במסך: „אזור פעילות הוא חובה לפרסום…” עם כפתור לבחירת אזורים.
  3. קטגוריה שמסומנת דורש תעודה (שופטים וכדומה) מתפרסמת רק למי שמחזיק תעודה מאושרת אחת לפחות.

שירות של ארגון פטור מהראשון והשלישי — המועדון עונה על אנשיו. מצבי שירות: טיוטה · מפורסם · מושהה · בארכיון. סוגים: אימון · שזירה · שותף לאימון · שותף למשחק · כושר · טיפול · אחר.

גישה לשירות שאינו שלך מוחזרת כ־404, לא 403 — מכוון: 403 היה מאשר שהשירות קיים למי שסורק מזהים.

15. תפעול השרת

מה רץ מעצמו, מתי, איפה הלוגים, ומה עושים כשמשהו נופל.

15.1 ארבע המשימות המתוזמנות

שם המשימהמתימה היא עושה
Racquet_APIבעלייה מפעילה את שרת ה־API על 127.0.0.1:8790.
Racquet_DB_Backup05:00 כל יום גיבוי מלא של בסיס הנתונים, העלאה ל־Google Drive, וניקוי ישנים.
Racquet_Mail_Sweepכל 15 דקות שולחת את תור דואר התחרויות.
Racquet_Review_Sweep06:10 כל יום סריקת הביקורות.

לראות את כולן בבת אחת, בשרת:

Get-ScheduledTask | Where-Object { $_.TaskName -match 'Racquet' } |
  ForEach-Object { $_.TaskName + '(' + $_.State + ')' }

הרצה ידנית: schtasks /run /tn Racquet_Mail_Sweep, או ישירות powershell -NoProfile -ExecutionPolicy Bypass -File C:\Racquet\racquet_sweeps.ps1 -Job reviews.

ארבע המשימות האלה הן כל מה שרץ מעצמו

אומת בשרת ב־8.9.2026: הפקודה שלמעלה מחזירה בדיוק את ארבע השורות האלה ולא יותר. לכן בכל מקום בחוברת שכתוב „אין worker ואין משימה מתוזמנת” על מודול — מגרשים, לוח יד שנייה, SOS, קורסים, מחנות — זו בדיקה שנעשתה, לא הנחה.

ומלכודת אחת בלוח המשימות של Windows: משימה שעדיין לא הגיע זמנה מציגה LastTaskResult = 267011 ותאריך ריצה אחרון של 1999. זה 0x41303 — „המשימה עוד לא רצה” — ואינו כישלון. כך נראה Racquet_Review_Sweep ביום שנוצר.

קוד יציאה 0 בסריקה אינו מוכיח שהיא הצליחה

הסקריפט מחזיר 0 גם כשהשרת ענה 500 — במכוון, כי משימה שנכשלת בקול רם כל רבע שעה מלמדת אנשים להתעלם ממנה. רק C:\Racquet\logs\sweeps.log אומר את האמת. קוד יציאה 1 קיים רק כשההזדהות נכשלה.

15.2 הגיבוי הלילי, והשחזור

הגיבוי רץ ב־05:00 ולא בשעה אחרת. הוא מייצר קובץ בשם Racquet_yyyy-MM-dd_HHmm.bak בתיקייה C:\Backups\Racquet\ — למשל Racquet_2026-09-07_0500.bak, בערך 30MB — ורושם ל־ C:\Backups\Racquet\backup.log.

שמירה: שבעת הקבצים האחרונים מקומית — ספירה, לא ימים (-LocalKeepCount 7) — ושלושים יום ב־Google Drive. כשל בהעלאה לענן אינו מפיל את הגיבוי; הקובץ המקומי בטוח, והלוג יאמר זאת.

לאן הקובץ באמת נוסע — לקרוא לפני שצריך לשחזר

העותק בענן אינו יושב בתיקייה בשם RACQUET. המשימה מריצה את הסקריפט עם -RemoteBase gdrive:DataPulse-BackUp, והקובץ נוחת תחת תאריך הלילה:

gdrive:DataPulse-BackUp/<yyyy-MM-dd>/Racquet/Racquet_<yyyy-MM-dd>_0500.bak

זו תיקיית הגיבויים המשותפת לכל פרויקטי DataPulse. מי שיחפש gdrive:Racquet-Backups לא ימצא שם דבר.

לילה תקין נראה כך — שורות אמיתיות מהשרת, מהגיבוי של 7.9.2026:

2026-09-07 05:00:01  === Racquet backup start ===
2026-09-07 05:00:03  SQL backup OK: C:\Backups\Racquet\Racquet_2026-09-07_0500.bak (31.1 MB)
2026-09-07 05:00:44  uploaded to gdrive:DataPulse-BackUp/2026-09-07/Racquet
2026-09-07 05:14:49  drive retention applied (removed > 30 d under gdrive:DataPulse-BackUp/*/Racquet)
2026-09-07 05:14:49  local backups kept: 7 (ceiling 7)
2026-09-07 05:14:49  === Racquet backup done ===

שחזור

rclone copy gdrive:DataPulse-BackUp/2026-09-07/Racquet/Racquet_2026-09-07_0500.bak ^
  C:\restore\ --config C:\Backups\rclone.conf
RESTORE DATABASE [Racquet]
FROM DISK='C:\restore\Racquet_2026-09-07_0500.bak'
WITH REPLACE;

אם צריך לרשום את המשימה מחדש מאפס:

schtasks /create /tn Racquet_DB_Backup ^
 /tr "powershell -NoProfile -ExecutionPolicy Bypass -File C:\Backups\backup_db.ps1 ^
      -Database Racquet -Dir C:\Backups\Racquet -RemoteBase gdrive:DataPulse-BackUp ^
      -RcloneExe C:\Backups\rclone\rclone.exe -RcloneConf C:\Backups\rclone.conf ^
      -LocalKeepCount 7" ^
 /sc DAILY /st 05:00 /ru SYSTEM /rl HIGHEST /f

זו בדיוק שורת הפעולה הרשומה במשימה היום — הועתקה מהשרת, לא נבנתה מהזיכרון.

חמש אזהרות על הגיבוי

15.3 הפריסה ושלושת השערים

הפריסה מעלה גרסה חדשה של הקוד ושל העמודים. יש בה שלושה שערים, לא שניים:

  1. שער הסכימה. משווה את מספר המיגרציה שהמסד נמצא בו למספר שהקוד דורש. הודעת כשל אמיתית: The database is at migration 70 and this code needs 71. Nothing was uploaded.שום דבר לא הועלה.
  2. שער העמודים. מהדר — ולעולם לא מריץ — כל סקריפט פנימי בכל קובץ RACQUET_*.html. שגיאת תחביר אחת עוצרת את הפריסה לפני ההעלאה. זה בדיוק הכשל שהדליף פעם סיסמה לשורת הכתובת.
  3. שער הזמינות. אחרי ההחלפה, קריאה ל־/readiness ול־/health. שער זה מדווח ולא מונע — אם הוא נכשל, הקוד כבר עלה.

אין גלגול אחורה אוטומטי בפריסה

לפני כל פריסה נשמר עותק מלא של backend ושל public תחת C:\Backups\Racquet\deploy_<stamp>\ (חותמת הזמן של הפריסה). גלגול אחורה = להעתיק את התיקייה הזאת חזרה ידנית ולהפעיל מחדש את Racquet_API. אין פקודה אחת שעושה את זה.

מקרה שכדאי להכיר: אם השער השני נכשל באמצע פריסה מלאה, ייתכן מצב של קוד חדש בשרת ועמודים ישנים חיים. אז — לשחזר מהתיקייה הנ״ל.

להבדיל מזה, סקריפטי ה־nginx כן מגלגלים לבד: הם שומרים גיבוי מתוארך, בודקים את התצורה, טוענים מחדש, מוודאים שכל האתרים עונים, ומשחזרים בכשל.

15.4 איפה הלוגים

מהאיפהמתגלגל?
ה־APIC:\Racquet\logs\api.log כן, יומי — api.log.2026-09-07 וכדומה
הסריקותC:\Racquet\logs\sweeps.logלא
הגיבויC:\Backups\Racquet\backup.logלא
nginxC:\nginx\logs\access.log לא — 597MB
הפריסהאין לוג פריסה כלל — נבדק: ב־C:\Backups\Racquet יש רק קבצי .bak, backup.log ותיקיות deploy_*.

שורת גישה תקינה ב־nginx נראית כך:

93.172.44.10 - - [08/Sep/2026:06:10:04 +0300] "GET /racquet/app/ HTTP/1.1" 200 1348406
  "https://www.data-pulse.co.il/racquet/" "Mozilla/5.0 (iPhone; ...)"

בשרת מחכים כמה כלי ניתוח מוכנים, כולם לקריאה בלבד, תחת Scripts\server\: errors_since.py (כל שגיאות ה־5xx של היום לפי שעה), errors_detail.py, cr_traffic.py, sessions_today.py, support_today.py.

15.5 לקרוא את יומן הביקורת ישירות

המסך יומן פעולות נותן את רוב מה שצריך, אבל לא את מסנן מזהה הבקשה — שהוא המסנן החזק ביותר. מול בסיס הנתונים:

USE Racquet;
GO
SET NOCOUNT ON;
DECLARE @action    nvarchar(120)    = N'tournament.';  -- prefix; NULL = all
DECLARE @actorName nvarchar(200)    = NULL;
DECLARE @since     datetime2(3)     = '2026-09-01';
DECLARE @until     date             = '2026-09-08';
DECLARE @corr      uniqueidentifier = NULL;

SELECT TOP (200)
       a.id, a.created_at, a.action_code, a.entity_type, a.entity_reference,
       a.correlation_id, a.reason, a.safe_metadata,
       u.public_id AS actor_public_id, p.display_name AS actor_name,
       o.name AS organisation_name
FROM dbo.AuditEvents a
LEFT JOIN dbo.Users         u ON u.id      = a.actor_user_id
LEFT JOIN dbo.Profiles      p ON p.user_id = a.actor_user_id
LEFT JOIN dbo.Organisations o ON o.id      = a.organisation_id
WHERE (@action    IS NULL OR a.action_code  LIKE @action + N'%')
  AND (@actorName IS NULL OR p.display_name LIKE N'%' + @actorName + N'%')
  AND (@corr      IS NULL OR a.correlation_id = @corr)
  AND (@since     IS NULL OR a.created_at   >= @since)
  AND (@until     IS NULL OR a.created_at    < DATEADD(day, 1, @until))
ORDER BY a.id DESC;
GO

הרצה בשרת: sqlcmd -S SERVER2\SQLEXPRESS -E -d Racquet -I -b -i <file.sql>.

שתי עובדות על היומן שכדאי להכיר: הוא נכתב בתוך אותה טרנזקציה של השינוי שהוא מתאר — הרשומה והשינוי מתחייבים או מתגלגלים אחורה יחד; והוא מסרב לכתוב מפתחות רגישים (סיסמה, טוקן, סוד, הרשאה) ויזרוק שגיאה במקום לשמור אותם.

16. מה אי אפשר להחזיר

הפרק שכדאי לקרוא לפני הלחיצה, לא אחריה.

שלוש הפעולות שאין להן שום דרך חזרה

  1. חישוב מחדש לענף (דירוגים) — מוחק כל תיקון ידני וכל איפוס בענף. הם אינם משחקים, ואי אפשר לבנות אותם מחדש משום מקום.
  2. אישור וסגירת העונה (רמות (ליגות)) — כותב עלייה וירידה. יש תצוגה מקדימה; היא השלב האחרון שאפשר לעצור בו.
  3. ביטול התחרות… — התחרות קפואה לצמיתות. אי אפשר לערוך, אי אפשר להחזיר, ויום התחרות נחסם.

פעולות שמוחקות קבצים מהדיסק

פעולות שיוצאות החוצה ואי אפשר לשלוף

פעולות שנעולות מרגע מסוים ואילך

מה דווקא כן הפיך, ומבלבל

ארבע פעולות הרסניות שלא רושמות סיבה ביומן

הסרת תפקיד, מחיקת פריט קטלוג, הסרת תמונת פרופיל, ומייל המוני. היומן ידע מי ומתי, אבל לא למה. אם הפעולה חריגה — כתוב את הסיבה בבקשת שינוי או בפנייה, כדי שתישאר עקבה.

17. מה עוד לא נסגר

דברים שנמצאו תוך כדי כתיבת החוברת ומעבר על המערכת החיה. אף אחד מהם אינו חוסם עבודה — אבל מנהל שלא יודע עליהם יבזבז זמן.

17.1 פערים במוצר

  1. אין מסך ניהול ל־SOS. מסלול השרת קיים, המסך לא נבנה.
  2. אין מסך ניהול לאקדמיות מומלצות. ניהול רק דרך ה־API, ובלעדיו הרשימה הציבורית ריקה.
  3. אין מדריך למבנה „בתים”. ארבעת המדריכים מכסים שלושה מבנים מתוך ארבעה.
  4. לשתי הסריקות אין מסך. שתיהן מתוזמנות ורצות (Racquet_Mail_Sweep כל 15 דקות, Racquet_Review_Sweep ב־06:10) — אבל אין באפליקציה כפתור להריץ אחת מהן עכשיו, ואין שום מסך שאומר מתי הן רצו לאחרונה. כדי לדעת, צריך לפתוח את sweeps.log בשרת.
  5. דואר תחרויות לא נכתב לתור בתחרות זוגות. פער מוכר.

17.2 באגים קטנים במסך

  1. לשונית עסקים וחנויות אומרת „N מועדונים” ו„אין מועדונים שמתאימים לסינון.”
  2. כל חמשת הקטלוגים אומרים „+ קטגוריה חדש” ו„אין קטגוריות שמתאימים לסינון” — התבנית מקודדת בזכר.
  3. חמש הרשאות מוצגות כקוד באנגלית על מסך עברי.
  4. בכרטיס נותני שירות, הכפתור אישור מוצע גם על שורה שכבר נדחתה — והופך דחייה מנומקת בלחיצה אחת בלי אישור.
  5. ליד ההזמנות שלי בתפריט נדבק מונה גם כשהוא אפס.
  6. תיאורי רמות הטניס בלשונית הרמה שלי מסומנים טיוטה ומכילים שגיאות כתיב — הם עדיין לא הוגהו.
  7. בכרטיס תפקידים, שורת „טוען…” אינה נעלמת גם אחרי שהנתונים הגיעו, וחמשת כרטיסי התפקידים תופסים מקום בעמוד בלי להיצבע בצילום אוטומטי. התוכן קיים במסמך העמוד — ראו את ההערה בסעיף 6.2.
  8. לחיצה על הרמה שלי או על SOS בתפריט אינה עושה דבר כשהפריט לא נתלה לחשבון — וזה תקין; אבל שני המסכים האלה אינם נגישים לחשבון ניהול נקי, ולכן אין להם צילום בחוברת.

17.3 פערים תפעוליים

המספרים כאן נמדדו בשרת ב־8.9.2026, לא נאמדו.

  1. יומן הגישה של nginx הוא 597MB ואינו מתגלגל. C:\nginx\logs\access.log גדל ברציפות מ־4.5.2026. בכונן נותרו 7GB פנויים מתוך 50 — זהו צרכן הדיסק הגדול ביותר בשרת, והוא היחיד ברשימה הזאת שיש לו מועד.
  2. קובץ הגיבוי ב־Google Drive אינו מוצפן, והוא עותק מלא של כל הטלפונים והתעודות.
  3. ההעלאה לענן תפוג במהלך 2026 — rclone עדיין משתמש ב־client_id המשותף שגוגל מוציאה משימוש. מתועד כאזהרה בכל לילה ב־backup.log.
  4. אין מדיניות שמירה ליומן הביקורתdbo.AuditEvents גדל בלי גבול, ולא הוגדר לו שום ניקוי.
  5. sweeps.log ו־backup.log אינם מתגלגלים. (api.log דווקא כן, יומי.)
  6. 81 תיקיות C:\Backups\Racquet\deploy_*, יחד 0.33GB, מ־6.9.2026 ואילך — אף אחת לא נמחקת. בקצב הזה זה עוד לא כואב, אבל אף אחד לא מנקה אותן.
  7. קוד יציאה 0 בסריקות אינו מוכיח הצלחה, ו־267011 אינו כישלון. רק sweeps.log אומר את האמת.
  8. לא נמצא ניטור זמינות חיצוני שרץ על השרת הזה; אם קיים כזה, הוא יושב במקום אחר ולא נבדק כאן. מה שכן קיים בשרת: התראת מייל על שגיאת 500, לא יותר מאחת לדקה לנתיב.

17.4 שני מסמכים שמפגרים אחרי הקוד