4aminim-store

ארבעת המינים לסוכות — אתר הזמנות

אתר להזמנת סטים לארבעת המינים (רגילים + מהדורה מוגבלת), עם תהליך הזמנה ותשלום מקדמה (20%) בביט, ומערכת ניהול הזמנות למנהל.

נבנה עם Next.js 16 (App Router), TypeScript, Tailwind CSS 4, Prisma.

הרצה מקומית

npm install
npx prisma migrate dev   # יוצר את בסיס הנתונים המקומי (SQLite)
npm run seed              # קטלוג לדוגמה + משתמש מנהל
npm run dev

האתר יעלה בכתובת http://localhost:3000. כניסת מנהל: http://localhost:3000/admin/login עם הפרטים שמוגדרים ב-.env (ADMIN_USERNAME / ADMIN_PASSWORD).

משתני סביבה (.env)

משתנה תיאור
DATABASE_URL חיבור לבסיס הנתונים. מקומית: קובץ SQLite. בפרודקשן: Postgres מנוהל.
SESSION_SECRET מפתח לחתימת session מנהל. חובה להחליף לערך אקראי לפני העלאה לאוויר (openssl rand -base64 32).
ADMIN_USERNAME / ADMIN_PASSWORD משמשים רק ל-seed הראשוני של משתמש המנהל.
NEXT_PUBLIC_GA_MEASUREMENT_ID מזהה Google Analytics (G-XXXXXXX). ריק = לא נטען GA כלל.
NEXT_PUBLIC_WHATSAPP_NUMBER מספר הוואטסאפ לכפתור הצף, בפורמט בינלאומי ללא +.

פריטים שהם Placeholder — יש להשלים לפני עלייה לאוויר

סנכרון ל-Google Sheets (אופציונלי)

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

איך להפעיל (חד-פעמי, דורש חשבון Google):

  1. היכנסו ל-Google Cloud Console, צרו פרויקט חדש (או השתמשו בקיים).
  2. הפעילו את ה-API: Google Sheets API (תפריט APIs & Services → Enable APIs → חיפוש “Google Sheets API” → Enable).
  3. צרו Service Account: APIs & Services → Credentials → Create Credentials → Service Account. תנו לו שם (למשל arba-minim-sync).
  4. בתוך ה-Service Account שנוצר → לשונית Keys → Add Key → Create new key → סוג JSON. יורד קובץ JSON — שם יש client_email ו-private_key.
  5. צרו גיליון Google Sheets חדש (ריק), ושתפו אותו (כפתור Share) עם כתובת המייל מתוך client_email (משהו כמו arba-minim-sync@your-project.iam.gserviceaccount.com), עם הרשאת עריכה (Editor).
  6. העתיקו את מזהה הגיליון מתוך כתובת ה-URL שלו (החלק בין /d/ ל-/edit).
  7. מלאו ב-.env (או במשתני הסביבה ב-Vercel):
    GOOGLE_SHEETS_SPREADSHEET_ID="המזהה מהשלב 6"
    GOOGLE_SERVICE_ACCOUNT_EMAIL="client_email מהקובץ JSON"
    GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY="private_key מהקובץ JSON (עם ה-\n בפנים, במרכאות)"
    
  8. הפעילו מחדש את השרת. בעמוד /admin/orders יופיע פס ירוק “סנכרון פעיל” במקום הפס הכתום, ויש גם כפתור “סנכרון ידני עכשיו”.

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

פריסה לפרודקשן (Vercel)

  1. בסיס נתונים: הקימו בסיס Postgres מנוהל (Supabase / Neon / Vercel Postgres). עדכנו את prisma/schema.prisma: שנו provider = "sqlite" ל-provider = "postgresql", ואז:
    npx prisma migrate dev --name init_postgres
    
  2. הגדירו את משתני הסביבה בפרויקט ב-Vercel (DATABASE_URL, SESSION_SECRET חדש וסודי, ADMIN_USERNAME/ADMIN_PASSWORD לצורך ה-seed הראשוני, NEXT_PUBLIC_GA_MEASUREMENT_ID, NEXT_PUBLIC_WHATSAPP_NUMBER).
  3. הריצו seed חד-פעמי מול בסיס הפרודקשן (npm run seed עם DATABASE_URL של הפרודקשן), ואז שנו את סיסמת המנהל (או מחקו והחליפו את המשתמש).
  4. חברו את הריפו ל-Vercel ובצעו דיפלוי.
  5. חברו את חשבון Google Analytics ל-NEXT_PUBLIC_GA_MEASUREMENT_ID.

אבטחה — מה כבר קיים

מומלץ לפני עלייה לאוויר: להריץ סקירת אבטחה נוספת (/security-review בקוד הזה, או סקירה ידנית), ולוודא HTTPS בכל סביבת הפרודקשן.