fix: mejorar manejo de excepciones y validaciones en controladores de dispositivos, modulos y paquetes
This commit is contained in:
parent
43269ca04a
commit
de9d801d50
@ -106,6 +106,10 @@ public function show($id)
|
|||||||
return ApiResponse::OK->response([
|
return ApiResponse::OK->response([
|
||||||
'device' => $device,
|
'device' => $device,
|
||||||
]);
|
]);
|
||||||
|
} catch (ModelNotFoundException $e) {
|
||||||
|
return ApiResponse::NOT_FOUND->response([
|
||||||
|
'message' => 'Dispositivo no encontrado.',
|
||||||
|
]);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
return ApiResponse::INTERNAL_ERROR->response([
|
||||||
'message' => 'Error al obtener el dispositivo.',
|
'message' => 'Error al obtener el dispositivo.',
|
||||||
@ -125,16 +129,18 @@ public function update(DeviceUpdateRequest $request, $id)
|
|||||||
// Validar unicidad solo si los valores cambiaron
|
// Validar unicidad solo si los valores cambiaron
|
||||||
if ($request->filled('serie') && $request->serie !== $device->serie) {
|
if ($request->filled('serie') && $request->serie !== $device->serie) {
|
||||||
if (Device::where('serie', $request->serie)->exists()) {
|
if (Device::where('serie', $request->serie)->exists()) {
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
DB::rollBack();
|
||||||
'message' => 'El número de serie ya está en uso.',
|
return ApiResponse::UNPROCESSABLE_CONTENT->response([
|
||||||
|
'serie' => ['El número de serie ya está en uso.'],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->filled('mac_address') && $request->mac_address !== $device->mac_address) {
|
if ($request->filled('mac_address') && $request->mac_address !== $device->mac_address) {
|
||||||
if (Device::where('mac_address', $request->mac_address)->exists()) {
|
if (Device::where('mac_address', $request->mac_address)->exists()) {
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
DB::rollBack();
|
||||||
'message' => 'La dirección MAC ya está registrada.',
|
return ApiResponse::UNPROCESSABLE_CONTENT->response([
|
||||||
|
'mac_address' => ['La dirección MAC ya está registrada.'],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -187,7 +193,12 @@ public function update(DeviceUpdateRequest $request, $id)
|
|||||||
->values(),
|
->values(),
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
} catch (ModelNotFoundException $e) {
|
||||||
|
return ApiResponse::NOT_FOUND->response([
|
||||||
|
'message' => 'Dispositivo no encontrado.',
|
||||||
|
]);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
|
DB::rollBack();
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
return ApiResponse::INTERNAL_ERROR->response([
|
||||||
'message' => 'Error al actualizar el dispositivo.',
|
'message' => 'Error al actualizar el dispositivo.',
|
||||||
'error' => $e->getMessage(),
|
'error' => $e->getMessage(),
|
||||||
@ -208,6 +219,11 @@ public function destroy($id)
|
|||||||
return ApiResponse::OK->response([
|
return ApiResponse::OK->response([
|
||||||
'message' => 'Dispositivo eliminado exitosamente.',
|
'message' => 'Dispositivo eliminado exitosamente.',
|
||||||
]);
|
]);
|
||||||
|
} catch (ModelNotFoundException $e) {
|
||||||
|
DB::rollBack();
|
||||||
|
return ApiResponse::NOT_FOUND->response([
|
||||||
|
'message' => 'Dispositivo no encontrado.',
|
||||||
|
]);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
return ApiResponse::INTERNAL_ERROR->response([
|
||||||
|
|||||||
@ -106,15 +106,19 @@ public function store(ModuleStoreRequest $request)
|
|||||||
public function show($id)
|
public function show($id)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$modules = Module::with([
|
$module = Module::with([
|
||||||
'responsible:id,name,username',
|
'responsible:id,name,username',
|
||||||
'municipality:id,code,name',
|
'municipality:id,code,name',
|
||||||
'users:id,name,paternal,maternal,username,module_id',
|
'users:id,name,paternal,maternal,username,module_id',
|
||||||
'users.roles:id,name,description'
|
'users.roles:id,name,description'
|
||||||
])->find($id);
|
])->findOrFail($id);
|
||||||
|
|
||||||
return ApiResponse::OK->response([
|
return ApiResponse::OK->response([
|
||||||
'module' => $modules,
|
'module' => $module,
|
||||||
|
]);
|
||||||
|
} catch (ModelNotFoundException $e) {
|
||||||
|
return ApiResponse::NOT_FOUND->response([
|
||||||
|
'message' => 'Módulo no encontrado.',
|
||||||
]);
|
]);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
return ApiResponse::INTERNAL_ERROR->response([
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||||
use Illuminate\Database\QueryException;
|
use Illuminate\Database\QueryException;
|
||||||
use App\Models\Package;
|
use App\Models\Package;
|
||||||
use App\Models\Tag;
|
use App\Models\Tag;
|
||||||
@ -129,74 +130,50 @@ public function store(PackageStoreRequest $request)
|
|||||||
try {
|
try {
|
||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
|
|
||||||
$package = Package::create([
|
// Verificar folios en el mismo lote antes de crear
|
||||||
'lot' => $request->lot,
|
$packageIds = Package::where('lot', $request->lot)->pluck('id');
|
||||||
'box_number' => $request->box_number,
|
|
||||||
'starting_page' => $request->starting_page,
|
|
||||||
'ending_page' => $request->ending_page,
|
|
||||||
'user_id' => Auth::id(),
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Obtener el status "available" para los tags
|
$conflicting = Tag::whereIn('package_id', $packageIds)
|
||||||
$statusAvailable = CatalogTagStatus::where('code', 'available')->first();
|
->whereRaw('CAST(folio AS UNSIGNED) BETWEEN ? AND ?', [$request->starting_page, $request->ending_page])
|
||||||
|
->pluck('folio');
|
||||||
|
|
||||||
if (!$statusAvailable) {
|
if ($conflicting->isNotEmpty()) {
|
||||||
throw new \Exception('No se encontró el status "Disponible" para los tags');
|
|
||||||
}
|
|
||||||
|
|
||||||
$existingTags = Tag::whereHas('package', function ($query) use ($request) {
|
|
||||||
$query->where('box_number', $request->box_number);
|
|
||||||
})
|
|
||||||
->whereBetween('folio', [$request->starting_page, $request->ending_page])
|
|
||||||
->get(['folio', 'package_id']);
|
|
||||||
|
|
||||||
if ($existingTags->isNotEmpty()) {
|
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
return ApiResponse::BAD_REQUEST->response([
|
return ApiResponse::UNPROCESSABLE_CONTENT->response([
|
||||||
'message' => 'Ya existen tags en esta caja con folios en el rango especificado.',
|
'starting_page' => [
|
||||||
'box_number' => $request->box_number,
|
'Los folios ' . $conflicting->join(', ') . ' ya están registrados en el lote "' . $request->lot . '".',
|
||||||
'starting_page' => $request->starting_page,
|
],
|
||||||
'ending_page' => $request->ending_page,
|
|
||||||
'folios_conflictivos' => $existingTags->pluck('folio')->toArray(),
|
|
||||||
'total_folios_conflictivos' => $existingTags->count(),
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Crear los tags según el rango de páginas
|
$form = $request->validated();
|
||||||
|
$form['user_id'] = Auth::id();
|
||||||
|
|
||||||
|
$package = Package::create($form);
|
||||||
|
|
||||||
|
$statusAvailable = CatalogTagStatus::where('code', 'available')->firstOrFail();
|
||||||
|
|
||||||
for ($page = $request->starting_page; $page <= $request->ending_page; $page++) {
|
for ($page = $request->starting_page; $page <= $request->ending_page; $page++) {
|
||||||
Tag::create([
|
Tag::create([
|
||||||
'folio' => $page,
|
'folio' => $page,
|
||||||
'tag_number' => null,
|
'tag_number' => null,
|
||||||
'package_id' => $package->id,
|
'package_id' => $package->id,
|
||||||
'status_id' => $statusAvailable->id,
|
'status_id' => $statusAvailable->id,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
DB::commit();
|
DB::commit();
|
||||||
|
|
||||||
return ApiResponse::CREATED->response([
|
return ApiResponse::CREATED->response([
|
||||||
'message' => 'Paquete registrado exitosamente con sus tags',
|
'message' => 'Paquete registrado exitosamente con sus tags',
|
||||||
'package' => $package->load('tags'),
|
'package' => $package->load('tags'),
|
||||||
'tags_created' => $package->tags()->count(),
|
'tags_created' => $package->tags()->count(),
|
||||||
]);
|
]);
|
||||||
} catch (QueryException $e) {
|
|
||||||
DB::rollBack();
|
|
||||||
|
|
||||||
if ($e->getCode() == 23000 && str_contains($e->getMessage(), 'packages_lot_box_unique')) {
|
|
||||||
return ApiResponse::BAD_REQUEST->response([
|
|
||||||
'message' => "Ya existe un paquete con el lote '{$request->lot}' y caja número '{$request->box_number}'.",
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
|
||||||
'message' => 'Error al crear el paquete',
|
|
||||||
'error' => $e->getMessage(),
|
|
||||||
]);
|
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
return ApiResponse::INTERNAL_ERROR->response([
|
||||||
'message' => 'Error al crear el paquete',
|
'message' => 'Error al crear el paquete',
|
||||||
'error' => $e->getMessage(),
|
'error' => $e->getMessage(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -209,6 +186,10 @@ public function show($id)
|
|||||||
return ApiResponse::OK->response([
|
return ApiResponse::OK->response([
|
||||||
'package' => $package,
|
'package' => $package,
|
||||||
]);
|
]);
|
||||||
|
} catch (ModelNotFoundException $e) {
|
||||||
|
return ApiResponse::NOT_FOUND->response([
|
||||||
|
'message' => 'Paquete no encontrado.',
|
||||||
|
]);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
return ApiResponse::INTERNAL_ERROR->response([
|
||||||
'message' => 'Error al obtener el paquete',
|
'message' => 'Error al obtener el paquete',
|
||||||
@ -322,13 +303,13 @@ public function update(PackageUpdateRequest $request, $id)
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
return ApiResponse::NOT_FOUND->response([
|
||||||
'message' => 'Error de base de datos al actualizar el paquete',
|
'message' => 'Error de base de datos al actualizar el paquete',
|
||||||
'error' => $e->getMessage(),
|
'error' => $e->getMessage(),
|
||||||
]);
|
]);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
return ApiResponse::INTERNAL_ERROR->response([
|
return ApiResponse::NOT_FOUND->response([
|
||||||
'message' => 'Error al actualizar el paquete',
|
'message' => 'Error al actualizar el paquete',
|
||||||
'error' => $e->getMessage(),
|
'error' => $e->getMessage(),
|
||||||
]);
|
]);
|
||||||
@ -407,7 +388,7 @@ public function getBoxTags(Request $request)
|
|||||||
// Obtener tags con paginación
|
// Obtener tags con paginación
|
||||||
$tags = Tag::with(['status:id,code,name', 'vehicle:id,placa,niv', 'module:id,name', 'cancellationLogs.cancellationReason'])
|
$tags = Tag::with(['status:id,code,name', 'vehicle:id,placa,niv', 'module:id,name', 'cancellationLogs.cancellationReason'])
|
||||||
->where('package_id', $package->id)
|
->where('package_id', $package->id)
|
||||||
->orderBy('folio', 'ASC');
|
->orderBy('id', 'ASC');
|
||||||
|
|
||||||
// Filtro adicional por status si se proporciona
|
// Filtro adicional por status si se proporciona
|
||||||
if ($request->filled('status')) {
|
if ($request->filled('status')) {
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
<?php namespace App\Http\Requests\Repuve;
|
<?php namespace App\Http\Requests\Repuve;
|
||||||
|
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
class PackageStoreRequest extends FormRequest
|
class PackageStoreRequest extends FormRequest
|
||||||
{
|
{
|
||||||
@ -12,7 +13,7 @@ public function authorize(): bool
|
|||||||
public function rules(): array
|
public function rules(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'lot' => ['required', 'string'],
|
'lot' => ['required', 'string', Rule::unique('packages', 'lot')->where(fn($q) => $q->where('box_number', $this->input('box_number')))],
|
||||||
'box_number' => ['required', 'integer'],
|
'box_number' => ['required', 'integer'],
|
||||||
'starting_page' => ['required', 'integer', 'min:1'],
|
'starting_page' => ['required', 'integer', 'min:1'],
|
||||||
'ending_page' => ['required', 'integer', 'min:1', 'gte:starting_page'],
|
'ending_page' => ['required', 'integer', 'min:1', 'gte:starting_page'],
|
||||||
@ -23,6 +24,7 @@ public function messages(): array
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'lot.required' => 'El lote es requerido',
|
'lot.required' => 'El lote es requerido',
|
||||||
|
'lot.unique' => 'Ya existe un paquete con ese lote y número de caja.',
|
||||||
|
|
||||||
'box_number.required' => 'El número de caja es requerido',
|
'box_number.required' => 'El número de caja es requerido',
|
||||||
|
|
||||||
|
|||||||
@ -151,14 +151,18 @@
|
|||||||
'attributes' => [
|
'attributes' => [
|
||||||
'barcode' => 'código de barras',
|
'barcode' => 'código de barras',
|
||||||
'section.number' => 'sección',
|
'section.number' => 'sección',
|
||||||
'name' => 'nombre',
|
'name' => 'nombre',
|
||||||
'paternal' => 'apellido paterno',
|
'paternal' => 'apellido paterno',
|
||||||
'maternal' => 'apellido materno',
|
'maternal' => 'apellido materno',
|
||||||
'email' => 'correo',
|
'email' => 'correo',
|
||||||
'phone' => 'teléfono',
|
'phone' => 'teléfono',
|
||||||
|
'box_number' => 'número de caja',
|
||||||
|
'lot' => 'lote',
|
||||||
|
'starting_page' => 'página inicial',
|
||||||
|
'ending_page' => 'página final',
|
||||||
'type_ck' => 'tipo',
|
'type_ck' => 'tipo',
|
||||||
'*.name' => 'nombre',
|
'*.name' => 'nombre',
|
||||||
'*.paternal' => 'apellido paterno',
|
'*.paternal' => 'apellido paterno',
|
||||||
'*.maternal' => 'apellido materno',
|
'*.maternal' => 'apellido materno',
|
||||||
'*.email' => 'correo',
|
'*.email' => 'correo',
|
||||||
'*.phone' => 'teléfono',
|
'*.phone' => 'teléfono',
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user