117 lines
3.5 KiB
PHP
117 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace Database\Factories;
|
|
|
|
use App\Models\Owner;
|
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
|
|
|
/**
|
|
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Owner>
|
|
*/
|
|
class OwnerFactory extends Factory
|
|
{
|
|
protected $model = Owner::class;
|
|
|
|
/**
|
|
* Define the model's default state.
|
|
*
|
|
* @return array<string, mixed>
|
|
*/
|
|
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';
|
|
}
|
|
}
|