public void CreateProductRequestRegistration(ProductRequestRegistration registration)
        {
            var existingRegistration = ProductRequestRegistrationRepository.GetSatisfiedBy(o => o.ExternalId == registration.ExternalId);
            if (existingRegistration != null)
                throw new EntityAlreadyExistsException(typeof(DataEntities.ProductRequests.ProductRequestRegistration), registration.ExternalId);

            var existingRequestType =
                ProductRequestTypeRepository.GetSatisfiedBy(o => o.ExternalId == registration.ProductRequestTypeId);
            if (existingRequestType == null)
                throw new EntityNotFoundException(typeof(ProductRequestType), registration.ProductRequestTypeId);

            var createdByAccount =
                AccountRepository.GetSatisfiedBy(o => o.ExternalId == registration.CreatedByAccountId);
            if (createdByAccount == null)
                throw new AccountNotFoundException(registration.CreatedByAccountId);

            var newEntity =
                MappingEngine.Map<ProductRequestRegistration, DataEntities.ProductRequests.ProductRequestRegistration>(
                    registration);

            newEntity.ProductRequestTypeId = existingRequestType.ProductRequestTypeId;
            newEntity.CreatedOn = SystemTime.Now;
            newEntity.CreatedByAccountId = createdByAccount.AccountId;

            ProductRequestRegistrationRepository.Insert(newEntity);

            UpdateRegistrationTasks(registration, newEntity.ProductRequestRegistrationId, createdByAccount);
        }
        private void CreateNewTask(ProductRequestRegistration registration, int registrationId, ProductRequestRegistrationTask task, DataEntities.Auth.Account dataAccount)
        {
            var taskForType = GetTasksByType(registration.ProductRequestTypeId).FirstOrDefault(o => o.ExternalId == task.ProductRequestTaskId);
            if (taskForType == null)
                throw new EntityNotFoundException(typeof(ProductRequestRegistrationTask), task.ProductRequestTaskId);

            var newEntity =
                new DataEntities.ProductRequests.ProductRequestRegistrationTask
                {
                    ProductRequestTaskId = taskForType.ProductRequestTaskId,
                    ProductRequestRegistrationId = registrationId,
                };

            SetTaskData(newEntity, task, dataAccount.AccountId);

            ProductRequestRegistrationTaskRepository.Insert(newEntity);
        }
        private void UpdateRegistrationTasks(ProductRequestRegistration registration, int parentRegistrationId, DataEntities.Auth.Account currentDataAccount)
        {
            var existingTasks =
                ProductRequestRegistrationTaskRepository
                    .GetAllSatisfiedBy(o => o.ProductRequestRegistration.ExternalId == registration.ExternalId)
                    .ToList();

            if (registration.Tasks != null)
                foreach (var task in registration.Tasks)
                {
                    var existingTask =
                        existingTasks.FirstOrDefault(o => o.ProductRequestTask.ExternalId == task.ProductRequestTaskId);

                    if (existingTask != null)
                    {
                        UpdateExistingTask(existingTask, task, currentDataAccount);
                    }
                    else
                    {
                        CreateNewTask(registration, parentRegistrationId, task, currentDataAccount);
                    }
                }
        }
        public void UpdateProductRequestRegistration(ProductRequestRegistration registration)
        {
            var existingRegistration = ProductRequestRegistrationRepository.GetSatisfiedBy(o => o.ExternalId == registration.ExternalId);
            if (existingRegistration == null)
                throw new EntityNotFoundException(typeof(DataEntities.ProductRequests.ProductRequestRegistration), registration.ExternalId);

            var existingRequestType =
                ProductRequestTypeRepository.GetSatisfiedBy(o => o.ExternalId == registration.ProductRequestTypeId);
            if (existingRequestType == null)
                throw new EntityNotFoundException(typeof(ProductRequestType), registration.ProductRequestTypeId);

            var createdByAccount =
                AccountRepository.GetSatisfiedBy(o => o.ExternalId == registration.CreatedByAccountId);
            if (createdByAccount == null)
                throw new AccountNotFoundException(registration.CreatedByAccountId);

            if (!string.Equals(existingRegistration.Description, registration.Description, StringComparison.CurrentCulture))
            {
                existingRegistration.Description = registration.Description;
                ProductRequestRegistrationRepository.Update(existingRegistration);
            }

            UpdateRegistrationTasks(registration, existingRegistration.ProductRequestRegistrationId, createdByAccount);
        }