[], '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]; } }