ショッピングカート
// カート情報を取得して見積書作成アプリに送信するメインの関数
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';
}
}
});