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