2589 lines
112 KiB
C#
2589 lines
112 KiB
C#
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<AllReport> 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<AllReport> 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<long>();
|
|
var contractSignToBe = 0;
|
|
var allContractSignToBeListWorkshopId = new List<long>();
|
|
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<long>();
|
|
var checkoutSignToBe = 0;
|
|
var allCheckoutSignToBeListWorkshopId = new List<long>();
|
|
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<long>(),
|
|
|
|
#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<long>(),
|
|
|
|
#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<WorkshopResult> GetWorkshopContractDone(string year, string month, long accountId, List<long> 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<WorkshopResult> GetWorkshopContractSignDone(string year, string month, long accountId,
|
|
List<long> 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<WorkshopResult> GetWorkshopCheckoutDone(string year, string month, long accountId, List<long> 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<WorkshopResult> GetWorkshopCheckoutSignDone(string year, string month, long accountId,
|
|
List<long> 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<List<EmployeeNotDone>> 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<EmployeeNotDone>();
|
|
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<List<EmployeeNotDone>> 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<long>();
|
|
|
|
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<EmployeeNotDone>();
|
|
|
|
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<List<EmployeeNotDone>> 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<EmployeeNotDone>();
|
|
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<List<EmployeeNotDone>> 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<long>();
|
|
|
|
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<EmployeeNotDone>();
|
|
|
|
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<PrintAllContractCheckout> GetPrintAllContractDone(string year, string month, long accountId,
|
|
List<long> 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<workshopSearch>();
|
|
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<PrintAllContractCheckout> GetPrintAllContractSignDone(string year, string month, long accountId,
|
|
List<long> 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<workshopSearch>();
|
|
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<PrintAllContractCheckout> GetPrintAllCheckoutDone(string year, string month, long accountId,
|
|
List<long> 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<workshopSearch>();
|
|
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<PrintAllContractCheckout> GetPrintAllCheckoutSignDone(string year, string month, long accountId,
|
|
List<long> 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<workshopSearch>();
|
|
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
|
|
}
|
|
|
|
|
|
|