*/ class OwnerFactory extends Factory { protected $model = Owner::class; /** * Define the model's default state. * * @return array */ public function definition(): array { $name = fake()->firstName(); $paternal = fake()->lastName(); $maternal = fake()->lastName(); return [ 'name' => strtoupper($name), 'paternal' => strtoupper($paternal), 'maternal' => strtoupper($maternal), 'rfc' => $this->generateRFC($paternal, $maternal, $name), 'curp' => $this->generateCURP($paternal, $maternal, $name), 'address' => strtoupper(fake()->address()), ]; } /** * Generate a realistic RFC (13 characters) */ private function generateRFC(string $paternal, string $maternal, string $name): string { $firstPaternal = substr($paternal, 0, 1); $firstVowelPaternal = $this->getFirstVowel(substr($paternal, 1)); $firstMaternal = substr($maternal, 0, 1); $firstName = substr($name, 0, 1); $year = fake()->numberBetween(50, 99); $month = str_pad(fake()->numberBetween(1, 12), 2, '0', STR_PAD_LEFT); $day = str_pad(fake()->numberBetween(1, 28), 2, '0', STR_PAD_LEFT); $homoclave = strtoupper(fake()->bothify('???')); return strtoupper($firstPaternal . $firstVowelPaternal . $firstMaternal . $firstName . $year . $month . $day . $homoclave); } /** * Generate a realistic CURP (18 characters) */ private function generateCURP(string $paternal, string $maternal, string $name): string { $firstPaternal = substr($paternal, 0, 1); $firstVowelPaternal = $this->getFirstVowel(substr($paternal, 1)); $firstMaternal = substr($maternal, 0, 1); $firstName = substr($name, 0, 1); $year = str_pad(fake()->numberBetween(50, 99), 2, '0', STR_PAD_LEFT); $month = str_pad(fake()->numberBetween(1, 12), 2, '0', STR_PAD_LEFT); $day = str_pad(fake()->numberBetween(1, 28), 2, '0', STR_PAD_LEFT); $gender = fake()->randomElement(['H', 'M']); $state = 'TC'; // Tabasco $consonants = strtoupper( $this->getFirstConsonant(substr($paternal, 1)) . $this->getFirstConsonant(substr($maternal, 1)) . $this->getFirstConsonant(substr($name, 1)) ); $homoclave = strtoupper(fake()->bothify('??')); return strtoupper($firstPaternal . $firstVowelPaternal . $firstMaternal . $firstName . $year . $month . $day . $gender . $state . $consonants . $homoclave); } /** * Get first vowel from string */ private function getFirstVowel(string $str): string { $vowels = ['A', 'E', 'I', 'O', 'U']; $str = strtoupper($str); for ($i = 0; $i < strlen($str); $i++) { if (in_array($str[$i], $vowels)) { return $str[$i]; } } return 'X'; } /** * Get first consonant from string */ private function getFirstConsonant(string $str): string { $vowels = ['A', 'E', 'I', 'O', 'U']; $str = strtoupper($str); for ($i = 0; $i < strlen($str); $i++) { if (!in_array($str[$i], $vowels) && ctype_alpha($str[$i])) { return $str[$i]; } } return 'X'; } }