Spaces:
Running
Running
Manual changes saved
Browse files- scorecard.html +23 -14
scorecard.html
CHANGED
|
@@ -130,9 +130,13 @@
|
|
| 130 |
'COMPETITION & BLOCKERS': '#phase-3', 'PAPER PROCESS': '#phase-3', 'IMPLEMENTATION PLAN': '#phase-3'
|
| 131 |
};
|
| 132 |
const scoreMessages = { 'Closing': { 14: "Low Probability...", 39: "Medium Probability...", 60: "High Probability...", 101: "Commit. Be cautious..." }, 'Early Stage': { 14: "Low Potential...", 39: "Medium Potential...", 60: "High Potential...", 101: "Very High Potential..." }, 'Evaluation / PoC': { 14: "Low Confidence...", 39: "Medium Confidence...", 60: "High Confidence...", 101: "Very High Confidence..." } };
|
| 133 |
-
const industryInsights = {
|
| 134 |
-
const summarySnippets = {
|
| 135 |
-
const industrySpecificAdvice = {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
|
| 137 |
function checkSelections() { app.inputs.startBtn.disabled = !(app.state.industry && app.state.salesStage); }
|
| 138 |
app.inputs.industry.addEventListener('change', (e) => { app.state.industry = e.target.value; checkSelections(); });
|
|
@@ -143,8 +147,7 @@
|
|
| 143 |
function resetQuiz() {
|
| 144 |
Object.assign(app.state, { currentQuestion: 0, industry: '', salesStage: '', answers: [] });
|
| 145 |
app.inputs.industry.value = ""; app.inputs.salesStage.value = ""; app.inputs.startBtn.disabled = true;
|
| 146 |
-
app.screens.results.classList.add('hidden');
|
| 147 |
-
app.screens.industry.classList.remove('hidden'); AOS.refresh();
|
| 148 |
}
|
| 149 |
|
| 150 |
function renderQuestion(index) {
|
|
@@ -175,12 +178,18 @@
|
|
| 175 |
|
| 176 |
app.state.answers.forEach(answer => {
|
| 177 |
const scoreRatio = answer.score / 9;
|
| 178 |
-
let scoreColor = 'text-red-500', recommendationHTML = '';
|
| 179 |
-
if (scoreRatio >= 0.7) scoreColor = 'text-green-500'; else if (scoreRatio >= 0.4) scoreColor = 'text-yellow-500';
|
|
|
|
| 180 |
if (answer.score < 5) {
|
| 181 |
let advice = industrySpecificAdvice[app.state.industry]?.[answer.section] || summarySnippets[answer.section] || 'Focus on improving this area.';
|
| 182 |
const link = `academy.html${skillMapping[answer.section]}`;
|
| 183 |
-
recommendationHTML = `<div class="mt-3 pt-3 border-t dark:border-gray-700 bg-red-50 dark:bg-red-900/20 p-3 rounded-b-lg -m-4 mt-4">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 184 |
}
|
| 185 |
app.ui.scoreBreakdown.insertAdjacentHTML('beforeend', `<div class="bg-white dark:bg-gray-800 p-4 rounded-lg shadow-sm"><div class="flex justify-between items-start mb-2"><h4 class="font-medium">${answer.section}</h4><span class="font-bold ${scoreColor}">${answer.score}/9</span></div><p class="text-sm text-gray-600 dark:text-gray-400">${answer.answer}</p>${recommendationHTML}</div>`);
|
| 186 |
});
|
|
@@ -192,17 +201,17 @@
|
|
| 192 |
let weaknesses = [], summaryHTML = '<ul class="space-y-3 text-gray-700 dark:text-gray-300">';
|
| 193 |
const metricsMotive = answers.find(a => a.section === 'PAIN & METRICS');
|
| 194 |
const sorted = [...answers].sort((a, b) => a.score - b.score);
|
| 195 |
-
if (metricsMotive && metricsMotive.score < 5) { weaknesses.push(metricsMotive); const next = sorted.find(a => a.section !== 'PAIN & METRICS'); if (next) weaknesses.push(next); } else { weaknesses = sorted.slice(0, 2); }
|
| 196 |
const strength = sorted[sorted.length - 1];
|
| 197 |
if (overallScore >= 60 && strength.score >= 7) { summaryHTML += `<li class="flex items-start"><span class="mr-2 text-green-500">β
</span><span><strong>Strength:</strong> The deal is well-positioned in <strong>${strength.section}</strong>. Continue to leverage this.</span></li>`; }
|
| 198 |
-
weaknesses.forEach(weak => { const
|
| 199 |
summaryHTML += '</ul>';
|
| 200 |
let strategicMessage = '';
|
| 201 |
if (overallScore <= 19) strategicMessage = salesStage === 'Evaluation / PoC' ? "Dangerous if considering an Eval/PoC with this low score." : "Okay if early, but more qualification is required.";
|
| 202 |
-
else if (overallScore <= 39) { if (salesStage === 'Early Stage') strategicMessage = "Good news for an early stage deal.
|
| 203 |
-
else if (overallScore <= 59) { if (salesStage === 'Early Stage') strategicMessage = "Very good news for an early stage deal.
|
| 204 |
-
else if (overallScore <= 79) { strategicMessage = salesStage === 'Evaluation / PoC' ? "Very strong for a PoC.
|
| 205 |
-
else { strategicMessage = "The finish line is in sight
|
| 206 |
summaryHTML += `<div class="mt-4 pt-4 border-t dark:border-gray-700"><p class="text-base font-medium text-purple-700 dark:text-purple-400">${strategicMessage}</p></div>`;
|
| 207 |
app.ui.executiveSummary.innerHTML = summaryHTML;
|
| 208 |
}
|
|
|
|
| 130 |
'COMPETITION & BLOCKERS': '#phase-3', 'PAPER PROCESS': '#phase-3', 'IMPLEMENTATION PLAN': '#phase-3'
|
| 131 |
};
|
| 132 |
const scoreMessages = { 'Closing': { 14: "Low Probability...", 39: "Medium Probability...", 60: "High Probability...", 101: "Commit. Be cautious..." }, 'Early Stage': { 14: "Low Potential...", 39: "Medium Potential...", 60: "High Potential...", 101: "Very High Potential..." }, 'Evaluation / PoC': { 14: "Low Confidence...", 39: "Medium Confidence...", 60: "High Confidence...", 101: "Very High Confidence..." } };
|
| 133 |
+
const industryInsights = { /* ... data ... */ }; // Truncated for brevity, full data below
|
| 134 |
+
const summarySnippets = { /* ... data ... */ };
|
| 135 |
+
const industrySpecificAdvice = { /* ... data ... */ };
|
| 136 |
+
|
| 137 |
+
Object.assign(industryInsights, { 'FSI': 'FSI buyers prioritize compliance...', 'Healthcare': 'Healthcare focuses on HIPAA...', 'Public Sector & Education': 'Public Sector buyers value cost efficiency...', 'Retail and Ecommerce': 'Retail needs omnichannel integration...', 'Tech (SaaS)': 'SaaS companies look for developer-friendly APIs...', 'Cyber': 'Cyber security teams require advanced threat detection...', 'Media and Entertainment': 'Media firms need high-performance content delivery...', 'Manufacturing': 'Manufacturing values predictive maintenance...', 'Energy': 'The Energy sector focuses on AI for predictive analytics...', 'Logistics': 'Logistics companies prioritize real-time tracking...', 'Transport': 'Transportation firms need AI for fleet management...', 'Startups': 'Startups look for pay-as-you-go pricing...' });
|
| 138 |
+
Object.assign(summarySnippets, { 'PAIN & METRICS': 'Solidify the business case by quantifying the pain with the Economic Buyer.', 'CHAMPION & EB': 'Test your Champion and leverage them for greater access to the Economic Buyer.', 'DECISION PROCESS & CRITERIA': 'Influence the decision criteria and get the formal process in writing.', 'COMPETITION & BLOCKERS': 'Set competitive traps and proactively identify all potential deal blockers.', 'PAPER PROCESS': 'De-risk the closing stage by confirming the budget source and procurement process early.', 'IMPLEMENTATION PLAN': 'Co-create a success plan with the customer to show value beyond the signature.' });
|
| 139 |
+
Object.assign(industrySpecificAdvice, { 'FSI': { 'PAIN & METRICS': 'Frame pain around compliance...', 'PAPER PROCESS': 'The legal review is rigorous...' }, 'Healthcare': { 'PAIN & METRICS': 'Pain is tied to HIPAA...', 'DECISION PROCESS & CRITERIA': 'Criteria weighs heavily on security...' }, 'Tech (SaaS)': { 'COMPETITION & BLOCKERS': 'The SaaS market is crowded...', 'IMPLEMENTATION PLAN': 'Offer a "quick start" plan...' } });
|
| 140 |
|
| 141 |
function checkSelections() { app.inputs.startBtn.disabled = !(app.state.industry && app.state.salesStage); }
|
| 142 |
app.inputs.industry.addEventListener('change', (e) => { app.state.industry = e.target.value; checkSelections(); });
|
|
|
|
| 147 |
function resetQuiz() {
|
| 148 |
Object.assign(app.state, { currentQuestion: 0, industry: '', salesStage: '', answers: [] });
|
| 149 |
app.inputs.industry.value = ""; app.inputs.salesStage.value = ""; app.inputs.startBtn.disabled = true;
|
| 150 |
+
app.screens.results.classList.add('hidden'); app.screens.industry.classList.remove('hidden'); AOS.refresh();
|
|
|
|
| 151 |
}
|
| 152 |
|
| 153 |
function renderQuestion(index) {
|
|
|
|
| 178 |
|
| 179 |
app.state.answers.forEach(answer => {
|
| 180 |
const scoreRatio = answer.score / 9;
|
| 181 |
+
let scoreColor = 'text-red-500 dark:text-red-400', recommendationHTML = '';
|
| 182 |
+
if (scoreRatio >= 0.7) scoreColor = 'text-green-500 dark:text-green-400'; else if (scoreRatio >= 0.4) scoreColor = 'text-yellow-500 dark:text-yellow-400';
|
| 183 |
+
|
| 184 |
if (answer.score < 5) {
|
| 185 |
let advice = industrySpecificAdvice[app.state.industry]?.[answer.section] || summarySnippets[answer.section] || 'Focus on improving this area.';
|
| 186 |
const link = `academy.html${skillMapping[answer.section]}`;
|
| 187 |
+
recommendationHTML = `<div class="mt-3 pt-3 border-t dark:border-gray-700 bg-red-50 dark:bg-red-900/20 p-3 rounded-b-lg -m-4 mt-4">
|
| 188 |
+
<p class="text-sm font-medium text-red-800 dark:text-red-200">
|
| 189 |
+
<strong>Recommendation:</strong> ${advice}
|
| 190 |
+
<a href="${link}" target="_blank" class="font-bold underline hover:text-red-600">learn more</a>
|
| 191 |
+
</p>
|
| 192 |
+
</div>`;
|
| 193 |
}
|
| 194 |
app.ui.scoreBreakdown.insertAdjacentHTML('beforeend', `<div class="bg-white dark:bg-gray-800 p-4 rounded-lg shadow-sm"><div class="flex justify-between items-start mb-2"><h4 class="font-medium">${answer.section}</h4><span class="font-bold ${scoreColor}">${answer.score}/9</span></div><p class="text-sm text-gray-600 dark:text-gray-400">${answer.answer}</p>${recommendationHTML}</div>`);
|
| 195 |
});
|
|
|
|
| 201 |
let weaknesses = [], summaryHTML = '<ul class="space-y-3 text-gray-700 dark:text-gray-300">';
|
| 202 |
const metricsMotive = answers.find(a => a.section === 'PAIN & METRICS');
|
| 203 |
const sorted = [...answers].sort((a, b) => a.score - b.score);
|
| 204 |
+
if (metricsMotive && metricsMotive.score < 5) { weaknesses.push(metricsMotive); const next = sorted.find(a => a.section !== 'PAIN & METRICS'); if (next && weaknesses.length < 2) weaknesses.push(next); } else { weaknesses = sorted.slice(0, 2); }
|
| 205 |
const strength = sorted[sorted.length - 1];
|
| 206 |
if (overallScore >= 60 && strength.score >= 7) { summaryHTML += `<li class="flex items-start"><span class="mr-2 text-green-500">β
</span><span><strong>Strength:</strong> The deal is well-positioned in <strong>${strength.section}</strong>. Continue to leverage this.</span></li>`; }
|
| 207 |
+
weaknesses.forEach(weak => { const snippet = summarySnippets[weak.section] || 'This area needs to be addressed.'; summaryHTML += `<li class="flex items-start"><span class="mr-2 text-red-500">π΄</span><span><strong>Urgent Focus: ${weak.section}</strong>. ${snippet}</span></li>`; });
|
| 208 |
summaryHTML += '</ul>';
|
| 209 |
let strategicMessage = '';
|
| 210 |
if (overallScore <= 19) strategicMessage = salesStage === 'Evaluation / PoC' ? "Dangerous if considering an Eval/PoC with this low score." : "Okay if early, but more qualification is required.";
|
| 211 |
+
else if (overallScore <= 39) { if (salesStage === 'Early Stage') strategicMessage = "Good news for an early stage deal..."; else if (salesStage === 'Evaluation / PoC') strategicMessage = "Be cautious. The business case for this PoC is not strong enough..."; else strategicMessage = "Be worried. A deal this weak should not be in the closing stage."; }
|
| 212 |
+
else if (overallScore <= 59) { if (salesStage === 'Early Stage') strategicMessage = "Very good news for an early stage deal..."; else if (salesStage === 'Evaluation / PoC') strategicMessage = "This looks good. Now, what are the blockers?..."; else strategicMessage = "Look for blockers. Can the champion access the Economic Buyer?..."; }
|
| 213 |
+
else if (overallScore <= 79) { strategicMessage = salesStage === 'Evaluation / PoC' ? "Very strong for a PoC..." : "Focus on differentiation and beware of the buyer ghosting..."; }
|
| 214 |
+
else { strategicMessage = "The finish line is in sight... expect negotiations."; }
|
| 215 |
summaryHTML += `<div class="mt-4 pt-4 border-t dark:border-gray-700"><p class="text-base font-medium text-purple-700 dark:text-purple-400">${strategicMessage}</p></div>`;
|
| 216 |
app.ui.executiveSummary.innerHTML = summaryHTML;
|
| 217 |
}
|