/// <summary>
        /// Adds the given location to the eca system.
        /// </summary>
        /// <param name="additionalLocation">The new location.</param>
        /// <returns>The task.</returns>
        public async Task <Location> CreateAsync(AdditionalLocation additionalLocation)
        {
            Location city     = null;
            Location country  = null;
            Location division = null;
            Location region   = null;

            if (additionalLocation.CityId.HasValue)
            {
                city = await CreateGetLocationByIdQuery(additionalLocation.CityId).FirstOrDefaultAsync();

                throwIfLocationNotFound(additionalLocation.CityId.Value, city, "City");
            }
            if (additionalLocation.DivisionId.HasValue)
            {
                division = await CreateGetLocationByIdQuery(additionalLocation.DivisionId).FirstOrDefaultAsync();

                throwIfLocationNotFound(additionalLocation.DivisionId.Value, division, "Division");
            }
            if (additionalLocation.CountryId.HasValue)
            {
                country = await CreateGetLocationByIdQuery(additionalLocation.CountryId).FirstOrDefaultAsync();

                throwIfLocationNotFound(additionalLocation.CountryId.Value, country, "Country");
            }
            if (additionalLocation.RegionId.HasValue)
            {
                region = await CreateGetLocationByIdQuery(additionalLocation.RegionId).FirstOrDefaultAsync();

                throwIfLocationNotFound(additionalLocation.RegionId.Value, region, "Region");
            }
            var existingLocations = await CreateGetLikeLocationsQuery(additionalLocation).ToListAsync();

            throwIfLocationsAlreadyExist(additionalLocation, existingLocations);

            var locationType = await Context.LocationTypes.FindAsync(additionalLocation.LocationTypeId);

            throwIfLocationTypeDoesNotExist(additionalLocation.LocationTypeId, locationType);

            return(DoCreate(
                       country: country,
                       division: division,
                       city: city,
                       region: region,
                       locationType: locationType,
                       additionalLocation: additionalLocation));
        }
        private Location DoCreate(Location region, Location country, Location division, Location city, LocationType locationType, AdditionalLocation additionalLocation)
        {
            var validationEntity = GetLocationValidationEntity(additionalLocation, region, country, division, city);

            locationValidator.ValidateCreate(validationEntity);
            if (division == null && city != null && city.Division != null)
            {
                division = city.Division;
            }
            if (country == null && division != null && division.Country != null)
            {
                country = division.Country;
            }
            if (region == null && country != null && country.Region != null)
            {
                region = country.Region;
            }
            var newLocation = new Location
            {
                IsActive     = true,
                City         = city,
                Country      = country,
                Division     = division,
                Region       = region,
                Latitude     = additionalLocation.Latitude,
                Longitude    = additionalLocation.Longitude,
                LocationName = additionalLocation.LocationName,
                LocationType = locationType,
            };

            Context.Locations.Add(newLocation);
            additionalLocation.Audit.SetHistory(newLocation);
            return(newLocation);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="additionalLocation"></param>
 /// <returns></returns>
 public Task <Location> CreateAsync(AdditionalLocation additionalLocation)
 {
     Contract.Requires(additionalLocation != null, "The additional location must not be null.");
     return(Task.FromResult <Location>(null));
 }
 /// <summary>
 ///
 /// </summary>
 /// <param name="additionalLocation"></param>
 /// <returns></returns>
 public Location Create(AdditionalLocation additionalLocation)
 {
     Contract.Requires(additionalLocation != null, "The additional location must not be null.");
     return(null);
 }