Skip to content

Repository files navigation

סדר פלוס — Seder Plus

מעקב נוכחות ולימוד לכולל. שלוש תוכנות ל‑Windows, בסיס קוד אחד:

קובץ EXE מה זה
SederPlus.exe האפליקציה המלאה
SederPlusQuick.exe חלון ההגעה הקטן שתמיד בהישג יד
SederPlusAgent.exe תזכורות כשהשתיים האחרות סגורות

שתי הראשונות הן קובץ בודד עצמאי במשקל כ‑10MB כל אחת. הממשק מוצג דרך רכיב WebView2 שמגיע עם Windows 11 (וקיים כמעט בכל התקנה של Windows 10).

השלישית היא אחרת לגמרי: אין לה חלון, אין לה אייקון ואין לה WebView — כ‑300KB שישנים כל היום ומעירים שתי תזכורות. היא כבויה עד שמבקשים אותה, ורצה על כ‑2MB זיכרון פרטי במקום ה‑150MB שתהליך WebView2 עולה.

אפשר להחזיק את שני החלונות פתוחים במקביל. שלושתם חולקים קובץ נתונים אחד וקולטים את הרישומים אחד של השני תוך שניות ספורות.

גרסאות

הגרסאות הן מספרים שלמים. זו גרסה 1, והשחרור הבא הוא 2. קבצי המניפסט מחזיקים מחרוזת semver מפני ש‑npm, Tauri ו‑Cargo כולם דורשים אחת, אבל רק החלק הראשי משמעותי — scripts/set-version.mjs חורט את המספר לתוך כל ששת המקומות, והאפליקציה מציגה רק את המספר הראשי.

אין צורך לערוך שום דבר במאגר כדי לשחרר גרסה: דחיפה ל‑main מריצה את .github/workflows/release.yml, שלוקח את תגית ה‑vN הגבוהה ביותר הקיימת, מפרסם את N+1, ומצרף את המתקין ואת שלושת קבצי ה‑EXE. שום עדכון גרסה לא נכנס לקומיט, ולכן שחרור לא יכול לגרור שחרור נוסף.

איך הכל מתחבר

src/          אפליקציית React — 14 מסלולים, כולה בצד הלקוח
public/fonts/ הגופן Heebo, נשלח עם האפליקציה: הממשק וקובצי ה‑PDF משתמשים באותו קובץ
index.html    מעטפת ה‑SPA; הניתוב חי ב‑hash של הכתובת
installer/    סקריפט Inno Setup עבור SederPlusSetup.exe
src-tauri/
  core/       מעטפת ה‑Rust המשותפת: הקמת חלונות, מאגר הנתונים, היומן, העדכונים
  full/       SederPlus.exe        — כ‑10 שורות, עם אייקון וקונפיגורציה משלו
  quick/      SederPlusQuick.exe   — כ‑10 שורות, עם אייקון וקונפיגורציה משלו
  agent/      SederPlusAgent.exe   — תהליך הרקע. בלי Tauri, ולכן בלי WebView
  shared/     קובץ הנתונים, היומן, וכללי תזכורות הרקע — ללא תלות ב‑Tauri

צד הלקוח נבנה לקבצים סטטיים ומוטמע היישר לתוך כל EXE. הוא מגיע אל העולם החיצון דרך פקודות ה‑Rust שב‑src-tauri/core/src/lib.rs: קריאה, מעקב וכתיבה למאגר, שמירת קובץ שנוצר, פתיחת האפליקציה המלאה מתוך החלון המהיר, פתיחת קישור בדפדפן, הצגת התראת Windows, כתיבה וקריאה של היומן, והתקנת עדכון.

החלון המהיר

שדה אחד: שעת ההגעה. כל השאר מחושב —

  • לאיזה סדר זה שייך (detectSeder ב‑src/lib/quick-entry.ts),
  • האם אוהבי ה׳ בכלל אפשרי (הגעה בזמן תחילת הסדר או לפניו),
  • שעת היציאה, שנרשמת כסוף הסדר. בחלון אין שדה יציאה בכוונה; מי שיצא מוקדם מתקן זאת במסך הנוכחות.

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

דוחות

קובצי ה‑PDF נכתבים כטקסט אמיתי דרך src/lib/pdf-doc.ts: A4, מימין לשמאל, עם Heebo מוטמע, טבלאות שנשברות בין שורות ולא באמצען, ומספרי עמודים.

זה החליף צילום מסך. המייצא הישן סידר את הדוח כ‑HTML נסתר והמיר אותו לתמונה עם html2canvas — שנכשל על כל צבע שאינו יודע לפענח, ו‑Tailwind 4 כותב כל צבע באפליקציה בתור oklch(...). כל ייצוא נכשל. וגם אילו עבד, התוצאה הייתה תמונה של דוח: בלי טקסט לבחירה, בלי חיפוש, מטושטש בכל זום, ושבירת עמודים איפה שהפיקסלים נפלו. ראו את הערת הכותרת ב‑pdf-doc.ts.

עברית ב‑PDF גם חייבת סידור מחדש ידני — קובץ PDF מצייר את הסימנים בסדר שנמסר לו — וזה בדיוק מה ש‑src/lib/rtl-text.ts עושה.

מחשבון המלגה

מסך "מחשבון מלגה" מציג כמה מלגה מגיעה בחודש נתון לפי הרישומים שבתוכנה, שורה לשורה: בסיס של 2,000 ₪, ההפחתה על הדקות החסרות, תוספת לחיסור נמוך, אוהבי ה׳, חבורת ש״ס, כולל ערב ותורתו בידו. הכללים כולם יושבים ב‑STIPEND_POLICY בתוך src/lib/stipend.ts — במקום אחד, ובכוונה לא ניתנים לעריכה מתוך התוכנה: אלה כללי הכולל, לא העדפות של המשתמש.

שני דברים שכדאי לדעת עליו:

  • ההפחתה על הדקות (סעיף 9) עובדת במדרגות. מ‑500 עד 800 דקות לחיוב יורדים 2 ₪ על כל 10 דקות, מ‑800 עד 1800 — 3 ₪, ומעל 1800 — 5 ₪. בכל מדרגה נספרות רק יחידות שלמות של 10 דקות, ושארית קטנה מ‑10 אינה עוברת למדרגה הבאה.
  • החישוב יחסי לימי הלימוד של החודש. הספים שנמדדים בדקות (500 הדקות החופשיות, תקרת 600 הדקות המוצדקות ומדרגות ההפחתה) נכתבו לחודש מלא, ולכן הם מוקטנים ביחס ימי לימוד בפועל / כל ימי א׳–ה׳ בחודש. המונה מגיע מלוח השנה — בלי שישי־שבת, יו״ט, ערבי יו״ט ובין הזמנים; המכנה תלוי רק בתאריכים, ולכן חודש רגיל יוצא בדיוק 1 בין אם יש בו 21 ימי עבודה ובין אם 22. המלגה עצמה קשיחה — היא מתחילה תמיד מ‑2,000 ₪.

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

חבורת ש״ס

מתג בהגדרות ← "שעות הסדרים". כשהוא דלוק, המערכת סופרת כל הגעה לסדר ב׳ עד SHAS_ARRIVAL_DEADLINE (15:00) ומציגה את המספר בכל מסכי הסיכום, בדוחות ובמחשבון המלגה. הספירה עצמה (isShasArrival ב‑calcSeder) רצה על כל רישום תמיד — המתג קובע רק מה מוצג — ולכן סימון החבורה חושף מיד גם את כל ההגעות שכבר נרשמו, בלי להזין דבר מחדש.

תזכורות

תחת הגדרות ← "יעדים והתראות" יש שני ערוצים וכמה כללים. הערוצים הם חלוניות בתוך האפליקציה (פעיל) והתראות Windows אמיתיות (כבוי עד שמבקשים); הכללים הם דחיפה קלה כשלא נרשם דבר עד תחילת סדר א׳, אזהרה כשמכסת האיחורים החודשית נוצלה, סיכום שבועי, אזהרה מוקדמת כשהקצב חורג, ותזכורת בתחילת החודש לדווח במערכת הטלפונית על החודש שהסתיים. כולם חיים ב‑src/lib/notifications.ts.

הכללים נכתבו כדי לשאול "האם זה עדיין שווה אמירה עכשיו?" ולא כדי לירות בשעה קבועה. כל אחד מהם פועל לכל היותר פעם ביום/שבוע/חודש, והניהול הזה שמור בקובץ הנתונים המשותף כך שגם אם שני קובצי EXE פתוחים, אותה תזכורת לא תוצג פעמיים.

גם כשהתוכנה סגורה

המתג "להזכיר גם כשהתוכנה סגורה" (כבוי כברירת מחדל) מפעיל את SederPlusAgent.exe: תהליך בלי חלון ובלי WebView, שנרשם ב‑HKCU\...\Run ועולה עם Windows. הוא מעיר שתי תזכורות בלבד — שסדר התחיל ועדיין לא נרשם (בשמו, א׳ או ב׳), ושצריך לדווח במערכת הטלפונית על החודש שעבר, בימים 1–5 בשעה 20:00, עם כפתור "סמנתי שדיווחתי" על ההתראה עצמה.

הוא אינו מחליט מתי תזכורת נדרשת. האפליקציה מחשבת מראש, לשנה קדימה, את הדקה שבה כל תזכורת מבשילה — לפי לוח השנה העברי, שעות הסדרים והרגלי ההגעה — וכותבת זאת כ‑backgroundPlan (ראו src/lib/background-plan.ts); התהליך רק משווה שעון מול המספרים האלה (src-tauri/shared/src/plan.rs). שני הצדדים חולקים את notificationsSent, ולכן אף אחד מהם לא חוזר על מה שהשני כבר אמר. כיבוי המתג מוחק את רישום ה‑Run, והתהליך שרץ מזהה זאת תוך דקה ונסגר מעצמו.

עדכונים

הגדרות ← "עדכוני גרסה" בודק את api.github.com פעמיים ביום ויכול להתקין את מה שמצא: המתקין יורד, מורץ עם /SILENT, והאפליקציה נסגרת וחוזרת בגרסה החדשה (install_update ב‑src-tauri/core/src/updater.rs). ניקוי שדה המאגר מכבה את כל המנגנון, ואז האפליקציה לא מבצעת שום פנייה לרשת.

כשמשהו משתבש

%APPDATA%\SederPlus\logs\sederplus.log

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

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

היכן הנתונים נמצאים

%APPDATA%\SederPlus\sedorim-data.json     כל רישומי הסדרים, הלימוד והטיימר
%APPDATA%\SederPlus\backups\              עותקים מתחלפים, אחד ל‑6 שעות, 30 נשמרים
%APPDATA%\SederPlus\logs\                 יומן התקלות

לא ב‑localStorage של ה‑WebView: שני קובצי ה‑EXE הם תהליכי מערכת נפרדים, ושני תהליכים לא יכולים לחלוק בבטחה מחיצת אחסון אחת של WebView — זה שנפתח שני עלול לעלות ריק. הכתיבות אטומיות (קובץ זמני ואז שינוי שם), וכתיבה שהנתונים שבבסיסה התיישנו תחתיה מנוסה מחדש במקום להרוס את מה שה‑EXE השני כתב. ראו src-tauri/shared/src/store.rs.

הסרת ההתקנה לעולם אינה נוגעת בתיקייה הזו.

עבודה על הפרויקט

npm install
npm run dev          # האפליקציה בדפדפן בכתובת http://localhost:5173

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

הוסיפו ?mode=quick לכתובת כדי לראות את חלון ההזנה המהירה.

npm test             # בדיקות יחידה של צד הלקוח
npm run test:rust    # מאגר הנתונים, היומן, העדכונים וכללי תזכורות הרקע
npm run test:all     # שניהם

בנייה

npm run exe          # -> release-win\SederPlus.exe, SederPlusQuick.exe, SederPlusAgent.exe
npm run installer    # -> release-win\SederPlusSetup.exe
npm run dist         # שניהם, לפי הסדר

npm run exe דורש Node ובנוסף סביבת Rust. npm run installer דורש Inno Setup 6 (winget install JRSoftware.InnoSetup); הוא מותקן מראש על שרתי ה‑Windows של GitHub, כך שדחיפה ל‑main בונה הכל בלי אף אחד מהשניים.

המתקין שם את שתי התוכנות ב‑%LOCALAPPDATA%\SederPlus, לא שואל דבר, לא מעלה בקשת הרשאות מנהל, ומשאיר קיצור דרך לכל אחת על שולחן העבודה. זה גם מה שמאפשר לעדכון בתוך האפליקציה להיות שקט: אין חלונית UAC בדרך.

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

הערה על npm run lint

כרגע הוא מדווח על אלפי שגיאות prettier/prettier בכל המאגר, כולל קבצים שאיש לא נגע בהם חודשים. שתי סיבות נפרדות: עץ העבודה נמשך עם סופי שורה מסוג CRLF (core.autocrlf=true) בעוד ש‑Prettier רוצה LF, והפריסה הידנית של ה‑JSX בקוד קדמה לחיבור כלל Prettier ל‑ESLint. הרצת npm run format תתקן את שניהם בקומיט אחד ותעצב מחדש כמעט כל קובץ; זה הושאר בכוונה כהחלטה נפרדת ולא עורבב בתוך שינוי תוכן.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages