﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	blockedby	blocking
729	PayPal - Zeitversetzte Meldungen	INETvisio	somebody	"Hallo modified,

bei PayPal Modul gibt es ein Problem, dass bei der zeitversetzte Meldungen könnte leicht ein Fehler auftreten, dass der ""orders_status"" verändert wird, obwohl die Meldung zu spät angekommen wurde.
Ich bringe ein Beispiel:
1. Kunde erstellt ein Auftrag, bezahlt
2. Kunde ruft an, war ein Fehler, bla bla bla, bitte Stornieren
3. Man erstellt eine Rückerstattung mit PayPal.
Bis dato sollte normalerweise kein Problem auftreten.

Aber, in Falle, wenn PayPal die Meldung ""Completed"" erst später versendet (Zeitversetzt), dann gibt es ein Konflikt.
Man sieht folgendes in der ""orders_status_history"":
1. Offen
2. Offen PP wartend
3. Storno (PayPal IPN Refunded ..)
4. Offen (PayPal IPN Completed ..)
5. Versendet
6. Zugestellt

Das bedeutet, dass PayPal eine Rückerstattungsstatus schneller geschickt hat als die Meldung ""Completed"".

Nach meine Analyse geht es um folgendes Datei:
'''includes/classes/paypal_checkout.php'''

Um diese Fehler zu vermeiden, sollte man normalerweise auf ein ""parent_txn_id"" reagieren. Der bestimmt Eltern. Dieser wird auch als Kommentar ParentID=xxxx ins ""orders_status_history"" eingetragen.

'''Lösungsvorschlag:'''
Zeile: 1190-1194
{{{
        $order_query = xtc_db_query(""SELECT currency, currency_value
                                    FROM "" . TABLE_ORDERS . ""
                                    WHERE orders_id = '"" . xtc_db_prepare_input($xtc_order_id) . ""'"");
        if(xtc_db_num_rows($order_query) > 0) {
}}}
(orders_status auslesen)
ersetzen durch:
{{{
        $order_query = xtc_db_query(""SELECT currency, currency_value, orders_status
                                    FROM "" . TABLE_ORDERS . ""
                                    WHERE orders_id = '"" . xtc_db_prepare_input($xtc_order_id) . ""'"");
        if(xtc_db_num_rows($order_query) > 0) {
            $order_data = xtc_db_fetch_array($order_query);
}}}


Danach folgendes suchen:
Zeile 1370-1374:
{{{
          $xtc_order_id=(int)substr($this->data['invoice'],strlen(PAYPAL_INVOICE));
          xtc_db_query(""UPDATE "" . TABLE_ORDERS . ""
                        SET orders_status = '"" . $order_status_id . ""', last_modified = now()
                        WHERE orders_id = '"" . xtc_db_prepare_input($xtc_order_id) . ""'"");
}}}
(Nach Kindern suchen, wenn Kinder gefunden werden, Auftragsstatus nicht verändern)
Und davor folgendes einfügen:
{{{
		  $_transQuery = ""SELECT paypal_ipn_id FROM "".TABLE_PAYPAL."" WHERE parent_txn_id = '"".$ipn_data['txn_id'].""'"";
		  $_transQuery = xtc_db_query($_transQuery);
		  $_transQuery = xtc_db_fetch_array($_transQuery);
		  if($_transQuery['paypal_ipn_id']!='') {
			  $order_status_id = $order_data['orders_status'];
		  }
}}}

Was meint Ihr dazu?

Gruß
Jürgen H."	Bug/Fehler	closed	niedrig	modified-shop-2.0.0.0	Shop	2.0.0.0	fixed				
