15815213711
2024-08-26 67b8b6731811983447e053d4396b3708c14dfe3c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import parsePhoneNumber from '../parsePhoneNumber.js'
 
/**
 * Matches a phone number object against a phone number string.
 * @param  {string} phoneNumberString
 * @param  {PhoneNumber} phoneNumber
 * @param  {object} metadata — Metadata JSON
 * @return {'INVALID_NUMBER'|'NO_MATCH'|'SHORT_NSN_MATCH'|'NSN_MATCH'|'EXACT_MATCH'}
 */
export default function matchPhoneNumberStringAgainstPhoneNumber(phoneNumberString, phoneNumber, metadata) {
    // Parse `phoneNumberString`.
    let phoneNumberStringContainsCallingCode = true
    let parsedPhoneNumber = parsePhoneNumber(phoneNumberString, metadata)
    if (!parsedPhoneNumber) {
        // If `phoneNumberString` didn't contain a country calling code
        // then substitute it with the `phoneNumber`'s country calling code.
        phoneNumberStringContainsCallingCode = false
        parsedPhoneNumber = parsePhoneNumber(phoneNumberString, { defaultCallingCode: phoneNumber.countryCallingCode }, metadata)
    }
    if (!parsedPhoneNumber) {
        return 'INVALID_NUMBER'
    }
 
    // Check that the extensions match.
    if (phoneNumber.ext) {
        if (parsedPhoneNumber.ext !== phoneNumber.ext) {
            return 'NO_MATCH'
        }
    } else {
        if (parsedPhoneNumber.ext) {
            return 'NO_MATCH'
        }
    }
 
    // Check that country calling codes match.
    if (phoneNumberStringContainsCallingCode) {
        if (phoneNumber.countryCallingCode !== parsedPhoneNumber.countryCallingCode) {
            return 'NO_MATCH'
        }
    }
 
    // Check if the whole numbers match.
    if (phoneNumber.number === parsedPhoneNumber.number) {
        if (phoneNumberStringContainsCallingCode) {
            return 'EXACT_MATCH'
        } else {
            return 'NSN_MATCH'
        }
    }
 
    // Check if one national number is a "suffix" of the other.
    if (
        phoneNumber.nationalNumber.indexOf(parsedPhoneNumber.nationalNumber) === 0 ||
        parsedPhoneNumber.nationalNumber.indexOf(phoneNumber.nationalNumber) === 0
    ) {
        // "A SHORT_NSN_MATCH occurs if there is a difference because of the
        //  presence or absence of an 'Italian leading zero', the presence or
        //  absence of an extension, or one NSN being a shorter variant of the
        //  other."
        return 'SHORT_NSN_MATCH'
    }
 
    return 'NO_MATCH'
}