You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.9 KiB
99 lines
3.9 KiB
<?php
|
|
|
|
namespace App\Domains\Admission\Integration\Mappers;
|
|
|
|
use App\Domains\Academic\Models\Term;
|
|
use App\Domains\Admission\Actions\IntakeScheduling\AdjustAdmissionScheduleDuration;
|
|
use App\Domains\Admission\Actions\IntakeScheduling\DefineAdmissionSchedule;
|
|
use App\Domains\Admission\DTOs\IntakeScheduling\AdjustAdmissionScheduleDurationDTO;
|
|
use App\Domains\Admission\DTOs\IntakeScheduling\DefineAdmissionScheduleDTO;
|
|
use App\Domains\Admission\Models\AdmissionSchedule;
|
|
use App\Domains\Admission\Models\AdmissionTrack;
|
|
use App\Domains\System\Support\Integration\DataPayloadMapper;
|
|
use Carbon\CarbonImmutable;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
class AdmissionScheduleDataMapper implements DataPayloadMapper
|
|
{
|
|
private static array $cache = [
|
|
'admission_track' => [],
|
|
'term' => [],
|
|
];
|
|
|
|
public function __construct(
|
|
protected DefineAdmissionSchedule $defineAdmissionSchedule,
|
|
protected AdjustAdmissionScheduleDuration $adjustAdmissionScheduleDuration
|
|
)
|
|
{
|
|
// Inject required Domain and Cross-Domain Actions via constructor composition
|
|
}
|
|
|
|
public function getLookupKey(): array
|
|
{
|
|
// Return the unique string key used to identify existing records (e.g., 'email')
|
|
return ['admission_track_id', 'term_id'];
|
|
}
|
|
|
|
public function transform(array $rawData): array
|
|
{
|
|
// Normalize incoming data array formats into an internal domain-safe layout
|
|
return [
|
|
'date_start' => $rawData['tanggal_buka'],
|
|
'date_end' => $rawData['tanggal_tutup'],
|
|
're_registration_date_start' => $rawData['tanggal_buka_daftar_ulang'],
|
|
're_registration_date_end' => $rawData['tanggal_tutup_daftar_ulang'],
|
|
'admission_track_id' => $this->resolveAdmissionTrackId($rawData['slug']),
|
|
'term_id' => $this->resolveTermId($rawData['angkatan']),
|
|
];
|
|
}
|
|
|
|
public function updateOrCreateDomainState(array $payload, ?Model $existingModel = null): void
|
|
{
|
|
/** @var AdmissionSchedule $admissionSchedule */
|
|
$admissionSchedule = $existingModel;
|
|
if ($admissionSchedule) {
|
|
$this->adjustAdmissionScheduleDuration->execute($admissionSchedule, new AdjustAdmissionScheduleDurationDTO(
|
|
startData: CarbonImmutable::parse($payload['date_start']),
|
|
endData: CarbonImmutable::parse($payload['date_end']),
|
|
reRegisterStartData: CarbonImmutable::parse($payload['re_registration_date_start']),
|
|
reRegisterEndData: CarbonImmutable::parse($payload['re_registration_date_end']),
|
|
));
|
|
} else {
|
|
;
|
|
$this->defineAdmissionSchedule->execute(new DefineAdmissionScheduleDTO(
|
|
startData: CarbonImmutable::parse($payload['date_start']),
|
|
endData: CarbonImmutable::parse($payload['date_end']),
|
|
reRegisterStartData: CarbonImmutable::parse($payload['re_registration_date_start']),
|
|
reRegisterEndData: CarbonImmutable::parse($payload['re_registration_date_end']),
|
|
termId: $payload['term_id'],
|
|
admissionTrackId: $payload['admission_track_id'],
|
|
));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return class-string
|
|
*/
|
|
public function getModelClass(): string
|
|
{
|
|
return AdmissionSchedule::class;
|
|
}
|
|
|
|
private function resolveAdmissionTrackId(string $slug): int {
|
|
if (!isset(self::$cache['admission_track'][$slug])) {
|
|
self::$cache['admission_track'][$slug] = AdmissionTrack::where('slug', str($slug)->slug())->first()?->id;
|
|
}
|
|
|
|
return self::$cache['admission_track'][$slug];
|
|
}
|
|
|
|
private function resolveTermId(int $yearStudy): int {
|
|
if (!isset(self::$cache['term'][$yearStudy])) {
|
|
self::$cache['term'][$yearStudy] = Term::where('year_study', $yearStudy)
|
|
->where('semester', 1)
|
|
->first()?->id ?? 0;
|
|
}
|
|
|
|
return self::$cache['term'][$yearStudy];
|
|
}
|
|
}
|
|
|