public static BusinessResults GetBusinessResults(MainModel mainModel, bool isForMonth = false) { BusinessResults model = new BusinessResults(); model.StartDate = mainModel.StartDate; model.EndDate = mainModel.EndDate; using (base3Entities db = new base3Entities()) { Start = mainModel.StartTranz; End = mainModel.EndTranz; StartOriginal = mainModel.StartTranzOriginal; EndOriginal = mainModel.EndTranzOriginal; if (isForMonth) { Start.AddRange(mainModel.EndTranz.Where(_ => _.period < mainModel.StartDate).ToList()); End = mainModel.EndTranz.Where(_ => _.period >= mainModel.StartDate && _.period < mainModel.EndDate).ToList(); //StartOriginal.AddRange(mainModel.EndTranzOriginal.Where(_ => _.period < mainModel.StartDate).ToList()); //EndOriginal = mainModel.EndTranzOriginal.Where(_ => _.period >= mainModel.StartDate && _.period < mainModel.EndDate).ToList(); } ourScr = new List<int>(); // Вытащим ID интересующих нас счетов нас счетов decimal _outStart = 0; decimal _outEnd = 0; #region Оборотные активы #region Денежные средства в кассе Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.CashInCashBox1, (int)ScoresForBusinessResults.CashInCashBox2); model.CashInCashBoxStart = _outStart; model.CashInCashBoxEnd = _outEnd; #endregion #region Денежные средства на рассчетном счете Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.MoneyInTheBankAccounts1, (int)ScoresForBusinessResults.MoneyInTheBankAccounts2); model.MoneyInTheBankAccountsStart = _outStart; model.MoneyInTheBankAccountsEnd = _outEnd; #endregion #region Депозиты Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.Deposits); model.DepositsStart = _outStart; model.DepositsEnd = _outEnd; #endregion #region Долги клиентов и переплаты Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.DebtsOfCustomersAndOverpayments); model.DebtsOfCustomersAndOverpaymentsStart = _outStart; model.DebtsOfCustomersAndOverpaymentsEnd = _outEnd; #endregion #region Сырье и материалы Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.RawAndMaterials); model.RawAndMaterialsStart = _outStart; model.RawAndMaterialsEnd = _outEnd; #endregion #region Товары Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.Goods1, (int)ScoresForBusinessResults.Goods2); model.GoodsStart = _outStart; model.GoodsEnd = _outEnd; #endregion #region Незавершенное производство Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.UnfinishedProduction); model.UnfinishedProductionStart = _outStart; model.UnfinishedProductionEnd = _outEnd; #endregion #region Прочие оборотные активы Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.OtherCurrentAssets1, (int)ScoresForBusinessResults.OtherCurrentAssets2, (int)ScoresForBusinessResults.OtherCurrentAssets3, (int)ScoresForBusinessResults.OtherCurrentAssets4, (int)ScoresForBusinessResults.OtherCurrentAssets5, (int)ScoresForBusinessResults.OtherCurrentAssets6, (int)ScoresForBusinessResults.OtherCurrentAssets7, (int)ScoresForBusinessResults.OtherCurrentAssets8, (int)ScoresForBusinessResults.OtherCurrentAssets9, (int)ScoresForBusinessResults.OtherCurrentAssets10, (int)ScoresForBusinessResults.OtherCurrentAssets11, (int)ScoresForBusinessResults.OtherCurrentAssets12); model.OtherCurrentAssetsStart = _outStart; model.OtherCurrentAssetsEnd = _outEnd; #endregion #region Налоговые переплаты / авансы Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.TaxOverpaymentsAndAdvances); model.TaxOverpaymentsAndAdvancesStart = _outStart; model.TaxOverpaymentsAndAdvancesEnd = _outEnd; #endregion #endregion #region Долгосрочные активы #region Долгосрочная дебиторская задолженность контрагентов Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.CustomerDebts); model.CustomerDebtsStart = _outStart; model.CustomerDebtsEnd = _outEnd; #endregion #region Прочие долги клиентов/переплаты Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment1, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment2, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment3, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment4, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment5, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment6, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment7, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment8, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment9, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment10, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment11, (int)ScoresForBusinessResults.OtherDebtsOfClientsAndOverpayment12); model.OtherDebtsOfClientsAndOverpaymentStart = _outStart; model.OtherDebtsOfClientsAndOverpaymentEnd = _outEnd; #endregion #region Инвестиции Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.Investments1, (int)ScoresForBusinessResults.Investments2, (int)ScoresForBusinessResults.Investments3); model.InvestmentsStart = _outStart; model.InvestmentsEnd = _outEnd; #endregion #region Основные средства Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.FixedAssets); model.FixedAssetsStart = _outStart; model.FixedAssetsEnd = _outEnd; #endregion #region Нематериальные активы Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.IntangibleAssets); model.IntangibleAssetsStart = _outStart; model.IntangibleAssetsEnd = _outEnd; #endregion #region Отложенные налоговые переплаты/авансы Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.TheDeferredTaxOverpaymentsAndAdvances); model.TheDeferredTaxOverpaymentsAndAdvancesStart = _outStart; model.TheDeferredTaxOverpaymentsAndAdvancesEnd = _outEnd; #endregion #endregion #region Текущая задолженность #region Кредиты сроком до одного года Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.CreditsForOneYear1, (int)ScoresForBusinessResults.CreditsForOneYear2); model.CreditsForOneYearStart = _outStart * minusOne; model.CreditsForOneYearEnd = _outEnd * minusOne; #endregion #region Задолженность по КПН/ИПН Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.DebtCitIit); model.DebtCitIitStart = _outStart * minusOne; model.DebtCitIitEnd = _outEnd * minusOne; #endregion #region Задолженность по НДС Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.DebtVat); model.DebtVatStart = _outStart * minusOne; model.DebtVatEnd = _outEnd * minusOne; #endregion #region Прочая задолженность по налогам Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.OtherTaxesPayable1, (int)ScoresForBusinessResults.OtherTaxesPayable2, (int)ScoresForBusinessResults.OtherTaxesPayable3, (int)ScoresForBusinessResults.OtherTaxesPayable4, (int)ScoresForBusinessResults.OtherTaxesPayable5, (int)ScoresForBusinessResults.OtherTaxesPayable6, (int)ScoresForBusinessResults.OtherTaxesPayable7); model.OtherTaxesPayableStart = _outStart * minusOne; model.OtherTaxesPayableEnd = _outEnd * minusOne; #endregion #region Задолжность перед поставщиками Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.PayablesToSuppliersShortTermDebts); model.PayablesToSuppliersShortTermDebtsStart = _outStart * minusOne; model.PayablesToSuppliersShortTermDebtsEnd = _outEnd * minusOne; #endregion #region Задолженность перед сотрудниками Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.PayablesToEmployees); model.PayablesToEmployeesStart = _outStart * minusOne; model.PayablesToEmployeesEnd = _outEnd * minusOne; #endregion #region Прочая задолженность Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.OtherDebtsShortTermDebts1, (int)ScoresForBusinessResults.OtherDebtsShortTermDebts2, (int)ScoresForBusinessResults.OtherDebtsShortTermDebts3, (int)ScoresForBusinessResults.OtherDebtsShortTermDebts4, (int)ScoresForBusinessResults.OtherDebtsShortTermDebts5, (int)ScoresForBusinessResults.OtherDebtsShortTermDebts6, (int)ScoresForBusinessResults.OtherDebtsShortTermDebts7, (int)ScoresForBusinessResults.OtherDebtsShortTermDebts8, (int)ScoresForBusinessResults.OtherDebtsShortTermDebts9, (int)ScoresForBusinessResults.OtherDebtsShortTermDebts10); model.OtherDebtsShortTermDebtsStart = _outStart * minusOne; model.OtherDebtsShortTermDebtsEnd = _outEnd * minusOne; #endregion #endregion #region Долгосрочные долги #region Долгосрочные банковские займы Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.CreditsForLongerThanOneYear1, (int)ScoresForBusinessResults.CreditsForLongerThanOneYear2); model.CreditsForLongerThanOneYearStart = _outStart * minusOne; model.CreditsForLongerThanOneYearEnd = _outEnd * minusOne; #endregion #region Задолженность перед контрагентами Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.PayablesToSuppliersLongTermDebts); model.PayablesToSuppliersLongTermDebtsStart = _outStart * minusOne; model.PayablesToSuppliersLongTermDebtsEnd = _outEnd * minusOne; #endregion #region Отложеннные налоговая задолженность Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.DefferedTaxDebts); model.DefferedTaxDebtsStart = _outStart * minusOne; model.DefferedTaxDebtsEnd = _outEnd * minusOne; #endregion #region Прочая задолженность Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.OtherDebtsLongTermDebts1, (int)ScoresForBusinessResults.OtherDebtsLongTermDebts2, (int)ScoresForBusinessResults.OtherDebtsLongTermDebts3, (int)ScoresForBusinessResults.OtherDebtsLongTermDebts4); model.OtherDebtsLongTermDebtsStart = _outStart * minusOne; model.OtherDebtsLongTermDebtsEnd = _outEnd * minusOne; #endregion #endregion #region Собственный капитал #region Уставной капитал Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.AuthorizedCapital1, (int)ScoresForBusinessResults.AuthorizedCapital2); model.AuthorizedCapitalStart = _outStart * minusOne; model.AuthorizedCapitalEnd = _outEnd * minusOne; #endregion #region Прочий капитал Calculate(out _outStart, out _outEnd, (int)ScoresForBusinessResults.OtherCapital); model.OtherCapitalStart = _outStart * minusOne; model.OtherCapitalEnd = _outEnd * minusOne; #endregion #endregion #region Итого // Сначала считаем пассивые, потом активы #region Текущая задолженность model.CalculateCurrentDebt(); #endregion #region Долгосрочная задолженность model.CalculateLongTermDebt(); #endregion #region Собственный капитал model.CalculateOwnCapital(); #endregion #region Оборотные активы model.CalculateCirculatingAssets(); #endregion #region Долгосрочные активы model.CalculateLongTermAssets(); #endregion #region Итого активов model.CalculateTotalAssets(); #endregion #region Итого пассивов model.CalculateTotalLiabilities(); #endregion #region Накопленная прибыль/убыток model.CalculateAccumulatedProfitAndLoss(); //Calculate(out _outStart, out _outEnd, // (int)ScoresForBusinessResults.AccumulatedProfitAndLoss); //model.AccumulatedProfitAndLossStart = _outStart; //model.AccumulatedProfitAndLossEnd = _outEnd; #endregion #endregion //model.StartDate = mainModel.StartDate.AddYears(mainModel.TimeSpan * -1); //model.EndDate = mainModel.EndDate.AddYears(mainModel.TimeSpan * -1); return model; } }
public static WorkingСapitalBusinessAnalysis GetWorkingСapitalBA(MainModel MainModel) { var model = new WorkingСapitalBusinessAnalysis(); model.myMoney = MainModel.BusinessResults.CirculatingAssetsEnd - MainModel.BusinessResults.CurrentDebtEnd; model.myCosts = MainModel.BusinessResults.CurrentDebtEnd; model.difmyMoney = model.myMoney - MainModel.GeneralBA.PastBisRes.CirculatingAssetsEnd - MainModel.GeneralBA.PastBisRes.CurrentDebtEnd; model.difmyMoneyByPercent = (MainModel.GeneralBA.PastBisRes.CirculatingAssetsEnd - MainModel.GeneralBA.PastBisRes.CurrentDebtEnd) != 0 ? model.difmyMoney / (MainModel.GeneralBA.PastBisRes.CirculatingAssetsEnd - MainModel.GeneralBA.PastBisRes.CurrentDebtEnd) * 100 : 0; model.difmyCosts = model.myCosts - MainModel.GeneralBA.PastBisRes.CurrentDebtEnd; model.difmyCostsByPercent = MainModel.GeneralBA.PastBisRes.CurrentDebtEnd != 0 ? model.difmyCosts / MainModel.GeneralBA.PastBisRes.CurrentDebtEnd * 100 : 0; model.stSokDiagram = new Dictionary<string, decimal>(); var st = ((Month)MainModel.StartDate.Month).ToString() + "," + MainModel.StartDate.AddYears(MainModel.TimeSpan * -1).Year.ToString(); var en = ((Month)MainModel.EndDate.Month).ToString() + "," + MainModel.EndDate.AddYears(MainModel.TimeSpan * -1).Year.ToString(); model.stSokDiagram.Add(st , MainModel.BusinessResults.CirculatingAssetsStart - MainModel.BusinessResults.CurrentDebtStart); model.stSokDiagram.Add(st + "-" + en, 0); model.stSokDiagram.Add(en, model.myMoney); model.profit = new Dictionary<string, decimal>(); model.profit.Add(st, 0); model.profit.Add(st + "-" + en, MainModel.GeneralBA.NetProfit); model.profit.Add(en, 0); model.stDebtsDiagram = new Dictionary<string, decimal>(); model.stDebtsDiagram.Add(st, MainModel.BusinessResults.CurrentDebtStart); model.stDebtsDiagram.Add(st + "-" + en, 0); model.stDebtsDiagram.Add(en, MainModel.BusinessResults.CurrentDebtEnd); model.turnoverDiagram = new Dictionary<string, decimal>(); var tr = (from sa in MainModel.Sales.SelectMany(_ => _.Sales) group sa by sa.GroupCode into g select new { code = g.FirstOrDefault().GroupCode, name = g.FirstOrDefault().GroupName, val = (g.FirstOrDefault().CountGoodsSt + g.FirstOrDefault().CountGoodsEnd == 0 ? 1 : g.Sum(_ => _.CostPrise) / (((g.Count() != 0 ? g.FirstOrDefault().CountGoodsSt + g.FirstOrDefault().CountGoodsEnd : 0)) / 2)) * (MainModel.EndDate - MainModel.StartDate).Days }).OrderByDescending(_ => _.val).ToList(); var ttC = 3; if (tr.Count < 3) ttC = tr.Count; for (var i = 0; i < ttC; i++) model.turnoverDiagram.Add(tr[i].name, tr[i].val); model.turnoverDiagram.Add("Прочее", tr.Sum(_ => _.val) - model.turnoverDiagram.Sum(_ => _.Value)); DateTime sty = MainModel.StartDate; DateTime eny = MainModel.EndDate; BusinessResults tmpBR = new BusinessResults(); model.aveDZDiagram = new Dictionary<string, decimal>(); model.aveGoodsDiagram = new Dictionary<string, decimal>(); model.aveMoneyDiagram = new Dictionary<string, decimal>(); model.aveSalesDiagram = new Dictionary<string, decimal>(); model.DZ_dzVsKzDiagram = new Dictionary<string, decimal>(); model.KZ_dzVsKzDiagram = new Dictionary<string, decimal>(); var isMoreYear = (MainModel.EndDate - MainModel.StartDate).Days > 365; foreach (var item in MainModel.Sales) { MainModel.StartDate = item.Date; MainModel.EndDate = item.Date.AddMonths(1); // можно оптимизировать это, изначально это считается сразу за весь период, можно в первоначальной загрузке разбить по месяцам, // но это только если эта штука нужна будет еще где-то, если только тут, выгоды особой не будет, еще вариант вытаскивать не суммы, // а массивы данных по счетам в массивы данных с датой и на клиенте ворочать, но я думаю это тоже трешак их может быть овер 100 000 по каждому tmpBR = GetBusinessResults(MainModel, true); var mm = MainModel.IsItQuarter || isMoreYear ? string.Format("{0}, {1}", (Month)item.Date.Month, item.Date.Year) : ((Month)item.Date.Month).ToString(); model.aveDZDiagram.Add(mm, (tmpBR.DebtsOfCustomersAndOverpaymentsStart + tmpBR.DebtsOfCustomersAndOverpaymentsEnd) / 2); model.aveGoodsDiagram.Add(mm, (tmpBR.RawAndMaterialsStart + tmpBR.RawAndMaterialsEnd) / 2); model.aveMoneyDiagram.Add(mm, (tmpBR.CashInCashBoxStart + tmpBR.MoneyInTheBankAccountsStart + tmpBR.CashInCashBoxEnd + tmpBR.MoneyInTheBankAccountsEnd) / 2); model.aveSalesDiagram.Add(mm, item.Sales.Sum(_ => _.SalesWithoutNDS)); model.KZ_dzVsKzDiagram.Add(mm, (tmpBR.DebtsOfCustomersAndOverpaymentsStart + tmpBR.DebtsOfCustomersAndOverpaymentsEnd) / 2); model.DZ_dzVsKzDiagram.Add(mm, (tmpBR.PayablesToSuppliersShortTermDebtsStart + tmpBR.PayablesToSuppliersShortTermDebtsEnd) / 2); } MainModel.StartDate = sty; MainModel.EndDate = eny; return model; }