phpFinTS icon indicating copy to clipboard operation
phpFinTS copied to clipboard

Probleme mit Terminüberweisungen

Open seem2810 opened this issue 1 year ago • 15 comments

Hallo zusammen,

ich habe leider ein Problem, wenn ich mehrere Überweisungen terminiert schicken möchte. Bei mehreren Überweisungen meckert er, dass er den PARSER nicht verarbeiten kann. Bei einer einzelnen darf das Ausführungsdatum nicht belegt sein.

Hat hier jemand Erfahrung damit, mehrere Überweisungen terminiert an die Bank (ohne EBICS) zu senden?

Mein Code:

 $transfer = new SEPATransfer([
            'paymentInitiation' => 'pain.001.001.03',
            'messageID' => 'dce-' . $directCreditExport->id,
            'paymentID' => 'dce-' . $directCreditExport->id,
        ]);

        $transfer->setDebitor(new SEPADebitor([
            'name' => config('setting.site.company'),
            'iban' => $this->bank->getIBAN(),
            'bic' => $this->bank->bic,
        ]));

        foreach ($directCreditExport->direct_credits()->get() as $directCredit) {
            if (!$directCredit->due_date) $directCredit->due_date = new \DateTime();

            if (!$directCredit->bank_partner) continue;
            $name = $directCredit->bank_partner->name;
            if (empty($name) && $directCredit->incoming && $directCredit->incoming->supplier) $name = $directCredit->incoming->supplier->getName();
            if (empty($name)) $name = 'Zahlungsempf.';

            $transfer->addCreditor(new SEPACreditor([
                'info' => substr($directCredit->subject, 0, 140),
                'name' => $name,
                'iban' => $directCredit->bank_partner->getIBAN(),
                'bic' => $directCredit->bank_partner->bic,
                'amount' => $directCredit->amount,
                'currency' => 'EUR',
                'reqestedExecutionDate' => $directCredit->due_date,
            ]));
            $directCredit->save();
        }

        $sendSEPATransfer = \Fhp\Action\SendSEPATransfer::create($this->account, $transfer->toXML());

        if ($sendSEPATransfer->needsTan()) {
            return $this->handleStrongAuthentication($sendSEPATransfer);
        }

        $this->fints->execute($sendSEPATransfer);
        try {
        } catch (\Throwable $exception) {
            return $this->handleException($exception->getMessage());
        }

        if ($sendSEPATransfer->needsTan()) {
            return $this->handleStrongAuthentication($sendSEPATransfer);
        }

seem2810 avatar Jul 15 '24 05:07 seem2810

Soweit ich weiß sind das alles verschiedene Geschäftsvorfälle

  • SEPA-Sammelüberweisungen (Segment HKCCM)
  • Terminierte SEPA-Überweisung (Segment HKCSE)
  • Terminierte SEPA-Sammelüberweisung (Segment HKCME)

phpFinTs unterstützt bislang lediglich SEPA Einzelüberweisung (Segment HKCCS).

ampaze avatar Jul 16 '24 07:07 ampaze

Danke! Das würde natürlich einiges erklären.

Also muss ich irgendwie HKCME implementieren? Da versuche ich mich mal dran sonst.

seem2810 avatar Jul 16 '24 11:07 seem2810

Also muss ich irgendwie HKCME implementieren?

Ja. Das sollte hauptsächlich aus Copy & Paste bestehen. DEVELOPER-GUIDE.md ist eine gute erste Lektüre dafür.

SEPATransfer könnte/sollte auch je nach XML-Inhalt das jeweils richtige Segment auswählen.

ampaze avatar Jul 16 '24 14:07 ampaze

SEPATransfer könnte/sollte auch je nach XML-Inhalt das jeweils richtige Segment auswählen.

Muss ich ggf. nur in meiner XML-Generierung oben etwas ändern? Ich nutze ja pain.001.001.03

Mein Request, versucht mit 001.001.03 sowie 001.001.09

hp\Protocol\ServerException {#3848 ▼ // packages/ds.bank/src/Connectors/HBCI.php:600
  #message: """
    FinTS errors:

    9050 (global): Die Nachricht enthält Fehler.

    9010 (wrt seg 3): Fehler beim Aufruf Parser.

    FinTS warnings:

    3905 (global): Es wurde keine Challenge erzeugt.

    Request segments:

    
HKCCS:3:1+DE43403510600074856311:WELADED1STF:74856311::280:40351060+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.09+@2927@<?xml version="1.0" encoding="UT
 ▶

    
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022
 ▶

      <CstmrCdtTrfInitn>

        <GrpHdr>

          <MsgId>dce-2</MsgId>

          <CreDtTm>2024-07-16T17:20:10Z</CreDtTm>

          <NbOfTxs>2</NbOfTxs>

          <CtrlSum>6.00</CtrlSum>

          <InitgPty>

            <Nm>test GmbH - Testinstanz</Nm>

          </InitgPty>

        </GrpHdr>

        <PmtInf>

          <PmtInfId>dce-2-3</PmtInfId>

          <PmtMtd>TRF</PmtMtd>

          <NbOfTxs>1</NbOfTxs>

          <CtrlSum>5.00</CtrlSum>

          <PmtTpInf>

            <SvcLvl>

              <Cd>SEPA</Cd>

            </SvcLvl>

          </PmtTpInf>

          <ReqdExctnDt>2024-07-17</ReqdExctnDt>

          <Dbtr>

            <Nm>test GmbH - Testinstanz</Nm>

          </Dbtr>

          <DbtrAcct>

            <Id>

              <IBAN>XXXX</IBAN>

            </Id>

            <Ccy>EUR</Ccy>

          </DbtrAcct>

          <DbtrAgt>

            <FinInstnId>

              <BIC>XXXX</BIC>

            </FinInstnId>

          </DbtrAgt>

          <ChrgBr>SLEV</ChrgBr>

          <CdtTrfTxInf>

            <PmtId>

              <EndToEndId>dce-2-30</EndToEndId>

            </PmtId>

            <Amt>

              <InstdAmt Ccy="EUR">5.00</InstdAmt>

            </Amt>

            <CdtrAgt>

              <FinInstnId>

                <BIC>XXXX</BIC>

              </FinInstnId>

            </CdtrAgt>

            <Cdtr>

              <Nm>XXX XXXXX</Nm>

            </Cdtr>

            <CdtrAcct>

              <Id>

                <IBAN>XXX</IBAN>

              </Id>

            </CdtrAcct>

            <RmtInf>

              <Ustrd>Test per KSK</Ustrd>

            </RmtInf>

          </CdtTrfTxInf>

        </PmtInf>

        <PmtInf>

          <PmtInfId>dce-2-5</PmtInfId>

          <PmtMtd>TRF</PmtMtd>

          <NbOfTxs>1</NbOfTxs>

          <CtrlSum>1.00</CtrlSum>

          <PmtTpInf>

            <SvcLvl>

              <Cd>SEPA</Cd>

            </SvcLvl>

          </PmtTpInf>

          <ReqdExctnDt>2024-07-15</ReqdExctnDt>

          <Dbtr>

            <Nm>test GmbH - Testinstanz</Nm>

          </Dbtr>

          <DbtrAcct>

            <Id>

              <IBAN>XXX</IBAN>

            </Id>

            <Ccy>EUR</Ccy>

          </DbtrAcct>

          <DbtrAgt>

            <FinInstnId>

              <BIC>XXX</BIC>

            </FinInstnId>

          </DbtrAgt>

          <ChrgBr>SLEV</ChrgBr>

          <CdtTrfTxInf>

            <PmtId>

              <EndToEndId>dce-2-50</EndToEndId>

            </PmtId>

            <Amt>

              <InstdAmt Ccy="EUR">1.00</InstdAmt>

            </Amt>

            <CdtrAgt>

              <FinInstnId>

                <BIC>XXX</BIC>

              </FinInstnId>

            </CdtrAgt>

            <Cdtr>

              <Nm>XXX XXX</Nm>

            </Cdtr>

            <CdtrAcct>

              <Id>

                <IBAN>XXX</IBAN>

              </Id>

            </CdtrAcct>

            <RmtInf>

              <Ustrd>Test 2 KSK</Ustrd>

            </RmtInf>

          </CdtTrfTxInf>

        </PmtInf>

      </CstmrCdtTrfInitn>

    </Document>

    '
    """
  #code: 0
  #file: "vendor
/nemiah/php-fints/
lib/Fhp/Protocol/ServerException.php"
  #line: 170
  -errors: array:2 [▶]
  -warnings: array:1 [▶]
  -requestSegments: array:1 [▶]
  -request: 

seem2810 avatar Jul 16 '24 15:07 seem2810

Muss ich ggf. nur in meiner XML-Generierung oben etwas ändern?

Nein, das XML ist ja nur der Payload für einen bestimmten Geschäftsvorfall. Aber man kann in das XML gucken ob ein Termin angegeben ist oder mehrere Überweisungen enthalten sind. Abhängig davon würde dann der richtige Geschäftsvorfall an die Bank geschickt. Alternativ bräuchte man ja sonst für jeden Geschäftsvorfall eine eigene SendSEPATransfer-Action.

ampaze avatar Jul 16 '24 15:07 ampaze

Ok, so ganz habe ich es noch nicht verstanden und es funktioniert noch nicht... Da muss ich noch mal viel testen.

seem2810 avatar Jul 18 '24 06:07 seem2810

Habe das ganze mal gepusht. Bin weiter vorgedrungen :-) https://github.com/nemiah/phpFinTS/pull/447

Nun jemand eine Idee?

    FinTS errors:

    9050 (global): Die Nachricht enthält Fehler.

    9110 (wrt seg 3): Ungültige Auftragsnachricht: Unbekannter Aufbau. (wrt DE 3,2)

    9160 (wrt seg 3): Pflichtfeld nicht gefunden (wrt DE 3,2)

    9010 (wrt seg 4): Segment wegen anderer Fehler wirkungslos

    Request segments:

    
HKCME:3:1+DE43403510600074856311:WELADED1STF:74856311::280:40351060+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.09+@2927@<?xml version="1.0" encoding="UT
 ▶

    
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022
 

seem2810 avatar Jul 18 '24 11:07 seem2810

Habe im Pull Request geantwortet.

ampaze avatar Jul 19 '24 07:07 ampaze

Ok, ich muss es doch wieder öffnen... Bei der Bank kommt die Anfrage zwar richtig an, doch erhalte ich nach Freigabe:

9050 (global): Die Nachricht enthält Fehler.
9010 (wrt seg 3): Der Auftrag wurde nicht ausgeführt.
9010 (wrt seg 3): Systemfehler - bitte wenden Sie sich an Ihren Kundenberater. (MDC17700200002)
Request segments:
HKTAN:3:7+S++++6153-08-07-19.12.56.700284+N'
HKTAN:3:7+S++++6153-08-07-19.12.56.700284+N' at bank/src/Connectors/HBCI.php:315)

Update: https://github.com/nemiah/phpSepaXml/issues/6#issuecomment-2274977111 Durch die Änderung (Rückwerts) wird das Payment Date nicht gesetzt und er springt, statt in Termin. Sammepl in Sammel. Und hier war mir ein Fehler beim Segment aufgefallen: Statt "HICCMS" stand dort "HICSES"

Fix hier: https://github.com/nemiah/phpFinTS/pull/450

Dennoch erhalte ich den gleichen Fehler.

seem2810 avatar Aug 07 '24 17:08 seem2810

Was sagt denn der Kundenberater? Ohne konkrete Fehlermeldung schwierig was zu sagen. Systemfehler klingt ja nach Fehler bei der Bank und nicht beim Client.

ampaze avatar Aug 12 '24 10:08 ampaze

Was sagt denn der Kundenberater? Ohne konkrete Fehlermeldung schwierig was zu sagen. Systemfehler klingt ja nach Fehler bei der Bank und nicht beim Client.

Manchmal sieht man den Baum vor lauter Bäumen nicht... Abgelehnt, da 2 x die gleiche Überweisung in der Datei..

Dennoch gehen die Terminüberweisungen (noch) nicht, da die XML nicht geht: https://github.com/nemiah/phpSepaXml/issues/6#issuecomment-2274977111

seem2810 avatar Aug 13 '24 13:08 seem2810

Ok, ich sehe wieder mal das Problem nicht..

9210 (wrt seg 3): Summe der Beträge der Einzelzahlung und Kontrollsumme stimmen nicht überein. [694.73]

Ich dachte erst, dass es daran liegt, dass ich das $summenfeld nicht gesetzt habe. Aber damit geht es auch nicht... https://github.com/seem2810/phpFinTS/blob/master/lib/Fhp/Action/SendSEPATransfer.php#L67

Jemand noch eine Idee?

seem2810 avatar Aug 22 '24 15:08 seem2810

Würde auch denken, dass es am $summenfeld liegt. Kann mir an der Stelle auch Rundungsfehler vorstellen. Die Summe sollte doch eigentlich via $xmlAsObject->CstmrCdtTrfInitn->GrpHdr->CtrlSum schon vorhanden sein.

ampaze avatar Aug 23 '24 10:08 ampaze

Würde auch denken, dass es am $summenfeld liegt. Kann mir an der Stelle auch Rundungsfehler vorstellen. Die Summe sollte doch eigentlich via $xmlAsObject->CstmrCdtTrfInitn->GrpHdr->CtrlSum schon vorhanden sein.

Das hatte ich auch schon ausprobiert. Ohne Erfolg...

Edit: Rundungsfehler habe ich auch schon ausschließen können

seem2810 avatar Aug 26 '24 11:08 seem2810

Niemand eine Idee?

seem2810 avatar Sep 02 '24 13:09 seem2810

So, meine Sammelüberweisungen klappen nun.

seem2810 avatar Dec 04 '24 08:12 seem2810