Files
apskel-pos-backend/internal/util/phone.go
T

42 lines
1.3 KiB
Go
Raw Normal View History

package util
import (
"errors"
"regexp"
"strings"
)
// ErrInvalidPhoneNumber means a phone number is not an Indonesian mobile number.
var ErrInvalidPhoneNumber = errors.New("invalid phone number format")
// customerPhonePattern is an Indonesian mobile number in its stored form: 62, then the
// number without its leading 0 (628…, 10 to 14 digits in all).
var customerPhonePattern = regexp.MustCompile(`^628\d{7,11}$`)
// NormalizePhoneNumber turns a customer's phone number into the one form it is stored
// and looked up in, 62…: "0812-3456-1234", "+62 812 3456 1234", "62812…" and "812…"
// all become "6281234561234". Spaces, dashes, dots and parentheses are dropped.
func NormalizePhoneNumber(raw string) (string, error) {
digits := strings.Map(func(r rune) rune {
switch r {
case ' ', '-', '.', '(', ')':
return -1
}
return r
}, strings.TrimSpace(raw))
digits = strings.TrimPrefix(digits, "+")
switch {
case strings.HasPrefix(digits, "620"):
// +62 typed in front of a number that kept its 0.
digits = "62" + digits[3:]
case strings.HasPrefix(digits, "0"):
digits = "62" + digits[1:]
case strings.HasPrefix(digits, "8"):
digits = "62" + digits
}
if !customerPhonePattern.MatchString(digits) {
return "", ErrInvalidPhoneNumber
}
return digits, nil
}