try {
// List of funny loading messages
var loadingMessages = [
"Cranking up the quote machine...",
"One sec... just stepped out for coffee.",
"Hold tight! The hamsters are running the wheels.",
"Almost there... giving it a little extra attention.",
"Loading... probably faster than your internet speed.",
"Please hold while we make magic happen.",
"Just a moment... our servers are stretching their legs.",
"Your patience is appreciated... and rewarded!",
"Brewing up your quote right now...",
"Give us a second... we're flexing our technical muscles.",
"Our system is doing some yoga... stay calm!",
"Loading... don't worry, it's not stuck!",
"Fetching your data... hopefully with no detours!",
"Keep calm and let us handle the rest.",
"Processing... taking a coffee break, be right back!",
"Stay tuned... greatness is loading.",
"Our system is running... faster than a cheetah!",
"Looks like you're going all in on this quote!",
"Getting things ready... just need a moment.",
"Hold on... we're aligning some stars for you.",
"Please wait... we're feeding the server squirrels.",
"One moment... your quote is coming fresh out of the oven.",
"Loading... just making sure everything is perfect!",
"Generating your quote... thanks for your patience!",
"Almost there... your quote is worth the wait!"
];
// Select a random message from the list
var randomMessage = loadingMessages[Math.floor(Math.random() * loadingMessages.length)];
// Log the entire value object to see its structure
log("Full value object: " + JSON.stringify(value));
// Ensure value.id is defined before proceeding
if (!value || !value.id) {
log("No product selected or value.id is undefined");
return; // Exit the script quietly since no valid product was selected
}
// Show loader
ZDK.Client.showLoader({ type: 'page', template: 'vertical-bar', message: randomMessage });
// Extract the product ID and name from the value passed in
var packageId = value.id;
var packageName = value.name;
log("Product ID: " + packageId);
log("Package Name: " + packageName);
// Get the subform field from Quotes module
var quotedItemsSubform = ZDK.Page.getField("Quoted_Items");
// Fetch product information for the package ID
var packageDetails = ZDK.Apps.CRM.Auto_Quote_Packages.fetchById(packageId);
var packageStatus = packageDetails.Status; // Active or Expired.
var popUpMessage = packageDetails.Pop_Up_Message; // Check the package for any Pop-up message we want to show
log("Package Details: " + JSON.stringify(packageDetails));
log("Package Status: " + packageStatus);
log("Pop-Up Message: " + popUpMessage);
// Initialize array for existing line items.
var existingLineItems = quotedItemsSubform.getValue() || [];
log("Existing line items: " + JSON.stringify(existingLineItems));
//
// Only include rows with products. Excude any blank rows from the quote
var filteredExistingLineItems = existingLineItems.filter(function(item) {
return item.Product_Name && item.Product_Name.id;
}).map(function(item) {
return {
id: item.Product_Name.id // Include only the item ID
};
});
log("Filtered existing line items: " + JSON.stringify(filteredExistingLineItems));
// Array to hold new line items we are adding
var newLineItemArray = [];
// Check if package is active and populate new line items
if (packageStatus === "Active") {
var packageItems = packageDetails.Package_Details;
packageItems.forEach(function(item) {
var productLineItem = {
Product_Name: {
id: item.Item_Code.id,
name: `${item.Item_Code.name} (${item.Item_Name})`
},
Product_List_Price: item.Item_Price,
Description: item.Item_Description,
List_Price: item.Item_Price,
Quantity: item.Item_Quantity ?? 1, // Default to 1 if Qty is null or undefined
Discount: Math.abs(item.Item_Discount ?? 0) // Get the discount or default to 0 if null
};
log("New product line item: " + JSON.stringify(productLineItem));
newLineItemArray.push(productLineItem);
});
} else {
// Show error message if the package is not active
// My layout to only show Active items but if you don't do that this solves it.
ZDK.Client.showMessage('This package / promo is no longer active. Please contact the admin for details.', { type: 'error' });
ZDK.Client.hideLoader();
return; // Exit the script since the package is not active
}
// Combine existing line items with new line items
var updatedLineItemArray = filteredExistingLineItems.concat(newLineItemArray);
log("Updated line items array: " + JSON.stringify(updatedLineItemArray));
// Add all updated items to the Quotes page
quotedItemsSubform.setValue(updatedLineItemArray);
// Reset the pick list field so user can re-use
ZDK.Page.getField("Auto_Quote").setValue(null);
// Hide loader
ZDK.Client.hideLoader();
log("Final updated line items: " + JSON.stringify(updatedLineItemArray));
// Function to show confirmation and number of items added back to the user
var showSuccessMessage = function() {
ZDK.Client.showMessage(`${value.name} selected. ${newLineItemArray.length} items added successfully.`, { type: 'success' });
};
// Function to show popup message and then success message
var showAlertAndSuccess = function(message, heading, buttonText) {
ZDK.Client.showAlert(message, heading, buttonText);
showSuccessMessage();
};
// Check for pop-up message and show alert if it exists
if (popUpMessage) {
showAlertAndSuccess(popUpMessage, "Important Information", "Got It!");
} else {
// No pop-up message, show the success message
showSuccessMessage();
}
} catch (error) {
// Log the error
log('Error: ' + error.message);
// Show error message
ZDK.Client.showMessage('An error occurred while adding items. Please try again.', { type: 'error' });
// Hide loader
ZDK.Client.hideLoader();
}