public DateTime?GetDueDate(TenantLease tenantLease, TenantLeaseCharge tenantLeaseCharge)
        {
            var chargeDueType = (ChargeDueType)tenantLeaseCharge.ChargeDueType;

            switch (chargeDueType)
            {
            case ChargeDueType.OnceOnlyWhenTheLeaseStarts:
                return(tenantLease.TermStartDate);

            case ChargeDueType.OnceOnlyWhenTheLeaseEnds:
                return(tenantLease.TermEndDate);

            case ChargeDueType.OnceOnlyOnaSpecificDate:
                return(tenantLeaseCharge.ChargeDueDate);

            case ChargeDueType.MonthlyOnaSpecificDay:
                var chargeDueDate = GenerateNextDay(tenantLeaseCharge.ValidFrom.Value, tenantLeaseCharge.ChargeDueDay.Value);
                if (chargeDueDate >= tenantLeaseCharge.ValidFrom.Value && chargeDueDate <= tenantLeaseCharge.ValidTo.Value)
                {
                    return(chargeDueDate);
                }
                return(null);

            case ChargeDueType.EachTimeRentIsDue:
            default:
                return(null);
            }
            ;
        }
Exemple #2
0
        public async Task <ActionResult> Create(string IdNumber)
        {
            TenantLease tenant = null;

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(BaseUrl);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                HttpResponseMessage response = await client.GetAsync($"tenantlease/{IdNumber}");

                //var result = await client.GetAsync($"tenant/{IdNumber} ");
                if (response.IsSuccessStatusCode)
                {
                    tenant = await response.Content.ReadAsAsync <TenantLease>();

                    // return View(tenant);
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "Server error try after some time.");
                }
            }
            return(View(tenant));
            //return View();
        }
        private void DeletePaymentSchedules(TenantLease tenantLease)
        {
            var tenantLeasePaymentSchedules = _tenantLeasePaymentScheduleRepository.GetAll().Where(t => t.TenantLeaseId == tenantLease.Id).ToList();

            foreach (var item in tenantLeasePaymentSchedules)
            {
                _tenantLeasePaymentScheduleRepository.Delete(item);
            }
        }
        public virtual void CreatePaymentSchedule(TenantLease tenantLease, DateTime?startDate)
        {
            var tenantLeasePaymentSchedule = new TenantLeasePaymentSchedule
            {
                TenantLeaseId = tenantLease.Id,
                DueAmount     = tenantLease.TermRentAmount,
                DueDate       = startDate,
                IsNew         = false,
            };

            _tenantLeasePaymentScheduleRepository.Insert(tenantLeasePaymentSchedule);
        }
Exemple #5
0
        /// <summary>
        /// Check whether Rental Term and Data has changed or not
        /// so we will re-generate payment schedules
        /// </summary>
        private bool HasChangedRentalTermAndDate(TenantLease tenantLease, TenantLeaseModel model)
        {
            var changed = model.IsNew == false && (tenantLease.TermStartDate != model.TermStartDate ||
                                                   tenantLease.TermNumber != model.TermNumber ||
                                                   tenantLease.TermPeriod != (int?)model.TermPeriod ||
                                                   tenantLease.TermIsMonthToMonth != model.TermIsMonthToMonth ||
                                                   tenantLease.TermEndDate != model.TermEndDate ||
                                                   tenantLease.TermRentAmount != model.TermRentAmount ||
                                                   tenantLease.DueFrequency != (int?)model.DueFrequency ||
                                                   tenantLease.FirstPaymentDate != model.FirstPaymentDate);

            return(changed);
        }
        /// <summary>
        /// Find the next day based on numberMonth and biMonthly(if yes)
        /// </summary>
        /// <param name="tenantLease"></param>
        /// <param name="numberMonth"></param>
        /// <param name="biMonthly"></param>
        /// <returns></returns>
        private DateTime GenerateNextDate(TenantLease tenantLease, int numberMonth, int biMonthly = 0)
        {
            var tempTermStartDateUserTime = _dateTimeHelper.ConvertToUserTime(tenantLease.FirstPaymentDate.Value, DateTimeKind.Utc);
            int dayOfMonth = tempTermStartDateUserTime.Day;

            if (tenantLease.DueFrequency == (int)DueFrequency.BiMonthly)
            {
                dayOfMonth = biMonthly;
            }
            var nextDate = new DateTime(tempTermStartDateUserTime.Year, tempTermStartDateUserTime.Month, 1).AddMonths(numberMonth);

            nextDate = GenerateNextDay(nextDate, dayOfMonth);
            return(nextDate);
        }
Exemple #7
0
        public ActionResult Create()
        {
            var tenantLease = new TenantLease
            {
                IsNew         = true,
                Priority      = (int?)AssignmentPriority.Medium,
                CreatedUserId = this._workContext.CurrentUser.Id
            };

            _tenantLeaseRepository.InsertAndCommit(tenantLease);

            //start workflow
            var workflowInstanceId = WorkflowServiceClient.StartWorkflow(tenantLease.Id, EntityType.TenantLease, 0, this._workContext.CurrentUser.Id);

            return(Json(new { Id = tenantLease.Id }));
        }
Exemple #8
0
        public IActionResult Create(TenantLease tenant)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(BaseUrl);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var Result = client.PostAsJsonAsync("tenantlease", tenant).Result;

                if (Result.IsSuccessStatusCode == true)
                {
                    return(RedirectToAction("Index"));
                }
                else
                {
                    return(View());
                }
            }
        }
Exemple #9
0
        public async Task <ActionResult <TenantLease> > PostTenantLease(TenantLease tenantLease, string IdNumber)
        {
            _context.TenantLease.Add(tenantLease);
            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                if (TenantLeaseExists(IdNumber))
                {
                    return(Conflict());
                }
                else
                {
                    throw;
                }
            }

            //return CreatedAtAction("GetTenantLease", new { IdNumber = tenantLease.IdNumber }, tenantLease);
            return(CreatedAtAction("GetTenantLease", new { tenantLease.IdNumber }, tenantLease));
        }
Exemple #10
0
 public async Task <IActionResult> PutTenantLease(string IdNumber, TenantLease tenantLease)
 {
     if (IdNumber != tenantLease.IdNumber)
     {
         return(BadRequest());
     }
     _context.Entry(tenantLease).State = EntityState.Modified;
     try
     {
         await _context.SaveChangesAsync();
     }
     catch (DbUpdateConcurrencyException)
     {
         if (!TenantLeaseExists(IdNumber))
         {
             return(NotFound());
         }
         else
         {
             throw;
         }
     }
     return(NoContent());
 }
        public void UpdatePayment(TenantLease tenantLease)
        {
            //Generate a new rent payment
            var tenantPayments   = _tenantPaymentRepository.GetAll().Where(p => p.TenantLeaseId == tenantLease.Id).ToList();
            var paymentSchedules = _tenantLeasePaymentScheduleRepository.GetAll()
                                   .Where(p => p.TenantLeaseId == tenantLease.Id).OrderBy(p => p.DueDate).ToList();
            var countAdditionalPayments = 0;
            var currentDate             = DateTime.UtcNow;
            var maxAdditionalPayment    = 2;

            foreach (var paymentSchedule in paymentSchedules)
            {
                var existingPayment = tenantPayments.Where(p => p.TenantLeasePaymentScheduleId == paymentSchedule.Id).FirstOrDefault();
                if (paymentSchedule.DueDate >= currentDate)
                {
                    countAdditionalPayments++;
                }
                if (countAdditionalPayments > maxAdditionalPayment)
                {
                    break;
                }
                if (existingPayment == null)
                {
                    CreateRentPayment(paymentSchedule, paymentSchedule.DueDate);
                    paymentSchedules.Add(paymentSchedule);
                    break;
                }
            }
            this._dbContext.SaveChanges();

            countAdditionalPayments = 0;
            //Generate a new charge payment with option: MonthlyOnaSpecificDay
            var tenantLeaseCharges = _tenantLeaseChargeRepository.GetAll().Where(c => c.TenantLeaseId == tenantLease.Id && c.ChargeDueType == (int?)ChargeDueType.MonthlyOnaSpecificDay).ToList();

            foreach (var tenantLeaseCharge in tenantLeaseCharges)
            {
                var validFrom           = tenantLeaseCharge.ValidFrom;
                var validTo             = tenantLeaseCharge.ValidTo;
                var latestPayment       = tenantPayments.Where(p => p.TenantLeaseChargeId == tenantLeaseCharge.Id && p.ChargeTypeId == tenantLeaseCharge.ChargeTypeId).OrderByDescending(p => p.DueDate).FirstOrDefault();
                var latestChargeDueDate = latestPayment != null && latestPayment.DueDate.HasValue ? latestPayment.DueDate.Value : validFrom.Value;

                var chargeDueDate   = GenerateNextDay(latestChargeDueDate, tenantLeaseCharge.ChargeDueDay.Value).AddMonths(1);;
                var existingPayment = tenantPayments.Where(p => p.TenantLeaseChargeId == tenantLeaseCharge.Id && p.DueDate == chargeDueDate).FirstOrDefault();
                int numberOfMonths  = ((chargeDueDate.Year - currentDate.Year) * 12) + chargeDueDate.Month - currentDate.Month;

                if (numberOfMonths > 0 && numberOfMonths > maxAdditionalPayment)
                {
                    break;
                }
                if (existingPayment == null && chargeDueDate >= validFrom.Value && chargeDueDate <= validTo.Value)
                {
                    CreateChargePayment(tenantLeaseCharge, chargeDueDate);
                    break;
                }
            }
            this._dbContext.SaveChanges();

            //Generate a new charge payment with option: EachTimeRentIsDue
            tenantLeaseCharges = _tenantLeaseChargeRepository.GetAll().Where(c => c.TenantLeaseId == tenantLease.Id && c.ChargeDueType == (int?)ChargeDueType.EachTimeRentIsDue).ToList();
            foreach (var tenantLeaseCharge in tenantLeaseCharges)
            {
                var validFrom = tenantLeaseCharge.ValidFrom;
                var validTo   = tenantLeaseCharge.ValidTo;

                //filter all payment schedules in range: valid from and valid to
                paymentSchedules = paymentSchedules.Where(c => c.DueDate >= validFrom && c.DueDate <= validTo).ToList();
                foreach (var paymentSchedule in paymentSchedules)
                {
                    var existingPayment = tenantPayments.Where(p => p.TenantLeaseChargeId == tenantLeaseCharge.Id && p.DueDate == paymentSchedule.DueDate).FirstOrDefault();
                    if (paymentSchedule.DueDate >= DateTime.UtcNow)
                    {
                        countAdditionalPayments++;
                    }
                    if (countAdditionalPayments > maxAdditionalPayment)
                    {
                        break;
                    }
                    if (existingPayment == null)
                    {
                        tenantLeaseCharge.ChargeDueDate = paymentSchedule.DueDate;
                        CreateChargePayment(tenantLeaseCharge, paymentSchedule.DueDate);
                        break;
                    }
                }
            }
            this._dbContext.SaveChanges();

            //Late Fee
            if (tenantLease.LateFeeEnabled)
            {
                //get list of rent payment has not collected yet
                tenantPayments = _tenantPaymentRepository.GetAll().Where(p => p.TenantLeaseId == tenantLease.Id && p.TenantLeasePaymentScheduleId != null && p.BalanceAmount > 0).ToList();
                foreach (var tenantPayment in tenantPayments)
                {
                    var numberOfDaysLate = DateTime.UtcNow.Subtract(tenantPayment.DueDate.Value).Days;
                    if (numberOfDaysLate > 0)
                    {
                        if (numberOfDaysLate >= tenantLease.GracePeriodDays.Value)
                        {
                            var lateFeeOption = (LateFeeOption)tenantLease.LateFeeOption;
                            switch (lateFeeOption)
                            {
                            case LateFeeOption.FlatFee:
                                tenantPayment.LateFeeAmount = tenantLease.FlatFee;
                                break;

                            case LateFeeOption.BaseAmountPerDay:
                                tenantPayment.LateFeeAmount = tenantLease.BaseAmountPerDay * tenantPayment.DueAmount + tenantLease.AmountPerDay * numberOfDaysLate;
                                break;

                            case LateFeeOption.PercentOfRentPerDay:
                                tenantPayment.LateFeeAmount = (tenantLease.PercentOfRentPerDay * numberOfDaysLate) / 100;
                                break;
                            }
                            if (tenantPayment.LateFeeAmount <= tenantLease.MaxLateFee)
                            {
                                tenantPayment.BalanceAmount = tenantPayment.DueAmount + tenantPayment.LateFeeAmount - tenantPayment.CollectedAmount;
                            }
                        }
                        tenantPayment.DaysLateCount = numberOfDaysLate;
                        _tenantPaymentRepository.Update(tenantPayment);
                    }
                    this._dbContext.SaveChanges();
                }
            }
        }
        public virtual void GeneratePaymentSchedules(TenantLease tenantLease)
        {
            if (tenantLease.TermEndDate == null)
            {
                tenantLease.TermEndDate = tenantLease.TermStartDate.Value.AddYears(20);
            }
            var tenantPayments = _tenantPaymentRepository.GetAll().Where(p => p.TenantLeaseId == tenantLease.Id && p.TenantLeasePaymentScheduleId != null).ToList();

            foreach (var tenantPayment in tenantPayments)
            {
                _tenantPaymentRepository.Delete(tenantPayment);
            }

            DeletePaymentSchedules(tenantLease);

            DueFrequency dueFrequency     = (DueFrequency)tenantLease.DueFrequency;
            DateTime     termStartDate    = tenantLease.TermStartDate.Value;
            DateTime     termEndDate      = tenantLease.TermEndDate.Value;
            DateTime     firstPaymentDate = tenantLease.FirstPaymentDate.Value;

            //Create first payment schedule
            CreatePaymentSchedule(tenantLease, firstPaymentDate);
            int numberOfDays   = (int)(termEndDate - firstPaymentDate.Date).TotalDays;
            int numberOfWeeks  = numberOfDays / 7;
            int numberOfMonths = ((termEndDate.Year - termStartDate.Year) * 12) + termEndDate.Month - termStartDate.Month;

            switch (dueFrequency)
            {
            case DueFrequency.Monthly:
                for (int i = 0; i < numberOfMonths; i++)
                {
                    termStartDate = GenerateNextDate(tenantLease, i + 1);
                    if (IsValidDate(termStartDate, termEndDate) == false)
                    {
                        break;
                    }
                    CreatePaymentSchedule(tenantLease, termStartDate);
                }
                break;

            case DueFrequency.EveryTwoWeeks:
                numberOfWeeks = numberOfDays / 7;
                for (int i = 0; i < numberOfWeeks; i++)
                {
                    termStartDate = firstPaymentDate.AddDays(7 * (i + 1) * 2);
                    if (IsValidDate(termStartDate, termEndDate) == false)
                    {
                        break;
                    }

                    CreatePaymentSchedule(tenantLease, termStartDate);
                }
                break;

            case DueFrequency.Weekly:
                numberOfWeeks = numberOfDays / 7;
                for (int i = 0; i < numberOfWeeks; i++)
                {
                    termStartDate = firstPaymentDate.AddDays(7 * (i + 1));
                    if (IsValidDate(termStartDate, termEndDate) == false)
                    {
                        break;
                    }
                    CreatePaymentSchedule(tenantLease, termStartDate);
                }
                break;

            case DueFrequency.Daily:
                for (int i = 0; i < numberOfDays; i++)
                {
                    termStartDate = firstPaymentDate.AddDays(i + 1);
                    if (IsValidDate(termStartDate, termEndDate) == false)
                    {
                        break;
                    }
                    CreatePaymentSchedule(tenantLease, termStartDate);
                }
                break;

            case DueFrequency.Quarterly:
                for (int i = 0; i < numberOfMonths; i++)
                {
                    termStartDate = GenerateNextDate(tenantLease, 3 * (i + 1));
                    if (IsValidDate(termStartDate, termEndDate) == false)
                    {
                        break;
                    }
                    CreatePaymentSchedule(tenantLease, termStartDate);
                }
                break;

            case DueFrequency.Every6Months:
                for (int i = 0; i < numberOfMonths; i++)
                {
                    termStartDate = GenerateNextDate(tenantLease, 3 * 2 * (i + 1));
                    if (IsValidDate(termStartDate, termEndDate) == false)
                    {
                        break;
                    }
                    CreatePaymentSchedule(tenantLease, termStartDate);
                }
                break;

            case DueFrequency.Yearly:
                int numberOfYears = termEndDate.Year - termStartDate.Year;
                for (int i = 0; i < numberOfYears; i++)
                {
                    termStartDate = GenerateNextDate(tenantLease, 12 * (i + 1));
                    if (IsValidDate(termStartDate, termEndDate) == false)
                    {
                        break;
                    }
                    CreatePaymentSchedule(tenantLease, termStartDate);
                }
                break;

            case DueFrequency.BiMonthly:
                var biMonthlyStart  = tenantLease.BiMonthlyStart.Value;
                var biMonthlyEnd    = tenantLease.BiMonthlyEnd.Value;
                var maxMonthlyStart = biMonthlyStart > biMonthlyEnd ? biMonthlyStart : biMonthlyEnd;
                //Generate the second payment schedule for first month.
                var maxMonthlyDate = GenerateNextDate(tenantLease, 0, maxMonthlyStart);
                if (IsValidDate(maxMonthlyDate, termEndDate) == false)
                {
                    break;
                }

                CreatePaymentSchedule(tenantLease, maxMonthlyDate);

                for (int i = 0; i < numberOfMonths; i++)
                {
                    termStartDate = GenerateNextDate(tenantLease, i + 1, biMonthlyStart);
                    if (IsValidDate(termStartDate, termEndDate))
                    {
                        CreatePaymentSchedule(tenantLease, termStartDate);
                    }

                    termStartDate = GenerateNextDate(tenantLease, i + 1, biMonthlyEnd);
                    if (IsValidDate(termStartDate, termEndDate))
                    {
                        CreatePaymentSchedule(tenantLease, termStartDate);
                    }
                }
                break;
            }
            this._dbContext.SaveChanges();
        }