Plugin Directory

Changeset 3341024


Ignore:
Timestamp:
08/07/2025 12:43:08 PM (8 months ago)
Author:
yoomoney
Message:

v2.12.2

  • Исправлен баг с применением маркировки к доставке
  • Добавлена поддержка возвратов при работе с маркировкой
Location:
yookassa/trunk
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • yookassa/trunk/README.txt

    r3329798 r3341024  
    55Requires at least: 5.2
    66Tested up to: 6.8
    7 Stable tag: 2.12.1
     7Stable tag: 2.12.2
    88License: GPLv3
    99License URI: https://yoomoney.ru/doc.xml?id=527132
     
    100100
    101101== Changelog ==
     102= 2.12.2 =
     103* Исправлен баг с применением маркировки к доставке
     104* Добавлена поддержка возвратов при работе с маркировкой
     105
    102106= 2.12.1 =
    103107* Обновлен SDK до версии 2.12.2
  • yookassa/trunk/admin/YooKassaMarkingOrder.php

    r3321324 r3341024  
    8585            $categoryMeta = $product->get_meta(YooKassaMarkingProduct::CATEGORY_KEY);
    8686            if (empty($categoryMeta)) {
    87                 $this->renderNoMarkingView(__('Не требуется', 'yookassa'));
    88                 return;
     87                // проверяем, что товар вариативный и ищем категорию у него
     88                if ($product->is_type('variation')) {
     89                    $parent_product = wc_get_product($product->get_parent_id());
     90                    $categoryMeta = $parent_product->get_meta(YooKassaMarkingProduct::CATEGORY_KEY);
     91                }
     92
     93                if (empty($categoryMeta)) {
     94                    $this->renderNoMarkingView(__('Не требуется', 'yookassa'));
     95                    return;
     96                }
    8997            }
    9098
     
    102110            }
    103111
     112            $remainingQuantity = self::getRemainingQuantity($item);
     113            if ($remainingQuantity <= 0) {
     114                $this->renderNoMarkingView(__('Не требуется', 'yookassa'));
     115                return;
     116            }
     117
    104118            $iconClass = 'new';
    105119            if (!empty($itemMeta)) {
    106                 $isFilled = $this->isAllMarkingFieldsFilledInItem($item);
     120                $isFilled = $this->isAllMarkingFieldsFilledInItem($item, $remainingQuantity);
    107121
    108122                $notAllFilled = 'not-filled';
     
    137151
    138152    /**
     153     * Возвращает значение количества товара в заказе,
     154     * после применения числа возвращенных товаров
     155     *
     156     * @param WC_Order_Item $item
     157     * @return int
     158     */
     159    public static function getRemainingQuantity($item)
     160    {
     161        $order = $item->get_order();
     162        $quantity = $item->get_quantity();
     163        $refundedQuantity = $order->get_qty_refunded_for_item($item->get_id());
     164        // Вычисляем оставшееся количество
     165        return $quantity + $refundedQuantity; // refunded_quantity отрицательный
     166    }
     167
     168    /**
    139169     * Отрисовывает ячейку для товара, у которого нет категории маркировки
    140170     *
     
    259289            }
    260290
     291            $item = WC_Order_Factory::get_order_item($itemId);
     292            if (!$item) {
     293                YooKassaLogger::error(sprintf(
     294                    'Error while getting order item meta: got error while getting item. ItemId: %d',
     295                    $itemId
     296                ));
     297                wp_send_json_error(__('Не смогли найти товар. Обновите страницу — если ошибка не уйдёт, напишите нам на cms@yoomoney.ru', 'yookassa'));
     298            }
     299
     300            $remainingQuantity = self::getRemainingQuantity($item);
     301
     302            if ($remainingQuantity <= 0) {
     303                YooKassaLogger::error(sprintf(
     304                    'Error while getting order item meta: quantity of products is 0. ItemId: %d, Quantity: %d',
     305                    $itemId,
     306                    $remainingQuantity
     307                ));
     308                wp_send_json_error(__('Что-то пошло не так. Обновите страницу — если ошибка не уйдёт, напишите нам на cms@yoomoney.ru', 'yookassa'));
     309            }
     310
    261311            $productId = wc_get_order_item_meta($itemId, '_product_id');
    262312            $product = $productId ? wc_get_product($productId) : null;
     
    281331
    282332            $response = [
    283                 'quantity' => wc_get_order_item_meta($itemId, '_qty'),
     333                'quantity' => $remainingQuantity,
    284334                'title' => $this->generateProductLink($product),
    285335                'fields' => [
     
    490540    {
    491541        foreach ($order->get_items() as $item) {
    492             if (!$this->isAllMarkingFieldsFilledInItem($item)) {
     542            $remainingQuantity = self::getRemainingQuantity($item);
     543            if ($remainingQuantity <= 0) {
     544                return true;
     545            }
     546
     547            if (!$this->isAllMarkingFieldsFilledInItem($item, $remainingQuantity)) {
    493548                return false;
    494549            }
     
    503558     *
    504559     * @param WC_Order_Item $item
     560     * @param int $remainingQuantity
    505561     * @return bool
    506562     */
    507     private function isAllMarkingFieldsFilledInItem($item)
     563    private function isAllMarkingFieldsFilledInItem($item, $remainingQuantity)
    508564    {
    509565        $data = $item->get_data();
     
    533589
    534590        $markingData = $item->get_meta(self::MARKING_FIELD_META_KEY);
    535         $quantity = $data['quantity'];
    536591
    537592        if (empty($markingData) || !is_array($markingData)) {
     
    539594        }
    540595
    541         if ($quantity !== count($markingData)) {
     596        if ($remainingQuantity !== count($markingData)) {
    542597            return false;
    543598        }
     
    545600        return true;
    546601    }
     602
     603    /**
     604     * Удаление данных маркировки после применения возврата
     605     *
     606     * @param $order_id
     607     * @param $refund_id
     608     * @return void
     609     */
     610    public function deleteMarkingAfterRefund($order_id, $refund_id)
     611    {
     612        $order = wc_get_order($order_id);
     613        $refund = wc_get_order($refund_id);
     614
     615        if (!$order || !$refund) {
     616            return;
     617        }
     618
     619        foreach ($refund->get_items() as $refundedItem) {
     620            if (!$originalItemId = $refundedItem->get_meta('_refunded_item_id')) {
     621                continue;
     622            }
     623
     624            if (!$originalItem = $order->get_item($originalItemId)) {
     625                continue;
     626            }
     627
     628            $originalItem->delete_meta_data(self::MARKING_FIELD_META_KEY);
     629            $originalItem->save();
     630        }
     631    }
    547632}
  • yookassa/trunk/assets/js/yookassa-order-marking.js

    r3321324 r3341024  
    1010        footer: '#yookassa-marking-popup-footer',
    1111        preloader: '.yookassa-preloader',
    12         btnOpen: '.yookassa-marking-button',
    1312        btnSave: '#yookassa-marking-save-btn',
    1413        btnClear: '#yookassa-marking-clear-btn',
     
    7372            .on('keydown', '.marking-input', handleInputKeydown);
    7473
     74        // Эту кнопку в кэш не помещаем, т.к. страница заказа не всегда перезагружается после изменений
     75        $(document).on('click', '.yookassa-marking-button', handleOpenPopup);
     76
    7577        // Основные кнопки
    76         elements.btnOpen.on('click', handleOpenPopup);
    7778        elements.btnSave.on('click', handleSaveMarking);
    7879        elements.btnClear.on('click', handleClearMarking);
  • yookassa/trunk/includes/YooKassa.php

    r3329798 r3341024  
    5555    {
    5656        $this->plugin_name = 'yookassa';
    57         $this->version     = '2.12.1';
     57        $this->version     = '2.12.2';
    5858        self::$pluginUrl   = plugin_dir_url(dirname(__FILE__));
    5959        self::$pluginPath  = plugin_dir_path(dirname(__FILE__));
     
    190190        $this->loader->addAction('wp_ajax_woocommerce_get_oder_item_meta', $plugin_admin, 'getOderItemMetaCallback');
    191191        $this->loader->addAction('admin_notices', $plugin_admin, 'displayOrderWarning');
     192        $this->loader->addAction('woocommerce_order_refunded', $plugin_admin, 'deleteMarkingAfterRefund', 10, 2);
    192193    }
    193194
  • yookassa/trunk/includes/YooKassaSecondReceipt.php

    r3321324 r3341024  
    250250        }
    251251
    252         $markingCodeHandler = $markingEnabled ? new YooKassaMarkingCodeHandler($this->provider) : null;
    253252        $orderItems = $order->get_items();
    254253
     
    260259            $item->setPaymentMode(PaymentMode::FULL_PAYMENT);
    261260            try {
    262                 $result['amount'] += $item->getAmount() / 100.0;
    263 
    264261                if ($markingEnabled) {
    265                     $processedItems = $this->processItem($item, $orderItems, $markingCodeHandler);
     262                    $processedItems = $this->processItem($item, $orderItems, new YooKassaMarkingCodeHandler($this->provider));
    266263                    $result['items'] = array_merge($result['items'], $processedItems);
    267264                } else {
    268265                    $result['items'][] = new ReceiptItem($item->jsonSerialize());
    269266                }
     267                $result['amount'] += $item->getAmount() / 100.0;
    270268            } catch (Exception $e) {
    271269                YooKassaLogger::error(sprintf(
     
    313311                || $productQuantity !== $itemData['quantity']
    314312            ) {
     313                continue;
     314            }
     315
     316            // Получаем оставшееся количество товаров после возвратов, если они были
     317            $productQuantity = YooKassaMarkingOrder::getRemainingQuantity($orderItem);
     318            $item->setQuantity($productQuantity);
     319            if ($productQuantity <= 0) {
     320                YooKassaLogger::info(sprintf(
     321                    'Item "%s" refunded, skipping receipt generation',
     322                    $productName
     323                ));
    315324                continue;
    316325            }
  • yookassa/trunk/languages/yookassa-en.po

    r3329798 r3341024  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: ЮKassa для WooCommerce 2.12.1\n"
     5"Project-Id-Version: ЮKassa для WooCommerce 2.12.2\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/yookassa\n"
    7 "POT-Creation-Date: 2025-07-07T10:02:11+00:00\n"
    8 "PO-Revision-Date: 2025-07-07 13:41+0300\n"
     7"POT-Creation-Date: 2025-08-07 13:05+0300\n"
     8"PO-Revision-Date: 2025-08-07 13:05+0300\n"
    99"Last-Translator: yoomoney <cms@yoomoney.ru>\n"
    1010"Language-Team: yoomoney <cms@yoomoney.ru>\n"
  • yookassa/trunk/languages/yookassa-en_GB.po

    r3329798 r3341024  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: ЮKassa для WooCommerce 2.12.1\n"
     5"Project-Id-Version: ЮKassa для WooCommerce 2.12.2\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/yookassa\n"
    7 "POT-Creation-Date: 2025-07-07T10:02:11+00:00\n"
    8 "PO-Revision-Date: 2025-07-07 13:41+0300\n"
     7"POT-Creation-Date: 2025-08-07 13:05+0300\n"
     8"PO-Revision-Date: 2025-08-07 13:06+0300\n"
    99"Last-Translator: yoomoney <cms@yoomoney.ru>\n"
    1010"Language-Team: yoomoney <cms@yoomoney.ru>\n"
  • yookassa/trunk/languages/yookassa-en_US.po

    r3329798 r3341024  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: ЮKassa для WooCommerce 2.12.1\n"
     5"Project-Id-Version: ЮKassa для WooCommerce 2.12.2\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/yookassa\n"
    7 "POT-Creation-Date: 2025-07-07T10:02:11+00:00\n"
    8 "PO-Revision-Date: 2025-07-07 13:42+0300\n"
     7"POT-Creation-Date: 2025-08-07 13:05+0300\n"
     8"PO-Revision-Date: 2025-08-07 13:06+0300\n"
    99"Last-Translator: yoomoney <cms@yoomoney.ru>\n"
    1010"Language-Team: yoomoney <cms@yoomoney.ru>\n"
  • yookassa/trunk/languages/yookassa.pot

    r3329798 r3341024  
    44msgid ""
    55msgstr ""
    6 "Project-Id-Version: yookassa 2.12.1\n"
     6"Project-Id-Version: yookassa 2.12.2\n"
    77"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/yookassa\n"
    8 "POT-Creation-Date: 2025-07-07 13:43+0300\n"
     8"POT-Creation-Date: 2025-08-07 13:05+0300\n"
    99"PO-Revision-Date: 2025-04-15 12:18+0300\n"
    1010"Last-Translator: yoomoney <cms@yoomoney.ru>\n"
  • yookassa/trunk/yookassa.php

    r3329798 r3341024  
    1616 * Plugin URI:        https://wordpress.org/plugins/yookassa/
    1717 * Description:       Платежный модуль для работы с сервисом ЮKassa через плагин WooCommerce
    18  * Version:           2.12.1
     18 * Version:           2.12.2
    1919 * Author:            YooMoney
    2020 * Author URI:        http://yookassa.ru
Note: See TracChangeset for help on using the changeset viewer.