2025-03-07 00:29:07 -06:00

284 lines
11 KiB
PHP

<?php
namespace Koneko\VuexyAdmin\Livewire\Users;
use App\Models\User;
use App\Models\Catalog\DropdownList;
use Koneko\SatCatalogs\Models\UsoCfdi;
use Koneko\SatCatalogs\Models\RegimenFiscal;
use Intervention\Image\ImageManager;
use Livewire\WithFileUploads;
use Livewire\Component;
class UserShow extends Component
{
use WithFileUploads;
public $image;
public User $user;
public $status_options, $pricelists_options;
public $regimen_fiscal_options, $uso_cfdi_options;
public $userId,
$name,
$cargo,
$profile_photo,
$profile_photo_path,
$email,
$password,
$password_confirmation,
$tipo_persona,
$rfc,
$nombre_fiscal,
$c_regimen_fiscal,
$domicilio_fiscal,
$c_uso_cfdi,
$pricelist_id,
$enable_credit,
$credit_days,
$credit_limit,
$is_prospect,
$is_customer,
$is_provider,
$is_user,
$status;
public $deleteUserImage;
public $cuentaUsuarioAlert,
$accesosAlert,
$facturacionElectronicaAlert;
// Reglas de validación para la cuenta de usuario
protected $rulesUser = [
'tipo_persona' => 'nullable|integer',
'name' => 'required|string|min:3|max:255',
'cargo' => 'nullable|string|min:3|max:255',
'is_prospect' => 'nullable|boolean',
'is_customer' => 'nullable|boolean',
'is_provider' => 'nullable|boolean',
'is_user' => 'nullable|boolean',
'pricelist_id' => 'nullable|integer',
'enable_credit' => 'nullable|boolean',
'credit_days' => 'nullable|integer',
'credit_limit' => 'nullable|numeric|min:0|max:9999999.99|regex:/^\d{1,7}(\.\d{1,2})?$/',
'image' => 'nullable|mimes:jpg,png|image|max:20480', // 20MB Max
];
// Reglas de validación para los campos fiscales
protected $rulesFacturacion = [
'rfc' => 'nullable|string|max:13',
'domicilio_fiscal' => [
'nullable',
'regex:/^[0-9]{5}$/',
'exists:sat_codigo_postal,c_codigo_postal'
],
'nombre_fiscal' => 'nullable|string|max:255',
'c_regimen_fiscal' => 'nullable|integer',
'c_uso_cfdi' => 'nullable|string',
];
public function mount($userId)
{
$this->user = User::findOrFail($userId);
$this->reloadUserData();
$this->pricelists_options = DropdownList::selectList(DropdownList::POS_PRICELIST);
$this->status_options = [
User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED],
User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED],
];
$this->regimen_fiscal_options = RegimenFiscal::selectList();
$this->uso_cfdi_options = UsoCfdi::selectList();
}
public function reloadUserData()
{
$this->tipo_persona = $this->user->tipo_persona;
$this->name = $this->user->name;
$this->cargo = $this->user->cargo;
$this->is_prospect = $this->user->is_prospect? true : false;
$this->is_customer = $this->user->is_customer? true : false;
$this->is_provider = $this->user->is_provider? true : false;
$this->is_user = $this->user->is_user? true : false;
$this->pricelist_id = $this->user->pricelist_id;
$this->enable_credit = $this->user->enable_credit? true : false;
$this->credit_days = $this->user->credit_days;
$this->credit_limit = $this->user->credit_limit;
$this->profile_photo = $this->user->profile_photo_url;
$this->profile_photo_path = $this->user->profile_photo_path;
$this->image = null;
$this->deleteUserImage = false;
$this->status = $this->user->status;
$this->email = $this->user->email;
$this->password = null;
$this->password_confirmation = null;
$this->rfc = $this->user->rfc;
$this->domicilio_fiscal = $this->user->domicilio_fiscal;
$this->nombre_fiscal = $this->user->nombre_fiscal;
$this->c_regimen_fiscal = $this->user->c_regimen_fiscal;
$this->c_uso_cfdi = $this->user->c_uso_cfdi;
$this->cuentaUsuarioAlert = null;
$this->accesosAlert = null;
$this->facturacionElectronicaAlert = null;
}
public function saveCuentaUsuario()
{
try {
// Validar Información de usuario
$validatedData = $this->validate($this->rulesUser);
$validatedData['name'] = trim($validatedData['name']);
$validatedData['cargo'] = $validatedData['cargo']? trim($validatedData['cargo']): null;
$validatedData['is_prospect'] = $validatedData['is_prospect'] ? 1 : 0;
$validatedData['is_customer'] = $validatedData['is_customer'] ? 1 : 0;
$validatedData['is_provider'] = $validatedData['is_provider'] ? 1 : 0;
$validatedData['is_user'] = $validatedData['is_user'] ? 1 : 0;
$validatedData['pricelist_id'] = $validatedData['pricelist_id'] ?: null;
$validatedData['enable_credit'] = $validatedData['enable_credit'] ? 1 : 0;
$validatedData['credit_days'] = $validatedData['credit_days'] ?: null;
$validatedData['credit_limit'] = $validatedData['credit_limit'] ?: null;
if($this->tipo_persona == User::TIPO_RFC_PUBLICO){
$validatedData['cargo'] = null;
$validatedData['is_prospect'] = null;
$validatedData['is_provider'] = null;
$validatedData['is_user'] = null;
$validatedData['enable_credit'] = null;
$validatedData['credit_days'] = null;
$validatedData['credit_limit'] = null;
}
if(!$this->user->is_prospect && !$this->user->is_customer){
$validatedData['pricelist_id'] = null;
}
if(!$this->user->is_customer){
$validatedData['enable_credit'] = null;
$validatedData['credit_days'] = null;
$validatedData['credit_limit'] = null;
}
$this->user->update($validatedData);
if($this->deleteUserImage && $this->user->profile_photo_path){
$this->user->deleteProfilePhoto();
// Reiniciar variables después de la eliminación
$this->deleteUserImage = false;
$this->profile_photo_path = null;
$this->profile_photo = $this->user->profile_photo_url;
}else if ($this->image) {
$image = ImageManager::imagick()->read($this->image->getRealPath());
$image = $image->scale(520, 520);
$imageName = $this->image->hashName(); // Genera un nombre único
$image->save(storage_path('app/public/profile-photos/' . $imageName));
$this->user->deleteProfilePhoto();
$this->profile_photo_path = $this->user->profile_photo_path = 'profile-photos/' . $imageName;
$this->profile_photo = $this->user->profile_photo_url;
$this->user->save();
unlink($this->image->getRealPath());
$this->reset('image');
}
// Puedes también devolver un mensaje de éxito si lo deseas
$this->setAlert('Se guardó los cambios exitosamente.', 'cuentaUsuarioAlert');
} catch (\Illuminate\Validation\ValidationException $e) {
// Si hay errores de validación, los puedes capturar y manejar aquí
$this->setAlert('Ocurrieron errores en la validación: ' . $e->validator->errors()->first(), 'cuentaUsuarioAlert', 'danger');
}
}
public function saveAccesos()
{
try {
$validatedData = $this->validate([
'status' => 'integer',
'email' => ['required', 'email', 'unique:users,email,' . $this->user->id],
'password' => ['nullable', 'string', 'min:6', 'max:32', 'confirmed'], // La regla 'confirmed' valida que ambas contraseñas coincidan
], [
'email.required' => 'El correo electrónico es obligatorio.',
'email.email' => 'Debes ingresar un correo electrónico válido.',
'email.unique' => 'Este correo ya está en uso.',
'password.min' => 'La contraseña debe tener al menos 5 caracteres.',
'password.max' => 'La contraseña no puede tener más de 32 caracteres.',
'password.confirmed' => 'Las contraseñas no coinciden.',
]);
// Si la validación es exitosa, continuar con el procesamiento
$validatedData['email'] = trim($this->email);
if ($this->password)
$validatedData['password'] = bcrypt($this->password);
else
unset($validatedData['password']);
$this->user->update($validatedData);
$this->password = null;
$this->password_confirmation = null;
// Puedes también devolver un mensaje de éxito si lo deseas
$this->setAlert('Se guardó los cambios exitosamente.', 'accesosAlert');
} catch (\Illuminate\Validation\ValidationException $e) {
// Si hay errores de validación, los puedes capturar y manejar aquí
$this->setAlert('Ocurrieron errores en la validación: ' . $e->validator->errors()->first(), 'accesosAlert', 'danger');
}
}
public function saveFacturacionElectronica()
{
try {
// Validar Información fiscal
$validatedData = $this->validate($this->rulesFacturacion);
$validatedData['rfc'] = strtoupper(trim($validatedData['rfc'])) ?: null;
$validatedData['domicilio_fiscal'] = $validatedData['domicilio_fiscal'] ?: null;
$validatedData['nombre_fiscal'] = strtoupper(trim($validatedData['nombre_fiscal'])) ?: null;
$validatedData['c_regimen_fiscal'] = $validatedData['c_regimen_fiscal'] ?: null;
$validatedData['c_uso_cfdi'] = $validatedData['c_uso_cfdi'] ?: null;
$this->user->update($validatedData);
// Puedes también devolver un mensaje de éxito si lo deseas
$this->setAlert('Se guardó los cambios exitosamente.', 'facturacionElectronicaAlert');
} catch (\Illuminate\Validation\ValidationException $e) {
// Si hay errores de validación, los puedes capturar y manejar aquí
$this->setAlert('Ocurrieron errores en la validación: ' . $e->validator->errors()->first(), 'facturacionElectronicaAlert', 'danger');
}
}
private function setAlert($message, $alertName, $type = 'success')
{
$this->$alertName = [
'message' => $message,
'type' => $type
];
}
public function render()
{
return view('livewire.admin.crm.contact-view');
}
}