Skip to content

Commit 2626297

Browse files
Merge pull request #1494 from TransactionProcessing/bug/#1488_cant_readd_deleted_merchant_operator
Allow re-adding previously removed operators to merchants
2 parents 796b96b + dc6e461 commit 2626297

2 files changed

Lines changed: 39 additions & 5 deletions

File tree

TransactionProcessor.Aggregates.Tests/MerchantAggregateTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,5 +790,33 @@ public void MerchantAggregate_RemoveContract_MerchantDoesNotHaveContract_ErrorTh
790790
result.IsFailed.ShouldBeTrue();
791791
result.Status.ShouldBe(ResultStatus.Invalid);
792792
}
793+
794+
[Fact]
795+
public void MerchantAggregate_RemoveOperator_And_ReAdd_OperatorIsReAdded()
796+
{
797+
MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId);
798+
aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel,
799+
TestData.SettlementScheduleModel);
800+
aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber);
801+
802+
Result result = aggregate.RemoveOperator(TestData.OperatorId);
803+
result.IsSuccess.ShouldBeTrue();
804+
805+
Merchant merchantModel = aggregate.GetMerchant();
806+
merchantModel.Operators.ShouldHaveSingleItem();
807+
Operator operatorModel = merchantModel.Operators.Single();
808+
operatorModel.OperatorId.ShouldBe(TestData.OperatorId);
809+
operatorModel.Name.ShouldBe(TestData.OperatorName);
810+
operatorModel.MerchantNumber.ShouldBe(TestData.OperatorMerchantNumber);
811+
operatorModel.TerminalNumber.ShouldBe(TestData.OperatorTerminalNumber);
812+
operatorModel.IsDeleted.ShouldBeTrue();
813+
814+
result = aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber);
815+
result.IsSuccess.ShouldBeTrue();
816+
merchantModel = aggregate.GetMerchant();
817+
merchantModel.Operators.ShouldHaveSingleItem();
818+
operatorModel = merchantModel.Operators.Single();
819+
operatorModel.IsDeleted.ShouldBeFalse();
820+
}
793821
}
794822
}

TransactionProcessor.Aggregates/MerchantAggregate.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ private static Result EnsureMerchantHasSpaceForDevice(this MerchantAggregate agg
603603

604604
private static Result EnsureOperatorHasNotAlreadyBeenAssigned(this MerchantAggregate aggregate,
605605
Guid operatorId) {
606-
if (aggregate.Operators.Any(o => o.Key == operatorId)) {
606+
if (aggregate.Operators.Any(o => o.Key == operatorId && o.Value.IsDeleted == false)) {
607607
return Result.Invalid($"Operator {operatorId} has already been assigned to merchant");
608608
}
609609

@@ -785,13 +785,19 @@ public static void PlayEvent(this MerchantAggregate aggregate, MerchantDomainEve
785785
aggregate.Contacts.Add(contactAddedEvent.ContactId, contact);
786786
}
787787

788-
public static void PlayEvent(this MerchantAggregate aggregate, MerchantDomainEvents.OperatorAssignedToMerchantEvent operatorAssignedToMerchantEvent)
789-
{
790-
Operator @operator = new Operator(operatorAssignedToMerchantEvent.OperatorId, operatorAssignedToMerchantEvent.Name,
788+
public static void PlayEvent(this MerchantAggregate aggregate, MerchantDomainEvents.OperatorAssignedToMerchantEvent operatorAssignedToMerchantEvent) {
789+
var @operator = aggregate.Operators.SingleOrDefault(o => o.Key == operatorAssignedToMerchantEvent.OperatorId);
790+
791+
if (@operator.Value != null) {
792+
aggregate.Operators[operatorAssignedToMerchantEvent.OperatorId] = @operator.Value with { IsDeleted = false };
793+
return;
794+
}
795+
796+
Operator newOperator = new Operator(operatorAssignedToMerchantEvent.OperatorId, operatorAssignedToMerchantEvent.Name,
791797
operatorAssignedToMerchantEvent.MerchantNumber,
792798
operatorAssignedToMerchantEvent.TerminalNumber);
793799

794-
aggregate.Operators.Add(operatorAssignedToMerchantEvent.OperatorId, @operator);
800+
aggregate.Operators.Add(operatorAssignedToMerchantEvent.OperatorId, newOperator);
795801
}
796802

797803
public static void PlayEvent(this MerchantAggregate aggregate, MerchantDomainEvents.OperatorRemovedFromMerchantEvent operatorRemovedFromMerchantEvent){

0 commit comments

Comments
 (0)