public FinancialTransactionContext(ClaimHeader claimHeader, ClaimDetail claimDetail, ClaimTransactionHeader claimTransactionHeader, ClaimTransactionGroup claimTransactionGroup, User user)
            {
                this.ClaimHeader = claimHeader;
                this.ClaimDetail = claimDetail;
                this.ClaimTransactionHeader = claimTransactionHeader;
                this.ClaimTransactionGroup = claimTransactionGroup;
                this.CurrentUser = user;
                this.TransactionSource = (StaticValues.ClaimTransactionSource)this.ClaimTransactionHeader.ClaimTransactionSource;

                this.Product = claimHeader.GetProduct();
                this.ProductClaimDefinition = this.Product.ProductClaimDefinition;
                this.ProductClaimDetails = this.Product.ClaimDetails;
            }
        private static decimal AddReserve(decimal amount, FinancialTransactionContext financialContext, ClaimDetail claimDetail, ClaimTransactionGroup claimTransactionGroup, DeductibleDefinition deductibleDefinition, DeductibleReserveCapacity deductibleReserveContext, ClaimFinancialAmount latestReserve = null)
        {
            StaticValues.AmountType amountType;
            string nonFundedMovementType;
            if (IsRecovery(financialContext.TransactionSource))
            {
                amountType = StaticValues.AmountType.RecoveryReserve;
                nonFundedMovementType = deductibleDefinition.RecoveryNonFundedMovementType;
            }
            else
            {
                amountType = StaticValues.AmountType.Reserve;
                nonFundedMovementType = deductibleDefinition.NonFundedMovementType;
            }


            if (latestReserve == null)
            {
                if (amount > 0)
                {
                    AddClaimTransactionDetails(financialContext.ClaimTransactionHeader.TransactionDate.GetValueOrDefault(DateTime.MinValue), claimTransactionGroup, amountType, deductibleDefinition, amount, latestReserve);
                    deductibleReserveContext.AdjustDeductibleAttached(claimDetail.ClaimDetailReference, nonFundedMovementType, amount);
                }
                else
                {
                    amount = 0;
                }
            }
            else if (amount != Math.Abs(latestReserve.TransactionAmountClaimCurrency.GetValueOrDefault(0)))
            {
                AddClaimTransactionDetails(financialContext.ClaimTransactionHeader.TransactionDate.GetValueOrDefault(DateTime.MinValue), claimTransactionGroup, amountType, deductibleDefinition, amount, latestReserve);
                deductibleReserveContext.AdjustDeductibleAttached(claimDetail.ClaimDetailReference, nonFundedMovementType, amount + latestReserve.TransactionAmountClaimCurrency.GetValueOrDefault());
            }

            return amount;
        }
        /// <summary>
        /// Add new claim transaction detail for the new deductible. If payment/resere then stored as +ve if recovery reserve stored as -ve
        /// </summary>
        /// <param name="claimTransactionGroup">claim transaction group to attach to</param>
        /// <param name="amountType">amount type</param>
        /// <param name="deductibleDefinition">deductible definition containing deductible movement type</param>
        /// <param name="amount">deductible amount</param>
        /// <param name="latestNonFundedReserve">latest reserve if any</param>
        /// <returns>Amount s</returns>
        private static decimal AddClaimTransactionDetails(DateTime transactionDate, ClaimTransactionGroup claimTransactionGroup, StaticValues.AmountType amountType, DeductibleDefinition deductibleDefinition, decimal amount, ClaimFinancialAmount latestNonFundedReserve = null)
        {
            decimal convertedAmount;
            if (claimTransactionGroup.ClaimCurrencyCode != claimTransactionGroup.OriginalCurrencyCode)
            {
                convertedAmount = ClaimsBusinessLogicHelper.ConvertCurrencyAmount(claimTransactionGroup.ClaimTransactionHeader, amount, claimTransactionGroup.ClaimCurrencyCode, claimTransactionGroup.OriginalCurrencyCode);
            }
            else
            {
                convertedAmount = amount;
            }


            string fundedMovementType, nonFundedMovementType;
            if (amountType == StaticValues.AmountType.RecoveryReserve)
            {
                convertedAmount = -convertedAmount;
                fundedMovementType = deductibleDefinition.RecoveryFundedMovementType;
                nonFundedMovementType = deductibleDefinition.RecoveryNonFundedMovementType;
            }
            else
            {
                fundedMovementType = deductibleDefinition.FundedMovementType;
                nonFundedMovementType = deductibleDefinition.NonFundedMovementType;
            }



            short? reserveDaySequence = null;
            if (amountType == StaticValues.AmountType.Reserve || amountType == StaticValues.AmountType.RecoveryReserve)
            {
                reserveDaySequence = (short)(latestNonFundedReserve == null ? 10 : latestNonFundedReserve.ReserveDaySequence.GetValueOrDefault(0) + 10);
            }

            var claimTransactionDetail = claimTransactionGroup.AddNewClaimTransactionDetail((short)amountType, nonFundedMovementType);
            PopulateClaimTransactionDetail(claimTransactionDetail, convertedAmount, -Math.Abs(convertedAmount), transactionDate, reserveDaySequence, amountType);
            List<FlattenedTransaction> flattenedTransactions;
            if (GlobalClaimWakeUp.MappedTransactionDetails.TryGetValue(claimTransactionGroup.ClaimTransactionHeader.ClaimHeader.ClaimReference, out flattenedTransactions))
            {
                flattenedTransactions.Add(Mapper.Map<ClaimTransactionDetail, FlattenedTransaction>(claimTransactionDetail));
            }
            if (fundedMovementType != null)
            {
                claimTransactionDetail = claimTransactionGroup.AddNewClaimTransactionDetail((short)amountType, fundedMovementType);
                PopulateClaimTransactionDetail(claimTransactionDetail, -convertedAmount, Math.Abs(convertedAmount), transactionDate, reserveDaySequence, amountType);
                if (GlobalClaimWakeUp.MappedTransactionDetails.TryGetValue(claimTransactionGroup.ClaimTransactionHeader.ClaimHeader.ClaimReference, out flattenedTransactions))
                {
                    flattenedTransactions.Add(Mapper.Map<ClaimTransactionDetail, FlattenedTransaction>(claimTransactionDetail));
                }
            }

            return amount;
        }
        private static ClaimTransactionGroup ResolveClaimTransactionGroup(ClaimTransactionHeader claimTransactionHeader, ClaimTransactionGroup currentClaimTransactionGroup, ClaimDetail claimDetail)
        {
            var claimTransactionGroup = claimTransactionHeader.ClaimTransactionGroups.SingleOrDefault(a => a.ClaimDetail == claimDetail);
            if (claimTransactionGroup == null)
            {
                claimTransactionGroup = claimTransactionHeader.AddNewClaimTransactionGroup(claimDetail, false);
                claimTransactionGroup.UpdateData(currentClaimTransactionGroup);
                // don't want to copy the id accross
                claimTransactionGroup.ClaimTransactionGroupID = 0;
            }

            return claimTransactionGroup;
        }