| @@ -10,8 +10,9 @@ | ||
| 10 | 10 | |
| 11 | 11 | namespace WCPOS\WooCommercePOS\Templates; |
| 12 | 12 | |
| 13 | 13 | use Exception; |
| 14 | +use WCPOS\WooCommercePOS\Logger; | |
| 14 | 15 | use WP_REST_Request; |
| 15 | 16 | |
| 16 | 17 | /** |
| 17 | 18 | * Received class. |
| @@ -55,8 +56,12 @@ | ||
| 55 | 56 | try { |
| 56 | 57 | $request = new WP_REST_Request( 'GET', '/wcpos/v1/orders/' . $order_id ); |
| 57 | 58 | $server = rest_get_server(); |
| 58 | 59 | $response = $server->dispatch( $request ); |
| 60 | + if ( $response->is_error() || $response->get_status() >= 400 ) { | |
| 61 | + Logger::log( sprintf( 'Received order %d REST dispatch failed with status %d.', $order_id, $response->get_status() ) ); | |
| 62 | + return false; | |
| 63 | + } | |
| 59 | 64 | $data = $server->response_to_data( $response, true ); |
| 60 | 65 | } finally { |
| 61 | 66 | remove_filter( 'user_has_cap', $grant_caps ); |
| 62 | 67 | remove_filter( 'woocommerce_rest_check_permissions', '__return_true' ); |
| @@ -87,14 +92,17 @@ | ||
| 87 | 92 | array( 'response' => 403 ) |
| 88 | 93 | ); |
| 89 | 94 | } |
| 90 | 95 | |
| 91 | - $order_json = $this->get_order_json( $order->get_id() ); | |
| 92 | - $payment_method = $order->get_payment_method(); | |
| 93 | - $gateway_settings = woocommerce_pos_get_settings( 'payment_gateways' ); | |
| 94 | - $status_setting = $gateway_settings['gateways'][ $payment_method ]['order_status'] ?? 'wc-completed'; | |
| 95 | - $completed_status = 'wc-' === substr( $status_setting, 0, 3 ) ? substr( $status_setting, 3 ) : $status_setting; | |
| 96 | - $order_complete = 'pos-open' !== $completed_status; | |
| 96 | + $order_json = $this->get_order_json( $order->get_id() ); | |
| 97 | + // Emit only after WooCommerce recognizes the order as paid. A negative | |
| 98 | + // needs_payment() check is insufficient because zero-total failed orders do not | |
| 99 | + // need payment. Keep the POS exclusions so parked carts never report success. | |
| 100 | + $order_complete = $order->is_paid() && ! \in_array( $order->get_status(), array( 'pos-open', 'pos-partial' ), true ); | |
| 101 | + | |
| 102 | + if ( false === $order_json ) { | |
| 103 | + $order_complete = false; | |
| 104 | + } | |
| 97 | 105 | |
| 98 | 106 | include woocommerce_pos_locate_template( 'received.php' ); |
| 99 | 107 | exit; |
| 100 | 108 | } catch ( Exception $e ) { |