Bixpy Reseller Discount Calculator
Bixpy Reseller Pricing Calculator body { box-sizing: border-box; font-family: 'Jost', sans-serif; } /* Hide number input arrows for price inputs only */ .price-input::-webkit-outer-spin-button, .price-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } .price-input { -moz-appearance: textfield; } .bixpy-blue { background-color: #5A9ACB; } .bixpy-blue-hover:hover { background-color: #4A8AB8; } .bixpy-black { color: #000000; } .bixpy-black-bg { background-color: #000000; } .bixpy-white { background-color: #FFFFFF; } .bixpy-blue-light { background-color: rgba(90, 154, 203, 0.1); } .bixpy-blue-border { border-color: #5A9ACB; } #resellerGateOverlay { position: fixed; inset: 0; background: rgba(0,0,0,.55); display: none; /* toggled via JS */ align-items: center; justify-content: center; z-index: 99999; } #resellerGateModal { width: min(720px, 92vw); max-height: 92vh; /* modal is scrollable */ overflow: auto; background: #fff; border-radius: 14px; box-shadow: 0 10px 40px rgba(0,0,0,.25); padding: 24px; position: relative; } #resellerGateClose { position: absolute; top: 14px; right: 16px; border: 0; background: transparent; font-size: 22px; cursor: pointer; line-height: 1; color: #334155; } /* Optional: nicer scrollbar inside modal */ #resellerGateModal::-webkit-scrollbar{width:10px} #resellerGateModal::-webkit-scrollbar-thumb{background:#c7d7e6;border-radius:6px}
×
(function() { const LS_KEY = "resellerGateCompleted"; const overlay = document.getElementById("resellerGateOverlay"); const closeBtn = document.getElementById("resellerGateClose"); function openGate() { overlay.style.display = "flex"; } function closeGate() { overlay.style.display = "none"; } // Show popup only if not completed before if (!localStorage.getItem(LS_KEY)) openGate(); // Manual close + Esc fallback closeBtn.addEventListener("click", closeGate); window.addEventListener("keydown", (e) => { if (e.key === "Escape") closeGate(); }); // Wait for HubSpot script to load, then create the form with a submission callback function initHsForm() { if (!window.hbspt || !hbspt.forms || !hbspt.forms.create) { setTimeout(initHsForm, 50); return; } hbspt.forms.create({ portalId: "243473337", formId: "2d747c22-5c1a-4b12-98a9-5b4a68b7fc28", target: "#hubspot-form", cssRequired: "", css: "", onFormSubmitted: function() { try { localStorage.setItem(LS_KEY, "1"); } catch {} closeGate(); } }); // Fallback listener for rare cases window.addEventListener("message", function(ev){ const d = ev?.data; if (!d || typeof d !== "object") return; if (d.type === "hsFormCallback" && d.eventName === "onFormSubmitted") { try { localStorage.setItem(LS_KEY, "1"); } catch {} closeGate(); } }, false); } initHsForm(); })();
Calculate your wholesale pricing with automatic discount tiers
1 Select Products
Product Name Select a product... MT-K11-3002 - Bixpy K-1 Motor™ KI-K11-2301 - Bixpy K-1 Outboard Kit™ KI-BAP-2388 - Bixpy K-1 Angler Pro Outboard Kit™ KI-KSN-2308 - K-1 Outboard Kit with SUN 80 Solar Panel™ KI-NMB-2501 - N-3 Outboard Motor Kit - Short Shaft KI-NMB-2502 - N-3 Outboard Motor Kit - Long Shaft BA-OBB-2103 - Bixpy PP-378 Outboard Battery (V4) BA-OBB-7681 - Bixpy PP-768 Outboard Battery (V2) BA-OBB-1440 - Bixpy NB-1440 Power Pack BA-PPB-2201 - PP-77-LW - 6V Live Well Battery BA-PPB-2202 - PP-77-AP - 12V and USB Outdoor Battery KI-PAP-2302 - PP-77-AP Power Bank & SUN45 Solar Panel Bundle CH-SOL-1001 - SUN45 Waterproof Solar Panel CH-SOL-2201 - SUN80 Waterproof Solar Panel AC-SUP-1001 - US Fin Adapter AC-SUP-1003 - Flip & Lock Fin Adapter AC-SUP-1002 - Slide & Lock Fin Adapter AC-SUP-1004 - SUP Adapter all 3 Fins Bundle AT-INK-2101 - Glue-On Fin Box Adapter AC-3MT-2401 - Peel & Bond Fin Box Adapter AC-HBR-2102 - Hobie Twist & Stow Rudder Adapter AC-RUD-2301 - Universal Versa Rudder - V-Arm Steering AC-RUD-2302 - Universal Versa Rudder - Pole Steering AT-GKC-2101 - Universal Kayak Adapter AT-UTM-2103 - Transom Adapter AT-PPA-2102 - Power Pole Adapter AT-PPP-2104 - Hobie Pro Angler with OneObjective PP Plate AT-PPC-2105 - Hobie Compass with Hobie Plate AT-NUC-2401 - NuCanoe QuickConnect Motor Shaft AT-RBL-2401 - RailBlaza Universal Hexx Adapter AT-BVP-2510 - Bixpy DIY Vertical Motor Mounting Pipe AT-HBB-2301 - Mirage Fin Type Pedal Drive Adapter AT-POD-2301 - Bonafide Pod Adapter AT-POD-2302 - Feelfree Pod Adapter AT-POD-2303 - DIY POD Adapter AT-BOT-2316 - BOTE Apex Pedal Drive Adapter AT-HDO-2401 - Hoodoo Pedal Drive Adapter AT-NTV-2411 - Native Pedal Drive Adapter AT-IMP-2411 - Impulse Pedal Drive Adapter AT-OLD-2511 - OldTown PDL Pedal Drive Adapter AC-GUD-1002 - Bixpy WillFit Gudgeon for 10mm rudders AC-SGU-1010 - Bixpy Simple Gudgeon for 10 mm rudders AC-HGU-2401 - Hobie Lynx/iTrek Rudder Gudgeon AC-CMM-2501 - Canoe Motor Mounting Plate AC-BHP-2504 - Bixpy Hobie Pro Angler Triple Mount Plate AC-HCP-2507 - Bixpy Hobie Compass Mount Plate MP-OTP-2508 - Bixpy Old Town Power Pole Angle Correction Plate AC-PPT-2509 - Bixpy Power Pole to Transom Conversion Adapter AC-STM-1001 - Bixpy Hand Steering Kit AC-FTS-1002 - Foot Pedal Steering System AC-TSH-1001 - Tiller Steering Handle AC-PSA-2409 - Bixpy Pole Steering - Including Telescopic Handle AC-VRM-1003 - Adjustable V-ARM Steering Bracket AC-STR-2409 - Telescopic Extension Handle for Pole Steering AC-EXT-1006 - Bixpy Motor Extension Cable - 9 feet AC-EXT-1007 - Bixpy Motor Extension Cable - 4.5 feet SP-KIT-3101 - Kare Kit for Bixpy K-1 PowerShroud Motor
Retail Price
$
Quantity
+ Add Product
2 Pricing Summary
Retail Subtotal: $0.00
Current Discount Tier
No discount
$0.00 savings
Add $100 to unlock 20% discount!
$0 $100
Wholesale Total: $0.00
Note: Shipping costs will be calculated and added once we receive your final order details.
High Volume Pricing
Please contact us at sales@bixpy.com to negotiate your discount for orders over $50,000.
Discount Tiers
$100 - $3,999 20%
$4,000 - $7,999 25%
$8,000 - $14,999 27%
$15,000 - $49,999 30%
$50,000+ CONTACT US
3 Next Steps
Download Quote
Get pricing summary
Download
Reseller Handbook
Complete reseller guide
Become a Reseller
Join our reseller program
Email Your Order
Send order details to us
let productCounter = 1; function updatePrice(selectElement, productId) { const price = selectElement.value; const productRow = document.getElementById('product-' + productId); const priceInput = productRow.querySelector('.price-input'); priceInput.value = price; calculateTotals(); } function addProduct() { const productList = document.getElementById('productList'); const productId = productCounter++; const productHTML = ` <div class="bg-gray-50 p-4 rounded-lg border" id="product-${productId}"> <div class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center"> <div class="md:col-span-2"> <label class="block text-sm font-medium bixpy-black mb-1">Product Name</label> <select class="product-select w-full px-4 py-3 text-base border border-gray-300 rounded-md focus:outline-none focus:ring-2" style="border-color: #5A9ACB; --tw-ring-color: #5A9ACB;" onchange="updatePrice(this, ${productId})"> <option value="">Select a product...</option> <option value="749.00">MT-K11-3002 - Bixpy K-1 Motor™</option> <option value="1399.00">KI-K11-2301 - Bixpy K-1 Outboard Kit™</option> <option value="1699.00">KI-BAP-2388 - Bixpy K-1 Angler Pro Outboard Kit™</option> <option value="1599.00">KI-KSN-2308 - K-1 Outboard Kit with SUN 80 Solar Panel™</option> <option value="2749.00">KI-NMB-2501 - N-3 Outboard Motor Kit - Short Shaft</option> <option value="2749.00">KI-NMB-2502 - N-3 Outboard Motor Kit - Long Shaft</option> <option value="749.00">BA-OBB-2103 - Bixpy PP-378 Outboard Battery (V4)</option> <option value="999.00">BA-OBB-7681 - Bixpy PP-768 Outboard Battery (V2)</option> <option value="1199.00">BA-OBB-1440 - Bixpy NB-1440 Power Pack</option> <option value="124.99">BA-PPB-2201 - PP-77-LW - 6V Live Well Battery</option> <option value="149.99">BA-PPB-2202 - PP-77-AP - 12V and USB Outdoor Battery</option> <option value="289.00">KI-PAP-2302 - PP-77-AP Power Bank & SUN45 Solar Panel Bundle</option> <option value="169.00">CH-SOL-1001 - SUN45 Waterproof Solar Panel</option> <option value="259.00">CH-SOL-2201 - SUN80 Waterproof Solar Panel</option> <option value="35.00">AC-SUP-1001 - US Fin Adapter</option> <option value="35.00">AC-SUP-1003 - Flip & Lock Fin Adapter</option> <option value="35.00">AC-SUP-1002 - Slide & Lock Fin Adapter</option> <option value="99.00">AC-SUP-1004 - SUP Adapter all 3 Fins Bundle</option> <option value="69.00">AT-INK-2101 - Glue-On Fin Box Adapter</option> <option value="69.00">AC-3MT-2401 - Peel & Bond Fin Box Adapter</option> <option value="69.00">AC-HBR-2102 - Hobie Twist & Stow Rudder Adapter</option> <option value="199.00">AC-RUD-2301 - Universal Versa Rudder - V-Arm Steering</option> <option value="199.00">AC-RUD-2302 - Universal Versa Rudder - Pole Steering</option> <option value="179.00">AT-GKC-2101 - Universal Kayak Adapter</option> <option value="199.00">AT-UTM-2103 - Transom Adapter</option> <option value="229.00">AT-PPA-2102 - Power Pole Adapter</option> <option value="379.00">AT-PPP-2104 - Hobie Pro Angler with OneObjective PP Plate</option> <option value="339.00">AT-PPC-2105 - Hobie Compass with Hobie Plate</option> <option value="129.00">AT-NUC-2401 - NuCanoe QuickConnect Motor Shaft</option> <option value="229.00">AT-RBL-2401 - RailBlaza Universal Hexx Adapter</option> <option value="99.00">AT-BVP-2510 - Bixpy DIY Vertical Motor Mounting Pipe</option> <option value="199.00">AT-HBB-2301 - Mirage Fin Type Pedal Drive Adapter</option> <option value="249.00">AT-POD-2301 - Bonafide Pod Adapter</option> <option value="249.00">AT-POD-2302 - Feelfree Pod Adapter</option> <option value="149.00">AT-POD-2303 - DIY POD Adapter</option> <option value="229.00">AT-BOT-2316 - BOTE Apex Pedal Drive Adapter</option> <option value="229.00">AT-HDO-2401 - Hoodoo Pedal Drive Adapter</option> <option value="229.00">AT-NTV-2411 - Native Pedal Drive Adapter</option> <option value="229.00">AT-IMP-2411 - Impulse Pedal Drive Adapter</option> <option value="229.00">AT-OLD-2511 - OldTown PDL Pedal Drive Adapter</option> <option value="89.00">AC-GUD-1002 - Bixpy WillFit Gudgeon for 10mm rudders</option> <option value="45.00">AC-SGU-1010 - Bixpy Simple Gudgeon for 10 mm rudders</option> <option value="65.00">AC-HGU-2401 - Hobie Lynx/iTrek Rudder Gudgeon</option> <option value="139.00">AC-CMM-2501 - Canoe Motor Mounting Plate</option> <option value="139.00">AC-BHP-2504 - Bixpy Hobie Pro Angler Triple Mount Plate</option> <option value="69.00">AC-HCP-2507 - Bixpy Hobie Compass Mount Plate</option> <option value="45.00">MP-OTP-2508 - Bixpy Old Town Power Pole Angle Correction Plate</option> <option value="129.00">AC-PPT-2509 - Bixpy Power Pole to Transom Conversion Adapter</option> <option value="79.00">AC-STM-1001 - Bixpy Hand Steering Kit</option> <option value="89.00">AC-FTS-1002 - Foot Pedal Steering System</option> <option value="89.00">AC-TSH-1001 - Tiller Steering Handle</option> <option value="129.00">AC-PSA-2409 - Bixpy Pole Steering - Including Telescopic Handle</option> <option value="89.00">AC-VRM-1003 - Adjustable V-ARM Steering Bracket</option> <option value="55.00">AC-STR-2409 - Telescopic Extension Handle for Pole Steering</option> <option value="40.00">AC-EXT-1006 - Bixpy Motor Extension Cable - 9 feet</option> <option value="35.00">AC-EXT-1007 - Bixpy Motor Extension Cable - 4.5 feet</option> <option value="39.00">SP-KIT-3101 - Kare Kit for Bixpy K-1 PowerShroud Motor</option> </select> </div> <div> <label class="block text-sm font-medium bixpy-black mb-1">Retail Price</label> <div class="relative"> <span class="absolute left-3 top-2 bixpy-black">$</span> <input type="number" value="0" step="0.01" min="0" class="price-input w-full pl-10 pr-4 py-3 text-base border border-gray-300 rounded-md focus:outline-none focus:ring-2 bg-gray-100" style="border-color: #5A9ACB; --tw-ring-color: #5A9ACB;" placeholder="0.00" readonly> </div> </div> <div class="flex items-end gap-2"> <div class="flex-1"> <label class="block text-sm font-medium bixpy-black mb-1">Quantity</label> <input type="number" value="1" min="0" class="quantity-input w-full px-4 py-3 text-base border border-gray-300 rounded-md focus:outline-none focus:ring-2" style="border-color: #5A9ACB; --tw-ring-color: #5A9ACB;" placeholder="0" onchange="calculateTotals()"> </div> <button onclick="removeProduct('product-${productId}')" class="px-3 py-2 text-red-600 hover:bg-red-50 rounded-md transition-colors"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"></path> </svg> </button> </div> </div> </div> `; productList.insertAdjacentHTML('beforeend', productHTML); calculateTotals(); } function removeProduct(productId) { const product = document.getElementById(productId); if (product) { product.remove(); calculateTotals(); } } function calculateTotals() { const productRows = document.querySelectorAll('#productList > div'); let retailTotal = 0; productRows.forEach(row => { const priceInput = row.querySelector('.price-input'); const quantityInput = row.querySelector('.quantity-input'); if (priceInput && quantityInput) { const price = parseFloat(priceInput.value) || 0; const quantity = parseInt(quantityInput.value) || 0; retailTotal += price * quantity; } }); // Update retail total document.getElementById('retailTotal').textContent = `$${retailTotal.toFixed(2)}`; // Calculate discount tier let discountPercent = 0; let tierText = 'No discount'; let showContactMessage = false; if (retailTotal >= 50000) { tierText = 'Contact for pricing'; showContactMessage = true; } else if (retailTotal >= 15000) { discountPercent = 30; tierText = '30% discount'; } else if (retailTotal >= 8000) { discountPercent = 27; tierText = '27% discount'; } else if (retailTotal >= 4000) { discountPercent = 25; tierText = '25% discount'; } else if (retailTotal >= 100) { discountPercent = 20; tierText = '20% discount'; } // Update discount display document.getElementById('discountTier').textContent = tierText; const discountAmount = retailTotal * (discountPercent / 100); document.getElementById('discountAmount').textContent = `$${discountAmount.toFixed(2)} savings`; // Calculate wholesale total const wholesaleTotal = retailTotal - discountAmount; document.getElementById('wholesaleTotal').textContent = `$${wholesaleTotal.toFixed(2)}`; // Update progress to next tier updateProgressBar(retailTotal); // Show/hide contact message const contactMessage = document.getElementById('contactMessage'); if (showContactMessage) { contactMessage.classList.remove('hidden'); } else { contactMessage.classList.add('hidden'); } } function updateProgressBar(retailTotal) { const progressSection = document.getElementById('progressSection'); const progressText = document.getElementById('progressText'); const progressBar = document.getElementById('progressBar'); const currentAmount = document.getElementById('currentAmount'); const nextTierAmount = document.getElementById('nextTierAmount'); let nextTier = 0; let nextTierDiscount = ''; let currentTierStart = 0; let progressPercent = 0; if (retailTotal >= 50000) { // At highest tier, hide progress bar progressSection.style.display = 'none'; return; } else if (retailTotal >= 15000) { // At 30% tier, next is contact tier nextTier = 50000; nextTierDiscount = 'contact pricing'; currentTierStart = 15000; } else if (retailTotal >= 8000) { // At 27% tier, next is 30% nextTier = 15000; nextTierDiscount = '30% discount'; currentTierStart = 8000; } else if (retailTotal >= 4000) { // At 25% tier, next is 27% nextTier = 8000; nextTierDiscount = '27% discount'; currentTierStart = 4000; } else if (retailTotal >= 100) { // At 20% tier, next is 25% nextTier = 4000; nextTierDiscount = '25% discount'; currentTierStart = 100; } else { // Below first tier, next is 20% nextTier = 100; nextTierDiscount = '20% discount'; currentTierStart = 0; } progressSection.style.display = 'block'; const remaining = nextTier - retailTotal; const tierRange = nextTier - currentTierStart; const progress = Math.max(0, retailTotal - currentTierStart); progressPercent = Math.min(100, (progress / tierRange) * 100); if (remaining > 0) { if (nextTierDiscount === 'contact pricing') { progressText.textContent = `Add $${remaining.toLocaleString()} for contact pricing!`; } else { progressText.textContent = `$${remaining.toLocaleString()} away from ${nextTierDiscount}!`; } } else { progressText.textContent = `You've reached ${nextTierDiscount}!`; } progressBar.style.width = `${progressPercent}%`; currentAmount.textContent = `$${retailTotal.toLocaleString()}`; nextTierAmount.textContent = `$${nextTier.toLocaleString()}`; } // ====== Helper for logo fetch (base64) + New PDF generator ====== async function downloadQuote() { // Get all product data const productRows = document.querySelectorAll('#productList > div'); let products = []; let retailTotal = 0; productRows.forEach(row => { const selectElement = row.querySelector('.product-select'); const priceInput = row.querySelector('.price-input'); const quantityInput = row.querySelector('.quantity-input'); if (selectElement && priceInput && quantityInput && selectElement.value) { const productName = selectElement.options[selectElement.selectedIndex].text; const price = parseFloat(priceInput.value) || 0; const quantity = parseInt(quantityInput.value) || 0; const lineTotal = price * quantity; products.push({ name: productName, price: price, quantity: quantity, total: lineTotal }); retailTotal += lineTotal; } }); if (products.length === 0) { document.body.insertAdjacentHTML('beforeend', ` <div id="alertModal" class="fixed inset-0 flex items-center justify-center bg-black bg-opacity-40 z-50 font-[Jost]"> <div class="bg-white rounded-2xl p-8 shadow-xl text-center max-w-sm border-t-8" style="border-color:#5A9ACB;"> <h3 class="text-2xl font-semibold mb-3 text-gray-900">No Products Added</h3> <p class="text-base text-gray-700 mb-6 leading-relaxed">Please add at least one product to generate a quote.</p> <button onclick="document.getElementById('alertModal').remove()" class="px-6 py-3 rounded-lg text-white text-base font-medium transition-colors" style="background-color:#5A9ACB;" onmouseover="this.style.backgroundColor='#4A8AB8'" onmouseout="this.style.backgroundColor='#5A9ACB'"> OK </button> </div> </div> `); return; } // Calculate discount let discountPercent = 0; let tierText = 'No discount'; if (retailTotal >= 50000) { tierText = 'Contact for pricing'; } else if (retailTotal >= 15000) { discountPercent = 30; tierText = '30% discount'; } else if (retailTotal >= 8000) { discountPercent = 27; tierText = '27% discount'; } else if (retailTotal >= 4000) { discountPercent = 25; tierText = '25% discount'; } else if (retailTotal >= 100) { discountPercent = 20; tierText = '20% discount'; } const discountAmount = retailTotal * (discountPercent / 100); const wholesaleTotal = retailTotal - discountAmount; // ===== Generate a real PDF with jsPDF ===== const { jsPDF } = window.jspdf; const doc = new jsPDF({ unit: 'pt', format: 'letter' }); // 612 x 792 const currentDate = new Date().toLocaleDateString(); const margin = 48; // ~0.67" const pageWidth = doc.internal.pageSize.getWidth(); const pageHeight = doc.internal.pageSize.getHeight(); let y = margin; // Header (no logo) doc.setFont('helvetica', 'bold'); doc.setFontSize(18); doc.setTextColor(0); doc.text('BIXPY WHOLESALE QUOTE', margin, y); y += 24; doc.setFont('helvetica', 'normal'); doc.setFontSize(11); doc.setTextColor(80); doc.text(`Generated: ${currentDate}`, margin, y); y += 18; // Divider doc.setDrawColor(200); doc.line(margin, y, pageWidth - margin, y); y += 18; // Table Header doc.setFont('helvetica', 'bold'); doc.setFontSize(12); doc.setTextColor(0); const colX = { name: margin, qty: pageWidth - margin - 220, price: pageWidth - margin - 140, total: pageWidth - margin - 60 }; doc.text('Item', colX.name, y); doc.text('Qty', colX.qty, y, { align: 'right' }); doc.text('Price', colX.price, y, { align: 'right' }); doc.text('Total', colX.total, y, { align: 'right' }); y += 12; doc.setDrawColor(220); doc.line(margin, y, pageWidth - margin, y); y += 10; // Table Rows doc.setFont('helvetica', 'normal'); doc.setFontSize(11); const lineHeight = 16; const addPageIfNeeded = (needed = lineHeight) => { if (y + needed > pageHeight - margin) { doc.addPage(); y = margin; // re-draw header on new page doc.setFont('helvetica', 'bold'); doc.setFontSize(12); doc.text('Item', colX.name, y); doc.text('Qty', colX.qty, y, { align: 'right' }); doc.text('Price', colX.price, y, { align: 'right' }); doc.text('Total', colX.total, y, { align: 'right' }); y += 12; doc.setDrawColor(220); doc.line(margin, y, pageWidth - margin, y); y += 10; doc.setFont('helvetica', 'normal'); doc.setFontSize(11); } }; products.forEach(p => { // wrap long names const nameLines = doc.splitTextToSize(p.name, colX.qty - colX.name - 12); nameLines.forEach((line, idx) => { addPageIfNeeded(); doc.text(line, colX.name, y); if (idx === 0) { doc.text(String(p.quantity), colX.qty, y, { align: 'right' }); doc.text(`$${p.price.toFixed(2)}`, colX.price, y, { align: 'right' }); doc.text(`$${p.total.toFixed(2)}`, colX.total, y, { align: 'right' }); } y += lineHeight; }); // row divider addPageIfNeeded(8); doc.setDrawColor(245); doc.line(margin, y - 6, pageWidth - margin, y - 6); }); // Summary addPageIfNeeded(80); y += 10; doc.setDrawColor(200); doc.line(margin, y, pageWidth - margin, y); y += 18; const rightCol = pageWidth - margin; doc.setFont('helvetica', 'bold'); doc.setTextColor(0); doc.text('PRICING SUMMARY', margin, y); y += 18; doc.setFont('helvetica', 'normal'); doc.setFontSize(12); const summaryLine = (label, value) => { addPageIfNeeded(); doc.text(label, margin, y); doc.text(value, rightCol, y, { align: 'right' }); y += 18; }; summaryLine('Retail Subtotal:', `$${retailTotal.toFixed(2)}`); summaryLine('Discount Tier:', tierText); summaryLine('Savings:', `$${discountAmount.toFixed(2)}`); doc.setFont('helvetica', 'bold'); summaryLine('Wholesale Total:', `$${wholesaleTotal.toFixed(2)}`); doc.setFont('helvetica', 'normal'); // Notes addPageIfNeeded(60); y += 6; doc.setFont('helvetica', 'bold'); doc.text('NOTES', margin, y); y += 16; doc.setFont('helvetica', 'normal'); doc.setFontSize(11); const notes = [ '• Shipping costs will be calculated and added once we receive your final order details.', '• For questions or to place your order, contact us at sales@bixpy.com' ]; notes.forEach(n => { const lines = doc.splitTextToSize(n, pageWidth - margin * 2); lines.forEach(line => { addPageIfNeeded(); doc.text(line, margin, y); y += 16; }); }); // Save PDF doc.save(`Bixpy_Wholesale_Quote_${currentDate.replace(/\//g, '-')}.pdf`); } // Initialize calculations calculateTotals(); (function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'98c1e36974d6dbe5',t:'MTc2MDA1NDk1OS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();