Changeset 3341024
- Timestamp:
- 08/07/2025 12:43:08 PM (8 months ago)
- Location:
- yookassa/trunk
- Files:
-
- 13 edited
-
README.txt (modified) (2 diffs)
-
admin/YooKassaMarkingOrder.php (modified) (10 diffs)
-
assets/js/yookassa-order-marking.js (modified) (2 diffs)
-
includes/YooKassa.php (modified) (2 diffs)
-
includes/YooKassaSecondReceipt.php (modified) (3 diffs)
-
languages/yookassa-en.mo (modified) (previous)
-
languages/yookassa-en.po (modified) (1 diff)
-
languages/yookassa-en_GB.mo (modified) (previous)
-
languages/yookassa-en_GB.po (modified) (1 diff)
-
languages/yookassa-en_US.mo (modified) (previous)
-
languages/yookassa-en_US.po (modified) (1 diff)
-
languages/yookassa.pot (modified) (1 diff)
-
yookassa.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
yookassa/trunk/README.txt
r3329798 r3341024 5 5 Requires at least: 5.2 6 6 Tested up to: 6.8 7 Stable tag: 2.12. 17 Stable tag: 2.12.2 8 8 License: GPLv3 9 9 License URI: https://yoomoney.ru/doc.xml?id=527132 … … 100 100 101 101 == Changelog == 102 = 2.12.2 = 103 * Исправлен баг с применением маркировки к доставке 104 * Добавлена поддержка возвратов при работе с маркировкой 105 102 106 = 2.12.1 = 103 107 * Обновлен SDK до версии 2.12.2 -
yookassa/trunk/admin/YooKassaMarkingOrder.php
r3321324 r3341024 85 85 $categoryMeta = $product->get_meta(YooKassaMarkingProduct::CATEGORY_KEY); 86 86 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 } 89 97 } 90 98 … … 102 110 } 103 111 112 $remainingQuantity = self::getRemainingQuantity($item); 113 if ($remainingQuantity <= 0) { 114 $this->renderNoMarkingView(__('Не требуется', 'yookassa')); 115 return; 116 } 117 104 118 $iconClass = 'new'; 105 119 if (!empty($itemMeta)) { 106 $isFilled = $this->isAllMarkingFieldsFilledInItem($item );120 $isFilled = $this->isAllMarkingFieldsFilledInItem($item, $remainingQuantity); 107 121 108 122 $notAllFilled = 'not-filled'; … … 137 151 138 152 /** 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 /** 139 169 * Отрисовывает ячейку для товара, у которого нет категории маркировки 140 170 * … … 259 289 } 260 290 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 261 311 $productId = wc_get_order_item_meta($itemId, '_product_id'); 262 312 $product = $productId ? wc_get_product($productId) : null; … … 281 331 282 332 $response = [ 283 'quantity' => wc_get_order_item_meta($itemId, '_qty'),333 'quantity' => $remainingQuantity, 284 334 'title' => $this->generateProductLink($product), 285 335 'fields' => [ … … 490 540 { 491 541 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)) { 493 548 return false; 494 549 } … … 503 558 * 504 559 * @param WC_Order_Item $item 560 * @param int $remainingQuantity 505 561 * @return bool 506 562 */ 507 private function isAllMarkingFieldsFilledInItem($item )563 private function isAllMarkingFieldsFilledInItem($item, $remainingQuantity) 508 564 { 509 565 $data = $item->get_data(); … … 533 589 534 590 $markingData = $item->get_meta(self::MARKING_FIELD_META_KEY); 535 $quantity = $data['quantity'];536 591 537 592 if (empty($markingData) || !is_array($markingData)) { … … 539 594 } 540 595 541 if ($ quantity !== count($markingData)) {596 if ($remainingQuantity !== count($markingData)) { 542 597 return false; 543 598 } … … 545 600 return true; 546 601 } 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 } 547 632 } -
yookassa/trunk/assets/js/yookassa-order-marking.js
r3321324 r3341024 10 10 footer: '#yookassa-marking-popup-footer', 11 11 preloader: '.yookassa-preloader', 12 btnOpen: '.yookassa-marking-button',13 12 btnSave: '#yookassa-marking-save-btn', 14 13 btnClear: '#yookassa-marking-clear-btn', … … 73 72 .on('keydown', '.marking-input', handleInputKeydown); 74 73 74 // Эту кнопку в кэш не помещаем, т.к. страница заказа не всегда перезагружается после изменений 75 $(document).on('click', '.yookassa-marking-button', handleOpenPopup); 76 75 77 // Основные кнопки 76 elements.btnOpen.on('click', handleOpenPopup);77 78 elements.btnSave.on('click', handleSaveMarking); 78 79 elements.btnClear.on('click', handleClearMarking); -
yookassa/trunk/includes/YooKassa.php
r3329798 r3341024 55 55 { 56 56 $this->plugin_name = 'yookassa'; 57 $this->version = '2.12. 1';57 $this->version = '2.12.2'; 58 58 self::$pluginUrl = plugin_dir_url(dirname(__FILE__)); 59 59 self::$pluginPath = plugin_dir_path(dirname(__FILE__)); … … 190 190 $this->loader->addAction('wp_ajax_woocommerce_get_oder_item_meta', $plugin_admin, 'getOderItemMetaCallback'); 191 191 $this->loader->addAction('admin_notices', $plugin_admin, 'displayOrderWarning'); 192 $this->loader->addAction('woocommerce_order_refunded', $plugin_admin, 'deleteMarkingAfterRefund', 10, 2); 192 193 } 193 194 -
yookassa/trunk/includes/YooKassaSecondReceipt.php
r3321324 r3341024 250 250 } 251 251 252 $markingCodeHandler = $markingEnabled ? new YooKassaMarkingCodeHandler($this->provider) : null;253 252 $orderItems = $order->get_items(); 254 253 … … 260 259 $item->setPaymentMode(PaymentMode::FULL_PAYMENT); 261 260 try { 262 $result['amount'] += $item->getAmount() / 100.0;263 264 261 if ($markingEnabled) { 265 $processedItems = $this->processItem($item, $orderItems, $markingCodeHandler);262 $processedItems = $this->processItem($item, $orderItems, new YooKassaMarkingCodeHandler($this->provider)); 266 263 $result['items'] = array_merge($result['items'], $processedItems); 267 264 } else { 268 265 $result['items'][] = new ReceiptItem($item->jsonSerialize()); 269 266 } 267 $result['amount'] += $item->getAmount() / 100.0; 270 268 } catch (Exception $e) { 271 269 YooKassaLogger::error(sprintf( … … 313 311 || $productQuantity !== $itemData['quantity'] 314 312 ) { 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 )); 315 324 continue; 316 325 } -
yookassa/trunk/languages/yookassa-en.po
r3329798 r3341024 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: ЮKassa для WooCommerce 2.12. 1\n"5 "Project-Id-Version: ЮKassa для WooCommerce 2.12.2\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/yookassa\n" 7 "POT-Creation-Date: 2025-0 7-07T10:02:11+00:00\n"8 "PO-Revision-Date: 2025-0 7-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" 9 9 "Last-Translator: yoomoney <cms@yoomoney.ru>\n" 10 10 "Language-Team: yoomoney <cms@yoomoney.ru>\n" -
yookassa/trunk/languages/yookassa-en_GB.po
r3329798 r3341024 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: ЮKassa для WooCommerce 2.12. 1\n"5 "Project-Id-Version: ЮKassa для WooCommerce 2.12.2\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/yookassa\n" 7 "POT-Creation-Date: 2025-0 7-07T10:02:11+00:00\n"8 "PO-Revision-Date: 2025-0 7-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" 9 9 "Last-Translator: yoomoney <cms@yoomoney.ru>\n" 10 10 "Language-Team: yoomoney <cms@yoomoney.ru>\n" -
yookassa/trunk/languages/yookassa-en_US.po
r3329798 r3341024 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: ЮKassa для WooCommerce 2.12. 1\n"5 "Project-Id-Version: ЮKassa для WooCommerce 2.12.2\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/yookassa\n" 7 "POT-Creation-Date: 2025-0 7-07T10:02:11+00:00\n"8 "PO-Revision-Date: 2025-0 7-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" 9 9 "Last-Translator: yoomoney <cms@yoomoney.ru>\n" 10 10 "Language-Team: yoomoney <cms@yoomoney.ru>\n" -
yookassa/trunk/languages/yookassa.pot
r3329798 r3341024 4 4 msgid "" 5 5 msgstr "" 6 "Project-Id-Version: yookassa 2.12. 1\n"6 "Project-Id-Version: yookassa 2.12.2\n" 7 7 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/yookassa\n" 8 "POT-Creation-Date: 2025-0 7-07 13:43+0300\n"8 "POT-Creation-Date: 2025-08-07 13:05+0300\n" 9 9 "PO-Revision-Date: 2025-04-15 12:18+0300\n" 10 10 "Last-Translator: yoomoney <cms@yoomoney.ru>\n" -
yookassa/trunk/yookassa.php
r3329798 r3341024 16 16 * Plugin URI: https://wordpress.org/plugins/yookassa/ 17 17 * Description: Платежный модуль для работы с сервисом ЮKassa через плагин WooCommerce 18 * Version: 2.12. 118 * Version: 2.12.2 19 19 * Author: YooMoney 20 20 * Author URI: http://yookassa.ru
Note: See TracChangeset
for help on using the changeset viewer.