add more controllers and fix tests
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\Finance;
|
||||
|
||||
use App\Http\Controllers\Api\BaseApiController;
|
||||
use App\Http\Requests\Fees\FeeRefundRequest;
|
||||
use App\Http\Requests\Fees\FeeTuitionTotalRequest;
|
||||
use App\Http\Resources\Fees\FeeRefundResource;
|
||||
use App\Http\Resources\Fees\FeeTuitionTotalResource;
|
||||
use App\Services\Fees\FeeRefundCalculatorService;
|
||||
use App\Services\Fees\FeeStudentFeeService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
|
||||
class FeeCalculationController extends BaseApiController
|
||||
{
|
||||
public function __construct(
|
||||
private FeeRefundCalculatorService $refunds,
|
||||
private FeeStudentFeeService $tuition
|
||||
) {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function refund(FeeRefundRequest $request): JsonResponse
|
||||
{
|
||||
$payload = $request->validated();
|
||||
$result = $this->refunds->calculateRefund($payload['students'], (int) $payload['parent_id']);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'refund' => new FeeRefundResource($result),
|
||||
]);
|
||||
}
|
||||
|
||||
public function tuitionTotal(FeeTuitionTotalRequest $request): JsonResponse
|
||||
{
|
||||
$payload = $request->validated();
|
||||
$total = $this->tuition->totalTuitionFee($payload['students']);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'tuition' => new FeeTuitionTotalResource([
|
||||
'total_tuition' => $total,
|
||||
]),
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,10 @@ namespace App\Http\Controllers\Api\Finance;
|
||||
|
||||
use App\Http\Controllers\Api\BaseApiController;
|
||||
use App\Http\Requests\Payments\PaymentTransactionCreateRequest;
|
||||
use App\Http\Requests\Payments\PaymentTransactionStatusRequest;
|
||||
use App\Http\Resources\Payments\PaymentTransactionResource;
|
||||
use App\Services\Payments\PaymentTransactionService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class PaymentTransactionController extends BaseApiController
|
||||
{
|
||||
@@ -37,10 +37,29 @@ class PaymentTransactionController extends BaseApiController
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateStatus(PaymentTransactionStatusRequest $request, string $transactionId): JsonResponse
|
||||
public function updateStatus(Request $request, string $transactionId): JsonResponse
|
||||
{
|
||||
$payload = $request->validated();
|
||||
$updated = $this->service->updateStatus($transactionId, $payload['status']);
|
||||
$status = $request->input('status');
|
||||
if ($status === null) {
|
||||
$raw = $request->getContent() ?: '';
|
||||
$json = json_decode($raw, true);
|
||||
if (is_array($json) && array_key_exists('status', $json)) {
|
||||
$status = $json['status'];
|
||||
} else {
|
||||
$parsed = [];
|
||||
parse_str($raw, $parsed);
|
||||
$status = $parsed['status'] ?? null;
|
||||
}
|
||||
}
|
||||
|
||||
if ($status === null || trim((string) $status) === '') {
|
||||
return response()->json([
|
||||
'message' => 'Validation failed.',
|
||||
'errors' => ['status' => ['The status field is required.']],
|
||||
], 422);
|
||||
}
|
||||
|
||||
$updated = $this->service->updateStatus($transactionId, (string) $status);
|
||||
|
||||
if (!$updated) {
|
||||
return response()->json(['ok' => false, 'message' => 'Transaction not found.'], 404);
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\Finance;
|
||||
|
||||
use App\Http\Controllers\Api\BaseApiController;
|
||||
use App\Http\Requests\PurchaseOrders\PurchaseOrderIndexRequest;
|
||||
use App\Http\Requests\PurchaseOrders\PurchaseOrderReceiveRequest;
|
||||
use App\Http\Requests\PurchaseOrders\PurchaseOrderStoreRequest;
|
||||
use App\Http\Resources\PurchaseOrders\PurchaseOrderItemResource;
|
||||
use App\Http\Resources\PurchaseOrders\PurchaseOrderResource;
|
||||
use App\Models\PurchaseOrder;
|
||||
use App\Services\PurchaseOrders\PurchaseOrderCreateService;
|
||||
use App\Services\PurchaseOrders\PurchaseOrderQueryService;
|
||||
use App\Services\PurchaseOrders\PurchaseOrderReceiveService;
|
||||
use App\Services\PurchaseOrders\PurchaseOrderStatusService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use RuntimeException;
|
||||
|
||||
class PurchaseOrderController extends BaseApiController
|
||||
{
|
||||
public function __construct(
|
||||
private PurchaseOrderQueryService $queryService,
|
||||
private PurchaseOrderCreateService $createService,
|
||||
private PurchaseOrderReceiveService $receiveService,
|
||||
private PurchaseOrderStatusService $statusService
|
||||
) {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function index(PurchaseOrderIndexRequest $request): JsonResponse
|
||||
{
|
||||
$payload = $request->validated();
|
||||
$orders = $this->queryService->list($payload['q'] ?? null);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'orders' => PurchaseOrderResource::collection($orders),
|
||||
]);
|
||||
}
|
||||
|
||||
public function options(): JsonResponse
|
||||
{
|
||||
$data = $this->queryService->options();
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'suppliers' => $data['suppliers'] ?? [],
|
||||
'supplies' => $data['supplies'] ?? [],
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(int $id): JsonResponse
|
||||
{
|
||||
$data = $this->queryService->find($id);
|
||||
if (!$data) {
|
||||
return response()->json(['ok' => false, 'message' => 'Purchase order not found.'], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'purchase_order' => new PurchaseOrderResource($data['purchase_order']),
|
||||
'items' => PurchaseOrderItemResource::collection($data['items'] ?? []),
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(PurchaseOrderStoreRequest $request): JsonResponse
|
||||
{
|
||||
$payload = $request->validated();
|
||||
|
||||
try {
|
||||
$po = $this->createService->create($payload);
|
||||
} catch (RuntimeException $e) {
|
||||
return response()->json(['ok' => false, 'message' => $e->getMessage()], 422);
|
||||
} catch (\Throwable $e) {
|
||||
return response()->json(['ok' => false, 'message' => 'Unable to create purchase order.'], 500);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'purchase_order' => new PurchaseOrderResource($po),
|
||||
], 201);
|
||||
}
|
||||
|
||||
public function receive(PurchaseOrderReceiveRequest $request, int $id): JsonResponse
|
||||
{
|
||||
$payload = $request->validated();
|
||||
|
||||
$po = PurchaseOrder::query()->find($id);
|
||||
if (!$po) {
|
||||
return response()->json(['ok' => false, 'message' => 'Purchase order not found.'], 404);
|
||||
}
|
||||
|
||||
$user = auth()->user();
|
||||
$issuedBy = $user ? (string) ($user->email ?? $user->username ?? $user->id) : 'system';
|
||||
|
||||
try {
|
||||
$result = $this->receiveService->receive($id, $payload['items'], $issuedBy);
|
||||
} catch (RuntimeException $e) {
|
||||
return response()->json(['ok' => false, 'message' => $e->getMessage()], 409);
|
||||
} catch (\Throwable $e) {
|
||||
return response()->json(['ok' => false, 'message' => 'Unable to receive items.'], 500);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'status' => $result['status'] ?? null,
|
||||
'completed' => $result['completed'] ?? false,
|
||||
]);
|
||||
}
|
||||
|
||||
public function cancel(int $id): JsonResponse
|
||||
{
|
||||
$po = PurchaseOrder::query()->find($id);
|
||||
if (!$po) {
|
||||
return response()->json(['ok' => false, 'message' => 'Purchase order not found.'], 404);
|
||||
}
|
||||
|
||||
try {
|
||||
$this->statusService->cancel($id);
|
||||
} catch (RuntimeException $e) {
|
||||
return response()->json(['ok' => false, 'message' => $e->getMessage()], 409);
|
||||
} catch (\Throwable $e) {
|
||||
return response()->json(['ok' => false, 'message' => 'Unable to cancel purchase order.'], 500);
|
||||
}
|
||||
|
||||
return response()->json(['ok' => true, 'status' => PurchaseOrder::STATUS_CANCELED]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user