bottemplates/store.gbai/store.gbdialog/calculate-shipping.bas

187 lines
6.2 KiB
QBasic
Raw Normal View History

' Shipping and Cubage Calculator
' Calculates shipping dimensions, volume, and estimated costs
PARAM product_id AS INTEGER DESCRIPTION "Product ID to calculate shipping for"
PARAM quantity AS INTEGER OPTIONAL DESCRIPTION "Quantity of items (default: 1)"
PARAM destination_zip AS STRING OPTIONAL DESCRIPTION "Destination ZIP code for shipping estimate"
DESCRIPTION "Calculate shipping dimensions, volumetric weight, and estimated shipping cost"
' Set defaults
IF NOT quantity THEN
quantity = 1
END IF
' Find product by ID
product = FIND "Products.csv", "ProductID = " + product_id
IF NOT product THEN
TALK "❌ Product not found with ID: " + product_id
RETURN { "error": "Product not found" }
END IF
' Get product dimensions from extended fields or estimate from quantity per unit
' Default dimensions in cm (length x width x height)
dimensions = {}
' Parse quantity per unit for dimension hints
qty_unit = product.QuantityPerUnit
IF qty_unit THEN
' Extract numeric values and unit types
IF CONTAINS(qty_unit, "kg") THEN
dimensions.estimated_weight = EXTRACT_NUMBER(qty_unit)
dimensions.weight_unit = "kg"
ELSE IF CONTAINS(qty_unit, "ml") OR CONTAINS(qty_unit, "cc") THEN
volume_ml = EXTRACT_NUMBER(qty_unit)
dimensions.estimated_weight = volume_ml / 1000
dimensions.weight_unit = "kg"
ELSE IF CONTAINS(qty_unit, "oz") THEN
oz_value = EXTRACT_NUMBER(qty_unit)
dimensions.estimated_weight = oz_value * 0.0283495
dimensions.weight_unit = "kg"
ELSE IF CONTAINS(qty_unit, "lb") THEN
lb_value = EXTRACT_NUMBER(qty_unit)
dimensions.estimated_weight = lb_value * 0.453592
dimensions.weight_unit = "kg"
ELSE
' Default weight estimate based on category
dimensions.estimated_weight = 0.5
dimensions.weight_unit = "kg"
END IF
END IF
' Use AI to estimate package dimensions if not available
BEGIN SYSTEM PROMPT
You are a logistics expert. Estimate realistic package dimensions for shipping.
Consider the product type, typical packaging, and quantity per unit.
Return dimensions in centimeters and weight in kilograms.
END SYSTEM PROMPT
estimation_prompt = "Estimate shipping package dimensions for: " + product.ProductName + " (Quantity per unit: " + product.QuantityPerUnit + "). Return JSON: {\"length_cm\": number, \"width_cm\": number, \"height_cm\": number, \"weight_kg\": number, \"package_type\": string}"
ai_estimate = ASK estimation_prompt
package = PARSE JSON ai_estimate
' Calculate for requested quantity
total_packages = CEIL(quantity / EXTRACT_NUMBER(product.QuantityPerUnit))
IF total_packages < 1 THEN
total_packages = 1
END IF
' Calculate cubic dimensions
length_cm = package.length_cm
width_cm = package.width_cm
height_cm = package.height_cm
weight_kg = package.weight_kg * total_packages
' Volume in cubic centimeters
volume_cm3 = length_cm * width_cm * height_cm * total_packages
' Volume in cubic meters
volume_m3 = volume_cm3 / 1000000
' Volumetric weight (dimensional weight)
' Standard divisor: 5000 for international, 6000 for domestic
volumetric_weight_intl = volume_cm3 / 5000
volumetric_weight_domestic = volume_cm3 / 6000
' Billable weight is the greater of actual and volumetric
billable_weight_intl = MAX(weight_kg, volumetric_weight_intl)
billable_weight_domestic = MAX(weight_kg, volumetric_weight_domestic)
' Calculate shipping estimates
shipping_estimates = []
' Ground shipping estimate
ground = {}
ground.carrier = "Ground"
ground.billable_weight = billable_weight_domestic
ground.estimated_days = "5-7 business days"
ground.base_rate = 5.99
ground.per_kg_rate = 1.50
ground.estimated_cost = ground.base_rate + (ground.billable_weight * ground.per_kg_rate)
PUSH shipping_estimates, ground
' Express shipping estimate
express = {}
express.carrier = "Express"
express.billable_weight = billable_weight_domestic
express.estimated_days = "2-3 business days"
express.base_rate = 12.99
express.per_kg_rate = 2.50
express.estimated_cost = express.base_rate + (express.billable_weight * express.per_kg_rate)
PUSH shipping_estimates, express
' Overnight shipping estimate
overnight = {}
overnight.carrier = "Overnight"
overnight.billable_weight = billable_weight_intl
overnight.estimated_days = "Next business day"
overnight.base_rate = 24.99
overnight.per_kg_rate = 4.00
overnight.estimated_cost = overnight.base_rate + (overnight.billable_weight * overnight.per_kg_rate)
PUSH shipping_estimates, overnight
' Build response
result = {}
result.product_id = product_id
result.product_name = product.ProductName
result.quantity = quantity
result.packages = total_packages
result.dimensions = {
"length_cm": length_cm,
"width_cm": width_cm,
"height_cm": height_cm,
"package_type": package.package_type
}
result.weight = {
"actual_kg": weight_kg,
"volumetric_domestic_kg": volumetric_weight_domestic,
"volumetric_intl_kg": volumetric_weight_intl,
"billable_domestic_kg": billable_weight_domestic,
"billable_intl_kg": billable_weight_intl
}
result.volume = {
"cm3": volume_cm3,
"m3": volume_m3
}
result.shipping_options = shipping_estimates
' Display results
TALK "📦 **Shipping Calculator Results**"
TALK ""
TALK "**Product:** " + product.ProductName
TALK "**Quantity:** " + quantity + " (" + total_packages + " package(s))"
TALK ""
TALK "**Package Dimensions:**"
TALK " 📏 " + length_cm + " × " + width_cm + " × " + height_cm + " cm"
TALK " 📦 Volume: " + FORMAT(volume_cm3, "#,##0") + " cm³ (" + FORMAT(volume_m3, "0.000") + " m³)"
TALK " ⚖️ Type: " + package.package_type
TALK ""
TALK "**Weight Analysis:**"
TALK " Actual Weight: " + FORMAT(weight_kg, "0.00") + " kg"
TALK " Volumetric (Domestic): " + FORMAT(volumetric_weight_domestic, "0.00") + " kg"
TALK " Volumetric (Intl): " + FORMAT(volumetric_weight_intl, "0.00") + " kg"
TALK " **Billable Weight:** " + FORMAT(billable_weight_domestic, "0.00") + " kg"
TALK ""
TALK "**Shipping Options:**"
FOR EACH option IN shipping_estimates
TALK " 🚚 **" + option.carrier + "**: $" + FORMAT(option.estimated_cost, "0.00") + " (" + option.estimated_days + ")"
NEXT
' Log calculation for analytics
LOG "shipping_calculation", {
"product_id": product_id,
"quantity": quantity,
"volume_cm3": volume_cm3,
"weight_kg": weight_kg,
"timestamp": NOW()
}
RETURN result