fix apply the plan docs/alrahma_api_fix_plan_school_year_only_v7
API CI/CD / Validate (composer + pint) (push) Successful in 3m10s
API CI/CD / Test (PHPUnit) (push) Failing after 6m49s
API CI/CD / Build frontend assets (push) Successful in 1m3s
API CI/CD / Security audit (push) Failing after 1m0s
API CI/CD / Deploy to shared hosting (PHP) (push) Has been skipped
API CI/CD / Validate (composer + pint) (push) Successful in 3m10s
API CI/CD / Test (PHPUnit) (push) Failing after 6m49s
API CI/CD / Build frontend assets (push) Successful in 1m3s
API CI/CD / Security audit (push) Failing after 1m0s
API CI/CD / Deploy to shared hosting (PHP) (push) Has been skipped
This commit is contained in:
@@ -9,9 +9,9 @@ use App\Http\Requests\Families\FamilyAdminSearchRequest;
|
||||
use App\Http\Requests\Families\FamilyComposeEmailRequest;
|
||||
use App\Http\Resources\Families\FamilyResource;
|
||||
use App\Http\Resources\Families\FamilySearchItemResource;
|
||||
use App\Models\Configuration;
|
||||
use App\Services\Families\FamilyNotificationService;
|
||||
use App\Services\Families\FamilyQueryService;
|
||||
use App\Services\SchoolYears\SelectedSchoolYearContextService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
@@ -20,7 +20,8 @@ class FamilyAdminController extends BaseApiController
|
||||
{
|
||||
public function __construct(
|
||||
private FamilyQueryService $queryService,
|
||||
private FamilyNotificationService $notificationService
|
||||
private FamilyNotificationService $notificationService,
|
||||
private SelectedSchoolYearContextService $schoolYears
|
||||
) {
|
||||
parent::__construct();
|
||||
}
|
||||
@@ -28,7 +29,7 @@ class FamilyAdminController extends BaseApiController
|
||||
public function index(FamilyAdminIndexRequest $request): JsonResponse
|
||||
{
|
||||
$payload = $request->validated();
|
||||
$schoolYear = $this->requestedSchoolYear($request, $payload);
|
||||
$schoolYear = $this->requestedSchoolYear($request);
|
||||
|
||||
$data = $this->queryService->adminIndexData(
|
||||
$payload['student_id'] ?? null,
|
||||
@@ -63,7 +64,7 @@ class FamilyAdminController extends BaseApiController
|
||||
public function card(FamilyAdminCardRequest $request): JsonResponse
|
||||
{
|
||||
$payload = $request->validated();
|
||||
$schoolYear = $this->requestedSchoolYear($request, $payload);
|
||||
$schoolYear = $this->requestedSchoolYear($request);
|
||||
|
||||
$family = $this->queryService->familyCard(
|
||||
$payload['student_id'] ?? null,
|
||||
@@ -79,24 +80,9 @@ class FamilyAdminController extends BaseApiController
|
||||
return $this->success(new FamilyResource($family));
|
||||
}
|
||||
|
||||
private function requestedSchoolYear($request, array $payload): string
|
||||
private function requestedSchoolYear($request): string
|
||||
{
|
||||
$candidates = [
|
||||
$payload['school_year'] ?? null,
|
||||
$request->query('school_year'),
|
||||
$request->header('X-School-Year'),
|
||||
$request->header('X-Selected-School-Year'),
|
||||
Configuration::getConfig('school_year'),
|
||||
];
|
||||
|
||||
foreach ($candidates as $candidate) {
|
||||
$value = trim((string) ($candidate ?? ''));
|
||||
if ($value !== '') {
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
return $this->schoolYears->fromRequest($request)->name;
|
||||
}
|
||||
|
||||
public function composeEmail(FamilyComposeEmailRequest $request): JsonResponse
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\Family;
|
||||
|
||||
use App\Http\Controllers\Api\Core\BaseApiController;
|
||||
use App\Services\Families\ParentProfileAdminQueryService;
|
||||
use App\Services\SchoolYears\SelectedSchoolYearContextService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class ParentProfileAdminController extends BaseApiController
|
||||
{
|
||||
public function __construct(
|
||||
private ParentProfileAdminQueryService $profiles,
|
||||
private SelectedSchoolYearContextService $schoolYears,
|
||||
) {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
if ($request->has('school_year_id')) {
|
||||
return $this->error('Use school_year by name; school_year_id is not accepted.', Response::HTTP_UNPROCESSABLE_ENTITY);
|
||||
}
|
||||
|
||||
$context = $this->schoolYears->fromRequest($request);
|
||||
$page = $this->profiles->index(
|
||||
$context->name,
|
||||
trim((string) $request->query('q', '')),
|
||||
(int) $request->query('per_page', 25),
|
||||
);
|
||||
|
||||
return $this->success([
|
||||
'school_year' => $context->name,
|
||||
'read_only' => $context->isReadOnly,
|
||||
'parents' => $page->getCollection()
|
||||
->map(fn ($row) => $this->profiles->parentSummary((array) $row, $context->name))
|
||||
->values()
|
||||
->all(),
|
||||
'pagination' => [
|
||||
'page' => $page->currentPage(),
|
||||
'per_page' => $page->perPage(),
|
||||
'total' => $page->total(),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function search(Request $request): JsonResponse
|
||||
{
|
||||
if ($request->has('school_year_id')) {
|
||||
return $this->error('Use school_year by name; school_year_id is not accepted.', Response::HTTP_UNPROCESSABLE_ENTITY);
|
||||
}
|
||||
|
||||
$context = $this->schoolYears->fromRequest($request);
|
||||
|
||||
return $this->success([
|
||||
'school_year' => $context->name,
|
||||
'read_only' => $context->isReadOnly,
|
||||
'items' => $this->profiles->search(
|
||||
$context->name,
|
||||
trim((string) $request->query('q', '')),
|
||||
(int) $request->query('limit', 10),
|
||||
),
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(Request $request, int $parent): JsonResponse
|
||||
{
|
||||
if ($request->has('school_year_id')) {
|
||||
return $this->error('Use school_year by name; school_year_id is not accepted.', Response::HTTP_UNPROCESSABLE_ENTITY);
|
||||
}
|
||||
|
||||
$context = $this->schoolYears->fromRequest($request);
|
||||
$payload = $this->profiles->show($parent, $context->name);
|
||||
|
||||
if (! $payload) {
|
||||
return $this->error('Parent profile not found.', Response::HTTP_NOT_FOUND);
|
||||
}
|
||||
|
||||
return $this->success([
|
||||
'school_year' => $context->name,
|
||||
'read_only' => $context->isReadOnly,
|
||||
...$payload,
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(Request $request, int $parent): JsonResponse
|
||||
{
|
||||
if ($request->has('school_year_id')) {
|
||||
return $this->error('Use school_year by name; school_year_id is not accepted.', Response::HTTP_UNPROCESSABLE_ENTITY);
|
||||
}
|
||||
|
||||
$payload = $request->validate([
|
||||
'firstname' => ['sometimes', 'required', 'string', 'max:100'],
|
||||
'lastname' => ['sometimes', 'required', 'string', 'max:100'],
|
||||
'email' => ['sometimes', 'nullable', 'email', 'max:255'],
|
||||
'cellphone' => ['sometimes', 'nullable', 'string', 'max:30'],
|
||||
'address_street' => ['sometimes', 'nullable', 'string', 'max:255'],
|
||||
'city' => ['sometimes', 'nullable', 'string', 'max:100'],
|
||||
'state' => ['sometimes', 'nullable', 'string', 'max:100'],
|
||||
'zip' => ['sometimes', 'nullable', 'string', 'max:30'],
|
||||
'status' => ['sometimes', 'nullable', 'string', 'max:30'],
|
||||
]);
|
||||
|
||||
$updated = $this->profiles->updateParent($parent, $payload);
|
||||
if (! $updated) {
|
||||
return $this->error('Parent profile not found.', Response::HTTP_NOT_FOUND);
|
||||
}
|
||||
|
||||
return $this->success(['parent' => $updated], 'Parent profile updated.');
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ use App\Http\Requests\SchoolYears\PreviewCloseSchoolYearRequest;
|
||||
use App\Http\Requests\SchoolYears\SaveSchoolYearRequest;
|
||||
use App\Services\SchoolYears\SchoolYearClosureService;
|
||||
use App\Services\SchoolYears\SchoolYearContextService;
|
||||
use App\Services\SchoolYears\SelectedSchoolYearContextService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
@@ -17,7 +18,8 @@ class SchoolYearController extends BaseApiController
|
||||
{
|
||||
public function __construct(
|
||||
private SchoolYearClosureService $service,
|
||||
private SchoolYearContextService $context
|
||||
private SchoolYearContextService $context,
|
||||
private SelectedSchoolYearContextService $selectedSchoolYear
|
||||
) {
|
||||
parent::__construct();
|
||||
}
|
||||
@@ -71,11 +73,28 @@ class SchoolYearController extends BaseApiController
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateSelected(SaveSchoolYearRequest $request): JsonResponse
|
||||
{
|
||||
$selected = $this->selectedSchoolYear->fromRequest($request);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'data' => $this->service->updateYear($selected->id, $request->validated(), $this->getCurrentUserId()),
|
||||
]);
|
||||
}
|
||||
|
||||
public function summary(int $schoolYear): JsonResponse
|
||||
{
|
||||
return response()->json(['ok' => true, 'data' => $this->service->summary($schoolYear)]);
|
||||
}
|
||||
|
||||
public function summarySelected(Request $request): JsonResponse
|
||||
{
|
||||
$selected = $this->selectedSchoolYear->fromRequest($request);
|
||||
|
||||
return response()->json(['ok' => true, 'data' => $this->service->summaryByYearName($selected->name)]);
|
||||
}
|
||||
|
||||
public function validateClose(PreviewCloseSchoolYearRequest $request, int $schoolYear): JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
@@ -84,6 +103,16 @@ class SchoolYearController extends BaseApiController
|
||||
]);
|
||||
}
|
||||
|
||||
public function validateCloseSelected(PreviewCloseSchoolYearRequest $request): JsonResponse
|
||||
{
|
||||
$selected = $this->selectedSchoolYear->fromRequest($request);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'validation' => $this->service->validateCloseByYearName($selected->name, $request->validated()),
|
||||
]);
|
||||
}
|
||||
|
||||
public function previewClose(PreviewCloseSchoolYearRequest $request, int $schoolYear): JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
@@ -92,6 +121,16 @@ class SchoolYearController extends BaseApiController
|
||||
]);
|
||||
}
|
||||
|
||||
public function previewCloseSelected(PreviewCloseSchoolYearRequest $request): JsonResponse
|
||||
{
|
||||
$selected = $this->selectedSchoolYear->fromRequest($request);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'data' => $this->service->previewCloseByYearName($selected->name, $request->validated()),
|
||||
]);
|
||||
}
|
||||
|
||||
public function close(CloseSchoolYearRequest $request, int $schoolYear): JsonResponse
|
||||
{
|
||||
try {
|
||||
@@ -108,6 +147,24 @@ class SchoolYearController extends BaseApiController
|
||||
return response()->json(['ok' => true, 'data' => $result]);
|
||||
}
|
||||
|
||||
public function closeSelected(CloseSchoolYearRequest $request): JsonResponse
|
||||
{
|
||||
$selected = $this->selectedSchoolYear->fromRequest($request);
|
||||
|
||||
try {
|
||||
$result = $this->service->closeByYearName($selected->name, $request->validated(), $this->getCurrentUserId());
|
||||
} catch (ValidationException $e) {
|
||||
throw $e;
|
||||
} catch (\Throwable $e) {
|
||||
return response()->json([
|
||||
'ok' => false,
|
||||
'message' => $e->getMessage(),
|
||||
], Response::HTTP_CONFLICT);
|
||||
}
|
||||
|
||||
return response()->json(['ok' => true, 'data' => $result]);
|
||||
}
|
||||
|
||||
public function reopen(Request $request, int $schoolYear): JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
@@ -116,6 +173,16 @@ class SchoolYearController extends BaseApiController
|
||||
]);
|
||||
}
|
||||
|
||||
public function reopenSelected(Request $request): JsonResponse
|
||||
{
|
||||
$selected = $this->selectedSchoolYear->fromRequest($request);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'data' => $this->service->reopenByYearName($selected->name, $this->getCurrentUserId()),
|
||||
]);
|
||||
}
|
||||
|
||||
public function parentBalances(Request $request, int $schoolYear): JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
@@ -124,6 +191,16 @@ class SchoolYearController extends BaseApiController
|
||||
]);
|
||||
}
|
||||
|
||||
public function parentBalancesSelected(Request $request): JsonResponse
|
||||
{
|
||||
$selected = $this->selectedSchoolYear->fromRequest($request);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'data' => $this->service->parentBalancesByYearName($selected->name, $request->query('to_school_year')),
|
||||
]);
|
||||
}
|
||||
|
||||
public function promotionPreview(Request $request, int $schoolYear): JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
@@ -132,6 +209,16 @@ class SchoolYearController extends BaseApiController
|
||||
]);
|
||||
}
|
||||
|
||||
public function promotionPreviewSelected(Request $request): JsonResponse
|
||||
{
|
||||
$selected = $this->selectedSchoolYear->fromRequest($request);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'data' => $this->service->promotionPreviewByYearName($selected->name, $request->query('to_school_year')),
|
||||
]);
|
||||
}
|
||||
|
||||
public function closingReport(int $schoolYear): JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
@@ -140,6 +227,16 @@ class SchoolYearController extends BaseApiController
|
||||
]);
|
||||
}
|
||||
|
||||
public function closingReportSelected(Request $request): JsonResponse
|
||||
{
|
||||
$selected = $this->selectedSchoolYear->fromRequest($request);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'data' => $this->service->closingReportByYearName($selected->name),
|
||||
]);
|
||||
}
|
||||
|
||||
public function archive(Request $request, int $schoolYear): JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
@@ -147,4 +244,14 @@ class SchoolYearController extends BaseApiController
|
||||
'data' => $this->service->archive($schoolYear, $this->getCurrentUserId()),
|
||||
]);
|
||||
}
|
||||
|
||||
public function archiveSelected(Request $request): JsonResponse
|
||||
{
|
||||
$selected = $this->selectedSchoolYear->fromRequest($request);
|
||||
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
'data' => $this->service->archiveByYearName($selected->name, $this->getCurrentUserId()),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user