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;
|
|
}
|
|
|
|
}
|