דלגו לתוכן

או התחילו מנקודה בטוחה: אינדקס הכלים המלא · מפת הטבלאות המרכזיות

מערכת חדשה — 14 יום חינם

זיהוי כפילויות — מה קורה בשרת

עודכן 10.10.2026

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

זהה בכל נקודות הקצה, עם חריג אחד ב‑getlead (האזהרה בסעיף 1), ורצה אחרי בדיקת דגל ה‑Config ולפני יצירת הרשומה: דגל כבוי עם טלפון קיים מחזיר … is Disabled, לא התאמה.

מסירים כל תו שאינו ספרה, וקידומת בינלאומית הופכת למקומית: 972… ל‑0….

מה הגולש הקליד הצורה המנורמלת
050-123-4567 0501234567
+972 50 1234567 0501234567
972501234567 0501234567

שלושת הפורמטים, וגם "050 200 0001" עם רווחים, מאתרים את אותו איש קשר.

2 · סריקה של חמישה פורמטים שמורים

Section titled “2 · סריקה של חמישה פורמטים שמורים”

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

Accounts.PhoneNumber ∈ {
0501234567 ← 05XXXXXXXX
972501234567 ← 9725XXXXXXX
+972501234567 ← +9725XXXXXXX
050-1234567 ← 05X-XXXXXXX
+972-50-1234567 ← +972-5X-XXXXXXX
}

אותו דבר לקידומות קווי נייח (02…, 03…, 04…, 08…, 09…): 039990001, 97239990001, +97239990001, 03-9990001 ו‑+972-3-9990001 כולם מאותרים מקלט 039990001. חמשת הפורמטים הסלולריים מאותרים גם מקלט מנורמל וגם מקלט זהה לפורמט השמור.

כל הווריאציות למעלה מחוברות ב‑OR להשוואת שוויון על Accounts.Email. טלפון חדש לגמרי עם אימייל של איש קשר קיים מחזיר את ה‑accountId הקיים.

JSON
// המבנה הלוגי של השאילתה (המחשה)
{ "$or": [
{ "PhoneNumber": "0501234567" },
{ "PhoneNumber": "+972501234567" },
{ "PhoneNumber": "050-1234567" },
{ "Email": "israel@example.co.il" }
] }

4 · ב‑web2table — שלושה מפתחות נוספים

Section titled “4 · ב‑web2table — שלושה מפתחות נוספים”
המפתח בבקשה מול איזה שדה הערה
phone PhoneNumber מפתח חובה
phone2 טלפון משני מזין את החיפוש, אבל אינו נשמר — אין שדה טלפון משני בתבנית vanilla
email Email
email2 אימייל משני מזין את החיפוש, אבל אינו נשמר — אין שדה אימייל משני בתבנית vanilla
idnum CompanyId ח.פ. / ת.ז. — התאמה מדויקת, בלי נרמול

כל אחד מחמשת המפתחות, לבדו, מאתר איש קשר קיים. ב‑idnum אין נרמול: "123-456-780" לא מתאים ל‑"123456780", והמחרוזת נשמרת ב‑CompanyId כפי שנשלחה.

ב‑getlead — תמיד נוצרת שורה חדשה

Section titled “ב‑getlead — תמיד נוצרת שורה חדשה”
התוצאה מה קורה
נמצאה התאמה נוצרת שורת ליד חדשה, ומסומנת בסטטוס “ליד כפול”
לא נמצאה נוצרת שורת ליד חדשה עם ה‑LeadStatusId שנשלח בבקשה, ואם לא נשלח — עם סטטוס “ליד חדש”

אין מיזוג ואין עדכון של הליד הקיים: שתי פניות הן שני אירועים עסקיים, והסטטוס מבדיל ביניהן. מיזוג לידים כפולים הוא תהליך עסקי שבונים כטריגר או כתצוגת עבודה על סטטוס “ליד כפול”; הוא לא קורה מעצמו.

ב‑web2table — איש קשר קיים מקושר, לא משוכפל

Section titled “ב‑web2table — איש קשר קיים מקושר, לא משוכפל”
התוצאה מה קורה ל‑Accounts מה קורה לטבלת היעד
נמצא איש קשר לא נוצרת שורה חדשה, וגם לא מתעדכן דבר נוצרת שורה חדשה, מקושרת אליו דרך AccountId
לא נמצא נוצר איש קשר חדש עם הערכים מ‑account_* ומ‑DefaultValues.Account נוצרת שורה חדשה, מקושרת אליו

נקבע בכל שורה שנוצרת בטבלת היעד.

מצב הבקשה איש הקשר IsFirst
כל בקשה חדש true
נשלח isExistsAccountCheck: true קיים false
לא נשלח isExistsAccountCheck קיים true ← לא נכון עסקית

אותו דגל משפיע על ה‑Name שהשרת ממלא כשלא נשלח Name:

המצב ערך Name שנקבע
Name נשלח בבקשה הערך שנשלח
איש קשר חדש "פניה ראשונה"
איש קשר קיים + isExistsAccountCheck "פניה חוזרת"

הפלטפורמה לא אוכפת ייחודיות

Section titled “הפלטפורמה לא אוכפת ייחודיות”

אין אילוץ ייחודיות על PhoneNumber או על Email בטבלת Accounts. שתי רשומות עם אותו טלפון ואותו אימייל ייווצרו זו אחר זו, שתיהן ב‑201.

  • בטפסים: זיהוי הכפילויות של getlead / web2table מחליף את האילוץ החסר, וזו סיבה להשתמש בהם ולא לכתוב יצירה ישירה.
  • ב‑REST API: האחריות עליכם, find‑before‑create בכל זרימה שיוצרת אנשי קשר.
Bash
# find-before-create ב-REST — בדיקה לפני יצירה. צד שרת בלבד.
curl -sS -G "https://api.mbapps.co.il/parse/classes/Accounts" \
-H "X-Parse-Application-Id: $APP_ID" -H "X-Parse-Master-Key: $MASTER_KEY" \
--data-urlencode 'where={"PhoneNumber":"0501234567"}' \
--data-urlencode 'limit=5'
# 0 תוצאות → ליצור · 1 → לעדכן · יותר מאחת → כפילות קיימת, דורשת החלטה אנושית
JavaScript
// find-before-create ב-REST — בדיקה לפני יצירה. צד שרת בלבד.
const params = new URLSearchParams({
where: JSON.stringify({ PhoneNumber: '0501234567' }),
limit: '5',
});
const res = await fetch(`https://api.mbapps.co.il/parse/classes/Accounts?${params}`, {
headers: {
'X-Parse-Application-Id': APP_ID,
'X-Parse-Master-Key': MASTER_KEY,
},
});
// 0 תוצאות → ליצור · 1 → לעדכן · יותר מאחת → כפילות קיימת, דורשת החלטה אנושית
Python
# find-before-create ב-REST — בדיקה לפני יצירה. צד שרת בלבד.
import json
import requests
res = requests.get(
"https://api.mbapps.co.il/parse/classes/Accounts",
headers={
"X-Parse-Application-Id": APP_ID,
"X-Parse-Master-Key": MASTER_KEY,
},
params={"where": json.dumps({"PhoneNumber": "0501234567"}), "limit": 5},
)
# 0 תוצאות → ליצור · 1 → לעדכן · יותר מאחת → כפילות קיימת, דורשת החלטה אנושית
PHP
<?php
// find-before-create ב-REST — בדיקה לפני יצירה. צד שרת בלבד.
$query = http_build_query([
"where" => json_encode(["PhoneNumber" => "0501234567"]),
"limit" => 5,
]);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.mbapps.co.il/parse/classes/Accounts?{$query}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Parse-Application-Id: {$APP_ID}",
"X-Parse-Master-Key: {$MASTER_KEY}",
],
]);
$response = curl_exec($ch);
curl_close($ch);
// 0 תוצאות → ליצור · 1 → לעדכן · יותר מאחת → כפילות קיימת, דורשת החלטה אנושית