@@ -395,6 +395,7 @@ public void UpdateStatus(EProviderStatus newStatus, string? updatedBy = null)
395395 var previousStatus = Status ;
396396 Status = newStatus ;
397397 MarkAsUpdated ( ) ;
398+ ClearReasonFieldsIfNeeded ( newStatus ) ;
398399
399400 // Dispara eventos de domínio específicos baseado na transição
400401 if ( newStatus == EProviderStatus . PendingDocumentVerification && previousStatus == EProviderStatus . PendingBasicInfo )
@@ -484,6 +485,32 @@ public void Reject(string reason, string? updatedBy = null)
484485 UpdateVerificationStatus ( EVerificationStatus . Rejected , updatedBy ) ;
485486 }
486487
488+ /// <summary>
489+ /// Exclui logicamente o prestador de serviços do sistema.
490+ /// </summary>
491+ /// <param name="dateTimeProvider">Provedor de data/hora para auditoria</param>
492+ /// <param name="deletedBy">Quem está fazendo a exclusão</param>
493+ /// <remarks>
494+ /// Implementa exclusão lógica (soft delete) em vez de remoção física dos dados.
495+ /// Dispara o evento ProviderDeletedDomainEvent quando a exclusão é realizada.
496+ /// Se o prestador já estiver excluído, o método retorna sem fazer alterações.
497+ /// </remarks>
498+ public void Delete ( IDateTimeProvider dateTimeProvider , string ? deletedBy = null )
499+ {
500+ if ( IsDeleted )
501+ return ;
502+
503+ IsDeleted = true ;
504+ DeletedAt = dateTimeProvider . CurrentDate ( ) ;
505+ MarkAsUpdated ( ) ;
506+
507+ AddDomainEvent ( new ProviderDeletedDomainEvent (
508+ Id . Value ,
509+ 1 ,
510+ Name ,
511+ deletedBy ) ) ;
512+ }
513+
487514 /// <summary>
488515 /// Valida se uma transição de status é permitida pelas regras de negócio.
489516 /// </summary>
@@ -510,29 +537,22 @@ private static void ValidateStatusTransition(EProviderStatus currentStatus, EPro
510537 }
511538
512539 /// <summary>
513- /// Exclui logicamente o prestador de serviços do sistema .
540+ /// Limpa os campos de motivo (SuspensionReason e RejectionReason) quando o status não corresponde mais ao motivo armazenado .
514541 /// </summary>
515- /// <param name="dateTimeProvider">Provedor de data/hora para auditoria</param>
516- /// <param name="deletedBy">Quem está fazendo a exclusão</param>
542+ /// <param name="newStatus">Novo status do prestador</param>
517543 /// <remarks>
518- /// Implementa exclusão lógica (soft delete) em vez de remoção física dos dados.
519- /// Dispara o evento ProviderDeletedDomainEvent quando a exclusão é realizada.
520- /// Se o prestador já estiver excluído, o método retorna sem fazer alterações.
544+ /// Este método garante a invariante de que os motivos de suspensão e rejeição
545+ /// só existem enquanto o prestador está nos estados Suspended ou Rejected, respectivamente.
521546 /// </remarks>
522- public void Delete ( IDateTimeProvider dateTimeProvider , string ? deletedBy = null )
547+ private void ClearReasonFieldsIfNeeded ( EProviderStatus newStatus )
523548 {
524- if ( IsDeleted )
525- return ;
526-
527- IsDeleted = true ;
528- DeletedAt = dateTimeProvider . CurrentDate ( ) ;
529- MarkAsUpdated ( ) ;
549+ // Limpa o motivo de suspensão se não estiver mais no estado Suspended
550+ if ( newStatus != EProviderStatus . Suspended )
551+ SuspensionReason = null ;
530552
531- AddDomainEvent ( new ProviderDeletedDomainEvent (
532- Id . Value ,
533- 1 ,
534- Name ,
535- deletedBy ) ) ;
553+ // Limpa o motivo de rejeição se não estiver mais no estado Rejected
554+ if ( newStatus != EProviderStatus . Rejected )
555+ RejectionReason = null ;
536556 }
537557
538558 /// <summary>
0 commit comments