Aplikasi Keuangan yang mengatur lalu lintas transaksi antara bank dan aplikasi internal Kampus
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

<?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];
}
}