public void Clone_correctness() { const string number = "123"; var line1 = new PaymentLine { Number = number }; var line2 = line1.Clone(); Assert.AreEqual(line1, line2); }
public void AddLine_Correctness() { var item = new PaymentLine { ReferenceNumber = "1" }; var debt = new Payment(); Assert.IsNull(debt.Lines); debt.AddLine(item); Assert.AreEqual(debt.Lines.Count, 1); Assert.AreEqual(debt.Lines[0], item); }
public void ApplyUnappliedPaymentsToInvoice(Invoice invoice) { var unappliedPayments = Client .QueryAll <Payment>($"select * from Payment where CustomerRef = '{invoice.CustomerRef.Value}' ORDERBY TxnDate") .Where(x => x.UnappliedAmt > 0) .ToList(); foreach (var unappliedPayment in unappliedPayments) { if (invoice.Balance == 0) { return; } decimal paymentAmount = GetPayment(unappliedPayment.UnappliedAmt.GetValueOrDefault(), invoice.Balance); var newPaymentLine = new PaymentLine { Amount = paymentAmount, LinkedTxn = new List <LinkedTransaction> { new LinkedTransaction { TxnId = invoice.Id.ToString(), TxnType = "Invoice" } } }; unappliedPayment.Line ??= new List <PaymentLine>(); unappliedPayment.Line.Add(newPaymentLine); var paymentDate = GetPaymentDate(unappliedPayment.TxnDate, invoice.TxnDate); if (paymentDate != unappliedPayment.TxnDate) { var newNote = "This payment was automatically applied to an invoice during invoice generation. " + $"The payment date was moved from {unappliedPayment.TxnDate} to the date of the invoice it's being applied to {paymentDate}."; unappliedPayment.TxnDate = paymentDate; if (!string.IsNullOrWhiteSpace(unappliedPayment.PrivateNote)) { newNote = newNote + Environment.NewLine + Environment.NewLine + unappliedPayment.PrivateNote; } unappliedPayment.PrivateNote = newNote; } invoice.Balance -= paymentAmount; Client.SparseUpdate(unappliedPayment); } }
public void EqualityOperator_LinesCorrectness() { var number = "1234"; var date = new DateTime(2015, 2, 3); var pay1 = new Payment { Number = number, Date = date }; var pay2 = new Payment { Number = number, Date = date }; var lines = new List <PaymentLine>(); pay1.Lines = lines; pay2.Lines = lines; Assert.True(pay1 == pay2); lines.Add(new PaymentLine { Number = "123" }); pay1.Lines = lines; pay2.Lines = lines; Assert.True(pay1 == pay2); lines[0] = new PaymentLine { Number = "678" }; pay2.Lines = lines; Assert.False(pay1 == pay2); lines.Clear(); pay2.Lines = lines; Assert.False(pay1 == pay2); }
public AjaxReturn PaymentSave(PaymentDocument json) { decimal amount = 0; Database.BeginTransaction(); PaymentHeader document = json.header; checkDocType(document.DocumentTypeId, PaymentDoc); checkNameType(document.DocumentNameAddressId, NameType); checkAccountIsAcctType(document.DocumentAccountId, AcctType.Bank, AcctType.CreditCard); if (document.idDocument == null) { allocateDocumentIdentifier(document); } PaymentDocument oldDoc = getPayment(document.idDocument); int sign = -SignFor(PaymentDoc); // Update the outstanding on the paid documents foreach (PaymentLine payment in json.detail) { Utils.Check(!SecurityOn || !Settings.RequireAuthorisation || Authorise || NameType != "S" || payment.Authorised > 0, "Cannot pay unauthorised document"); decimal a = payment.AmountPaid; PaymentLine old = oldDoc.PaymentFor(payment.idDocument); if (old != null) { a -= old.AmountPaid; // reduce update by the amount paid last time it was saved } int?docId = payment.idDocument; if (a != 0) { Database.Execute("UPDATE Journal SET Outstanding = Outstanding - " + sign * a + " WHERE DocumentId = " + Database.Quote(docId) + " AND AccountId = " + (int)LedgerAccount); amount += a; } } json.detail = json.detail.Where(l => l.AmountPaid != 0).ToList(); document.DocumentOutstanding = json.header.Remaining; decimal changeInDocumentAmount; decimal changeInOutstanding; // Virtual method, as calculation is different for customers and suppliers calculatePaymentChanges(json, amount, out changeInDocumentAmount, out changeInOutstanding); document.DocumentTypeId = (int)PaymentDoc; Database.Update(document); // Now delete the old cross reference records, and replace with new Database.Execute("DELETE FROM Payments WHERE idPayment = " + document.idDocument); foreach (PaymentLine payment in json.detail) { if (payment.AmountPaid != 0) { Database.Execute("INSERT INTO Payments (idPayment, idPaid, PaymentAmount) VALUES(" + document.idDocument + ", " + payment.idDocument + ", " + payment.AmountPaid + ")"); } } // Journal between bank account and sales/purchase ledger Journal journal = Database.Get(new Journal() { DocumentId = (int)document.Id, JournalNum = 1 }); journal.DocumentId = (int)document.idDocument; journal.JournalNum = 1; journal.NameAddressId = document.DocumentNameAddressId; journal.Memo = document.DocumentMemo; journal.AccountId = document.DocumentAccountId; journal.Amount += changeInDocumentAmount; journal.Outstanding += changeInOutstanding; Database.Update(journal); journal = Database.Get(new Journal() { DocumentId = (int)document.Id, JournalNum = 2 }); journal.DocumentId = (int)document.idDocument; journal.JournalNum = 2; journal.NameAddressId = document.DocumentNameAddressId; journal.Memo = document.DocumentMemo; journal.AccountId = (int)LedgerAccount; journal.Amount -= changeInDocumentAmount; journal.Outstanding -= changeInOutstanding; Database.Update(journal); Line line = Database.Get(new Line() { idLine = journal.idJournal }); line.idLine = journal.idJournal; line.LineAmount += PaymentDoc == DocType.BillPayment ? -changeInDocumentAmount : changeInDocumentAmount; Database.Update(line); oldDoc = PaymentGetAudit(document.idDocument); Database.AuditUpdate("Payment", document.idDocument, oldDoc == null ? null : oldDoc.ToJObject(), json.ToJObject()); Database.Commit(); return(new AjaxReturn() { message = "Payment saved", id = document.idDocument }); }