gruene-seele/dev/dhl-for-woocommerce/includes/class-pr-dhl-extend-block-core.php
Kevin Adametz 0f641ef33a Housekeeping: offene Dev-Dateien eingecheckt + Sidebar „Bestellungen"→„Versand"
- Sidebar-Menü „Bestellungen" in „Versand" umbenannt (layout-sidenav), sonst nur
  Blade-Formatierung.
- Entwicklungspläne in ISO-Datumsformat umbenannt (entwicklungsplan-aktualisiert-*).
- dev/dhl-for-woocommerce/ (DHL-Plugin) + dev/partnercenter-api.zip + PastedGraphic
  hinzugefügt.
- .claude/ bewusst NICHT eingecheckt (lokale Claude-Code-Konfiguration).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-28 12:04:41 +00:00

209 lines
9.1 KiB
PHP

<?php
/**
* DHL checkout Extend WC Core.
*/
if (! class_exists('PR_DHL_Extend_Block_core')) {
class PR_DHL_Extend_Block_core
{
/**
* Plugin Identifier, unique to each plugin.
*
* @var string
*/
private $name = 'pr-dhl';
/**
* Bootstraps the class and hooks required data.
*/
public function __construct()
{
add_action('woocommerce_store_api_checkout_update_order_from_request', [
$this,
'save_dhl_checkout_fields',
], 10, 2);
// Register the update callback when WooCommerce Blocks is loaded
add_action('init', [$this, 'register_store_api_callback']);
// Register fee calculation
add_action('woocommerce_cart_calculate_fees', [$this, 'add_preferred_day_fee']);
}
/**
* Saves the dhl fields to the order's metadata.
*
* @return void
*/
public function save_dhl_checkout_fields(WC_Order $order, WP_REST_Request $request)
{
$pr_dhl_request_data = isset($request['extensions'][$this->name]) ? $request['extensions'][$this->name] : [];
$dhl_label_options = [];
if (! empty($pr_dhl_request_data['preferredDay'])) {
$dhl_label_options['pr_dhl_preferred_day'] = wc_clean($pr_dhl_request_data['preferredDay']);
}
$settings = PR_DHL()->get_shipping_dhl_settings();
$has_location = ! empty($settings['dhl_preferred_location']) && $settings['dhl_preferred_location'] === 'yes';
$has_neighbor = ! empty($settings['dhl_preferred_neighbour']) && $settings['dhl_preferred_neighbour'] === 'yes';
$both_enabled = $has_location && $has_neighbor;
$dropp_off_choice = isset($pr_dhl_request_data['preferredLocationNeighbor'])
? wc_clean($pr_dhl_request_data['preferredLocationNeighbor'])
: '';
$dropp_off_choice = in_array($dropp_off_choice, [
'none',
'location',
'neighbor',
], true) ? $dropp_off_choice : '';
if ($both_enabled) {
if ($dropp_off_choice === 'location') {
$loc = isset($pr_dhl_request_data['preferredLocation']) ? trim($pr_dhl_request_data['preferredLocation']) : '';
if ($loc === '') {
throw new Exception(__('Please enter the preferred location.', 'dhl-for-woocommerce'));
}
$dhl_label_options['pr_dhl_preferred_location_neighbor'] = 'location';
$dhl_label_options['pr_dhl_preferred_location'] = wc_clean($loc);
} elseif ($dropp_off_choice === 'neighbor') {
$nm = isset($pr_dhl_request_data['preferredNeighborName']) ? trim($pr_dhl_request_data['preferredNeighborName']) : '';
$adr = isset($pr_dhl_request_data['preferredNeighborAddress']) ? trim($pr_dhl_request_data['preferredNeighborAddress']) : '';
if ($nm === '' || $adr === '') {
throw new Exception(__('Please enter the preferred neighbor name and address.', 'dhl-for-woocommerce'));
}
$dhl_label_options['pr_dhl_preferred_location_neighbor'] = 'neighbor';
$dhl_label_options['pr_dhl_preferred_neighbour_name'] = wc_clean($nm);
$dhl_label_options['pr_dhl_preferred_neighbour_address'] = wc_clean($adr);
}
} else {
if ($has_location) {
$loc = isset($pr_dhl_request_data['preferredLocation']) ? trim($pr_dhl_request_data['preferredLocation']) : '';
if ($loc !== '') {
$dhl_label_options['pr_dhl_preferred_location_neighbor'] = 'location';
$dhl_label_options['pr_dhl_preferred_location'] = wc_clean($loc);
}
} elseif ($has_neighbor) {
$nm = isset($pr_dhl_request_data['preferredNeighborName']) ? trim($pr_dhl_request_data['preferredNeighborName']) : '';
$adr = isset($pr_dhl_request_data['preferredNeighborAddress']) ? trim($pr_dhl_request_data['preferredNeighborAddress']) : '';
if ($nm !== '' || $adr !== '') {
if ($nm === '' || $adr === '') {
throw new Exception(__('Please enter the preferred neighbor name and address.', 'dhl-for-woocommerce'));
}
$dhl_label_options['pr_dhl_preferred_location_neighbor'] = 'neighbor';
$dhl_label_options['pr_dhl_preferred_neighbour_name'] = wc_clean($nm);
$dhl_label_options['pr_dhl_preferred_neighbour_address'] = wc_clean($adr);
}
}
}
if (! empty($pr_dhl_request_data['closest_drop_point'])) {
$dhl_label_options['pr_dhl_cdp_delivery'] = wc_clean($pr_dhl_request_data['closest_drop_point']);
}
if (! empty($dhl_label_options)) {
PR_DHL()->get_pr_dhl_wc_order()->save_dhl_label_items($order->get_id(), $dhl_label_options);
}
// The Post Number only applies to Packstation / Postfiliale deliveries. Persist it only
// when the address type or the shipping address itself is a droppoint; otherwise drop any
// stale value so a Regular Address never carries a Post Number to the DHL API. Mirrors the
// classic checkout's clear_post_number_for_regular_address().
$address_type = isset($pr_dhl_request_data['addressType']) ? wc_clean($pr_dhl_request_data['addressType']) : '';
$shipping_postnum = isset($pr_dhl_request_data['postNumber']) ? sanitize_text_field($pr_dhl_request_data['postNumber']) : '';
$shipping_address_1 = $order->get_shipping_address_1();
if (PR_DHL()->is_droppoint($address_type, $shipping_address_1)) {
$order->update_meta_data('_shipping_dhl_postnum', $shipping_postnum);
} else {
$order->delete_meta_data('_shipping_dhl_postnum');
}
// Save the order to persist changes.
$order->save();
}
/**
* Register the update callback with WooCommerce Store API
*/
public function register_store_api_callback()
{
if (function_exists('woocommerce_store_api_register_update_callback')) {
woocommerce_store_api_register_update_callback(
[
'namespace' => $this->name,
'callback' => [$this, 'store_api_callback'],
]
);
}
}
/**
* Callback function for the Store API update
*
* @param array $data Data sent from the client.
*/
public function store_api_callback($data)
{
if (isset($data['action']) && $data['action'] === 'update_preferred_day_fee') {
$price = isset($data['price']) ? floatval($data['price']) : 0;
$label = isset($data['label']) ? sanitize_text_field($data['label']) : '';
if ($price > 0 && $label !== '') {
// Store the fee amount and label in session
WC()->session->set('pr_dhl_preferred_day_fee', $price);
WC()->session->set('pr_dhl_preferred_day_label', $label);
} else {
WC()->session->__unset('pr_dhl_preferred_day_fee');
WC()->session->__unset('pr_dhl_preferred_day_label');
}
} else {
WC()->session->__unset('pr_dhl_preferred_day_fee');
WC()->session->__unset('pr_dhl_preferred_day_label');
}
}
/**
* Adds the preferred day fee to the WooCommerce cart.
*
* @param WC_Cart $cart The WooCommerce cart object.
*/
public function add_preferred_day_fee($cart)
{
if (is_admin() && ! defined('DOING_AJAX')) {
return;
}
if (! $cart->needs_shipping()) {
WC()->session->__unset('pr_dhl_preferred_day_fee');
WC()->session->__unset('pr_dhl_preferred_day_label');
return;
}
// Get the fee amount and label from session
$fee_amount = WC()->session->get('pr_dhl_preferred_day_fee', 0);
$fee_label = WC()->session->get('pr_dhl_preferred_day_label', '');
// Remove existing DHL fees if they exist
$new_fees = [];
foreach ($cart->get_fees() as $fee) {
if (strpos($fee->name, 'DHL') === false) {
$new_fees[] = $fee;
}
}
$cart->fees_api()->set_fees($new_fees);
if ($fee_amount > 0 && ! empty($fee_label)) {
// Add the fee to the cart
$cart->add_fee($fee_label, $fee_amount, true, '');
}
}
}
}