תפריט

אימות CPF ו-CNPJ: שני מספרי המיסוי הברזילאיים

אימות CPF ו-CNPJ מכסה שני מספרי מיסוי ברזילאיים — אחד לאדם ואחד לתאגיד — שכל אחד מהם נסגר בשתי ספרות ביקורת ולא באחת.

פורסם

  • אימות
  • ספרת ביקורת
  • מספר מיסוי

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

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

מהם CPF ו-CNPJ?

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

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

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

איך נבדלים שני המספרים בצורתם

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

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

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

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

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

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

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

מדוע נפסלות מחרוזות שבהן כל הספרות זהות?

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

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

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

בדיקת תבנית ומצב במרשם הם שני דברים שונים

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

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

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

למפתחים: ניקוי, מיסוך והודעות שגיאה

קומץ הרגלים שומרים על זוג הסכמות הזה מצרות.

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

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

צעדים הבאים

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

המשך קריאה

מדריכים בנושא כלי אימות למספרי כרטיסים ולמספרי זהות