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); } ; }
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); }
/// <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); }
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 })); }
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()); } } }
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)); }
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(); }