public void CheckOutAndSaveAndCheckIn()
{
if (CurrentVersion == null)
{
Create();
return;
}
AssertValidAction(StateAction.SaveAndCheckIn);
//-- Expected version
if (!HasApproving)
{
//-- Approving OFF
switch (VersioningMode)
{
case VersioningMode.None:
DeleteVersionsAndApprove();
break;
case VersioningMode.Major:
//remove all working versions, except current
var irrelevantIds = GetLastWorkingVersions().Select(x => x.VersionId);
DeletableVersionIds.AddRange(irrelevantIds);
DeletableVersionIds.Remove(CurrentVersionId);
var lastApproved = GetLastApprovedVersion();
ExpectedVersion = lastApproved != null ?
GetNextPublicVersion(lastApproved.VersionNumber, VersionStatus.Approved) :
ComputeNewVersion();
//preserve last working version
if (CurrentVersion.Status != VersionStatus.Approved && CurrentVersion.Status != VersionStatus.Rejected)
ExpectedVersionId = CurrentVersionId;
break;
case VersioningMode.Full:
this.ExpectedVersion = GetNextNonpublicVersion(VersionStatus.Draft);
this.LockerUserId = 0;
ExpectedVersionId = 0;
break;
}
}
else
{
//-- Approving ON
switch (VersioningMode)
{
case VersioningMode.None:
DeleteVersionsAndPreserveLastWorking();
break;
case VersioningMode.Major:
switch (CurrentVersion.Status)
{
case VersionStatus.Approved: // raise
case VersionStatus.Rejected: // raise
this.ExpectedVersion = GetNextNonpublicVersion(VersionStatus.Pending);
break;
case VersionStatus.Draft: // preserve
case VersionStatus.Pending: // preserve
ExpectedVersion = CurrentVersion.ChangeStatus(VersionStatus.Pending);
ExpectedVersionId = CurrentVersionId;
break;
default:
throw new NotSupportedException();
}
break;
case VersioningMode.Full:
this.ExpectedVersion = GetNextNonpublicVersion(VersionStatus.Draft);
ExpectedVersionId = 0;
break;
}
}
//-- Unlock
this.LockerUserId = 0;
}