/// <summary>
        /// This method transfers all certification data for later calls
        /// </summary>
        /// <param name="externalKey">The external primary key of the family</param>
        /// <param name="transactionKey">The key for a particular transaction (you may have had several calls against one family)</param>
        /// <param name="effectiveDate">The date this transaction is effective for, compliance may vary based on this date.</param>
        /// <returns></returns>
        public bool TransferDataForEligibilityCall(string externalKey, string transactionKey, DateTime effectiveDate)
        {
            bool returnValue = false;

            try
            {
                //get the dt family
                tcDTFamily tcDTFamily = _uow.DTFamilyRepository.Get(filter: f => f.ExternalKey == externalKey && f.TransactionKey == transactionKey).Single();

                //transfer the family
                tcFamily family = TransferDTFamilyToTCFamily(_uow, tcDTFamily, effectiveDate, externalKey, transactionKey);


                //get the dtfamilymembers
                IEnumerable <tcDTFamilyMember> dtFamilyMembers = _uow.DTFamilyMemberRepository.Get(filter: f => f.fkFamily == tcDTFamily.PK);


                //transfer the family members
                IEnumerable <tcFamilyMember> tcFamilyMembers = TransferDTFamilyMemberInfoToTCFamilyMemberInfo(_uow, dtFamilyMembers, family, tcDTFamily, transactionKey);


                _uow.Save();



                returnValue = true;

                return(returnValue);
            }
            finally
            {
                _uow.Dispose();
            }
        }
Example #2
0
        public IEnumerable <tcAsset> ReturnTotalEligibleAssetsForFamily(tcFamily familyArg, IAssetRepository assetRepo)
        {
            //1. Snag the total asset value for the family
            IEnumerable <tcAsset> assets = assetRepo.GetAssetsByFamily(familyArg.PK);

            //2. Filter out inactive assets
            assets = new AssetFilters().RemoveInactiveAssetsFromCollection(assets);

            //3. Filter out ineligible family members
            assets = new AssetFilters().RemoveInEligibleFamilyMemberAssetsFromCollection(assets);

            return(assets);
        }
        /// <summary>
        /// This method calcualtes the overall family member size in the standard IRS way. All members who have an eligible status and are currently marked as isactive. It's imporant to realize
        /// that live in aide's will not be counted in the family size nor eligibility, but should be utilized for bedroom size calculations.
        /// </summary>
        /// <param name="familyArg"></param>
        /// <param name="familyMemberRepo"></param>
        /// <returns></returns>
        public int CalculateFamilySize(tcFamily familyArg, IFamilyMemberRepository familyMemberRepo)
        {
            int familyMemberCount = 0;

            var familyMembers = familyMemberRepo.GetFamilyMembersByFamilyID(familyArg.PK);

            familyMemberCount = (from fm in familyMembers
                                 where
                                 fm.IsActive == true &&
                                 fm.tcFamilyMemberStatu != null &&
                                 fm.tcFamilyMemberStatu.FamilyMemberStatus.Trim().ToLower() != Constants.FamilyMemberStatus.NonEligibleFamilyMember.Trim().ToLower() && //let's ignore non eligible members
                                 fm.tcFamilyMemberStatu.FamilyMemberStatus.Trim().ToLower() != Constants.FamilyMemberStatus.LiveInAide.Trim().ToLower()                 //we also don't utilize the live in aides,
                                 select fm).Count();

            return(familyMemberCount);
        }
        /// <summary>
        /// This method is reponsible for transferring the family from data transfer tables to the tax credit tables. Afterwards we'll delete the family
        /// from the dt tables to keep them clean. The tables are meant to be transactional.
        ///
        /// </summary>
        /// <param name="uow"></param>
        /// <param name="tcDTFamily"></param>
        /// <param name="effectiveDate"></param>
        /// <param name="externalKey"></param>
        /// <param name="transactionKey"></param>
        /// <returns></returns>
        private tcFamily TransferDTFamilyToTCFamily(CertificationTransferUnitOfWork uow, tcDTFamily tcDTFamily, DateTime effectiveDate, string externalKey, string transactionKey)
        {
            tcFamily newFamily = new tcFamily
            {
                EffectiveDate = effectiveDate,
                IsActive      = true,
                IsFullTimeResidentialWorker = tcDTFamily.IsFullTimeResidentialWorker,
                ExternalKey    = externalKey,
                transactionKey = transactionKey
            };

            //insert the family to the tc family
            uow.FamilyRepository.Insert(newFamily);

            //remove the family from dt
            //uow.DTFamilyRepository.Delete(tcDTFamily.PK);

            return(newFamily);
        }
Example #5
0
        public decimal CalculateTotalAssetIncomeAmount(
            tcFamily familyArg, IAssetRepository assetRepo, ISettingsRepository settingsRepo)
        {
            decimal totalAssetIncomeAmount = 0;
            decimal totalAssetValue        = 0;
            decimal totalAssetIncome       = 0;

            //1. Get total assets for the family
            IEnumerable <tcAsset> eligibleAssets =
                new TotalAssetCalculationStandard().ReturnTotalEligibleAssetsForFamily(familyArg, assetRepo);

            //2. Snag the total asset income
            totalAssetIncome = eligibleAssets.Sum(asset => (asset.AnnualIncome ?? 0));

            //3. Determine if asset value meets the HUD threshold
            totalAssetIncomeAmount = CalculateTotalAssetAmountConsideringThreshold(
                totalAssetValue, totalAssetIncome, settingsRepo);

            return(totalAssetIncomeAmount);
        }
Example #6
0
        public decimal CalculateTotalAssetAmount(tcFamily familyArg, IAssetRepository assetRepo)
        {
            decimal totalAssetValue = 0;

            //incremental holding values
            decimal totalWithDrawlPenalty = 0;

            //1. Get all eligible assets
            IEnumerable <tcAsset> eligibleAssets = ReturnTotalEligibleAssetsForFamily(familyArg, assetRepo);

            //2. Snag the total asset value for the family
            totalAssetValue = eligibleAssets.Sum(asset => asset.Value);

            //3. Snag the total withdrawl penalty
            totalWithDrawlPenalty = eligibleAssets.Sum(asset => (asset.WithdrawlPenalty ?? 0));

            //4. Remove the penalty from the total asset value
            totalAssetValue = totalAssetValue - totalWithDrawlPenalty;

            return(totalAssetValue);
        }
Example #7
0
        public decimal CalculateGrossNonAssetIncomeAmount(tcFamily familyArg, IIncomeRepository incomeRepo)
        {
            IncomeFilters incomeFilter = new IncomeFilters();
            decimal       grossNonAssetIncomeAmount = 0;

            //1. Pull all the available incomes related to the family
            IEnumerable <tcIncome> incomes = incomeRepo.GetIncomesByFamily(familyArg.PK);

            //2. Filter out inactive incomes
            incomes = RemoveInactiveIncomesFromCollection(incomes);

            //2. Filter out the incomes of ineligible family members
            incomes = incomeFilter.RemoveInEligibleFamilyMemberIncomesFromCollection(incomes);

            //3. Remove earned income of dependents under the age of 18
            incomes = incomeFilter.RemoveEarnedIncomesOfDependentsUnder18(incomes);

            //4. Split full time student earned income over the age of 18 from the group, who are dependents, they have a 480 dollar cap per person
            IEnumerable <tcIncome> studentIncomes = incomeFilter.RetrieveAdultStudentIncome(incomes);

            //now calculate the earned income with 480 cap
            decimal totalStudentEarnedIncome = CalculateEarnedIncomeForAdultStudents(studentIncomes, 480); //TODO: Change 480 to be a setting

            //5. Gather remaining family member incomes
            IEnumerable <tcIncome> standardIncomes = incomes.Where(
                income => !studentIncomes.Select(x => x.PK).Contains(income.PK));

            //Calculate total unearned and earned incomes for the remainder of the family
            decimal totalStandardIncome = standardIncomes.Sum(i => i.YearlyIncomeAmount);

            //add the two together to get total family grossnonassetincome
            grossNonAssetIncomeAmount = CalculateGrossNonAssetIncome(
                totalStudentEarnedIncome, totalStandardIncome);

            return(grossNonAssetIncomeAmount);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="uow"></param>
        /// <param name="dtFamilyMembers"></param>
        /// <param name="tcFamily"></param>
        /// <param name="tcDTFamily"></param>
        /// <param name="transactionKey"></param>
        /// <returns></returns>
        private IEnumerable <tcFamilyMember> TransferDTFamilyMemberInfoToTCFamilyMemberInfo(CertificationTransferUnitOfWork uow, IEnumerable <tcDTFamilyMember> dtFamilyMembers, tcFamily tcFamily, tcDTFamily tcDTFamily, string transactionKey)
        {
            tcFamilyMember newMember = null;


            foreach (tcDTFamilyMember dtMember in dtFamilyMembers)
            {
                newMember = new tcFamilyMember
                {
                    fkFamily       = tcFamily.PK,
                    FirstName      = dtMember.FirstName.Trim(),
                    LastName       = dtMember.LastName.Trim(),
                    SSN            = dtMember.SSN.Trim(),
                    MiddleInitial  = dtMember.MiddleInitial.Trim(),
                    BirthDate      = dtMember.BirthDate,
                    ExternalKey    = dtMember.ExternalKey,
                    transactionKey = transactionKey,

                    fkFamilyMemberStatus = uow.FamilyMemberStatusRepository.Get(filter: s => s.FamilyMemberStatus.Trim().ToLower() ==
                                                                                dtMember.tcDTFamilyMemberStatu.FamilyMemberStatus.Trim().ToLower() && s.IsActive).Single().PK,

                    fkGender = (dtMember.Gender.ToLower().Trim() == "m" ? uow.GenderRepository.Get(filter: gen => gen.Gender.Trim().ToLower() == "male" && gen.IsActive).Single()
                        : uow.GenderRepository.Get(filter: gen => gen.Gender.Trim().ToLower() != "female" && gen.IsActive).Single()).PK,

                    IsActive = true
                };

                //if they have a student status, let's hunt down the appropriate one and assign it to the family member
                if (dtMember.tcDTStudentStatu != null)
                {
                    newMember.fkStudentStatus = uow.StudentStatusRepository.Get(filter: s => s.StudentStatus.Trim().ToLower()
                                                                                == dtMember.tcDTStudentStatu.StudentStatus.Trim().ToLower()).Single().PK;
                }

                //apply special status's for the members
                if (dtMember.tcDTSpecialStatu != null)
                {
                    newMember.fkSpecialStatus = uow.SpecialStatusRepository.Get(filter: s => s.SpecialStatus.Trim().ToLower()
                                                                                == dtMember.tcDTSpecialStatu.SpecialStatus.Trim().ToLower()).Single().PK;
                }

                //transfer this members asset information
                TransferDTAssetsToTCAssets(uow, dtMember, newMember);

                //transfer this members income information
                TransferDTIncomesToTCIncomes(uow, dtMember, newMember);

                //add the family member to our context for later saving
                uow.FamilyMemberRepository.Insert(newMember);

                //remove the family member
                //uow.DTFamilyMemberRepository.Delete(dtMember.PK);
            }


            return(uow.FamilyMemberRepository.InternalCollection);
        }