Dokumente, wie z.B. Rechnung, im Kundenkonto zum Download anbieten

Hallo,

wenn ich im Twig Template eine Order debugge, ist „documents“ auf null, obwohl ich im Backend die Dokumente wie z.B. Lieferschein oder Rechnung erstellt habe und auch runterladen kann.

Ist das ein Shopware Bug oder muss ich im Backend noch eine Einstellung vornehmen? Ich wollte einen Controller bauen, der mithilfe der OrderNumber die Rechnung raussucht, aber habe keine Idee wie ich das machen soll. Shopware sucht die Dokumente anhand der $documentId und $deepLinkCode (Was auch immer das ist), auf die ich ja kein Zugriff habe.

Order debug:

Shopware\Core\Checkout\Order\OrderEntity {#8530 ▼
  #orderNumber: "10070"
  #currencyId: "b7d2554b0ce847cd82f3ac9bd1c0dfca"
  #currencyFactor: 1.0
  #salesChannelId: "10375cbc6041476b8ecd5e60c9342b2c"
  #billingAddressId: "161171b5b6ef44069063d6b36ea53bfd"
  #orderDateTime: DateTimeImmutable @1599029726 {#8528 ▶}
  #orderDate: DateTimeImmutable @1599004800 {#8532 ▶}
  #price: Shopware\Core\Checkout\Cart\Price\Struct\CartPrice {#8540 ▶}
  #amountTotal: 666.0
  #amountNet: 559.66
  #positionPrice: 666.0
  #taxStatus: "gross"
  #shippingCosts: Shopware\Core\Checkout\Cart\Price\Struct\CalculatedPrice {#8567 ▶}
  #shippingTotal: 0.0
  #orderCustomer: Shopware\Core\Checkout\Order\Aggregate\OrderCustomer\OrderCustomerEntity {#8633 ▶}
  #currency: null
  #languageId: "2fbb5fe2e29a4d70aa5854ce7ce3e20b"
  #language: null
  #salesChannel: null
  #addresses: null
  #deliveries: Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryCollection {#8831 ▶}
  #lineItems: Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemCollection {#8875 ▶}
  #transactions: Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionCollection {#8525 ▶}
  #deepLinkCode: "xIl5pWy8EhP7sjif17N8TKy_Iv-0WWir"
  #autoIncrement: 72
  #stateMachineState: Shopware\Core\System\StateMachine\Aggregation\StateMachineState\StateMachineStateEntity {#8623 ▶}
  #stateId: "2dfa8f52c13540a6acce661fc9fba334"
  #customFields: null
  #documents: null
  #tags: null
  #affiliateCode: null
  #campaignCode: null
  #customerComment: null
  #_uniqueIdentifier: "66f8f548b3a949049aad9e91e304442a"
  #versionId: "0fa91ce3e96a4bc2be4bd9ce752c3425"
  #translated: []
  #createdAt: DateTimeImmutable @1599029726 {#8628 ▶}
  #updatedAt: DateTimeImmutable @1599034050 {#8634 ▶}
  #_entityName: "order"
  #extensions: array:1 [▶]
  #id: "66f8f548b3a949049aad9e91e304442a"
  +"billingAddressVersionId": "0fa91ce3e96a4bc2be4bd9ce752c3425"

Hat einer eine Idee oder Lösung?

Die Association auf die Dokumente wird standardmäßig nicht geladen:

Ob das so gewollt ist, keine Ahnung. Am besten Ticket erstellen.

ggf. derweil die Methode decoraten und um ->addAssociation('documents') erweitern. Bin mir aber grad nicht sicher, ob ein PageLoader als Service geladen wird und man ihn überhaupt erweitern kann…

Vielen Dank für die Info. Ich habe das mal grad Im Core Code erweitert und es funktioniert. Wie kann ich die function am bsten überschreiben? Hast du eventuell ein Beispiel?

https://docs.shopware.com/en/shopware-platform-dev-en/how-to/decorating-a-service

Hallo,

ist es nicht einfacher bzw. sinnvoller einen Subscriber für das OrderRouteRequestEvent zu progammieren als gleich

den Service zu dekorieren?

Da wird das Criteria-Objekt ja übergeben, funktioniert bei mir zumindest.

Gruß,

Werner.

Stimmt, da gibt’s ja einen Event, dann auf jeden Fall darüber :slight_smile:

@WernerBu schrieb:

Hallo,

ist es nicht einfacher bzw. sinnvoller einen Subscriber für das OrderRouteRequestEvent zu progammieren als gleich

den Service zu dekorieren?

Da wird das Criteria-Objekt ja übergeben, funktioniert bei mir zumindest.

Gruß,

Werner.

Wie hast du das umgesetzt? Kannst du mir da Tipps geben oder ein Code Beispiel posten? 

Hallo,

also die einfachste Version ist wohl die hier:

 namespace ......... use Shopware\Storefront\Event\RouteRequest\OrderRouteRequestEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface;

 class OrderSubscriber implements EventSubscriberInterface { public function \_\_construct() { } public static function getSubscribedEvents() { return [OrderRouteRequestEvent::class =\> 'onOrderPageLoaded']; } public function onOrderPageLoaded(OrderRouteRequestEvent $event) { $criteria = $event-\>getCriteria(); $criteria-\>addAssociation('documents'); } }

Im services.xml vom Plugin dann noch registrieren als Subscriber.

Im Template ist dann die

 order.documents

verfügbar, was immer man dann damit auch machen will.

Gruß,

Werner.

Hallo @WernerBu ,
vielen Dank für den Code.
Nutzt du diesen Subscriber noch? Gibt es ein Update für Version 6.4.20.2?
In dieser Version steht die Variable order.documents bereits zur Verfügung. Allerdings werden die Dokumente erst angezeigt, wenn sie zuvor per E-Mail versendet wurden und in der Datenbanktabelle ‚document‘ die Spalte ‚sent‘ den Wert 1 hat.
Weißt du ob es eine Möglichkeit gibt alle Dokumente im Storefront anzuzeigen, egal ob sie per E-Mail verschickt wurden, oder nicht?

Grüße

Hallo @Laudenz,
falls das Thema noch aktuell sein sollte - in der OrderRoute werden für die documents-Association zwei Filter gesetzt, einmal für „sent“ und einmal für „config.displayInCustomerAccount“ (welche dann am Dokument gesetzt sein muss - wann diese gesetzt wird, habe ich auch noch nicht gefunden).

Umgehen bzw. setzen von eigenen Filtern geht bspw. durch einen Subscriber auf „OrderCriteriaEvent“, welcher nach dem Zusammenstellen der Criteria dispatched wird.

Da kann dann mit

        $criteria = $event->getCriteria();
        $criteria->getAssociation('documents')
            ->resetFilters();

bspw. der Filter für „sent“ und die Config-Abfrage entfernt werden - die Dokumente tauchen dann entsprechend in order.documents auf.

Grüße,
Carsten

Prinzipiell funktioniert das auch im Standard:

  1. Unter Einstellungen->Dokumente muss beim gewünschten Dokument (z.B. Rechnung) die Option Dokument in „Mein Konto“ Bereich anzeigen aktiviert sein
  2. Zudem muss die generierte Rechnung an den Kunden versendet worden sein oder als gesendet markiert sein

Achtung!
Die Einstellung unter 1) muss vor der Generierung der Dokumente gesetzt sein. Das heißt, für bereits erstellte Dokumente gilt das nicht, diese werden rückwirkend auch nicht im Kundenkonto angezeigt. Wieso diese Logik? Keine Ahnung.

Aber bis auf diese Einschränkung funktioniert das auch Out-Of-The-Box!