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