Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 5
0
        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
            });
        }