public IQueryResult Execute(string expr, IEntitiesSerializer serializer) { expr = expr.Rest(); var rev = true; var val = Parsing.Double(ref expr); var curr = Parsing.Token(ref expr).ToUpperInvariant(); if (!val.HasValue) { rev = false; val = Parsing.DoubleF(ref expr); } var date = Parsing.UniqueTime(ref expr) ?? ClientDateTime.Today; Parsing.Eof(expr); var res = rev ? ExchangeFactory.Instance.To(date, curr) : ExchangeFactory.Instance.From(date, curr); return(new PlainText((res * val.Value).ToString("R"))); }
/// <inheritdoc /> public override async IAsyncEnumerable<string> Execute(string expr, Session session) { var remark = Parsing.Token(ref expr); var rate = Parsing.DoubleF(ref expr) / 10000D; var all = Parsing.Optional(ref expr, "all"); var endDate = !all ? Parsing.UniqueTime(ref expr, session.Client) : null; Parsing.Eof(expr); var loans = (await session.Accountant.RunGroupedQueryAsync($"({MajorFilter()})-\"\" ``rtcC")).Items .Cast<ISubtotalRemark>() .ToList(); var rmkObj = loans.Single( b => b.Remark?.StartsWith(remark, StringComparison.InvariantCultureIgnoreCase) == true && !b.Remark.EndsWith("-利息", StringComparison.Ordinal)); var titleObj = rmkObj.Items.Cast<ISubtotalTitle>().Single(); var cntObj = titleObj.Items.Cast<ISubtotalContent>().Single(); var title = titleObj.Title!.Value; var content = cntObj.Content; var rmk = rmkObj.Remark; var currency = cntObj.Items.Cast<ISubtotalCurrency>().Single().Currency; var info = new LoanInfo { Currency = currency, Title = title, Content = content, Remark = rmk, Rate = rate, }; await using var vir = session.Accountant.Virtualize(); if (!all && !endDate.HasValue || endDate.HasValue) { var lastD = (await session.Accountant.RunVoucherQueryAsync(info.QueryInterest()) .OrderByDescending(static v => v.Date, new DateComparer())
/// <inheritdoc /> public override IQueryResult Execute(string expr, IEntitiesSerializer serializer) { var content = Parsing.Token(ref expr); var avg = Parsing.DoubleF(ref expr); Parsing.Eof(expr); var tdy = ClientDateTime.Today; var ldom = AccountantHelper.LastDayOfMonth(tdy.Year, tdy.Month); var srng = new DateFilter(new DateTime(tdy.Year, tdy.Month, 1, 0, 0, 0, DateTimeKind.Utc), tdy); var balance = Accountant.RunGroupedQuery( $"T1002 {content.Quotation('\'')} [~{tdy.AsDate()}]`vD{srng.AsDateRange()}"); var bal = 0D; var btd = 0D; foreach (var b in balance.Items.Cast <ISubtotalDate>()) { if (b.Date == tdy) { btd += b.Fund; } else { bal += b.Fund; } } var targ = ldom.Day * avg; var sb = new StringBuilder(); sb.AppendLine($"Target: {targ.AsCurrency()}"); sb.AppendLine($"Balance until yesterday: {bal.AsCurrency()}"); if ((bal - targ).IsNonNegative()) { sb.AppendLine("Achieved."); sb.AppendLine(); sb.AppendLine( (btd - avg).IsNonNegative() ? $"Plan A: Credit {(btd - avg).AsCurrency()}, Balance {avg.AsCurrency()}" : $"Plan A: Debit {(avg - btd).AsCurrency()}, Balance {avg.AsCurrency()}"); sb.AppendLine("Plan B: No Action"); } else { var res = targ - bal; var rsd = ldom.Day - tdy.Day + 1; sb.AppendLine($"Deficiency: {res.AsCurrency()}"); var avx = res / rsd; if ((rsd * avg - res).IsNonNegative()) { sb.AppendLine($"Average deficiency: {avx.AsCurrency()} <= {avg.AsCurrency()}"); sb.AppendLine(); sb.AppendLine( (btd - avx).IsNonNegative() ? $"Plan A: Credit {(btd - avx).AsCurrency()}, Balance {avx.AsCurrency()}" : $"Plan A: Debit {(avx - btd).AsCurrency()}, Balance {avx.AsCurrency()}"); sb.AppendLine( (btd - avg).IsNonNegative() ? $"Plan B: Credit {(btd - avg).AsCurrency()}, Balance {avg.AsCurrency()}" : $"Plan B: Debit {(avg - btd).AsCurrency()}, Balance {avg.AsCurrency()}"); } else { sb.AppendLine($"Average deficiency: {avx.AsCurrency()} > {avg.AsCurrency()}"); sb.AppendLine(); sb.AppendLine( (btd - avx).IsNonNegative() ? $"Plan: Credit {(btd - avx).AsCurrency()}, Balance {avx.AsCurrency()}" : $"Plan: Debit {(avx - btd).AsCurrency()}, Balance {avx.AsCurrency()}"); } } return(new PlainText(sb.ToString())); }
/// <inheritdoc /> public override IQueryResult Execute(string expr, IEntitiesSerializer serializer) { var remark = Parsing.Token(ref expr); var rate = Parsing.DoubleF(ref expr) / 10000D; var all = Parsing.Optional(ref expr, "all"); var endDate = !all ? Parsing.UniqueTime(ref expr) : null; Parsing.Eof(expr); var loans = Accountant.RunGroupedQuery($"({MajorFilter()})-\"\" ``rtcC").Items .Cast<ISubtotalRemark>() .ToList(); var rmkObj = loans.Single( b => b.Remark?.StartsWith(remark, StringComparison.InvariantCultureIgnoreCase) == true && !b.Remark.EndsWith("-利息", StringComparison.Ordinal)); var titleObj = rmkObj.Items.Cast<ISubtotalTitle>().Single(); var cntObj = titleObj.Items.Cast<ISubtotalContent>().Single(); // ReSharper disable once PossibleInvalidOperationException var title = titleObj.Title.Value; var content = cntObj.Content; var rmk = rmkObj.Remark; var currency = cntObj.Items.Cast<ISubtotalCurrency>().Single().Currency; var info = new LoanInfo { Currency = currency, Title = title, Content = content, Remark = rmk, Rate = rate }; if (!all && !endDate.HasValue || endDate.HasValue) { // ReSharper disable once PossibleInvalidOperationException var lastD = Accountant.RunVoucherQuery(info.QueryInterest(this)) .OrderByDescending(v => v.Date, new DateComparer()) .FirstOrDefault() ?.Date ?? Accountant.RunVoucherQuery(info.QueryCapital(this)) .OrderBy(v => v.Date, new DateComparer()) .First() .Date.Value; var capQuery = $"{info.QueryCapital(this)} [~{lastD.AsDate()}]``v"; var intQuery = $"{info.QueryInterest(this)} [~{lastD.AsDate()}]``v"; var capitalIntegral = Accountant.RunGroupedQuery(capQuery).Fund; var interestIntegral = Accountant.RunGroupedQuery(intQuery).Fund; Regularize( info, ref capitalIntegral, ref interestIntegral, lastD, endDate ?? ClientDateTime.Today); } else { var capitalIntegral = 0D; var interestIntegral = 0D; Regularize( info, ref capitalIntegral, ref interestIntegral, null, ClientDateTime.Today); } return new DirtySucceed(); }