ProductController.php 3.6 KB

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