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(),
]);
}
}
}