/// <summary> /// Удаление TransferRecord /// </summary> /// <param name="transferRecord"></param> public void Delete(TransferRecord transferRecord) { // Ограничение - если у агрегата только одна transfer record - мы не можем ее удалить ... // Добавление & удаление transfer record влияет на математический аппарат // Обнуляем математический аппарат if (transferRecord.ParentComponent != null) { if (transferRecord.ParentComponent.TransferRecords.Count == 1) { throw new Exception("1153: Can not delete single transfer record"); } if (transferRecord.ConsumableId > 0) { //Поиск комплектующего, часть которого была перемещена данной записью Entities.General.Accessory.Component fromConsumable = _componentCore.GetBaseComponentById(transferRecord.ConsumableId) ?? _componentCore.GetComponentById(transferRecord.ConsumableId); if (fromConsumable != null) { //комплектующее найдено //Проверка, находится ли то комплектующее, часть которого была перемещена //на той же локации, с которой была перемещена данная часть TransferRecord consumLocation = fromConsumable.TransferRecords.GetLast(); if (consumLocation != null && ((consumLocation.DestinationObjectType == SmartCoreType.BaseComponent && consumLocation.DestinationObjectId == transferRecord.FromBaseComponentId) || (consumLocation.DestinationObjectType == SmartCoreType.Aircraft && consumLocation.DestinationObjectId == transferRecord.FromAircraftId) || (consumLocation.DestinationObjectType == SmartCoreType.Store && consumLocation.DestinationObjectId == transferRecord.FromStoreId))) { //Если последняя точка назначения исходного комплектующего //совпадает с отправной точкой данной части исходного комплектующего //то необходимо удалить данную часть комплектующуго, а кол-во //перемещенных единиц добавить к исходному комплектующему transferRecord.ParentComponent.IsDeleted = true; _newKeeper.Delete(transferRecord.ParentComponent, true, false); fromConsumable.Quantity += transferRecord.ParentComponent.Quantity > 0 ? transferRecord.ParentComponent.Quantity : 1; _componentCore.Save(fromConsumable); } else { // Иначе, если не найдена последняя запись о перемещении // исходного расходника или // если исходный расходник был перемещен с отправной точки данной части // то нужно произвести простой откат данной записи о перемещении // Сохраняем запись transferRecord.IsDeleted = true; _newKeeper.Save(transferRecord); transferRecord.ParentComponent.TransferRecords.Remove(transferRecord); // Обновляем состояние объекта _componentCore.SetDestinations(transferRecord.ParentComponent); if (transferRecord.ParentComponent is BaseComponent) { _calculator.ResetMath((BaseComponent)transferRecord.ParentComponent); } } } else { // если исходный расходник не найден // то нужно произвести простой откат данной записи о перемещении // Сохраняем запись transferRecord.IsDeleted = true; _newKeeper.Save(transferRecord); transferRecord.ParentComponent.TransferRecords.Remove(transferRecord); // Обновляем состояние объекта _componentCore.SetDestinations(transferRecord.ParentComponent); if (transferRecord.ParentComponent is BaseComponent) { _calculator.ResetMath((BaseComponent)transferRecord.ParentComponent); } } } else { // Сохраняем запись transferRecord.IsDeleted = true; _newKeeper.Save(transferRecord); transferRecord.ParentComponent.TransferRecords.Remove(transferRecord); // Обновляем состояние объекта _componentCore.SetDestinations(transferRecord.ParentComponent); if (transferRecord.ParentComponent is BaseComponent) { _calculator.ResetMath((BaseComponent)transferRecord.ParentComponent); } } } else { throw new Exception("1000: Failed to specify tranfer record parent type"); } }