איגוד קופות הצדקה
אפיון טכני · מסד נתונים

אפיון מסד הנתונים — פורטל החברים

מודל הנתונים המלא לפורטל איגוד קופות הצדקה: היררכיית עמותה→קופה→חברים, מאגר קרנות וספקים, תגיות וטפסים — בנוי על PostgreSQL בשרת, עם מיגרציה מ-Airtable ועקיבות מלאה למקור. לצד כל שם שדה טכני (באנגלית) מופיע השם בעברית.

יחד למען הכלל
תשתית ויעד

על מה זה נבנה

🖥️ היעד

PostgreSQL + Drizzle ORM על שרת Hetzner (Coolify), מזין את פורטל ה-Next.js. זה ה-DB של הפורטל עצמו — לא כלי ביניים.

📥 מקור המיגרציה

בסיס Airtable קיים (CRM בוגר, 26 טבלאות) + מיפוי מלא של דרייב הקבצים. ה-Airtable משמש כמפרט וכמקור הנתונים.

🔐 גישה

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

עקרון-על

מקור ומזהה על כל רשומה (Provenance)

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

שדהטיפוסבעברית — מה זה
sourcetextמאיזו מערכת הגיע: airtable / drive / fillout / ידני
source_tabletextשם/מזהה הטבלה ב-Airtable, או 'drive'
source_record_idtextהמזהה המקורי — ה-rec… מ-Airtable או fileId מהדרייב
imported_attimestamptzמתי יובאה הרשומה
created_at / updated_attimestamptzמועד יצירה / עדכון אחרון

אינדקס ייחודי על (source, source_table, source_record_id) → אפשר להריץ את המיגרציה שוב ושוב בלי לשכפל.

מבט-על

תרשים קשרים

amutot (עמותות)
   └─1:N─ kupot (קופות) ──N:M── contacts (אנשי קשר / חברים)   [contact_kupot · עם role]
              │                      └─1:N─ contact_methods (טלפונים/מיילים · עם סוג)
              │
 resources (משאבים) ──N:M── kupot           [resource_kupot · רלוונטיות]
      │  │     └────N:M── contacts           [resource_contacts]
      │  ├─N:1─ categories (7 קטגוריות)
      │  └─N:M─ tags (תגיות)                 [resource_tags]
      └─1:N─ forms (טפסים) ─N:1─ files
 files (מאגר נכסים: Drive→R2 · dedup · fileId מקורי)
    
מיגרציה מ-Airtable

טבלאות ליבה

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

amutot עמותות

מקור: פרטי עמותות

שדהטיפוסבעברית
nametextשם העמותה
reg_numbertextמספר עמותה (רשם)
settlement · street · number · ziptextיישוב · רחוב · מספר · מיקוד
goalstextמטרות העמותה
activity_classificationtextסיווג פעילות
annual_revenuenumericמחזור כספי שנתי
employees · volunteersintמספר עובדים · מתנדבים
registration_date · statusdate · textתאריך רישום · סטטוס עמותה

kupot קופות · מרכזי

מקור: פרטי קופה (53 שדות)

שדהטיפוסבעברית
amuta_id → amutotuuid FKקישור לעמותה
name · branchtextשם הקופה · סניף
settlement · neighborhoodtextיישוב · שכונה
typeenumסוג הקופה (קהילתי / שכונתי)
phone · email · office_addresstextטלפון · מייל · כתובת המשרד
activity_domaintextתחום הפעילות (עיר/קהילה/שכונה/חסידות)
target_audience · rabbistextקהל היעד · רבני הקופה
residents_counttextמספר תושבים בקהל היעד
families_monthly · families_holidaystextמשפחות נתמכות בחודש · בחגים
budget_scope · main_activitiestext / text[]היקף פעילות · תחומי פעילות עיקריים
bank · crm_softwaretextבנק · תוכנת ניהול (CRM)
collection_bank · collection_credit · feetextגביית הו"ק · גביית אשראי · עמלת גבייה
graphics · print · accountant · call_center …textנותני שירות נוכחיים: גרפיקה · דפוס · רו"ח · מוקד טלפוני…
logo_file_id → filesuuid FKלוגו הקופה (קובץ)

contacts אנשי קשר / חברים

מקור: פרטי חברים (כולל תהליך אישור חברות)

שדהטיפוסבעברית
first_name · last_nametextשם פרטי · שם משפחה
national_id (רגיש)textמספר זהות
membership_statusenumסטטוס חברות (חבר / לא חבר / ממתין…)
committee_recommendationenumהמלצת הוועדה (לצרף / לא לצרף)
committee_notestextהערות הוועדה
heard_about_forumtextהיכן שמע על הפורום
verify_withtextאצל מי ניתן לברר עליו
notestextהערות
portal_user_id → usersuuid FKמשתמש פורטל מקושר (Better-Auth)

contact_kupot

חבר ↔ קופה (N:M, עם תפקיד)

שדהבעברית
contact_id → contactsאיש הקשר
kupa_id → kupotהקופה
roleתפקיד בקופה
is_primaryאיש קשר ראשי?

contact_methods

טלפונים/מיילים — מאפשר חייג/וואטסאפ/מייל ב-UI

שדהבעברית
contact_id → contactsאיש הקשר
typeסוג (נייד/וואטסאפ/משרד/פקס/מייל)
valueהערך (המספר/הכתובת)
label · is_primaryתווית חופשית · ראשי?
מיגרציה מהדרייב + גיליונות

מאגר המשאבים

קרנות, ספקים, ארגונים ומיזמים — מקוטלגים ל-7 קטגוריות, עם תגיות חוצות-קטגוריה, טפסים ומאגר נכסים מרכזי.

resources משאבים

קרן / ספק / ארגון / מיזם — מקור: גיליונות הדרייב

שדהטיפוסבעברית
nametextשם המשאב
typeenumסוג (קרן / ספק / ארגון / מיזם / מסמך)
category_id → categoriesuuid FKקטגוריה ראשית (אחת מ-7)
descriptiontextמטרה / תיאור
audiencetextלמי מיועד
amount_texttextסכום / טווח (לקרנות)
status · is_premiumtext · boolסטטוס · האם פרימיום

files Drive → R2

מאגר נכסים מרכזי (קבצים)

שדהטיפוסבעברית
name · mime_type · size_bytestext · bigintשם · סוג קובץ · גודל
original_drive_idtextמזהה הקובץ המקורי בדרייב
original_owner · original_pathtextבעלים מקורי · נתיב מקורי
r2_keytextמיקום הקובץ ב-R2 (עתידי)
checksum · is_duplicate_oftext · uuidטביעת אצבע · סימון כפילות
is_fragileboolקובץ שביר (ID ישן / shortcut / Gmail)

categories

7 קטגוריות-על. שדות: name (שם) · slug (מזהה) · sort_order (סדר) · icon (אייקון).

tags + resource_tags

תגיות (N:M). name=שם התגית. לחיצה על תג → כל המשאבים המקושרים, חוצה קטגוריות.

forms טפסים

resource_id=הגוף · name=שם הטופס · file_id=הקובץ שלנו · notes=הערות.

resource_kupot

קישור משאב↔קופה — רלוונטיות הקרן/ספק לקופה.

resource_contacts

קישור משאב↔איש קשר — אנשי הקשר של ספק/ארגון (עם תפקיד).

ערכים מבוקרים

Enums

resource_type — סוג משאב

fund קרןsupplier ספקorg ארגוןinitiative מיזםdocument מסמך

contact_method_type — סוג אמצעי קשר

mobile ניידwhatsapp וואטסאפoffice משרדlandline קוויfax פקסemail מייל

contact_role — תפקיד

מנהלאחראי תמיכותמזכירמנהל פרויקטיםגבאי ראשייו"ראחר

membership_status — סטטוס חברות

חברלא חברהומלץ לא לצרףממתין לבירורמילא שאלון

kupa_type — סוג קופה

קהילתישכונתי
תהליך

הערות מיגרציה

  1. דה-דופ קרנות: איחוד 3 גיליונות הקרנות (~97 שורות) ל-~44 ייחודיות לפי שם, תוך שמירת כל ה-source_record_id שמוזגו.
  2. העשרה מהטופס: לכל קרן עם טופס — להעתיק את ה-PDF ל-files (בבעלותנו), ואם חסר טלפון/מייל בשורה אבל קיים בטופס → לחלץ ל-contact_methods.
  3. קבצים שבירים: מזהי 0B6 ישנים, shortcuts וקישורי Gmail → להוריד ולהעלות מחדש, לסמן is_fragile עד טיפול.
  4. PII: national_id ו-contact_methods — הרשאות לחברים מאומתים בלבד; חסימת ייצוא המוני.
  5. טבלאות תפעוליות ב-Airtable (ימי עיון, סדנאות, חדרים, ועד הרבנים, נדרים פלוס) — להחליט בנפרד אם מהגרים או משאירים.