New-Thanasoft/thanasoft-back/app/Http/Controllers/Api/GoodsReceiptController.php

160 lines
6.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\StoreGoodsReceiptRequest;
use App\Http\Requests\UpdateGoodsReceiptRequest;
use App\Http\Resources\GoodsReceiptResource;
use App\Models\PurchaseOrder;
use App\Repositories\GoodsReceiptRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
class GoodsReceiptController extends Controller
{
public function __construct(
private readonly GoodsReceiptRepositoryInterface $goodsReceiptRepository
) {
}
/**
* Display a listing of goods receipts.
*/
public function index(): JsonResponse
{
try {
$goodsReceipts = $this->goodsReceiptRepository->all();
return response()->json([
'data' => GoodsReceiptResource::collection($goodsReceipts),
'status' => 'success'
]);
} catch (\Exception $e) {
Log::error('Error fetching goods receipts: ' . $e->getMessage());
return response()->json([
'message' => 'Une erreur est survenue lors de la récupération des réceptions de marchandises.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
/**
* Store a newly created goods receipt.
*/
public function store(StoreGoodsReceiptRequest $request): JsonResponse
{
try {
$payload = $request->validated();
if (empty($payload['lines']) && !empty($payload['purchase_order_id'])) {
$purchaseOrder = PurchaseOrder::query()
->with('lines')
->find($payload['purchase_order_id']);
if ($purchaseOrder) {
$payload['lines'] = $purchaseOrder->lines
->filter(fn($line) => !empty($line->product_id))
->map(fn($line) => [
'product_id' => (int) $line->product_id,
'packaging_id' => null,
'packages_qty_received' => null,
'units_qty_received' => (float) $line->quantity,
'qty_received_base' => (float) $line->quantity,
'unit_price' => (float) $line->unit_price,
'unit_price_per_package' => null,
'tva_rate_id' => null,
])
->values()
->all();
}
}
$goodsReceipt = $this->goodsReceiptRepository->create($payload);
return response()->json([
'data' => new GoodsReceiptResource($goodsReceipt),
'message' => 'Réception de marchandise créée avec succès.',
'status' => 'success'
], 201);
} catch (\Exception $e) {
Log::error('Error creating goods receipt: ' . $e->getMessage());
return response()->json([
'message' => 'Une erreur est survenue lors de la création de la réception de marchandise.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
/**
* Display the specified goods receipt.
*/
public function show(string $id): JsonResponse
{
try {
$goodsReceipt = $this->goodsReceiptRepository->find((int) $id);
if (!$goodsReceipt) {
return response()->json(['message' => 'Réception de marchandise non trouvée.'], 404);
}
return response()->json([
'data' => new GoodsReceiptResource($goodsReceipt),
'status' => 'success'
]);
} catch (\Exception $e) {
Log::error('Error fetching goods receipt: ' . $e->getMessage());
return response()->json([
'message' => 'Une erreur est survenue lors de la récupération de la réception de marchandise.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
/**
* Update the specified goods receipt.
*/
public function update(UpdateGoodsReceiptRequest $request, string $id): JsonResponse
{
try {
$updated = $this->goodsReceiptRepository->update((int) $id, $request->validated());
if (!$updated) {
return response()->json(['message' => 'Réception de marchandise non trouvée ou échec de la mise à jour.'], 404);
}
$goodsReceipt = $this->goodsReceiptRepository->find((int) $id);
return response()->json([
'data' => new GoodsReceiptResource($goodsReceipt),
'message' => 'Réception de marchandise mise à jour avec succès.',
'status' => 'success'
]);
} catch (\Exception $e) {
Log::error('Error updating goods receipt: ' . $e->getMessage());
return response()->json([
'message' => 'Une erreur est survenue lors de la mise à jour de la réception de marchandise.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
/**
* Remove the specified goods receipt.
*/
public function destroy(string $id): JsonResponse
{
try {
$deleted = $this->goodsReceiptRepository->delete((int) $id);
if (!$deleted) {
return response()->json(['message' => 'Réception de marchandise non trouvée ou échec de la suppression.'], 404);
}
return response()->json([
'message' => 'Réception de marchandise supprimée avec succès.',
'status' => 'success'
]);
} catch (\Exception $e) {
Log::error('Error deleting goods receipt: ' . $e->getMessage());
return response()->json([
'message' => 'Une erreur est survenue lors de la suppression de la réception de marchandise.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
}