161 lines
4.9 KiB
PHP
161 lines
4.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Requests\Repuve\BoxStoreRequest;
|
|
use App\Http\Requests\Repuve\BoxUpdateRequest;
|
|
use App\Models\Box;
|
|
use App\Models\Package;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Notsoweb\ApiResponse\Enums\ApiResponse;
|
|
|
|
class BoxController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
try {
|
|
$boxes = Box::with(['package:id,lot,description'])->withCount('tags')->orderBy('id', 'ASC');
|
|
|
|
if ($request->filled('package')) {
|
|
$boxes->where('package_id', $request->input('package'));
|
|
}
|
|
|
|
if ($request->filled('box_number')) {
|
|
$boxes->where('box_number', 'LIKE', '%' . $request->box_number . '%');
|
|
}
|
|
|
|
if ($request->filled('lote')) {
|
|
$boxes->whereHas('package', function ($query) use ($request) {
|
|
$query->where('lot', 'LIKE', '%' . $request->lot . '%');
|
|
});
|
|
}
|
|
|
|
return ApiResponse::OK->response([
|
|
'boxes' => $boxes->paginate(config('app.pagination'))
|
|
]);
|
|
} catch (\Exception $e) {
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al obtener las cajas',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function store(BoxStoreRequest $request)
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
|
|
$box = Box::create([
|
|
'box_number' => $request->input('box_number'),
|
|
'package_id' => $request->input('package_id'),
|
|
'starting_page' => $request->input('starting_page'),
|
|
'ending_page' => $request->input('ending_page'),
|
|
]);
|
|
|
|
$package = Package::find($request->input('package_id'));
|
|
if ($package) {
|
|
$package->increment('total_boxes');
|
|
}
|
|
|
|
DB::commit();
|
|
|
|
return ApiResponse::CREATED->response([
|
|
'message' => 'Caja creada exitosamente',
|
|
'box' => $box,
|
|
]);
|
|
} catch (\Exception $e) {
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al crear la caja',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function show($id)
|
|
{
|
|
try {
|
|
$box = Box::with(['package:id,lot,description,total_boxes', 'tags' => function ($query) {
|
|
$query->with(['status:id,name', 'module:id,name'])
|
|
->orderBy('folio', 'ASC');
|
|
}])->withCount('tags')->findOrFail($id);
|
|
|
|
return ApiResponse::OK->response([
|
|
'box' => $box
|
|
]);
|
|
} catch (\Exception $e) {
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al obtener la caja',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function update(BoxUpdateRequest $request, $id)
|
|
{
|
|
try {
|
|
$box = Box::findOrFail($id);
|
|
|
|
DB::beginTransaction();
|
|
|
|
$oldPackageId = $box->package_id;
|
|
$newPackageId = $request->input('package_id');
|
|
|
|
$box->update($request->validated());
|
|
|
|
if ($oldPackageId != $newPackageId) {
|
|
Package::find($oldPackageId)?->decrement('total_boxes');
|
|
Package::find($newPackageId)?->increment('total_boxes');
|
|
}
|
|
|
|
DB::commit();
|
|
|
|
return ApiResponse::OK->response([
|
|
'message' => 'Caja actualizada exitosamente',
|
|
'box' => $box,
|
|
]);
|
|
} catch (\Exception $e) {
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al actualizar la caja',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
|
|
$box = Box::findOrFail($id);
|
|
|
|
// Verificar si tiene tags antes de eliminar
|
|
if ($box->tags()->count() > 0) {
|
|
return ApiResponse::BAD_REQUEST->response([
|
|
'message' => 'No se puede eliminar la caja porque tiene tags asociados.',
|
|
'tags_count' => $box->tags()->count(),
|
|
]);
|
|
}
|
|
|
|
$packageId = $box->package_id;
|
|
$box->delete();
|
|
|
|
// Decrementar el contador de cajas del paquete
|
|
Package::find($packageId)?->decrement('total_boxes');
|
|
|
|
DB::commit();
|
|
|
|
return ApiResponse::OK->response([
|
|
'message' => 'Caja eliminada exitosamente.',
|
|
]);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al eliminar la caja.',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
}
|