• הרשמה
    • התחברות
    • חיפוש
    • דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • קבלת התראות מהדפדפן
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private
    1. דף הבית
    2. זאביק
    3. פוסטים
    ז
    • פרופיל
    • עוקב אחרי 0
    • עוקבים 0
    • נושאים 23
    • פוסטים 153
    • הגבוה ביותר 64
    • שנוי במחלוקת 0
    • קבוצות 0

    הודעות שפורסמו על ידי זאביק

    • RE: דחוף!!! מאזינים נחסמים מרשי"ת אוטומאטי!! ⛔🚫

      @עידו @פלוס

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

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ז
      זאביק
    • תגובה לקבצי HTML לשימוש במערכות ימות המשיח

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ז
      זאביק
    • RE: קמפיין עם שאלון ומי שענה לא יקבל שוב למחרת קמפיין, עד שיענה כן

      @חכמון
      בס"ד ישנן 2 פיתרונות לזה,

      1. בשירות לקוחות יש אפשרות לבקש להגדיר קמפיין פתוח "מיוחד", כך שבעת המענה לקמפיין, הלקוח יכנס לשלוחה A , ואילו כאשר הלקוח יחזור בשיחה חוזרת לקמפיין, הוא יכנס לשלוחה B
        (יתכן שלא כל נציגי השרות של "ימות" מכירים את האפשרות הזו, - אבל הבכירים שבהם מהתמיכה הטכנית מכירים את זה ומבצעים זאת, - מנסיון אישי).

      2. ניתן להשתמש דרך API במנוע קמפיין שמתחיל כך:
        http://call2all.co.il/ym/api/CallExtensionBridging

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

      כמובן שניתן להכניס את כל הלינק של הAPI לתוך שלוחת API בתוך המערכת, ואכמ"ל בזה.

      ורק יש לשים לב, ששיטת התימחור ביחידות של 2 סוגי הקמפיינים שהוזכרו, (קמפיין רגיל / והקמפיין המיוחד הנ"ל) הינו שונה לגמרי, - ותבדוק מה הכי מתאים לך,

      ועוד שים לב, שבמנוע קמפיין המיוחד הנ"ל, אין אפשרות של חיוג חוזר באין מענה!!!
      ובשביל להתגבר על החיסרון הזה, צריך להשתמש ולבנות בזה קומבינות מורכבות (וכך אני עושה בפועל), אך איני יכול כעת להאריך בזה.

      בהצלחה!!

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ז
      זאביק
    • RE: קמפיין עם שאלון ומי שענה לא יקבל שוב למחרת קמפיין, עד שיענה כן

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ז
      זאביק
    • RE: קמפיין עם שאלון ומי שענה לא יקבל שוב למחרת קמפיין, עד שיענה כן

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ז
      זאביק
    • RE: דחוף!!! מאזינים נחסמים מרשי"ת אוטומאטי!! ⛔🚫

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

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

      בהצלחה

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ז
      זאביק
    • RE: קמפיין עם שאלון ומי שענה לא יקבל שוב למחרת קמפיין, עד שיענה כן

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

      והדרך שאני משתמש איתה היא כך:

      1. תכניס את הנמענים ל-2 רשי"ת שונות, (לצורך הדוגמא A ו B)
      2. תגדיר בקמפיין, שהוא יהיה קמפיין פתוח (כמובן עם טיימר להגבלת משך השיחה, בכדי שלא ישרפו לך כל היחידות...), והקמפיין ישלח לכל הנמענים שברשי"ת A, והנמענים יכנסו במענה לשיחה לשלוחה של השאלון הרצוי, והמקש שהם מקישים בשביל לאשר, בעצם מכניס אותם לשלוחת הסרה שקטה מרשי"ת A ,
      3. בכל שבוע תפעיל לינק (אפשרי באופן אוטומטי) שמעתיק ברגע אחד את כל הרשומים ברשי"ת B לרשי"ת A - אפשרי לעשות זאת ע"י קוד PHP לניהול רשי"ת, שהובא כאן בפורום בעבר.
      4. תכין לינק שיפעיל לך את הקמפיין הנצרך, - ותעשה תזמון של הפעלה אוטומטית ללינק בשני ימים בשבוע למשל בשעה הנצרכת,

      בהצלחה

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ז
      זאביק
    • RE: דחוף!!! מאזינים נחסמים מרשי"ת אוטומאטי!! ⛔🚫

      @פלוס זה נראה שאתה מדבר על משהו קריטי ודחוף מאוד,

      אז יש לי רעיון בינתיים לעזרה ראשונה,

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

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ז
      זאביק
    • RE: שגיאה ברכישת יחידות דרך אתר ניהול

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

      פורסם בבאגים במערכת
      ז
      זאביק
    • RE: ממשק לצפייה בדוחות

      @איל-משולש
      וכמובן, אם כבר הוא מטפל בקוד, יהיה תועלת גדולה הרבה יותר, אם יוכלו לבחור גם את החצי הראשון של השם של הקובץ, כיון שיש דוחות שבכלל לא מתחילים ב ApprovalAll אלא ב point וכדומה.
      תודה רבה!

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

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

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

      אפשר לבצע זאת ב-2 דרכים:
      אפשרות אחת שיוכלו לטעון אוטומטית את הקבצים שמתחילים ב ApprovalAll
      ותהיה חלונית למילוי בחלון הראשי, שבה יוסיפו את הסיומת הפרטית של השבוע הרצוי, (זאת אומרת שיוכלו להשלים את חצי הנתיב האחרון, בחלונית שבחלון הראשי),
      אפשרות שנייה שהקוד יטען תמיד אוטומטית את 3 הקבצים האחרונים שמתחילים ב ApprovalAll (לפי תאריך שינוי הקובץ).

      תודה רבה! זה באמת יכול מאוד מאוד להועיל, - לי, ולשאר המשתמשים הנצרכים לזה!

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

      @איל-משולש @עידו

      1. מישהו בדק האם הקובץ הנ"ל בטוח? והטוקנים שמכניסים לא נשמרים בשרת של מאן דהו?

      2. בדוחות שמתחדשים כל שבוע, ניתן ג"כ להשתמש בממשק הזה?? או שהוא נעול על קובץ ApprovalAll.ymgr בלבד, בלי אפשרות של תוספות בסיומת, (כיון שאם מופעלת הגדרה של דוח חדש כל שבוע למשל, אז יש סיומת בקובץ הנ"ל של מס' השבוע והשנה הלועזית).

      אשמח לכל מידע בעניין כי זה יכול לסייע לי מאוד.

      תודה רבה!!

      פורסם בטיפים עצות והדגמות מהמשתמשים
      ז
      זאביק
    • RE: פוסט מסודר לנותני שירות בניית מערכות בתשלום

      שיווק מערכות טלפוניות מתקדמות של תיווך, עם שאילתות וסינונים מתקדמים,

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

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

      ליצירת קשר:

      A0548518660@GMAIL.COM

      פורסם בשאלות ועזרה הדדית
      ז
      זאביק
    • RE: ⚠️ עדכון בנוגע לתקלה במערכת הקבצים, ומתן אפשרות לשליחת קמפיינים ללא עלות במהלך השבוע הקרוב.

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

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

      פורסם בחדש במערכת
      ז
      זאביק
    • RE: ⚠️ עדכון בנוגע לתקלה במערכת הקבצים, ומתן אפשרות לשליחת קמפיינים ללא עלות במהלך השבוע הקרוב.

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

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

      לתועלת המשתמשים מצורף כאן קוד PHP להוספה מהירה של נקודות,
      וכך זה נראה:
      7965433f-8071-49dc-a536-776968ba1825-תמונה.png

      לתשומת לב:

      1. הקוד נבנה לצורך משתמשים שמזוהים (לגבי צבירת הנקודות) ע"י מספר סידורי,

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

      1. בפוקציית "בדיקת נקודות" חובה למלא שדה מזהה.

      2. בפונקצייית "איפוס כל המזהים" חובה למלא לפחות שדה מזהה 1, ואז הקוד מפעיל איפוס על כל המזהים הקיימים.

      3. אפשר כמובן גם להוריד נקודות למשתמש ע"י מינוס (לדוגמא: -100)

      4. חשוב מאוד!! יש לשים לב, שכאשר המשתמש מוסיף לעצמו נקודות דרך הטלפון, אזי הקובץ points_total.ini אינו מתעדכן באתר באופן מיידי בשינויים שנעשו ע"י הטלפון, אלא זה אורך לפעמים 5 דקות ולפעמים שעה (ואולי גם יותר), - ולכן חשוב לדעת שאם תבצעו הוספת נקודות דרך הדפדפן, השינויים יחולו רק לפי הנתונים שבקובץ points_total.ini שנמצא באותו רגע באתר, וכאמור לפעמים הוא לא מעודכן.

      כמדומה שאפשר לבדוק האם הקובץ כבר התעדכן בשינויים שנעשו ע"י הטלפון או עדיין לא, ע"י בדיקה האם הקובץ ini הנ"ל חדש יותר מהקובץ: points_total.ymgr שאז זה אומר שה ini כבר מעודכן - אבל אינני לוקח אחריות בעניין

      1. יש לשים לב, שהקוד עובד רק על "משתמשים" (כלומר מזהי ID) שכבר צברו נקודות לפחות פעם אחת, - כי מי שעדיין לא צבר נקודות כלל, אזי המזהה שלו לא מופיע כלל בקובץ points_total.ini , והקוד ג"כ לא יוכל לעבוד עליו.

      שימו לב - אפשר גם לעשות שלוחה מובנית מראש שתוסיף נקודות למשתמשים מרובים ע"פ בחירה, דוגמא בספויילר.

      type=api
      api_link=http://164.XXXXXXXX/hosafat_nekudot.php
      api_hangup_send=no
      
      
      
      title=לינק להוספת נקודות 
      
      api_end_goto=/ 
      
      טוקן
      api_add_0=token=07777777:123456
       
      נתיב
      api_add_1=filePath=ivr2:/Points/Split/points_total.ini
       
      
      מזון ונקיון 
      api_add_2=updates[id][0]=1
       
      סכום
      api_add_3=updates[points][0]=-764
      
      
      ביגוד 
      api_add_4=updates[id][1]=2
       
      סכום
      api_add_5=updates[points][1]=-188
      
      כלי בית, תחזוקה, צעצועים ושונות 
      api_add_6=updates[id][2]=3
       
      סכום
      api_add_7=updates[points][2]=-133
      
      שונות 
      api_add_8=updates[id][3]=4
       
      סכום
      api_add_9=updates[points][3]=-22
      
      
      
      

      להלן הקוד:

      <?php
      // --- הגדרת משתנים להודעות --- //
      $success = '';
      $error = '';
      
      // --- פונקציות API --- //
      
      function downloadFile($token, $filePath) {
          $apiUrl = 'https://www.call2all.co.il/ym/api/GetTextFile';
          $ch = curl_init($apiUrl);
          $postData = http_build_query([
              'token' => $token,
              'what'  => $filePath,
          ]);
      
          curl_setopt_array($ch, [
              CURLOPT_RETURNTRANSFER => true,
              CURLOPT_POST           => true,
              CURLOPT_POSTFIELDS     => $postData,
          ]);
      
          $response = curl_exec($ch);
          curl_close($ch);
      
          // ננסה לפרש את התשובה כ-JSON
          $data = json_decode($response, true);
      
          if (is_array($data) && isset($data['responseStatus'])) {
              if ($data['responseStatus'] !== 'OK') {
                  return [
                      'status'  => 'error',
                      'message' => 'שגיאה בהורדת הקובץ: ' . ($data['message'] ?? 'לא ידוע'),
                  ];
              }
      
              // כאן התוכן האמיתי של הקובץ (השורות digits-1-...)
              $contents = $data['contents'] ?? '';
      
              return [
                  'status'  => 'ok',
                  'content' => $contents,
              ];
          }
      
          // אם זו לא תשובת JSON – נחזיר כטקסט גולמי
          return [
              'status'  => 'ok',
              'content' => $response,
          ];
      }
      
      function uploadFile($token, $filePath, $content) {
          $apiUrl = 'https://www.call2all.co.il/ym/api/UploadTextFile';
          $ch = curl_init($apiUrl);
      
          $postData = http_build_query([
              'token'    => $token,
              'what'     => $filePath,
              'contents' => $content, // רק הטקסט של הקובץ
          ]);
      
          curl_setopt_array($ch, [
              CURLOPT_RETURNTRANSFER => true,
              CURLOPT_POST           => true,
              CURLOPT_POSTFIELDS     => $postData,
          ]);
      
          $response = curl_exec($ch);
          curl_close($ch);
      
          $data = json_decode($response, true);
          if (is_array($data) && isset($data['responseStatus']) && $data['responseStatus'] === 'OK') {
              return ['status' => 'ok'];
          }
      
          $msg = is_array($data) && isset($data['message']) ? $data['message'] : 'תגובה לא תקינה מהשרת';
          return ['status' => 'error', 'message' => 'שגיאה בהעלאת הקובץ: ' . $msg];
      }
      
      // --- לוגיקה ראשית --- //
      if ($_SERVER['REQUEST_METHOD'] === 'POST' || !empty($_GET)) {
          do {
              $source = $_SERVER['REQUEST_METHOD'] === 'POST' ? $_POST : $_GET;
      
              // פעולה: בדיקה / עדכון / איפוס נבחרים / איפוס הכל
              $action = $source['action'] ?? 'update';
      
              // פרמטרים
              $token    = trim($source['token'] ?? '');
              $filePath = trim($source['filePath'] ?? '');
              $updates  = $source['updates'] ?? null;
      
              if (empty($token) || empty($filePath)) {
                  $error = 'יש למלא TOKEN ונתיב קובץ.';
                  break;
              }
      
              // באקשנים שקשורים ל-IDים (update / reset_selected) אנחנו צריכים לפחות מזהה אחד
              if (in_array($action, ['update', 'reset_selected'], true)) {
                  if (empty($updates) || !is_array($updates['id'])) {
                      $error = 'יש להזין לפחות מזהה אחד.';
                      break;
                  }
              }
      
              $updateIds    = isset($updates['id']) ? $updates['id'] : [];
              $updatePoints = isset($updates['points']) ? $updates['points'] : [];
      
              // ולידציה בסיסית למזהים – רק כשיש IDs
              if (!empty($updateIds)) {
                  foreach ($updateIds as $id) {
                      $id = trim($id);
                      if ($id === '' || !is_numeric($id)) {
                          $error = 'נמצאו מזהים לא חוקיים. אנא בדוק את כל שדות ה-ID.';
                          break 2;
                      }
                  }
              }
      
              // לוגיקת עדכון
              $updatesToProcess = [];
              if ($action === 'update') {
                  if (!is_array($updatePoints) || count($updateIds) !== count($updatePoints)) {
                      $error = 'שגיאה פנימית: מספר המזהים אינו תואם למספר ערכי הנקודות.';
                      break;
                  }
      
                  foreach ($updateIds as $index => $id) {
                      $points = $updatePoints[$index] ?? '';
                      $id     = trim($id);
                      $points = trim($points);
      
                      if ($points === '' || !is_numeric($points)) {
                          $error = 'נמצאו ערכי נקודות לא חוקיים. אנא בדוק את כל השדות.';
                          break 2;
                      }
      
                      $updatesToProcess[$id] = ($updatesToProcess[$id] ?? 0) + (float)$points;
                  }
      
                  if (empty($updatesToProcess)) {
                      $error = 'לא נמצאו עדכונים חוקיים לעיבוד.';
                      break;
                  }
              }
      
              // 2. הורדת הקובץ
              $downloadResult = downloadFile($token, $filePath);
              if ($downloadResult['status'] === 'error') {
                  $error = $downloadResult['message'];
                  break;
              }
              $fileContent = $downloadResult['content'];
      
              $lines           = preg_split('/\r\n|\n|\r/', $fileContent);
              $newContentArray = [];
              $updatedIds      = [];
      
              // 3. מצבים שונים לפי action
              if ($action === 'reset_all') {
                  // איפוס כל המזהים לקובץ
                  foreach ($lines as $line) {
                      if (preg_match('/^(digits-\d+-points_total=)([-.0-9]+)$/', $line, $m)) {
                          $prefix = $m[1];
                          $newContentArray[] = $prefix . '0';
                      } else {
                          $newContentArray[] = $line;
                      }
                  }
      
                  $newContent   = implode("\n", $newContentArray);
                  $uploadResult = uploadFile($token, $filePath, $newContent);
                  if ($uploadResult['status'] === 'error') {
                      $error = $uploadResult['message'];
                      break;
                  }
      
                  $success = 'כל המזהים אופסו לנקודות 0.';
                  break;
              }
      
              if ($action === 'reset_selected') {
                  // איפוס רק למזהים שנבחרו
                  $idsToReset = array_map('trim', $updateIds);
                  $idsToReset = array_values(array_filter($idsToReset, 'strlen'));
                  $resetFound = [];
      
                  foreach ($lines as $line) {
                      if (preg_match('/^digits-(\d+)-points_total=([-.0-9]+)$/', $line, $m)) {
                          $currentId = $m[1];
                          $prefix    = "digits-{$currentId}-points_total=";
      
                          if (in_array($currentId, $idsToReset, true)) {
                              $newContentArray[] = $prefix . '0';
                              $resetFound[]      = $currentId;
                          } else {
                              $newContentArray[] = $line;
                          }
                      } else {
                          $newContentArray[] = $line;
                      }
                  }
      
                  $newContent   = implode("\n", $newContentArray);
                  $uploadResult = uploadFile($token, $filePath, $newContent);
                  if ($uploadResult['status'] === 'error') {
                      $error = $uploadResult['message'];
                      break;
                  }
      
                  if (!empty($resetFound)) {
                      $success = 'המזהים הבאים אופסו לנקודות 0: ' . implode(', ', $resetFound) . '.';
                  } else {
                      $error = 'אף אחד מהמזהים שבחרת לא נמצא בקובץ.';
                  }
                  break;
              }
      
              if ($action === 'check') {
                  // בדיקה בלבד – לא משנים את הקובץ
                  $statusMessages = [];
      
                  // אם לא הוזן אף מזהה – מציגים את כל המזהים מהקובץ
                  $hasAnyId = false;
                  foreach ($updateIds as $rawId) {
                      if (trim($rawId) !== '') {
                          $hasAnyId = true;
                          break;
                      }
                  }
      
                  if (!$hasAnyId) {
                      // כל המזהים
                      foreach ($lines as $line) {
                          if (preg_match('/^digits-(\d+)-points_total=([-.0-9]+)$/', $line, $m)) {
                              $id     = $m[1];
                              $points = $m[2];
                              $statusMessages[] = "מזהה {$id}: נקודות נוכחיות = {$points}";
                          }
                      }
      
                      if (!empty($statusMessages)) {
                          $success = implode(' | ', $statusMessages);
                      } else {
                          $error = 'לא נמצאו מזהים בקובץ.';
                      }
      
                      break;
                  }
      
                  // יש מזהים מסוימים – מציגים רק אותם
                  foreach ($updateIds as $id) {
                      $id     = trim($id);
                      if ($id === '') {
                          continue;
                      }
                      $found  = false;
                      $points = null;
      
                      foreach ($lines as $line) {
                          if (preg_match('/^digits-(' . preg_quote($id, '/') . ')-points_total=([-.0-9]+)$/', $line, $m)) {
                              $found  = true;
                              $points = $m[2];
                              break;
                          }
                      }
      
                      if ($found) {
                          $statusMessages[] = "מזהה {$id}: נקודות נוכחיות = {$points}";
                      } else {
                          $statusMessages[] = "מזהה {$id}: לא נמצא בקובץ.";
                      }
                  }
      
                  if (!empty($statusMessages)) {
                      $success = implode(' | ', $statusMessages);
                  } else {
                      $error = 'לא נמצאו מזהים חוקיים או תואמים בקובץ.';
                  }
      
                  break;
              }
      
              // action === 'update' – עדכון נקודות רגיל
              foreach ($lines as $line) {
                  if (preg_match('/^digits-(\d+)-points_total=/', $line, $matches)) {
                      $currentId = $matches[1];
      
                      if (isset($updatesToProcess[$currentId])) {
                          $pointsToAdd = $updatesToProcess[$currentId];
      
                          if (preg_match('/^(digits-\d+-points_total=)([-.0-9]+)$/', $line, $valueMatches)) {
                              $prefix       = $valueMatches[1];
                              $currentValue = $valueMatches[2];
                              $newValue     = (float)$currentValue + (float)$pointsToAdd;
                              $newContentArray[] = $prefix . $newValue;
                              $updatedIds[]      = $currentId;
                              unset($updatesToProcess[$currentId]);
                          } else {
                              $newContentArray[] = $line;
                          }
                          continue;
                      }
                  }
                  $newContentArray[] = $line;
              }
      
              $newContent   = implode("\n", $newContentArray);
              $uploadResult = uploadFile($token, $filePath, $newContent);
              if ($uploadResult['status'] === 'error') {
                  $error = $uploadResult['message'];
                  break;
              }
      
              $successMessage = '';
              if (!empty($updatedIds)) {
                  $successMessage = 'הקובץ עודכן. מזהים שעודכנו: ' . implode(', ', $updatedIds) . '.';
              }
      
              $errorMessage = '';
              if (!empty($updatesToProcess)) {
                  $notFoundIds  = array_keys($updatesToProcess);
                  $errorMessage = 'המזהים הבאים לא נמצאו בקובץ או שהפורמט שלהם שגוי: ' . implode(', ', $notFoundIds) . '.';
              }
      
              if (!empty($successMessage) && !empty($errorMessage)) {
                  $success = $successMessage . ' ' . $errorMessage;
              } elseif (!empty($successMessage)) {
                  $success = $successMessage;
              } else {
                  $error = $errorMessage ?: 'לא בוצעו עדכונים. ייתכן שהמזהים שהוזנו לא קיימים בקובץ.';
              }
      
          } while (false);
      }
      ?>
      <!DOCTYPE html>
      <html lang="he">
      <head>
          <meta charset="UTF-8">
          <title>ניהול נקודות בקובץ - ימות המשיח</title>
          <style>
              body { font-family: Arial, sans-serif; direction: rtl; padding: 20px; max-width: 700px; margin: auto; background-color: #f4f4f4; }
              h2 { text-align: center; color: #333; }
              form { background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
              label { display: block; margin-top: 15px; font-weight: bold; color: #555; }
              input[type="text"], input[type="number"] { width: 100%; padding: 10px; margin-top: 5px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; }
              button[type="submit"], button[type="button"] { padding: 10px 15px; font-size: 14px; border: none; border-radius: 4px; cursor: pointer; }
              .submit-row { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
              .btn-check { background-color: #6c757d; color: #fff; flex: 1; }
              .btn-check:hover { background-color: #5a6268; }
              .btn-update { background-color: #007bff; color: #fff; flex: 1; }
              .btn-update:hover { background-color: #0056b3; }
              .btn-reset-selected { background-color: #ffc107; color: #212529; flex: 1; }
              .btn-reset-selected:hover { background-color: #e0a800; }
              .btn-reset-all { background-color: #dc3545; color: #fff; flex: 1; }
              .btn-reset-all:hover { background-color: #c82333; }
              .msg { margin-top: 20px; padding: 15px; border-radius: 4px; font-weight: bold; text-align: center; }
              .error { background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; }
              .success { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; }
              .update-pair { display: flex; gap: 10px; margin-bottom: 10px; align-items: center; }
              .update-pair input { flex: 1; }
              #add-update-field { width: auto; padding: 8px 15px; font-size: 14px; background-color: #28a745; margin-top: 10px; border: none; border-radius: 4px; color: white; cursor: pointer; }
              #add-update-field:hover { background-color: #218838; }
              .remove-field { background-color: #dc3545; color: white; border: none; border-radius: 50%; width: 24px; height: 24px; cursor: pointer; font-weight: bold; line-height: 24px; text-align: center; padding: 0; }
              .remove-field:hover { background-color: #c82333; }
              small.hint { color: #777; display: block; margin-top: 4px; }
          </style>
          <script>
              document.addEventListener('DOMContentLoaded', function() {
                  const container = document.getElementById('update-fields-container');
      
                  function addField() {
                      const newPair = document.createElement('div');
                      newPair.className = 'update-pair';
                      newPair.innerHTML = `
                          <input type="number" name="updates[id][]" placeholder="מזהה ID">
                          <input type="number" name="updates[points][]" step="any" placeholder="נקודות (לעדכון בלבד)">
                          <button type="button" class="remove-field">X</button>
                      `;
                      container.appendChild(newPair);
                  }
      
                  document.getElementById('add-update-field').addEventListener('click', addField);
      
                  container.addEventListener('click', function(e) {
                      if (e.target && e.target.classList.contains('remove-field')) {
                          if (container.children.length > 1) {
                              e.target.closest('.update-pair').remove();
                          }
                      }
                  });
      
                  function setRequiredForIdPoints(required) {
                      const idInputs = container.querySelectorAll('input[name="updates[id][]"]');
                      const pointInputs = container.querySelectorAll('input[name="updates[points][]"]');
                      idInputs.forEach(inp => inp.required = required);
                      pointInputs.forEach(inp => inp.required = required);
                  }
      
                  const btnCheck         = document.querySelector('button[name="action"][value="check"]');
                  const btnUpdate        = document.querySelector('button[name="action"][value="update"]');
                  const btnResetSelected = document.querySelector('button[name="action"][value="reset_selected"]');
                  const btnResetAll      = document.querySelector('button[name="action"][value="reset_all"]');
      
                  if (btnCheck) {
                      btnCheck.addEventListener('click', function() {
                          // בדיקה בלבד – לא נדרש למלא מזהים
                          setRequiredForIdPoints(false);
                      });
                  }
      
                  if (btnUpdate) {
                      btnUpdate.addEventListener('click', function() {
                          setRequiredForIdPoints(true);
                      });
                  }
      
                  if (btnResetSelected) {
                      btnResetSelected.addEventListener('click', function() {
                          setRequiredForIdPoints(true);
                      });
                  }
      
                  if (btnResetAll) {
                      btnResetAll.addEventListener('click', function() {
                          setRequiredForIdPoints(false);
                      });
                  }
              });
          </script>
      </head>
      <body>
          <h2>עדכון / בדיקה / איפוס נקודות בימות המשיח</h2>
          <form method="post">
              <label for="token">TOKEN:</label>
              <input type="text" id="token" name="token" required>
      
              <label for="filePath">נתיב קובץ מלא (למשל, ivr2:/Points/Split/points_total.ini):</label>
              <input type="text" id="filePath" name="filePath" required>
      
              <label>מזהים (לבדיקה, עדכון או איפוס נבחרים):</label>
              <small class="hint">באיפוס כללי (איפוס כל המזהים) או בבדיקת כל המזהים אין חובה למלא מזהים.</small>
              <div id="update-fields-container">
                  <div class="update-pair">
                      <input type="number" name="updates[id][]" placeholder="מזהה ID">
                      <input type="number" name="updates[points][]" step="any" placeholder="נקודות (לעדכון בלבד)">
                  </div>
              </div>
              <button type="button" id="add-update-field">הוסף שדה מזהה/נקודות</button>
      
              <div class="submit-row">
                  <button type="submit" name="action" value="check" class="btn-check">בדוק מצב נקודות</button>
                  <button type="submit" name="action" value="update" class="btn-update">בצע עדכון נקודות</button>
                  <button type="submit" name="action" value="reset_selected" class="btn-reset-selected">איפוס מזהים נבחרים</button>
                  <button type="submit" name="action" value="reset_all" class="btn-reset-all" onclick="return confirm('למחוק את כל הנקודות לכל המזהים? פעולה זו בלתי הפיכה.');">איפוס כל המזהים</button>
              </div>
          </form>
      
          <?php if (!empty($error)): ?>
              <div class="msg error"> <?= htmlspecialchars($error) ?> </div>
          <?php elseif (!empty($success)): ?>
              <div class="msg success"> <?= htmlspecialchars($success) ?> </div>
          <?php endif; ?>
      </body>
      </html>
      

      בהצלחה!

      פורסם בטיפים עצות והדגמות מהמשתמשים
      ז
      זאביק
    • RE: איטיות בחיבור לקוו אחרי הקריסה האחרונה

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

      פורסם בשאלות ועזרה הדדית
      ז
      זאביק
    • RE: הגיבוי לא דורס תיקיות קיימות כרגע....

      @הבוס-הגדול אצלי ג"כ הרוב חזר, (כלומר תתי שלוחות חזרו), אבל השלוחות הראשיות לא חזרו!!!

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

      יש מידע למאן דהו מה יש לעשות בעניין?

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ז
      זאביק
    • RE: כל התוכן נמחק

      @אביי-ורבא כעת אני רואה שחידשתם גם את האפשרות לתוכנית המוזלת יותר, - יפה מאוד!! (כמדומני שבעבר זה לא היה זמין)

      פורסם בעזרה הדדית למשתמשים מתקדמים
      ז
      זאביק
    • RE: כל התוכן נמחק

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

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