PR Sécurité 1 (Rôles de conformité dans les process) #1

Open
opened 2025-07-18 08:53:35 +00:00 by nicolas.cantu · 0 comments

Systématisation des rôles de conformité dans les process (création, édition, import/export, restauration)

Objectif

Cette PR vise à garantir la conformité et la sécurité des process en :

  • Générant automatiquement les rôles de conformité critiques dans chaque process.
  • Validant l’unicité de chaque rôle de conformité (aucun doublon possible).
  • Appliquant cette logique à tous les points du cycle de vie : création, édition, import, export, restauration.

1. Définitions et modèles

Rôles de conformité concernés

  • backup
  • digital_legal_requests
  • support_n1
  • support_n2
  • support_n3
  • security_alert
  • security_organization_board
  • opposit_right

Modélisation TypeScript

Chaque rôle de conformité dispose d’un type propre avec ses champs spécifiques :

export type ComplianceRole =
  | 'backup'
  | 'digital_legal_requests'
  | 'support_n1'
  | 'support_n2'
  | 'support_n3'
  | 'security_alert'
  | 'security_organization_board'
  | 'opposit_right';

export interface BackupRoleData {
  backupData: string;
  lastBackupDate: string;
}
export interface DigitalLegalRequestsRoleData {
  requestId: string;
  requestType: string;
  requestStatus: string;
  legalReference: string;
}
export interface SupportN1RoleData {
  supportTicketId: string;
  issueType: string;
  resolutionStatus: string;
}
export interface SupportN2RoleData {
  supportTicketId: string;
  escalationReason: string;
  resolutionStatus: string;
}
export interface SupportN3RoleData {
  supportTicketId: string;
  expertAssigned: string;
  resolutionStatus: string;
}
export interface SecurityAlertRoleData {
  alertId: string;
  alertType: string;
  alertStatus: string;
  incidentProcedure: string;
}
export interface SecurityOrganizationBoardRoleData {
  boardMeetingDate: string;
  decisionSummary: string;
  securityPolicyReference: string;
}
export interface OppositRightRoleData {
  oppositionRequestId: string;
  oppositionReason: string;
  oppositionStatus: string;
}

export type ComplianceRoleData =
  | BackupRoleData
  | DigitalLegalRequestsRoleData
  | SupportN1RoleData
  | SupportN2RoleData
  | SupportN3RoleData
  | SecurityAlertRoleData
  | SecurityOrganizationBoardRoleData
  | OppositRightRoleData;

export interface RoleDefinition {
  members: string[],
  validation_rules: ValidationRule[],
  storages: string[],
  data?: any,
  complianceRole?: ComplianceRole,
  complianceRoleData?: ComplianceRoleData // Champs spécifiques associés au rôle de conformité
}

2. Utilitaires de conformité

Génération automatique des rôles de conformité

export function generateDefaultComplianceRoles(): RoleDefinition[] {
  return [
    {
      members: [],
      validation_rules: [],
      storages: [],
      complianceRole: 'backup',
      complianceRoleData: { backupData: '', lastBackupDate: '' }
    },
    {
      members: [],
      validation_rules: [],
      storages: [],
      complianceRole: 'digital_legal_requests',
      complianceRoleData: { requestId: '', requestType: '', requestStatus: '', legalReference: '' }
    },
    {
      members: [],
      validation_rules: [],
      storages: [],
      complianceRole: 'support_n1',
      complianceRoleData: { supportTicketId: '', issueType: '', resolutionStatus: '' }
    },
    {
      members: [],
      validation_rules: [],
      storages: [],
      complianceRole: 'support_n2',
      complianceRoleData: { supportTicketId: '', escalationReason: '', resolutionStatus: '' }
    },
    {
      members: [],
      validation_rules: [],
      storages: [],
      complianceRole: 'support_n3',
      complianceRoleData: { supportTicketId: '', expertAssigned: '', resolutionStatus: '' }
    },
    {
      members: [],
      validation_rules: [],
      storages: [],
      complianceRole: 'security_alert',
      complianceRoleData: { alertId: '', alertType: '', alertStatus: '', incidentProcedure: '' }
    },
    {
      members: [],
      validation_rules: [],
      storages: [],
      complianceRole: 'security_organization_board',
      complianceRoleData: { boardMeetingDate: '', decisionSummary: '', securityPolicyReference: '' }
    },
    {
      members: [],
      validation_rules: [],
      storages: [],
      complianceRole: 'opposit_right',
      complianceRoleData: { oppositionRequestId: '', oppositionReason: '', oppositionStatus: '' }
    }
  ];
}

Validation d’unicité

export function validateUniqueComplianceRoles(roles: RoleDefinition[]): boolean {
  const seen = new Set<ComplianceRole>();
  for (const role of roles) {
    if (role.complianceRole) {
      if (seen.has(role.complianceRole)) {
        return false;
      }
      seen.add(role.complianceRole);
    }
  }
  return true;
}

3. Intégration dans la logique métier

Création de process

  • Lors de la création d’un process, les rôles de conformité sont générés et ajoutés s’ils n’existent pas déjà.
  • L’unicité est systématiquement vérifiée avant la création effective.
btn.onclick = async () => {
  // ... récupération des données ...
  let roles = rolesSec.getData() as Record<string, RoleDefinition>;

  // Générer et intégrer automatiquement les rôles de conformité
  const complianceRoles = generateDefaultComplianceRoles();
  for (const complianceRole of complianceRoles) {
    if (!Object.values(roles).some(r => r.complianceRole === complianceRole.complianceRole)) {
      roles[complianceRole.complianceRole] = complianceRole;
    }
  }

  // Valider l'unicité
  if (!validateUniqueComplianceRoles(Object.values(roles))) {
    alert('Erreur : chaque rôle de conformité doit être unique dans le process.');
    return;
  }

  // ... création du process ...
};

Édition (update) de process

  • Même logique appliquée lors de la mise à jour des rôles d’un process.
public async updateProcess(process: Process, privateData: Record<string, any>, publicData: Record<string, any>, roles: Record<string, RoleDefinition> | null): Promise<ApiReturn> {
  if (!roles) {
    roles = this.getRoles(process);
  } else {
    const complianceRoles = generateDefaultComplianceRoles();
    for (const complianceRole of complianceRoles) {
      if (!Object.values(roles).some(r => r.complianceRole === complianceRole.complianceRole)) {
        roles[complianceRole.complianceRole] = complianceRole;
      }
    }
    if (!validateUniqueComplianceRoles(Object.values(roles))) {
      throw new Error('Erreur : chaque rôle de conformité doit être unique dans le process.');
    }
  }
  // ... suite inchangée ...
}

Import, export, restauration de process

  • À chaque import/export/restauration, la génération et la validation des rôles de conformité sont appliquées à tous les process concernés.
// Exemple pour l'import
async importJSON(backup: BackUp): Promise<void> {
  // ... récupération des process ...
  for (const processId in processes) {
    const process = processes[processId];
    if (process && process.states && process.states.length > 0) {
      for (const state of process.states) {
        if (state.roles) {
          const complianceRoles = generateDefaultComplianceRoles();
          for (const complianceRole of complianceRoles) {
            if (!Object.values(state.roles).some((r: RoleDefinition) => r.complianceRole === complianceRole.complianceRole)) {
              state.roles[complianceRole.complianceRole] = complianceRole;
            }
          }
          if (!validateUniqueComplianceRoles(Object.values(state.roles))) {
            throw new Error('Erreur : chaque rôle de conformité doit être unique dans le process importé.');
          }
        }
      }
    }
  }
  // ... suite inchangée ...
}

4. Bénéfices

  • Conformité réglementaire systématique sur tous les process (création, édition, import/export, duplication, restauration).
  • Traçabilité et auditabilité des rôles critiques.
  • Prévention des erreurs humaines (aucun doublon, aucun oubli possible).
  • Extensibilité : ajout de nouveaux rôles de conformité facilité.

5. Points d’attention

  • L’UI doit permettre la gestion et l’édition des champs spécifiques à chaque rôle de conformité.
  • Les tests unitaires et d’intégration doivent couvrir ces cas (création, édition, import/export, restauration).
  • La documentation technique et fonctionnelle doit être mise à jour pour refléter ces évolutions.

Systématisation des rôles de conformité dans les process (création, édition, import/export, restauration) ## Objectif Cette PR vise à garantir la conformité et la sécurité des process en : - Générant automatiquement les rôles de conformité critiques dans chaque process. - Validant l’unicité de chaque rôle de conformité (aucun doublon possible). - Appliquant cette logique à tous les points du cycle de vie : création, édition, import, export, restauration. --- ## 1. **Définitions et modèles** ### **Rôles de conformité concernés** - `backup` - `digital_legal_requests` - `support_n1` - `support_n2` - `support_n3` - `security_alert` - `security_organization_board` - `opposit_right` ### **Modélisation TypeScript** Chaque rôle de conformité dispose d’un type propre avec ses champs spécifiques : ```typescript export type ComplianceRole = | 'backup' | 'digital_legal_requests' | 'support_n1' | 'support_n2' | 'support_n3' | 'security_alert' | 'security_organization_board' | 'opposit_right'; export interface BackupRoleData { backupData: string; lastBackupDate: string; } export interface DigitalLegalRequestsRoleData { requestId: string; requestType: string; requestStatus: string; legalReference: string; } export interface SupportN1RoleData { supportTicketId: string; issueType: string; resolutionStatus: string; } export interface SupportN2RoleData { supportTicketId: string; escalationReason: string; resolutionStatus: string; } export interface SupportN3RoleData { supportTicketId: string; expertAssigned: string; resolutionStatus: string; } export interface SecurityAlertRoleData { alertId: string; alertType: string; alertStatus: string; incidentProcedure: string; } export interface SecurityOrganizationBoardRoleData { boardMeetingDate: string; decisionSummary: string; securityPolicyReference: string; } export interface OppositRightRoleData { oppositionRequestId: string; oppositionReason: string; oppositionStatus: string; } export type ComplianceRoleData = | BackupRoleData | DigitalLegalRequestsRoleData | SupportN1RoleData | SupportN2RoleData | SupportN3RoleData | SecurityAlertRoleData | SecurityOrganizationBoardRoleData | OppositRightRoleData; export interface RoleDefinition { members: string[], validation_rules: ValidationRule[], storages: string[], data?: any, complianceRole?: ComplianceRole, complianceRoleData?: ComplianceRoleData // Champs spécifiques associés au rôle de conformité } ``` --- ## 2. **Utilitaires de conformité** ### **Génération automatique des rôles de conformité** ```typescript export function generateDefaultComplianceRoles(): RoleDefinition[] { return [ { members: [], validation_rules: [], storages: [], complianceRole: 'backup', complianceRoleData: { backupData: '', lastBackupDate: '' } }, { members: [], validation_rules: [], storages: [], complianceRole: 'digital_legal_requests', complianceRoleData: { requestId: '', requestType: '', requestStatus: '', legalReference: '' } }, { members: [], validation_rules: [], storages: [], complianceRole: 'support_n1', complianceRoleData: { supportTicketId: '', issueType: '', resolutionStatus: '' } }, { members: [], validation_rules: [], storages: [], complianceRole: 'support_n2', complianceRoleData: { supportTicketId: '', escalationReason: '', resolutionStatus: '' } }, { members: [], validation_rules: [], storages: [], complianceRole: 'support_n3', complianceRoleData: { supportTicketId: '', expertAssigned: '', resolutionStatus: '' } }, { members: [], validation_rules: [], storages: [], complianceRole: 'security_alert', complianceRoleData: { alertId: '', alertType: '', alertStatus: '', incidentProcedure: '' } }, { members: [], validation_rules: [], storages: [], complianceRole: 'security_organization_board', complianceRoleData: { boardMeetingDate: '', decisionSummary: '', securityPolicyReference: '' } }, { members: [], validation_rules: [], storages: [], complianceRole: 'opposit_right', complianceRoleData: { oppositionRequestId: '', oppositionReason: '', oppositionStatus: '' } } ]; } ``` ### **Validation d’unicité** ```typescript export function validateUniqueComplianceRoles(roles: RoleDefinition[]): boolean { const seen = new Set<ComplianceRole>(); for (const role of roles) { if (role.complianceRole) { if (seen.has(role.complianceRole)) { return false; } seen.add(role.complianceRole); } } return true; } ``` --- ## 3. **Intégration dans la logique métier** ### **Création de process** - Lors de la création d’un process, les rôles de conformité sont générés et ajoutés s’ils n’existent pas déjà. - L’unicité est systématiquement vérifiée avant la création effective. ```typescript btn.onclick = async () => { // ... récupération des données ... let roles = rolesSec.getData() as Record<string, RoleDefinition>; // Générer et intégrer automatiquement les rôles de conformité const complianceRoles = generateDefaultComplianceRoles(); for (const complianceRole of complianceRoles) { if (!Object.values(roles).some(r => r.complianceRole === complianceRole.complianceRole)) { roles[complianceRole.complianceRole] = complianceRole; } } // Valider l'unicité if (!validateUniqueComplianceRoles(Object.values(roles))) { alert('Erreur : chaque rôle de conformité doit être unique dans le process.'); return; } // ... création du process ... }; ``` --- ### **Édition (update) de process** - Même logique appliquée lors de la mise à jour des rôles d’un process. ```typescript public async updateProcess(process: Process, privateData: Record<string, any>, publicData: Record<string, any>, roles: Record<string, RoleDefinition> | null): Promise<ApiReturn> { if (!roles) { roles = this.getRoles(process); } else { const complianceRoles = generateDefaultComplianceRoles(); for (const complianceRole of complianceRoles) { if (!Object.values(roles).some(r => r.complianceRole === complianceRole.complianceRole)) { roles[complianceRole.complianceRole] = complianceRole; } } if (!validateUniqueComplianceRoles(Object.values(roles))) { throw new Error('Erreur : chaque rôle de conformité doit être unique dans le process.'); } } // ... suite inchangée ... } ``` --- ### **Import, export, restauration de process** - À chaque import/export/restauration, la génération et la validation des rôles de conformité sont appliquées à tous les process concernés. ```typescript // Exemple pour l'import async importJSON(backup: BackUp): Promise<void> { // ... récupération des process ... for (const processId in processes) { const process = processes[processId]; if (process && process.states && process.states.length > 0) { for (const state of process.states) { if (state.roles) { const complianceRoles = generateDefaultComplianceRoles(); for (const complianceRole of complianceRoles) { if (!Object.values(state.roles).some((r: RoleDefinition) => r.complianceRole === complianceRole.complianceRole)) { state.roles[complianceRole.complianceRole] = complianceRole; } } if (!validateUniqueComplianceRoles(Object.values(state.roles))) { throw new Error('Erreur : chaque rôle de conformité doit être unique dans le process importé.'); } } } } } // ... suite inchangée ... } ``` --- ## 4. **Bénéfices** - **Conformité réglementaire** systématique sur tous les process (création, édition, import/export, duplication, restauration). - **Traçabilité et auditabilité** des rôles critiques. - **Prévention des erreurs humaines** (aucun doublon, aucun oubli possible). - **Extensibilité** : ajout de nouveaux rôles de conformité facilité. --- ## 5. **Points d’attention** - L’UI doit permettre la gestion et l’édition des champs spécifiques à chaque rôle de conformité. - Les tests unitaires et d’intégration doivent couvrir ces cas (création, édition, import/export, restauration). - La documentation technique et fonctionnelle doit être mise à jour pour refléter ces évolutions. ---
nicolas.cantu changed title from PR Sécurité 1 to PR Sécurité 1 (Rôles de conformité dans les process) 2025-07-18 10:13:32 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: 4nk/ihm_client#1
No description provided.