tracking = $tracking ?? new TrackingResolver(); } /** * @return array */ public function toArray( WC_Order $order ): array { $tracking = $this->tracking->resolve( $order ); $numbers = array_column( $tracking, 'number' ); $payload = [ 'order_number' => (string) $order->get_order_number(), 'status' => (string) $order->get_status(), 'status_label' => \wc_get_order_status_name( $order->get_status() ), 'created_at' => $this->formatDate( $order->get_date_created() ), 'updated_at' => $this->formatDate( $order->get_date_modified() ), 'paid_at' => $this->formatDate( $order->get_date_paid() ), 'completed_at' => $this->formatDate( $order->get_date_completed() ), 'currency' => (string) $order->get_currency(), 'total' => (string) $order->get_total(), 'shipping_method' => (string) $order->get_shipping_method(), 'tracking_number' => $numbers[0] ?? null, 'tracking_numbers' => $numbers, 'tracking' => $tracking, 'items' => $this->serializeItems( $order ), ]; return (array) \apply_filters( 'agent001_order_response', $payload, $order ); } /** * @return list> */ private function serializeItems( WC_Order $order ): array { $items = []; foreach ( $order->get_items( 'line_item' ) as $item ) { if ( ! $item instanceof WC_Order_Item_Product ) { continue; } $items[] = [ 'name' => (string) $item->get_name(), 'quantity' => (int) $item->get_quantity(), 'subtotal' => (string) $order->get_line_subtotal( $item, false, false ), 'total' => (string) $order->get_line_total( $item, false, false ), ]; } return $items; } private function formatDate( $date ): ?string { return $date ? $date->date( 'c' ) : null; } }