using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using _0_Framework.Application; using AccountMangement.Infrastructure.EFCore; using Company.Domain.EmployeeAgg; using Company.Domain.ReportAgg; using Company.Domain.WorkshopEmployerAgg; using CompanyManagment.App.Contracts.LeftWork; using CompanyManagment.App.Contracts.Report; using Microsoft.EntityFrameworkCore; using PersianTools.Core; namespace CompanyManagment.EFCore.Repository; public class ReportRepository : IReportRepository { private readonly CompanyContext _context; private readonly AccountContext _accountContext; public ReportRepository(CompanyContext context, AccountContext accountContext) { _context = context; _accountContext = accountContext; } //public AllReport getAll(string year, string month) //{ // var watch = System.Diagnostics.Stopwatch.StartNew(); // //یافتن آغاز و پایان ماه جاری // //یافتن آغاز و پایان ماه بعد // #region FindMonthStartAndEnd // string nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; // if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) // nowFa = $"{year}/{month}/01"; // var currentEndOfMonth = nowFa.FindeEndOfMonth(); // //شروع ماه جاری // var currentMonthStart = nowFa.ToGeorgianDateTime(); // // پایان کاه جاری // var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); // int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); // var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); // var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); // //شروع ماه بعد // var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); // //پایان ماه بعد // var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); // #endregion // // کاهش درخواست‌های تکراری به پایگاه داده // var checkoutAccountLeftWorks = _accountContext.AccountLeftWorks // .Where(x => x.RoleId == 5 && x.StartWorkGr < currentMonthEnd && x.LeftWorkGr > currentMonthStart) // .Select(x => new { x.WorkshopId, x.AccountId }).ToList(); // var allCheckoutAccountLeftWorkWorkshopIds = checkoutAccountLeftWorks.Select(x => x.WorkshopId).Distinct().ToList(); // var checkoutWorkshopEmployer = _context.WorkshopEmployers // .Where(x => allCheckoutAccountLeftWorkWorkshopIds.Contains(x.WorkshopId)) // .Include(x => x.Employer.ContractingParty) // .Where(x => x.Employer.ContractingParty.IsBlock != "true" && x.Employer.ContractingParty.IsActiveString == "true" && x.Workshop.IsActiveString == "true") // .ToList(); // var checkoutWithOutInstitutionContract = checkoutWorkshopEmployer // .Where(x => x.Employer.ContractingPartyId == 30428) // .Select(x => x.WorkshopId) // .ToList(); // var checkoutFindHasInstitutionContract = _context.InstitutionContractSet // .Where(c => c.ContractStartGr <= currentMonthStart && c.ContractEndGr >= currentMonthEnd) // .Select(c => c.ContractingPartyId) // .ToHashSet(); // var checkoutWithInstitutionContract = checkoutWorkshopEmployer // .Where(x => x.Employer.ContractingPartyId != 30428 && checkoutFindHasInstitutionContract.Contains(x.Employer.ContractingPartyId)) // .Select(x => x.WorkshopId) // .Distinct() // .ToList(); // var checkoutMixWitAndWitOut = checkoutWithInstitutionContract.Concat(checkoutWithOutInstitutionContract).Distinct().ToList(); // var allCheckoutLeftworks = _context.LeftWorkList // .Where(x => checkoutMixWitAndWitOut.Contains(x.WorkshopId) && x.StartWorkDate <= currentMonthEnd && x.LeftWorkDate > currentMonthStart) // .Select(x => x.EmployeeId) // .ToHashSet(); // var allCheckoutCreated = _context.CheckoutSet // .Where(x => allCheckoutLeftworks.Contains(x.EmployeeId) && x.ContractStart.Date >= currentMonthStart.Date && x.ContractEnd.Date <= currentMonthEnd.Date && x.IsActiveString == "true") // .ToList(); // var allCheckoutSigned = allCheckoutCreated.Count(x => x.Signature == "1"); // // بهینه‌سازی و کاهش پردازش‌های اضافی // var checkoutPercent = allCheckoutLeftworks.Count > 0 ? (allCheckoutCreated.Count * 100) / allCheckoutLeftworks.Count : 0; // var checkoutSignaturePercent = allCheckoutCreated.Count > 0 ? (allCheckoutSigned * 100) / allCheckoutCreated.Count : 0; // return new AllReport // { // CheckoutPercent = checkoutPercent, // CheckoutSignaturePercent = checkoutSignaturePercent, // // سایر فیلدهای موردنیاز // }; //} //public async Task GetAllActiveWorkshopsNew(string year, string month) //{ // var watch = System.Diagnostics.Stopwatch.StartNew(); // // Parse the start and end dates for the current and next months // #region FindMonthStartAndEnd // string nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; // if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) // nowFa = $"{year}/{month}/01"; // var currentEndOfMonth = nowFa.FindeEndOfMonth(); // //شروع ماه جاری // var currentMonthStart = nowFa.ToGeorgianDateTime(); // // پایان کاه جاری // var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); // int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); // var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); // var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); // //شروع ماه بعد // var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); // //پایان ماه بعد // var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); // #endregion // // Preload data to reduce database calls // var accountLeftWorks = await _accountContext.AccountLeftWorks // .Where(x => x.RoleId == 5) // .ToListAsync(); // var leftWorkList = await _context.LeftWorkList // .Where(x => x.StartWorkDate <= nextMonthEnd && x.LeftWorkDate > currentMonthStart) // .ToListAsync(); // var institutionContracts = await _context.InstitutionContractSet // .Where(c => c.ContractStartGr <= nextMonthEnd && c.ContractEndGr >= currentMonthStart) // .ToListAsync(); // var accounts = await _accountContext.Accounts // .Where(x => x.RoleId == 5) // .ToListAsync(); // // Filter workshops // var activeWorkshops = await _context.WorkshopEmployers // .Include(x => x.Workshop) // .Include(x => x.Employer.ContractingParty) // .Where(x => x.Workshop.IsActiveString == "true" && // x.Employer.ContractingParty.IsActiveString == "true" && // x.Employer.ContractingParty.IsBlock != "true") // .ToListAsync(); // // Group workshops by contract type // var workshopsWithContracts = activeWorkshops // .Where(x => institutionContracts.Any(c => c.ContractingPartyId == x.Employer.ContractingPartyId)) // .Select(x => x.WorkshopId) // .Distinct() // .ToList(); // var workshopsWithoutContracts = activeWorkshops // .Where(x => x.Employer.ContractingPartyId == 30428) // .Select(x => x.WorkshopId) // .Distinct() // .ToList(); // var allWorkshops = workshopsWithContracts.Concat(workshopsWithoutContracts).Distinct().ToList(); // // Calculate left works and contracts // var leftWorks = leftWorkList // .Where(x => allWorkshops.Contains(x.WorkshopId)) // .ToList(); // var leftWorkEmployeeIds = leftWorks.Select(x => x.EmployeeId).ToHashSet(); // var contracts = await _context.Contracts // .Where(x => leftWorkEmployeeIds.Contains(x.EmployeeId) && // x.ContarctStart.Date <= nextMonthEnd.Date && // x.ContractEnd.Date > nextMonthStart.Date && // x.IsActiveString == "true") // .ToListAsync(); // var signedContracts = contracts.Count(x => x.Signature == "1"); // // Calculate checkouts // var checkouts = await _context.CheckoutSet // .Where(x => leftWorkEmployeeIds.Contains(x.EmployeeId) && // x.ContractStart.Date >= currentMonthStart.Date && // x.ContractEnd.Date <= currentMonthEnd.Date && // x.IsActiveString == "true") // .ToListAsync(); // var signedCheckouts = checkouts.Count(x => x.Signature == "1"); // // Calculate percentages // var contractToBe = leftWorks.Count; // var createdContracts = contracts.Count; // var checkoutToBe = leftWorks.Count; // var createdCheckouts = checkouts.Count; // var contractPercent = contractToBe > 0 ? (createdContracts * 100) / contractToBe : 0; // var contractSignaturePercent = createdContracts > 0 ? (signedContracts * 100) / createdContracts : 0; // var checkoutPercent = checkoutToBe > 0 ? (createdCheckouts * 100) / checkoutToBe : 0; // var checkoutSignaturePercent = createdCheckouts > 0 ? (signedCheckouts * 100) / createdCheckouts : 0; // // Prepare the final result // var finalResult = new AllReport // { // AllPercent = (contractPercent + contractSignaturePercent + checkoutPercent + checkoutSignaturePercent) / 4, // ContractPercent = contractPercent, // ContractSignaturePercent = contractSignaturePercent, // CheckoutPercent = checkoutPercent, // CheckoutSignaturePercent = checkoutSignaturePercent, // Year = $"{currentMonthStart.Year}", // Month = nowFa.Substring(5, 2), // AllContract = contractToBe, // ContractNotDone = contractToBe - createdContracts, // ContrcatDone = createdContracts, // ContractSignNotDone = createdContracts - signedContracts, // ContractSignDone = signedContracts, // AllCheckout = checkoutToBe, // CheckoutNotDone = checkoutToBe - createdCheckouts, // CheckoutDone = createdCheckouts, // CheckoutSignDone = signedCheckouts, // CheckoutSignNotDone = createdCheckouts - signedCheckouts // }; // Console.WriteLine("Optimized method execution time: " + watch.Elapsed); // return finalResult; //} public async Task GetAllActiveWorkshopsNew(string year, string month) { var watch = System.Diagnostics.Stopwatch.StartNew(); var watchAllProssec = System.Diagnostics.Stopwatch.StartNew(); //یافتن آغاز و پایان ماه جاری //یافتن آغاز و پایان ماه بعد #region FindMonthStartAndEnd string nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) nowFa = $"{year}/{month}/01"; var currentEndOfMonth = nowFa.FindeEndOfMonth(); //شروع ماه جاری var currentMonthStart = nowFa.ToGeorgianDateTime(); // پایان کاه جاری var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); //شروع ماه بعد var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); //پایان ماه بعد var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #endregion Console.ForegroundColor = ConsoleColor.Yellow; var byWorkshopDisabledCheck = await _context.Workshops.Select(x => new { x.id, x.CreateContract, x.SignContract, x.CreateCheckout, x.SignCheckout }).ToListAsync(); var byEmployeeDisabledCheck = await _context.EmployeeComputeOptionsSet .Select(x => new { x.EmployeeId, x.WorkshopId, x.CreateContract, x.SignContract, x.CreateCheckout, x.SignCheckout }).ToListAsync(); #region checkout //یاتن اکانتهای قراداد ساده var checkoutAccountLeftWorks = await _accountContext.AccountLeftWorks.AsSplitQuery() .Where(x => x.RoleId == 5) .Where(x => x.StartWorkGr < currentMonthEnd && x.LeftWorkGr > currentMonthStart).ToListAsync(); var allCheckoutAccountLeftWorkWorkshopIds = checkoutAccountLeftWorks.Select(x => x.WorkshopId).ToList(); //یافتن کارگاه هایی که فعال هستند و طرف حساب انها فعال است var checkoutWorkshopEmployer =await _context.WorkshopEmployers.AsSplitQuery() .Where(x => allCheckoutAccountLeftWorkWorkshopIds.Contains(x.WorkshopId)) .Include(x => x.Workshop).AsSplitQuery() .Include(x => x.Employer) .ThenInclude(x => x.ContractingParty) .Where(x => x.Employer.ContractingParty.IsBlock != "true" && x.Employer.ContractingParty.IsActiveString == "true") .Where(x => x.Workshop.IsActiveString == "true").ToListAsync(); Console.WriteLine("checkoutWorkshopEmployer --->" + watch.Elapsed); watch.Stop(); watch.Restart(); //یافتن کارگاه های استثنا بدون قردادمالی var checkoutWithOutInstitutionContract = checkoutWorkshopEmployer.Where(x => x.Employer.ContractingPartyId == 30428) .GroupBy(x => x.Workshop).Select(x => x.Key.id); Console.WriteLine("checkoutWithOutInstitutionContract --->" + watch.Elapsed); watch.Stop(); watch.Restart(); //یافتن قردادمالی برای کارگاه های یافت شده در تاریخ مورد نظر var checkoutFindHasInstitutionContract =await _context.InstitutionContractSet.AsSplitQuery() .Where(c => c.ContractStartGr <= currentMonthStart && c.ContractEndGr >= currentMonthEnd) .Select(c => c.ContractingPartyId).ToListAsync(); Console.WriteLine("checkoutFindHasInstitutionContract --->" + watch.Elapsed); watch.Stop(); watch.Restart(); //فیلتر کارگاه های غیر استثنا با کمک کوئری بالا var checkoutWithInstitutionContract = checkoutWorkshopEmployer.Where(x => x.Employer.ContractingPartyId != 30428 && checkoutFindHasInstitutionContract.Contains(x.Employer.ContractingPartyId)).GroupBy(x => x.WorkshopId).Select(x => x.Key); Console.WriteLine("checkoutWithInstitutionContract --->" + watch.Elapsed); watch.Stop(); watch.Restart(); //ترکیب کارگاه های استثنا و دارای قراداد var checkoutMixWitAndWitOut = checkoutWithInstitutionContract.Concat(checkoutWithOutInstitutionContract); Console.WriteLine("Concat --->" + watch.Elapsed); watch.Stop(); watch.Restart(); //تمام پرسنل فعال برای تصفیه حساب در ماه مورد نظر var allCheckoutLeftworkList =await _context.LeftWorkList.AsSplitQuery() .Where(x => checkoutMixWitAndWitOut.Contains(x.WorkshopId)) .Where(x => x.StartWorkDate <= currentMonthEnd && x.LeftWorkDate > currentMonthStart).Select(x=> new { x.EmployeeId, x.WorkshopId}).ToListAsync(); Console.WriteLine("allCheckoutLeftworks --->" + watch.Elapsed); watch.Stop(); watch.Restart(); #region CreateCheckoutOptions var allCheckoutLeftworks = new List<(long EmployeeId, long WorkshopId)>(); foreach (var item in allCheckoutLeftworkList) { var toBeRemoveByEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopId); var toBeRemoveByWorkshop = byWorkshopDisabledCheck.FirstOrDefault(x => x.id == item.WorkshopId); if (toBeRemoveByEmployee != null) { if (toBeRemoveByEmployee.CreateCheckout) { var add = (item.EmployeeId, item.WorkshopId); allCheckoutLeftworks.Add(add); } } else { if (toBeRemoveByWorkshop.CreateCheckout) { var add = (item.EmployeeId, item.WorkshopId); allCheckoutLeftworks.Add(add); } } } #endregion var allCheckoutLeftworkEmployeeIds = allCheckoutLeftworks.Select(x => x.EmployeeId); var allCheckoutLeftworkWorkshopIds = allCheckoutLeftworks.Select(x => x.WorkshopId).ToList(); Console.WriteLine("allCheckoutLeftworkWorkshopIds --->" + watch.Elapsed); watch.Stop(); watch.Restart(); var allCheckoutToBeTople = allCheckoutLeftworks; //تمام تصفیه حساب های ایجاد شده ماه مورد نظر //var allCheckoutCreated =await _context.CheckoutSet.AsSplitQuery() // .Where(x => allCheckoutLeftworkEmployeeIds.Contains(x.EmployeeId) && allCheckoutLeftworkWorkshopIds.Contains(x.WorkshopId)) // .Where(x => // x.ContractStart.Date >= currentMonthStart.Date && x.ContractEnd.Date <= currentMonthEnd.Date && x.IsActiveString == "true").ToListAsync(); Console.WriteLine("allCheckout Created start --->" + watch.Elapsed); watch.Stop(); watch.Restart(); var allCheckoutCreated = await _context.CheckoutSet .Where(x => allCheckoutLeftworkWorkshopIds.Contains(x.WorkshopId) && x.ContractStart >= currentMonthStart && x.ContractEnd <= currentMonthEnd && x.IsActiveString == "true") .Select(x => new { x.id, x.EmployeeId, x.WorkshopId, x.Signature }) // فقط لازم‌ها .ToListAsync(); allCheckoutCreated = allCheckoutCreated.Where(x => allCheckoutLeftworkEmployeeIds.Contains(x.EmployeeId)) .ToList(); Console.WriteLine("allCheckout Created End --->" + watch.Elapsed); watch.Stop(); watch.Restart(); var allChekoutCreated = allCheckoutCreated.Select(x => x.WorkshopId).ToList(); Console.WriteLine("allCheckoutSignedList --->" + watch.Elapsed); watch.Stop(); watch.Restart(); #endregion #region Contracts //یاتن اکانتهای قراداد ساده var contractsAccountLeftWorks =await _accountContext.AccountLeftWorks.AsSplitQuery() .Where(x => x.RoleId == 5) .Where(x => x.StartWorkGr < nextMonthEnd && x.LeftWorkGr > nextMonthStart).ToListAsync(); var allContractAccountLeftWorkWorkshopIds = contractsAccountLeftWorks.Select(x => x.WorkshopId).ToList(); //#if DEBUG // contractsAccountLeftWorks = contractsAccountLeftWorks.Where(x => x.AccountId == 25); // allContractAccountLeftWorkWorkshopIds = allContractAccountLeftWorkWorkshopIds.Where(x=>x == 296).ToList(); //#endif //یافتن کارگاه هایی که فعال هستند و طرف حساب انها فعال است var contractWorkshopEmployer =await _context.WorkshopEmployers.AsSplitQuery() .Where(x => allContractAccountLeftWorkWorkshopIds.Contains(x.WorkshopId)) .Include(x => x.Workshop) .Include(x => x.Employer) .ThenInclude(x => x.ContractingParty) .Where(x => x.Employer.ContractingParty.IsBlock != "true" && x.Employer.ContractingParty.IsActiveString == "true") .Where(x => x.Workshop.IsActiveString == "true").ToListAsync(); Console.WriteLine("contractWorkshopEmployer --->" + watch.Elapsed); watch.Stop(); watch.Restart(); //یافتن کارگاه های استثنا بدون قردادمالی var contractWithOutInstitutionContract = contractWorkshopEmployer.Where(x => x.Employer.ContractingPartyId == 30428) .GroupBy(x => x.Workshop).Select(x => x.Key.id).ToList(); //یافتن قردادمالی برای کارگاه های یافت شده در تاریخ مورد نظر var contractFindHasInstitutionContract =await _context.InstitutionContractSet.AsSplitQuery() .Where(c => c.ContractStartGr <= nextMonthStart && c.ContractEndGr >= nextMonthEnd) .Select(c => c.ContractingPartyId).ToListAsync(); //فیلتر کارگاه های غیر استثنا با کمک کوئری بالا var contractWithInstitutionContract = contractWorkshopEmployer.Where(x => x.Employer.ContractingPartyId != 30428 && contractFindHasInstitutionContract .Contains(x.Employer.ContractingPartyId)).GroupBy(x => x.WorkshopId) .Select(x => x.Key).ToList(); //ترکیب کارگاه های استثنا و دارای قراداد var contractMixWitAndWitOut = contractWithInstitutionContract.Concat(contractWithOutInstitutionContract).ToList(); //تمام پرسنل فعال برای قراداد در ماه مورد نظر var allContractLeftworksList =await _context.LeftWorkList.AsSplitQuery() .Where(x => contractMixWitAndWitOut.Contains(x.WorkshopId)) .Where(x => x.StartWorkDate <= nextMonthEnd && x.LeftWorkDate > nextMonthStart).Select(x=> new {x.EmployeeId, x.WorkshopId}).ToListAsync(); #region CreateContractOptions var allContractLeftworks = new List<(long EmployeeId, long WorkshopId)>(); foreach (var item in allContractLeftworksList) { var toBeRemoveByEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopId); var toBeRemoveByWorkshop = byWorkshopDisabledCheck.FirstOrDefault(x => x.id == item.WorkshopId); if (toBeRemoveByEmployee != null) { if (toBeRemoveByEmployee.CreateContract) { var add = (item.EmployeeId, item.WorkshopId); allContractLeftworks.Add(add); } } else { if (toBeRemoveByWorkshop.CreateContract) { var add = (item.EmployeeId, item.WorkshopId); allContractLeftworks.Add(add); } } } #endregion //تمام قرارداد های ایجاد شده ماه مورد نظر var allContractLeftworkEmployeeIds = allContractLeftworks.Select(x => x.EmployeeId); var allContracToBeTople = allContractLeftworks; var allContractLeftworkWorkshopIds = allContractLeftworks.Select(x => x.WorkshopId).ToList(); //var allContractCreated =await _context.Contracts.AsSplitQuery() // .Where(x => allContractLeftworkEmployeeIds.Contains(x.EmployeeId) && allContractLeftworkWorkshopIds.Contains(x.WorkshopIds)) // .Where(x => // x.ContarctStart.Date <= nextMonthEnd.Date && x.ContractEnd.Date > nextMonthStart.Date && x.IsActiveString == "true").ToListAsync(); Console.WriteLine("allContractCreated start --->" + watch.Elapsed); watch.Stop(); watch.Restart(); var allContractCreated = await _context.Contracts .Where(x => allContractLeftworkWorkshopIds.Contains(x.WorkshopIds) && x.ContarctStart <= nextMonthEnd && x.ContractEnd > nextMonthStart && x.IsActiveString == "true") .Select(x => new { x.id, x.EmployeeId, x.WorkshopIds, x.Signature }) // فقط لازم‌ها .ToListAsync(); allContractCreated = allContractCreated.Where(x => allContractLeftworkEmployeeIds.Contains(x.EmployeeId)) .ToList(); Console.WriteLine("allContractCreated end --->" + watch.Elapsed); watch.Stop(); watch.Restart(); var allContractCreatedlist = allContractCreated.Select(x => x.WorkshopIds).ToList(); //قرارداد هایی که باید ایجاد می شد var contractToBe = allContractLeftworks.Count(); //قراردادهای ایجاد شده var createdContracts = allContractCreated.Count(); Console.WriteLine("contractsToBe : " + allContractLeftworks.Count()); Console.WriteLine("contracts created: " + allContractCreated.Count()); #region signContractOptions var allContractSignedCounter = 0; var allContractSignedListWorkshopId = new List(); var contractSignToBe = 0; var allContractSignToBeListWorkshopId = new List(); foreach (var item in allContractCreated) { var byEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopIds); var byWorkshop = byWorkshopDisabledCheck.FirstOrDefault(x => x.id == item.WorkshopIds); if (byEmployee != null) { if (byEmployee.SignContract) { contractSignToBe += 1; allContractSignToBeListWorkshopId.Add(item.WorkshopIds); if (item.Signature == "1") { allContractSignedCounter += 1; allContractSignedListWorkshopId.Add(item.WorkshopIds); } } } else { if (byWorkshop.SignContract) { contractSignToBe += 1; allContractSignToBeListWorkshopId.Add(item.WorkshopIds); if (item.Signature == "1") { allContractSignedCounter += 1; allContractSignedListWorkshopId.Add(item.WorkshopIds); } } } } #endregion #region signCheckoutOptions var allCheckoutSignedCounter = 0; var allCheckoutSignedListWorkshopId = new List(); var checkoutSignToBe = 0; var allCheckoutSignToBeListWorkshopId = new List(); foreach (var item in allCheckoutCreated) { var byEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopId); var byWorkshop = byWorkshopDisabledCheck.FirstOrDefault(x => x.id == item.WorkshopId); if (byEmployee != null) { if (byEmployee.SignCheckout) { checkoutSignToBe += 1; allCheckoutSignToBeListWorkshopId.Add(item.WorkshopId); if (item.Signature == "1") { allCheckoutSignedCounter += 1; allCheckoutSignedListWorkshopId.Add(item.WorkshopId); } } } else { if (byWorkshop.SignCheckout) { checkoutSignToBe += 1; allCheckoutSignToBeListWorkshopId.Add(item.WorkshopId); if (item.Signature == "1") { allCheckoutSignedCounter += 1; allCheckoutSignedListWorkshopId.Add(item.WorkshopId); } } } } #endregion #endregion //تصفیه حساب هایی که امضاء شده var allCheckoutSigned = allCheckoutSignedCounter; var allCheckoutSignedList = allCheckoutSignedListWorkshopId; //قرارداد هایی که امضاء شده var allContractSigned = allContractSignedCounter; var allContractSignedList = allContractSignedListWorkshopId; // قراداد های امضاء شده var signedContracts = allContractSigned; // تصفیه هایی که باید ایجاد می شد var checkoutToBe = allCheckoutLeftworks.Count(); // تصفیه های ایجاد شده var createdCheckouts = allCheckoutCreated.Count(); //تصفیه های امضاء شده var signedChckouts = allCheckoutSignedCounter; Console.WriteLine("contracts signed: " + allContractSigned); Console.WriteLine("checkoutsToBe : " + allCheckoutLeftworks.Count()); Console.WriteLine("checkouts created: " + allCheckoutCreated.Count()); Console.WriteLine("checkouts signed: " + allCheckoutSignedCounter); var accounts = await _accountContext.Accounts.Where(x => x.RoleId == 5).ToListAsync(); #region checkoutAccounts var checkoutAccountGroup = checkoutAccountLeftWorks .Where(x => allCheckoutLeftworkWorkshopIds.Contains(x.WorkshopId)) .GroupBy(x => x.AccountId).Select(x => new AccountResults() { AccountId = x.Key, AccountFullName = accounts.FirstOrDefault(a => a.id == x.Key)!.Fullname, WorkshopList = x.Select(w => w.WorkshopId).ToList() // CheckoutDonePercent = (x.Sum(c => c.) * 100) / x.Sum(c => c.CheckoutLeftWorkCount), //CheckoutSignPercent = x.Sum(c => c.CheckoutDoneCount) > 0 ? (x.Sum(c => c.CheckoutSignDoneCount) * 100) / (x.Sum(c => c.CheckoutDoneCount)) : 0, }).AsEnumerable(); var checkoutAccountGroupresult = checkoutAccountGroup.Select(grouped => { var toBe = allCheckoutLeftworkWorkshopIds.Where(n => grouped.WorkshopList.Contains(n)).ToList(); int checkoutToBe = toBe.Count; int createdCheckouts = allContractCreatedlist.Count(n => grouped.WorkshopList.Contains(n)); int signedCheckout = allCheckoutSignedListWorkshopId.Count(n => grouped.WorkshopList.Contains(n)); int signToBeCheckout = allCheckoutSignToBeListWorkshopId.Count(n => grouped.WorkshopList.Contains(n)); if (checkoutToBe > 0) { return new AccountResults() { WorkshopList = grouped.WorkshopList, AccountId = grouped.AccountId, AccountFullName = grouped.AccountFullName, CheckoutDonePercent = (createdCheckouts * 100) / checkoutToBe, CheckoutSignPercent = signToBeCheckout > 0 ? (signedCheckout * 100) / signToBeCheckout : 0, }; } else { return new AccountResults() { AccountId = 0, }; } }).Where(x => x.AccountId > 0).ToList(); #endregion #region contractAccouns var contractAccountGroup = contractsAccountLeftWorks .Where(x => allContractLeftworkWorkshopIds.Contains(x.WorkshopId)) .GroupBy(x => x.AccountId).Select(x => new AccountResults() { AccountId = x.Key, AccountFullName = accounts.FirstOrDefault(a => a.id == x.Key)!.Fullname, WorkshopList = x.Select(w => w.WorkshopId).ToList() }).AsEnumerable(); var contractAccountGroupResult = contractAccountGroup.Select(grouped => { var toBe = allContractLeftworkWorkshopIds.Where(n => grouped.WorkshopList.Contains(n)).ToList(); //var toBe = grouped.WorkshopList.Where(n => allContractLeftworkWorkshopIds.Contains(n)).ToList(); int contractToBe = toBe.Count; int createdContracts = allContractCreatedlist.Count(n => grouped.WorkshopList.Contains(n)); int signedContracts = allContractSignedList.Count(n => grouped.WorkshopList.Contains(n)); int signToBeContract = allContractSignToBeListWorkshopId.Count(n => grouped.WorkshopList.Contains(n)); if (contractToBe > 0) { return new AccountResults() { WorkshopList = grouped.WorkshopList, AccountId = grouped.AccountId, AccountFullName = grouped.AccountFullName, ContractDonePercent = (createdContracts * 100) / contractToBe, ContractSignPercent = signToBeContract > 0 ? (signedContracts * 100) / signToBeContract : 0, }; } else { return new AccountResults() { AccountId = 0, }; } }).Where(x => x.AccountId > 0).ToList(); #endregion //قرارداد var contractPercent = contractToBe > 0 ? (createdContracts * 100) / contractToBe : 0; //امضاء قراداد var contractSignaturePercent = contractSignToBe > 0 ? (signedContracts * 100) / contractSignToBe : 0; // تصفیه var checkoutPercent = (createdCheckouts * 100) / checkoutToBe; // امضاء تصفیه حساب var checkoutSignaturePercent = checkoutSignToBe > 0 ? (signedChckouts * 100) / checkoutSignToBe : 0; var finalResult = new AllReport() { //همه AllPercent = (contractPercent + contractSignaturePercent + checkoutPercent + checkoutSignaturePercent) / 4, //قرارداد ContractPercent = contractPercent, //امضاء قراداد ContractSignaturePercent = contractSignaturePercent, // تصفیه CheckoutPercent = checkoutPercent, // امضاء تصفیه حساب CheckoutSignaturePercent = checkoutSignaturePercent, Year = $"{currentYear}", Month = nowFa.Substring(5, 2), ContractAccountResults = contractAccountGroupResult, CheckoutAccountResults = checkoutAccountGroupresult, AllContract = contractToBe, ContractNotDone = contractToBe - createdContracts, ContrcatDone = createdContracts, ContractSignNotDone = contractSignToBe - signedContracts, ContractSignDone = signedContracts, ContractSignToBe = contractSignToBe, AllCheckout = checkoutToBe, CheckoutNotDone = checkoutToBe - createdCheckouts, CheckoutDone = createdCheckouts, CheckoutSignDone = signedChckouts, CheckoutSignNotDone = checkoutSignToBe - signedChckouts, CheckoutSignToBe = checkoutSignToBe, }; Console.WriteLine("new metod >>>>>: " + watch.Elapsed); Console.WriteLine("watchAllProssecd >>>>>: " + watchAllProssec.Elapsed); return finalResult; } public AllReport GetAllActiveWorkshops(string year, string month) { var watch = System.Diagnostics.Stopwatch.StartNew(); string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); //var instititionContracts = _context.InstitutionContractSet.Where(x => x.IsActiveString == "true").Select(x=>x.ContractingPartyId).ToList(); var blockContractingPartyIds = _context.PersonalContractingParties.Where(x => x.IsBlock == "false" && x.IsActiveString == "true").Select(x => x.id).ToList(); //blockContractingPartyIds = blockContractingPartyIds.Where(x => instititionContracts.Contains(x)).ToList(); var workshops = _context.Workshops.Where(x => x.IsActiveString == "true") .Include(x => x.WorkshopEmployers) .Include(x => x.LeftWorks) .Select(x => new ActiveWorkshops { Id = x.id, ContractLeftWorkCount = 0, CheckoutLeftWorkCount = 0, ContractingPartId = x.WorkshopEmployers.Select(e => e.Employer.ContractingPartyId).FirstOrDefault(), AccountIdList = _context.WorkshopAccounts.Where(m => m.WorkshopId == x.id && m.ContractAndCheckout == "true" && m.IsActiveSting == "true").Select(a => a.AccountId).ToList(), #region Contracts //contractLeft This Mont ContractLeftIds = x.LeftWorks.Select(l => new LeftWorkViewModel() { EmployeeId = l.EmployeeId, StartWorkDateGr = l.StartWorkDate, LeftWorkDateGr = l.LeftWorkDate.AddDays(-1), }).Where(l => (l.StartWorkDateGr <= nextMonthStart && l.LeftWorkDateGr > nextMonthStart) || (l.StartWorkDateGr <= nextMonthEnd && l.LeftWorkDateGr >= nextMonthEnd) || (l.StartWorkDateGr >= nextMonthStart && l.StartWorkDateGr <= nextMonthEnd) || (l.LeftWorkDateGr >= nextMonthStart && l.LeftWorkDateGr <= nextMonthEnd)).Select(l => l.EmployeeId).ToList(), #endregion #region Checkouts //CheckoutLeft befor This Month CheckoutLeftIds = x.LeftWorks.Select(l => new LeftWorkViewModel() { EmployeeId = l.EmployeeId, StartWorkDateGr = l.StartWorkDate, LeftWorkDateGr = l.LeftWorkDate.AddDays(-1), }).Where(l => (l.StartWorkDateGr <= currentMonthStart && l.LeftWorkDateGr > currentMonthStart) || (l.StartWorkDateGr <= currentMonthEnd && l.LeftWorkDateGr >= currentMonthEnd) || (l.StartWorkDateGr >= currentMonthStart && l.StartWorkDateGr <= currentMonthEnd) || (l.LeftWorkDateGr >= currentMonthStart && l.LeftWorkDateGr <= currentMonthEnd)).Select(l => l.EmployeeId).ToList(), #endregion }).Where(e => blockContractingPartyIds.Contains(e.ContractingPartId) && e.AccountIdList.Count > 0).AsSplitQuery(); var workshopsList = workshops.Select(x => new ActiveWorkshops { Id = x.Id, AccountIdList = x.AccountIdList, #region Contracts //contractLeft This Month ContractLeftIds = _context.InstitutionContractSet.Any(c => c.ContractingPartyId == x.ContractingPartId && c.ContractStartGr <= nextMonthStart && c.ContractEndGr >= nextMonthEnd) ? x.ContractLeftIds : new List(), #endregion #region Checkouts ////CheckoutLeft befor This Month CheckoutLeftIds = _context.InstitutionContractSet.Any(c => c.ContractingPartyId == x.ContractingPartId && c.ContractStartGr <= currentMonthStart && c.ContractEndGr >= currentMonthEnd) ? x.CheckoutLeftIds : new List(), #endregion }).AsSplitQuery(); //var wCount = workshops.Count(); //var partyId = workshops.Select(x => x.ContractingPartId).ToList(); Console.WriteLine("Ripo query 1 >>>>>: " + watch.Elapsed); var res = workshopsList.AsEnumerable(); watch.Restart(); var result = res.Select(x => new ActiveWorkshops { Id = x.Id, ContractLeftWorkCount = x.ContractLeftIds.Count, CheckoutLeftWorkCount = x.CheckoutLeftIds.Count, AccountIdList = x.AccountIdList, CheckoutDoneCount = x.CheckoutLeftIds.Count > 0 ? _context.CheckoutSet.Where(ch => ch.WorkshopId == x.Id) .Where(ch => x.CheckoutLeftIds.Contains(ch.EmployeeId)) .Count(ch => ch.ContractStart >= currentMonthStart && ch.ContractStart < currentMonthEnd && ch.IsActiveString == "true") : 0, CheckoutSignDoneCount = x.CheckoutLeftIds.Count > 0 ? _context.CheckoutSet.Where(ch => ch.WorkshopId == x.Id) .Where(ch => x.CheckoutLeftIds.Contains(ch.EmployeeId)) .Count(ch => ch.ContractStart >= currentMonthStart && ch.ContractStart < currentMonthEnd && ch.IsActiveString == "true" && ch.Signature == "1") : 0, ContrctDoneCount = x.ContractLeftIds.Count > 0 ? _context.Contracts.Where(ct => ct.WorkshopIds == x.Id && ct.IsActiveString == "true") .Where(ct => x.ContractLeftIds.Contains(ct.EmployeeId)) .Count(l => (l.ContarctStart <= nextMonthStart && l.ContractEnd >= nextMonthStart) || (l.ContarctStart <= nextMonthEnd && l.ContractEnd >= nextMonthEnd) || (l.ContarctStart >= nextMonthStart && l.ContarctStart <= nextMonthEnd) || (l.ContractEnd >= nextMonthStart && l.ContractEnd <= nextMonthEnd)) : 0, ContrctSignDoneCount = x.ContractLeftIds.Count > 0 ? _context.Contracts .Where(ct => ct.WorkshopIds == x.Id && ct.IsActiveString == "true" && ct.Signature == "1") .Where(ct => x.ContractLeftIds.Contains(ct.EmployeeId)) .Count(l => (l.ContarctStart <= nextMonthStart && l.ContractEnd >= nextMonthStart) || (l.ContarctStart <= nextMonthEnd && l.ContractEnd >= nextMonthEnd) || (l.ContarctStart >= nextMonthStart && l.ContarctStart <= nextMonthEnd) || (l.ContractEnd >= nextMonthStart && l.ContractEnd <= nextMonthEnd)) : 0, }).AsEnumerable(); Console.WriteLine("Ripo query 2 >>>>>: " + watch.Elapsed); var contractAccountResult = result.Select(x => new ActiveWorkshops() { Id = x.Id, //AccountId = _accountContext.Accounts.Any(e => x.AccountIdList.Contains(e.id) && e.RoleId == 5) // ? _accountContext.Accounts.Where(e => x.AccountIdList.Contains(e.id)).FirstOrDefault(e => e.RoleId == 5)!.id : 0, //AccountFullname = _accountContext.Accounts.Any(e => x.AccountIdList.Contains(e.id) && e.RoleId == 5) // ? _accountContext.Accounts.Where(e => x.AccountIdList.Contains(e.id)).FirstOrDefault(e => e.RoleId == 5)!.Fullname : "", AccountId = _accountContext.AccountLeftWorks.Any(e => x.AccountIdList.Contains(e.AccountId) && e.StartWorkGr <= currentMonthStart && e.LeftWorkGr >= currentMonthEnd) ? _accountContext.AccountLeftWorks.FirstOrDefault(e => x.AccountIdList.Contains(e.AccountId) && e.StartWorkGr <= currentMonthStart && e.LeftWorkGr >= currentMonthEnd)!.AccountId : 0, ContractLeftWorkCount = x.ContractLeftWorkCount, ContrctDoneCount = x.ContrctDoneCount, ContrctSignDoneCount = x.ContrctSignDoneCount, IsActiveString = x.IsActiveString, WorkshopFullName = x.WorkshopFullName, }).Where(x => x.AccountId != 0 && x.ContractLeftWorkCount > 0).ToList(); var checkoutAccountResult = result.Select(x => new ActiveWorkshops() { Id = x.Id, //AccountId = _accountContext.Accounts.Any(e => x.AccountIdList.Contains(e.id) && e.RoleId == 5) // ? _accountContext.Accounts.Where(e => x.AccountIdList.Contains(e.id)).FirstOrDefault(e => e.RoleId == 5)!.id : 0, //AccountFullname = _accountContext.Accounts.Any(e => x.AccountIdList.Contains(e.id) && e.RoleId == 5) // ? _accountContext.Accounts.Where(e => x.AccountIdList.Contains(e.id)).FirstOrDefault(e => e.RoleId == 5)!.Fullname : "", AccountId = _accountContext.AccountLeftWorks.Any(e => x.AccountIdList.Contains(e.AccountId) && e.StartWorkGr <= nextMonthStart && e.LeftWorkGr >= nextMonthEnd) ? _accountContext.AccountLeftWorks.FirstOrDefault(e => x.AccountIdList.Contains(e.AccountId) && e.StartWorkGr <= nextMonthStart && e.LeftWorkGr >= nextMonthEnd)!.AccountId : 0, CheckoutLeftWorkCount = x.CheckoutLeftWorkCount, CheckoutDoneCount = x.CheckoutDoneCount, CheckoutSignDoneCount = x.CheckoutSignDoneCount, IsActiveString = x.IsActiveString, WorkshopFullName = x.WorkshopFullName, }).Where(x => x.AccountId != 0 && x.CheckoutLeftWorkCount > 0).ToList(); watch.Restart(); //قرارداد هایی که باید ایجاد می شد var contractToBe = contractAccountResult.Sum(x => x.ContractLeftWorkCount); //قراردادهای ایجاد شده var createdContracts = contractAccountResult.Sum(x => x.ContrctDoneCount); // قراداد های امضاء شده var signedContracts = contractAccountResult.Sum(x => x.ContrctSignDoneCount); // تصفیه هایی که باید ایجاد می شد var checkoutToBe = checkoutAccountResult.Sum(x => x.CheckoutLeftWorkCount); // تصفیه های ایجاد شده var createdCheckouts = checkoutAccountResult.Sum(x => x.CheckoutDoneCount); //تصفیه های امضاء شده var signedChckouts = checkoutAccountResult.Sum(x => x.CheckoutSignDoneCount); var contractGroupResult = contractAccountResult.GroupBy(x => x.AccountId).Select(x => new AccountResults() { AccountId = x.Key, AccountFullName = _accountContext.Accounts.FirstOrDefault(a => a.id == x.Key)!.Fullname, ContractDonePercent = (x.Sum(c => c.ContrctDoneCount) * 100) / (x.Sum(c => c.ContractLeftWorkCount)), ContractSignPercent = x.Sum(c => c.ContrctDoneCount) > 0 ? (x.Sum(c => c.ContrctSignDoneCount) * 100) / (x.Sum(c => c.ContrctDoneCount)) : 0, }).ToList(); var checkoutGroupResult = checkoutAccountResult.GroupBy(x => x.AccountId).Select(x => new AccountResults() { AccountId = x.Key, AccountFullName = _accountContext.Accounts.FirstOrDefault(a => a.id == x.Key)!.Fullname, CheckoutDonePercent = (x.Sum(c => c.CheckoutDoneCount) * 100) / x.Sum(c => c.CheckoutLeftWorkCount), CheckoutSignPercent = x.Sum(c => c.CheckoutDoneCount) > 0 ? (x.Sum(c => c.CheckoutSignDoneCount) * 100) / (x.Sum(c => c.CheckoutDoneCount)) : 0, }).ToList(); #region ComputePercentage //قرارداد var contractPercent = (createdContracts * 100) / contractToBe; //امضاء قراداد var contractSignaturePercent = createdContracts > 0 ? (signedContracts * 100) / createdContracts : 0; // تصفیه var checkoutPercent = (createdCheckouts * 100) / checkoutToBe; // امضاء تصفیه حساب var checkoutSignaturePercent = createdCheckouts > 0 ? (signedChckouts * 100) / createdCheckouts : 0; var finalResult = new AllReport() { //همه AllPercent = (contractPercent + contractSignaturePercent + checkoutPercent + checkoutSignaturePercent) / 4, //قرارداد ContractPercent = contractPercent, //امضاء قراداد ContractSignaturePercent = contractSignaturePercent, // تصفیه CheckoutPercent = checkoutPercent, // امضاء تصفیه حساب CheckoutSignaturePercent = checkoutSignaturePercent, Year = $"{currentYear}", Month = nowFa.Substring(5, 2), ContractAccountResults = contractGroupResult, CheckoutAccountResults = checkoutGroupResult, AllContract = contractToBe, ContractNotDone = contractToBe - createdContracts, ContrcatDone = createdContracts, ContractSignNotDone = createdContracts - signedContracts, ContractSignDone = signedContracts, AllCheckout = checkoutToBe, CheckoutNotDone = checkoutToBe - createdCheckouts, CheckoutDone = createdCheckouts, CheckoutSignDone = signedChckouts, CheckoutSignNotDone = createdCheckouts - signedChckouts, }; #endregion Console.WriteLine("App 1 >>>>>: " + watch.Elapsed); return finalResult; } public async Task GetWorkshopContractDone(string year, string month, long accountId, List workshopList) { var watch = System.Diagnostics.Stopwatch.StartNew(); string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #region NewChanges //تمام پرسنل فعال برای قراداد در ماه مورد نظر var allContractLeftworksList = await _context.LeftWorkList .Where(x => workshopList.Contains(x.WorkshopId)) .Where(x => x.StartWorkDate <= nextMonthEnd && x.LeftWorkDate > nextMonthStart) .Select(x=> new {x.EmployeeId, x.WorkshopId, x.EmployeeFullName}) .ToListAsync(); //var allContractCreatedWorkshopIdList = allContractLeftworksList.Select(x => new { x.EmployeeId, x.WorkshopId }) // .ToList(); #region CreateContractOptions var byWorkshopDisabledCheck = await _context.Workshops.Where(x=> workshopList.Contains(x.id)).Select(x => new { x.id, x.CreateContract}).ToListAsync(); var byEmployeeDisabledCheck = await _context.EmployeeComputeOptionsSet.Where(x => workshopList.Contains(x.WorkshopId)) .Select(x => new { x.EmployeeId, x.WorkshopId, x.CreateContract }).ToListAsync(); var allContractLeftworks = new List<(long EmployeeId, long WorkshopId, string EmployeeFullName)>(); foreach (var item in allContractLeftworksList) { var toBeRemoveByEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopId); var toBeRemoveByWorkshop = byWorkshopDisabledCheck.FirstOrDefault(x => x.id == item.WorkshopId); if (toBeRemoveByEmployee != null) { if (toBeRemoveByEmployee.CreateContract) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } else { if (toBeRemoveByWorkshop.CreateContract) { var add = (item.EmployeeId, item.WorkshopId,item.EmployeeFullName); allContractLeftworks.Add(add); } } } var allContractLeftworksWorkshopIdList = allContractLeftworks.Select(x => x.WorkshopId).ToList(); var allContractLeftworkEmployeeIds = allContractLeftworks.Select(x => x.EmployeeId).ToList(); //تمام قرارداد های ایجاد شده ماه مورد نظر var allContractCreated = await _context.Contracts .Where(x => allContractLeftworkEmployeeIds.Contains(x.EmployeeId)) .Where(x => x.ContarctStart <= nextMonthEnd && x.ContractEnd > nextMonthStart && x.IsActiveString == "true") .Select(x=> new {x.id, x.EmployeeId, x.WorkshopIds, x.Signature}).ToListAsync(); allContractCreated = allContractCreated.Where(x => allContractLeftworksWorkshopIdList.Contains(x.WorkshopIds)).ToList(); #endregion Console.WriteLine("ajax 1 >>>>>: " + watch.Elapsed); var workshops = _context.Workshops.Include(x => x.LeftWorks).Where(x => allContractLeftworksWorkshopIdList.Contains(x.id)).ToList(); var workshopListResult = workshops .Select(workshop => { var toBe = workshop.LeftWorks .Where(x=> allContractLeftworkEmployeeIds.Contains(x.EmployeeId)) .Where(x => x.StartWorkDate <= nextMonthEnd && x.LeftWorkDate > nextMonthStart) .GroupBy(x => x.EmployeeId) .Select(x => x.Key).ToList(); var contractToBe = toBe.Count(); //var contractToBe = allContractLeftworkEmployeeIdsList.Count(x=> x.WorkshopId == workshop.id); var contractCreated = allContractCreated.Count(x => x.WorkshopIds == workshop.id); if (contractToBe > 0) { return new workshopSearch() { Id = workshop.id, WorkshopFullName = workshop.WorkshopFullName, ArchiveCode = workshop.ArchiveCode, ContractDonePercent = ((contractCreated * 100) / contractToBe), }; } else { return null; } }) .Where(x => x != null) .OrderBy(x => x.ContractDonePercent) .ToList(); // تبدیل به لیست var badWorkshop = workshopListResult.FirstOrDefault(); var badWorkshopTobe = allContractLeftworks.Where(x => x.WorkshopId == badWorkshop.Id); var badWorkshopCreated = allContractCreated.Where(x => x.WorkshopIds == badWorkshop.Id).Select(x => x.EmployeeId); var notDoneEmployes = badWorkshopTobe.Select(l => new EmployeeNotDone() { Id = l.EmployeeId, EmployeeFullName = l.EmployeeFullName, }).Where(l => !badWorkshopCreated.Contains(l.Id)).ToList(); var finalResult = new WorkshopResult() { WorkshopSearches = workshopListResult, EmployeeNotDones = notDoneEmployes, }; Console.WriteLine("ajax 2 >>>>>: " + watch.Elapsed); #endregion return finalResult; } public async Task GetWorkshopContractSignDone(string year, string month, long accountId, List workshopList) { var watch = System.Diagnostics.Stopwatch.StartNew(); string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #region NewChanges //تمام پرسنل فعال برای قراداد در ماه مورد نظر var allContractLeftworksList = await _context.LeftWorkList .Where(x => workshopList.Contains(x.WorkshopId)) .Where(x => x.StartWorkDate <= nextMonthEnd && x.LeftWorkDate > nextMonthStart) .Select(x => new { x.EmployeeId, x.WorkshopId, x.EmployeeFullName , x.Employee}) .ToListAsync(); var byWorkshopDisabledCheck = await _context.Workshops.Select(x => new { x.id, x.CreateContract, x.SignContract}).ToListAsync(); var byEmployeeDisabledCheck = await _context.EmployeeComputeOptionsSet .Select(x => new { x.EmployeeId, x.WorkshopId, x.CreateContract, x.SignContract }).ToListAsync(); var allContractLeftworks = new List<(long EmployeeId, long WorkshopId, string EmployeeFullName)>(); foreach (var item in allContractLeftworksList) { var toBeRemoveByEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopId); var toBeRemoveByWorkshop = byWorkshopDisabledCheck.FirstOrDefault(x => x.id == item.WorkshopId); if (toBeRemoveByEmployee != null) { if (toBeRemoveByEmployee.CreateContract) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } else { if (toBeRemoveByWorkshop.CreateContract) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } } var allContractLeftworkEmployeeIds = allContractLeftworks.Select(x => x.EmployeeId).ToList(); //تمام قرارداد های ایجاد شده ماه مورد نظر var allContractCreated =await _context.Contracts .Where(x => allContractLeftworkEmployeeIds.Contains(x.EmployeeId)) .Where(x => x.ContarctStart <= nextMonthEnd && x.ContractEnd > nextMonthStart && x.IsActiveString == "true") .Select(x=> new {x.id, x.EmployeeId, x.WorkshopIds, x.Signature, x.Employee}).ToListAsync(); allContractCreated = allContractCreated.Where(x => workshopList.Contains(x.WorkshopIds)).ToList(); var allContractSignedListWorkshopId = new List<(long id, long EmployeeId, long WorkshopId, string Signature, Employee Employee)>(); var allContractSignToBeListWorkshopId = new List<(long id, long EmployeeId, long WorkshopId, string Signature, Employee Employee)>(); foreach (var item in allContractCreated) { var byEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopIds); var byWorkshop = byWorkshopDisabledCheck.FirstOrDefault(x => x.id == item.WorkshopIds); if (byEmployee != null) { if (byEmployee.SignContract) { var itemAdd = (item.id, item.EmployeeId, item.WorkshopIds, item.Signature, item.Employee); allContractSignToBeListWorkshopId.Add(itemAdd); if (item.Signature == "1") { allContractSignedListWorkshopId.Add(itemAdd); } } } else { if (byWorkshop.SignContract) { var itemAdd = (item.id, item.EmployeeId, item.WorkshopIds, item.Signature, item.Employee); allContractSignToBeListWorkshopId.Add(itemAdd); if (item.Signature == "1") { allContractSignedListWorkshopId.Add(itemAdd); } } } } var createdContractWorkshopids = allContractSignToBeListWorkshopId.Select(x => x.WorkshopId).ToList(); //قرارداد هایی که امضاء شده var allContractSigned = allContractSignedListWorkshopId.Where(x => x.Signature == "1"); var createdContractTople = allContractSignToBeListWorkshopId .Select(x => new { x.EmployeeId, x.WorkshopId }) .ToList(); var signedContracTople = allContractSigned.Where(x => x.Signature == "1") .Select(x => new { x.EmployeeId, x.WorkshopId }) .ToList(); Console.WriteLine("ajax 1 >>>>>: " + watch.Elapsed); var workshops = _context.Workshops.Where(x => createdContractWorkshopids.Contains(x.id)).ToList(); var workshopListResult = workshops .Select(workshop => { //var contractToBe = allContractLeftworks.Count(x => x.WorkshopId == workshop.id); var contractCreated = createdContractTople.Count(x => x.WorkshopId == workshop.id); var signedContract = signedContracTople.Count(x => x.WorkshopId == workshop.id); if (contractCreated > 0) { return new workshopSearch() { Id = workshop.id, WorkshopFullName = workshop.WorkshopFullName, ArchiveCode = workshop.ArchiveCode, ContractSignPercent = ((signedContract * 100) / contractCreated), }; } else { return null; } }) .Where(x => x != null) .OrderBy(x => x.ContractSignPercent) .ToList(); // تبدیل به لیست if (workshopListResult.Count == 0) return new WorkshopResult() { WorkshopSearches = workshopListResult, EmployeeNotDones = new(), }; var badWorkshop = workshopListResult.FirstOrDefault(); var badWorkshopCreated = allContractSignToBeListWorkshopId.Where(x => x.WorkshopId == badWorkshop.Id); var badWorkshopSigned = allContractSigned.Where(x => x.WorkshopId == badWorkshop.Id).Select(x => x.EmployeeId); var notDoneEmployes = badWorkshopCreated.Select(l => new EmployeeNotDone() { Id = l.EmployeeId, EmployeeFullName = l.Employee.FullName, }).Where(l => !badWorkshopSigned.Contains(l.Id)).ToList(); var finalResult = new WorkshopResult() { WorkshopSearches = workshopListResult, EmployeeNotDones = notDoneEmployes, }; #endregion Console.WriteLine("ajax >>>>>: " + watch.Elapsed); return finalResult; } public async Task GetWorkshopCheckoutDone(string year, string month, long accountId, List workshopList) { var watch = System.Diagnostics.Stopwatch.StartNew(); string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #region NewChanges //تمام پرسنل فعال برای قراداد در ماه مورد نظر var allContractLeftworksList = await _context.LeftWorkList .Where(x => workshopList.Contains(x.WorkshopId)) .Where(x => x.StartWorkDate <= currentMonthEnd && x.LeftWorkDate > currentMonthStart) .Select(x => new { x.EmployeeId, x.WorkshopId, x.EmployeeFullName }) .ToListAsync(); var byWorkshopDisabledCheck = await _context.Workshops.Where(x => workshopList.Contains(x.id)).Select(x => new { x.id, x.CreateCheckout}).ToListAsync(); var byEmployeeDisabledCheck = await _context.EmployeeComputeOptionsSet.Where(x => workshopList.Contains(x.WorkshopId)) .Select(x => new { x.EmployeeId, x.WorkshopId, x.CreateCheckout }).ToListAsync(); var allContractLeftworks = new List<(long EmployeeId, long WorkshopId, string EmployeeFullName)>(); foreach (var item in allContractLeftworksList) { var toBeRemoveByEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopId); var toBeRemoveByWorkshop = byWorkshopDisabledCheck.FirstOrDefault(x => x.id == item.WorkshopId); if (toBeRemoveByEmployee != null) { if (toBeRemoveByEmployee.CreateCheckout) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } else { if (toBeRemoveByWorkshop.CreateCheckout) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } } var allContractLeftworkWorkshopIds = allContractLeftworks.Select(x => x.WorkshopId).ToList(); var allContractLeftworkEmployeeIds = allContractLeftworks.Select(x => x.EmployeeId); var allContractCreated =await _context.CheckoutSet .Where(x => allContractLeftworkEmployeeIds.Contains(x.EmployeeId)) .Where(x => x.ContractStart.Date <= currentMonthEnd.Date && x.ContractEnd.Date > currentMonthStart.Date && x.IsActiveString == "true").ToListAsync(); allContractCreated = allContractCreated.Where(x => allContractLeftworkWorkshopIds.Contains(x.WorkshopId)).ToList(); var createdContractTople = allContractCreated .Select(x => new { x.EmployeeId, x.WorkshopId }) .ToList(); Console.WriteLine("ajax 1 >>>>>: " + watch.Elapsed); var workshops = _context.Workshops.Include(x => x.LeftWorks).Where(x => allContractLeftworkWorkshopIds.Contains(x.id)).ToList(); var workshopListResult = workshops .Select(workshop => { var toBe = workshop.LeftWorks .Where(x => allContractLeftworkEmployeeIds.Contains(x.EmployeeId)) .Where(x => x.StartWorkDate <= currentMonthEnd && x.LeftWorkDate > currentMonthStart) .GroupBy(x => x.EmployeeId) .Select(x => x.Key).ToList(); var contractToBe = toBe.Count(); //var contractToBe = allContractToBe.Count(x => x.WorkshopId == workshop.id); var contractCreated = createdContractTople.Count(x => x.WorkshopId == workshop.id); if (contractToBe > 0) { return new workshopSearch() { Id = workshop.id, WorkshopFullName = workshop.WorkshopFullName, ArchiveCode = workshop.ArchiveCode, CheckoutDonePercent = ((contractCreated * 100) / contractToBe), }; } else { return null; } }) .Where(x => x != null) .OrderBy(x => x.CheckoutDonePercent) .ToList(); // تبدیل به لیست if (workshopListResult.Count == 0) return new WorkshopResult() { WorkshopSearches = workshopListResult, EmployeeNotDones = new(), }; var badWorkshop = workshopListResult.FirstOrDefault(); var badWorkshopTobe = allContractLeftworks.Where(x => x.WorkshopId == badWorkshop.Id); var badWorkshopCreated = allContractCreated.Where(x => x.WorkshopId == badWorkshop.Id).Select(x => x.EmployeeId); var notDoneEmployes = badWorkshopTobe.Select(l => new EmployeeNotDone() { Id = l.EmployeeId, EmployeeFullName = l.EmployeeFullName, }).Where(l => !badWorkshopCreated.Contains(l.Id)).ToList(); var finalResult = new WorkshopResult() { WorkshopSearches = workshopListResult, EmployeeNotDones = notDoneEmployes, }; #endregion Console.WriteLine("ajax >>>>>: " + watch.Elapsed); return finalResult; } public async Task GetWorkshopCheckoutSignDone(string year, string month, long accountId, List workshopList) { var watch = System.Diagnostics.Stopwatch.StartNew(); string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #region NewChanges var allContractLeftworksList = await _context.LeftWorkList .Where(x => workshopList.Contains(x.WorkshopId)) .Where(x => x.StartWorkDate <= currentMonthEnd && x.LeftWorkDate > currentMonthStart) .Select(x => new { x.EmployeeId, x.WorkshopId, x.EmployeeFullName, x.Employee }) .ToListAsync(); var byWorkshopDisabledCheck = await _context.Workshops.Select(x => new { x.id,x.CreateCheckout, x.SignCheckout }).ToListAsync(); var byEmployeeDisabledCheck = await _context.EmployeeComputeOptionsSet .Select(x => new { x.EmployeeId, x.WorkshopId, x.CreateCheckout, x.SignCheckout }).ToListAsync(); var allContractLeftworks = new List<(long EmployeeId, long WorkshopId, string EmployeeFullName)>(); foreach (var item in allContractLeftworksList) { var toBeRemoveByEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopId); var toBeRemoveByWorkshop = byWorkshopDisabledCheck.FirstOrDefault(x => x.id == item.WorkshopId); if (toBeRemoveByEmployee != null) { if (toBeRemoveByEmployee.CreateCheckout) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } else { if (toBeRemoveByWorkshop.CreateCheckout) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } } //var signContractWorkshopDisabled = await _context.Workshops.Where(x => x.SignContract == false).ToListAsync(); //var signContractDisabled = await _context.EmployeeComputeOptionsSet.Where(x => x.SignContract == false) // .Select(x => new { x.EmployeeId, x.WorkshopId }).ToListAsync(); var allContractLeftworkEmployeeIds = allContractLeftworks.Select(x => x.EmployeeId).ToList(); var allContractLeftworkWorkshopIds = allContractLeftworks.Select(x => x.WorkshopId).ToList(); var allContractCreated =await _context.CheckoutSet .Where(x => allContractLeftworkEmployeeIds.Contains(x.EmployeeId)) .Where(x => x.ContractStart <= currentMonthEnd && x.ContractEnd > currentMonthStart && x.IsActiveString == "true") .Select(x => new { x.id, x.EmployeeId, x.WorkshopId, x.Signature, x.EmployeeFullName }).ToListAsync(); allContractCreated = allContractCreated.Where(x => allContractLeftworkWorkshopIds.Contains(x.WorkshopId)).ToList(); var allContractSignedListWorkshopId = new List<(long id, long EmployeeId, long WorkshopId, string Signature, string EmployeeFullName)>(); var allContractSignToBeListWorkshopId = new List<(long id, long EmployeeId, long WorkshopId, string Signature, string EmployeeFullName)>(); foreach (var item in allContractCreated) { var byEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopId); var byWorkshop = byWorkshopDisabledCheck.FirstOrDefault(x => x.id == item.WorkshopId); if (byEmployee != null) { if (byEmployee.SignCheckout) { var itemAdd = (item.id, item.EmployeeId, item.WorkshopId, item.Signature, item.EmployeeFullName); allContractSignToBeListWorkshopId.Add(itemAdd); if (item.Signature == "1") { allContractSignedListWorkshopId.Add(itemAdd); } } } else { if (byWorkshop.SignCheckout) { var itemAdd = (item.id, item.EmployeeId, item.WorkshopId, item.Signature, item.EmployeeFullName); allContractSignToBeListWorkshopId.Add(itemAdd); if (item.Signature == "1") { allContractSignedListWorkshopId.Add(itemAdd); } } } } var createdContractWorkshopids = allContractSignToBeListWorkshopId.Select(x => x.WorkshopId).ToList(); //قرارداد هایی که امضاء شده var allContractSigned = allContractSignedListWorkshopId.Where(x => x.Signature == "1"); var createdContractTople = allContractSignToBeListWorkshopId .Select(x => new { x.EmployeeId, x.WorkshopId }) .ToList(); var signedContracTople = allContractSigned.Where(x => x.Signature == "1") .Select(x => new { x.EmployeeId, x.WorkshopId }) .ToList(); Console.WriteLine("ajax 1 >>>>>: " + watch.Elapsed); var workshops = _context.Workshops.Where(x => createdContractWorkshopids.Contains(x.id)).ToList(); var workshopListResult = workshops .Select(workshop => { //var contractToBe = allContractLeftworks.Count(x => x.WorkshopId == workshop.id); var contractCreated = createdContractTople.Count(x => x.WorkshopId == workshop.id); var signedContract = signedContracTople.Count(x => x.WorkshopId == workshop.id); if (contractCreated > 0) { return new workshopSearch() { Id = workshop.id, WorkshopFullName = workshop.WorkshopFullName, ArchiveCode = workshop.ArchiveCode, CheckoutSignPercent = ((signedContract * 100) / contractCreated), }; } else { return null; } }) .Where(x => x != null) .OrderBy(x => x.CheckoutSignPercent) .ToList(); // تبدیل به لیست if (workshopListResult.Count == 0) return new WorkshopResult() { WorkshopSearches = workshopListResult, EmployeeNotDones = new(), }; var badWorkshop = workshopListResult.FirstOrDefault(); var badWorkshopCreated = allContractSignToBeListWorkshopId.Where(x => x.WorkshopId == badWorkshop.Id); var badWorkshopSigned = allContractSigned.Where(x => x.WorkshopId == badWorkshop.Id).Select(x => x.EmployeeId); var notDoneEmployes = badWorkshopCreated.Select(l => new EmployeeNotDone() { Id = l.EmployeeId, EmployeeFullName = l.EmployeeFullName, }).Where(l => !badWorkshopSigned.Contains(l.Id)).ToList(); var finalResult = new WorkshopResult() { WorkshopSearches = workshopListResult, EmployeeNotDones = notDoneEmployes, }; #endregion Console.WriteLine("ajax >>>>>: " + watch.Elapsed); return finalResult; } #region getEmployeeNotDonBySelectWorkshop public async Task> GetEmployeeContract(string year, string month, long workshopId) { string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #region New var allContractLeftworksList =await _context.LeftWorkList .Where(x => x.WorkshopId == workshopId) .Where(x => x.StartWorkDate <= nextMonthEnd && x.LeftWorkDate > nextMonthStart).ToListAsync(); var byWorkshopDisabledCheck = await _context.Workshops.FirstOrDefaultAsync(x=>x.id == workshopId); var byEmployeeDisabledCheck = await _context.EmployeeComputeOptionsSet.Where(x=>x.WorkshopId == workshopId) .Select(x => new { x.EmployeeId, x.WorkshopId, x.CreateContract }).ToListAsync(); var allContractLeftworks = new List<(long EmployeeId, long WorkshopId, string EmployeeFullName)>(); foreach (var item in allContractLeftworksList) { var toBeRemoveByEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopId); if (toBeRemoveByEmployee != null) { if (toBeRemoveByEmployee.CreateContract) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } else { if (byWorkshopDisabledCheck.CreateContract) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } } if (allContractLeftworks.Count == 0) return new List(); var allContractLeftworkEmployeeIds = allContractLeftworks.Select(x => x.EmployeeId).ToList(); var allContractCreated =await _context.Contracts .Where(x => allContractLeftworkEmployeeIds.Contains(x.EmployeeId) && x.WorkshopIds == workshopId) .Where(x => x.ContarctStart <= nextMonthEnd && x.ContractEnd > nextMonthStart && x.IsActiveString == "true").Select(x => x.EmployeeId).ToListAsync(); return allContractLeftworks.Select(l => new EmployeeNotDone() { Id = l.EmployeeId, EmployeeFullName = l.EmployeeFullName, }).Where(x => !allContractCreated.Contains(x.Id)).ToList(); #endregion } public async Task> GetEmployeeContractSign(string year, string month, long workshopId) { string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); //var badWorkshopLeftWorks = _context.LeftWorkList.Where(l => l.WorkshopId == workshopId).Select(l => new LeftWorkViewModel() //{ // Id = l.id, // EmployeeId = l.EmployeeId, // EmployeeFullName = l.EmployeeFullName, // StartWorkDateGr = l.StartWorkDate, // LeftWorkDateGr = l.LeftWorkDate.AddDays(-1), //}).Where(l => // (l.StartWorkDateGr <= nextMonthStart && l.LeftWorkDateGr > nextMonthStart) || // (l.StartWorkDateGr <= nextMonthEnd && l.LeftWorkDateGr >= nextMonthEnd) || // (l.StartWorkDateGr >= nextMonthStart && l.StartWorkDateGr <= nextMonthEnd) || // (l.LeftWorkDateGr >= nextMonthStart && l.LeftWorkDateGr <= nextMonthEnd)).ToList(); //var badWorkshopContracts = _context.Contracts.Where(ct => ct.WorkshopIds == workshopId && ct.IsActiveString == "true" && ct.Signature == "1") // .Where(l => (l.ContarctStart <= nextMonthStart && l.ContractEnd >= nextMonthStart) || // (l.ContarctStart <= nextMonthEnd && l.ContractEnd >= nextMonthEnd) || // (l.ContarctStart >= nextMonthStart && l.ContarctStart <= nextMonthEnd) || // (l.ContractEnd >= nextMonthStart && l.ContractEnd <= nextMonthEnd)).Select(x => x.EmployeeId).ToList(); #region New var byWorkshopDisabledCheck = await _context.Workshops.FirstOrDefaultAsync(x => x.id == workshopId); var byEmployeeDisabledCheck = await _context.EmployeeComputeOptionsSet.Where(x=>x.WorkshopId == workshopId) .Select(x => new { x.EmployeeId, x.WorkshopId, x.SignContract }).ToListAsync(); var allContractNotSignedEmployeeIdList =await _context.Contracts .Where(x => x.WorkshopIds == workshopId) .Where(x => x.ContarctStart.Date <= nextMonthEnd && x.ContractEnd > nextMonthStart && x.IsActiveString == "true") .Select(x => new { x.EmployeeId , x.Signature}) .ToListAsync(); var allContractNotSignedEmployeeIds = new List(); foreach (var item in allContractNotSignedEmployeeIdList) { var toBeRemoveByEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId); if (toBeRemoveByEmployee != null) { if (toBeRemoveByEmployee.SignContract) { if (item.Signature != "1") { allContractNotSignedEmployeeIds.Add(item.EmployeeId); } } } else { if (byWorkshopDisabledCheck.SignContract) { if (item.Signature != "1") { allContractNotSignedEmployeeIds.Add(item.EmployeeId); } } } } if (allContractNotSignedEmployeeIds.Count == 0) return new List(); return await _context.Employees.Where(x => allContractNotSignedEmployeeIds.Contains(x.id)) .Select(x => new EmployeeNotDone() { Id = x.id, EmployeeFullName = x.FullName }).ToListAsync(); #endregion } public async Task> GetEmployeeCheckout(string year, string month, long workshopId) { string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); //var badWorkshopLeftWorks = _context.LeftWorkList.Where(l => l.WorkshopId == workshopId).Select(l => new LeftWorkViewModel() //{ // Id = l.id, // EmployeeId = l.EmployeeId, // EmployeeFullName = l.EmployeeFullName, // StartWorkDateGr = l.StartWorkDate, // LeftWorkDateGr = l.LeftWorkDate.AddDays(-1), //}).Where(l => (l.StartWorkDateGr <= currentMonthStart && l.LeftWorkDateGr > currentMonthStart) || // (l.StartWorkDateGr <= currentMonthEnd && l.LeftWorkDateGr >= currentMonthEnd) || // (l.StartWorkDateGr >= currentMonthStart && l.StartWorkDateGr <= currentMonthEnd) || // (l.LeftWorkDateGr >= currentMonthStart && l.LeftWorkDateGr <= currentMonthEnd)).ToList(); //var badWorkshopCheckouts = _context.CheckoutSet.Where(ch => ch.WorkshopId == workshopId) // .Where(ch => // ch.ContractStart >= currentMonthStart && ch.ContractStart < currentMonthEnd && // ch.IsActiveString == "true").Select(x => x.EmployeeId).ToList(); //return badWorkshopLeftWorks.Select(l => new EmployeeNotDone() //{ // Id = l.EmployeeId, // EmployeeFullName = l.EmployeeFullName, //}).Where(l => !badWorkshopCheckouts.Contains(l.Id)).ToList(); #region New var allContractLeftworksList = await _context.LeftWorkList .Where(x => x.WorkshopId == workshopId) .Where(x => x.StartWorkDate <= currentMonthEnd && x.LeftWorkDate > currentMonthStart).ToListAsync(); var byWorkshopDisabledCheck = await _context.Workshops.FirstOrDefaultAsync(x => x.id == workshopId); var byEmployeeDisabledCheck = await _context.EmployeeComputeOptionsSet.Where(x => x.WorkshopId == workshopId) .Select(x => new { x.EmployeeId, x.WorkshopId, x.CreateCheckout }).ToListAsync(); var allContractLeftworks = new List<(long EmployeeId, long WorkshopId, string EmployeeFullName)>(); foreach (var item in allContractLeftworksList) { var toBeRemoveByEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId && x.WorkshopId == item.WorkshopId); if (toBeRemoveByEmployee != null) { if (toBeRemoveByEmployee.CreateCheckout) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } else { if (byWorkshopDisabledCheck.CreateCheckout) { var add = (item.EmployeeId, item.WorkshopId, item.EmployeeFullName); allContractLeftworks.Add(add); } } } if (allContractLeftworks.Count == 0) return new List(); var allContractLeftworkEmployeeIds = allContractLeftworks.Select(x => x.EmployeeId).ToList(); var allContractCreated =await _context.CheckoutSet .Where(x => allContractLeftworkEmployeeIds.Contains(x.EmployeeId) && x.WorkshopId == workshopId) .Where(x => x.ContractStart <= currentMonthEnd && x.ContractEnd > currentMonthStart && x.IsActiveString == "true").ToListAsync(); var allContractCreatedEmoployeeIds = allContractCreated.Select(x => x.EmployeeId).ToList(); return allContractLeftworks.Select(l => new EmployeeNotDone() { Id = l.EmployeeId, EmployeeFullName = l.EmployeeFullName, }).Where(x => !allContractCreatedEmoployeeIds.Contains(x.Id)).ToList(); #endregion } public async Task> GetEmployeeCheckoutSign(string year, string month, long workshopId) { string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #region New var byWorkshopDisabledCheck = await _context.Workshops.FirstOrDefaultAsync(x => x.id == workshopId); var byEmployeeDisabledCheck = await _context.EmployeeComputeOptionsSet.Where(x => x.WorkshopId == workshopId) .Select(x => new { x.EmployeeId, x.WorkshopId, x.SignCheckout }).ToListAsync(); var allCheckoutNotSignedEmployeeIdList =await _context.CheckoutSet .Where(x => x.WorkshopId == workshopId) .Where(x => x.ContractStart <= currentMonthEnd && x.ContractEnd > currentMonthStart && x.IsActiveString == "true") .Select(x => new { x.EmployeeId , x.Signature}) .ToListAsync(); var allCheckoutNotSignedEmployeeIds = new List(); foreach (var item in allCheckoutNotSignedEmployeeIdList) { var toBeRemoveByEmployee = byEmployeeDisabledCheck.FirstOrDefault(x => x.EmployeeId == item.EmployeeId); if (toBeRemoveByEmployee != null) { if (toBeRemoveByEmployee.SignCheckout) { if (item.Signature != "1") { allCheckoutNotSignedEmployeeIds.Add(item.EmployeeId); } } } else { if (item.Signature != "1") { allCheckoutNotSignedEmployeeIds.Add(item.EmployeeId); } } } if (allCheckoutNotSignedEmployeeIds.Count == 0) return new List(); return _context.Employees.Where(x => allCheckoutNotSignedEmployeeIds.Contains(x.id)) .Select(x => new EmployeeNotDone() { Id = x.id, EmployeeFullName = x.FullName }).ToList(); #endregion } #endregion #region PrintAll public async Task GetPrintAllContractDone(string year, string month, long accountId, List workshopList) { var watch = System.Diagnostics.Stopwatch.StartNew(); string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #region New //var accountWorkshopList = _context.Workshops // .Where(x => workshopList.Contains(x.id)) // .Include(x => x.LeftWorks.Where(left => // left.StartWorkDate <= nextMonthEnd && left.LeftWorkDate > nextMonthStart)) // .Include(x => x.Contracts2.Where(contract => // contract.ContarctStart.Date <= nextMonthEnd.Date && contract.ContractEnd.Date > nextMonthStart.Date && // contract.IsActiveString == "true")).ToList(); //var notCompletedWorkshops = accountWorkshopList.Select(workshop => // { // var lefts = workshop.LeftWorks.Select(x => new { x.EmployeeId, x.EmployeeFullName }).Distinct().ToList(); // var contractToBe = lefts.Count; // var contractCreated = workshop.Contracts2.Count(); // var createdContractEmployeeIdList = workshop.Contracts2.Select(x => x.EmployeeId).ToList(); // var contractDonePercent = contractToBe > 0 ? ((contractCreated * 100) / contractToBe) : 100; // if (contractDonePercent < 100) // { // var employeeNotDone = // lefts.Where(x => !createdContractEmployeeIdList.Contains(x.EmployeeId)).Select(l => new EmployeeNotDone() // { // Id = l.EmployeeId, // EmployeeFullName = l.EmployeeFullName, // }).ToList(); // return new workshopSearch() // { // Id = workshop.id, // WorkshopFullName = workshop.WorkshopFullName, // ArchiveCode = workshop.ArchiveCode, // ContractDonePercent = contractDonePercent, // EmployeeNotDones = employeeNotDone // }; // } // else // { // return null; // } // }).Where(x => x != null) // .OrderBy(x => x.ContractDonePercent) // .ToList(); #endregion var getAllWorkshopContractToBe = GetWorkshopContractDone(year, month, accountId, workshopList).GetAwaiter().GetResult(); var workshopSearch = getAllWorkshopContractToBe.WorkshopSearches.Where(x => x.ContractDonePercent < 100).ToList(); var workshopFinalResult = new List(); foreach (var item in workshopSearch) { var employeeNotDone = GetEmployeeContract(year, month, item.Id).GetAwaiter().GetResult(); var res = new workshopSearch() { Id = item.Id, WorkshopFullName = item.WorkshopFullName, ArchiveCode = item.ArchiveCode, ContractDonePercent = item.ContractDonePercent, EmployeeNotDones = employeeNotDone }; workshopFinalResult.Add(res); } var account = await _accountContext.Accounts.FirstOrDefaultAsync(x => x.id == accountId); var finalResult = new PrintAllContractCheckout() { AccountId = accountId, AccountFullName = account.Fullname, Year = $"{nextMonthStartFa.Year}", Month = nextMonthStartFa.Month.ToFarsiMonthByIntNumber(), ReportType = "تنظیم قرارداد", WorkshopSearches = workshopFinalResult, }; Console.WriteLine("ajax >>>>>: " + watch.Elapsed); return finalResult; } public async Task GetPrintAllContractSignDone(string year, string month, long accountId, List workshopList) { var watch = System.Diagnostics.Stopwatch.StartNew(); string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #region New //var accountWorkshopList = _context.Workshops // .Where(x => workshopList.Contains(x.id)).Include(x => x.LeftWorks.Where(left => // left.StartWorkDate <= nextMonthEnd && left.LeftWorkDate > nextMonthStart)) // .Include(x => x.Contracts2.Where(contract => // contract.ContarctStart.Date <= nextMonthEnd.Date && contract.ContractEnd.Date > nextMonthStart.Date && // contract.IsActiveString == "true")).ToList(); //var notCompletedWorkshops = accountWorkshopList.Select(workshop => // { // var contractSigned = workshop.Contracts2.Count(x => x.Signature == "1"); // var contractCreated = workshop.Contracts2.Count(); // int contractSignedPercent = 0; // if (contractSigned > 0) // { // contractSignedPercent = workshop.Contracts2.Any(x => x.Signature == "0") ? ((contractSigned * 100) / contractCreated) : 100; // } // else // { // contractSignedPercent = 0; // } // if (contractSignedPercent < 100 && contractCreated > 0) // { // var contractEmployeeIds = workshop.Contracts2.Where(x => x.Signature == "0") // .Select(x => x.EmployeeId).ToList(); // var lefts = workshop.LeftWorks.Select(x => x.EmployeeId).Distinct().ToList(); // var contractNotNullEmployeeId = lefts.Where(x => contractEmployeeIds.Contains(x)).ToList(); // var employeeNotDone = // workshop.Contracts2.Where(x => x.Signature == "0" && contractNotNullEmployeeId.Contains(x.EmployeeId)).Select(l => new EmployeeNotDone() // { // Id = l.EmployeeId, // EmployeeFullName = workshop.LeftWorks.FirstOrDefault(x => x.EmployeeId == l.EmployeeId)!.EmployeeFullName, // }).ToList(); // return new workshopSearch() // { // Id = workshop.id, // WorkshopFullName = workshop.WorkshopFullName, // ArchiveCode = workshop.ArchiveCode, // ContractSignPercent = contractSignedPercent, // EmployeeNotDones = employeeNotDone // }; // } // else // { // return null; // } // }).Where(x => x != null) // .OrderBy(x => x.ContractSignPercent) // .ToList(); #endregion var getAllWorkshopContractToBe = GetWorkshopContractSignDone(year, month, accountId, workshopList).GetAwaiter().GetResult(); var workshopSearch = getAllWorkshopContractToBe.WorkshopSearches.Where(x => x.ContractSignPercent < 100).ToList(); var workshopFinalResult = new List(); foreach (var item in workshopSearch) { var employeeNotDone = GetEmployeeContractSign(year, month, item.Id).GetAwaiter().GetResult(); var res = new workshopSearch() { Id = item.Id, WorkshopFullName = item.WorkshopFullName, ArchiveCode = item.ArchiveCode, ContractSignPercent = item.ContractSignPercent, EmployeeNotDones = employeeNotDone }; workshopFinalResult.Add(res); } var account = await _accountContext.Accounts.FirstOrDefaultAsync(x => x.id == accountId); var finalResult = new PrintAllContractCheckout() { AccountId = accountId, AccountFullName = account.Fullname, Year = $"{nextMonthStartFa.Year}", Month = nextMonthStartFa.Month.ToFarsiMonthByIntNumber(), ReportType = "امضاء قرارداد", WorkshopSearches = workshopFinalResult, }; Console.WriteLine("ajax >>>>>: " + watch.Elapsed); return finalResult; } public async Task GetPrintAllCheckoutDone(string year, string month, long accountId, List workshopList) { var watch = System.Diagnostics.Stopwatch.StartNew(); string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #region New //var accountWorkshopList = _context.Workshops // .Where(x => workshopList.Contains(x.id)) // .Include(x => x.LeftWorks.Where(left => // left.StartWorkDate <= currentMonthEnd && left.LeftWorkDate > currentMonthStart)) // .Include(x => x.Checkouts.Where(contract => // contract.ContractStart.Date <= currentMonthEnd.Date && contract.ContractEnd.Date > currentMonthStart.Date && // contract.IsActiveString == "true")).ToList(); //var notCompletedWorkshops = accountWorkshopList.Select(workshop => //{ // var lefts = workshop.LeftWorks.Select(x => new { x.EmployeeId, x.EmployeeFullName }).Distinct().ToList(); // var contractToBe = lefts.Count; // var contractCreated = workshop.Checkouts.Count(); // var createdContractEmployeeIdList = workshop.Checkouts.Select(x => x.EmployeeId).ToList(); // var contractDonePercent = contractToBe > 0 ? ((contractCreated * 100) / contractToBe) : 100; // if (contractDonePercent < 100) // { // var employeeNotDone = // lefts.Where(x => !createdContractEmployeeIdList.Contains(x.EmployeeId)).Select(l => new EmployeeNotDone() // { // Id = l.EmployeeId, // EmployeeFullName = l.EmployeeFullName, // }).ToList(); // return new workshopSearch() // { // Id = workshop.id, // WorkshopFullName = workshop.WorkshopFullName, // ArchiveCode = workshop.ArchiveCode, // CheckoutDonePercent = contractDonePercent, // EmployeeNotDones = employeeNotDone // }; // } // else // { // return null; // } //}).Where(x => x != null) // .OrderBy(x => x.ContractDonePercent) // .ToList(); #endregion var getAllWorkshopContractToBe = GetWorkshopCheckoutDone(year, month, accountId, workshopList).GetAwaiter().GetResult(); var workshopSearch = getAllWorkshopContractToBe.WorkshopSearches.Where(x => x.CheckoutDonePercent < 100).ToList(); var workshopFinalResult = new List(); foreach (var item in workshopSearch) { var employeeNotDone = GetEmployeeCheckout(year, month, item.Id).GetAwaiter().GetResult(); var res = new workshopSearch() { Id = item.Id, WorkshopFullName = item.WorkshopFullName, ArchiveCode = item.ArchiveCode, CheckoutDonePercent = item.CheckoutDonePercent, EmployeeNotDones = employeeNotDone }; workshopFinalResult.Add(res); } var account = await _accountContext.Accounts.FirstOrDefaultAsync(x => x.id == accountId); var finalResult = new PrintAllContractCheckout() { AccountId = accountId, AccountFullName = account.Fullname, Year = year, Month = month.ToFarsiMonthByNumber(), ReportType = "تنظیم تصفیه حساب", WorkshopSearches = workshopFinalResult, }; //var finalResult = new PrintAllContractCheckout() //{ // AccountId = accountId, // AccountFullName = _accountContext.Accounts.FirstOrDefault(x => x.id == accountId)?.Fullname, // Year = year, // Month = month.ToFarsiMonthByNumber(), // ReportType = "تنظیم تصفیه حساب", // WorkshopSearches = notCompletedWorkshops, //}; Console.WriteLine("ajax >>>>>: " + watch.Elapsed); return finalResult; } public async Task GetPrintAllCheckoutSignDone(string year, string month, long accountId, List workshopList) { var watch = System.Diagnostics.Stopwatch.StartNew(); string nowFa = ""; if (!string.IsNullOrWhiteSpace(year) && !string.IsNullOrWhiteSpace(month)) { nowFa = $"{year}/{month}/01"; } else { nowFa = $"{(DateTime.Now.ToFarsi()).Substring(0, 8)}01"; } var currentEndOfMonth = nowFa.FindeEndOfMonth(); var currentMonthStart = nowFa.ToGeorgianDateTime(); var currentMonthEnd = currentEndOfMonth.ToGeorgianDateTime(); int currentYear = Convert.ToInt32(nowFa.Substring(0, 4)); var currentMonth = Convert.ToInt32(nowFa.Substring(5, 2)); var nextMonthStartFa = new PersianDateTime(currentYear, currentMonth, 1).AddMonths(1); var nextMonthStart = ($"{nextMonthStartFa}").ToGeorgianDateTime(); var nextMonthEnd = (($"{nextMonthStartFa}").FindeEndOfMonth()).ToGeorgianDateTime(); #region New //var accountWorkshopList = _context.Workshops // .Where(x => workshopList.Contains(x.id)) // .Include(x => x.Checkouts.Where(contract => // contract.ContractStart.Date <= currentMonthEnd.Date && contract.ContractEnd.Date > currentMonthStart.Date && // contract.IsActiveString == "true")).ToList(); //var notCompletedWorkshops = accountWorkshopList.Select(workshop => // { // var checkoutSigned = workshop.Checkouts.Count(x => x.Signature == "1"); // var checkoutCreated = workshop.Checkouts.Count(); // var contractSignedPercent = workshop.Checkouts.Any(x => x.Signature == "0") ? ((checkoutSigned * 100) / checkoutCreated) : 100; // if (contractSignedPercent < 100 && checkoutCreated > 0) // { // var employeeNotDone = // workshop.Checkouts.Where(x => x.Signature == "0").Select(l => new EmployeeNotDone() // { // Id = l.EmployeeId, // EmployeeFullName = l.EmployeeFullName, // }).ToList(); // return new workshopSearch() // { // Id = workshop.id, // WorkshopFullName = workshop.WorkshopFullName, // ArchiveCode = workshop.ArchiveCode, // CheckoutSignPercent = contractSignedPercent, // EmployeeNotDones = employeeNotDone // }; // } // else // { // return null; // } // }).Where(x => x != null) // .OrderBy(x => x.CheckoutSignPercent) // .ToList(); #endregion var getAllWorkshopContractToBe = GetWorkshopCheckoutSignDone(year, month, accountId, workshopList).GetAwaiter().GetResult(); var workshopSearch = getAllWorkshopContractToBe.WorkshopSearches.Where(x => x.CheckoutSignPercent < 100).ToList(); var workshopFinalResult = new List(); foreach (var item in workshopSearch) { var employeeNotDone = GetEmployeeCheckoutSign(year, month, item.Id).GetAwaiter().GetResult(); var res = new workshopSearch() { Id = item.Id, WorkshopFullName = item.WorkshopFullName, ArchiveCode = item.ArchiveCode, CheckoutSignPercent = item.CheckoutSignPercent, EmployeeNotDones = employeeNotDone }; workshopFinalResult.Add(res); } var account = await _accountContext.Accounts.FirstOrDefaultAsync(x => x.id == accountId); var finalResult = new PrintAllContractCheckout() { AccountId = accountId, AccountFullName = account.Fullname, Year = year, Month = month.ToFarsiMonthByNumber(), ReportType = "امضاء تصفیه حساب", WorkshopSearches = workshopFinalResult, }; //var finalResult = new PrintAllContractCheckout() //{ // AccountId = accountId, // AccountFullName = _accountContext.Accounts.FirstOrDefault(x => x.id == accountId)?.Fullname, // Year = year, // Month = month.ToFarsiMonthByNumber(), // ReportType = "امضاء تصفیه حساب", // WorkshopSearches = notCompletedWorkshops, //}; Console.WriteLine("ajax >>>>>: " + watch.Elapsed); return finalResult; } #endregion }