Stand: SMTP-Test, Admin-Mail-Tab, Notifiable-Fix, Lazy-Quill

- Fix: Notifiable-Trait zum User-Model hinzugefuegt (behebt notify()-500er)
- Installer: SMTP-Verbindungstest mit EsmtpTransport + Ueberspringen-Link
- Admin: Neuer E-Mail-Tab mit SMTP-Konfiguration + Verbindungstest
- Admin: Lazy Quill-Initialisierung (nur sichtbare Locale wird geladen)
- Uebersetzungen: 17 neue Mail-Keys in allen 6 Sprachen

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Rhino
2026-03-02 07:30:37 +01:00
commit 2e24a40d68
9633 changed files with 1300799 additions and 0 deletions

View File

@@ -0,0 +1,154 @@
<?php
namespace Faker\Provider\pt_BR;
class Address extends \Faker\Provider\Address
{
protected static $cityPrefix = ['São', 'Porto', 'Vila', 'Santa'];
protected static $citySuffix = ['do Norte', 'do Leste', 'do Sul', 'd\'Oeste'];
protected static $streetPrefix = [
'Av.', 'Avenida', 'R.', 'Rua', 'Travessa', 'Largo',
];
protected static $buildingNumber = ['%####', '%###', '%##', '%#', '%'];
protected static $postcode = ['#####-###'];
protected static $state = [
'Acre', 'Alagoas', 'Amapá', 'Amazonas', 'Bahia', 'Ceará',
'Distrito Federal', 'Espírito Santo', 'Goiás', 'Maranhão',
'Mato Grosso', 'Mato Grosso do Sul', 'Minas Gerais', 'Pará', 'Paraíba',
'Paraná', 'Pernambuco', 'Piauí', 'Rio de Janeiro',
'Rio Grande do Norte', 'Rio Grande do Sul', 'Rondônia', 'Roraima',
'Santa Catarina', 'São Paulo', 'Sergipe', 'Tocantins',
];
protected static $stateAbbr = [
'AC', 'AL', 'AP', 'AM', 'BA', 'CE', 'DF', 'ES', 'GO', 'MA', 'MT', 'MS',
'MG', 'PA', 'PB', 'PR', 'PE', 'PI', 'RJ', 'RN', 'RS', 'RO', 'RR', 'SC',
'SP', 'SE', 'TO',
];
protected static $region = [
'Centro-Oeste', 'Nordeste', 'Norte', 'Sudeste', 'Sul',
];
protected static $regionAbbr = [
'CO', 'N', 'NE', 'SE', 'S',
];
protected static $country = [
'Afeganistão', 'África do Sul', 'Albânia', 'Alemanha', 'Andorra',
'Angola', 'Antigua e Barbuda', 'Arabia Saudita', 'Argélia',
'Argentina', 'Armênia', 'Austrália', 'Áustria', 'Azerbaijão',
'Bahamas', 'Bangladesh', 'Barbados', 'Barein', 'Belize', 'Benin',
'Bielorrússia', 'Birmânia', 'Bolívia', 'Bósnia e Herzegovina',
'Botsuana', 'Brasil', 'Brunei', 'Bulgária', 'Burkina Faso',
'Burundi', 'Butão', 'Bélgica', 'Cabo Verde', 'Camboja', 'Camarões',
'Canadá', 'Cazaquistão', 'Chad', 'Chile', 'China', 'Chipre',
'Colômbia', 'Comoras', 'Congo', 'Coréia do Norte', 'Coréia do Sul',
'Costa Rica', 'Costa do Marfim', 'Croácia', 'Cuba', 'Dinamarca',
'Djibouti', 'Domênica', 'Equador', 'Egito', 'El Salvador',
'Emirados Árabes Unidos', 'Eritrea', 'Eslováquia', 'Eslovênia',
'Espanha', 'Estados Unidos da América', 'Estônia', 'Etiópia',
'Filipinas', 'Finlândia', 'Fiji', 'França', 'Gabão', 'Gâmbia',
'Georgia', 'Gana', 'Granada', 'Grécia', 'Guatemala',
'Guiné Equatorial', 'Guiné Bissau', 'Guiana', 'Haiti', 'Honduras',
'Hungria', 'Índia', 'Indonésia', 'Iraque', 'Irlanda', 'Irã',
'Islândia', 'Ilhas Marshall', 'Ilhas Maurício', 'Ilhas Salomão',
'Ilhas Samoa', 'Israel', 'Itália', 'Jamaica', 'Japão', 'Jordânia',
'Kiribati', 'Kwait', 'Laos', 'Lesoto', 'Letônia', 'Libéria', 'Líbia',
'Liechtenstein', 'Lituânia', 'Luxemburgo', 'Líbano', 'Macedônia',
'Madagascar', 'Malásia', 'Malauí', 'Maldivas', 'Mali', 'Malta',
'Marrocos', 'Mauritânia', 'Micronésia', 'Moldávia', 'Mongólia',
'Montenegro', 'Moçambique', 'México', 'Mônaco', 'Namíbia', 'Nauru',
'Nepal', 'Nicarágua', 'Nigéria', 'Noruega', 'Nova Guiné',
'Nova Zelândia', 'Níger', 'Omã', 'Qatar', 'Quênia', 'Quirguistão',
'Paquistão', 'Palaos', 'Panamá', 'Papua Nova Guiné', 'Paraguai',
'Países Baixos', 'Peru', 'Polônia', 'Portugal', 'Reino Unido',
'Reino Unido da Grã Bretanha e Irlanda do Norte',
'República Centroafricana', 'República Checa',
'República Democrática do Congo', 'República Dominicana', 'Ruanda',
'Romênia', 'Rússia', 'San Cristõvao e Neves', 'San Marino',
'São Vicente e as Granadinas', 'Santa Luzia', 'São Tomé e Príncipe',
'Senegal', 'Sérvia', 'Seychelles', 'Serra Leoa', 'Singapura', 'Síria',
'Somália', 'Sri Lanka', 'Suazilândia', 'Sudão', 'Suécia', 'Suiça',
'Suriname', 'Tailândia', 'Tanzânia', 'Tajiquistão', 'Timor Leste',
'Togo', 'Tonga', 'Trinidad e Tobago', 'Turcomenistão', 'Turquia',
'Tuvalu', 'Tunísia', 'Ucrânia', 'Uganda', 'Uruguai', 'Uzbequistão',
'Vaticano', 'Vanuatu', 'Venezuela', 'Vietnã', 'Yemen', 'Zâmbia',
'Zimbábue',
];
protected static $cityFormats = [
'{{cityPrefix}} {{firstName}} {{citySuffix}}',
'{{cityPrefix}} {{firstName}}',
'{{firstName}} {{citySuffix}}',
'{{lastName}} {{citySuffix}}',
];
protected static $streetNameFormats = [
'{{streetPrefix}} {{firstName}}',
'{{streetPrefix}} {{lastName}}',
'{{streetPrefix}} {{firstName}} {{lastName}}',
];
protected static $streetAddressFormats = [
'{{streetName}}, {{buildingNumber}}',
'{{streetName}}, {{buildingNumber}}. {{secondaryAddress}}',
];
protected static $addressFormats = [
"{{postcode}}, {{streetAddress}}\n{{city}} - {{stateAbbr}}",
];
protected static $secondaryAddressFormats = [
'Bloco A', 'Bloco B', 'Bloco C', 'Bc. # Ap. ##', 'Bc. ## Ap. ##',
'#º Andar', '##º Andar', '###º Andar', 'Apto #', 'Apto ##', 'Apto ###',
'Apto ####', 'F', 'Fundos', 'Anexo',
];
/**
* @example 'Avenida'
*/
public static function streetPrefix()
{
return static::randomElement(static::$streetPrefix);
}
/**
* @example 'São'
*/
public static function cityPrefix()
{
return static::randomElement(static::$cityPrefix);
}
/**
* @example '6º Andar'
*/
public static function secondaryAddress()
{
return static::numerify(static::randomElement(static::$secondaryAddressFormats));
}
/**
* @example 'Brasília'
*/
public static function state()
{
return static::randomElement(static::$state);
}
/**
* @example 'DF'
*/
public static function stateAbbr()
{
return static::randomElement(static::$stateAbbr);
}
/**
* @example 'Nordeste'
*/
public static function region()
{
return static::randomElement(static::$region);
}
/**
* @example 'NE'
*/
public static function regionAbbr()
{
return static::randomElement(static::$regionAbbr);
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace Faker\Provider\pt_BR;
require_once 'check_digit.php';
class Company extends \Faker\Provider\Company
{
protected static $formats = [
'{{lastName}} {{companySuffix}}',
'{{lastName}}-{{lastName}}',
'{{lastName}} e {{lastName}}',
'{{lastName}} e {{lastName}} {{companySuffix}}',
'{{lastName}} Comercial Ltda.',
];
protected static $companySuffix = ['e Filhos', 'e Associados', 'Ltda.', 'S.A.'];
/**
* A random CNPJ number.
*
* @see http://en.wikipedia.org/wiki/CNPJ
*
* @param bool $formatted If the number should have dots/slashes/dashes or not.
*
* @return string
*/
public function cnpj($formatted = true)
{
$n = $this->generator->numerify('########0001');
$n .= check_digit($n);
$n .= check_digit($n);
return $formatted ? vsprintf('%d%d.%d%d%d.%d%d%d/%d%d%d%d-%d%d', str_split($n)) : $n;
}
}

View File

@@ -0,0 +1,9 @@
<?php
namespace Faker\Provider\pt_BR;
class Internet extends \Faker\Provider\Internet
{
protected static $freeEmailDomain = ['gmail.com', 'yahoo.com', 'hotmail.com', 'uol.com.br', 'terra.com.br', 'ig.com.br', 'r7.com'];
protected static $tld = ['com', 'com', 'com.br', 'com.br', 'net', 'net.br', 'br', 'org'];
}

View File

@@ -0,0 +1,148 @@
<?php
namespace Faker\Provider\pt_BR;
class Payment extends \Faker\Provider\Payment
{
protected static $cardVendors = [
'Visa', 'Visa', 'Visa', 'Visa', 'Visa',
'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard',
'American Express', 'Discover Card', 'Diners', 'Elo', 'Hipercard',
];
// see https://gist.github.com/erikhenrique/5931368 / http://pt.stackoverflow.com/q/3715/26461
protected static $cardParams = [
'Visa' => [
'4##############',
],
'MasterCard' => [
'5##############',
],
'American Express' => [
'34############',
'37############',
],
'Discover Card' => [
'6011###########',
'622############',
'64#############',
'65#############',
],
'Diners' => [
'301############',
'301##########',
'305############',
'305##########',
'36#############',
'36###########',
'38#############',
'38###########',
],
'Elo' => [
'636368#########',
'438935#########',
'504175#########',
'451416#########',
'636297#########',
'5067###########',
'4576###########',
'4011###########',
],
'Hipercard' => [
'38#############',
'60#############',
],
'Aura' => [
'50#############',
],
];
/**
* International Bank Account Number (IBAN)
*
* @see http://en.wikipedia.org/wiki/International_Bank_Account_Number
*
* @param string $prefix for generating bank account number of a specific bank
* @param string $countryCode ISO 3166-1 alpha-2 country code
* @param int $length total length without country code and 2 check digits
*
* @return string
*/
public static function bankAccountNumber($prefix = '', $countryCode = 'BR', $length = null)
{
return static::iban($countryCode, $prefix, $length);
}
/**
* @see list of Brazilians banks (2018-02-15), source: https://pt.wikipedia.org/wiki/Lista_de_bancos_do_Brasil
*/
protected static $banks = [
'BADESUL Desenvolvimento S.A. Agência de Fomento/RS',
'Banco Central do Brasil',
'Banco da Amazônia',
'Banco de Brasília',
'Banco de Desenvolvimento de Minas Gerais',
'Banco de Desenvolvimento do Espírito Santo',
'Banco de Desenvolvimento do Paraná',
'Banco do Brasil',
'Banco do Estado de Sergipe Banese Estadual',
'Banco do Estado do Espírito Santo Banestes',
'Banco do Estado do Pará',
'Banco do Estado do Rio Grande do Sul',
'Banco do Nordeste do Brasil',
'Banco Nacional de Desenvolvimento Econômico e Social',
'Banco Regional de Desenvolvimento do Extremo Sul',
'Caixa Econômica Federal',
'Banco ABN Amro S.A.',
'Banco Alfa',
'Banco Banif',
'Banco BBM',
'Banco BMG',
'Banco Bonsucesso',
'Banco BTG Pactual',
'Banco Cacique',
'Banco Caixa Geral - Brasil',
'Banco Citibank',
'Banco Credibel',
'Banco Credit Suisse',
'Góis Monteiro & Co',
'Banco Fator',
'Banco Fibra',
'Agibank',
'Banco Guanabara',
'Banco Industrial do Brasil',
'Banco Industrial e Comercial',
'Banco Indusval',
'Banco Inter',
'Banco Itaú BBA',
'Banco ItaúBank',
'Banco Itaucred Financiamentos',
'Banco Mercantil do Brasil',
'Banco Modal Modal',
'Banco Morada',
'Banco Pan',
'Banco Paulista',
'Banco Pine',
'Banco Renner',
'Banco Ribeirão Preto',
'Banco Safra',
'Banco Santander',
'Banco Sofisa',
'Banco Topázio',
'Banco Votorantim',
'Bradesco Bradesco',
'Itaú Unibanco',
'Banco Original',
'Banco Neon',
'Nu Pagamentos S.A',
'XP Investimentos Corretora de Câmbio Títulos e Valores Mobiliários S.A',
];
/**
* @example 'Banco Neon'
*/
public static function bank()
{
return static::randomElement(static::$banks);
}
}

View File

@@ -0,0 +1,159 @@
<?php
namespace Faker\Provider\pt_BR;
require_once 'check_digit.php';
class Person extends \Faker\Provider\Person
{
protected static $maleNameFormats = [
'{{firstNameMale}} {{lastName}}',
'{{firstNameMale}} {{firstNameMale}} {{lastName}}',
'{{firstNameMale}} {{lastName}} {{lastName}}',
'{{titleMale}} {{firstNameMale}} {{lastName}}',
'{{titleMale}} {{firstNameMale}} {{firstNameMale}} {{lastName}}',
'{{titleMale}} {{firstNameMale}} {{lastName}} {{lastName}}',
'{{firstNameMale}} {{lastName}} {{suffix}}',
'{{firstNameMale}} {{firstNameMale}} {{lastName}} {{suffix}}',
'{{firstNameMale}} {{lastName}} {{lastName}} {{suffix}}',
'{{titleMale}} {{firstNameMale}} {{lastName}} {{suffix}}',
'{{titleMale}} {{firstNameMale}} {{firstNameMale}} {{lastName}} {{suffix}}',
'{{titleMale}} {{firstNameMale}} {{lastName}} {{lastName}} {{suffix}}',
];
protected static $femaleNameFormats = [
'{{firstNameFemale}} {{lastName}}',
'{{firstNameFemale}} {{firstNameFemale}} {{lastName}}',
'{{firstNameFemale}} {{lastName}} {{lastName}}',
'{{titleFemale}} {{firstNameFemale}} {{lastName}}',
'{{titleFemale}} {{firstNameFemale}} {{firstNameFemale}} {{lastName}}',
'{{titleFemale}} {{firstNameFemale}} {{lastName}} {{lastName}}',
'{{firstNameFemale}} {{lastName}} {{suffix}}',
'{{firstNameFemale}} {{firstNameFemale}} {{lastName}} {{suffix}}',
'{{firstNameFemale}} {{lastName}} {{lastName}} {{suffix}}',
'{{titleFemale}} {{firstNameFemale}} {{lastName}} {{suffix}}',
'{{titleFemale}} {{firstNameFemale}} {{firstNameFemale}} {{lastName}} {{suffix}}',
'{{titleFemale}} {{firstNameFemale}} {{lastName}} {{lastName}} {{suffix}}',
];
protected static $firstNameMale = [
'Aaron', 'Adriano', 'Adriel', 'Afonso', 'Agostinho', 'Alan', 'Alessandro', 'Alexandre', 'Allan', 'Alonso',
'Anderson', 'Andres', 'André', 'Antônio', 'Arthur', 'Artur', 'Augusto', 'Benedito', 'Benjamin', 'Benício',
'Bernardo', 'Breno', 'Bruno', 'Caio', 'Camilo', 'Carlos', 'Cauan', 'Cezar', 'Christian', 'Christopher',
'Cláudio', 'Cléber', 'Cristian', 'Cristiano', 'Cristóvão', 'César', 'Daniel', 'Danilo', 'Dante', 'Davi',
'David', 'Deivid', 'Demian', 'Dener', 'Denis', 'Diego', 'Diogo', 'Edilson', 'Edson', 'Eduardo', 'Elias',
'Emanuel', 'Emerson', 'Emiliano', 'Emílio', 'Enzo', 'Eric', 'Erik', 'Estêvão', 'Evandro', 'Everton', 'Fabiano',
'Fabrício', 'Felipe', 'Fernando', 'Filipe', 'Flávio', 'Francisco', 'Franco', 'Fábio', 'Gabriel', 'Gael', 'Gean',
'George', 'Gian', 'Gilberto', 'Giovane', 'Guilherme', 'Gustavo', 'Heitor', 'Henrique', 'Hernani', 'Horácio',
'Hugo', 'Ian', 'Igor', 'Inácio', 'Isaac', 'Ivan', 'James', 'Jean', 'Jefferson', 'Jerônimo', 'Joaquim',
'Joaquin', 'Jonas', 'Jorge', 'Josué', 'José', 'João', 'Juan', 'Juliano', 'Jácomo', 'Júlio', 'Kauan', 'Kevin',
'Kléber', 'Leandro', 'Leo', 'Leonardo', 'Lorenzo', 'Luan', 'Lucas', 'Luciano', 'Lucio', 'Luis', 'Luiz',
'Maicon', 'Manuel', 'Marcelo', 'Marco', 'Marcos', 'Martinho', 'Mateus', 'Matheus', 'Matias', 'Mauro',
'Maurício', 'Maximiano', 'Michael', 'Miguel', 'Moisés', 'Murilo', 'Márcio', 'Mário', 'Máximo', 'Natal', 'Natan',
'Nelson', 'Nero', 'Nicolas', 'Noel', 'Otávio', 'Pablo', 'Paulo', 'Pedro', 'Rafael', 'Raphael', 'Reinaldo',
'Renan', 'Renato', 'Ricardo', 'Richard', 'Roberto', 'Robson', 'Rodolfo', 'Rodrigo', 'Rogério', 'Ronaldo',
'Samuel', 'Sandro', 'Santiago', 'Saulo', 'Sebastião', 'Sergio', 'Simon', 'Simão', 'Sérgio', 'Teobaldo',
'Thales', 'Thiago', 'Thomas', 'Théo', 'Tiago', 'Tomás', 'Téo', 'Valentin', 'Vicente', 'Victor', 'Vinícius',
'Vitor', 'Wagner', 'Walter', 'Wellington', 'Wesley', 'William', 'Willian', 'Wilson', 'Yuri', 'Ziraldo', 'Ícaro',
'Ítalo',
];
protected static $firstNameFemale = [
'Abgail', 'Adriana', 'Adriele', 'Agatha', 'Agustina', 'Alana', 'Alessandra', 'Alexa', 'Alice', 'Aline',
'Allison', 'Alma', 'Alícia', 'Amanda', 'Amélia', 'Ana', 'Analu', 'Andressa', 'Andréa', 'Andréia', 'Angélica',
'Anita', 'Antonella', 'Antonieta', 'Aparecida', 'Ariana', 'Ariane', 'Aurora', 'Ayla', 'Beatriz', 'Bella',
'Betina', 'Bia', 'Bianca', 'Bruna', 'Bárbara', 'Camila', 'Carla', 'Carol', 'Carolina', 'Caroline', 'Catarina',
'Cecília', 'Clara', 'Clarice', 'Cláudia', 'Constância', 'Cristiana', 'Cristina', 'Cynthia', 'Cíntia', 'Daiana',
'Daiane', 'Daniela', 'Daniele', 'Daniella', 'Danielle', 'Dayana', 'Dayane', 'Denise', 'Diana', 'Dirce',
'Débora', 'Eduarda', 'Elaine', 'Eliane', 'Elis', 'Elisa', 'Elizabeth', 'Ellen', 'Eloah', 'Eloá', 'Emanuelly',
'Emilly', 'Emily', 'Emília', 'Estela', 'Ester', 'Esther', 'Eunice', 'Eva', 'Fabiana', 'Fernanda', 'Flor',
'Flávia', 'Franciele', 'Fátima', 'Gabi', 'Gabriela', 'Gabrielle', 'Gabrielly', 'Giovana', 'Giovanna', 'Gisela',
'Gisele', 'Graziela', 'Helena', 'Heloise', 'Heloísa', 'Hortência', 'Hosana', 'Iasmin', 'Ingrid', 'Irene',
'Isabel', 'Isabella', 'Isabelly', 'Isadora', 'Isis', 'Ivana', 'Janaina', 'Jaqueline', 'Jasmin', 'Jennifer',
'Joana', 'Josefina', 'Joyce', 'Juliana', 'Juliane', 'Julieta', 'Jéssica', 'Júlia', 'Kamila', 'Karen', 'Karina',
'Karine', 'Katherine', 'Kelly', 'Ketlin', 'Késia', 'Laiane', 'Lara', 'Larissa', 'Laura', 'Lavínia', 'Laís',
'Letícia', 'Lia', 'Lidiane', 'Lilian', 'Liz', 'Lorena', 'Louise', 'Luana', 'Luara', 'Luciana', 'Luiza', 'Luna',
'Luzia', 'Luísa', 'Léia', 'Lívia', 'Lúcia', 'Madalena', 'Maiara', 'Maitê', 'Malena', 'Malu', 'Manoela',
'Manuela', 'Maraisa', 'Mari', 'Maria', 'Mariah', 'Mariana', 'Marina', 'Marisa', 'Marta', 'Mary', 'Marília',
'Maya', 'Mayara', 'Maísa', 'Mel', 'Melina', 'Melinda', 'Melissa', 'Mia', 'Micaela', 'Michele', 'Michelle',
'Mila', 'Milena', 'Milene', 'Miranda', 'Mirela', 'Mirella', 'Miriam', 'Márcia', 'Mônica', 'Naiara', 'Naomi',
'Nathalia', 'Natália', 'Nayara', 'Nicole', 'Noa', 'Noelí', 'Noemi', 'Norma', 'Nádia', 'Ohana', 'Olga', 'Olívia',
'Ornela', 'Paloma', 'Paola', 'Patrícia', 'Paula', 'Paulina', 'Pietra', 'Poliana', 'Priscila', 'Pâmela',
'Pérola', 'Rafaela', 'Raissa', 'Raquel', 'Rayane', 'Raysa', 'Rebeca', 'Regiane', 'Regina', 'Renata', 'Roberta',
'Rosana', 'Ruth', 'Sabrina', 'Samanta', 'Samara', 'Sandra', 'Sara', 'Sarah', 'Sheila', 'Silvana', 'Simone',
'Sofia', 'Sophia', 'Sophie', 'Stefany', 'Stella', 'Stephanie', 'Stephany', 'Suelen', 'Sueli', 'Suellen',
'Suzana', 'Sônia', 'Tainara', 'Talita', 'Tatiana', 'Tatiane', 'Taís', 'Tessália', 'Thalia', 'Thalissa',
'Thalita', 'Thaís', 'Tábata', 'Tâmara', 'Valentina', 'Valéria', 'Vanessa', 'Verônica', 'Violeta', 'Vitória',
'Viviane', 'Yasmin', 'Yohanna',
];
protected static $lastName = [
'Abreu', 'Aguiar', 'Alcantara', 'Alves', 'Amaral', 'Aragão', 'Aranda', 'Arruda', 'Ávila', 'Assunção', 'Azevedo',
'Balestero', 'Barreto', 'Barros', 'Batista', 'Beltrão', 'Benez', 'Benites', 'Bezerra', 'Bittencourt', 'Bonilha',
'Branco', 'Brito', 'Burgos', 'Caldeira', 'Camacho', 'Campos', 'Carmona', 'Carrara', 'Carvalho', 'Casanova',
'Cervantes', 'Chaves', 'Colaço', 'Cordeiro', 'Corona', 'Correia', 'Cortês', 'Cruz', 'D\'ávila', 'Delatorre',
'Delgado', 'Delvalle', 'Deverso', 'Dias', 'Dominato', 'Domingues', 'Duarte', 'Escobar', 'Espinoza', 'Esteves',
'Estrada', 'Faria', 'Faro', 'Feliciano', 'Ferminiano', 'Fernandes', 'Ferraz', 'Ferreira', 'Ferreira', 'Fidalgo',
'Flores', 'Fonseca', 'Fontes', 'Franco', 'Furtado', 'Galhardo', 'Galindo', 'Galvão', 'Garcia', 'Gil', 'Godói',
'Gomes', 'Gonçalves', 'Grego', 'Guerra', 'Gusmão', 'Jimenes', 'Leal', 'Leon', 'Lira', 'Lourenço', 'Lovato',
'Lozano', 'Lutero', 'Madeira', 'Maia', 'Maldonado', 'Marin', 'Marinho', 'Marques', 'Martines', 'Marés',
'Mascarenhas', 'Matias', 'Matos', 'Medina', 'Meireles', 'Mendes', 'Mendonça', 'Molina', 'Montenegro', 'Neves',
'Oliveira', 'Ortega', 'Ortiz', 'Pacheco', 'Padilha', 'Padrão', 'Paes', 'Paz', 'Pedrosa', 'Pena', 'Pereira',
'Perez', 'Pontes', 'Prado', 'Queirós', 'Queirós', 'Quintana', 'Quintana', 'Ramires', 'Ramos', 'Rangel', 'Reis',
'Rezende', 'Rico', 'Rios', 'Rivera', 'Rocha', 'Rodrigues', 'Romero', 'Roque', 'Rosa', 'Saito', 'Salas',
'Salazar', 'Sales', 'Salgado', 'Sanches', 'Sandoval', 'Santacruz', 'Santana', 'Santiago', 'Santos', 'Saraiva',
'Sepúlveda', 'Serna', 'Serra', 'Serrano', 'Soares', 'Solano', 'Soto', 'Souza', 'Tamoio', 'Teles', 'Toledo',
'Torres', 'Uchoa', 'Urias', 'Valdez', 'Vale', 'Valente', 'Valentin', 'Valência', 'Vasques', 'Vega', 'Velasques',
'Verdara', 'Verdugo', 'Vieira', 'Vila', 'Zamana', 'Zambrano', 'Zaragoça', 'da Cruz', 'da Rosa', 'da Silva',
'das Dores', 'das Neves', 'de Aguiar', 'de Arruda', 'de Freitas', 'de Oliveira', 'de Souza',
];
protected static $titleMale = ['Sr.', 'Dr.'];
protected static $titleFemale = ['Sra.', 'Srta.', 'Dr.'];
protected static $suffix = ['Filho', 'Neto', 'Sobrinho', 'Jr.'];
/**
* @example 'Jr.'
*/
public static function suffix()
{
return static::randomElement(static::$suffix);
}
/**
* A random CPF number.
*
* @see http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas
*
* @param bool $formatted If the number should have dots/dashes or not.
*
* @return string
*/
public function cpf($formatted = true)
{
$n = $this->generator->numerify('#########');
$n .= check_digit($n);
$n .= check_digit($n);
return $formatted ? vsprintf('%d%d%d.%d%d%d.%d%d%d-%d%d', str_split($n)) : $n;
}
/**
* A random RG number, following Sao Paulo state's rules.
*
* @see http://pt.wikipedia.org/wiki/C%C3%A9dula_de_identidade
*
* @param bool $formatted If the number should have dots/dashes or not.
*
* @return string
*/
public function rg($formatted = true)
{
$n = $this->generator->numerify('########');
$n .= check_digit($n);
return $formatted ? vsprintf('%d%d.%d%d%d.%d%d%d-%s', str_split($n)) : $n;
}
}

View File

@@ -0,0 +1,150 @@
<?php
namespace Faker\Provider\pt_BR;
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
protected static $landlineFormats = ['2###-####', '3###-####', '4###-####'];
/**
* Since december 2016 all mobile phone numbers in brazil begin with 9 and landlines 2, 3 or 4.
*
* @see http://www.anatel.gov.br/Portal/exibirPortalPaginaEspecial.do?org.apache.struts.taglib.html.TOKEN=9594e1d11fbc996d52bda44e608bb744&codItemCanal=1794&pastaSelecionada=2984
*/
protected static $cellphoneFormats = ['9####-####'];
/**
* Generates a 2-digit area code not composed by zeroes.
*
* @see http://www.anatel.gov.br/legislacao/resolucoes/16-2001/383-resolucao-263.
*
* @return string
*/
public static function areaCode()
{
$areaCodes = [
'11', '12', '13', '14', '15', '16', '17', '18', '19', '21', '22', '24',
'27', '28', '31', '32', '33', '34', '35', '37', '38', '41', '42', '43',
'44', '45', '46', '47', '48', '49', '51', '53', '54', '55', '61', '62',
'63', '64', '65', '66', '67', '68', '69', '71', '73', '74', '75', '77',
'79', '81', '82', '83', '84', '85', '86', '87', '88', '89', '91', '92',
'93', '94', '95', '96', '97', '98', '99',
];
return self::randomElement($areaCodes);
}
/**
* Generates a 9-digit cellphone number without formatting characters.
*
* @param bool $formatted [def: true] If it should return a formatted number or not.
*
* @return string
*/
public static function cellphone($formatted = true)
{
$number = static::numerify(static::randomElement(static::$cellphoneFormats));
if (!$formatted) {
$number = strtr($number, ['-' => '']);
}
return $number;
}
/**
* Generates an 9-digit landline number without formatting characters.
*
* @param bool $formatted [def: true] If it should return a formatted number or not.
*
* @return string
*/
public static function landline($formatted = true)
{
$number = static::numerify(static::randomElement(static::$landlineFormats));
if (!$formatted) {
$number = strtr($number, ['-' => '']);
}
return $number;
}
/**
* Randomizes between cellphone and landline numbers.
*
* @param bool $formatted [def: true] If it should return a formatted number or not.
*/
public static function phone($formatted = true)
{
$options = static::randomElement([
['cellphone', false],
['cellphone', true],
['landline', null],
]);
return call_user_func([static::class, $options[0]], $formatted, $options[1]);
}
/**
* Generates a complete phone number.
*
* @param string $type [def: landline] One of "landline" or "cellphone". Defaults to "landline" on invalid values.
* @param bool $formatted [def: true] If the number should be formatted or not.
*
* @return string
*/
protected static function anyPhoneNumber($type, $formatted = true)
{
$area = static::areaCode();
$number = ($type == 'cellphone') ?
static::cellphone($formatted) :
static::landline($formatted);
return $formatted ? "($area) $number" : $area . $number;
}
/**
* Concatenates {@link areaCode} and {@link cellphone} into a national cellphone number.
*
* @param bool $formatted [def: true] If it should return a formatted number or not.
*
* @return string
*/
public static function cellphoneNumber($formatted = true)
{
return static::anyPhoneNumber('cellphone', $formatted);
}
/**
* Concatenates {@link areaCode} and {@link landline} into a national landline number.
*
* @param bool $formatted [def: true] If it should return a formatted number or not.
*
* @return string
*/
public static function landlineNumber($formatted = true)
{
return static::anyPhoneNumber('landline', $formatted);
}
/**
* Randomizes between complete cellphone and landline numbers.
*/
public function phoneNumber()
{
$method = static::randomElement(['cellphoneNumber', 'landlineNumber']);
return call_user_func([static::class, $method], true);
}
/**
* Randomizes between complete cellphone and landline numbers, cleared from formatting symbols.
*/
public static function phoneNumberCleared()
{
$method = static::randomElement(['cellphoneNumber', 'landlineNumber']);
return call_user_func([static::class, $method], false);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,39 @@
<?php
namespace Faker\Provider\pt_BR;
/**
* Calculates one MOD 11 check digit based on customary Brazilian algorithms.
*
* @see http://en.wikipedia.org/wiki/Check_digit
* @see http://pt.wikipedia.org/wiki/CNPJ#Algoritmo_de_Valida.C3.A7.C3.A3o
* @see http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas#Validation
*
* @param int|string $numbers Numbers on which generate the check digit
*
* @return int
*/
function check_digit($numbers)
{
$numbers = (string) $numbers;
$length = strlen($numbers);
$second_algorithm = $length >= 12;
$verifier = 0;
for ($i = 1; $i <= $length; ++$i) {
if (!$second_algorithm) {
$multiplier = $i + 1;
} else {
$multiplier = ($i >= 9) ? $i - 7 : $i + 1;
}
$verifier += $numbers[$length - $i] * $multiplier;
}
$verifier = 11 - ($verifier % 11);
if ($verifier >= 10) {
$verifier = 0;
}
return $verifier;
}