ProductController.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Services\ProductService;
  4. use App\Http\Requests\ProductRequest;
  5. use App\Http\Requests\ProductStockRequest;
  6. use Illuminate\Http\Request;
  7. use PhpOffice\PhpSpreadsheet\IOFactory;
  8. use App\Http\Resources\ProductResource;
  9. use Illuminate\Http\JsonResponse;
  10. class ProductController extends Controller
  11. {
  12. public function __construct(
  13. protected ProductService $service,
  14. ) {}
  15. public function index(): JsonResponse
  16. {
  17. $items = $this->service->getAll();
  18. return $this->successResponse(payload: ProductResource::collection($items));
  19. }
  20. public function store(ProductRequest $request): JsonResponse
  21. {
  22. $item = $this->service->create($request->validated());
  23. return $this->successResponse(payload: new ProductResource($item), message: __('messages.created'), code: 201);
  24. }
  25. public function show(int $id): JsonResponse
  26. {
  27. $item = $this->service->findById($id);
  28. return $this->successResponse(payload: new ProductResource($item));
  29. }
  30. public function update(ProductRequest $request, int $id): JsonResponse
  31. {
  32. $item = $this->service->update($id, $request->validated());
  33. return $this->successResponse(payload: new ProductResource($item), message: __('messages.updated'));
  34. }
  35. public function destroy(int $id): JsonResponse
  36. {
  37. $this->service->delete($id);
  38. return $this->successResponse(message: __('messages.deleted'), code: 204);
  39. }
  40. public function import(Request $request): JsonResponse
  41. {
  42. $request->validate(['file' => 'required|file|mimes:xlsx,xls,csv']);
  43. $spreadsheet = IOFactory::load($request->file('file')->getRealPath());
  44. $rows = $spreadsheet->getActiveSheet()->toArray();
  45. if (empty($rows)) {
  46. return $this->errorResponse('Arquivo vazio.', 422);
  47. }
  48. $headers = array_map(fn($h) => mb_strtolower(trim((string) $h)), $rows[0]);
  49. $colName = null;
  50. $colQty = null;
  51. $colPrice = null;
  52. foreach ($headers as $i => $h) {
  53. if ($colName === null && str_contains($h, 'descri')) $colName = $i;
  54. if ($colQty === null && (str_contains($h, 'qtd') || str_contains($h, 'quant'))) $colQty = $i;
  55. if ($colPrice === null && (str_contains($h, 'pre') || str_contains($h, 'valor'))) $colPrice = $i;
  56. }
  57. if ($colName === null || $colQty === null || $colPrice === null) {
  58. return $this->errorResponse('Colunas não encontradas. O arquivo deve conter: Descrição, Qtd, Preço.', 422);
  59. }
  60. $imported = [];
  61. for ($i = 1; $i < count($rows); $i++) {
  62. $row = $rows[$i];
  63. $name = trim((string) ($row[$colName] ?? ''));
  64. if ($name === '') continue;
  65. $qty = (int) ($row[$colQty] ?? 0);
  66. $price = (float) ($row[$colPrice] ?? 0);
  67. $product = $this->service->importRow($name, $qty, $price);
  68. $imported[] = new ProductResource($product);
  69. }
  70. return $this->successResponse(payload: $imported);
  71. }
  72. public function adjustStock(ProductStockRequest $request, int $id): JsonResponse
  73. {
  74. $result = $this->service->adjustStock($id, $request->type, $request->quantity);
  75. if (isset($result['error'])) {
  76. return $this->errorResponse($result['error'], 422);
  77. }
  78. return $this->successResponse(payload: new ProductResource($result['product']), message: __('messages.updated'));
  79. }
  80. }