143 lines
4.9 KiB
PHP
143 lines
4.9 KiB
PHP
<?php
|
|
/**
|
|
* Products Action - Get products with enriched data
|
|
*
|
|
* Optimized to fetch only required fields for telesales app
|
|
* Includes BOGO rules from Woo Discount Rules plugin
|
|
*/
|
|
|
|
require_once __DIR__ . '/../services/UpsellService.php';
|
|
require_once __DIR__ . '/../services/DiscountRulesService.php';
|
|
|
|
/**
|
|
* Handle get_products action
|
|
*
|
|
* @return void
|
|
*/
|
|
function handleGetProducts(): void
|
|
{
|
|
$logFile = __DIR__ . '/../../logs/products_debug.log';
|
|
$logDir = dirname($logFile);
|
|
if (!is_dir($logDir)) {
|
|
mkdir($logDir, 0755, true);
|
|
}
|
|
|
|
$log = function($msg, $data = null) use ($logFile) {
|
|
$timestamp = date('Y-m-d H:i:s');
|
|
$logMessage = "[{$timestamp}] {$msg}";
|
|
if ($data !== null) {
|
|
$logMessage .= "\n" . print_r($data, true);
|
|
}
|
|
$logMessage .= "\n" . str_repeat('-', 80) . "\n";
|
|
file_put_contents($logFile, $logMessage, FILE_APPEND);
|
|
};
|
|
|
|
try {
|
|
$log("handleGetProducts() started");
|
|
|
|
$woocommerce = getWooCommerce();
|
|
$log("WooCommerce client initialized");
|
|
|
|
// Only fetch fields needed for telesales app
|
|
// Include meta_data for ACF fields like upsell_informatie
|
|
$productFields = 'id,name,price,type,upsell_ids,cross_sell_ids,callcenter_upsell_info';
|
|
$variationFields = 'id,price,attributes';
|
|
|
|
$products = $woocommerce->get('products', [
|
|
'status' => 'publish',
|
|
'per_page' => 100,
|
|
'_fields' => $productFields
|
|
]);
|
|
$log("Fetched products from WooCommerce", ['count' => count($products)]);
|
|
|
|
// Build service maps
|
|
$cuw_map = UpsellService::buildProductMap();
|
|
$log("Built CUW map");
|
|
|
|
// Get BOGO rules from Woo Discount Rules
|
|
$log("Creating DiscountRulesService...");
|
|
$discountService = new DiscountRulesService();
|
|
$log("DiscountRulesService created");
|
|
|
|
$productIds = array_map(fn($p) => (int) $p->id, $products);
|
|
$log("Product IDs extracted", ['count' => count($productIds)]);
|
|
|
|
$log("Calling buildProductBogoMap...");
|
|
$bogo_map = $discountService->buildProductBogoMap($productIds);
|
|
$log("BOGO map built", ['products_with_bogo' => count($bogo_map)]);
|
|
|
|
$enriched = [];
|
|
|
|
foreach ($products as $product) {
|
|
$productId = (int) $product->id;
|
|
|
|
$log("Product Info from WooCommerce", $product);
|
|
|
|
// Get variations for variable products (only needed fields)
|
|
$variation_details = [];
|
|
if ($product->type === 'variable') {
|
|
$variation_details = (array) $woocommerce->get(
|
|
"products/{$product->id}/variations",
|
|
[
|
|
'per_page' => 50,
|
|
'_fields' => $variationFields
|
|
]
|
|
);
|
|
}
|
|
|
|
// Combine upsell + cross-sell + CUW IDs
|
|
$upsell_ids = !empty($product->upsell_ids)
|
|
? array_map('intval', (array) $product->upsell_ids)
|
|
: [];
|
|
$cross_sell_ids = !empty($product->cross_sell_ids)
|
|
? array_map('intval', (array) $product->cross_sell_ids)
|
|
: [];
|
|
|
|
$cuw_ids = $cuw_map[$productId] ?? [];
|
|
|
|
$recommended_ids = array_values(array_unique(array_filter(array_merge(
|
|
$upsell_ids,
|
|
$cross_sell_ids,
|
|
$cuw_ids
|
|
))));
|
|
|
|
// Get BOGO rules for this product
|
|
$bogo_rules = $bogo_map[$productId] ?? [];
|
|
|
|
// Build minimal product object with only needed fields
|
|
$enriched[] = [
|
|
'id' => $productId,
|
|
'name' => $product->name,
|
|
'price' => $product->price,
|
|
'type' => $product->type,
|
|
'upsell_ids' => $upsell_ids,
|
|
'cross_sell_ids' => $cross_sell_ids,
|
|
'variation_details' => $variation_details,
|
|
'cuw_ids' => $cuw_ids,
|
|
'recommended_ids' => $recommended_ids,
|
|
'bogo_rules' => $bogo_rules,
|
|
'upsell_text' => $product->callcenter_upsell_info
|
|
];
|
|
}
|
|
|
|
$log("Returning " . count($enriched) . " enriched products");
|
|
echo json_encode($enriched);
|
|
} catch (Exception $e) {
|
|
$log("ERROR in handleGetProducts", [
|
|
'message' => $e->getMessage(),
|
|
'file' => $e->getFile(),
|
|
'line' => $e->getLine(),
|
|
'trace' => $e->getTraceAsString()
|
|
]);
|
|
echo json_encode(['error' => $e->getMessage()]);
|
|
} catch (Error $e) {
|
|
$log("FATAL ERROR in handleGetProducts", [
|
|
'message' => $e->getMessage(),
|
|
'file' => $e->getFile(),
|
|
'line' => $e->getLine(),
|
|
'trace' => $e->getTraceAsString()
|
|
]);
|
|
echo json_encode(['error' => $e->getMessage()]);
|
|
}
|
|
}
|