/// <summary> /// Add journals for investment gains to data /// </summary> /// <param name="period">Start and end of period over which to calculate gains</param> /// <param name="account">Accounts to include</param> /// <param name="data">Exdisting list of journals</param> /// <returns>List with gain journals added</returns> List<JObject> addInvestmentGains(DateTime [] period, RecordFilter account, List<JObject> data) { // Current values of stock for each account id Dictionary<int, decimal> stockValues = new Dictionary<int, decimal>(); // Get values for each stock at start of period foreach (Investments.SecurityValue securityValue in Database.Query<Investments.SecurityValue>(Investments.SecurityValues(period[0].AddDays(-1)))) { JObject jnl = data.FirstOrDefault(a => a.AsInt("idAccount") == securityValue.ParentAccountId && a.AsInt("DocumentTypeId") == (int)DocType.OpeningBalance); if (jnl == null) continue; // No opening balance, so not wanted decimal gain = securityValue.Value; stockValues[(int)securityValue.AccountId] = securityValue.Value; // Save value at start of period jnl["Amount"] = jnl.AsDecimal("Amount") + gain; // Add to the opening balance } // Now get values at end of period foreach (Investments.SecurityValueWithName securityValue in Database.Query<Investments.SecurityValueWithName>( "SELECT * FROM (" + Investments.SecurityValues(period[1].AddDays(-1)) + @") AS SV JOIN Security ON idSecurity = SecurityId")) { decimal gain = 0; int ind; stockValues.TryGetValue((int)securityValue.AccountId, out gain); gain = securityValue.Value - gain; // Gain is difference between start and end of period values JObject jnl = data.LastOrDefault(a => a.AsInt("idAccount") == securityValue.ParentAccountId); if (jnl != null && gain != 0) { // Add extra journal for parent account ind = data.IndexOf(jnl); jnl = newJournal(new JObject(jnl), gain, gain < 0, securityValue.SecurityName, period); data.Insert(ind + 1, jnl); } jnl = data.LastOrDefault(a => a.AsInt("idAccount") == securityValue.AccountId && a.AsInt("DocumentTypeId") == (int)DocType.Gain); if (jnl != null) { if (gain == 0) { data.Remove(jnl); } else { jnl["AccountId"] = securityValue.AccountId; if (account.Active && !account.Test(jnl)) continue; // Add extra journal for gain newJournal(jnl, -gain, gain < 0, securityValue.SecurityName, period); } } } return data; }