Skip to content

Commit

Permalink
Fix merge conflicts
Browse files Browse the repository at this point in the history
  • Loading branch information
flavioltonon committed Apr 5, 2019
2 parents debc0d4 + 34f96af commit 5b154df
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 66 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Go Brazil is a library for evaluation of brazilian documents and other patterns.

## Usage

In general, the lib usage involve the generation and evaluation of brazilian documents and other patterns, such as the brazilian date format.
In general, the lib usage involves the generation and evaluation of brazilian document numbers and other brazilian patterns, such as the date format and mobile numbers.
Here are the documents/patterns which have been contemplated so far:

- **CPF (Cadastro de Pessoa Física)**
Expand Down
2 changes: 1 addition & 1 deletion errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ var (
errIncorrectLenghtCPFNumber = errors.New("CPF numbers must contain 11 numbers")
errInvalidCPFNumber = errors.New("CPF number input is not valid")

errIncorrectLenghtTituloEleitoralNumber = errors.New("CPF numbers must contain 12 or 14 numbers")
errIncorrectLenghtTituloEleitoralNumber = errors.New("Título de eleitor numbers must contain 12 numbers")
errInvalidTituloEleitoralNumber = errors.New("Título de eleitor number input is not valid")

errIncorrectLenghtPISNumber = errors.New("PIS numbers must contain 11 or 13 numbers")
Expand Down
6 changes: 6 additions & 0 deletions example/example.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ func main() {
mobile, err := brazil.ParseMobile(mobileFullNumber)
if err != nil {
log.Println(err)
log.Println(mobileFullNumber)
return
}

Expand All @@ -40,6 +41,7 @@ func main() {
cpf, err := brazil.ParseCPF(cpfNumber)
if err != nil {
log.Println(err)
log.Println(cpfNumber)
return
}

Expand All @@ -55,6 +57,7 @@ func main() {
pis, err := brazil.ParsePIS(pisNumber)
if err != nil {
log.Println(err)
log.Println(pisNumber)
return
}

Expand All @@ -70,6 +73,7 @@ func main() {
titulo, err := brazil.ParseTituloEleitoral(tituloEleitoralNumber)
if err != nil {
log.Println(err)
log.Println(tituloEleitoralNumber)
return
}

Expand All @@ -85,6 +89,7 @@ func main() {
sus, err := brazil.ParseSUS(susNumber)
if err != nil {
log.Println(err)
log.Println(susNumber)
return
}

Expand All @@ -104,6 +109,7 @@ func main() {
date, err := brazil.ParseDate(newDate)
if err != nil {
log.Println(err)
log.Println(newDate)
return
}

Expand Down
97 changes: 48 additions & 49 deletions sus.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,6 @@ func ParseSUS(number string) (sus, error) {

sNumber = susNumber(number)

if sNumber.isFalsePositive() {
return sus{}, errInvalidSusNumber
}

if !sNumber.isValid() {
return sus{}, errInvalidSusNumber
}
Expand All @@ -47,69 +43,72 @@ func ParseSUS(number string) (sus, error) {
func RandomSUSNumber(mask bool) string {
var (
source = rand.NewSource(time.Now().UnixNano())
possibleFirstNumbers = []int{1, 2, 7, 8, 9}
possibleFirstNumbers = []string{"1", "2", "7", "8", "9"}
susNumber string
numbers string
sum int
)

r := rand.New(source)

firstNumber := possibleFirstNumbers[r.Int31n(4)]
firstNumberString := strconv.Itoa(firstNumber)
if firstNumber == 1 || firstNumber == 2 {
numbers = strconv.FormatInt(r.Int63n(8999999999)+1000000000, 10) + "00"
} else {
numbers = strconv.FormatInt(r.Int63n(899999999999)+100000000000, 10)
}

sum := firstNumber * 15
for i := 0; i < 12; i++ {
number, _ := strconv.Atoi(string(numbers[i]))
sum += number * (14 - i)
}
remainder := sum % 11

penultimate := 0
ultimate := remainder

if remainder%11 > 0 {
penultimate = 0
ultimate = 11 - remainder
if (11 - remainder) == 10 {
penultimate = 1
ultimate = 11 - (sum+2*penultimate)%11
if (sum+2*penultimate)%11 == 0 {
ultimate = 0
}
switch firstNumber {
case "1", "2":
numbers = firstNumber + strconv.FormatInt(r.Int63n(8999999999)+1000000000, 10)
for i := 0; i < 11; i++ {
susDigit, _ := strconv.Atoi(string(numbers[i]))
sum += susDigit * (15 - i)
}
if sum%11 == 1 {
susNumber = numbers + "001" + strconv.Itoa(11-(sum+2)%11)
} else {
susNumber = numbers + "000" + strconv.Itoa((11-sum%11)%11)
}
case "7", "8", "9":
numbers = firstNumber + strconv.FormatInt(r.Int63n(899999999999)+100000000000, 10)
for i := 0; i < 13; i++ {
susDigit, _ := strconv.Atoi(string(numbers[i]))
sum += susDigit * (15 - i)
}
if sum%11 == 1 {
susNumber = numbers + "1" + strconv.Itoa(11-(sum+2)%11)
} else {
susNumber = numbers + "0" + strconv.Itoa((11-sum%11)%11)
}
}

pString := strconv.Itoa(penultimate)
uString := strconv.Itoa(ultimate)

sString := firstNumberString + numbers + pString + uString
if mask {
return sString[:3] + " " + sString[3:7] + " " + sString[7:11] + " " + sString[11:]
return susNumber[:3] + " " + susNumber[3:7] + " " + susNumber[7:11] + " " + susNumber[11:]
}
return sString
return susNumber
}

type susNumber string

func (s susNumber) isFalsePositive() bool {
var regex = regexp.MustCompile(`(^[1-2]\d{10}00[0-1]\d{1}$)|(^[7-9]\d{14}$)`)
if regex.MatchString(string(s)) {
return false
}
return true
}

func (s susNumber) isValid() bool {
var sum int

for i := 0; i < 15; i++ {
susDigit, _ := strconv.Atoi(string(s[i]))
sum += susDigit * (15 - i)
if !regexp.MustCompile(`(^[1-2]\d{10}00[0-1]\d{1}$)|(^[7-9]\d{14}$)`).MatchString(string(s)) {
return false
}

return sum%11 == 0
switch string(s[0]) {
case "1", "2":
for i := 0; i < 11; i++ {
susDigit, _ := strconv.Atoi(string(s[i]))
sum += susDigit * (15 - i)
}
if sum%11 == 1 {
return string(s[11:15]) == "001"+strconv.Itoa(11-(sum+2)%11)
}
return string(s[11:15]) == "000"+strconv.Itoa((11-sum%11)%11)
case "7", "8", "9":
for i := 0; i < 15; i++ {
susDigit, _ := strconv.Atoi(string(s[i]))
sum += susDigit * (15 - i)
}
return sum%11 == 0
default:
return false
}
}
17 changes: 2 additions & 15 deletions titulo_eleitoral.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,8 @@ func RandomTituloEleitoralNumber(mask bool) string {
}
firstDigit := sum % 11
if firstDigit == 0 {
switch stateCode {
case 1:
if stateCodeString == "01" || stateCodeString == "02" {
firstDigit = 1
break
case 2:
firstDigit = 1
break
}
}
if firstDigit == 10 {
Expand All @@ -95,17 +90,9 @@ func RandomTituloEleitoralNumber(mask bool) string {
}
sum = sum + firstDigit*9
secondDigit := sum % 11
if secondDigit == 10 {
secondDigit = 0
}
if secondDigit == 0 {
switch stateCode {
case 1:
secondDigit = 1
break
case 2:
if stateCodeString == "01" || stateCodeString == "02" {
secondDigit = 1
break
}
}
if secondDigit == 10 {
Expand Down

0 comments on commit 5b154df

Please sign in to comment.