Files
WooNooW/includes/Compat/PaymentChannels.php
dwindown 232059e928 feat: Complete Dashboard API Integration with Analytics Controller
 Features:
- Implemented API integration for all 7 dashboard pages
- Added Analytics REST API controller with 7 endpoints
- Full loading and error states with retry functionality
- Seamless dummy data toggle for development

📊 Dashboard Pages:
- Customers Analytics (complete)
- Revenue Analytics (complete)
- Orders Analytics (complete)
- Products Analytics (complete)
- Coupons Analytics (complete)
- Taxes Analytics (complete)
- Dashboard Overview (complete)

🔌 Backend:
- Created AnalyticsController.php with REST endpoints
- All endpoints return 501 (Not Implemented) for now
- Ready for HPOS-based implementation
- Proper permission checks

🎨 Frontend:
- useAnalytics hook for data fetching
- React Query caching
- ErrorCard with retry functionality
- TypeScript type safety
- Zero build errors

📝 Documentation:
- DASHBOARD_API_IMPLEMENTATION.md guide
- Backend implementation roadmap
- Testing strategy

🔧 Build:
- All pages compile successfully
- Production-ready with dummy data fallback
- Zero TypeScript errors
2025-11-04 11:19:00 +07:00

118 lines
3.9 KiB
PHP

<?php
namespace WooNooW\Compat;
if ( ! defined('ABSPATH') ) exit;
/**
* Payment Channels Handler
*
* Automatically detects and exposes payment gateway channels (e.g., bank accounts)
* to the WooNooW admin SPA.
*
* @since 1.0.0
*/
class PaymentChannels {
/**
* Initialize hooks
*/
public static function init() {
add_filter('woonoow/payment_gateway_channels', [__CLASS__, 'detect_bacs_accounts'], 10, 3);
add_filter('woonoow/payment_gateway_channels', [__CLASS__, 'detect_custom_channels'], 20, 3);
}
/**
* Detect BACS (Bank Transfer) accounts
*
* WooCommerce BACS gateway supports multiple bank accounts.
* This automatically exposes them as channels.
*/
public static function detect_bacs_accounts( array $channels, string $gateway_id, $gateway ): array {
if ( $gateway_id !== 'bacs' ) {
return $channels;
}
// Get account details from gateway settings
// Try multiple methods to get account details
$accounts = [];
// Method 1: get_option (standard WooCommerce method)
if ( method_exists( $gateway, 'get_option' ) ) {
$accounts = $gateway->get_option( 'account_details', [] );
}
// Method 2: Direct property access (fallback)
if ( empty( $accounts ) && isset( $gateway->account_details ) ) {
$accounts = $gateway->account_details;
}
// Method 3: Get from WordPress options directly (last resort)
if ( empty( $accounts ) ) {
$gateway_settings = get_option( 'woocommerce_bacs_settings', [] );
if ( isset( $gateway_settings['account_details'] ) ) {
$accounts = $gateway_settings['account_details'];
}
}
if ( empty( $accounts ) || ! is_array( $accounts ) ) {
return $channels;
}
// Convert accounts to channels
foreach ( $accounts as $index => $account ) {
if ( ! is_array( $account ) || empty( $account['account_name'] ) ) {
continue;
}
$bank_name = $account['bank_name'] ?? '';
$account_name = $account['account_name'] ?? '';
$account_num = $account['account_number'] ?? '';
// Build channel title
$title = $bank_name ? "{$bank_name} - {$account_name}" : $account_name;
if ( $account_num ) {
$title .= " ({$account_num})";
}
$channels[] = [
'id' => 'bacs_' . sanitize_title( $account_name . '_' . $index ),
'title' => $title,
'meta' => $account,
];
}
return $channels;
}
/**
* Detect custom channels from other gateways
*
* This is a placeholder for future gateway integrations.
* Other plugins can hook into woonoow/payment_gateway_channels
* to provide their own channel logic.
*/
public static function detect_custom_channels( array $channels, string $gateway_id, $gateway ): array {
/**
* Hook for third-party payment gateway channel detection
*
* Example for Stripe with multiple accounts:
*
* add_filter('woonoow/payment_gateway_channels', function($channels, $gateway_id, $gateway) {
* if ($gateway_id === 'stripe') {
* $accounts = get_option('stripe_connected_accounts', []);
* foreach ($accounts as $account) {
* $channels[] = [
* 'id' => 'stripe_' . $account['id'],
* 'title' => $account['name'],
* 'meta' => $account,
* ];
* }
* }
* return $channels;
* }, 30, 3);
*/
return $channels;
}
}