קטגוריות

  • כל סוגי ההגדרות הניתנות להטמעה "בהגדרות מתקדמות" במערכת שלכם

    167 נושאים
    501 פוסטים
    א
    דירוג חווית השירות לאחר שיחה עם נציג - קובץ ext.ini להפעלת הדירוג יש להגדיר בקובץ ext.ini: queue_call_rating=yes הגדרה זו היא חובה, כדי שאפשרות הדירוג תופעל. להגדרת זמן ההמתנה רצוי להקשת הדירוג (אופציונלי) יש להגדיר בקובץ ext.ini: queue_call_rating_timeout=10 ברירת מחדל 7 שניות, בדוגמה כאן המערכת תמתין 10 שניות להקשת הדירוג. במידה ואין הקשה במשך הזמן שהוגדר, המערכת תנתב את המחייג בהתאם להגדרת queue_end_continue_goto. לקביעת תדירות הדוח (אופציונלי) יש להגדיר בקובץ ext.ini: queue_call_rating_log_file_type=day בדוגמה זו, הדוח הוא יומי. ברירת מחדל, הדוח הוא כללי, כלומר החל מיום הפעלת הדירוג במערכת ועד לזמן הנוכחי. להלן פירוט ערכי תדירות דוח אפשריים: דוחות יומיים: day - דוח יומי (ברירת מחדל) day.15:23 - דוח יומי שמתחדש מדי יום בשעה 15:23 דוחות שבועיים: week - דוח שבועי (מתחדש כל יום ראשון) week.5 - דוח שבועי שמתחדש כל יום חמישי week.5.19:59 - דוח שבועי שמתחדש כל יום חמישי בשעה 19:59 דוחות חודשיים: month - דוח חודשי (מתחדש בראשון לחודש) month.25 - דוח חודשי שמתחדש ב-25 לכל חודש month.25.19:59 - דוח חודשי שמתחדש ב-25 לכל חודש בשעה 19:59 דוחות שנתיים: year - דוח שנתי (מתחדש בראשון בינואר) year.31/11 - דוח שנתי שמתחדש ב-31 בנובמבר year.31/11.19:59 - דוח שנתי שמתחדש ב-31 בנובמבר בשעה 19:59 דוחות דירוגים דוח מפורט של נתוני הדירוג נוצר אוטומטית בתוך תקיית Queue שבתוך תקיית Log (תקיית הדוחות) במערכת. שם הדו"ח: QueueCallRatingLog.ymgr. ניתן להוריד את הדו"ח, בדומה לכל דוחות המערכת כמפורט כאן. במידה והגדרתם דו"ח יומי / חודשי / שנתי, התאריך יתווסף אוטומטית בשם הדו"ח שנוצר, לדוגמה: QueueCallRatingLog[.תאריך].ymgr הערות חשובות: הדירוג מתבצע רק לאחר סיום שיחה שנענתה על ידי נציג. כל דירוג חדש מעדכן את הממוצע הכללי של הנציג. הדירוג הוא פר מערכת, כך שגם אם ישנם כמה שלוחות תור באותה מערכת, כל הנתונים ירוכזו בדו"ח כללי אחד. הודעות מערכת קשורות M4117 לקוח יקר כחלק משיפור השירות, נשמח לקבל משוב על חווית השירות. אנא דרג את רמת השירות מ 1 עד 5 כאשר 1 הוא הדירוג הנמוך ביותר ו-5 הוא הדירוג הגבוה ביותר M4118 הדירוג התקבל בהצלחה. תודה וּלהתראות
  • 5 נושאים
    5 פוסטים
    E
    הרשאת שימוש בעיוות קול.pdf
  • 7k נושאים
    54k פוסטים
    א
    שלום, אני רוצה לעשות שלוחה שבה מגיד שיעור מקליט שיעור יומי, וההקלטה נשמרת כך: שלוחה אחת – השמעת כל ההקלטות לפי סדר (מיועד למגיד השיעור / ארכיון). שלוחה שנייה – השמעת השיעור האחרון בלבד (מיועד למאזינים). השאלה האם ניתן להגדיר שההקלטה תישמר עם מספור סידורי (001, 002 וכו’) בשלוחת הארכיון, ובשלוחה השנייה תישמר תמיד ההקלטה האחרונה בלבד, או לעשות ששלוחת ההשמעה תשמיע אוטומטית את הקובץ האחרון משלוחה אחרת (דהיינו שלוחת הארכיון) הלוגיקה פחות חשובה, העיקר התוצאה. תודה
  • 10k נושאים
    84k פוסטים
    שמואלש
    @שניאור1 כן, בשימוש עם מודול sip ומספרי שלוחה. מפורט: https://f2.freeivr.co.il/post/60610
  • הודעות על מודולים והודעות על נושאים חדשים

    501 נושאים
    7k פוסטים
    א
    @עמו9 אתה רוצה שיצנתק לך ממספר מסויים למשל הטלפון שלך? אין כזו אפשרות
  • 884 נושאים
    6k פוסטים
    L
    @אA @אA כתב בהעלאת תקיות שלימות בצורה מסודרת להפליא בלי להתאמץ🥱: הקוד המעודכן: <!DOCTYPE html> <html lang="he" dir="rtl"> <head> <meta charset="UTF-8"> <title>מעלה תקיות וקבצים למערכת - עץ שלוחות</title> <style> :root { --primary: #3498db; --success: #2ecc71; --danger: #e74c3c; --bg: #f4f7f6; --dark: #2c3e50; } body { font-family: 'Segoe UI', Arial, sans-serif; margin: 0; background-color: var(--bg); color: var(--dark); text-align: right; } .wrapper { max-width: 900px; margin: 40px auto; padding: 0 20px; position: relative; } .reset-btn { position: absolute; top: -10px; left: 20px; background: var(--danger); color: white; border: none; padding: 8px 15px; border-radius: 5px; cursor: pointer; font-size: 14px; font-weight: bold; transition: all 0.3s; } .card { background: white; padding: 30px; border-radius: 15px; box-shadow: 0 10px 25px rgba(0,0,0,0.05); margin-bottom: 25px; border: 1px solid #eee; } h2 { margin-top: 0; color: var(--dark); border-bottom: 3px solid var(--primary); display: inline-block; padding-bottom: 10px; } .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px; } .input-group { display: flex; flex-direction: column; gap: 8px; } label { font-weight: bold; font-size: 14px; } input { padding: 12px; border: 2px solid #eee; border-radius: 8px; font-size: 16px; } .full-width { grid-column: 1 / -1; } .btn-main { background: var(--primary); color: white; border: none; padding: 15px; border-radius: 8px; cursor: pointer; font-size: 18px; font-weight: bold; width: 100%; transition: all 0.3s; } .btn-main:hover { background: #2980b9; } .btn-main:disabled { background: #bdc3c7; cursor: not-allowed; } .progress-wrapper { margin-top: 25px; display: none; padding: 15px; background: #fafafa; border-radius: 10px; border: 1px solid #eee; } .progress-container { width: 100%; background: #e0e0e0; height: 35px; border-radius: 20px; overflow: hidden; position: relative; border: 1px solid #ccc; } .progress-bar { height: 100%; width: 0%; background: linear-gradient(45deg, #2ecc71 25%, #27ae60 25%, #27ae60 50%, #2ecc71 50%, #2ecc71 75%, #27ae60 75%, #27ae60); background-size: 40px 40px; animation: move-stripes 2s linear infinite; transition: width 0.4s; } @keyframes move-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress-text { position: absolute; width: 100%; text-align: center; top: 0; line-height: 35px; color: #fff; font-weight: 900; text-shadow: 1px 1px 2px rgba(0,0,0,0.5); } .log-box { background: #1e1e1e; color: #d4d4d4; padding: 20px; border-radius: 10px; font-family: 'Consolas', monospace; height: 300px; overflow-y: auto; font-size: 13px; line-height: 1.6; border: 4px solid #333; } .log-info { color: #5dade2; } .log-success { color: #58d68d; font-weight: bold; } .log-error { color: #ec7063; } .log-warn { color: #f4d03f; } </style> </head> <body> <div class="wrapper"> <button class="reset-btn" onclick="location.reload()">✕ איפוס תהליך</button> <div class="card"> <h2>מעלה תקיות וקבצים למערכת - עץ שלוחות</h2> <div class="grid"> <div class="input-group"> <label>טוקן:</label> <input type="text" id="token"> </div> <div class="input-group"> <label>שלוחת יעד:</label> <input type="text" id="targetPath"> </div> <div class="input-group" style="flex-direction: row; align-items: center; gap: 5px;"> <input type="checkbox" id="autoFileNum"> <label for="autoFileNum">מספור קבצים (אוטומטי)</label> </div> <div class="input-group" style="flex-direction: row; align-items: center; gap: 5px;"> <input type="checkbox" id="autoFolderNum"> <label for="autoFolderNum">מספור שלוחות (אוטומטי)</label> </div> <div class="input-group full-width"> <label>בחירת תיקייה:</label> <input type="file" id="folderInput" webkitdirectory> </div> <button id="startBtn" class="btn-main" onclick="processUpload()">התחל העלאה</button> </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> const CHUNK_SIZE = 4 * 1024 * 1024; const MAX_SINGLE_FILE = 50 * 1024 * 1024; const sleep = ms => new Promise(res => setTimeout(res, ms)); const generateUUID = () => 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); function addLog(msg, type = "info") { const logBox = document.getElementById('logBox'); logBox.innerHTML += `<div class="log-${type}">> ${msg}</div>`; logBox.scrollTop = logBox.scrollHeight; } async function processUpload() { const token = document.getElementById('token').value.trim(); const targetPath = document.getElementById('targetPath').value.trim().replace(/\/$/, ""); const fileList = document.getElementById('folderInput').files; const autoFileNum = document.getElementById('autoFileNum').checked; const autoFolderNum = document.getElementById('autoFolderNum').checked; if (!token || !fileList.length || !targetPath) { alert("מלא פרטים"); return; } document.getElementById('startBtn').disabled = true; document.getElementById('progBox').style.display = 'block'; const folderStructure = {}; for (let file of fileList) { const parts = file.webkitRelativePath.split('/'); parts.shift(); const fileName = parts.pop(); const relPath = parts.join('/'); if (!folderStructure[relPath]) folderStructure[relPath] = []; folderStructure[relPath].push({ name: fileName, file: file }); } if (!folderStructure[""]) folderStructure[""] = []; const sortedPaths = Object.keys(folderStructure).sort((a,b) => (a===""?-1:b===""?1:a.split('/').length - b.split('/').length)); // לוגיקת מספור שלוחות const folderRenameMap = {}; if (autoFolderNum) { sortedPaths.forEach(path => { if (path === "") return; const parts = path.split('/'); const mappedParts = []; parts.forEach((part, index) => { const parentPath = parts.slice(0, index).join('/'); const siblings = sortedPaths.filter(p => p !== "" && p.split('/').length === index + 1 && p.split('/').slice(0, index).join('/') === parentPath).sort(); mappedParts.push(siblings.indexOf(parts.slice(0, index + 1).join('/')) + 1); }); folderRenameMap[path] = mappedParts.join('/'); }); } for (let i = 0; i < sortedPaths.length; i++) { const relPath = sortedPaths[i]; const finalSubPath = (autoFolderNum && relPath !== "") ? folderRenameMap[relPath] : relPath; const currentIvrPath = finalSubPath ? `${targetPath}/${finalSubPath}` : targetPath; const files = folderStructure[relPath]; // ext.ini const extFileObj = files.find(f => f.name.toLowerCase().split('.')[0] === 'ext'); let extContent = extFileObj ? await extFileObj.file.text() : (relPath === "" ? "type=menu" : "type=playfile"); await uploadFileNormal(token, `${currentIvrPath}/ext.ini`, new Blob([extContent], {type: 'text/plain'})); addLog(`שלוחה ${currentIvrPath} הוגדרה`, "success"); files.sort((a, b) => a.name.localeCompare(b.name, undefined, {numeric: true})); let audioCount = 0; for (let fObj of files) { if (fObj.name.toLowerCase().split('.')[0] === 'ext') continue; let destName = fObj.name; let blob = fObj.file; if (/\.(wav|mp3|ogg|wma)$/i.test(fObj.name)) { destName = (autoFileNum ? audioCount.toString().padStart(3, '0') : fObj.name.replace(/\.[^/.]+$/, "")) + ".wav"; audioCount++; } else if (fObj.name.toLowerCase().includes('.tts')) { destName = fObj.name.split('.')[0] + ".tts"; blob = new Blob([await fObj.file.text()], {type: 'text/plain'}); } if (blob.size > MAX_SINGLE_FILE) { await uploadFileChunked(token, currentIvrPath, destName, blob); } else { await uploadFileNormal(token, `${currentIvrPath}/${destName}`, blob); } addLog(`הועלה: ${destName}`, "info"); } const pct = Math.round(((i + 1) / sortedPaths.length) * 100); document.getElementById('progBar').style.width = pct + '%'; document.getElementById('progText').innerText = pct + '%'; } addLog("העלאה הסתיימה בהצלחה!", "success"); document.getElementById('startBtn').disabled = false; } async function uploadFileNormal(token, fullPath, blob) { const fd = new FormData(); fd.append('token', token); fd.append('path', `ivr2:${fullPath}`); fd.append('qqfile', blob, fullPath.split('/').pop()); const res = await fetch(`https://www.call2all.co.il/ym/api/UploadFile`, { method: 'POST', body: fd }); return await res.json(); } async function uploadFileChunked(token, folderPath, fileName, fileBlob) { const uuid = generateUUID(); const totalParts = Math.ceil(fileBlob.size / CHUNK_SIZE); addLog(`מפצל קובץ גדול: ${fileName}`, "warn"); for (let index = 0; index < totalParts; index++) { const start = index * CHUNK_SIZE; const end = Math.min(start + CHUNK_SIZE, fileBlob.size); const chunk = fileBlob.slice(start, end); const fd = new FormData(); fd.append('qquuid', uuid); fd.append('qqpartindex', index); fd.append('qqpartbyteoffset', start); fd.append('qqchunksize', chunk.size); fd.append('qqtotalparts', totalParts); fd.append('qqtotalfilesize', fileBlob.size); fd.append('qqfilename', fileName); fd.append('uploader', 'yemot-admin'); fd.append('qqfile', chunk, fileName); await fetch(`https://www.call2all.co.il/ym/api/UploadFile`, { method: 'POST', body: fd }); } const finalUrl = `https://www.call2all.co.il/ym/api/UploadFile?done&token=${token}&path=ivr2:${folderPath}/${fileName}&qquuid=${uuid}&qqfilename=${fileName}&qqtotalfilesize=${fileBlob.size}&qqtotalparts=${totalParts}`; const res = await fetch(finalUrl, { method: 'POST' }); return await res.json(); } </script> </body> </html> זה
  • אם אתם בטוחים ב100% שזו תקלה במערכת, ולא שזו תקלה שנובעת מפני שלא הגדרתם נכון, כיתבו כאן.

    790 נושאים
    5k פוסטים
    C
    זכור לי שהיה פעם שירות בימות המשיח לחסימת קבלת צינתוקים מכלל המערכות של ימות אבל זה בתנאי שלא מקבלים משום דבר ושום מערכת שלהם אז אולי זה קשור
  • הסברים, שאלות, הצעות, דיווחי באגים או כל דבר על הפורום שלא קשור למערכות הטלפוניות

    549 נושאים
    4k פוסטים
    א
    @שמואל-ש. נראה לך שלא שאלתי?! אבל עד עכשיו לא קיבלתי תגובה...
  • שאלות המשתמשים וארכיון הפורום