204 lines
6.5 KiB
PHP
204 lines
6.5 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\InventoryMovementUpdateRequest;
|
|
use App\Http\Requests\App\InventoryTransferRequest;
|
|
use App\Models\InventoryMovement;
|
|
use App\Services\InventoryMovementService;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Notsoweb\ApiResponse\Enums\ApiResponse;
|
|
|
|
/**
|
|
* Controlador para movimientos de inventario
|
|
*/
|
|
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', 'supplier'])
|
|
->orderBy('created_at', 'desc');
|
|
|
|
if ($request->has('q') && $request->q){
|
|
$query->whereHas('inventory', function($qy) use ($request){
|
|
$qy->where('name', 'like', "%{$request->q}%")
|
|
->orWhere('sku', 'like', "%{$request->q}%")
|
|
->orWhere('barcode', $request->q);
|
|
});
|
|
}
|
|
|
|
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', 'supplier', 'serials', 'transferredSerials', 'exitedSerials'])
|
|
->find($id);
|
|
|
|
if (!$movement) {
|
|
return ApiResponse::NOT_FOUND->response([
|
|
'message' => 'Movimiento no encontrado'
|
|
]);
|
|
}
|
|
|
|
return ApiResponse::OK->response([
|
|
'movement' => $movement
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Editar movimiento de inventario
|
|
* Revierte el movimiento original y aplica el nuevo
|
|
*/
|
|
public function update(InventoryMovementUpdateRequest $request, int $id)
|
|
{
|
|
|
|
try {
|
|
$movement = $this->movementService->updateMovement(
|
|
$id,
|
|
$request->validated()
|
|
);
|
|
|
|
return ApiResponse::OK->response([
|
|
'message' => 'Movimiento actualizado correctamente',
|
|
'movement' => $movement,
|
|
]);
|
|
} catch (\Exception $e) {
|
|
return ApiResponse::BAD_REQUEST->response([
|
|
'message' => $e->getMessage()
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Registrar entrada de inventario
|
|
*/
|
|
public function entry(InventoryEntryRequest $request)
|
|
{
|
|
try {
|
|
$validated = $request->validated();
|
|
|
|
if(isset($validated['products'])){
|
|
$movements = $this->movementService->bulkEntry($validated);
|
|
|
|
return ApiResponse::CREATED->response([
|
|
'message' => 'Entrada registrada correctamente',
|
|
'movement' => $movements,
|
|
'total_products' => count($movements),
|
|
]);
|
|
} else {
|
|
$movement = $this->movementService->entry($validated);
|
|
|
|
return ApiResponse::CREATED->response([
|
|
'message' => 'Entrada registrada correctamente',
|
|
'movement' => $movement->load(['inventory', 'warehouseTo', 'supplier']),
|
|
]);
|
|
}
|
|
|
|
} catch (\Exception $e) {
|
|
return ApiResponse::BAD_REQUEST->response([
|
|
'message' => $e->getMessage()
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Registrar salida de inventario
|
|
*/
|
|
public function exit(InventoryExitRequest $request)
|
|
{
|
|
try {
|
|
$validated = $request->validated();
|
|
|
|
if(isset($validated['products'])){
|
|
$movements = $this->movementService->bulkExit($validated);
|
|
|
|
return ApiResponse::CREATED->response([
|
|
'message' => 'Salidas registradas correctamente',
|
|
'movements' => $movements,
|
|
'total_products' => count($movements),
|
|
]);
|
|
} else {
|
|
$movement = $this->movementService->exit($validated);
|
|
|
|
return ApiResponse::CREATED->response([
|
|
'message' => 'Salida registrada correctamente',
|
|
'movement' => $movement->load(['inventory', 'warehouseFrom', 'exitedSerials']),
|
|
]);
|
|
}
|
|
} catch (\Exception $e) {
|
|
return ApiResponse::BAD_REQUEST->response([
|
|
'message' => $e->getMessage()
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Registrar traspaso entre almacenes
|
|
*/
|
|
public function transfer(InventoryTransferRequest $request)
|
|
{
|
|
try {
|
|
$validated = $request->validated();
|
|
|
|
if(isset($validated['products'])){
|
|
$movements = $this->movementService->bulkTransfer($validated);
|
|
|
|
return ApiResponse::CREATED->response([
|
|
'message' => 'Traspasos registrados correctamente',
|
|
'movements' => $movements,
|
|
'total_products' => count($movements),
|
|
]);
|
|
} else {
|
|
$movement = $this->movementService->transfer($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()
|
|
]);
|
|
}
|
|
}
|
|
}
|