זיהוי כפילויות — מה קורה בשרת
השרת לא ממזג. הוא מזהה, מסמן, ויוצר שורה חדשה. זו התשובה ללקוח ששואל מה קורה כשאותו אדם ממלא את הטופס פעמיים.
איך נראית הבדיקה
Section titled “איך נראית הבדיקה”זהה בכל נקודות הקצה, עם חריג אחד ב‑getlead (האזהרה בסעיף 1), ורצה אחרי בדיקת דגל ה‑Config ולפני יצירת הרשומה: דגל כבוי עם טלפון קיים מחזיר … is Disabled, לא התאמה.
1 · נרמול הטלפון
Section titled “1 · נרמול הטלפון”מסירים כל תו שאינו ספרה, וקידומת בינלאומית הופכת למקומית: 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. חמשת הפורמטים הסלולריים מאותרים גם מקלט מנורמל וגם מקלט זהה לפורמט השמור.
3 · OR מול האימייל
Section titled “3 · OR מול האימייל”כל הווריאציות למעלה מחוברות ב‑OR להשוואת שוויון על Accounts.Email. טלפון חדש לגמרי עם אימייל של איש קשר קיים מחזיר את ה‑accountId הקיים.
// המבנה הלוגי של השאילתה (המחשה){ "$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 כפי שנשלחה.
כפילות לא חוסמת יצירה
Section titled “כפילות לא חוסמת יצירה”ב‑getlead — תמיד נוצרת שורה חדשה
Section titled “ב‑getlead — תמיד נוצרת שורה חדשה”| התוצאה | מה קורה |
|---|---|
| נמצאה התאמה | נוצרת שורת ליד חדשה, ומסומנת בסטטוס “ליד כפול” |
| לא נמצאה | נוצרת שורת ליד חדשה עם ה‑LeadStatusId שנשלח בבקשה, ואם לא נשלח — עם סטטוס “ליד חדש” |
אין מיזוג ואין עדכון של הליד הקיים: שתי פניות הן שני אירועים עסקיים, והסטטוס מבדיל ביניהן. מיזוג לידים כפולים הוא תהליך עסקי שבונים כטריגר או כתצוגת עבודה על סטטוס “ליד כפול”; הוא לא קורה מעצמו.
ב‑web2table — איש קשר קיים מקושר, לא משוכפל
Section titled “ב‑web2table — איש קשר קיים מקושר, לא משוכפל”| התוצאה | מה קורה ל‑Accounts |
מה קורה לטבלת היעד |
|---|---|---|
| נמצא איש קשר | לא נוצרת שורה חדשה, וגם לא מתעדכן דבר | נוצרת שורה חדשה, מקושרת אליו דרך AccountId |
| לא נמצא | נוצר איש קשר חדש עם הערכים מ‑account_* ומ‑DefaultValues.Account |
נוצרת שורה חדשה, מקושרת אליו |
IsFirst
Section titled “IsFirst”נקבע בכל שורה שנוצרת בטבלת היעד.
| מצב הבקשה | איש הקשר | 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 בכל זרימה שיוצרת אנשי קשר.
# 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 → לעדכן · יותר מאחת → כפילות קיימת, דורשת החלטה אנושית// 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 → לעדכן · יותר מאחת → כפילות קיימת, דורשת החלטה אנושית# find-before-create ב-REST — בדיקה לפני יצירה. צד שרת בלבד.import jsonimport 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// 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 → לעדכן · יותר מאחת → כפילות קיימת, דורשת החלטה אנושית- getlead · web2table
- אבחון תקלות — “איש קשר הוכפל” ו“איש קשר קיים לא התעדכן”
- מיפוי שדות — איך שולפים את
LeadStatusesובונים מפה