• דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private
    • הרשמה
    • התחברות

    🚀 מדריך למשתמש: מחולל השלוחות המתקדם של "יהונייסען מערכות"

    מתוזמן נעוץ נעול הועבר הסברים מסודרים ממשתמשים
    1 פוסטים 1 כותבים 23 צפיות 1 עוקבים
    טוען פוסטים נוספים
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
    תגובה
    • תגובה כנושא
    התחברו כדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • L מנותק
      lavitoren הטי"ל
      נערך לאחרונה על ידי lavitoren הטי"ל

      ברוכים הבאים לעידן החדש של ניהול מערכות התוכן

      אם אי פעם מצאתם את עצמכם פותחים עשרות (או מאות) שלוחות במערכת הטלפונית אחת-אחת, מעלים קבצי ext.ini ידנית ומגדירים הגדרות דומות שוב ושוב – הכלי הזה נוצר במיוחד עבורכם.

      🔥 מה זה "יהונייסען מערכות" ולמה זה קריטי עבורכם?

      מערכת זו היא מחולל שלוחות רב-שכבתי. היא מאפשרת לכם לבנות מבנה שלם של מערכת טלפונית (עד 3 שכבות עומק) תוך שניות בודדות.

      התועלת המרכזית:

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

      אוטומציה חכמה: יצירת כותרות אוטומטיות (א, ב, ג... או 1, 2, 3...) וסידור אפסים מובילים (01, 02) בלחיצת כפתור.

      גמישות מקסימלית: תמיכה בכל סוגי השלוחות (תפריטים, השמעת קבצים, חדרי ועידה, API ועוד).

      👤 למי התוכנה מיועדת?

      מנהלי מערכות תוכן: המקימים קווי מידע, שיעורי תורה או מערכות מורכבות.

      מפתחים: הזקוקים להקמה מהירה של תשתית לזיהוי נתונים או שלוחות API.

      בעלי מוסדות וארגונים: שרוצים לארגן את המערכת שלהם בצורה היררכית ומסודרת (למשל: שלוחה לכל כיתה, ובתוכה תת-שלוחה לכל מקצוע).

      🛠️ הוראות הפעלה – צעד אחר צעד

      שלב 1: חיבור למערכת
      טוקן גישה: הזינו את הטוקן של המערכת שלכם (למשל 0770000000:123456). זהו המפתח שמאפשר לתוכנה "לדבר" עם השרת של ימות המשיח.
      כתובת השלוחה: ציינו איפה אתם רוצים שהשלוחות ייפתחו. אם תשאירו ריק, הן ייפתחו בשורש (התפריט הראשי). אם תכתבו 1/5, השלוחות החדשות ייפתחו בתוך שלוחה 5 שביחידה 1.

      שלב 2: הגדרת השלוחות הראשיות (השכבה הראשונה)
      סוג כותרת (Title): בחרו איך המערכת תזהה את השלוחה. תוכלו לבחור בגימטריה (א', ב'), מספרים, אנגלית, או טקסט חופשי משולב.
      סוג השלוחה (Type): בחרו את תפקוד השלוחה (למשל menu לתפריט או playfile להשמעה).
      טווח שלוחות: הגדירו מאיזה מספר להתחיל ובאיזה לסיים (למשל מ-1 עד 10).
      שורות קוד נוספות: כאן ניתן להוסיף הגדרות ספציפיות שיופיעו בכל השלוחות (למשל: say_zman_today=yes).

      שלב 3: הוספת תת-שלוחות (אופציונלי - הקסם האמיתי!)
      סימון ה-V בתיבת "יצירת תת-שלוחות" יפתח לכם אפשרות להקים בתוך כל שלוחה ראשית, סדרה נוספת של שלוחות פנימיות.
      דוגמה: אם יצרתם שלוחות 1-5, ובכל אחת הגדרתם תת-שלוחות 1-3, התוכנה תייצר אוטומטית 15 שלוחות מוגדרות מראש!
      ניתן לרדת עד לשכבה שלישית (תת-תת-שלוחה) ליצירת מבנה עומק מורכב.

      שלב 4: ביצוע ומעקב
      לחצו על הכפתור המוזהב "🚀 התחל פתיחת שלוחות".
      בצד ימין יופיע לוג (יומן פעולות) שיעדכן אתכם בזמן אמת על כל שלוחה שנוצרת.
      במרכז תראו פס התקדמות שיציג כמה אחוזים מהמשימה הושלמו.
      💡 טיפים למקצוענים:
      אפסים מובילים: אם אתם פותחים יותר מ-10 שלוחות, מומלץ להגדיר "כמות ספרות" ל-2. כך השלוחות ייראו כך: 01, 02... 10 והסדר בשרת יישמר.
      כותרת משולבת: ניתן לבחור "שילוב: טקסט ידני לפני" ולכתוב "שיעור מספר". התוצאה תהיה כותרות כמו: "שיעור מספר א", "שיעור מספר ב" וכו'.
      בטיחות: אם טעיתם, ניתן ללחוץ על "ביטול פעולה" בכל שלב כדי לעצור את התהליך.
      זהו, אתם מוכנים!
      השתמשו בכלי בחוכמה, והפכו את ניהול המערכת שלכם לקל, מהיר ומקצועי הרבה יותר.
      בהצלחה!
      יהונייסען מערכות – כי הזמן שלכם שווה יותר.

      הנה הקוד המצורף לתגובות כאן

      <!DOCTYPE html>
      <html lang="he" dir="rtl">
      <head>
          <meta charset="UTF-8">
          <title>יהונייסען מערכות - מחולל שלוחות רב-שכבתי מתקדם</title>
          <style>
              :root {
                  --primary: #f0c965; 
                  --primary-light: #fbe8a6;
                  --primary-dark: #b89728; 
                  --danger: #ff5252; 
                  --danger-hover: #ff1744; 
                  --bg: #0d0e12; 
                  --card-bg: #16181d; 
                  --input-bg: #101216;
                  --dark: #e4e6eb; 
                  --border: #2a2e39; 
                  --accent: #f0c965;
                  --shadow: 0 12px 40px rgba(0, 0, 0, 0.6);
              }
              * { box-sizing: border-box; }
              body { 
                  font-family: 'Segoe UI', system-ui, -apple-system, sans-serif; 
                  margin: 0; 
                  background: radial-gradient(circle at top, #1a1e29 0%, var(--bg) 100%);
                  color: var(--dark); 
                  text-align: right; 
                  min-height: 100vh;
                  display: flex;
                  flex-direction: column;
                  justify-content: center;
                  padding: 20px 0;
              }
              .wrapper { width: 100%; max-width: 980px; margin: 0 auto; padding: 0 20px; }
              .card { 
                  background: var(--card-bg); 
                  padding: 35px; 
                  border-radius: 14px; 
                  box-shadow: var(--shadow); 
                  margin-bottom: 25px; 
                  border: 1px solid var(--border); 
                  position: relative;
                  overflow: hidden;
              }
              .card::before {
                  content: '';
                  position: absolute;
                  top: 0; right: 0; left: 0;
                  height: 3px;
                  background: linear-gradient(90deg, var(--primary-dark), var(--primary), var(--primary-light));
              }
              .header-container {
                  border-bottom: 1px solid var(--border);
                  padding-bottom: 18px;
                  margin-bottom: 25px;
                  display: flex;
                  justify-content: space-between;
                  align-items: center;
              }
              h2 { 
                  margin: 0; 
                  color: #ffffff; 
                  font-size: 26px; 
                  font-weight: 800;
                  letter-spacing: -0.5px;
                  display: flex;
                  align-items: center;
                  gap: 10px;
              }
              .brand-subtitle {
                  font-size: 11px;
                  color: var(--primary);
                  font-family: 'Segoe UI', Tahoma, sans-serif;
                  font-weight: 700;
                  letter-spacing: 1.5px;
                  text-transform: uppercase;
                  background: rgba(240, 201, 101, 0.1);
                  padding: 6px 12px;
                  border-radius: 20px;
                  border: 1px solid rgba(240, 201, 101, 0.2);
              }
              .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; margin-top: 20px; }
              .input-group { display: flex; flex-direction: column; gap: 8px; }
              label { font-weight: 600; font-size: 13.5px; color: #b0b3b8; display: flex; align-items: center; gap: 6px; }
              input, select, textarea { 
                  padding: 12px 14px; 
                  border: 1px solid var(--border); 
                  border-radius: 8px; 
                  font-size: 14px; 
                  outline: none; 
                  transition: all 0.25s ease; 
                  font-family: inherit; 
                  background: var(--input-bg); 
                  color: #ffffff;
              }
              input:hover, select:hover, textarea:hover {
                  border-color: #3f4656;
              }
              input:focus, select:focus, textarea:focus { 
                  border-color: var(--accent); 
                  background: #14171f;
                  box-shadow: 0 0 0 3px rgba(240, 201, 101, 0.15); 
              }
              .full-width { grid-column: 1 / -1; }
      
              /* Info Box */
              .info-box {
                  background: linear-gradient(135deg, rgba(240, 201, 101, 0.05) 0%, rgba(240, 201, 101, 0.02) 100%);
                  border: 1px solid rgba(240, 201, 101, 0.2);
                  padding: 14px 18px;
                  border-radius: 8px;
                  margin-bottom: 22px;
                  font-size: 13.5px;
                  color: #fbe8a6;
                  display: flex;
                  align-items: center;
                  gap: 12px;
                  line-height: 1.5;
              }
      
              /* Fancy Gold Buttons */
              .btn-main { 
                  background: linear-gradient(135deg, #f0c965 0%, #d4af37 100%);
                  color: #0d0e12; 
                  border: none; 
                  padding: 14px 20px; 
                  border-radius: 8px; 
                  cursor: pointer; 
                  font-size: 16px; 
                  font-weight: 700; 
                  width: 100%; 
                  transition: all 0.3s ease; 
                  margin-top: 10px;
                  box-shadow: 0 4px 20px rgba(212, 175, 55, 0.25);
                  display: flex;
                  align-items: center;
                  justify-content: center;
                  gap: 8px;
              }
              .btn-main:hover { 
                  background: linear-gradient(135deg, #fbe8a6, #e6c553);
                  transform: translateY(-2px);
                  box-shadow: 0 6px 25px rgba(212, 175, 55, 0.4);
              }
              .btn-main:active { transform: translateY(0); }
              .btn-main:disabled { 
                  background: #2a2e39; 
                  color: #6c757d;
                  cursor: not-allowed; 
                  box-shadow: none;
                  transform: none;
              }
      
              .btn-cancel { 
                  background: linear-gradient(135deg, #ff5252 0%, #d32f2f 100%);
                  color: white; 
                  border: none; 
                  padding: 14px 20px; 
                  border-radius: 8px; 
                  cursor: pointer; 
                  font-size: 16px; 
                  font-weight: 700; 
                  width: 100%; 
                  transition: all 0.3s ease; 
                  margin-top: 15px; 
                  display: none; 
                  box-shadow: 0 4px 15px rgba(211, 47, 47, 0.3);
              }
              .btn-cancel:hover { 
                  background: linear-gradient(135deg, #ff6b6b, #c62828);
              }
      
              .progress-wrapper { margin-top: 25px; display: none; }
              .progress-container { width: 100%; background: var(--input-bg); height: 26px; border-radius: 8px; overflow: hidden; position: relative; border: 1px solid var(--border); }
              .progress-bar { height: 100%; width: 0%; background: linear-gradient(90deg, #d4af37, #fbe8a6); transition: width 0.3s ease; }
              .progress-text { position: absolute; width: 100%; text-align: center; top: 0; line-height: 26px; color: #0d0e12; font-weight: 800; font-size: 12.5px; text-shadow: 0 0 2px rgba(255,255,255,0.4); }
              
              .log-box { 
                  background: #08090c; 
                  color: #00e676; 
                  padding: 18px; 
                  border-radius: 8px; 
                  font-family: 'Consolas', monospace; 
                  height: 280px; 
                  overflow-y: auto; 
                  font-size: 12.5px; 
                  line-height: 1.6; 
                  border: 1px solid var(--border);
                  box-shadow: inset 0 2px 8px rgba(0,0,0,0.9);
              }
              .log-info { color: #64b5f6; }
              .log-success { color: #00e676; font-weight: bold; }
              .log-error { color: #ff5252; }
              .log-warn { color: #ffb74d; }
              .section-box { 
                  background: #111318; 
                  padding: 22px; 
                  border-radius: 10px; 
                  border: 1px solid var(--border); 
                  margin-top: 5px; 
                  transition: all 0.3s ease;
              }
      
              /* Tooltip Styles */
              .tooltip-container {
                  position: relative;
                  display: inline-block;
                  cursor: help;
                  border-bottom: 1px dashed var(--accent);
                  color: var(--accent);
                  font-weight: 600;
              }
              .tooltip-container .tooltip-text {
                  visibility: hidden;
                  width: 250px;
                  background-color: #1e222d;
                  color: #fff;
                  text-align: center;
                  border-radius: 8px;
                  padding: 12px;
                  position: absolute;
                  z-index: 100;
                  bottom: 135%;
                  left: 50%;
                  transform: translateX(-50%);
                  opacity: 0;
                  transition: opacity 0.3s ease, transform 0.3s ease;
                  font-size: 12.5px;
                  font-weight: normal;
                  border: 1px solid var(--border);
                  box-shadow: 0 10px 25px rgba(0, 0, 0, 0.7);
              }
              .tooltip-container .tooltip-text::after {
                  content: "";
                  position: absolute;
                  top: 100%;
                  left: 50%;
                  margin-left: -5px;
                  border-width: 5px;
                  border-style: solid;
                  border-color: #1e222d transparent transparent transparent;
              }
              .tooltip-container:hover .tooltip-text {
                  visibility: visible;
                  opacity: 1;
                  transform: translateX(-50%) translateY(-2px);
              }
          </style>
      </head>
      <body>
      
      <div class="wrapper">
          <div class="card">
              <div class="header-container">
                  <div>
                      <h2>✨ יהונייסען מערכות</h2>
                      <div style="font-size: 13px; color: #8a8f98; margin-top: 4px;">מחולל שלוחות רב-שכבתי מתקדם</div>
                  </div>
                  <div class="brand-subtitle">TYL Pro Version</div>
              </div>
              
              <div class="info-box">
                  <span style="font-size: 18px;">💡</span>
                  <div>
                      <strong>למה הכלי הזה עוזר לך?</strong> חוסך שעות של עבודה ידנית וטונות של טירחה בפתיחת שלוחות אחת-אחת בשרת, ומייעל את ניהול הזמן בצורה משמעותית.
                  </div>
              </div>
      
              <div class="grid">
                  <div class="input-group full-width">
                      <label>
                          🔑 טוקן גישה:
                          <span class="tooltip-container">❓ הסבר
                              <span class="tooltip-text">קוד זיהוי ייחודי המקשר את התוכנה למערכת הטלפונית שלך (לדוגמא 0770000000:123456).</span>
                          </span>
                      </label>
                      <input type="text" id="token" placeholder="הכנס טוקן מערכת (לדוגמא 0770000000:123456)">
                  </div>
                  <div class="input-group full-width">
                      <label>
                          📂 כתובת השלוחה (ללא סלש בהתחלה):
                          <span class="tooltip-container">❓ הסבר
                              <span class="tooltip-text">המיקום במערכת שבו ייפתחו השלוחות, יש להזין ללא סלש בהתחלה (למשל: 1 או 1/2. השאר ריק עבור שורש המערכת).</span>
                          </span>
                      </label>
                      <input type="text" id="targetPath" placeholder="לדוגמה: 1 (הקפד להזין ללא סלש בהתחלה, או השאר ריק לשורש)">
                  </div>
      
                  <!-- הגדרות שלוחה ראשית -->
                  <div class="input-group">
                      <label>
                          🏷️ סוג כותרת (Title) לשלוחות הראשיות:
                          <span class="tooltip-container">❓ הסבר
                              <span class="tooltip-text">הצורה שבה המערכת תקריא או תציג את שם השלוחה (אותיות עבריות, מספרים, או אנגלית).</span>
                          </span>
                      </label>
                      <select id="namingType" onchange="checkNamingCustom('namingType', 'namingCustomContainer')">
                          <option value="hebrew_extended">עברית רגילה (א, b... י, יא...)</option>
                          <option value="hebrew_strict">עברית עד ת' בלבד (ואז מספרים)</option>
                          <option value="numbers">מספרים (1, 2, 3...)</option>
                          <option value="english">אותיות באנגלית (A, B, C...)</option>
                          <option value="empty">ריק (ללא כותרת בכלל)</option>
                          <option value="custom_only">הכנסה ידנית בלבד</option>
                          <option value="combined_before">שילוב: טקסט ידני לפני המספר/אות</option>
                          <option value="combined_after">שילוב: טקסט ידני אחרי המספר/אות</option>
                      </select>
                      <div id="namingCustomContainer" style="display:none; margin-top:8px;">
                          <input type="text" id="namingCustomText" placeholder="הכנס טקסט ידני (ניתן לשלב רווחים)">
                      </div>
                  </div>
      
                  <div class="input-group">
                      <label>
                          ⚙️ סוג השלוחה הראשית (type):
                          <span class="tooltip-container">❓ הסבר
                              <span class="tooltip-text">ההגדרה המקצועית של התפקיד שהשלוחה תמלא במערכת הטלפונית (כגון תפריט, השמעת קבצים וכו').</span>
                          </span>
                      </label>
                      <select id="folderType" onchange="checkCustomType('folderType', 'customFolderType')">
                          <optgroup label="שלוחות בשימוש גבוה (הבסיס לכל מערכת)">
                              <option value="menu">menu - יצירת תפריט בחירה (הקש 1 ל..., הקש 2 ל...)</option>
                              <option value="playfile">playfile - השמעת קבצי שמע למאזינים</option>
                              <option value="record">record - שלוחת הקלטת הודעות (תא קולי או הקלטות)</option>
                              <option value="confbridge">confbridge - חדר ועידה רב-משתתפים או שידור חי</option>
                              <option value="routing">routing - ניתוב השיחה למספר טלפון חיצוני</option>
                              <option value="api">api - שלוחה למפתחים המקשרת לשרת חיצוני</option>
                              <option value="template_add_number">template_add_number - הוספה מרשימת תפוצה</option>
                              <option value="template_remove_number">template_remove_number - הסרה מרשימת תפוצה</option>
                          </optgroup>
                          <optgroup label="שלוחות בשימוש בינוני (פיצ'רים פופולריים)">
                              <option value="recording_and_entering_data">recording_and_entering_data - קליטת נתונים (ת.ז, גיל) והקלטות</option>
                              <option value="tzintuk">tzintuk - הפעלת שירות צינתוקים (צילצול וניתוק)</option>
                              <option value="last_play">last_play - חזרה לנקודה האחרונה בה המאזין עצר</option>
                              <option value="zmanim">zmanim - השמעת זמני היום לפי מיקום גיאוגרפי</option>
                              <option value="trivia_questions">trivia_questions - משחקי טריוויה (שאלות ותשובות)</option>
                              <option value="daily_message">daily_message - השמעת הודעה המשתנה לפי תאריך</option>
                              <option value="music_on_hold">music_on_hold - מוזיקה בהמתנה או רדיו חי</option>
                          </optgroup>
                          <optgroup label="שלוחות בשימוש נמוך / ייעודי">
                              <option value="queue">queue - ניהול תור נציגים למוקדי שירות</option>
                              <option value="seker">seker - עריכת סקרים טלפוניים ושמיעת תוצאות</option>
                              <option value="approval_number">approval_number - חלוקת מספרי אישור להגרלות</option>
                              <option value="time_keeper">time_keeper - מערכת שעון נוכחות לעובדים</option>
                              <option value="sale_products">sale_products - מכירת מוצרים או כסאות</option>
                              <option value="points_edit">points_edit - ניהול וצבירת נקודות למאזינים</option>
                              <option value="chapter_receive">chapter_receive - חלוקת פרקי לימוד</option>
                              <option value="codes">codes - חלוקת קודים או קופונים</option>
                              <option value="access_filter">access_filter - סינון כניסה לשלוחות לפי זמנים</option>
                              <option value="checking_units">checking_units - בדיקת יתרת יחידות בקו</option>
                              <option value="admin_login">admin_login - כניסה טלפונית לניהול המערכת</option>
                              <option value="hangup">hangup - ניתוק השיחה באופן אוטומטי</option>
                          </optgroup>
                          <option value="custom">הכנסה ידנית...</option>
                      </select>
                      <input type="text" id="customFolderType" placeholder="הכנס שם סוג שלוחה ידנית" style="display:none; margin-top:8px;">
                  </div>
      
                  <div class="input-group">
                      <label>
                          ▶️ מספר שלוחה התחלתי:
                          <span class="tooltip-container">❓ הסבר
                              <span class="tooltip-text">המספר שממנו תתחיל יצירת השלוחות בשרת (למשל מתחילים בשלוחה 1).</span>
                          </span>
                      </label>
                      <input type="number" id="startNum" value="1" min="0">
                  </div>
                  <div class="input-group">
                      <label>
                          ⏹️ מספר שלוחה סופי בשרת:
                          <span class="tooltip-container">❓ הסבר
                              <span class="tooltip-text">המספר שבו תסתיים סדרת פתיחת השלוחות הראשית.</span>
                          </span>
                      </label>
                      <input type="number" id="endNum" value="5" min="1">
                  </div>
                  <div class="input-group full-width">
                      <label>
                          🔢 כמות ספרות לשלוחה ראשית (אפסים מובילים):
                          <span class="tooltip-container">❓ הסבר
                              <span class="tooltip-text">קביעת מבנה אחיד למספרי השלוחות על ידי הוספת אפסים משמאל (לדוגמה: עבור 2 ספרות, שלוחה 1 תהפוך ל-01).</span>
                          </span>
                      </label>
                      <input type="number" id="digitsCount" value="1" min="1" max="6">
                  </div>
      
                  <div class="input-group full-width">
                      <label>
                          📝 שורות קוד נוספות לקובץ ext.ini (שלוחות ראשיות בלבד):
                          <span class="tooltip-container">❓ הסבר
                              <span class="tooltip-text">הגדרות מתקדמות נוספות שיוכנסו אוטומטית לקובץ ההגדרות של השלוחה (ext.ini).</span>
                          </span>
                      </label>
                      <textarea id="extraCodeMain" rows="2" placeholder="לדוגמה:&#10;enter_id=yes"></textarea>
                  </div>
      
                  <!-- הגדרות תת-שלוחה -->
                  <div class="input-group full-width section-box">
                      <div style="display: flex; align-items: center; gap: 10px; margin-bottom: 12px;">
                          <input type="checkbox" id="subFoldersCheck" onchange="toggleSubFolders()" style="width: 18px; height: 18px; cursor: pointer; accent-color: var(--accent);">
                          <label for="subFoldersCheck" style="cursor: pointer; color: var(--dark); font-size: 15px; font-weight: 700;">📁 יצירת תת-שלוחות</label>
                      </div>
                      <div id="subConfig" class="grid" style="display: none; margin: 0;">
                          <div class="input-group">
                              <label>🏷️ סוג כותרת לתת-השלוחות:</label>
                              <select id="subNamingType" onchange="checkNamingCustom('subNamingType', 'subNamingCustomContainer')">
                                  <option value="hebrew_matrix">מטריצת עברית (אא, אב, אג... או בא, בב...)</option>
                                  <option value="hebrew_extended">עברית רגילה (א, ב... י, יא...)</option>
                                  <option value="numbers">מספרים (1, 2, 3...)</option>
                                  <option value="english">אותיות באנגלית (A, B, C...)</option>
                                  <option value="empty">ריק (ללא כותרת בכלל)</option>
                                  <option value="custom_only">הכנסה ידנית בלבד</option>
                                  <option value="combined_before">שילוב: טקסט ידני לפני</option>
                                  <option value="combined_after">שילוב: טקסט ידני אחרי</option>
                              </select>
                              <div id="subNamingCustomContainer" style="display:none; margin-top:8px;">
                                  <input type="text" id="subNamingCustomText" placeholder="הכנס טקסט ידני לתת-שלוחה">
                              </div>
                          </div>
                          <div class="input-group">
                              <label>⚙️ סוג השלוחה לתת-השלוחות (type):</label>
                              <select id="subFolderType" onchange="checkCustomType('subFolderType', 'customSubFolderType')">
                                  <optgroup label="שלוחות בשימוש גבוה">
                                      <option value="menu">menu - תפריט בחירה</option>
                                      <option value="playfile">playfile - השמעת קבצי שמע</option>
                                      <option value="record">record - הקלטת הודעות</option>
                                      <option value="confbridge">confbridge - חדר ועידה</option>
                                      <option value="routing">routing - ניתוב שיחה</option>
                                      <option value="api">api - שלוחת מפתחים</option>
                                  </optgroup>
                                  <optgroup label="שלוחות בשימוש בינוני">
                                      <option value="recording_and_entering_data">recording_and_entering_data - קליטת נתונים</option>
                                      <option value="tzintuk">tzintuk - צינתוקים</option>
                                      <option value="zmanim">zmanim - זמני היום</option>
                                      <option value="trivia_questions">trivia_questions - טריוויה</option>
                                  </optgroup>
                                  <optgroup label="שלוחות בשימוש נמוך / ייעודי">
                                      <option value="queue">queue - ניהול תור</option>
                                      <option value="seker">seker - סקרים</option>
                                      <option value="approval_number">approval_number - מספרי אישור</option>
                                      <option value="time_keeper">time_keeper - שעון נוכחות</option>
                                      <option value="codes">codes - קודים וקופונים</option>
                                      <option value="access_filter">access_filter - סינון כניסה</option>
                                      <option value="hangup">hangup - ניתוק</option>
                                  </optgroup>
                                  <option value="custom">הכנסה ידנית...</option>
                              </select>
                              <input type="text" id="customSubFolderType" placeholder="הכנס שם סוג שלוחה ידנית" style="display:none; margin-top:8px;">
                          </div>
                          <div class="input-group">
                              <label>▶️ מאיזה שלוחה:</label>
                              <input type="number" id="subStartRange" value="1" min="1">
                          </div>
                          <div class="input-group">
                              <label>⏹️ איזה שלוחה:</label>
                              <input type="number" id="subEndRange" value="10" min="1">
                          </div>
                          <div class="input-group full-width">
                              <label>🔢 כמות ספרות לתת-שלוחה (אפסים מובילים):</label>
                              <input type="number" id="subDigitsCount" value="1" min="1" max="6">
                          </div>
                          <div class="input-group full-width">
                              <label>📝 שורות קוד נוספות לקובץ ext.ini (תת-שלוחות בלבד):</label>
                              <textarea id="extraCodeSub" rows="2" placeholder="לדוגמה:&#10;play_welcome=yes"></textarea>
                          </div>
                      </div>
                  </div>
      
                  <!-- הגדרות תת-תת-שלוחה -->
                  <div class="input-group full-width section-box">
                      <div style="display: flex; align-items: center; gap: 10px; margin-bottom: 12px;">
                          <input type="checkbox" id="subSubFoldersCheck" onchange="toggleSubSubFolders()" style="width: 18px; height: 18px; cursor: pointer; accent-color: var(--accent);">
                          <label for="subSubFoldersCheck" style="cursor: pointer; color: var(--dark); font-size: 15px; font-weight: 700;">📂 יצירת תת-תת-שלוחות (שכבה שלישית)</label>
                      </div>
                      <div id="subSubConfig" class="grid" style="display: none; margin: 0;">
                          <div class="input-group">
                              <label>🏷️ סוג כותרת לתת-תת-השלוחות:</label>
                              <select id="subSubNamingType">
                                  <option value="hebrew_matrix_triple">מטריצה משולשת (אאא, אאב, אאג...)</option>
                                  <option value="hebrew_extended">עברית רגילה (א, b... י, יא...)</option>
                                  <option value="numbers">מספרים (1, 2, 3...)</option>
                                  <option value="english">אותיות באנגלית (A, B, C...)</option>
                              </select>
                          </div>
                          <div class="input-group">
                              <label>⚙️ סוג השלוחה לתת-תת-השלוחות (type):</label>
                              <select id="subSubFolderType" onchange="checkCustomType('subSubFolderType', 'customSubSubFolderType')">
                                  <optgroup label="שלוחות בשימוש גבוה">
                                      <option value="playfile">playfile - השמעת קבצי שמע</option>
                                      <option value="menu">menu - יצירת תפריט בחירה</option>
                                      <option value="record">record - שלוחת הקלטת הודעות</option>
                                      <option value="confbridge">confbridge - חדר ועידה</option>
                                  </optgroup>
                                  <optgroup label="שלוחות בשימוש בינוני">
                                      <option value="recording_and_entering_data">recording_and_entering_data - קליטת נתונים</option>
                                      <option value="zmanim">zmanim - זמני היום</option>
                                      <option value="trivia_questions">trivia_questions - טריוויה</option>
                                  </optgroup>
                                  <optgroup label="שלוחות בשימוש נמוך / ייעודי">
                                      <option value="queue">queue - ניהול תור</option>
                                      <option value="seker">seker - סקרים</option>
                                      <option value="approval_number">approval_number - מספרי אישור</option>
                                      <option value="codes">codes - קודים וקופונים</option>
                                      <option value="hangup">hangup - ניתוק</option>
                                  </optgroup>
                                  <option value="custom">הכנסה ידנית...</option>
                              </select>
                              <input type="text" id="customSubSubFolderType" placeholder="הכנס שם סוג שלוחה ידנית" style="display:none; margin-top:8px;">
                          </div>
                          <div class="input-group">
                              <label>▶️ מאיזה שלוחה:</label>
                              <input type="number" id="subSubStartRange" value="1" min="1">
                          </div>
                          <div class="input-group">
                              <label>⏹️ איזה שלוחה:</label>
                              <input type="number" id="subSubEndRange" value="5" min="1">
                          </div>
                          <div class="input-group full-width">
                              <label>🔢 כמות ספרות לתת-תת-שלוחה (אפסים מובילים):</label>
                              <input type="number" id="subSubDigitsCount" value="1" min="1" max="6">
                          </div>
                          <div class="input-group full-width">
                              <label>📝 שורות קוד נוספות לקובץ ext.ini (תת-תת-שלוחות בלבד):</label>
                              <textarea id="extraCodeSubSub" rows="2" placeholder="לדוגמה:&#10;record_file=yes"></textarea>
                          </div>
                      </div>
                  </div>
      
                  <div class="full-width">
                      <button id="startBtn" class="btn-main" onclick="startProcess()">🚀 התחל פתיחת שלוחות</button>
                      <button id="cancelBtn" class="btn-cancel" onclick="cancelProcess()">❌ ביטול פעולה</button>
                  </div>
              </div>
      
              <div class="progress-wrapper" id="progBox">
                  <div class="progress-container">
                      <div class="progress-bar" id="progBar"></div>
                      <div class="progress-text" id="progText">0%</div>
                  </div>
              </div>
          </div>
      
          <div class="card">
              <div class="log-box" id="logBox">⏳ ממתין לתחילת ביצוע...</div>
          </div>
      </div>
      
      <script>
          let abortController = null;
      
          function checkCustomType(selectId, inputId) {
              const val = document.getElementById(selectId).value;
              const input = document.getElementById(inputId);
              input.style.display = val === 'custom' ? 'block' : 'none';
          }
      
          function checkNamingCustom(selectId, containerId) {
              const val = document.getElementById(selectId).value;
              const container = document.getElementById(containerId);
              if (val === 'empty') {
                  container.style.display = 'none';
              } else {
                  container.style.display = (val === 'custom_only' || val === 'combined_before' || val === 'combined_after') ? 'block' : 'none';
              }
          }
      
          function getHebrewTitle(index, mode) {
              if (mode === 'strict' && index > 22) {
                  return String(index);
              }
              const ones = ['', 'א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט'];
              const tens = ['', 'י', 'כ', 'ל', 'מ', 'נ', 'ס', 'ע', 'פ', 'צ'];
              const hundreds = ['', 'ק', 'ר', 'ש', 'ת'];
      
              if (index <= 0) return String(index);
              if (index < 10) return ones[index];
              if (index < 100) {
                  let t = Math.floor(index / 10);
                  let o = index % 10;
                  if (index === 15) return 'טו';
                  if (index === 16) return 'טז';
                  return tens[t] + ones[o];
              } else if (index < 500) {
                  let h = Math.floor(index / 100);
                  let rem = index % 100;
                  let t = Math.floor(rem / 10);
                  let o = rem % 10;
                  let res = hundreds[h];
                  if (rem === 15) res += 'טו';
                  else if (rem === 16) res += 'טז';
                  else {
                      if (t > 0) res += tens[t];
                      if (o > 0) res += ones[o];
                  }
                  return res;
              }
              return String(index);
          }
      
          function getMatrixTitle(mainIndex, subIndex) {
              let mainLetter = getHebrewTitle(mainIndex, 'extended');
              let subLetter = getHebrewTitle(subIndex, 'extended');
              return mainLetter + subLetter;
          }
      
          function getTripleMatrixTitle(mainIndex, subIndex, subSubIndex) {
              let mainLetter = getHebrewTitle(mainIndex, 'extended');
              let subLetter = getHebrewTitle(subIndex, 'extended');
              let subSubLetter = getHebrewTitle(subSubIndex, 'extended');
              return mainLetter + subLetter + subSubLetter;
          }
      
          function toggleSubFolders() {
              const isChecked = document.getElementById('subFoldersCheck').checked;
              document.getElementById('subConfig').style.display = isChecked ? 'grid' : 'none';
              if (!isChecked) {
                  document.getElementById('subSubFoldersCheck').checked = false;
                  toggleSubSubFolders();
              }
          }
      
          function toggleSubSubFolders() {
              const isChecked = document.getElementById('subSubFoldersCheck').checked;
              if (isChecked) {
                  document.getElementById('subFoldersCheck').checked = true;
                  toggleSubFolders();
              }
              document.getElementById('subSubConfig').style.display = isChecked ? 'grid' : 'none';
          }
      
          function addLog(msg, type = "info") {
              const logBox = document.getElementById('logBox');
              logBox.innerHTML += `<div class="log-${type}">> ${msg}</div>`;
              logBox.scrollTop = logBox.scrollHeight;
          }
      
          function cancelProcess() {
              if (abortController) {
                  abortController.abort();
                  addLog("הפעולה הופסקה על ידי המשתמש.", "warn");
                  document.getElementById('startBtn').disabled = false;
                  document.getElementById('cancelBtn').style.display = 'none';
              }
          }
      
          function buildTitleString(type, index, mainIndex = 1, subIndex = 1, subSubIndex = 1, customText = "") {
              let baseTitle = "";
              if (type === 'numbers') {
                  baseTitle = String(index);
              } else if (type === 'hebrew_extended' || type === 'hebrew') {
                  baseTitle = getHebrewTitle(index, 'extended');
              } else if (type === 'hebrew_strict') {
                  baseTitle = getHebrewTitle(index, 'strict');
              } else if (type === 'hebrew_matrix') {
                  baseTitle = getMatrixTitle(mainIndex, index);
              } else if (type === 'hebrew_matrix_triple') {
                  baseTitle = getTripleMatrixTitle(mainIndex, subIndex, index);
              } else if (type === 'english') {
                  if (index > 0 && index <= 26) {
                      baseTitle = String.fromCharCode(64 + index);
                  } else {
                      baseTitle = String(index);
                  }
              } else if (type === 'empty') {
                  return "";
              } else if (type === 'custom_only') {
                  return customText || "";
              }
      
              if (type === 'combined_before') {
                  return (customText ? customText + " " : "") + baseTitle;
              } else if (type === 'combined_after') {
                  return baseTitle + (customText ? " " + customText : "");
              }
      
              return baseTitle;
          }
      
          function getAutomaticDigitsParam(count) {
              if (count > 100) {
                  return "digits=3";
              } else if (count > 10) {
                  return "digits=2";
              }
              return "";
          }
      
          async function startProcess() {
              const token = document.getElementById('token').value.trim();
              let targetPath = document.getElementById('targetPath').value.trim().replace(/^\/|\/$/g, "");
              const namingType = document.getElementById('namingType').value;
              const namingCustomText = document.getElementById('namingCustomText').value.trim();
              
              let folderType = document.getElementById('folderType').value;
              if (folderType === 'custom') folderType = document.getElementById('customFolderType').value.trim();
      
              const hasSub = document.getElementById('subFoldersCheck').checked;
              const hasSubSub = document.getElementById('subSubFoldersCheck').checked;
      
              const extraCodeMain = document.getElementById('extraCodeMain').value.trim();
              const extraCodeSub = document.getElementById('extraCodeSub').value.trim();
              const extraCodeSubSub = document.getElementById('extraCodeSubSub').value.trim();
      
              if (!token) {
                  alert("נא להזין טוקן!");
                  return;
              }
      
              const startNum = parseInt(document.getElementById('startNum').value);
              const endNum = parseInt(document.getElementById('endNum').value);
              const digitsCount = parseInt(document.getElementById('digitsCount').value);
      
              if (isNaN(startNum) || isNaN(endNum) || startNum > endNum) {
                  alert("טווח השלוחות אינו תקין!");
                  return;
              }
      
              let tasks = [];
              let subNamingType = document.getElementById('subNamingType').value;
              let subNamingCustomText = document.getElementById('subNamingCustomText').value.trim();
              let subFolderType = document.getElementById('subFolderType').value;
              if (subFolderType === 'custom') subFolderType = document.getElementById('customSubFolderType').value.trim();
              let subStartRange = parseInt(document.getElementById('subStartRange').value) || 1;
              let subEndRange = parseInt(document.getElementById('subEndRange').value) || 10;
              let subDigitsCount = parseInt(document.getElementById('subDigitsCount').value) || 1;
      
              let subSubNamingType = document.getElementById('subSubNamingType').value;
              let subSubFolderType = document.getElementById('subSubFolderType').value;
              if (subSubFolderType === 'custom') subSubFolderType = document.getElementById('customSubSubFolderType').value.trim();
              let subSubStartRange = parseInt(document.getElementById('subSubStartRange').value) || 1;
              let subSubEndRange = parseInt(document.getElementById('subSubEndRange').value) || 5;
              let subSubDigitsCount = parseInt(document.getElementById('subSubDigitsCount').value) || 1;
      
              const mainCount = (endNum - startNum) + 1;
              const subCount = (subEndRange - subStartRange) + 1;
              const subSubCount = (subSubEndRange - subSubStartRange) + 1;
      
              const mainAutoDigits = getAutomaticDigitsParam(mainCount);
              const subAutoDigits = getAutomaticDigitsParam(subCount);
              const subSubAutoDigits = getAutomaticDigitsParam(subSubCount);
      
              for (let i = startNum; i <= endNum; i++) {
                  let folderName = String(i).padStart(digitsCount, '0');
                  let mainPath = targetPath ? `${targetPath}/${folderName}` : folderName;
                  let mainIndex = (i - startNum) + 1;
                  
                  let titleText = buildTitleString(namingType, mainIndex, mainIndex, 1, 1, namingCustomText);
                  
                  let mainExtExtra = extraCodeMain;
                  if (hasSub && mainAutoDigits) {
                      mainExtExtra = mainExtExtra ? mainAutoDigits + "\n" + mainExtExtra : mainAutoDigits;
                  }
                  tasks.push({ path: mainPath, title: titleText, type: folderType, extra: mainExtExtra });
      
                  if (hasSub) {
                      for (let j = subStartRange; j <= subEndRange; j++) {
                          let subFolderName = String(j).padStart(subDigitsCount, '0'); 
                          let subPath = `${mainPath}/${subFolderName}`;
                          let subTitleText = buildTitleString(subNamingType, j, mainIndex, j, 1, subNamingCustomText);
                          
                          let subExtExtra = extraCodeSub;
                          if (hasSubSub && subAutoDigits) {
                              subExtExtra = subExtExtra ? subAutoDigits + "\n" + subExtExtra : subAutoDigits;
                          }
                          tasks.push({ path: subPath, title: subTitleText, type: subFolderType, extra: subExtExtra });
      
                          if (hasSubSub) {
                              for (let k = subSubStartRange; k <= subSubEndRange; k++) {
                                  let subSubFolderName = String(k).padStart(subSubDigitsCount, '0');
                                  let subSubPath = `${subPath}/${subSubFolderName}`;
                                  let subSubTitleText = buildTitleString(subSubNamingType, k, mainIndex, j, k, "");
                                  
                                  let subSubExtExtra = extraCodeSubSub;
                                  if (subSubAutoDigits) {
                                      subSubExtExtra = subSubExtExtra ? subSubAutoDigits + "\n" + subSubExtExtra : subSubAutoDigits;
                                  }
                                  tasks.push({ path: subSubPath, title: subSubTitleText, type: subSubFolderType, extra: subSubExtExtra });
                              }
                          }
                      }
                  }
              }
      
              const totalToCreate = tasks.length;
              document.getElementById('startBtn').disabled = true;
              document.getElementById('cancelBtn').style.display = 'block';
              document.getElementById('progBox').style.display = 'block';
              document.getElementById('logBox').innerHTML = "";
      
              abortController = new AbortController();
              addLog(`מתחיל ביצירת סך הכל ${totalToCreate} שלוחות ותת-שלוחות...`, "info");
      
              let completed = 0;
      
              for (let task of tasks) {
                  if (abortController.signal.aborted) break;
      
                  let extContent = `type=${task.type}`;
                  if (task.title !== "") {
                      extContent += `\ntitle=${task.title}`;
                  }
                  if (task.extra) {
                      extContent += `\n${task.extra}`;
                  }
                  
                  try {
                      const success = await uploadExtIni(token, task.path, extContent, abortController.signal);
                      if (success) {
                          addLog(`שלוחה ${task.path}` + (task.title ? ` (כותרת: ${task.title})` : ` (ללא כותרת)`) + ` נוצרה בהצלחה`, "success");
                      } else {
                          addLog(`שגיאה ביצירת שלוחה ${task.path}`, "error");
                      }
                  } catch (err) {
                      if (err.name === 'AbortError') break;
                      addLog(`שגיאת תקשורת בשלוחה ${task.path}: ${err.message}`, "error");
                  }
      
                  completed++;
                  const pct = Math.round((completed / totalToCreate) * 100);
                  document.getElementById('progBar').style.width = pct + '%';
                  document.getElementById('progText').innerText = `${pct}% (${completed}/${totalToCreate})`;
              }
      
              if (!abortController.signal.aborted) {
                  addLog("כל הפעולות הושלמו בהצלחה!", "success");
              }
      
              document.getElementById('startBtn').disabled = false;
              document.getElementById('cancelBtn').style.display = 'none';
              abortController = null;
          }
      
          async function uploadExtIni(token, folderPath, content, signal) {
              const fd = new FormData();
              fd.append('token', token);
              fd.append('path', `ivr2:${folderPath}/ext.ini`);
              fd.append('qqfile', new Blob([content], { type: 'text/plain;charset=utf-8' }), 'ext.ini');
      
              const response = await fetch(`https://www.call2all.co.il/ym/api/UploadFile`, {
                  method: 'POST',
                  body: fd,
                  signal: signal
              });
      
              const data = await response.json();
              return data && (data.responseStatus === "OK" || data.status === "OK");
          }
      </script>
      
      </body>
      </html>
      
      תגובה 1 תגובה אחרונה תגובה ציטוט 1

      שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

      נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.

      בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

      הרשמה התחברות
      • פוסט ראשון
        פוסט אחרון