700 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			700 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Order Object.
 | 
						|
 *
 | 
						|
 * @package     EDD
 | 
						|
 * @subpackage  Orders
 | 
						|
 * @copyright   Copyright (c) 2018, Easy Digital Downloads, LLC
 | 
						|
 * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 | 
						|
 * @since       3.0
 | 
						|
 */
 | 
						|
namespace EDD\Orders;
 | 
						|
 | 
						|
use EDD\Database\Rows as Rows;
 | 
						|
use EDD\Database\Rows\Adjustment;
 | 
						|
 | 
						|
// Exit if accessed directly
 | 
						|
defined( 'ABSPATH' ) || exit;
 | 
						|
 | 
						|
/**
 | 
						|
 * Order Class.
 | 
						|
 *
 | 
						|
 * @since 3.0
 | 
						|
 *
 | 
						|
 * @property int                $id
 | 
						|
 * @property int                $parent
 | 
						|
 * @property string             $order_number
 | 
						|
 * @property string             $type
 | 
						|
 * @property string             $status
 | 
						|
 * @property string             $date_created
 | 
						|
 * @property string             $date_modified
 | 
						|
 * @property string|null        $date_completed
 | 
						|
 * @property string|null        $date_refundable
 | 
						|
 * @property int                $user_id
 | 
						|
 * @property int                $customer_id
 | 
						|
 * @property string             $email
 | 
						|
 * @property string             $ip
 | 
						|
 * @property string             $gateway
 | 
						|
 * @property string             $mode
 | 
						|
 * @property string             $currency
 | 
						|
 * @property string             $payment_key
 | 
						|
 * @property int|null           $tax_rate_id
 | 
						|
 * @property float              $subtotal
 | 
						|
 * @property float              $tax
 | 
						|
 * @property float              $discount
 | 
						|
 * @property float              $total
 | 
						|
 * @property float              $rate
 | 
						|
 * @property Order_Item[]       $items
 | 
						|
 * @property Order_Adjustment[] $adjustments
 | 
						|
 * @property Order_Address      $address
 | 
						|
 */
 | 
						|
class Order extends Rows\Order {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order ID.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   int
 | 
						|
	 */
 | 
						|
	protected $id;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Parent order.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   int
 | 
						|
	 */
 | 
						|
	protected $parent;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order number.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $order_number;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order status.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $status;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order type.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $type;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Date created.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $date_created;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Date modified.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $date_modified;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Date completed.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string|null
 | 
						|
	 */
 | 
						|
	protected $date_completed;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Date refundable.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string|null
 | 
						|
	 */
 | 
						|
	protected $date_refundable;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * User ID.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   int
 | 
						|
	 */
 | 
						|
	protected $user_id;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Customer ID.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   int
 | 
						|
	 */
 | 
						|
	protected $customer_id;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Email.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $email;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * IP.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $ip;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order gateway.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $gateway;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order mode.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $mode;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order currency.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $currency;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Payment key.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $payment_key;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Tax rate ID.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   int|null
 | 
						|
	 */
 | 
						|
	protected $tax_rate_id;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Tax rate Adjustment object.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   Adjustment|null
 | 
						|
	 */
 | 
						|
	protected $tax_rate = null;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Subtotal.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   float
 | 
						|
	 */
 | 
						|
	protected $subtotal;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Tax.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   float
 | 
						|
	 */
 | 
						|
	protected $tax;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order discount.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   float
 | 
						|
	 */
 | 
						|
	protected $discount;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order total.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   float
 | 
						|
	 */
 | 
						|
	protected $total;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order items.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   \EDD\Orders\Order_Item[]
 | 
						|
	 */
 | 
						|
	protected $items = null;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order adjustments.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   \EDD\Orders\Order_Adjustment[]
 | 
						|
	 */
 | 
						|
	protected $adjustments = null;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Order address.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   \EDD\Orders\Order_Address
 | 
						|
	 */
 | 
						|
	protected $address = null;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Magic getter for immutability.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @param string $key
 | 
						|
	 * @return mixed
 | 
						|
	 */
 | 
						|
	public function __get( $key = '' ) {
 | 
						|
		if ( 'adjustments' === $key && null === $this->adjustments ) {
 | 
						|
			$this->adjustments = edd_get_order_adjustments( array(
 | 
						|
				'object_id'     => $this->id,
 | 
						|
				'object_type'   => 'order',
 | 
						|
				'no_found_rows' => true,
 | 
						|
				'order'         => 'ASC',
 | 
						|
			) );
 | 
						|
		} elseif ( 'items' === $key ) {
 | 
						|
			$this->get_items();
 | 
						|
		}
 | 
						|
 | 
						|
		return parent::__get( $key );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve order number.
 | 
						|
	 *
 | 
						|
	 * An order number is only retrieved if sequential order numbers are enabled,
 | 
						|
	 * otherwise the order ID is returned.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	public function get_number() {
 | 
						|
 | 
						|
		if ( $this->order_number && edd_get_option( 'enable_sequential' ) ) {
 | 
						|
			$number = $this->order_number;
 | 
						|
		} else {
 | 
						|
			$number = $this->id;
 | 
						|
		}
 | 
						|
 | 
						|
		/**
 | 
						|
		 * The edd_payment_number filter allows the order_number value to be changed.
 | 
						|
		 *
 | 
						|
		 * This filter used to run in the  EDD_Payment class's get_number method upon its setup.
 | 
						|
		 * It now exists only here in EDD_Order since EDD 3.0. EDD Payment gets its order_number
 | 
						|
		 * value from EDD_Order (this class), so it gets run for both EDD_Payment and EDD_Order this way.
 | 
						|
		 *
 | 
						|
		 * @since 2.5
 | 
						|
		 * @since 3.0 Updated the 3rd paramater from an EDD_Payment object to an EDD_Order object.
 | 
						|
		 *
 | 
						|
		 * @param string    The unique value to represent this order. This is a string because pre-fixes and post-fixes can be appended via the filter.
 | 
						|
		 * @param int       The row ID of the Payment/Order.
 | 
						|
		 * @param Order     Prior to EDD 3.0, this was an EDD_Payment object. Now it is an EDD_Order object.
 | 
						|
		 */
 | 
						|
		$number = apply_filters( 'edd_payment_number', $number, $this->ID, $this );
 | 
						|
 | 
						|
		/**
 | 
						|
		 * This filter is exactly the same as edd_payment_number, and exists purely so that
 | 
						|
		 * the "order" terminology has a filter as well.
 | 
						|
		 *
 | 
						|
		 * @since 3.0
 | 
						|
		 *
 | 
						|
		 * @param string    The unique value to represent this order. This is a string because pre-fixes and post-fixes can be appended via the filter.
 | 
						|
		 * @param int       The row ID of the Payment/Order.
 | 
						|
		 * @param Order     The EDD_Order object.
 | 
						|
		 */
 | 
						|
		$number = apply_filters( 'edd_order_number', $number, $this->ID, $this );
 | 
						|
 | 
						|
		return $number;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve all the items in the order.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return Order_Item[] Order items.
 | 
						|
	 */
 | 
						|
	public function get_items() {
 | 
						|
		if ( null === $this->items ) {
 | 
						|
			$this->items = edd_get_order_items( array(
 | 
						|
				'order_id'      => $this->id,
 | 
						|
				'orderby'       => 'cart_index',
 | 
						|
				'order'         => 'ASC',
 | 
						|
				'no_found_rows' => true,
 | 
						|
				'number'        => 200,
 | 
						|
			) );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->items;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve all the items in the order and transform bundle products into regular items.
 | 
						|
	 *
 | 
						|
	 * @since 3.0.2
 | 
						|
	 *
 | 
						|
	 * @return Order_Item[] Order items.
 | 
						|
	 */
 | 
						|
	public function get_items_with_bundles() {
 | 
						|
		$items = $this->get_items();
 | 
						|
		foreach ( $items as $index => $item ) {
 | 
						|
			if ( edd_is_bundled_product( $item->product_id ) ) {
 | 
						|
				$new_items        = array();
 | 
						|
				$bundled_products = edd_get_bundled_products( $item->product_id, $item->price_id );
 | 
						|
				foreach ( $bundled_products as $bundle_item ) {
 | 
						|
					$order_item_args = array(
 | 
						|
						'order_id'     => $this->ID,
 | 
						|
						'status'       => $item->status,
 | 
						|
						'product_id'   => edd_get_bundle_item_id( $bundle_item ),
 | 
						|
						'product_name' => edd_get_bundle_item_title( $bundle_item ),
 | 
						|
						'price_id'     => edd_get_bundle_item_price_id( $bundle_item ),
 | 
						|
					);
 | 
						|
					$new_items[]     = new \EDD\Orders\Order_Item( $order_item_args );
 | 
						|
				}
 | 
						|
				if ( ! empty( $new_items ) ) {
 | 
						|
					// The parent item should be replaced at its original position with its bundle items.
 | 
						|
					array_splice( $items, $index, 1, $new_items );
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return $items;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve all the adjustments applied to the order.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return array Order adjustments.
 | 
						|
	 */
 | 
						|
	public function get_adjustments() {
 | 
						|
		if ( null === $this->adjustments ) {
 | 
						|
			$this->adjustments = edd_get_order_adjustments( array(
 | 
						|
				'object_id'     => $this->id,
 | 
						|
				'object_type'   => 'order',
 | 
						|
				'no_found_rows' => true,
 | 
						|
				'order'         => 'ASC',
 | 
						|
			) );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->adjustments;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve the discounts applied to the order.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return Order_Adjustment[] Order discounts.
 | 
						|
	 */
 | 
						|
	public function get_discounts() {
 | 
						|
		$discounts = array();
 | 
						|
 | 
						|
		foreach ( $this->get_adjustments() as $adjustment ) {
 | 
						|
			/** @var Order_Adjustment $adjustment */
 | 
						|
 | 
						|
			if ( 'discount' === $adjustment->type ) {
 | 
						|
				$discounts[] = $adjustment;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $discounts;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve the fees applied to the order. This retrieves the fees applied to the entire order and to individual items.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return Order_Adjustment[] Order fees.
 | 
						|
	 */
 | 
						|
	public function get_fees() {
 | 
						|
 | 
						|
		// Default values
 | 
						|
		$fees = array();
 | 
						|
 | 
						|
		// Fetch the fees that applied to the entire order.
 | 
						|
		foreach ( $this->get_adjustments() as $adjustment ) {
 | 
						|
			/** @var Order_Adjustment $adjustment */
 | 
						|
 | 
						|
			if ( 'fee' === $adjustment->type ) {
 | 
						|
				$fees[] = $adjustment;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// Ensure items exist.
 | 
						|
		if ( null === $this->items ) {
 | 
						|
			$this->items = $this->get_items();
 | 
						|
		}
 | 
						|
 | 
						|
		// Fetch the fees that applied to specific items in the order.
 | 
						|
		foreach ( $this->items as $item ) {
 | 
						|
			/** @var Order_Item $item */
 | 
						|
 | 
						|
			foreach ( $item->get_fees() as $fee ) {
 | 
						|
				/** @var Order_Adjustment $fee */
 | 
						|
 | 
						|
				$fees[] = $fee;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $fees;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve the credits applied to the order.
 | 
						|
	 * These exist only for manually added orders.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 *@return Order_Adjustment[] Order credits.
 | 
						|
	 */
 | 
						|
	public function get_credits() {
 | 
						|
		// Default values
 | 
						|
		$credits = array();
 | 
						|
 | 
						|
		// Fetch the fees that applied to the entire order.
 | 
						|
		foreach ( $this->get_adjustments() as $adjustment ) {
 | 
						|
			/** @var Order_Adjustment $adjustment */
 | 
						|
 | 
						|
			if ( 'credit' === $adjustment->type ) {
 | 
						|
				$credits[] = $adjustment;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $credits;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve the transaction ID associated with the order.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @param string $type Transaction type. Default `primary`.
 | 
						|
	 * @return string|array $retval Transaction ID(s).
 | 
						|
	 */
 | 
						|
	public function get_transaction_id( $type = 'primary' ) {
 | 
						|
		$retval = '';
 | 
						|
 | 
						|
		// Retrieve first transaction ID only.
 | 
						|
		if ( 'primary' === $type ) {
 | 
						|
			$transactions = array_values( edd_get_order_transactions( array(
 | 
						|
				'object_id'   => $this->id,
 | 
						|
				'object_type' => 'order',
 | 
						|
				'orderby'     => 'date_created',
 | 
						|
				'order'       => 'ASC',
 | 
						|
				'fields'      => 'transaction_id',
 | 
						|
				'number'      => 1,
 | 
						|
			) ) );
 | 
						|
 | 
						|
			if ( $transactions ) {
 | 
						|
				$retval = esc_attr( $transactions[0] );
 | 
						|
			}
 | 
						|
 | 
						|
		// Retrieve all transaction IDs.
 | 
						|
		} else {
 | 
						|
			$retval = edd_get_order_transactions( array(
 | 
						|
				'object_id'   => $this->id,
 | 
						|
				'object_type' => 'order',
 | 
						|
				'orderby'     => 'date_created',
 | 
						|
				'order'       => 'ASC',
 | 
						|
				'fields'      => 'transaction_id',
 | 
						|
			) );
 | 
						|
		}
 | 
						|
 | 
						|
		return $retval;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieves the tax rate Adjustment object associated with the order.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @return Adjustment|false|null
 | 
						|
	 */
 | 
						|
	public function get_tax_rate_object() {
 | 
						|
		if ( $this->tax_rate_id && null === $this->tax_rate ) {
 | 
						|
			$this->tax_rate = edd_get_adjustment( $this->tax_rate_id );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->tax_rate;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve the tax rate associated with the order.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return float Tax rate percentage (0 - 100).
 | 
						|
	 */
 | 
						|
	public function get_tax_rate() {
 | 
						|
 | 
						|
		// Default rate
 | 
						|
		$rate = 0;
 | 
						|
 | 
						|
		// Get rates from adjustments
 | 
						|
		$tax_rate_object = $this->get_tax_rate_object();
 | 
						|
		if ( is_object( $tax_rate_object ) && isset( $tax_rate_object->amount ) ) {
 | 
						|
			$rate = $tax_rate_object->amount;
 | 
						|
		}
 | 
						|
 | 
						|
		/*
 | 
						|
		 * If we have a tax_amount, but no rate, check in order meta. This is where legacy rates are stored
 | 
						|
		 * if they cannot be resolved to an actual adjustment object.
 | 
						|
		 */
 | 
						|
		if ( empty( $rate ) && abs( $this->tax ) > 0 ) {
 | 
						|
			$rate = edd_get_order_meta( $this->id, 'tax_rate', true );
 | 
						|
		}
 | 
						|
 | 
						|
		return floatval( $rate );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve the address associated with the order.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return \EDD\Orders\Order_Address|false Object if successful, false otherwise.
 | 
						|
	 */
 | 
						|
	public function get_address() {
 | 
						|
 | 
						|
		// Attempt to get the order address.
 | 
						|
		$address = edd_get_order_address_by( 'order_id', $this->id );
 | 
						|
 | 
						|
		// Fallback object if not found.
 | 
						|
		if ( empty( $address ) ) {
 | 
						|
			$address = (object) array(
 | 
						|
				'id'          => 0,
 | 
						|
				'order_id'    => 0,
 | 
						|
				'first_name'  => '',
 | 
						|
				'last_name'   => '',
 | 
						|
				'address'     => '',
 | 
						|
				'address2'    => '',
 | 
						|
				'city'        => '',
 | 
						|
				'region'      => '',
 | 
						|
				'postal_code' => '',
 | 
						|
				'country'     => '',
 | 
						|
			);
 | 
						|
		}
 | 
						|
 | 
						|
		// Return address (from DB or fallback).
 | 
						|
		return $address;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve whether or not unlimited downloads have been enabled on this order.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return bool True if unlimited downloads are enabled, false otherwise.
 | 
						|
	 */
 | 
						|
	public function has_unlimited_downloads() {
 | 
						|
		return (bool) edd_get_order_meta( $this->id, 'unlimited_downloads', true );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve all the notes for this order.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return array Notes associated with this order.
 | 
						|
	 */
 | 
						|
	public function get_notes() {
 | 
						|
		return edd_get_notes( array(
 | 
						|
			'object_id'   => $this->id,
 | 
						|
			'object_type' => 'order',
 | 
						|
			'order'       => 'ASC',
 | 
						|
		) );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Check if an order is complete.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return bool True if the order is complete, false otherwise.
 | 
						|
	 */
 | 
						|
	public function is_complete() {
 | 
						|
		return ( 'complete' === $this->status );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Determines if this order is able to be resumed by the user.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	public function is_recoverable() {
 | 
						|
		$recoverable_statuses = edd_recoverable_order_statuses();
 | 
						|
		if ( in_array( $this->status, $recoverable_statuses, true ) && empty( $this->get_transaction_id() ) ) {
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Returns the URL that a customer can use to resume an order, or false if it's not recoverable.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return bool|string
 | 
						|
	 */
 | 
						|
	public function get_recovery_url() {
 | 
						|
		if ( ! $this->is_recoverable() ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$recovery_url = add_query_arg(
 | 
						|
			array(
 | 
						|
				'edd_action' => 'recover_payment',
 | 
						|
				'payment_id' => urlencode( $this->id ),
 | 
						|
			),
 | 
						|
			edd_get_checkout_uri()
 | 
						|
		);
 | 
						|
 | 
						|
		/**
 | 
						|
		 * Legacy recovery URL filter.
 | 
						|
		 *
 | 
						|
		 * @param \EDD_Payment $payment The EDD payment object.
 | 
						|
		 */
 | 
						|
		if ( has_filter( 'edd_payment_recovery_url' ) ) {
 | 
						|
			$recovery_url = apply_filters( 'edd_payment_recovery_url', $recovery_url, edd_get_payment( $this->id ) );
 | 
						|
		}
 | 
						|
 | 
						|
		/**
 | 
						|
		 * The order recovery URL.
 | 
						|
		 *
 | 
						|
		 * @since 3.0
 | 
						|
		 * @param string            $recovery_url The order recovery URL.
 | 
						|
		 * @param \EDD\Orders\Order $this         The order object.
 | 
						|
		 */
 | 
						|
		return apply_filters( 'edd_order_recovery_url', $recovery_url, $this );
 | 
						|
	}
 | 
						|
}
 |