Custom Reporting Examples
Build custom reports with the SDK.
Executive Summary Report
typescript
import { DeIterateClient } from '@deiterate/sdk';
const client = new DeIterateClient({
apiKey: process.env.DEITERATE_API_KEY!,
organizationId: process.env.DEITERATE_ORG_ID,
});
async function generateExecutiveSummary() {
const [soaSummary, complianceData, risks] = await Promise.all([
client.soa.getSummary(),
client.compliance.getAllData(),
client.risks.list(),
]);
const report = {
generatedAt: new Date().toISOString(),
compliance: {
implementationPercentage: soaSummary.implementationPercentage,
controlsImplemented: soaSummary.implemented,
controlsTotal: soaSummary.totalControls,
},
risks: {
total: risks.risks.length,
critical: risks.risks.filter(r => r.inherentRisk === 'Extreme').length,
high: risks.risks.filter(r => r.inherentRisk === 'High').length,
},
tasks: {
total: complianceData.assuranceTasks.length,
overdue: complianceData.assuranceTasks.filter(t => t.status === 'overdue').length,
},
assets: {
total: complianceData.assets.length,
},
};
return report;
}
// Generate and output
generateExecutiveSummary().then(report => {
console.log(JSON.stringify(report, null, 2));
});Risk Heat Map Data
typescript
async function generateRiskHeatMapData() {
const response = await client.risks.list();
const heatMap: Record<string, Record<string, number>> = {
'Extreme': { 'Extreme': 0, 'High': 0, 'Medium': 0, 'Low': 0 },
'High': { 'Extreme': 0, 'High': 0, 'Medium': 0, 'Low': 0 },
'Medium': { 'Extreme': 0, 'High': 0, 'Medium': 0, 'Low': 0 },
'Low': { 'Extreme': 0, 'High': 0, 'Medium': 0, 'Low': 0 },
};
for (const risk of response.risks) {
const inherent = risk.inherentRisk || 'Low';
const residual = risk.residualRisk || 'Low';
if (heatMap[inherent] && heatMap[inherent][residual] !== undefined) {
heatMap[inherent][residual]++;
}
}
return heatMap;
}Monthly Trend Report
typescript
async function generateMonthlyTrend(months: number = 12) {
const calendar = await client.compliance.getCalendar();
const data = await client.compliance.getAllData();
const trends: Array<{
month: string;
tasksCompleted: number;
risksAdded: number;
findingsResolved: number;
}> = [];
// Group events by month
for (const event of calendar.events) {
const date = new Date(event.date);
const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;
// ... aggregate data by month
}
return trends;
}Compliance Gap Analysis
typescript
async function generateGapAnalysis() {
const [controls, soa] = await Promise.all([
client.controls.getByStandard('ISO 27001'),
client.soa.list(),
]);
const soaMap = new Map(soa.data.map(s => [s.controlId, s]));
const gaps = controls.filter(control => {
const soaControl = soaMap.get(control.controlId);
return !soaControl || !soaControl.implemented;
});
console.log(`Gap Analysis - ${gaps.length} controls not implemented`);
for (const gap of gaps) {
const soaControl = soaMap.get(gap.controlId);
console.log(` ${gap.controlId}: ${gap.name}`);
console.log(` Status: ${soaControl?.status || 'Not in SOA'}`);
}
return gaps;
}Export to CSV
typescript
async function exportRisksToCSV() {
const response = await client.risks.list();
const headers = ['ID', 'Risk', 'Category', 'Inherent', 'Residual', 'Owner', 'Status'];
const rows = response.risks.map(risk => [
risk.riskID,
risk.risk,
risk.riskCategory,
risk.inherentRisk,
risk.residualRisk,
risk.riskOwner,
risk.status,
]);
const csv = [
headers.join(','),
...rows.map(row => row.map(v => `"${v || ''}"`).join(','))
].join('\n');
return csv;
}Scheduled Report Generation
typescript
import { CronJob } from 'cron';
// Run every Monday at 9 AM
const weeklyReport = new CronJob('0 9 * * 1', async () => {
const summary = await generateExecutiveSummary();
// Send via email, Slack, etc.
await sendReport(summary);
});
weeklyReport.start();