File: /var/www/vhost/disk-apps/qas.sports-crowd.com/app/Http/Controllers/Imports/ClientImport.php
<?php
namespace App\Http\Controllers\Imports;
use App\Core\User\Application\UserService;
use App\Http\Controllers\Controller;
use App\Http\Controllers\UserController;
use App\Module;
use App\Rol;
use DB;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class ClientImport implements ToCollection, WithHeadingRow
{
public $answer = [];
public $edit = [
'creados' => 0,
'existen' => 0,
];
public $is_error;
public $request;
private $__CLIENT_ROL = 4;
private $newUsers = [];
public function collection(Collection $rows)
{
$is_error = false;
DB::beginTransaction();
$cont = 1;
$userController = new UserController();
foreach ($rows as $row) {
$cont++;
if (!$row->filter()->isNotEmpty()) {
continue;
}
if (!isset($row["nombres"]) || !$row["nombres"]) {
$this->answer[] = [
'message' => 'La plantilla de importar clientes en la posición: ' . $cont . ' no tiene información de nombres',
'state' => false,
'line' => $cont
];
$is_error = true;
}
if (!isset($row["apellidos"]) || !$row["apellidos"]) {
$this->answer[] = [
'message' => 'La plantilla de importar clientes en la posición: ' . $cont . ' no tiene información de apellidos',
'state' => false,
'line' => $cont
];
$is_error = true;
}
if (!isset($row["email"]) || !$row["email"]) {
$this->answer[] = [
'message' => 'La plantilla de importar clientes en la posición: ' . $cont . ' no tiene información de email',
'state' => false,
'line' => $cont
];
$is_error = true;
} else if (!$this->validateStructureMail($row["email"])) {
$this->answer[] = [
'message' => 'La plantilla de importar clientes en la posición: ' . $cont . ' no tiene email con un formato válido (ejp: pepitoperez@gmail.com)',
'state' => false,
'line' => $cont
];
$is_error = true;
}
if (!isset($row["documento"]) || !$row["documento"]) {
$this->answer[] = [
'message' => 'La plantilla de importar clientes en la posición: ' . $cont . ' no tiene información de documento',
'state' => false,
'line' => $cont
];
$is_error = true;
}
if (!isset($row["telefono"]) || !$row["telefono"]) {
$this->answer[] = [
'message' => 'La plantilla de importar clientes en la posición: ' . $cont . ' no tiene información de telefono',
'state' => false,
'line' => $cont
];
$is_error = true;
}
if (!isset($row["password"]) || !$row["password"]) {
$password = base64_encode(random_bytes(4));
} else {
$password = $row["password"];
}
$data = [
'first_name' => trim($row['nombres']),
'last_name' => trim($row['apellidos']),
'email' => trim($row["email"]),
'phone' => trim($row["telefono"]),
'password' => $password,
'document' => trim($row["documento"]),
'rol_id' => $this->__CLIENT_ROL
];
$request = new Request($data);
$user = $userController->createClient($request, $is_ticket = false, $validateByDocument = false);
if (!$user || !$user['r']) {
$this->answer[] = [
'message' => 'Error creando cliente en la posición: ' . $cont . ', ' . $user['m'],
'state' => false,
'line' => $cont
];
$is_error = true;
} else if (isset($user['status']) && $user['status'] == 'success') {
$this->edit['creados'] += 1;
$this->newUsers[] = [
'user' => $user['d'],
'password' => $password, // Contraseña sin codificar
];
} else {
if (isset($user['d']) && $user['d']['rol_id'] && $user['d']['rol_id'] != $this->__CLIENT_ROL) {
$this->answer[] = [
'message' => 'Error creando cliente en la posición: ' . $cont . ', ya existe usuario ' . $user['d']['email'] . ' registrado con otro rol: ' . Rol::findOrFail($user['d']['rol_id'])->name,
'state' => false,
'line' => $cont
];
$is_error = true;
}
$this->edit['existen'] += 1;
}
}
if ($is_error || sizeof($rows) <= 0) {
DB::rollback();
return;
} else {
DB::commit();
$userModule = Module::where("route", "clients")->first();
$controller = new Controller;
$controller->registerLog(Auth::user()->id, 'Importar clientes', json_encode($rows), "Update", $userModule->id);
if (config('app.notify_import_user') == 'true' && count($this->newUsers) > 0) {
$userService = new UserService();
$userService->dispatchNewUserProcesses($this->newUsers, 'mails.user.new-client');
}
}
}
function validateStructureMail($mail)
{
$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
return preg_match($pattern, $mail) === 1;
}
}