English עברית Українська Polski Русский

מערכת ERP לניהול לוח זמנים למרכז חינוכי

Product & Systems Architect — Alex Shevchuk
תקציר: החלפת מערכת מיושנת המבוססת על Excel באפליקציית ווב מודרנית.
תחילת הפיתוח: פברואר 2026.
בפרודקשן: החל מ-1 בספטמבר 2026.
סטטוס: המערכת יציבה בפרודקשן ופועלת ללא תקלות; פיתוח פיצ'רים ומודולים נוספים נמשך.

הקשר והבעיה

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

היקף הפעילות:
26 בתי ספר שותפים עד 50 שיעורים ביום 105 קבוצות לימוד מעבדות ייעודיות חילופי מורים תכופים, ביטולים ודחיות שיעורים הזמנות ציוד

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

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

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

התפקיד שלי

סקירת המערכת

4
סכמות בסיס נתונים (campus / laboratory / notifications / settings)
31
טבלאות בסכמת בסיס הנתונים
43
פונקציות PL/pgSQL — לוגיקה עסקית בבסיס הנתונים
655
קומיטים לאורך 9 חודשי פיתוח
391
בדיקות רגרסיה אוטומטיות לפני כל דיפלוי
24/7
זמינות מערכת הפרודקשן

מערכת ERP לניהול לוח הזמנים והפעילות התפעולית:

מחסנית טכנולוגית:

PostgreSQL 16 PL/pgSQL Node.js + Express Vue 3 + PrimeVue (RTL) Docker · AWS · Cloudflare Tunnel

מבנה הפרויקט:

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

המערכת בחיים האמיתיים:

לוח תצוגה בחדר המורים
לוח תצוגה בחדר המורים — בשידור חי, על קיר המרכז החינוכי.
לוח תצוגה לתלמידים
לוח תצוגה לתלמידים — בשידור חי, על קיר המרכז החינוכי.
Production monitoring
Production monitoring — המערכת נמצאת תחת ניטור זמינות חיצוני מתמשך. זמן פעילות של 100% ב-30 הימים האחרונים; 99.995% מאז 1 בספטמבר 2026 — האירוע היחיד, השבתה בת 5 דקות, היה השבתה מתוכננת בזמן פריסת גרסה חדשה (מיגרציית בסיס נתונים ואתחול מחדש של קונטיינרים ה-backend/frontend). מאז — ללא תקלות.
Email delivery infrastructure
תשתית שליחת מיילים — ההתראות נשלחות דרך דומיין מאומת באמצעות ספק דוא"ל טרנזקציוני (Resend), המבטיח מסירה אמינה ואימות תקין (SPF/DKIM).

ממשק המערכת

לחצו על כל צילום מסך כדי לפתוח אותו בגודל מלא.

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

תרבות הנדסית — קוד ותיעוד

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

1. הפרדה ברורה בין מבנה ללוגיקה עסקית

הערות ב-schema.sql
schema.sql — כלל מפורש: הקובץ הזה מכיל רק מבנה. הלוגיקה העסקית חיה בקבצים המודולריים.

2. בחירת חדר לפי כללים עסקיים מפורשים

הפונקציה _find_room
campus._find_room() — כללי עדיפות לחדרים עבור פיזיקה וכימיה מתועדים ומקודדים ישירות בשאילתה.
כותרת year_schedule.sql
year_schedule.sql — בכותרת הקובץ מוסבר תפקידה של כל פונקציה מרכזית, וזרימת ה-freeze / unfreeze של יום.

3. בקרת איכות ואימות אינווריאנטים

391 בדיקות רגרסיה אוטומטיות (ברמת ה-API ובסיס הנתונים) שרצות לפני כל דיפלוי — בודקות את תהליכי אישור הבקשות, חילופי מורים, מנגנון הקפאה/שחזור של יום, מניעת התנגשויות בלוח הזמנים (EXCLUDE USING GIST), הזמנות ציוד, ומטריצת כללי ההתראות.

4. משמעת שחרורים ותפעול

כל אחד מכ-20 שחרורים לפרודקשן במהלך 9 חודשים עובר לפי אותו פרוטוקול: חזרה כללית של המיגרציה על עותק טרי של בסיס הפרודקשן, תמונות Docker מתויגות :rollback לפני בנייה מחדש, גיבוי ממש לפני החלת השינויים, ויומן שחרור כתוב על השרת. חלון המעבר בפועל של הקונטיינרים — בין 13 ל-55 שניות.

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

5. הטמעה וניהול שינויים

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

תוצאות