using (var transaction = _clientServerDbContext.Database.BeginTransaction())
{
try
{
// снимаем блокировку заданного типа
var resUnblock = DogovorServiceDao.CancelDogovorBlock(demand.DogovorId, demand.DemandBlockingType, demand.Id).GetAwaiter().GetResult();
if (!resUnblock.IsSuccessfully)
{
return resUnblock;
}
// Актуализируем статус договора.
var blokedDogovorList = DogovorServiceDao.GetBlockListForDogovor(demand.DogovorId);
if (!blokedDogovorList.Any(x => x.IsActive))
{
// получаем историю изменений из триггера
var histDogovorList = DogovorServiceDao.GetHistOnDogovor(demand.DogovorId);
// на всякий случай, если не было истории по договору (или был перенос из старых договоров)
var previousDogovorStatus = DogovorStatus.Working;
if (histDogovorList.Count > 0)
{
// перебираем историю начиная с последнего события
foreach (var histItem in histDogovorList.OrderByDescending(x => x.HistData.DateEvent))
{
// находим первую запись в которой статус договора был не блокирован
if (!histItem.Status.In(DogovorStatus.Blocked, DogovorStatus.BlockedNotActiveDogovor, DogovorStatus.PartiallyBlocked))
{
previousDogovorStatus = histItem.Status;
break;
}
}
}
result = CommonDogovor.ChangeDogovorStatus(demand.DogovorId, previousDogovorStatus);
if (!result.IsSuccessfully)
{
return result;
}
var dogoovorServiceList = dogovorInfo.DogovorServices;
// TODO: возможно это стоит делать на событие изменения статуса договора
var serviceAccptiList =
dogoovorServiceList.Where(
x =>
x.ServiceType.In(
DogovorServiceType.RckAcceptance,
DogovorServiceType.RckView,
DogovorServiceType.DU,
DogovorServiceType.DuAcceptanceParticipant,
DogovorServiceType.NPF,
DogovorServiceType.NpfAcceptanceParticipant,
DogovorServiceType.Others,
DogovorServiceType.OthersAcceptanceParticipant,
DogovorServiceType.OtherMonitoring,
DogovorServiceType.OtherMonitoringParticipant
) &&
x.State == DogovorServiceStatus.Blocked).ToList();
// разблокируем части акцептантов
if (serviceAccptiList.Count > 0)
{
foreach (var serviceItem in serviceAccptiList)
{
var srv = CommonServiceFactory.GetService(serviceItem.ServiceType);
var resultChangeStatus = srv.ChangeServiceStatus(serviceItem.Id, DogovorServiceStatus.Enabled);
if (!resultChangeStatus.IsSuccessfully)
{
return resultChangeStatus;
}
}
}
}
else
{
if (dogovorInfo.Status != DogovorStatus.BlockedNotActiveDogovor)
{
if (blokedDogovorList.Where(x => x.IsActive).All(x => x.BlockType == BlockType.PodFf || x.BlockType == BlockType.DTBIPR))
{
result = CommonDogovor.ChangeDogovorStatus(demand.DogovorId, DogovorStatus.PartiallyBlocked);
}
else
{
result = CommonDogovor.ChangeDogovorStatus(demand.DogovorId, DogovorStatus.Blocked);
}
}
}
transaction.Commit();
// пишем в события договора что с него снята блокировка заданного типа
EventServiceDao.WriteObjectEvent(demand.DogovorId, ObjectType.Agreement,
string.Format("С договора снята блокировка \"{0}\"", demand.DemandBlockingType.ToName()), EventState.Normal, demand.Id, ObjectType.Demand);
result.Result = 1;
}
catch (Exception)
{
transaction.Rollback();
DBLogger.Instance.Error(string.Format("Ошибка при разблокировке договора. Откат до предыдущего состояния. Заявка: {0}", demand.Id));
//удаление уже созданной заявки
DemandServiceDao.ChangeStatus(demand.Id, DemandStatus.Removed).GetAwaiter().GetResult();
throw;
}