ProductController.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\ProductRequest;
  4. use App\Http\Requests\ProductStockRequest;
  5. use App\Http\Resources\ProductResource;
  6. use App\Services\ProductService;
  7. use Illuminate\Http\JsonResponse;
  8. use Illuminate\Http\Request;
  9. use PhpOffice\PhpSpreadsheet\IOFactory;
  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. //
  41. public function adjustStock(ProductStockRequest $request, int $id): JsonResponse
  42. {
  43. $result = $this->service->adjustStock($id, $request->type, $request->quantity);
  44. if (isset($result['error'])) {
  45. return $this->errorResponse($result['error'], 422);
  46. }
  47. return $this->successResponse(payload: new ProductResource($result['product']), message: __('messages.updated'));
  48. }
  49. public function import(Request $request): JsonResponse
  50. {
  51. $request->validate(['file' => 'required|file|mimes:xlsx,xls,csv']);
  52. $spreadsheet = IOFactory::load($request->file('file')->getRealPath());
  53. $rows = $spreadsheet->getActiveSheet()->toArray();
  54. if (empty($rows)) {
  55. return $this->errorResponse('Arquivo vazio.', 422);
  56. }
  57. $headers = array_map(fn($h) => mb_strtolower(trim((string) $h)), $rows[0]);
  58. $colName = null;
  59. $colQty = null;
  60. $colPrice = null;
  61. foreach ($headers as $i => $h) {
  62. if ($colName === null && str_contains($h, 'descri')) $colName = $i;
  63. if ($colQty === null && (str_contains($h, 'qtd') || str_contains($h, 'quant'))) $colQty = $i;
  64. if ($colPrice === null && (str_contains($h, 'pre') || str_contains($h, 'valor'))) $colPrice = $i;
  65. }
  66. if ($colName === null || $colQty === null || $colPrice === null) {
  67. return $this->errorResponse('Colunas não encontradas. O arquivo deve conter: Descrição, Qtd, Preço.', 422);
  68. }
  69. $imported = [];
  70. for ($i = 1; $i < count($rows); $i++) {
  71. $row = $rows[$i];
  72. $name = trim((string) ($row[$colName] ?? ''));
  73. if ($name === '') continue;
  74. $qty = (int) ($row[$colQty] ?? 0);
  75. $price = (float) ($row[$colPrice] ?? 0);
  76. $product = $this->service->importRow($name, $qty, $price);
  77. $imported[] = new ProductResource($product);
  78. }
  79. return $this->successResponse(payload: $imported);
  80. }
  81. }