Cálculo do DV do Nosso Número utilizado pelo Banco SICOOB

@param $nossoNumero
@return int
426810
private function calcularDvNossoNumero($nossoNumero)
    {
        $referencia = '3197';
        $indice = 0;
        $soma = 0;

        for ($i = 0; $i < strlen($nossoNumero); $i++) {
            $soma += $nossoNumero[$i] * $referencia[$indice];
            $indice++;
            $indice = $indice > 3 ? 0 : $indice;
        }

        $resto = $soma % 11;

        return $resto > 1 ? 11 - $resto : 0;
    }
1264579
protected function getCampoLivre()
    {
        if ($this->campoLivre) {
            return $this->campoLivre;
        }
        $length = strlen($this->getConvenio());
        $nossoNumero = $this->gerarNossoNumero();
        if (strlen($this->getNumero()) > 10) {
            if ($length == 6 && in_array($this->getCarteira(), ['16', '18']) && Util::numberFormatGeral($this->getVariacaoCarteira(), 3) == '017') {
                return $this->campoLivre = Util::numberFormatGeral($this->getConvenio(), 6) . $nossoNumero . '21';
            } else {
                throw new \Exception('Só é possível criar um boleto com mais de 10 dígitos no nosso número quando a carteira é 21 e o convênio possuir 6 dígitos.');
            }
        }
        switch ($length) {
        case 4:
        case 6:
            return $this->campoLivre = $nossoNumero . Util::numberFormatGeral($this->getAgencia(), 4) . Util::numberFormatGeral($this->getConta(), 8) . Util::numberFormatGeral($this->getCarteira(), 2);
        case 7:
            return $this->campoLivre = '000000' . $nossoNumero . Util::numberFormatGeral($this->getCarteira(), 2);
        }
        throw new \Exception('O código do convênio precisa ter 4, 6 ou 7 dígitos!');
    }
1036655
private function nossoNumero(BoletoContract $boleto) {
        $convenio = (int) Util::onlyNumbers($this->getConvenio());
        if ($convenio > 1000000) {
            return $boleto->getNossoNumero();
        }
        return $boleto->getNossoNumero() . CalculoDV::bbNossoNumero($boleto->getNossoNumero());
    }
69411
public function getMiscNumber($p_num)
    {
        if (array_key_exists($p_num, $this->misc_numbers)) {
            return $this->misc_numbers[$p_num];
        }

        throw new NumbersWordsException(sprintf('Can\'t find %s misc number !', $p_num));
    }
1019956
public static function primeiroDvAsbace($chaveAsbace)
    {
        $peso = 1;
        $soma = 0;

        //Separação dos números
        for ($i = 0; $i < strlen($chaveAsbace); $i++) {
            //Isolando cada dígito
            $digito = substr($chaveAsbace, $i, 1);

            if (2 == $peso) {
                $peso--;
            } else {
                $peso++;
            }

            //Efetua multiplicação do dígito pelo peso
            $produto = (int) $digito * $peso;

            //Se o resultado da multiplicação for maior que 9
            //o produto recebe o da subtração dele mesmo menos 9.
            //Caso contrário, o produto continua com o valor
            //do resultado da multiplicação.
            $produto = 9 < $produto ? $produto - 9 : $produto;

            //Realiza a soma de todos os produtos
            $soma += $produto;
        }

        //Recupera o resto da divisão do resultado da soma por 10
        $resto = $soma % 10;

        return $resto == 0 ? 0 : 10 - $resto;
    }
23300
public function convenio($convenio, $nossoNumero)
    {
        $reflection = new ReflectionClass($this->namespace . '\\Convenio');
        $this->convenio = $reflection->newInstanceArgs(array($this->banco, $this->carteira, $convenio, $nossoNumero));

        return $this;
    }
445613
public function getNossoNumero()
    {
        $nossoNumero = $this->segmento_t->nosso_numero;

        if ($this->codigo_banco == 1) {
            $nossoNumero = preg_replace(
                '/^'.strval($this->arquivo->getCodigoConvenio()).'/',
                '',
                $nossoNumero
            );
        }

        if (in_array($this->codigo_banco, array(\Cnab\Banco::SANTANDER))) {
            // retira o dv
            $nossoNumero = substr($nossoNumero, 0, -1);
        }

        return $nossoNumero;
    }
1126824
public static function modulo11($numero, $peso = 2, $base = 9, $zero = 1, $um = 1)
    {
        // Pegar somente números
        $numero = preg_replace('/[^0-9]/', '', $numero);

        $soma = 0;
        $contador = (strlen($numero) - 1);
        for ($i = $contador; $i >= 0; $i--) {
            $soma += (intval($numero[$i]) * $peso);
            $peso = (($peso < $base) ? ($peso + 1) : 2);
        }

        $resto = ($soma % 11);

        // Calcular digito
        $digito = (11 - $resto);
        $digito = (($digito > $base) ? 0 : $digito);

        /* Utilizar o dígito 1(um) sempre que o resultado do cálculo padrão for igual a 0(zero), 1(um) ou 10(dez). */
        if ($digito == 0) {
            return $zero;
        }
        if ($digito == 1) {
            return $um;
        }

        return $digito;
    }
1022128
protected function gerarNossoNumero()
    {
        $convenio = $this->getConvenio();
        $numero_boleto = $this->getNumero();
        switch (strlen($convenio)) {
        case 4:
            $numero = Util::numberFormatGeral($convenio, 4) . Util::numberFormatGeral($numero_boleto, 7);
            break;
        case 6:
            if (in_array($this->getCarteira(), ['16', '18']) && $this->getVariacaoCarteira() == 17) {
                $numero = Util::numberFormatGeral($numero_boleto, 17);
            } else {
                $numero = Util::numberFormatGeral($convenio, 6) . Util::numberFormatGeral($numero_boleto, 5);
            }
            break;
        case 7:
            $numero = Util::numberFormatGeral($convenio, 7) . Util::numberFormatGeral($numero_boleto, 10);
            break;
        default:
            throw new \Exception('O código do convênio precisa ter 4, 6 ou 7 dígitos!');
        }
        return $numero;
    }
19720
public function setDvNossoNumero($carteira, $nossoNumero, $ifTen = 'P', $ifZero = '0')
    {
        $this->dvNossoNumero = Number::modulo11($carteira . $nossoNumero, $ifTen, $ifZero, false, 7);

        return $this;
    }
1179955
public function getNossoNumero()
    {
        if (empty($this->campoNossoNumero)) {
            return $this->campoNossoNumero = $this->gerarNossoNumero();
        }
        return $this->campoNossoNumero;
    }
976905
protected function gerarNossoNumero()
    {
        return Util::numberFormatGeral($this->getNumero(), 11)
            . CalculoDV::bradescoNossoNumero($this->getCarteira(), $this->getNumero());
    }
360067
private static function inserir_tempo(int $tempo_da_sessao): int
    {
        $diferenca_tempo = time() - $tempo_da_sessao;
        $segundos = $diferenca_tempo;
        $minutos = round($diferenca_tempo / 60);
        $horas = round($diferenca_tempo / 3600);
        $dia = round($diferenca_tempo / 86400);
        $semana = round($diferenca_tempo / 604800);
        $mes = round($diferenca_tempo / 2592000);
        $ano = round($diferenca_tempo / 31536000);
        //segundos

        if ($segundos <= 60) {
            echo " $segundos segundos agora<br/>";
        }
        //minutos
        elseif ($minutos <= 60) {
            if ($minutos == 1) {
                echo "one minuto  e $segundos agora <br/>";
            } else {
                echo "$minutos minutos agora<br/>";
            }
        }

        //horas
        elseif ($horas <= 24) {
            if ($horas == 1) {
                echo "uma hora agora e $minutos minutos e $segundos segundos<br/>";
            } else {
                echo "$horas horas agora<br/>";
            }
        }

        // dias
        elseif ($dia <= 7) {
            if ($dia == 1) {
                echo 'um dia agora <br/>';
            } else {
                echo "$dia dias agora<br/>";
            }
        }

        //semanas
        elseif ($semana <= 4) {
            if ($semana == 1) {
                echo 'uma semana agora<br/>';
            } else {
                echo "$semana semanas agora<br/>";
            }
        }

        //mes
        elseif ($mes <= 12) {
            if ($mes == 1) {
                echo 'um mes agora<br/>';
            } else {
                echo "$mes meses agora<br/>";
            }
        }

        //semanas
        else {
            if ($ano == 1) {
                echo 'um ano agora<br/>';
            } else {
                echo "$ano anos agora<br/>";
            }
        }

        return $tempo_da_sessao;
    }
163357
public static function segundoDvAsbace($chaveAsbace, $primeiroDv)
    {
        $resto = self::restoSegundoDvAsbace($chaveAsbace, $primeiroDv);

        if (0 == $resto) {
            return 0;
        } elseif (1 == $resto) {
            return 9 > $primeiroDv
                ? self::segundoDvAsbace($chaveAsbace, $primeiroDv + 1)
                : self::segundoDvAsbace($chaveAsbace, 0);
        }

        return 11 - $resto;
    }
181770
public static function restoSegundoDvAsbace($chaveAsbace, $primeiroDv)
    {
        $peso = 8;
        $soma = 0;
        $chaveComPrimeiroDv = $chaveAsbace . $primeiroDv;

        //Separação dos números
        for ($i = 0; $i < strlen($chaveComPrimeiroDv); $i++) {
            //Isolando cada dígito
            $digito = substr($chaveComPrimeiroDv, $i, 1);

            if (2 == $peso) {
                $peso = 7;
            } else {
                $peso--;
            }

            //Efetua multiplicação do dígito pelo peso e soma os resultados
            $soma += (int) $digito * $peso;
        }

        //Retorna o resto da divisão do resultado da soma por 11
        return $soma % 11;
    }
213211
public static function toNumber($o)
    {
        if (is_int($o) === true || is_float($o) === true) {
            return $o;
        } else {
            if (is_bool($o) === true) {
                return ($o) ? 1 : 0;
            } elseif (is_numeric($o) === true && $o !== "") {
                return ($o + 0);
            }

            return null;
        }
    }
577792
public function getConstrainedKeysByCount($count, $operator = '>=')
	{
		$associativeTable = $this->associativeTable;
		$associativeLocal = $this->associativeLocal;
		$shifter          = $this->shifter;
		$model            = $this->model;

		return $this->getConstrainedKeys(function($related) use ($count, $associativeTable, $associativeLocal, $shifter, $model, $operator)
		{
			$related->whereEquals($associativeTable . '.' . $shifter, strtolower($model->getModelName()))
			        ->group($shifter)
			        ->group($associativeLocal)
			        ->having('COUNT(*)', $operator, $count);
		});
	}