Пример #1
0
        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.");
        }
Пример #2
0
        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));
        }
Пример #3
0
        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);
        }
Пример #4
0
        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");
            }
        }
Пример #5
0
        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.");
        }
Пример #6
0
 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.");
     }
 }
Пример #7
0
        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);
        }
Пример #8
0
        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.");
        }
Пример #9
0
        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.");
        }
Пример #10
0
        /// <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))));
        }
Пример #11
0
        /// <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.");
            }
        }
Пример #12
0
        public PimsLease AddTerm(long leaseId, long leaseRowVersion, PimsLeaseTerm term)
        {
            ValidateTermServiceCall(leaseId, leaseRowVersion);
            ValidateAddRules(term);

            _leaseTermRepository.Add(term);
            _leaseTermRepository.CommitTransaction();

            return(_leaseRepository.Get(leaseId));
        }
Пример #13
0
        /// <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.");
            }
        }
Пример #14
0
        /// <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);
        }
Пример #15
0
        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)));
        }
Пример #16
0
        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.");
            }
        }
Пример #17
0
        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));
        }
Пример #18
0
        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));
        }
Пример #19
0
        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));
        }
Пример #20
0
        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.");
        }
Пример #21
0
        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.");
        }