Ir al contenido

Descripción General de Arquitectura

Este documento proporciona una descripción técnica detallada de la solución Flexible Team Share, incluida la arquitectura del sistema, el flujo de datos y las capas de procesamiento.

flowchart TB
    subgraph UI["UI LAYER"]
        direction LR
        LWC1["objectTeamMember<br/>Team member list & management"]
        LWC2["objectTeamMemberWizard<br/>Admin configuration"]
        LWC3["ftsLabels<br/>Custom labels utility"]
    end

    subgraph CTRL["CONTROLLER LAYER"]
        direction LR
        C1["ObjectTeamMemberController<br/>CRUD operations for team members"]
        C2["TeamMemberWizardController<br/>Configuration wizard operations"]
    end

    subgraph DATA["DATA LAYER"]
        direction LR
        D1["ObjectTeamMember__c<br/>Team member assignments"]
        D2["Team_Sharing_Config__c<br/>Per-object sharing config"]
        D3["FlexiTeamShare_Config__mdt<br/>App configuration"]
        D4["Triggers:<br/>ObjectTeamMemberTrigger"]
    end

    subgraph ASYNC["ASYNC PROCESSING LAYER"]
        direction LR
        A1["ShareRecordQueueable<br/>Create/update/delete shares"]
        A2["SharingRecalculationBatch<br/>Bulk recalculation"]
        A3["ExpiredTeamMemberCleanupBatch<br/>Daily cleanup of expired members"]
    end

    subgraph SHARE["SALESFORCE SHARING MODEL"]
        direction LR
        S1["Standard Share Objects<br/>AccountShare, ContactShare,<br/>CaseShare, LeadShare,<br/>OpportunityShare, etc."]
        S2["Custom Object Shares<br/>[CustomObject]__Share"]
        S3["ObjectTeamMember__Share<br/>Team member visibility"]
    end

    UI --> CTRL
    CTRL --> DATA
    DATA --> ASYNC
    ASYNC --> SHARE

Tres Lightning Web Components:

ComponentePropósito
objectTeamMemberMuestra miembros del equipo en páginas de registro. Soporta agregar/editar/eliminar, lista contraíble y límite de visualización configurable.
objectTeamMemberWizardInterfaz de administrador para configurar objetos, gestionar configuraciones y programar trabajos.
ftsLabelsComponente de utilidad que proporciona Custom Labels para soporte de i18n (35 idiomas).
ControladorMétodos
ObjectTeamMemberControllergetTeamMembers(), addTeamMember(), updateTeamMember(), removeTeamMember(), isCurrentUserManager(), isSharingConfigured(), getAccessLevelOptions()
TeamMemberWizardControllergetExistingConfigs(), getAvailableObjects(), createConfig(), toggleConfigStatus(), deleteConfig(), getScheduledJobInfo(), scheduleCleanupJob()
SyncOwnerInvocablesyncOwners() — Invocable Action para sincronizar el miembro del equipo Owner cuando cambia el propietario padre. Llamable desde Flow o Apex, completamente bulkificado.

Objetos personalizados y un trigger que se dispara en cambios de miembros del equipo:

  • ObjectTeamMember__c — almacena asignaciones de miembros del equipo
  • Team_Sharing_Config__c — configuración de uso compartido por objeto
  • FlexiTeamShare_Config__mdt — configuración a nivel de aplicación (Custom Metadata)
  • ObjectTeamMemberTriggerObjectTeamMemberTriggerHandler — maneja Before Insert, Before Update, Before Delete
ComponenteTipoPropósito
ShareRecordQueueableQueueableCrea, actualiza y elimina registros compartidos para objetos padre y miembros del equipo
SharingRecalculationBatchBatchableRecalcula de forma masiva todos los usos compartidos cuando cambia la configuración
ExpiredTeamMemberCleanupBatchBatchableElimina miembros del equipo vencidos (trabajo por lotes programado diariamente)
ExpiredTeamMemberCleanupSchedulerSchedulablePrograma el lote de limpieza (se ejecuta a las 2:00 AM diariamente)

Flujo de Datos: Agregar un Miembro del Equipo

Sección titulada «Flujo de Datos: Agregar un Miembro del Equipo»
sequenceDiagram
    actor User
    participant LWC as objectTeamMember LWC
    participant Ctrl as ObjectTeamMemberController
    participant DB as Database
    participant Queue as ShareRecordQueueable

    User->>LWC: Click "Add Team Member"
    LWC->>LWC: Collect input (User, Access Level, Role, End Date)
    LWC->>Ctrl: addTeamMember(recordId, userId, accessLevel, role, endDate)

    Ctrl->>Ctrl: Check for duplicates
    Ctrl->>Ctrl: Verify CRUD permissions

    Ctrl->>DB: INSERT ObjectTeamMember__c
    DB-->>Ctrl: Success

    Note over Ctrl,Queue: Trigger fires after insert
    Ctrl->>Queue: System.enqueueJob()

    Ctrl-->>LWC: Return success
    LWC-->>User: Refresh team member list

    Note over Queue: Async processing
    Queue->>DB: INSERT [Object]Share
    Queue->>DB: INSERT ObjectTeamMember__Share

Flujo de Datos: Sincronización de Cambio de Propietario

Sección titulada «Flujo de Datos: Sincronización de Cambio de Propietario»
sequenceDiagram
    actor Admin
    participant Flow as Record-Triggered Flow
    participant Inv as SyncOwnerInvocable
    participant DB as Database
    participant Queue as ShareRecordQueueable

    Note over Admin: Changes record owner

    Admin->>DB: UPDATE Account SET OwnerId = :newOwner
    DB-->>Flow: Trigger: OwnerId changed

    Flow->>Inv: syncOwners([recordId])

    Inv->>DB: SELECT FROM ObjectTeamMember__c WHERE Role__c = 'Owner'
    DB-->>Inv: Owner team member

    Inv->>DB: SELECT OwnerId FROM Account
    DB-->>Inv: New owner ID

    alt Owner changed
        Inv->>DB: UPDATE ObjectTeamMember__c SET User_Id__c = :newOwner
        DB-->>Inv: Success

        Inv->>Queue: System.enqueueJob()

        Note over Queue: Async processing
        Queue->>DB: DELETE old AccountShare (if not member)
        Queue->>DB: INSERT new AccountShare
    else Owner unchanged
        Inv-->>Flow: success=true, "Owner unchanged"
    end

    Inv-->>Flow: SyncOwnerResult

Flujo de Datos: Limpieza de Miembros Vencidos

Sección titulada «Flujo de Datos: Limpieza de Miembros Vencidos»
flowchart TB
    A["Salesforce Scheduler<br/>(2:00 AM daily)"] --> B["ExpiredTeamMemberCleanupScheduler"]
    B --> C["ExpiredTeamMemberCleanupBatch"]
    C --> D["Query:<br/>SELECT FROM ObjectTeamMember__c<br/>WHERE End_Date__c < TODAY()"]
    D --> E["DELETE expired records<br/>(triggers remove shares)"]
  • Todos los métodos públicos envueltos en try-catch
  • Mensajes de error amigables mediante Custom Labels
  • AuraHandledException para visualización de errores en LWC
  • Database.insert/update/delete(records, false) — éxito parcial
  • Errores individuales registrados, no fallan todo el lote
  • Estadísticas de errores rastreadas en trabajos por lotes
  • El patrón de manejador de trigger previene la recursión
  • Los errores afloran al llamador de la operación DML
  • Las operaciones de registros compartidos usan Queueable (sin bloqueo)
  • Las operaciones masivas usan Batchable con tamaño de lote configurable
  • Sin DML síncrono en registros compartidos en triggers
  • Campos indexados usados en cláusulas WHERE
  • El formato Record_Id__c permite consultas LIKE eficientes
  • Conjuntos de resultados limitados con cláusulas LIMIT
  • @AuraEnabled(cacheable=true) para operaciones de lectura
  • Configuración de aplicación en caché en la transacción

Sin integraciones externas — este paquete opera completamente dentro de Salesforce:

  • Sin llamadas HTTP
  • Sin APIs externas
  • Sin Named Credentials
  • Sin External Objects
  • Sin Connected Apps
ComponenteUso
Apex SharingCrea/gestiona registros compartidos
Queueable ApexOperaciones asíncronas de registros compartidos
Batchable ApexRecálculo masivo de uso compartido, limpieza
Schedulable ApexTrabajo de limpieza diaria
Custom MetadataConfiguración de aplicación
Lightning Web ComponentsInterfaz de usuario
Custom LabelsInternacionalización