autoship_get_product_sync_summary
(src/products.php) Function used to get and use QPilot's API response from syncing a product. Takes a product id as a parameter.
Example
/**
* Retrieves the product summary from QPilot for the supplied id..
*
* @param mixed $id. Product id.
* @return array|WP_Error The Summary Data or WP_Error on failure
*/
function autoship_get_product_sync_summary ( $id ){
// Get the product ( if invalid or wrong type or not correct status returns false )
if ( ( $product = autoship_productize_and_validate( $id ) ) === false )
return new WP_Error( 'Product Summary Retrieval Failed', __( 'Autoship Sync information is not available for this product. Please confirm the product is a valid product type and status.', "autoship" ) );
// Create the QPilot client
// Grab the client and only continue if connection exists.
if ( empty( $client = autoship_get_default_client() ) || empty( $client->get_token_auth() ) )
return new WP_Error( 'Product Summary Retrieval Failed', __( 'A problem was encountered while trying to retrieve this Product\'s Sync Information. Please confirm your Autoship Connection is healthy and setup correctly.', "autoship" ) );
// Get the product via external id.
$all_ids = array( $id );
$ids = array();
if ( 'variable' == $product->get_type() ){
// If Variation get all children as well
$ids = autoship_get_available_variations( $product, true );
// $ids['valids'][] = $id;
$all_ids = array_merge( $ids['valids'] , $ids['invalids'], array( $id ) );
}
try {
$summaries = $client->get_product_summary_by_external_ids( $all_ids );
} catch ( Exception $e ) {
if ( '404' == $e->getCode() ){
error_log( sprintf( 'The supplied product can not be found in Autoship Cloud. Additional Details: %s', $e->getMessage() ) );
return new WP_Error( 'Product Not Found', __( "The supplied product could not be found in Autoship Cloud", "autoship" ) );
} else {
$notice = autoship_expand_http_code( $e->getCode() );
error_log( sprintf( 'Product Summary Retrieval Failed. Additional Details: %s', $e->getMessage() ) );
return new WP_Error( 'Product Summary Retrieval Failed', sprintf( __( 'A problem was encountered while trying to retrieve this Product\'s Sync Information. Please confirm your Autoship Connection is healthy and setup correctly. Additional Details: <i>%s</i>', "autoship" ), $notice['desc'] ) );
}
}
if ( empty( $summaries ) )
return new WP_Error( 'Product Not Found', __( "The supplied product could not be found in QPilot", "autoship" ) );
$totals = array();
if ( 'variation' == $product->get_type() || 'simple' == $product->get_type() ){
$totals = apply_filters( 'autoship_product_summary_data', array(
'Id' => $summaries[0]->Id,
'ExternalId' => $summaries[0]->ExternalId,
'ProductName' => $summaries[0]->ProductName,
'AddToScheduledOrder' => strpos($summaries[0]->Availability, 'AddToScheduledOrder') !== false,
'ProcessScheduledOrder' => strpos($summaries[0]->Availability, 'ProcessScheduledOrder') !== false,
'Availability' => $summaries[0]->Availability,
'ProductType' => $summaries[0]->ProductType,
'StockLevel' => $summaries[0]->StockLevel,
'TotalStock' => $summaries[0]->Stock,
'QuantityScheduled' => $summaries[0]->TotalQuantityScheduledActive +
$summaries[0]->TotalQuantityScheduledPaused +
$summaries[0]->TotalQuantityFailed +
$summaries[0]->TotalQuantityProcessing +
$summaries[0]->TotalQuantityQueued,
'TotalQuantityScheduledActive' => $summaries[0]->TotalQuantityScheduledActive,
'TotalQuantityScheduledPaused' => $summaries[0]->TotalQuantityScheduledPaused,
'TotalQuantityFailed' => $summaries[0]->TotalQuantityFailed,
'TotalQuantityProcessing' => $summaries[0]->TotalQuantityProcessing,
'TotalQuantityQueued' => $summaries[0]->TotalQuantityQueued,
'LifetimeValue' => $summaries[0]->LifetimeValue,
'ShippingClass' => $summaries[0]->ShippingClass,
'Active' => $summaries[0]->Active,
'Valid' => $summaries[0]->Valid,
'ValidationErrorCode' => $summaries[0]->ValidationErrorCode,
'UpdatedUtc' => $summaries[0]->UpdatedUtc,
'SyncError' => ''
), $summaries[0], $product );
// Since we've already pulled the Active flag from QPilot get the flag from WooCommerce / Autoship
$totals['AutoshipActive'] = ( 'yes' === autoship_sync_active_enabled( $product ) );
// Run Sync Checks
$totals['SyncError'] = apply_filters( 'autoship_product_summary_data_sync_error', $totals['SyncError'], $totals, $summaries[0], $product, $ids );
return apply_filters( 'autoship_total_product_summary_data', $totals, $product );
// If this is a variable product then sum variations totals.
} else {
$totals = array(
'TotalActive' => 0,
'TotalAutoshipActive' => 0,
'TotalInactive' => 0,
'TotalAddToScheduledOrder' => 0,
'TotalProcessScheduledOrder' => 0,
'TotalUnAvailable' => 0,
'TotalInStock' => 0,
'TotalOutOfStock' => 0,
'QuantityScheduled' => 0,
'TotalQuantityScheduledActive' => 0,
'TotalQuantityScheduledPaused' => 0,
'TotalQuantityFailed' => 0,
'TotalQuantityProcessing' => 0,
'TotalVariations' => 0,
'TotalAutoshipVariations' => 0,
'TotalErrors' => 0,
'TotalInvalids' => 0,
'TotalValids' => 0,
'TotalActiveInvalids' => 0,
);
$variations = $autoship_variations = $errors = array();
foreach ( $summaries as $key => $summary) {
// Try to get the product in WC
$row_product = wc_get_product( $summary->ExternalId );
// If product variation doesn't exist in WC but exists in QPilot we can't gather any info.
// TODO: We need to better deal with this situation.
if ( !$row_product )
continue;
$variations[$summary->ExternalId] = apply_filters( 'autoship_variable_product_summary_data', array(
'Id' => $summary->Id,
'ExternalId' => $summary->ExternalId,
'ProductName' => $summary->ProductName,
'AddToScheduledOrder' => strpos($summary->Availability, 'AddToScheduledOrder') !== false,
'ProcessScheduledOrder' => strpos($summary->Availability, 'ProcessScheduledOrder') !== false,
'Availability' => $summary->Availability,
'ProductType' => $summary->ProductType,
'StockLevel' => $summary->StockLevel,
'TotalStock' => $summary->Stock,
'QuantityScheduled' => $summary->TotalQuantityScheduledActive +
$summary->TotalQuantityScheduledPaused +
$summary->TotalQuantityFailed +
$summary->TotalQuantityProcessing +
$summary->TotalQuantityQueued,
'TotalQuantityScheduledActive' => $summary->TotalQuantityScheduledActive,
'TotalQuantityScheduledPaused' => $summary->TotalQuantityScheduledPaused,
'TotalQuantityFailed' => $summary->TotalQuantityFailed,
'TotalQuantityProcessing' => $summary->TotalQuantityProcessing,
'TotalQuantityQueued' => $summary->TotalQuantityQueued,
'LifetimeValue' => $summary->LifetimeValue,
'ShippingClass' => $summary->ShippingClass,
'Active' => $summary->Active,
'Valid' => $summary->Valid,
'ValidationErrorCode' => $summary->ValidationErrorCode,
'UpdatedUtc' => $summary->UpdatedUtc,
'SyncError' => ''
), $summary, $product );
// Since we've already pulled the Active flag from QPilot get the flag from WooCommerce / Autoship
$variations[$summary->ExternalId]['AutoshipActive'] = ( 'yes' === autoship_sync_active_enabled( $row_product ) );
// Run Sync Checks
$variations[$summary->ExternalId]['SyncError'] = apply_filters( 'autoship_product_summary_data_sync_error', $variations[$summary->ExternalId]['SyncError'], $variations[$summary->ExternalId], $summary, $row_product, $ids );
if ( is_wp_error( $variations[$summary->ExternalId]['SyncError'] ) )
$errors[] = $variations[$summary->ExternalId]['SyncError'];
// Only include variations in totals NOT variable
if ( 'variation' == $summary->ProductType ){
$totals['TotalAddToScheduledOrder'] += (int) $variations[$summary->ExternalId]['AddToScheduledOrder'];
$totals['TotalProcessScheduledOrder'] += (int) $variations[$summary->ExternalId]['ProcessScheduledOrder'];
$totals['TotalUnAvailable'] += (int) 'None' == $variations[$summary->ExternalId]['Availability'];
$totals['TotalActive'] += (int) $variations[$summary->ExternalId]['Active'];
$totals['TotalAutoshipActive'] += (int) $variations[$summary->ExternalId]['AutoshipActive'];
$totals['TotalInactive'] += (int)!$variations[$summary->ExternalId]['Active'];
$totals['TotalInStock'] += (int) 'InStock' == $variations[$summary->ExternalId]['StockLevel'];
$totals['TotalOutOfStock'] += (int) 'InStock' != $variations[$summary->ExternalId]['StockLevel'];
$totals['QuantityScheduled'] += $variations[$summary->ExternalId]['QuantityScheduled'];
$totals['TotalQuantityScheduledActive'] += $variations[$summary->ExternalId]['TotalQuantityScheduledActive'];
$totals['TotalQuantityScheduledPaused'] += $variations[$summary->ExternalId]['TotalQuantityScheduledPaused'];
$totals['TotalQuantityFailed'] += $variations[$summary->ExternalId]['TotalQuantityFailed'];
$totals['TotalQuantityProcessing'] += $variations[$summary->ExternalId]['TotalQuantityProcessing'];
$totals['TotalVariations'] += (int) ( 'variation' == $summary->ProductType );
$totals['TotalInvalids'] += (int) ( !$variations[$summary->ExternalId]['Valid'] );
$totals['TotalValids'] += (int) ( $variations[$summary->ExternalId]['Valid'] );
// Not valid and active are a problem and should be addressed.
$totals['TotalActiveInvalids'] += (int) ( !$variations[$summary->ExternalId]['Valid'] && $variations[$summary->ExternalId]['Active'] );
// Gather variations that are active in WooCommerce / Autoship
if ( $variations[$summary->ExternalId]['AutoshipActive'] )
$autoship_variations[$summary->ExternalId] = $summary->ExternalId;
}
}
$totals['StockLevel'] = $totals['TotalInStock'] ? 'InStock' : 'OutOfStock';
$totals['Variations'] = $variations;
$totals['AutoshipVariations'] = $autoship_variations;
$totals['SyncError'] = reset( $errors );
$totals['AllSyncError'] = $errors;
$totals['TotalErrors'] = count( $errors );
return apply_filters( 'autoship_total_variation_product_summary_data', $totals, $product, $ids );
}
}