pdv.backend/app/Http/Controllers/App/InventoryMovementController.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

136 lines
4.0 KiB
PHP

<?php namespace App\Http\Controllers\App;
use App\Http\Controllers\Controller;
use App\Http\Requests\App\InventoryEntryRequest;
use App\Http\Requests\App\InventoryExitRequest;
use App\Http\Requests\App\InventoryTransferRequest;
use App\Models\InventoryMovement;
use App\Services\InventoryMovementService;
use Illuminate\Http\Request;
use Notsoweb\ApiResponse\Enums\ApiResponse;
/**
* Controlador para movimientos de inventario
*
* @author Moisés Cortés C. <moises.cortes@notsoweb.com>
* @version 1.0.0
*/
class InventoryMovementController extends Controller
{
public function __construct(
protected InventoryMovementService $movementService
) {}
/**
* Listar movimientos con filtros
*/
public function index(Request $request)
{
$query = InventoryMovement::with(['inventory', 'warehouseFrom', 'warehouseTo', 'user'])
->orderBy('created_at', 'desc');
if ($request->has('movement_type')) {
$query->where('movement_type', $request->movement_type);
}
if ($request->has('inventory_id')) {
$query->where('inventory_id', $request->inventory_id);
}
if ($request->has('warehouse_id')) {
$query->where(function ($q) use ($request) {
$q->where('warehouse_from_id', $request->warehouse_id)
->orWhere('warehouse_to_id', $request->warehouse_id);
});
}
if ($request->has('from_date')) {
$query->whereDate('created_at', '>=', $request->from_date);
}
if ($request->has('to_date')) {
$query->whereDate('created_at', '<=', $request->to_date);
}
$movements = $query->paginate($request->get('per_page', 15));
return ApiResponse::OK->response(['movements' => $movements]);
}
/**
* Ver detalle de un movimiento
*/
public function show(int $id)
{
$movement = InventoryMovement::with(['inventory', 'warehouseFrom', 'warehouseTo', 'user'])
->find($id);
if (!$movement) {
return ApiResponse::NOT_FOUND->response([
'message' => 'Movimiento no encontrado'
]);
}
return ApiResponse::OK->response([
'movement' => $movement
]);
}
/**
* Registrar entrada de inventario
*/
public function entry(InventoryEntryRequest $request)
{
try {
$movement = $this->movementService->entry($request->validated());
return ApiResponse::CREATED->response([
'message' => 'Entrada registrada correctamente',
'movement' => $movement->load(['inventory', 'warehouseTo']),
]);
} catch (\Exception $e) {
return ApiResponse::BAD_REQUEST->response([
'message' => $e->getMessage()
]);
}
}
/**
* Registrar salida de inventario
*/
public function exit(InventoryExitRequest $request)
{
try {
$movement = $this->movementService->exit($request->validated());
return ApiResponse::CREATED->response([
'message' => 'Salida registrada correctamente',
'movement' => $movement->load(['inventory', 'warehouseFrom']),
]);
} catch (\Exception $e) {
return ApiResponse::BAD_REQUEST->response([
'message' => $e->getMessage()
]);
}
}
/**
* Registrar traspaso entre almacenes
*/
public function transfer(InventoryTransferRequest $request)
{
try {
$movement = $this->movementService->transfer($request->validated());
return ApiResponse::CREATED->response([
'message' => 'Traspaso registrado correctamente',
'movement' => $movement->load(['inventory', 'warehouseFrom', 'warehouseTo']),
]);
} catch (\Exception $e) {
return ApiResponse::BAD_REQUEST->response([
'message' => $e->getMessage()
]);
}
}
}