inti project

This commit is contained in:
root
2026-05-29 04:33:03 -04:00
commit cdeab1796f
699 changed files with 20516 additions and 0 deletions
@@ -0,0 +1,22 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Attendance;
use App\Domain\SchoolCore\Attendance\Contracts\ScannerServiceContract;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Http\Requests\Attendance\ProcessScanRequest;
use App\Http\Resources\V2\Attendance\ScanResultResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class ScanController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly ScannerServiceContract $scanner) {}
public function store(ProcessScanRequest $request): JsonResponse
{
$result = $this->scanner->processScan($this->context->current(), $request->toDTO());
return ApiResponse::success((new ScanResultResource($result))->resolve($request), 'Scan processed.');
}
}
@@ -0,0 +1,29 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2;
use App\Domain\SchoolCore\Context\SchoolContext;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
abstract class BaseApiController extends Controller
{
public function __construct(protected readonly SchoolContextStore $schoolContext) {}
protected function context(): SchoolContext
{
return $this->schoolContext->current();
}
protected function ok(mixed $data = null, ?string $message = null, array $meta = []): JsonResponse
{
return ApiResponse::success($data, $message, $meta);
}
protected function created(mixed $data = null, ?string $message = null, array $meta = []): JsonResponse
{
return ApiResponse::success($data, $message, $meta, 201);
}
}
@@ -0,0 +1,22 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Communication;
use App\Domain\SchoolCore\Communication\Contracts\CommunicationServiceContract;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Http\Requests\Communication\BulkSendMessageRequest;
use App\Http\Resources\V2\Communication\MessageResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class BulkSendController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly CommunicationServiceContract $communication) {}
public function store(BulkSendMessageRequest $request): JsonResponse
{
$result = $this->communication->sendBulkMessage($this->context->current(), $request->toDTO());
return ApiResponse::success((new MessageResource($result))->resolve($request), 'Bulk message accepted.');
}
}
@@ -0,0 +1,22 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Communication;
use App\Domain\SchoolCore\Communication\Contracts\RecipientPreviewServiceContract;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Http\Requests\Communication\RecipientPreviewRequest;
use App\Http\Resources\V2\Communication\RecipientPreviewResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class RecipientPreviewController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly RecipientPreviewServiceContract $previews) {}
public function store(RecipientPreviewRequest $request): JsonResponse
{
$result = $this->previews->preview($this->context->current(), $request->toDTO());
return ApiResponse::success((new RecipientPreviewResource($result))->resolve($request), 'Recipient preview created.', [], 201);
}
}
@@ -0,0 +1,35 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Finance;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Finance\Contracts\PaymentServiceContract;
use App\Http\Requests\Finance\EditPaymentRequest;
use App\Http\Requests\Finance\RecordPaymentRequest;
use App\Http\Resources\V2\Finance\PaymentResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class PaymentController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly PaymentServiceContract $payments) {}
public function store(RecordPaymentRequest $request): JsonResponse
{
$result = $this->payments->recordPayment($this->context->current(), $request->toDTO());
return ApiResponse::success((new PaymentResource($result))->resolve($request), 'Payment recorded.', [], 201);
}
public function update(EditPaymentRequest $request, int $payment): JsonResponse
{
$result = $this->payments->editPayment($this->context->current(), $payment, $request->toDTO());
return ApiResponse::success((new PaymentResource($result))->resolve($request), 'Payment updated.');
}
public function reverse(EditPaymentRequest $request, int $payment): JsonResponse
{
$result = $this->payments->reversePayment($this->context->current(), $payment, (string) $request->validated('edit_reason', 'Reversed through API'));
return ApiResponse::success((new PaymentResource($result))->resolve($request), 'Payment reversed.');
}
}
@@ -0,0 +1,19 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Finance;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Finance\Contracts\FinanceFileServiceContract;
use App\Http\Requests\Finance\DownloadPaymentFileRequest;
use Illuminate\Routing\Controller;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
final class PaymentFileController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly FinanceFileServiceContract $files) {}
public function show(DownloadPaymentFileRequest $request, int $payment): BinaryFileResponse
{
return $this->files->downloadPaymentFile($this->context->current(), $payment, (string) $request->validated('mode', 'download'));
}
}
@@ -0,0 +1,23 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\IslamicSundaySchool;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Reporting\Contracts\ReportRunnerContract;
use App\Domain\SchoolCore\Reporting\DTO\ReportRequestData;
use App\Http\Resources\V2\IslamicSundaySchool\QuranProgressReportResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class QuranProgressController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly ReportRunnerContract $reports) {}
public function index(): JsonResponse
{
$data = new ReportRequestData('islamic.quran_progress', [], null, null, null, null, false, null, null, false, []);
$result = $this->reports->run($this->context->current(), $data);
return ApiResponse::success((new QuranProgressReportResource($result))->resolve(request()));
}
}
@@ -0,0 +1,36 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Reporting;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Reporting\Contracts\ReportRegistryContract;
use App\Domain\SchoolCore\Reporting\Contracts\ReportRunnerContract;
use App\Http\Requests\Reporting\ListReportsRequest;
use App\Http\Requests\Reporting\RunReportRequest;
use App\Http\Resources\V2\Reporting\ReportResultResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class ReportController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly ReportRegistryContract $registry, private readonly ReportRunnerContract $runner) {}
public function index(ListReportsRequest $request): JsonResponse
{
$reports = array_map(fn ($report) => [
'key' => $report->key(),
'name' => $report->name(),
'category' => $report->category()->value,
'visibility' => $report->visibility()->value,
], $this->registry->availableReports($this->context->current()));
return ApiResponse::success($reports);
}
public function run(RunReportRequest $request): JsonResponse
{
$result = $this->runner->run($this->context->current(), $request->toDTO());
return ApiResponse::success((new ReportResultResource($result))->resolve($request));
}
}
@@ -0,0 +1,22 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Reporting;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Reporting\Contracts\ReportExportServiceContract;
use App\Http\Requests\Reporting\ExportReportRequest;
use App\Http\Resources\V2\Reporting\ReportExportResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class ReportExportController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly ReportExportServiceContract $exports) {}
public function store(ExportReportRequest $request): JsonResponse
{
$result = $this->exports->export($this->context->current(), $request->toDTO());
return ApiResponse::success((new ReportExportResource($result))->resolve($request), 'Report export created.');
}
}
@@ -0,0 +1,50 @@
<?php declare(strict_types=1);
namespace App\Http\Controllers\Api\V2\Students;
use App\Domain\SchoolCore\Context\SchoolContextStore;
use App\Domain\SchoolCore\Students\Contracts\StudentReadServiceContract;
use App\Domain\SchoolCore\Students\Contracts\StudentServiceContract;
use App\Http\Requests\Students\CreateStudentRequest;
use App\Http\Requests\Students\StudentSearchRequest;
use App\Http\Requests\Students\StudentStatusTransitionRequest;
use App\Http\Requests\Students\UpdateStudentRequest;
use App\Http\Resources\V2\Students\StudentResource;
use App\Support\Api\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
final class StudentController extends Controller
{
public function __construct(private readonly SchoolContextStore $context, private readonly StudentServiceContract $students, private readonly StudentReadServiceContract $reader) {}
public function index(StudentSearchRequest $request): JsonResponse
{
$result = $this->reader->search($this->context->current(), $request->toDTO());
return ApiResponse::success($result);
}
public function store(CreateStudentRequest $request): JsonResponse
{
$result = $this->students->createStudent($this->context->current(), $request->toDTO());
return ApiResponse::success((new StudentResource($result))->resolve($request), 'Student created.', [], 201);
}
public function show(int $student): JsonResponse
{
$result = $this->students->getStudent($this->context->current(), $student);
return ApiResponse::success((new StudentResource($result))->resolve(request()));
}
public function update(UpdateStudentRequest $request, int $student): JsonResponse
{
$result = $this->students->updateStudent($this->context->current(), $student, $request->toDTO());
return ApiResponse::success((new StudentResource($result))->resolve($request), 'Student updated.');
}
public function transition(StudentStatusTransitionRequest $request, int $student): JsonResponse
{
$result = $this->students->transitionStatus($this->context->current(), $student, $request->toDTO());
return ApiResponse::success((new StudentResource($result))->resolve($request), 'Student status changed.');
}
}