github.com/mundipagg/boleto-api@v0.0.0-20230620145841-3f9ec742599f/models/agreement.go (about)

     1  package models
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  
     7  	"github.com/mundipagg/boleto-api/util"
     8  )
     9  
    10  // Agreement afiliação do cliente com o bano
    11  type Agreement struct {
    12  	AgreementNumber uint   `json:"agreementNumber,omitempty"`
    13  	Wallet          uint16 `json:"wallet,omitempty"`
    14  	WalletVariation uint16 `json:"walletVariation,omitempty"`
    15  	Agency          string `json:"agency,omitempty"`
    16  	AgencyDigit     string `json:"agencyDigit,omitempty"`
    17  	Account         string `json:"account,omitempty"`
    18  	AccountDigit    string `json:"accountDigit,omitempty"`
    19  }
    20  
    21  // IsAgencyValid retorna se é uma agência válida
    22  func (a *Agreement) IsAgencyValid() error {
    23  	re := regexp.MustCompile("(\\D+)")
    24  	ag := re.ReplaceAllString(a.Agency, "")
    25  	if len(ag) > 0 && len(ag) < 5 {
    26  		a.Agency = util.PadLeft(ag, "0", 4)
    27  		return nil
    28  	}
    29  	return NewErrorResponse("MPAgency", "Agência inválida, deve conter até 4 dígitos")
    30  }
    31  
    32  // CalculateAgencyDigit calcula dígito da agência
    33  func (a *Agreement) CalculateAgencyDigit(digitCalculator func(agency string) string) {
    34  	re := regexp.MustCompile("(\\D+)")
    35  	ad := re.ReplaceAllString(a.AgencyDigit, "")
    36  	if len(ad) == 1 {
    37  		a.AgencyDigit = ad
    38  	} else {
    39  		a.AgencyDigit = digitCalculator(a.Agency)
    40  	}
    41  }
    42  
    43  // IsAccountValid retorna se é uma conta válida
    44  func (a *Agreement) IsAccountValid(accountLength int) error {
    45  	re := regexp.MustCompile("(\\D+)")
    46  	ac := re.ReplaceAllString(a.Account, "")
    47  	if len(ac) > 0 && len(ac) < accountLength+1 {
    48  		a.Account = util.PadLeft(ac, "0", uint(accountLength))
    49  		return nil
    50  	}
    51  	return NewErrorResponse("MPAccount", fmt.Sprintf("Conta inválida, deve conter até %d dígitos", accountLength))
    52  }
    53  
    54  //CalculateAccountDigit calcula dígito da conta
    55  func (a *Agreement) CalculateAccountDigit(digitCalculator func(agency, account string) string) {
    56  	re := regexp.MustCompile("(\\D+)")
    57  	ad := re.ReplaceAllString(a.AccountDigit, "")
    58  	if len(ad) == 1 {
    59  		a.AccountDigit = ad
    60  	} else {
    61  		a.AccountDigit = digitCalculator(a.Agency, a.Account)
    62  	}
    63  }