מודל הנתונים המלא לפורטל איגוד קופות הצדקה: היררכיית עמותה→קופה→חברים, מאגר קרנות וספקים, תגיות וטפסים — בנוי על PostgreSQL בשרת, עם מיגרציה מ-Airtable ועקיבות מלאה למקור. לצד כל שם שדה טכני (באנגלית) מופיע השם בעברית.
יחד למען הכללPostgreSQL + Drizzle ORM על שרת Hetzner (Coolify), מזין את פורטל ה-Next.js. זה ה-DB של הפורטל עצמו — לא כלי ביניים.
בסיס Airtable קיים (CRM בוגר, 26 טבלאות) + מיפוי מלא של דרייב הקבצים. ה-Airtable משמש כמפרט וכמקור הנתונים.
פורטל לחברים מאומתים בלבד. מידע רגיש (ת"ז, טלפונים) מגודר; חסימת ייצוא המוני.
כל טבלה במערכת כוללת שדות קבועים המאפשרים לעקוב כל רשומה חזרה למקורה ולסנכרן מחדש בלי כפילויות — מיגרציה אידמפוטנטית.
| שדה | טיפוס | בעברית — מה זה |
|---|---|---|
source | text | מאיזו מערכת הגיע: airtable / drive / fillout / ידני |
source_table | text | שם/מזהה הטבלה ב-Airtable, או 'drive' |
source_record_id | text | המזהה המקורי — ה-rec… מ-Airtable או fileId מהדרייב |
imported_at | timestamptz | מתי יובאה הרשומה |
created_at / updated_at | timestamptz | מועד יצירה / עדכון אחרון |
אינדקס ייחודי על (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 מקורי)
היררכיית הזהות של האיגוד: גוף משפטי (עמותה) → קופה → חברים, כאשר כל חבר מחובר לקופה עם תפקיד, וכל איש קשר יכול להחזיק מספר אמצעי התקשרות מתויגים. בכל טבלה: שם השדה הטכני + השם בעברית.
מקור: פרטי עמותות
| שדה | טיפוס | בעברית |
|---|---|---|
| name | text | שם העמותה |
| reg_number | text | מספר עמותה (רשם) |
| settlement · street · number · zip | text | יישוב · רחוב · מספר · מיקוד |
| goals | text | מטרות העמותה |
| activity_classification | text | סיווג פעילות |
| annual_revenue | numeric | מחזור כספי שנתי |
| employees · volunteers | int | מספר עובדים · מתנדבים |
| registration_date · status | date · text | תאריך רישום · סטטוס עמותה |
מקור: פרטי קופה (53 שדות)
| שדה | טיפוס | בעברית |
|---|---|---|
| amuta_id → amutot | uuid FK | קישור לעמותה |
| name · branch | text | שם הקופה · סניף |
| settlement · neighborhood | text | יישוב · שכונה |
| type | enum | סוג הקופה (קהילתי / שכונתי) |
| phone · email · office_address | text | טלפון · מייל · כתובת המשרד |
| activity_domain | text | תחום הפעילות (עיר/קהילה/שכונה/חסידות) |
| target_audience · rabbis | text | קהל היעד · רבני הקופה |
| residents_count | text | מספר תושבים בקהל היעד |
| families_monthly · families_holidays | text | משפחות נתמכות בחודש · בחגים |
| budget_scope · main_activities | text / text[] | היקף פעילות · תחומי פעילות עיקריים |
| bank · crm_software | text | בנק · תוכנת ניהול (CRM) |
| collection_bank · collection_credit · fee | text | גביית הו"ק · גביית אשראי · עמלת גבייה |
| graphics · print · accountant · call_center … | text | נותני שירות נוכחיים: גרפיקה · דפוס · רו"ח · מוקד טלפוני… |
| logo_file_id → files | uuid FK | לוגו הקופה (קובץ) |
מקור: פרטי חברים (כולל תהליך אישור חברות)
| שדה | טיפוס | בעברית |
|---|---|---|
| first_name · last_name | text | שם פרטי · שם משפחה |
| national_id (רגיש) | text | מספר זהות |
| membership_status | enum | סטטוס חברות (חבר / לא חבר / ממתין…) |
| committee_recommendation | enum | המלצת הוועדה (לצרף / לא לצרף) |
| committee_notes | text | הערות הוועדה |
| heard_about_forum | text | היכן שמע על הפורום |
| verify_with | text | אצל מי ניתן לברר עליו |
| notes | text | הערות |
| portal_user_id → users | uuid FK | משתמש פורטל מקושר (Better-Auth) |
חבר ↔ קופה (N:M, עם תפקיד)
| שדה | בעברית |
|---|---|
| contact_id → contacts | איש הקשר |
| kupa_id → kupot | הקופה |
| role | תפקיד בקופה |
| is_primary | איש קשר ראשי? |
טלפונים/מיילים — מאפשר חייג/וואטסאפ/מייל ב-UI
| שדה | בעברית |
|---|---|
| contact_id → contacts | איש הקשר |
| type | סוג (נייד/וואטסאפ/משרד/פקס/מייל) |
| value | הערך (המספר/הכתובת) |
| label · is_primary | תווית חופשית · ראשי? |
קרנות, ספקים, ארגונים ומיזמים — מקוטלגים ל-7 קטגוריות, עם תגיות חוצות-קטגוריה, טפסים ומאגר נכסים מרכזי.
קרן / ספק / ארגון / מיזם — מקור: גיליונות הדרייב
| שדה | טיפוס | בעברית |
|---|---|---|
| name | text | שם המשאב |
| type | enum | סוג (קרן / ספק / ארגון / מיזם / מסמך) |
| category_id → categories | uuid FK | קטגוריה ראשית (אחת מ-7) |
| description | text | מטרה / תיאור |
| audience | text | למי מיועד |
| amount_text | text | סכום / טווח (לקרנות) |
| status · is_premium | text · bool | סטטוס · האם פרימיום |
מאגר נכסים מרכזי (קבצים)
| שדה | טיפוס | בעברית |
|---|---|---|
| name · mime_type · size_bytes | text · bigint | שם · סוג קובץ · גודל |
| original_drive_id | text | מזהה הקובץ המקורי בדרייב |
| original_owner · original_path | text | בעלים מקורי · נתיב מקורי |
| r2_key | text | מיקום הקובץ ב-R2 (עתידי) |
| checksum · is_duplicate_of | text · uuid | טביעת אצבע · סימון כפילות |
| is_fragile | bool | קובץ שביר (ID ישן / shortcut / Gmail) |
7 קטגוריות-על. שדות: name (שם) · slug (מזהה) · sort_order (סדר) · icon (אייקון).
תגיות (N:M). name=שם התגית. לחיצה על תג → כל המשאבים המקושרים, חוצה קטגוריות.
resource_id=הגוף · name=שם הטופס · file_id=הקובץ שלנו · notes=הערות.
קישור משאב↔קופה — רלוונטיות הקרן/ספק לקופה.
קישור משאב↔איש קשר — אנשי הקשר של ספק/ארגון (עם תפקיד).
files (בבעלותנו), ואם חסר טלפון/מייל בשורה אבל קיים בטופס → לחלץ ל-contact_methods.is_fragile עד טיפול.national_id ו-contact_methods — הרשאות לחברים מאומתים בלבד; חסימת ייצוא המוני.