ショッピングカート

// カート情報を取得して見積書作成アプリに送信するメインの関数 function sendCartToQuote() { const button = document.getElementById('createQuoteBtn'); const statusDiv = document.getElementById('quoteStatus'); button.disabled = true; statusDiv.textContent = 'カート情報を読み込み中...'; try { const cartItems = getCartItemsFromPage(); console.log('取得した商品情報:', cartItems); if (cartItems.length === 0) { alert('カートから有効な商品を取得できませんでした。カートに商品が入っているか、またはサイトのHTML構造が変更されていないかご確認ください。'); button.disabled = false; statusDiv.textContent = ''; return; } // ★ 見積書作成アプリのURL (変更があればここを修正) const quoteAppUrl = 'https://service-69513750249.us-west1.run.app/'; const payload = { items: cartItems, timestamp: new Date().toISOString(), source: 'polisher.jp' }; const params = new URLSearchParams(); params.append('cartData', JSON.stringify(payload)); const finalUrl = quoteAppUrl + '?' + params.toString(); // 新しいタブでアプリを開く window.open(finalUrl, '_blank'); statusDiv.textContent = '✅ 見積書作成ページを開きました。'; setTimeout(() => { button.disabled = false; }, 1000); // 1秒後にボタンを再度有効化 } catch (error) { console.error('見積書作成処理中にエラーが発生しました:', error); alert('エラーが発生しました。お手数ですが、もう一度お試しください。'); button.disabled = false; statusDiv.textContent = 'エラーが発生しました。'; } } // ページのHTMLからカート内の商品情報を抽出する関数 function getCartItemsFromPage() { const items = []; // ★ カート内の各商品を一意に識別する要素のCSSセレクタ (サイト構造に合わせて要確認) const cartItemElements = document.querySelectorAll('.cart_data_box'); // 文字列から通貨記号やカンマを取り除き、数値に変換するヘルパー関数 const parsePrice = (text) => { if (!text) return 0; // 数字、ドット、マイナス記号以外をすべて削除して数値に変換 return Number(String(text).replace(/[^0-9.-]+/g, "")); }; cartItemElements.forEach(box => { try { // --- ▼ 各情報に対応する要素のセレクタ (この部分が最も変更されやすい箇所です) ▼ --- const nameElement = box.querySelector('.goods_name'); const modelNumber = box.querySelector('.model_number'); const quantitySelect = box.querySelector('.cart_quantity'); // 数量 (select要素の場合) const subtotalElement = box.querySelector('.sub_total_price'); // 商品ごとの小計 // --- ▲ ここまでがサイト依存のセレクタ ▲ --- // 商品名、数量、小計の要素が見つからない場合は、その商品をスキップ if (!nameElement || !quantitySelect || !subtotalElement) { console.warn('商品情報の一部が見つかりませんでした。スキップします。', box); return; } const name = nameElement.textContent.trim() + (modelNumber ? ' [' + modelNumber.textContent.trim() + ']' : ''); const quantity = parseInt(quantitySelect.value, 10); const rowSubtotal = parsePrice(subtotalElement.textContent); // 【重要】単価を計算します (小計 ÷ 数量) // これにより、アプリ側で正確な合計金額が計算されます。 const unitPrice = (quantity > 0 && rowSubtotal > 0) ? Math.round(rowSubtotal / quantity) : 0; // 有効な商品データのみを配列に追加 if (name && quantity > 0 && unitPrice >= 0) { items.push({ name: name, quantity: quantity, price: unitPrice, // ★ 計算した単価を送信 }); } } catch (e) { console.error('特定の商品情報の処理中にエラーが発生しました。', e, box); } }); // 「合計」行はアプリ側で計算するため、送信しないように変更しました。 return items; } // ページ読み込み時にカートが空かどうかのチェック document.addEventListener('DOMContentLoaded', function() { // カートが空であることを示す要素 (サイトに合わせて要確認) const emptyCartMessage = document.querySelector('.cart-empty, .empty-cart'); if (emptyCartMessage && emptyCartMessage.textContent.includes('空')) { const container = document.querySelector('.quote-button-container'); if (container) { container.style.display = 'none'; } } });

現在のカートの中身

カートは空です。