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 RecruiterWorkloadReportDAL : IRecruiterWorkloadReportDAL { private readonly IQueryExecutor _queryExecutor; public RecruiterWorkloadReportDAL(IQueryExecutor queryExecutor) { _queryExecutor = queryExecutor; } public async Task> GetRecruiterWorkload( int firstNumber, int maxResult, RecruitmentReportCriteria criteria, LoginDTO login, CancellationToken ct) { var (filter, closedDateFilter, parameters) = BuildFilter(criteria, login); parameters.Add("Offset", Math.Max(0, firstNumber - 1)); parameters.Add("PageSize", maxResult > 0 ? maxResult : 500); var sql = RecruiterWorkloadReportQB.GET_RECRUITER_WORKLOAD .Replace("{AssignedRecruiterFilter}", filter) .Replace("{ClosedDateFilter}", closedDateFilter); return await _queryExecutor .QueryPagedAsync(login, sql, parameters) .ConfigureAwait(false); } public async IAsyncEnumerable GetRecruiterWorkloadStream( int firstNumber, int maxResult, RecruitmentReportCriteria criteria, LoginDTO login, [EnumeratorCancellation] CancellationToken ct) { var (filter, closedDateFilter, parameters) = BuildFilter(criteria, login); var sql = RecruiterWorkloadReportQB.GET_RECRUITER_WORKLOAD .Replace("{AssignedRecruiterFilter}", filter) .Replace("{ClosedDateFilter}", closedDateFilter); await foreach (var row in _queryExecutor .QueryStreamAsync(login, sql, parameters, ct) .ConfigureAwait(false)) { yield return row; } } private static (string Filter, string ClosedDateFilter, DynamicParameters Parameters) BuildFilter( RecruitmentReportCriteria criteria, LoginDTO login) { var filter = new StringBuilder(); var closedDateFilter = new StringBuilder(); var p = new DynamicParameters(); p.Add("TenantId", login.ClientId); RecruitmentReportFilterBuilder.AppendAssignedRecruiter(filter, p, criteria, "JR.ASSIGNEDRECRUITERID"); RecruitmentReportFilterBuilder.AppendDateRange(closedDateFilter, p, criteria, "JR.MODIFIEDON"); return (filter.ToString(), closedDateFilter.ToString(), p); } } }