From eaaab56421cc15cf289666e6c1a0a68a95177ab2 Mon Sep 17 00:00:00 2001 From: MahanCh Date: Mon, 26 May 2025 17:30:14 +0330 Subject: [PATCH] merge from teamwork --- .../IAdminMonthlyOverviewApplication.cs | 3 +- .../AdminMonthlyOverviewRepository.cs | 106 +- .../Company/MonthlyOverview/Index.cshtml | 287 +- ServiceHost/package-lock.json | 5998 ++++++++--------- ServiceHost/package.json | 3 +- .../MonthlyOverview/css/style.css | 13 +- .../MonthlyOverview/js/Index.js | 633 +- ServiceHost/wwwroot/AssetsTailwind/main.css | 2 +- 8 files changed, 3673 insertions(+), 3372 deletions(-) diff --git a/CompanyManagment.App.Contracts/AdminMonthlyOverview/IAdminMonthlyOverviewApplication.cs b/CompanyManagment.App.Contracts/AdminMonthlyOverview/IAdminMonthlyOverviewApplication.cs index d6418686..c256fc09 100644 --- a/CompanyManagment.App.Contracts/AdminMonthlyOverview/IAdminMonthlyOverviewApplication.cs +++ b/CompanyManagment.App.Contracts/AdminMonthlyOverview/IAdminMonthlyOverviewApplication.cs @@ -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; } } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/AdminMonthlyOverviewRepository.cs b/CompanyManagment.EFCore/Repository/AdminMonthlyOverviewRepository.cs index 99c7fbdf..7c1fda57 100644 --- a/CompanyManagment.EFCore/Repository/AdminMonthlyOverviewRepository.cs +++ b/CompanyManagment.EFCore/Repository/AdminMonthlyOverviewRepository.cs @@ -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> GetWorkshopStatus(AdminMonthlyOverviewSearchModel searchModel) { + var year = searchModel.Year; var month = searchModel.Month; var accountId = searchModel.AdminAccountId; @@ -32,6 +34,9 @@ public class AdminMonthlyOverviewRepository : RepositoryBase x.id == searchModel.AdminAccountId); @@ -40,28 +45,28 @@ public class AdminMonthlyOverviewRepository : RepositoryBase 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 + 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 x.Workshop.id).ToList(); + // پیدا کردن کارگاه‌هایی که قبلاً برای این ماه/سال AdminMonthlyOverview دارند var adminMonthlyOverviewWorkshopIds = await _companyContext.AdminMonthlyOverviews .AsNoTracking() @@ -92,13 +99,14 @@ public class AdminMonthlyOverviewRepository : RepositoryBase 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 x.IsBlock).ToList(); + return adminMonthlyOverviewList; } @@ -193,51 +208,62 @@ public class AdminMonthlyOverviewRepository : RepositoryBase workshopIds) + private async Task UpdateAdminMonthlyOverviewStatus(int year, int month, List 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 workingContractGrouping = workingContractEmployeeIds.GroupBy(x => x.WorkshopId).Select(x => new + { + WorkshopId = x.Key, + Data = x.ToList() + }).ToList(); - var workshopsWithFullContracts = grouped - .Where(g => g.All(emp => contractSet.Contains((emp.WorkshopId, emp.EmployeeId)))) - .Select(g => g.Key) + + 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); diff --git a/ServiceHost/Areas/AdminNew/Pages/Company/MonthlyOverview/Index.cshtml b/ServiceHost/Areas/AdminNew/Pages/Company/MonthlyOverview/Index.cshtml index b4002f97..8f1a37ca 100644 --- a/ServiceHost/Areas/AdminNew/Pages/Company/MonthlyOverview/Index.cshtml +++ b/ServiceHost/Areas/AdminNew/Pages/Company/MonthlyOverview/Index.cshtml @@ -41,82 +41,134 @@ @* Search *@ -
-
- @@ -767,7 +892,7 @@ function monthlyOverviewStatusDocument(data) {
`; } - //Step 3 + //Step 3 if (item.status === 3) { htmlStep3 += `
@@ -816,8 +941,8 @@ function monthlyOverviewStatusDocument(data) {
- تعداد پرسنل : - ${item.employeeCount} نفر + تعداد پرسنل قرارداد: + ${item.contractEmployeeCount} نفر
@@ -827,6 +952,10 @@ function monthlyOverviewStatusDocument(data) { ${item.employerPhoneNumber} +
+ تعداد پرسنل تصفیه: + ${item.checkoutEmployeeCount} نفر +
@@ -924,7 +1053,7 @@ function monthlyOverviewStatusDocument(data) { `; } - //Step 4 + //Step 4 if (item.status === 4) { htmlStep4 += `
@@ -973,8 +1102,8 @@ function monthlyOverviewStatusDocument(data) {
- تعداد پرسنل : - ${item.employeeCount} نفر + تعداد پرسنل قرارداد: + ${item.contractEmployeeCount} نفر
@@ -984,6 +1113,10 @@ function monthlyOverviewStatusDocument(data) { ${item.employerPhoneNumber} +
+ تعداد پرسنل تصفیه: + ${item.checkoutEmployeeCount} نفر +
@@ -1084,9 +1217,9 @@ function monthlyOverviewStatusDocument(data) { }); $('#load-data-html-step1').html(htmlStep1); - $('#load-data-html-step2').html(htmlStep2); - $('#load-data-html-step3').html(htmlStep3); - $('#load-data-html-step4').html(htmlStep4); + $('#load-data-html-step2').html(htmlStep2); + $('#load-data-html-step3').html(htmlStep3); + $('#load-data-html-step4').html(htmlStep4); } function allWorkshops(data) { @@ -1100,20 +1233,27 @@ function allWorkshops(data) { data.sort((a, b) => a.status - b.status); data.forEach(function (item) { html += `
-
+
${indexNumber++}
${item.workshopArchiveCode}
-
${item.workshopName}
-
${item.employerName}
-
${item.province}
-
${item.city}
-
+
${item.workshopName}
+
${item.employerName}
+
${item.province}
+
-
${item.address}
+
${item.city}
+
+ ${item.city} +
+
+
+
+
+
${item.address}
${item.address}
@@ -1121,31 +1261,31 @@ function allWorkshops(data) {
`; - switch (item.status) { - case 0: - strTextStatus = "تنظیم مستندات"; - strColorStatus = "documents-setup"; - break; - case 1: - strTextStatus = "در انتظار مراجعه"; - strColorStatus = "step1"; - break; - case 2: - strTextStatus = "در حال مراجعه"; - strColorStatus = "step2"; - break; - case 3: - strTextStatus = "اتمام امور"; - strColorStatus = "step3"; - break; - case 4: - strTextStatus = "بایگانی"; - strColorStatus = "step4"; - break; - default: - } + switch (item.status) { + case 0: + strTextStatus = "تنظیم مستندات"; + strColorStatus = "documents-setup"; + break; + case 1: + strTextStatus = "در انتظار مراجعه"; + strColorStatus = "step1"; + break; + case 2: + strTextStatus = "در حال مراجعه"; + strColorStatus = "step2"; + break; + case 3: + strTextStatus = "اتمام امور"; + strColorStatus = "step3"; + break; + case 4: + strTextStatus = "بایگانی"; + strColorStatus = "step4"; + break; + default: + } - html += `
@@ -1154,21 +1294,25 @@ function allWorkshops(data) {
-
- نام کارفرما : - ${item.employerName} +
+ نام کارفرما : + ${item.employerName}
- تعداد پرسنل : - ${item.employeeCount} نفر + تعداد پرسنل قرارداد: + ${item.contractEmployeeCount} نفر
-
- شماره تماس کارفرما : - ${item.employerPhoneNumber} +
+ شماره تماس کارفرما : + ${item.employerPhoneNumber} +
+
+ تعداد پرسنل تصفیه: + ${item.checkoutEmployeeCount} نفر
@@ -1177,11 +1321,11 @@ function allWorkshops(data) {
`; - htmlMobile += `
+ htmlMobile += `
- ${indexNumberMobile ++} + ${indexNumberMobile++}
@@ -1251,7 +1395,7 @@ function allWorkshops(data) {
`; - }); + }); $('#load-data-html-stepAll').html(html); $('#load-data-html-stepAll-mobile').html(htmlMobile); @@ -1259,135 +1403,140 @@ function allWorkshops(data) { function showConfirmSwal() { - return new Promise((resolve) => { - swal({ - title: "آیا از انتقال مطمئن هستید؟", - text: "", - type: "warning", - showCancelButton: true, - confirmButtonColor: "#DD6B55", - confirmButtonText: "بله", - cancelButtonText: "خیر", - closeOnConfirm: true, - closeOnCancel: true - }, function (isConfirm) { - resolve(isConfirm); - }); - }); + return new Promise((resolve) => { + swal({ + title: "آیا از انتقال مطمئن هستید؟", + text: "", + type: "warning", + showCancelButton: true, + confirmButtonColor: "#DD6B55", + confirmButtonText: "بله", + cancelButtonText: "خیر", + closeOnConfirm: true, + closeOnCancel: true + }, function (isConfirm) { + resolve(isConfirm); + }); + }); } async function handlerStep(id, stepStr) { - let handlerUrl = stepStr === "next" ? nextUrl : backUrl; + let handlerUrl = stepStr === "next" ? nextUrl : backUrl; - const isConfirm = await showConfirmSwal(); - if (!isConfirm) return; + const isConfirm = await showConfirmSwal(); + if (!isConfirm) return; - try { - const response = await ajax.post(handlerUrl, { id: id }, true); - if (response.isSuccedded) { - $('.alert-success-msg').show().find('p').text(response.message); - setTimeout(() => { - $('.alert-success-msg').hide().find('p').text(''); - }, 1500); + try { + const response = await ajax.post(handlerUrl, { id: id }, true); + if (response.isSuccedded) { + $('.alert-success-msg').show().find('p').text(response.message); + setTimeout(() => { + $('.alert-success-msg').hide().find('p').text(''); + }, 1500); - loadMonthlyOverviewData(); - } else { - $('.alert-msg').show().find('p').text(response.message); - setTimeout(() => { - $('.alert-msg').hide().find('p').text(''); - }, 2000); - } - } catch (err) { - console.error("خطا در ajax.post:", err); - } + loadMonthlyOverviewData(); + } else { + $('.alert-msg').show().find('p').text(response.message); + setTimeout(() => { + $('.alert-msg').hide().find('p').text(''); + }, 2000); + } + } catch (err) { + console.error("خطا در ajax.post:", err); + } } async function ajaxAdminPersonnel() { - await $.ajax({ + await $.ajax({ url: accountSelectListUrl, - type: 'GET', + type: 'GET', success: function (response) { if (response.data.length > 0) { - var items = response.data; + var items = response.data; var optionsHtml = ''; - const filteredItems = items.filter(item => item.id !== 2 && item.id !== 3); - filteredItems.forEach(function (item) { + const filteredItems = items.filter(item => item.id !== 2 && item.id !== 3); + filteredItems.forEach(function (item) { optionsHtml += ``; }); $('#admin-personnel-select').html(optionsHtml); + $('#admin-personnel-select-mobile').html(optionsHtml); - const { year, month, employer, employerName, workshopAndArchive, workshopAndArchiveName, adminPersonnel, status } = getSearchParamsFromUrl(); + 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'); } } - }, - error: function (xhr, status, error) { - console.error(xhr.responseText); - } - }); + }, + error: function (xhr, status, error) { + console.error(xhr.responseText); + } + }); } function paramsUrl(year, month, employer, employerName, workshopAndArchive, workshopAndArchiveName, adminPersonnel, status) { - const params = new URLSearchParams(); + const params = new URLSearchParams(); let hasAnyFilter = false; if (year !== '0') { params.set("year", year); - hasAnyFilter = true; - } + hasAnyFilter = true; + } if (month !== '0') { params.set("month", month); - hasAnyFilter = true; - } + hasAnyFilter = true; + } if (employer !== '0') { params.set("employer", employer); - hasAnyFilter = true; + hasAnyFilter = true; } - if (employer !== '0') { + if (employer !== '0') { params.set("employer-name", employerName); - hasAnyFilter = true; - } + hasAnyFilter = true; + } if (workshopAndArchive !== '0') { params.set("workshop-archive", workshopAndArchive); - hasAnyFilter = true; - } + hasAnyFilter = true; + } - if (workshopAndArchive !== '0') { + if (workshopAndArchive !== '0') { params.set("workshop-name", workshopAndArchiveName); - hasAnyFilter = true; - } + hasAnyFilter = true; + } if (adminPersonnel !== "0") { params.set("admin-personnel", adminPersonnel); - hasAnyFilter = true; + hasAnyFilter = true; } if (status !== "2") { params.set("status", status); - hasAnyFilter = true; - } + hasAnyFilter = true; + } - const newUrl = hasAnyFilter + const newUrl = hasAnyFilter ? `${window.location.origin}/AdminNew/Company/MonthlyOverview?${params.toString()}` : `${window.location.origin}/AdminNew/Company/MonthlyOverview`; - window.history.pushState({}, '', newUrl); + window.history.pushState({}, '', newUrl); } function getSearchParamsFromUrl() { - const urlParams = new URLSearchParams(window.location.search); + const urlParams = new URLSearchParams(window.location.search); - return { + return { year: urlParams.get("year") || "0", month: urlParams.get("month") || "0", employer: urlParams.get("employer") || "0", @@ -1396,5 +1545,5 @@ function getSearchParamsFromUrl() { workshopAndArchiveName: urlParams.get("workshop-name") || "", adminPersonnel: urlParams.get("admin-personnel") || "0", status: urlParams.get("status") || "" - }; + }; } \ No newline at end of file diff --git a/ServiceHost/wwwroot/AssetsTailwind/main.css b/ServiceHost/wwwroot/AssetsTailwind/main.css index bd67b2e0..465f2b69 100644 --- a/ServiceHost/wwwroot/AssetsTailwind/main.css +++ b/ServiceHost/wwwroot/AssetsTailwind/main.css @@ -1 +1 @@ -*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.tw-col-span-1{grid-column:span 1/span 1}.tw-col-span-2{grid-column:span 2/span 2}.tw-mx-auto{margin-left:auto;margin-right:auto}.tw-mb-1{margin-bottom:.25rem}.tw-mb-2{margin-bottom:.5rem}.tw-mb-3{margin-bottom:.75rem}.tw-mb-\[3px\]{margin-bottom:3px}.tw-block{display:block}.tw-flex{display:flex}.tw-grid{display:grid}.tw-hidden{display:none}.tw-h-\[20px\]{height:20px}.tw-h-\[35px\]{height:35px}.tw-h-full{height:100%}.tw-w-\[10\%\]{width:10%}.tw-w-\[100\%\]{width:100%}.tw-w-\[13\%\]{width:13%}.tw-w-\[15\%\]{width:15%}.tw-w-\[2\%\]{width:2%}.tw-w-\[20\%\]{width:20%}.tw-w-\[25\%\]{width:25%}.tw-w-\[35\%\]{width:35%}.tw-w-\[40\%\]{width:40%}.tw-w-\[5\%\]{width:5%}.tw-w-\[50\%\]{width:50%}.tw-w-\[58px\]{width:58px}.tw-w-\[7\%\]{width:7%}.tw-w-\[70\%\]{width:70%}.tw-w-\[8\%\]{width:8%}.tw-w-\[95\%\]{width:95%}.tw-w-\[97\%\]{width:97%}.tw-w-full{width:100%}.tw-w-max{width:-moz-max-content;width:max-content}.tw-cursor-pointer{cursor:pointer}.tw-grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.tw-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw-flex-col{flex-direction:column}.tw-items-center{align-items:center}.tw-justify-end{justify-content:flex-end}.tw-justify-center{justify-content:center}.tw-justify-between{justify-content:space-between}.tw-gap-1{gap:.25rem}.tw-gap-2{gap:.5rem}.tw-gap-3{gap:.75rem}.tw-gap-40{gap:10rem}.tw-overflow-x-auto{overflow-x:auto}.tw-truncate{overflow:hidden;text-overflow:ellipsis}.tw-truncate,.tw-whitespace-nowrap{white-space:nowrap}.tw-rounded-\[15px\]{border-radius:15px}.tw-rounded-\[5px\]{border-radius:5px}.tw-bg-\[\#3B73D0\]{--tw-bg-opacity:1;background-color:rgb(59 115 208/var(--tw-bg-opacity,1))}.tw-bg-\[\#454D5C\]{--tw-bg-opacity:1;background-color:rgb(69 77 92/var(--tw-bg-opacity,1))}.tw-bg-\[\#DFF0FF\]{--tw-bg-opacity:1;background-color:rgb(223 240 255/var(--tw-bg-opacity,1))}.tw-bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.tw-px-2{padding-left:.5rem;padding-right:.5rem}.tw-px-4{padding-left:1rem;padding-right:1rem}.tw-text-center{text-align:center}.tw-text-right{text-align:right}.tw-text-end{text-align:end}.tw-text-\[10px\]{font-size:10px}.tw-text-\[12px\]{font-size:12px}.tw-text-\[14px\]{font-size:14px}.tw-text-\[16px\]{font-size:16px}.tw-text-\[8px\]{font-size:8px}.tw-text-xs{font-size:.75rem;line-height:1rem}.tw-font-\[400\]{font-weight:400}.tw-font-\[500\]{font-weight:500}.tw-font-\[600\]{font-weight:600}.tw-ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tw-leading-\[20px\]{line-height:20px}.tw-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.tw-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.tw-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tw-delay-150{transition-delay:.15s}@media (min-width:768px){.md\:tw-col-span-2{grid-column:span 2/span 2}.md\:tw-block{display:block}.md\:tw-hidden{display:none}.md\:tw-h-\[28px\]{height:28px}.md\:tw-w-\[98px\]{width:98px}.md\:tw-grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:tw-text-\[14px\]{font-size:14px}.md\:tw-text-\[20px\]{font-size:20px}.md\:tw-font-\[400\]{font-weight:400}.md\:tw-font-\[600\]{font-weight:600}.md\:tw-leading-\[28px\]{line-height:28px}} \ No newline at end of file +*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.tw-col-span-1{grid-column:span 1/span 1}.tw-col-span-2{grid-column:span 2/span 2}.tw-mx-auto{margin-left:auto;margin-right:auto}.tw-mb-1{margin-bottom:.25rem}.tw-mb-2{margin-bottom:.5rem}.tw-mb-3{margin-bottom:.75rem}.tw-mb-\[3px\]{margin-bottom:3px}.tw-block{display:block}.tw-flex{display:flex}.tw-grid{display:grid}.tw-hidden{display:none}.tw-h-\[20px\]{height:20px}.tw-h-\[35px\]{height:35px}.tw-h-full{height:100%}.tw-w-\[10\%\]{width:10%}.tw-w-\[100\%\]{width:100%}.tw-w-\[14\%\]{width:14%}.tw-w-\[15\%\]{width:15%}.tw-w-\[18\%\]{width:18%}.tw-w-\[2\%\]{width:2%}.tw-w-\[20\%\]{width:20%}.tw-w-\[25\%\]{width:25%}.tw-w-\[35\%\]{width:35%}.tw-w-\[40\%\]{width:40%}.tw-w-\[5\%\]{width:5%}.tw-w-\[50\%\]{width:50%}.tw-w-\[58px\]{width:58px}.tw-w-\[7\%\]{width:7%}.tw-w-\[70\%\]{width:70%}.tw-w-\[8\%\]{width:8%}.tw-w-\[95\%\]{width:95%}.tw-w-\[97\%\]{width:97%}.tw-w-full{width:100%}.tw-w-max{width:-moz-max-content;width:max-content}.tw-cursor-pointer{cursor:pointer}.tw-grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.tw-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw-flex-col{flex-direction:column}.tw-items-center{align-items:center}.tw-justify-end{justify-content:flex-end}.tw-justify-center{justify-content:center}.tw-justify-between{justify-content:space-between}.tw-gap-1{gap:.25rem}.tw-gap-2{gap:.5rem}.tw-gap-3{gap:.75rem}.tw-gap-40{gap:10rem}.tw-overflow-x-auto{overflow-x:auto}.tw-truncate{overflow:hidden;text-overflow:ellipsis}.tw-truncate,.tw-whitespace-nowrap{white-space:nowrap}.tw-rounded-\[15px\]{border-radius:15px}.tw-rounded-\[5px\]{border-radius:5px}.tw-bg-\[\#3B73D0\]{--tw-bg-opacity:1;background-color:rgb(59 115 208/var(--tw-bg-opacity,1))}.tw-bg-\[\#454D5C\]{--tw-bg-opacity:1;background-color:rgb(69 77 92/var(--tw-bg-opacity,1))}.tw-bg-\[\#DFF0FF\]{--tw-bg-opacity:1;background-color:rgb(223 240 255/var(--tw-bg-opacity,1))}.tw-bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.tw-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.tw-p-2{padding:.5rem}.tw-px-2{padding-left:.5rem;padding-right:.5rem}.tw-px-4{padding-left:1rem;padding-right:1rem}.tw-text-center{text-align:center}.tw-text-right{text-align:right}.tw-text-start{text-align:start}.tw-text-end{text-align:end}.tw-text-\[10px\]{font-size:10px}.tw-text-\[12px\]{font-size:12px}.tw-text-\[14px\]{font-size:14px}.tw-text-\[16px\]{font-size:16px}.tw-text-\[8px\]{font-size:8px}.tw-text-xs{font-size:.75rem;line-height:1rem}.tw-font-\[400\]{font-weight:400}.tw-font-\[500\]{font-weight:500}.tw-font-\[600\]{font-weight:600}.tw-ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tw-leading-\[20px\]{line-height:20px}.tw-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.tw-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.tw-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tw-delay-150{transition-delay:.15s}@media (min-width:768px){.md\:tw-col-span-2{grid-column:span 2/span 2}.md\:tw-block{display:block}.md\:tw-hidden{display:none}.md\:tw-h-\[28px\]{height:28px}.md\:tw-w-\[98px\]{width:98px}.md\:tw-grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:tw-text-\[14px\]{font-size:14px}.md\:tw-text-\[20px\]{font-size:20px}.md\:tw-font-\[400\]{font-weight:400}.md\:tw-font-\[600\]{font-weight:600}.md\:tw-leading-\[28px\]{line-height:28px}} \ No newline at end of file