Example #1
0
 /// <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;
 }