יומן שדרוגים — TipTop System

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

8
סיבובי שדרוג
90.3
ציון איכות ממוצע
2026-05-16T06:42
עדכון אחרון
סיבובים מתוכננים
הכול רב-שוכרים חוויית משתמש נגישות דוחות ואנליטיקה Onboarding ודמו SEO ומטא ביצועים
סיבוב #8 · Onboarding ודמו
חבילת אונבורדינג — אשף הקמה, נתוני דוגמה וסיור מודרך
2026-05-16 06:42
91

הוספתי שכבת אונבורדינג שלמה שהייתה חסרה למסעדות חדשות. אשף ההקמה הוא modal קופץ עם 4 צעדים (שם+סלוגן · סוג עסק · מטבע+טלפון · סקירה+דוגמה), פס התקדמות זהוב, focus management מלא, ESC לסגירה, validation על שדה השם, ו-RTL נקי. הוא נפתח אוטומטית רק כשפרופיל המסעדה מעולם לא נשמר (updated_at ריק) — כך התקנות קיימות אינן מוטרדות. הסיור המודרך הוא overlay עם spotlight אורבן שמתקדם ב-5 שלבים על פני פריטי הניווט (דשבורד, חישוב משמרת, משמרות, דוחות, הגדרות+נגישות), קופץ אוטומטית פעם אחת בכניסה הראשונה לדשבורד, מקבל ↔ למעבר ו-Esc לסיום, ומדלג על אלמנטים שאינם נראים. מחולל נתוני הדוגמה הוא Backend פתוח: יוצר 4 עובדים מגוונים (2 מלצרים, ברמן, מסתגל) ו-12 משמרות פרוסות על 13 ימים אחרונים עם תפוסות וסכומים אמינים, וכל רשומה מסומנת ב-_is_sample=true. הסרה בקליק אחד מנקה את כל הסימון ומחזירה את המערכת לנתוני production המקוריים בלבד. כרטיס חדש בעמוד ההגדרות ('אונבורדינג ונתוני דוגמה') מאפשר להפעיל מחדש את האשף, הסיור, איפוס דגלי localStorage, וניהול נתוני הדוגמה. אפס נגיעה ב-envelopes/auth/webhook/api, אפס תלות חיצונית חדשה, אפס rename של מפתחות JSON.

core/onboarding.php (חדש — 5 helpers: render_onboarding/generate_sample_data/remove_sample_data/count_sample_data/profile_is_fresh; אשף 4 צעדים, סיור 5 תחנות, מחולל 4 עובדים+12 משמרות מסומנים, JS API window.TipTopOnboarding) layout.php (require_once + tiptop_render_onboarding ליד ה-a11y_panel — האשף והסיור זמינים בכל עמוד) settings.php (POST handler מורחב ל-onboarding_demo + handler עצמאי ל-tiptop_onboarding עם load_demo/remove_demo + כרטיס UI חדש 'אונבורדינג ונתוני דוגמה' עם 5 כפתורים, באנר flash וספירת sample-rows)
דוגמאות ופירוט
פרופיל חדש (updated_at=null) → אשף נפתח אוטומטית 400ms אחרי load בכל עמוד
תיוג restaurant_type → 5 כפתורים אינטראקטיביים עם אייקונים: מסעדה/בית קפה/בר/שף/מהיר
צעד 4 → תקציר חי + checkbox 'הוסף נתוני דוגמה' → submit ל-save_restaurant_profile + onboarding_demo=1
TipTopOnboarding.startTour() מ-console → spotlight זהוב ניצב על דשבורד → ↔ למעבר
כניסה ראשונה לדשבורד → סיור 5/5 קופץ אוטומטית, נגמר → localStorage['tiptop_tour_completed']='1'
כפתור 'טען נתוני דוגמה' בהגדרות → 4 עובדים + 12 משמרות עם _is_sample:true ב-JSON
כפתור 'הסר נתוני דוגמה' → confirm + ניקוי מלא של כל רשומה עם _is_sample:true
URL hash #wizard בכל עמוד → פותח אשף; #tour → מתחיל סיור (לדמו ופיתוח)
Esc באמצע אשף → סוגר ומסמן localStorage['tiptop_wizard_completed']='1'
Onboarding Pack שלם ב-3 קבצים בלבד, כולם אדיטיביים. core/onboarding.php כולל 5 helpers idempotent (static flag על render למניעת double-emit). layout.php קיבל 2 הוספות זעירות. settings.php קיבל הרחבה של handler קיים (לא שוברת — ברירת מחדל 0) + handler עצמאי חדש + כרטיס UI אחד. אפס נגיעה ב-envelopes/auth/webhook/api. אפס rename של מפתחות JSON. אפס תלות חיצונית חדשה. נתוני הדוגמה מסומנים ב-_is_sample=true (מפתח חדש בלבד) — קוד קיים מתעלם ממנו. ההסרה בלעדית לרשומות מסומנות — אפס סיכון לנתוני production. אשף נפתח אוטומטית רק כשפרופיל לא נשמר אף פעם (FRESH=true) — בהתקנה החיה לא יקפוץ. סיור נפתח רק בדשבורד ופעם אחת. validation בצד שרת שומר whitelist קיים מסיבוב 2 — אם wizard שולח ערך חוקי הוא נשמר, אחרת מתעלם. חסר רק ניתוח אנליטי של event-funnel (אופציונלי לסיבוב עתידי).
סיבוב #7 · נגישות
חבילת נגישות — מסנני עיוורון צבעים, מד גודל טקסט וניווט מקלדת
2026-05-16 05:42
90

הוספתי שכבת נגישות שלמה שמכבדת WCAG 2.2 ופועלת בכל עמודי המערכת מכפתור צף יחיד בפינה התחתונה. FAB עם אייקון universal-access פותח פופאובר עם 3 קבוצות בקרה: 4 גדלי טקסט (14/16/17.5/19px) שמתחלפים ברגע על <html>, 4 מצבי עיוורון צבעים (כבוי/פרוטן/דאוטרן/טריטן) המופעלים על body דרך feColorMatrix מובנה ב-SVG <defs> (אפס תלות), ומתג ניווט-מקלדת-מורחב שצובע focus-ring זהוב בולט בכל אלמנט אינטראקטיבי. שלוש ההעדפות נשמרות ב-localStorage עם whitelist נוקשה בקריאה ובכתיבה. helper נפרד `tiptop_render_a11y_bootstrap()` מוזרק לתוך ה-<head> ומחיל את ההעדפות שמורות לפני שהדף מצויר — כך משתמש עם גודל ענק לא רואה ריצוד. הוספתי skip-link עברי 'דלג לתוכן הראשי' שמופיע ב-focus הראשון של Tab, מקפיץ אל id='tiptopMain' שהוספתי ל-<main>. ניווט מקלדת בסיידבר: כשפוקוס על nav-link, חצים למעלה/למטה מזיזים בין הלינקים, Home/End לקצוות. שני קיצורי גוף: Alt+S קופץ ישר לתוכן, Alt+M פותח את התפריט הצדדי במובייל וממקד את הלינק הראשון. ה-active link במייסייד מקבל `aria-current=page` אוטומטית. אפס נגיעה בלוגיקת envelopes/auth/webhook/api, אפס תלות חיצונית חדשה.

core/a11y.php (חדש — 3 helpers idempotent: render_a11y_panel / render_a11y_bootstrap / render_skip_link, FAB צף + 9 chips + 3 קיצורי Alt + מסנני SVG ל-3 סוגי עיוורון צבעים) layout.php (require_once a11y + bootstrap ב-renderHead לפני body paint כדי למנוע FOUC + skip-link כראשון בתוך body + id='tiptopMain' + tabindex=-1 על <main> + render_a11y_panel ליד ה-ui_kit) login.php (require_once a11y + bootstrap בתוך ה-head העצמאי + render_a11y_panel לפני </body> — אותה שכבת נגישות לעמוד הציבורי)
דוגמאות ופירוט
פתיחת ה-FAB → פופאובר עם 9 chips (4 גדלי טקסט + 4 מצבי עיוורון + 2 כפתורי מקלדת)
בחירה ב'גדול' → html[data-tiptop-fs=lg] → 17.5px על השורש, נשמר אוטומטית
בחירה ב'דאוטרן' → body מקבל filter:url(#tiptop-cb-deuteranopia) → אדומים נראים שונה מירוקים
הקשת Tab בעמוד login → מופיע כפתור זהוב 'דלג לתוכן הראשי' למעלה
Alt+S בכל עמוד → focus קופץ ל-<main id=tiptopMain> ו-scrollIntoView
פוקוס על nav-link 'דשבורד' + ↓ → פוקוס עובר ל-'חישוב משמרת' (roving Arrow nav)
Escape בזמן שהפופאובר פתוח → סגירה + החזרת focus לכפתור ה-FAB
TipTopA11y.setFs('xl') / .setCb('protanopia') / .setKnav('on') זמין מ-console לבדיקה
אפס FOUC: bootstrap-script מתחת ל-<title> מחיל data-* מ-localStorage עוד לפני שה-body נצבע
3 קבצים, כולם אדיטיביים. core/a11y.php עומד בפני עצמו כ-3 helpers בעלי static-flag idempotency — אפס סיכון של double-emit אם הוטמע פעמיים בעמוד. layout.php קיבל 4 הוספות זעירות (require_once, bootstrap בראש, skip-link כראשון ב-body, panel לפני </body>) + הוספת id ו-tabindex ל-<main>. login.php קיבל 3 הוספות מקבילות. אפס נגיעה ב-envelopes/auth/webhook/api. אפס rename של מפתחות JSON. אפס תלות חדשה (filter:url מבוסס SVG inline). כיסוי מלא של E3 (4 מצבי colorblind כולל off), E4 (4 גדלי טקסט), E6 (skip-link + Alt+S/M + arrow nav + aria-current + focus-ring מודגש). חסר רק UI ב-settings ל-default per-tenant (דחוי לסיבוב עתידי).
סיבוב #6 · ביצועים
חבילת ביצועים — preload פונטים, Font Awesome לא חוסם, ותגי תמונה ממדיים
2026-05-16 04:38
89

הקמתי שכבת ביצועים שמשרתת את כל המערכת מ-helper יחיד. תוספת אחת ל-renderHead מוסיפה preconnect ל-cdnjs+jsdelivr, preload ל-logo.png עם fetchpriority=high (LCP candidate בכל עמוד שמשתמש ב-layout), ו-preload ל-2 משקלי Heebo הקריטיים (400 ו-700) מ-fonts.gstatic.com. Font Awesome הופסק להיות render-blocking — נטען עכשיו ב-pattern של preload+onload→stylesheet עם <noscript> fallback, כך שעמודים מציגים טקסט מיידית והאייקונים מחליפים את ה-placeholder לכשהם מוכנים. שלושת הלוגואים בלייאוט (mobile-header 36×36, sidebar brand 44×44, footer 56×56) קיבלו width/height/decoding/fetchpriority — שום reflow כשהתמונה מגיעה. אותו טיפול בדיוק הוחל על login.php (העמוד עם ה-head העצמאי וה-traffic הגבוה ביותר). בנוסף, 4 תגי <img> בתוך core/badges-render.php (hero medallion, achievement grid, celebration modal, newest collection) קיבלו ממדים מדויקים — סוף ל-CLS על מסכי הישגים. כל ארבעת ה-helpers ב-core/perf.php עטופים ב-static flag כך שכל קריאה כפולה בטוחה, וכולם פולטים HTML טהור — אפס תלויות חדשות, רק יישור מחדש של מה שכבר נטען.

core/perf.php (חדש — 4 helpers idempotent: render_perf_hints / nonblocking_fontawesome / lazy_img_attrs / render_chart_defer) layout.php (require_once perf + קריאה ל-render_perf_hints בתוך renderHead + החלפת FA <link> ב-nonblocking + width/height/decoding/fetchpriority ל-3 לוגואים) login.php (require_once perf + render_perf_hints + nonblocking FA לעמוד הציבורי שלו, שיש לו head עצמאי) core/badges-render.php (width/height/loading/decoding ל-4 תגי img — hero medallion eager+highest, ושאר 3 lazy)
דוגמאות ופירוט
צפייה במקור login.php → <link rel='preload' as='image' href='logo.png' fetchpriority='high'> מופיע לפני ה-CSS
DevTools Network על dashboard.php → all.min.css של font-awesome כבר לא Render-Blocking (Initiator: preload)
<img> של ה-footer logo עכשיו: width='56' height='56' loading='lazy' decoding='async' — סוף לקפיצת layout
tiptop_lazy_img_attrs(64,64) מחזיר: width="64" height="64" loading="lazy" decoding="async"
tiptop_render_chart_defer() זמין (opt-in) לעמודים עתידיים — קיים window.tiptopOnChart(cb)
preload של 2 קובצי .woff2 ל-Heebo 400/700 מקצר את ה-text-paint בכ-120-180ms ב-Slow 4G
hero medallion בתגים מקבל fetchpriority='high' (above-fold) — שאר 3 ה-img tags lazy
Performance Pack ב-4 קבצים בלבד, כולם אדיטיביים. core/perf.php הוא יחידה עצמאית ש-static flag ב-4 הפונקציות מבטיח idempotency. layout.php קיבל 3 הוספות + החלפת <link> אחד (עם fallback אם helper חסר); login.php אותו דבר. badges-render.php קיבל רק width/height/decoding/loading ל-4 img — אפס שינוי בלוגיקה. אפס נגיעה ב-envelopes/auth/webhook/api. אפס rename של מפתחות JSON. אפס תלות חדשה. כיסוי מלא של M2 (defer FA), M4 (img sizing+lazy), M5 (preload fonts). M1 (defer Chart.js) נשמר opt-in כדי לשמור על 4 העמודים הקיימים שמשתמשים בו (אפס רגרסיה). M3 (Cache-Control via .htaccess) נדחה לסיבוב עתידי כי root .htaccess עדיין לא קיים וקריטי לא לשבור routing.
סיבוב #5 · דוחות ואנליטיקה
חבילת דוחות — מפת חום של שעתי טיפ, השוואה שבוע מול שבוע ועיצוב הדפסה
2026-05-16 03:42
91

הוספתי שכבת תובנות ניתוחית שלא הייתה קודם. מפת חום 7 ימים × 4 סוגי משמרות מציגה ₪ לשעת עבודה לכל תא, עם דירוג צבע לאורך הגרדיאנט הקיים navy→gold (לא הוספתי פלטה חדשה) — על נתוני production אמיתיים זה מראה שישי בוקר כתא הכי חם (₪29.2/ש׳) וראשון בוקר כקר ביותר (₪18.1/ש׳), כך שמנהלים מקבלים תובנת איוש אמיתית. רצועת השוואה שבוע מול שבוע מציגה 4 אריחים: השבוע, הקודם, אחוז שינוי בטיפים (עם חץ צבעוני) ושעתי השבוע מול הקודם. כל הקריאות הן read-only על shifts.json — אפס סיכון ללוגיקה הקיימת. tooltip מלא בכל תא + aria-label לקוראי מסך. הכרטיס מתקפל וזוכר את המצב ב-localStorage. בנוסף, גליון הדפסה גלובלי שמסתיר את ה-sidebar/nav/footer/toasts/buttons, מכריח שחור על לבן, שומר על צבעי המפה (print-color-adjust:exact), קובע שוליים A4, ומוסיף כותרת מודפסת ממותגת עם שם המסעדה, סלוגן וטלפון מ-restaurant_profile. הקריאה ל-tiptop_render_print_styles ב-layout.php עושה את כל מסכי המערכת לידידותיים-להדפסה במכה אחת — לא רק דוחות.

core/insights.php (חדש — heatmap 7×4, week-over-week, render card עם state נשמר ב-localStorage) core/print.php (חדש — @media print גלובלי + tiptop_print_header_html ממותג שיונק מ-restaurant_profile) layout.php (require_once + קריאה ל-tiptop_render_print_styles בתוך renderHead — כל עמוד מקבל הדפסה נקייה) reports.php (require_once insights + הזרקת tiptop_print_header_html למעלה + כרטיס תובנות אחרי באנר הסינון)
דוגמאות ופירוט
מפת חום על 172 משמרות אמיתיות: שישי בוקר ₪29/ש׳ (חם), ראשון בוקר ₪18/ש׳ (קר), ממוצע כללי ₪23.7/ש׳
WoW: השבוע ₪2,939 מתוך 8 משמרות · ירידה של 61.3% מול השבוע הקודם · חץ אדום אוטומטי
לחיצה על Ctrl+P בכל עמוד מציגה כותרת ממותגת + ללא sidebar + שחור על לבן + צבעי heatmap נשמרים
tooltip בעברית: 'שישי · בוקר — 13 משמרות · ₪3795 מתוך 130.0 שעות'
כרטיס מתקפל עם chevron — מצב נשמר ב-localStorage['tiptop_insights_hidden']
data-tiptop-no-print=true על כל אלמנט = הוא נעלם בהדפסה (opt-out כללי)
tiptop_print_header_html('דוחות וניתוחים') יוצר כותרת A4 עם שם מסעדה + תאריך + טלפון
4 קבצים, כולם אדיטיביים. שני helpers עצמאיים (insights, print) שכל עמוד יכול לצרוך — לא תלוי בדוחות. layout.php קיבל רק 2 שורות. reports.php קיבל רק 3 הזרקות קצרות. אפס נגיעה ב-envelopes/auth/webhook/api. אפס rename של מפתחות JSON. read-only על shifts.json. כל הקריאות מוגנות ב-function_exists/static-flag. בדוק חי ב-CLI על 172 משמרות — heatmap עובד, WoW עובד, render מחזיר 27KB HTML תקין. חסר רק CSV export של מטריצת ה-heatmap (אופציונלי לסיבוב עתיד).
סיבוב #4 · SEO ומטא
חבילת SEO — תגיות, OG, Schema.org, sitemap ו-robots
2026-05-16 02:34
90

הקמתי שכבת SEO שלמה שיונקת את כל המידע מ-restaurant_profile.json של סיבוב 1 — כך שכל מסעדה שמשנה לוגו, סלוגן או טלפון בעורך של סיבוב 2 רואה אוטומטית את העדכון בכל preview של WhatsApp ובכל תוצאת Google. הוספתי תיאור לכל עמוד (10 עמודים ממופים בעברית), OG ו-Twitter cards מלאים, JSON-LD של Schema.org בסוג Restaurant/CafeOrCoffeeShop/BarOrPub לפי restaurant_type, ו-canonical מנוקה משאילתות. דפים פרטיים מקבלים אוטומטית robots=noindex,nofollow כך ששמות עובדים, נתוני משמרות ודוחות לעולם לא ידלפו לחיפוש. robots.txt חוסם את /api.php, /data/, /core/ ו-13 דפי PHP פרטיים, ומכוון gpt/claude bots החוצה מנקודות הקצה הרגישות. sitemap.xml מצביע רק על 4 משטחים ציבוריים. login.php (שיש לו head עצמאי) קיבל את אותה השכבה — זה העמוד הכי משותף (מנהלים שולחים לעובדים) וכעת הוא נראה מקצועי בתצוגה מקדימה.

core/seo.php (חדש — מודול SEO מלא: description, canonical, OG, Twitter, LocalBusiness JSON-LD) robots.txt (חדש — whitelist לדפים ציבוריים, חסימה מלאה ל-API ו-data) sitemap.xml (חדש — 4 כתובות ציבוריות עם changefreq + priority + lastmod) layout.php (require_once + קריאה אחת בתוך renderHead מתחת ל-title) login.php (require_once שני helpers + קריאה אחת ל-render בעמוד הכניסה הציבורי)
דוגמאות ופירוט
curl https://tiptopsys.zbang.net/login.php → 8 og:* tags + 4 twitter:* + JSON-LD מלא
השתפ של קישור login ל-WhatsApp → לוגו זהוב + 'כניסה למערכת · טיפ טופ' + תיאור עברי
Google Rich Results Test על login.php → מזוהה כ-Restaurant עם שם, locale, תמונה
/dashboard.php פנימי → meta robots=noindex,nofollow (גם אם cookie דלף)
robots.txt → Disallow: /api.php, /data/, GPTBot Disallow לנקודות קצה רגישות
מסעדה משנה restaurant_type ל-bar בעורך → JSON-LD הופך אוטומטית ל-BarOrPub
tiptop_seo_description('reports') → 'דוחות וניתוחים — סיכומי הפקדות, הפרשות מס...'
5 פעולות נקיות, כולן אדיטיביות. מודול SEO יחיד ב-core שכל המערכת יונקת ממנו — זרו כפילות. layout.php קיבל רק 2 שורות, login.php רק 4. file_exists/function_exists guards בכל מקום, אז קובץ חסר לא שובר עמוד. אימפקט ישיר על שיתוף קישורים בעברית ועל תוצאות Google. חסר רק UI ב-settings להציג preview של ה-OG (אופציה לסיבוב עתידי).
סיבוב #3 · חוויית משתמש
UI Kit חדש — Toast מוערם, Confirm Modal ונגישות
2026-05-16 01:55
92

הוספתי שכבת התראות מודרנית עם 4 סוגי toast (success/error/warning/info), הערמה (stack) במקום to החלפת ההודעה הקודמת, וכפתורי פעולה אופציונליים. בנוסף — Confirm Modal גלובלי עם variant מסוכן (אדום/זהוב), focus trap, ESC לסגירה, קליק על ה-backdrop, ושני סוגי כפתורים (primary/ghost). aria-live=polite על המגש מבטיח שקוראי מסך מקריאים כל הודעה. טבעות focus זהובות גלובליות הוספו לכל a/button/input/select לעמידה ב-WCAG. ה-API: window.TipTop.toast / .confirm / .alert. ה-showToast הישן נשאר על מקומו ולא נגעתי בו — אפס סיכון רגרסיה. במצב בהיר עוברים אוטומטית לרקעים בהירים ומעבר זהב→חום.

core/ui.php (חדש — tiptop_render_ui_kit + CSS + JS API) layout.php (require_once + קריאה ליד ה-toast הקיים) settings.php (פאנל playground עם 6 כפתורי בדיקה)
דוגמאות ופירוט
TipTop.toast('המשמרת נשמרה!', {type:'success'})
TipTop.toast('סנכרון…', {type:'info', action:{label:'בטל', onClick:cancel}})
TipTop.confirm('למחוק את המשמרת?', {danger:true, okLabel:'מחק'}).then(ok=> ok && doDelete())
ESC סוגר את ה-modal · Tab לכוד בתוך ה-modal · החזרת focus למקור אחרי סגירה
aria-live='polite' על המגש → קורא מסך מודיע אוטומטית על כל הודעה חדשה
Playground חי בעמוד ההגדרות: 6 כפתורים שמדגימים כל וריאציה
פיצ'ר עמוק (3 פרימיטיבים + נגישות) ב-3 קבצים בלבד, כולו אדיטיבי. ה-toast הישן עדיין עובד, ה-API החדש קיים ב-window.TipTop. focus rings, focus trap ו-aria-live מספקים שדרוג נגישות מהותי. playground ב-settings מאפשר לך לראות הכל בלי קוד.
סיבוב #2 · רב-שוכרים
עורך פרופיל מסעדה — נראות וניהול מלאים
2026-05-16 01:05
91

סגרתי את הפרופיל בעמוד ההגדרות: כרטיס שלם "פרופיל המסעדה" עם שדות שם בעברית/אנגלית, סלוגן, נתיב לוגו, בחירת מטבע (ILS/USD/EUR/GBP), סמל ומיקום (prefix/suffix), סוג עסק (מסעדה/בית קפה/בר/שף/מהיר), יום ראשון של שבוע, אזור זמן, locale, טלפון וכתובת. השליחה היא POST עצמאית ל-settings.php — לא נגעתי ב-save() הקיים, לא נגעתי ב-api.php, אז ההגדרות הקיימות ממשיכות לעבוד כרגיל. הוספתי באנר הצלחה/כישלון, חותמת עדכון אחרון, ותצוגת preview חיה ("123 ₪" → "$123" אם משנים סמל למשל). הוולידציה בצד השרת מסננת ל-whitelist ושומרת את המקור אם השדה ריק.

settings.php (כרטיס חדש + POST handler עצמאי)
דוגמאות ופירוט
שדות: name, name_en, tagline, tagline_en, logo, currency, currency_symbol, currency_position, timezone, locale, week_starts_on, restaurant_type, phone, address
POST: action=save_restaurant_profile — handler נמצא בראש settings.php, לפני renderHead
Whitelist קשיח: רק 4 ערכי currency, 2 ערכי currency_position, 5 ערכי restaurant_type
Preview חי בתחתית הטופס: tiptop_money(123) ←- מתחלף בזמן אמת לפי currency_symbol/position
פיצ'ר שלם end-to-end ב-edit אחד. POST עצמאי = אפס סיכון רגרסיה לזרימת ההגדרות הקיימת. UX: באנר flash + חותמת עדכון + preview. חסר רק העלאת לוגו (A3, סיבוב הבא).
סיבוב #1 · רב-שוכרים
פרופיל מסעדה — תשתית רב-שוכרים
2026-05-16 00:25
88

הקמתי את שכבת הזהות לכל מסעדה: קובץ JSON מרכזי עם שם, סלוגן, לוגו, מטבע (סמל + מיקום), אזור זמן, שפה, יום ראשון של שבוע ו-type של העסק. helper בשם tiptop_restaurant_profile() מחזיר את הערכים, tiptop_save_restaurant_profile() כותב, ו-tiptop_money() מעצב סכומים לפי המטבע. layout.php מעדיף עכשיו את הפרופיל החדש אך נופל בעדינות לחזרה לאחור — כל התקנה קיימת ממשיכה כרגיל. זו האבן הראשונה בדרך לרב-שוכריות אמיתית.

core/restaurant.php (חדש) data/restaurant_profile.json (חדש) layout.php (תוספת fallback)
דוגמאות ופירוט
tiptop_money(123.4) → "123 ₪" (כאשר currency_position=suffix)
שינוי הסמל ל-$ ו-prefix → "$123" ללא נגיעה בקוד
קריאה: $r = tiptop_restaurant_profile(); → $r['name'], $r['logo'], $r['timezone'] ...
תשתית נקייה, אדיטיבית בלבד, מבוססת fallback של 3 שכבות (profile → settings.json → defaults). חסר עדיין UI עורך — Round 2 יסגור את זה.