Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/ilovecveti.ru/bitrix/js/wbs24.ozonapinew/ |
Upload File : |
class Wbs24OzonapinewSplitOrder { debug = false; productsObject = null; orderErrorClass = 'js-wbs24-order-error'; constructor(orderId, accountIndex, langPhrazes) { this.langPhrazes = langPhrazes; this.orderId = orderId; this.accountIndex = accountIndex; // Разделение заказа на разные упаковки this.validateOrderBtn = document.querySelector(".wbs24_start-collect-btn"); this.pacakgeAddBtn = document.querySelector(".wbs24_add-new-package"); this.node = document.getElementById("wbs24-packages"); // Сборка заказа this.collectBtn = document.querySelector(".wbs24_collect-btn"); this.collectOrderMessage = document.querySelector(".wbs24_collect_td"); this.packageLabel = document.querySelector(".wbs24_package-label"); this.actCreate = document.querySelector(".wbs24_act-create"); // блокировка кнопок сборки и добавления упаковки this.pacakgeAddBtn.setAttribute("disabled", true); this.collectBtn.setAttribute("disabled", true); // Обработчики this.addHandler('click', '.wbs24_add-new-package'); } // Сборка заказа trackButtonPressCollectOrder(postingNumber) { let collectBtn = this.collectBtn; let orderId = this.orderId; let collectOrderMessage = this.collectOrderMessage; let packageLabel = this.packageLabel; let actCreate = this.actCreate; if (collectBtn) { collectBtn.onclick = async (e) => { e.preventDefault(); this.hideOrderErrors(); let jsonPackages = JSON.stringify(this.productsObject); let url = '/bitrix/tools/wbs24.ozonapinew/ajax.php?ACTION=collect_order&packages=' + jsonPackages + '&order_id=' + orderId + '&posting_number=' + postingNumber + '&account_index=' + this.accountIndex ; e.preventDefault(); let response = await fetch(url); let responseText = await response.text(); if (this.debug) console.log(responseText); let data = JSON.parse(responseText); if (this.debug) console.log(data); if (data.result == "success") { collectBtn.setAttribute('disabled', true); collectOrderMessage.style.display = 'inline-block'; packageLabel.removeAttribute('disabled'); actCreate.removeAttribute('disabled'); } else { let orderError = document.querySelector("."+this.orderErrorClass+"[data-error='"+data.result+"']"); if (!orderError) orderError = document.querySelector("."+this.orderErrorClass+"[data-error='UNKNOWN']"); if (orderError) { orderError.style.display = 'inline-block'; } } }; } } hideOrderErrors() { let orderErrors = document.querySelectorAll("."+this.orderErrorClass); for (let error of orderErrors) { error.style.display = 'none'; } } // Разделение заказа на упаковки runOrderSplit(postingNumber) { this.validateOrder ( postingNumber, this.validateOrderBtn, this.orderId, this.accountIndex ); } validateOrder ( postingNumber, validateOrderBtn, orderId, accountIndex ) { if ( validateOrderBtn && orderId && accountIndex ) { validateOrderBtn.onclick = async (e) => { e.preventDefault(); let url = '/bitrix/tools/wbs24.ozonapinew/checkorder.php?ACTION=check_order' + '&order_id=' + orderId + '&posting_number=' + postingNumber + '&account_index=' + accountIndex ; let response = await fetch(url); let responseText = await response.text(); let data = JSON.parse(responseText); if (data['products'] && data['validation']) { this.pacakgeAddBtn.removeAttribute("disabled"); this.collectBtn.removeAttribute("disabled"); this.continueOrderSplit( data['products'], true ); } else { this.notifyErrors(this.node); } }; }; } continueOrderSplit(products, firstLaunch) { this.objectWork(products, firstLaunch); this.renderingWork(this.productsObject); } objectWork(products, firstLaunch) { if (firstLaunch) { this.productsObject = this.prepareObject(products); } else { this.productsObject = this.manageObject(products); } } renderingWork(productsObject) { if (productsObject) { this.renderingPackages(productsObject, this.node); } } prepareObject( products, packagesCount = 1, packageNumber = 1 ) { for(let product of products) { product.packageNumber = packageNumber; product.id = product.product_id + '_' + packageNumber; } let productsObject = { packagesCount: packagesCount, products: products, }; //console.log(productsObject); return productsObject; } manageObject(productsObject) { // Добавление новой упаковки if (this.propertyName == 'packagesCount') { productsObject.packagesCount += 1; } // Перемещение товара в другую упаковку if (this.propertyName == 'moveProduct') { let products = productsObject.products; let product = products.find(e => String(e.id) === String(this.productId)); let arrId = this.productId.split('_'); let productExists = products.find(e => e.id === arrId[0] + '_' + this.packageNumber); if (product.quantity == this.quantity) { if (productExists) { productExists.quantity += this.quantity; // удалить товар, у которого больше не осталось остатков const index = products.findIndex(e => e.id === this.productId); if (index !== -1) { products.splice(index, 1); } } else { product.id = arrId[0] + '_' + this.packageNumber; product.packageNumber = this.packageNumber; } } if (product.quantity > this.quantity) { // Уменьшаем остатки у текущего товара product.quantity -= this.quantity; // Если уже существует товар с таким id, то добавляем новое кол-во if (productExists) { productExists.quantity += this.quantity; } else { products.push( { product_id: product.product_id, name: product.name, quantity: this.quantity, packageNumber: this.packageNumber, id: arrId[0] + '_' + this.packageNumber, } ); } } } //console.log(productsObject); return productsObject; } renderingPackages(productsObject, rootNodePackages) { rootNodePackages.innerHTML = ''; const packagesCount = productsObject.packagesCount; for (let i = 1; i < (packagesCount + 1); i++) { // Создаем корневой html для упаковки this.createRootNodePackage(rootNodePackages, i); // Отфильтровываем все товары по номеру упаковки let filtredProducts = this.filterProductsByPackage(productsObject.products, i); // Кладем товары в упаковку this.putProductsInPackage(rootNodePackages, filtredProducts, i, packagesCount); } this.addHandler('click', '.wbs24_move-product-to-package'); } createRootNodePackage(rootNodePackages, packageNumber) { let div = document.createElement('div'); div.style.border = '1px solid #c4ced2'; div.style.padding = '20px'; div.style.marginBottom = '10px'; div.dataset.packageNumber = packageNumber; div.innerHTML = '<div style="padding:0 0 10px 0">'+ this.langPhrazes.title +' '+ packageNumber +'</div>'; rootNodePackages.append(div); } filterProductsByPackage(products, packageNumber) { let filtredProducts = []; for (let product of products) { if (product.packageNumber == packageNumber) { filtredProducts.push(product); } } return filtredProducts; } putProductsInPackage(rootNodePackages, filtredProducts, i, packagesCount) { const rootPackageNode = rootNodePackages.querySelector('div[data-package-number="'+ i +'"]'); let html = ''; for (const filtredProduct of filtredProducts) { let selectForQuantity = this.getSelect(filtredProduct.quantity, this.langPhrazes.quantity); let selectForPackages = this.getSelect(packagesCount, this.langPhrazes.package_button, filtredProduct.packageNumber); html += ` <div class="wbs24__product"> <div class="wbs24__product_title">`+ filtredProduct.name +`</div> <div class="wbs24__product_quantity">`+ filtredProduct.quantity +` `+ this.langPhrazes.quantity +`</div> <div class="wbs24__product_move"> <input type="button" data-property="moveProduct" data-double="`+ filtredProduct.double +`" data-id="`+ filtredProduct.id +`" class="wbs24_move-product-to-package" value="`+ this.langPhrazes.move +`"> </div> <div class="wbs24__product_select_quantity"> <select data-propery="quantity" data-id="`+ filtredProduct.id +`" class="wbs24_select-quantity">`+ selectForQuantity +`</select> </div> <div class="wbs24__product_pretext">`+ this.langPhrazes.pretext +`</div> <div class="wbs24__product_select_package"> <select data-propery="packageNumber" data-id="`+ filtredProduct.id +`" class="wbs24_select-package">`+ selectForPackages +`</select> </div> </div> `; } rootPackageNode.innerHTML += html; } getSelect(count, nameProperty, current = false) { let html = ''; for (let i = 1; i <= count; i++) { if (i != current) { html += '<option value="' + i + '">' + i + ' ' + nameProperty + '</option>'; } } return html; } addHandler(event, css) { const items = document.querySelectorAll(css); items.forEach(item => { item.addEventListener(event, (e) => { e.preventDefault(); if (event == 'click') { if (item.dataset.property == 'packagesCount') { this.propertyName = item.dataset.property; this.continueOrderSplit(this.productsObject, false); } if (item.dataset.property == 'moveProduct') { let parent = item.closest('.wbs24__product'); let selectQuantity = parent.querySelector('.wbs24_select-quantity'); let selectPackage = parent.querySelector('.wbs24_select-package'); this.quantity = Number(selectQuantity.options[selectQuantity.selectedIndex].value); this.packageNumber = Number(selectPackage.options[selectPackage.selectedIndex].value); this.productId = item.dataset.id; this.propertyName = item.dataset.property; this.continueOrderSplit(this.productsObject, false); } } }); }); } notifyErrors(rootNodePackages) { let div = document.createElement('div'); div.classList = 'wbs24__packages_error' div.innerHTML = this.langPhrazes.error; rootNodePackages.append(div); } }