Jake Vanderwerf
2026-02-04 2127b1bdd73ecd2423e443992da4b442f5a3c1a3
inc/integrations/Helcim.php
@@ -1,7 +1,7 @@
<?php
namespace JVBase\integrations;
use JVBase\meta\MetaManager;
use JVBase\meta\Meta;
use Exception;
use WP_Error;
use WP_REST_Request;
@@ -157,6 +157,10 @@
    */
   protected function registerAdditionalHooks(): void
   {
      $this->ensureInitialized();
      if (!$this->isSetUp()) {
         return;
      }
      // User login tracking for security
      add_action('wp_login', [$this, 'trackUserLogin'], 10, 2);
@@ -242,7 +246,7 @@
      <button type="button" class="toggle-cart row" title="Your Cart" data-action="toggle-cart" aria-label="Open Cart" aria-controls="checkout" aria-expanded="false" hidden>
         <?= jvbIcon('shopping-cart')?><span class="abs"></span><span class="abs count"></span>
      </button>
      <aside id="cart">
      <aside id="cart" class="main">
         <form id="checkout" data-form-id="checkout" data-save="checkout">
            <?php
            $tabs = [
@@ -527,6 +531,10 @@
    */
   public function enqueueScripts(): void
   {
      $this->ensureInitialized();
      if (!$this->isSetUp()) {
         return;
      }
      // Helcim JS SDK
      $sdk_url = $this->is_test_mode
         ? 'https://helcim-js-sandbox.helcim.com/v1/helcim.js'
@@ -658,7 +666,7 @@
            $post = get_post($post_id);
            if (!$post) continue;
            $meta = new MetaManager($post_id, 'post');
            $meta = Meta::forPost($post_id);
            $field_map = $this->field_mappings[$post->post_type] ?? [];
            // Prepare product data for Helcim
@@ -667,12 +675,12 @@
               'description' => $post->post_content,
               'productCode' => get_post_meta($post_id, BASE . '_helcim_product_code', true) ?: 'WP-' . $post_id,
               'type' => $content_type,
               'price' => floatval($meta->getValue('price')) * 100, // Convert to cents
               'taxable' => (bool)$meta->getValue('is_taxable'),
               'price' => floatval($meta->get('price')) * 100, // Convert to cents
               'taxable' => (bool)$meta->get('is_taxable'),
            ];
            // Handle variations
            $variations = $meta->getValue('product_variations');
            $variations = $meta->get('product_variations');
            if (!empty($variations)) {
               $product_data['variations'] = $this->prepareVariations($variations);
            }
@@ -830,7 +838,7 @@
      if ($post_id) {
         // Update meta data
         $meta = new MetaManager($post_id, 'post');
         $meta = Meta::forPost($post_id);
         $meta->setAll([
            'price' => $product['price'] / 100, // Convert from cents
            '_helcim_product_id' => $product['productId'],
@@ -881,11 +889,10 @@
      // Send notification
      $user = get_user_by('ID', $user_id);
      if ($user) {
         wp_mail(
         JVB()->email()->sendEmail(
            $user->user_email,
            'Security: Password Reset Required',
            'For your security, please reset your password to continue accessing your account and saved payment methods.',
            ['Content-Type: text/html; charset=UTF-8']
         );
      }
   }
@@ -1137,23 +1144,26 @@
   private function sendWelcomeEmail(\WP_User $user, string $reset_key): void
   {
      $site_name = get_bloginfo('name');
      $reset_url = get_home_url(null, "wp-login.php?action=rp&key=$reset_key&login=" . rawurlencode($user->user_login), 'login');
      $reset_url = get_home_url(null, "login?action=rp&key=$reset_key&login=" . rawurlencode($user->user_login), 'login');
      $message = sprintf(
         "Welcome to %s!\n\n" .
         "Your account has been created. Please click the link below to set your password:\n\n" .
         "Your account has been created. Please click the button below to set your password:\n\n" .
         "%s\n\n" .
         "Or, copy and paste the link below:\n\n".
         "%s\n\n" .
         "Once you've set your password, you can:\n" .
         "- View your order history\n" .
         "- Save your favorite items\n" .
         "- Speed up checkout with saved payment methods\n\n" .
         "Thanks,\n%s",
         "If you didn't create this account, please ignore this email.\n\n" .
         "Thanks,\n",
         $site_name,
         $reset_url,
         $site_name
         JVB()->email()->button('Reset Password', $reset_url),
         JVB()->email()->link($reset_url),
      );
      jvbMail(
      JVB()->email()->sendEmail(
         $user->user_email,
         sprintf('[%s] Welcome! Set Your Password', $site_name),
         $message
@@ -1218,8 +1228,8 @@
         $post_id = intval($item['id'] ?? 0);
         if (!$post_id) continue;
         $meta = new MetaManager($post_id, 'post');
         $price = floatval($meta->getValue('price'));
         $meta = Meta::forPost($post_id);
         $price = floatval($meta->get('price'));
         $quantity = intval($item['quantity'] ?? 1);
         $total += ($price * $quantity * 100); // Convert to cents
@@ -1244,12 +1254,12 @@
         if (!$post_id) continue;
         $post = get_post($post_id);
         $meta = new MetaManager($post_id, 'post');
         $meta = Meta::forPost($post_id);
         $line_items[] = [
            'description' => $post->post_title,
            'quantity' => intval($item['quantity'] ?? 1),
            'price' => floatval($meta->getValue('price')) * 100,
            'price' => floatval($meta->get('price')) * 100,
            'productCode' => get_post_meta($post_id, BASE . '_helcim_product_code', true) ?: 'WP-' . $post_id
         ];
      }
@@ -1481,7 +1491,7 @@
         update_user_meta($user->ID, BASE . '_helcim_customer_updated', current_time('mysql'));
         // Clear cached customer data
         $this->cache->delete('helcim_customer_' . $user->ID);
         $this->cache->forget('helcim_customer_' . $user->ID);
      }
      return true;