Skip to content

Commit e10dcdb

Browse files
author
Filipe Frigini
committed
Reset suspension/rejection reasons when leaving those states
1 parent 4ae165a commit e10dcdb

File tree

1 file changed

+38
-18
lines changed

1 file changed

+38
-18
lines changed

src/Modules/Providers/Domain/Entities/Provider.cs

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)