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