account = $account; $result->statementNumber = $statementNumber; $result->year = $year; return $result; } /** * @deprecated */ public function serialize(): string { return serialize($this->__serialize()); } public function __serialize(): array { return [ parent::__serialize(), $this->account, $this->statementNumber, $this->year, ]; } /** * @deprecated */ public function unserialize($serialized) { self::__unserialize(unserialize($serialized)); } public function __unserialize(array $serialized): void { list( $parentSerialized, $this->account, $this->statementNumber, $this->year ) = $serialized; is_array($parentSerialized) ? parent::__unserialize($parentSerialized) : parent::unserialize($parentSerialized); } /** * @return string[] Array von PDF-Binaerdaten (ein Eintrag pro Kontoauszug). */ public function getPdfStatements(): array { $this->ensureDone(); return $this->pdfStatements; } /** {@inheritdoc} */ protected function createRequest(BPD $bpd, ?UPD $upd) { error_log("[BankImport HKEKP] createRequest() aufgerufen"); /** @var HIEPS $hieps */ $hieps = $bpd->requireLatestSupportedParameters('HIEPS'); $version = $hieps->getVersion(); error_log("[BankImport HKEKP] HIEPS Version=".$version); error_log("[BankImport HKEKP] Account IBAN=".$this->account->getIban().", BIC=".$this->account->getBic()); error_log("[BankImport HKEKP] Auszugsnummer=".($this->statementNumber ?: 'null').", Jahr=".($this->year ?: 'null')); switch ($version) { case 1: error_log("[BankImport HKEKP] Erstelle HKEKPv1 (KtvV3-basiert, BLZ)"); return HKEKPv1::create( KtvV3::fromAccount($this->account), $this->statementNumber, $this->year ); case 2: error_log("[BankImport HKEKP] Erstelle HKEKPv2 (Kti-basiert, IBAN/BIC)"); return HKEKPv2::create( Kti::fromAccount($this->account), $this->statementNumber, $this->year ); default: error_log("[BankImport HKEKP] FEHLER: Nicht unterstuetzte Version ".$version); throw new UnsupportedException('Nicht unterstuetzte HKEKP-Version: ' . $version); } } /** {@inheritdoc} */ public function processResponse(Message $response) { error_log("[BankImport HKEKP] processResponse() aufgerufen"); parent::processResponse($response); // Bank sendet 3010 wenn keine Auszuege verfuegbar $isUnavailable = $response->findRueckmeldung(Rueckmeldungscode::NICHT_VERFUEGBAR) !== null; $responseSegments = $response->findSegments(HIKEP::class); error_log("[BankImport HKEKP] isUnavailable=".($isUnavailable ? 'JA' : 'NEIN') .", HIKEP-Segmente=".count($responseSegments) .", Request-Segment-Nummern=".implode(',', $this->getRequestSegmentNumbers())); // Alle Rueckmeldungen loggen try { $rueckmeldungen = $response->findSegments(\Fhp\Segment\HIRMS\HIRMSv2::class); foreach ($rueckmeldungen as $hirms) { foreach ($hirms->rueckmeldung as $rm) { error_log("[BankImport HKEKP] Rueckmeldung: Code=".$rm->rueckmeldungscode ." Ref=".$rm->bezugsdatenelement ." Text=".$rm->rueckmeldungstext); } } } catch (\Throwable $e) { error_log("[BankImport HKEKP] Rueckmeldungen konnten nicht gelesen werden: ".$e->getMessage()); } if (!$isUnavailable && count($responseSegments) === 0 && count($this->getRequestSegmentNumbers()) > 0) { error_log("[BankImport HKEKP] FEHLER: Keine HIKEP-Segmente in Antwort!"); throw new UnexpectedResponseException('Keine HIKEP-Antwort-Segmente erhalten!'); } /** @var HIKEP $hikep */ foreach ($responseSegments as $segIdx => $hikep) { error_log("[BankImport HKEKP] Verarbeite HIKEP-Segment ".($segIdx+1)."/".count($responseSegments)); $pdfData = $hikep->getKontoauszug()->getData(); $rawLen = strlen($pdfData); $rawStart = substr($pdfData, 0, 20); error_log("[BankImport HKEKP] Rohdaten: ".$rawLen." Bytes, Anfang='".$rawStart."', Hex=".bin2hex(substr($pdfData, 0, 10))); // Pruefen ob Base64-kodiert (beginnt nicht mit %PDF-) if (!str_starts_with($pdfData, '%PDF-')) { error_log("[BankImport HKEKP] Daten beginnen NICHT mit %PDF-, pruefe Base64..."); $decoded = base64_decode($pdfData, true); if ($decoded !== false && str_starts_with($decoded, '%PDF-')) { error_log("[BankImport HKEKP] Base64-Dekodierung erfolgreich! ".strlen($decoded)." Bytes nach Dekodierung"); $pdfData = $decoded; } else { error_log("[BankImport HKEKP] WARNUNG: Weder PDF noch Base64-PDF erkannt! decoded=".($decoded !== false ? 'ja' : 'nein')); } } else { error_log("[BankImport HKEKP] Daten sind direkt PDF (kein Base64)"); } // Quittung pruefen $quittung = $hikep->getQuittung(); if ($quittung !== null) { error_log("[BankImport HKEKP] Quittung vorhanden: ".strlen($quittung->getData())." Bytes"); } if (!empty($pdfData)) { $this->pdfStatements[] = $pdfData; error_log("[BankImport HKEKP] PDF hinzugefuegt (gesamt: ".count($this->pdfStatements).")"); } else { error_log("[BankImport HKEKP] WARNUNG: Leere PDF-Daten, uebersprungen"); } } error_log("[BankImport HKEKP] processResponse() fertig, ".count($this->pdfStatements)." PDFs gesammelt"); } }