Skip to content

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();

Released under the MIT License.