autoship_qpilot_orders_update_via_rest_convert_fees_to_coupons (function)
( src/coupons.php) Preprocesses a QPilot Order to remove fee lines that will be added as a virtual coupon so taxes and totals are correctly applied. Takes the $original_request and the (current) $request as its parameters.
/**
* Runs QPilot Orders through a pre-processor to remove fee lines
* which will later be added as a virtual coupon so that taxes and totals
* are calculated correctly.
*
* @param WP_REST_Request $request The current Request data.
* @param WP_REST_Request $original_request The original Request data.
* @return WP_Error|WP_REST_Response
*/
function autoship_qpilot_orders_update_via_rest_convert_fees_to_coupons( $request, $original_request ) {
// allow devs to flip the path from the new pre-process route to the legacy direct
if ( apply_filters('autoship_qpilot_orders_via_rest_enable_fee_lines', autoship_rest_order_fee_lines_enabled() , $request ) )
return $request;
// Check for Coupon Metadata
$coupons = array();
if ( isset( $request['meta_data'] ) && !empty( $request['meta_data'] ) ){
foreach ($request['meta_data'] as $key => $meta ) {
if ( '_qpilot_coupon_data' == $meta['key'] ){
$coupons = $meta['value'];
break;
}
}
}
$new_coupons = $new_codes = array();
// Loop through coupon objects and generate virtual coupon.
foreach ( $coupons as $key => $coupon ) {
$type = autoship_get_coupon_type_by_code( $coupon['discountType'] );
if ( !empty( $type ) ){
$new_coupons['Coupon: ' . $coupon['code']] = autoship_generate_virtual_wc_coupon( array(
'code' => 'Coupon: ' . $coupon['code'],
'description' => sprintf( __( 'QPilot Dynamic Coupon generated from Coupon ID #%d.', 'autoship' ), $coupon['id'] ),
'discount_type' => $type,
'amount' => $coupon['amount']
));
}
}
// Allow devs to hook in so that these could be converted to real coupons or modify on the fly
$new_coupons = apply_filters( 'autoship_rest_generated_virtual_wc_coupons', $new_coupons, $coupons, $request );
// Grab the request metadata
$meta_data = $request['meta_data'];
// Add the virtual coupons to the request for later use.
if ( !empty( $new_coupons ) ){
$meta_data[] = array(
'key' => '_qpilot_dynamic_coupons',
'value' => $new_coupons
);
}
// Check for Fee lines and if a coupon has been generated for it remove the line.
if ( isset( $request['fee_lines'] ) && !empty( $request['fee_lines'] ) ){
/**
* Loop through the fee lines and remove any we have coupons for.
* Any that get removed add to the legacy fee metadata.
*/
$fee_lines = $request['fee_lines'];
$legacy_fee_lines = array();
foreach ($fee_lines as $key => $fee) {
if ( isset( $new_coupons[$fee['name']] ) ){
$legacy_fee_lines[] = $fee;
unset( $fee_lines[$key] );
}
}
}
// Set the new fee line values.
if ( empty( $fee_lines ) ){
$request->offsetUnset( 'fee_lines' );
} else {
$request->set_param(
'fee_lines',
$fee_lines
);
}
// Attach any legacy fee lines
if ( !empty( $legacy_fee_lines ) ){
$meta_data[] = array(
'key' => '_qpilot_legacy_fee_lines',
'value' => $legacy_fee_lines
);
}
// Re-attach the metadata
$request->set_param(
'meta_data',
$meta_data
);
return $request;
}
add_filter( 'autoship_qpilot_orders_via_rest', 'autoship_qpilot_orders_update_via_rest_convert_fees_to_coupons', 10, 2 );