Plugin Directory

Changeset 3380980


Ignore:
Timestamp:
10/19/2025 09:51:56 PM (4 months ago)
Author:
calliko
Message:
  • Fixed the class registry. (Thanks to @avsalexandra)
  • Fixed an error with accrual of points for referral orders. (Thanks to @avsalexandra)
  • Fixed a critical error when deleting an inviter user. (Thanks to @avsalexandra)
Location:
bonus-for-woo
Files:
586 added
8 edited

Legend:

Unmodified
Added
Removed
  • bonus-for-woo/trunk/classes/BfwAccount.php

    r3358789 r3380980  
    382382        $currentRoleName = $nextRole['name'] ?? '';
    383383        $currencySymbol = get_woocommerce_currency_symbol();
    384         $roundedTotal = $totalSum ? bfwPoints::roundPoints($totalSum) . $currencySymbol : '';
     384        $roundedTotal = $totalSum ? BfwPoints::roundPoints($totalSum) . $currencySymbol : '';
    385385
    386386        ob_start(); ?>
     
    642642        $val = get_option('bonus_option_name');
    643643        $requiredOrderTotal = $val['sum-orders-for-referral'] ?? 0.0;
    644         $userOrderTotal = bfwPoints::getSumUserOrders($userid);
     644        $userOrderTotal = BfwPoints::getSumUserOrders($userid);
    645645
    646646        if (!empty($get_referral) && $userOrderTotal >= $requiredOrderTotal) {
  • bonus-for-woo/trunk/classes/BfwAdmin.php

    r3353693 r3380980  
    1111{
    1212
     13    /**
     14     * !!! Безопасная подпись пользователя: имя/фамилия или логин; если пользователь удалён — заглушка.
     15     */
     16    private static function safe_user_label(int $user_id): string
     17    {
     18        $u = get_userdata($user_id);
     19        if ($u && is_object($u)) {
     20            $first = isset($u->first_name) ? trim((string)$u->first_name) : '';
     21            $last  = isset($u->last_name)  ? trim((string)$u->last_name)  : '';
     22            $login = isset($u->user_login) ? trim((string)$u->user_login) : '';
     23            $name  = trim(($first || $last) ? ($first . ' ' . $last) : $login);
     24            return $name !== '' ? $name : sprintf(__('User #%d', 'bonus-for-woo'), $user_id);
     25        }
     26        return sprintf(__('Deleted user #%d', 'bonus-for-woo'), $user_id);
     27    }
    1328
    1429    /**
     
    171186        <hr>
    172187        <div class="user_profile_bfw">
    173             <h1><?php echo __('User bonus points', 'bonus-for-woo'); ?></h1>
     188            <h1><?php echo esc_html(__('User bonus points', 'bonus-for-woo')); ?></h1>
    174189            <?php
    175             echo '<p><b>' . __('Total amount of orders', 'bonus-for-woo') . ': ' . BfwPoints::getSumUserOrders($user->ID) . ' ' . get_woocommerce_currency_symbol() . '</b></p>';
     190            echo '<p><b>' . esc_html(__('Total amount of orders', 'bonus-for-woo')) . ': ' . esc_html(BfwPoints::getSumUserOrders($user->ID)) . ' ' . esc_html(get_woocommerce_currency_symbol()) . '</b></p>';
    176191
    177192            if (BfwRoles::isInvalve($user->ID)) {
    178193                $roles = BfwRoles::getRole($user->ID);
    179                 echo '<p><b>' . __('Status', 'bonus-for-woo') . ': ' . $roles['name'] . '</b></p> <hr>';
     194                echo '<p><b>' . esc_html(__('Status', 'bonus-for-woo')) . ': ' . esc_html($roles['name']) . '</b></p> <hr>';
    180195
    181196                /*Обработчик удаления записи истории начисления баллов*/
     
    183198                    BfwHistory::deleteHistoryId(sanitize_text_field($_POST['bfw_delete_post_history_points']));
    184199                    echo '<div id="message" class="notice notice-warning is-dismissible">
    185     <p>' . __('deleted', 'bonus-for-woo') . '.</p></div>';
     200    <p>' . esc_html__('deleted', 'bonus-for-woo') . '.</p></div>';
    186201                }
    187202                /*Обработчик удаления записи истории начисления баллов*/
     
    192207                    BfwHistory::clearAllHistoryUser($delete_history_points);
    193208
    194 
    195                     echo '<div id="message" class="notice notice-warning is-dismissible"><p>' . __('Cleared', 'bonus-for-woo') . '.</p></div>';
     209                    echo '<div id="message" class="notice notice-warning is-dismissible"><p>' . esc_html__('Cleared', 'bonus-for-woo') . '.</p></div>';
    196210                }
    197211                /*Обработчик удаления всей истории начисления баллов*/
    198212
    199 
    200213                if (BfwRoles::isPro()) { ?>
    201214                    <div class="bfw-offline-block"><span class="bfw-help-tip faq"
    202                                                          data-tip="<?php echo __('The client will have a new order and earn bonus points', 'bonus-for-woo'); ?>"></span>
     215                                                         data-tip="<?php echo esc_attr(__('The client will have a new order and earn bonus points', 'bonus-for-woo')); ?>"></span>
    203216                        <label for="bfw_offline_order_price"><b><?php esc_html_e('Place an order offline', 'bonus-for-woo'); ?></b>
    204217                        </label>
    205                         <input type="hidden" name="user_id" value="<?php echo $user->ID; ?>">
     218                        <input type="hidden" name="user_id" value="<?php echo esc_attr($user->ID); ?>">
    206219                        <input type="text" id="bfw_offline_order_price" name="bfw_offline_order_price"
    207                                placeholder="<?php echo __('Enter amount', 'bonus-for-woo'); ?>">
     220                               placeholder="<?php echo esc_attr(__('Enter amount', 'bonus-for-woo')); ?>">
    208221                        <input type="submit" name="submit" id="submit3" class="button button-primary"
    209                                value="<?php echo __('Add order', 'bonus-for-woo'); ?>">
     222                               value="<?php echo esc_attr(__('Add order', 'bonus-for-woo')); ?>">
    210223                    </div>
    211224                    <hr>
     
    217230
    218231                        <?php if (isset($user->this_year) && $user->this_year == gmdate('Y')) {
    219                             echo __('The client received points this year', 'bonus-for-woo');
     232                            echo esc_html__('The client received points this year', 'bonus-for-woo');
    220233                        } else {
    221                             echo __('The client did not receive points this year', 'bonus-for-woo');
     234                            echo esc_html__('The client did not receive points this year', 'bonus-for-woo');
    222235                        } ?>
    223236                    </p>
    224237                    <hr>
    225                     <i style="color: #005ac9"><?php echo __('You can change the number of bonus points.', 'bonus-for-woo'); ?>
     238                    <i style="color: #005ac9"><?php echo esc_html(__('You can change the number of bonus points.', 'bonus-for-woo')); ?>
    226239                    </i>
    227240                <?php } ?>
    228                 <p><b><?php echo __('Total bonus points', 'bonus-for-woo'); ?>:</b> <?php
     241                <p><b><?php echo esc_html(__('Total bonus points', 'bonus-for-woo')); ?>:</b> <?php
    229242                    $balluser = BfwPoints::getPoints($user->ID);
    230243                    echo esc_html($balluser);
    231244                    ?></p>
    232245
    233                 <p><label> <?php echo __('Change bonus points', 'bonus-for-woo'); ?>
     246                <p><label> <?php echo esc_html(__('Change bonus points', 'bonus-for-woo')); ?>
    234247                        <input type="number" name="computy_input_points" value="<?php echo esc_attr($balluser); ?>"
    235248                               class="regular-text"/></label></p>
    236249                <p><label><textarea style="width: 100%;height: 100px;" name="prichinaizmeneniya"
    237                                     placeholder="<?php echo __('The reason for the change in points. It will be displayed in the client\'s accrual history.', 'bonus-for-woo'); ?>"></textarea></label>
     250                                    placeholder="<?php echo esc_attr(__('The reason for the change in points. It will be displayed in the client\'s accrual history.', 'bonus-for-woo')); ?>"></textarea></label>
    238251                </p>
    239252                <p><input type="submit" name="submit" id="submit1" class="button button-primary"
    240                           value="<?php echo __('change', 'bonus-for-woo'); ?>"></p>
    241 
     253                          value="<?php echo esc_attr(__('change', 'bonus-for-woo')); ?>"></p>
    242254
    243255                <hr>
    244256                <?php
    245                 /*история начислений баллов клиента*/
    246                echo BfwHistory::getHistory($user->ID);
    247 
     257                /*история начислений баллов клиента (HTML внутри — собственный вывод)*/
     258                echo BfwHistory::getHistory($user->ID);
    248259
    249260                $val = get_option('bonus_option_name');
     
    252263                /*если включена реферальная система*/
    253264                if (BfwRoles::isPro() && $referalwork === 1) { ?>
    254                     <hr> <h3><?php echo __('Referral system', 'bonus-for-woo'); ?></h3>
     265                    <hr> <h3><?php echo esc_html(__('Referral system', 'bonus-for-woo')); ?></h3>
    255266                    <?php
    256267                    $get_referral = get_user_meta($user->ID, 'bfw_points_referral', true);
    257268                    $get_referral_invite = get_user_meta($user->ID, 'bfw_points_referral_invite', true);
     269
    258270                    /*Сколько людей пригласил*/
    259                     $argsa['meta_query'] = array(array('key' => 'bfw_points_referral_invite', 'value' => trim($user->ID), 'compare' => '==',),);
     271                    $argsa = array(
     272                            'meta_query' => array(
     273                                    array(
     274                                            'key'     => 'bfw_points_referral_invite',
     275                                            'value'   => trim((string)$user->ID),
     276                                            'compare' => '==',
     277                                    ),
     278                            ),
     279                            'fields' => array('ID', 'user_nicename'),
     280                            'number' => -1,
     281                    );
    260282                    $refere_data = get_users($argsa);
     283
     284                    $referral_one_user_name = array();
     285                    $referral_one_id = array();
    261286                    foreach ($refere_data as $ref_data_one) {
    262287                        $referral_one_user_name[] = $ref_data_one->user_nicename;
     
    264289                    }
    265290
    266 
    267                     echo __('Referral link', 'bonus-for-woo') . ': <code>' . esc_url(site_url() . '?bfwkey=') . '
    268             </code><input type="text" name="bfw-referall-link" value="' . $get_referral . '"><br>';
    269                     if ($get_referral_invite == 0 || $get_referral_invite == '') {
    270                         echo '';
    271                     } else {
    272 
    273                         $user_info = get_userdata($get_referral_invite);
    274 
    275                         echo __('Invited by user', 'bonus-for-woo') . ': <a href="/wp-admin/user-edit.php?user_id=' . $get_referral_invite . '" >' . $user_info->user_login . '(' . $user_info->first_name . ' ' . $user_info->last_name . ')</a><br>';
     291                    echo esc_html(__('Referral link', 'bonus-for-woo')) . ': <code>' . esc_url(site_url() . '?bfwkey=') . '</code>'
     292                            . '<input type="text" name="bfw-referall-link" value="' . esc_attr($get_referral) . '"><br>';
     293
     294                    /* Безопасный вывод пригласившего */
     295                    if (!empty($get_referral_invite) && (int)$get_referral_invite > 0) {
     296                        $inviter_id  = (int)$get_referral_invite;
     297                        $inviter_obj = get_userdata($inviter_id);
     298
     299                        // собираем подпись
     300                        if ($inviter_obj && is_object($inviter_obj)) {
     301                            $first = isset($inviter_obj->first_name) ? trim((string)$inviter_obj->first_name) : '';
     302                            $last  = isset($inviter_obj->last_name)  ? trim((string)$inviter_obj->last_name)  : '';
     303                            $login = isset($inviter_obj->user_login) ? trim((string)$inviter_obj->user_login) : '';
     304                            $inviter_label = trim(($first || $last) ? ($first . ' ' . $last) : $login);
     305                            if ($inviter_label === '') {
     306                                $inviter_label = sprintf(__('User #%d', 'bonus-for-woo'), $inviter_id);
     307                            }
     308
     309                            $edit_url = admin_url('user-edit.php?user_id=' . $inviter_id);
     310                            echo esc_html(__('Invited by user', 'bonus-for-woo')) . ': '
     311                                    . '<a href="' . esc_url($edit_url) . '">' . esc_html($inviter_label) . '</a><br>';
     312                        } else {
     313                            // Пользователь удалён — без ссылки
     314                            $deleted_label = sprintf(__('Deleted user #%d', 'bonus-for-woo'), $inviter_id);
     315                            echo esc_html(__('Invited by user', 'bonus-for-woo')) . ': ' . esc_html($deleted_label) . '<br>';
     316                        }
    276317                    }
    277318
    278                     echo __('Invited', 'bonus-for-woo') . ' ' . count($refere_data) . ' ' . __('people', 'bonus-for-woo');
    279 
    280 
    281                     echo ': ';$allSum = 0;
     319                    echo esc_html(__('Invited', 'bonus-for-woo')) . ' ' . esc_html(count($refere_data)) . ' ' . esc_html(__('people', 'bonus-for-woo'));
     320                    echo ': ';
     321
     322                    $allSum = 0;
    282323                    for ($i = 0; $i <= count($refere_data) - 1; $i++) {
    283324                        /*Выводим список приглашенных первого уровня*/
    284                         $allSum += BfwPoints::getSumUserOrders($referral_one_id[$i]);
    285                         echo ' <a href="/wp-admin/user-edit.php?user_id=' . $referral_one_id[$i] . '">' . $referral_one_user_name[$i] . '('.BfwPoints::getSumUserOrders($referral_one_id[$i]).' '.get_woocommerce_currency_symbol().')</a>, ';
     325                        $uid  = (int)$referral_one_id[$i];
     326                        $name = (string)$referral_one_user_name[$i];
     327                        $sum  = BfwPoints::getSumUserOrders($uid);
     328                        $allSum += $sum;
     329                        $edit_url = admin_url('user-edit.php?user_id=' . $uid);
     330                        echo ' <a href="' . esc_url($edit_url) . '">' . esc_html($name) . ' (' . esc_html($sum) . ' ' . esc_html(get_woocommerce_currency_symbol()) . ')</a>, ';
    286331                    }
    287                     echo '<p>'.__('Total amount of referral orders:','bonus-for-woo').' '.$allSum.' '.get_woocommerce_currency_symbol().'</p>';
    288 
     332                    echo '<p>' . esc_html(__('Total amount of referral orders:', 'bonus-for-woo')) . ' ' . esc_html($allSum) . ' ' . esc_html(get_woocommerce_currency_symbol()) . '</p>';
    289333
    290334                    if (!empty($val['level-two-referral'])) {
    291335                        /* Считаем второй уровень. */
    292                         $referral_two_user_name = [];
    293                         $referral_two_id = [];
     336                        $referral_two_user_name = array();
     337                        $referral_two_id = array();
    294338                        $refere_data_two_two = 0;
     339
    295340                        foreach ($refere_data as $refere_data_two) {
    296                             $argsatwo['meta_query'] = array(array('key' => 'bfw_points_referral_invite', 'value' => trim($refere_data_two->ID), 'compare' => '==',),);
    297 
    298                             $refere_data_two_two += count(get_users($argsatwo));
    299                             $ref_data_two = get_users($argsatwo);
    300 
    301                             foreach ($ref_data_two as $ref_data_twos) {
     341                            $argsatwo = array(
     342                                    'meta_query' => array(
     343                                            array(
     344                                                    'key'     => 'bfw_points_referral_invite',
     345                                                    'value'   => trim((string)$refere_data_two->ID),
     346                                                    'compare' => '==',
     347                                            ),
     348                                    ),
     349                                    'fields' => array('ID', 'user_nicename'),
     350                                    'number' => -1,
     351                            );
     352
     353                            $ref_list = get_users($argsatwo);
     354                            $refere_data_two_two += count($ref_list);
     355
     356                            foreach ($ref_list as $ref_data_twos) {
    302357                                $referral_two_user_name[] = $ref_data_twos->user_nicename;
    303358                                $referral_two_id[] = $ref_data_twos->ID;
    304359                            }
    305 
    306 
    307                             /*Считаем второй уровень*/
    308360                        }
    309361
    310 
    311                         echo '<br>' . __('Invited friends', 'bonus-for-woo') . ' ' . $refere_data_two_two . ' ' . __('people', 'bonus-for-woo');
    312                         echo ': ';/*Выводим список приглашенных второго уровня*/
     362                        echo '<br>' . esc_html(__('Invited friends', 'bonus-for-woo')) . ' ' . esc_html($refere_data_two_two) . ' ' . esc_html(__('people', 'bonus-for-woo'));
     363                        echo ': ';
    313364                        for ($i = 0; $i <= $refere_data_two_two - 1; $i++) {
    314                             echo ' <a href="/wp-admin/user-edit.php?user_id=' . $referral_two_id[$i] . '">' . $referral_two_user_name[$i] . '</a>, ';
     365                            $uid2  = (int)$referral_two_id[$i];
     366                            $name2 = (string)$referral_two_user_name[$i];
     367                            $edit2 = admin_url('user-edit.php?user_id=' . $uid2);
     368                            echo ' <a href="' . esc_url($edit2) . '">' . esc_html($name2) . '</a>, ';
    315369                        }
    316370                    }
     
    318372
    319373            } else {
    320                 echo ' <b>' . __('This user does not participate in the bonus system.', 'bonus-for-woo') . '</b>';
     374                echo ' <b>' . esc_html(__('This user does not participate in the bonus system.', 'bonus-for-woo')) . '</b>';
    321375            }
    322376            ?>
    323 
    324 
    325377        </div>
    326 
    327378        <?php
    328 
    329379    }
    330380
  • bonus-for-woo/trunk/classes/BfwPoints.php

    r3372891 r3380980  
    106106    public static function roundPoints(float $points): float
    107107    {
    108         $val = get_option('bonus_option_name');
    109         if (empty($val['round_points'])) {
    110             return round($points);
    111         }
    112         return round($points, 2);
     108        $options = get_option('bonus_option_name');
     109        $precision = (!empty($options['round_points'])) ? 2 : 0;
     110
     111        return round($points, $precision);
    113112    }
    114113
     
    515514                return self::bfw_write_off_points($redirect);
    516515            }
    517 
    518 
    519516    }
    520517
     
    10281025    public static function bfwoo_add_fee(): void
    10291026    {
     1027
    10301028        $bonusSettings = get_option('bonus_option_name');
    10311029        if (empty($bonusSettings['bonus-points-on-cart'])) {
     
    10521050
    10531051        if (!$cart->has_discount($couponCode) && !in_array($couponCode, $cart->applied_coupons, true)) {
    1054             $cart->applied_coupons[] = $couponCode;
     1052          //  $cart->applied_coupons[] = $couponCode;
     1053             $cart->apply_coupon($couponCode);
    10551054            $cart->calculate_totals(); // Обновляем итоги корзины после применения купона
    10561055        }
    1057      
     1056
    10581057    }
    10591058
     
    14041403     * @return bool
    14051404     * @version 7.0.0
    1406      */
    1407     public static function addPointsForOrder(int $order_id): bool
     1405     * @deprecated
     1406     */
     1407    public static function addPointsForOrderOLD(int $order_id): bool
    14081408    {
    14091409        $order = wc_get_order($order_id);
     
    15401540                            $pointsForRef = $cashback_this_order * $percent_for_referal / $percent;
    15411541                            /*Добавляем баллы рефереру (пригласителю, спонсору) от реферала первого уровня*/
    1542                             bfwReferral::addReferralPoints($user_id, $pointsForRef, $get_referral_invite, $order_id);
     1542                            BfwReferral::addReferralPoints($user_id, $pointsForRef, $get_referral_invite, $order_id);
    15431543                        }
    15441544                    }
     
    15571557                                $pointsForRef = $cashback_this_order*$percent_for_referal_two_level/$percent;
    15581558                                /*Добавляем баллы рефереру (пригласителю, спонсору) от реферала второго уровня*/
    1559                                 bfwReferral::addReferralPoints($user_id, $pointsForRef, $get_referral_invite_two_level,$order_id);
     1559                                BfwReferral::addReferralPoints($user_id, $pointsForRef, $get_referral_invite_two_level,$order_id);
    15601560                            }
    15611561                        }
     
    15681568    }
    15691569
     1570    /**
     1571     * Action when the order status is completed - accrual of points
     1572     * * Действие когда статус заказа выполнен - начисление баллов
     1573     * @param int $order_id
     1574     * @return bool
     1575     * @version 7.4.4
     1576     * @deprecated
     1577     */
     1578    public static function addPointsForOrder(int $order_id): bool
     1579    {
     1580        $order = wc_get_order($order_id);
     1581
     1582        // Если уже начислены баллы, то выходим
     1583        if ($order->get_meta('cashback_receipt') == 'received') {
     1584            return false;
     1585        }
     1586
     1587        $user_id = $order->get_customer_id();
     1588        $order_items = $order->get_items();
     1589        $bfwRoles = new BfwRoles();
     1590        $bfwHistory = new BfwHistory();
     1591        $bfwEmail = new BfwEmail();
     1592        $bfwSingleProduct = new BfwSingleProduct();
     1593        $bfwFunctions = new BfwFunctions();
     1594        $val = get_option('bonus_option_name');
     1595
     1596        if ($user_id === 0) {
     1597            return false;
     1598        }
     1599
     1600        // обновляем роль пользователя
     1601        $bfwRoles::updateRole($user_id);
     1602
     1603        $order_total = (float)$order->get_total();
     1604        $payment_method = $order->get_payment_method();
     1605        if (!empty($val['exclude-payment-method']) && in_array($payment_method, $val['exclude-payment-method'])) {
     1606            return false;
     1607        }
     1608
     1609        // --- Вычисляем кешбэк по товарам (internal) ---
     1610        $cashback_internal = 0;
     1611        foreach ($order_items as $item_id => $item) {
     1612            $product_id = $item['product_id'];
     1613            $variation_id = $item['variation_id'] ?? null;
     1614            $cashback_internal += $bfwSingleProduct->cashbackFromOneProduct($product_id, $user_id, $variation_id)['amount'] * $item['quantity'];
     1615        }
     1616
     1617        $shipping_total = $order->get_shipping_total();
     1618        $percent = $bfwRoles::getRole($user_id)['percent'] ?? 0; // процент кешбэка роли
     1619        if (empty($val['cashback-for-shipping'])) {
     1620            $cashback_internal += $shipping_total * $percent / 100;
     1621        }
     1622
     1623        $cashback_internal = apply_filters('bfw-completed-points-internal', $cashback_internal, $order_id, $order);
     1624
     1625        // Если internal ноль — ничего не начисляем
     1626        if ((float)$cashback_internal === 0.0) {
     1627            return false;
     1628        }
     1629
     1630        // --- Фактический кешбэк для покупателя (после вычетов, списаний) ---
     1631        $cashback_for_user = $cashback_internal;
     1632        $fee_total = $bfwFunctions::feeOrCoupon($order);
     1633
     1634        // Если включена опция "если используются баллы — не начислять кешбэк" — обнуляем кешбэк покупателю,
     1635        // но продолжаем начисление рефералки дальше
     1636        if (isset($val['yous_balls_no_cashback']) && $fee_total > 0) {
     1637            $cashback_for_user = 0;
     1638        } else {
     1639            $cd = $fee_total * $percent / 100;
     1640            $cashback_for_user = $cashback_for_user - $cd;
     1641            if ($cashback_for_user < 0) {
     1642                $cashback_for_user = 0;
     1643            }
     1644        }
     1645
     1646        // Применяем фильтры/корректировки
     1647        $percent = apply_filters('bfw-filter-percent-in-cart', $percent, $order_total);
     1648        $cashback_for_user = apply_filters('bfw-cashback-this-order', $cashback_for_user, $order_total, $percent);
     1649        $cashback_internal = apply_filters('bfw-cashback-this-order-internal', $cashback_internal, $order_total, $percent);
     1650
     1651        // Если покупателю что-то начислено — записываем и шлём письмо
     1652        if ($cashback_for_user > 0 && $bfwRoles::isInvalve($user_id)) {
     1653
     1654            // Проверка минимальной суммы (Pro)
     1655            if ($bfwRoles::isPro()) {
     1656                if (isset($val['minimal-amount'])) {
     1657                    if ($order_total < $val['minimal-amount'] && !empty($val['minimal-amount-cashback'])) {
     1658                        $cashback_for_user = 0;
     1659                    }
     1660                }
     1661            }
     1662
     1663            $computy_point_old = self::getPoints($user_id);
     1664            $new_points = $computy_point_old + $cashback_for_user;
     1665            $new_points = self::roundPoints($new_points);
     1666            self::updatePoints($user_id, $new_points);
     1667            self::updateFastPoints($user_id, 0);
     1668
     1669            // Сохраняем мета заказа о начислении покупателю
     1670            $order->update_meta_data('cashback_receipt', 'received');
     1671            $order->update_meta_data('cashback_amount', $cashback_for_user);
     1672            $order->save();
     1673
     1674            // Запись в историю и e-mail
     1675            $reason = __('Points accrual', 'bonus-for-woo');
     1676            $bfwHistory::add_history($user_id, '+', $cashback_for_user, $order_id, $reason);
     1677
     1678            $text_email = $val['email-when-order-change-text'] ?? '';
     1679            $title_email = $val['email-when-order-change-title'] ?? __('Points accrual', 'bonus-for-woo');
     1680            $user = get_userdata($user_id);
     1681            $get_referral = get_user_meta($user_id, 'bfw_points_referral', true);
     1682            $text_email_array = array(
     1683                '[user]' => $user->display_name,
     1684                '[order]' => $order_id,
     1685                '[points]' => $cashback_for_user,
     1686                '[total]' => $new_points,
     1687                '[referral-link]' => esc_url(site_url() . '?bfwkey=' . $get_referral)
     1688            );
     1689            $message_email = $bfwEmail::template($text_email, $text_email_array);
     1690            if (!empty($val['email-when-order-change'])) {
     1691                $bfwEmail->getMail($user_id, '', $title_email, $message_email);
     1692            }
     1693        }
     1694
     1695        // --- Начисляем рефералку от фактически оплаченной суммы заказа (order total) ---
     1696        $referalwork = isset($val['referal-system']) ? (int)$val['referal-system'] : 0;
     1697        if ($referalwork) {
     1698            $get_referral_invite = get_user_meta($user_id, 'bfw_points_referral_invite', true);
     1699            $get_referral_invite = (int)$get_referral_invite;
     1700            if ($get_referral_invite > 0) {
     1701                $sumordersforreferral = $val['sum-orders-for-referral'] ?? 0.0;
     1702                $totalref = self::getSumUserOrders($get_referral_invite);
     1703                if ($totalref >= $sumordersforreferral) {
     1704                    // процент рефералки из настроек
     1705                    $percent_for_referal = floatval($val['referal-cashback'] ?? 0);
     1706                    // оплаченная сумма заказа (включает купоны и списания)
     1707                    $paid_amount = (float)$order->get_total();
     1708
     1709                    // вычисление баллов реферера: percent_for_referal% от оплаченной суммы
     1710                    $pointsForRef = BfwPoints::roundPoints($paid_amount * ($percent_for_referal / 100));
     1711
     1712                    if ($pointsForRef > 0 && $percent_for_referal > 0) {
     1713                        BfwReferral::addReferralPoints($user_id, $pointsForRef, $get_referral_invite, $order_id);
     1714                    }
     1715                }
     1716
     1717                // второй уровень
     1718                if (!empty($val['level-two-referral'])) {
     1719                    $get_referral_invite_two_level = get_user_meta($get_referral_invite, 'bfw_points_referral_invite', true);
     1720                    $get_referral_invite_two_level = (int)$get_referral_invite_two_level;
     1721                    if ($get_referral_invite_two_level !== 0) {
     1722                        $sumordersforreferral2 = $val['sum-orders-for-referral'] ?? 0.0;
     1723                        $totalref2 = self::getSumUserOrders($get_referral_invite_two_level);
     1724                        if ($totalref2 >= $sumordersforreferral2) {
     1725                            $percent_for_referal_two_level = floatval($val['referal-cashback-two-level'] ?? 0);
     1726                            $paid_amount = (float)$order->get_total();
     1727                            $pointsForRef2 = BfwPoints::roundPoints($paid_amount * ($percent_for_referal_two_level / 100));
     1728                            if ($pointsForRef2 > 0 && $percent_for_referal_two_level > 0) {
     1729                                BfwReferral::addReferralPoints($user_id, $pointsForRef2, $get_referral_invite_two_level, $order_id);
     1730                            }
     1731                        }
     1732                    }
     1733                }
     1734            }
     1735        }
     1736
     1737        return true;
     1738    }
    15701739
    15711740    /**
  • bonus-for-woo/trunk/classes/BfwReferral.php

    r3358789 r3380980  
    262262    }
    263263
     264
     265    /**
     266     * Очищаем ссылку на пригласителя у приглашённых при удалении пользователя
     267     * @param $deleted_user_id
     268     * @return void
     269     * @version 7.4.4
     270     */
     271    public static function bfw_clear_referral_invites_on_delete($deleted_user_id) {
     272        if (empty($deleted_user_id)) {
     273            return;
     274        }
     275        $users = get_users(array(
     276            'meta_key'   => 'bfw_points_referral_invite',
     277            'meta_value' => (string) $deleted_user_id,
     278            'number'     => -1,
     279            'fields'     => 'ID',
     280        ));
     281        if (!empty($users)) {
     282            foreach ($users as $uid) {
     283                delete_user_meta($uid, 'bfw_points_referral_invite');
     284            }
     285        }
     286    }
    264287}
  • bonus-for-woo/trunk/classes/BfwStatistic.php

    r3330617 r3380980  
    104104
    105105                    $data['orders_total'] = ($data['orders_total'] ?? 0) + 1;
    106                     $spent = bfwFunctions::feeOrCoupon($order);
     106                    $spent = BfwFunctions::feeOrCoupon($order);
    107107                    $data['spent_total'] = ($data['spent_total'] ?? 0) + $spent;
    108108
  • bonus-for-woo/trunk/index.php

    r3372891 r3380980  
    22/*
    33 * Plugin Name:     Bonus for Woo
    4  * Version:         7.4.3
     4 * Version:         7.4.4
    55 * Text Domain:     bonus-for-woo
    66 * Plugin URI:      https://computy.ru/blog/bonus-for-woo-wordpress
     
    1818
    1919
    20 use Automattic\WooCommerce\Utilities\FeaturesUtil;
     20use Automattic\WooCommerce\Utilities\FaturesUtil;
    2121
    2222if ( ! defined('ABSPATH')) {
    2323    exit;
    2424}
    25 define('BONUS_COMPUTY_VERSION', '7.4.3'); /*версия плагина*/
     25define('BONUS_COMPUTY_VERSION', '7.4.4'); /*версия плагина*/
    2626define('BONUS_COMPUTY_VERSION_DB', '6'); /*версия базы данных*/
    2727define('BONUS_COMPUTY_PLUGIN_DIR', plugin_dir_path(__FILE__));
     
    141141}
    142142
     143
     144// !!! Очищаем ссылку на пригласителя у приглашённых при удалении пользователя
     145add_action('delete_user', array('BfwReferral', 'bfw_clear_referral_invites_on_delete'), 10, 1);
     146// Для мультисайта (удаление через сеть)
     147add_action('wpmu_delete_user',  array('BfwReferral', 'bfw_clear_referral_invites_on_delete'), 10, 1);
  • bonus-for-woo/trunk/pages/statisticOLD.php

    r3330617 r3380980  
    215215            foreach ($orders->orders as $one_order) {
    216216                $i++;
    217                 $fee_total = bfwFunctions::feeOrCoupon($one_order);
     217                $fee_total = BfwFunctions::feeOrCoupon($one_order);
    218218                $fes_totals += $fee_total;
    219219
     
    246246             $cart_discount = mb_strtolower($val['bonus-points-on-cart']);
    247247             foreach ($orders as $one_order) {
    248                  $fee_total = bfwFunctions::feeOrCoupon($one_order);
     248                 $fee_total = BfwFunctions::feeOrCoupon($one_order);
    249249                 $fes_totals += $fee_total;
    250250                 // Бонусы с помощью купонов
  • bonus-for-woo/trunk/readme.txt

    r3372891 r3380980  
    77WC requires at least: 6.0
    88WC tested up to: 10.2.2
    9 Stable tag: 7.4.3
     9Stable tag: 7.4.4
    1010Requires PHP: 7.4
    1111License: GPLv3 or later
     
    108108== Changelog ==
    109109
     110= 7.4.4 - 2025-10-04 =
     111* Fixed the class registry. (Thanks to @avsalexandra)
     112* Fixed an error with accrual of points for referral orders. (Thanks to @avsalexandra)
     113* Fixed a critical error when deleting an inviter user. (Thanks to @avsalexandra)
     114
    110115= 7.4.3 - 2025-10-04 =
    111116* Fixed division by zero error.
Note: See TracChangeset for help on using the changeset viewer.