Bestellung / Zahlart ändern - bezahlen

Hallo,
ich will die Möglichkeit schaffen, eine Bestellung, welche z.B. per Vorkasse eingeht später mit einer anderen Zahlart zu bezahlen.
Im Grunde wäre es super, wenn der Kunde im Kundenkonto die offenen Bestellungen sieht und von hier aus die Zahlart ändern bzw. direkt per Payal und Co bezahlen kann.

Leider habe ich keine Idee, wie man dies kompatibel zu den gängigen Plugins umsetzen kann.
Diese binden sich ja immer nur im Checkout ein.

Hat zu dieserm Thema einer eine Idee? Ich sowas überhaupt realisierbar?

Danke für euer Feedback.
Evtl. gibt es ja mehrere die an so einer Funktion interesse haben.

Danke & Gruß
ottscho

 

Das scheint mir aufwendig zu werden. Umsetzen würde ich das wie folgt:

Die Bestellung inkl. Positionen bleibt ja vollständig erhalten und können im Kundenkonto eingesehen werden. Daneben einen Button einbauen falls bei der Bestellung gilt: Zahlungsart: Vorkasse & Status: offen. Dieser Button übergibt die BestellID an einen Controller von deinem Plugin.

Dieser legt die einzelnen Positionen in den Warenkorb. Zusätzlich muss der alte Preis übernommen werden (ggf. in ein Attributfeld pro Bestellposition abspeichern, damit der Preis die Shopware Berechnung übersteht). Danach ggf. in der Session ein Flag setzen, dass es sich um eine alte Vorkassen-Bestellung handelt. Sollte das Flag gesetzt sein, darf der Kunde keine Artikel mehr im Warenkorb löschen oder ändern und die Zahlungsart “Vorkasse” muss blockiert werden… (Ggf. entsprechenden Abbruchbutton, welcher den Warenkorb leert und das Flag aus der Session entfernt). 

Viel Spaß  Wink

Einfach wird es auf keinen Fall.
Dein Vorschlag hatte ich ähnlich auch schon im Kopf. Aber der komplette Checkout Prozess will ich an sich nicht noch mal durchlaufen.

Sprich die einzelnen Positionen sollen vom Kunden nicht mehr eingesehen werden. Im optimalen Fall im Kundenkonto die Zahlart auf Paypal, Amazon, Sofortüberweisung etc. stellen und auf jetzt Bezahlen klicken :wink:

Aber ich denke sowas ist kaum realisierbar.

 

Naja den „kompletten“ Checkout durchläuft man ja nicht. Man sieht ja lediglich noch einmal die Confirmseite. (Artikel in den Warenkorb legen, Zahlart/Versand auswählen entfällt. Das spart ja schon Zeit)

Du hast Recht, dass auf der Confirmseite die Zahlarten eingebaut werden. Aber du könntest z.B. weitere Dinge wie Rechnungs- und Lieferadresse entfernen. Dann hätte der Kunde nochmal kurz die Übersicht was er denn jetzt genau bestellt. Außerdem bin ich mir gar nicht sicher, ob ein Checkout ganz ohne AGB Checkbox etc. rechtssicher ist.

Wenn du kein spezielles Plugin für den CommunityStore baust sondern beispielsweise eine Individual-Anpassung für einen Kunden kannst du dich ja auf die angebotenen Zahlungsarten spezialisieren und ggf. den Prozess noch weiter nach vorne ziehen ( direkt in das Kundenkonto). @Shyim‍ hat das z.B. vor Kurzem mit Paypal gemacht.

Viele Grüße

Ich denke es geht fast nur über den „normalen“ Confirm Checkout. Da es nicht nur Paypal ist, sonts eben auch Kreditkarte, Giropay und Sofortüberweisung.

Wobei Paypal schon mal ein Anfang wäre. Evtl. verkauft @Shyim‍ ja seine Lösung? Direkt aus dem Kundenkonto wäre schon klasse.

 

Hallo,

ich bin neue hier und neue in Shopware. Ihre Frage war eine Herausforderung für mich.

also um diese zu machen. ich werde benutzen , die gleiche Idee wie ‚add_accessories‘ Form .

und Sie haben Erfarung mit dieser Sachen :

Zuerst Ich werde ein Form in Bestellung Tab hinzufügen, er hat a liste für die moglichen Paymentmethoden.

er darf die folgende Fielden haben:

        // offcours you musst use your controller url und action in the form action I use this only because I try the code in the checkout controller code.
        

// this will come from the list you will make it for the possible payment methods ( select or checkout or radio) as you want I just use hidden for testing.
		

//the current order number
		

// shipping and billing address from the order.

in Ihre Contollert oder in meinem Fall in Checkout Controller Datei können Sie die Logik der addAccessoriesAction funktion :

 public function addAccessoriesAction()
    {
// this just to reset the basket and add just the reuested order products
        if($this->Request()->getParam('Myaction') == 'change_payment') {
			$this->basket->sDeleteBasket();
		}

// use the same code to add the order products to the basket offcurs you must find a way to handel the old products or the out of stock products or the not enough stock products
        $this->addAccessories(
            $this->Request()->getParam('sAddAccessories'),
            $this->Request()->getParam('sAddAccessoriesQuantity')
        );


		if($this->Request()->getParam('Myaction','change_payment') == 'change_payment'){
// hier we have a problem we will talk about it
// $this->session->offsetSet('checkoutShippingAddressId', $this->Request()->getParam('order_shipping_addressId'));
// $this->session->offsetSet('checkoutBillingAddressId', $this->Request()->getParam('order_billing_addressId'));

// I use a static values hier( we will talk why)
// we use 'checkoutShippingAddressId' and 'checkoutBillingAddressId' to overwrite the default shipping and billing address and replace them with the order addresses.
			$this->session->offsetSet('checkoutShippingAddressId', 2078);
			$this->session->offsetSet('checkoutBillingAddressId', 2078);

// hier you add the new payment method to the userdata , offcours you must update the order payment method in the database.			
			$userData = $this->View()->sUserData;
			$payment_id = $this->Request()->getParam('sPaymentID',7);
			$payment = $this->admin->sGetPaymentMeanById($payment_id, $userData);
			$userData["additional"]["payment"] = $payment;
			$this->View()->sUserData = $userData;

// call the confirmAction function to add the changed userdate information to the session and create the requierd seesion values.
// this will create a temporary Order in the database but we will removed later.
			$this->confirmAction();

// add the requested order id to the session sOrderVariables.
			$sOrderNumber = $this->Request()->getParam('sOrderNumber',21289);
			$this->session['sOrderVariables']['sOrderNumber'] = $sOrderNumber;

//remove the temporary Order we don't need it
			$order = Shopware()->Modules()->Order();
			$order->sDeleteTemporaryOrder();

// at last your forward the request to the payment action in the checkout contoller this will take the cleint to the payment page to pay for the current order in my case it take me to the paypal website.
			$this->forward('payment');
			return;
		}

        $this->forward($this->Request()->getParam('sTargetAction', 'cart'));
    }

 

tut mir leid ich habe ein bisschen auf Englisch im Code geschrieben.

also die größe problem ist die Shipping und Billing Address.

            $this->session->offsetSet('checkoutShippingAddressId', $this->Request()->getParam('order_shipping_addressId'));
			$this->session->offsetSet('checkoutBillingAddressId', $this->Request()->getParam('order_billing_addressId'));

Die Orderaddresse kommt von ‚s_order_billingaddress‘ und ‚s_order_shippingaddress‘ Tablen. aber ‚checkoutShippingAddressId‘ and ‚checkoutBillingAddressId‘ brauchen die OrderID von ‚s_user_addresses‘ Table.

Das Problem ist, dass gibt keine Relationship zwichen diese Tablen.

Viellechit Sie können etwas wie diese Funktion benutzen, um die Orderaddress in Userdate mergen(array_merge).

Natürlich ist dies nur der grundlegende Code, und vielleicht haben Sie auch ändere Probleme.

Viele Spaß. 

Ich freue mich auf Ihre Code.

Viele Grüße

Ahmad.

Hallo Ahmad,

erst mal danke für dein Feedback.
Der Ansatz sieht gut aus. Ich habe es eben mal schnell getestet. Die Weiterleitung zu Papal funktioniert im Standard nur, wenn die AGB Checkout Box nicht aktiv ist.
Wenn ich nun der Paypal Prozess zu Ende führe, komme ich wieder zurück in den Checkout / Confirm Teil in Shopware und Paypal hat nichts verbucht.

Wenn die AGB Box aktiv ist, muss hier manuell ein Haken gesetzt werden. Danach komme ich zu Paypal. Jetzt wurde der Betrag verbucht.
Das System hat mir aber eine 2. Bestellung angelegt. Theoretisch müsste man nun die TransactionID etc. von der 2. Bestellung auf die 1. übernehmen und dann die 2. Bestellung löschen.

Ich denke die alte / offene Bestellung noch mal im Checkout zu verabreiten und zu bezahlen geht technisch nicht. Bin mir aber nicht sicher. Alternativ könnte man eine angepasst Checkout / Confirm Seite machen. Welche nur noch die Möglichkeit der Zahlartauswahl hat, und den Button jetzt Bezahlen (+ evtl. AGB). Die 2. Bestellung nimmt man in Kauf und löscht diese später wieder. Man könnte evtl. auch eine Warenkorbposition schaffen, welche nur einen Aufschlag/Custom Artikel beinhaltet, welcher die komplette Rechnungssumme von der originalen ersten Bestellung beinhaltet. Dieser Aufschlag Artikel bekommt als Artikelnummer die alte Bestellnummer+ Prefix. Somit könnte man nach der Bestellung (2. Bestellung) in der saveOrder diese wieder abfangen und löschen.

 

 

Die Weiterleitung zu Papal funktioniert im Standard nur, wenn die AGB Checkout Box nicht aktiv ist. Sonst muss hier ein haken gesetzt werden.

 

Hallo @ottscho‍,

Ihre Idee über Aufschlag/Custom Artikel ist Perfekt.

über angepasst Checkout / Confirm Seite :

Sie können dass machen. aber es gibt keine unterschiet, ob Sie angepasst Checkout / Confirm Seite oder Ein Form in Bestellung Tab benutzen.

Am End und in jedem Fall müssen Sie mit die orginale Checkout Controler arbeiten.

Weil alles Zahlungmethoden die orginale Checkout Controler benutzen.

über das Problem mit der 2. Bestellung. ich glaube, Sie behoben es bei ein Hook für sOrder->sSaveOrder funktion.

Sie können ein Key in der Session hinzufügen, und Abfrag ob es exsist dann benutzen Ihre Custom funktion ob nicht benutzen die Orginal funktion.

Ich glaube, Sie müssen diese Line änderen :

von insert zu update.

ich glaube Sie dürffen andere Sachen auch änderen. aber diese als Anfang.

 

danke für Ihre Feedback über AGB .

Viele Grüße

Ahmad.