finish AMO

This commit is contained in:
MahanCh
2025-05-25 21:19:31 +03:30
parent 5e186a2352
commit 7bcc052ec6
31 changed files with 5262 additions and 17 deletions

View File

@@ -0,0 +1,7 @@
namespace AccountManagement.Application.Contracts.Account;
public class AccountSelectListViewModel
{
public long Id { get; set; }
public string Name { get; set; }
}

View File

@@ -41,6 +41,8 @@ public interface IAccountApplication
List<AccountViewModel> GetAccountsByPositionId(long positionId);
List<AccountViewModel> GetAccountEqualToLowerPositionValue();
Task<List<AccountSelectListViewModel>> GetAdminSelectList();
OperationResult ReLogin();
#endregion

View File

@@ -627,7 +627,10 @@ public class AccountApplication : IAccountApplication
}
public async Task<List<AccountSelectListViewModel>> GetAdminSelectList()
{
return await _accountRepository.GetAdminSelectList();
}
#endregion
#region Pooya

View File

@@ -27,6 +27,8 @@ namespace AccountManagement.Domain.AccountAgg
List<AccountViewModel> GetAccountEqualToLowerPositionValue();
AccountViewModel GetAccountViewModel(long id);
List<AccountViewModel> GetAccountsDeactivePositionValue(long Positionid);
Task<List<AccountSelectListViewModel>> GetAdminSelectList();
#endregion
List<AccountViewModel> GetAdminAccountsNew();

View File

@@ -312,6 +312,16 @@ public class AccountRepository : RepositoryBase<long, Account>, IAccountReposito
IsActiveString = x.IsActive ? "true" : "false",
}).ToList();
}
public async Task<List<AccountSelectListViewModel>> GetAdminSelectList()
{
return await _context.Accounts.Where(x => x.AdminAreaPermission == "true").Select(x => new AccountSelectListViewModel()
{
Id = x.id,
Name = x.Fullname
}).ToListAsync();
}
//public List<AccountViewModel> GetAdminAccounts()
//{
// return _context.Accounts.Where(x=>x.AdminAreaPermission == "true" && x.IsActiveString == "true").Select(x => new AccountViewModel()

View File

@@ -69,6 +69,8 @@ public interface IWorkshopRepository : IRepository<long, Workshop>
Task<int> GetWorkshopsForEmployeeStartWorkCount(long accountId);
Task<List<WorkshopWithLeftWorkTempEmployeesDto>> GetWorkshopsForLeftWorkTemp(long accountId);
Task<int> GetWorkshopsForLeftWorkTempCount(long accountId);
Task<List<WorkshopSelectListViewModel>> GetSelectList(string search);
#endregion

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using _0_Framework.Application;
using _0_Framework.Domain;
using CompanyManagment.App.Contracts.Checkout;
@@ -33,6 +34,9 @@ public interface IEmployerRepository : IRepository<long, Employer>
List<EmployerViewModel> GetEmployersHasWorkshop();
Task<List<EmployerSelectListViewModel>> GetSelectList(string search);
#endregion
#region NewByHeydari

View File

@@ -1,6 +1,8 @@
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Threading.Tasks;
using _0_Framework.Application;
using Microsoft.EntityFrameworkCore.Metadata;
namespace CompanyManagment.App.Contracts.AdminMonthlyOverview;
@@ -44,7 +46,7 @@ public class AdminMonthlyOverViewCounterVm
public int VisitCompleted { get; set; }
public int Archived { get; set; }
public int All { get; set; }
}

View File

@@ -0,0 +1,7 @@
namespace CompanyManagment.App.Contracts.Employer;
public class EmployerSelectListViewModel
{
public long Id { get; set; }
public string Name { get; set; }
}

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using _0_Framework.Application;
using CompanyManagment.App.Contracts.Checkout;
@@ -35,6 +36,8 @@ public interface IEmployerApplication
#region Mahan
List<EmployerViewModel> GetEmployersHasWorkshop();
Task<List<EmployerSelectListViewModel>> GetSelectList(string search);
#endregion
#region NewByHeydari
OperationResult DeleteEmployer(long id);

View File

@@ -85,6 +85,8 @@ public interface IWorkshopApplication
Task<List<WorkshopWithLeftWorkTempEmployeesDto>> GetWorkshopsForLeftWorkTemp(long accountId);
Task<int> GetWorkshopsForLeftWorkTempCount(long accountId);
Task<List<WorkshopSelectListViewModel>> GetSelectList(string search);
#endregion
}

View File

@@ -0,0 +1,8 @@
namespace CompanyManagment.App.Contracts.Workshop;
public class WorkshopSelectListViewModel
{
public long Id { get; set; }
public string Name { get; set; }
public string ArchiveCode { get; set; }
}

View File

@@ -8,7 +8,7 @@ using CompanyManagment.App.Contracts.AdminMonthlyOverview;
namespace CompanyManagment.Application;
public class AdminMonthlyOverviewApplication : IAdminMonthlyOverviewApplication
public class AdminMonthlyOverviewApplication:IAdminMonthlyOverviewApplication
{
private readonly IAdminMonthlyOverviewRepository _adminMonthlyOverviewRepository;
@@ -29,14 +29,14 @@ public class AdminMonthlyOverviewApplication : IAdminMonthlyOverviewApplication
public async Task<OperationResult> Next(long id)
{
var operation = new OperationResult();
var operation= new OperationResult();
var monthlyOverview = _adminMonthlyOverviewRepository.Get(id);
if (monthlyOverview == null)
{
return operation.Failed("آیتم موردنظر یافت نشد");
}
if (monthlyOverview.Status == AdminMonthlyOverviewStatus.CreateDocuments)
if (monthlyOverview.Status== AdminMonthlyOverviewStatus.CreateDocuments)
{
return operation.Failed("شما نمیتوانید تا زمانی که قرارداد و تصفیه را تنظیم نکردید به مرحله بعد بروید");
}
@@ -47,11 +47,11 @@ public class AdminMonthlyOverviewApplication : IAdminMonthlyOverviewApplication
if (monthlyOverview.Status >= maxValue)
{
return operation.Failed("مرحله بعدی انتخاب شده نامعتبر است");
return operation.Failed("مرحله بعدی انتخاب شده نامعتبر است");
}
monthlyOverview.Next();
await _adminMonthlyOverviewRepository.SaveChangesAsync();
await _adminMonthlyOverviewRepository.SaveChangesAsync();
return operation.Succcedded();
}
@@ -64,7 +64,7 @@ public class AdminMonthlyOverviewApplication : IAdminMonthlyOverviewApplication
return operation.Failed("آیتم موردنظر یافت نشد");
}
if (monthlyOverview.Status == AdminMonthlyOverviewStatus.CreateDocuments + 1)
if (monthlyOverview.Status == AdminMonthlyOverviewStatus.CreateDocuments+1)
{
return operation.Failed("شما امکان برگشت به مرحله قبل را ندارید");
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using _0_Framework.Application;
using Company.Domain.empolyerAgg;
using Company.Domain.WorkshopAgg;
@@ -892,6 +893,11 @@ public class EmployerApplication : IEmployerApplication
{
return _EmployerRepository.GetEmployersHasWorkshop();
}
public async Task<List<EmployerSelectListViewModel>> GetSelectList(string search)
{
return await _EmployerRepository.GetSelectList(search);
}
#endregion
#region NewByHeydari

View File

@@ -864,6 +864,11 @@ public class WorkshopAppliction : IWorkshopApplication
return _workshopRepository.GetWorkshopsForLeftWorkTempCount(accountId);
}
public async Task<List<WorkshopSelectListViewModel>> GetSelectList(string search)
{
return await _workshopRepository.GetSelectList(search);
}
#endregion

View File

@@ -55,13 +55,17 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
// دریافت کارگاه‌های مربوط به طرف حساب و اکانت
// 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))
.Include(w => w.WorkshopEmployers)
.ThenInclude(we => we.Employer)
.ThenInclude(e => e.ContractingParty).AsSplitQuery()
.Where(w => w.WorkshopEmployers.Any(we =>
.ThenInclude(we => we.Employer)
.ThenInclude(e => e.ContractingParty).AsSplitQuery().
Where(w => w.WorkshopEmployers.Any(we =>
we.Employer != null &&
contractingPartyIds.Contains(we.Employer.ContractingPartyId)))
.Select(w => new
@@ -95,6 +99,17 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
// به‌روزرسانی وضعیت‌ها
await UpdateAdminMonthlyOverviewStatus(year, month, workshopIds);
if (searchModel.ActivationStatus != IsActive.None)
{
var isBlock = searchModel.ActivationStatus == IsActive.True ? "true" : "false";
workshopsWithContractingParty = workshopsWithContractingParty
.Where(x => x.ContractingParty?.IsBlock == isBlock).ToList();
workshopIds = workshopsWithContractingParty.Select(x => x.Workshop.id).ToList();
}
// دریافت همه AdminMonthlyOverview برای این کارگاه‌ها/ماه/سال
var adminMonthlyOverviewsQuery = _companyContext.AdminMonthlyOverviews
.Where(x => workshopIds.Contains(x.WorkshopId) && x.Month == month && x.Year == year);
@@ -117,7 +132,6 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
x.StartWorkDate < targetDate && x.LeftWorkDate > targetDate && workshopIds.Contains(x.WorkshopId))
.GroupBy(x => x.WorkshopId).Select(x => new { EmployeeCounts = x.Count(), WorkshopId = x.Key }).ToList();
// نگاشت به ViewModel
var adminMonthlyOverviewList = adminMonthlyOverviewsList.Select(x =>
{
var employeeCount = employeeCounts.FirstOrDefault(e => e.WorkshopId == x.WorkshopId);
@@ -233,7 +247,7 @@ public class AdminMonthlyOverviewRepository : RepositoryBase<long, AdminMonthlyO
.ToListAsync();
var adminMonthlyOverviewsWithNotFullContracts = await adminMonthlyOverviews
.Where(x => notFullyCoveredWorkshops.Contains(x.WorkshopId)&&x.Status != AdminMonthlyOverviewStatus.CreateDocuments)
.Where(x => notFullyCoveredWorkshops.Contains(x.WorkshopId) && x.Status != AdminMonthlyOverviewStatus.CreateDocuments)
.ToListAsync();
foreach (var adminMonthlyOverview in adminMonthlyOverviewsWithFullContracts)

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using _0_Framework.Application;
using _0_Framework.InfraStructure;
using Company.Domain.EmployerAccountAgg;
@@ -580,6 +581,21 @@ public class EmployerRepository : RepositoryBase<long, Employer>, IEmployerRepos
}).ToList();
}
public async Task<List<EmployerSelectListViewModel>> GetSelectList(string search)
{
var query = _context.Employers.Select(x => new EmployerSelectListViewModel()
{
Id = x.id,
Name = x.FullName
});
if (!string.IsNullOrWhiteSpace(search))
{
query = query.Where(x => x.Name.Contains(search));
}
return await query.Take(100).ToListAsync();
}
#endregion
#region NewByHeydari

View File

@@ -1148,6 +1148,21 @@ public class WorkshopRepository : RepositoryBase<long, Company.Domain.WorkshopAg
}
public async Task<List<WorkshopSelectListViewModel>> GetSelectList(string search)
{
var query = _context.Workshops.Select(x => new WorkshopSelectListViewModel()
{
ArchiveCode = x.ArchiveCode,
Id = x.id,
Name = x.WorkshopFullName
});
if (!string.IsNullOrWhiteSpace(search))
{
query = query.Where(x => x.Name.Contains(search));
}
return await query.Take(100).ToListAsync();
}
#endregion

View File

@@ -455,6 +455,14 @@
</div>
</a>
</li>
<li>
<a asp-area="AdminNew" asp-page="/Company/MonthlyOverview/Index" class="waves-effect btnWorkFlow" style="display: flex;align-items: center;justify-content: space-between;">
<div class="menuTitle">
<i class="md md-home"></i>
<span> بررسی امور ماهانه </span>
</div>
</a>
</li>
</ul>
<div class="clearfix"></div>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,115 @@
using _0_Framework.Application;
using AccountManagement.Application.Contracts.Account;
using CompanyManagment.App.Contracts.AdminMonthlyOverview;
using CompanyManagment.App.Contracts.CustomizeCheckout;
using CompanyManagment.App.Contracts.YearlySalary;
using CompanyManagment.Application;
using CompanyManagment.App.Contracts.Employer;
using CompanyManagment.App.Contracts.Workshop;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using ServiceHost.Areas.Client.Pages.Company.CustomizeCheckout;
using System.Globalization;
namespace ServiceHost.Areas.AdminNew.Pages.Company.MonthlyOverview
{
public class IndexModel : PageModel
{
private readonly IAdminMonthlyOverviewApplication _adminMonthlyOverviewApplication;
private readonly IAuthHelper _authHelper;
private readonly IYearlySalaryApplication _yearlySalaryApplication;
public List<string> YearlyList;
public AdminMonthlyOverviewSearchModel SearchModel;
private readonly IWorkshopApplication _workshopApplication;
private readonly IEmployerApplication _employerApplication;
private readonly IAccountApplication _accountApplication;
public IndexModel(IAdminMonthlyOverviewApplication adminMonthlyOverviewApplication, IAuthHelper authHelper,
IWorkshopApplication workshopApplication, IEmployerApplication employerApplication,
IAccountApplication accountApplication, IYearlySalaryApplication yearlySalaryApplication)
{
_adminMonthlyOverviewApplication = adminMonthlyOverviewApplication;
_yearlySalaryApplication = yearlySalaryApplication;
_authHelper = authHelper;
_workshopApplication = workshopApplication;
_employerApplication = employerApplication;
_accountApplication = accountApplication;
}
public IActionResult OnGet()
{
var accountId = _authHelper.CurrentAccountId();
YearlyList = _yearlySalaryApplication.GetYears();
PersianCalendar pc = new PersianCalendar();
DateTime now = DateTime.Now;
int year = pc.GetYear(now);
int month = pc.GetMonth(now);
SearchModel = new AdminMonthlyOverviewSearchModel()
{
Year = year,
Month = month,
AdminAccountId = accountId
};
return Page();
}
public async Task<IActionResult> OnGetWorkshops(AdminMonthlyOverviewSearchModel searchModel)
{
var workshopListByStatus = await _adminMonthlyOverviewApplication.GetWorkshopListByStatus(searchModel);
return new JsonResult(new
{
data = workshopListByStatus
});
}
public async Task<IActionResult> OnPostNext(long id)
{
var result = await _adminMonthlyOverviewApplication.Next(id);
return new JsonResult(result);
}
public async Task<IActionResult> OnPostBack(long id)
{
var result = await _adminMonthlyOverviewApplication.Back(id);
return new JsonResult(result);
}
public async Task<IActionResult> OnGetCounter(int year , int month , long accountId)
{
var counter = await _adminMonthlyOverviewApplication.GetCounter(year, month, accountId);
return new JsonResult(counter);
}
public async Task<IActionResult> OnGetEmployerSelectList(string search)
{
var res = await _employerApplication.GetSelectList(search);
return new JsonResult(new
{
data = res
});
}
public async Task<IActionResult> OnGetWorkshopSelectList(string search)
{
var res = await _workshopApplication.GetSelectList(search);
return new JsonResult(new
{
data = res
});
}
public async Task<IActionResult> OnGetAccountSelectList()
{
var res = await _accountApplication.GetAdminSelectList();
return new JsonResult(new
{
data = res
});
}
}
}

View File

@@ -61,7 +61,7 @@
<script src="~/AdminTheme/assets/notifications/notifications.js"></script>
<script src="~/assetsadminnew/sidbar_adminnew/sidebar_admin.js"></script>
<script src="~/assetsclient/js/services/ajax-service.js"></script>
<script src="~/assetsclient/js/services/ajax-service.js?ver=@Version.AdminVersion"></script>
@* <script src="~/assetsclient/js/smooth-scrollbar.js"></script> *@

View File

@@ -659,7 +659,14 @@
</div>
</a>
</li>
<li>
<a asp-area="AdminNew" asp-page="/Company/MonthlyOverview/Index" class="waves-effect btnWorkFlow">
<div class="menuTitle">
<i class="md md-home"></i>
<span> بررسی امور ماهانه </span>
</div>
</a>
</li>
</ul>
<div class="clearfix"></div>
</div>

3003
ServiceHost/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

22
ServiceHost/package.json Normal file
View File

@@ -0,0 +1,22 @@
{
"name": "servicehost",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build:css": "tailwindcss -i ./wwwroot/AssetsTailwind/app.css -o ./wwwroot/AssetsTailwind/main.css --minify",
"dev": "tailwindcss -i ./wwwroot/AssetsTailwind/app.css -o ./wwwroot/AssetsTailwind/main.css --watch"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"devDependencies": {
"autoprefixer": "^10.4.21",
"eslint": "^9.27.0",
"postcss": "^8.5.3",
"postcss-cli": "^11.0.1",
"tailwindcss": "^3.4.17"
}
}
د

View File

@@ -0,0 +1,15 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
prefix: 'tw-',
content: [
'./Pages/**/*.cshtml',
'./Areas/**/*.cshtml',
'./Views/**/*.cshtml',
'./wwwroot/**/*.js',
'./wwwroot/**/*.css'
],
theme: {
extend: {},
},
plugins: [],
}

View File

@@ -0,0 +1,281 @@
.custom-scrollbar-x::-webkit-scrollbar {
height: 6px;
}
.custom-scrollbar-x::-webkit-scrollbar-track {
background: transparent;
}
.custom-scrollbar-x::-webkit-scrollbar-thumb {
background-color: rgba(0, 0, 0, 0.3);
border-radius: 4px;
}
.tab-bar {
padding: 0 20px;
}
.tab-bar__tab {
width: 128px;
height: 33px;
background-color: #275197;
color: white;
display: flex;
align-items: center;
justify-content: space-between;
padding:0 6px;
border-radius: 7px 7px 0 0;
}
.tab-bar__tab--active {
background-color: #FFFFFF;
color: #1A3E7B;
border-top: 1px solid #2A5398
}
.tab-bar__tab-label {
font-weight: 600;
font-size: 11px;
}
@media(min-width:768px){
.tab-bar__tab-label {
font-weight: 600;
font-size: 12px;
}
}
.tab-bar__tab-badge {
background-color: #FF6363;
color: white;
width: 16px;
height: 16px;
border-radius: 30px;
font-size: 9px;
font-weight: 600;
display: flex;
align-items: center;
justify-content: center;
line-height: 16px;
}
.card-container {
border-radius: 10px;
padding: 10px 10px 20px;
width: 100%;
margin: 0 auto;
background-color:white;
}
.monthly-card-mobile {
background-color: #fff;
border-radius: 10px;
background-color: white;
padding: 20px 10px;
width: 100%;
margin: 0 auto;
}
.monthly-table__head {
position: sticky;
top: 2px;
z-index: 10;
}
.u-tactile {
cursor: pointer;
transition: opacity 300ms ease-in-out;
}
.u-tactile:hover {
opacity: 0.8;
}
.monthly-table__cell-title {
width: 96%;
display: block;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.monthly-table__cell-card {
display: inline-block;
border-radius: 5px;
text-align: center;
}
.monthly-table__cell-card--small {
background-color: #28529833;
color: #0B5959;
width: 24px;
height: 24px;
line-height: 24px;
}
.monthly-table__cell-card--medium {
background-color: #8DDD8D;
color: #FFFFFF;
width: 57px;
height: 20px;
line-height: 20px;
font-weight: 600;
font-size: 12px;
}
.monthly-table__cell-card--large {
background-color: #8DDD8D;
color: #FFFFFF;
width: 33.3%;
height: 22px;
line-height: 22px;
font-weight: 600;
font-size: 12px;
}
.tooltip-container {
position: relative;
cursor: pointer;
}
.tooltip__trigger {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.tooltip-container__text {
position: absolute;
visibility: hidden;
opacity: 0;
width: max-content;
max-width: 300px;
background-color: #333;
color: #fff;
text-align: center;
border-radius: 4px;
padding: 5px 8px;
z-index: 100000;
bottom: 35px;
left: 50%;
transform: translateX(-50%);
transition: opacity 0.3s;
white-space: normal
}
.tooltip-container:hover .tooltip-container__text {
visibility: visible;
opacity: 1;
}
.monthly-table__toggle {
background-color: #F1F5F9 !important;
border: 0.5px solid #E9E9E9;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
opacity: 0;
max-height: 0;
font-size: 12px;
font-weight: 400;
margin-top: 0 !important;
margin-bottom: 0 !important;
overflow: hidden;
transition: opacity 0.4s ease, max-height 0.4s ease, padding 0.4s ease, margin 0.4s ease;
will-change: max-height, opacity, padding, margin;
}
.monthly-table__toggle.show {
opacity: 1;
max-height: 350px;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
margin-top: 0.5rem;
margin-bottom: 0.5rem !important;
}
.monthly-table__operation-button {
width: 71px;
height: 27px;
border-radius: 5px;
background-color: #275197;
color:white
}
.monthly-table__toggle-label {
font-weight: 400;
font-size: 12px;
color: #202020
}
.monthly-table__toggle-value {
font-weight: 400;
font-size: 12px;
color: #818181
}
/*Awaiting reference Table*/
.monthly-table__stage-button {
display: flex;
align-items: center;
justify-content: center;
height: 23px;
border-radius: 5px;
background-color: #84CC16;
color: white;
font-size: 10px;
padding: 0 4px;
white-space: nowrap
}
/* The whole workshop */
.monthly-table__status-button {
width: 88px;
height:32px;
font-weight: 600;
font-size: 12px;
border-radius:0
}
.monthly-table__status-button--documents-setup {
background-color: #C8C8C8 !important;
}
.monthly-table__status-button--step1 {
background-color: #87DFFF !important;
}
.monthly-table__status-button--step2 {
background-color: #FEA99A !important;
}
.monthly-table__status-button--step3 {
background-color: #FEDE76 !important;
}
.monthly-table__status-button--step4 {
background-color: #A3FF87 !important;
}
@media(min-width:768px){
.monthly-table__status-button {
width: 166px;
height: 35px;
}
.monthly-table__status-button--documents-setup {
background-color: #C8C8C8 !important;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,7 @@
$.ajax({
url: url,
type: method,
data: method === "GET" ? data : JSON.stringify(data),
data: data,
dataType: "json",
async: async,
headers: {

View File

@@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

File diff suppressed because one or more lines are too long