From 2843ab8b478117d7bd7cc3fa015e91447c5fc414 Mon Sep 17 00:00:00 2001 From: SamSys Date: Tue, 4 Mar 2025 21:40:02 +0330 Subject: [PATCH] import Excel SalaryAid --- 0_Framework/Domain/IRepository.cs | 3 +- 0_Framework/InfraStructure/RepositoryBase.cs | 11 + .../EmployeeAgg/IEmployeeRepository.cs | 1 + Company.Domain/ReportAgg/IReportRepository.cs | 1 + ...panyManagement.Infrastructure.Excel.csproj | 17 + .../SalaryAid/SalaryAidImportExcel.cs | 240 ++++++ .../SalaryAid/CreateSalaryAidViewModel.cs | 1 + .../SalaryAid/ISalaryAidApplication.cs | 3 + .../SalaryAidApplication.cs | 53 +- .../Repository/EmployeeRepository .cs | 4 + .../Repository/ReportRepository.cs | 133 +++ .../Repository/ReportRepositoryNew.cs | 61 +- DadmehrGostar.sln | 7 + .../PersonalBootstrapper.cs | 3 + .../PersonalContractingParty.Config.csproj | 1 + .../Pages/Company/SalaryAid/Index.cshtml | 21 +- .../Pages/Company/SalaryAid/Index.cshtml.cs | 154 ++-- .../Company/SalaryAid/ModalImportExcel.cshtml | 105 +++ ServiceHost/Pages/Index.cshtml.cs | 11 +- ServiceHost/ServiceHost.csproj | 1 + .../wwwroot/AssetsClient/images/clipboard.png | Bin 0 -> 1302 bytes .../wwwroot/AssetsClient/images/download.png | Bin 0 -> 1882 bytes .../AssetsClient/images/profile-setting.png | Bin 0 -> 1220 bytes .../pages/SalaryAid/css/Index.css | 7 + .../SalaryAid/css/ModalCreateNewSalaryAid.css | 16 +- .../pages/SalaryAid/css/ModalImportExcel.css | 450 ++++++++++ .../AssetsClient/pages/SalaryAid/js/Index.js | 11 +- .../SalaryAid/js/ModalCreateNewSalaryAid.js | 31 + .../pages/SalaryAid/js/ModalEditSalaryAid.js | 33 +- .../pages/SalaryAid/js/ModalImportExcel.js | 804 ++++++++++++++++++ .../Templates/SalaryAid/SA-Template.xlsx | Bin 0 -> 10937 bytes 31 files changed, 2074 insertions(+), 109 deletions(-) create mode 100644 CompanyManagement.Infrastructure.Excel/CompanyManagement.Infrastructure.Excel.csproj create mode 100644 CompanyManagement.Infrastructure.Excel/SalaryAid/SalaryAidImportExcel.cs create mode 100644 ServiceHost/Areas/Client/Pages/Company/SalaryAid/ModalImportExcel.cshtml create mode 100644 ServiceHost/wwwroot/AssetsClient/images/clipboard.png create mode 100644 ServiceHost/wwwroot/AssetsClient/images/download.png create mode 100644 ServiceHost/wwwroot/AssetsClient/images/profile-setting.png create mode 100644 ServiceHost/wwwroot/AssetsClient/pages/SalaryAid/css/ModalImportExcel.css create mode 100644 ServiceHost/wwwroot/AssetsClient/pages/SalaryAid/js/ModalImportExcel.js create mode 100644 ServiceHost/wwwroot/Excel/Templates/SalaryAid/SA-Template.xlsx diff --git a/0_Framework/Domain/IRepository.cs b/0_Framework/Domain/IRepository.cs index a2601aaa..8c4b008a 100644 --- a/0_Framework/Domain/IRepository.cs +++ b/0_Framework/Domain/IRepository.cs @@ -12,7 +12,8 @@ public interface IRepository where T:class T Get(TKey id); List Get(); void Create(T entity); - + Task CreateAsync(T entity); + bool ExistsIgnoreQueryFilter(Expression> expression); bool Exists(Expression> expression); void SaveChanges(); Task SaveChangesAsync(); diff --git a/0_Framework/InfraStructure/RepositoryBase.cs b/0_Framework/InfraStructure/RepositoryBase.cs index 931739f2..3c573b18 100644 --- a/0_Framework/InfraStructure/RepositoryBase.cs +++ b/0_Framework/InfraStructure/RepositoryBase.cs @@ -27,6 +27,17 @@ namespace _0_Framework.InfraStructure _context.Add(entity); } + public async Task CreateAsync(T entity) + { + await _context.AddAsync(entity); + } + + + public bool ExistsIgnoreQueryFilter(Expression> expression) + { + return _context.Set().IgnoreQueryFilters().Any(expression); + } + public bool Exists(Expression> expression) { return _context.Set().Any(expression); diff --git a/Company.Domain/EmployeeAgg/IEmployeeRepository.cs b/Company.Domain/EmployeeAgg/IEmployeeRepository.cs index c286a936..eb58c559 100644 --- a/Company.Domain/EmployeeAgg/IEmployeeRepository.cs +++ b/Company.Domain/EmployeeAgg/IEmployeeRepository.cs @@ -44,6 +44,7 @@ public interface IEmployeeRepository : IRepository #endregion #region Mahan + Employee GetByNationalCode(string nationalCode); List GetBy(List employeeIds); #endregion diff --git a/Company.Domain/ReportAgg/IReportRepository.cs b/Company.Domain/ReportAgg/IReportRepository.cs index d4876086..a1c0a17f 100644 --- a/Company.Domain/ReportAgg/IReportRepository.cs +++ b/Company.Domain/ReportAgg/IReportRepository.cs @@ -9,6 +9,7 @@ namespace Company.Domain.ReportAgg { public interface IReportRepository { + AllReport GetAllActiveWorkshopsNew(string year, string month); AllReport GetAllActiveWorkshops(string year, string month); WorkshopResult GetWorkshopContractDone(string year, string month, long accountId); WorkshopResult GetWorkshopContractSignDone(string year, string month, long accountId); diff --git a/CompanyManagement.Infrastructure.Excel/CompanyManagement.Infrastructure.Excel.csproj b/CompanyManagement.Infrastructure.Excel/CompanyManagement.Infrastructure.Excel.csproj new file mode 100644 index 00000000..831f89cc --- /dev/null +++ b/CompanyManagement.Infrastructure.Excel/CompanyManagement.Infrastructure.Excel.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + diff --git a/CompanyManagement.Infrastructure.Excel/SalaryAid/SalaryAidImportExcel.cs b/CompanyManagement.Infrastructure.Excel/SalaryAid/SalaryAidImportExcel.cs new file mode 100644 index 00000000..7963cadf --- /dev/null +++ b/CompanyManagement.Infrastructure.Excel/SalaryAid/SalaryAidImportExcel.cs @@ -0,0 +1,240 @@ +using _0_Framework.Application; +using CompanyManagment.EFCore; +using Microsoft.AspNetCore.Http; +using OfficeOpenXml; +using LicenseContext = OfficeOpenXml.LicenseContext; + +namespace CompanyManagement.Infrastructure.Excel.SalaryAid; + +public record SalaryAidImportData(long EmployeeId, long WorkshopId, string FullName, double Amount, string AccountNumber, string NationalCode, string SalaryAidDateTime, int Row, bool Duplicated); + +public class ExcelValidation +{ + public List ValidData { get; set; } = []; + public List RawData { get; set; } = []; + public List Errors { get; set; } = []; +}; + +public record SalaryAidImportExcelError(string Message, int Row, string Columns); + +public enum SalaryAidExcelColumns +{ + None = 0, + FullName = 1, + NationalCode = 2, + AccountNumber = 3, + Amount = 4 +} + +public class SalaryAidImportExcel +{ + private readonly CompanyContext _companyContext; + private const string META_DATA_PASS = "{0B0A49C2-4CA6-456A-BA7B-9FA4D56171C1}"; + + public SalaryAidImportExcel(CompanyContext companyContext) + { + _companyContext = companyContext; + } + + public ExcelValidation ReadAndValidateExcel(IFormFile file, long workshopId) + { + var result = new ExcelValidation + { + ValidData = [] + }; + + ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + + if (file == null || file.Length == 0) + { + result.Errors.Add(new SalaryAidImportExcelError("فایل اکسل ارسال نشده یا خالی است.", 0, SalaryAidExcelColumns.None.ToString())); + return result; + } + + using var stream = new MemoryStream(); + + file.CopyTo(stream); + using var package = new ExcelPackage(stream); + + var worksheet = package.Workbook.Worksheets[0]; + + if (worksheet == null) + { + result.Errors.Add(new SalaryAidImportExcelError("فایل اکسل معتبر نیست.", 0, SalaryAidExcelColumns.None.ToString())); + return result; + } + + + var customPropsXml = package.Workbook.Properties.CustomPropertiesXml; + + // بررسی اینکه آیا ویژگی قبلاً وجود دارد یا نه + var existingProp = customPropsXml.InnerText; + + + + if (existingProp != META_DATA_PASS) + { + result.Errors.Add(new SalaryAidImportExcelError("قالب ارسال شده معتبر نمیباشد", 0, SalaryAidExcelColumns.None.ToString())); + return result; + } + + + // بررسی اینکه هدرها همان چیزی هستند که ما انتظار داریم + if (worksheet.Cells[2, 1].Text != "نام و نام خانوادگی" || + worksheet.Cells[2, 2].Text != "کد ملی" || + worksheet.Cells[2, 3].Text != "شماره حساب" || + worksheet.Cells[2, 4].Text != "مبلغ قابل پرداخت" || + worksheet.Cells[1, 1].Text != "تاریخ پرداخت") + { + result.Errors.Add(new SalaryAidImportExcelError("ساختار فایل اکسل اشتباه است.", 0, SalaryAidExcelColumns.None.ToString())); + return result; + } + + var salaryDateFa = worksheet.Cells[1, 4].Text; + + if (string.IsNullOrWhiteSpace(salaryDateFa)) + { + result.Errors.Add(new SalaryAidImportExcelError("لطفا در سلول زرد رنگ تاریخ پرداخت را وارد کنید", 0, SalaryAidExcelColumns.None.ToString())); + return result; + } + + if (salaryDateFa.TryToGeorgianDateTime(out var salaryDateTime) == false) + { + result.Errors.Add(new SalaryAidImportExcelError("تاریخ وارد شده نامعتبر است", 0, SalaryAidExcelColumns.None.ToString())); + } + if (salaryDateTime > DateTime.Now) + { + result.Errors.Add(new SalaryAidImportExcelError("تاریخ پرداخت مساعده می بایست تاریخ امروز یا قبل تر باشد", 0, SalaryAidExcelColumns.None.ToString())); + } + int rowCount = worksheet.Dimension.Rows; + + int rowStart = 3; + + if (rowCount < rowStart) + { + result.Errors.Add(new SalaryAidImportExcelError("دیتا خالی میباشد", 0, SalaryAidExcelColumns.None.ToString())); + return result; + } + + + for (var row = rowStart; row <= rowCount; row++) + { + var fullName = worksheet.Cells[row, 1]?.Text?.Trim(); + var nationalCode = worksheet.Cells[row, 2]?.Text?.Trim(); + var accountNumber = worksheet.Cells[row, 3]?.Value?.ToString()?.Trim(); + var amountText = worksheet.Cells[row, 4]?.Value?.ToString()?.Trim(); + + if (!double.TryParse(amountText, out double amount) || amount <= 0) + { + result.Errors.Add(new SalaryAidImportExcelError("مبلغ خالی یا نامعتبر است", row, SalaryAidExcelColumns.Amount.ToString())); + + } + result.RawData.Add(new SalaryAidImportData(0, workshopId, fullName, amount, accountNumber, nationalCode, salaryDateFa, row, false)); + + if (string.IsNullOrWhiteSpace(fullName)) + { + result.Errors.Add(new SalaryAidImportExcelError(" نام و نام خانوادگی خالی است", row, SalaryAidExcelColumns.FullName.ToString())); + + } + + if (string.IsNullOrWhiteSpace(accountNumber)) + { + result.Errors.Add(new SalaryAidImportExcelError(" شماره حساب خالی است", row, SalaryAidExcelColumns.AccountNumber.ToString())); + + + } + + if (string.IsNullOrWhiteSpace(nationalCode)) + { + result.Errors.Add(new SalaryAidImportExcelError("کدملی خالی است", row, SalaryAidExcelColumns.NationalCode.ToString())); + + + } + + //if (accountNumber is { Length: < 10 or > 16 }) + //{ + // result.Errors.Add(new SalaryAidImportExcelError("شماره حساب نامعتبر است", row, SalaryAidExcelColumns.AccountNumber.ToString())); + + //} + + if (nationalCode.NationalCodeValid() != "valid") + { + result.Errors.Add(new SalaryAidImportExcelError("کد ملی نامعتبر است", row, SalaryAidExcelColumns.NationalCode.ToString())); + + } + + var employee = _companyContext.Employees.FirstOrDefault(x => x.NationalCode == nationalCode); + if (employee == null) + { + result.Errors.Add(new SalaryAidImportExcelError($" پرسنلی با کد ملی {nationalCode} یافت نشد", row, SalaryAidExcelColumns.NationalCode.ToString())); + continue; + } + + const double threshold = 0.4; + + var inputWords = fullName.Split(' ').ToArray(); + var dbWords = string.Join(" ", employee.FullName.Split(' ')); + var inputMatchCount = inputWords.Count(dbWords.Contains); + var accuracyDbToInput = (double)inputMatchCount / inputWords.Length; + + var dbArray = dbWords.Split(' ').ToArray(); + var dataBaseMatchCount = dbArray.Count(fullName.Contains); + + var accuracyInputToDb = (double)dataBaseMatchCount / dbArray.Length; + + if (accuracyDbToInput < threshold || accuracyInputToDb < threshold) + { + result.Errors.Add(new SalaryAidImportExcelError($" نام و نام خانوادگی {fullName} با کد ملی وارد شده مطابقت ندارد", row, SalaryAidExcelColumns.FullName.ToString())); + } + + if ((_companyContext.LeftWorkList.Any(x => x.EmployeeId == employee.id && x.WorkshopId == workshopId) || + _companyContext.LeftWorkInsuranceList.Any(x => x.EmployeeId == employee.id && x.WorkshopId == workshopId)) == false) + { + result.Errors.Add(new SalaryAidImportExcelError($" پرسنل {fullName} در کارگاه مورد نظر یافت نشد", row, SalaryAidExcelColumns.None.ToString())); + continue; + } + + if (_companyContext.EmployeeBankInformationSet.Any(x => x.EmployeeId == employee.id && x.BankAccountNumber == accountNumber) == false) + { + result.Errors.Add(new SalaryAidImportExcelError($"شماره حساب {accountNumber} برای پرسنل {fullName} یافت نشد", row, SalaryAidExcelColumns.AccountNumber.ToString())); + + } + + var month = Convert.ToInt32(salaryDateFa.Substring(5, 2)); + var year = Convert.ToInt32(salaryDateFa.Substring(0, 4)); + + + if (_companyContext.CustomizeCheckouts.Any(x => x.WorkshopId == workshopId && x.EmployeeId == employee.id && x.YearInt == year && x.MonthInt == month)) + { + result.Errors.Add(new SalaryAidImportExcelError($" پرسنل {fullName} در تاریخ {salaryDateFa} دارای فیش حقوقی غیررسمی است.", row, SalaryAidExcelColumns.None.ToString())); + } + + if (_companyContext.SalaryAids.Any(x => x.Amount == amount && x.EmployeeId == employee.id && x.WorkshopId == workshopId && x.SalaryAidDateTime == salaryDateTime)) + { + // TODO MAHAN: Vafa Add this Code! Please Check it! + + result.RawData.Add(new SalaryAidImportData(employee.id, workshopId, fullName, amount, accountNumber, nationalCode, salaryDateFa, row, true)); + continue; + } + result.ValidData.Add(new SalaryAidImportData(employee.id, workshopId, fullName, amount, accountNumber, nationalCode, salaryDateFa, row, false)); + } + + result.RawData = result.RawData.GroupBy(x => x.Row).Select(x => new SalaryAidImportData(x.First().EmployeeId, + x.First().WorkshopId, x.First().FullName, + x.First().Amount, x.First().AccountNumber, x.First().NationalCode, x.First().SalaryAidDateTime, x.Key, + x.Any(s => s.Duplicated))).ToList(); + + + //result.Errors.GroupBy(x => x.Row).Select(x => new + //{ + // Row = x.Key, + // Data =x.Select(s=>new + // { + // s.Columns, + // s.Message + // }) + //}).ToList(); + + return result; + } +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/SalaryAid/CreateSalaryAidViewModel.cs b/CompanyManagment.App.Contracts/SalaryAid/CreateSalaryAidViewModel.cs index cc9ce82e..9c3ff4c3 100644 --- a/CompanyManagment.App.Contracts/SalaryAid/CreateSalaryAidViewModel.cs +++ b/CompanyManagment.App.Contracts/SalaryAid/CreateSalaryAidViewModel.cs @@ -8,4 +8,5 @@ public class CreateSalaryAidViewModel public long WorkshopId { get; set; } public string Amount { get; set; } public string SalaryDateTime { get; set; } + public string NationalCode { get; set; } } \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/SalaryAid/ISalaryAidApplication.cs b/CompanyManagment.App.Contracts/SalaryAid/ISalaryAidApplication.cs index 5cc91e72..8ff51e07 100644 --- a/CompanyManagment.App.Contracts/SalaryAid/ISalaryAidApplication.cs +++ b/CompanyManagment.App.Contracts/SalaryAid/ISalaryAidApplication.cs @@ -1,5 +1,6 @@  using System.Collections.Generic; +using System.Threading.Tasks; using _0_Framework.Application; namespace CompanyManagment.App.Contracts.SalaryAid; @@ -12,4 +13,6 @@ public interface ISalaryAidApplication OperationResult Edit(EditSalaryAidViewModel command); OperationResult Remove(long id); OperationResult RemoveRange(IEnumerable ids); + + Task CreateRange(List commands); } \ No newline at end of file diff --git a/CompanyManagment.Application/SalaryAidApplication.cs b/CompanyManagment.Application/SalaryAidApplication.cs index 2ac121d0..c17684b6 100644 --- a/CompanyManagment.Application/SalaryAidApplication.cs +++ b/CompanyManagment.Application/SalaryAidApplication.cs @@ -6,7 +6,9 @@ using _0_Framework.Application; using Company.Domain.CheckoutAgg; using CompanyManagment.App.Contracts.Checkout; using System; +using System.Threading.Tasks; using Company.Domain.CustomizeCheckoutAgg; +using Company.Domain.EmployeeAgg; namespace CompanyManagment.Application; @@ -14,11 +16,13 @@ public class SalaryAidApplication : ISalaryAidApplication { private readonly ISalaryAidRepository _salaryAidRepository; private readonly ICustomizeCheckoutRepository _customizeCheckoutRepository; + private readonly IEmployeeRepository _employeeRepository; - public SalaryAidApplication(ISalaryAidRepository salaryAidRepository, ICustomizeCheckoutRepository customizeCheckoutRepository) + public SalaryAidApplication(ISalaryAidRepository salaryAidRepository, ICustomizeCheckoutRepository customizeCheckoutRepository, IEmployeeRepository employeeRepository) { _salaryAidRepository = salaryAidRepository; _customizeCheckoutRepository = customizeCheckoutRepository; + _employeeRepository = employeeRepository; } public List GetSearchList(SalaryAidSearchViewModel searchViewModel) @@ -130,4 +134,51 @@ public class SalaryAidApplication : ISalaryAidApplication _salaryAidRepository.SaveChanges(); return op.Succcedded(); } + + public async Task CreateRange(List commands) + { + var op = new OperationResult(); + foreach (var command in commands) + { + + if (!command.SalaryDateTime.TryToGeorgianDateTime(out var startDate)) + { + return op.Failed("تاریخ وارد شده نامعتبر است"); + } + + if (startDate > DateTime.Now) + { + return op.Failed("تاریخ پرداخت مساعده می بایست تاریخ امروز یا قبل تر باشد"); + + } + if (command.Amount.Length > 15) + { + return op.Failed("مبلغ وارد شده معتبر نیست"); + } + + var month = Convert.ToInt32(command.SalaryDateTime.Substring(5, 2)); + var year = Convert.ToInt32(command.SalaryDateTime.Substring(0, 4)); + + + if (_customizeCheckoutRepository.Exists(x => x.WorkshopId == command.WorkshopId && command.EmployeeIds.Contains(x.EmployeeId) && x.YearInt == year && x.MonthInt == month)) + { + return op.Failed("شما نمیتوانید برای پرسنلی در تاریخی که برای فیش حقوقی صادر شده است مساعده ای دهید"); + } + + foreach (var employeeId in command.EmployeeIds) + { + var id = employeeId; + if (employeeId == 0) + { + var employee = _employeeRepository.GetByNationalCode(command.NationalCode); + id = employee.id; + } + + var entity = new SalaryAid(id, command.WorkshopId, command.Amount.MoneyToDouble(), startDate); + await _salaryAidRepository.CreateAsync(entity); + } + } + await _salaryAidRepository.SaveChangesAsync(); + return op.Succcedded(); + } } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/EmployeeRepository .cs b/CompanyManagment.EFCore/Repository/EmployeeRepository .cs index 825cea9b..c1b63abc 100644 --- a/CompanyManagment.EFCore/Repository/EmployeeRepository .cs +++ b/CompanyManagment.EFCore/Repository/EmployeeRepository .cs @@ -726,6 +726,10 @@ public class EmployeeRepository : RepositoryBase, IEmployeeRepos } } + public Employee GetByNationalCode(string nationalCode) + { + return _context.Employees.FirstOrDefault(x => x.NationalCode == nationalCode); + } #endregion diff --git a/CompanyManagment.EFCore/Repository/ReportRepository.cs b/CompanyManagment.EFCore/Repository/ReportRepository.cs index 56dc334a..79fdcdf1 100644 --- a/CompanyManagment.EFCore/Repository/ReportRepository.cs +++ b/CompanyManagment.EFCore/Repository/ReportRepository.cs @@ -4,6 +4,7 @@ using System.Linq; using _0_Framework.Application; using AccountMangement.Infrastructure.EFCore; using Company.Domain.ReportAgg; +using Company.Domain.WorkshopEmployerAgg; using CompanyManagment.App.Contracts.LeftWork; using CompanyManagment.App.Contracts.Report; using Microsoft.EntityFrameworkCore; @@ -22,6 +23,138 @@ public class ReportRepository : IReportRepository _accountContext = accountContext; } + + public AllReport GetAllActiveWorkshopsNew(string year, string month) + { + //یافتن آغاز و پایان ماه جاری + //یافتن آغاز و پایان ماه بعد + #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; + Console.WriteLine("========================== 1403/12/01 - 1403/12/30 =========================="); + + + //var allLeft = _context.LeftWorkList + // .Include(x => x.Workshop) + // .Count(x => + // x.StartWorkDate < currentMonthEnd && x.LeftWorkDate > currentMonthStart); + + //Console.ForegroundColor = ConsoleColor.Magenta; + //Console.WriteLine("All Persoennel Active : " + allLeft); + + //var leftsDeActive = _context.LeftWorkList + // .Include(x => x.Workshop) + // .Where(x => x.Workshop.IsActiveString != "true") + // .Where(x => + // x.StartWorkDate < currentMonthEnd && x.LeftWorkDate > currentMonthStart); + //Console.ForegroundColor = ConsoleColor.Red; + //Console.WriteLine("DeActive Workshop : " + leftsDeActive.Count()); + + //var ActiveWorkshop = _context.LeftWorkList + // .Include(x => x.Workshop) + // .Where(x => x.Workshop.IsActiveString == "true") + // .Where(x => + // x.StartWorkDate < currentMonthEnd && x.LeftWorkDate > currentMonthStart); + //Console.ForegroundColor = ConsoleColor.Green; + //Console.WriteLine("Active Workshop : " + ActiveWorkshop.Count()); + + + //var leftsActiveContractingParties = _context.LeftWorkList + // .Include(x => x.Workshop) + // .Where(x => x.Workshop.IsActiveString == "true") + // .Where(x => + // x.StartWorkDate < currentMonthEnd && x.LeftWorkDate > currentMonthStart) + // .Join(_context.WorkshopEmployers, + // left => left.WorkshopId, + // workshopEmployer => workshopEmployer.WorkshopId, + // (left, workshopEmployer) => new { left, workshopEmployer}) + // .Join(_context.PersonalContractingParties, + // result => result.workshopEmployer.Employer.id, + // contractingParties => contractingParties.Employers.FirstOrDefault()!.id, + // (result, contractingParties) => new + // { + // result.left, + // result.workshopEmployer, + // contractingParties + // }).Where(x=>x.contractingParties.IsBlock == "false" && x.contractingParties.IsActiveString == "true") + + + // ; + //Console.ForegroundColor = ConsoleColor.Green; + //Console.WriteLine("Active Workshop Join contractingParties : " + leftsActiveContractingParties.Count()); + //var leftsAllContractingParties = _context.LeftWorkList + // .Include(x => x.Workshop) + // .Where(x => x.Workshop.IsActiveString == "true") + // .Where(x => + // x.StartWorkDate < currentMonthEnd && x.LeftWorkDate > currentMonthStart) + // .Join(_context.WorkshopEmployers, + // left => left.WorkshopId, + // workshopEmployer => workshopEmployer.WorkshopId, + // (left, workshopEmployer) => new { left, workshopEmployer }) + // .Join(_context.PersonalContractingParties, + // result => result.workshopEmployer.Employer.id, + // contractingParties => contractingParties.Employers.FirstOrDefault()!.id, + // (result, contractingParties) => new + // { + // result.left, + // result.workshopEmployer, + // contractingParties + // }).Where(x => x.contractingParties.IsBlock == "true" || x.contractingParties.IsActiveString == "false"); + //var workshopListAc = leftsActiveContractingParties.Select(x => x.workshopEmployer.WorkshopId); + //var workshopListAllDeActive = leftsAllContractingParties.Select(x => x.workshopEmployer.WorkshopId); + + //var employeeActive = leftsActiveContractingParties.Select(x => x.left.EmployeeId); + //var employeeDeActive = leftsAllContractingParties.Select(x => x.left.EmployeeId); + //Console.ForegroundColor = ConsoleColor.Green; + //Console.WriteLine("All Workshop Join contractingParties deActive : " + leftsAllContractingParties.Count()); + //var workshops = _context.Workshops + // .Where(x => x.IsActiveString == "true") + // .Include(x => x.LeftWorks.Where(l => l.StartWorkDate < currentMonthEnd && l.LeftWorkDate > currentMonthStart)) + // .ToList(); + //Console.ForegroundColor = ConsoleColor.Green; + //Console.WriteLine("Active Workshop2 : " + workshops.Sum(x=>x.LeftWorks.Count)); + + var accountLeftWork = _accountContext.AccountLeftWorks + .Where(x => x.RoleId == 5) + .Where(x => x.StartWorkGr < currentMonthEnd && x.LeftWorkGr > currentMonthStart) + .Select(x => x.WorkshopId); + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine("AccountLeftWork Count : " + accountLeftWork.Count()); + int i = 1; + foreach (var item in accountLeftWork) + { + Console.WriteLine(i + " - " + item); + i++; + } + return new(); + } + public AllReport GetAllActiveWorkshops(string year, string month) { var watch = System.Diagnostics.Stopwatch.StartNew(); diff --git a/CompanyManagment.EFCore/Repository/ReportRepositoryNew.cs b/CompanyManagment.EFCore/Repository/ReportRepositoryNew.cs index 97030504..c8786e36 100644 --- a/CompanyManagment.EFCore/Repository/ReportRepositoryNew.cs +++ b/CompanyManagment.EFCore/Repository/ReportRepositoryNew.cs @@ -1,11 +1,68 @@ -using System; +using AccountMangement.Infrastructure.EFCore; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using _0_Framework.Application; +using CompanyManagment.App.Contracts.Report; +using Microsoft.EntityFrameworkCore; +using PersianTools.Core; namespace CompanyManagment.EFCore.Repository; -class ReportRepositoryNew +public class ReportRepositoryNew { + private readonly CompanyContext _context; + private readonly AccountContext _accountContext; + + public ReportRepositoryNew(CompanyContext context, AccountContext accountContext) + { + _context = context; + _accountContext = accountContext; + } + + + public AllReport GetAllActiveWorkshopsNew(string year, string month) + { + //یافتن آغاز و پایان ماه جاری + //یافتن آغاز و پایان ماه بعد + #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 lefts = _context.LeftWorkList + .Include(x=>x.Workshop) + .Where(x=>x.Workshop.IsActiveString == "true") + .Count(x => + x.StartWorkDate < currentMonthEnd && x.LeftWorkDate > currentMonthStart); + + + return new(); + } } \ No newline at end of file diff --git a/DadmehrGostar.sln b/DadmehrGostar.sln index 892dfb90..2a84d932 100644 --- a/DadmehrGostar.sln +++ b/DadmehrGostar.sln @@ -78,6 +78,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Query", "Query\Query.csproj EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Query.Bootstrapper", "Query.Bootstrapper\Query.Bootstrapper.csproj", "{02892882-2A02-484B-BAF9-7E63F6BDCFA0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CompanyManagement.Infrastructure.Excel", "CompanyManagement.Infrastructure.Excel\CompanyManagement.Infrastructure.Excel.csproj", "{BF98173C-42AF-4897-A7CB-4CACEB2B52A2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -172,6 +174,10 @@ Global {02892882-2A02-484B-BAF9-7E63F6BDCFA0}.Debug|Any CPU.Build.0 = Debug|Any CPU {02892882-2A02-484B-BAF9-7E63F6BDCFA0}.Release|Any CPU.ActiveCfg = Release|Any CPU {02892882-2A02-484B-BAF9-7E63F6BDCFA0}.Release|Any CPU.Build.0 = Release|Any CPU + {BF98173C-42AF-4897-A7CB-4CACEB2B52A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF98173C-42AF-4897-A7CB-4CACEB2B52A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF98173C-42AF-4897-A7CB-4CACEB2B52A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF98173C-42AF-4897-A7CB-4CACEB2B52A2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -205,6 +211,7 @@ Global {0E6A32F1-1BCB-45A1-BB1A-A5B8AFA8F551} = {09517B4E-C699-4D57-8590-0B773228820A} {339E05B6-E99F-4403-AFDF-CD0540E96C8D} = {708E8D7E-F190-47C5-B78E-F43131FB7D6D} {02892882-2A02-484B-BAF9-7E63F6BDCFA0} = {708E8D7E-F190-47C5-B78E-F43131FB7D6D} + {BF98173C-42AF-4897-A7CB-4CACEB2B52A2} = {86921E1B-2AFA-4B8A-9403-EE16D58B5B26} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E6CFB3A7-A7C8-4E82-8F06-F750408F0BA9} diff --git a/PersonalContractingParty.Config/PersonalBootstrapper.cs b/PersonalContractingParty.Config/PersonalBootstrapper.cs index f9ef3bfc..a9c701e4 100644 --- a/PersonalContractingParty.Config/PersonalBootstrapper.cs +++ b/PersonalContractingParty.Config/PersonalBootstrapper.cs @@ -194,6 +194,7 @@ using CompanyManagment.App.Contracts.EmployeeBankInformation; using Company.Domain.EmployeeDocumentItemAgg; using Company.Domain.EmployeeDocumentsAdminSelectionAgg; using Company.Domain.EmployeeDocumentsAgg; +using CompanyManagement.Infrastructure.Excel.SalaryAid; using CompanyManagment.App.Contracts.EmployeeDocuments; using CompanyManagment.App.Contracts.EmployeeDocumentsAdminSelection; @@ -406,6 +407,8 @@ public class PersonalBootstrapper services.AddTransient(); services.AddTransient(); + + services.AddTransient(); #endregion #region Pooya diff --git a/PersonalContractingParty.Config/PersonalContractingParty.Config.csproj b/PersonalContractingParty.Config/PersonalContractingParty.Config.csproj index 8bd57473..ecb756e9 100644 --- a/PersonalContractingParty.Config/PersonalContractingParty.Config.csproj +++ b/PersonalContractingParty.Config/PersonalContractingParty.Config.csproj @@ -9,6 +9,7 @@ + diff --git a/ServiceHost/Areas/Client/Pages/Company/SalaryAid/Index.cshtml b/ServiceHost/Areas/Client/Pages/Company/SalaryAid/Index.cshtml index 787dddf9..3ac55a4e 100644 --- a/ServiceHost/Areas/Client/Pages/Company/SalaryAid/Index.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/SalaryAid/Index.cshtml @@ -118,7 +118,7 @@
-
+
+ @*
*@
-
+
لیست مساعده
-
+
@*
*@
+
تاریخ
نام پرسنل
شماره پرسنلی
مبلغ
-
تاریخ
عملیات
@@ -249,8 +257,7 @@
- -