merge from teamwork

This commit is contained in:
MahanCh
2025-05-26 17:30:14 +03:30
parent 7bcc052ec6
commit eaaab56421
8 changed files with 3673 additions and 3372 deletions

View File

@@ -74,7 +74,8 @@ public class AdminMonthlyOverviewListViewModel
public string AdminFullName { get; set; }
public string EmployerName { get; set; }
public string EmployerPhoneNumber { get; set; }
public int EmployeeCount { get; set; }
public int ContractEmployeeCount { get; set; }
public int CheckoutEmployeeCount { get; set; }
public AdminMonthlyOverviewStatus Status { get; set; }
public bool IsBlock { get; set; }
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using _0_Framework.Application;
@@ -25,6 +26,7 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
public async Task<List<AdminMonthlyOverviewListViewModel>> GetWorkshopStatus(AdminMonthlyOverviewSearchModel searchModel)
{
var year = searchModel.Year;
var month = searchModel.Month;
var accountId = searchModel.AdminAccountId;
@@ -32,6 +34,9 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
if ($"{year:0000}/{month:00}/01".TryToGeorgianDateTime(out var targetDate) == false)
return [];
_ = $"{year:0000}/{month:00}/01".ToGeorgianDateTime().AddMonthsFa(1, out var nextMonth);
// دریافت اطلاعات ادمین
var adminAccount = await _accountContext.Accounts.FirstOrDefaultAsync(x => x.id == searchModel.AdminAccountId);
@@ -40,28 +45,28 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
return [];
// دریافت طرف حساب های معتبر برای تاریخ مورد نظر
var contractingPartyIds = await _companyContext.InstitutionContractSet.AsNoTracking()
var contractingPartyIds = _companyContext.InstitutionContractSet.AsNoTracking()
.Where(c => c.ContractStartGr <= targetDate && c.ContractEndGr >= targetDate && c.IsActiveString == "true")
.Select(c => c.ContractingPartyId)
.ToListAsync();
.Select(c => c.ContractingPartyId);
// دریافت کارگاه‌های مرتبط با اکانت
var accountWorkshopIds = await _companyContext.WorkshopAccounts
var workshopAccounts = _companyContext.WorkshopAccounts
.AsNoTracking()
.Where(w => w.AccountId == accountId)
.Select(w => w.WorkshopId)
.ToListAsync();
.Select(w => w.WorkshopId);
var workshopsHasLeftWorkEmployees = _companyContext.LeftWorkList.Where(x =>
(x.StartWorkDate <= targetDate && x.LeftWorkDate.AddDays(-1) >= targetDate)
|| (x.StartWorkDate <= nextMonth && x.LeftWorkDate.AddDays(-1) >= nextMonth)&& workshopAccounts.Contains(x.WorkshopId)).Select(x=>x.WorkshopId);
// دریافت کارگاه‌های مربوط به طرف حساب و اکانت
// Replace the selected code with the following to return a list of anonymous objects containing both workshop and contractingParty
var workshopsWithContractingParty = await _companyContext.Workshops
.AsNoTracking()
.Where(w => accountWorkshopIds.Contains(w.id))
.Where(w => workshopsHasLeftWorkEmployees.Contains(w.id))
.Include(w => w.WorkshopEmployers)
.ThenInclude(we => we.Employer)
.ThenInclude(e => e.ContractingParty).AsSplitQuery().
@@ -78,8 +83,10 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
})
.ToListAsync();
var workshopIds = workshopsWithContractingParty.Select(x => x.Workshop.id).ToList();
// پیدا کردن کارگاه‌هایی که قبلاً برای این ماه/سال AdminMonthlyOverview دارند
var adminMonthlyOverviewWorkshopIds = await _companyContext.AdminMonthlyOverviews
.AsNoTracking()
@@ -92,13 +99,14 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
.Except(adminMonthlyOverviewWorkshopIds)
.ToList();
// ایجاد رکوردهای AdminMonthlyOverview که وجود ندارند
if (notExistAdminMonthlyReviewsWorkshopIds.Any())
await CreateRangeAdminMonthlyOverview(notExistAdminMonthlyReviewsWorkshopIds, month, year);
// به‌روزرسانی وضعیت‌ها
await UpdateAdminMonthlyOverviewStatus(year, month, workshopIds);
await UpdateAdminMonthlyOverviewStatus(year, month, workshopIds, targetDate, nextMonth);
if (searchModel.ActivationStatus != IsActive.None)
{
@@ -125,16 +133,21 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
adminMonthlyOverviewsQuery = adminMonthlyOverviewsQuery.Where(x => searchWorkshopId.Contains(x.WorkshopId));
}
var employeeCheckoutCounts = _companyContext.LeftWorkList.Where(x =>
x.StartWorkDate <= targetDate && x.LeftWorkDate.AddDays(-1) >= targetDate && workshopIds.Contains(x.WorkshopId))
.GroupBy(x => x.WorkshopId).Select(x => new { EmployeeCounts = x.Count(), WorkshopId = x.Key }).ToList();
var employeeContractCounts = _companyContext.LeftWorkList.Where(x =>
x.StartWorkDate <= nextMonth && x.LeftWorkDate.AddDays(-1) >= nextMonth && workshopIds.Contains(x.WorkshopId))
.GroupBy(x => x.WorkshopId).Select(x => new { EmployeeCounts = x.Count(), WorkshopId = x.Key }).ToList();
var adminMonthlyOverviewsList = await adminMonthlyOverviewsQuery.ToListAsync();
var employeeCounts = _companyContext.LeftWorkList.Where(x =>
x.StartWorkDate < targetDate && x.LeftWorkDate > targetDate && workshopIds.Contains(x.WorkshopId))
.GroupBy(x => x.WorkshopId).Select(x => new { EmployeeCounts = x.Count(), WorkshopId = x.Key }).ToList();
var adminMonthlyOverviewList = adminMonthlyOverviewsList.Select(x =>
{
var employeeCount = employeeCounts.FirstOrDefault(e => e.WorkshopId == x.WorkshopId);
var employeeCheckoutCount = employeeCheckoutCounts.FirstOrDefault(e => e.WorkshopId == x.WorkshopId);
var employeeContractCount = employeeContractCounts.FirstOrDefault(e => e.WorkshopId == x.WorkshopId);
var workshopWithContractingParty =
workshopsWithContractingParty.FirstOrDefault(w => w.Workshop.id == x.WorkshopId);
@@ -154,12 +167,14 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
EmployerName = employer?.FullName ?? "",
EmployerPhoneNumber = employer?.Phone ?? "",
AdminFullName = adminAccount.Fullname,
EmployeeCount = employeeCount?.EmployeeCounts ?? 0,
CheckoutEmployeeCount = employeeCheckoutCount?.EmployeeCounts ?? 0,
ContractEmployeeCount = employeeContractCount?.EmployeeCounts ?? 0,
AgentPhoneNumber = "",
IsBlock = contractingParty?.IsBlock == "true"
};
}).OrderBy(x => x.IsBlock).ToList();
return adminMonthlyOverviewList;
}
@@ -193,51 +208,62 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
}
private async Task UpdateAdminMonthlyOverviewStatus(int year, int month, List<long> workshopIds)
private async Task UpdateAdminMonthlyOverviewStatus(int year, int month, List<long> workshopIds, DateTime targetDate, DateTime nextMonth)
{
var targetDate = $"{year:0000}/{month:00}/01".ToGeorgianDateTime();
_ = $"{year:0000}/{month:00}/01".ToGeorgianDateTime().AddMonthsFa(1, out var nextMonth);
var workingCheckoutEmployeeIds = _companyContext.LeftWorkList.AsNoTracking()
.Where(x => workshopIds.Contains(x.WorkshopId) && x.StartWorkDate <= targetDate && x.LeftWorkDate.AddDays(-1) >= targetDate)
.Select(x => new { x.WorkshopId, x.EmployeeId });
var workingEmployeeIds = (await _companyContext.LeftWorkList.AsNoTracking()
.Where(x => workshopIds.Contains(x.WorkshopId) && x.StartWorkDate <= targetDate && x.LeftWorkDate >= targetDate)
.Select(x => new { x.WorkshopId, x.EmployeeId })
.ToListAsync()).Distinct();
var workingContractEmployeeIds = _companyContext.LeftWorkList.AsNoTracking()
.Where(x => workshopIds.Contains(x.WorkshopId) && x.StartWorkDate <= nextMonth && x.LeftWorkDate.AddDays(-1) >= nextMonth)
.Select(x => new { x.WorkshopId, x.EmployeeId });
var contractSet = (await _companyContext.Contracts.AsNoTracking()
.Where(x => x.ContarctStart <= nextMonth && x.ContractEnd >= nextMonth)
.Where(x => x.ContarctStart <= nextMonth && x.ContractEnd >= nextMonth && workshopIds.Contains(x.WorkshopIds))
.Select(x => new { x.WorkshopIds, x.EmployeeId })
.ToListAsync())
.Select(x => (x.WorkshopIds, x.EmployeeId))
.ToHashSet();
var checkoutSet = (await _companyContext.CheckoutSet.AsNoTracking()
.Where(x => x.ContractStart <= targetDate && x.ContractEnd >= targetDate)
.Where(x => x.ContractStart <= targetDate && x.ContractEnd >= targetDate && workshopIds.Contains(x.WorkshopId))
.Select(x => new { x.WorkshopId, x.EmployeeId })
.ToListAsync())
.Select(x => (x.WorkshopId, x.EmployeeId))
.ToHashSet();
var grouped = workingEmployeeIds.GroupBy(x => x.WorkshopId).ToList();
var workingCheckoutGrouping = workingCheckoutEmployeeIds.GroupBy(x => x.WorkshopId).ToList();
var workshopsWithFullContracts = grouped
.Where(g => g.All(emp => contractSet.Contains((emp.WorkshopId, emp.EmployeeId))))
.Select(g => g.Key)
var workingContractGrouping = workingContractEmployeeIds.GroupBy(x => x.WorkshopId).Select(x => new
{
WorkshopId = x.Key,
Data = x.ToList()
}).ToList();
var workshopsContractWithoutEmployees = workshopIds.Except(workingContractGrouping.Select(x => x.WorkshopId)).ToList();
var workshopsWithFullContracts = workingContractGrouping
.Where(g => g.Data.All(emp => contractSet.Contains((emp.WorkshopId, emp.EmployeeId))))
.Select(g => g.WorkshopId)
.ToList();
var workshopsWithFullCheckout = grouped
var workshopsWithFullCheckout = workingCheckoutGrouping
.Where(g => g.All(emp => checkoutSet.Contains((emp.WorkshopId, emp.EmployeeId))))
.Select(g => g.Key)
.ToList();
var fullyCoveredWorkshops = workshopsWithFullContracts.Intersect(workshopsWithFullCheckout).ToList();
var notFullyCoveredWorkshops = grouped
.Where(g => g.Any(emp =>
!contractSet.Contains((emp.WorkshopId, emp.EmployeeId)) ||
!checkoutSet.Contains((emp.WorkshopId, emp.EmployeeId))))
.Select(g => g.Key)
.ToList();
//var notFullyCoveredWorkshops = groupedCheckout
// .Where(g => g.Any(emp =>
// !contractSet.Contains((emp.WorkshopId, emp.EmployeeId)) ||
// !checkoutSet.Contains((emp.WorkshopId, emp.EmployeeId))))
// .Select(g => g.Key)
// .ToList();
var notFullyCoveredWorkshops = workshopIds.Except(fullyCoveredWorkshops);
var adminMonthlyOverviews = _companyContext.AdminMonthlyOverviews
.Where(x => x.Month == month && x.Year == year);

View File

@@ -41,7 +41,7 @@
@* Search *@
<div class="container-fluid d-block">
<div class="container-fluid d-none d-md-block">
<div class="row">
<div class="search-box card">
<div class="row">
@@ -116,6 +116,58 @@
</div>
</div>
<!-- Advance Search Box -->
<div class="tw-block md:tw-hidden tw-mb-1">
<div class="tw-flex tw-items-center tw-justify-between">
<div class="search-box tw-w-full tw-bg-white tw-p-2">
<div class="tw-flex tw-items-center tw-justify-between tw-gap-2 tw-mb-2">
<div class="tw-w-full">
<select class="form-select" id="year-select-mobile" name="YearFa" asp-for="SearchModel.Year">
<option value="0" disabled="disabled">سال</option>
@foreach (var year in Model.YearlyList)
{
<option value=@year>@year</option>
}
</select>
</div>
<div class="tw-w-full">
<select class="form-select" id="month-select-mobile" name="MonthFa">
<option value="0" disabled="disabled">ماه</option>
<option value="1">فروردین</option>
<option value="2">اردیبهشت</option>
<option value="3">خرداد</option>
<option value="4">تیر</option>
<option value="5">مرداد</option>
<option value="6">شهریور</option>
<option value="7">مهر</option>
<option value="8">آبان</option>
<option value="9">آذر</option>
<option value="10">دی</option>
<option value="11">بهمن</option>
<option value="12">اسفند</option>
</select>
</div>
</div>
<div class="tw-flex tw-justify-between tw-text-center">
<button class="btn-search tw-flex tw-items-center tw-justify-center tw-w-full" type="button" data-bs-toggle="modal" data-bs-target="#searchModal">
<span>جستجو پیشرفته</span>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<circle cx="11" cy="11" r="6" stroke="white"/>
<path d="M20 20L17 17" stroke="white" stroke-linecap="round"/>
</svg>
</button>
</div>
</div>
</div>
</div>
<!-- End Advance Search Box -->
@* TabBar *@
<div class="tw-overflow-x-auto tw-w-full custom-scrollbar-x mt-3">
<div class="tab-bar tw-flex tw-gap-1 tw-whitespace-nowrap tw-w-max ">
@@ -179,6 +231,13 @@
<div class="monthly-table__body tw-whitespace-nowrap" id="load-data-html-step4" style="display: none;">
</div>
<div id="loadingSkeleton" style="display: contents;">
@for (int j = 0; j < 30; j++)
{
<div class="skeleton-loader" style="margin: 3px 0 !important;height: 35px;"></div>
}
</div>
</div>
</div>
@@ -187,30 +246,20 @@
<div class="monthly-table ">
<div class="monthly-table__head tw-font-[600] tw-mb-1 tw-flex tw-h-[35px] tw-items-center tw-whitespace-nowrap tw-rounded-[5px] tw-bg-[#3B73D0] tw-px-2 tw-text-white tw-text-[14px]">
<div class="monthly-table__head-cell tw-w-[2%]">ردیف</div>
<div class="monthly-table__head-cell tw-w-[13%] tw-text-center">ش بایگانی</div>
<div class="monthly-table__head-cell tw-w-[15%] tw-text-center">نام کارگاه</div>
<div class="monthly-table__head-cell tw-w-[15%] tw-text-center">نام کارفرما</div>
<div class="monthly-table__head-cell tw-w-[5%] tw-text-center">استان</div>
<div class="monthly-table__head-cell tw-w-[5%] tw-text-center">شهرستان</div>
<div class="monthly-table__head-cell tw-w-[35%] tw-text-center">جزئیات نشانی </div>
<div class="monthly-table__head-cell tw-w-[7%] tw-text-center">ش بایگانی</div>
<div class="monthly-table__head-cell tw-w-[18%] tw-text-start">نام کارگاه</div>
<div class="monthly-table__head-cell tw-w-[14%] tw-text-start">نام کارفرما</div>
<div class="monthly-table__head-cell tw-w-[7%] tw-text-center">استان</div>
<div class="monthly-table__head-cell tw-w-[7%] tw-text-center">شهرستان</div>
<div class="monthly-table__head-cell tw-w-[35%] tw-text-start">جزئیات نشانی </div>
<div class="monthly-table__head-cell tw-w-[10%] tw-text-center">وضعیت</div>
</div>
<div class="monthly-table__body tw-whitespace-nowrap" id="load-data-html-stepAll">
</div>
</div>
</div>
@* //--------- Mobile --------- *@
@* Monthly Table Mobile *@
<div class="monthly-card-mobile tw-block md:tw-hidden " id="overviewSteps-mobile">
@@ -218,7 +267,7 @@
<div class="monthly-table__head tw-font-[500] tw-mb-[3px] tw-flex tw-h-[35px] tw-items-center tw-whitespace-nowrap tw-rounded-[5px] tw-bg-[#3B73D0] tw-px-2 tw-text-white tw-text-[8px] md:tw-font-[600] md:tw-text-[14px]">
<div class="monthly-table__head-cell tw-w-[5%] tw-text tw-text-center">ردیف</div>
<div class="monthly-table__head-cell tw-w-[20%] tw-text-center">ش بایگانی</div>
<div class="monthly-table__head-cell tw-w-[25%] tw-text-center">نام کارگاه</div>
<div class="monthly-table__head-cell tw-w-[25%] tw-text-right">نام کارگاه</div>
<div class="monthly-table__head-cell tw-w-[40%] tw-text-center">شماره تماس نماینده</div>
<div class="monthly-table__head-cell tw-w-[10%] tw-text-end">عملیات</div>
</div>
@@ -259,6 +308,78 @@
</div>
<!-- Modal From Bottom For Advance Search -->
<div class="modal fade" id="searchModal" tabindex="-1" data-bs-backdrop="static" aria-labelledby="searchModalModalLabel" aria-hidden="true">
<div class="modal-dialog modal-fullscreen">
<div class="modal-content">
<div class="modal-header d-block text-center pb-0">
<div class="iphone-line mx-auto mb-3"></div>
<h5 class="modal-title mb-4 text-start" id="searchModalLabel">جستجوی پیشرفته</h5>
</div>
<div class="modal-body pt-0 mb-3">
<div class="container-fluid search-box">
<div id="overlaySearchAdvance" class=""></div>
<div class="row">
<div class="tw-grid tw-grid-cols-2 md:tw-grid-cols-12 gap-2">
<div class="tw-col-span-1 md:tw-col-span-2">
<select class="form-select EmployerSelect2OptionMobile" aria-label="انتخاب کارفرما" id="employer-select-mobile" name="employerName">
<option value="0">انتخاب کارفرما</option>
</select>
</div>
<div class="tw-col-span-1 md:tw-col-span-2">
<select class="form-select WorkshopSelect2OptionMobile" aria-label="نام کارگاه /شماره بایگانی ..." id="workshop-select-mobile" data-selected-name="نام کارگاه /شماره بایگانی ...">
<option value="0"> نام کارگاه /شماره بایگانی </option>
</select>
</div>
<div class="tw-col-span-1 md:tw-col-span-2">
<select class="form-select AdminPersonnelNameSelect2OptionMobile" aria-label="انتخاب اعضاء" id="admin-personnel-select-mobile" name="adminpersonnelName">
<option value=""> انتخاب اعضاء </option>
</select>
</div>
<div class="">
<select class="form-select" id="status-select-mobile" name="status">
<option value="2" selected="selected">فعال/غیر فعال</option>
<option value="1">فعال</option>
<option value="0">غیر فعال</option>
</select>
</div>
</div>
<div class="col-12">
<a href="/AdminNew/Company/MonthlyOverview" class="btn-clear-filter disable py-2 text-center d-block w-100 mt-2">
<span class="w-100">حذف جستجو</span>
</a>
</div>
</div>
</div>
</div>
<div class="modal-footer justify-content-center align-items-center">
<div class="container-fluid">
<div class="row">
<div class="col-6 text-end">
<button type="button" class="btn-cancel w-100" data-bs-dismiss="modal">بستن</button>
</div>
<div class="col-6 text-start">
<button type="submit" class="btn-search btn-search-click-mobile w-100">جستجو</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- End Modal From Bottom For Advance Search -->
@section Script {
<script src="~/assetsclient/js/site.js?ver=@adminVersion"></script>
<script src="~/assetsclient/libs/jalaali-js/jalaali.js"></script>

View File

@@ -19,4 +19,3 @@
"tailwindcss": "^3.4.17"
}
}
د

View File

@@ -156,10 +156,10 @@
visibility: hidden;
opacity: 0;
width: max-content;
max-width: 300px;
/*max-width: 400px;*/
background-color: #333;
color: #fff;
text-align: center;
text-align: start;
border-radius: 4px;
padding: 5px 8px;
z-index: 100000;
@@ -221,7 +221,7 @@
.monthly-table__toggle-value {
font-weight: 400;
font-size: 12px;
color: #818181
color: #818181;
}
/*Awaiting reference Table*/
.monthly-table__stage-button {
@@ -272,10 +272,15 @@
.monthly-table__status-button {
width: 166px;
height: 35px;
}
.monthly-table__status-button--documents-setup {
background-color: #C8C8C8 !important;
}
}
@media(max-width:768px) {
.monthly-table__toggle-value {
white-space: break-spaces;
}
}

View File

@@ -10,18 +10,27 @@
$("#employer-select").val(employer);
$("#workshop-select").val(workshopAndArchive);
$('#year-select-mobile').val(year !== "0" ? year : Number($('#year-select').val()));
$("#month-select-mobile").val(month !== "0" ? month : currentMonth);
$("#employer-select-mobile").val(employer);
$("#workshop-select-mobile").val(workshopAndArchive);
if (workshopAndArchive && workshopAndArchiveName) {
const option = new Option(workshopAndArchiveName, workshopAndArchive, true, true);
$("#workshop-select").append(option).trigger('change');
$("#workshop-select-mobile").append(option).trigger('change');
}
if (employer && employerName) {
const option = new Option(employerName, employer, true, true);
$("#employer-select").append(option).trigger('change');
$("#employer-select-mobile").append(option).trigger('change');
}
$("#admin-personnel-select").val(adminPersonnel);
$("#admin-personnel-select-mobile").val(adminPersonnel);
$("#status-select").val(status !== "" ? status : 2);
$("#status-select-mobile").val(status !== "" ? status : 2);
if (year !== "0" || month !== '0' || employer !== '0' || workshopAndArchive !== '0' || adminPersonnel !== '0' || status !== '') {
$('.btn-clear-filter').removeClass('disable');
@@ -63,6 +72,40 @@
//dropdownParent: $('#MainModal')
});
$(".EmployerSelect2OptionMobile").select2({
language: "fa",
dir: "rtl",
ajax: {
url: employerSelectListUrl,
dataType: 'json',
delay: 250,
data: function (params) {
return {
search: params.term
};
},
processResults: function (response) {
const originalList = response.data.map(item => ({
id: item.id,
text: item.name
}));
const manualItems = [
{ id: 0, text: 'انتخاب کارفرما ...' }
];
const finalList = manualItems.concat(originalList);
return {
results: finalList
};
},
cache: false
},
minimumInputLength: 0,
dropdownParent: $('#searchModal')
});
$(".WorkshopSelect2Option").select2({
language: "fa",
dir: "rtl",
@@ -97,30 +140,85 @@
//dropdownParent: $('#MainModal')
});
$(".WorkshopSelect2OptionMobile").select2({
language: "fa",
dir: "rtl",
ajax: {
url: workshopSelectListUrl,
dataType: 'json',
delay: 250,
data: function (params) {
return {
search: params.term
};
},
processResults: function (response) {
const originalList = response.data.map(item => ({
id: item.id,
text: item.name + " - " + item.archiveCode
}));
const manualItems = [
{ id: 0, text: 'انتخاب نام کارگاه /شماره بایگانی ...' }
];
const finalList = manualItems.concat(originalList);
return {
results: finalList
};
},
cache: false
},
minimumInputLength: 0,
dropdownParent: $('#searchModal')
});
$(".AdminPersonnelNameSelect2Option").select2({
language: "fa",
dir: "rtl"
//dropdownParent: $('#MainModal')
});
$(".AdminPersonnelNameSelect2OptionMobile").select2({
language: "fa",
dir: "rtl",
dropdownParent: $('#MainModal')
});
$("#status-select").select2({
language: "fa",
dir: "rtl"
//dropdownParent: $('#MainModal')
});
$("#status-select-mobile").select2({
language: "fa",
dir: "rtl",
dropdownParent: $('#searchModal')
});
$("#year-select").select2({
language: "fa",
dir: "rtl"
//dropdownParent: $('#MainModal')
});
$("#year-select-mobile").select2({
language: "fa",
dir: "rtl",
dropdownParent: $('#searchModal')
});
$("#month-select").select2({
language: "fa",
dir: "rtl"
//dropdownParent: $('#MainModal')
});
$("#month-select-mobile").select2({
language: "fa",
dir: "rtl",
dropdownParent: $('#searchModal')
});
await ajaxAdminPersonnel();
await loadMonthlyOverviewData();
@@ -155,22 +253,22 @@ $(document).on('click', '.btn-search-click, .btn-search-click-mobile', function
var filterStatus = status;
if (window.matchMedia('(max-width: 767px)').matches) {
filterYear = $('#year-select').val();
filterMonth = $('#month-select').val().trim();
filterEmployer = $('#employer-select').val().trim();
filterEmployerName = $('#employer-select').select2('data')[0].text;
filterWorkshopAndArchive = $('#workshop-select').val();
filterWorkshopAndArchiveName = $("#workshop-select").select2('data')[0].text;
filterAdminPersonnel = $('#admin-personnel-select').val().trim();
filterStatus = $('#status-select').val();
filterYear = $('#year-select-mobile').val();
filterMonth = $('#month-select-mobile').val();
filterEmployer = $('#employer-select-mobile').val();
filterEmployerName = $('#employer-select-mobile').select2('data')[0].text;
filterWorkshopAndArchive = $('#workshop-select-mobile').val();
filterWorkshopAndArchiveName = $("#workshop-select-mobile").select2('data')[0].text;
filterAdminPersonnel = $('#admin-personnel-select-mobile').val();
filterStatus = $('#status-select-mobile').val();
} else {
filterYear = $('#year-select').val();
filterMonth = $('#month-select').val().trim();
filterEmployer = $('#employer-select').val().trim();
filterMonth = $('#month-select').val();
filterEmployer = $('#employer-select').val();
filterEmployerName = $('#employer-select').select2('data')[0].text;
filterWorkshopAndArchive = $('#workshop-select').val();
filterWorkshopAndArchiveName = $("#workshop-select").select2('data')[0].text;
filterAdminPersonnel = $('#admin-personnel-select').val().trim();
filterAdminPersonnel = $('#admin-personnel-select').val();
filterStatus = $('#status-select').val();
}
@@ -182,6 +280,11 @@ $(document).on('click', '.btn-search-click, .btn-search-click-mobile', function
paramsUrl(filterYear, filterMonth, filterEmployer, filterEmployerName, filterWorkshopAndArchive, filterWorkshopAndArchiveName, filterAdminPersonnel, filterStatus);
var isMobile = window.matchMedia('(max-width: 767px)').matches;
if (isMobile) {
$('#searchModal').modal('hide');
}
loadMonthlyOverviewData();
});
@@ -237,6 +340,14 @@ $(document).on('click', '.js-document-click', function () {
});
async function loadMonthlyOverviewData() {
$('#load-data-html-step0').html('');
$('#load-data-html-step1').html('');
$('#load-data-html-step2').html('');
$('#load-data-html-step3').html('');
$('#load-data-html-step4').html('');
$('#load-data-html-stepAll').html('');
$("#loadingSkeleton").show();
var html = '';
const { year, month, employer, employerName, workshopAndArchive, workshopAndArchiveName, adminPersonnel, status } = getSearchParamsFromUrl();
@@ -272,7 +383,6 @@ async function loadMonthlyOverviewData() {
var countStatusStep5 = responseData.length;
$("#step5-badge").text(countStatusStep5).toggle(countStatusStep5 > 0);
if (responseData.length > 0) {
initialDocument(responseData);
monthlyOverviewStatusDocument(responseData);
@@ -291,6 +401,8 @@ async function loadMonthlyOverviewData() {
$('#load-data-html-step4').html(html);
$('#load-data-html-stepAll').html(html);
}
$("#loadingSkeleton").hide();
} catch (err) {
console.error("خطا در ajax.post:", err);
}
@@ -341,8 +453,8 @@ function initialDocument(data) {
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل :</span>
<span class="monthly-table__toggle-value">${item.employeeCount} نفر</span>
<span class="monthly-table__toggle-label">تعداد پرسنل قرارداد:</span>
<span class="monthly-table__toggle-value">${item.contractEmployeeCount} نفر</span>
</div>
</div>
@@ -350,6 +462,11 @@ function initialDocument(data) {
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-w-[35%]">
<span class="monthly-table__toggle-label tw-w-[50%] ">شماره تماس کارفرما :</span>
<span class="monthly-table__toggle-value tw-w-[50%]">${item.employerPhoneNumber}</span>
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل تصفیه:</span>
<span class="monthly-table__toggle-value">${item.checkoutEmployeeCount} نفر</span>
</div>
</div>
</div>
@@ -371,7 +488,7 @@ function initialDocument(data) {
</div>
<div class="monthly-table__cell tw-w-[20%] tw-text-center">${item.workshopArchiveCode}</div>
<div class="monthly-table__cell tw-w-[40%] tw-text-center tw-text-xs"><div class="monthly-table__cell-title">${item.workshopName}</div></div>
<div class="monthly-table__cell tw-w-[40%] tw-text-right tw-text-xs"><div class="monthly-table__cell-title">${item.workshopName}</div></div>
<div class="monthly-table__cell tw-w-[10%] tw-text-center">${item.agentPhoneNumber}</div>
@@ -505,14 +622,18 @@ function monthlyOverviewStatusDocument(data) {
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل :</span>
<span class="monthly-table__toggle-value">${item.employeeCount} نفر</span>
<span class="monthly-table__toggle-label">تعداد پرسنل قرارداد:</span>
<span class="monthly-table__toggle-value">${item.contractEmployeeCount} نفر</span>
</div>
</div>
<div class="monthly-table__toggle-row tw-flex tw-gap-2">
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-w-[35%]">
<span class="monthly-table__toggle-label tw-w-[50%] ">شماره تماس کارفرما :</span>
<span class="monthly-table__toggle-value tw-w-[50%]">${item.employerPhoneNumber}</span>
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل تصفیه:</span>
<span class="monthly-table__toggle-value">${item.checkoutEmployeeCount} نفر</span>
</div>
</div>
</div>
@@ -659,8 +780,8 @@ function monthlyOverviewStatusDocument(data) {
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل :</span>
<span class="monthly-table__toggle-value">${item.employeeCount} نفر</span>
<span class="monthly-table__toggle-label">تعداد پرسنل قرارداد:</span>
<span class="monthly-table__toggle-value">${item.contractEmployeeCount} نفر</span>
</div>
</div>
@@ -668,6 +789,10 @@ function monthlyOverviewStatusDocument(data) {
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-w-[35%]">
<span class="monthly-table__toggle-label tw-w-[50%] ">شماره تماس کارفرما :</span>
<span class="monthly-table__toggle-value tw-w-[50%]">${item.employerPhoneNumber}</span>
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل تصفیه:</span>
<span class="monthly-table__toggle-value">${item.checkoutEmployeeCount} نفر</span>
</div>
</div>
</div>
@@ -816,8 +941,8 @@ function monthlyOverviewStatusDocument(data) {
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل :</span>
<span class="monthly-table__toggle-value">${item.employeeCount} نفر</span>
<span class="monthly-table__toggle-label">تعداد پرسنل قرارداد:</span>
<span class="monthly-table__toggle-value">${item.contractEmployeeCount} نفر</span>
</div>
</div>
@@ -826,6 +951,10 @@ function monthlyOverviewStatusDocument(data) {
<span class="monthly-table__toggle-label tw-w-[50%] ">شماره تماس کارفرما :</span>
<span class="monthly-table__toggle-value tw-w-[50%]">${item.employerPhoneNumber}</span>
</div>
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل تصفیه:</span>
<span class="monthly-table__toggle-value">${item.checkoutEmployeeCount} نفر</span>
</div>
</div>
<div>
@@ -973,8 +1102,8 @@ function monthlyOverviewStatusDocument(data) {
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل :</span>
<span class="monthly-table__toggle-value">${item.employeeCount} نفر</span>
<span class="monthly-table__toggle-label">تعداد پرسنل قرارداد:</span>
<span class="monthly-table__toggle-value">${item.contractEmployeeCount} نفر</span>
</div>
</div>
@@ -983,6 +1112,10 @@ function monthlyOverviewStatusDocument(data) {
<span class="monthly-table__toggle-label tw-w-[50%] ">شماره تماس کارفرما :</span>
<span class="monthly-table__toggle-value tw-w-[50%]">${item.employerPhoneNumber}</span>
</div>
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل تصفیه:</span>
<span class="monthly-table__toggle-value">${item.checkoutEmployeeCount} نفر</span>
</div>
</div>
<div>
@@ -1107,13 +1240,20 @@ function allWorkshops(data) {
</div>
</div>
<div class="monthly-table__cell tw-w-[7%] tw-text-center">${item.workshopArchiveCode}</div>
<div class="monthly-table__cell tw-w-[15%] tw-text-right">${item.workshopName}</div>
<div class="monthly-table__cell tw-w-[15%] tw-text-center">${item.employerName}</div>
<div class="monthly-table__cell tw-w-[8%] tw-text-center">${item.province}</div>
<div class="monthly-table__cell tw-w-[8%] tw-text-center">${item.city}</div>
<div class="monthly-table__cell tw-w-[35%] tw-text-center">
<div class="monthly-table__cell tw-w-[18%] tw-text-start">${item.workshopName}</div>
<div class="monthly-table__cell tw-w-[14%] tw-text-start">${item.employerName}</div>
<div class="monthly-table__cell tw-w-[7%] tw-text-center">${item.province}</div>
<div class="monthly-table__cell tw-w-[7%] tw-text-center">
<div class="tooltip-container tw-text-center">
<div class="tooltip__trigger tw-truncate tw-text-center">${item.address}</div>
<div class="tooltip__trigger tw-truncate tw-text-center">${item.city}</div>
<div class="tooltip-container__text">
${item.city}
</div>
</div>
</div>
<div class="monthly-table__cell tw-w-[35%] tw-text-start">
<div class="tooltip-container tw-text-start">
<div class="tooltip__trigger tw-truncate tw-text-start">${item.address}</div>
<div class="tooltip-container__text">
${item.address}
</div>
@@ -1160,8 +1300,8 @@ function allWorkshops(data) {
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label ">تعداد پرسنل :</span>
<span class="monthly-table__toggle-value ">${item.employeeCount} نفر</span>
<span class="monthly-table__toggle-label">تعداد پرسنل قرارداد:</span>
<span class="monthly-table__toggle-value">${item.contractEmployeeCount} نفر</span>
</div>
</div>
@@ -1170,6 +1310,10 @@ function allWorkshops(data) {
<span class="monthly-table__toggle-label tw-w-[50%]">شماره تماس کارفرما :</span>
<span class="monthly-table__toggle-value tw-w-[50%]">${item.employerPhoneNumber}</span>
</div>
<div class="monthly-table__toggle-item tw-mb-2 tw-flex tw-flex tw-gap-40 tw-gap-2 tw-w-[35%]">
<span class="monthly-table__toggle-label">تعداد پرسنل تصفیه:</span>
<span class="monthly-table__toggle-value">${item.checkoutEmployeeCount} نفر</span>
</div>
</div>
</div>
<div>
@@ -1316,14 +1460,19 @@ async function ajaxAdminPersonnel() {
optionsHtml += `<option value="${item.id}" ${item.id === adminAccountId ? `selected` : ``}>${item.name}</option>`;
});
$('#admin-personnel-select').html(optionsHtml);
$('#admin-personnel-select-mobile').html(optionsHtml);
const { year, month, employer, employerName, workshopAndArchive, workshopAndArchiveName, adminPersonnel, status } = getSearchParamsFromUrl();
if (![2, 3].includes(adminAccountId)) {
$('#admin-personnel-select').prop('disabled', true).closest("div").addClass('disable');
$("#admin-personnel-select").val(adminAccountId).trigger('change');
$('#admin-personnel-select-mobile').prop('disabled', true).closest("div").addClass('disable');
$("#admin-personnel-select-mobile").val(adminAccountId).trigger('change');
} else {
$('#admin-personnel-select').prop('disabled', false).closest("div").removeClass('disable');
$("#admin-personnel-select").val(adminPersonnel).trigger('change');
$('#admin-personnel-select-mobile').prop('disabled', false).closest("div").removeClass('disable');
$("#admin-personnel-select-mobile").val(adminPersonnel).trigger('change');
}
}
},

File diff suppressed because one or more lines are too long