• דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private
    • הרשמה
    • התחברות
    1. דף הבית
    2. BEN ZION
    B
    מנותק
    • פרופיל
    • עוקב אחרי 1
    • עוקבים 4
    • נושאים 108
    • פוסטים 1,276
    • קבוצות 0

    BEN ZION

    @BEN ZION

    250
    מוניטין
    157
    צפיות בפרופיל
    1.3k
    פוסטים
    4
    עוקבים
    1
    עוקב אחרי
    תאריך הצטרפות
    נראה לאחרונה
    מיקום נוף הגליל

    BEN ZION הפסקת מעקב מעקב

    הפוסטים הטובים ביותר שנוצרו על ידי BEN ZION

    • מזמור לתודה

      אני לא יודע אם זה מעשה שהיה או מעשה שיכול היה להיות

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

      ולענייננו:
      לפעמים יהודי טורח במיוחד בשבילך.
      מחפש מידע, בודק, מסדר, מנסח, וכותב לך הכול בצורה ברורה, מסודרת ומובנת – רק כדי לעזור באמת.

      וכל מה שהוא רוצה לדעת בסוף, זה דבר אחד פשוט:
      האם זה באמת עזר לך? האם היה שווה את ההשקעה?

      נכון, יש מערכת של 👍 ו-👎,
      אבל זה בדרך כלל מבטא את ההתרשמות הכללית מהרגע – מהרעיון, מהניסוח, או מהכיוון.
      זה עדיין לא תמיד אומר אם באמת נעזרת, אם הסתדרת, ואם זה פתר לך את הבעיה.

      אז אם נעזרת, אם הסתדרת, אם זה קידם אותך –
      תכתוב מילה.
      תעדכן.

      פורסם בעל הפורום
      B
      BEN ZION
    • RE: קריסה

      @אדם אתה מבין שאתה לא יכול לתת אמון במערכת שפתאום מתחילים לקרות כל מיני קריסות מוזרות ואין לך יכולת לגבות את המערכת
      ומי יודע מה יהיה עוד חודש?

      פורסם בבאגים במערכת
      B
      BEN ZION
    • RE: מהפך במנוע הצינתוקים

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: קריסה

      @אדם מה היה קורה אם הטלפון האישי שלך היה מפסיק לעבוד או שאתה מנהל שירות לקוחות של מאות אנשים ופתאום אין מענה ואין לך איך להבהיר להם מה הבעיה ובהתחשב בזה שלפני לא זוכר כמה זמן גם קרה משהו כזה זה מוגזם!!

      פורסם בבאגים במערכת
      B
      BEN ZION
    • RE: מהפך במנוע הצינתוקים

      @אבו

      @אבו כתב במהפך במנוע הצינתוקים:

      אף אחד לא חייב לנו כלום

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: איטיות בכלל הקו/קווים? 📠 וניתוקים ☎ ואי אפשר להתקשר????! ❎😒☹

      @lavitoren-הטי-ל

      @lavitoren-הטי-ל כתב באיטיות בכלל הקו/קווים? 📠 וניתוקים ☎ ואי אפשר להתקשר????! ❎😒☹:

      כי מי אני שאתלונן על דבר שקבלנוהו חינם על מגש של זהב טהור 🧇

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

      פורסם בבאגים במערכת
      B
      BEN ZION
    • RE: תגובות | פיתוח פרטי | 🎙📲 מודול הקלטה וניתוב חכם Pro – הגרסה המשודרגת!

      @lavitoren-הטי-ל כתב בתגובות | פיתוח פרטי | 🎙📲 מודול הקלטה וניתוב חכם Pro – הגרסה המשודרגת!:

      ,אין מילים תודה תודה תודה (על בניית המודול ועוד בחינם על המאמץ ועל ההשקעה שיצא מושלם..)
      @lavitoren-הטי-ל אני לא חושב שזה מכבד אותך ולא את הפורום מה שכתבת בספוילר אין לאף אחד עניין לפרוץ לך לקו אם היה ניק חדש מעלה קוד לא הייתי רץ להשתמש בו, אבל עדיין מפה ועד לכתוב שאתה עושה בדיקת אמינות? אתה לא רוצה על תשתמש נתקלת במישהו שמפרסם קודים ואחרי זה משתמש תכתוב פה להזהיר אחרים אבל אם אתה פרנואיד זה לא מתיר לך לחשוד בכשרים ובטח לא לכתוב את זה על במה כזו אתה יכול לשלוח לו מייל באישי שיסביר לך בכל אופן מדובר במשתמשים אם
      הרבה מוניטין והרבה פוסטים שמחפשים לעזור לאנשים חוץ מזה שאני מניח שרוב חברי הפורום הם יהודים שומרי תורה ומצוות

      אולי כדאי שתמחק את מה שכתבת

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: למה אין נתונים לקווים? 🤔

      @קו-המוסיקה @אa @565906
      מצורף קוד HTML בסיסי ניתן לשדרג עוד
      אין לי במערכת לוג האזנה אז אני לא יודע איך עובד נראה טוב
      יש לו באג שאין לי כוח כרגע לתקן שבציון דקות שהם מעל רף של דקות נתין לבחור כמה דקות הוא מציין בשיחות מתחת לרף כל מעבר בשלוחה שלא התעכבו בה את הרף
      עוד לא מצאתי איך לחשב לפי שיחה אולי בהמשך אני אשדרג

      <!DOCTYPE html>
      <html lang="he" dir="rtl">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>מערכת סיכום דקות מתקדמת - ימות המשיח</title>
        <style>
          body { font-family: Arial, sans-serif; background: #f0f2f5; margin: 0; padding: 20px; color: #333; }
          .container { max-width: 1200px; margin: auto; background: #fff; padding: 25px; border-radius: 15px; box-shadow: 0 8px 30px rgba(0,0,0,0.1); }
          h1 { margin-top: 0; color: #1a4388; text-align: center; border-bottom: 2px solid #eee; padding-bottom: 15px; }
          
          .setup-panel { background: #f8fafc; padding: 20px; border-radius: 12px; border: 1px solid #e2e8f0; margin-bottom: 20px; display: flex; flex-wrap: wrap; gap: 15px; align-items: flex-end; }
          .input-group { display: flex; flex-direction: column; gap: 5px; }
          label { font-weight: bold; font-size: 14px; }
          input, select { padding: 10px; border: 1px solid #cbd5e1; border-radius: 8px; font-size: 14px; }
          
          button { border: none; background: #1a4388; color: #fff; padding: 10px 20px; border-radius: 8px; cursor: pointer; font-weight: bold; transition: background 0.2s; }
          button:hover { background: #133266; }
          button.secondary { background: #10b981; }
          button.secondary:hover { background: #059669; }
      
          .summary-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 15px; margin-bottom: 20px; }
          .card { background: #fff; padding: 15px; border-radius: 10px; border: 1px solid #e2e8f0; box-shadow: 0 2px 4px rgba(0,0,0,0.02); text-align: center; }
          .card .val { font-size: 22px; font-weight: bold; color: #1a4388; display: block; margin-bottom: 5px; }
          .card .lbl { font-size: 13px; color: #64748b; font-weight: bold; }
      
          .tabs { display: flex; gap: 10px; margin-bottom: 15px; border-bottom: 2px solid #e2e8f0; padding-bottom: 10px; display: none; }
          .tab-btn { background: #e2e8f0; color: #333; padding: 10px 15px; border-radius: 8px; cursor: pointer; font-weight: bold; border: none; }
          .tab-btn.active { background: #1a4388; color: #fff; }
          
          .tab-content { display: none; }
          .tab-content.active { display: block; }
      
          .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
          @media (max-width: 768px) { .grid-2 { grid-template-columns: 1fr; } }
      
          .table-container { overflow-x: auto; max-height: 400px; border: 1px solid #e2e8f0; border-radius: 10px; margin-bottom: 20px; background: #fff;}
          table { width: 100%; border-collapse: collapse; text-align: right; }
          th { position: sticky; top: 0; background: #1a4388; color: white; padding: 10px; font-size: 14px; }
          td { padding: 10px; border-bottom: 1px solid #f1f5f9; font-size: 14px; }
          tr:hover { background: #f8fafc; }
      
          .error { color: #991b1b; background: #fef2f2; padding: 12px; border-radius: 8px; border: 1px solid #fee2e2; margin: 10px 0; }
          .success { color: #065f46; background: #ecfdf5; padding: 12px; border-radius: 8px; border: 1px solid #d1fae5; margin: 10px 0; }
          .warning { color: #854d0e; background: #fefce8; padding: 12px; border-radius: 8px; border: 1px solid #fef08a; margin: 10px 0; }
          
          h3 { color: #1a4388; margin-bottom: 10px; border-bottom: 1px solid #e2e8f0; padding-bottom: 5px; }
        </style>
      </head>
      <body>
        
      <div class="container">
        <h1>ניהול נתוני שיחות מתקדם - ימות המשיח</h1>
        
        <div class="setup-panel">
          <div class="input-group">
            <label>טוקן API:</label>
            <input type="password" id="token" placeholder="הכנס טוקן..." />
          </div>
          <div class="input-group">
            <label>שנה:</label>
            <input type="number" id="year" value="2026" style="width: 80px;" />
          </div>
          <div class="input-group">
            <label>חודש:</label>
            <select id="month">
              <option value="01">01</option><option value="02">02</option>
              <option value="03">03</option><option value="04" selected>04</option>
              <option value="05">05</option><option value="06">06</option>
              <option value="07">07</option><option value="08">08</option>
              <option value="09">09</option><option value="10">10</option>
              <option value="11">11</option><option value="12">12</option>
            </select>
          </div>
          <div class="input-group">
            <label>רף דקות להגדרת שיחה (מעל/מתחת):</label>
            <input type="number" id="minLimit" value="15" style="width: 100px;" />
          </div>
          <button onclick="fetchData()">משוך נתונים</button>
        </div>
        
        <div id="statusMessage"></div>
        
        <div id="summaryCards" class="summary-cards" style="display:none;">
          <div class="card"><span class="val" id="totalCalls">0</span><span class="lbl">סה"כ כניסות למערכת</span></div>
          <div class="card"><span class="val" id="totalListeners">0</span><span class="lbl">מאזינים יוניקיים</span></div>
          <div class="card"><span class="val" id="avgListenerTime">0:00</span><span class="lbl">ממוצע למאזין</span></div>
          <div class="card"><span class="val" id="callsOverLimit">0</span><span class="lbl">שיחות מעל הרף</span></div>
          <div class="card"><span class="val" id="callsUnderLimit">0</span><span class="lbl">שיחות מתחת לרף</span></div>
        </div>
      
        <div class="tabs" id="tabsMenu">
          <button class="tab-btn active" onclick="switchTab('tab-extensions')">נתוני שלוחות</button>
          <button class="tab-btn" onclick="switchTab('tab-files')">נתוני קבצים והאזנות</button>
          <button class="tab-btn" onclick="switchTab('tab-daily')">סטטיסטיקה יומית ושעות</button>
        </div>
      
        <div id="tab-extensions" class="tab-content active">
          <div class="grid-2">
            <div>
              <h3>השלוחות המובילות בזמן האזנה (טופ 10)</h3>
              <div class="table-container">
                <table>
                  <thead><tr><th>מקום</th><th>שלוחה</th><th>שם</th><th>זמן כולל</th></tr></thead>
                  <tbody id="topTimeExtensions"></tbody>
                </table>
              </div>
            </div>
            <div>
              <h3>השלוחות עם הכי הרבה כניסות</h3>
              <div class="table-container">
                <table>
                  <thead><tr><th>מקום</th><th>שלוחה</th><th>שם</th><th>כמות כניסות</th></tr></thead>
                  <tbody id="topCallsExtensions"></tbody>
                </table>
              </div>
            </div>
          </div>
        </div>
      
        <div id="tab-files" class="tab-content">
          <div class="grid-2">
            <div>
              <h3>הקבצים המושמעים ביותר</h3>
              <div class="table-container">
                <table>
                  <thead><tr><th>שלוחה</th><th>קובץ</th><th>כמות השמעות</th><th>זמן השמעה מצטבר</th></tr></thead>
                  <tbody id="topFiles"></tbody>
                </table>
              </div>
            </div>
            <div>
              <h3>קבצים עם הכי הרבה עזיבות (האזנה חלקית)</h3>
              <div class="table-container">
                <table>
                  <thead><tr><th>שלוחה</th><th>קובץ</th><th>מספר עזיבות באמצע</th></tr></thead>
                  <tbody id="dropoffFiles"></tbody>
                </table>
              </div>
            </div>
          </div>
        </div>
      
        <div id="tab-daily" class="tab-content">
          <div class="grid-2">
            <div>
              <h3>מאזינים לפי ימים</h3>
              <div class="table-container">
                <table>
                  <thead><tr><th>תאריך</th><th>סה"כ כניסות</th><th>מאזינים יוניקיים</th></tr></thead>
                  <tbody id="dailyStats"></tbody>
                </table>
              </div>
            </div>
            <div>
              <h3>השעות הפעילות ביותר (לפי כניסות)</h3>
              <div class="table-container">
                <table>
                  <thead><tr><th>שעה</th><th>כמות כניסות</th></tr></thead>
                  <tbody id="hourlyStats"></tbody>
                </table>
              </div>
            </div>
          </div>
        </div>
      
      </div>
        
      <script>
        function showMsg(text, type) {
          const el = document.getElementById("statusMessage");
          el.innerHTML = `<div class="${type}">${text}</div>`;
        }
      
        function switchTab(tabId) {
          document.querySelectorAll('.tab-content').forEach(el => el.classList.remove('active'));
          document.querySelectorAll('.tab-btn').forEach(el => el.classList.remove('active'));
          document.getElementById(tabId).classList.add('active');
          event.currentTarget.classList.add('active');
        }
      
        function formatHMS(s) {
          if (isNaN(s) || s < 0) return "0:00";
          const h = Math.floor(s / 3600);
          const m = Math.floor((s % 3600) / 60);
          const sec = Math.floor(s % 60);
          return h > 0 ? `${h}:${String(m).padStart(2,'0')}:${String(sec).padStart(2,'0')}` : `${m}:${String(sec).padStart(2,'0')}`;
        }
      
        async function fetchData() {
          const token = document.getElementById("token").value;
          const year = document.getElementById("year").value;
          const month = document.getElementById("month").value;
          
          if (!token) { showMsg("אנא הזן טוקן תקני", "error"); return; }
          
          const pathEnterExit = `ivr2:Log/LogFolderEnterExit-${year}-${month}.ymgr`;
          const pathPlayback = `ivr2:Log/LogPlaybackPlayStop/LogPlaybackPlayStop.${year}-${month}.ymgr`;
      
          const urlEnterExit = `https://private.call2all.co.il/ym/api/RenderYMGRFile?token=${token}&wath=${pathEnterExit}&convertType=json&notLoadLang=1`;
          const urlPlayback = `https://private.call2all.co.il/ym/api/RenderYMGRFile?token=${token}&wath=${pathPlayback}&convertType=json&notLoadLang=1`;
      
          showMsg("מתחבר לשרת ימות המשיח, מושך נתונים...", "success");
      
          try {
            const [resEnterExit, resPlayback] = await Promise.all([
              fetch(urlEnterExit).then(r => r.json()).catch(() => ({ responseStatus: "ERROR" })),
              fetch(urlPlayback).then(r => r.json()).catch(() => ({ responseStatus: "ERROR" }))
            ]);
      
            if (resEnterExit.responseStatus !== "OK" && resPlayback.responseStatus !== "OK") {
              showMsg("שגיאה מהשרת: לא נמצאו קבצי לוג לחודש זה.", "error");
              return;
            }
      
            let warning = "";
            if (resEnterExit.responseStatus !== "OK") warning += " לא נמצא לוג כניסות (EnterExit).";
            if (resPlayback.responseStatus !== "OK") warning += " לא נמצא לוג השמעות קבצים (PlaybackPlayStop).";
            if (warning) showMsg("הערה: " + warning, "warning");
            else showMsg("הנתונים נמשכו ועובדו בהצלחה!", "success");
      
            processData(resEnterExit.data || [], resPlayback.data || []);
            
          } catch (err) {
            showMsg("שגיאת תקשורת עם השרת.", "error");
          }
        }
      
        function processData(folderData, playbackData) {
          const limitMinutes = parseFloat(document.getElementById("minLimit").value) || 15;
          const limitSeconds = limitMinutes * 60;
      
          // ----- עיבוד נתוני כניסה/יציאה (FolderEnterExit) -----
          const extensions = {};
          const daily = {};
          const hourly = {};
          const phones = {};
          
          let gCalls = 0;
          let gSeconds = 0;
          let callsOverLimit = 0;
          let callsUnderLimit = 0;
      
          folderData.forEach(row => {
            const ext = row["Folder"];
            const seconds = parseFloat(row["TimeTotal"]) || 0;
            const title = row["PathTitle"] || row["ValName"] || "";
            const phone = row["Phone"];
            const date = row["EnterDate"];
            const time = row["EnterTime"];
      
            if (!ext) return;
      
            // שלוחות
            if (!extensions[ext]) extensions[ext] = { ext, title, calls: 0, seconds: 0 };
            extensions[ext].calls++;
            extensions[ext].seconds += seconds;
      
            // מאזינים (Phone)
            if (phone) {
              if (!phones[phone]) phones[phone] = { count: 0, totalSeconds: 0 };
              phones[phone].count++;
              phones[phone].totalSeconds += seconds;
            }
      
            // חתך זמן (רף)
            if (seconds >= limitSeconds) callsOverLimit++;
            else callsUnderLimit++;
      
            // נתונים יומיים
            if (date) {
              if (!daily[date]) daily[date] = { calls: 0, uniquePhones: new Set() };
              daily[date].calls++;
              if (phone) daily[date].uniquePhones.add(phone);
            }
      
            // שעות פעילות
            if (time) {
              const hour = time.split(":")[0];
              if (!hourly[hour]) hourly[hour] = 0;
              hourly[hour]++;
            }
      
            gCalls++;
            gSeconds += seconds;
          });
      
          // ----- עיבוד נתוני קבצים (PlaybackPlayStop) -----
          const files = {};
          
          playbackData.forEach(row => {
            const ext = row["Folder"] || "";
            const fileName = row["FileName"] || row["ValName"] || "";
            const playSeconds = parseFloat(row["TimeTotal"] || row["PlayTotalTime"]) || 0;
            const fileKey = ext + "/" + fileName;
      
            if (!fileName) return;
      
            if (!files[fileKey]) files[fileKey] = { ext, fileName, plays: 0, totalSeconds: 0, dropoffs: 0 };
            
            files[fileKey].plays++;
            files[fileKey].totalSeconds += playSeconds;
      
            // חישוב עזיבות אמצע: נניח שעזיבה היא אם הושמע פחות מ-80% מהקובץ או אם סטאטוס/סיבה היא לא רגילה
            // מכיוון שהמפתחות משתנים, הדרך הפשוטה לזהות "נטישה" מהירה היא שיחה שנותקה פחות מ-15 שניות לסיום (אם יש אורך) או חיתוך.
            // נשתמש בהגיון בסיסי: אם המאזין שמע פחות מ-10 שניות או פחות מהאורך (במידה וקיים).
            const fileLength = parseFloat(row["FileLength"]);
            if (fileLength && playSeconds < fileLength - 5) {
               files[fileKey].dropoffs++;
            } else if (!fileLength && playSeconds < 30) {
               // גיבוי למקרה שאין אורך קובץ מדויק
               files[fileKey].dropoffs++;
            }
          });
      
          renderUI(extensions, daily, hourly, phones, files, gCalls, callsOverLimit, callsUnderLimit);
        }
      
        function renderUI(extensions, daily, hourly, phones, files, gCalls, callsOverLimit, callsUnderLimit) {
          document.getElementById("summaryCards").style.display = "grid";
          document.getElementById("tabsMenu").style.display = "flex";
      
          const uniqueListenersCount = Object.keys(phones).length;
          let avgTime = 0;
          if (uniqueListenersCount > 0) {
            const totalSystemTime = Object.values(phones).reduce((sum, p) => sum + p.totalSeconds, 0);
            avgTime = totalSystemTime / uniqueListenersCount;
          }
      
          // כרטיסיות למעלה
          document.getElementById("totalCalls").innerText = gCalls;
          document.getElementById("totalListeners").innerText = uniqueListenersCount;
          document.getElementById("avgListenerTime").innerText = formatHMS(avgTime);
          document.getElementById("callsOverLimit").innerText = callsOverLimit;
          document.getElementById("callsUnderLimit").innerText = callsUnderLimit;
      
          const extArr = Object.values(extensions);
          const filesArr = Object.values(files);
      
          // 1. שלוחות טופ זמן
          const topTimeExt = [...extArr].sort((a, b) => b.seconds - a.seconds).slice(0, 10);
          document.getElementById("topTimeExtensions").innerHTML = topTimeExt.map((e, i) => 
            `<tr><td>${i+1}</td><td><strong>${e.ext}</strong></td><td>${e.title}</td><td>${formatHMS(e.seconds)}</td></tr>`
          ).join("");
      
          // 2. שלוחות טופ כניסות
          const topCallsExt = [...extArr].sort((a, b) => b.calls - a.calls);
          document.getElementById("topCallsExtensions").innerHTML = topCallsExt.map((e, i) => 
            `<tr><td>${i+1}</td><td><strong>${e.ext}</strong></td><td>${e.title}</td><td>${e.calls}</td></tr>`
          ).join("");
      
          // 3. קבצים מושמעים ביותר
          const topFiles = [...filesArr].sort((a, b) => b.plays - a.plays).slice(0, 30); // מציג עד 30
          document.getElementById("topFiles").innerHTML = topFiles.map(f => 
            `<tr><td>${f.ext}</td><td>${f.fileName}</td><td>${f.plays}</td><td>${formatHMS(f.totalSeconds)}</td></tr>`
          ).join("");
      
          // 4. עזיבות באמצע
          const dropoffFiles = [...filesArr].sort((a, b) => b.dropoffs - a.dropoffs).filter(f => f.dropoffs > 0).slice(0, 20);
          document.getElementById("dropoffFiles").innerHTML = dropoffFiles.map(f => 
            `<tr><td>${f.ext}</td><td>${f.fileName}</td><td style="color:red; font-weight:bold;">${f.dropoffs}</td></tr>`
          ).join("");
      
          // 5. יומי
          const dailyHtml = Object.keys(daily).sort().map(date => 
            `<tr><td>${date}</td><td>${daily[date].calls}</td><td>${daily[date].uniquePhones.size}</td></tr>`
          ).join("");
          document.getElementById("dailyStats").innerHTML = dailyHtml;
      
          // 6. שעות
          const hourlyHtml = Object.keys(hourly).sort((a, b) => hourly[b] - hourly[a]).map(hour => 
            `<tr><td>${hour}:00</td><td>${hourly[hour]}</td></tr>`
          ).join("");
          document.getElementById("hourlyStats").innerHTML = hourlyHtml;
        }
      </script>
        
      </body>
      </html>
      כמובן שכל אחד יכול לשדרג אם בינה
      
      פורסם בבקשות לפיתוח
      B
      BEN ZION
    • RE: הגדרת תנאי משתמש

      @לומד-עס תודה רבה

      פורסם בשאלות ועזרה הדדית
      B
      BEN ZION
    • RE: מייל פון

      @יוני2 אין צורך להגיב לנושא מלפני 4 שנים

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION

    פוסטים אחרונים שנוצרו על ידי BEN ZION

    • RE: סליקת אשראי לפי קטגוריות

      @הרשל תתייג אותי שאתה גומר לבנות

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: סליקת אשראי לפי קטגוריות

      @הרשל אוקי לא משנה העיקר שיהיה לך את מבנה השלוחות איך שאתה רוצה אותם מוכנות ככה יהיה אפשר לכתוב קוד שיחליף ערכים

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: מספרים אישיים

      @יעקב-1 אני עשיתי בפלאפון ובהוט מובייל אני אמור לשלם דמי מנוי חודשיים אחרי שאני מנייד אני משלם לפי אחוז השתמשות זה כמה שקלים בודדים

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: סליקת אשראי לפי קטגוריות

      @הרשל כיום יש שלוחות פעילות לבר מצווה ? כדי לדעת באיזה מבנה להכניס את הנתונים אני צריך לדעת איך זה היום

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: מספרים אישיים

      @יעקב-1 אני חושב שבשביל כזאת כמות אתה צריך לדבר אם סוכן או משהו כזה
      בכל אופן אני הולך לחנות סלולר פותח מספר חדש בחברה שלא לוקחת דמי חיבור ולא עלות סים ומנייד

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: סליקת אשראי לפי קטגוריות

      @הרשל שבוע טוב אני יכול להכין לך ממשק HTML אני צריך לדעת את מבנה הקו בשביל זה אם אתה מעוניין תעדכן

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: ניהול ואצאפון ישן

      @אברהם-בן-שמעון-0 תבקש משריות לקוחות להמיר לך למערכת IVR תשלח מייל מספר מערכת וסיסמה

      פורסם בשאלות ועזרה הדדית
      B
      BEN ZION
    • RE: מספרים אישיים

      @קו-המוסיקה מה הרווח שלך לקנות דרך ימות המשיח ?

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: מספרים אישיים

      @קו-המוסיקה מה זה אומר מספרי אישיים?
      אתה יכול לרכוש סימים בחברות שלא לוקחים דמי חיבור לנייד ויהיה לך מספרים בכמה שקלים והם גם לא נחסמים בדרך כלל

      פורסם בעזרה הדדית למשתמשים מתקדמים
      B
      BEN ZION
    • RE: עדיין לא נרשמת לקבלת צינטוקים

      @מיכאל-ראובן-כהן כתב בעדיין לא נרשמת לקבלת צינטוקים:

      הגדרתי ולא אומר כלום

      העלת קבצי שמע ? אם השמות המודברים ?

      @שואל-שאלה כתב בעדיין לא נרשמת לקבלת צינטוקים:

      קראתם את המדריך?

      כבוד הרב יישר כוח על המדריך אבל מי שלא מבין בשלוחות עדיף לתת לו הגדרות מובנות של ימות בלי צורך לפתוח עוד שלוחות

      פורסם בשאלות ועזרה הדדית
      B
      BEN ZION