Private Credit Risk Assessment Tool

Borrower Profile & Key Financials

Credit Facility Details

Qualitative Risk Factors (Score 1-5, where 5 is Best)

Credit Risk Assessment Summary

Please complete all previous sections and click "Assess Credit Risk".

Industry: ${inputs.industry}


Gross Leverage (Total Debt / EBITDA): ${isFinite(calcs.grossLeverage) ? pcra_formatNumber(calcs.grossLeverage) + 'x' : 'N/A (EBITDA <=0)'}

Net Leverage (Net Debt / EBITDA): ${isFinite(calcs.netLeverage) ? pcra_formatNumber(calcs.netLeverage) + 'x' : 'N/A (EBITDA <=0)'}

Interest Coverage Ratio (EBITDA / Interest): ${isFinite(calcs.interestCoverageRatio) ? pcra_formatNumber(calcs.interestCoverageRatio) + 'x' : 'N/A'}


Average Qualitative Score: ${pcra_formatNumber(calcs.averageQualitativeScore, 1)} / 5.0

Overall Weighted Risk Score: ${pcra_formatNumber(calcs.overallRiskScore, 2)} / 5.0

Estimated Risk Category: ${calcs.riskCategory}

`; dlButton.style.display = 'block'; resTabLink.disabled = false; resTabLink.click(); } } window.pcra_downloadPDF = function() { const { jsPDF } = window.jspdf; if (!jsPDF || !pcra_assessmentData.inputs || Object.keys(pcra_assessmentData.inputs).length === 0) { alert("PDF library not loaded or no data to export. Please assess risk first."); return; } const doc = new jsPDF(); let yPos = 20; const lineHeight = 7; const indent = 5; const pageMargin = 15; const pageWidth = doc.internal.pageSize.getWidth(); const usableWidth = pageWidth - 2 * pageMargin; doc.setFontSize(18); doc.setTextColor(0, 51, 102); // #003366 doc.text("Private Credit Risk Assessment Report", pageWidth / 2, yPos, { align: 'center' }); yPos += lineHeight * 2.5; function addSection(title, dataObj) { if (yPos > doc.internal.pageSize.getHeight() - pageMargin - 30) { doc.addPage(); yPos = pageMargin; } doc.setFontSize(13); doc.setFont(undefined, 'bold'); doc.setTextColor(0, 64, 128); // #004080 doc.text(title, pageMargin, yPos); yPos += lineHeight * 1.5; doc.setFontSize(10); doc.setFont(undefined, 'normal'); doc.setTextColor(52,58,64); // #343a40 for (const [key, value] of Object.entries(dataObj)) { if (yPos > doc.internal.pageSize.getHeight() - pageMargin - lineHeight) { doc.addPage(); yPos = pageMargin; } let formattedKey = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase()); if (formattedKey.startsWith('Q ')) formattedKey = formattedKey.substring(2); // Clean up qualitative keys let valStr = String(value); if (typeof value === 'number') { if (key.toLowerCase().includes('rate') || key.toLowerCase().includes('percent')) { valStr = (value * 100).toFixed(1) + '%'; // Show interest rate as percentage } else if (key.toLowerCase().includes('score') || key.toLowerCase().includes('points')) { valStr = pcra_formatNumber(value, 2); } else if (key.toLowerCase().includes('leverage') || key.toLowerCase().includes('ratio')) { valStr = isFinite(value) ? pcra_formatNumber(value, 2) + 'x' : 'N/A'; } else { valStr = pcra_formatCurrency(value); } } else if (key === 'keyCovenants') { // Handle multi-line text area for covenants let lines = doc.splitTextToSize(String(value), usableWidth - (indent + 95)); doc.text(`${formattedKey}:`, pageMargin + indent, yPos); doc.text(lines, pageMargin + indent + 65, yPos); yPos += (lines.length * (lineHeight * 0.9)); // Adjust for multi-line continue; // Skip standard yPos increment for this key } doc.text(`${formattedKey}:`, pageMargin + indent, yPos); doc.text(valStr, pageMargin + indent + 80, yPos, {align: 'left', maxWidth: usableWidth - (indent + 80)}); yPos += lineHeight * 1.1; } yPos += lineHeight * 0.5; } const inputSummaryForPdf = { "Borrower Name": pcra_assessmentData.inputs.borrowerName, "Industry": pcra_assessmentData.inputs.industry, "Annual Revenue": pcra_assessmentData.inputs.annualRevenue, "Annual EBITDA": pcra_assessmentData.inputs.annualEbitda, "Total Debt": pcra_assessmentData.inputs.totalDebt, "Cash Equivalents": pcra_assessmentData.inputs.cashEquivalents }; addSection("Borrower & Financial Summary", inputSummaryForPdf); const facilitySummaryForPdf = { "Loan Type": pcra_assessmentData.inputs.loanType, "Loan Amount": pcra_assessmentData.inputs.loanAmount, "Interest Rate": pcra_assessmentData.inputs.interestRate, // Will be formatted as % by addSection "Loan Seniority": pcra_assessmentData.inputs.loanSeniority, "Key Covenants": pcra_assessmentData.inputs.keyCovenants }; addSection("Credit Facility Details", facilitySummaryForPdf); const qualitativeSummaryForPdf = { "Management Quality": `${pcra_assessmentData.inputs.q_management}/5`, "Industry Outlook": `${pcra_assessmentData.inputs.q_industry}/5`, "Competitive Position": `${pcra_assessmentData.inputs.q_competitive_position}/5`, "Financial Policy": `${pcra_assessmentData.inputs.q_financial_policy}/5`, "Security Collateral": `${pcra_assessmentData.inputs.q_security_collateral}/5`, "Average Qualitative Score": pcra_assessmentData.results.averageQualitativeScore }; addSection("Qualitative Risk Factors", qualitativeSummaryForPdf); const resultsSummaryForPdf = { "Net Debt": pcra_assessmentData.results.netDebt, "Gross Leverage": pcra_assessmentData.results.grossLeverage, "Net Leverage": pcra_assessmentData.results.netLeverage, "Interest Coverage Ratio": pcra_assessmentData.results.interestCoverageRatio, "Leverage Points": pcra_assessmentData.results.leveragePoints, "ICR Points": pcra_assessmentData.results.icrPoints, "Overall Weighted Risk Score": pcra_assessmentData.results.overallRiskScore, "Estimated Risk Category": pcra_assessmentData.results.riskCategory }; addSection("Risk Assessment Results", resultsSummaryForPdf); doc.save('Private_Credit_Risk_Assessment.pdf'); }
Scroll to Top