using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; using Dapper; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using RecruitmentDAL.DTO.Reports; namespace RecruitmentDAL.Reports { public class HrRecruitmentAnalyticsReportDAL : IHrRecruitmentAnalyticsReportDAL { private readonly IQueryExecutor _queryExecutor; public HrRecruitmentAnalyticsReportDAL(IQueryExecutor queryExecutor) { _queryExecutor = queryExecutor; } public async Task> GetHrRecruitmentAnalytics( int firstNumber, int maxResult, RecruitmentReportCriteria criteria, LoginDTO login, CancellationToken ct) { var (filter, parameters) = BuildFilter(criteria, login); parameters.Add("Offset", Math.Max(0, firstNumber - 1)); parameters.Add("PageSize", maxResult > 0 ? maxResult : 500); var sql = HrRecruitmentAnalyticsReportQB.GET_HR_RECRUITMENT_ANALYTICS.Replace("{HiredDateFilter}", filter); return await _queryExecutor .QueryPagedAsync(login, sql, parameters) .ConfigureAwait(false); } public async IAsyncEnumerable GetHrRecruitmentAnalyticsStream( int firstNumber, int maxResult, RecruitmentReportCriteria criteria, LoginDTO login, [EnumeratorCancellation] CancellationToken ct) { var (filter, parameters) = BuildFilter(criteria, login); var sql = HrRecruitmentAnalyticsReportQB.GET_HR_RECRUITMENT_ANALYTICS.Replace("{HiredDateFilter}", filter); await foreach (var row in _queryExecutor .QueryStreamAsync(login, sql, parameters, ct) .ConfigureAwait(false)) { yield return row; } } private static (string Filter, DynamicParameters Parameters) BuildFilter( RecruitmentReportCriteria criteria, LoginDTO login) { var filter = new StringBuilder(); var p = new DynamicParameters(); p.Add("TenantId", login.ClientId); RecruitmentReportFilterBuilder.AppendDateRange(filter, p, criteria, "H.STAGEENTEREDON"); return (filter.ToString(), p); } } }