where('is_active', true); if ($request->has('q') && $request->q) { $products->where(function($query) use ($request) { $query->where('name', 'like', "%{$request->q}%") ->orWhere('sku', 'like', "%{$request->q}%"); }); } $products = $products->orderBy('name') ->paginate(config('app.pagination')); return ApiResponse::OK->response([ 'products' => $products ]); } public function show(Inventory $inventario) { return ApiResponse::OK->response([ 'model' => $inventario->load(['category', 'price']) ]); } public function store(InventoryStoreRequest $request) { $product = $this->productService->createProduct($request->validated()); return ApiResponse::OK->response([ 'model' => $product ]); } public function update(InventoryUpdateRequest $request, Inventory $inventario) { $product = $this->productService->updateProduct($inventario, $request->validated()); return ApiResponse::OK->response([ 'model' => $product ]); } public function destroy(Inventory $inventario) { $inventario->delete(); return ApiResponse::OK->response(); } /** * Importar productos desde Excel */ public function import(InventoryImportRequest $request) { try { $import = new ProductsImport(); Excel::import($import, $request->file('file')); $stats = $import->getStats(); return ApiResponse::OK->response([ 'message' => 'Importación completada exitosamente.', 'imported' => $stats['imported'], 'skipped' => $stats['skipped'], 'errors' => $stats['errors'], ]); } catch (ValidationException $e) { $failures = $e->failures(); $errors = []; foreach ($failures as $failure) { $errors[] = [ 'row' => $failure->row(), 'attribute' => $failure->attribute(), 'errors' => $failure->errors(), 'values' => $failure->values(), ]; } return ApiResponse::BAD_REQUEST->response([ 'message' => 'Error de validación en el archivo.', 'errors' => $errors, ]); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al importar productos: ' . $e->getMessage(), ]); } } /** * Descargar plantilla de Excel para importación */ public function downloadTemplate() { $headers = [ 'nombre', 'sku', 'categoria', 'stock', 'costo', 'precio_venta', 'impuesto' ]; $exampleData = [ [ 'nombre' => 'Producto Ejemplo 1', 'sku' => 'PROD-001', 'categoria' => 'Electrónica', 'stock' => 10, 'costo' => 100.00, 'precio_venta' => 150.00, 'impuesto' => 16 ], [ 'nombre' => 'Producto Ejemplo 2', 'sku' => 'PROD-002', 'categoria' => 'Alimentos', 'stock' => 50, 'costo' => 25.50, 'precio_venta' => 35.00, 'impuesto' => 0 ], ]; return Excel::download( new class($headers, $exampleData) implements FromArray, WithHeadings { use Exportable; public function __construct(private array $headers, private array $data) {} public function array(): array { return $this->data; } public function headings(): array { return $this->headers; } }, 'plantilla_productos.xlsx' ); } }