public void AddTerm_PaymentsNotExercised() { // Arrange var helper = new TestHelper(); var user = PrincipalHelper.CreateForPermission(Permissions.LeaseEdit); var lease = EntityHelper.CreateLease(1); var payment = new PimsLeasePayment(); helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var service = helper.Create <LeaseTermService>(); var leaseService = helper.GetService <Mock <ILeaseService> >(); var leaseTermRepository = helper.GetService <Mock <Repositories.ILeaseTermRepository> >(); leaseService.Setup(x => x.IsRowVersionEqual(It.IsAny <long>(), It.IsAny <long>())).Returns(true); leaseTermRepository.Setup(x => x.GetByLeaseId(It.IsAny <long>())).Returns(lease.PimsLeaseTerms); // Act var term = new PimsLeaseTerm() { TermStartDate = DateTime.MaxValue, LeaseId = lease.Id, Lease = lease, LeaseTermStatusTypeCode = "NEXER", PimsLeasePayments = new List <PimsLeasePayment>() { payment } }; var ex = Assert.Throws <InvalidOperationException>(() => service.AddTerm(lease.Id, 1, term)); ex.Message.Should().Be("Term must be 'exercised' if payments have been made."); }
public void GetAggregatedLeases_Success() { // Arrange var user = PrincipalHelper.CreateForPermission(Permissions.LeaseView); var lease = EntityHelper.CreateLease(1); lease.OrigExpiryDate = new DateTime(2022, 4, 1); helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, TermExpiryDate = DateTime.Now.AddDays(10) }; MockCommonServices(); leaseRepository.Setup(x => x.Get(It.IsAny <LeaseFilter>(), true)).Returns(new List <PimsLease>() { lease }); // Act var leases = leaseReportsService.GetAggregatedLeaseReport(2022); // Assert leases.Should().HaveCount(1); leases.FirstOrDefault().Should().Be(lease); leaseRepository.Verify(x => x.Get(It.IsAny <LeaseFilter>(), true)); }
public void AddTerm() { // Arrange var helper = new TestHelper(); var user = PrincipalHelper.CreateForPermission(Permissions.LeaseEdit, Permissions.LeaseView); var lease = EntityHelper.CreateLease(1); helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var service = helper.Create <LeaseTermService>(); var leaseService = helper.GetService <Mock <ILeaseService> >(); var leaseRepository = helper.GetService <Mock <Repositories.ILeaseRepository> >(); var leaseTermRepository = helper.GetService <Mock <Repositories.ILeaseTermRepository> >(); leaseService.Setup(x => x.IsRowVersionEqual(It.IsAny <long>(), It.IsAny <long>())).Returns(true); leaseRepository.Setup(x => x.Get(It.IsAny <long>())).Returns(lease); // Act var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, LeaseId = lease.Id, Lease = lease }; var updatedLease = service.AddTerm(lease.Id, 1, term); // Assert leaseTermRepository.Verify(x => x.Add(term), Times.Once); leaseRepository.Verify(x => x.Get(lease.Id), Times.Once); }
private static string GetPaymentStatus(PimsLeasePayment payment, PimsLeaseTerm parent) { decimal?expectedTotal = (parent.PaymentAmount ?? 0) + (parent.GstAmount ?? 0); if (payment.PaymentAmountTotal == 0) { return(PimsLeasePaymentStatusTypes.UNPAID); } else if (payment.PaymentAmountTotal < expectedTotal) { return(PimsLeasePaymentStatusTypes.PARTIAL); } else if (payment.PaymentAmountTotal == expectedTotal) { return(PimsLeasePaymentStatusTypes.PAID); } else if (payment.PaymentAmountTotal > expectedTotal) { return(PimsLeasePaymentStatusTypes.OVERPAID); } else { throw new InvalidOperationException("Invalid payment value provided"); } }
public void DeleteTerm_Exer() { // Arrange var helper = new TestHelper(); var user = PrincipalHelper.CreateForPermission(Permissions.LeaseEdit); var lease = EntityHelper.CreateLease(1); var payment = new PimsLeasePayment(); var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, LeaseId = lease.Id, Lease = lease, LeaseTermStatusTypeCode = "EXER" }; lease.PimsLeaseTerms = new List <PimsLeaseTerm>() { term }; helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var service = helper.Create <LeaseTermService>(); var leaseService = helper.GetService <Mock <ILeaseService> >(); var leaseTermRepository = helper.GetService <Mock <Repositories.ILeaseTermRepository> >(); leaseService.Setup(x => x.IsRowVersionEqual(It.IsAny <long>(), It.IsAny <long>())).Returns(true); leaseTermRepository.Setup(x => x.GetByLeaseId(It.IsAny <long>())).Returns(lease.PimsLeaseTerms); leaseTermRepository.Setup(x => x.GetById(It.IsAny <long>(), It.IsAny <bool>())).Returns(term); // Act var ex = Assert.Throws <InvalidOperationException>(() => service.DeleteTerm(lease.Id, 1, term)); ex.Message.Should().Be("Exercised terms cannot be deleted. Remove all payments from this term and set this term to 'Not Exercised' to delete this term."); }
private void ValidateOverlappingTerm(PimsLeaseTerm term) { if (IsTermOverlapping(term)) { throw new InvalidOperationException("A new term start and end date must not conflict with any existing terms."); } }
public void AddPayment() { // Arrange var user = PrincipalHelper.CreateForPermission(Permissions.LeaseEdit, Permissions.LeaseView); var lease = EntityHelper.CreateLease(1); helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, TermExpiryDate = DateTime.Now.AddDays(10) }; MockCommonServices(); leaseService.Setup(x => x.IsRowVersionEqual(It.IsAny <long>(), It.IsAny <long>())).Returns(true); leaseService.Setup(x => x.GetById(It.IsAny <long>())).Returns(lease); leaseTermRepository.Setup(x => x.GetById(It.IsAny <long>(), true)).Returns(term); // Act var payment = new PimsLeasePayment() { PaymentReceivedDate = DateTime.Now }; var updatedLease = paymentService.AddPayment(lease.Id, 1, payment); // Assert leasePaymentRepository.Verify(x => x.Add(payment), Times.Once); leaseService.Verify(x => x.GetById(lease.Id), Times.Once); }
public void UpdatePayment_ReceivedDateOutOfRange() { // Arrange var user = PrincipalHelper.CreateForPermission(Permissions.LeaseEdit); var lease = EntityHelper.CreateLease(1); var originalPayment = new PimsLeasePayment() { PaymentReceivedDate = DateTime.Now }; var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, TermExpiryDate = DateTime.Now.AddDays(10) }; helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); MockCommonServices(); leaseService.Setup(x => x.IsRowVersionEqual(It.IsAny <long>(), It.IsAny <long>())).Returns(true); leaseTermRepository.Setup(x => x.GetById(It.IsAny <long>(), It.IsAny <bool>())).Returns(term); // Act var payment = new PimsLeasePayment() { LeasePaymentId = originalPayment.LeasePaymentId, PaymentReceivedDate = DateTime.Now.AddDays(30) }; var ex = Assert.Throws <InvalidOperationException>(() => paymentService.UpdatePayment(lease.Id, 1, 1, payment)); ex.Message.Should().Be("Payment received date must be within the start and expiry date of the term."); }
public void AddTerm_OverlappingDates_SameStartDate() { // Arrange var helper = new TestHelper(); var user = PrincipalHelper.CreateForPermission(Permissions.LeaseEdit); var lease = EntityHelper.CreateLease(1); var originalTerm = new PimsLeaseTerm() { TermStartDate = DateTime.Now, TermExpiryDate = DateTime.Now.AddDays(10), LeaseId = lease.Id, Lease = lease }; lease.PimsLeaseTerms = new List <PimsLeaseTerm>() { originalTerm }; helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var service = helper.Create <LeaseTermService>(); var leaseService = helper.GetService <Mock <ILeaseService> >(); var leaseTermRepository = helper.GetService <Mock <Repositories.ILeaseTermRepository> >(); leaseService.Setup(x => x.IsRowVersionEqual(It.IsAny <long>(), It.IsAny <long>())).Returns(true); leaseTermRepository.Setup(x => x.GetByLeaseId(It.IsAny <long>())).Returns(lease.PimsLeaseTerms); // Act var term = new PimsLeaseTerm() { TermStartDate = originalTerm.TermStartDate, TermExpiryDate = originalTerm.TermExpiryDate = originalTerm.TermStartDate.AddDays(1), LeaseId = lease.Id, Lease = lease }; var ex = Assert.Throws <InvalidOperationException>(() => service.AddTerm(lease.Id, 1, term)); ex.Message.Should().Be("A new term start and end date must not conflict with any existing terms."); }
/// <summary> /// Does the date range of this term overlap any existing terms on this lease, assuming a null end date is logically equivalent to no fixed end date. /// </summary> /// <param name="term"></param> /// <returns></returns> private bool IsTermOverlapping(PimsLeaseTerm term) { IEnumerable <PimsLeaseTerm> terms = _leaseTermRepository.GetByLeaseId(term.LeaseId); return(terms.Any(t => t.Id != term.Id && (t.TermExpiryDate >= term.TermStartDate && t.TermStartDate <= term.TermStartDate || (t.TermExpiryDate == null && t.TermStartDate <= term.TermStartDate) || (term.TermExpiryDate == null && t.TermStartDate >= term.TermStartDate)))); }
/// <summary> /// Validate if the new incoming term date range overlaps any existing date ranges, or if the new incoming term has any payments but is not being set to exercised. /// </summary> /// <param name="term"></param> private void ValidateAddRules(PimsLeaseTerm term) { ValidateOverlappingTerm(term); if (term.PimsLeasePayments.Count > 0 && term.LeaseTermStatusTypeCode != LeaseTermStatusTypes.EXER) { throw new InvalidOperationException("Term must be 'exercised' if payments have been made."); } }
public PimsLease AddTerm(long leaseId, long leaseRowVersion, PimsLeaseTerm term) { ValidateTermServiceCall(leaseId, leaseRowVersion); ValidateAddRules(term); _leaseTermRepository.Add(term); _leaseTermRepository.CommitTransaction(); return(_leaseRepository.Get(leaseId)); }
/// <summary> /// Validate if the incoming term date range overlaps any existing date ranges, or if the existing lease term to be updated has any payments but is not being set to EXER. /// </summary> /// <param name="term"></param> /// <param name="termId"></param> private void ValidateUpdateRules(PimsLeaseTerm term, long termId) { ValidateOverlappingTerm(term); PimsLeaseTerm leaseTermToUpdate = _leaseTermRepository.GetById(termId, true); if (leaseTermToUpdate.PimsLeasePayments.Count > 0 && term.LeaseTermStatusTypeCode != LeaseTermStatusTypes.EXER) { throw new InvalidOperationException("Term must be 'exercised' if payments have been made."); } }
/// <summary> /// Validate that the payment received date is part of the parent term. /// </summary> /// <param name="payment"></param> private void ValidatePaymentRules(PimsLeasePayment payment) { PimsLeaseTerm leaseTerm = _leaseTermRepository.GetById(payment.LeaseTermId, true); if (leaseTerm == null) { throw new InvalidOperationException("Payment must be made against a parent term."); } if (payment.PaymentReceivedDate < leaseTerm.TermStartDate || (leaseTerm.TermExpiryDate != null && payment.PaymentReceivedDate > leaseTerm.TermExpiryDate)) { throw new InvalidOperationException("Payment received date must be within the start and expiry date of the term."); } payment.LeasePaymentStatusTypeCode = GetPaymentStatus(payment, leaseTerm); }
public void AddPayment_StatusPaymentType() { // Arrange var user = PrincipalHelper.CreateForPermission(Permissions.LeaseEdit, Permissions.LeaseView); var lease = EntityHelper.CreateLease(1); helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, TermExpiryDate = DateTime.Now.AddDays(10), GstAmount = 1, PaymentAmount = 1 }; MockCommonServices(); leaseService.Setup(x => x.IsRowVersionEqual(It.IsAny <long>(), It.IsAny <long>())).Returns(true); leaseService.Setup(x => x.GetById(It.IsAny <long>())).Returns(lease); leaseTermRepository.Setup(x => x.GetById(It.IsAny <long>(), true)).Returns(term); // Act var unpaidPayment = new PimsLeasePayment() { PaymentReceivedDate = DateTime.Now, PaymentAmountTotal = 0, }; var overpaidPayment = new PimsLeasePayment() { PaymentReceivedDate = DateTime.Now, PaymentAmountTotal = 3 }; var paidPayment = new PimsLeasePayment() { PaymentReceivedDate = DateTime.Now, PaymentAmountTotal = 2 }; var partialPayment = new PimsLeasePayment() { PaymentReceivedDate = DateTime.Now, PaymentAmountTotal = 1 }; paymentService.AddPayment(lease.Id, 1, unpaidPayment); paymentService.AddPayment(lease.Id, 1, overpaidPayment); paymentService.AddPayment(lease.Id, 1, paidPayment); paymentService.AddPayment(lease.Id, 1, partialPayment); // Assert leasePaymentRepository.Verify(x => x.Add(It.Is <PimsLeasePayment>(x => x.LeasePaymentStatusTypeCode == PimsLeasePaymentStatusTypes.UNPAID && x.PaymentAmountTotal == 0))); leasePaymentRepository.Verify(x => x.Add(It.Is <PimsLeasePayment>(x => x.LeasePaymentStatusTypeCode == PimsLeasePaymentStatusTypes.OVERPAID && x.PaymentAmountTotal == 3))); leasePaymentRepository.Verify(x => x.Add(It.Is <PimsLeasePayment>(x => x.LeasePaymentStatusTypeCode == PimsLeasePaymentStatusTypes.PAID && x.PaymentAmountTotal == 2))); leasePaymentRepository.Verify(x => x.Add(It.Is <PimsLeasePayment>(x => x.LeasePaymentStatusTypeCode == PimsLeasePaymentStatusTypes.PARTIAL && x.PaymentAmountTotal == 1))); }
private void ValidateDeletionRules(PimsLeaseTerm term) { PimsLeaseTerm leaseTermToDelete = _leaseTermRepository.GetById(term.Id, true); if (leaseTermToDelete.PimsLeasePayments.Count > 0) { throw new InvalidOperationException("A term with payments attached can not be deleted. If you intend to delete this term, you must delete each of the corresponding payments first."); } if (leaseTermToDelete.LeaseTermStatusTypeCode == LeaseTermStatusTypes.EXER) { throw new InvalidOperationException("Exercised terms cannot be deleted. Remove all payments from this term and set this term to 'Not Exercised' to delete this term."); } IEnumerable <PimsLeaseTerm> termsForLease = _leaseTermRepository.GetByLeaseId(term.LeaseId).OrderBy(t => t.TermStartDate).ThenBy(t => t.LeaseTermId); if (term.Id == termsForLease.FirstOrDefault()?.Id&& termsForLease.Count() > 1) { throw new InvalidOperationException("You must delete all renewals before deleting the initial term."); } }
public void AddTerm_InvalidRowVersion() { // Arrange var helper = new TestHelper(); var user = PrincipalHelper.CreateForPermission(Permissions.LeaseView, Permissions.LeaseEdit); var lease = EntityHelper.CreateLease(1); helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var service = helper.Create <LeaseTermService>(); // Act var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, LeaseId = lease.Id, Lease = lease }; Assert.Throws <DbUpdateConcurrencyException>(() => service.AddTerm(lease.Id, 1, term)); }
public void DeleteTerm_NotAuthorized() { // Arrange var helper = new TestHelper(); var user = PrincipalHelper.CreateForPermission(Permissions.LeaseView); var lease = EntityHelper.CreateLease(1); helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var service = helper.Create <LeaseTermService>(); // Act var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, LeaseId = lease.Id, Lease = lease }; Assert.Throws <NotAuthorizedException>(() => service.DeleteTerm(lease.Id, 1, term)); }
public void GetAggregatedLeases_NotAuthorized() { // Arrange var user = PrincipalHelper.CreateForPermission(); var lease = EntityHelper.CreateLease(1); helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, TermExpiryDate = DateTime.Now.AddDays(10) }; MockCommonServices(); leaseRepository.Setup(x => x.Get(It.IsAny <LeaseFilter>(), true)).Returns(new List <PimsLease>() { lease }); // Act // Assert Assert.Throws <NotAuthorizedException>(() => leaseReportsService.GetAggregatedLeaseReport(2022)); }
public void DeleteTerm_Initial() { // Arrange var helper = new TestHelper(); var user = PrincipalHelper.CreateForPermission(Permissions.LeaseEdit); var lease = EntityHelper.CreateLease(1); var payment = new PimsLeasePayment(); var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, LeaseId = lease.Id, Lease = lease }; var term2 = new PimsLeaseTerm() { TermStartDate = DateTime.Now, LeaseId = lease.Id, Lease = lease }; lease.PimsLeaseTerms = new List <PimsLeaseTerm>() { term, term2 }; helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var service = helper.Create <LeaseTermService>(); var leaseService = helper.GetService <Mock <ILeaseService> >(); var leaseTermRepository = helper.GetService <Mock <Repositories.ILeaseTermRepository> >(); leaseService.Setup(x => x.IsRowVersionEqual(It.IsAny <long>(), It.IsAny <long>())).Returns(true); leaseTermRepository.Setup(x => x.GetByLeaseId(It.IsAny <long>())).Returns(lease.PimsLeaseTerms); leaseTermRepository.Setup(x => x.GetById(It.IsAny <long>(), It.IsAny <bool>())).Returns(term); // Act var ex = Assert.Throws <InvalidOperationException>(() => service.DeleteTerm(lease.Id, 1, term)); ex.Message.Should().Be("You must delete all renewals before deleting the initial term."); }
public void DeleteTerm_Payments() { // Arrange var helper = new TestHelper(); var user = PrincipalHelper.CreateForPermission(Permissions.LeaseEdit); var lease = EntityHelper.CreateLease(1); var payment = new PimsLeasePayment(); var term = new PimsLeaseTerm() { TermStartDate = DateTime.Now, LeaseId = lease.Id, Lease = lease, PimsLeasePayments = new List <PimsLeasePayment>() { payment } }; lease.PimsLeaseTerms = new List <PimsLeaseTerm>() { term }; helper.CreatePimsContext(user, true).AddAndSaveChanges(lease); var service = helper.Create <LeaseTermService>(); var leaseService = helper.GetService <Mock <ILeaseService> >(); var leaseTermRepository = helper.GetService <Mock <Repositories.ILeaseTermRepository> >(); leaseService.Setup(x => x.IsRowVersionEqual(It.IsAny <long>(), It.IsAny <long>())).Returns(true); leaseTermRepository.Setup(x => x.GetByLeaseId(It.IsAny <long>())).Returns(lease.PimsLeaseTerms); leaseTermRepository.Setup(x => x.GetById(It.IsAny <long>(), It.IsAny <bool>())).Returns(term); // Act var ex = Assert.Throws <InvalidOperationException>(() => service.DeleteTerm(lease.Id, 1, term)); ex.Message.Should().Be("A term with payments attached can not be deleted. If you intend to delete this term, you must delete each of the corresponding payments first."); }