pdv.backend/app/Http/Controllers/App/WarehouseController.php
Juan Felipe Zapata Moreno 5a646d84d5 Refactorizar gestión de inventario a sistema multi-almacén
- Migrar manejo de stock de  a .
- Implementar  para centralizar lógica de entradas, salidas y transferencias.
- Añadir  (CRUD) y Requests de validación.
- Actualizar reportes, cálculos de valor y migraciones para la nueva estructura.
- Agregar campo  para rastreo de movimientos.
2026-02-05 23:59:35 -06:00

131 lines
3.3 KiB
PHP

<?php
namespace App\Http\Controllers\App;
use App\Http\Controllers\Controller;
use App\Http\Requests\App\WarehouseStoreRequest;
use App\Http\Requests\App\WarehouseUpdateRequest;
use App\Models\Warehouse;
use Illuminate\Http\Request;
use Notsoweb\ApiResponse\Enums\ApiResponse;
/**
* Controlador para gestión de almacenes
*/
class WarehouseController extends Controller
{
/**
* Listar almacenes
*/
public function index(Request $request)
{
$warehouse = Warehouse::query();
if ($request->has('active')) {
$warehouse->where('is_active', $request->boolean('active'));
}
if ($request->has('q') && $request->q) {
$warehouse->where(function($query) use ($request) {
$query->where('name', 'like', "%{$request->q}%")
->orWhere('code', 'like', "%{$request->q}%");
});
}
$warehouse->orderBy('id', 'ASC');
$warehouses = $request->boolean('all')
? $warehouse->get()
: $warehouse->paginate(config('app.pagination'));
return ApiResponse::OK->response([
'warehouses' => $warehouses,
]);
}
/**
* Ver detalle de un almacén con su inventario
*/
public function show(int $id)
{
$warehouse = Warehouse::find($id);
if (!$warehouse) {
return ApiResponse::NOT_FOUND->response([
'message' => 'Almacén no encontrado'
]);
}
$inventories = $warehouse->inventories()
->wherePivot('stock', '>', 0)
->paginate(config('app.pagination'));
return ApiResponse::OK->response([
'warehouse' => $warehouse,
'inventories' => $inventories,
]);
}
/**
* Crear almacén
*/
public function store(WarehouseStoreRequest $request)
{
$warehouse = Warehouse::create($request->validated());
return ApiResponse::CREATED->response([
'message' => 'Almacén creado correctamente',
'warehouse' => $warehouse,
]);
}
/**
* Actualizar almacén
*/
public function update(WarehouseUpdateRequest $request, int $id)
{
$warehouse = Warehouse::find($id);
if (!$warehouse) {
return ApiResponse::NOT_FOUND->response([
'message' => 'Almacén no encontrado'
]);
}
$warehouse->update($request->validated());
return ApiResponse::OK->response([
'message' => 'Almacén actualizado correctamente',
'warehouse' => $warehouse,
]);
}
/**
* Eliminar almacén
*/
public function destroy(int $id)
{
$warehouse = Warehouse::find($id);
if (!$warehouse) {
return ApiResponse::NOT_FOUND->response([
'message' => 'Almacén no encontrado'
]);
}
// Verificar si tiene stock
$hasStock = $warehouse->inventories()->wherePivot('stock', '>', 0)->exists();
if ($hasStock) {
return ApiResponse::BAD_REQUEST->response([
'message' => 'No se puede eliminar un almacén con stock'
]);
}
$warehouse->delete();
return ApiResponse::OK->response([
'message' => 'Almacén eliminado correctamente'
]);
}
}