1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
<?php /** * WC Admin Order Trait * * WC Admin Order Trait class that houses shared functionality across order and refund classes. */
namespace Automattic\WooCommerce\Admin\Overrides;
defined( 'ABSPATH' ) || exit;
/** * OrderTraits class. */ trait OrderTraits { /** * Calculate shipping amount for line item/product as a total shipping amount ratio based on quantity. * * @param WC_Order_Item $item Line item from order. * @param int $order_items_count (optional) The number of order items in an order. This could be the remaining items left to refund. * @param float $shipping_amount (optional) The shipping fee amount in an order. This could be the remaining shipping amount left to refund. * * @return float|int */ public function get_item_shipping_amount( $item, $order_items_count = null, $shipping_amount = null ) { // Shipping amount loosely based on woocommerce code in includes/admin/meta-boxes/views/html-order-item(s).php // distributed simply based on number of line items. $product_qty = $item->get_quantity( 'edit' );
// Use the passed order_items_count if provided, otherwise get the total number of items in the order. // This is useful when calculating refunds for partial items in an order. // For example, if 2 items are refunded from an order with 4 items. The remaining 2 items should have the shipping fee of the refunded items distributed to them. $order_items = null !== $order_items_count ? $order_items_count : $this->get_item_count();
if ( 0 === $order_items ) { return 0; }
// Use the passed shipping_amount if provided, otherwise get the total shipping amount in the order. // This is useful when calculating refunds for partial shipping in an order. // For example, if $10 shipping is refunded from an order with $30 shipping, the remaining $20 should be distributed to the remaining items. $total_shipping_amount = null !== $shipping_amount ? $shipping_amount : (float) $this->get_shipping_total();
return $total_shipping_amount / $order_items * $product_qty; }
/** * Calculate shipping tax amount for line item/product as a total shipping tax amount ratio based on quantity. * * Loosely based on code in includes/admin/meta-boxes/views/html-order-item(s).php. * * @todo If WC is currently not tax enabled, but it was before (or vice versa), would this work correctly? * * @param WC_Order_Item $item Line item from order. * @param int $order_items_count (optional) The number of order items in an order. This could be the remaining items left to refund. * @param float $shipping_tax_amount (optional) The shipping tax amount in an order. This could be the remaining shipping tax amount left to refund. * * @return float|int */ public function get_item_shipping_tax_amount( $item, $order_items_count = null, $shipping_tax_amount = null ) { // Use the passed order_items_count if provided, otherwise get the total number of items in the order. // This is useful when calculating refunds for partial items in an order. // For example, if 2 items are refunded from an order with 4 items. The remaining 2 items should have the shipping tax of the refunded items distributed to them. $order_items = null !== $order_items_count ? $order_items_count : $this->get_item_count();
if ( 0 === $order_items ) { return 0; }
// Use the passed shipping_tax_amount if provided, otherwise initialize it to 0 and calculate the total shipping tax amount in the order. // This is useful when calculating refunds for partial shipping tax in an order. // For example, if $1 shipping tax is refunded from an order with $3 shipping tax, the remaining $2 should be distributed to the remaining items. $total_shipping_tax_amount = $shipping_tax_amount ? $shipping_tax_amount : 0;
if ( null === $shipping_tax_amount ) { $order_taxes = $this->get_taxes(); $line_items_shipping = $this->get_items( 'shipping' ); foreach ( $line_items_shipping as $item_id => $shipping_item ) { $tax_data = $shipping_item->get_taxes(); if ( $tax_data ) { foreach ( $order_taxes as $tax_item ) { $tax_item_id = $tax_item->get_rate_id(); $tax_item_total = isset( $tax_data['total'][ $tax_item_id ] ) ? (float) $tax_data['total'][ $tax_item_id ] : 0; $total_shipping_tax_amount += $tax_item_total; } } } }
$product_qty = $item->get_quantity( 'edit' );
return $total_shipping_tax_amount / $order_items * $product_qty; }
/** * Calculates coupon amount for specified line item/product. * * Coupon calculation based on woocommerce code in includes/admin/meta-boxes/views/html-order-item.php. * * @param WC_Order_Item $item Line item from order. * * @return float */ public function get_item_coupon_amount( $item ) { return floatval( $item->get_subtotal( 'edit' ) - $item->get_total( 'edit' ) ); }
/** * Calculate cart tax amount for line item/product. * * @param WC_Order_Item $item Line item from order. * * @return float */ public function get_item_cart_tax_amount( $item ) { $order_taxes = $this->get_taxes(); $tax_data = $item->get_taxes(); $cart_tax_amount = 0.0;
foreach ( $order_taxes as $tax_item ) { $tax_item_id = $tax_item->get_rate_id(); $cart_tax_amount += isset( $tax_data['total'][ $tax_item_id ] ) ? (float) $tax_data['total'][ $tax_item_id ] : 0; }
return $cart_tax_amount; } }
|