/// <summary>
        /// Creates the keyed dto.
        /// </summary>
        /// <param name="key">The key of the entity.</param>
        /// <returns>A <see cref="Rem.Ria.PatientModule.Web.FrontDeskDashboard.PayorCoverageCacheDto"/></returns>
        public PayorCoverageCacheDto CreateKeyedDto(long key)
        {
            var payorCoverage = _payorCoverageCacheRepository.GetByKey(key);
            var dto           = Mapper.Map <PayorCoverageCache, PayorCoverageCacheDto> (payorCoverage);

            return(dto);
        }
        /// <summary>
        /// Handles the specified request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>A <see cref="Agatha.Common.Response"/></returns>
        public override Response Handle(SaveDtoRequest <PayorCoverageCacheDto> request)
        {
            var requestDto = request.DataTransferObject;

            DomainEvent.Register <RuleViolationEvent> (failure => _validationFailureOccurred = true);

            LogicalTreeWalker.Walk <IDataTransferObject> (requestDto, dto => dto.ClearAllDataErrorInfo());

            var response = CreateTypedResponse();

            if (requestDto.EditStatus == EditStatus.Create || requestDto.EditStatus == EditStatus.Update)
            {
                var patient                = _patientRepository.GetByKeyOrThrow(requestDto.PatientKey, "Patient");
                var payorCache             = _payorCacheRepository.GetByKeyOrThrow(requestDto.PayorCache.Key, "Payor");
                var effectiveDateRange     = new DateRange(requestDto.StartDate, requestDto.EndDate);
                var payorCoverageCacheType = _mappingHelper.MapLookupField <PayorCoverageCacheType> (requestDto.PayorCoverageCacheType);

                var countyArea    = _mappingHelper.MapLookupField <CountyArea> (requestDto.PayorSubscriberCache.Address.CountyArea);
                var stateProvince = _mappingHelper.MapLookupField <StateProvince> (requestDto.PayorSubscriberCache.Address.StateProvince);
                var country       = _mappingHelper.MapLookupField <Country> (requestDto.PayorSubscriberCache.Address.Country);

                var address = new Address(
                    requestDto.PayorSubscriberCache.Address.FirstStreetAddress,
                    requestDto.PayorSubscriberCache.Address.SecondStreetAddress,
                    requestDto.PayorSubscriberCache.Address.CityName,
                    countyArea,
                    stateProvince,
                    country,
                    new PostalCode(requestDto.PayorSubscriberCache.Address.PostalCode));

                var gender = _mappingHelper.MapLookupField <AdministrativeGender>(requestDto.PayorSubscriberCache.AdministrativeGender);

                var patientName = new PersonNameBuilder()
                                  .WithFirst(requestDto.PayorSubscriberCache.FirstName)
                                  .WithMiddle(requestDto.PayorSubscriberCache.MiddleName)
                                  .WithLast(requestDto.PayorSubscriberCache.LastName);

                var payorSubscriberRelationshipCacheType =
                    _mappingHelper.MapLookupField <PayorSubscriberRelationshipCacheType> (requestDto.PayorSubscriberCache.PayorSubscriberRelationshipCacheType);

                var payorSubscriberCache = new PayorSubscriberCache(
                    address, requestDto.PayorSubscriberCache.BirthDate, gender, patientName, payorSubscriberRelationshipCacheType);

                PayorCoverageCache payorCoverageCache;

                if (requestDto.EditStatus == EditStatus.Create)
                {
                    payorCoverageCache = _payorCoverageCacheFactory.CreatePayorCoverage(
                        patient, payorCache, effectiveDateRange, requestDto.MemberNumber, payorSubscriberCache, payorCoverageCacheType);
                }
                else
                {
                    payorCoverageCache = _payorCoverageCacheRepository.GetByKeyOrThrow(requestDto.Key, "Payor");
                    payorCoverageCache.RevisePayorCoverageCacheInfo(payorCoverageCacheType, effectiveDateRange, requestDto.MemberNumber);
                    payorCoverageCache.RevisePayorCache(payorCache);
                    payorCoverageCache.RevisePayorSubscriberCache(payorSubscriberCache);
                }

                response.DataTransferObject = payorCoverageCache == null ? requestDto : Mapper.Map <PayorCoverageCache, PayorCoverageCacheDto>(payorCoverageCache);
            }
            else if (requestDto.EditStatus == EditStatus.Delete)
            {
                var payorCoverageCache = _payorCoverageCacheRepository.GetByKey(requestDto.Key);
                if (payorCoverageCache != null)
                {
                    _payorCoverageCacheFactory.DestroyPayorCoverage(payorCoverageCache);
                }
                response.DataTransferObject = requestDto;
            }
            else
            {
                var payorCoverageCache = _payorCoverageCacheRepository.GetByKeyOrThrow(requestDto.Key, "Payor");
                response.DataTransferObject = Mapper.Map <PayorCoverageCache, PayorCoverageCacheDto>(payorCoverageCache);
            }

            var processSucceeded = !_validationFailureOccurred;

            if (processSucceeded)
            {
                Session.Flush();
                Session.Clear();
            }
            else
            {
                if (requestDto.EditStatus == EditStatus.Create)
                {
                    response.DataTransferObject.Key = 0;
                }
            }

            return(response);
        }