| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <?php
- namespace App\Http\Controllers;
- use App\Services\ProductService;
- use App\Http\Requests\ProductRequest;
- use App\Http\Requests\ProductStockRequest;
- use Illuminate\Http\Request;
- use PhpOffice\PhpSpreadsheet\IOFactory;
- use App\Http\Resources\ProductResource;
- use Illuminate\Http\JsonResponse;
- class ProductController extends Controller
- {
- public function __construct(
- protected ProductService $service,
- ) {}
- public function select(): JsonResponse
- {
- $items = $this->service->getAllForSelect();
- return $this->successResponse(payload: $items);
- }
- public function index(): JsonResponse
- {
- $items = $this->service->getAll();
- return $this->successResponse(payload: ProductResource::collection($items));
- }
- public function store(ProductRequest $request): JsonResponse
- {
- $item = $this->service->create($request->validated());
- return $this->successResponse(payload: new ProductResource($item), message: __('messages.created'), code: 201);
- }
- public function show(int $id): JsonResponse
- {
- $item = $this->service->findById($id);
- return $this->successResponse(payload: new ProductResource($item));
- }
- public function update(ProductRequest $request, int $id): JsonResponse
- {
- $item = $this->service->update($id, $request->validated());
- return $this->successResponse(payload: new ProductResource($item), message: __('messages.updated'));
- }
- public function destroy(int $id): JsonResponse
- {
- $this->service->delete($id);
- return $this->successResponse(message: __('messages.deleted'), code: 204);
- }
- public function import(Request $request): JsonResponse
- {
- $request->validate(['file' => 'required|file|mimes:xlsx,xls,csv']);
- $spreadsheet = IOFactory::load($request->file('file')->getRealPath());
- $rows = $spreadsheet->getActiveSheet()->toArray();
- if (empty($rows)) {
- return $this->errorResponse('Arquivo vazio.', 422);
- }
- $headers = array_map(fn($h) => mb_strtolower(trim((string) $h)), $rows[0]);
- $colName = null;
- $colQty = null;
- $colPrice = null;
- foreach ($headers as $i => $h) {
- if ($colName === null && str_contains($h, 'descri')) $colName = $i;
- if ($colQty === null && (str_contains($h, 'qtd') || str_contains($h, 'quant'))) $colQty = $i;
- if ($colPrice === null && (str_contains($h, 'pre') || str_contains($h, 'valor'))) $colPrice = $i;
- }
- if ($colName === null || $colQty === null || $colPrice === null) {
- return $this->errorResponse('Colunas não encontradas. O arquivo deve conter: Descrição, Qtd, Preço.', 422);
- }
- $imported = [];
- for ($i = 1; $i < count($rows); $i++) {
- $row = $rows[$i];
- $name = trim((string) ($row[$colName] ?? ''));
- if ($name === '') continue;
- $qty = (int) ($row[$colQty] ?? 0);
- $price = (float) ($row[$colPrice] ?? 0);
- $product = $this->service->importRow($name, $qty, $price);
- $imported[] = new ProductResource($product);
- }
- return $this->successResponse(payload: $imported);
- }
- public function adjustStock(ProductStockRequest $request, int $id): JsonResponse
- {
- $result = $this->service->adjustStock($id, $request->type, $request->quantity);
- if (isset($result['error'])) {
- return $this->errorResponse($result['error'], 422);
- }
- return $this->successResponse(payload: new ProductResource($result['product']), message: __('messages.updated'));
- }
- }
|