/// <summary> /// A balance adjustment posts enough to to reach the new balance. /// Important fields are ExistingBalance and NewBalance /// </summary> public void BalanceAdjustment(int id, int acct) { checkAccountIsAcctType(acct, AcctType.Investment); BalanceAdjustmentDocument doc = Database.Get <BalanceAdjustmentDocument>(id); doc.NewBalance = doc.ExistingBalance = Database.QueryOne(@"SELECT SUM(Amount) AS Amount FROM Journal WHERE AccountId = " + acct).AsDecimal("Amount"); if (doc.idDocument == null) { doc.DocumentAccountId = acct; doc.DocumentDate = Utils.Today; doc.DocumentMemo = "Balance Adjustment"; if (string.IsNullOrEmpty(doc.DocumentIdentifier)) { doc.DocumentIdentifier = "Balance Adjustment"; } JObject o = Database.QueryOne(@"SELECT J.AccountId, AccountName FROM Journal JOIN Document ON idDocument = Journal.DocumentId JOIN Journal AS J ON J.DocumentId = idDocument AND J.JournalNum = 2 JOIN Account ON idAccount = J.AccountId WHERE Journal.JournalNum = 1 AND DocumentTypeID IN (" + (int)DocType.Withdrawal + "," + (int)DocType.Deposit + @") AND Journal.AccountId = " + acct); doc.AccountId = o.AsInt("AccountId"); doc.AccountName = o.AsString("AccountName"); doc.NameAddressId = 1; doc.Name = ""; } else { checkDocType(doc.DocumentTypeId, DocType.Withdrawal, DocType.Deposit); foreach (Journal j in Database.Query <Journal>("SELECT * FROM Journal WHERE DocumentId = " + id)) { switch (j.JournalNum) { case 1: doc.DocumentAccountId = j.AccountId; doc.NameAddressId = j.NameAddressId; doc.Amount = j.Amount; break; case 2: doc.AccountId = j.AccountId; break; default: throw new CheckException("Document is not a balance adjustment"); } } Utils.Check(acct == doc.DocumentAccountId, "Document is for a different account"); doc.Name = Database.QueryOne("SELECT Name FROM NameAddress WHERE idNameAddress = " + doc.NameAddressId).AsString("Name"); doc.AccountName = Database.QueryOne("SELECT AccountName FROM Account WHERE idAccount = " + doc.AccountId).AsString("AccountName"); doc.ExistingBalance -= doc.Amount; } Record = new JObject().AddRange( "header", doc, "Accounts", SelectAccounts(), "Names", SelectOthers()); }
/// <summary> /// Save a BalanceAdjustment after editing. /// Transaction amount is NewBalance - ExistingBalance /// </summary> public AjaxReturn BalanceAdjustmentSave(BalanceAdjustmentDocument json) { checkAccountIsAcctType(json.DocumentAccountId, AcctType.Investment); Utils.Check(json.AccountId > 0, "No account selected"); // Pointless to post a new transaction that does nothing Utils.Check(json.idDocument > 0 || json.NewBalance != json.ExistingBalance, "Balance is unchanged"); if (json.NameAddressId == 0) { json.NameAddressId = Database.ForeignKey("NameAddress", "Type", "O", "Name", json.Name); } else { checkNameType(json.NameAddressId, "O"); } JObject old = getCompleteDocument(json.idDocument); json.Amount = json.NewBalance - json.ExistingBalance; json.DocumentTypeId = (int)(json.Amount < 0 ? DocType.Withdrawal : DocType.Deposit); Database.BeginTransaction(); Database.Update(json); Journal j = new Journal(); j.AccountId = json.DocumentAccountId; j.Outstanding = j.Amount = json.Amount; j.DocumentId = (int)json.idDocument; j.JournalNum = 1; j.Memo = json.DocumentMemo; j.NameAddressId = json.NameAddressId; Database.Update(j); j = new Journal(); j.AccountId = json.AccountId; j.Outstanding = j.Amount = -json.Amount; j.DocumentId = (int)json.idDocument; j.JournalNum = 2; j.Memo = json.DocumentMemo; j.NameAddressId = json.NameAddressId; Database.Update(j); Line line = Database.Get <Line>((int)j.idJournal); line.idLine = j.idJournal; line.LineAmount = Math.Abs(json.Amount); Database.Update(line); JObject full = getCompleteDocument(json.idDocument); Database.AuditUpdate("Document", json.idDocument, old, full); Database.Commit(); return(new AjaxReturn() { message = "Balance adjusted", id = json.idDocument }); }
/// <summary> /// Post a BalanceAdjustment after editing. /// Transaction amount is NewBalance - ExistingBalance /// </summary> public AjaxReturn BalanceAdjustmentPost(BalanceAdjustmentDocument json) { checkAccountIsAcctType(json.DocumentAccountId, AcctType.Investment); Utils.Check(json.AccountId > 0, "No account selected"); // Pointless to post a new transaction that does nothing Utils.Check(json.idDocument > 0 || json.NewBalance != json.ExistingBalance, "Balance is unchanged"); if (json.NameAddressId == 0) json.NameAddressId = Database.ForeignKey("NameAddress", "Type", "O", "Name", json.Name); else checkNameType(json.NameAddressId, "O"); JObject old = getCompleteDocument(json.idDocument); json.Amount = json.NewBalance - json.ExistingBalance; json.DocumentTypeId = (int)(json.Amount < 0 ? DocType.Cheque : DocType.Deposit); Database.BeginTransaction(); Database.Update(json); Journal j = new Journal(); j.AccountId = json.DocumentAccountId; j.Outstanding = j.Amount = json.Amount; j.DocumentId = (int)json.idDocument; j.JournalNum = 1; j.Memo = json.DocumentMemo; j.NameAddressId = json.NameAddressId; Database.Update(j); j = new Journal(); j.AccountId = json.AccountId; j.Outstanding = j.Amount = -json.Amount; j.DocumentId = (int)json.idDocument; j.JournalNum = 2; j.Memo = json.DocumentMemo; j.NameAddressId = json.NameAddressId; Database.Update(j); Line line = Database.Get<Line>((int)j.idJournal); line.idLine = j.idJournal; line.LineAmount = Math.Abs(json.Amount); Database.Update(line); JObject full = getCompleteDocument(json.idDocument); Database.AuditUpdate("Document", json.idDocument, old, full); Database.Commit(); return new AjaxReturn() { message = "Balance adjusted", id = json.idDocument }; }