nyavokevin 9cbc1bcbdb feat(ui): add price lists and group-based quote flows
Add price list management across the API, store, services, routes,
navigation, and sales views.

Support quotes for either a client or a client group, including PDF
download and nullable client validation for group-based recipients.

Extend client groups to manage assigned clients directly from the form
and detail views, and refresh supplier, intervention, stock, and order
screens with updated interactions and layouts.
2026-04-02 12:07:11 +03:00

155 lines
4.9 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\StorePriceListRequest;
use App\Http\Requests\UpdatePriceListRequest;
use App\Http\Resources\PriceListResource;
use App\Repositories\PriceListRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Illuminate\Support\Facades\Log;
class PriceListController extends Controller
{
public function __construct(
private readonly PriceListRepositoryInterface $priceListRepository
) {
}
/**
* Display a listing of price lists.
*/
public function index(): AnonymousResourceCollection|JsonResponse
{
try {
$priceLists = $this->priceListRepository->all()->sortBy('name')->values();
return PriceListResource::collection($priceLists);
} catch (\Exception $e) {
Log::error('Error fetching price lists: ' . $e->getMessage(), [
'exception' => $e,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la récupération des listes de prix.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
/**
* Store a newly created price list.
*/
public function store(StorePriceListRequest $request): PriceListResource|JsonResponse
{
try {
$priceList = $this->priceListRepository->create($request->validated());
return new PriceListResource($priceList);
} catch (\Exception $e) {
Log::error('Error creating price list: ' . $e->getMessage(), [
'exception' => $e,
'data' => $request->validated(),
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la création de la liste de prix.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
/**
* Display the specified price list.
*/
public function show(string $id): PriceListResource|JsonResponse
{
try {
$priceList = $this->priceListRepository->find($id);
if (! $priceList) {
return response()->json([
'message' => 'Liste de prix non trouvée.',
], 404);
}
return new PriceListResource($priceList);
} catch (\Exception $e) {
Log::error('Error fetching price list: ' . $e->getMessage(), [
'exception' => $e,
'price_list_id' => $id,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la récupération de la liste de prix.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
/**
* Update the specified price list.
*/
public function update(UpdatePriceListRequest $request, string $id): PriceListResource|JsonResponse
{
try {
$updated = $this->priceListRepository->update($id, $request->validated());
if (! $updated) {
return response()->json([
'message' => 'Liste de prix non trouvée ou échec de la mise à jour.',
], 404);
}
$priceList = $this->priceListRepository->find($id);
return new PriceListResource($priceList);
} catch (\Exception $e) {
Log::error('Error updating price list: ' . $e->getMessage(), [
'exception' => $e,
'price_list_id' => $id,
'data' => $request->validated(),
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la mise à jour de la liste de prix.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
/**
* Remove the specified price list.
*/
public function destroy(string $id): JsonResponse
{
try {
$deleted = $this->priceListRepository->delete($id);
if (! $deleted) {
return response()->json([
'message' => 'Liste de prix non trouvée ou échec de la suppression.',
], 404);
}
return response()->json([
'message' => 'Liste de prix supprimée avec succès.',
]);
} catch (\Exception $e) {
Log::error('Error deleting price list: ' . $e->getMessage(), [
'exception' => $e,
'price_list_id' => $id,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la suppression de la liste de prix.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
}