80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Refundable Item
 | |
|  *
 | |
|  * @package   easy-digital-downloads
 | |
|  * @copyright Copyright (c) 2021, Sandhills Development, LLC
 | |
|  * @license   GPL2+
 | |
|  * @since     3.0
 | |
|  */
 | |
| 
 | |
| namespace EDD;
 | |
| 
 | |
| trait Refundable_Item {
 | |
| 
 | |
| 	/**
 | |
| 	 * Refunded order items for this item.
 | |
| 	 *
 | |
| 	 * When this item has been refunded, matching item records are created and associated with the
 | |
| 	 * refund record. These are those items.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 * @var null|array|false
 | |
| 	 */
 | |
| 	protected $refunded_items = null;
 | |
| 
 | |
| 	/**
 | |
| 	 * Retrieves records that were refunded from this original item.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @return array|false
 | |
| 	 */
 | |
| 	abstract public function get_refunded_items();
 | |
| 
 | |
| 	/**
 | |
| 	 * The maximum amounts that can be refunded. This starts with the original item amounts, subtracts
 | |
| 	 * discounts, and subtracts what's already been refunded.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function get_refundable_amounts() {
 | |
| 		$subtotal = $this->subtotal;
 | |
| 		if ( ! empty( $this->discount ) ) {
 | |
| 			$subtotal -= $this->discount;
 | |
| 		}
 | |
| 
 | |
| 		$maximums = array(
 | |
| 			'subtotal' => $subtotal,
 | |
| 			'tax'      => $this->tax,
 | |
| 			'total'    => $this->total,
 | |
| 			'quantity' => $this->quantity,
 | |
| 		);
 | |
| 
 | |
| 		$refunded_items = $this->get_refunded_items();
 | |
| 
 | |
| 		if ( ! empty( $refunded_items ) ) {
 | |
| 			foreach ( $refunded_items as $refunded_item ) {
 | |
| 				// We're adding numbers here, because `$refund_item` has negative amounts already.
 | |
| 				$maximums['subtotal'] += $refunded_item->subtotal;
 | |
| 				$maximums['tax']      += $refunded_item->tax;
 | |
| 				$maximums['total']    += $refunded_item->total;
 | |
| 				// If a partial refund was spread across all order items, just use the original quantity.
 | |
| 				if ( abs( $refunded_item->quantity ) < abs( $this->quantity ) ) {
 | |
| 					$maximums['quantity'] += $refunded_item->quantity;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$maximums['subtotal'] = number_format( $maximums['subtotal'], edd_currency_decimal_filter(), '.', '' );
 | |
| 		$maximums['tax']      = number_format( $maximums['tax'], edd_currency_decimal_filter(), '.', '' );
 | |
| 		$maximums['total']    = number_format( $maximums['total'], edd_currency_decimal_filter(), '.', '' );
 | |
| 		$maximums['quantity'] = intval( $maximums['quantity'] );
 | |
| 
 | |
| 		return $maximums;
 | |
| 	}
 | |
| 
 | |
| }
 |