2025-10-21 17:23:54 -06:00

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';
}
}