Skip to content

Statement of Applicability (SOA) ​

Manage your Statement of Applicability with the de.iterate SDK.

Overview ​

The soa resource provides operations for managing your SOA, including control implementation status, justifications, and evidence.

List SOA Controls ​

typescript
const response = await client.soa.list();

console.log(`Total controls: ${response.data.length}`);
for (const control of response.data) {
  console.log(`  ${control.controlId}: ${control.status}`);
}

Get SOA Control ​

typescript
const control = await client.soa.get('A.5.1.1');

console.log(control.controlId);
console.log(control.applicable);
console.log(control.implemented);
console.log(control.justification);

Update SOA Control ​

typescript
await client.soa.update('A.5.1.1', {
  implemented: true,
  status: 'implemented',
  justification: 'Policies approved and published',
  evidence: ['policy-001.pdf', 'approval-email.pdf'],
  owner: 'security-team@company.com',
});

UpdateSOAControlInput ​

FieldTypeDescription
applicablebooleanWhether control is applicable
implementedbooleanWhether control is implemented
justificationstringJustification/notes
evidencestring[]Evidence document references
ownerstringControl owner
statusstringImplementation status

Bulk Update ​

typescript
await client.soa.bulkUpdate([
  { id: 'A.5.1.1', implemented: true, status: 'implemented' },
  { id: 'A.5.1.2', implemented: true, status: 'implemented' },
  { id: 'A.6.1.1', implemented: false, status: 'in_progress' },
]);

Get Frameworks ​

typescript
const frameworks = await client.soa.getFrameworks();

for (const framework of frameworks) {
  console.log(`${framework.name}: ${framework.controlCount} controls`);
}

Get Summary ​

typescript
const summary = await client.soa.getSummary();

console.log('SOA Summary');
console.log('===========');
console.log(`Total Controls: ${summary.totalControls}`);
console.log(`Implemented: ${summary.implemented}`);
console.log(`Not Implemented: ${summary.notImplemented}`);
console.log(`Not Applicable: ${summary.notApplicable}`);
console.log(`In Progress: ${summary.inProgress}`);
console.log(`Implementation: ${summary.implementationPercentage}%`);

console.log('\nBy Framework:');
for (const fw of summary.byFramework) {
  console.log(`  ${fw.framework}: ${fw.percentage}%`);
}

Summary Response ​

typescript
interface SOASummary {
  totalControls: number;
  implemented: number;
  notImplemented: number;
  notApplicable: number;
  inProgress: number;
  implementationPercentage: number;
  byFramework: Array<{
    framework: string;
    total: number;
    implemented: number;
    percentage: number;
  }>;
  byStatus: Record<string, number>;
}

Get Version History ​

typescript
const history = await client.soa.getVersionHistory();

for (const version of history) {
  console.log(`v${version.versionNumber} - ${version.dateUpdated}`);
  console.log(`  By: ${version.updatedBy}`);
  console.log(`  Notes: ${version.updateComments}`);
}

SOAControl Type ​

typescript
interface SOAControl {
  id: string;
  type: 'soa_control';
  controlId: string;
  applicable: boolean;
  implemented: boolean;
  justification?: string;
  evidence?: string[];
  owner?: string;
  status: 'not_started' | 'in_progress' | 'implemented' | 'not_applicable';
}

Examples ​

Implementation Progress Report ​

typescript
async function implementationReport() {
  const summary = await client.soa.getSummary();
  
  console.log('=== SOA Implementation Report ===\n');
  
  // Progress bar
  const percentage = summary.implementationPercentage;
  const filled = Math.round(percentage / 5);
  const bar = '█'.repeat(filled) + '░'.repeat(20 - filled);
  console.log(`Progress: [${bar}] ${percentage}%\n`);
  
  // Status breakdown
  console.log('Status Breakdown:');
  console.log(`  ✅ Implemented: ${summary.implemented}`);
  console.log(`  🔄 In Progress: ${summary.inProgress}`);
  console.log(`  ❌ Not Implemented: ${summary.notImplemented}`);
  console.log(`  ⬜ Not Applicable: ${summary.notApplicable}`);
}

Next Steps ​

Released under the MIT License.