Add employee by client part 2

This commit is contained in:
MahanCh
2025-03-09 21:52:06 +03:30
parent 89a01b5948
commit d7d938dfcc
94 changed files with 22779 additions and 2616 deletions

View File

@@ -224,6 +224,10 @@ public class Employee : EntityBase
}
#region Mahan
public void EditFromEmployeeClientTemp(string maritalStatus)
{
MaritalStatus = maritalStatus;
}
public void Authorized()
{

View File

@@ -63,6 +63,9 @@ public interface IEmployeeRepository : IRepository<long, Employee>
List<EmployeeViewModel> GetWorkingEmployeesByWorkshopIdsAndNationalCodeAndDate(List<long> workshopIds, string nationalCode, DateTime date);
List<EmployeeViewModel> GetWorkingEmployeesByWorkshopId(long workshopId);
List<EmployeeViewModel> GetWorkedEmployeesByWorkshopIdsAndNationalCodeAndDate(List<long> workshopIds,
string nationalCode, DateTime date);
List<(long Id, string Name)> SimpleGetRangeByIds(IEnumerable<long> newEmployeeIds);
Task<GetEditEmployeeInEmployeeDocumentViewModel> GetEmployeeEditInEmployeeDocumentWorkFlow(long employeeId,
long workshopId);

View File

@@ -17,4 +17,5 @@ public interface IRollCallServiceRepository : IRepository<long, RollCallService>
List<RollCallServiceViewModel> GetAllServiceByAccountId(long accountId);
bool IsExistActiveServiceByWorkshopId(long workshopId);
}

View File

@@ -1,9 +1,11 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using _0_Framework.Application;
using _0_Framework.Domain;
using CompanyManagment.App.Contracts.Contract;
using CompanyManagment.App.Contracts.PersonalContractingParty;
using CompanyManagment.App.Contracts.Workshop;
using CompanyManagment.App.Contracts.Workshop.DTOs;
namespace Company.Domain.WorkshopAgg;
@@ -59,18 +61,23 @@ public interface IWorkshopRepository : IRepository<long, Workshop>
List<PrintListWorkshop> PrintWorkshopList(WorkshopSearchModel searchModel);
#endregion
#region Mahan
PersonalContractingPartyViewModel GetPersonalContractingPartyByWorkshopId(long workshopId);
List<WorkshopViewModel> GetWorkshopsByClientAccountId(long clientAccountId);
Task<List<WorkshopWithStartedEmployeesDto>> GetWorkshopsForEmployeeStartWork(long accountId);
Task<int> GetWorkshopsForEmployeeStartWorkCount(long accountId);
Task<List<WorkshopWithLeftWorkTempEmployeesDto>> GetWorkshopsForLeftWorkTemp(long accountId);
Task<int> GetWorkshopsForLeftWorkTempCount(long accountId);
#endregion
#endregion
#region Insurance
/// <summary>
/// لیست انتخاب کارگاه در مودال ایجاد بیمه
/// </summary>
/// <returns></returns>
List<WorkshopViewModel> GetWorkshopSelectListInsuransce();
#region Insurance
/// <summary>
/// لیست انتخاب کارگاه در مودال ایجاد بیمه
/// </summary>
/// <returns></returns>
List<WorkshopViewModel> GetWorkshopSelectListInsuransce();
#endregion
/// <summary>
@@ -87,4 +94,13 @@ public interface IWorkshopRepository : IRepository<long, Workshop>
/// <param name="workshopId"></param>
/// <returns></returns>
OperationResult EditAccountLeftWorkAndWorkshopAccounts(List<long> accountIds, long workshopId);
#region Pooya
List<PersonnelInfoViewModel> GetPersonnelInfoRemastered(long searchModelWorkshopId);
#endregion
}

View File

@@ -27,9 +27,7 @@ public class CreateEmployeeByClient
public long JobId { get; set; }
public List<AddEmployeeDocumentItem> EmployeeDocumentItems { get; set; }
public bool HasEmployeeDocument { get; set; }
public bool HasRollCallService { get; set; }
}

View File

@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using _0_Framework.Application;
using CompanyManagment.App.Contracts.Employee.DTO;
using CompanyManagment.App.Contracts.EmployeeInsuranceRecord;
namespace CompanyManagment.App.Contracts.Employee;
@@ -44,6 +45,33 @@ public interface IEmployeeApplication
List<EmployeeViewModel> GetWorkingEmployeesByWorkshopId(long workshopId);
EmployeeViewModel GetEmployeeByNationalCodeIfHasLeftWork(string nationalCode, List<long> workshopIds);
#endregion
#region Mahan
OperationResult CreateEmployeeByClient(CreateEmployeeByClient command);
/// <summary>
/// اطلاعات پرسنل با کد ملی در کارگاه. اگر در کارگاه کار نکرده باشه وجود نداشته باشه اطلاعات خالی داده میشه
/// </summary>
/// <param name="nationalCode"></param>
/// <param name="birthDate"></param>
/// <param name="workshopId"></param>
/// <returns></returns>
Task<OperationResult<EmployeeByNationalCodeInWorkshopViewModel>>
ValidateCreateEmployeeClientByNationalCodeAndWorkshopId(string nationalCode,
string birthDate, long workshopId);
/// <summary>
/// پرسنل هایی که در کارگاهی از سمت ادمین شروع به کار کرده اند
/// </summary>
/// <param name="workshopId"></param>
/// <returns></returns>
Task<ICollection<ClientStartedWorkEmployeesDto>> GetClientEmployeesStartWork(long workshopId);
Task<ICollection<ClientLeftWorkWorkEmployeesDto>> GetEmployeesForLeftWorkTemp(long workshopId);
Task<GetEditEmployeeInEmployeeDocumentViewModel> GetEmployeeEditInEmployeeDocumentWorkFlow(long employeeId,
long workshopId);
Task<OperationResult> EditEmployeeInEmployeeDocumentWorkFlow(EditEmployeeInEmployeeDocument command);
#endregion
}

View File

@@ -16,5 +16,7 @@ public interface IPersonnelCodeApplication
List<PersonnelCodeViewModel> Search(PersonnelCodeSearchModel searchModel);
PersonnelCodeViewModel GetPersonnelCodeViewModel(PersonnelCodeSearchModel searchModel);
long GetEmployeeIdByPersonelCode(long personleCode, long workshopId);
long GetLastPersonnelCodeByWorkshop(long workshopId);
}

View File

@@ -35,4 +35,5 @@ public class RollCallEmployeeViewModel : EditRollCallEmployee
public string EmployeeLName { get; set; }
public string EmployeeFName { get; set; }
public long RollCallEmployeeId { get; set; }
public bool CreatedByClient { get; set; }
}

View File

@@ -19,4 +19,5 @@ public interface IRollCallServiceApplication
List<RollCallServiceViewModel> GetActiveServiceByAccountId(long accountId);
List<RollCallServiceViewModel> GetAllServiceByAccountId(long accountId);
bool IsExistActiveServiceByWorkshopId(long workshopId);
}

View File

@@ -0,0 +1,24 @@
namespace CompanyManagment.App.Contracts.Workshop;
public class WorkshopWithLeftWorkTempEmployeesDto
{
/// <summary>
/// آیدی کارگاه
/// </summary>
public long WorkshopId { get; set; }
/// <summary>
/// نام کارگاه
/// </summary>
public string WorkshopName { get; set; } = string.Empty;
/// <summary>
/// نام کارفرما
/// </summary>
public string EmployerName { get; set; } = string.Empty;
/// <summary>
/// تعداد پرسنل ترک کار کرده
/// </summary>
public int LeftWorkEmployees { get; set; }
}

View File

@@ -0,0 +1,27 @@
namespace CompanyManagment.App.Contracts.Workshop.DTOs;
/// <summary>
/// کارگاه هایی که از کلاینت، پرسنلی را شروع به کار زدند
/// </summary>
public class WorkshopWithStartedEmployeesDto
{
/// <summary>
/// آیدی کارگاه
/// </summary>
public long WorkshopId { get; set; }
/// <summary>
/// نام کارگاه
/// </summary>
public string WorkshopName { get; set; } = string.Empty;
/// <summary>
/// نام کارفرما
/// </summary>
public string EmployerName { get; set; } = string.Empty;
/// <summary>
/// تعداد پرسنل اضافه شده
/// </summary>
public int AddedEmployeesCount { get; set; }
}

View File

@@ -1,7 +1,9 @@
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using _0_Framework.Application;
using AccountManagement.Application.Contracts.Account;
using CompanyManagment.App.Contracts.Workshop.DTOs;
namespace CompanyManagment.App.Contracts.Workshop;
@@ -54,6 +56,11 @@ public interface IWorkshopApplication
#endregion
#region Pooya
List<PersonnelInfoViewModel> GetPersonnelInfoRemastered(PersonnelInfoSearchModel searchModel);
#endregion
#region Vafa
List<PrintListWorkshop> PrintWorkshopList(WorkshopSearchModel searchModel);
@@ -70,5 +77,14 @@ public interface IWorkshopApplication
/// <returns></returns>
List<WorkshopViewModel> GetWorkshopSelectListInsuransce();
#endregion
#endregion
#region Mahan
Task<List<WorkshopWithStartedEmployeesDto>> GetWorkshopsForEmployeeStartWork(long accountId);
Task<int> GetWorkshopsForEmployeeStartWorkCount(long accountId);
Task<List<WorkshopWithLeftWorkTempEmployeesDto>> GetWorkshopsForLeftWorkTemp(long accountId);
Task<int> GetWorkshopsForLeftWorkTempCount(long accountId);
#endregion
}

View File

@@ -43,4 +43,6 @@ public class PersonnelInfoViewModel
public bool Black { get; set; }
public DateTime StartWork { get; set; }
public DateTime LeftWork { get; set; }
public bool CreatedByClient { get; set; }
public bool LefWorkTemp { get; set; }
}

View File

@@ -908,6 +908,13 @@ public class EmployeeAplication : RepositoryBase<long, Employee>, IEmployeeAppli
return workshopEmployeesWithLeftWork.FirstOrDefault();
}
public EmployeeViewModel GetEmployeeByNationalCodeIfHasLeftWork(string nationalCode, List<long> workshopIds)
{
if (nationalCode.NationalCodeValid() != "valid")
return new();
var workshopEmployeesWithLeftWork = _EmployeeRepository.GetWorkedEmployeesByWorkshopIdsAndNationalCodeAndDate(workshopIds, nationalCode, DateTime.Now.Date);
return workshopEmployeesWithLeftWork.FirstOrDefault();
}
public List<EmployeeViewModel> GetWorkingEmployeesByWorkshopId(long workshopId)
{
return _EmployeeRepository.GetWorkingEmployeesByWorkshopId(workshopId);

View File

@@ -22,6 +22,7 @@ using Microsoft.AspNetCore.Mvc;
using CompanyManagment.App.Contracts.SmsResult;
using Microsoft.Identity.Client;
using static Microsoft.QualityTools.Testing.Fakes.FakesDelegates;
using Company.Domain.EmployeeClientTempAgg;
namespace CompanyManagment.Application
{
@@ -35,15 +36,17 @@ namespace CompanyManagment.Application
private readonly ILeftWorkRepository _leftWorkRepository;
private readonly IEmployeeDocumentItemRepository _employeeDocumentItemRepository;
private readonly IAuthHelper _authHelper;
private readonly IEmployeeClientTempRepository _employeeClientTempRepository;
private readonly string _basePath;
private readonly string _basePath;
public EmployeeDocumentsApplication(IEmployeeDocumentsRepository employeeDocumentsRepository,
IEmployeeRepository employeeRepository,
IWorkshopRepository workshopRepository, IWebHostEnvironment webHostEnvironment,
IMediaRepository mediaRepository, ILeftWorkRepository leftWorkRepository,
IEmployeeDocumentItemRepository employeeDocumentItemRepository, IAuthHelper authHelper)
IEmployeeDocumentItemRepository employeeDocumentItemRepository, IAuthHelper authHelper, IEmployeeClientTempRepository employeeClientTempRepository)
{
_employeeDocumentsRepository = employeeDocumentsRepository;
_employeeRepository = employeeRepository;
@@ -53,7 +56,8 @@ namespace CompanyManagment.Application
_leftWorkRepository = leftWorkRepository;
_employeeDocumentItemRepository = employeeDocumentItemRepository;
_authHelper = authHelper;
_basePath = Path.Combine(_webHostEnvironment.ContentRootPath, "Storage", "EmployeeDocuments");
_employeeClientTempRepository = employeeClientTempRepository;
_basePath = Path.Combine(_webHostEnvironment.ContentRootPath, "Storage", "EmployeeDocuments");
}
/// <summary>
@@ -1213,6 +1217,19 @@ namespace CompanyManagment.Application
}
entity.UpdateIsConfirmed();
entity.UpdateIsSentToChecker();
if (entity.IsConfirmed)
{
var clientTemp = _employeeClientTempRepository.GetByEmployeeIdAndWorkshopId(entity.EmployeeId, entity.WorkshopId);
var employee = _employeeRepository.Get(entity.EmployeeId);
if (clientTemp != null)
{
employee.EditFromEmployeeClientTemp(clientTemp.MaritalStatus);
_employeeClientTempRepository.Remove(clientTemp);
}
}
_employeeDocumentsRepository.SaveChanges();
return op.Succcedded();
}
@@ -1222,91 +1239,93 @@ namespace CompanyManagment.Application
/// برای تایید یا رد توسط چکر ،unsubmitted دریافت جزییات مدارک پرسنل، بدون مدارک
/// </summary>
public EmployeeDocumentsViewModel GetDetailsForChecker(long employeeId, long workshopId)
{
var entity = _employeeDocumentsRepository.GetByEmployeeIdWorkshopIdWithItems(employeeId, workshopId);
{
var entity = _employeeDocumentsRepository.GetByEmployeeIdWorkshopIdWithItems(employeeId, workshopId);
if (!_employeeRepository.Exists(x => x.id == employeeId))
return new();
if (!_workshopRepository.Exists(x => x.id == workshopId))
return new();
if (!_employeeRepository.Exists(x => x.id == employeeId))
return new();
if (!_workshopRepository.Exists(x => x.id == workshopId))
return new();
//if entity is null but employee exists, make a new empty entity for it
if (entity == null)
{
var opCreate =
Create(new CreateEmployeeDocuments() { EmployeeId = employeeId, WorkshopId = workshopId });
if (opCreate.IsSuccedded == false) return new();
//if entity is null but employee exists, make a new empty entity for it
if (entity == null)
{
var opCreate =
Create(new CreateEmployeeDocuments() { EmployeeId = employeeId, WorkshopId = workshopId });
if (opCreate.IsSuccedded == false) return new();
return new EmployeeDocumentsViewModel() { EmployeeId = employeeId };
}
return new EmployeeDocumentsViewModel() { EmployeeId = employeeId };
}
List<EmployeeDocumentItem> currentDocuments = entity.EmployeeDocumentItemCollection
.Where(x => x.DocumentStatus != DocumentStatus.Unsubmitted)
.GroupBy(x => x.DocumentLabel)
.Select(x => x.MaxBy(y => y.CreationDate))
.Where(x=>x.DocumentStatus == DocumentStatus.SubmittedByAdmin ||
List<EmployeeDocumentItem> currentDocuments = entity.EmployeeDocumentItemCollection
.Where(x => x.DocumentStatus != DocumentStatus.Unsubmitted)
.GroupBy(x => x.DocumentLabel)
.Select(x => x.MaxBy(y => y.CreationDate))
.Where(x => x.DocumentStatus == DocumentStatus.SubmittedByAdmin ||
x.DocumentStatus == DocumentStatus.Confirmed || x.DocumentStatus == DocumentStatus.Rejected).ToList();
var medias = _mediaRepository
.GetMedias(currentDocuments.Select(x => x.MediaId)
.ToList());
var medias = _mediaRepository
.GetMedias(currentDocuments.Select(x => x.MediaId)
.ToList());
var employee = _employeeRepository.Get(entity.EmployeeId);
var employee = _employeeRepository.Get(entity.EmployeeId);
var employeeClientTemp = _employeeClientTempRepository.GetByEmployeeIdAndWorkshopId(employeeId, workshopId);
return new EmployeeDocumentsViewModel()
{
Id = entity.id,
MilitaryServiceCard = GetItemFromCollectionByLabel(currentDocuments, medias,
DocumentItemLabel.MilitaryServiceCard),
return new EmployeeDocumentsViewModel()
{
Id = entity.id,
MilitaryServiceCard = GetItemFromCollectionByLabel(currentDocuments, medias,
DocumentItemLabel.MilitaryServiceCard),
EducationalDegree = GetItemFromCollectionByLabel(currentDocuments, medias,
DocumentItemLabel.EducationalDegree),
EducationalDegree = GetItemFromCollectionByLabel(currentDocuments, medias,
DocumentItemLabel.EducationalDegree),
IdCardPage1 =
GetItemFromCollectionByLabel(currentDocuments, medias, DocumentItemLabel.IdCardPage1),
IdCardPage1 =
GetItemFromCollectionByLabel(currentDocuments, medias, DocumentItemLabel.IdCardPage1),
IdCardPage2 =
GetItemFromCollectionByLabel(currentDocuments, medias, DocumentItemLabel.IdCardPage2),
IdCardPage2 =
GetItemFromCollectionByLabel(currentDocuments, medias, DocumentItemLabel.IdCardPage2),
IdCardPage3 =
GetItemFromCollectionByLabel(currentDocuments, medias, DocumentItemLabel.IdCardPage3),
IdCardPage3 =
GetItemFromCollectionByLabel(currentDocuments, medias, DocumentItemLabel.IdCardPage3),
IdCardPage4 =
GetItemFromCollectionByLabel(currentDocuments, medias, DocumentItemLabel.IdCardPage4),
IdCardPage4 =
GetItemFromCollectionByLabel(currentDocuments, medias, DocumentItemLabel.IdCardPage4),
NationalCardFront = GetItemFromCollectionByLabel(currentDocuments, medias,
DocumentItemLabel.NationalCardFront),
NationalCardFront = GetItemFromCollectionByLabel(currentDocuments, medias,
DocumentItemLabel.NationalCardFront),
NationalCardRear = GetItemFromCollectionByLabel(currentDocuments, medias,
DocumentItemLabel.NationalCardRear),
NationalCardRear = GetItemFromCollectionByLabel(currentDocuments, medias,
DocumentItemLabel.NationalCardRear),
EmployeePicture = GetItemFromCollectionByLabel(currentDocuments, medias,
DocumentItemLabel.EmployeePicture),
EmployeePicture = GetItemFromCollectionByLabel(currentDocuments, medias,
DocumentItemLabel.EmployeePicture),
EmployeeFullName = employee.FullName,
WorkshopId = workshopId,
EmployeeId = entity.EmployeeId,
Gender = employee.Gender,
NationalCode = employee.NationalCode,
EmployeeFName = employee.FName,
EmployeeLName = employee.LName,
Nationality = employee.Nationality,
IdNumber = employee.IdNumber,
FatherName = employee.FatherName,
DateOfBirth = employee.DateOfBirth.ToFarsi(),
MaritalStatus = employee.MaritalStatus,
MilitaryServiceStatus = employee.MilitaryService,
SubmittedItemsCount = currentDocuments.Count(x => x.DocumentStatus == DocumentStatus.SubmittedByAdmin)
};
}
EmployeeFullName = employee.FullName,
WorkshopId = workshopId,
EmployeeId = entity.EmployeeId,
Gender = employee.Gender,
NationalCode = employee.NationalCode,
EmployeeFName = employee.FName,
EmployeeLName = employee.LName,
Nationality = employee.Nationality,
IdNumber = employee.IdNumber,
FatherName = employee.FatherName,
DateOfBirth = employee.DateOfBirth.ToFarsi(),
MaritalStatus = employeeClientTemp == null ? employee.MaritalStatus : employeeClientTemp.MaritalStatus,
MilitaryServiceStatus = employee.MilitaryService,
SubmittedItemsCount = currentDocuments.Count(x => x.DocumentStatus == DocumentStatus.SubmittedByAdmin)
};
}
/// <summary>
/// دریافت کارگاه هایی که اقدام به آپلود مدارک کرده اند
/// </summary>
public List<WorkshopWithEmployeeDocumentsViewModel> GetWorkshopsWithUploadedDocumentsForChecker()
/// <summary>
/// دریافت کارگاه هایی که اقدام به آپلود مدارک کرده اند
/// </summary>
public List<WorkshopWithEmployeeDocumentsViewModel> GetWorkshopsWithUploadedDocumentsForChecker()
{
return _employeeDocumentsRepository.GetWorkshopsWithUploadedDocuments();
}

View File

@@ -76,4 +76,9 @@ public class PersonnelCodeApplication : IPersonnelCodeApplication
{
return _personnelCodeRepository.GetEmployeeIdByPersonelCode(personleCode, workshopId);
}
public long GetLastPersonnelCodeByWorkshop(long workshopId)
{
return _personnelCodeRepository.GetLastPersonnelCodeByWorkshop(workshopId);
}
}

View File

@@ -102,4 +102,9 @@ public class RollCallServiceApplication : IRollCallServiceApplication
{
return _rollCallServiceRepository.GetAllServiceByAccountId(accountId);
}
public bool IsExistActiveServiceByWorkshopId(long workshopId)
{
return _rollCallServiceRepository.IsExistActiveServiceByWorkshopId(workshopId);
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Transactions;
using _0_Framework.Application;
using AccountManagement.Application.Contracts.Account;
@@ -15,6 +16,7 @@ using CompanyManagment.App.Contracts.EmployeeChildren;
using CompanyManagment.App.Contracts.LeftWork;
using CompanyManagment.App.Contracts.RollCallService;
using CompanyManagment.App.Contracts.Workshop;
using CompanyManagment.App.Contracts.Workshop.DTOs;
using CompanyManagment.App.Contracts.WorkshopPlan;
using CompanyManagment.EFCore.Migrations;
using Microsoft.EntityFrameworkCore;
@@ -35,9 +37,9 @@ public class WorkshopAppliction : IWorkshopApplication
private readonly IInstitutionContractRepository _institutionContractRepository;
private readonly IPersonalContractingPartyRepository _personalContractingPartyRepository;
private readonly IRollCallServiceApplication _rollCallServiceApplication;
private readonly IPasswordHasher _passwordHasher;
public WorkshopAppliction(IWorkshopRepository workshopRepository, ILeftWorkRepository leftWorkRepository, ILeftWorkInsuranceRepository leftWorkInsuranceRepository, IWorkshopPlanApplication workshopPlanApplication, IEmployeeApplication employeeApplication, IEmployeeChildrenApplication employeeChildrenApplication, IInstitutionContractRepository institutionContractRepository, IPersonalContractingPartyRepository personalContractingPartyRepository, IRollCallServiceApplication rollCallServiceApplication)
public WorkshopAppliction(IWorkshopRepository workshopRepository, ILeftWorkRepository leftWorkRepository, ILeftWorkInsuranceRepository leftWorkInsuranceRepository, IWorkshopPlanApplication workshopPlanApplication, IEmployeeApplication employeeApplication, IEmployeeChildrenApplication employeeChildrenApplication, IInstitutionContractRepository institutionContractRepository, IPersonalContractingPartyRepository personalContractingPartyRepository, IRollCallServiceApplication rollCallServiceApplication, IPasswordHasher passwordHasher)
{
_workshopRepository = workshopRepository;
_leftWorkRepository = leftWorkRepository;
@@ -48,6 +50,7 @@ public class WorkshopAppliction : IWorkshopApplication
_institutionContractRepository = institutionContractRepository;
_personalContractingPartyRepository = personalContractingPartyRepository;
_rollCallServiceApplication = rollCallServiceApplication;
_passwordHasher = passwordHasher;
}
public OperationResult Create(CreateWorkshop command)
@@ -752,6 +755,8 @@ public class WorkshopAppliction : IWorkshopApplication
return _workshopRepository.PrintWorkshopList(searchModel);
}
public AccountViewModel GetClientAccountByWorkshopId(long workshopId)
{
var contractingParty = _workshopRepository.GetPersonalContractingPartyByWorkshopId(workshopId);
@@ -760,19 +765,104 @@ public class WorkshopAppliction : IWorkshopApplication
//public List<ConnectedPersonnelViewModel> GetConnectedPersonnelsForMain(long workshopId)
//{
// return _workshopRepository.GetConnectedPersonnelsForMain(workshopId);
//}
//public List<ConnectedPersonnelViewModel> GetConnectedPersonnelsForMain(long workshopId)
//{
// return _workshopRepository.GetConnectedPersonnelsForMain(workshopId);
//}
#endregion
#endregion
#region Insurance
public List<WorkshopViewModel> GetWorkshopSelectListInsuransce()
#region Pooya
public List<PersonnelInfoViewModel> GetPersonnelInfoRemastered(PersonnelInfoSearchModel searchModel)
{
var res = _workshopRepository.GetPersonnelInfoRemastered(searchModel.WorkshopId);
res = res.Select(x => new PersonnelInfoViewModel
{
WorkshopId = x.WorkshopId,
EmployeeId = x.EmployeeId,
PersonnelCode = x.PersonnelCode,
FullName = x.FullName,
Name = x.Name,
LastName = x.LastName,
NationalCode = x.NationalCode,
IdNumber = x.IdNumber,
MaritalStatus = x.MaritalStatus,
DateOfBirthFa = x.DateOfBirthFa,
FatherName = x.FatherName,
State = x.State,
City = x.City,
Address = x.Address,
ChildrenList = x.ChildrenList,
ContractPerson = x.ContractPerson,
InsurancePerson = x.InsurancePerson,
ContractLeft = x.ContractLeft,
InsuranceLeft = x.InsuranceLeft,
Black = ((x.ContractPerson && x.InsurancePerson && x.InsuranceLeft && x.ContractLeft) ||
(x.ContractPerson && !x.InsurancePerson && x.ContractLeft) ||
(x.InsurancePerson && !x.ContractPerson && x.InsuranceLeft))
? true
: false,
LastStartContractWork = x.LastStartContractWork,
LastLeftContractWork = x.LastLeftContractWork,
LastStartInsuranceWork = x.LastStartInsuranceWork,
LastLeftInsuranceWork = x.LastLeftInsuranceWork,
WorkshopHash = _passwordHasher.SlugHasher(x.WorkshopId),
EmployeeHash = _passwordHasher.SlugHasher(x.EmployeeId),
CreatedByClient = x.CreatedByClient,
LefWorkTemp = x.LefWorkTemp,
LeftWork = x.LeftWork,
PersonnelInfoViewModels = x.PersonnelInfoViewModels,
StartWork = x.StartWork
}).ToList();
if (!string.IsNullOrWhiteSpace(searchModel.FullName))
res = res.Where(x => x.FullName.Contains(searchModel.FullName)).ToList();
if (!string.IsNullOrWhiteSpace(searchModel.NationalCode))
res = res.Where(x => x.NationalCode.Contains(searchModel.NationalCode)).ToList();
if (!string.IsNullOrWhiteSpace(searchModel.MaritalStatus))
res = res.Where(x => x.MaritalStatus == searchModel.MaritalStatus).ToList();
return res;
}
#endregion
#region Insurance
public List<WorkshopViewModel> GetWorkshopSelectListInsuransce()
{
return _workshopRepository.GetWorkshopSelectListInsuransce();
}
#endregion
#endregion
#region Mahan
public async Task<List<WorkshopWithStartedEmployeesDto>> GetWorkshopsForEmployeeStartWork(long accountId)
{
return await _workshopRepository.GetWorkshopsForEmployeeStartWork(accountId);
}
public async Task<int> GetWorkshopsForEmployeeStartWorkCount(long accountId)
{
return await _workshopRepository.GetWorkshopsForEmployeeStartWorkCount(accountId);
}
public async Task<List<WorkshopWithLeftWorkTempEmployeesDto>> GetWorkshopsForLeftWorkTemp(long accountId)
{
return await _workshopRepository.GetWorkshopsForLeftWorkTemp(accountId);
}
public Task<int> GetWorkshopsForLeftWorkTempCount(long accountId)
{
return _workshopRepository.GetWorkshopsForLeftWorkTempCount(accountId);
}
#endregion
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,75 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace CompanyManagment.EFCore.Migrations
{
/// <inheritdoc />
public partial class addemployeebyclienttables : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "IsAuthorized",
table: "Employees",
type: "bit",
nullable: false,
defaultValue: false);
migrationBuilder.CreateTable(
name: "EmployeeClientTemps",
columns: table => new
{
id = table.Column<long>(type: "bigint", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
EmployeeFullName = table.Column<string>(type: "nvarchar(max)", nullable: true),
WorkshopId = table.Column<long>(type: "bigint", nullable: false),
EmployeeId = table.Column<long>(type: "bigint", nullable: false),
StartWorkDate = table.Column<DateTime>(type: "datetime2", nullable: false),
MaritalStatus = table.Column<string>(type: "nvarchar(max)", nullable: true),
CreationDate = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_EmployeeClientTemps", x => x.id);
});
migrationBuilder.CreateTable(
name: "LeftWorkTemps",
columns: table => new
{
id = table.Column<long>(type: "bigint", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
LeftWorkId = table.Column<long>(type: "bigint", nullable: false),
StartWork = table.Column<DateTime>(type: "datetime2", nullable: false),
LeftWork = table.Column<DateTime>(type: "datetime2", nullable: false),
LastDayStanding = table.Column<DateTime>(type: "datetime2", nullable: false),
WorkshopId = table.Column<long>(type: "bigint", nullable: false),
EmployeeId = table.Column<long>(type: "bigint", nullable: false),
JobId = table.Column<long>(type: "bigint", nullable: false),
LeftWorkType = table.Column<int>(type: "int", nullable: false),
CreationDate = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_LeftWorkTemps", x => x.id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "EmployeeClientTemps");
migrationBuilder.DropTable(
name: "LeftWorkTemps");
migrationBuilder.DropColumn(
name: "IsAuthorized",
table: "Employees");
}
}
}

View File

@@ -1469,6 +1469,9 @@ namespace CompanyManagment.EFCore.Migrations
.HasMaxLength(10)
.HasColumnType("nvarchar(10)");
b.Property<bool>("IsAuthorized")
.HasColumnType("bit");
b.Property<string>("LName")
.IsRequired()
.HasMaxLength(255)
@@ -1619,6 +1622,37 @@ namespace CompanyManagment.EFCore.Migrations
b.ToTable("EmployeeChildren", (string)null);
});
modelBuilder.Entity("Company.Domain.EmployeeClientTempAgg.EmployeeClientTemp", b =>
{
b.Property<long>("id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("id"));
b.Property<DateTime>("CreationDate")
.HasColumnType("datetime2");
b.Property<string>("EmployeeFullName")
.HasColumnType("nvarchar(max)");
b.Property<long>("EmployeeId")
.HasColumnType("bigint");
b.Property<string>("MaritalStatus")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("StartWorkDate")
.HasColumnType("datetime2");
b.Property<long>("WorkshopId")
.HasColumnType("bigint");
b.HasKey("id");
b.ToTable("EmployeeClientTemps");
});
modelBuilder.Entity("Company.Domain.EmployeeComputeOptionsAgg.EmployeeComputeOptions", b =>
{
b.Property<long>("id")
@@ -3443,6 +3477,46 @@ namespace CompanyManagment.EFCore.Migrations
b.ToTable("LeftWorkInsurances", (string)null);
});
modelBuilder.Entity("Company.Domain.LeftWorkTempAgg.LeftWorkTemp", b =>
{
b.Property<long>("id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("id"));
b.Property<DateTime>("CreationDate")
.HasColumnType("datetime2");
b.Property<long>("EmployeeId")
.HasColumnType("bigint");
b.Property<long>("JobId")
.HasColumnType("bigint");
b.Property<DateTime>("LastDayStanding")
.HasColumnType("datetime2");
b.Property<DateTime>("LeftWork")
.HasColumnType("datetime2");
b.Property<long>("LeftWorkId")
.HasColumnType("bigint");
b.Property<int>("LeftWorkType")
.HasColumnType("int");
b.Property<DateTime>("StartWork")
.HasColumnType("datetime2");
b.Property<long>("WorkshopId")
.HasColumnType("bigint");
b.HasKey("id");
b.ToTable("LeftWorkTemps");
});
modelBuilder.Entity("Company.Domain.LoanAgg.Entities.Loan", b =>
{
b.Property<long>("id")

View File

@@ -0,0 +1,35 @@
using System.Linq;
using _0_Framework.Application;
using _0_Framework.InfraStructure;
using Company.Domain.EmployeeClientTempAgg;
using CompanyManagment.App.Contracts.EmployeeClientTemp;
namespace CompanyManagment.EFCore.Repository;
public class EmployeeClientTempRepository: RepositoryBase<long, EmployeeClientTemp>, IEmployeeClientTempRepository
{
private readonly CompanyContext _context;
public EmployeeClientTempRepository(CompanyContext context): base(context)
{
_context = context;
}
public EmployeeClientTemp GetByEmployeeIdAndWorkshopId(long employeeId, long commandWorkshopId)
{
return _context.EmployeeClientTemps.FirstOrDefault(x =>
x.EmployeeId == employeeId && x.WorkshopId == commandWorkshopId);
}
public EmployeeClientTempGetDetailsViewModel GetDetails(long employeeId, long workshopId)
{
return _context.EmployeeClientTemps
.Where(x => x.WorkshopId == workshopId && x.EmployeeId == employeeId)
.Select(x => new EmployeeClientTempGetDetailsViewModel
{
EmployeeId = x.EmployeeId,
StartWorkDate = x.StartWorkDate.ToFarsi(),
WorkshopId = x.WorkshopId
}).FirstOrDefault();
}
}

View File

@@ -836,6 +836,7 @@ public class EmployeeRepository : RepositoryBase<long, Employee>, IEmployeeRepos
}).ToList();
}
public async Task<GetEditEmployeeInEmployeeDocumentViewModel> GetEmployeeEditInEmployeeDocumentWorkFlow(long employeeId, long workshopId)
{
var employee = await _context.Employees.Where(x => x.id == employeeId).Select(x => new GetEditEmployeeInEmployeeDocumentViewModel()
@@ -890,5 +891,18 @@ public class EmployeeRepository : RepositoryBase<long, Employee>, IEmployeeRepos
Phone = x.Phone
}).ToList();
}
public List<EmployeeViewModel> GetWorkedEmployeesByWorkshopIdsAndNationalCodeAndDate(List<long> workshopIds, string nationalCode, DateTime date)
{
return _context.Employees.Where(x => x.NationalCode.Contains(nationalCode)).Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
.Where(x => x.LeftWorks.Any(y => workshopIds.Contains(y.WorkshopId)) || x.LeftWorkInsurances.Any(y => workshopIds.Contains(y.WorkshopId)))
.Select(x => new EmployeeViewModel()
{
NationalCode = x.NationalCode,
FName = x.FName,
LName = x.LName,
Phone = x.Phone
}).ToList();
}
#endregion
}

View File

@@ -91,7 +91,13 @@ public class JobRepository: RepositoryBase<long, Job>, IJobRepository
Id = x.id,
JobName = x.JobName,
JobCode = x.JobCode
}).Where(x=>x.JobName.Contains(searchtText)).Take(100);
});
if (!string.IsNullOrWhiteSpace(searchtText))
{
query = query.Where(x => x.JobName.Contains(searchtText));
}
//if (!string.IsNullOrWhiteSpace(searchtText))
// query = query.Where(x => (x.JobName + " " + x.JobCode).Contains(searchtText));
//return query.OrderBy(x => x.Id).ToList();
@@ -107,7 +113,7 @@ public class JobRepository: RepositoryBase<long, Job>, IJobRepository
//var jobList = _context.Jobs.FromSqlInterpolated($"SelectQuery_AllJobs {searchtText}").AsNoTracking().ToList();
var jobViewModelList = query.Select(x => new JobViewModel
var jobViewModelList = query.Take(100).Select(x => new JobViewModel
{
Id = x.Id,
JobName = x.JobName+ " " + '-' + " " + x.JobCode,

View File

@@ -0,0 +1,82 @@
using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using _0_Framework.Application;
using _0_Framework.InfraStructure;
using Company.Domain.LeftWorkAgg;
using Company.Domain.LeftWorkTempAgg;
using CompanyManagment.App.Contracts.LeftWorkTemp;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking.Internal;
namespace CompanyManagment.EFCore.Repository;
public class LeftWorkTempRepository : RepositoryBase<long, LeftWorkTemp>, ILeftWorkTempRepository
{
private readonly CompanyContext _companyContext;
public LeftWorkTempRepository(CompanyContext companyContext) : base(companyContext)
{
_companyContext = companyContext;
}
public async Task<GetStartWorkTempDetails> GetStartAndLeftWorkDetails(long employeeId, long workshopId)
{
var employee = await _companyContext.Employees.FindAsync(employeeId);
var workshop = await _companyContext.Workshops.FindAsync(workshopId);
var leftWorkTemp =
await _companyContext.LeftWorkTemps.FirstOrDefaultAsync(x =>
x.WorkshopId == workshopId && x.EmployeeId == employeeId);
if (employee == null || workshop == null || leftWorkTemp == null)
{
return new GetStartWorkTempDetails();
}
var job = await _companyContext.Jobs.FindAsync(leftWorkTemp.JobId);
var previousLeftWorks = _companyContext.LeftWorkList
.Where(x => leftWorkTemp.EmployeeId == x.EmployeeId && leftWorkTemp.WorkshopId == x.WorkshopId).ToList();
if (leftWorkTemp.LeftWorkType == LeftWorkTempType.LeftWork)
{
previousLeftWorks = previousLeftWorks.Where(x => x.id != leftWorkTemp.LeftWorkId).ToList();
}
var personnelCode =
_companyContext.PersonnelCodeSet.FirstOrDefault(x =>
x.EmployeeId == employeeId && x.WorkshopId == workshopId)?.PersonnelCode;
return new GetStartWorkTempDetails
{
WorkshopId = leftWorkTemp.WorkshopId,
EmployeeId = leftWorkTemp.EmployeeId,
WorkshopFullName = workshop.WorkshopFullName,
EmployeeFullName = employee.FullName,
JobId = leftWorkTemp.JobId,
JobName = job?.JobName,
PersonnelCode = personnelCode ?? 0,
LeftWorkTemp = new LeftWorkTempDetailsViewModel()
{
Id = leftWorkTemp.id,
LastDayStanding = leftWorkTemp.LastDayStanding == new DateTime() ? "" : leftWorkTemp.LastDayStanding.ToFarsi(),
LeftWork = leftWorkTemp.LeftWork == new DateTime() ? "" : leftWorkTemp.LeftWork.ToFarsi(),
StartWork = leftWorkTemp.StartWork.ToFarsi()
},
PreviousLeftWorks = previousLeftWorks.Select(x => new LeftWorkTempDetailsViewModel()
{
Id = x.id,
LastDayStanding = x.LeftWorkDate.AddDays(-1).ToFarsi(),
LeftWork = x.LeftWorkDate.ToFarsi(),
StartWork = x.StartWorkDate.ToFarsi()
}).ToList()
};
}
}

View File

@@ -6,6 +6,7 @@ using System.Linq;
using _0_Framework.Application;
using _0_Framework.InfraStructure;
using Company.Domain.RollCallEmployeeAgg;
using CompanyManagment.App.Contracts.LeftWorkTemp;
using CompanyManagment.App.Contracts.RollCallEmployee;
using CompanyManagment.App.Contracts.RollCallEmployeeStatus;
using Microsoft.AspNetCore.Hosting;
@@ -79,7 +80,7 @@ public class RollCallEmployeeRepository : RepositoryBase<long, RollCallEmployee>
public List<RollCallEmployeeViewModel> GetPersonnelRollCallListPaginate(RollCallEmployeeSearchModel command)
{
var dateNow = DateTime.Now;
var employeeQuery = _context.Employees.AsQueryable();
var employeeQuery = _context.Employees.IgnoreQueryFilters().AsQueryable();
//if (!string.IsNullOrWhiteSpace(command.Name))
//{
@@ -95,39 +96,61 @@ public class RollCallEmployeeRepository : RepositoryBase<long, RollCallEmployee>
//}
var rawQuery = employeeQuery.Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
.Where(x => x.LeftWorks.Any(y =>
.GroupJoin(_context.LeftWorkTemps.Where(x => x.WorkshopId == command.WorkshopId),
employee => employee.id,
leftWorkTemp => leftWorkTemp.EmployeeId,
((employee, temp) => new { employee, temp }))
.SelectMany(x => x.temp.DefaultIfEmpty(),
(x, temp) => new { x.employee, temp })
.Where(x => (x.employee.LeftWorks.Any(y =>
y.WorkshopId == command.WorkshopId && y.StartWorkDate <= dateNow &&
y.LeftWorkDate > dateNow) ||
x.LeftWorkInsurances.Any(y =>
x.employee.LeftWorkInsurances.Any(y =>
y.WorkshopId == command.WorkshopId && y.StartWorkDate <= dateNow &&
(y.LeftWorkDate > dateNow || y.LeftWorkDate == null))).OrderByDescending(x => x.id)
(y.LeftWorkDate > dateNow || y.LeftWorkDate == null))) || x.temp != null).OrderByDescending(x => x.employee.id)
.Select(x => new
{
Id = x.id,
FullName =x.FName +" "+x.LName,
x.NationalCode,
Id = x.employee.id,
FullName = x.employee.FName + " " + x.employee.LName,
x.employee.NationalCode,
workshopTemp = x.temp
}).AsSplitQuery();
var rollCallEmployees = _context.RollCallEmployees.Where(x => x.WorkshopId == command.WorkshopId);
var employeeClient = _context.EmployeeClientTemps.Where(x => x.WorkshopId == command.WorkshopId);
var joinedQuery = from employee in rawQuery
join rollCallEmployee in rollCallEmployees
on employee.Id equals rollCallEmployee.EmployeeId into grp
from joinedRollCall in grp.DefaultIfEmpty()
select new RollCallEmployeeViewModel()
{
WorkshopId = command.WorkshopId,
EmployeeId = employee.Id,
Id = joinedRollCall == null ? 0 : joinedRollCall.id,
EmployeeFullName = joinedRollCall == null ? employee.FullName : joinedRollCall.EmployeeFullName,
NationalCode = employee.NationalCode,
IsActiveString = joinedRollCall.EmployeesStatus.Any(y => y.StartDate.Date <= dateNow.Date && y.EndDate.Date > dateNow.Date) ? "true" : "false",
HasUploadedImage = joinedRollCall == null ? "false" : joinedRollCall.HasUploadedImage
};
join rollCallEmployee in rollCallEmployees
on employee.Id equals rollCallEmployee.EmployeeId into grp
from joinedRollCall in grp.DefaultIfEmpty()
join employeeClientT in employeeClient on employee.Id equals employeeClientT.EmployeeId into employeeCT
from clientTemp in employeeCT.DefaultIfEmpty()
select new RollCallEmployeeViewModel()
{
WorkshopId = command.WorkshopId,
EmployeeId = employee.Id,
Id = joinedRollCall == null ? 0 : joinedRollCall.id,
EmployeeFullName = joinedRollCall == null ? employee.FullName : joinedRollCall.EmployeeFullName,
NationalCode = employee.NationalCode,
IsActiveString =
joinedRollCall.EmployeesStatus.Any(y =>
y.StartDate.Date <= dateNow.Date && y.EndDate.Date > dateNow.Date)
? "true"
: "false",
HasUploadedImage = joinedRollCall == null ? "false" : joinedRollCall.HasUploadedImage,
CreatedByClient = clientTemp != null || (employee.workshopTemp != null &&employee.workshopTemp.LeftWorkType == LeftWorkTempType.StartWork)
};
if (!string.IsNullOrWhiteSpace(command.Name))
@@ -136,9 +159,9 @@ public class RollCallEmployeeRepository : RepositoryBase<long, RollCallEmployee>
}
var firstlist = joinedQuery.AsSplitQuery();
var list = firstlist.OrderByDescending(x => x.IsActiveString == "true" ? 1 : 0)
var list = firstlist.OrderByDescending(x => x.CreatedByClient).ThenByDescending(x => x.IsActiveString == "true" ? 1 : 0)
.ThenByDescending(x => x.HasUploadedImage == "true" ? 1 : 0)
.Skip(command.PageIndex).Take(30).ToList();
var watch = new Stopwatch();

View File

@@ -123,4 +123,9 @@ public class RollCallServiceRepository : RepositoryBase<long, RollCallService>,
}).Where(x => x.AccountId == accountId).ToList();
}
public bool IsExistActiveServiceByWorkshopId(long workshopId)
{
return _context.RollCallServices.AsSplitQuery().Any(x => x.WorkshopId == workshopId && x.IsActiveString == "true");
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -197,6 +197,10 @@ using Company.Domain.EmployeeDocumentsAgg;
using CompanyManagement.Infrastructure.Excel.SalaryAid;
using CompanyManagment.App.Contracts.EmployeeDocuments;
using CompanyManagment.App.Contracts.EmployeeDocumentsAdminSelection;
using Company.Domain.EmployeeClientTempAgg;
using Company.Domain.LeftWorkTempAgg;
using CompanyManagment.App.Contracts.EmployeeClientTemp;
using CompanyManagment.App.Contracts.LeftWorkTemp;
namespace PersonalContractingParty.Config;
@@ -409,6 +413,12 @@ public class PersonalBootstrapper
services.AddTransient<IAndroidApkVersionApplication, AndroidApkVersionApplication>();
services.AddTransient<SalaryAidImportExcel>();
services.AddTransient<IEmployeeClientTempRepository, EmployeeClientTempRepository>();
services.AddTransient<IEmployeeClientTempApplication, EmployeeClientTempApplication>();
services.AddTransient<ILeftWorkTempRepository, LeftWorkTempRepository>();
services.AddTransient<ILeftWorkTempApplication, LeftWorkTempApplication>();
#endregion
#region Pooya

View File

@@ -15,9 +15,10 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.Checker
_adminWorkFlowApplication = adminWorkFlowApplication;
}
public void OnGet()
public async System.Threading.Tasks.Task OnGet()
{
UploadDocumentCheckerCount = _adminWorkFlowApplication.GetWorkFlowCountForChecker();
UploadDocumentCheckerCount = await _adminWorkFlowApplication.GetWorkFlowCountForChecker();
}
}
}

View File

@@ -112,7 +112,7 @@
</div>
<div id="MainModal" class="modal fade" aria-labelledby="myModalLabel" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-hidden="true" style="display: none;">
<div class="modal-dialog modal-xl modal-dialog-centered modalRollCallWidth modal-dialog-scrollable">
<div class="modal-dialog modal-xl modal-dialog-centered modalRollCallWidth ">
<div class="modal-content" id="ModalContent">
</div>
</div>

View File

@@ -1,5 +1,6 @@
using _0_Framework.Application;
using Company.Domain.WorkshopAccountAgg;
using CompanyManagment.App.Contracts.Employee;
using CompanyManagment.App.Contracts.EmployeeDocuments;
using CompanyManagment.App.Contracts.Error;
using CompanyManagment.App.Contracts.Workshop;
@@ -29,11 +30,11 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.WorkFlow
_authHelper = authHelper;
}
public void OnGet()
public async System.Threading.Tasks.Task OnGet()
{
var accountId = _authHelper.CurrentAccountId();
var accountWorkshops = _workshopAccountRepository.GetList(accountId).Select(x => x.WorkshopId).ToList();
EmployeeDocumentsAwaitingSubmitCount = _adminWorkFlowApplication.GetWorkFlowCountsForAdmin(accountWorkshops).EmployeeDocumentsAwaitingSubmit;
EmployeeDocumentsAwaitingSubmitCount = await _adminWorkFlowApplication.GetEmployeeDocumentWorkFlowCountsForAdmin(accountWorkshops);
}
public IActionResult OnGetWorkshopsWithDocumentsAwaitingUploadAjax()
@@ -131,5 +132,21 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.WorkFlow
message = result.Message
});
}
public async Task<IActionResult> OnGetEditEmployeeModal(long employeeId, long workshopId)
{
var command = await _adminWorkFlowApplication.GetEmployeeEditInEmployeeDocumentWorkFlow(employeeId, workshopId);
return Partial("_ModalEmployeeDocuments/ModalEmployeeEdit", command);
}
public async Task<IActionResult> OnPostEditEmployeeModal(EditEmployeeInEmployeeDocument command)
{
var result = await _adminWorkFlowApplication.EditEmployeeInEmployeeDocumentWorkFlow(command);
return new JsonResult(new
{
success = result.IsSuccedded,
message = result.Message
});
}
}
}

View File

@@ -0,0 +1,135 @@
@page
@model ServiceHost.Areas.AdminNew.Pages.Company.WorkFlow.EmployeesLeftWorkModel
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
Layout = "Shared/_Layout";
ViewData["title"] = " - اعلام ترک کار توسط کافرما";
int index = 1;
}
@section Styles {
<link href="~/AssetsClient/css/table-style.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/table-responsive.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/assetsclient/css/operation-button.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/filter-search.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/card.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/datetimepicker.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AdminTheme/assets/sweet-alert/sweet-alert.min.css" rel="stylesheet">
<link href="~/assetsadminnew/workflow/css/EmployeesLeftWork.css?ver=clientVersion" rel="stylesheet" />
}
<div class="container-fluid">
<div class="row p-2">
<div class="col p-0 m-0 d-flex align-items-center justify-content-between">
<div class="col d-flex align-items-center justify-content-start">
<img src="~/AssetsClient/images/icons/face-scan.png" alt="" class="img-fluid me-2" style="width: 45px;" />
<div>
<h4 class="title d-flex align-items-center">اعلام ترک کار توسط کافرما</h4>
</div>
</div>
<div>
<a asp-page="/Company/WorkFlow/Index" class="back-btn" type="button">
<span>بازگشت</span>
</a>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row p-lg-2">
<div class="wrapper p-0">
<div class="subAccountHeaderList Rtable Rtable--collapse">
<div class="Rtable-row Rtable-row--head align-items-center sticky-div">
<div class="rightHeaderMenu px-3">
<div class="Rtable-cell column-heading width1">نام نقش</div>
</div>
<div class="leftHeaderMenu px-4">
<div class="Rtable-cell column-heading width1">ردیف</div>
<div class="Rtable-cell column-heading width2">نام کابران</div>
<div class="Rtable-cell column-heading text-center width3">عکس پرسنلی</div>
<div class="Rtable-cell column-heading text-center width4">کارت ملی</div>
<div class="Rtable-cell column-heading text-center width5">کارت پایان خدمت</div>
<div class="Rtable-cell column-heading text-center width6">شناسنامه</div>
<div class="Rtable-cell column-heading text-end pe-2 width7">عملیات</div>
</div>
</div>
</div>
</div>
<div class="p-0 d-block d-md-flex overflow-hidden rounded-3 my-2">
<div id="navbar-animmenu">
<ul class="show-dropdown main-navbar">
<div class="verti-selector">
<div class="top"></div>
<div class="bottom"></div>
</div>
<li class="active" data-menu="DocumentsAwaitingUpload">
<div class="d-flex align-items-center justify-content-between" id="clickStartDateTab">
<a href="javascript:void(0);">ترک کار</a>
<div>
<div id="CountLeftDateLoading" class="spinner-grow text-danger" role="status" style="align-items: center;justify-content: center;display: flex;margin: 0 0 0 9px;">
<span class="visually-hidden">بارگذاری...</span>
</div>
<span id="CountLeftDate" style="display: none"></span>
</div>
</div>
</li>
</ul>
</div>
<div class="" id="accountList">
<div class="card p-2">
<div class="row align-items-center mb-1">
<div class="d-none col-12 col-md-4 col-lg-4"></div>
<div class="col-1 col-lg-4 text-end"></div>
</div>
<div class="wrapper">
<div class="Rtable Rtable--collapse StartDateLists">
<div id="loadingSkeletonStartDate" style="display: contents;">
@for (int j = 0; j < 30; j++)
{
<div class="skeleton-loader" style="margin: 3px 0 !important;height: 39px;"></div>
}
</div>
<div class="w-100" id="loadStartDateWorkFlow">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="MainModal" class="modal fade " aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
<div class="modal-dialog modal-xl modal-dialog-centered modalRollCallWidth modal-dialog-scrollable">
<div class="modal-content" id="ModalContent">
</div>
</div>
</div>
@section Script {
<script src="~/assetsclient/js/site.js?ver=@clientVersion"></script>
<script src="~/AdminTheme/assets/sweet-alert/sweet-alert.min.js"></script>
<script src="~/AdminTheme/js/admin.js"></script>
<script>
var antiForgeryToken = $(`@Html.AntiForgeryToken()`).val();
var loadWorkshopsForLeftWorkTempUrl = `@Url.Page("./EmployeesLeftWork", "WorkshopsForLeftWorkTemp")`;
var loadEmployeesForLeftWorkTempUrl = `@Url.Page("./EmployeesLeftWork", "EmployeesForLeftWorkTemp")`;
var loadLeftWorkCount = `@Url.Page("./EmployeesLeftWork", "LeftWorkCount")`;
</script>
<script src="~/assetsadminnew/workflow/js/EmployeesLeftWork.js?ver=@clientVersion"></script>
}

View File

@@ -0,0 +1,105 @@
using _0_Framework.Application;
using CompanyManagment.App.Contracts.Employee;
using CompanyManagment.App.Contracts.Job;
using CompanyManagment.App.Contracts.LeftWork;
using CompanyManagment.App.Contracts.LeftWorkTemp;
using CompanyManagment.App.Contracts.PersonnleCode;
using CompanyManagment.App.Contracts.Workshop;
using CompanyManagment.Application;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using PersianTools.Core;
using WorkFlow.Application.Contracts.AdminWorkFlow;
namespace ServiceHost.Areas.AdminNew.Pages.Company.WorkFlow
{
[Authorize]
public class EmployeesLeftWorkModel : PageModel
{
private readonly IAdminWorkFlowApplication _adminWorkFlowApplication;
private readonly IEmployeeApplication _employeeApplication;
private readonly ILeftWorkApplication _leftWorkApplication;
private readonly ILeftWorkTempApplication _leftWorkTempApplication;
private readonly IPersonnelCodeApplication _personnelCodeApplication;
private readonly IWorkshopApplication _workShopApplication;
private readonly IJobApplication _jobApplication;
private readonly IAuthHelper _authHelper;
public EmployeesLeftWorkModel(IAdminWorkFlowApplication adminWorkFlowApplication, IEmployeeApplication employeeApplication, ILeftWorkApplication leftWorkApplication, IPersonnelCodeApplication personnelCodeApplication, IWorkshopApplication workShopApplication, IJobApplication jobApplication, IAuthHelper authHelper, ILeftWorkTempApplication leftWorkTempApplication)
{
_adminWorkFlowApplication = adminWorkFlowApplication;
_employeeApplication = employeeApplication;
_leftWorkApplication = leftWorkApplication;
_personnelCodeApplication = personnelCodeApplication;
_workShopApplication = workShopApplication;
_jobApplication = jobApplication;
_authHelper = authHelper;
_leftWorkTempApplication = leftWorkTempApplication;
}
public void OnGet()
{
}
public async Task<IActionResult> OnGetWorkshopsForLeftWorkTemp()
{
var accountId = _authHelper.CurrentAccountId();
var resultData = await _adminWorkFlowApplication.GetWorkshopsForLeftWorkTemp(accountId);
return new JsonResult(new
{
success = true,
data = resultData
});
}
public async Task<IActionResult> OnGetEmployeesForLeftWorkTemp(long workshopId)
{
var resultData = await _adminWorkFlowApplication.GetEmployeesForLeftWorkTemp(workshopId);
return new JsonResult(new
{
success = true,
data = resultData
});
}
public IActionResult OnGetJobSearch(string jobName)
{
var jobViewModels = _jobApplication.GetJobListByText(jobName);
return new JsonResult(jobViewModels);
}
public async Task<IActionResult> OnGetLeftWork(long employeeId, long workshopId)
{
var command = await _leftWorkTempApplication.GetStartAndLeftWorkDetails(employeeId, workshopId);
return Partial("./_ModalEmployeeLeftWork/LeftWork", command);
}
public async Task<IActionResult> OnPostSaveLeftWork(AcceptLeftWorkTemp command)
{
var result = await _leftWorkTempApplication.AcceptLeftWork(command);
return new JsonResult(new
{
success = result.IsSuccedded,
message = result.Message
});
}
public async Task<IActionResult> OnGetLeftWorkCount()
{
var accountId = _authHelper.CurrentAccountId();
var resultLeftWorkCount = await _adminWorkFlowApplication.GetWorkshopsForLeftWorkTempCount(accountId);
return new JsonResult(new
{
success = true,
dataLeftWorkCount = resultLeftWorkCount,
});
}
}
}

View File

@@ -0,0 +1,135 @@
@page
@model ServiceHost.Areas.AdminNew.Pages.Company.WorkFlow.EmployeesNewModel
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
Layout = "Shared/_Layout";
ViewData["title"] = " - اعلام شروع بکار توسط کافرما";
int index = 1;
}
@section Styles {
<link href="~/AssetsClient/css/table-style.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/table-responsive.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/assetsclient/css/operation-button.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/filter-search.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/card.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/datetimepicker.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AdminTheme/assets/sweet-alert/sweet-alert.min.css" rel="stylesheet">
<link href="~/assetsadminnew/workflow/css/employeesnew.css?ver=@clientVersion" rel="stylesheet" />
}
<div class="container-fluid">
<div class="row p-2">
<div class="col p-0 m-0 d-flex align-items-center justify-content-between">
<div class="col d-flex align-items-center justify-content-start">
<img src="~/AssetsClient/images/icons/face-scan.png" alt="" class="img-fluid me-2" style="width: 45px;" />
<div>
<h4 class="title d-flex align-items-center">اعلام شروع بکار توسط کافرما</h4>
</div>
</div>
<div>
<a asp-page="/Company/WorkFlow/Index" class="back-btn" type="button">
<span>بازگشت</span>
</a>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row p-lg-2">
<div class="wrapper p-0">
<div class="subAccountHeaderList Rtable Rtable--collapse">
<div class="Rtable-row Rtable-row--head align-items-center sticky-div">
<div class="rightHeaderMenu px-3">
<div class="Rtable-cell column-heading width1">نام نقش</div>
</div>
<div class="leftHeaderMenu px-4">
<div class="Rtable-cell column-heading width1">ردیف</div>
<div class="Rtable-cell column-heading width2">نام کابران</div>
<div class="Rtable-cell column-heading text-center width3">عکس پرسنلی</div>
<div class="Rtable-cell column-heading text-center width4">کارت ملی</div>
<div class="Rtable-cell column-heading text-center width5">کارت پایان خدمت</div>
<div class="Rtable-cell column-heading text-center width6">شناسنامه</div>
<div class="Rtable-cell column-heading text-end pe-2 width7">عملیات</div>
</div>
</div>
</div>
</div>
<div class="p-0 d-block d-md-flex overflow-hidden rounded-3 my-2">
<div id="navbar-animmenu">
<ul class="show-dropdown main-navbar">
<div class="verti-selector">
<div class="top"></div>
<div class="bottom"></div>
</div>
<li class="active" data-menu="DocumentsAwaitingUpload">
<div class="d-flex align-items-center justify-content-between" id="clickStartDateTab">
<a href="javascript:void(0);">شروع بکار</a>
<div>
<div id="CountStartDateLoading" class="spinner-grow text-danger" role="status" style="align-items: center;justify-content: center;display: flex;margin: 0 0 0 9px;">
<span class="visually-hidden">Loading...</span>
</div>
<span id="CountStartDate" style="display: none"></span>
</div>
</div>
</li>
</ul>
</div>
<div class="" id="accountList">
<div class="card p-2">
<div class="row align-items-center mb-1">
<div class="d-none col-12 col-md-4 col-lg-4"></div>
<div class="col-1 col-lg-4 text-end"></div>
</div>
<div class="wrapper">
<div class="Rtable Rtable--collapse StartDateLists">
<div id="loadingSkeletonStartDate" style="display: contents;">
@for (int j = 0; j < 30; j++)
{
<div class="skeleton-loader" style="margin: 3px 0 !important;height: 39px;"></div>
}
</div>
<div class="w-100" id="loadStartDateWorkFlow">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="MainModal" class="modal fade " aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
<div class="modal-dialog modal-xl modal-dialog-centered modalRollCallWidth modal-dialog-scrollable">
<div class="modal-content" id="ModalContent">
</div>
</div>
</div>
@section Script {
<script src="~/assetsclient/js/site.js?ver=@clientVersion"></script>
<script src="~/AdminTheme/assets/sweet-alert/sweet-alert.min.js"></script>
<script src="~/AdminTheme/js/admin.js"></script>
<script>
var antiForgeryToken = $(`@Html.AntiForgeryToken()`).val();
var loadWorkshopsForEmployeeStartWorkUrl = `@Url.Page("./EmployeesNew", "WorkshopsForEmployeeStartWork")`;
var loadClientEmployeesStartWorkUrl = `@Url.Page("./EmployeesNew", "ClientEmployeesStartWork")`;
var loadStartWorkCount = `@Url.Page("./EmployeesNew", "StartWorkCount")`;
</script>
<script src="~/assetsadminnew/workflow/js/employeesnew.js?ver=@clientVersion"></script>
}

View File

@@ -0,0 +1,97 @@
using _0_Framework.Application;
using CompanyManagment.App.Contracts.Employee;
using CompanyManagment.App.Contracts.Job;
using CompanyManagment.App.Contracts.LeftWork;
using CompanyManagment.App.Contracts.LeftWorkTemp;
using CompanyManagment.App.Contracts.PersonnleCode;
using CompanyManagment.App.Contracts.Workshop;
using MD.PersianDateTime.Standard;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using WorkFlow.Application.Contracts.AdminWorkFlow;
namespace ServiceHost.Areas.AdminNew.Pages.Company.WorkFlow
{
[Authorize]
public class EmployeesNewModel : PageModel
{
private readonly IAdminWorkFlowApplication _adminWorkFlowApplication;
private readonly ILeftWorkTempApplication _leftWorkTempApplication;
private readonly IJobApplication _jobApplication;
private readonly IAuthHelper _authHelper;
public EmployeesNewModel(IAdminWorkFlowApplication adminWorkFlowApplication, IAuthHelper authHelper, IJobApplication jobApplication, ILeftWorkTempApplication leftWorkTempApplication)
{
_adminWorkFlowApplication = adminWorkFlowApplication;
_authHelper = authHelper;
_jobApplication = jobApplication;
_leftWorkTempApplication = leftWorkTempApplication;
}
public void OnGet()
{
}
public async Task<IActionResult> OnGetWorkshopsForEmployeeStartWork()
{
var accountId = _authHelper.CurrentAccountId();
var resultData = await _adminWorkFlowApplication.GetWorkshopsForEmployeeStartWork(accountId);
return new JsonResult(new
{
success = true,
data = resultData
});
}
public async Task<IActionResult> OnGetClientEmployeesStartWork(long workshopId)
{
var resultData = await _adminWorkFlowApplication.GetClientEmployeesStartWork(workshopId);
return new JsonResult(new
{
success = true,
data = resultData
});
}
public IActionResult OnGetJobSearch(string jobName)
{
var jobViewModels = _jobApplication.GetJobListByText(jobName);
return new JsonResult(jobViewModels);
}
public async Task<IActionResult> OnGetStartWork(long employeeId, long workshopId)
{
var command = await _leftWorkTempApplication.GetStartAndLeftWorkDetails(employeeId, workshopId);
return Partial("./_ModalEmployeeNew/StartWork", command);
}
public async Task<IActionResult> OnPostSaveStartWork(AcceptStartWorkTemp command)
{
var result = await _leftWorkTempApplication.AcceptStartWork(command);
return new JsonResult(new
{
success = result.IsSuccedded,
message = result.Message
});
}
public async Task<IActionResult> OnGetStartWorkCount()
{
var accountId = _authHelper.CurrentAccountId();
var resultStartWorkCount = await _adminWorkFlowApplication.GetWorkshopsForEmployeeStartWorkCount(accountId);
return new JsonResult(new
{
success = true,
dataStartWorkCount = resultStartWorkCount,
});
}
}
}

View File

@@ -83,8 +83,8 @@
</div>
</a>
</div>
@* <div class="gwb-card">
<div class="gwb-card">
<a asp-page="/Company/WorkFlow/EmployeesNew" class="click loadingButton">
<div class="d-flex align-items-center justify-content-between p-1 w-100">
<div class="d-flex align-items-center">
@@ -93,22 +93,37 @@
<div class="card-title">اعلام شروع بکار توسط کافرما</div>
</div>
</div>
@if (@Model.EmployeeDocumentsAwaitingSubmitCount != 0)
{
<div class="countNumber">
<span>
@(Model.EmployeeDocumentsAwaitingSubmitCount > 99 ? "+99" : Model.EmployeeDocumentsAwaitingSubmitCount)
</span>
</div>
}
<div class="countNumber" id="StartWorkCount">
<span></span>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div> *@
</div>
<div class="gwb-card">
<a asp-page="/Company/WorkFlow/EmployeesLeftWork" class="click loadingButton">
<div class="d-flex align-items-center justify-content-between p-1 w-100">
<div class="d-flex align-items-center">
<img src="~/AssetsClient/images/insuranceList.png" alt="" class="img-fluid mx-1" width="50px" />
<div class="text-start ms-1">
<div class="card-title">اعلام ترک کار توسط کافرما</div>
</div>
</div>
<div class="countNumber" id="leftWorkCount">
<span></span>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
@* <div class="gwb-card">
@* <div class="gwb-card">
<a asp-page="/Company/WorkFlow/Insurance" class="click loadingButton">
<div class="d-flex align-items-center justify-content-between p-1 w-100">
<div class="d-flex align-items-center">
@@ -148,16 +163,57 @@
</div>
</div>
<script>
var antiForgeryTokenLayout = $('@Html.AntiForgeryToken()').val();
</script>
@section Script {
<script src="~/assetsclient/js/site.js?ver=@clientVersion"></script>
<script>
$(document).ready(function () {
$('.loadingButton').on('click', function () {
var button = $(this);
var loadingDiv = button.find('.loading');
loadingDiv.show();
});
});
</script>
$(document).ready(function () {
workFlowStartAndLeftWorkCountMenu();
$('.loadingButton').on('click', function (e) {
if (e.ctrlKey || e.metaKey) {
return;
}
var button = $(this);
var loadingDiv = button.find('.loading');
loadingDiv.show();
});
});
function workFlowStartAndLeftWorkCountMenu() {
$.ajax({
async: true,
dataType: 'json',
url: `@Url.Page("./Index", "StartAndLeftWorkCount")`,
headers: { "RequestVerificationToken": antiForgeryTokenLayout },
type: 'GET',
success: function (response) {
if (response.success) {
if (response.dataStartWorkCount === 0) {
$('#StartWorkCount').hide();
} else {
$('#StartWorkCount').show();
var startWorkCount = response.dataStartWorkCount > 99 ? "+99" : response.dataStartWorkCount;
$('#StartWorkCount span').text(startWorkCount);
}
if (response.dataLeftWorkCount === 0) {
$('#leftWorkCount').hide();
} else {
$('#leftWorkCount').show();
var leftWorkCount = response.dataLeftWorkCount > 99 ? "+99" : response.dataLeftWorkCount;
$('#leftWorkCount span').text(leftWorkCount);
}
}
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
}
});
}
</script>
}

View File

@@ -5,6 +5,7 @@ using CompanyManagment.App.Contracts.Workshop;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Configuration.UserSecrets;
using Microsoft.Identity.Client;
using Query.AdminReports.Handlers;
using WorkFlow.Application.Contracts.AdminWorkFlow;
using WorkFlow.Application.Contracts.WorkFlow;
@@ -25,11 +26,25 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.WorkFlow
_workshopAccountRepository = workshopAccountRepository;
}
public void OnGet()
public async System.Threading.Tasks.Task OnGet()
{
var accountId = _authHelper.CurrentAccountId();
var accountWorkshops = _workshopAccountRepository.GetList(accountId).Select(x => x.WorkshopId).ToList();
EmployeeDocumentsAwaitingSubmitCount = _adminWorkFlowApplication.GetWorkFlowCountsForAdmin(accountWorkshops).EmployeeDocumentsAwaitingSubmit;
EmployeeDocumentsAwaitingSubmitCount = await _adminWorkFlowApplication.GetEmployeeDocumentWorkFlowCountsForAdmin(accountWorkshops);
}
public async Task<IActionResult> OnGetStartAndLeftWorkCount()
{
var accountId = _authHelper.CurrentAccountId();
var resultStartWorkCount = await _adminWorkFlowApplication.GetWorkshopsForEmployeeStartWorkCount(accountId);
var resultLeftWorkCount = await _adminWorkFlowApplication.GetWorkshopsForLeftWorkTempCount(accountId);
return new JsonResult(new
{
success = true,
dataStartWorkCount = resultStartWorkCount,
dataLeftWorkCount = resultLeftWorkCount,
});
}
}
}

View File

@@ -0,0 +1,187 @@
@using Microsoft.AspNetCore.Mvc.TagHelpers
@model CompanyManagment.App.Contracts.Employee.GetEditEmployeeInEmployeeDocumentViewModel
@{
string adminVersion = _0_Framework.Application.Version.AdminVersion;
<link href="~/assetsadminnew/workflow/css/modalemployeeedit.css?ver=@adminVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/select2.css" rel="stylesheet" />
<style>
.select2-container .select2-selection--single {
height: 37px;
border-radius: 0 !important;
padding: 7px 6px !important;
}
</style>
}
<div>
<div class="modal-header pt-0 d-flex align-align-items-center justify-content-center text-center">
<button type="button" class="btn-close position-absolute text-start closeCustomModal"></button>
<div>
<p class="m-0 pdHeaderTitle1"><span class="">ویرایش پرسنل </span> @Model.FName @Model.LName</p>
</div>
</div>
<div>
<form class="row mt-3" role="form" method="post" name="create-employee-form" id="create-employee-form" autocomplete="off">
<div class="col-6 position-relative details">
<div class="form-group d-flex p-0">
<label class="titleForm ">
جنسیت
</label>
<input type="text" class="form-control" style="pointer-events: none;" value="">
</div>
<div class="d-flex align-items-center w-50 gap-4 mg-btn2s">
<div class="form-check d-flex align-items-center gap-1">
<input class="form-check-input" type="radio" id="flexRadioDefault1" name="Command.Gender" value="مرد" @(Model.Gender == "مرد" ? "checked" : "")>
<label class="form-check-label" for="flexRadioDefault1">
آقا
</label>
</div>
<div class="form-check d-flex align-items-center gap-1">
<input class="form-check-input" type="radio" id="flexRadioDefault2" name="Command.Gender" value="زن" @(Model.Gender == "زن" ? "checked" : "")>
<label class="form-check-label" for="flexRadioDefault2">
خانم
</label>
</div>
</div>
</div>
<div class="col-6 position-relative details">
<div class="form-group d-flex p-0">
<label class="titleForm">
ملیت
</label>
<input type="text" class="form-control" style="pointer-events: none;" value="">
</div>
<div class="d-flex align-items-center gap-2 mg-btn2s2" style="width: 60%;">
<div class="form-check d-flex align-items-center gap-1">
<input class="form-check-input" type="radio" id="flexRadioDefault3" name="Command.Nationality" value="ایرانی" @(Model.Nationality == "ایرانی" ? "checked" : "")>
<label class="form-check-label" for="flexRadioDefault3">
ایرانی
</label>
</div>
<div class="form-check d-flex align-items-center gap-1">
<input class="form-check-input" type="radio" id="flexRadioDefault4" name="Command.Nationality" value="غیر ایرانی" @(Model.Nationality == "غیر ایرانی" ? "checked" : "")>
<label class="form-check-label" for="flexRadioDefault4">
غیر ایرانی
</label>
</div>
</div>
</div>
<div class="col-6 details">
<div class="form-group d-flex p-0">
<label class="titleForm">
نام
</label>
<input type="text" class="form-control" name="Command.FName" id="FName" value="@Model.FName">
</div>
</div>
<div class="col-6 details">
<div class="form-group d-flex p-0">
<label class="titleForm">
نام خانوادگی
</label>
<input type="text" class="form-control" name="Command.LName" id="LName" value="@Model.LName">
</div>
</div>
<div class="col-6 details">
<div class="form-group d-flex p-0">
<label class="titleForm">
کد ملی
</label>
<input type="text" class="form-control" name="Command.NationalCode" id="NationalCode" value="@Model.NationalCode" style="direction: ltr;">
</div>
</div>
<div class="col-6 details">
<div class="form-group d-flex p-0">
<label class="titleForm">
شماره شناسنامه
</label>
<input type="text" class="form-control" name="Command.IdNumber" id="IdNumber" value="@Model.IdNumber" style="direction: ltr;">
</div>
</div>
<div class="col-6 details">
<div class="form-group d-flex p-0">
<label class="titleForm">
نام پدر
</label>
<input type="text" class="form-control" name="Command.FatherName" id="FatherName" value="@Model.FatherName">
</div>
</div>
<div class="col-6 details">
<div class="form-group d-flex p-0">
<label class="titleForm">
تاریخ تولد
</label>
<input type="text" class="form-control text-center date" name="Command.BirthDate" id="BirthDate" value="@Model.BirthDate" style="direction: ltr;">
</div>
</div>
<div class="col-6 position-relative details">
<div class="form-group d-flex p-0">
<label class="titleForm">
وضعیت تاهل
</label>
<input type="text" class="form-control" style="pointer-events: none;" value="">
</div>
<div class="d-flex w-50 align-items-center gap-3 gap-lg-2 mg-btn2s">
<div class="form-check d-flex align-items-center gap-1">
<input class="form-check-input" type="radio" name="Command.MaritalStatus" value="مجرد" id="flexRadioDefault5" @(Model.MaritalStatus == "مجرد" ? "checked" : "")>
<label class="form-check-label" for="flexRadioDefault5">
مجرد
</label>
</div>
<div class="form-check d-flex align-items-center gap-1">
<input class="form-check-input" type="radio" name="Command.MaritalStatus" value="متاهل" id="flexRadioDefault6" @(Model.MaritalStatus == "متاهل" ? "checked" : "")>
<label class="form-check-label" for="flexRadioDefault6">
متاهل
</label>
</div>
</div>
</div>
<div class="col-6 details" style="display: @(Model.Gender == "زن" ? "none" : "")">
<div class="form-group d-flex p-0">
<label class="titleForm2">
نظام وظیفه
</label>
<select class="form-select form-select-sm" id="militaryStatus" asp-for="@Model.MilitaryService">
<option value="مشمول">مشمول</option>
<option value="پایان خدمت">پایان خدمت</option>
<option value="معاف">معاف</option>
</select>
</div>
</div>
<input type="hidden" name="Command.EmployeeId" value="@Model.EmployeeId" />
</form>
</div>
<div class="modal-footer pb-0 d-block">
<div class="container m-auto">
<div class="row">
<div class="col-6 text-end">
<button type="button" class="btn-cancel2 justify-content-center closeCustomModal">انصراف</button>
</div>
<div class="col-6 text-start">
<button type="button" class="btnCreateNew position-relative" id="btnEditSaveEmployee">
ثبت
<div class="spinner-loading loading" style="display: none">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
</div>
</div>
<script src="~/assetsclient/libs/cleave/cleave.min.js"></script>
<script>
var antiForgeryToken = $(`@Html.AntiForgeryToken()`).val();
var saveEditEmployee = `@Url.Page("./EmployeesDocuments", "EditEmployeeModal")`;
var employeeId = Number(@Model.EmployeeId);
</script>
<script src="~/assetsadminnew/workflow/js/modalemployeeedit.js?ver=@adminVersion"></script>

View File

@@ -7,6 +7,8 @@
@{
string adminVersion = _0_Framework.Application.Version.AdminVersion;
<link href="~/AssetsAdminNew/employeesdocument/css/ModalUploadDocument.css?ver=@adminVersion" rel="stylesheet" />
<link href="~/assetsadminnew/css/custommodal.css?ver=@adminVersion" rel="stylesheet" />
<style>
.pdImageBox {
height: 66px;
@@ -20,434 +22,473 @@
<form role="form" method="post" name="create-form" id="create-form" autocomplete="off">
<div class="modal-content">
<div class="modal-header pb-0 d-flex align-items-center justify-content-center text-center">
<button type="button" class="btn-close position-absolute text-start exitModal" aria-label="Close"></button>
<div>
<p class="m-0 pdHeaderTitle1"><span class="">برسی مدارک </span> @Model.EmployeeFullName</p>
</div>
</div>
<div class="modal-content">
<div class="modal-header pb-0 d-flex align-items-center justify-content-center text-center">
<button type="button" class="btn-close position-absolute text-start exitModal" aria-label="Close"></button>
<div>
<p class="m-0 pdHeaderTitle1"><span class="">برسی مدارک </span> @Model.EmployeeFullName</p>
</div>
</div>
<div class="modal-body">
<div class="pdBoxGrid">
<div class="pdBox">
<input type="hidden" id="employeeIdForList" value="@Model.EmployeeId" asp-for="@Model.EmployeeId" />
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
<div class="modal-body">
<div class="pdBoxGrid">
<div class="pdBox">
<input type="hidden" id="employeeIdForList" value="@Model.EmployeeId" asp-for="@Model.EmployeeId" />
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (Model.EmployeePicture.PicturePath != null && !string.IsNullOrWhiteSpace(Model.EmployeePicture.PicturePath))
{
<img id="EmployeePicture" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.EmployeePicture.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="EmployeePicture" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.EmployeePicture.Id" asp-for="@Model.EmployeePicture.Id" />
<div class="sign">
</div>
@if (Model.EmployeePicture.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
@if (Model.EmployeePicture.PicturePath != null && !string.IsNullOrWhiteSpace(Model.EmployeePicture.PicturePath))
{
<img id="EmployeePicture" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.EmployeePicture.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="EmployeePicture" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.EmployeePicture.Id" asp-for="@Model.EmployeePicture.Id" />
<div class="sign">
</div>
@if (Model.EmployeePicture.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
}
else if (Model.EmployeePicture.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>عکس پرسنل <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.EmployeePicture.RejectionMessage) ? "رد شد" : "")</div>
@* <span class="pdTitle2 d-none d-md-block">در صورت آپلود نکردن عکس پرسنلی، عکس از حضور و غیاب تنظیم می‌شود.</span> *@
</div>
</div>
<div class="pdTitle2 reasonReject">@(!string.IsNullOrWhiteSpace(Model.EmployeePicture.RejectionMessage) ? Model.EmployeePicture.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_0" value="EmployeePicture" />
<div class="pdButtons">
<button type="button" class="btnUploadingPD d-block mb-1" data-index="0">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.EmployeePicture.PicturePath) ? Model.EmployeePicture.Status.ToString() : "") @(string.IsNullOrWhiteSpace(Model.EmployeePicture.PicturePath) ? "disable" : "")" data-index="0">حذف</button>
</div>
<input type="file" class="file-input" data-index="0" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.NationalCardFront.PicturePath))
{
<img id="NationalCardFront" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.NationalCardFront.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="NationalCardFront" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.NationalCardFront?.Id ?? 0" asp-for="@Model.NationalCardFront.Id" />
<div class="sign ">
</div>
@if (Model.NationalCardFront.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
}
else if (Model.EmployeePicture.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>عکس پرسنل <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.EmployeePicture.RejectionMessage) ? "رد شد" : "")</div>
@* <span class="pdTitle2 d-none d-md-block">در صورت آپلود نکردن عکس پرسنلی، عکس از حضور و غیاب تنظیم می‌شود.</span> *@
</div>
</div>
<div class="pdTitle2 reasonReject">@(!string.IsNullOrWhiteSpace(Model.EmployeePicture.RejectionMessage) ? Model.EmployeePicture.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_0" value="EmployeePicture" />
<div class="pdButtons">
<button type="button" class="btnUploadingPD d-block mb-1" data-index="0">آپلود عکس</button>
}
else if (Model.NationalCardFront.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>کارت ملی رو <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.NationalCardFront.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.NationalCardFront.RejectionMessage) ? Model.NationalCardFront.RejectionMessage : "")</div>
</div>
<button type="button" class="btnEditEmployee d-block mb-1 disable" onclick="LoadCustomPartial('@Url.Page("./EmployeesDocuments", "EditEmployeeModal", new { employeeId = Model.EmployeeId, workshopId = Model.WorkshopId})')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable">ارسال به ناظر</button>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.EmployeePicture.PicturePath) ? Model.EmployeePicture.Status.ToString() : "") @(string.IsNullOrWhiteSpace(Model.EmployeePicture.PicturePath) ? "disable" : "")" data-index="0">حذف</button>
</div>
<input type="file" class="file-input" data-index="0" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.NationalCardFront.PicturePath))
{
<img id="NationalCardFront" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.NationalCardFront.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="NationalCardFront" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.NationalCardFront?.Id ?? 0" asp-for="@Model.NationalCardFront.Id" />
<div class="sign ">
</div>
@if (Model.NationalCardFront.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
</div>
<input type="hidden" id="label_1" value="NationalCardFront" />
}
else if (Model.NationalCardFront.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>کارت ملی رو <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.NationalCardFront.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.NationalCardFront.RejectionMessage) ? Model.NationalCardFront.RejectionMessage : "")</div>
</div>
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="1">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.NationalCardFront.PicturePath) ? Model.NationalCardFront.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.NationalCardFront?.PicturePath) ? "" : "disable")" data-index="1">حذف</button>
</div>
<input type="file" class="file-input" data-index="1" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.NationalCardRear.PicturePath))
{
<img id="NationalCardRear" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.NationalCardRear.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="NationalCardRear" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.NationalCardRear.Id" asp-for="@Model.NationalCardRear.Id" />
<div class="sign">
</div>
@if (Model.NationalCardRear.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
</div>
<input type="hidden" id="label_1" value="NationalCardFront" />
}
else if (Model.NationalCardRear.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>کارت ملی پشت <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.NationalCardRear.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.NationalCardRear.RejectionMessage) ? Model.NationalCardRear.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_2" value="NationalCardRear" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="2">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.NationalCardRear.PicturePath) ? Model.NationalCardRear.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.NationalCardRear.PicturePath) ? "" : "disable")" data-index="2">حذف</button>
</div>
<input type="file" class="file-input" data-index="2" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox @(Model.Gender == "زن" ? "disable" : "") ">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.MilitaryServiceCard.PicturePath))
{
<img id="militaryServiceCardModal" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.MilitaryServiceCard.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="militaryServiceCardModal" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.MilitaryServiceCard.Id" asp-for="@Model.MilitaryServiceCard.Id" />
<div class="sign">
</div>
@if (Model.MilitaryServiceCard.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="1">آپلود عکس</button>
<button type="button" class="btnEditEmployee d-block mb-1 disable" onclick="LoadCustomPartial('@Url.Page("./EmployeesDocuments", "EmployeeModal")')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable">ارسال به ناظر</button>
}
else if (Model.MilitaryServiceCard.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>کارت پایان خدمت <span> @(Model.Gender == "زن" ? "" : "*")</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.MilitaryServiceCard.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.MilitaryServiceCard.RejectionMessage) ? Model.MilitaryServiceCard.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_3" value="MilitaryServiceCard" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="3">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block @(Model.Gender == "مرد" && !string.IsNullOrWhiteSpace(Model.MilitaryServiceCard.PicturePath)? Model.MilitaryServiceCard.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.MilitaryServiceCard.PicturePath) ? "" : "disable")" data-index="3">حذف</button>
</div>
<input type="file" class="file-input" data-index="3" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.IdCardPage1.PicturePath))
{
<img id="IdCardPage1" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.IdCardPage1.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="IdCardPage1" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.IdCardPage1.Id" asp-for="@Model.IdCardPage1.Id" />
<div class="sign">
</div>
@if (Model.IdCardPage1.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.NationalCardFront.PicturePath) ? Model.NationalCardFront.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.NationalCardFront?.PicturePath) ? "" : "disable")" data-index="1">حذف</button>
</div>
<input type="file" class="file-input" data-index="1" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.NationalCardRear.PicturePath))
{
<img id="NationalCardRear" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.NationalCardRear.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="NationalCardRear" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.NationalCardRear.Id" asp-for="@Model.NationalCardRear.Id" />
<div class="sign">
</div>
@if (Model.NationalCardRear.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
}
else if (Model.IdCardPage1.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
}
else if (Model.NationalCardRear.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>کارت ملی پشت <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.NationalCardRear.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.NationalCardRear.RejectionMessage) ? Model.NationalCardRear.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_2" value="NationalCardRear" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="2">آپلود عکس</button>
<button type="button" class="btnEditEmployee d-block mb-1 disable" onclick="LoadCustomPartial('@Url.Page("./EmployeesDocuments", "EmployeeModal")')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable">ارسال به ناظر</button>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه اول <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.IdCardPage1.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.IdCardPage1.RejectionMessage) ? Model.IdCardPage1.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_4" value="IdCardPage1" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="4">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.IdCardPage1.PicturePath) ? Model.IdCardPage1.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.IdCardPage1.PicturePath) ? "" : "disable")" data-index="4">حذف</button>
</div>
<input type="file" class="file-input" data-index="4" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.IdCardPage2.PicturePath))
{
<img id="IdCardPage2" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.IdCardPage2.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="IdCardPage2" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.IdCardPage2.Id" asp-for="@Model.IdCardPage2.Id" />
<div class="sign ">
</div>
@if (Model.IdCardPage2.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.NationalCardRear.PicturePath) ? Model.NationalCardRear.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.NationalCardRear.PicturePath) ? "" : "disable")" data-index="2">حذف</button>
</div>
<input type="file" class="file-input" data-index="2" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox @(Model.Gender == "زن" ? "disable" : "") ">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.MilitaryServiceCard.PicturePath))
{
<img id="militaryServiceCardModal" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.MilitaryServiceCard.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="militaryServiceCardModal" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.MilitaryServiceCard.Id" asp-for="@Model.MilitaryServiceCard.Id" />
<div class="sign">
</div>
@if (Model.MilitaryServiceCard.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
}
else if (Model.IdCardPage2.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
}
else if (Model.MilitaryServiceCard.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>کارت پایان خدمت <span> @(Model.Gender == "زن" ? "" : "*")</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.MilitaryServiceCard.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.MilitaryServiceCard.RejectionMessage) ? Model.MilitaryServiceCard.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_3" value="MilitaryServiceCard" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="3">آپلود عکس</button>
<button type="button" class="btnEditEmployee d-block mb-1 disable" onclick="LoadCustomPartial('@Url.Page("./EmployeesDocuments", "EmployeeModal")')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable">ارسال به ناظر</button>
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه دوم <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.IdCardPage2.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.IdCardPage2.RejectionMessage) ? Model.IdCardPage2.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_5" value="IdCardPage2" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="5">آپلود عکس</button>
@* status change first status *@
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.IdCardPage2.PicturePath) ? Model.IdCardPage2.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.IdCardPage2.PicturePath) ? "" : "disable")" data-index="5">حذف</button>
</div>
<input type="file" class="file-input" data-index="5" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.IdCardPage3.PicturePath))
{
<img id="IdCardPage3" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.IdCardPage3.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="IdCardPage3" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.IdCardPage3.Id" asp-for="@Model.IdCardPage3.Id" />
<div class="sign ">
</div>
@if (Model.IdCardPage3.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
<button type="button" class="btnDeletingPD d-block @(Model.Gender == "مرد" && !string.IsNullOrWhiteSpace(Model.MilitaryServiceCard.PicturePath)? Model.MilitaryServiceCard.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.MilitaryServiceCard.PicturePath) ? "" : "disable")" data-index="3">حذف</button>
</div>
<input type="file" class="file-input" data-index="3" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.IdCardPage1.PicturePath))
{
<img id="IdCardPage1" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.IdCardPage1.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="IdCardPage1" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.IdCardPage1.Id" asp-for="@Model.IdCardPage1.Id" />
<div class="sign">
</div>
@if (Model.IdCardPage1.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
}
else if (Model.IdCardPage3.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه سوم <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.IdCardPage3.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.IdCardPage3.RejectionMessage) ? Model.IdCardPage3.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_6" value="IdCardPage3" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="6">آپلود عکس</button>
@* status change first status *@
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.IdCardPage3.PicturePath) ? Model.IdCardPage3.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.IdCardPage3.PicturePath) ? "" : "disable")" data-index="6">حذف</button>
</div>
<input type="file" class="file-input" data-index="6" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.IdCardPage4.PicturePath))
{
<img id="IdCardPage4" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.IdCardPage4.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="IdCardPage4" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.IdCardPage4.Id" asp-for="@Model.IdCardPage4.Id" />
<div class="sign ">
</div>
@if (Model.IdCardPage4.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
}
else if (Model.IdCardPage1.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
}
else if (Model.IdCardPage4.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه چهارم </div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.IdCardPage4.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.IdCardPage4.RejectionMessage) ? Model.IdCardPage4.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_7" value="IdCardPage4" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="7">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.IdCardPage4.PicturePath) ? Model.IdCardPage4.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.IdCardPage4.PicturePath) ? "" : "disable")" data-index="7">حذف</button>
</div>
<input type="file" class="file-input" data-index="7" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
</div>
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه اول <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.IdCardPage1.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.IdCardPage1.RejectionMessage) ? Model.IdCardPage1.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_4" value="IdCardPage1" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="4">آپلود عکس</button>
<button type="button" class="btnEditEmployee d-block mb-1 disable" onclick="LoadCustomPartial('@Url.Page("./EmployeesDocuments", "EmployeeModal")')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable">ارسال به ناظر</button>
<div class="modal-footer d-block">
<div class="container m-auto">
<div class="row">
<div class="col-6 text-end">
<button type="button" class="exitModal btn-cancel2 justify-content-center">انصراف</button>
</div>
<div class="col-6 text-start">
<button type="button" class="btnCreateNew position-relative" id="createUploadingFiles" onclick="saveSubmit(Number(@Model.Id))">
ثبت
<div class="spinner-loading loading" style="display: none">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
</div>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.IdCardPage1.PicturePath) ? Model.IdCardPage1.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.IdCardPage1.PicturePath) ? "" : "disable")" data-index="4">حذف</button>
</div>
<input type="file" class="file-input" data-index="4" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.IdCardPage2.PicturePath))
{
<img id="IdCardPage2" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.IdCardPage2.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="IdCardPage2" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.IdCardPage2.Id" asp-for="@Model.IdCardPage2.Id" />
<div class="sign ">
</div>
@if (Model.IdCardPage2.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
</div>
}
else if (Model.IdCardPage2.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه دوم <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.IdCardPage2.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.IdCardPage2.RejectionMessage) ? Model.IdCardPage2.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_5" value="IdCardPage2" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="5">آپلود عکس</button>
<button type="button" class="btnEditEmployee d-block mb-1 disable" onclick="LoadCustomPartial('@Url.Page("./EmployeesDocuments", "EmployeeModal")')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable">ارسال به ناظر</button>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.IdCardPage2.PicturePath) ? Model.IdCardPage2.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.IdCardPage2.PicturePath) ? "" : "disable")" data-index="5">حذف</button>
</div>
<input type="file" class="file-input" data-index="5" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.IdCardPage3.PicturePath))
{
<img id="IdCardPage3" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.IdCardPage3.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="IdCardPage3" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.IdCardPage3.Id" asp-for="@Model.IdCardPage3.Id" />
<div class="sign ">
</div>
@if (Model.IdCardPage3.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
}
else if (Model.IdCardPage3.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه سوم <span> *</span></div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.IdCardPage3.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.IdCardPage3.RejectionMessage) ? Model.IdCardPage3.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_6" value="IdCardPage3" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="6">آپلود عکس</button>
<button type="button" class="btnEditEmployee d-block mb-1 disable" onclick="LoadCustomPartial('@Url.Page("./EmployeesDocuments", "EmployeeModal")')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable">ارسال به ناظر</button>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.IdCardPage3.PicturePath) ? Model.IdCardPage3.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.IdCardPage3.PicturePath) ? "" : "disable")" data-index="6">حذف</button>
</div>
<input type="file" class="file-input" data-index="6" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@if (!string.IsNullOrWhiteSpace(Model.IdCardPage4.PicturePath))
{
<img id="IdCardPage4" src="@Url.Page("./EmployeesDocuments", "ShowPicture", new { filePath = @Model.IdCardPage4.PicturePath })" class="preview-image isTrue" />
}
else
{
<img id="IdCardPage4" src="~/assetsclient/images/pd-image.png" class="preview-image" />
}
<input type="hidden" value="@Model.IdCardPage4.Id" asp-for="@Model.IdCardPage4.Id" />
<div class="sign ">
</div>
@if (Model.IdCardPage4.UploaderType == UserType.Admin)
{
<div class="uploaderSign admin">
<span>مدیر</span>
</div>
}
else if (Model.IdCardPage4.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه چهارم </div>
<div class="resultMessage">
<div>@(!string.IsNullOrWhiteSpace(Model.IdCardPage4.RejectionMessage) ? "رد شد" : "")</div>
</div>
</div>
<div class="pdTitle2 reasonReject ">@(!string.IsNullOrWhiteSpace(Model.IdCardPage4.RejectionMessage) ? Model.IdCardPage4.RejectionMessage : "")</div>
</div>
</div>
<input type="hidden" id="label_7" value="IdCardPage4" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="7">آپلود عکس</button>
<button type="button" class="btnEditEmployee d-block mb-1 disable" onclick="LoadCustomPartial('@Url.Page("./EmployeesDocuments", "EmployeeModal")')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable">ارسال به ناظر</button>
<button type="button" class="btnDeletingPD d-block @(!string.IsNullOrWhiteSpace(Model.IdCardPage4.PicturePath) ? Model.IdCardPage4.Status.ToString():"") @(!string.IsNullOrWhiteSpace(Model.IdCardPage4.PicturePath) ? "" : "disable")" data-index="7">حذف</button>
</div>
<input type="file" class="file-input" data-index="7" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
</div>
</div>
<div class="modal-footer d-block">
<div class="container m-auto">
<div class="row">
<div class="col-6 text-end">
<button type="button" class="exitModal btn-cancel2 justify-content-center">انصراف</button>
</div>
<div class="col-6 text-start">
<button type="button" class="btnCreateNew position-relative" id="createUploadingFiles" onclick="saveSubmit(Number(@Model.Id))">
ثبت
<div class="spinner-loading loading" style="display: none">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
</div>
</div>
</form>
@* Custom Modal *@
<div id="customModal" class="modalCustom">
<div class="modal-custom-content" id="CustomContentHtml">
</div>
</div>
<script src="~/assetsclient/js/site.js?ver=@adminVersion"></script>
<script src="~/assetsadminnew/js/custommodal.js?ver=@adminVersion"></script>
<script src="~/assetsadminnew/libs/sweetalert2/sweetalert2.all.min.js"></script>
<script src="~/assetsclient/libs/pdf/pdf.js"></script>
<script>

View File

@@ -0,0 +1,316 @@
@model CompanyManagment.App.Contracts.LeftWorkTemp.GetStartWorkTempDetails
@{
int i = 1;
string adminVersion = _0_Framework.Application.Version.AdminVersion;
<link href="@Href("~/DadmehrSelect/dad-mehr-select.css")" rel="stylesheet" />
<link href="~/AssetsClient/css/select2.css?ver=@adminVersion" rel="stylesheet" />
<link href="~/assetsadminnew/workflow/css/start-left-work.css?ver=@adminVersion" rel="stylesheet" />
<link href="@Href("~/admintheme/css/left-work.css")" rel="stylesheet" />
<style>
.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active {
border: none !important;
}
.select2-container--default .select2-selection--single .select2-selection__clear {
position: absolute;
left: 10px;
font-size: 22px;
color: #fff;
background: #ff8585;
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
padding: 12px;
border-radius: 20px;
}
.dadmehr-select-search .options {
top: 2px;
}
.dadmehr-select-search .line {
width: 0;
}
</style>
}
@Html.AntiForgeryToken()
<form role="form" method="post" name="create-form" id="create-form" autocomplete="off">
<div class="modal-content">
<div class="modal-header pb-0 d-flex align-items-center justify-content-center text-center">
<button type="button" class="btn-close position-absolute text-start" data-bs-dismiss="modal" aria-label="Close"></button>
<div>
<p class="m-0 pdHeaderTitle1"><span class="">ترک کار پرسنل در بخش قرارداد </span> @Model.EmployeeFullName</p>
</div>
</div>
<div class="modal-body">
<div class="container" id="LeftWorkForm">
@* <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<div class="main-title"> شروع بکار و ترک کار پرسنل در بخش قرارداد </div> *@
<fieldset class="box">
@* <legend>@Model.EmployeeName</legend> *@
@* <form autocomplete="off">
</form>*@
<div class="tabbed-navigation">
<div class="nav-tabs hide-scrollbar">
@* @if (Model.PreviousLeftWorks != null && Model.PreviousLeftWorks.Count > 0)
{
int index = 1;
@foreach (var item in @Model.PreviousLeftWorks)
{
<a href="#tab-@index" class="@(index == 1 ? "active" : "") nav-link"> <span class="del-com">
</span><span data-workshopid="@Model.WorkshopId" class="nav-title" id="nav-title1">@Model.WorkshopFullName</span></a>
index = index + 1;
}
}
else
{ *@
<a href="#tab-1" class="active nav-link"> <span class="del-com">@* <i newItem="true" onclick="deleteLeftwork(this,0)" class="fa fa-trash trash-icon delworkshop" aria-hidden="true" style="color: white;" permission="10421"></i> *@</span><span data-workshopid="0" class="nav-title" id="nav-title1">@Model.WorkshopFullName</span></a>
@* } *@
</div>
<div class="tab-content">
@* @if (Model.PreviousLeftWorks != null && Model.PreviousLeftWorks.Count > 0)
{ *@
<div class="tab-pane active" data-workshopid="" data-workshopName="" id="tab-1" data-pane="1">
<div class="pane-content">
<div class="top-content first-row">
<div class="first-col-content">
<div class="select-container">
<input type="hidden" name="Command.LeftWorkTempId" value="@Model.LeftWorkTemp.Id" />
<label> سمت </label>
<div class="sematValid disable" style="border-radius: 7px;">
<select class="form-select JobSelect2Option" aria-label="انتخاب سمت ..." id="sematSelect">
<option value="0">انتخاب سمت ...</option>
</select>
</div>
@* <label> سمت </label>
<div class="dadmehr-select-search" onclick="inputFocus(this)">
<div class="custom-select text-right">
<ul class="ul-search single text-right" data-url="@Url.Page("../WorkFlow/EmployeesNew", "JobByTextSearch")">
<li> <input onkeyup="searchText(event, this, '@Url.Page("../WorkFlow/EmployeesNew", "JobByTextSearch")', true)" class="text-right input-text "/></li>
</ul>
<ul class="result options text-right">
</ul>
</div>
<span class="span-input"></span>
</div> *@
</div>
</div>
<div class="second-col-content">
<label> شماره پرسنلی </label>
<input type="text" class="position-code" data-haspersonelcode="" value="@Model.PersonnelCode" disabled="disabled">
</div>
<div class="third-col-content">
</div>
</div>
<div class="top-content">
<div class="first-col-content">
<input type="text" class="persianDateInput date-input date input2" maxlength="10" id="StartWorkInput" placeholder="تاریخ شروع بکار" tabindex="1" value="@Model.LeftWorkTemp.StartWork" disabled="disabled">
</div>
<div class="second-col-content">
<input type="text" class="persianDateInput date-input date input3" maxlength="10" id="LastDayStandingInput" placeholder="تاریخ آخرین روز کاری" tabindex="2" value="@Model.LeftWorkTemp.LastDayStanding" disabled="disabled">
</div>
<div class="third-col-content">
<input type="text" class="persianDateInput date-input date input4" maxlength="10" id="LeftWorkInput" placeholder="تاریخ ترک کار" tabindex="3" value="@Model.LeftWorkTemp.LeftWork" disabled="disabled">
<button class=" btn save2 disable" type="button" id="save">ثبت</button>
</div>
</div>
<div class="table-content">
<table class="table table-bordered table-striped workDate-table" id="modal-table">
<colgroup>
<col style="width: 20px;">
<col style="width: 140px;">
@* <col class="col-edit" style="width: 5px;"> *@
<col style="width: 140px;">
<col style="width: 140px;">
<col class="col-remove" style="width: 5px;">
<col style="width: 30px;">
</colgroup>
<thead>
<tr>
<th>#</th>
<th>تاریخ شروع بکار</th>
@* <th style="border-right-width: 0;"></th> *@
<th>تاریخ آخرین روز کاری</th>
<th>تاریخ ترک کار</th>
<th class="permision" style="border-right-width: 0;"></th>
<th class="text-small">روزهای کارکرد</th>
</tr>
</thead>
<tbody>
<tr data-id="1">
<td>1</td>
<td>
<span>@Model.LeftWorkTemp.StartWork</span>
</td>
@* <td class="permision">
<a onclick="deleteDate(this, '', 0, 'first')" href="#" class="edit-date permission-removeDatefirst-edit"><i style="color: red;" class="ion-close-circled"></i></a>
<button onclick="enableEdit()" type="button" class="edit-icon permission-editDate"><i class="fa fa-edit"></i></button>
</td> *@
<td>
<span id="LastDayStandingTempSpan">@Model.LeftWorkTemp.LastDayStanding</span>
<input type="hidden" id="LastDayStandingValue" name="Command.LastDayStanding" value="@Model.LeftWorkTemp.LastDayStanding" />
</td>
<td>
<span id="LeftWorkTempSpan">@Model.LeftWorkTemp.LeftWork</span>
<input type="hidden" id="LeftWorkTempValue" name="Command.LeftWorkTime" value="@Model.LeftWorkTemp.LeftWork" />
</td>
<td class="permision">
@* <a onclick="deleteDate(this, '', 0, 'last')" href="#" class="edit-date permission-removeDatesecond-edit"><i style="color: red;" class="ion-close-circled"></i></a> *@
<button onclick="enableEdit()" type="button" class="edit-icon permission-editDate"><i class="fa fa-edit"></i></button>
</td>
<td></td>
</tr>
@if (Model.PreviousLeftWorks.Any())
{
@foreach (var item in Model.PreviousLeftWorks)
{
<tr data-id="@(i++)">
<td>@(i)</td>
<td>@item.StartWork</td>
@* <td class="permision">
<a onclick="deleteDate(this, '', 0, 'first')" href="#" class="edit-date permission-removeDatefirst-edit"><i style="color: red;" class="ion-close-circled"></i></a>
<button class="edit-icon permission-editDate"><i class="fa fa-edit"></i></button>
</td> *@
<td>@item.LastDayStanding</td>
<td>@item.LeftWork</td>
<td class="permision">
@* <a onclick="deleteDate(this, '', 0, 'last')" href="#" class="edit-date permission-removeDatesecond-edit"><i style="color: red;" class="ion-close-circled"></i></a>
<a href="#" class="edit-icon permission-editDate"><i class="fa fa-edit"></i></a> *@
</td>
<td></td>
</tr>
}
}
</tbody>
</table>
</div>
@* <div class="permision-info permission-options options-box">
<div class="options-info"> در صورت تمایل به محاسبه ی عناوین ذیل در فیش حقوقی، گزینه های موردنظر را فعال نمایید </div>
<div class="optional-wages d-flex">
<div class="d-flex options-check col-lg-4 col-md-4 col-sm-3 col-xs-4">
<div class="checkbox-wrapper-2">
<label class="toggleButton">
<input type="checkbox" checked="checked" class="activated addyearspay">
<div>
<svg viewBox="0 0 44 44">
<path d="M14,24 L21,31 L39.7428882,11.5937758 C35.2809627,6.53125861 30.0333333,4 24,4 C12.95,4 4,12.95 4,24 C4,35.05 12.95,44 24,44 C35.05,44 44,35.05 44,24 C44,19.3 42.5809627,15.1645919 39.7428882,11.5937758" transform="translate(-2.000000, -2.000000)"></path>
</svg>
</div>
</label>
</div>
<span class="options-type">سنوات </span>
</div>
<div class="d-flex options-check col-lg-4 col-md-4 col-sm-3 col-xs-4">
<div class="checkbox-wrapper-2">
<label class="toggleButton">
<input type="checkbox" checked="checked" class="activated addbonusespay">
<div>
<svg viewBox="0 0 44 44">
<path d="M14,24 L21,31 L39.7428882,11.5937758 C35.2809627,6.53125861 30.0333333,4 24,4 C12.95,4 4,12.95 4,24 C4,35.05 12.95,44 24,44 C35.05,44 44,35.05 44,24 C44,19.3 42.5809627,15.1645919 39.7428882,11.5937758" transform="translate(-2.000000, -2.000000)"></path>
</svg>
</div>
</label>
</div>
<span class="options-type"> عیدی و پاداش </span>
</div>
<div class="d-flex options-check col-lg-4 col-md-4 col-sm-3 col-xs-4">
<div class="checkbox-wrapper-2">
<label class="toggleButton">
<input type="checkbox" checked="checked" class="activated addleavepay">
<div>
<svg viewBox="0 0 44 44">
<path d="M14,24 L21,31 L39.7428882,11.5937758 C35.2809627,6.53125861 30.0333333,4 24,4 C12.95,4 4,12.95 4,24 C4,35.05 12.95,44 24,44 C35.05,44 44,35.05 44,24 C44,19.3 42.5809627,15.1645919 39.7428882,11.5937758" transform="translate(-2.000000, -2.000000)"></path>
</svg>
</div>
</label>
</div>
<span class="options-type">مزد و مرخصی </span>
</div>
</div>
</div> *@
</div>
</div>
</div>
</div>
<div class="last-div">
<div class="d-flex in-history">
<div class="col-md-4 col-4 col-sm-4 last-titles">سابقه بیمه در کارگاه</div>
<div class="col-md-8 col-8 col-sm-8 d-flex" style="direction: ltr">
<div class="date-sums">312</div>
<div class="dates blue">1323</div>
<div class="dates blue">1323</div>
<div class="dates blue">2131</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
<div class="modal-footer d-block">
<div class="container m-auto">
<div class="row">
<div class="col-6 text-end">
@* Old Close Modal *@
@* <button class="btn btn-modal" data-dismiss="modal" style="background-color: white;color: #323030;">بستن</button> *@
<button type="button" class="btn-cancel2 justify-content-center" data-bs-dismiss="modal" aria-label="Close">انصراف</button>
</div>
<div class="col-6 text-start">
@* Old Save Modal *@
@* <a href="#" id="btnSaveData" class="btn btn-modal" style="background-color: #0f9500; color: white;">ذخیره</a> *@
<button type="button" class="btnCreateNew position-relative" id="btnSaveData">
ثبت نهایی
<div class="spinner-loading loading" style="display: none">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
</div>
</div>
</form>
@* <script src="~/DadmehrSelect/dadmehr-select-leftWork.js?v=1.2"></script> *@
<script src="~/assetsclient/libs/jalaali-js/jalaali.js"></script>
<script src="~/admintheme/js/jquery.mask_1.14.16.min.js"></script>
<script>
var jobsLoadEmployeeAjaxUrl = `@Url.Page("/Company/WorkFlow/EmployeesLeftWork", "JobSearch")`;
var saveDataLeftWorkAjaxUrl = `@Url.Page("/Company/WorkFlow/EmployeesLeftWork", "SaveLeftWork")`;
var selectJobId = Number(@Model.JobId);
var selectJobName = `@Html.Raw(Model.JobName)`;
var workshopId = Number(@Model.WorkshopId);
var employeeId = Number(@Model.EmployeeId);
</script>
<script src="~/assetsadminnew/workflow/js/_ModalEmployeeLeftWork/LeftWork.js?ver=@adminVersion"></script>

View File

@@ -0,0 +1,300 @@
@model CompanyManagment.App.Contracts.LeftWorkTemp.GetStartWorkTempDetails
@{
int i = 1;
string adminVersion = _0_Framework.Application.Version.AdminVersion;
<link href="@Href("~/DadmehrSelect/dad-mehr-select.css")" rel="stylesheet" />
<link href="~/AssetsClient/css/select2.css?ver=@adminVersion" rel="stylesheet" />
<link href="~/assetsadminnew/workflow/css/start-left-work.css?ver=@adminVersion" rel="stylesheet" />
<link href="@Href("~/admintheme/css/left-work.css")" rel="stylesheet" />
<style>
.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active {
border: none !important;
}
.select2-container--default .select2-selection--single .select2-selection__clear {
position: absolute;
left: 10px;
font-size: 22px;
color: #fff;
background: #ff8585;
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
padding: 12px;
border-radius: 20px;
}
.dadmehr-select-search .options {
top: 2px;
}
.dadmehr-select-search .line {
width: 0;
}
</style>
}
<form role="form" method="post" name="create-form" id="create-form" autocomplete="off">
<div class="modal-content">
<div class="modal-header pb-0 d-flex align-items-center justify-content-center text-center">
<button type="button" class="btn-close position-absolute text-start" data-bs-dismiss="modal" aria-label="Close"></button>
<div>
<p class="m-0 pdHeaderTitle1"><span class="">شروع بکار پرسنل در بخش قرارداد </span> @Model.EmployeeFullName</p>
</div>
</div>
<div class="modal-body">
<div class="container" id="LeftWorkForm">
@* <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<div class="main-title"> شروع بکار و ترک کار پرسنل در بخش قرارداد </div> *@
<fieldset class="box">
@* <legend>@Model.EmployeeName</legend> *@
@* <form autocomplete="off">
</form>*@
<div class="tabbed-navigation">
<div class="nav-tabs hide-scrollbar">
@* @if (Model.PreviousLeftWorks != null && Model.PreviousLeftWorks.Count > 0)
{
int index = 1;
@foreach (var item in @Model.PreviousLeftWorks)
{
<a href="#tab-@index" class="@(index == 1 ? "active" : "") nav-link"> <span class="del-com">
</span><span data-workshopid="@Model.WorkshopId" class="nav-title" id="nav-title1">@Model.WorkshopFullName</span></a>
index = index + 1;
}
}
else
{ *@
<a href="#tab-1" class="active nav-link"> <span class="del-com">@* <i newItem="true" onclick="deleteLeftwork(this,0)" class="fa fa-trash trash-icon delworkshop" aria-hidden="true" style="color: white;" permission="10421"></i> *@</span><span data-workshopid="0" class="nav-title" id="nav-title1">@Model.WorkshopFullName</span></a>
@* } *@
</div>
<div class="tab-content">
@* @if (Model.PreviousLeftWorks != null && Model.PreviousLeftWorks.Count > 0)
{ *@
<div class="tab-pane active" data-workshopid="" data-workshopName="" id="tab-1" data-pane="1">
<div class="pane-content">
<div class="top-content first-row">
<div class="first-col-content">
<div class="select-container">
<input type="hidden" name="Command.LeftWorkTempId" value="@Model.LeftWorkTemp.Id" />
<label> سمت </label>
<div class="sematValid" style="border-radius: 7px;">
<select class="form-select JobSelect2Option" aria-label="انتخاب سمت ..." name="Command.JobId" id="sematSelect">
<option value="0">انتخاب سمت ...</option>
</select>
</div>
@* <label> سمت </label>
<div class="dadmehr-select-search" onclick="inputFocus(this)">
<div class="custom-select text-right">
<ul class="ul-search single text-right" data-url="@Url.Page("../WorkFlow/EmployeesNew", "JobByTextSearch")">
<li> <input onkeyup="searchText(event, this, '@Url.Page("../WorkFlow/EmployeesNew", "JobByTextSearch")', true)" class="text-right input-text "/></li>
</ul>
<ul class="result options text-right">
</ul>
</div>
<span class="span-input"></span>
</div> *@
</div>
</div>
<div class="second-col-content">
<label> شماره پرسنلی </label>
<input type="text" class="position-code" data-haspersonelcode="" value="@Model.PersonnelCode" disabled="disabled">
</div>
<div class="third-col-content">
</div>
</div>
<div class="top-content">
<div class="first-col-content">
<input type="text" class="persianDateInput date-input date input2" maxlength="10" id="StartWorkInput" placeholder="تاریخ شروع بکار" tabindex="1" value="@Model.LeftWorkTemp.StartWork" disabled="disabled">
</div>
<div class="second-col-content">
<input type="text" class="persianDateInput date-input date input3" maxlength="10" id="LastDayStandingInput" placeholder="تاریخ آخرین روز کاری" tabindex="2" value="@Model.LeftWorkTemp.LastDayStanding" disabled="disabled">
</div>
<div class="third-col-content">
<input type="text" class="persianDateInput date-input date input4" maxlength="10" id="LeftWorkInput" placeholder="تاریخ ترک کار" tabindex="3" value="@Model.LeftWorkTemp.LeftWork" disabled="disabled">
<button class=" btn save2 disable" type="button" id="save">ثبت</button>
</div>
</div>
<div class="table-content">
<table class="table table-bordered table-striped workDate-table" id="modal-table">
<colgroup>
<col style="width: 20px;">
<col style="width: 140px;">
<col class="col-edit" style="width: 5px;">
<col style="width: 140px;">
<col style="width: 140px;">
@* <col class="col-remove" style="width: 5px;"> *@
<col style="width: 30px;">
</colgroup>
<thead>
<tr>
<th>#</th>
<th>تاریخ شروع بکار</th>
<th style="border-right-width: 0;"></th>
<th>تاریخ آخرین روز کاری</th>
<th>تاریخ ترک کار</th>
@* <th class="permision" style="border-right-width: 0;"></th> *@
<th class="text-small">روزهای کارکرد</th>
</tr>
</thead>
<tbody>
<tr data-id="1">
<td>1</td>
<td>
<span id="StartWorkTemp">@Model.LeftWorkTemp.StartWork</span>
<input type="hidden" id="StartWorkTempValue" name="Command.StartDateTime" value="@Model.LeftWorkTemp.StartWork" />
</td>
<td class="permision">
@* <a onclick="deleteDate(this, '', 0, 'first')" href="#" class="edit-date permission-removeDatefirst-edit"><i style="color: red;" class="ion-close-circled"></i></a> *@
<button onclick="enableEdit()" type="button" class="edit-icon permission-editDate"><i class="fa fa-edit"></i></button>
</td>
<td>@Model.LeftWorkTemp.LastDayStanding</td>
<td>@Model.LeftWorkTemp.LeftWork</td>
@* <td class="permision">
<a onclick="deleteDate(this, '', 0, 'last')" href="#" class="edit-date permission-removeDatesecond-edit"><i style="color: red;" class="ion-close-circled"></i></a>
<a href="#" class="edit-icon permission-editDate"><i class="fa fa-edit"></i></a>
</td> *@
<td></td>
</tr>
@foreach (var item in Model.PreviousLeftWorks)
{
<tr data-id="@(i++)">
<td>@(i)</td>
<td>@item.StartWork</td>
<td class="permision">
@* <a onclick="deleteDate(this, '', 0, 'first')" href="#" class="edit-date permission-removeDatefirst-edit"><i style="color: red;" class="ion-close-circled"></i></a> *@
@* <button class="edit-icon permission-editDate"><i class="fa fa-edit"></i></button> *@
</td>
<td>@item.LastDayStanding</td>
<td>@item.LeftWork</td>
@* <td class="permision">
<a onclick="deleteDate(this, '', 0, 'last')" href="#" class="edit-date permission-removeDatesecond-edit"><i style="color: red;" class="ion-close-circled"></i></a>
<a href="#" class="edit-icon permission-editDate"><i class="fa fa-edit"></i></a>
</td> *@
<td></td>
</tr>
}
</tbody>
</table>
</div>
@* <div class="permision-info permission-options options-box">
<div class="options-info"> در صورت تمایل به محاسبه ی عناوین ذیل در فیش حقوقی، گزینه های موردنظر را فعال نمایید </div>
<div class="optional-wages d-flex">
<div class="d-flex options-check col-lg-4 col-md-4 col-sm-3 col-xs-4">
<div class="checkbox-wrapper-2">
<label class="toggleButton">
<input type="checkbox" checked="checked" class="activated addyearspay">
<div>
<svg viewBox="0 0 44 44">
<path d="M14,24 L21,31 L39.7428882,11.5937758 C35.2809627,6.53125861 30.0333333,4 24,4 C12.95,4 4,12.95 4,24 C4,35.05 12.95,44 24,44 C35.05,44 44,35.05 44,24 C44,19.3 42.5809627,15.1645919 39.7428882,11.5937758" transform="translate(-2.000000, -2.000000)"></path>
</svg>
</div>
</label>
</div>
<span class="options-type">سنوات </span>
</div>
<div class="d-flex options-check col-lg-4 col-md-4 col-sm-3 col-xs-4">
<div class="checkbox-wrapper-2">
<label class="toggleButton">
<input type="checkbox" checked="checked" class="activated addbonusespay">
<div>
<svg viewBox="0 0 44 44">
<path d="M14,24 L21,31 L39.7428882,11.5937758 C35.2809627,6.53125861 30.0333333,4 24,4 C12.95,4 4,12.95 4,24 C4,35.05 12.95,44 24,44 C35.05,44 44,35.05 44,24 C44,19.3 42.5809627,15.1645919 39.7428882,11.5937758" transform="translate(-2.000000, -2.000000)"></path>
</svg>
</div>
</label>
</div>
<span class="options-type"> عیدی و پاداش </span>
</div>
<div class="d-flex options-check col-lg-4 col-md-4 col-sm-3 col-xs-4">
<div class="checkbox-wrapper-2">
<label class="toggleButton">
<input type="checkbox" checked="checked" class="activated addleavepay">
<div>
<svg viewBox="0 0 44 44">
<path d="M14,24 L21,31 L39.7428882,11.5937758 C35.2809627,6.53125861 30.0333333,4 24,4 C12.95,4 4,12.95 4,24 C4,35.05 12.95,44 24,44 C35.05,44 44,35.05 44,24 C44,19.3 42.5809627,15.1645919 39.7428882,11.5937758" transform="translate(-2.000000, -2.000000)"></path>
</svg>
</div>
</label>
</div>
<span class="options-type">مزد و مرخصی </span>
</div>
</div>
</div> *@
</div>
</div>
</div>
</div>
<div class="last-div">
<div class="d-flex in-history">
<div class="col-md-4 col-4 col-sm-4 last-titles">سابقه بیمه در کارگاه</div>
<div class="col-md-8 col-8 col-sm-8 d-flex" style="direction: ltr">
<div class="date-sums">312</div>
<div class="dates blue">1323</div>
<div class="dates blue">1323</div>
<div class="dates blue">2131</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
<div class="modal-footer d-block">
<div class="container m-auto">
<div class="row">
<div class="col-6 text-end">
@* Old Close Modal *@
@* <button class="btn btn-modal" data-dismiss="modal" style="background-color: white;color: #323030;">بستن</button> *@
<button type="button" class="btn-cancel2 justify-content-center" data-bs-dismiss="modal" aria-label="Close">انصراف</button>
</div>
<div class="col-6 text-start">
@* Old Save Modal *@
@* <a href="#" id="btnSaveData" class="btn btn-modal" style="background-color: #0f9500; color: white;">ذخیره</a> *@
<button type="button" class="btnCreateNew position-relative" id="btnSaveData">
ثبت نهایی
<div class="spinner-loading loading" style="display: none">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
</div>
</div>
</form>
@* <script src="~/DadmehrSelect/dadmehr-select-leftWork.js?v=1.2"></script> *@
<script>
var jobsLoadEmployeeAjaxUrl = `@Url.Page("/Company/WorkFlow/EmployeesNew", "JobSearch")`;
var saveDataStartWorkAjaxUrl = `@Url.Page("/Company/WorkFlow/EmployeesNew", "SaveStartWork")`;
var selectJobId = Number(@Model.JobId);
var selectJobName = `@Html.Raw(Model.JobName)`;
var workshopId = Number(@Model.WorkshopId);
var employeeId = Number(@Model.EmployeeId);
</script>
<script src="~/assetsadminnew/workflow/js/_ModalEmployeeNew/StartWork.js?ver=@adminVersion"></script>

View File

@@ -87,11 +87,11 @@ namespace ServiceHost.Areas.AdminNew.Pages
});
}
public IActionResult OnGetLayoutCountWorkFlow()
public async Task<IActionResult> OnGetLayoutCountWorkFlow()
{
var currentAccountId = _authHelper.CurrentAccountId();
var accountWorkshops = _workshopAccountRepository.GetList(currentAccountId).Select(x => x.WorkshopId).ToList();
int workFlowCount = _adminWorkFlowApplication.GetWorkFlowCountsForAdmin(accountWorkshops).EmployeeDocumentsAwaitingSubmit;
int workFlowCount = await _adminWorkFlowApplication.GetWorkFlowCountsForAdmin(accountWorkshops,currentAccountId);
return new JsonResult(new
{
@@ -100,9 +100,9 @@ namespace ServiceHost.Areas.AdminNew.Pages
});
}
public IActionResult OnGetLayoutCountChecker()
public async Task<IActionResult> OnGetLayoutCountChecker()
{
int checkerCount = _adminWorkFlowApplication.GetWorkFlowCountForChecker();
int checkerCount = await _adminWorkFlowApplication.GetWorkFlowCountForChecker();
return new JsonResult(new
{

View File

@@ -0,0 +1,286 @@
@model CompanyManagment.App.Contracts.Employee.CreateEmployeeByClient
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
<link href="~/AssetsClient/css/select2.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AdminTheme/assets/sweet-alert/sweet-alert.min.css" rel="stylesheet">
// <link href="~/AdminTheme/assets/sweet-alert/sweet-alert.min.css" rel="stylesheet">
<link href="~/assetsclient/pages/employees/css/createemployeemodal.css?ver=@clientVersion" rel="stylesheet" />
var rollCallPath = Context.Request.Path.Value;
<style>
@@media (max-width: 992px) {
.desktopNotif {
display: none !important;
}
.mobileNotif {
display: flex !important;
}
}
.clearfix {
padding-top: 0;
}
.no-select {
user-select: none;
}
</style>
}
<div>
<div class="position-relative" id="mobileDisplay">
<div class="modal-header d-block text-center">
<button type="button" class="btn-close position-absolute text-start" data-bs-dismiss="modal" aria-label="Close"></button>
<div class="lableCheckBreakTime">
<div class="title">افزودن پرسنل</div>
</div>
<div class="d-flex gap-2 align-items-center overflow-auto navbarBtn" style="margin: 15px 0 0 0;">
<div>
<button class="stepStatus active" id="step-1">احراز هویت</button>
</div>
<div>
<button class="stepStatus" id="step-2">مشخصات پرسنل</button>
</div>
<div>
<button class="stepStatus @(Model.HasRollCallService ? "" : "disable")" id="step-3">گروه‌بندی حضور و غیاب</button>
</div>
<div>
<button class="stepStatus @(Model.HasRollCallService ? "" : "disable")" id="step-4">آپلود عکس حضور و غیاب</button>
</div>
<div class="employeePart">
<button class="stepStatus" id="step-5">حساب بانکی پرسنل</button>
</div>
<div class="employeePart">
<button class="stepStatus" id="step-6">آپلود مدارک</button>
</div>
</div>
</div>
</div>
<div class="modal-body clearfix no-select">
<form role="form" method="post" name="create-form" id="create-form" autocomplete="off">
<div id="multiStepModal">
<div id="step1" class="step">
<div class="container m-0 d-flex align-items-center justify-content-center" id="step-form1">
<div class="row">
<div class="col-12">
<div>
<partial name="Company/Employees/_Partials/IdentityInformationForm" model="@Model" />
</div>
</div>
</div>
</div>
<div class="stepBtnHolder2">
<div class="d-flex gap-2 justify-content-center stepBtnFirst">
<button type="button" class="stepBtn disable" id="prevStep1">مرحله قبل</button>
<button type="button" class="stepBtn checkNationalCodeAndBirthDate position-relative" id="nextStep1">
<span>مرحله بعد</span>
<div class="spinner-loading loading" id="IdentityLoading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
<div class="w-100 d-flex gap-2 mt-2 justify-content-center">
<button type="button" class="stepBtn cancelButton">انصراف</button>
<button type="button" class="stepBtn disable">
<span>ذخیره</span>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
<div id="step2" class="step">
<div class="container m-0" id="step-form2">
<div class="row">
<div class="col-12">
<div>
<partial name="Company/Employees/_Partials/CreateEmployeeForm" model="@Model"/>
</div>
</div>
</div>
</div>
<div class="stepBtnHolder2">
<div class="d-flex gap-2 justify-content-center stepBtnFirst">
<button type="button" class="stepBtn disable" id="prevStep2">مرحله قبل</button>
<button type="button" class="stepBtn" id="nextStep2">مرحله بعد</button>
</div>
<div class="w-100 d-flex gap-2 mt-2 justify-content-center">
<button type="button" class="stepBtn cancelButton">انصراف</button>
<button type="button" class="stepBtn disable SaveFullData" id="submitStep2">
<span>ذخیره</span>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
<div id="step3" class="step w-100 overflow-y-auto">
<div class="container p-0 m-0 @(Model.HasRollCallService ? "" : "disable")" id="step-form3">
<div class="row">
<div class="col-12">
<div id="workshopEmployeeSetting">
<partial name="Company/Employees/_Partials/WorkshopSettingGrouping" model="@Model"/>
</div>
</div>
</div>
</div>
<div class="stepBtnHolder2">
<div class="stepBtnFirst d-flex gap-2 justify-content-center">
<button type="button" class="stepBtn" id="prevStep3">مرحله قبل</button>
<button type="button" class="stepBtn" id="nextStep3">مرحله بعد</button>
</div>
<div class="w-100 d-flex gap-2 mt-2 justify-content-center">
<button type="button" class="stepBtn cancelButton">انصراف</button>
<button type="button" class="stepBtn saveData SaveFullData" id="saveFullData3">
<span>ذخیره</span>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
<div id="step4" class="step m-auto">
<div class="container p-0 m-0 @(Model.HasRollCallService ? "" : "disable")" id="step-form4">
<partial name="Company/Employees/_Partials/ModalUploadImagePersonnel" model="@Model"/>
</div>
<div class="stepBtnHolder3">
<div class="stepBtnFirst d-flex gap-2 justify-content-center">
<button type="button" class="stepBtn" id="prevStep4">مرحله قبل</button>
<button type="button" class="stepBtn" id="nextStep4">مرحله بعد</button>
</div>
<div class="w-100 d-flex gap-2 mt-2 justify-content-center">
<button type="button" class="stepBtn cancelButton">انصراف</button>
<button id="save4" type="button" class="stepBtn saveData SaveFullData">
<span>ذخیره</span>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
@if (rollCallPath != "/Client/Company/RollCall/EmployeeUploadPicture")
{
<div id="step5" class="step w-100 overflow-y-auto">
<div class="container p-0 m-0" id="step-form5">
<div class="row">
<div class="col-12">
<div id="createBank">
<partial name="Company/Employees/_Partials/CreateBankInfoModal" model="@Model"/>
</div>
</div>
</div>
</div>
<div class="stepBtnHolder2">
<div class="stepBtnFirst d-flex gap-2 justify-content-center">
<button type="button" class="stepBtn" id="prevStep5">مرحله قبل</button>
<button type="button" class="stepBtn" id="nextStep5">مرحله بعد</button>
</div>
<div class="w-100 d-flex gap-2 mt-2 justify-content-center">
<button type="button" class="stepBtn cancelButton">انصراف</button>
<button type="button" class="stepBtn saveData SaveFullData">
<span>ذخیره</span>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
<div id="step6" class="step w-100 overflow-y-auto">
<div class="container p-0 m-0" id="step-form6">
<div class="row">
<div class="col-12">
<div id="uploadDocument">
<partial name="Company/Employees/_Partials/ModalUploadDocument" model="@Model"/>
</div>
</div>
</div>
</div>
<div class="stepBtnHolder2">
<div class="stepBtnFirst d-flex gap-2 justify-content-center">
<button type="button" class="stepBtn" id="prevStep6">مرحله قبل</button>
<button type="button" class="stepBtn disable" id="nextStep6">مرحله بعد</button>
</div>
<div class="w-100 d-flex gap-2 mt-2 justify-content-center">
<button type="button" class="stepBtn cancelButton">انصراف</button>
<button type="button" class="stepBtn saveData SaveFullData">
<span>ذخیره</span>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
}
</div>
</form>
</div>
</div>
@* Camera Modal *@
<div class="md-modal md-effect-12">
<div class="md-content" style="width: 100%;">
<div class="panel panel-default">
<div class="panel-body" style="width: 360px;height: 360px;text-align: center;margin: auto;">
@*<div id="my_camera" style="margin: auto; display: none;"></div>*@
@* <div id="video" style="margin: auto;"></div> *@
@* <div id="video" style="margin: auto; width: 100%; height: 100%;"></div> *@
<div style="display: block; position: relative; width: 360px; height: 360px;">
@*<div id="video" style="position: absolute; top: 0px; right: 0; margin: auto; width: 100%; height: 100%;"></div>*@
<video id="videoElement" autoplay></video>
<img src="~/AssetsClient/images/face.png" style="position: absolute; top: 0; right: 0; width: 360px; transform: scale(1.006); border-radius: 10px;" />
</div>
<div style="margin: 10px 0 0 0; text-align: center;">
<input type="button" class="btn btn-success take_snapshot1" style="display: none;" value="گرفتن عکس اول" onclick="take_snapshot1()" />
<input type="button" class="btn btn-success take_snapshot2" style="display: none;" value="گرفتن عکس دوم" onclick="take_snapshot2()" />
</div>
</div>
</div>
<button class="camera_close">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="35" height="35">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</button>
</div>
</div>
<div class="md-overlay"></div>
@* <script src="~/assetsadminnew/libs/sweetalert2/sweetalert2.all.min.js"></script> *@
<script src="~/AdminTheme/assets/sweet-alert/sweet-alert.min.js"></script>
<script src="~/assetsadminnew/libs/sweetalert2/sweetalert2.all.min.js"></script>
<script src="~/assetsclient/libs/cleave/cleave.min.js"></script>
<script src="~/assetsclient/js/site.js?ver=@clientVersion"></script>
<script src="~/assetsclient/js/jquery-mask-v1.13.4.js"></script>
<script>
var antiForgeryToken = $('@Html.AntiForgeryToken()').val();
var saveEmployeeURL = `@Url.Page("/Company/Employees/EmployeeList", "CreateEmployee")`;
var saveUrlRollCall = `@Url.Page("/Company/RollCall/EmployeeUploadPicture", "CreateEmployee")`;
// list of roll call group
var workshopSettingListAjax = `@Url.Page("/Company/Employees/EmployeeList", "WorkshopSettingList")`;
var workshopSettingListAjaxRollCall = `@Url.Page("/Company/RollCall/EmployeeUploadPicture", "WorkshopSettingList")`;
// @* var workshopSettingEmployeeSelecting = @Html.Raw(Json.Serialize(Model.EmployeeSettings)); *@
</script>
<script src="~/assetsclient/pages/employees/js/createemployeemodal.js?ver=@clientVersion"></script>

View File

@@ -1,324 +1,389 @@
@model List<CompanyManagment.App.Contracts.Employee.EmployeeViewModel>
@page
@model ServiceHost.Areas.Client.Pages.Company.Employees.EmployeeListModel
@{
Layout = "Shared/_ClientLayout";
ViewData["title"] = " - لیست کل پرسنل";
string clintVersion = _0_Framework.Application.Version.StyleVersion;
}
<table id="datatable" class="main-dataTable table table-striped table-bordered">
<thead>
<tr>
<th class="num-th">#</th>
<th class="hidden-xs pnum-th">شماره پرسنلی</th>
<th class="name-th">نام و نام خانوادگی</th>
@*<th class="Lname-th"> نام خانوادگی</th>*@
<th class="hidden-xs code-th">کد ملی </th>
<th class="hidden-xs insurance-th">شماره بیمه </th>
<th class="op-th">عملیات</th>
</tr>
</thead>
<tbody>
@if (Model != null)
{
int i = 1;
@foreach (var item in Model)
{
<tr>
<td class="text-center num-td">@i </td>
<td class="hidden-xs text-center pnum-td"> @item.PersonnelCode</td>
@* <td class="name-td">
<div class="tooltipfull-container">
<p class="fulltext">
@item.FName
</p>
<span class="tooltipfull">
@item.FName
</span>
</div>
</td>
<td class="Lname-td">
<div class="tooltipfull-container">
<p class="fulltext">
@item.LName
</p>
<span class="tooltipfull">
@item.LName
</span>
</div>
</td>*@
<td class="name-td">
<div class="tooltipfull-container">
<p class="fulltext">
@item.EmployeeFullName
</p>
<span class="tooltipfull">
@item.EmployeeFullName
</span>
</div>
</td>
<td class="hidden-xs text-center code-td">
@item.NationalCode
</td>
<td class="hidden-xs text-center insurance-td">@item.InsuranceCode</td>
@{
i++;
}
<td class="op-td">
<div class="flexible-div">
<div class="col-lg-7 col-md-7 col-sm-12 col-xs-12 more-buttons">
@* <a class="btn pull-left rad left-insurance"
href="#showmodal=@Url.Page("./Index", "CreateLeftWorkInsurance", new { employeeId = item.Id, employeeName = item.EmployeeFullName })">
<p>
شروع / ترک کار بیمه
</p>
</a>
<a class="btn pull-left rad left-contract"
href="#showmodal=@Url.Page("./Index", "LeftWork", new { employeeId = item.Id, employeeName = item.EmployeeFullName })">
<p> شروع / ترک کار قرارداد</p>
</a>*@
<a class="btn pull-left rad employee-operations">عملیات مربوط به پرسنل</a>
<div class="buttons-container">
<a class="btn pull-left rad left-insurance"
href="#showmodal=@Url.Page("./Index", "CreateLeftWorkInsurance", new { employeeId = item.Id, employeeName = item.EmployeeFullName })">
<i class="fa faSize fa-sign-out"></i>
<p>
شروع / ترک کار بیمه
</p>
</a>
<a class="btn pull-left rad left-contract"
href="#showmodal=@Url.Page("./Index", "LeftWork", new { employeeId = item.Id, employeeName = item.EmployeeFullName })">
<i class="fa faSize fa-sign-out"></i>
<p> شروع / ترک کار قرارداد</p>
</a>
<a class="btn pull-left rad left-contract" style="background-color: #e58d42;"
href="#showmodal=@Url.Page("./Index", "CreateSickLeave", new { employeeId = item.Id})">
<i class="ion-medkit ionSize"></i>
<p> مرخصی استعلاجی</p>
</a>
<a class="btn pull-left rad left-contract" style="background: #cbbc0e;"
href="#showmodal=@Url.Page("./Index", "CreatePaidLeave", new { employeeId = item.Id })">
<i class="ion-briefcase ionSize"></i>
<p> مرخصی استحقاقی</p>
</a>
</div>
</div>
<div class="col-lg-5 col-md-5 col-sm-12 col-xs-12 operationBtns">
<a class="btn btn-table btn-info pull-left rad tooltipfull-container"
href="#showmodal=@Url.Page("./Index", "Details", new { Id = item.Id })">
<p>
<i class="fa faSize fa-info-circle"></i>
</p>
<span class="tooltipfullBtns">
جزئیات
</span>
</a>
<a class="btn btn-table btn-warning pull-left rad tooltipfull-container" href="#showmodal=@Url.Page("./Index", "Edit", new {Id = item.Id})">
<p>
<i class="fa faSize fa-edit"></i>
</p>
<span class="tooltipfullBtns">
ویرایش اطلاعات
</span>
</a>
<a href="#" class="btn btn-danger pull-right btn-table delete tooltipfull-container" onclick="removeEmployee(@item.Id)">
<p>
<i class="fa fa-trash"></i>
</p>
<span class="tooltipfullBtns">
حذف اطلاعات
</span>
</a>
</div>
@section Styles {
<link href="~/AssetsClient/css/table-style.css?ver=@clintVersion" rel="stylesheet"/>
<link href="~/AssetsClient/css/table-responsive.css?ver=@clintVersion" rel="stylesheet"/>
<link href="~/assetsclient/css/operation-button.css?ver=@clintVersion" rel="stylesheet"/>
<link href="~/AssetsClient/css/filter-search.css?ver=@clintVersion" rel="stylesheet"/>
<link href="~/AssetsClient/css/card.css?ver=@clintVersion" rel="stylesheet"/>
<link href="~/AdminTheme/assets/sweet-alert/sweet-alert.min.css" rel="stylesheet">
<style>
.btn-create {
background-color: #84CC16;
border-radius: 7px;
padding: 3px 12px;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 24px;
}
.btn-create span {
color: white;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 24px;
}
.btn-leftwork {
background-color: #E3EAF2;
width: 30px;
height: 30px;
color: rgb(30, 41, 59);
border-width: 1px;
border-style: solid;
border-color: transparent;
border-image: initial;
border-radius: 5px;
padding: 3px 1px;
margin: auto 0px auto 1px;
transition: 0.2s;
}
@* <a class="btn btn-table btn-warning pull-left rad tooltipfull-container" onclick="editEmployee(@item.Id)">
<p>
<i class="fa faSize fa-edit"></i>
</p>
<span class="tooltipfullBtns">
ویرایش اطلاعات
</span>
</a> *@
.btn-leftwork:hover {
background-color: #c3cedb;
}
.widthleftWorking {
width: 81.5% !important;
/* width: 57% !important; */
}
@*<a href="#" class="btn btn-danger pull-right btn-table delete tooltipfull-container" onclick="deActiveWorkshop(@item.Id)">
<p>
<i class="fa fa-trash"></i>
</p>
<span class="tooltipfullBtns">
حذف اطلاعات
</span>
</a>
@if (item.IsActiveString == "true")
{
<a permission="20116" id="googleLink" asp-page="./Index" asp-page-handler="DeActive" asp-route-id="@item.Id" class="tooltipfull-container btn btn-table btn-danger pull-left fff rad deactivation-@item.Id" style="display: none;">
<p>
<i class="fa faSize fa-trash"></i>
</p>
<span class="tooltipfullBtns">
حذف اطلاعات
</span>
</a>
}
else
{
<a permission="20116" asp-page="./Index" asp-page-handler="IsActive" asp-route-id="@item.Id" class="btn btn-success pull-left rad tooltipfull-container">
<i class="fa faSize fa-rotate-left"></i>
</a>
}*@
</div>
</td>
</tr>
}
}
else
{
<tr><td colspan="7">اطلاعاتی جهت نمایش موجود نمی باشد</td></tr>
}
</tbody>
</table>
<script>
$(document).ready(function() {
$('#datatable').dataTable({
"lengthMenu": [[25, 10, 50, 100, -1], [25, 10, 50, 100, "All"]],
dom: 'rtip',
});
});
$(window).on('resize', function () {
locateButtonContainer();
});
$(document).on("click", function (event) {
var target = $(event.target);
if (!target.closest(".buttons-container").length
&& !target.is(".employee-operations")
&&!target.is("#LeftWorkInsuranceForm")
&&!target.is("#LeftWorkInsuranceForm *")
&&!target.is("#LeftWorkForm")
&&!target.is("#LeftWorkForm *")
&& !target.is("#paidLeave")
&& !target.is("#paidLeave *")
&& !target.is("#sickLeave")
&& !target.is("#sickLeave *")
&& !target.is("#sickLeaveEdit")
&& !target.is("#sickLeaveEdit *")
&&!target.is("#LeftWorkInsuranceForm #close")
&& !target.is("#LeftWorkForm #close")
&& !target.is("#LeftWorkInsuranceForm .close")
&& !target.is("#LeftWorkForm .close")
&& !target.is("#LeftWorkInsuranceForm #btnSaveData")
&& !target.is("#LeftWorkForm #btnSaveData")
) {
$(".buttons-container").removeClass("active").addClass("reverse");
$(".more-buttons").removeClass("active");
setTimeout(function () {
$(".buttons-container").removeClass("reverse").css("display", "none");
}, 200);
.widthAllPending{
width: 81.5% !important;
}
});
$(".employee-operations").on("click", function() {
locateButtonContainer();
var buttonsContainer = $(this).next(".buttons-container");
if (buttonsContainer.hasClass("active")) {
buttonsContainer.removeClass("active").addClass("reverse");
$(this).closest(".more-buttons").removeClass("active");
setTimeout(function() {
buttonsContainer.removeClass("reverse").css("display", "none");
}, 200);
} else {
buttonsContainer.removeClass("reverse").addClass("active").css("display", "flex");
$(this).closest(".more-buttons").addClass("active");
}
$(".buttons-container").not(buttonsContainer).removeClass("active reverse").css("display", "none");
$(".more-buttons").not($(this).closest(".more-buttons")).removeClass("active");
});
function locateButtonContainer() {
var beforePosition = $(".employee-operations").position();
var containerWidth = $('.buttons-container').outerWidth();
var containerHeight = $('.buttons-container').outerHeight();
var containerLeft = beforePosition.left + $(".employee-operations").outerWidth() + 20;
var containerTop = beforePosition.top + ($(".employee-operations").outerHeight() / 2) - (containerHeight / 2);
$('.buttons-container').css({
left: containerLeft,
top: containerTop
});
}
function removeEmployee(id){
swal({
title: "توجه داشته باشید با تایید این پیام، اطلاعات لیست مورد نظر بطور کامل از بانک اطلاعاتی حذف خواهد شد.",
text: "",
type: "warning",
showCancelButton: true,
confirmButtonColor: "#DD6B55",
confirmButtonText: "بله",
cancelButtonText: "خیر",
closeOnConfirm: true,
closeOnCancel: true
}, function (isConfirm) {
if (isConfirm) {
$.ajax({
dataType: 'json',
type: 'POST',
url: '@Url.Page("./Index", "RemoveEmployee")',
headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() },
data: { "id" : id },
success: function (response) {
$.Notification.autoHideNotify('success', 'top center', 'پیام سیستم ', response.message);
getEmployeeList();
},
failure: function (response) {
console.log(5, response)
$.Notification.autoHideNotify('error', 'top center', 'پیام سیستم ', response.message);
.leftWorkSectionDiv {
background-color: #FEEBE8 !important;
border: 1px solid #EA7108 !important;
}
.Rtable .Rtable-row.leftWorkSectionDiv .Rtable-cell .Rtable-cell--content > span {
background: #FD948A;
}
.pendingPersonnel {
background-color: #FEFCE8 !important;
border: 1px solid #EAB308 !important;
}
.pendingStatus {
color: #854D0E !important;
font-weight: 700 !important;
}
@@media(max-width: 1400px) {
.widthAllPending{
width: 69% !important;
}
});
}
});
}
function editEmployee(id){
$("#divDisplay").slideUp(500);
var elementId = "divEdit";
// var $editForms = $(".divEdit");
var $chosenEditForm = $('#' + elementId);
$chosenEditForm.html('');
// $editForms.not($chosenEditForm).slideUp(500);
// $editForms.not($chosenEditForm).hide(500);
function scrollDown() {
const divOffset = $chosenEditForm.offset().top;
window.scrollTo({
top: divOffset - 50,
behavior: 'smooth',
});
.widthleftWorking {
width: 69% !important;
/* width: 34% !important; */
}
}
setTimeout(function () {
scrollDown.call(this);
}.bind(this), 500);
$.ajax({
url: '@Url.Page("/Company/Employees/Index", "Edit")',
data:{"id":id},
type: "Get",
dataType: 'html',
success: function(data) {
//console.log(data);
$chosenEditForm.html(data);
($chosenEditForm).slideDown(500);
// $('#'+elementId).slideDown(400);
}
});
//function openOperationBox(){
// if ($(".buttons-container").hasClass("active")) {
// $(".buttons-container").removeClass("active");
// }
// else{
// $(".buttons-container").addClass("active");
// $(".buttons-container").removeClass("disactive");
// }
//}
@@media(max-width: 992px) {
.widthAllPending{
width: 68% !important;
}
.widthleftWorking {
width: 68% !important;
/* width: 34% !important; */
}
}
@@media(max-width: 768px) {
.widthAllPending{
width: 40% !important;
}
.widthleftWorking {
width: 40% !important;
}
}
.titleEmployeeList {
font-size: 16px;
font-weight: 600;
}
</style>
}
</script>
<div class="content-container">
<div class="container-fluid">
<div class="row p-2">
<div class="col p-0 m-0 d-flex align-items-center justify-content-between">
<div class="col d-flex align-items-center justify-content-start">
<img src="~/AssetsClient/images/icons/list-info-personnel.png" alt="" class="img-fluid me-2" style="width: 45px;" />
<div>
<h4 class="titleEmployeeList d-flex align-items-center">لیست کل پرسنل</h4>
<div>@Model.WorkshopFullName</div>
</div>
</div>
<div>
<a asp-page="/Company/Employees/Index" class="back-btn" type="button">
<span>بازگشت</span>
</a>
</div>
</div>
</div>
</div>
<input type="hidden" name="id" value="@Model.WorkshopId" />
<div class="container-fluid d-none d-md-block">
<div class="row px-2">
<div class="search-box card">
<div class="row">
<div class="col-12">
<div class="d-grid search-personal-section gap-2">
<div class="d-grid grid-cols-2 gap-2 col-span-4">
<div><input type="text" name="EmployeeFullName" id="EmployeeFullNamePersonal" class="form-control" placeholder="نام پرسنل"></div>
<div><input type="text" name="NationalCode" id="NationalCode" class="form-control" placeholder="کد ملی پرسنل"></div>
</div>
<div class="d-flex gap-2 col-span-2">
<button class="btn-search btn-w-size text-nowrap d-flex align-items-center justify-content-center" id="searchBtn" type="submit">
<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>
<a href="/Client/Company/Employees/EmployeeList" class="btn-clear-filter btn-w-size text-nowrap d-flex align-items-center justify-content-center disable" id="filterRemove">
<span>حذف جستجو</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<!-- Advance Search Box -->
<div class="d-block d-md-none mb-1">
<div class="row d-flex align-items-center justify-content-between">
<div class="search-box bg-white p-2">
<div class="d-flex justify-content-between text-center">
<button class="btn-search w-100" 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 class="row justify-content-between g-1 mt-1">
<div class="col-6">
<button class="btn-create w-100" onclick="openCreateEmployeeModal()">
<span>ایجاد پرسنل</span>
</button>
</div>
<div class="col-6">
<button class="btn-create w-100" onclick="openCreateLeftWorkEmployeeModal()">
<span>افزودن ترک کار گروهی</span>
</button>
</div>
<div class="col-6">
<button type="button" onclick="printAllPersonnelList()" class="btn-view-all text-nowrap align-items-center w-100">
<span>پرینت تجمیعی پرسنل</span>
</button>
</div>
<div class="col-6">
<button type="button" onclick="printAllPersonnelInfoMobile(@Model.WorkshopId)" class="btn-view-all text-nowrap align-items-center w-100">
<span>پرینت گروهی تفکیکی پرسنل</span>
</button>
</div>
</div>
</div>
</div>
</div>
<!-- End Advance Search Box -->
<div class="row p-lg-2">
<div class="card personalListModal p-2">
<div class="personal-info-list">
<div class="container-fluid d-none d-md-block" style="padding: 0px 6px">
<div class="row d-none d-md-flex align-items-center my-1 px-0">
<div class="col-4 pe-0">
<button type="button" class="btn-create text-nowrap" onclick="openCreateEmployeeModal()">
<svg width="20" height="20" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="11" cy="11" r="8.25" stroke-width="1.5" stroke="white" />
<path d="M11 13.75L11 8.25" stroke-width="1.5" stroke="white" stroke-linecap="round" />
<path d="M13.75 11L8.25 11" stroke-width="1.5" stroke="white" stroke-linecap="round" />
</svg>
<span>ایجاد پرسنل</span>
</button>
<button type="button" class="btn-create text-nowrap" onclick="openCreateLeftWorkEmployeeModal()">
<svg width="20" height="20" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="11" cy="11" r="8.25" stroke-width="1.5" stroke="white" />
<path d="M11 13.75L11 8.25" stroke-width="1.5" stroke="white" stroke-linecap="round" />
<path d="M13.75 11L8.25 11" stroke-width="1.5" stroke="white" stroke-linecap="round" />
</svg>
<span>افزودن ترک کار گروهی</span>
</button>
</div>
<div class="col-4 p-0 text-center">
<p class="m-0">لیست پرسنل</p>
</div>
<div class="col-4 text-end">
<div class="d-flex align-items-center justify-content-end gap-2">
<button onclick="printAllPersonnelList()" class="btn-print-all text-nowrap" type="button">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M15.0001 11.2493H15.139C16.0279 11.2493 16.4723 11.2493 16.759 10.9866C16.7805 10.967 16.801 10.9464 16.8207 10.9249C17.0834 10.6382 17.0834 10.1938 17.0834 9.3049V9.3049C17.0834 7.52714 17.0834 6.63826 16.558 6.06484C16.5187 6.02194 16.4775 5.98077 16.4346 5.94146C15.8612 5.41602 14.9723 5.41602 13.1945 5.41602H6.91675C5.03113 5.41602 4.08832 5.41602 3.50253 6.0018C2.91675 6.58759 2.91675 7.5304 2.91675 9.41602V10.2493C2.91675 10.7208 2.91675 10.9565 3.06319 11.1029C3.20964 11.2493 3.44534 11.2493 3.91675 11.2493H5.00008" stroke="#1E293B"/>
<path d="M5.41675 16.3903L5.41675 9.91732C5.41675 8.97451 5.41675 8.5031 5.70964 8.21021C6.00253 7.91732 6.47394 7.91732 7.41675 7.91732L12.5834 7.91732C13.5262 7.91732 13.9976 7.91732 14.2905 8.21021C14.5834 8.5031 14.5834 8.97451 14.5834 9.91732L14.5834 16.3903C14.5834 16.7068 14.5834 16.8651 14.4796 16.9399C14.3758 17.0148 14.2256 16.9647 13.9253 16.8646L12.2572 16.3086C12.1712 16.2799 12.1282 16.2656 12.0839 16.2669C12.0396 16.2682 11.9975 16.285 11.9134 16.3187L10.1858 17.0097C10.0941 17.0464 10.0482 17.0647 10.0001 17.0647C9.95194 17.0647 9.90609 17.0464 9.81439 17.0097L8.0868 16.3187C8.00267 16.285 7.9606 16.2682 7.91627 16.2669C7.87194 16.2656 7.82896 16.2799 7.74299 16.3086L6.07486 16.8646C5.77455 16.9647 5.62439 17.0148 5.52057 16.9399C5.41675 16.8651 5.41675 16.7068 5.41675 16.3903Z" stroke="#1E293B"/>
<path d="M7.91675 11.25L11.2501 11.25" stroke="#1E293B" stroke-linecap="round"/>
<path d="M7.91675 13.75L12.0834 13.75" stroke="#1E293B" stroke-linecap="round"/>
<path d="M14.5834 5.41732V5.41732C14.5834 3.97799 14.5834 3.25833 14.1954 2.76756C14.1087 2.65791 14.0095 2.55874 13.8998 2.47204C13.4091 2.08398 12.6894 2.08398 11.2501 2.08398H8.75008C7.31076 2.08398 6.5911 2.08398 6.10032 2.47204C5.99068 2.55874 5.8915 2.65791 5.8048 2.76756C5.41675 3.25833 5.41675 3.97799 5.41675 5.41732V5.41732" stroke="#1E293B"/>
</svg>
<span>پرینت تجمیعی پرسنل</span>
</button>
<button onclick="printAllPersonnelInfo(@Model.WorkshopId)" class="btn-print-all text-nowrap" type="button" data-title="پرینت گروهی" data-intro="شما برای گرفتن پرینت گروهی ابتدا باید ردیف را انتخاب کنید و سپس دکمه پرینت گروهی بزنید.">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M15.0001 11.2493H15.139C16.0279 11.2493 16.4723 11.2493 16.759 10.9866C16.7805 10.967 16.801 10.9464 16.8207 10.9249C17.0834 10.6382 17.0834 10.1938 17.0834 9.3049V9.3049C17.0834 7.52714 17.0834 6.63826 16.558 6.06484C16.5187 6.02194 16.4775 5.98077 16.4346 5.94146C15.8612 5.41602 14.9723 5.41602 13.1945 5.41602H6.91675C5.03113 5.41602 4.08832 5.41602 3.50253 6.0018C2.91675 6.58759 2.91675 7.5304 2.91675 9.41602V10.2493C2.91675 10.7208 2.91675 10.9565 3.06319 11.1029C3.20964 11.2493 3.44534 11.2493 3.91675 11.2493H5.00008" stroke="#1E293B"/>
<path d="M5.41675 16.3903L5.41675 9.91732C5.41675 8.97451 5.41675 8.5031 5.70964 8.21021C6.00253 7.91732 6.47394 7.91732 7.41675 7.91732L12.5834 7.91732C13.5262 7.91732 13.9976 7.91732 14.2905 8.21021C14.5834 8.5031 14.5834 8.97451 14.5834 9.91732L14.5834 16.3903C14.5834 16.7068 14.5834 16.8651 14.4796 16.9399C14.3758 17.0148 14.2256 16.9647 13.9253 16.8646L12.2572 16.3086C12.1712 16.2799 12.1282 16.2656 12.0839 16.2669C12.0396 16.2682 11.9975 16.285 11.9134 16.3187L10.1858 17.0097C10.0941 17.0464 10.0482 17.0647 10.0001 17.0647C9.95194 17.0647 9.90609 17.0464 9.81439 17.0097L8.0868 16.3187C8.00267 16.285 7.9606 16.2682 7.91627 16.2669C7.87194 16.2656 7.82896 16.2799 7.74299 16.3086L6.07486 16.8646C5.77455 16.9647 5.62439 17.0148 5.52057 16.9399C5.41675 16.8651 5.41675 16.7068 5.41675 16.3903Z" stroke="#1E293B"/>
<path d="M7.91675 11.25L11.2501 11.25" stroke="#1E293B" stroke-linecap="round"/>
<path d="M7.91675 13.75L12.0834 13.75" stroke="#1E293B" stroke-linecap="round"/>
<path d="M14.5834 5.41732V5.41732C14.5834 3.97799 14.5834 3.25833 14.1954 2.76756C14.1087 2.65791 14.0095 2.55874 13.8998 2.47204C13.4091 2.08398 12.6894 2.08398 11.2501 2.08398H8.75008C7.31076 2.08398 6.5911 2.08398 6.10032 2.47204C5.99068 2.55874 5.8915 2.65791 5.8048 2.76756C5.41675 3.25833 5.41675 3.97799 5.41675 5.41732V5.41732" stroke="#1E293B"/>
</svg>
<span>پرینت گروهی تفکیکی پرسنل</span>
</button>
</div>
</div>
</div>
</div>
<div class="Rtable Rtable--5cols Rtable--collapse">
<div class="Rtable-row Rtable-row--head align-items-center sticky-div">
<div class="Rtable-cell column-heading width1">ردیف</div>
<div class="Rtable-cell column-heading width2">نام پرسنل</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width3">شماره پرسنلی</div>
<div class="Rtable-cell column-heading d-md-block d-none width4">وضعیت تاهل</div>
<div class="Rtable-cell column-heading d-md-block d-none width5">شماره ملی</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width6">شماره شناسنامه</div>
<div class="Rtable-cell column-heading d-md-block d-none width7">تاریخ تولد</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width8">نام پدر</div>
<div class="Rtable-cell column-heading d-md-block d-none width9">تعداد فرزند</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width12">آخرین تاریخ شروع بکار قرارداد</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width13">تاریخ ترک کار قرارداد</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width14">آخرین تاریخ شروع بکار بیمه</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width15">تاریخ ترک کار بیمه</div>
<div class="Rtable-cell column-heading width10 d-block">دارای قرارداد</div>
<div class="Rtable-cell column-heading width11 d-block">دارای بیمه</div>
<div class="Rtable-cell column-heading width16"></div>
</div>
<div class="w-100" id="loadEmployeesAjax">
</div>
</div>
</div>
</div>
</div>
</div>
</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">
<input type="hidden" name="id" value="@Model.WorkshopId" />
<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="col-12 text-start mb-4">
<div><input type="text" id="EmployeeFullNameMobile" class="form-control" placeholder="نام پرسنل"></div>
<div><input type="text" id="NationalCodeMobile" class="form-control" placeholder="کد ملی پرسنل"></div>
</div>
<div class="col-12">
<a href="/Client/Company/Employees/EmployeeList" class="btn-clear-filter py-2 text-center d-block w-100 mt-2 disable" id="filterRemoveMobile">
<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-mobile w-100">جستجو</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- End Modal From Bottom For Advance Search -->
<div id="MainModal" class="modal fade personalListModal" aria-labelledby="myModalLabel" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-hidden="true" style="display: none;">
<div class="modal-dialog modal-xxl modal-dialog-centered modal-dialog-scrollable">
@* <div class="modal-content" id="ModalContent" style="height: 730px"> *@
<div class="modal-content" id="ModalContent">
</div>
</div>
</div>
<script src="~/AdminTheme/assets/sweet-alert/sweet-alert.min.js"></script>
@section Script {
<script src="~/assetsclient/js/site.js?ver=@clintVersion"></script>
<script>
var antiForgeryToken = $('@Html.AntiForgeryToken()').val();
var employeesAjaxLoadData = `@Url.Page("./EmployeeList", "EmployeeListAjax")`;
</script>
<script src="~/assetsclient/workshop/js/employees.js?ver=@clintVersion"></script>
<script src="~/assetsclient/pages/Employees/js/EmployeeList.js?ver=@clintVersion"></script>
}

View File

@@ -0,0 +1,334 @@
using System.Security.Claims;
using _0_Framework.Application;
using _0_Framework.Infrastructure;
using AccountManagement.Application;
using Company.Domain.EmployeeAgg;
using CompanyManagment.App.Contracts.Bank;
using CompanyManagment.App.Contracts.CustomizeWorkshopSettings;
using CompanyManagment.App.Contracts.Employee;
using CompanyManagment.App.Contracts.EmployeeBankInformation;
using CompanyManagment.App.Contracts.EmployeeDocuments;
using CompanyManagment.App.Contracts.Job;
using CompanyManagment.App.Contracts.LeftWorkTemp;
using CompanyManagment.App.Contracts.PersonnleCode;
using CompanyManagment.App.Contracts.RollCallService;
using CompanyManagment.App.Contracts.Workshop;
using CompanyManagment.Application;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Configuration.UserSecrets;
namespace ServiceHost.Areas.Client.Pages.Company.Employees
{
[Authorize]
[NeedsPermission(SubAccountPermissionHelper.PersonnelListPermissionCode)]
public class EmployeeListModel : PageModel
{
private readonly IPasswordHasher _passwordHasher;
private readonly IWorkshopApplication _workshopApplication;
private readonly IEmployeeApplication _employeeApplication;
private readonly ICustomizeWorkshopSettingsApplication _customizeWorkshopSettingsApplication;
private readonly IPersonnelCodeApplication _personnelCodeApplication;
private readonly IHttpContextAccessor _contextAccessor;
private readonly IBankApplication _bankApplication;
private readonly IEmployeeBankInformationApplication _employeeBankInformationApplication;
private readonly IEmployeeDocumentsApplication _employeeDocumentsApplication;
private readonly IAuthHelper _authHelper;
private readonly IJobApplication _jobApplication;
private readonly ILeftWorkTempApplication _leftWorkTempApplication;
private readonly IRollCallServiceApplication _rollCallServiceApplication;
private readonly long _workshopId;
public PersonnelInfoViewModel Employees;
public bool HasEmployees;
public long WorkshopId;
public string WorkshopFullName;
public EmployeeSearchModel SearchModel;
public EmployeeListModel(IBankApplication bankApplication,IEmployeeBankInformationApplication employeeBankInformationApplication,IEmployeeDocumentsApplication employeeDocumentsApplication,IAuthHelper authHelper,IPasswordHasher passwordHasher, IWorkshopApplication workshopApplication, IEmployeeApplication employeeApplication, IHttpContextAccessor contextAccessor, ICustomizeWorkshopSettingsApplication customizeWorkshopSettingsApplication, IPersonnelCodeApplication personnelCodeApplication, IJobApplication jobApplication, ILeftWorkTempApplication leftWorkTempApplication, IRollCallServiceApplication rollCallServiceApplication)
{
_passwordHasher = passwordHasher;
_workshopApplication = workshopApplication;
_employeeApplication = employeeApplication;
_contextAccessor = contextAccessor;
_customizeWorkshopSettingsApplication = customizeWorkshopSettingsApplication;
_personnelCodeApplication = personnelCodeApplication;
_jobApplication = jobApplication;
_leftWorkTempApplication = leftWorkTempApplication;
_rollCallServiceApplication = rollCallServiceApplication;
_authHelper = authHelper;
_employeeDocumentsApplication = employeeDocumentsApplication;
_employeeBankInformationApplication = employeeBankInformationApplication;
_bankApplication = bankApplication;
var workshopHash = _contextAccessor.HttpContext?.User.FindFirstValue("WorkshopSlug");
_workshopId = _passwordHasher.SlugDecrypt(workshopHash);
if (_workshopId < 1)
throw new InvalidDataException("اختلال در کارگاه");
}
public void OnGet()
{
var workshop = _workshopApplication.GetWorkshopInfo(_workshopId);
WorkshopFullName = workshop.WorkshopFullName;
WorkshopId = workshop.Id;
}
public IActionResult OnGetEmployeeListAjax(EmployeeSearchModel searchModel)
{
var personnelSearchModel = new PersonnelInfoSearchModel()
{
WorkshopId = _workshopId,
};
var result = _workshopApplication.GetPersonnelInfoRemastered(personnelSearchModel);
if (!string.IsNullOrWhiteSpace(searchModel.EmployeeFullName))
result = result.Where(x => x.FullName.Contains(searchModel.EmployeeFullName)).ToList();
if (!string.IsNullOrWhiteSpace(searchModel.NationalCode))
result = result.Where(x => x.NationalCode.Contains(searchModel.NationalCode)).ToList();
var resultData = new PersonnelInfoViewModel()
{
PersonnelInfoViewModels = result.OrderByDescending(x => x.CreatedByClient).ThenByDescending(x => x.LefWorkTemp).ThenBy(x => x.Black ? 1 : 0).ThenBy(x => x.PersonnelCode).ToList(),
};
return new JsonResult(new
{
success = true,
data = resultData,
});
}
public IActionResult OnGetPrintOnePersonnelInfo(long employeeId)
{
var result = _employeeApplication.GetDetails(employeeId);
return Partial("PrintOnePersonnelInfo", result);
}
public IActionResult OnGetEmployeeDataByNationalCode(string nationalCode)
{
var workshopIds = _workshopApplication.GetWorkshopAccount().Select(workshop => workshop.Id).ToList();
var resultData = _employeeApplication.GetEmployeeByNationalCodeIfHasLeftWork(nationalCode, workshopIds);
return new JsonResult(new
{
success = true,
data = resultData,
});
}
public IActionResult OnGetWorkshopSettingList()
{
var resultData = _customizeWorkshopSettingsApplication.GetWorkshopIncludeGroupsByWorkshopId(_workshopId);
if (resultData != null)
{
resultData.GroupSettings = resultData?.GroupSettings.Where(x => !x.MainGroup).ToList();
}
return new JsonResult(new
{
success = true,
data = resultData,
});
}
public IActionResult OnGetCreateEmployee()
{
var command = new CreateEmployeeByClient();
command.PersonnelCode = (_personnelCodeApplication.GetLastPersonnelCodeByWorkshop(_workshopId) + 1).ToString();
command.HasRollCallService = _rollCallServiceApplication.IsExistActiveServiceByWorkshopId(_workshopId);
return Partial("CreateEmployeeModal", command);
}
public IActionResult OnPostCreateEmployee(CreateEmployeeByClient command)
{
command.WorkshopId = _workshopId;
var result = _employeeApplication.CreateEmployeeByClient(command);
return new JsonResult(new
{
success = result.IsSuccedded,
message = result.Message,
});
}
public async Task<IActionResult> OnGetEmployeeDetailsWithNationalCode(string nationalCode,string birthDate)
{
var result = await _employeeApplication.ValidateCreateEmployeeClientByNationalCodeAndWorkshopId(nationalCode, birthDate, _workshopId);
return new JsonResult(result);
}
public IActionResult OnGetJobSearch(string jobName)
{
var jobViewModels = _jobApplication.GetJobListByText(jobName);
return new JsonResult(jobViewModels);
}
//step 4
public IActionResult OnGetDetailsAjax(long employeeId)
{
var resultData = _employeeBankInformationApplication.GetByEmployeeId(_workshopId, employeeId);
return new JsonResult(new
{
success = true,
data = resultData
});
}
//public IActionResult OnPostCreate(CreateEmployeeInformation command)
//{
// command.WorkshopId = _workshopId;
// if (!string.IsNullOrWhiteSpace(command.CardNumber))
// command.CardNumber = command.CardNumber.Replace("-", "");
// if (!string.IsNullOrWhiteSpace(command.ShebaNumber))
// command.ShebaNumber = command.ShebaNumber.Replace("-", "");
// var result = _employeeBankInformationApplication.Create(command);
// return new JsonResult(new
// {
// success = result.IsSuccedded,
// message = result.Message,
// id = result.SendId
// });
//}
//public IActionResult OnPostDelete(long id)
//{
// var result = _employeeBankInformationApplication.Remove(id);
// return new JsonResult(new
// {
// success = result.IsSuccedded,
// message = result.Message,
// });
//}
public IActionResult OnGetBankListAjax()
{
var resultData = _bankApplication.Search("");
return new JsonResult(new
{
success = true,
data = resultData,
});
}
//public IActionResult OnPostGroupCreate(List<CreateEmployeeInformation> command)
//{
// var result = _employeeBankInformationApplication.GroupCreate(_workshopId, command);
// return new JsonResult(new
// {
// success = result.IsSuccedded,
// message = result.Message,
// id = result.SendId
// });
//}
//step 5
public IActionResult OnPostCreateUploadDocument(AddEmployeeDocumentItem command)
{
var workshopHash = User.FindFirstValue("WorkshopSlug");
var workshopId = _passwordHasher.SlugDecrypt(workshopHash);
if (workshopId <= 0)
return new JsonResult(new
{
IsSuccedded = false,
message = "کارگاهی یافت نشد",
});
command.WorkshopId = workshopId;
var result = _employeeDocumentsApplication.AddEmployeeDocumentItemForClient(command);
var employeeDocument = _employeeDocumentsApplication.GetDetailsForClient(command.EmployeeId, workshopId);
return new JsonResult(new
{
isSuccedded = result.IsSuccedded,
message = result.Message,
imageSrc = employeeDocument
});
}
//public IActionResult OnPostSaveSubmit(SubmitEmployeeDocuments cmd)
//{
// var result = _employeeDocumentsApplication.SubmitDocumentItemsByClient(cmd);
// return new JsonResult(new
// {
// isSuccedded = result.IsSuccedded,
// message = result.Message,
// });
//}
//public IActionResult OnPostRemoveEmployeeDocumentByLabel(long employeeId, DocumentItemLabel label)
//{
// var workshopId = _passwordHasher.SlugDecrypt(_authHelper.GetWorkshopSlug());
// var result = _employeeDocumentsApplication.DeleteEmployeeMultipleUnsubmittedDocumentsByLabel(workshopId, employeeId,
// label);
// return new JsonResult(new
// {
// isSuccedded = result.IsSuccedded,
// message = result.Message
// });
//}
#region Left Work
public IActionResult OnGetCreateLeftWorkEmployee()
{
var command = new CreateLeftWorkTemp();
return Partial("ModalCreateLeftWorkEmployee", command);
}
public IActionResult OnGetEmployeeList()
{
var employees = _employeeApplication.GetWorkingEmployeesByWorkshopId(_workshopId);
return new JsonResult(new
{
success = true,
data = employees
});
}
public async Task<IActionResult> OnPostCreateEmployeeLeftWork(CreateLeftWorkTemp command)
{
command.WorkshopId = _workshopId;
var result = await _leftWorkTempApplication.Create(command);
return new JsonResult(new
{
success = result.IsSuccedded,
message = result.Message
});
}
public IActionResult OnGetCreateLeftWorkSingleEmployee(long employeeId, string fullName)
{
var command = new CreateLeftWorkTempSingleViewModel()
{
EmployeeFullName = fullName,
EmployeeIds = [employeeId]
};
return Partial("ModalCreateLeftWorkSingleEmployee", command);
}
public IActionResult OnGetDayOfWeek(string dateFa)
{
if (dateFa.TryToGeorgianDateTime(out DateTime date) == false)
return new JsonResult(new
{
success = true,
message = "",
});
return new JsonResult(new
{
success = true,
message = date.DayOfWeek.DayOfWeeKToPersian(),
});
}
#endregion
}
}

View File

@@ -112,79 +112,92 @@
<!-- Start Card Items -->
<div class="container-fluid">
<div class="row p-2">
<div class="d-grid card-area-employees-section gap-2 p-0">
<div class="gwb-card" Permission="@SubAccountPermissionHelper.LeaveListPermissionCode">
<a asp-page="/Company/Employees/Leave" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/leave.png" alt="leave" class="img-fluid mx-1" width="50px" />
<div class="text-start ms-1">
<div class="card-title">لیست کل مرخصی</div>
<p class="m-0 card-description d-none d-md-block">گزارش لیست مرخصی کل پرسنل</p>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
<div class="d-grid card-area-employees-section gap-2 p-0">
<div class="gwb-card" Permission="@SubAccountPermissionHelper.PersonnelListPermissionCode">
<a asp-page="/Company/Employees/EmployeeList" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/list-info-personnel.png" alt="" class="img-fluid mx-1" width="50px" />
<div class="text-start ms-1">
<div class="card-title">لیست کل پرسنل</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
<div class="gwb-card" Permission="@SubAccountPermissionHelper.LeaveListPermissionCode">
<a asp-page="/Company/Employees/Leave" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/leave.png" alt="leave" class="img-fluid mx-1" width="50px"/>
<div class="text-start ms-1">
<div class="card-title">لیست کل مرخصی</div>
<p class="m-0 card-description d-none d-md-block">گزارش لیست مرخصی کل پرسنل</p>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
<div class="gwb-card" Permission="@SubAccountPermissionHelper.LeaveCreatePermissionCode">
<a onclick="AjaxUrlContentModal('@Url.Page("./Index", "LeaveCreate")');" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/leave.png" alt="" class="img-fluid mx-1" width="50px"/>
<div class="text-start ms-1">
<div class="card-title">ثبت مرخصی</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
<div class="gwb-card" Permission="@SubAccountPermissionHelper.EmployeeBankInformationPermissionCode">
<a asp-page="/Company/EmployeesBankInfo/Index" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/banks.png" alt="" class="img-fluid mx-1" width="50px" />
<div class="text-start ms-1">
<div class="card-title">عملیات حساب بانکی پرسنل</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
<div class="gwb-card" Permission="@SubAccountPermissionHelper.LeaveCreatePermissionCode">
<a onclick="AjaxUrlContentModal('@Url.Page("./Index", "LeaveCreate")');" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/leave.png" alt="" class="img-fluid mx-1" width="50px"/>
<div class="text-start ms-1">
<div class="card-title">ثبت مرخصی</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
<div class="gwb-card" Permission="@SubAccountPermissionHelper.EmployeeDocumentsOperationsPermissionCode" >
<a asp-page="/Company/EmployeesDocuments/Index" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/money.png" alt="" class="img-fluid mx-1" width="50px"/>
<div class="text-start ms-1">
<div class="card-title">عملیات مدارک پرسنل</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
<div class="gwb-card" Permission="@SubAccountPermissionHelper.EmployeeBankInformationPermissionCode">
<a asp-page="/Company/EmployeesBankInfo/Index" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/banks.png" alt="" class="img-fluid mx-1" width="50px"/>
<div class="text-start ms-1">
<div class="card-title">عملیات حساب بانکی پرسنل</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
<div class="gwb-card disable" Permission="@SubAccountPermissionHelper.PaymentToEmployeePermissionCode">
<a asp-page="/Company/PaymentToEmployee/Index" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/money.png" alt="" class="img-fluid mx-1" width="50px"/>
<div class="text-start ms-1">
<div class="card-title">عملیات پرداخت حقوق پرسنل</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
<div class="gwb-card" Permission="@SubAccountPermissionHelper.EmployeeDocumentsOperationsPermissionCode">
<a asp-page="/Company/EmployeesDocuments/Index" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/money.png" alt="" class="img-fluid mx-1" width="50px"/>
<div class="text-start ms-1">
<div class="card-title">عملیات مدارک پرسنل</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
</div>
<div class="gwb-card disable" Permission="@SubAccountPermissionHelper.PaymentToEmployeePermissionCode">
<a asp-page="/Company/PaymentToEmployee/Index" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/money.png" alt="" class="img-fluid mx-1" width="50px"/>
<div class="text-start ms-1">
<div class="card-title">عملیات پرداخت حقوق پرسنل</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
</div>
</div>

View File

@@ -0,0 +1,78 @@
@model CompanyManagment.App.Contracts.LeftWorkTemp.CreateLeftWorkTemp
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
<link href="~/AssetsClient/css/select2.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/assetsclient/pages/Employees/css/ModalCreateLeftWorkEmployee.css?ver=@clientVersion" rel="stylesheet" />
}
<form role="form" method="post" name="create-form" id="create-form" autocomplete="off">
<div class="modal-content">
<div class="modal-header pb-0 d-flex align-items-center justify-content-center text-center">
<button type="button" class="btn-close position-absolute text-start" data-bs-dismiss="modal" aria-label="Close"></button>
<div>
<p class="m-0 pdHeaderTitle1">ترک کار پرسنل</p>
</div>
</div>
<div class="modal-body">
<div class="container-fluid">
<div class="row">
<div class="col-12 my-1">
<span class="spanTitleText">اسامی پرسنل</span>
<div class="select-alert">
<select class="form-select select2Option" aria-label="انتخاب پرسنل ..." asp-for="@Model.EmployeeIds" id="employeeSelect" multiple>
</select>
</div>
</div>
<div class="col-12 my-1">
<span class="spanTitleText">تاریخ آخرین روز کاری</span>
<div class="position-relative dayOfWeek">
<span class="lastDayStandingTxt" style="display: none"></span>
<input class="form-control form-control-date text-center lastDayStanding" asp-for="@Model.LastDayStanding" placeholder="تاریخ آخرین روز کاری" style="direction: ltr" />
</div>
</div>
<div class="col-12 my-1">
<span class="spanTitleText">تاریخ ترک کار</span>
<div class="position-relative dayOfWeek">
<span class="dayOfLeftWorkTxt" style="display: none"></span>
<input class="form-control form-control-date text-center dayOfLeftWork" asp-for="@Model.LeftWorkTime" placeholder="تاریخ ترک کار" style="direction: ltr" />
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer d-block">
<div class="container p-0 m-0">
<div class="row">
<div class="col-6 text-end">
<button type="button" class="btn-cancel2 justify-content-center" data-bs-dismiss="modal" aria-label="Close">انصراف</button>
</div>
<div class="col-6 text-start">
<button type="button" class="btnCreateNew position-relative disable" id="createData">
<span class="text-nowrap">ثبت نهایی</span>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
</div>
</div>
</form>
<script src="~/assetsclient/js/site.js?ver=@clientVersion"></script>
<script src="~/assetsclient/libs/jalaali-js/jalaali.js"></script>
<script src="~/admintheme/js/jquery.mask_1.14.16.min.js"></script>
<script src="~/assetsclient/libs/cleave/cleave.min.js"></script>
<script src="~/assetsclient/libs/wordifyfa/wordifyfa.min.js"></script>
<script>
var antiForgeryToken = $(`@Html.AntiForgeryToken()`).val();
var employeeListAjax = `@Url.Page("./EmployeeList", "EmployeeList")`;
var dayOfWeekDataUrl = `@Url.Page("./EmployeeList", "DayOfWeek")`;
var saveLeftWorkAjax = `@Url.Page("./EmployeeList", "CreateEmployeeLeftWork")`;
</script>
<script src="~/assetsclient/pages/Employees/js/ModalCreateLeftWorkEmployee.js?ver=@clientVersion"></script>

View File

@@ -0,0 +1,79 @@
@model CompanyManagment.App.Contracts.LeftWorkTemp.CreateLeftWorkTempSingleViewModel
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
<link href="~/AssetsClient/css/select2.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/assetsclient/pages/Employees/css/ModalCreateLeftWorkEmployee.css?ver=@clientVersion" rel="stylesheet" />
}
<form role="form" method="post" name="create-form" id="create-form" autocomplete="off">
<div class="modal-content">
<div class="modal-header pb-0 d-flex align-items-center justify-content-center text-center">
<button type="button" class="btn-close position-absolute text-start" data-bs-dismiss="modal" aria-label="Close"></button>
<div>
<p class="m-0 pdHeaderTitle1">ترک کار پرسنل</p>
</div>
</div>
<div class="modal-body pt-0">
<div class="container-fluid">
<div class="row">
@foreach (var itemEmployee in Model.EmployeeIds)
{
<input type="hidden" name="Command.EmployeeIds[]" value="@itemEmployee" id="employeeSelect" />
}
<div class="col-12 my-1 text-center">
@Model.EmployeeFullName
</div>
<div class="col-12 my-1">
<span class="spanTitleText">تاریخ آخرین روز کاری</span>
<div class="position-relative dayOfWeek">
<span class="lastDayStandingTxt" style="display: none"></span>
<input class="form-control form-control-date text-center lastDayStanding" name="Command.LastDayStanding" placeholder="تاریخ آخرین روز کاری" style="direction: ltr"/>
</div>
</div>
<div class="col-12 my-1">
<span class="spanTitleText">تاریخ ترک کار</span>
<div class="position-relative dayOfWeek">
<span class="dayOfLeftWorkTxt" style="display: none"></span>
<input class="form-control form-control-date text-center dayOfLeftWork" name="Command.LeftWorkTime" placeholder="تاریخ ترک کار" style="direction: ltr"/>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer d-block">
<div class="container p-0 m-0">
<div class="row">
<div class="col-6 text-end">
<button type="button" class="btn-cancel2 justify-content-center" data-bs-dismiss="modal" aria-label="Close">انصراف</button>
</div>
<div class="col-6 text-start">
<button type="button" class="btnCreateNew position-relative disable" id="createData">
<span class="text-nowrap">ثبت نهایی</span>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
</div>
</div>
</form>
<script src="~/assetsclient/js/site.js?ver=@clientVersion"></script>
<script src="~/assetsclient/libs/jalaali-js/jalaali.js"></script>
<script src="~/admintheme/js/jquery.mask_1.14.16.min.js"></script>
<script src="~/assetsclient/libs/cleave/cleave.min.js"></script>
<script src="~/assetsclient/libs/wordifyfa/wordifyfa.min.js"></script>
<script>
var antiForgeryToken = $(`@Html.AntiForgeryToken()`).val();
var employeeListAjax = `@Url.Page("./EmployeeList", "EmployeeList")`;
var dayOfWeekDataUrl = `@Url.Page("./EmployeeList", "DayOfWeek")`;
var saveLeftWorkAjax = `@Url.Page("./EmployeeList", "CreateEmployeeLeftWork")`;
</script>
<script src="~/assetsclient/pages/Employees/js/ModalCreateLeftWorkEmployee.js?ver=@clientVersion"></script>

View File

@@ -0,0 +1,88 @@
@model CompanyManagment.App.Contracts.Employee.CreateEmployeeByClient
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
<link href="~/AssetsClient/css/select2.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/assetsclient/pages/employees/css/createbankinfomodal.css?ver=@clientVersion" rel="stylesheet" />
}
<div class="text-center">
<div>
<p class="m-0 pdHeaderTitle1">ایجاد شماره حساب پرسنل</p>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-12 my-1">
<span class="spanTitleText">نام بانک</span>
<div class="select-alert select-alert-bank">
<select class="form-select select2Option" aria-label="انتخاب بانک ..." id="bankSelectCreate">
</select>
</div>
</div>
<div class="col-12 my-1">
<span class="spanTitleText">شماره کارت</span>
<input type="text" class="form-control" id="CardNumber" placeholder="شماره کارت را وارد نمائید" style="direction: ltr">
</div>
<div class="col-12 my-1 position-relative">
<span class="spanTitleText">شماره شبا</span>
<input class="form-control" id="ShebaNumber" placeholder="شماره شبا را وارد نمائید" style="direction: ltr" />
</div>
<div class="col-12 my-1">
<span class="spanTitleText">شماره حساب</span>
<input class="form-control" id="BankAccountNumber" placeholder="شماره حساب را وارد نمائید" style="direction: ltr" />
</div>
<div class="col-12 my-1">
<button type="button" class="btnAddNew position-relative" onclick="addDataToTable()" id="addNewItemBtn">
<span class="text-nowrap">افزودن</span>
</button>
<button type="button" class="btnEditNew position-relative" onclick="saveEditNewItem()" id="editNewItemBtn" style="display: none">
<span class="text-nowrap">ثبت ویرایش</span>
</button>
</div>
<div class="col-12 my-1">
<div class="data-load">
<div class="wrapper" style="display: none">
<div class="Rtable Rtable--collapse">
<div class="Rtable-row Rtable-row--head align-items-center sticky-div">
<div class="Rtable-cell column-heading width1 d-flex align-items-center">ردیف</div>
<div class="Rtable-cell column-heading width2">نام پرسنل</div>
<div class="Rtable-cell column-heading width3 text-center">تعداد افزودن</div>
<div class="Rtable-cell column-heading width4">بانک</div>
<div class="Rtable-cell column-heading width5 text-end">عملیات</div>
</div>
<div class="w-100" id="dataLoad"></div>
</div>
</div>
<div class="text-center d-flex align-items-center justify-content-center" >
<div id="emptyData">
<img src="/assetsclient/images/empty2.png" width="250px" alt="" class="img-fluid" />
<h5 style="font-size: 14px;">هیچ اطلاعات بانکی را وارد نشده است!</h5>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
var getDetailsAjaxUrl = `@Url.Page("/Company/Employees/EmployeeList", "DetailsAjax")`;
var bankListAjax = `@Url.Page("/Company/Employees/EmployeeList", "BankListAjax")`;
</script>
<script src="~/assetsclient/pages/employees/js/createbankinfomodal.js?ver=@clientVersion"></script>

View File

@@ -0,0 +1,154 @@
@model CompanyManagment.App.Contracts.Employee.CreateEmployeeByClient
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
}
<style>
.errored {
animation: shake 300ms;
color: #eb3434 !important;
background-color: #fef2f2 !important;
border: 1px solid #eb3434 !important;
}
#select2-sematSelect-results {
height: 130px;
}
</style>
<div class="row p-0">
<div class="col-12">
<div class="d-flex align-items-center justify-content-between" style="font-size: 13px;height: 30px;border: 1px solid #D9D9D9;padding: 18px 8px;border-radius: 7px;">
<div>کد پرسنلی:</div>
<div id="defaultPersonnelCode">@Model.PersonnelCode</div>
</div>
</div>
<div class="col-12 form-personal my-1">
<div class="input-group shadow-none disable">
<label class="input-group-text d-flex justify-content-center align-items-center" for="nationalCodeStep2">کد ملی</label>
<input class="form-control text-center" name="Command.NationalCode" id="nationalCodeStep2" style="direction: ltr">
</div>
<div class="valid-feedback">
کد ملی را وارد کنید
</div>
</div>
<div class="col-12 form-personal my-1">
<div class="input-group shadow-none disable">
<label class="input-group-text d-flex justify-content-center align-items-center" for="birthDateStep2">تاریخ تولد</label>
<input class="form-control text-center" name="Command.BirthDate" id="birthDateStep2" style="direction: ltr">
</div>
<div class="valid-feedback">
تاریخ تولد را وارد کنید
</div>
</div>
<div class="position-relative validateLoading">
<div class="col-12 ">
<div class="card border p-2">
<div class="row ">
<div class="col-12 my-1 checkByNationalCode disable disablemightBeNullDB1">
<span class="spanTitleText">ملیت</span>
<div class="select-alert select-alert-nationality">
<select class="form-select select2Option" aria-label="انتخاب ..." name="Command.Nationality" id="NationalitySelect">
<option value="ایرانی" selected="selected">ایرانی</option>
<option value="غیر ایرانی">غیر ایرانی</option>
</select>
</div>
</div>
<div class="col-lg-6 col-6 form-personal checkByNationalCode disable mightBeNullDB2 my-1">
<div class="input-group">
<label class="input-group-text d-flex justify-content-center align-items-center">جنسیت</label>
<div class="inputGroup-sizing-marriage d-flex align-items-center justify-content-center">
<input class="form-check-input genderStatus" type="radio" id="gender1" name="Command.Gender" value="مرد" required>
<label class="form-check-label ms-1" for="gender1">
آقا
</label>
<input class="form-check-input genderStatus" type="radio" id="gender2" name="Command.Gender" value="زن" required>
<label class="form-check-label ms-1" for="gender2">
خانم
</label>
<div class="invalid-feedback">
وضیعت جنسیت را مشخص کنید
</div>
</div>
</div>
</div>
<div class="col-lg-6 col-6 checkByNationalCode disable mightBeNullDB3 form-personal my-1" style="padding-right: 0;">
<div class="input-group validMariage">
<label class="input-group-text d-flex justify-content-center align-items-center">وضیعت تاهل</label>
<div class="inputGroup-sizing-marriage d-flex align-items-center justify-content-center">
<input class="form-check-input maritalStatus" type="radio" id="marriage1" name="Command.MaritalStatus" value="متاهل" required>
<label class="form-check-label ms-1" for="marriage1">
متاهل
</label>
<input class="form-check-input maritalStatus" type="radio" id="marriage2" name="Command.MaritalStatus" value="مجرد" required>
<label class="form-check-label ms-1" for="marriage2">
مجرد
</label>
<div class="invalid-feedback">
وضیعت تاهل را مشخص کنید
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-12 checkByNationalCode mightBeNullDB4 disable">
<div class="col-12 my-1">
<span class="spanTitleText">نام پرسنل</span>
<input type="text" class="form-control" id="firstName" name="Command.FirstName" />
</div>
</div>
<div class="col-12 checkByNationalCode mightBeNullDB5 disable">
<div class="col-12 my-1">
<span class="spanTitleText">نام خانوادگی پرسنل</span>
<input type="text" id="lastName" class="form-control" name="Command.LastName" />
</div>
</div>
<div class="col-12 checkByNationalCode checkByHistoryCode2 mightBeNullDB6 disable">
<div class="col-12 my-1">
<span class="spanTitleText">تاریخ شروع بکار</span>
<input type="text" class="form-control startLeftWorkDate text-center" id="startWork" name="Command.StartLeftWork" style="direction: ltr" />
</div>
</div>
<div class="col-12 checkByNationalCode checkByHistoryCode2 mightBeNullDB6 disable">
<div class="col-12 my-1">
<span class="spanTitleText">انتخاب سمت</span>
<div class="sematValid" style="border-radius: 7px;">
<select class="form-select JobSelect2Option" aria-label="انتخاب سمت ..." id="sematSelect" name="Command.JobId">
<option value="0">انتخاب سمت ...</option>
</select>
</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</div>
</div>
<script>
//Job Load
var jobsLoadEmployeeAjaxUrl = `@Url.Page("/Company/Employees/EmployeeList", "JobSearch")`;
var jobsLoadRollCallAjaxUrl = `@Url.Page("/Company/RollCall/EmployeeUploadPicture", "JobSearch")`;
//get Employee Data By NationalCode
var getEmployeeDataByNationalCodeUrl = `@Url.Page("/Company/Employees/EmployeeList", "EmployeeDetailsWithNationalCode")`;
var getRollCallDataByNationalCodeUrl = `@Url.Page("/Company/RollCall/EmployeeUploadPicture", "EmployeeDetailsWithNationalCode")`;
</script>
<script src="~/assetsclient/pages/employees/js/createemployeeform.js?ver=@clientVersion"></script>

View File

@@ -0,0 +1,62 @@
@model CompanyManagment.App.Contracts.Employee.CreateEmployeeByClient
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
}
<style>
.errored {
animation: shake 300ms;
color: #eb3434 !important;
background-color: #fef2f2 !important;
border: 1px solid #eb3434 !important;
}
#select2-sematSelect-results {
height: 130px;
}
.form-personal .input-group-text.custom-size {
width: 140px;
}
</style>
<div class="row p-0">
<div class="col-12">
<div class="d-flex align-items-center justify-content-between" style="font-size: 13px;height: 30px;width: 140px;border: 1px solid #D9D9D9;padding: 18px 8px;border-radius: 7px;">
<div>کد پرسنلی:</div>
<div id="personnelCode">@Model.PersonnelCode</div>
</div>
</div>
<div class="col-12 form-personal my-1">
<div class="input-group shadow-none">
<label class="input-group-text d-flex justify-content-center align-items-center custom-size" for="nationalCode">کد ملی</label>
<input class="form-control text-center" id="nationalCode" style="direction: ltr">
</div>
<div class="valid-feedback">
کد ملی را وارد کنید
</div>
</div>
<div class="col-12 form-personal my-1">
<div class="input-group shadow-none">
<label class="input-group-text d-flex justify-content-center align-items-center custom-size" for="birthDate">تاریخ تولد</label>
<input class="form-control text-center" id="birthDate" style="direction: ltr">
</div>
<div class="valid-feedback">
تاریخ تولد را وارد کنید
</div>
</div>
</div>
<script>
//Job Load
var jobsLoadEmployeeAjaxUrl = `@Url.Page("/Company/Employees/EmployeeList", "JobSearch")`;
var jobsLoadRollCallAjaxUrl = `@Url.Page("/Company/RollCall/EmployeeUploadPicture", "JobSearch")`;
//get Employee Data By NationalCode
var getEmployeeDataByNationalCodeUrl = `@Url.Page("/Company/Employees/EmployeeList", "EmployeeDetailsWithNationalCode")`;
var getRollCallDataByNationalCodeUrl = `@Url.Page("/Company/RollCall/EmployeeUploadPicture", "EmployeeDetailsWithNationalCode")`;
</script>
<script src="~/assetsclient/pages/employees/js/identityinformationmodal.js?ver=@clientVersion"></script>

View File

@@ -0,0 +1,246 @@
@model CompanyManagment.App.Contracts.Employee.CreateEmployeeByClient
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
<link href="~/assetsclient/pages/employees/css/ModalUploadDocument.css?ver=@clientVersion" rel="stylesheet" />
}
<div class="pdBoxGrid">
<div class="pdBox important">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
<img src="~/assetsclient/images/pd-image.png" class="preview-image" data-label="EmployeePicture" />
<input type="hidden" />
<div class="sign ">
</div>
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>عکس پرسنل <span> *</span></div>
<div class="resultMessage">
</div>
</div>
<div class="pdTitle2 reasonReject pdTitle2 d-none d-md-block"></div>
</div>
</div>
<input type="hidden" id="label_0" value="EmployeePicture" />
<div class="pdButtons">
<button type="button" class="btnUploadingPD d-block mb-1" data-index="0">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block" data-index="0">حذف</button>
</div>
<input type="file" class="file-input" data-index="0" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox important">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
@* <img src="@Url.Page("./Index", "ShowPicture", new { filePath = @Model.NationalCardFront.PicturePath })" class="preview-image isTrue" /> *@
<img src="~/assetsclient/images/pd-image.png" class="preview-image" data-label="NationalCardFront" />
<input type="hidden" />
<div class="sign ">
</div>
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>کارت ملی رو <span> *</span></div>
<div class="resultMessage">
<div></div>
</div>
</div>
<div class="pdTitle2 reasonReject "></div>
</div>
</div>
<input type="hidden" id="label_1" value="NationalCardFront" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="1">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block" data-index="1">حذف</button>
</div>
<input type="file" class="file-input" data-index="1" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox important">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
<img src="~/assetsclient/images/pd-image.png" class="preview-image" data-label="NationalCardRear" />
<input type="hidden" />
<div class="sign">
</div>
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>کارت ملی پشت <span> *</span></div>
<div class="resultMessage">
<div></div>
</div>
</div>
<div class="pdTitle2 reasonReject "></div>
</div>
</div>
<input type="hidden" id="label_2" value="NationalCardRear" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="2">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block " data-index="2">حذف</button>
</div>
<input type="file" class="file-input" data-index="2" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox important @(Model.Gender == "زن" ? "disable" : "") " id="MilitaryServiceCardSection">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
<img src="~/assetsclient/images/pd-image.png" class="preview-image" data-label="MilitaryServiceCard" />
<input type="hidden"/>
<div class="sign">
</div>
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>کارت پایان خدمت <span id="requiredStar"> *</span></div>
<div class="resultMessage">
<div></div>
</div>
</div>
<div class="pdTitle2 reasonReject "></div>
</div>
</div>
<input type="hidden" id="label_3" value="MilitaryServiceCard" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="3">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block " data-index="3">حذف</button>
</div>
<input type="file" class="file-input" data-index="3" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox important">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
<img src="~/assetsclient/images/pd-image.png" class="preview-image" data-label="IdCardPage1" />
<input type="hidden" />
<div class="sign">
</div>
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه اول <span>*</span></div>
<div class="resultMessage">
<div></div>
</div>
</div>
<div class="pdTitle2 reasonReject "></div>
</div>
</div>
<input type="hidden" id="label_4" value="IdCardPage1" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="4">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block " data-index="4">حذف</button>
</div>
<input type="file" class="file-input" data-index="4" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
<img src="~/assetsclient/images/pd-image.png" class="preview-image" data-label="IdCardPage2" />
<input type="hidden" />
<div class="sign ">
</div>
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه دوم</div>
<div class="resultMessage">
<div></div>
</div>
</div>
<div class="pdTitle2 reasonReject "></div>
</div>
</div>
<input type="hidden" id="label_5" value="IdCardPage2" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="5">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block " data-index="5">حذف</button>
</div>
<input type="file" class="file-input" data-index="5" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
<img src="~/assetsclient/images/pd-image.png" class="preview-image" data-label="IdCardPage3" />
<input type="hidden" />
<div class="sign ">
</div>
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه سوم</div>
<div class="resultMessage">
<div></div>
</div>
</div>
<div class="pdTitle2 reasonReject "></div>
</div>
</div>
<input type="hidden" id="label_6" value="IdCardPage3" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="6">آپلود عکس</button>
@* status change first status *@
<button type="button" class="btnDeletingPD d-block " data-index="6">حذف</button>
</div>
<input type="file" class="file-input" data-index="6" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
<div class="pdBox">
<div class="d-flex align-items-center justify-content-start w90">
<div class="pdImageBox">
<img src="~/assetsclient/images/pd-image.png" class="preview-image" data-label="IdCardPage4" />
<input type="hidden"/>
<div class="sign ">
</div>
</div>
<div class="text-start mx-1 pdTitle">
<div class="d-flex align-items-center justify-content-between">
<div>شناسنامه صفحه چهارم </div>
<div class="resultMessage">
<div></div>
</div>
</div>
<div class="pdTitle2 reasonReject "></div>
</div>
</div>
<input type="hidden" id="label_7" value="IdCardPage4" />
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="7">آپلود عکس</button>
<button type="button" class="btnDeletingPD d-block" data-index="7">حذف</button>
</div>
<input type="file" class="file-input" data-index="7" accept=".jpg,.jpeg,.png,.pdf" style="display: none;">
<div class="spinner-loading-progress loading" style="display: none">
<span class="text-white percentageText"></span>
</div>
</div>
</div>
<script src="~/assetsclient/pages/employees/js/ModalUploadDocument.js?ver=@clientVersion"></script>

View File

@@ -0,0 +1,119 @@
@model CompanyManagment.App.Contracts.Employee.CreateEmployeeByClient
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
<link href="~/assetsclient/pages/employees/css/modaltakeimages.css?ver=@clientVersion" rel="stylesheet" />
}
<div class="d-flex flex-column justify-content-center h-75 text-center desktopNotif">
<div>
<svg width="100px" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 621.6 721.91">
<defs>
<style>
.clsd-1 {
fill: url(#linear-gradient-2);
}
.clsd-2 {
fill: url(#linear-gradient-3);
}
.clsd-3 {
fill: url(#linear-gradient);
}
</style>
<linearGradient id="linear-gradient" x1="0" y1="481.82" x2="621.6" y2="481.82" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#30c1c1" />
<stop offset="1" stop-color="#087474" />
</linearGradient>
<linearGradient id="linear-gradient-2" x1="217.07" y1="187.47" x2="523.83" y2="187.47" xlink:href="#linear-gradient" />
<linearGradient id="linear-gradient-3" x1="1.3" y1="146.6" x2="395.56" y2="146.6" xlink:href="#linear-gradient" />
</defs>
<polygon class="clsd-3" points="0 328.82 129.91 244.95 129.91 453.87 310.8 562.4 488.4 453.87 488.4 355.2 310.8 355.2 488.4 241.73 621.6 241.73 621.6 541.02 310.8 721.91 0 541.02 0 328.82" />
<polygon class="clsd-1" points="217.07 309.16 217.07 192.4 426.8 65.78 523.83 123.33 217.07 309.16" />
<polyline class="clsd-2" points="308.61 0 395.56 47.69 1.3 293.19 1.3 184.66 308.61 0" />
</svg>
<h5 class="mt-2 title-logo">سامانه هوشمند گزارشگیر</h5>
</div>
<div>
<p>برای آپلود عکس حضور و غیاب میباست از گوشی استفاده نمایید!</p>
</div>
</div>
<div class="row mobileNotif">
<div class="col-12">
<div class="row">
<div class="col-xs-12">
<div class="panel panel-default">
<form asp-page="./Index" asp-page-handler="TakePicture" id="test"
method="post"
data-ajax="true"
data-callback=""
data-action="Refresh"
enctype="multipart/form-data">
<div class="panel-body text-center" style="display: flex; flex-flow: column; align-items: center;">
<div id="result1" style="margin-bottom: 5px;"></div>
<div id="result2" style="margin-bottom: 5px;"></div>
<div id="demoResult1" class="image-show">
<button type="button" class="upload-image1">
<p class="textUpload">
عکس اول
</p>
</button>
@* <img style="width: 100%; height: 100%; border-radius: 10px;" id="pic1" data-uri="" src="" id="picture1" /> *@
<div class="loadingImage" id="loadingImage1">
<div class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
</div>
<div id="demoResult2" class="image-show">
<button type="button" class="upload-image2">
<p class="textUpload">
عکس دوم
</p>
</button>
@* <img style="width: 100%; height: 100%; border-radius: 10px;" id="pic2" data-uri="" src="" id="picture2" /> *@
<div class="loadingImage" id="loadingImage2">
<div class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
</div>
<div class="row mt-3">
<div class="col-12 position-relative overflow-hidden" style="height: 20px; direction: ltr;">
<div class="spinner-loading-progress loading" style="display: none; border-radius: 6px; position: unset;">
<span id="progressBar" style="color: #ffffff"></span>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script src="~/weights/face-api.js"></script>
<script src="~/AssetsClient/libs/jslib-html5-camera/jslib-html5-camera-photo.min.js"></script>
<script>
// take picture and faceapi
var takeEmployeePictureAjax = `@Url.Page("/Company/Employees/EmployeeList", "TakePicture")`;
var takePictureRollCallAjax = `@Url.Page("/Company/RollCall/EmployeeUploadPicture", "TakePicture")`;
var hasPicture = false;
var checkFace1 = false;
var checkFace2 = false;
// @* var hasUploadedImage = `@(Model.HasUploadedImage)` === "True" ? true : false; *@
var hasPicture = false;
var checkFace1 = false;
var checkFace2 = false;
var hasUploadedImage = false;
var hasErrorPic1 = false;
var hasErrorPic2 = false;
</script>
<script src="~/assetsclient/pages/employees/js/modaluploadimagepersonnel.js"></script>

View File

@@ -0,0 +1,272 @@
@model CompanyManagment.App.Contracts.Employee.CreateEmployeeByClient
@using _0_Framework.Domain.CustomizeCheckoutShared.Enums
@{
string clientVersion = _0_Framework.Application.Version.StyleVersion;
<link href="~/AssetsClient/css/select2.css?ver=@clientVersion" rel="stylesheet" />
}
<div class="errorSelection">
<select class="form-select select2Option" aria-label="انتخاب ..." id="workshopSettingSelect">
</select>
</div>
<div class="row p-0" id="stepWorkTimeOptionRadio" style="display: none">
<div class="d-flex flex-column align-items-center justify-content-center h-100">
<div class="d-flex align-items-center justify-content-center mt-3 mb-1">
<p class="m-0">ساعات کاری پرسنل این گروه را مشخص نمائید</p>
</div>
<div class="btn-workTimeOption-container align-items-center justify-content-center w-100">
<input type="radio" value="Regular" name="Command.CreateCustomizeEmployeeSettings.WorkshopShiftStatus" id="organized" class="radio-workTimeOption">
<label for="organized" class="radio-label-workTimeOption w-100">منظم</label>
<input type="radio" value="Rotating" name="Command.CreateCustomizeEmployeeSettings.WorkshopShiftStatus" id="rotating_shift" class="radio-workTimeOption">
<label for="rotating_shift" class="radio-label-workTimeOption w-100">گردشی</label>
<input type="radio" value="Irregular" name="Command.CreateCustomizeEmployeeSettings.WorkshopShiftStatus" id="disorganized" class="radio-workTimeOption">
<label for="disorganized" class="radio-label-workTimeOption w-100">مختلط</label>
</div>
</div>
</div>
<div class="row mt-2" id="step_workTimeOptionNull" style="height: 202px;">
</div>
<div class="row mt-2" id="step_workTimeOptionWithoutGroup" style="display: none">
<div class="col-12 d-flex align-items-center justify-content-center">
<div class="text-center" style="display: flex;font-size: 14px;border: 1px solid #ddd;border-radius: 7px;background-color: #f3f3f3;height: 565px;align-items: center;justify-content: center;">
توجه داشته باشید در صورت انتخاب گزینه بدون گروه ساعت کاری پرسنل با ساعت پیشفرض کارگاه تنظیم خواهد شد.
</div>
</div>
</div>
<div class="row mt-2" id="step_workTimeOption" style="height: 202px; display: none">
<div class="col-12" id="appendChildTimeWorkHtml">
<div class="groupBox">
<div class="row align-items-center justify-content-between">
<div class="col-3 d-flex align-items-center">
<input type="hidden" name="Command.CreateCustomizeEmployeeSettings.ShiftViewModel[0].Placement" value="First"/>
<div class="timeWorkTitle">
نوبت اول
</div>
</div>
<div class="col-4 d-flex align-items-center">
<div class="timeWorkTitle">از</div>
<input type="text" class="form-control text-center dateTime" name="Command.CreateCustomizeEmployeeSettings.ShiftViewModel[0].StartTime" value="" placeholder="00:00" style="direction: ltr;">
</div>
<div class="col-4 d-flex align-items-center">
<div class="timeWorkTitle">الی</div>
<input type="text" class="form-control text-center dateTime" name="Command.CreateCustomizeEmployeeSettings.ShiftViewModel[0].EndTime" value="" placeholder="00:00" style="direction: ltr;">
</div>
<div class="col-1 d-flex align-items-center justify-content-end">
</div>
</div>
</div>
</div>
<div class="d-flex align-items-center justify-content-center w-100 my-2">
<button type="button" class="btnAddTimeWork">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="11" cy="11" r="8.25" stroke="white" />
<path d="M11 13.75L11 8.25" stroke="white" stroke-linecap="round" />
<path d="M13.75 11L8.25 11" stroke="white" stroke-linecap="round" />
</svg>
<div class="mx-1 btnAppendChildTimeWork">افزودن نوبت دوم</div>
</button>
</div>
<div class="col-12">
<p class="m-0" id="ShowSettingMessage"></p>
</div>
</div>
<div class="row mt-2" id="step_workTimeOptionRotatingShift" style="height: 202px; display: none">
<div class="" id="appendChildTimeWorkHtmlRS">
<div class="groupBoxRS">
<div class="row align-items-center justify-content-between">
<div class="col-3 d-flex align-items-center">
<div class="timeWorkTitle">نوبت اول</div>
</div>
<div class="col-4 d-flex align-items-center">
<div class="timeWorkTitle">از</div>
<input type="text" class="form-control text-center dateTimeRS" id="startDateTimeRS" name="Command.CreateCustomizeEmployeeSettings.CustomizeRotatingShiftsViewModels[0].StartTime" placeholder="00:00" style="direction: ltr;">
</div>
<div class="col-4 d-flex align-items-center">
<div class="timeWorkTitle">الی</div>
<input type="text" class="form-control text-center dateTimeRS" id="endDateTimeRS" name="Command.CreateCustomizeEmployeeSettings.CustomizeRotatingShiftsViewModels[0].EndTime" placeholder="00:00" style="direction: ltr;">
</div>
<div class="col-1 d-flex align-items-center justify-content-end">
</div>
</div>
</div>
</div>
<div class="d-flex align-items-center justify-content-center w-100 my-2">
<button type="button" class="btnAddTimeWorkRS">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="11" cy="11" r="8.25" stroke="white"/>
<path d="M11 13.75L11 8.25" stroke="white" stroke-linecap="round"/>
<path d="M13.75 11L8.25 11" stroke="white" stroke-linecap="round"/>
</svg>
<div class="mx-1 btnAppendChildTimeWorkRS">افزودن نوبت دوم</div>
</button>
</div>
<div class="col-12">
<p class="m-0" id="ShowSettingMessageRS"></p>
</div>
</div>
<div class="row p-0" id="step_workTimeOptionIrregular" style="height: 202px; gap: 12px; display: none">
<div class="btn-workTimeOption-container align-items-center justify-content-center mt-4">
<input type="radio" id="TwelveTwentyFour" value="@WorkshopIrregularShifts.TwelveTwentyFour" name="Command.CreateCustomizeEmployeeSettings.IrregularShift.WorkshopIrregularShifts" class="radio-workTimeOption">
<label for="TwelveTwentyFour" class="radio-label-workTimeOption w-100 outlineDate">12 ساعت کار 24 ساعت استراحت</label>
<input type="radio" id="TwentyFourTwentyFour" value="@WorkshopIrregularShifts.TwentyFourTwentyFour" name="Command.CreateCustomizeEmployeeSettings.IrregularShift.WorkshopIrregularShifts" class="radio-workTimeOption">
<label for="TwentyFourTwentyFour" class="radio-label-workTimeOption w-100 outlineDate">24 ساعت کار 24 ساعت استراحت</label>
</div>
<div class="btn-workTimeOption-container align-items-center justify-content-center">
<input type="radio" id="TwelveThirtySix" value="@WorkshopIrregularShifts.TwelveThirtySix" name="Command.CreateCustomizeEmployeeSettings.IrregularShift.WorkshopIrregularShifts" class="radio-workTimeOption">
<label for="TwelveThirtySix" class="radio-label-workTimeOption w-100 outlineDate">12 ساعت کار 36 ساعت استراحت</label>
<input type="radio" id="TwentyFourFortyEight" value="@WorkshopIrregularShifts.TwentyFourFortyEight" name="Command.CreateCustomizeEmployeeSettings.IrregularShift.WorkshopIrregularShifts" class="radio-workTimeOption">
<label for="TwentyFourFortyEight" class="radio-label-workTimeOption w-100 outlineDate">24 ساعت کار 48 ساعت استراحت</label>
</div>
<div class="hrLine"></div>
<div class="col-12">
<div class="groupBoxIrregular disable" id="irregularShiftsDateTime">
<div class="row align-items-center justify-content-between">
<div class="col-2 d-flex align-items-center">
<div class="timeWorkTitle"></div>
</div>
<div class="col-4 d-flex align-items-center">
<div class="timeWorkTitle">از</div>
<input type="text" class="form-control text-center dateTimeIrregular" id="irregularShiftsStartDateTime" name="Command.CreateCustomizeEmployeeSettings.IrregularShift.StartTime" placeholder="00:00" style="direction: ltr;">
</div>
<div class="col-4 d-flex align-items-center">
<div class="timeWorkTitle">الی</div>
<input type="text" class="form-control text-center dateTimeIrregular" id="irregularShiftsEndDateTime" name="Command.CreateCustomizeEmployeeSettings.IrregularShift.EndTime" placeholder="00:00" style="direction: ltr;">
</div>
<div class="col-2 d-flex align-items-center justify-content-end">
</div>
</div>
</div>
</div>
</div>
<div class="container my-3" id="footer-section">
<div class="row breack-time">
<div>
<div class="d-flex align-items-center my-1 breakTimeDiv">
<input type="checkbox" id="BreakTimeFirst" class="form-check-input">
<label for="BreakTimeFirst" class="lableCheckBreakTime">
این پرسنل دارای ساعت استراحت نامشخص می باشد با انتخاب این تیک پرسنل باید برای استراحت ورود و خروج ثبت کند.
</label>
</div>
</div>
<div class="d-block">
<div class="d-flex align-items-center my-1 breakTimeDiv">
<input type="checkbox" id="BreakTime" class="form-check-input">
<label for="BreakTime" class="lableCheckBreakTime">
این پرسنل دارای ساعت استراحت ثابت روزانه می باشد که بصورت خودکار در فیش حقوقی محاسبه می گردد:
</label>
</div>
<div class="d-flex align-items-center justify-content-center my-1 mt-3 disable" id="computeTime">
<div class="position-relative">
<label for="hour" class="position-absolute" style="bottom: 25px; font-size: 13px; font-weight: 700; right: 5px; background-color: #fff; padding: 0 4px;">ساعت</label>
<select id="hour" name="Command.CreateCustomizeEmployeeSettings.selectCheckBreakTime" class="form-select selectCheckBreakTime">
<option value="00" selected>ساعت</option>
<option value="01">1</option>
<option value="02">2</option>
<option value="03">3</option>
</select>
</div>
<span class="mx-1">:</span>
<div class="position-relative">
<label for="min" class="position-absolute" style="bottom: 25px; font-size: 13px; font-weight: 700; right: 5px; background-color: #fff; padding: 0 4px;">دقیقه</label>
<select id="min" name="Command.CreateCustomizeEmployeeSettings.selectCheckBreakTime" class="form-select selectCheckBreakTime">
<option value="00" selected>دقیقه</option>
<option value="05">5</option>
<option value="10">10</option>
<option value="15">15</option>
<option value="20">20</option>
<option value="25">25</option>
<option value="30">30</option>
<option value="35">35</option>
<option value="40">40</option>
<option value="45">45</option>
<option value="50">50</option>
<option value="55">55</option>
</select>
</div>
<input type="hidden" id="TimeOnly" />
@* <span class="mx-1" id="computeTimeText"></span> *@
</div>
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<div class="lableCheckBreakTime text-center">وضعیت فعالیت مجموعه در روز های جمعه و تعطیلات رسمی</div>
<div class="row extraOptionBorder">
<div class="col-6 p-0">
<div class="group-container">
@* <div class="lableCheckBreakTime">وضعیت فعالیت مجموعه در روز های جمعه</div> *@
<div class="d-flex form-group my-1 group">
<input type="radio" name="FridayWork1" id="Friday1" class="form-check-input Main-Radio" value="@((int)(FridayWork.Default))" />
<label for="Friday1" class="lableCheckBreakTime">پرسنل در روزهای جمعه کار نمی‌کند.</label>
</div>
<div class="d-flex form-group my-1 group">
<input type="radio" name="FridayWork1" id="Friday2" class="form-check-input Main-Radio" value="@((int)(FridayWork.WorkInFriday))" />
<label for="Friday2" class="lableCheckBreakTime">پرسنل در روزهای جمعه کار می‌کند.</label>
</div>
</div>
</div>
<div class="col-6 p-0">
<div class="group-container">
@* <div class="lableCheckBreakTime">وضعیت فعالیت مجموعه در روز های تعطیلات رسمی</div> *@
<div class="d-flex form-group my-1 group">
<input type="radio" name="HolidayWork1" id="HolidayWork1" class="form-check-input Main-Radio" value="@HolidayWork.Default" />
<label for="HolidayWork1" class="lableCheckBreakTime">پرسنل در ایام تعطیل رسمی کار نمی‌کند.</label>
</div>
<div class="d-flex form-group my-1 group">
<input type="radio" name="HolidayWork1" id="HolidayWork2" class="form-check-input Main-Radio" value="@HolidayWork.WorkInHolidays" />
<label for="HolidayWork2" class="lableCheckBreakTime">پرسنل در ایام تعطیل رسمی کار می‌کند.</label>
</div>
</div>
</div>
<input type="hidden" id="GroupId" name="Command.CreateCustomizeEmployeeSettings.GroupId" value="" />
</div>
</div>
</div>
</div>
<script src="~/assetsclient/pages/employees/js/WorkshopSettingGrouping.js?ver=@clientVersion"></script>

View File

@@ -10,8 +10,54 @@
@section Styles {
<link href="~/AssetsClient/css/table-style.css?ver=?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/table-responsive.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/assetsclient/css/operation-button.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/assetsclient/css/rollcall-list.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/assetsclient/css/operation-button.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/select2.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/assetsclient/css/rollcall-list.css?ver=@clientVersion" rel="stylesheet" />
<style>
.btnAdd {
background-color: #84CC16;
border-radius: 7px;
padding: 3px 12px;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 24px;
color: #fff;
margin: 4px 0;
}
@@media (max-width: 992px) {
.btnAdd {
margin:0 .4rem;
}
}
@@media (max-width: 768px) {
.btnAdd {
margin:0;
}
}
.pendingPersonnel{
background-color: #FEFCE8 !important;
border: 1px solid #EAB308 !important;
}
.pendingPersonnelStatus {
color: #854D0E;
font-weight: 700;
}
.colorSpan {
color: #0B5959 !important;
background: #C7F8F8 !important;
}
.colorDiv {
}
</style>
}
<div class="content-container">
@@ -84,42 +130,52 @@
</div>
</div>
<div class="row px-lg-2 p-auto">
<div class="wrapper bg-white my-1 list-box table-rollcall">
@if (@Model.HasEmployees)
{
<div class="Rtable Rtable--collapse">
<div class="Rtable-row Rtable-row--head align-items-center sticky">
<div class="Rtable-cell column-heading width1">ردیف</div>
<div class="Rtable-cell column-heading width2">نام و نام خانوادگی</div>
<div class="Rtable-cell column-heading width3">کد ملی</div>
<div class="Rtable-cell column-heading width4">وضعیت عکس</div>
<div class="Rtable-cell column-heading width5 text-end">عملیات</div>
</div>
<div class="row px-lg-2 p-auto">
<div class="wrapper bg-white my-1 list-box table-rollcall">
<button class="btnAdd" id="addEmployee" onclick="openCreateEmployeeModal()">
<span>
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="11" cy="11" r="8.25" stroke="white"/>
<path d="M11 13.75L11 8.25" stroke="white" stroke-linecap="round"/>
<path d="M13.75 11L8.25 11" stroke="white" stroke-linecap="round"/>
</svg>
</span>
ایجاد پرسنل
</button>
@if (@Model.HasEmployees)
{
<div class="Rtable Rtable--collapse">
<div class="Rtable-row Rtable-row--head align-items-center sticky">
<div class="Rtable-cell column-heading width1">ردیف</div>
<div class="Rtable-cell column-heading width2">نام و نام خانوادگی</div>
<div class="Rtable-cell column-heading width3">کد ملی</div>
<div class="Rtable-cell column-heading width4">وضعیت عکس</div>
<div class="Rtable-cell column-heading width5 text-end">عملیات</div>
</div>
<div id="loadingSkeleton" style="display: contents;">
@for (int j = 0; j < 30; j++)
{
<div class="skeleton-loader" style="margin: 2px 0 !important;"></div>
}
</div>
<div id="loadingSkeleton" style="display: contents;">
@for (int j = 0; j < 30; j++)
{
<div class="skeleton-loader" style="margin: 2px 0 !important;"></div>
}
</div>
<div class="Rtable Rtable--collapse w-100" id="ajaxDataLoad">
<div class="Rtable Rtable--collapse w-100" id="ajaxDataLoad">
</div>
</div>
}
else
{
<div class="text-center bg-white d-flex align-items-center justify-content-center">
<div class="">
<img src="~/assetsclient/images/empty.png" alt="" class="img-fluid" />
<h5>اطلاعاتی وجود ندارد.</h5>
</div>
</div>
}
</div>
</div>
</div>
</div>
}
else
{
<div class="text-center bg-white d-flex align-items-center justify-content-center">
<div class="">
<img src="~/assetsclient/images/empty.png" alt="" class="img-fluid"/>
<h5>اطلاعاتی وجود ندارد.</h5>
</div>
</div>
}
</div>
</div>
</div>
</div>
@@ -141,6 +197,7 @@
var checkModalTakeImageAjax = `@Url.Page("EmployeeUploadPicture", "CheckModalTakeImage")`;
var deActivePersonnelAjax = `@Url.Page("./EmployeeUploadPicture", "DeActivePersonnel")`;
var activePersonnelAjax = `@Url.Page("./EmployeeUploadPicture", "ActivePersonnel")`;
</script>
<script src="~/assetsclient/pages/rollcall/js/employeeuploadpicture.js?ver=@clientVersion"></script>
<script src="~/assetsclient/pages/rollcall/js/employeeuploadpicture.js?ver=@clientVersion"></script>
}

View File

@@ -1,483 +0,0 @@
@page
@using Version = _0_Framework.Application.Version
@model ServiceHost.Areas.Client.Pages.Company.Workshop.EmployeesModel
@{
Layout = "Shared/_ClientLayout";
ViewData["title"] = " - لیست کل پرسنل";
int index = 1;
}
@section Styles {
<link href="~/AssetsClient/css/table-style.css?ver=@Version.StyleVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/table-responsive.css?ver=@Version.StyleVersion" rel="stylesheet" />
<link href="~/assetsclient/css/operation-button.css?ver=@Version.StyleVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/filter-search.css?ver=@Version.StyleVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/card.css?ver=@Version.StyleVersion" rel="stylesheet" />
}
<div class="content-container">
<div class="container-fluid">
<div class="row p-2">
<div class="col p-0 m-0 d-flex align-items-center justify-content-between">
<div class="col d-flex align-items-center justify-content-start">
<img src="~/AssetsClient/images/icons/list-info-personnel.png" alt="" class="img-fluid me-2" style="width: 45px;" />
<div>
<h4 class="title d-flex align-items-center">عملیات مربوط به پرسنل</h4>
<div>@Model.WorkshopFullName</div>
</div>
</div>
<div>
<a asp-page="/Company/Workshop/Index" class="back-btn" type="button">
<span>بازگشت</span>
</a>
</div>
</div>
</div>
</div>
<form role="form" method="get" name="search-theme-form1" id="search-theme-form1" autocomplete="off">
<input type="hidden" name="id" value="@Model.WorkshopId" />
<div class="container-fluid d-none d-md-block">
<div class="row px-2">
<div class="search-box card">
<div class="row">
<div class="col-12">
<div class="d-grid search-personal-section gap-2">
<div class="d-grid grid-cols-2 gap-2 col-span-4">
<div><input type="text" asp-for="SearchModel.EmployeeFullName" id="EmployeeFullName" class="form-control" placeholder="نام پرسنل"></div>
<div><input type="text" asp-for="SearchModel.NationalCode" id="NationalCode" class="form-control" placeholder="کد ملی پرسنل"></div>
</div>
<div class="d-flex gap-2 col-span-2">
<button class="btn-search btn-w-size btn-search-click text-nowrap d-flex align-items-center justify-content-center" id="searchBtn" type="submit">
<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>
<a href="/Client/Company/Workshop/Employees" class="btn-clear-filter btn-w-size text-nowrap d-flex align-items-center justify-content-center disable" id="filterRemove">
<span>حذف جستجو</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
<div class="container-fluid">
<!-- Advance Search Box -->
<div class="d-block d-md-none mb-1">
<div class="row d-flex align-items-center justify-content-between">
<div class="search-box bg-white p-2">
<div class="d-flex justify-content-between text-center">
<button class="btn-search w-100" 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>
@if (@Model.HasEmployees)
{
<div class="d-flex justify-content-between mt-1">
<button type="button" onclick="printAllPersonnelList()" class="btn-view-all text-nowrap align-items-center w-50">
<span>پرینت تجمیعی پرسنل</span>
</button>
<button type="button" onclick="printAllPersonnelInfoMobile(@Model.WorkshopId)" class="btn-view-all text-nowrap align-items-center w-50 ms-1">
<span>پرینت گروهی تفکیکی پرسنل</span>
</button>
</div>
}
</div>
</div>
</div>
<!-- End Advance Search Box -->
<div class="row p-lg-2">
@if (@Model.HasEmployees)
{
<div class="card personalListModal p-2">
<div class="personal-info-list">
<div class="container-fluid d-none d-md-block">
<div class="row">
<div class="d-none d-md-flex align-items-center justify-content-between my-1 px-1">
<div>
<p class="m-0">لیست پرسنل</p>
</div>
<div class="d-flex align-items-center gap-2">
<button onclick="printAllPersonnelList()" class="btn-print-all text-nowrap" type="button">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M15.0001 11.2493H15.139C16.0279 11.2493 16.4723 11.2493 16.759 10.9866C16.7805 10.967 16.801 10.9464 16.8207 10.9249C17.0834 10.6382 17.0834 10.1938 17.0834 9.3049V9.3049C17.0834 7.52714 17.0834 6.63826 16.558 6.06484C16.5187 6.02194 16.4775 5.98077 16.4346 5.94146C15.8612 5.41602 14.9723 5.41602 13.1945 5.41602H6.91675C5.03113 5.41602 4.08832 5.41602 3.50253 6.0018C2.91675 6.58759 2.91675 7.5304 2.91675 9.41602V10.2493C2.91675 10.7208 2.91675 10.9565 3.06319 11.1029C3.20964 11.2493 3.44534 11.2493 3.91675 11.2493H5.00008" stroke="#1E293B"/>
<path d="M5.41675 16.3903L5.41675 9.91732C5.41675 8.97451 5.41675 8.5031 5.70964 8.21021C6.00253 7.91732 6.47394 7.91732 7.41675 7.91732L12.5834 7.91732C13.5262 7.91732 13.9976 7.91732 14.2905 8.21021C14.5834 8.5031 14.5834 8.97451 14.5834 9.91732L14.5834 16.3903C14.5834 16.7068 14.5834 16.8651 14.4796 16.9399C14.3758 17.0148 14.2256 16.9647 13.9253 16.8646L12.2572 16.3086C12.1712 16.2799 12.1282 16.2656 12.0839 16.2669C12.0396 16.2682 11.9975 16.285 11.9134 16.3187L10.1858 17.0097C10.0941 17.0464 10.0482 17.0647 10.0001 17.0647C9.95194 17.0647 9.90609 17.0464 9.81439 17.0097L8.0868 16.3187C8.00267 16.285 7.9606 16.2682 7.91627 16.2669C7.87194 16.2656 7.82896 16.2799 7.74299 16.3086L6.07486 16.8646C5.77455 16.9647 5.62439 17.0148 5.52057 16.9399C5.41675 16.8651 5.41675 16.7068 5.41675 16.3903Z" stroke="#1E293B"/>
<path d="M7.91675 11.25L11.2501 11.25" stroke="#1E293B" stroke-linecap="round"/>
<path d="M7.91675 13.75L12.0834 13.75" stroke="#1E293B" stroke-linecap="round"/>
<path d="M14.5834 5.41732V5.41732C14.5834 3.97799 14.5834 3.25833 14.1954 2.76756C14.1087 2.65791 14.0095 2.55874 13.8998 2.47204C13.4091 2.08398 12.6894 2.08398 11.2501 2.08398H8.75008C7.31076 2.08398 6.5911 2.08398 6.10032 2.47204C5.99068 2.55874 5.8915 2.65791 5.8048 2.76756C5.41675 3.25833 5.41675 3.97799 5.41675 5.41732V5.41732" stroke="#1E293B"/>
</svg>
<span>پرینت تجمیعی پرسنل</span>
</button>
<button onclick="printAllPersonnelInfo(@Model.WorkshopId)" class="btn-print-all text-nowrap" type="button" data-title="پرینت گروهی" data-intro="شما برای گرفتن پرینت گروهی ابتدا باید ردیف را انتخاب کنید و سپس دکمه پرینت گروهی بزنید.">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M15.0001 11.2493H15.139C16.0279 11.2493 16.4723 11.2493 16.759 10.9866C16.7805 10.967 16.801 10.9464 16.8207 10.9249C17.0834 10.6382 17.0834 10.1938 17.0834 9.3049V9.3049C17.0834 7.52714 17.0834 6.63826 16.558 6.06484C16.5187 6.02194 16.4775 5.98077 16.4346 5.94146C15.8612 5.41602 14.9723 5.41602 13.1945 5.41602H6.91675C5.03113 5.41602 4.08832 5.41602 3.50253 6.0018C2.91675 6.58759 2.91675 7.5304 2.91675 9.41602V10.2493C2.91675 10.7208 2.91675 10.9565 3.06319 11.1029C3.20964 11.2493 3.44534 11.2493 3.91675 11.2493H5.00008" stroke="#1E293B"/>
<path d="M5.41675 16.3903L5.41675 9.91732C5.41675 8.97451 5.41675 8.5031 5.70964 8.21021C6.00253 7.91732 6.47394 7.91732 7.41675 7.91732L12.5834 7.91732C13.5262 7.91732 13.9976 7.91732 14.2905 8.21021C14.5834 8.5031 14.5834 8.97451 14.5834 9.91732L14.5834 16.3903C14.5834 16.7068 14.5834 16.8651 14.4796 16.9399C14.3758 17.0148 14.2256 16.9647 13.9253 16.8646L12.2572 16.3086C12.1712 16.2799 12.1282 16.2656 12.0839 16.2669C12.0396 16.2682 11.9975 16.285 11.9134 16.3187L10.1858 17.0097C10.0941 17.0464 10.0482 17.0647 10.0001 17.0647C9.95194 17.0647 9.90609 17.0464 9.81439 17.0097L8.0868 16.3187C8.00267 16.285 7.9606 16.2682 7.91627 16.2669C7.87194 16.2656 7.82896 16.2799 7.74299 16.3086L6.07486 16.8646C5.77455 16.9647 5.62439 17.0148 5.52057 16.9399C5.41675 16.8651 5.41675 16.7068 5.41675 16.3903Z" stroke="#1E293B"/>
<path d="M7.91675 11.25L11.2501 11.25" stroke="#1E293B" stroke-linecap="round"/>
<path d="M7.91675 13.75L12.0834 13.75" stroke="#1E293B" stroke-linecap="round"/>
<path d="M14.5834 5.41732V5.41732C14.5834 3.97799 14.5834 3.25833 14.1954 2.76756C14.1087 2.65791 14.0095 2.55874 13.8998 2.47204C13.4091 2.08398 12.6894 2.08398 11.2501 2.08398H8.75008C7.31076 2.08398 6.5911 2.08398 6.10032 2.47204C5.99068 2.55874 5.8915 2.65791 5.8048 2.76756C5.41675 3.25833 5.41675 3.97799 5.41675 5.41732V5.41732" stroke="#1E293B"/>
</svg>
<span>پرینت گروهی تفکیکی پرسنل</span>
</button>
</div>
</div>
</div>
</div>
<div class="Rtable Rtable--5cols Rtable--collapse">
<div class="Rtable-row Rtable-row--head align-items-center sticky-div">
<div class="Rtable-cell column-heading width1">ردیف</div>
<div class="Rtable-cell column-heading width2">نام پرسنل</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width3">شماره پرسنلی</div>
<div class="Rtable-cell column-heading d-md-block d-none width4">وضعیت تاهل</div>
<div class="Rtable-cell column-heading d-md-block d-none width5">شماره ملی</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width6">شماره شناسنامه</div>
<div class="Rtable-cell column-heading d-md-block d-none width7">تاریخ تولد</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width8">نام پدر</div>
<div class="Rtable-cell column-heading d-md-block d-none width9">تعداد فرزند</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width12">آخرین تاریخ شروع بکار قرارداد</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width13">تاریخ ترک کار قرارداد</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width14">آخرین تاریخ شروع بکار بیمه</div>
<div class="Rtable-cell column-heading d-xxl-block d-none width15">تاریخ ترک کار بیمه</div>
<div class="Rtable-cell column-heading width10">دارای قرارداد</div>
<div class="Rtable-cell column-heading width11">دارای بیمه</div>
<div class="Rtable-cell column-heading width16"></div>
</div>
@foreach (var item in @Model.Employees.PersonnelInfoViewModels)
{
<div class="Rtable-row align-items-center openAction @(item.Black ? "withdraw" : "") " id="EmployeesListIntro">
<div class="Rtable-cell width1">
<div class="Rtable-cell--content">
<span class="d-flex justify-content-center">
@index
<div class="d-none idPersonnel">@item.EmployeeId</div>
</span>
</div>
@{
index++;
}
</div>
<div class="Rtable-cell width2">
<div class="Rtable-cell--content text-start">@item.FullName</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width3">
<div class="Rtable-cell--content text-center">@item.PersonnelCode</div>
</div>
<div class="Rtable-cell d-md-block d-none width4">
<div class="Rtable-cell--content text-center">
@if (string.IsNullOrWhiteSpace(@item.MaritalStatus))
{
<div>-</div>
}
else
{
@item.MaritalStatus
}
</div>
</div>
<div class="Rtable-cell d-md-block d-none width5">
<div class="Rtable-cell--content text-center">@item.NationalCode</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width6">
<div class="Rtable-cell--content text-center">@item.IdNumber</div>
</div>
<div class="Rtable-cell d-md-block d-none width7">
<div class="Rtable-cell--content text-center">@item.DateOfBirthFa</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width8">
<div class="Rtable-cell--content text-start">@item.FatherName</div>
</div>
<div class="Rtable-cell d-md-block d-none width9">
<div class="Rtable-cell--content text-center">@item.ChildrenList.Count()</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width12">
<div class="Rtable-cell--content text-center">
@if (string.IsNullOrWhiteSpace(@item.LastStartContractWork))
{
<div>-</div>
}
else
{
@item.LastStartContractWork
}
</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width13">
<div class="Rtable-cell--content text-center">
@if (string.IsNullOrWhiteSpace(@item.LastLeftContractWork))
{
<div>-</div>
}
else
{
@item.LastLeftContractWork
}
</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width14">
<div class="Rtable-cell--content text-center">
@if (string.IsNullOrWhiteSpace(@item.LastStartInsuranceWork))
{
<div>-</div>
}
else
{
@item.LastStartInsuranceWork
}
</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width15">
<div class="Rtable-cell--content text-center">
@if (string.IsNullOrWhiteSpace(@item.LastLeftInsuranceWork))
{
<div>-</div>
}
else
{
@item.LastLeftInsuranceWork
}
</div>
</div>
<div class="Rtable-cell width10">
<div class="Rtable-cell--content text-center">
@if (@item.ContractPerson)
{
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9" fill="#BEF264"/>
<path d="M12 21C14.0822 21 16.1 20.278 17.7095 18.9571C19.3191 17.6362 20.4209 15.798 20.8271 13.7558C21.2333 11.7136 20.9188 9.59376 19.9373 7.75743C18.9558 5.9211 17.3679 4.48191 15.4442 3.68508C13.5205 2.88826 11.38 2.78311 9.38744 3.38754C7.3949 3.99197 5.67358 5.26858 4.51677 6.99987C3.35997 8.73115 2.83925 10.81 3.04334 12.8822C3.24743 14.9543 4.1637 16.8916 5.63604 18.364" stroke="#3F6212" stroke-width="1.2" stroke-linecap="round"/>
<path d="M16 10L12.402 14.3175C11.7465 15.1042 11.4187 15.4976 10.9781 15.5176C10.5375 15.5375 10.1755 15.1755 9.45139 14.4514L8 13" stroke="#3F6212" stroke-width="1.2" stroke-linecap="round"/>
</svg>
}
else
{
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9" fill="#FCA5A5"/>
<path d="M12 21C14.0822 21 16.1 20.278 17.7095 18.9571C19.3191 17.6362 20.4209 15.798 20.8271 13.7558C21.2333 11.7136 20.9188 9.59376 19.9373 7.75743C18.9558 5.9211 17.3679 4.48191 15.4442 3.68508C13.5205 2.88826 11.38 2.78311 9.38744 3.38754C7.3949 3.99197 5.67358 5.26858 4.51677 6.99987C3.35997 8.73115 2.83925 10.81 3.04334 12.8822C3.24743 14.9543 4.1637 16.8916 5.63604 18.364" stroke="#B91C1C" stroke-width="1.2" stroke-linecap="round"/>
<path d="M8 12H16" stroke="#B91C1C" stroke-width="1.2" stroke-linecap="round"/>
</svg>
}
</div>
</div>
<div class="Rtable-cell width11">
<div class="Rtable-cell--content text-center">
@if (@item.InsurancePerson)
{
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9" fill="#BEF264"/>
<path d="M12 21C14.0822 21 16.1 20.278 17.7095 18.9571C19.3191 17.6362 20.4209 15.798 20.8271 13.7558C21.2333 11.7136 20.9188 9.59376 19.9373 7.75743C18.9558 5.9211 17.3679 4.48191 15.4442 3.68508C13.5205 2.88826 11.38 2.78311 9.38744 3.38754C7.3949 3.99197 5.67358 5.26858 4.51677 6.99987C3.35997 8.73115 2.83925 10.81 3.04334 12.8822C3.24743 14.9543 4.1637 16.8916 5.63604 18.364" stroke="#3F6212" stroke-width="1.2" stroke-linecap="round"/>
<path d="M16 10L12.402 14.3175C11.7465 15.1042 11.4187 15.4976 10.9781 15.5176C10.5375 15.5375 10.1755 15.1755 9.45139 14.4514L8 13" stroke="#3F6212" stroke-width="1.2" stroke-linecap="round"/>
</svg>
}
else
{
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9" fill="#FCA5A5"/>
<path d="M12 21C14.0822 21 16.1 20.278 17.7095 18.9571C19.3191 17.6362 20.4209 15.798 20.8271 13.7558C21.2333 11.7136 20.9188 9.59376 19.9373 7.75743C18.9558 5.9211 17.3679 4.48191 15.4442 3.68508C13.5205 2.88826 11.38 2.78311 9.38744 3.38754C7.3949 3.99197 5.67358 5.26858 4.51677 6.99987C3.35997 8.73115 2.83925 10.81 3.04334 12.8822C3.24743 14.9543 4.1637 16.8916 5.63604 18.364" stroke="#B91C1C" stroke-width="1.2" stroke-linecap="round"/>
<path d="M8 12H16" stroke="#B91C1C" stroke-width="1.2" stroke-linecap="round"/>
</svg>
}
</div>
</div>
<div class="Rtable-cell width16">
<div class="Rtable-cell--content text-center">
<button class="btn-print" type="button" onclick="location.href='#showmodal=@Url.Page("./Employees", "PrintOnePersonnelInfo", new { employeeId = @item.EmployeeId })';">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor">
<path d="M15.0001 11.2493H15.139C16.0279 11.2493 16.4723 11.2493 16.759 10.9866C16.7805 10.967 16.801 10.9464 16.8207 10.9249C17.0834 10.6382 17.0834 10.1938 17.0834 9.3049V9.3049C17.0834 7.52714 17.0834 6.63826 16.558 6.06484C16.5187 6.02194 16.4775 5.98077 16.4346 5.94146C15.8612 5.41602 14.9723 5.41602 13.1945 5.41602H6.91675C5.03113 5.41602 4.08832 5.41602 3.50253 6.0018C2.91675 6.58759 2.91675 7.5304 2.91675 9.41602V10.2493C2.91675 10.7208 2.91675 10.9565 3.06319 11.1029C3.20964 11.2493 3.44534 11.2493 3.91675 11.2493H5.00008"></path>
<path d="M5.41675 16.3903L5.41675 9.91732C5.41675 8.97451 5.41675 8.5031 5.70964 8.21021C6.00253 7.91732 6.47394 7.91732 7.41675 7.91732L12.5834 7.91732C13.5262 7.91732 13.9976 7.91732 14.2905 8.21021C14.5834 8.5031 14.5834 8.97451 14.5834 9.91732L14.5834 16.3903C14.5834 16.7068 14.5834 16.8651 14.4796 16.9399C14.3758 17.0148 14.2256 16.9647 13.9253 16.8646L12.2572 16.3086C12.1712 16.2799 12.1282 16.2656 12.0839 16.2669C12.0396 16.2682 11.9975 16.285 11.9134 16.3187L10.1858 17.0097C10.0941 17.0464 10.0482 17.0647 10.0001 17.0647C9.95194 17.0647 9.90609 17.0464 9.81439 17.0097L8.0868 16.3187C8.00267 16.285 7.9606 16.2682 7.91627 16.2669C7.87194 16.2656 7.82896 16.2799 7.74299 16.3086L6.07486 16.8646C5.77455 16.9647 5.62439 17.0148 5.52057 16.9399C5.41675 16.8651 5.41675 16.7068 5.41675 16.3903Z"></path>
<path d="M7.91675 11.25L11.2501 11.25" stroke-linecap="round"></path>
<path d="M7.91675 13.75L12.0834 13.75" stroke-linecap="round"></path>
<path d="M14.5834 5.41732V5.41732C14.5834 3.97799 14.5834 3.25833 14.1954 2.76756C14.1087 2.65791 14.0095 2.55874 13.8998 2.47204C13.4091 2.08398 12.6894 2.08398 11.2501 2.08398H8.75008C7.31076 2.08398 6.5911 2.08398 6.10032 2.47204C5.99068 2.55874 5.8915 2.65791 5.8048 2.76756C5.41675 3.25833 5.41675 3.97799 5.41675 5.41732V5.41732"></path>
</svg>
</button>
</div>
</div>
</div>
<div class="operation-div w-100" style="margin: -2px 0 0 0;">
<div class="operations-btns">
<div class="container-fluid px-0">
<div class="row d-grid grid-personal align-items-center g-2">
<div class="col text-center">
<a class="loadingButton" onclick="location.href='#showmodal=@Url.Page("./Index", "PrintOnePersonnelInfo", new { employeeId = @item.EmployeeId })';" style="cursor:pointer" id="btnCardLeaveIntro">
<div class="card card-btn">
<div class="d-flex align-items-center justify-content-start p-1 imgP">
<img src="~/AssetsClient/images/personalList.png" alt="leave" class="img-fluid" width="50px"/>
<div class="text-start ms-2">
<div class="card-title">جزئیات پرسنل</div>
<p class="m-0 card-description d-none d-md-block">مشاهده و پرینت جزئیات پرسنل</p>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</div>
</a>
</div>
@* <div class="col text-center">
<a class="loadingButton" asp-page="/Company/Employees/Leave" asp-route-workshopId="@item.WorkshopId" asp-route-employeeId="@item.EmployeeId" style="cursor:pointer" id="btnCardLeaveIntro">
<div class="card card-btn">
<div class="d-flex align-items-center justify-content-start p-1 imgP">
<img src="~/AssetsClient/images/icons/leave.png" alt="leave" class="img-fluid" width="50px"/>
<div class="text-start ms-2">
<div class="card-title">عملیات مربوط به مرخصی</div>
<p class="m-0 card-description d-none d-md-block">لیست مرخصی - ثبت مرخصی</p>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</div>
</a>
</div> *@
<div class="col text-center">
<a class="loadingButton" onclick="location.href='#showmodal=@Url.Page("./Index", "LeaveCreate", new { employeeId = @item.EmployeeId, workshopId = @item.WorkshopId })';" style="cursor:pointer" id="btnCardLeaveIntro">
<div class="card card-btn">
<div class="d-flex align-items-center justify-content-start p-1 imgP">
<img src="~/AssetsClient/images/icons/leave.png" alt="leave" class="img-fluid" width="50px"/>
<div class="text-start ms-2">
<div class="card-title">ثبت مرخصی</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</div>
</a>
</div>
<div class="col text-center">
<a class="loadingButton" onclick="location.href='#showmodal=@Url.Page("./Index", "ContractCheckoutStatus", new { employeeId = @item.EmployeeId, workshopId = @item.WorkshopId })';" style="cursor:pointer" id="btnCardStatusIntro">
<div class="card card-btn">
<div class="d-flex align-items-center justify-content-start p-1 imgP">
<img src="~/AssetsClient/images/icons/statistics.png" alt="statistics" class="img-fluid" width="50px"/>
<div class="text-start ms-2">
<div class="card-title">گزارش وضعیت</div>
<p class="m-0 card-description d-none d-md-block">گزارش وضعیت قرارداد و تصفیه حساب</p>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
}
</div>
</div>
</div>
}
else
{
<div class="empty text-center bg-white d-flex align-items-center justify-content-center">
<div class="">
<img src="~/assetsclient/images/empty.png" alt="" class="img-fluid" />
<h5>اطلاعاتی وجود ندارد.</h5>
</div>
</div>
}
</div>
</div>
</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">
<form role="form" method="get" name="search-theme-form2" id="search-theme-form2" autocomplete="off">
<input type="hidden" name="id" value="@Model.WorkshopId" />
<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="col-12 text-start mb-4">
<div><input type="text" asp-for="SearchModel.EmployeeFullName" class="form-control" placeholder="نام پرسنل"></div>
<div><input type="text" asp-for="SearchModel.NationalCode" class="form-control" placeholder="کد ملی پرسنل"></div>
</div>
<div class="col-12">
<a href="/Client/Company/Workshop/Employees" class="btn-clear-filter py-2 text-center d-block w-100 mt-2" id="filterRemove">
<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 w-100">جستجو</button>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<!-- End Modal From Bottom For Advance Search -->
<div id="MainModal" class="modal fade personalListModal" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
<div class="modal-dialog modal-xxl modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content" id="ModalContent">
</div>
</div>
</div>
<input type="hidden" asp-for="@Model.HasEmployees" value="@Model.HasEmployees" id="hasEmployee"/>
@section Script {
<script src="~/assetsclient/js/site.js?ver=@Version.StyleVersion"></script>
<script src="~/assetsclient/workshop/js/employees.js"></script>
}

View File

@@ -1,75 +0,0 @@
using _0_Framework.Application;
using CompanyManagment.App.Contracts.Employee;
using CompanyManagment.App.Contracts.Workshop;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Security.Claims;
using Microsoft.AspNetCore.Authorization;
namespace ServiceHost.Areas.Client.Pages.Company.Workshop
{
[Authorize]
public class EmployeesModel : PageModel
{
private readonly IPasswordHasher _passwordHasher;
private readonly IWorkshopApplication _workshopApplication;
private readonly IEmployeeApplication _employeeApplication;
public PersonnelInfoViewModel Employees;
public bool HasEmployees;
public long WorkshopId;
public string WorkshopFullName;
public EmployeeSearchModel SearchModel;
public EmployeesModel(IPasswordHasher passwordHasher, IWorkshopApplication workshopApplication, IEmployeeApplication employeeApplication)
{
_passwordHasher = passwordHasher;
_workshopApplication = workshopApplication;
_employeeApplication = employeeApplication;
}
public void OnGet(EmployeeSearchModel searchModel)
{
var workshopSlugCliam = User.FindFirstValue("WorkshopSlug");
var id = _passwordHasher.SlugDecrypt(workshopSlugCliam);
if (id > 0)
{
var workshop = _workshopApplication.GetWorkshopInfo(id);
WorkshopFullName = workshop.WorkshopFullName;
WorkshopId = workshop.Id;
var personnelSearchModel = new PersonnelInfoSearchModel()
{
WorkshopId = id,
};
var result = _workshopApplication.GetPersonnelInfo(personnelSearchModel);
var r = result.GroupBy(x => x.EmployeeId).Select(x => x.First()).ToList();
if (!string.IsNullOrWhiteSpace(searchModel.EmployeeFullName))
r = r.Where(x => x.FullName.Contains(searchModel.EmployeeFullName)).ToList();
if (!string.IsNullOrWhiteSpace(searchModel.NationalCode))
r = r.Where(x => x.NationalCode.Contains(searchModel.NationalCode)).ToList();
Employees = new PersonnelInfoViewModel()
{
PersonnelInfoViewModels = r.OrderBy(x => x.Black ? 1 : 0).ThenBy(x => x.PersonnelCode).ToList(),
};
HasEmployees = Employees.PersonnelInfoViewModels.Count > 0 ? true : false;
}
else
{
NotFound();
}
}
public IActionResult OnGetPrintOnePersonnelInfo(long employeeId)
{
var result = _employeeApplication.GetDetails(employeeId);
return Partial("PrintOnePersonnelInfo", result);
}
}
}

View File

@@ -238,20 +238,6 @@
</div>
</a>
</div>
<div class="gwb-card" Permission="@SubAccountPermissionHelper.PersonnelListPermissionCode">
<a asp-page="/Company/Workshop/Employees" class="click loadingButton">
<div class="d-flex align-items-center justify-content-start p-1">
<img src="~/AssetsClient/images/icons/list-info-personnel.png" alt="" class="img-fluid mx-1" width="50px" />
<div class="text-start ms-1">
<div class="card-title">لیست کل پرسنل</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</a>
</div>
</div>
</div>
</div>

View File

@@ -1,9 +1,12 @@
@page
@using _0_Framework.Application
@using Version = _0_Framework.Application.Version
@model ServiceHost.Areas.Client.Pages.IndexModel
@{
<style>
string clientVersion = _0_Framework.Application.Version.StyleVersion;
<link href="~/AssetsClient/css/table-style.css?ver=@clientVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/table-responsive.css?ver=@clientVersion" rel="stylesheet" />
<style>
.btn-download-android {
width: 100%;
height: 76px;
@@ -132,7 +135,27 @@
</div>
</div>
<div Permission="@SubAccountPermissionHelper.CreateLoanPermissionCode" class="col-12 col-sm-12 col-md-6 col-lg-4 col-xl-3 col-xxl-2 mt-3 @(Model.HasCustomizeCheckoutService != "true" ? "d-none" : "")">
<div class="col-12 col-sm-12 col-md-6 col-lg-4 col-xl-3 col-xxl-2 mt-3">
<div class="card p-0">
<div class="card-section-btn">
<div class="content btn-group">
<button class="btn loadingButton" style="border-radius: 10px !important;" onclick="location.href='#showmodal=@Url.Page("./Company/Employees/EmployeeList", "CreateEmployee")';">
<svg width="50" height="50" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin: 0 0 0 10px;">
<path d="M12 10C14.2091 10 16 8.20914 16 6C16 3.79086 14.2091 2 12 2C9.79086 2 8 3.79086 8 6C8 8.20914 9.79086 10 12 10Z" fill="#23A8A8" />
<path opacity="0.5" d="M18.0947 15.0312C17.6699 15 17.1487 15 16.5 15C14.8501 15 14.0251 15 13.5126 15.5126C13 16.0251 13 16.8501 13 18.5C13 19.6663 13 20.4204 13.1811 20.9433C12.7971 20.9806 12.4025 21 12 21C8.13401 21 5 19.2091 5 17C5 14.7909 8.13401 13 12 13C14.6134 13 16.8924 13.8184 18.0947 15.0312Z" fill="#C4E8E8" />
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.5 22C14.8501 22 14.0251 22 13.5126 21.4874C13 20.9749 13 20.1499 13 18.5C13 16.8501 13 16.0251 13.5126 15.5126C14.0251 15 14.8501 15 16.5 15C18.1499 15 18.9749 15 19.4874 15.5126C20 16.0251 20 16.8501 20 18.5C20 20.1499 20 20.9749 19.4874 21.4874C18.9749 22 18.1499 22 16.5 22ZM17.0833 16.9444C17.0833 16.6223 16.8222 16.3611 16.5 16.3611C16.1778 16.3611 15.9167 16.6223 15.9167 16.9444V17.9167H14.9444C14.6223 17.9167 14.3611 18.1778 14.3611 18.5C14.3611 18.8222 14.6223 19.0833 14.9444 19.0833H15.9167V20.0556C15.9167 20.3777 16.1778 20.6389 16.5 20.6389C16.8222 20.6389 17.0833 20.3777 17.0833 20.0556V19.0833H18.0556C18.3777 19.0833 18.6389 18.8222 18.6389 18.5C18.6389 18.1778 18.3777 17.9167 18.0556 17.9167H17.0833V16.9444Z" fill="#23A8A8" />
</svg>
<p class="btn-title text-nowrap m-0">ثبت پرسنل جدید</p>
<div class="spinner-loading loading rounded-0" style="display: none;">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
</div>
</div>
<div Permission="@SubAccountPermissionHelper.CreateLoanPermissionCode" class="col-12 col-sm-12 col-md-6 col-lg-4 col-xl-3 col-xxl-2 mt-3 @(Model.HasCustomizeCheckoutService != "true" ? "d-none" : "")">
<div class="card p-0">
<div class="card-section-btn">
<div class="content btn-group">
@@ -245,7 +268,7 @@
@section Script {
<script src="~/assetsclient/js/site.js?ver=@Version.StyleVersion"></script>
<script src="~/assetsclient/js/site.js?ver=@clientVersion"></script>
<script>

View File

@@ -248,7 +248,6 @@
<None Include="Areas\Client\Pages\Company\Employees\EditLeave.cshtml" />
<None Include="Areas\Client\Pages\Company\Employees\EditPaidLeave.cshtml" />
<None Include="Areas\Client\Pages\Company\Employees\EditSick.cshtml" />
<None Include="Areas\Client\Pages\Company\Employees\EmployeeList.cshtml" />
<None Include="Areas\Client\Pages\Company\Employees\EmployeePayment.cshtml" />
<None Include="Areas\Client\Pages\Company\Employees\Index.cshtml" />
<None Include="Areas\Client\Pages\Company\Employees\Leave.cshtml" />
@@ -380,7 +379,6 @@
<None Include="Areas\Client\Pages\Company\Workshop\ContractCheckoutYearlyStatus.cshtml" />
<None Include="Areas\Client\Pages\Company\Workshop\Create.cshtml" />
<None Include="Areas\Client\Pages\Company\Workshop\Edit.cshtml" />
<None Include="Areas\Client\Pages\Company\Workshop\Employees.cshtml" />
<None Include="Areas\Client\Pages\Company\Workshop\Index.cshtml" />
<None Include="Areas\Client\Pages\Company\Workshop\LeaveListAll.cshtml" />
<None Include="Areas\Client\Pages\Company\Workshop\PrintOnePersonnelInfo.cshtml" />

View File

@@ -213,31 +213,61 @@
background-color: #2BBABA;
color: #ffffff;
font-size: 12px;
padding: 5px 12px;
padding: 3px 12px;
border-radius: 4px;
transition: all .3s ease-in;
white-space: nowrap;
width: 80px;
}
.btnUploadingPD:hover {
background-color: #248E8E;
}
.btnUploadingPD:hover {
background-color: #248E8E;
}
.btnDeletingPD {
background-color: #c76161;
color: #ffffff;
font-size: 12px;
padding: 5px 12px;
padding: 3px 12px;
border-radius: 4px;
transition: all .3s ease-in;
white-space: nowrap;
width: 80px;
}
.btnDeletingPD:hover {
background-color: #a54e4e;
}
.btnDeletingPD:hover {
background-color: #a54e4e;
}
.btnEditEmployee {
background-color: #169BCC;
color: #ffffff;
font-size: 12px;
padding: 3px 0px;
border-radius: 4px;
transition: all .3s ease-in;
white-space: nowrap;
width: 80px;
}
.btnDeletingPD:hover {
background-color: #148BB6;
}
.btnSendToChecker {
background-color: #59CB02;
color: #ffffff;
font-size: 12px;
padding: 3px 0px;
border-radius: 4px;
transition: all .3s ease-in;
white-space: nowrap;
width: 80px;
}
.btnSendToChecker:hover {
background-color: #4EB500;
}
.btnCreateNew {
font-size: 14px;

View File

@@ -0,0 +1,634 @@
#navbar-animmenu {
width: 20%;
padding: 0 0;
position: relative;
}
#navbar-animmenu ul {
background: #CAF5F5;
padding: 0;
margin: 0;
height: 700px;
}
#navbar-animmenu ul li a i {
margin-left: 10px;
}
#navbar-animmenu ul li span {
background-color: #dd2a2a;
width: 26px;
display: flex;
height: 26px;
align-items: center;
justify-content: center;
border-radius: 24px;
margin: 0 0 0 12px;
color: #fff;
font-size: 14px;
font-weight: 700;
}
#navbar-animmenu li {
list-style-type: none;
z-index: 4;
position: relative;
cursor: pointer;
}
#navbar-animmenu ul li a {
color: #484848;
text-decoration: none;
font-size: 15px;
line-height: 60px;
display: block;
padding: 0px 30px 0 20px;
transition-duration: 0.6s;
transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
position: relative;
}
#navbar-animmenu > ul > li.active > a {
color: #000000;
background-color: transparent;
transition: all 0.7s;
}
.countNumber {
margin: 0 0 0 12px;
font-size: 12px;
background-color: #dd2a2a;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 40px;
color: #fff;
font-weight: 600;
padding: 2px 0 0 0;
}
/* Vertical selector styling */
.verti-selector {
display: inline-block;
position: absolute;
width: 97%;
left: 0px;
transition-duration: 0.6s;
transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
background-color: #fff;
border-radius: 0 50px 50px 0;
/* border-top-right-radius: 15px;
border-bottom-right-radius: 15px;*/
height: 45px;
z-index: 3;
}
.verti-selector .top,
.verti-selector .bottom {
position: absolute;
width: 25px;
height: 25px;
background-color: #fff;
}
.verti-selector .top {
bottom: -25px;
left: 0;
}
.verti-selector .bottom {
top: -25px;
left: 0;
}
.verti-selector .top:before,
.verti-selector .bottom:before {
content: '';
position: absolute;
width: 50px;
height: 50px;
border-radius: 50%;
background-color: #CAF5F5;
}
.verti-selector .top.last-role::before {
background-color: #f5f5f5;
}
.verti-selector .top:before {
top: 0;
right: -25px;
}
.verti-selector .bottom:before {
bottom: 0;
right: -25px;
}
#accountList {
width: 80%;
background-color: #ffffff;
height: 700px;
overflow-y: scroll;
overflow-x: hidden;
}
.createRoleBox {
width: 100%;
background-color: #ffffff;
z-index: 6;
display: block !important;
position: relative;
padding: 11px 6px;
border-bottom: 2px solid transparent;
border-image: linear-gradient(to left, #B1B1B1, #FFFFFF);
border-image-slice: 1;
}
.sweet-alert button {
font-family: 'IRANYekanX';
}
.btn-create {
background: #84CC16;
border-radius: 7px;
padding: 4px 10px;
font-size: 13px;
color: #ffffff;
text-align: center;
color: #FFF;
text-align: center;
font-size: 11px;
font-style: normal;
font-weight: 400;
}
.btn-create:hover {
background: #71b112;
}
#hideCircle {
transition: border-radius 0.5s ease;
height: 80px;
background-color: #f5f5f5;
pointer-events: none;
}
.isActiveTxt {
background-color: #ECFCCB;
border: 1px solid #B3EB52;
border-radius: 50px;
padding: 3px 9px;
color: #0B5959;
font-size: 11px;
width: 70px;
text-align: center;
}
.btn-edit-role {
border: 1px solid transparent;
width: 30px;
height: 30px;
border-radius: 5px;
padding: 3px 1px;
color: #009EE2;
margin: auto 0 auto 1px;
/* background-color: #ffffff; */
background-color: rgba(52, 209, 209, 0.20);
box-shadow: 0;
transition: ease .2s;
}
.btn-edit-role:hover {
color: #ffffff;
/* background-color: #009EE2; */
background-color: rgba(52, 209, 209, 0.40);
}
.btn-delete-role {
border: 1px solid transparent;
width: 30px;
height: 30px;
border-radius: 5px;
padding: 3px 1px;
color: #FF5151;
margin: auto 1px auto 0;
background: rgba(209, 50, 50, 0.15);
transition: ease .2s;
}
.btn-delete-role:hover {
background-color: rgba(209, 50, 50, 0.25);
}
.btn-info {
border: 1px solid transparent;
width: 30px;
height: 30px;
border-radius: 5px;
padding: 3px 1px;
color: #009EE2;
margin: auto 0 auto 1px;
/* background-color: #ffffff; */
background-color: #B4DBFD;
box-shadow: 0;
transition: ease .2s;
}
.btn-info:hover {
background-color: #a2c8e9
}
.btn-info svg {
color: #3B82F6;
}
.close-btn-search {
position: absolute;
top: 50%;
left: 4px;
transform: translateY(-50%);
color: #fff;
background-color: #f87171;
width: 26px;
height: 26px;
display: flex;
align-items: center;
justify-content: center;
}
.Rtable--collapse .Rtable-row {
flex-wrap: nowrap;
padding: 1px;
}
.Rtable--collapse .Rtable-row.SubAccountRowMobile {
flex-wrap: nowrap;
padding: 1px;
outline: 1px solid #dddddd;
}
.roleTitle {
font-size: 12px;
font-weight: 500;
}
.roleName {
font-size: 16px;
font-weight: 700;
}
/********************************** Sub Account Table **********************************/
.rightHeaderMenu {
width: 20%;
display: flex;
align-items: center;
justify-content: space-between;
}
.leftHeaderMenu {
width: 80%;
display: flex;
align-items: center;
justify-content: space-between;
}
.subAccountHeaderList {
}
.roleSubaccountListMobile .width1 {
width: 10% !important;
}
.roleSubaccountListMobile .width2 {
width: 10% !important;
}
.roleSubaccountListMobile .width3 {
width: 10% !important;
}
.roleSubaccountListMobile .width4 {
width: 20% !important;
}
.roleSubaccountListMobile .width5 {
width: 20% !important;
}
.roleSubaccountListMobile .width6 {
width: 20% !important;
}
.roleSubaccountListMobile .width7 {
width: 10% !important;
}
.bgSubRow {
outline: transparent !important;
background-color: #CEF4F4 !important;
}
/********************************** Sub Account Table **********************************/
.switch {
position: relative;
display: inline-block;
width: 40px;
height: 24px;
}
/* Hide default HTML checkbox */
.switch input {
opacity: 0;
width: 0;
height: 0;
}
/* The slider */
.sliderEUP {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
transition: 0.4s;
border-radius: 24px;
}
/* Rounded slider */
.sliderEUP:before {
position: absolute;
content: "";
height: 20px;
width: 20px;
left: 2px;
bottom: 2px;
background-color: white;
transition: 0.4s;
border-radius: 50%;
}
/* Checked state */
input:checked + .sliderEUP {
background-color: #2FBFBF;
}
/* Move the slider to the right when checked */
input:checked + .sliderEUP:before {
transform: translateX(16px);
}
/* Disable state */
.disable + .sliderEUP {
background-color: #ccc;
cursor: not-allowed;
}
.disable + .sliderEUP:before {
background-color: #999;
}
.leftHeaderMenu .Rtable-cell.width1 {
width: 7%
}
.leftHeaderMenu .Rtable-cell.width2 {
width: 13%
}
.leftHeaderMenu .Rtable-cell.width3 {
width: 10%
}
.leftHeaderMenu .Rtable-cell.width4 {
width: 20%
}
.leftHeaderMenu .Rtable-cell.width5 {
width: 20%
}
.leftHeaderMenu .Rtable-cell.width6 {
width: 20%
}
.leftHeaderMenu .Rtable-cell.width7 {
width: 10%
}
.Rtable .workflow-list .width1 {
width: 7%
}
.Rtable .workflow-list .width2 {
width: 13%
}
.Rtable .workflow-list .width3 {
width: 10%
}
.Rtable .workflow-list .width4 {
width: 20%
}
.Rtable .workflow-list .width5 {
width: 20%
}
.Rtable .workflow-list .width6 {
width: 20%
}
.Rtable .workflow-list .width7 {
width: 10%
}
.btn-workflow-absent {
border: 1px solid transparent;
height: 30px;
border-radius: 5px;
padding: 3px 1px;
color: #FF5151;
margin: auto 1px auto 0;
background-color: #ffffff;
background: rgba(209, 50, 50, 0.15);
transition: ease .2s;
width: 55px;
}
.btn-workflow-rollcall-edit {
border: 1px solid transparent;
height: 30px;
border-radius: 5px;
padding: 3px 1px;
color: #009EE2;
margin: auto 0 auto 1px;
background-color: #ffffff;
background-color: rgba(52, 209, 209, 0.20);
transition: ease .2s;
width: 55px;
}
.btn-workflow-leave {
border: 1px solid transparent;
height: 30px;
border-radius: 5px;
padding: 3px 1px;
color: #d97706;
margin: auto 1px auto 0;
background-color: #ffffff;
background: rgba(217, 119, 6, 0.18);
transition: ease .2s;
width: 55px;
}
.btn-workflow-accept {
border: 1px solid transparent;
height: 30px;
border-radius: 5px;
padding: 3px 1px;
color: #65a30d;
margin: auto 1px auto 0;
background-color: #ffffff;
background: rgba(101, 163, 13, 0.15);
transition: ease .2s;
width: 55px;
}
.operations-btns-main {
padding: 15px;
width: 97%;
margin: 0 auto 10px;
display: none;
border-radius: 0px 0px 8px 8px;
background: #F1F5F9;
box-shadow: 0px 4px 5px 0px rgba(0, 0, 0, 0.03) inset;
}
.number-of-count {
background-color: #caf5f5;
margin: 0 10px 0 0;
border-radius: 5px;
display: inline-block;
padding: 0 5px;
color: #368686;
font-weight: 700;
}
.toggle {
cursor: pointer;
font-size: 12px;
}
.toggle svg {
stroke: #ffffff;
transition: transform 0.3s ease;
}
.toggle.open svg {
transform: rotate(-90deg);
}
@media (max-width: 1366px) {
#navbar-animmenu ul li a {
font-size: 13px;
font-weight: 700;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
#accountList {
height: 440px;
}
#navbar-animmenu ul {
height: 440px;
}
}
@media (max-width: 767px) {
.Rtable--collapse .Rtable-row {
outline: 1.8px solid #ddd !important;
}
.Rtable .workflow-list .width1 {
width: 5% !important;
}
.Rtable .workflow-list .width2 {
width: 50% !important;
}
.Rtable .workflow-list .width4 {
width: 20% !important;
}
.Rtable--collapse .Rtable-row .Rtable-cell .Rtable-cell--content {
text-align: right;
}
.btn-workflow-accept,
.btn-workflow-leave,
.btn-workflow-absent,
.btn-workflow-rollcall-edit {
width: 100%;
margin: 1px 0;
}
.employee-name {
font-weight: 800;
}
/* responsive Mobile */
#navbar-animmenu {
width: 100%;
}
#navbar-animmenu ul {
display: flex;
height: auto;
overflow: scroll;
}
.verti-selector {
display: none
}
#navbar-animmenu li.active {
background-color: #fff;
width: 100%;
}
#accountList {
width: 100%;
height: auto;
}
}
.preview-image {
width: 50px;
height: 35px;
border-radius: 8px;
}
.txtMonilePD {
display: none
}

View File

@@ -0,0 +1,275 @@
.errored {
animation: shake 300ms;
color: #eb3434 !important;
background-color: #fef2f2 !important;
border: 1px solid #eb3434 !important;
}
.titleForm {
background-color: #23A8A8;
padding: 5px;
width: 180px;
color: #ffffff;
font-weight: 600;
text-align: center;
white-space: nowrap;
}
.titleForm2 {
background-color: #23A8A8;
padding: 5px;
width: 191px;
color: #ffffff;
font-weight: 600;
text-align: center;
white-space: nowrap;
}
.form-group {
border-radius: 8px;
overflow: hidden;
border: 1px solid #199494;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.form-control {
border-color: transparent !important;
border-radius: 0;
}
.form-control:focus {
box-shadow: none !important;
border-color: transparent !important;
}
.mg-btn2s {
position: absolute;
left: 8px;
top: 8px;
}
.mg-btn2s2 {
position: absolute;
left: -10px;
top: 8px;
}
.details {
font-size: 13px;
line-height: 27px;
font-weight: 700;
margin-bottom: 10px;
}
.form-check-input {
outline: 1px solid #23A8A8 !important;
border: 1px solid white;
}
.form-check-input:checked[type=radio] {
--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
border-radius: 6px;
}
.form-check-input[type="radio"], .form-check-input[type="checkbox"] {
padding: 0 !important;
width: 20px;
height: 20px;
margin: 0 !important;
}
@media (max-width: 992px) {
.titleForm2 {
width: 100%;
}
.form-group {
display: block !important;
}
.titleForm {
width: 100%;
}
.mg-btn2s {
position: absolute;
left: 50%;
transform: translateX(-50%);
top: 45px;
justify-content: center;
}
.mg-btn2s2 {
justify-content: center;
transform: translateX(-50%);
position: absolute;
left: 50%;
top: 45px;
}
.buttonsActions {
margin: 0 !important;
}
.buttonsActionsParent {
width: 100%;
display: flex;
gap: 15px;
justify-content: center;
}
.titleForm, .titleForm2, .form-control {
padding: 0 !important;
}
.form-control {
border-color: transparent !important;
text-align: center;
}
.mg-btn2s {
top: 28px !important;
}
.mg-btn2s2 {
top: 28px !important;
}
.form-check-input[type="radio"], .form-check-input[type="checkbox"] {
width: 15px;
height: 15px;
}
.mg-btn {
padding: .4rem .5rem;
}
@media (max-width: 766px) {
.mg-btn2s {
position: absolute;
left: 50%;
transform: translateX(-50%);
top: 45px;
justify-content: center;
}
.mg-btn2s2 {
justify-content: center;
transform: translateX(-50%);
position: absolute;
left: 50%;
top: 45px;
}
.mg-btn2s {
top: 28px !important;
}
.mg-btn2s2 {
top: 28px !important;
width: 100% !important;
}
.form-check-input[type="radio"], .form-check-input[type="checkbox"] {
width: 12px;
height: 12px;
}
.form-group {
height: 60px !important;
}
.buttonsActionsParent {
margin-top: 4px;
}
.navbar-details-menu::-webkit-scrollbar {
display: none;
}
.navbar-details-menu {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
}
.mg-btn {
padding: .2rem .3rem;
}
.form-group {
height: 58px !important;
}
.form-control {
margin: 5px 0 !important;
border-radius: 5px;
text-align: center;
}
}
@media (max-width: 576px) {
.mg-btn2s {
position: absolute;
left: 50%;
transform: translateX(-50%);
top: 45px;
justify-content: center;
}
.mg-btn2s2 {
justify-content: center;
transform: translateX(-50%);
position: absolute;
left: 50%;
top: 45px;
}
.mg-btn2s {
top: 28px !important;
}
.mg-btn2s2 {
top: 28px !important;
width: 100% !important;
}
.form-check-input[type="radio"], .form-check-input[type="checkbox"] {
width: 12px;
height: 12px;
}
.form-group {
height: 60px !important;
}
.operationBtn {
width: 33%;
padding: .4rem 1rem;
background-color: #84CC16;
color: white;
border-radius: 6px;
}
.navbar-details-menu::-webkit-scrollbar {
display: none;
}
.navbar-details-menu {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
}
.form-group {
height: 58px !important;
}
.form-control {
margin: 5px 0 !important;
border-radius: 5px;
text-align: center;
}
}
}

View File

@@ -1,7 +1,7 @@
#MainModal {
backdrop-filter: blur(8px);
}
/*
.modal-dialog {
width: 60% !important;
}
@@ -13,7 +13,7 @@
.modal-content {
height: auto !important;
}
*/
.btn-cancel2 {
font-size: 14px;
font-weight: 500;
@@ -108,7 +108,7 @@
.table-content {
overflow-y: scroll;
height: 210px;
height: 300px;
margin-bottom: 10px;
scrollbar-width: thin;
scrollbar-color: #f2f2f2 transparent;
@@ -817,25 +817,12 @@ a:hover {
width: 70% !important;
}
.modal-content {
padding-bottom: 80px !important;
}
.main-title {
width: 300px;
font-size: 16px;
left: 55%;
}
.box {
top: 45px;
padding: 20px 35px;
}
.nav-tabs {
height: 285px;
}
.first-label,
.nav-title,
.last-titles {

View File

@@ -0,0 +1,354 @@
var lengthMenu = 0;
var loadFunctionLeftWork = true;
loadMenuAnime();
$(document).ready(function () {
CountWorkFlow();
loadWorkshopsForLeftWorkTemp();
$("#clickStartDateTab").click(function () {
if (loadFunctionLeftWork) {
loadWorkshopsForLeftWorkTemp();
}
});
});
function loadMenuAnime() {
var tabsNewAnim = $('#navbar-animmenu');
var selectorNewAnim = $('#navbar-animmenu').find('li').length;
var activeItemNewAnim = tabsNewAnim.find('.active');
var activeHeightNewAnimHeight = activeItemNewAnim.innerHeight();
var itemPosNewAnimTop = activeItemNewAnim.position();
$(".verti-selector").css({
"top": itemPosNewAnimTop.top + "px",
"height": activeHeightNewAnimHeight + "px"
});
$('.active').each(function () {
var targetForm = $(this).data('target');
$('#' + targetForm).show();
});
if (lengthMenu === 1) {
if ($('.main-navbar li').hasClass('lastRole')) {
$('.verti-selector .top').addClass('last-role');
$('#hideCircle').css('border-radius', '25px 0 0 0');
} else {
$('.verti-selector .top').removeClass('last-role');
$('#hideCircle').css('border-radius', '0 0 0 0');
}
}
$("#navbar-animmenu").on("click", "li", function (e) {
if ($(this).hasClass('lastRole')) {
//$('.verti-selector .top').addClass('last-role');
$('#hideCircle').css('border-radius', '25px 0 0 0');
} else {
//$('.verti-selector .top').removeClass('last-role');
$('#hideCircle').css('border-radius', '0 0 0 0');
}
$('#navbar-animmenu ul li').removeClass("active");
$(this).addClass('active');
var activeHeightNewAnimHeight = $(this).innerHeight();
var itemPosNewAnimTop = $(this).position();
$(".verti-selector").css({
"top": itemPosNewAnimTop.top + "px",
"height": activeHeightNewAnimHeight + "px"
});
$('.form-section').hide();
$('.accountListHead').text($(this).find('a').text());
var targetForm = $(this).data('target');
$('#' + targetForm).show();
});
//$("#navbar-animmenu").on("click", "li", function (e) {
// var targetForm = $(this).data('target');
// $('#navbar-animmenu ul li').removeClass("active");
// $(this).addClass('active');
// var activeHeightNewAnimHeight = $(this).innerHeight();
// var itemPosNewAnimTop = $(this).position();
// $(".verti-selector").stop(true, true).animate({
// "top": itemPosNewAnimTop.top + "px",
// "height": activeHeightNewAnimHeight + "px"
// }, 300); // انیمیشن با مدت زمان 300 میلی‌ثانیه
// $('.form-section').fadeOut(200);
// $('#' + targetForm).fadeIn(300); // انیمیشن تغییر صفحه
//});
}
$(document).on('click', ".openActionMain", function () {
$('.toggle').not($(this).find('.toggle')).removeClass('open');
$(this).next().find(".operations-btns-main").slideToggle(500);
$(".operations-btns-main").not($(this).next().find(".operations-btns-main")).slideUp(500);
$(this).find('.toggle').toggleClass('open');
});
$(document).on('click', ".openAction", function () {
if (window.matchMedia('(max-width: 768px)').matches) {
$(this).next().find(".operations-btns").slideToggle(500);
$(".operations-btns").not($(this).next().find(".operations-btns")).slideUp(500);
}
});
async function loadWorkshopsForLeftWorkTemp() {
$('#loadingSkeletonStartDate').show();
var mainIndexNum = 1;
var html = ``;
$.ajax({
async: true,
contentType: 'charset=utf-8',
dataType: 'json',
type: 'GET',
url: loadWorkshopsForLeftWorkTempUrl,
headers: { "RequestVerificationToken": antiForgeryToken },
success: function (response) {
var data = response.data;
$('#loadingSkeletonStartDate').hide();
if (response.success) {
if (data.length > 0) {
data.forEach(function (item) {
html += `
<div id="Main_${item.workshopId}" class="Rtable-row Rtable-row--head align-items-center d-flex sticky openActionMain" onclick="loadEmployeesForLeftWorkTemp('${item.workshopId}')" style="background: #58B3B3;border: none !important; cursor: pointer; ">
<div class="col-2 col-md-4 text-start">
<div class="Rtable-cell width1">
<div class="Rtable-cell--content">
<span class="d-flex justify-content-center align-items-center justify-content-center" style="background: #deffff;margin: 0 10px 0 0;">
${mainIndexNum++}
</span>
</div>
</div>
</div>
<div class="col-8 col-md-4 text-center d-flex">
<div class="col-4 text-center">
<div class="Rtable-cell column-heading text-end">
<span>${item.workshopName}</span>
</div>
</div>
<div class="col-4 text-start">
<div class="Rtable-cell column-heading text-center justify-content-center">
<span>${item.employerName}</span>
</div>
</div>
<div class="col-4 text-center">
<div class="Rtable-cell column-heading text-center justify-content-center">
<span class="number-of-count" id="EmployeeCountOfWorkshop_${item.workshopId}">${item.leftWorkEmployeesCount}</span>
</div>
</div>
</div>
<div class="col-2 col-md-4 text-end">
<span class="toggle">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 18L9 12L15 6" stroke-width="2" stroke-linecap="round" />
</svg>
</span>
</div>
</div>`;
html += `<div class="w-100 operation-div">
<div id="LeftWorkEmployee_${item.workshopId}" class="operations-btns-main workshopID_${item.workshopId}" style="padding: 1px 10px 0 10px; background: rgb(255, 255, 255); box-shadow: none;width: 100%;">
</div></div>`;
});
} else {
html += `<div class="container-fluid">
<div class="row p-lg-2 p-auto">
<div class="text-center bg-white d-flex align-items-center justify-content-center w-100">
<div class="">
<img src="/assetsclient/images/empty.png" alt="" class="img-fluid" />
<h5>اطلاعاتی وجود ندارد.</h5>
</div>
</div>
</div>
</div>`;
}
$('#loadStartDateWorkFlow').html(html);
loadFunctionLeftWork = false;
}
},
failure: function (response) {
console.log(response);
}
});
}
function loadEmployeesForLeftWorkTemp(id) {
var html = ``;
$.ajax({
async: true,
contentType: 'charset=utf-8',
dataType: 'json',
type: 'GET',
url: loadEmployeesForLeftWorkTempUrl,
data: { 'workshopId': id },
headers: { "RequestVerificationToken": antiForgeryToken },
success: function (response) {
var data = response.data;
if (response.success) {
if (data.length > 0) {
data.forEach(function (item, i) {
html += `<div></div>
<div class="Rtable-row align-items-center position-relative workflow-list employee-row" data-employee-id="${item.employeeId}">
<div class="Rtable-cell width1">
<div class="Rtable-cell--heading d-none">
ردیف
</div>
<div class="Rtable-cell--content">
<span class="d-flex justify-content-center align-items-center justify-content-center table-number">
${i + 1}
</span>
</div>
</div>
<div class="Rtable-cell width2">
<div class="Rtable-cell--heading d-none">نام پرسنل</div>
<div class="Rtable-cell--content employee-name">
${item.employeeName}
<p class="m-0 mt-2 d-block d-md-none"></p>
</div>
</div>
<div class="Rtable-cell width3 d-none d-md-block">
<div class="Rtable-cell--content text-center">
<div class="d-flex justify-content-center ms-1">
${item.leftWorkDate}
</div>
</div>
</div>
<div class="Rtable-cell width4 d-none d-md-block">
<div class="Rtable-cell--content text-center">
<div class="d-flex justify-content-center ms-1">
</div>
</div>
</div>
<div class="Rtable-cell width5 d-none d-md-block">
<div class="Rtable-cell--content text-center">
<div class="d-flex justify-content-center ms-1">
</div>
</div>
</div>
<div class="Rtable-cell width6 d-none d-md-block">
<div class="Rtable-cell--content text-center">
<div class="d-md-none d-none">پیغام: </div>
<div class="d-flex justify-content-center ms-1">
</div>
</div>
</div>
<div class="Rtable-cell position-relative width7 bg-filter d-flex justify-content-end">
<div class="Rtable-cell--content text-center d-block d-md-flex align-items-center gap-1 h-100">
<button class="btn-workflow-rollcall-edit position-relative" onclick="showModalLeftWork(${item.employeeId}, '${id}')">
<span class="mx-1">عملیات</span>
</button>
</div>
</div>
</div>`;
});
} else {
html += `<div class="container-fluid">
<div class="row p-lg-2 p-auto">
<div class="text-center bg-white d-flex align-items-center justify-content-center w-100">
<div class="">
<img src="/assetsclient/images/empty.png" alt="" class="img-fluid" />
<h5>اطلاعاتی وجود ندارد.</h5>
</div>
</div>
</div>
</div>`;
}
$(`.workshopID_${id}`).html(html);
}
},
failure: function (response) {
console.log(response);
}
});
}
function showModalLeftWork(employeeId, workshopId) {
var goTo = `#showmodal=/AdminNew/Company/WorkFlow/EmployeesLeftWork?handler=LeftWork&employeeId=${employeeId}&workshopId=${workshopId}`;
window.location.href = goTo;
}
async function CountWorkFlow() {
$.ajax({
dataType: 'json',
type: 'Get',
url: loadLeftWorkCount,
headers: { "RequestVerificationToken": antiForgeryToken },
success: function (response) {
if (response.success) {
$('.spinner-grow').hide();
$('#CountLeftDateLoading').hide();
if (response.dataLeftWorkCount === 0) {
$('#CountLeftDate').hide();
} else {
$('#CountLeftDate').text(response.dataLeftWorkCount);
$('#CountLeftDate').show();
}
} else {
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3500);
}
},
error: function (err) {
console.log(err);
}
});
}
function updateIndexesWorkFlow(dateDiv) {
let index = 1;
$(`#${dateDiv} .employee-row:visible .table-number`).each(function () {
$(this).text(index++);
});
}
function updateMainWorkFlow() {
let index = 1;
$(`#loadStartDateWorkFlow .Rtable-cell.width1 .table-number`).each(function () {
$(this).text(index++);
});
}

View File

@@ -4,7 +4,7 @@ var loadFunctionNewEmployee = true;
loadMenuAnime();
$(document).ready(function () {
//CountWorkFlowOfAbsentAndCut();
CountWorkFlow();
loadWorkshopsForEmployeeStartWork();
$("#clickStartDateTab").click(function () {
@@ -119,10 +119,10 @@ async function loadWorkshopsForEmployeeStartWork() {
$('#loadingSkeletonStartDate').hide();
if (response.success) {
if (data.result.length > 0) {
data.result.forEach(function (item) {
if (data.length > 0) {
data.forEach(function (item) {
html += `
<div id="absentMain_${item.workshopId}" class="Rtable-row Rtable-row--head align-items-center d-flex sticky openActionMain" onclick="loadClientEmployeesStartWork('${item.workshopId}')" style="background: #58B3B3;border: none !important; cursor: pointer; ">
<div id="Main_${item.workshopId}" class="Rtable-row Rtable-row--head align-items-center d-flex sticky openActionMain" onclick="loadClientEmployeesStartWork('${item.workshopId}')" style="background: #58B3B3;border: none !important; cursor: pointer; ">
<div class="col-2 col-md-4 text-start">
<div class="Rtable-cell width1">
<div class="Rtable-cell--content">
@@ -145,7 +145,7 @@ async function loadWorkshopsForEmployeeStartWork() {
</div>
<div class="col-4 text-center">
<div class="Rtable-cell column-heading text-center justify-content-center">
<span class="number-of-count">${item.addedEmployeesCount}</span>
<span class="number-of-count" id="EmployeeCountOfWorkshop_${item.workshopId}">${item.addedEmployeesCount}</span>
</div>
</div>
</div>
@@ -159,7 +159,7 @@ async function loadWorkshopsForEmployeeStartWork() {
</div>`;
html += `<div class="w-100 operation-div">
<div id="DocumentsAwaitingUpload_${item.workshopId}" class="operations-btns-main workshopID_${item.workshopId}" style="padding: 1px 10px 0 10px; background: rgb(255, 255, 255); box-shadow: none;width: 100%;">
<div id="StartWorkEmployee_${item.workshopId}" class="operations-btns-main workshopID_${item.workshopId}" style="padding: 1px 10px 0 10px; background: rgb(255, 255, 255); box-shadow: none;width: 100%;">
</div></div>`;
});
@@ -200,11 +200,11 @@ function loadClientEmployeesStartWork(id) {
var data = response.data;
if (response.success) {
if (data.result.length > 0) {
if (data.length > 0) {
data.result.forEach(function (item, i) {
data.forEach(function (item, i) {
html += `<div></div>
<div class="Rtable-row align-items-center position-relative workflow-list employee-row">
<div class="Rtable-row align-items-center position-relative workflow-list employee-row" data-employee-id="${item.employeeId}">
<div class="Rtable-cell width1">
<div class="Rtable-cell--heading d-none">
ردیف
@@ -269,7 +269,7 @@ function loadClientEmployeesStartWork(id) {
<div class="Rtable-cell position-relative width7 bg-filter d-flex justify-content-end">
<div class="Rtable-cell--content text-center d-block d-md-flex align-items-center gap-1 h-100">
<button class="btn-workflow-rollcall-edit position-relative" onclick="showModalLeftWork(${item.employeeId}, '${item.employeeName}')">
<button class="btn-workflow-rollcall-edit position-relative" onclick="showModalStartWork(${item.employeeId}, '${id}')">
<span class="mx-1">عملیات</span>
</button>
@@ -300,69 +300,28 @@ function loadClientEmployeesStartWork(id) {
});
}
function showModalLeftWork(employeeId, employeeName) {
var goTo = `#showmodal=/AdminNew/Company/WorkFlow/EmployeesNew?handler=LeftWork&employeeId=${employeeId}&employeeName=${employeeName}`;
function showModalStartWork(employeeId, workshopId) {
var goTo = `#showmodal=/AdminNew/Company/WorkFlow/EmployeesNew?handler=StartWork&employeeId=${employeeId}&workshopId=${workshopId}`;
window.location.href = goTo;
}
async function CountWorkFlow() {
$.ajax({
async: true,
dataType: 'json',
type: 'Get',
url: loadCountWorkFlowOfAbsentAndCut,
url: loadStartWorkCount,
headers: { "RequestVerificationToken": antiForgeryToken },
success: function (response) {
if (response.success) {
$('.spinner-grow').hide();
if (response.dataAbsent === 0) {
$('#CountAbsent').hide();
$('#CountAbsentMobile').hide();
$('#CountStartDateLoading').hide();
if (response.dataStartWorkCount === 0) {
$('#CountStartDate').hide();
} else {
$('#CountAbsent').show();
$('#CountAbsentMobile').show();
$('#CountAbsent').text(response.dataAbsent);
$('#CountAbsentMobile').text(response.dataAbsent);
}
if (response.dataCut === 0) {
$('#CountCut').hide();
$('#CountCutMobile').hide();
} else {
$('#CountCut').show();
$('#CountCutMobile').show();
$('#CountCut').text(response.dataCut);
$('#CountCutMobile').text(response.dataCut);
}
if (response.dataLunchBreak === 0) {
$('#CountLunchBreak').hide();
$('#CountLunchBreakMobile').hide();
} else {
$('#CountLunchBreak').show();
$('#CountLunchBreakMobile').show();
$('#CountLunchBreak').text(response.dataLunchBreak);
$('#CountLunchBreakMobile').text(response.dataLunchBreak);
}
if (response.dataUndefined === 0) {
$('#CountUndefined').hide();
$('#CountUndefinedMobile').hide();
} else {
$('#CountUndefined').show();
$('#CountUndefinedMobile').show();
$('#CountUndefined').text(response.dataUndefined);
$('#CountUndefinedMobile').text(response.dataUndefined);
}
if (response.dataOverlappingLeave === 0) {
$('#CountOverlappingLeave').hide();
$('#CountOverlappingLeaveMobile').hide();
} else {
$('#CountOverlappingLeave').show();
$('#CountOverlappingLeaveMobile').show();
$('#CountOverlappingLeave').text(response.dataOverlappingLeave);
$('#CountOverlappingLeaveMobile').text(response.dataOverlappingLeave);
$('#CountStartDate').text(response.dataStartWorkCount);
$('#CountStartDate').show();
}
} else {
@@ -388,20 +347,10 @@ function updateIndexesWorkFlow(dateDiv) {
});
}
function updateMainWorkFlow(dateDiv) {
let indexMain = 1;
function updateMainWorkFlow() {
let index = 1;
$(`#${dateDiv} .number-of-count`).each(function () {
var text = Number($(this).text());
$(this).text(text - 1);
if (text - 1 === 0) {
$(`#${dateDiv}`).next().remove();
$(`#${dateDiv}`).remove();
$(`.Rtable-cell.width1 .Rtable-cell--content span`).each(function () {
$(this).text(indexMain++);
});
}
$(`#loadStartDateWorkFlow .Rtable-cell.width1 .table-number`).each(function () {
$(this).text(index++);
});
}

View File

@@ -0,0 +1,147 @@
$(document).ready(function () {
$("#militaryStatus").select2({
language: "fa",
dir: "rtl",
minimumResultsForSearch: Infinity
});
$(".date").each(function () {
let element = $(this);
element.on('input', function () {
let value = convertPersianNumbersToEnglish(element.val());
element.val(value);
});
new Cleave(this, {
date: true,
delimiter: '/',
datePattern: ['Y', 'm', 'd']
});
});
});
$(".closeCustomModal").on('click', function() {
$('#customModal').removeClass('show');
});
$("#btnEditSaveEmployee").on('click', function () {
var gender = $("input[name='Command.Gender']:checked").val();
var nationality = $("input[name='Command.Nationality']:checked").val();
var firstName = $("#FName").val().trim();
var lastName = $("#LName").val().trim();
var nationalCode = $("#NationalCode").val().trim();
var idNumber = $("#IdNumber").val().trim();
var fatherName = $("#FatherName").val().trim();
var birthDate = $("#BirthDate").val().trim();
var maritalStatus = $("input[name='Command.MaritalStatus']:checked").val();
var militaryService = $("#militaryStatus").val();
if (!gender) {
validateField("input[name='Command.Gender']", "لطفا جنسیت را انتخاب کنید.");
return false;
}
if (!maritalStatus) {
validateField("input[name='Command.MaritalStatus']", "لطفا وضعیت تاهل را مشخص کنید.");
return false;
}
if (!nationality) {
validateField("input[name='Command.Nationality']", "لطفا ملیت را مشخص کنید.");
return false;
}
if (firstName === "") {
validateField("#FName", "لطفا نام را وارد کنید.");
return false;
}
if (lastName === "") {
validateField("#LName", "لطفا نام خانوادگی را وارد کنید.");
return false;
}
if (nationalCode === "") {
validateField("#NationalCode", "لطفا شماره ملی خود را وارد کنید.");
return false;
} else if (!/^\d{10}$/.test(nationalCode)) {
validateField("#NationalCode", "شماره ملی باید ۱۰ رقم باشد.");
return false;
}
if (idNumber === "") {
validateField("#IdNumber", "لطفا شماره شناسنامه را وارد کنید.");
return false;
}
if (fatherName === "") {
validateField("#FatherName", "لطفا نام خانوادگی را مشخص کنید.");
return false;
}
if (birthDate === "") {
validateField("#BirthDate", "لطفا تاریخ تولد را وارد کنید.");
return false;
} else if (!/^\d{4}[-\/]\d{2}[-\/]\d{2}$/.test(birthDate) || birthDate.length !== 10) {
validateField("#BirthDate", "تاریخ تولد را به درستی وارد کنید.");
return false;
}
if (militaryService === "") {
validateField("#militaryStatus", "لطفا نام خانوادگی را مشخص کنید.");
return false;
}
var loading = $('#btnEditSaveEmployee .spinner-loading');
$('#btnEditSaveEmployee').addClass('disable');
loading.show();
var data = $('#create-employee-form').serialize();
$.ajax({
async: true,
dataType: 'json',
type: 'POST',
url: saveEditEmployee,
data: data,
headers: { "RequestVerificationToken": `${antiForgeryToken}` },
success: function (response) {
if (response.success) {
$('.alert-success-msg').show();
$('.alert-success-msg p').text(response.message);
setTimeout(function () {
$('.alert-success-msg').hide();
$('.alert-success-msg p').text('');
}, 2000);
loading.hide();
$('#customModal').removeClass('show');
} else {
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3000);
loading.hide();
$('#btnEditSaveEmployee').removeClass('disable');
}
},
failure: function (response) {
console.log(5, response);
loading.hide();
}
});
});
function validateField(selector, message) {
$(selector).addClass("errored");
$('.alert-msg').show();
$('.alert-msg p').text(message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text("");
$(selector).removeClass("errored");
}, 3500);
}

View File

@@ -77,6 +77,9 @@ $(document).ready(function () {
$(this).addClass('discomplete');
$(this).find(".pdImageBox .sign").addClass("discompleteSign").html(rejectIcon);
$(this).find(".resultMessage").html(rejectMessage);
$(this).find(".btnEditEmployee").removeClass("disable");
$(this).find(".btnSendToChecker").removeClass("disable");
}
});
@@ -181,6 +184,28 @@ $(document).ready(function () {
});
$(document).off('click', '.btnSendToChecker').on('click', '.btnSendToChecker', function(event) {
event.preventDefault();
swal.fire({
title: "اخطار",
text: "آیا می‌خواهید این مورد را به ناظر ارسال کنید؟",
icon: "warning",
showCancelButton: true,
confirmButtonText: "بله",
cancelButtonText: "خیر",
confirmButtonColor: '#84cc16',
reverseButtons: true
}).then((result) => {
if (result.isConfirmed) {
sendToCheckerAjax();
$(this).addClass('disable');
} else {
$(this).removeClass('disable');
}
});
});
$(".exitModal").click(function () {
if (uploadFileCount > 0) {
swal.fire({
@@ -526,4 +551,8 @@ function cancelOP() {
showAlertMessage('.alert-msg', 'مشکلی در ارسال تصویر به وجود آمد.', 3500);
}
});
}
function sendToCheckerAjax() {
alert('anjam shod!!');
}

View File

@@ -0,0 +1,211 @@
$(document).ready(function () {
$("#NationalitySelect").select2({
language: "fa",
dir: "rtl"
});
$(".JobSelect2Option").select2({
language: "fa",
dir: "rtl",
ajax: {
url: jobsLoadEmployeeAjaxUrl,
dataType: 'json',
delay: 250,
data: function (params) {
return {
jobName: params.term
};
},
processResults: function (data) {
return {
results: data.map(item => ({
id: item.id,
text: item.jobName
}))
};
},
cache: false
},
minimumInputLength: 0,
dropdownParent: $('#MainModal')
});
if (selectJobId) {
var selectedOption = new Option(selectJobName, selectJobId, true, true);
$(".JobSelect2Option").append(selectedOption).trigger('change');
}
$(".date-input").mask("0000/00/00");
convertToJalaliAndAdjust('#LastDayStandingInput', '#LeftWorkInput', +1);
convertToJalaliAndAdjust('#LeftWorkInput', '#LastDayStandingInput', -1);
});
function convertToJalaliAndAdjust(inputSelector, targetSelector, change) {
$(inputSelector).on('input', function () {
let inputValue = $(this).val().trim();
let targetInput = $(targetSelector);
let parts = inputValue.split('/');
if (inputValue.length === 10) {
if (parts.length === 3) {
let year = parts[0];
let month = normalizeNumber(parts[1]);
let day = normalizeNumber(parts[2]);
if (isValidJalaliDate(year, month, day)) {
let gregorianDate = jalaali.toGregorian(parseInt(year), parseInt(month), parseInt(day));
if (isNaN(gregorianDate.gy) || isNaN(gregorianDate.gm) || isNaN(gregorianDate.gd)) {
console.error("Invalid Gregorian date conversion.");
return;
}
let date = new Date(gregorianDate.gy, gregorianDate.gm - 1, gregorianDate.gd);
date.setDate(date.getDate() + change);
let newJalaliDate = jalaali.toJalaali(date.getFullYear(), date.getMonth() + 1, date.getDate());
let formattedDate = newJalaliDate.jy + '/' +
('0' + newJalaliDate.jm).slice(-2) + '/' +
('0' + newJalaliDate.jd).slice(-2);
targetInput.val(formattedDate);
dayOfWeekLoad(this, inputValue);
dayOfWeekLoad(targetInput, targetInput.val());
}
}
} else {
//targetInput.val('');
//$('.lastDayStandingTxt').hide();
//$('.dayOfLeftWorkTxt').hide();
}
});
}
function normalizeNumber(num) {
return num.toString().padStart(2, '0');
}
function isValidJalaliDate(year, month, day) {
let isLeap = jalaali.isLeapJalaaliYear(year);
if (month < 1 || month > 12 || day < 1) return false;
if (month <= 6 && day > 31) return false;
if (month > 6 && month < 12 && day > 30) return false;
if (month === 12 && day > (isLeap ? 30 : 29)) return false;
return true;
}
function enableEdit() {
$('#LastDayStandingInput').prop('disabled', false);
$('#LeftWorkInput').prop('disabled', false);
$('#save').removeClass('disable');
$('#btnSaveData').addClass('disable');
}
$("#save").on('click', function () {
$('#LastDayStandingInput').prop('disabled', true);
$('#LeftWorkInput').prop('disabled', true);
$('#save').addClass('disable');
$('#btnSaveData').removeClass('disable');
$('#LastDayStandingTempSpan').text($('#LastDayStandingInput').val());
$('#LeftWorkTempSpan').text($('#LeftWorkInput').val());
$('#LastDayStandingValue').val($('#LastDayStandingInput').val());
$('#LeftWorkTempValue').val($('#LeftWorkInput').val());
});
$("#btnSaveData").on('click', function () {
var lastDayStandingInput = $('#LastDayStandingInput').val();
var leftWorkInput = $('#LeftWorkInput').val();
if (lastDayStandingInput === '' || lastDayStandingInput.length !== 10) {
$('.alert-msg').show();
$('.alert-msg p').text('لطفا تاریخ آخرین روز کاری را مشخص نمایید ...');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3500);
return false;
}
if (leftWorkInput === '' || leftWorkInput.length !== 10) {
$('.alert-msg').show();
$('.alert-msg p').text('لطفا تاریخ ترک کار را مشخص نمایید ...');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3500);
return false;
}
var loading = $('#btnSaveData .spinner-loading');
$('#btnSaveData').addClass('disable');
loading.show();
var data = $('#create-form').serialize();
$.ajax({
async: false,
dataType: 'json',
type: 'POST',
url: saveDataLeftWorkAjaxUrl,
data: data,
headers: { "RequestVerificationToken": `${antiForgeryToken}` },
success: function (response) {
if (response.success) {
$('.alert-success-msg').show();
$('.alert-success-msg p').text(response.message);
setTimeout(function () {
$('.alert-success-msg').hide();
$('.alert-success-msg p').text('');
}, 2000);
loading.hide();
var employeeSectionDiv = $(`[data-employee-id="${employeeId}"]`);
employeeSectionDiv.remove();
var employeeCountElement = $(`#EmployeeCountOfWorkshop_${workshopId}`);
var employeeNumberOfWorkshop = Number(employeeCountElement.text().trim());
employeeNumberOfWorkshop -= 1;
employeeCountElement.text(employeeNumberOfWorkshop);
if (employeeNumberOfWorkshop === 0) {
var mainElement = $(`#Main_${workshopId}`);
mainElement.next(".operation-div").remove();
mainElement.remove();
var countStartWorkElement = $(`#CountLeftDate`);
var countStartWork = Number(countStartWorkElement.text().trim());
countStartWork -= 1;
countStartWorkElement.text(countStartWork);
}
updateMainWorkFlow();
updateIndexesWorkFlow(`LeftWorkEmployee_${workshopId}`);
_RefreshWorkFlowCountMenu();
_RefreshCheckerCountMenu();
$('#MainModal').modal('toggle');
} else {
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3000);
loading.hide();
$('#btnSaveData').removeClass('disable');
}
},
failure: function (response) {
console.log(5, response);
loading.hide();
}
});
});

View File

@@ -0,0 +1,145 @@
$(document).ready(function () {
$("#NationalitySelect").select2({
language: "fa",
dir: "rtl"
});
$(".JobSelect2Option").select2({
language: "fa",
dir: "rtl",
ajax: {
url: jobsLoadEmployeeAjaxUrl,
dataType: 'json',
delay: 250,
data: function (params) {
return {
jobName: params.term
};
},
processResults: function (data) {
return {
results: data.map(item => ({
id: item.id,
text: item.jobName
}))
};
},
cache: false
},
minimumInputLength: 0,
dropdownParent: $('#MainModal')
});
if (selectJobId) {
var selectedOption = new Option(selectJobName, selectJobId, true, true);
$(".JobSelect2Option").append(selectedOption).trigger('change');
}
});
function enableEdit() {
$('#StartWorkInput').prop('disabled', false);
$('#save').removeClass('disable');
$('#btnSaveData').addClass('disable');
}
$("#save").on('click', function() {
$('#StartWorkInput').prop('disabled', true);
$('#save').addClass('disable');
$('#btnSaveData').removeClass('disable');
$('#StartWorkTemp').text($('#StartWorkInput').val());
$('#StartWorkTempValue').val($('#StartWorkInput').val());
});
$("#btnSaveData").on('click', function () {
var sematSelect = $("#sematSelect").val();
var startWorkInput = $('#StartWorkInput').val();
if (sematSelect === '0') {
$('.alert-msg').show();
$('.alert-msg p').text('لطفا سمت را انتخاب کنید ...');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3500);
return false;
}
if (startWorkInput === '') {
$('.alert-msg').show();
$('.alert-msg p').text('لطفا تاریخ شروع بکار را مشخص نمایید ...');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3500);
return false;
}
var loading = $('#btnSaveData .spinner-loading');
$('#btnSaveData').addClass('disable');
loading.show();
var data = $('#create-form').serialize();
$.ajax({
async: false,
dataType: 'json',
type: 'POST',
url: saveDataStartWorkAjaxUrl,
data: data,
headers: { "RequestVerificationToken": `${antiForgeryToken}` },
success: function (response) {
if (response.success) {
$('.alert-success-msg').show();
$('.alert-success-msg p').text(response.message);
setTimeout(function () {
$('.alert-success-msg').hide();
$('.alert-success-msg p').text('');
}, 2000);
loading.hide();
var employeeSectionDiv = $(`[data-employee-id="${employeeId}"]`);
employeeSectionDiv.remove();
var employeeCountElement = $(`#EmployeeCountOfWorkshop_${workshopId}`);
var employeeNumberOfWorkshop = Number(employeeCountElement.text().trim());
employeeNumberOfWorkshop -= 1;
employeeCountElement.text(employeeNumberOfWorkshop);
if (employeeNumberOfWorkshop === 0) {
var mainElement = $(`#Main_${workshopId}`);
mainElement.next(".operation-div").remove();
mainElement.remove();
var countStartWorkElement = $(`#CountStartDate`);
var countStartWork = Number(countStartWorkElement.text().trim());
countStartWork -= 1;
countStartWorkElement.text(countStartWork);
}
updateMainWorkFlow();
updateIndexesWorkFlow(`StartWorkEmployee_${workshopId}`);
_RefreshWorkFlowCountMenu();
_RefreshCheckerCountMenu();
$('#MainModal').modal('toggle');
} else {
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3000);
loading.hide();
$('#btnSaveData').removeClass('disable');
}
},
failure: function (response) {
console.log(5, response);
loading.hide();
}
});
});

View File

@@ -0,0 +1,51 @@
.modalCustom {
display: none;
position: fixed;
z-index: 9000;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 100%;
height: 100%;
overflow: auto;
background-color: rgb(0, 0, 0);
background-color: rgba(0, 0, 0, 0.4);
opacity: 0;
transition: opacity 0.5s ease;
}
.modalCustom.show {
display: block;
opacity: 1;
}
.modal-custom-content {
background-color: #fefefe;
padding: 20px;
width: 40%;
transition: transform 0.3s ease-in-out;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
border-radius: 20px;
}
/*.modalCustom.show .modal-custom-content {
transform: scale(1);
}
*/
/* Close button */
.close-custom {
color: #aaa;
float: right;
font-size: 28px;
font-weight: bold;
}
.close-custom:hover,
.close-custom:focus {
color: black;
text-decoration: none;
cursor: pointer;
}

View File

@@ -0,0 +1,21 @@
var modal = document.getElementById("customModal");
function LoadCustomPartial(url) {
$.get(url, null, function (htmlPage) {
$("#CustomContentHtml").html(htmlPage);
const container = document.getElementById("ModalContent");
const forms = container.getElementsByTagName("form");
const newForm = forms[forms.length - 1];
openModal();
});
}
function openModal() {
modal.classList.add('show');
}
//window.onclick = function (event) {
// if (event.target === modal) {
// modal.classList.remove('show');
// }
//}

View File

@@ -75,8 +75,6 @@
}
});
console.log(idlist);
var workshop_ID = Number(workshopId);
var goTo = `#showmodal=/Client/Company/Employees/Index?workshopID=${workshop_ID}&idlist=${idlist}&handler=PrintAllDetailsPersonnelInfo`;
window.location.href = goTo;

View File

@@ -0,0 +1,89 @@
/*.Modal-width {
max-width: 520px;
}*/
.errored {
animation: shake 300ms;
color: #eb3434 !important;
background-color: #fef2f2 !important;
border: 1px solid #eb3434 !important;
}
.select-alert {
border: 1px solid #FFFFFF;
}
.textLFontColor,
.form-control {
color: #797979;
font-size: 12px;
font-weight: 500;
}
.form-control::placeholder {
color: #94a3b8;
}
.textLFontColor span {
font-size: 16px;
font-weight: 600;
}
.btnAddNew {
font-size: 14px;
font-weight: 500;
background-color: #84CC16;
color: #FFFFFF;
border-radius: 8px;
padding: 10px 70px;
}
.btnAddNew:hover {
background-color: #5f9213;
}
.btnEditNew {
font-size: 14px;
font-weight: 500;
background-color: #0ea5e9;
color: #FFFFFF;
border-radius: 8px;
padding: 10px 70px;
width: 100%;
}
.btnEditNew:hover {
background-color: #0284c7;
}
.btnAddNew,
.btn-cancel2 {
width: 100% !important;
}
.spanTitleText {
font-size: 13px;
font-weight: 500;
color: #454545;
}
.data-load {
background-color: #F0F0F0;
border-radius: 6px;
padding: 5px;
height: 200px;
}
@media (max-width:1366px) {
.modal-dialog-scrollable .modal-content {
max-height: auto;
overflow: hidden;
}
}
@media (max-width:768px) {
}
@media (max-width:576px) {
}

View File

@@ -0,0 +1,655 @@
.modal-dialog, .modal-content {
max-width: 550px;
}
.modal-header .btn-close {
margin: 0 0 0 15px;
border: 2px solid #33363F;
border-radius: 50%;
color: black;
opacity: 1;
right: 13px;
padding: 5px;
background-size: 10px;
z-index: 25;
}
.navbarBtn {
-ms-overflow-style: none;
scrollbar-width: none;
}
.container::-webkit-scrollbar {
display: none; /* Safari and Chrome */
}
.test {
width: 55px;
height: 10px;
}
.panel-default > .panel-heading {
text-align: center;
}
video {
border-radius: 10px;
}
.stepBtn {
width: 50%;
padding: 5px 5px;
border-radius: 6px;
background-color: #84CC16;
color: white;
}
.stepBtn.cancelButton {
background-color: #454D5C;
}
.stepBtnFirst {
width: 75%;
margin: auto;
}
.stepStatus {
width: 163px;
padding: 10px 5px;
background-color: #DDF4F4;
color: #0F8080;
border: none;
font-size: 14px;
height: 45px;
border-radius: 5px;
}
.stepStatus.active {
background-image: linear-gradient(to right,#2EBEBE,#1E9D9D);
color: white;
}
.spanTitleText {
font-size: 14px;
font-weight: 500;
margin: 0 5px 0 0;
}
.step {
display: none;
}
.step.active {
display: block;
}
.upload-image1 {
margin-top: 10px;
}
.upload-image2 {
margin-top: 10px;
}
.stepBtnHolder2 {
width: 100%;
position: absolute;
right: 50%;
bottom: 0;
transform: translateX(50%);
}
#step-form1, #step-form2, #step-form3, #step-form4, #step-form5 {
height: 550px;
}
#step2, #step4, #step5 {
overflow-y: auto;
overflow-x: hidden;
padding-left: 3px;
}
.stepBtnHolder3 {
width: 100%;
position: absolute;
right: 50%;
bottom: 0;
transform: translateX(50%);
}
.RollCallUploadPart, .employeePart {
display: flex;
gap: 10px;
align-items: center
}
.saveData {
position: relative;
}
.md-modal {
/* margin: auto;
position: fixed;
top: 100px;
left: 0;
right: 0;
width: 50%;
max-width: 630px;
min-width: 320px;
height: auto;
z-index: 2000;
visibility: hidden;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
backface-visibility: hidden; */
margin: auto;
position: fixed;
top: 70px;
left: 0;
right: 0;
width: 100%;
height: auto;
z-index: 2000;
visibility: hidden;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
backface-visibility: hidden;
}
.md-show {
visibility: visible;
}
.md-overlay {
position: fixed;
width: 100%;
height: 100%;
visibility: hidden;
top: 0;
left: 0;
z-index: 1000;
opacity: 0;
background: rgba(228, 240, 227, 0.8);
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
transition: all 0.3s;
}
.md-show ~ .md-overlay {
opacity: 1;
visibility: visible;
}
.md-effect-12 .md-content {
-webkit-transform: scale(0.8);
-moz-transform: scale(0.8);
-ms-transform: scale(0.8);
transform: scale(0.8);
opacity: 0;
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
transition: all 0.3s;
}
.md-show.md-effect-12 ~ .md-overlay {
background-color: #e4f0e3;
}
.md-effect-12 .md-content h3,
.md-effect-12 .md-content {
background: transparent;
}
.md-show.md-effect-12 .md-content {
-webkit-transform: scale(1);
-moz-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
opacity: 1;
}
#step-form2 {
height: 550px;
padding: 0 2px;
}
#step-form3, #step-form6 {
height: 550px;
overflow-x: hidden;
padding: 0 2px;
overflow-y: scroll;
scrollbar-width: thin;
}
.image-show {
margin: 0 auto 8px auto;
border: 2px dashed #148b8b;
width: 200px;
height: 200px;
border-radius: 10px;
position: relative;
}
.image-show .closeImage {
background-color: #fff;
width: 40px;
height: 40px;
z-index: 30;
position: absolute;
top: -18px;
right: -20px;
border-radius: 50px;
cursor: pointer;
}
.image-show .closeImage svg {
width: 40px;
position: absolute;
z-index: 30;
color: #ef4444;
display: flex;
align-content: center;
align-items: center;
}
.image-show button {
height: 100%;
width: 100%;
background: #17909040;
font-family: inherit;
position: absolute;
z-index: 3;
top: -5% !important;
right: 0;
}
.image-show button .textUpload {
padding: 0;
margin: 0;
color: #148b8b;
font-weight: 900;
}
.image-show button .textUploaded {
display: flex;
align-items: center;
justify-content: end;
height: 100%;
flex-direction: column;
color: #fff !important;
}
.camera_close {
position: fixed;
top: -50px;
right: 10px;
background-color: #fff;
border-radius: 50px;
width: 42px;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
}
/* video {
width: 100% !important;
height: 100% !important;
} */
video {
width: 100% !important;
height: 100% !important;
object-fit: cover !important;
}
.loadingImage {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 5;
background: #75ffff99;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
border-radius: 10px;
display: none;
}
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
.errored {
animation: shake 300ms;
color: #eb3434 !important;
background-color: #fef2f2 !important;
border: 1px solid #eb3434 !important;
}
.timeWorkTitle {
color: #5C5C5C;
font-weight: 600;
font-size: 12px;
margin: auto 0 auto 6px;
}
.groupBox,
.groupBoxRS {
background-color: #F5F5F5;
border-radius: 10px;
border: 1px solid #E7E7E7;
padding: 6px;
margin: 6px 3px;
}
.groupBox .form-control,
.groupBoxRS .form-control {
background-color: #ffffff;
}
.groupBox .form-control::placeholder,
.groupBoxRS .form-control::placeholder {
color: #bfbfbf;
opacity: 1; /* Firefox */
}
.groupBox .form-control::-ms-input-placeholder,
.groupBoxRS .form-control::-ms-input-placeholder { /* Edge 12-18 */
color: #bfbfbf;
}
.groupBoxIrregular {
background-color: #F5F5F5;
border-radius: 10px;
border: 1px solid #E7E7E7;
padding: 6px;
margin: 6px 3px;
}
.groupBoxIrregular .form-control {
background-color: #ffffff;
}
.groupBoxIrregular .form-control::placeholder {
color: #bfbfbf;
opacity: 1; /* Firefox */
}
.groupBoxIrregular .form-control::-ms-input-placeholder { /* Edge 12-18 */
color: #bfbfbf;
}
.btnAddTimeWork,
.btnAddTimeWorkRS {
display: flex;
align-items: center;
justify-content: center;
background-color: #84CC16;
border-radius: 5px;
color: #ffffff;
font-size: 12px;
font-weight: 500;
padding: 4px 8px;
}
.btnRemoveTimeWork,
.btnRemoveTimeWorkRS {
display: flex;
align-items: center;
justify-content: center;
background-color: #F87171;
border-radius: 7px;
padding: 3px;
width: 30px;
height: 30px;
}
.btn-workTimeOption-container {
display: flex;
}
.radio-workTimeOption {
display: none;
}
.radio-label-workTimeOption {
font-size: 13px;
font-weight: 500;
color: #0F8080;
background-color: #DDF4F4;
text-align: center;
padding: 8px 16px;
border-radius: 9px;
margin: auto 5px;
transition: all 0.3s ease-in-out;
cursor: pointer;
}
.radio-label-workTimeOption:hover {
color: #FFFFFF;
background-color: #1c7474;
border-color: #23A8A8;
}
.radio-workTimeOption:checked + .radio-label-workTimeOption {
color: #FFFFFF;
background: linear-gradient(93.83deg, #2EBEBE 1.59%, #1E9D9D 47.86%, #0B7878 101.16%);
}
.selectCheckBreakTime {
width: auto;
}
.breack-time {
border: 1px solid #ddd;
padding: 8px 0;
border-radius: 20px;
}
.extraOptionBorder {
border: 1px solid #ddd;
padding: 8px 0;
border-radius: 20px;
}
#computeTime span,
.lableCheckBreakTime,
.labelExtraOption {
font-size: 13px;
font-weight: 500;
margin: 0 10px;
color: #101010;
}
.hrLine {
width: 100%;
height: 1px;
background: rgb(255, 255, 255);
background: linear-gradient(90deg, rgba(255, 255, 255, 1) 0%, rgba(202, 202, 202, 1) 45%, rgba(255, 255, 255, 1) 100%);
margin-top: 7px;
}
.outlineDate {
outline: 1px solid #1D9D9D;
}
.breack-time {
border: 1px solid #ddd;
padding: 8px 0;
border-radius: 20px;
}
/************************ Radio Button Input () ************************/
.form-check-input[type="radio"],
.form-check-input[type="checkbox"] {
width: 15px;
height: 15px;
border-radius: 6px;
padding: 8px;
border: 1px solid #CFD3D4;
background-color: white;
background-position: center;
background-size: contain;
background-repeat: no-repeat;
margin-right: 8px;
appearance: none;
}
.form-check-input[type="radio"]:checked,
.form-check-input[type="checkbox"]:checked {
background-color: #148989;
border: 1px solid #ffffff !important;
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="white" stroke-width="3"%3E%3Cpath stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" /%3E%3C/svg%3E');
background-size: 75%;
}
.form-check-input[type=checkbox]:indeterminate {
background-color: #148989;
border-color: #ffffff;
--bs-form-check-bg-image: url(data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e);
}
.form-check-input[type="radio"]:focus,
.form-check-input[type="checkbox"]:focus {
outline: none;
box-shadow: none;
}
.form-check-input[type="radio"] + label,
.form-check-input[type="checkbox"] + label {
color: #83898C;
}
.form-check-input[type="radio"]:checked + label,
.form-check-input[type="checkbox"]:checked + label {
color: #2B2F32;
}
/************************ Radio Button Input (Like Checkbox appearance) ************************/
#multiStepModal {
height: 640px;
position: relative;
}
.modal-dialog, .modal-content {
height: 780px !important;
}
@media (max-width: 1366px) {
#multiStepModal {
height: 450px;
position: relative;
}
.modal-dialog, .modal-content {
height: 590px !important;
}
#step-form1, #step-form2, #step-form3, #step-form4, #step-form5 {
height: 360px;
}
.form-workshop .input-group-text, .form-personal .input-group-text {
width: 70px;
}
}
@media (max-width: 992px) {
.desktopNotif {
display: flex !important;
}
.mobileNotif {
display: none !important;
}
.radio-label-workTimeOption {
font-size: 10px;
padding: 8px 8px;
font-weight: 800;
}
#computeTime span,
.lableCheckBreakTime {
font-size: 11px;
}
.modal-dialog, .modal-content {
/*height: 622px;*/
height: 680px;
}
.radio-label-workTimeOption {
font-size: 10px;
padding: 8px 8px;
font-weight: 800;
}
#computeTime span,
.lableCheckBreakTime,
.labelExtraOption {
font-size: 11px;
}
.form-workshop .input-group-text, .form-personal .input-group-text {
width: 100%;
}
}
@media (max-width: 768px) {
#step-form1, #step-form2, #step-form3, #step-form4, #step-form5 {
height: 360px;
}
}
@media (min-width: 576px) {
.container, .container-sm {
max-width: none;
}
}
@media (max-width: 576px) {
#step-form1, #step-form2, #step-form3, #step-form4, #step-form5 {
height: 360px;
}
.stepStatus {
font-size: 11px;
width: 165px !important;
}
.RollCallUploadPart, .employeePart {
gap: 3px;
}
.modal-content {
height: 98vh;
}
#step-form1, #step-form2 {
height: auto;
}
#workshopEmployeeSetting {
height: 400px !important;
}
.radio-label-workTimeOption {
padding: 7px 3px;
font-size: 9px;
font-weight: 700;
}
.form-control {
margin: 0 !important;
}
}

View File

@@ -0,0 +1,134 @@
.modal-xxl {
max-width: 480px !important;
}
.scroll-container-amount {
font-size: 12px;
color: #4f4f4f;
white-space: nowrap;
width: 100%;
overflow: hidden;
cursor: grab;
user-select: none;
}
.scroll-container-amount:active {
cursor: grabbing;
}
.errored {
animation: shake 300ms;
color: #eb3434 !important;
background-color: #fef2f2 !important;
border: 1px solid #eb3434 !important;
border-radius: 7px;
}
.textLFontColor,
.form-control {
color: #797979;
font-size: 12px;
font-weight: 500;
}
/*.form-control-number {
border: 1px solid #C6C6C6;
border-radius: 6px;
width: 40px;
}
.form-control-currency {
border: 1px solid #C6C6C6;
border-radius: 6px;
width: 120px;
}
.form-control-select {
border: 1px solid #C6C6C6;
border-radius: 6px;
width: 80px;
}*/
.textLFontColor span {
font-size: 16px;
font-weight: 600;
}
.btnCreateNew {
font-size: 14px;
font-weight: 500;
background-color: #84CC16;
color: #FFFFFF;
border-radius: 8px;
padding: 10px 70px;
}
.btnCreateNew:hover {
background-color: #5f9213;
}
.lastDayStandingTxt,
.dayOfLeftWorkTxt {
background-color: #ECFCCA;
outline: 1px solid #AAE729;
border-radius: 5px;
top: 5px;
left: 5px;
position: absolute;
color: #5C5C5C;
text-align: center;
width: 80px;
font-size: 13px;
padding: 2px;
}
.btnCreateNew,
.btn-cancel2 {
width: 100% !important;
}
.spanTitleText {
font-size: 13px;
font-weight: 500;
color: #454545;
}
@media (min-width: 1366px) {
.modal-xxl {
--bs-modal-width: 480px;
max-width: 480px !important;
}
}
@media (max-width:1366px) {
.spanTitleText {
font-size: 12px;
}
}
@media (max-width:768px) {
.form-control {
margin: 0 !important;
}
.spanTitleText {
font-size: 11px;
}
}
@media (max-width:576px) {
.btnCreateNew, .btn-cancel2 {
width: 100% !important;
padding: 10px 40px;
display: flex;
justify-content: center;
}
}

View File

@@ -0,0 +1,494 @@
.test {
width: 55px;
height: 10px;
}
.panel-default > .panel-heading {
text-align: center;
}
video {
border-radius: 10px;
}
@media (max-width: 992px) {
.modal-content {
padding: 0 !important;
}
}
.md-modal {
/* margin: auto;
position: fixed;
top: 100px;
left: 0;
right: 0;
width: 50%;
max-width: 630px;
min-width: 320px;
height: auto;
z-index: 2000;
visibility: hidden;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
backface-visibility: hidden; */
margin: auto;
position: fixed;
top: 70px;
left: 0;
right: 0;
width: 100%;
height: auto;
z-index: 2000;
visibility: hidden;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
backface-visibility: hidden;
}
.md-show {
visibility: visible;
}
.md-overlay {
position: fixed;
width: 100%;
height: 100%;
visibility: hidden;
top: 0;
left: 0;
z-index: 1000;
opacity: 0;
background: rgba(228, 240, 227, 0.8);
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
transition: all 0.3s;
}
.md-show ~ .md-overlay {
opacity: 1;
visibility: visible;
}
.md-effect-12 .md-content {
-webkit-transform: scale(0.8);
-moz-transform: scale(0.8);
-ms-transform: scale(0.8);
transform: scale(0.8);
opacity: 0;
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
transition: all 0.3s;
}
.md-show.md-effect-12 ~ .md-overlay {
background-color: #e4f0e3;
}
.md-effect-12 .md-content h3,
.md-effect-12 .md-content {
background: transparent;
}
.md-show.md-effect-12 .md-content {
-webkit-transform: scale(1);
-moz-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
opacity: 1;
}
.image-show {
margin: 0 auto 8px auto;
border: 2px dashed #148b8b;
width: 200px;
height: 200px;
border-radius: 10px;
position: relative;
}
.image-show .closeImage {
background-color: #fff;
width: 40px;
height: 40px;
z-index: 30;
position: absolute;
top: -18px;
right: -20px;
border-radius: 50px;
cursor: pointer;
}
.image-show .closeImage svg {
width: 40px;
position: absolute;
z-index: 30;
color: #ef4444;
display: flex;
align-content: center;
align-items: center;
}
.image-show button {
height: 100%;
width: 100%;
background: #17909040;
font-family: inherit;
position: absolute;
z-index: 3;
top: 0;
right: 0;
}
.image-show button .textUpload {
padding: 0;
margin: 0;
color: #148b8b;
font-weight: 900;
}
.image-show button .textUploaded {
display: flex;
align-items: center;
justify-content: end;
height: 100%;
flex-direction: column;
color: #fff !important;
}
.camera_close {
position: fixed;
top: -50px;
right: 10px;
background-color: #fff;
border-radius: 50px;
width: 42px;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
}
/* video {
width: 100% !important;
height: 100% !important;
} */
video {
width: 100% !important;
height: 100% !important;
object-fit: cover !important;
}
.loadingImage {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 5;
background: #75ffff99;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
border-radius: 10px;
display: none;
}
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
.errored {
animation: shake 300ms;
color: #eb3434 !important;
background-color: #fef2f2 !important;
border: 1px solid #eb3434 !important;
}
.timeWorkTitle {
color: #5C5C5C;
font-weight: 600;
font-size: 12px;
margin: auto 0 auto 6px;
}
.groupBox,
.groupBoxRS {
background-color: #F5F5F5;
border-radius: 10px;
border: 1px solid #E7E7E7;
padding: 6px;
margin: 6px 3px;
}
.groupBox .form-control,
.groupBoxRS .form-control {
background-color: #ffffff;
}
.groupBox .form-control::placeholder,
.groupBoxRS .form-control::placeholder {
color: #bfbfbf;
opacity: 1; /* Firefox */
}
.groupBox .form-control::-ms-input-placeholder,
.groupBoxRS .form-control::-ms-input-placeholder { /* Edge 12-18 */
color: #bfbfbf;
}
.groupBoxIrregular {
background-color: #F5F5F5;
border-radius: 10px;
border: 1px solid #E7E7E7;
padding: 6px;
margin: 6px 3px;
}
.groupBoxIrregular .form-control {
background-color: #ffffff;
}
.groupBoxIrregular .form-control::placeholder {
color: #bfbfbf;
opacity: 1; /* Firefox */
}
.groupBoxIrregular .form-control::-ms-input-placeholder { /* Edge 12-18 */
color: #bfbfbf;
}
.btnAddTimeWork,
.btnAddTimeWorkRS {
display: flex;
align-items: center;
justify-content: center;
background-color: #84CC16;
border-radius: 5px;
color: #ffffff;
font-size: 12px;
font-weight: 500;
padding: 4px 8px;
}
.btnRemoveTimeWork,
.btnRemoveTimeWorkRS {
display: flex;
align-items: center;
justify-content: center;
background-color: #F87171;
border-radius: 7px;
padding: 3px;
width: 30px;
height: 30px;
}
.btn-workTimeOption-container {
display: flex;
}
.radio-workTimeOption {
display: none;
}
.radio-label-workTimeOption {
font-size: 13px;
font-weight: 500;
color: #0F8080;
background-color: #DDF4F4;
text-align: center;
padding: 8px 16px;
border-radius: 9px;
margin: auto 5px;
transition: all 0.3s ease-in-out;
cursor: pointer;
}
.radio-label-workTimeOption:hover {
color: #FFFFFF;
background-color: #1c7474;
border-color: #23A8A8;
}
.radio-workTimeOption:checked + .radio-label-workTimeOption {
color: #FFFFFF;
background: linear-gradient(93.83deg, #2EBEBE 1.59%, #1E9D9D 47.86%, #0B7878 101.16%);
}
.selectCheckBreakTime {
width: auto;
}
.breack-time {
border: 1px solid #ddd;
padding: 8px 0;
border-radius: 20px;
}
.extraOptionBorder {
border: 1px solid #ddd;
padding: 8px 0;
border-radius: 20px;
}
#computeTime span,
.lableCheckBreakTime,
.labelExtraOption {
font-size: 13px;
font-weight: 500;
margin: 0 10px;
color: #101010;
}
.hrLine {
width: 100%;
height: 1px;
background: rgb(255, 255, 255);
background: linear-gradient(90deg, rgba(255, 255, 255, 1) 0%, rgba(202, 202, 202, 1) 45%, rgba(255, 255, 255, 1) 100%);
margin-top: 7px;
}
.outlineDate {
outline: 1px solid #1D9D9D;
}
.breack-time {
border: 1px solid #ddd;
padding: 8px 0;
border-radius: 20px;
}
/************************ Radio Button Input () ************************/
.form-check-input[type="radio"],
.form-check-input[type="checkbox"] {
width: 15px;
height: 15px;
border-radius: 6px;
padding: 8px;
border: 1px solid #CFD3D4;
background-color: white;
background-position: center;
background-size: contain;
background-repeat: no-repeat;
margin-right: 8px;
appearance: none;
}
.form-check-input[type="radio"]:checked,
.form-check-input[type="checkbox"]:checked {
background-color: #148989;
border: 1px solid #ffffff !important;
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="white" stroke-width="3"%3E%3Cpath stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" /%3E%3C/svg%3E');
background-size: 75%;
}
.form-check-input[type=checkbox]:indeterminate {
background-color: #148989;
border-color: #ffffff;
--bs-form-check-bg-image: url(data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e);
}
.form-check-input[type="radio"]:focus,
.form-check-input[type="checkbox"]:focus {
outline: none;
box-shadow: none;
}
.form-check-input[type="radio"] + label,
.form-check-input[type="checkbox"] + label {
color: #83898C;
}
.form-check-input[type="radio"]:checked + label,
.form-check-input[type="checkbox"]:checked + label {
color: #2B2F32;
}
/************************ Radio Button Input (Like Checkbox appearance) ************************/
@media (max-width: 1366px) {
.modal-dialog, .modal-content {
/*height: 622px;*/
height: 680px;
}
.form-workshop .input-group-text, .form-personal .input-group-text {
width: 70px;
}
#step-form1, #step-form2, #step-form3, #step-form4, #step-form5, #step-form6 {
height: 360px;
}
}
@media (max-width: 992px) {
.radio-label-workTimeOption {
font-size: 10px;
padding: 8px 8px;
font-weight: 800;
}
#computeTime span,
.lableCheckBreakTime {
font-size: 11px;
}
.modal-dialog, .modal-content {
/*height: 622px;*/
height: 680px;
}
.radio-label-workTimeOption {
font-size: 10px;
padding: 8px 8px;
font-weight: 800;
}
#computeTime span,
.lableCheckBreakTime,
.labelExtraOption {
font-size: 11px;
}
}
@media (max-width: 992px) {
.modal-dialog, .modal-content {
height: 840px;
}
.form-workshop .input-group-text, .form-personal .input-group-text {
width: 100%;
}
}
@media (max-width: 768px) {
#step-form1, #step-form2, #step-form3, #step-form4, #step-form5, #step-form6 {
height: 360px;
}
}
@media (min-width: 576px) {
.container, .container-sm {
max-width: none;
}
}
@media (max-width: 576px) {
#step-form1, #step-form2, #step-form3, #step-form4, #step-form5, #step-form6 {
height: 330px;
}
.radio-label-workTimeOption {
padding: 7px 3px;
font-size: 9px;
font-weight: 700;
}
.form-control {
margin: 0 !important;
}
}

View File

@@ -0,0 +1,246 @@
.errored {
animation: shake 300ms;
color: #eb3434 !important;
background-color: #fef2f2 !important;
border: 1px solid #eb3434 !important;
}
.reasonReject {
color: #ff5d5d;
}
.w90 {
width: 90%;
}
.pdTitle {
width: 100%;
}
.pdHeaderTitle1 {
font-size: 15px;
font-weight: 600;
}
.pdHeaderTitle2 {
font-size: 12px;
font-weight: 500;
}
/*.pdBox.justUploaded {
border: 1px solid #84cc16;
}*/
/*.pdBoxGrid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
grid-template-rows: repeat(4, minmax(0, 1fr));
grid-auto-flow: column;
gap: 9px;
}*/
.btn-cancel2 {
font-size: 14px;
font-weight: 500;
background-color: #454D5C;
color: #FFFFFF;
border-radius: 8px;
padding: 10px 70px;
}
.btn-cancel2:hover {
opacity: .7;
}
.pdBox {
background-color: #F8F8F8;
border-radius: 15px;
border: 1px solid #E7E7E7;
width: 100%;
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px;
overflow: hidden;
margin-bottom: 5px;
}
.pdBox.complete {
background-color: #D0FFF7;
border: 1px solid #2BBABA;
}
.pdBox.discomplete {
background-color: #FFD9D9;
border: 1px solid #FF5D5D;
}
.pdBox.pending {
background-color: #FCE7C9;
border: 1px solid #FDBA74;
}
.pdImageBox {
background-color: #E6E6E6;
border-radius: 6px;
border: 1px solid #D3D3D3;
width: 100px;
height: 60px;
text-align: center;
position: relative;
display: flex;
justify-content: center;
align-items: center;
}
.pdImageBox .completeSign {
position: absolute;
top: -10px;
right: -10px;
}
.pdImageBox .discompleteSign {
position: absolute;
top: -10px;
right: -10px;
}
.pdImageBox .pendingSign {
position: absolute;
top: -10px;
right: -10px;
}
.pdImageBox img {
object-fit: cover;
object-position: center;
border-radius: 6px;
width: 100px;
height: 60px;
}
.pdTitle span {
color: #FF5E5E;
font-weight: 500;
font-size: 16px;
}
.pdTitle2 {
font-weight: 400;
font-size: 13px;
max-width: 100%;
word-wrap: break-word;
}
.btnUploadingPD {
background-color: #2BBABA;
color: #ffffff;
font-size: 12px;
padding: 5px 12px;
border-radius: 4px;
transition: all .3s ease-in;
white-space: nowrap;
width: 80px;
}
.btnUploadingPD:hover {
background-color: #248E8E;
}
.btnDeletingPD {
background-color: #c76161;
color: #ffffff;
font-size: 12px;
padding: 5px 12px;
border-radius: 4px;
transition: all .3s ease-in;
white-space: nowrap;
width: 80px;
}
.btnDeletingPD:hover {
background-color: #a54e4e;
}
.btnCreateNew {
font-size: 14px;
font-weight: 500;
background-color: #84CC16;
color: #FFFFFF;
border-radius: 8px;
padding: 10px 70px;
}
.btnCreateNew:hover {
background-color: #5f9213;
}
/*.btnCreateNew,
.btn-cancel2 {
width: auto !important;
}*/
@media (max-width: 992px) {
.pdBoxGrid {
grid-template-columns: repeat(1, minmax(0, 1fr));
grid-template-rows: none;
grid-auto-flow: unset;
}
}
@media (max-width: 768px) {
.modal-body {
height: 75vh;
}
.pdBox {
padding: 9px;
}
.pdImageBox {
width: 70px;
height: 40px;
}
.pdImageBox img {
width: 70px;
height: 40px;
}
.btnUploadingPD,
.btnDeletingPD {
font-size: 10px;
padding: 4px 9px;
width: 60px;
}
.btnCreateNew,
.btn-cancel2 {
font-size: 12px !important;
padding: 10px 0 !important;
width: 100% !important;
}
}
@media (max-width: 576px) {
.pdTitle {
font-size: 12px;
}
.pdTitle2 {
font-weight: 300;
word-wrap: break-word;
font-size: 10px;
}
}

View File

@@ -0,0 +1,468 @@
var urlPathname = location.pathname;
var filledBankCount = 0;
var newItemIndex = 1;
var employeeBankInfos = [];
$(document).ready(function () {
$('.loading').hide();
$(".select2Option").select2({
language: "fa",
dir: "rtl",
dropdownParent: $('#MainModal'),
templateResult: function (data, container) {
if (data.element) {
$(container).addClass($(data.element).attr("class"));
}
return data.text;
}
});
$("#CardNumber").each(function () {
$("#CardNumber").mask("0000-0000-0000-0000");
$("#CardNumber").attr("placeholder", "XXXX-XXXX-XXXX-XXXX");
});
$("#ShebaNumber").each(function () {
$("#ShebaNumber").mask("IR-00-0000-0000-0000-0000-0000-00");
$("#ShebaNumber").attr("placeholder", "IR-XX-XXXX-XXXX-XXXX-XXXX-XXXX-XX");
});
$("#BankAccountNumber").each(function () {
$("#BankAccountNumber").unmask();
$("#BankAccountNumber").attr("placeholder", "");
});
$('#BankAccountNumber').on('keypress', function (e) {
if (e.which < 48 || e.which > 57) {
e.preventDefault();
}
});
ajaxCreateBanks();
//$("#addNewItemBtn").removeClass("disable");
});
function ajaxCreateBanks() {
$.ajax({
url: bankListAjax,
type: 'GET',
success: function (response) {
if (response.success) {
var banks = response.data;
var bankOptionsHtml = '<option value="0">انتخاب بانک ...</option>';
banks.forEach(function (bank) {
bankOptionsHtml += `<option value="${bank.id}">${bank.bankName}</option>`;
});
$('#bankSelectCreate').html(bankOptionsHtml);
} else {
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3500);
}
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
}
});
}
function addDataToTable() {
var employeeSelectName = $('#select2-employeeSelectCreate-container').text();
var employeeSelect = $('#employeeSelectCreate').val();
var bankSelectName = $('#select2-bankSelectCreate-container').text();
var bankSelect = $('#bankSelectCreate').val();
var cardNumber = $('#CardNumber');
var shebaNumber = $('#ShebaNumber');
var bankAccountNumber = $('#BankAccountNumber');
filledBankCount = 0;
if (cardNumber.val() !== '') {
filledBankCount++;
}
if (shebaNumber.val() !== '') {
filledBankCount++;
}
if (bankAccountNumber.val() !== '') {
filledBankCount++;
}
if (employeeSelect === "0") {
$('.alert-msg').show();
$('.alert-msg p').text('لطفا اسامی پرسنل را کلیک و مشخص نمائید');
$('.select-alert-employee').addClass('errored');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
$('.select-alert-employee').removeClass('errored');
}, 3500);
return;
}
if (bankSelect === "0") {
$('.alert-msg').show();
$('.alert-msg p').text('لطفا نام بانک را کلیک و مشخص نمائید');
$('.select-alert-bank').addClass('errored');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
$('.select-alert-bank').removeClass('errored');
}, 3500);
return;
}
if (!cardNumber.val() && !shebaNumber.val() && !bankAccountNumber.val()) {
cardNumber.addClass('errored');
shebaNumber.addClass('errored');
bankAccountNumber.addClass('errored');
$('.alert-msg').show();
$('.alert-msg p').text('لطفا حداقل یکی از فیلدها را وارد نمائید');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
cardNumber.removeClass('errored');
shebaNumber.removeClass('errored');
bankAccountNumber.removeClass('errored');
}, 3500);
return;
}
var cardNumberLength = cardNumber.val().length;
if (cardNumberLength > 0 && cardNumberLength !== 19) {
cardNumber.addClass('errored');
$('.alert-msg').show();
$('.alert-msg p').text('شماره کارت باید 16 رقم باشد');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
cardNumber.removeClass('errored');
}, 3500);
return;
}
var shebaNumberLength = shebaNumber.val().length;
if (shebaNumber.val() && shebaNumberLength !== 33) {
shebaNumber.addClass('errored');
$('.alert-msg').show();
$('.alert-msg p').text('شماره کارت باید 24 رقم باشد');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
shebaNumber.removeClass('errored');
}, 3500);
return;
}
var newId = newItemIndex++;
//const createEmployeeInformation = {};
//createEmployeeInformation.EmployeeId = employeeSelect;
//createEmployeeInformation.BankId = bankSelect;
//createEmployeeInformation.BankAccountNumber = bankAccountNumber.val();
//createEmployeeInformation.CardNumber = cardNumber.val();
//createEmployeeInformation.ShebaNumber = shebaNumber.val();
//createEmployeeInformation.newItemId = newId;
let employeeData = {
EmployeeId: employeeSelect,
BankId: bankSelect,
BankAccountNumber: bankAccountNumber.val(),
CardNumber: cardNumber.val().replace(/-/g, ""),
ShebaNumber: shebaNumber.val().replace(/-/g, ""),
newItemId: newId
};
let isDuplicate = employeeBankInfos.some(existingItem =>
existingItem.EmployeeId === employeeData.EmployeeId &&
existingItem.BankId === employeeData.BankId &&
existingItem.BankAccountNumber === employeeData.BankAccountNumber &&
existingItem.CardNumber === employeeData.CardNumber &&
existingItem.ShebaNumber === employeeData.ShebaNumber
);
if (!isDuplicate) {
employeeBankInfos.push(employeeData);
} else {
$('.alert-msg').show();
$('.alert-msg p').text('این داده قبلاً وارد شده است');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
shebaNumber.removeClass('errored');
}, 3500);
return;
}
loadDataCreate(newId, employeeSelectName, bankSelectName, filledBankCount);
}
function loadDataCreate(newId, employeeName, bankName, bankCount) {
$('.select-alert-employee .select2.select2-container.select2-container--default').addClass("disable");
$('#createData').removeClass("disable");
var fullName = $("#firstName").val() + " " + $('#lastName').val();
$("#emptyData").addClass("d-none");
var n = $('#dataLoad .Rtable-row').length + 1;
var html = `<div></div>
<div class="Rtable-row align-items-center openAction load-create-row" id="Employees" data-item-new-id="${newId}">
<div class="Rtable-cell width1 widthNumberCustom1">
<label for="${n}" class="Rtable-cell--content prevent-select">
<span class="d-flex justify-content-center align-items-center justify-content-center row-number">
${n}
</span>
</label>
</div>
<div class="Rtable-cell justify-content-start width2">
<div class="Rtable-cell--content text-start">${fullName}</div>
</div>
<div class="Rtable-cell d-md-flex justify-content-center d-none width3">
<div class="Rtable-cell--content" id="bankCount">${bankCount}</div>
</div>
<div class="Rtable-cell d-md-block d-none width4">
<div class="Rtable-cell--content" id="bankName">${bankName}</div>
</div>
<div class="Rtable-cell width5 text-end">
<div class="Rtable-cell--content align-items-center justify-content-end d-flex text-end">
<button onclick="editNewItem(${newId})" type="button" class="btn-edit position-relative d-md-block d-none">
<svg width="20" height="20" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.6027 6.838L5.85304 13.5876C5.84201 13.5987 5.83107 13.6096 5.8202 13.6204C5.65773 13.7825 5.5139 13.9261 5.41254 14.1051C5.31117 14.2841 5.2621 14.4813 5.20667 14.704C5.20296 14.7189 5.19923 14.7339 5.19545 14.7491L4.5813 17.2057C4.57908 17.2145 4.57686 17.2234 4.57462 17.2323C4.53537 17.389 4.49347 17.5564 4.47972 17.6969C4.46458 17.8516 4.46811 18.1127 4.67752 18.3221L5.03035 17.9693L4.67752 18.3221C4.88693 18.5315 5.14799 18.535 5.30272 18.5199C5.44326 18.5062 5.6106 18.4643 5.76728 18.425C5.77622 18.4228 5.78512 18.4205 5.79398 18.4183L8.25057 17.8042C8.26569 17.8004 8.28069 17.7967 8.29558 17.793C8.51832 17.7375 8.71549 17.6885 8.89452 17.5871C9.07356 17.4857 9.21708 17.3419 9.37921 17.1794C9.39005 17.1686 9.40097 17.1576 9.412 17.1466L16.1616 10.397L16.1849 10.3737C16.4983 10.0603 16.7684 9.79025 16.9556 9.54492C17.1562 9.282 17.3081 8.98958 17.3081 8.6292C17.3081 8.26759 17.1541 7.97384 16.9522 7.71001C16.7633 7.46303 16.4905 7.1903 16.1731 6.87292L16.1499 6.84972L16.1267 6.82652C15.8093 6.5091 15.5366 6.23634 15.2896 6.04738C15.0258 5.84553 14.732 5.69156 14.3704 5.69156C14.01 5.69156 13.7176 5.84345 13.4547 6.04405C13.2094 6.23123 12.9393 6.5013 12.6259 6.81474L12.6027 6.838Z" stroke-width="1.5" stroke="#4DA9D1" />
<path d="M11.9939 7.20397L14.8457 5.30273L17.6976 8.15459L15.7964 11.0064L11.9939 7.20397Z" fill="#4DA9D1" />
</svg>
<span class="mx-1">ویرایش</span>
</button>
<button onclick="alertRemoveRecordAfterAddNewItem(${newId})" type="button" class="btn-delete d-md-block d-none">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 22 22" fill="none" stroke="currentColor">
<path d="M8.70825 13.2915L8.70825 10.5415" stroke-width="1.5" stroke-linecap="round" />
<path d="M13.2917 13.2915L13.2917 10.5415" stroke-width="1.5" stroke-linecap="round" />
<path d="M2.75 5.9585H19.25V5.9585C18.122 5.9585 17.558 5.9585 17.1279 6.17946C16.7561 6.3704 16.4536 6.67297 16.2626 7.04469C16.0417 7.47488 16.0417 8.03886 16.0417 9.16683V13.8752C16.0417 15.7608 16.0417 16.7036 15.4559 17.2894C14.8701 17.8752 13.9273 17.8752 12.0417 17.8752H9.95833C8.07271 17.8752 7.12991 17.8752 6.54412 17.2894C5.95833 16.7036 5.95833 15.7608 5.95833 13.8752V9.16683C5.95833 8.03886 5.95833 7.47488 5.73737 7.04469C5.54643 6.67297 5.24386 6.3704 4.87214 6.17946C4.44195 5.9585 3.87797 5.9585 2.75 5.9585V5.9585Z" stroke-width="1.5" stroke-linecap="round" />
<path d="M8.70841 3.20839C8.70841 3.20839 9.16675 2.2915 11.0001 2.2915C12.8334 2.2915 13.2917 3.20817 13.2917 3.20817" stroke-width="1.5" stroke-linecap="round" />
</svg>
<span class="mx-1">حذف</span>
</button>
</div>
</div>
</div>`;
$('#bankSelectCreate').val("0").trigger('change');
$('#CardNumber').val("");
$('#ShebaNumber').val("");
$('#BankAccountNumber').val("");
$('.data-load .wrapper').show();
$('#dataLoad').append(html);
}
function alertRemoveRecordAfterAddNewItem(id) {
swal({
title: "آیا از حذف این حساب اطمینان دارید؟",
text: "",
type: "warning",
showCancelButton: true,
confirmButtonColor: "#DD6B55",
confirmButtonText: "بله",
cancelButtonText: "خیر",
closeOnConfirm: true,
closeOnCancel: true
}, function (isConfirm) {
if (isConfirm) {
removeRecordAfterAddNewItem(id);
}
});
}
function removeRecordAfterAddNewItem(id) {
$(`[data-item-new-id="${id}"]`).remove();
updateRows();
$('.alert-success-msg').show();
$('.alert-success-msg p').text("عملیات با موفقیت انجام شد");
setTimeout(function () {
$('.alert-success-msg').hide();
$('.alert-success-msg p').text('');
}, 2000);
employeeBankInfos = employeeBankInfos.filter(employee => employee.newItemId !== id);
//let indexToDelete = employeeBankInfos.findIndex(employee => employee.newItemId === id);
//if (indexToDelete !== -1) {
// employeeBankInfos.splice(indexToDelete, 1);
//}
if (employeeBankInfos.length === 0) {
$('.select-alert-employee .select2.select2-container.select2-container--default').removeClass("disable");
$('#createData').addClass("disable");
$("#emptyData").removeClass("d-none");
}
}
function editNewItem(newId) {
$('#prevStep5').addClass('disable');
$('#nextStep5').addClass('disable');
$('#addNewItemBtn').hide();
$('#editNewItemBtn').show();
$('#createData').addClass("disable");
let employeeBankInfo = employeeBankInfos.find(employee => employee.newItemId === newId);
$('#editNewItemBtn').attr('onclick', 'saveEditNewItem(' + newId + ')');
$('#bankSelectCreate').val(employeeBankInfo.BankId).trigger('change');
$('#CardNumber').val(employeeBankInfo.CardNumber);
$('#ShebaNumber').val(employeeBankInfo.ShebaNumber);
$('#BankAccountNumber').val(employeeBankInfo.BankAccountNumber);
$('#CardNumber').mask("0000-0000-0000-0000", {
placeholder: "XXXX-XXXX-XXXX-XXXX"
});
$('#CardNumber').val(employeeBankInfo.CardNumber).keyup();
$('#ShebaNumber').mask("IR-00-0000-0000-0000-0000-0000-00", {
placeholder: "IR-XX-XXXX-XXXX-XXXX-XXXX-XXXX-XX"
});
$('#ShebaNumber').val(employeeBankInfo.ShebaNumber).keyup();
}
function saveEditNewItem(newId) {
var employeeSelect = $('#employeeSelectCreate').val();
var bankSelectName = $('#select2-bankSelectCreate-container').text();
var bankSelect = $('#bankSelectCreate').val();
var cardNumber = $('#CardNumber');
var shebaNumber = $('#ShebaNumber');
var bankAccountNumber = $('#BankAccountNumber');
filledBankCount = 0;
if (cardNumber.val() !== '') {
filledBankCount++;
}
if (shebaNumber.val() !== '') {
filledBankCount++;
}
if (bankAccountNumber.val() !== '') {
filledBankCount++;
}
if (employeeSelect === "0") {
$('.alert-msg').show();
$('.alert-msg p').text('لطفا اسامی پرسنل را کلیک و مشخص نمائید');
$('.select-alert-employee').addClass('errored');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
$('.select-alert-employee').removeClass('errored');
}, 3500);
return;
}
if (bankSelect === "0") {
$('.alert-msg').show();
$('.alert-msg p').text('لطفا نام بانک را کلیک و مشخص نمائید');
$('.select-alert-bank').addClass('errored');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
$('.select-alert-bank').removeClass('errored');
}, 3500);
return;
}
if (!cardNumber.val() && !shebaNumber.val() && !bankAccountNumber.val()) {
cardNumber.addClass('errored');
shebaNumber.addClass('errored');
bankAccountNumber.addClass('errored');
$('.alert-msg').show();
$('.alert-msg p').text('لطفا حداقل یکی از فیلدها را وارد نمائید');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
cardNumber.removeClass('errored');
shebaNumber.removeClass('errored');
bankAccountNumber.removeClass('errored');
}, 3500);
return;
}
var cardNumberLength = cardNumber.val().length;
if (cardNumberLength > 0 && cardNumberLength !== 19) {
cardNumber.addClass('errored');
$('.alert-msg').show();
$('.alert-msg p').text('شماره کارت باید 16 رقم باشد');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
cardNumber.removeClass('errored');
}, 3500);
return;
}
var shebaNumberLength = shebaNumber.val().length;
if (shebaNumber.val() && shebaNumberLength !== 33) {
shebaNumber.addClass('errored');
$('.alert-msg').show();
$('.alert-msg p').text('شماره کارت باید 24 رقم باشد');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
shebaNumber.removeClass('errored');
}, 3500);
return;
}
let updatedData = {
EmployeeId: employeeSelect,
BankId: bankSelect,
BankAccountNumber: bankAccountNumber.val(),
CardNumber: cardNumber.val().replace(/-/g, ""),
ShebaNumber: shebaNumber.val().replace(/-/g, ""),
newItemId: newId
};
let indexToEdit = employeeBankInfos.findIndex(employee => employee.newItemId === newId);
if (indexToEdit !== -1) {
employeeBankInfos[indexToEdit] = { ...employeeBankInfos[indexToEdit], ...updatedData };
}
$('#bankSelectCreate').val("0").trigger('change');
$('#CardNumber').val("");
$('#ShebaNumber').val("");
$('#BankAccountNumber').val("");
$('#editNewItemBtn').attr('onclick', 'saveEditNewItem()');
$(`[data-item-new-id="${newId}"] #bankCount`).text(filledBankCount);
$(`[data-item-new-id="${newId}"] #bankName`).text(bankSelectName);
$('#addNewItemBtn').show();
$('#editNewItemBtn').hide();
$('#createData').removeClass("disable");
$('#prevStep5').removeClass('disable');
$('#nextStep5').removeClass('disable');
}
function updateRows() {
$('.load-create-row.width1').each(function (index) {
$(this).find('span.row-number').text(index + 1);
});
}

View File

@@ -0,0 +1,115 @@
var currentUrl = window.location.href;
$(document).ready(function () {
$("#NationalitySelect").select2({
language: "fa",
dir: "rtl"
});
var jobsLoadAjaxURL = '';
if (currentUrl.includes("/Client/Company/Employees/EmployeeList")) {
jobsLoadAjaxURL = jobsLoadEmployeeAjaxUrl;
} else {
jobsLoadAjaxURL = jobsLoadRollCallAjaxUrl;
}
$(".JobSelect2Option").select2({
language: "fa",
dir: "rtl",
ajax: {
url: jobsLoadAjaxURL,
dataType: 'json',
delay: 250,
data: function (params) {
return {
jobName: params.term
};
},
processResults: function (data) {
return {
results: data.map(item => ({
id: item.id,
text: item.jobName
}))
};
},
cache: false
},
minimumInputLength: 0,
dropdownParent: $('#MainModal')
});
$("#startWork, #sematSelect, input[name='Command.MaritalStatus']").on("input change", checkConditions);
$(".cancelButton").click(function () {
$("#MainModal").modal("hide");
});
$(".startLeftWorkDate").each(function () {
let element = $(this);
element.on('input', function () {
let value = convertPersianNumbersToEnglish(element.val());
element.val(value);
});
new Cleave(this, {
date: true,
delimiter: '/',
datePattern: ['Y', 'm', 'd']
});
});
});
function checkInputs() {
const genderSelected = $(".genderStatus:checked").length > 0;
const maritalStatusSelected = $(".maritalStatus:checked").length > 0;
const nationality = $("#NationalitySelect").val();
const fName = $("#firstName").val();
const lName = $("#lastName").val();
const startWork = $("#startWork").val().trim();
const startWorkIsValidDate = /^\d{4}[-\/]\d{2}[-\/]\d{2}$/.test(startWork);
const semat = $("#sematSelect").val();
let isEmpty = false;
if (!genderSelected || !maritalStatusSelected || !nationality || !fName || !lName || !startWork || !startWorkIsValidDate || semat === "0") {
isEmpty = true;
}
if (isEmpty) {
if (!$("input[name='Command.MaritalStatus']:checked").val()) {
validateField(".validMariage", "لطفا وضعیت تاهل را مشخص کنید.");
return false;
}
if (startWork === "") {
validateField("#startWork", "لطفا تاریخ شروع بکار را مشخص کنید");
return false;
} else if (!/^\d{4}[-\/]\d{2}[-\/]\d{2}$/.test(startWork)) {
validateField("#startWork", "تاریخ شروع بکار را به درستی وارد کنید.");
return false;
}
if (semat === "0") {
validateField(".sematValid", "لطفا سمت را مشخص کنید.");
return false;
}
return false;
} else {
return true;
}
}
function checkConditions() {
let numberInput = $("#startWork").val().trim();
let selectValue = $("#sematSelect").val();
let isValidDate = /^\d{4}[-\/]\d{2}[-\/]\d{2}$/.test(numberInput);
let isValidSelect = selectValue !== "0";
let isMaritalStatusChecked = $("input[name='Command.MaritalStatus']:checked").length > 0;
if (isValidDate && isValidSelect && isMaritalStatusChecked) {
$("#submitStep2").removeClass("disable");
} else {
$("#submitStep2").addClass("disable");
}
}

View File

@@ -0,0 +1,492 @@
var currentUrl = window.location.href;
$(document).ready(function () {
if (currentUrl.includes("/Client#showmodal=/Client/Company/Employees/EmployeeList?handler=CreateEmployee")) {
$(".modal-xxl").css('max-width', '550px');
}
$(".SaveFullData").click(function () {
saveFullData();
});
//checkAndDisableButtons();
//$(document).on('click', '.stepBtn', function () {
// checkAndDisableButtons();
//});
if (currentUrl.includes("/Client/Company/RollCall/EmployeeUploadPicture")) {
$(".employeePart").remove();
$("#nextStep4").addClass("disable");
$("#ModalContent").css("height", "730px");
$(".stepStatus").css("width", "195px");
}
$(".select2Option").select2({
language: "fa",
dir: "rtl",
dropdownParent: $('#MainModal'),
templateResult: function (data, container) {
if (data.element) {
$(container).addClass($(data.element).attr("class"));
}
return data.text;
}
});
if ($(window).width() < 992) {
$('.desktopNotif').hide();
$('.mobileNotif').show();
} else {
$('.desktopNotif').show();
$('.mobileNotif').hide();
}
$(".cancelButton").click(function () {
$("#MainModal").modal("hide");
});
});
function checkPicture() {
let currentUrl = window.location.href; // Get the full URL
let hasImgInDemoResult1 = $("#demoResult1 img").length > 0;
let hasImgInDemoResult2 = $("#demoResult2 img").length > 0;
//var hasImgInDemoResult1Empty = hasImgInDemoResult1.attr("src") === "";
//var hasImgInDemoResult2Empty = hasImgInDemoResult2.attr("src") === "";
if (hasImgInDemoResult2 && hasImgInDemoResult1) {
if (currentUrl.includes("/Client/Company/Employees/EmployeeList")) {
$("#demoResult1 , #demoResult2").removeClass("cantPass");
$("#demoResult1 , #demoResult2").addClass("canPass");
$("#prevStep4").removeClass("disable");
$("#nextStep4").removeClass("disable");
$("#save4").removeClass("disable");
} else {
$("#demoResult1 , #demoResult2").removeClass("cantPass");
$("#demoResult1 , #demoResult2").addClass("canPass");
$("#save4").removeClass("disable");
$("#save4").prop("disabled",false);
}
return true;
} else if (!hasImgInDemoResult2 && !hasImgInDemoResult1) {
if (currentUrl.includes("/Client/Company/Employees/EmployeeList")) {
$("#demoResult1 , #demoResult2").removeClass("cantPass");
$("#demoResult1 , #demoResult2").addClass("canPass");
$("#prevStep4").removeClass("disable");
$("#nextStep4").removeClass("disable");
$("#save4").removeClass("disable");
} else {
$("#demoResult1 , #demoResult2").removeClass("cantPass");
$("#demoResult1 , #demoResult2").addClass("canPass");
$("#save4").removeClass("disable");
}
return true;
}
else {
$("#demoResult1 , #demoResult2").addClass("cantPass");
$("#demoResult1 , #demoResult2").removeClass("canPass");
$("#prevStep4").addClass("disable");
$("#nextStep4").addClass("disable");
$("#save4").addClass("disable");
return false;
}
}
$(document).ready(function () {
class ModalState {
constructor(modal) {
this.modal = modal;
}
next() {
throw new Error("next() باید در هر مرحله پیاده‌سازی شود");
}
prev() {
throw new Error("prev() باید در هر مرحله پیاده‌سازی شود");
}
save() {
console.log(this.modal.formData);
saveFullData(this.modal.formData);
}
render() {
throw new Error("render() باید در هر مرحله پیاده‌سازی شود");
}
}
class Step1 extends ModalState {
render() {
$(".step").hide();
$("#step1").show();
$(".stepStatus").removeClass("active");
$("#step-1").addClass("active");
checkStepStatus();
}
next() {
if (goToStep2) {
this.modal.setState(this.modal.step2);
}
}
}
class Step2 extends ModalState {
render() {
$(".step").hide();
$("#step2").show();
$(".stepStatus").removeClass("active");
$("#step-2").addClass("active");
checkStepStatus();
}
next() {
if (checkInputs()) {
this.modal.setState(this.modal.step3);
}
}
}
class Step3 extends ModalState {
render() {
$(".step").hide();
$("#step3").show();
$(".stepStatus").removeClass("active");
$("#step-3").addClass("active");
checkStepStatus();
}
next() {
var inputsDateTime = $('.dateTime');
var inputsDateTimeRs = $('.dateTimeRS');
var inputsDateTimeIrregular = $('.dateTimeIrregular');
var allowToNextStep3 = true;
var selectedOption = $("input[name='Command.CreateCustomizeEmployeeSettings.WorkshopShiftStatus']:checked").val();
if (selectedOption === "Regular") {
inputsDateTime.each(function () {
if ($(this).val() === '') {
allowToNextStep3 = false;
showAlert('ابتدا ساعت شروع و پایان را وارد نمائید.', $(this));
}
});
} else if (selectedOption === "Rotating") {
inputsDateTimeRs.each(function () {
if ($(this).val() === '') {
allowToNextStep3 = false;
showAlert('ابتدا ساعت شروع و پایان را وارد نمائید.', $(this));
}
});
} else if (selectedOption === "Irregular") {
var selectedOptionWorkshopIrregularShifts = $("input[name='Command.CreateCustomizeEmployeeSettings.IrregularShift.WorkshopIrregularShifts']:checked").val();
if (!selectedOptionWorkshopIrregularShifts) {
showAlert('لطفاً یکی از گزینه‌های شیفت کاری را انتخاب کنید.', $('.outlineDate'));
allowToNextStep3 = false;
} else {
inputsDateTimeIrregular.each(function () {
if ($(this).val() === '') {
allowToNextStep3 = false;
showAlert('ابتدا ساعت شروع و پایان را وارد نمائید.', $(this));
}
});
}
}
if (allowToNextStep3) {
this.modal.setState(this.modal.step4);
}
}
prev() {
var inputsDateTime = $('.dateTime');
var inputsDateTimeRs = $('.dateTimeRS');
var inputsDateTimeIrregular = $('.dateTimeIrregular');
var allowToPrevStep3 = true;
var selectedOption = $("input[name='Command.CreateCustomizeEmployeeSettings.WorkshopShiftStatus']:checked").val();
if (selectedOption === "Regular") {
inputsDateTime.each(function () {
if ($(this).val() === '') {
allowToPrevStep3 = false;
showAlert('ابتدا ساعت شروع و پایان را وارد نمائید.', $(this));
}
});
} else if (selectedOption === "Rotating") {
inputsDateTimeRs.each(function () {
if ($(this).val() === '') {
allowToPrevStep3 = false;
showAlert('ابتدا ساعت شروع و پایان را وارد نمائید.', $(this));
}
});
} else if (selectedOption === "Irregular") {
var selectedOptionWorkshopIrregularShifts = $("input[name='Command.CreateCustomizeEmployeeSettings.IrregularShift.WorkshopIrregularShifts']:checked").val();
if (!selectedOptionWorkshopIrregularShifts) {
showAlert('لطفاً یکی از گزینه‌های شیفت کاری را انتخاب کنید.', $('.outlineDate'));
allowToPrevStep3 = false;
} else {
inputsDateTimeIrregular.each(function () {
if ($(this).val() === '') {
allowToPrevStep3 = false;
showAlert('ابتدا ساعت شروع و پایان را وارد نمائید.', $(this));
}
});
}
}
if (allowToPrevStep3) {
this.modal.setState(this.modal.step2);
}
}
}
class Step4 extends ModalState {
render() {
$(".step").hide();
$("#step4").show();
$(".stepStatus").removeClass("active");
$("#step-4").addClass("active");
checkStepStatus();
checkPicture();
}
next() {
if (checkPicture()) {
this.modal.setState(this.modal.step5);
}
}
prev() {
this.modal.setState(this.modal.step3);
}
}
class Step5 extends ModalState {
render() {
$(".step").hide();
$("#step5").show();
$(".stepStatus").removeClass("active");
$("#step-5").addClass("active");
checkStepStatus();
}
next() {
this.modal.setState(this.modal.step6);
}
prev() {
this.modal.setState(this.modal.step4);
}
}
class Step6 extends ModalState {
render() {
$(".step").hide();
$("#step6").show();
$(".stepStatus").removeClass("active");
$("#step-6").addClass("active");
checkStepStatus();
checkStep5();
}
prev() {
this.modal.setState(this.modal.step5);
}
}
class Modal {
constructor() {
this.step1 = new Step1(this);
this.step2 = new Step2(this);
this.step3 = new Step3(this);
this.step4 = new Step4(this);
this.step5 = new Step5(this);
this.step6 = new Step6(this);
this.currentState = this.step1;
this.formData = {};
this.initEventListeners();
this.currentState.render();
}
setState(state) {
this.currentState = state;
this.currentState.render();
}
initEventListeners() {
$("#nextStep1").on("click", () => this.currentState.next());
$("#nextStep2").on("click", () => this.currentState.next());
$("#nextStep3").on("click", () => this.currentState.next());
$("#nextStep4").on("click", () => this.currentState.next());
$("#nextStep5").on("click", () => this.currentState.next());
$("#prevStep2").on("click", () => this.currentState.prev());
$("#prevStep3").on("click", () => this.currentState.prev());
$("#prevStep4").on("click", () => this.currentState.prev());
$("#prevStep5").on("click", () => this.currentState.prev());
$("#prevStep6").on("click", () => this.currentState.prev());
}
}
const modal = new Modal();
});
function saveFullData() {
//var hasbreaktime = "false";
//if ($('#BreakTime').prop('checked')) {
// hasbreaktime = $("#BreakTime").prop("checked") ? "true" : "false";
//} else if ($('#BreakTimeFirst').prop('checked')) {
// hasbreaktime = $("#BreakTimeFirst").prop("checked") ? "true" : "false";
//}
//var breaktimevalue = $("#TimeOnly").val();
//var FridayWork = "Default";
//if ($('#Friday1').prop('checked')) {
// FridayWork = "Default";
//} else if ($('#Friday2').prop('checked')) {
// FridayWork = "WorkInFriday";
//}
//var HolidayWork = "Default";
//if ($('#HolidayWork1').prop('checked')) {
// HolidayWork = "Default";
//} else if ($('#HolidayWork2').prop('checked')) {
// HolidayWork = "WorkInHolidays";
//}
//command.push({ name: 'Command.CreateCustomizeEmployeeSettings.BreakTime.HasBreakTimeValue', value: hasbreaktime });
//command.push({ name: 'Command.CreateCustomizeEmployeeSettings.BreakTime.BreakTimeValue', value: breaktimevalue });
//command.push({ name: 'Command.CreateCustomizeEmployeeSettings.FridayWork', value: FridayWork });
//command.push({ name: 'Command.CreateCustomizeEmployeeSettings.HolidayWork', value: HolidayWork });
var formData = new FormData();
var command = $('#create-form').serializeArray();
command.forEach(function (item) {
formData.append(item.name, item.value);
});
formData.append("Command.CreateCustomizeEmployeeSettings.BreakTime.HasBreakTimeValue", $('#BreakTime').prop('checked') || $('#BreakTimeFirst').prop('checked') ? "true" : "false");
formData.append("Command.CreateCustomizeEmployeeSettings.BreakTime.BreakTimeValue", $("#TimeOnly").val());
formData.append("Command.CreateCustomizeEmployeeSettings.FridayWork", $('#Friday1').prop('checked') ? "Default" : "WorkInFriday");
formData.append("Command.CreateCustomizeEmployeeSettings.HolidayWork", $('#HolidayWork1').prop('checked') ? "Default" : "WorkInHolidays");
let pic1 = $("#pic1").attr('src');
let pic2 = $("#pic2").attr('src');
if (pic1) formData.append("Command.RollCallUploadEmployeePicture.Picture1", pic1);
if (pic2) formData.append("Command.RollCallUploadEmployeePicture.Picture2", pic2);
if (currentUrl.includes("/Client/Company/Employees/EmployeeList")) {
employeeBankInfos.forEach((item, index) => {
formData.append(`Command.EmployeeBankInfos[${index}].BankId`, item.BankId);
formData.append(`Command.EmployeeBankInfos[${index}].BankAccountNumber`, item.BankAccountNumber);
formData.append(`Command.EmployeeBankInfos[${index}].CardNumber`, item.CardNumber);
formData.append(`Command.EmployeeBankInfos[${index}].ShebaNumber`, item.ShebaNumber);
});
pictures.forEach((item, index) => {
formData.append(`Command.EmployeeDocumentItems[${index}].Label`, item.Label);
formData.append(`Command.EmployeeDocumentItems[${index}].PictureFile`, item.PictureFile);
});
}
let saveURL = currentUrl.includes("/Client/Company/Employees/EmployeeList") ? saveEmployeeURL : saveUrlRollCall;
$.ajax({
url: saveURL,
method: "POST",
data: formData,
processData: false,
contentType: false,
headers: { 'RequestVerificationToken': antiForgeryToken },
success: (response) => {
if (response.success) {
if (currentUrl.includes("/Client#showmodal=/Client/Company/Employees/EmployeeList?handler=CreateEmployee")) {
// do it something
// it's for dashboard home
} else if (currentUrl.includes("/Client/Company/Employees/EmployeeList")) {
$('#loadEmployeesAjax').html('');
loadEmployee('', '');
} else {
pageIndexMain = 0;
searchName = $('#personnelSearch').val();
$('#filterRemove').removeClass('disable');
$('#ajaxDataLoad').html('');
$('#loadingSkeleton').css('display', 'contents');
loadDataAjax();
}
$("#MainModal").modal("hide");
$('.alert-success-msg').show();
$('.alert-success-msg p').text(response.message);
setTimeout(function () {
$('.alert-success-msg').hide();
$('.alert-success-msg p').text('');
}, 1000);
} else {
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 1000);
}
},
error: (err) => {
$('.alert-msg').show();
$('.alert-msg p').text(err.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text(err.message);
}, 4000);
}
});
}
function checkStepStatus() {
$('.stepStatus').each(function () {
if ($(this).hasClass("active")) {
$('.navbarBtn').animate({
scrollLeft: $(this).offset().left - $('.navbarBtn').offset().left + $('.navbarBtn').scrollLeft()
}, 500);
}
});
}
//function checkAndDisableButtons() {
// if ($('.SaveFullData.disable').length > 0) {
// $('.SaveFullData').addClass('disable');
// } else {
// $('.SaveFullData').removeClass('disable');
// }
//}
function validateField(selector, message) {
$(selector).addClass("errored");
$('.alert-msg').show();
$('.alert-msg p').text(message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text("");
$(selector).removeClass("errored");
}, 3500);
}

View File

@@ -0,0 +1,305 @@
function openCreateLeftWorkSingleEmployeeModal(employeeId, fullName) {
AjaxUrlContentModal(`/Client/Company/Employees/EmployeeList?handler=CreateLeftWorkSingleEmployee&employeeId=${encodeURIComponent(employeeId)}&fullName=${encodeURIComponent(fullName)}`);
}
function openCreateLeftWorkEmployeeModal() {
AjaxUrlContentModal('/Client/Company/Employees/EmployeeList?handler=CreateLeftWorkEmployee');
}
function openCreateEmployeeModal() {
AjaxUrlContentModal('/Client/Company/Employees/EmployeeList?handler=CreateEmployee');
}
$(document).ready(function () {
var nationalCode = '';
var employeeFullName = '';
loadEmployee(nationalCode, employeeFullName);
});
$('#searchBtn, .btn-search-mobile').click(function () {
$('#loadEmployeesAjax').html('');
var isMobile = $(this).hasClass('btn-search-mobile');
var nationalCode = isMobile ? $('#NationalCodeMobile').val().trim() : $('#NationalCode').val().trim();
var employeeFullName = isMobile ? $('#EmployeeFullNameMobile').val().trim() : $('#EmployeeFullNamePersonal').val().trim();
if (nationalCode !== '' || employeeFullName !== '') {
$('#filterRemove, #filterRemoveMobile').removeClass('disable');
} else {
$('#filterRemove, #filterRemoveMobile').addClass('disable');
}
if (isMobile) {
$('#searchModal').modal('toggle');
}
loadEmployee(nationalCode, employeeFullName);
});
function loadEmployee(nationalCode, employeeFullName) {
var html = '';
var index = 0;
$.ajax({
async: true,
contentType: 'charset=utf-8',
dataType: 'json',
type: 'GET',
url: employeesAjaxLoadData,
data: {
'SearchModel.NationalCode': nationalCode,
'SearchModel.EmployeeFullName': employeeFullName
},
headers: { "RequestVerificationToken": antiForgeryToken },
success: function (response) {
var employeeList = response.data.personnelInfoViewModels;
if (response.success) {
employeeList.forEach(function(item) {
index++;
html += `
<div></div>
<div class="Rtable-row align-items-center openAction ${item.black ? "withdraw" : ""} ${item.createdByClient ? "pendingPersonnel" : ""} ${item.lefWorkTemp ? "leftWorkSectionDiv" : ""} " id="EmployeesListIntro">
<div class="Rtable-cell width1">
<div class="Rtable-cell--content">
<span class="d-flex justify-content-center">
${index}
<div class="d-none idPersonnel">${item.employeeId}</div>
</span>
</div>
</div>
<div class="Rtable-cell width2">
<div class="Rtable-cell--content text-start">${item.fullName}</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width3">
<div class="Rtable-cell--content text-center">${item.personnelCode}</div>
</div>`;
if (item.createdByClient) {
html += `<div class="Rtable-cell widthAllPending">
<div class="Rtable-cell--content text-center pendingStatus">درحال بررسی</div>
</div>
</div>
`;
} else if (item.lefWorkTemp) {
html += `
<div class="Rtable-cell widthleftWorking">
<div class="Rtable-cell--content text-center pendingStatus">درحال بررسی ترک کار</div>
</div>
</div>`;
} else {
html += `<div class="Rtable-cell d-md-block d-none width4">
<div class="Rtable-cell--content text-center">`;
if (item.maritalStatus) {
html += `<div>${item.maritalStatus}</div>`;
} else {
html += `<div>-</div>`;
}
html += `</div>
</div>
<div class="Rtable-cell d-md-block d-none width5">
<div class="Rtable-cell--content text-center">${item.nationalCode}</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width6">
<div class="Rtable-cell--content text-center">${item.idNumber}</div>
</div>
<div class="Rtable-cell d-md-block d-none width7">
<div class="Rtable-cell--content text-center">${item.dateOfBirthFa}</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width8">
<div class="Rtable-cell--content text-start">${item.fatherName}</div>
</div>
<div class="Rtable-cell d-md-block d-none width9">
<div class="Rtable-cell--content text-center">${item.childrenList.length}</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width12">
<div class="Rtable-cell--content text-center">`;
if (item.lastStartContractWork) {
html += `<div>${item.lastStartContractWork}</div>`;
} else {
html += `<div>-</div>`;
}
html += `</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width13">
<div class="Rtable-cell--content text-center">`;
if (item.lastLeftContractWork) {
html += `<div>${item.lastLeftContractWork}</div>`;
} else {
html += `<div>-</div>`;
}
html += `</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width14">
<div class="Rtable-cell--content text-center">`;
if (item.lastStartInsuranceWork) {
html += `<div>${item.lastStartInsuranceWork}</div>`;
} else {
html += `<div>-</div>`;
}
html += `</div>
</div>
<div class="Rtable-cell d-xxl-block d-none width15">
<div class="Rtable-cell--content text-center">`;
if (item.lastLeftInsuranceWork) {
html += `<div>${item.lastLeftInsuranceWork}</div>`;
} else {
html += `<div>-</div>`;
}
html += `</div>
</div>
<div class="Rtable-cell width10">
<div class="Rtable-cell--content text-center">`;
if (item.contractPerson) {
html +=
`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9" fill="#BEF264" />
<path d="M12 21C14.0822 21 16.1 20.278 17.7095 18.9571C19.3191 17.6362 20.4209 15.798 20.8271 13.7558C21.2333 11.7136 20.9188 9.59376 19.9373 7.75743C18.9558 5.9211 17.3679 4.48191 15.4442 3.68508C13.5205 2.88826 11.38 2.78311 9.38744 3.38754C7.3949 3.99197 5.67358 5.26858 4.51677 6.99987C3.35997 8.73115 2.83925 10.81 3.04334 12.8822C3.24743 14.9543 4.1637 16.8916 5.63604 18.364" stroke="#3F6212" stroke-width="1.2" stroke-linecap="round" />
<path d="M16 10L12.402 14.3175C11.7465 15.1042 11.4187 15.4976 10.9781 15.5176C10.5375 15.5375 10.1755 15.1755 9.45139 14.4514L8 13" stroke="#3F6212" stroke-width="1.2" stroke-linecap="round" />
</svg>`;
} else {
html +=
`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9" fill="#FCA5A5" />
<path d="M12 21C14.0822 21 16.1 20.278 17.7095 18.9571C19.3191 17.6362 20.4209 15.798 20.8271 13.7558C21.2333 11.7136 20.9188 9.59376 19.9373 7.75743C18.9558 5.9211 17.3679 4.48191 15.4442 3.68508C13.5205 2.88826 11.38 2.78311 9.38744 3.38754C7.3949 3.99197 5.67358 5.26858 4.51677 6.99987C3.35997 8.73115 2.83925 10.81 3.04334 12.8822C3.24743 14.9543 4.1637 16.8916 5.63604 18.364" stroke="#B91C1C" stroke-width="1.2" stroke-linecap="round" />
<path d="M8 12H16" stroke="#B91C1C" stroke-width="1.2" stroke-linecap="round" />
</svg>`;
}
html += `</div>
</div>
<div class="Rtable-cell width11">
<div class="Rtable-cell--content text-center">`;
if (item.insurancePerson) {
html +=
`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9" fill="#BEF264" />
<path d="M12 21C14.0822 21 16.1 20.278 17.7095 18.9571C19.3191 17.6362 20.4209 15.798 20.8271 13.7558C21.2333 11.7136 20.9188 9.59376 19.9373 7.75743C18.9558 5.9211 17.3679 4.48191 15.4442 3.68508C13.5205 2.88826 11.38 2.78311 9.38744 3.38754C7.3949 3.99197 5.67358 5.26858 4.51677 6.99987C3.35997 8.73115 2.83925 10.81 3.04334 12.8822C3.24743 14.9543 4.1637 16.8916 5.63604 18.364" stroke="#3F6212" stroke-width="1.2" stroke-linecap="round" />
<path d="M16 10L12.402 14.3175C11.7465 15.1042 11.4187 15.4976 10.9781 15.5176C10.5375 15.5375 10.1755 15.1755 9.45139 14.4514L8 13" stroke="#3F6212" stroke-width="1.2" stroke-linecap="round" />
</svg>`;
} else {
html +=
`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9" fill="#FCA5A5" />
<path d="M12 21C14.0822 21 16.1 20.278 17.7095 18.9571C19.3191 17.6362 20.4209 15.798 20.8271 13.7558C21.2333 11.7136 20.9188 9.59376 19.9373 7.75743C18.9558 5.9211 17.3679 4.48191 15.4442 3.68508C13.5205 2.88826 11.38 2.78311 9.38744 3.38754C7.3949 3.99197 5.67358 5.26858 4.51677 6.99987C3.35997 8.73115 2.83925 10.81 3.04334 12.8822C3.24743 14.9543 4.1637 16.8916 5.63604 18.364" stroke="#B91C1C" stroke-width="1.2" stroke-linecap="round" />
<path d="M8 12H16" stroke="#B91C1C" stroke-width="1.2" stroke-linecap="round" />
</svg>`;
}
html += `</div>
</div>
<div class="Rtable-cell width16">
<div class="Rtable-cell--content text-end d-flex justify-content-end">
<button class="btn-leftwork ${item.black ? "disable" : ""}" type="button" onclick="openCreateLeftWorkSingleEmployeeModal(${item.employeeId}, '${item.fullName}')">
<svg width="23" height="23" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.375 18.2085C14.375 16.0914 11.8006 14.3752 8.625 14.3752C5.44936 14.3752 2.875 16.0914 2.875 18.2085M16.2917 13.4168L18.2083 11.5002M18.2083 11.5002L20.125 9.5835M18.2083 11.5002L16.2917 9.5835M18.2083 11.5002L20.125 13.4168M8.625 11.5002C6.50791 11.5002 4.79167 9.78388 4.79167 7.66683C4.79167 5.54974 6.50791 3.8335 8.625 3.8335C10.7421 3.8335 12.4583 5.54974 12.4583 7.66683C12.4583 9.78388 10.7421 11.5002 8.625 11.5002Z" stroke="#475569" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<button class="btn-print" type="button" onclick="AjaxUrlContentModal('/Client/Company/EmployeeList?handler=PrintOnePersonnelInfo&employeeId=${item.employeeId}');">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor">
<path d="M15.0001 11.2493H15.139C16.0279 11.2493 16.4723 11.2493 16.759 10.9866C16.7805 10.967 16.801 10.9464 16.8207 10.9249C17.0834 10.6382 17.0834 10.1938 17.0834 9.3049V9.3049C17.0834 7.52714 17.0834 6.63826 16.558 6.06484C16.5187 6.02194 16.4775 5.98077 16.4346 5.94146C15.8612 5.41602 14.9723 5.41602 13.1945 5.41602H6.91675C5.03113 5.41602 4.08832 5.41602 3.50253 6.0018C2.91675 6.58759 2.91675 7.5304 2.91675 9.41602V10.2493C2.91675 10.7208 2.91675 10.9565 3.06319 11.1029C3.20964 11.2493 3.44534 11.2493 3.91675 11.2493H5.00008"></path>
<path d="M5.41675 16.3903L5.41675 9.91732C5.41675 8.97451 5.41675 8.5031 5.70964 8.21021C6.00253 7.91732 6.47394 7.91732 7.41675 7.91732L12.5834 7.91732C13.5262 7.91732 13.9976 7.91732 14.2905 8.21021C14.5834 8.5031 14.5834 8.97451 14.5834 9.91732L14.5834 16.3903C14.5834 16.7068 14.5834 16.8651 14.4796 16.9399C14.3758 17.0148 14.2256 16.9647 13.9253 16.8646L12.2572 16.3086C12.1712 16.2799 12.1282 16.2656 12.0839 16.2669C12.0396 16.2682 11.9975 16.285 11.9134 16.3187L10.1858 17.0097C10.0941 17.0464 10.0482 17.0647 10.0001 17.0647C9.95194 17.0647 9.90609 17.0464 9.81439 17.0097L8.0868 16.3187C8.00267 16.285 7.9606 16.2682 7.91627 16.2669C7.87194 16.2656 7.82896 16.2799 7.74299 16.3086L6.07486 16.8646C5.77455 16.9647 5.62439 17.0148 5.52057 16.9399C5.41675 16.8651 5.41675 16.7068 5.41675 16.3903Z"></path>
<path d="M7.91675 11.25L11.2501 11.25" stroke-linecap="round"></path>
<path d="M7.91675 13.75L12.0834 13.75" stroke-linecap="round"></path>
<path d="M14.5834 5.41732V5.41732C14.5834 3.97799 14.5834 3.25833 14.1954 2.76756C14.1087 2.65791 14.0095 2.55874 13.8998 2.47204C13.4091 2.08398 12.6894 2.08398 11.2501 2.08398H8.75008C7.31076 2.08398 6.5911 2.08398 6.10032 2.47204C5.99068 2.55874 5.8915 2.65791 5.8048 2.76756C5.41675 3.25833 5.41675 3.97799 5.41675 5.41732V5.41732"></path>
</svg>
</button>
</div>
</div>
</div>
</div>
<div class="operation-div w-100" style="margin: -2px 0 0 0;">
<div class="operations-btns">
<div class="container-fluid px-0">
<div class="row d-grid grid-personal align-items-center g-2">
<div class="col text-center">
<a class="loadingButton" onclick="AjaxUrlContentModal('@Url.Page("./Index", "PrintOnePersonnelInfo", new { employeeId = @item.EmployeeId })');" style="cursor:pointer" id="btnCardLeaveIntro">
<div class="card card-btn">
<div class="d-flex align-items-center justify-content-start p-1 imgP">
<img src="~/AssetsClient/images/personalList.png" alt="leave" class="img-fluid" width="50px"/>
<div class="text-start ms-2">
<div class="card-title">جزئیات پرسنل</div>
<p class="m-0 card-description d-none d-md-block">مشاهده و پرینت جزئیات پرسنل</p>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</div>
</a>
</div>
@* <div class="col text-center">
<a class="loadingButton" asp-page="/Company/Employees/Leave" asp-route-workshopId="@item.WorkshopId" asp-route-employeeId="@item.EmployeeId" style="cursor:pointer" id="btnCardLeaveIntro">
<div class="card card-btn">
<div class="d-flex align-items-center justify-content-start p-1 imgP">
<img src="~/AssetsClient/images/icons/leave.png" alt="leave" class="img-fluid" width="50px"/>
<div class="text-start ms-2">
<div class="card-title">عملیات مربوط به مرخصی</div>
<p class="m-0 card-description d-none d-md-block">لیست مرخصی - ثبت مرخصی</p>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</div>
</a>
</div> *@
<div class="col text-center">
<a class="loadingButton" onclick="AjaxUrlContentModal('@Url.Page("./Index", "LeaveCreate", new { employeeId = @item.EmployeeId, workshopId = @item.WorkshopId })');" style="cursor:pointer" id="btnCardLeaveIntro">
<div class="card card-btn">
<div class="d-flex align-items-center justify-content-start p-1 imgP">
<img src="~/AssetsClient/images/icons/leave.png" alt="leave" class="img-fluid" width="50px"/>
<div class="text-start ms-2">
<div class="card-title">ثبت مرخصی</div>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</div>
</a>
</div>
<div class="col text-center">
<a class="loadingButton" onclick="AjaxUrlContentModal('@Url.Page("./Index", "ContractCheckoutStatus", new { employeeId = @item.EmployeeId, workshopId = @item.WorkshopId })');" style="cursor:pointer" id="btnCardStatusIntro">
<div class="card card-btn">
<div class="d-flex align-items-center justify-content-start p-1 imgP">
<img src="~/AssetsClient/images/icons/statistics.png" alt="statistics" class="img-fluid" width="50px"/>
<div class="text-start ms-2">
<div class="card-title">گزارش وضعیت</div>
<p class="m-0 card-description d-none d-md-block">گزارش وضعیت قرارداد و تصفیه حساب</p>
</div>
</div>
<div class="spinner-loading loading" style="display: none;">
<span class="spinner-border spinner-border-sm text-white" role="status" aria-hidden="true"></span>
</div>
</div>
</a>
</div>
</div>
</div>
</div>
</div>`;
}
});
$('#loadEmployeesAjax').append(html);
} else {
html += `<div class="text-center bg-white d-flex align-items-center justify-content-center">
<div class="">
<img src="/assetsclient/images/empty.png" alt="" class="img-fluid" />
<h5>اطلاعاتی وجود ندارد.</h5>
</div>
</div>`;
$('#loadEmployeesAjax').append(html);
}
},
failure: function (response) {
console.log(response);
}
});
}

View File

@@ -0,0 +1,205 @@
var currentUrl = window.location.href;
var goToStep2 = false;
$(document).ready(function () {
$("#nationalCode").mask("0000000000");
$("#birthDate").each(function () {
let element = $(this);
element.on('input', function () {
let value = convertPersianNumbersToEnglish(element.val());
element.val(value);
});
new Cleave(this, {
date: true,
delimiter: '/',
datePattern: ['Y', 'm', 'd']
});
});
$(".checkNationalCodeAndBirthDate").click(function () {
let lastNationalCode = "";
const nationalCode = $('#nationalCode').val();
const birthDate = $('#birthDate').val();
checkNationalCodeAndBirthday();
if (nationalCode.length === 10 && birthDate.length === 10) {
if (nationalCode !== lastNationalCode) {
checkNationalCode(nationalCode, birthDate);
lastNationalCode = nationalCode;
}
} else {
lastNationalCode = "";
}
});
});
function checkNationalCodeAndBirthday() {
let nationalCode = $("#nationalCode").val().trim();
let birthDate = $("#birthDate").val().trim();
if (nationalCode === "") {
validateField("#nationalCode", "لطفا شماره ملی پرسنل را وارد کنید.");
return false;
} else if (!/^\d{10}$/.test(nationalCode)) {
validateField("#nationalCode", "شماره ملی باید ۱۰ رقم باشد.");
return false;
}
if (birthDate === "") {
validateField("#birthDate", "لطفا تاریخ تولد پرسنل را وارد کنید.");
return false;
} else if (!/^\d{4}[-\/]\d{2}[-\/]\d{2}$/.test(birthDate) || birthDate.length !== 10) {
validateField("#birthDate", "تاریخ تولد را به درستی وارد کنید.");
return false;
}
return true;
}
function checkNationalCode(nationalCode, birthDate) {
let checkNationalUrl = '';
if (currentUrl.includes("/Client/Company/RollCall/EmployeeUploadPicture")) {
checkNationalUrl = getRollCallDataByNationalCodeUrl;
} else {
checkNationalUrl = getEmployeeDataByNationalCodeUrl;
}
$("#IdentityLoading").show();
$.ajax({
async: false,
url: checkNationalUrl,
method: "GET",
data: { nationalCode: nationalCode, birthDate: birthDate },
success: (response) => {
if (response.isSuccedded) {
if (response.data) {
$(".saveData").prop("disabled", false);
$("#IdentityLoading").hide();
//$(".checkByNationalCode").each(function () {
// $(this).addClass("disable");
//});
$("#nationalCodeStep2").val(nationalCode);
$("#birthDateStep2").val(birthDate);
var defaultPersonnelCode = $("#personnelCode").text();
if (response.data.personnelCode) {
$("#personnelCodeStep2").text(response.data.personnelCode);
} else {
$("#personnelCodeStep2").text(defaultPersonnelCode);
}
if (response.data.nationality === "غیرایرانی") {
$("#NationalitySelect").val(recommendedValue2).trigger('change');
} else {
$("#NationalitySelect").val(response.data.nationality).trigger('change');
}
if (response.data.gender === "مرد") {
$("#gender1").prop("checked", true);
} else if (response.data.gender === "زن") {
$("#gender2").prop("checked", true);
} else {
$("#gender2").prop("checked", false);
$("#gender1").prop("checked", false);
$(".mightBeNullDB2").removeClass("disable");
}
// Disable Military Service Card form Step 6
if (currentUrl.includes("/Client/Company/Employees/EmployeeList")) {
if (response.data.gender === "زن") {
$('#MilitaryServiceCardSection').addClass('disable');
$('#requiredStar').hide();
} else {
$('#MilitaryServiceCardSection').removeClass('disable');
$('#requiredStar').show();
}
}
if (response.data.maritalStatus === "مجرد") {
$("#marriage2").prop("checked", true);
} else if (response.data.maritalStatus === "متاهل") {
$("#marriage1").prop("checked", true);
} else {
$("#marriage1").prop("checked", false);
$("#marriage2").prop("checked", false);
$(".mightBeNullDB3").removeClass("disable");
}
$("#firstName").val(response.data.employeeFName);
$("#lastName").val(response.data.employeeLName);
$(".checkByHistoryCode2").removeClass("disable");
if (response.data.picture1 && response.data.picture2) {
// Ensure the images are not empty
if (response.data.picture1 !== "" && response.data.picture2 !== "") {
take_snapshot1("data:image/jpeg;base64," + response.data.picture1);
take_snapshot2("data:image/jpeg;base64," + response.data.picture2);
} else {
// Handle the case where the images are empty
//console.log("One or both images are empty");
}
}
$(".validateLoading .loading").hide();
goToStep2 = true;
//$('.alert-msg').show();
//$('.alert-msg p').text("اطلاعات پرسنل وجود دارد.");
//setTimeout(function () {
// $('.alert-msg').hide();
// $('.alert-msg p').text('');
//
//}, 1000);
} else {
$(".checkByNationalCode").each(function () {
$(this).removeClass("disable");
});
$("#IdentityLoading").hide();
}
} else {
//$(".saveData").prop("disabled", true);
$(".checkByNationalCode").each(function () {
$(this).addClass("disable");
});
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text(response.message);
}, 3500);
$("#IdentityLoading").hide();
goToStep2 = false;
}
},
error: (err) => {
$('.alert-msg').show();
$('.alert-msg p').text(err.message);
$(".checkByNationalCode").each(function () {
$(this).addClass("disable");
});
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text(err.message);
}, 3500);
$("#IdentityLoading").hide();
goToStep2 = false;
}
});
}

View File

@@ -0,0 +1,300 @@
$(document).ready(function () {
$(".select2Option").select2({
language: "fa",
dir: "rtl",
dropdownParent: $('#MainModal'),
templateResult: function (data, container) {
if (data.element) {
$(container).addClass($(data.element).attr("class"));
}
return data.text;
}
}).on("change", function (e) {
var selectedValue = $(this).val();
var lastDayStanding = $('.lastDayStanding').val();
var dayOfLeftWork = $('.dayOfLeftWork').val();
if (selectedValue && lastDayStanding && dayOfLeftWork) {
$('#createData').removeClass('disable');
} else {
$('#createData').addClass('disable');
}
}).on("select2:clearing", function (e) {
var selectedValue = $(this).val();
var lastDayStanding = $('.lastDayStanding').val();
var dayOfLeftWork = $('.dayOfLeftWork').val();
if (selectedValue && lastDayStanding && dayOfLeftWork) {
$('#createData').removeClass('disable');
} else {
$('#createData').addClass('disable');
}
}).on("select2:unselecting", function (e) {
var selectedValue = $(this).val();
var lastDayStanding = $('.lastDayStanding').val();
var dayOfLeftWork = $('.dayOfLeftWork').val();
if (selectedValue && lastDayStanding && dayOfLeftWork) {
$('#createData').removeClass('disable');
} else {
$('#createData').addClass('disable');
}
});
//$(".form-control-date").each(function () {
// let element = $(this);
// element.on('input', function () {
// let value = convertPersianNumbersToEnglish(element.val());
// element.val(value);
// });
// new Cleave(this, {
// date: true,
// delimiter: '/',
// datePattern: ['Y', 'm', 'd']
// });
//});
$(".form-control-date").mask("0000/00/00");
convertToJalaliAndAdjust('.lastDayStanding', '.dayOfLeftWork', +1);
convertToJalaliAndAdjust('.dayOfLeftWork', '.lastDayStanding', -1);
ajaxPersonals();
});
function convertToJalaliAndAdjust(inputSelector, targetSelector, change) {
$(inputSelector).on('input', function () {
let inputValue = $(this).val().trim();
let targetInput = $(targetSelector);
let parts = inputValue.split('/');
if (inputValue.length === 10) {
if (parts.length === 3) {
let year = parts[0];
let month = normalizeNumber(parts[1]);
let day = normalizeNumber(parts[2]);
if (isValidJalaliDate(year, month, day)) {
let gregorianDate = jalaali.toGregorian(parseInt(year), parseInt(month), parseInt(day));
if (isNaN(gregorianDate.gy) || isNaN(gregorianDate.gm) || isNaN(gregorianDate.gd)) {
console.error("Invalid Gregorian date conversion.");
return;
}
let date = new Date(gregorianDate.gy, gregorianDate.gm - 1, gregorianDate.gd);
date.setDate(date.getDate() + change);
let newJalaliDate = jalaali.toJalaali(date.getFullYear(), date.getMonth() + 1, date.getDate());
let formattedDate = newJalaliDate.jy + '/' +
('0' + newJalaliDate.jm).slice(-2) + '/' +
('0' + newJalaliDate.jd).slice(-2);
targetInput.val(formattedDate);
dayOfWeekLoad(this, inputValue);
dayOfWeekLoad(targetInput, targetInput.val());
}
}
updateBtnCreate();
} else {
targetInput.val('');
updateBtnCreate();
$('.lastDayStandingTxt').hide();
$('.dayOfLeftWorkTxt').hide();
}
});
}
function normalizeNumber(num) {
return num.toString().padStart(2, '0');
}
function isValidJalaliDate(year, month, day) {
let isLeap = jalaali.isLeapJalaaliYear(year);
if (month < 1 || month > 12 || day < 1) return false;
if (month <= 6 && day > 31) return false;
if (month > 6 && month < 12 && day > 30) return false;
if (month === 12 && day > (isLeap ? 30 : 29)) return false;
return true;
}
function updateBtnCreate() {
var employeeSelect = $('#employeeSelect').val();
var lastDayStanding = $('.lastDayStanding').val();
var dayOfLeftWork = $('.dayOfLeftWork').val();
if (employeeSelect && lastDayStanding && dayOfLeftWork) {
$('#createData').removeClass('disable');
} else {
$('#createData').addClass('disable');
}
}
function dayOfWeekLoad(input, value) {
if (value.length !== 10)
return;
$.ajax({
url: dayOfWeekDataUrl,
type: 'GET',
data: { dateFa: value },
success: function (response) {
if (response.success) {
const $groupBox = $(input).closest('.dayOfWeek');
if ($(input).hasClass('lastDayStanding')) {
$groupBox.find('.lastDayStandingTxt').text(response.message);
} else if ($(input).hasClass('dayOfLeftWork')) {
$groupBox.find('.dayOfLeftWorkTxt').text(response.message);
}
$('.lastDayStandingTxt').show();
$('.dayOfLeftWorkTxt').show();
} else {
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3500);
$('.lastDayStandingTxt').hide();
$('.dayOfLeftWorkTxt').hide();
}
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
}
});
}
function ajaxPersonals() {
$.ajax({
url: employeeListAjax,
type: 'GET',
success: function (response) {
if (response.success) {
var employees = response.data;
var employeeOptionsHtml = '<option value="" disabled>انتخاب پرسنل ...</option>';
employees.forEach(function (employee) {
employeeOptionsHtml += `<option value="${employee.id}">${employee.employeeFullName}</option>`;
});
$('#employeeSelect').html(employeeOptionsHtml);
} else {
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3500);
}
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
}
});
}
$("#createData").click(function () {
var loading = $('#createData .spinner-loading');
var employeeSelect = $('#employeeSelect').val();
var lastDayStanding = $('.lastDayStanding');
var dayOfLeftWork = $('.dayOfLeftWork');
if (employeeSelect.length === 0) {
$('.alert-msg').show();
$('.alert-msg p').text('لطفا اسامی پرسنل را کلیک و مشخص نمائید');
$('.select-alert').addClass('errored');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
$('.select-alert').removeClass('errored');
}, 3500);
return;
}
if (lastDayStanding.val().length !== 10) {
lastDayStanding.addClass('errored');
$('.alert-msg').show();
$('.alert-msg p').text('لطفا تاریخ را به درستی وارد نمائید');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
lastDayStanding.removeClass('errored');
}, 3500);
return;
}
if (dayOfLeftWork.val().length !== 10) {
dayOfLeftWork.addClass('errored');
$('.alert-msg').show();
$('.alert-msg p').text('لطفا تاریخ را به درستی وارد نمائید');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
dayOfLeftWork.removeClass('errored');
}, 3500);
return;
}
$('#createData').addClass('disable');
var data = $('#create-form').serialize();
$.ajax({
async: true,
dataType: 'json',
type: 'POST',
url: saveLeftWorkAjax,
headers: { "RequestVerificationToken": antiForgeryToken },
data: data,
success: function (response) {
if (response.success) {
loading.show();
$('.alert-success-msg').show();
$('.alert-success-msg p').text(response.message);
setTimeout(function () {
$('.alert-success-msg').hide();
$('.alert-success-msg p').text('');
}, 1500);
//if (urlPathname.indexOf('/Client/Company/SalaryAid') > -1) {
// $('#salaryaidListAjax').html('');
// $('#PageIndex').val(0);
// pageIndexJs = 0;
// loadSalaryAidList();
// //window.location.reload();
//}
$('#loadEmployeesAjax').html('');
loadEmployee();
loading.hide();
$('#MainModal').modal('hide');
} else {
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3500);
loading.hide();
$('#createData').removeClass('disable');
}
},
error: function (err) {
loading.hide();
$('#createData').removeClass('disable');
console.log(err);
}
});
});

View File

@@ -0,0 +1,308 @@
var pictures = [];
var targetSrc = '/assetsclient/images/pd-image.png';
var penidngMessage = `<div class="penidngMessage">درحال برسی</div>`;
var pendingIcon = `<svg width="24" height="24" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11 19.25C15.5563 19.25 19.25 15.5563 19.25 11C19.25 6.44365 15.5563 2.75 11 2.75C6.44365 2.75 2.75 6.44365 2.75 11C2.75 15.5563 6.44365 19.25 11 19.25Z" fill="#FDBA74"/><path d="M11.4168 14.6667C11.4168 14.8968 11.2303 15.0833 11.0002 15.0833C10.77 15.0833 10.5835 14.8968 10.5835 14.6667C10.5835 14.4365 10.77 14.25 11.0002 14.25C11.2303 14.25 11.4168 14.4365 11.4168 14.6667Z" fill="white" stroke="white"/><path d="M11 11.916V6.41602V11.916Z" fill="white"/><path d="M11 11.916V6.41602" stroke="white" stroke-width="1.5" stroke-linecap="round"/></svg>`;
var confirmMessage = `<div class="confirmedMessage">تایید شد</div>`;
var confirmIcon = `<svg width="24" height="24" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="7" cy="7" r="5.25" fill="#00C04D"/><path d="M4.66659 7L6.41659 8.75L9.33325 5.25" stroke="white" stroke-linecap="round"/></svg>`;
var rejectMessage = `<div class="rejectMessage">رد شد</div>`;
var rejectIcon = `<svg width="24" height="24" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="7" cy="7" r="5.25" fill="#FF5D5D"/><path d="M9.33341 4.66602L4.66675 9.33268" stroke="white" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/><path d="M4.66659 4.66602L9.33325 9.33268" stroke="white" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
$(document).ready(function () {
$(document).off('click', '.btnUploadingPD').on('click', '.btnUploadingPD', function (event) {
event.preventDefault();
const index = $(this).data('index');
$('input[type="file"][data-index="' + index + '"]').click();
});
updateButtons();
$(document).off('change', '.file-input').on('change', '.file-input', function (e) {
e.preventDefault();
const fileInputFile = this.files[0];
const indexFileValue = $(this).data('index');
const validExtensions = ['jpg', 'jpeg', 'png'];
const label = $(`#label_${indexFileValue}`).val();
const pdBox = $(this).closest('.pdBox');
const img = pdBox.find('.preview-image');
if (fileInputFile) {
const fileName = fileInputFile.name.toLowerCase();
const extension = fileName.split('.').pop();
if (validExtensions.includes(extension)) {
if (fileInputFile.size > 5000000) {
showAlertMessage('.alert-msg', 'لطفا فایل حجم کمتر از 5 مگابایت را آپلود کنید.', 3500);
$(this).val('');
return;
}
// خواندن فایل و نمایش آن
const reader = new FileReader();
reader.onload = function (event) {
img.attr('src', event.target.result);
const base64String = event.target.result.split(',')[1];
const byteCharacters = atob(base64String);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: fileInputFile.type });
const newFile = new File([blob], fileInputFile.name, { type: fileInputFile.type });
let picturesPart = {
Label: label,
PictureFile: newFile
};
pictures.push(picturesPart);
};
reader.readAsDataURL(fileInputFile);
//uploadFile(fileInputFile, indexFileValue, label);
} else {
showAlertMessage('.alert-msg', 'فرمت فایل باید یکی از موارد jpeg, jpg یا png باشد.', 3500);
}
}
});
$(document).off('click', '.btnDeletingPD').on('click', '.btnDeletingPD', function (event) {
event.preventDefault();
const pdBox = $(this).closest('.pdBox');
const img = pdBox.find('.preview-image');
const label = pdBox.find('img').data("label");
swal.fire({
title: "اخطار",
text: "آیا میخواهید عکس را حذف کنید؟",
icon: "warning",
showCancelButton: true,
confirmButtonText: "بله",
cancelButtonText: "خیر",
confirmButtonColor: '#84cc16',
reverseButtons: true
}).then((result) => {
if (result.isConfirmed) {
if (img.length) {
img.attr('src',targetSrc);
}
showAlertMessage('.alert-success-msg', 'عکس با موفقیت حذف شد.', 3500);
pdBox.removeClass('uploaded');
removeImage(label);
updateButtons();
}
});
});
});
var indexCount = 0;
function uploadFile(file, indexId, label) {
const formData = new FormData();
//177 must be replaced with employeeId
formData.append('command.EmployeeId', 177);
formData.append('command.Label', label);
formData.append('command.PictureFile', file);
const pdBox = $('input[data-index="' + indexId + '"]').closest('.pdBox');
const spinner = pdBox.find('.spinner-loading-progress');
const percentageText = pdBox.find('.percentageText');
spinner.show();
$('#createUploadingFiles').prop('disabled', true).addClass('disable');
const xhr = new XMLHttpRequest();
xhr.open('POST', saveUploadFileModalAjax, true);
xhr.setRequestHeader('RequestVerificationToken', antiForgeryToken);
const uploadStartTime = new Date().getTime();
let simulatedProgress = 0;
let actualProgress = 0;
let isUploadComplete = false;
// Simulate progress every 20ms, gradually increasing the bar until the actual progress is reached
const progressInterval = setInterval(function () {
if (simulatedProgress < actualProgress && !isUploadComplete) {
simulatedProgress += 1; // Gradually increase simulated progress
spinner.css('width', `${simulatedProgress}%`);
percentageText.text(`${simulatedProgress}%`);
}
if (simulatedProgress >= 100) {
clearInterval(progressInterval); // Stop once the progress hits 100%
}
}, 30); // Increases by 1% every 20ms, making it smooth
// Actual upload progress listener
xhr.upload.addEventListener('progress', function (e) {
if (e.lengthComputable) {
actualProgress = Math.round((e.loaded / e.total) * 100);
// If the actual progress is slow, allow the simulated progress to match it naturally
if (actualProgress >= simulatedProgress) {
simulatedProgress = actualProgress;
spinner.css('width', `${simulatedProgress}%`);
percentageText.text(`${simulatedProgress}%`);
}
}
});
// On upload completion
xhr.onload = function () {
spinner.css('transition', 'all 2s ease-in');
const uploadEndTime = new Date().getTime();
const timeDiff = uploadEndTime - uploadStartTime;
const minUploadTime = 2500; // Minimum of 2 seconds for the whole process
const response = JSON.parse(xhr.responseText);
isUploadComplete = true; // Mark the upload as complete
const delayTime = Math.max(minUploadTime - timeDiff, 0);
setTimeout(function () {
clearInterval(progressInterval); // Clear the interval when done
simulatedProgress = 100;
spinner.css('width', '100%');
percentageText.text('100%');
if (xhr.status === 200 && response.isSuccedded) {
indexCount++;
const reader = new FileReader();
reader.onload = function (e) {
const pdBox = $('input[data-index="' + indexId + '"]').closest('.pdBox');
const img = pdBox.find('.preview-image');
img.attr('src', e.target.result);
updateButtons();
pdBox.find('.btnDeletingPD').addClass("unsubmitted");
pdBox.addClass("uploaded");
checkStep5();
// Verify the correct hidden input is selected
const label = pdBox.find('img').data("label");
let picturesPart = {
Label: label,
PictureFile: img.attr('src')
};
pictures.push(picturesPart);
};
reader.readAsDataURL(file);
} else {
showAlertMessage('.alert-msg', response.message || 'Error uploading file', 3500);
$('input[type="file"][data-index="' + indexId + '"]').val('');
}
spinner.css('width', '0%'); // Reset the progress bar
spinner.hide();
}, delayTime); // Ensure a minimum of 2 seconds for the full process
};
// Handle upload error
xhr.onerror = function () {
clearInterval(progressInterval); // Stop progress on error
showAlertMessage('.alert-msg', 'مشکلی در آپلود فایل به وجود آمد.', 3500);
$('input[type="file"][data-index="' + indexId + '"]').val('');
spinner.css('width', '0%');
spinner.hide();
handleActiveUploads();
};
xhr.send(formData);
}
function showAlertMessage(selector, message, timeout) {
$(selector).show();
$(selector + ' p').text(message);
setTimeout(function () {
$(selector).hide();
$(selector + ' p').text('');
}, timeout);
}
//function removeEmployeeDocumentByLabel(indexId, employeeId) {
// const label = $(`#label_${indexId}`).val();
// const pdBox = $('input[data-index="' + indexId + '"]').closest('.pdBox');
// $.ajax({
// url: deleteFileAjaxUrl,
// method: 'POST',
// //177 must be replaced with workshopId
// data: { label: label, employeeId: employeeId, workshopId: 177 },
// headers: { 'RequestVerificationToken': antiForgeryToken },
// success: function (response) {
// console.log(response);
// if (response.isSuccedded) {
// showAlertMessage('.alert-success-msg', 'تصویر موجود با موفقیت حذف شد.', 3500);
// $(`#label_${indexId}`).val('');
// pdBox.find('.btnDeletingPD').removeClass("Unsubmitted");
// updateButtons();
// } else {
// showAlertMessage('.alert-success-msg', response.message, 3500);
// }
// },
// error: function (response) {
// showAlertMessage('.alert-msg', response.message, 3500);
// }
// });
//}
function removeImage(label) {
$('.pdBox').each(function () {
var imgSrc = $(this).find('.pdImageBox .preview-image').attr('src');
var deleteButton = $(this).find('.btnDeletingPD');
if (imgSrc === targetSrc) {
deleteButton.addClass('disable');
} else {
deleteButton.removeClass('disable');
}
});
pictures = pictures.filter(image => image.Label !== label);
}
function updateButtons() {
$('.pdBox').each(function () {
var imgSrc = $(this).find('.pdImageBox .preview-image').attr('src');
var deleteButton = $(this).find('.btnDeletingPD');
if (imgSrc === targetSrc) {
deleteButton.addClass('disable');
} else {
deleteButton.removeClass('disable');
}
});
}
function checkStep5() {
const saveData = $('.saveData');
const importantUploadedCount = $(".pdBox.important.uploaded").length;
const importantCount = $(".pdBox.important").length;
const cantSave = importantUploadedCount !== 0 && importantUploadedCount !== importantCount;
const canSave = importantUploadedCount === 0 || importantUploadedCount === importantCount;
if (cantSave) {
saveData.addClass("disable");
} else if (canSave) {
saveData.removeClass("disable");
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,485 @@
//////////////faceapi////////////////
var loadModels = async () => {
await Promise.all([
faceapi.nets.ssdMobilenetv1.loadFromUri("\\weights\\"),
faceapi.nets.faceRecognitionNet.loadFromUri("\\weights\\"),
faceapi.nets.faceLandmark68Net.loadFromUri("\\weights\\")
]);
};
loadModels();
var employeeIdTemp;
var rollCallStatusIdTemp;
$(document).ready(function () {
$("#next-step").on("click", function () {
if ($("#step-form2").is(":visible") && !hasUploadedImage) {
if ($("#workshopSettingSelect").val() === "0") {
$('.alert-msg').show();
$('.alert-msg p').text('لطفا گروه را مشخص نمایید');
$('.errorSelection').addClass("errored");
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
$('.errorSelection').removeClass("errored");
}, 2500);
} else {
set();
}
}
if ($('#step-form1').is(":visible")) {
$('#step-form1').hide();
$('#step-form2').show();
$('#step-2').removeClass('not-step');
$('#prev-step').text('مرحله قبل');
$('#next-step #textShowBtn').text('ثبت');
}
});
$("#prev-step").on("click", function () {
if ($('#desktopDisplay').is(":visible")) {
$("#MainModal").modal("hide");
}
if ($('#step-form1').is(":visible")) {
$("#MainModal").modal("hide");
$('#step-2').addClass('not-step');
$('#prev-step').text('انصراف');
}
if ($('#step-form2').is(":visible")) {
$('#step-form1').show();
$('#step-form2').hide();
$('#step-2').addClass('not-step');
$('#prev-step').text('انصراف');
$('#next-step #textShowBtn').text('مرحله بعد');
}
});
//...........comment for check..............................
//if ($(window).width() > 992) {
// if (hasUploadedImage) {
// $('#desktopDisplay').hide();
// $('#mobileDisplay').show();
// $('#desktopDisplay').html('');
// $('#step-form1').show();
// $('#step-form2').hide();
// $('#next-step').removeClass('disable');
// $('#step-2').addClass('not-step');
// } else {
// $('#footerButtons #submitButton').remove();
// $('#footerButtons #closeButton').removeClass('col-6').addClass('col-12');
// $('#desktopDisplay').show();
// $('#mobileDisplay').hide();
// $('#mobileDisplay').html('');
// }
//}
//if ($(window).width() <= 992) {
// //...........comment for check..............................
// if (!hasUploadedImage) {
// //...........comment for check..............................
// $('#desktopDisplay').hide();
// $('#mobileDisplay').show();
// $('#desktopDisplay').html('');
// //...........comment for check..............................
// } else {
// $('#desktopDisplay').show();
// $('#mobileDisplay').hide();
// $('#mobileDisplay').html('');
// }
// //...........comment for check..............................
//}
//...........comment for check..............................
$(document).on('click', '.upload-image1', function () {
$('.md-modal').addClass('md-show');
$('.take_snapshot1').show();
$('.take_snapshot2').hide();
startCamera();
});
$(document).on('click', '.upload-image2', function () {
$('.md-modal').addClass('md-show');
$('.take_snapshot1').hide();
$('.take_snapshot2').show();
startCamera();
});
$(document).on('click', '.camera_close', function () {
$('.md-modal').removeClass('md-show');
stopCamera();
});
updateSaveButton();
});
//...........comment for check..............................
//window.onload = async () => {
// await loadModels();
// modelsLoaded = true;
//};
//...........comment for check..............................
var modelsLoaded = false;
//...........comment for check..............................
//var ensureModelsLoaded = async () => {
// if (!modelsLoaded) {
// await loadModels();
// modelsLoaded = true;
// }
//};
//...........comment for check..............................
var updateSaveButton = () => {
if (!hasErrorPic1 && checkFace1 && !hasErrorPic2 && checkFace2) {
$('#next-step').removeClass('disable');
} else {
$('#next-step').addClass('disable');
}
};
var runCheckFace1 = async () => {
const img1 = document.getElementById('pic1');
const detectionPromise1 = await faceapi.detectAllFaces(img1).withFaceLandmarks().withFaceDescriptors();
//...........comment for check..............................
if (detectionPromise1.length === 1) {
//...........comment for check..............................
console.log('یک چهره در تصویر اول شناسایی شد');
checkFace1 = true;
hasErrorPic1 = false;
$('#demoResult1').css('border', '2px dashed #148b8b');
//...........comment for check..............................
} else if (detectionPromise1.length > 1) {
$('.alert-msg').show();
$('.alert-msg p').text('بیش از یک چهره در تصویر اول شناسایی شد');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 4000);
hasErrorPic1 = true;
$('#next-step').addClass('disable');
$('.upload-image1').css('background', '#ff090940');
$('#demoResult1').css('border', '2px dashed #ff5c5c');
} else {
$('.alert-msg').show();
$('.alert-msg p').text('چهره‌ای در تصویر اول شناسایی نشد');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 4000);
hasErrorPic1 = true;
$('#next-step').addClass('disable');
$('.upload-image1').css('background', '#ff090940');
$('#demoResult1').css('border', '2px dashed #ff5c5c');
}
//...........comment for check..............................
updateSaveButton();
$('#loadingImage1').hide();
};
var runCheckFace2 = async () => {
const img2 = document.getElementById('pic2');
const detectionPromise2 = await faceapi.detectAllFaces(img2).withFaceLandmarks().withFaceDescriptors();
//...........comment for check..............................
if (detectionPromise2.length === 1) {
//...........comment for check..............................
console.log('یک چهره در تصویر دوم شناسایی شد');
checkFace2 = true;
hasErrorPic2 = false;
$('#demoResult2').css('border', '2px dashed #148b8b');
//...........comment for check..............................
} else if (detectionPromise2.length > 1) {
$('.alert-msg').show();
$('.alert-msg p').text('بیش از یک چهره در تصویر دوم شناسایی شد');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 4000);
hasErrorPic2 = true;
$('#next-step').addClass('disable');
$('.upload-image2').css('background', '#ff090940');
$('#demoResult2').css('border', '2px dashed #ff5c5c');
} else {
$('.alert-msg').show();
$('.alert-msg p').text('چهره‌ای در تصویر دوم شناسایی نشد');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 4000);
hasErrorPic2 = true;
$('#next-step').addClass('disable');
$('.upload-image2').css('background', '#ff090940');
$('#demoResult2').css('border', '2px dashed #ff5c5c');
}
//...........comment for check..............................
updateSaveButton();
$('#loadingImage2').hide();
};
var FACING_MODES = JslibHtml5CameraPhoto.FACING_MODES;
var IMAGE_TYPES = JslibHtml5CameraPhoto.IMAGE_TYPES;
//...........comment for check..............................
//Check if videoElement is already declared to avoid redeclaration
//if (typeof videoElement === 'undefined') {
//...........comment for check..............................
var videoElement = document.getElementById('videoElement');
var cameraPhoto = new JslibHtml5CameraPhoto.default(videoElement);
//...........comment for check..............................
//}
//...........comment for check..............................
function startCamera() {
// startCameraMaxResolution
cameraPhoto.startCamera(FACING_MODES.USER).then(() => {
console.log('Camera started!');
}).catch((error) => {
console.log(error);
console.error('Camera not started!', error);
});
}
function stopCamera() {
cameraPhoto.stopCamera().then(() => {
console.log('Camera stopped!');
}).catch((error) => {
console.log('No camera to stop!:', error);
});
}
function cropAndResizeImage(base64Str, newWidth, newHeight) {
return new Promise((resolve) => {
let img = new Image();
img.src = base64Str;
img.onload = () => {
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');
let sideLength = Math.min(img.width, img.height);
let startX = (img.width - sideLength) / 2;
let startY = (img.height - sideLength) / 2;
canvas.width = newWidth;
canvas.height = newHeight;
ctx.drawImage(img, startX, startY, sideLength, sideLength, 0, 0, newWidth, newHeight);
resolve(canvas.toDataURL('image/jpeg'));
};
});
}
function take_snapshot1(data) {
if (data) {
$('#next-step').addClass('disable');
var sizeFactor = 1;
var imageType = IMAGE_TYPES.JPG;
var imageCompression = 1;
var config = {
sizeFactor,
imageType,
imageCompression
};
var dataUri = data;
cropAndResizeImage(dataUri, 1800, 1800).then((resizedDataUri) => {
document.getElementById('result1').innerHTML = '<img style="display:none; object-fit: cover;" id="pic1" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
document.getElementById('demoResult1').innerHTML =
'<div class="closeImage" onclick="closeImage(\'image1\')">' +
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">' +
'<path fill-rule="evenodd" d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z" clip-rule="evenodd" />' +
'</svg>' +
'</div>' +
'<button type="button" class="upload-image1">' +
'<p class="textUpload textUploaded">عکس اول</p>' +
'</button>' +
'<div class="loadingImage" id="loadingImage1">' +
'<div class="spinner-border" role="status">' +
'<span class="visually-hidden">Loading...</span>' +
'</div>' +
'</div>' +
'<img style="width: 100%; height: 100%; border-radius:10px; object-fit: cover;" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
//document.getElementById('demoResult1').innerHTML = '<div class="closeImage" onclick="closeImage("image1")"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z" clip-rule="evenodd" /></svg></div><button type="button" class="upload-image1"><p class="textUpload textUploaded">عکس اول</p></button><div class="loadingImage" id="loadingImage1"><div class="spinner-border" role="status"><span class="visually-hidden">Loading...</span></div></div><img style="width: 100%; height: 100%; border-radius:10px; object-fit: cover;" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
checkPicture();
}).catch((error) => {
console.error('Error cropping and resizing photo:', error);
});
$('.md-modal').removeClass('md-show');
} else {
$('#next-step').addClass('disable');
var sizeFactor = 1;
var imageType = IMAGE_TYPES.JPG;
var imageCompression = 1;
var config = {
sizeFactor,
imageType,
imageCompression
};
var dataUri = cameraPhoto.getDataUri(config);
cropAndResizeImage(dataUri, 1800, 1800).then((resizedDataUri) => {
document.getElementById('result1').innerHTML = '<img style="display:none; object-fit: cover;" id="pic1" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
document.getElementById('demoResult1').innerHTML =
'<div class="closeImage" onclick="closeImage(\'image1\')">' +
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">' +
'<path fill-rule="evenodd" d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z" clip-rule="evenodd" />' +
'</svg>' +
'</div>' +
'<button type="button" class="upload-image1">' +
'<p class="textUpload textUploaded">عکس اول</p>' +
'</button>' +
'<div class="loadingImage" id="loadingImage1">' +
'<div class="spinner-border" role="status">' +
'<span class="visually-hidden">Loading...</span>' +
'</div>' +
'</div>' +
'<img style="width: 100%; height: 100%; border-radius:10px; object-fit: cover;" id="pic1" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
//document.getElementById('demoResult1').innerHTML = '<div class="closeImage" onclick="closeImage("image1")"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z" clip-rule="evenodd" /></svg></div><button type="button" class="upload-image1"><p class="textUpload textUploaded">عکس اول</p></button><div class="loadingImage" id="loadingImage1"><div class="spinner-border" role="status"><span class="visually-hidden">Loading...</span></div></div><img style="width: 100%; height: 100%; border-radius:10px; object-fit: cover;" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
$('#loadingImage1').css('display', 'flex');
runCheckFace1();
checkPicture();
}).catch((error) => {
console.error('Error cropping and resizing photo:', error);
});
$('.md-modal').removeClass('md-show');
stopCamera();
}
}
function take_snapshot2(data) {
if (data) {
$('#next-step').addClass('disable');
var sizeFactor = 1;
var imageType = IMAGE_TYPES.JPG;
var imageCompression = 1;
var config = {
sizeFactor,
imageType,
imageCompression
};
var dataUri = data;
cropAndResizeImage(dataUri, 1800, 1800).then((resizedDataUri) => {
document.getElementById('result2').innerHTML = '<img style="display:none; object-fit: cover;" id="pic2" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
document.getElementById('demoResult2').innerHTML =
'<div class="closeImage" onclick="closeImage(\'image2\')">' +
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">' +
'<path fill-rule="evenodd" d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z" clip-rule="evenodd" />' +
'</svg>' +
'</div>' +
'<button type="button" class="upload-image2">' +
'<p class="textUpload textUploaded">عکس دوم</p>' +
'</button>' +
'<div class="loadingImage" id="loadingImage2">' +
'<div class="spinner-border" role="status">' +
'<span class="visually-hidden">Loading...</span>' +
'</div>' +
'</div>' +
'<img style="width: 100%; height: 100%; border-radius:10px; object-fit: cover;" id="pic2" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
//document.getElementById('demoResult2').innerHTML = '<div class="closeImage" onclick="closeImage("image2")"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z" clip-rule="evenodd" /></svg></div><button type="button" class="upload-image2"><p class="textUpload textUploaded">عکس دوم</p></button><div class="loadingImage" id="loadingImage2"><div class="spinner-border" role="status"><span class="visually-hidden">Loading...</span></div></div><img style="width: 100%; height: 100%; border-radius:10px; object-fit: cover;" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
checkPicture();
}).catch((error) => {
console.error('Error cropping and resizing photo:', error);
});
$('.md-modal').removeClass('md-show');
} else {
$('#next-step').addClass('disable');
var sizeFactor = 1;
var imageType = IMAGE_TYPES.JPG;
var imageCompression = 1;
var config = {
sizeFactor,
imageType,
imageCompression
};
var dataUri = cameraPhoto.getDataUri(config);
cropAndResizeImage(dataUri, 1800, 1800).then((resizedDataUri) => {
document.getElementById('result2').innerHTML = '<img style="display:none; object-fit: cover;" id="pic2" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
document.getElementById('demoResult2').innerHTML =
'<div class="closeImage" onclick="closeImage(\'image2\')">' +
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">' +
'<path fill-rule="evenodd" d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z" clip-rule="evenodd" />' +
'</svg>' +
'</div>' +
'<button type="button" class="upload-image2">' +
'<p class="textUpload textUploaded">عکس دوم</p>' +
'</button>' +
'<div class="loadingImage" id="loadingImage2">' +
'<div class="spinner-border" role="status">' +
'<span class="visually-hidden">Loading...</span>' +
'</div>' +
'</div>' +
'<img style="width: 100%; height: 100%; border-radius:10px; object-fit: cover;" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
//document.getElementById('demoResult2').innerHTML = '<div class="closeImage" onclick="closeImage("image2")"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z" clip-rule="evenodd" /></svg></div><button type="button" class="upload-image2"><p class="textUpload textUploaded">عکس دوم</p></button><div class="loadingImage" id="loadingImage2"><div class="spinner-border" role="status"><span class="visually-hidden">Loading...</span></div></div><img style="width: 100%; height: 100%; border-radius:10px; object-fit: cover;" data-uri="' + resizedDataUri + '" src="' + resizedDataUri + '"/>';
$('#loadingImage2').css('display', 'flex');
runCheckFace2();
checkPicture();
}).catch((error) => {
console.error('Error cropping and resizing photo:', error);
});
$('.md-modal').removeClass('md-show');
stopCamera();
}
}
function closeImage(type) {
if (type === "image1") {
$('#demoResult1').html('');
$('#demoResult1').html('<button type="button" class="upload-image1"><p class="textUpload">بارگذاری عکس اول</p></button>');
$('#demoResult1').removeAttr('style');
} else if (type === "image2") {
$('#demoResult2').html('');
$('#demoResult2').html('<button type="button" class="upload-image2"><p class="textUpload">بارگذاری عکس دوم</p></button>');
$('#demoResult2').removeAttr('style');
} else {
$('.alert-msg').show();
$('.alert-msg p').text('خطایی رخ داده است.');
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 4000);
}
$('#next-step').addClass('disable');
checkPicture();
}
//////////////faceapi////////////////

View File

@@ -80,19 +80,18 @@ function loadDataAjax() {
if (response.pageIndex > 0) {
var n = pageIndexMain + 1;
var dataLoad = response.data.personnelInfoViewModels;
dataLoad.forEach(function (item) {
html += `
<div></div>
<div id="Section_${item.employeeId}" class="Rtable-row align-items-center position-relative ${(item.isActiveString === "false" && item.hasUploadedImage === "false") ? `deactive` : ``} ${item.Black ? `disable` : ``}">
<div id="Section_${item.employeeId}" class="Rtable-row align-items-center position-relative ${item.createdByClient ?"pendingPersonnel":""} ${(item.isActiveString === "false" && item.hasUploadedImage === "false") ? `deactive` : ``} ${item.Black ? `disable` : ``}">
<div class="Rtable-cell d-md-block d-none width1">
<div class="Rtable-cell--heading">
ردیف
</div>
<div class="Rtable-cell--content">
<span class="d-flex justify-content-center align-items-center justify-content-center">
<div class="Rtable-cell--content ${item.createdByClient ?"colorDiv":""}">
<span class="d-flex justify-content-center align-items-center justify-content-center ${item.createdByClient ?"colorSpan":""}">
${n}
</span>
</div>
@@ -121,18 +120,22 @@ function loadDataAjax() {
<div class="Rtable-cell d-md-block d-none width4">
<div class="Rtable-cell--heading">وضعیت عکس</div>
<div class="Rtable-cell--content">`;
if (item.hasUploadedImage === "true") {
html += `<p id="TextUpload_${item.employeeId}" class="m-0">عکس پرسنل آپلود شده است</p>`;
}
else {
html += `<p id="TextUpload_${item.employeeId}" class="m-0 text-danger">عکس پرسنل آپلود نشده است</p>`;
if (item.createdByClient) {
html += `<p id="TextUpload_${item.employeeId}" class="m-0 pendingPersonnelStatus">در حال بررسی</p>`;
} else {
if (item.hasUploadedImage === "true") {
html += `<p id="TextUpload_${item.employeeId}" class="m-0">عکس پرسنل آپلود شده است</p>`;
}
else {
html += `<p id="TextUpload_${item.employeeId}" class="m-0 text-danger">عکس پرسنل آپلود نشده است</p>`;
}
}
var isActive = item.isActiveString === "true" ? "deactive" : "active";
html += `</div>
</div>
<div class="Rtable-cell d-md-flex d-none justify-content-end width5">
<div class="Rtable-cell d-md-flex d-none justify-content-end width5 ${item.createdByClient?`createdByclient_${item.employeeId}`:""}">
<div class="Rtable-cell--content align-items-center d-flex d-md-flex text-end me-3">
<div class="d-flex align-items-center justify-content-center">
<span class="mx-1 df">فعال</span>
@@ -426,3 +429,8 @@ function actionPersonnelStatus(url, id, type, buttonDesktop, buttonMobile) {
function ModalChaneName(employeeID) {
AjaxUrlContentModal(`/Client/Company/RollCall/EmployeeUploadPicture?employeeId=${employeeID}&handler=ModalChangeName`);
}
function openCreateEmployeeModal() {
AjaxUrlContentModal('/Client/Company/RollCall/EmployeeUploadPicture?handler=CreateEmployee');
}

View File

@@ -1,7 +1,9 @@
using CompanyManagment.App.Contracts.Employee;
using _0_Framework.Application;
using CompanyManagment.App.Contracts.Employee;
using WorkFlow.Application.Contracts.AdminWorkFlow;
using WorkFlow.Infrastructure.ACL.Employee;
using WorkFlow.Infrastructure.ACL.EmployeeDocuments;
using WorkFlow.Infrastructure.ACL.Workshop;
namespace WorkFlow.Application
@@ -9,15 +11,15 @@ namespace WorkFlow.Application
public class AdminWorkFlowApplication : IAdminWorkFlowApplication
{
private readonly IWorkFlowEmployeeDocumentsACL _workFlowEmployeeDocumentsACL;
//private readonly IWorkFlowWorkshopACL _workFlowWorkshopACL;
//private readonly IWorkFlowEmployeeACL _workFlowEmployeeACL;
private readonly IWorkFlowWorkshopACL _workFlowWorkshopACL;
private readonly IWorkFlowEmployeeACL _workFlowEmployeeACL;
public AdminWorkFlowApplication(IWorkFlowEmployeeDocumentsACL workFlowEmployeeDocumentsACL/*, IWorkFlowWorkshopACL workFlowWorkshopACL, IWorkFlowEmployeeACL workFlowEmployeeACL*/)
public AdminWorkFlowApplication(IWorkFlowEmployeeDocumentsACL workFlowEmployeeDocumentsACL, IWorkFlowWorkshopACL workFlowWorkshopAcl, IWorkFlowEmployeeACL workFlowEmployeeAcl)
{
_workFlowEmployeeDocumentsACL = workFlowEmployeeDocumentsACL;
//_workFlowWorkshopACL = workFlowWorkshopACL;
//_workFlowEmployeeACL = workFlowEmployeeACL;
_workFlowWorkshopACL = workFlowWorkshopAcl;
_workFlowEmployeeACL = workFlowEmployeeAcl;
}
#region Pooya
@@ -36,6 +38,19 @@ namespace WorkFlow.Application
return submittedDocumentsByClient + newEmployees;
}
public async Task<int> GetWorkFlowCountsForAdmin(List<long> workshopIds, long accountId)
{
var employeeDocumentWorkFlowCounts = await GetEmployeeDocumentWorkFlowCountsForAdmin(workshopIds);
var startWork = await GetWorkshopsForEmployeeStartWorkCount(accountId);
var leftWork = await GetWorkshopsForLeftWorkTempCount(accountId);
return employeeDocumentWorkFlowCounts + startWork + leftWork;
}
public async Task<int> GetWorkFlowCountForChecker()
{
return await _workFlowEmployeeDocumentsACL.GetCheckerWorkFlowCount();

View File

@@ -0,0 +1,61 @@
using _0_Framework.Application;
using CompanyManagment.App.Contracts.Employee;
using WorkFlow.Application.Contracts.AdminWorkFlow;
namespace WorkFlow.Infrastructure.ACL.Employee;
public interface IWorkFlowEmployeeACL
{
Task<ICollection<ClientStartedWorkEmployeesWorkFlowViewModel>> GetClientEmployeesStartWork(long workshopId);
Task<ICollection<ClientLeftWorkEmployeesWorkFlowViewModel>> GetEmployeesForLeftWorkTemp(long workshopId);
Task<GetEditEmployeeInEmployeeDocumentViewModel> GetEmployeeEditInEmployeeDocumentWorkFlow(long employeeId,
long workshopId);
Task<OperationResult> EditEmployeeInEmployeeDocumentWorkFlow(EditEmployeeInEmployeeDocument command);
}
public class WorkFlowEmployeeACL : IWorkFlowEmployeeACL
{
private readonly IEmployeeApplication _employeeApplication;
public WorkFlowEmployeeACL(IEmployeeApplication employeeApplication)
{
_employeeApplication = employeeApplication;
}
public async Task<ICollection<ClientStartedWorkEmployeesWorkFlowViewModel>> GetClientEmployeesStartWork(long workshopId)
{
var dto = await _employeeApplication.GetClientEmployeesStartWork(workshopId);
return dto.Select(x => new ClientStartedWorkEmployeesWorkFlowViewModel()
{
WorkshopId = x.WorkshopId,
EmployeeId = x.EmployeeId,
EmployeeName = x.EmployeeName,
HasCompleteEmployeeDocument = x.HasCompleteEmployeeDocument
}).ToList();
}
public async Task<ICollection<ClientLeftWorkEmployeesWorkFlowViewModel>> GetEmployeesForLeftWorkTemp(long workshopId)
{
var dto = await _employeeApplication.GetEmployeesForLeftWorkTemp(workshopId);
return dto.Select(x => new ClientLeftWorkEmployeesWorkFlowViewModel()
{
WorkshopId = x.WorkshopId,
EmployeeId = x.EmployeeId,
EmployeeName = x.EmployeeName,
LeftWorkDate = x.LeftWorkDateTime
}).ToList();
}
public async Task<GetEditEmployeeInEmployeeDocumentViewModel> GetEmployeeEditInEmployeeDocumentWorkFlow(
long employeeId, long workshopId)
{
return await _employeeApplication.GetEmployeeEditInEmployeeDocumentWorkFlow(employeeId, workshopId);
}
public async Task<OperationResult> EditEmployeeInEmployeeDocumentWorkFlow(EditEmployeeInEmployeeDocument command)
{
return await _employeeApplication.EditEmployeeInEmployeeDocumentWorkFlow(command);
}
}

View File

@@ -0,0 +1,60 @@
using CompanyManagment.App.Contracts.Workshop;
using CompanyManagment.App.Contracts.Workshop.DTOs;
using WorkFlow.Application.Contracts.AdminWorkFlow;
namespace WorkFlow.Infrastructure.ACL.Workshop;
public interface IWorkFlowWorkshopACL
{
Task<ICollection<WorkshopWithStartedWorkWorkFlowViewModel>> GetWorkshopsForEmployeeStartWork(long accountId);
Task<ICollection<WorkshopWithLeftWorkWorkFlowViewModel>> GetWorkshopsForLeftWorkTemp(long accountId);
Task<int> GetWorkshopsForEmployeeStartWorkCount(long accountId);
Task<int> GetWorkshopsForLeftWorkTempCount(long accountId);
}
public class WorkFlowWorkshopACL : IWorkFlowWorkshopACL
{
private readonly IWorkshopApplication _workshopApplication;
public WorkFlowWorkshopACL(IWorkshopApplication workshopApplication)
{
_workshopApplication = workshopApplication;
}
public async Task<ICollection<WorkshopWithStartedWorkWorkFlowViewModel>> GetWorkshopsForEmployeeStartWork(
long accountId)
{
List<WorkshopWithStartedEmployeesDto> workshopDto = await _workshopApplication.GetWorkshopsForEmployeeStartWork(accountId);
return workshopDto.Select(x => new WorkshopWithStartedWorkWorkFlowViewModel
{
WorkshopId = x.WorkshopId,
WorkshopName = x.WorkshopName,
EmployerName = x.EmployerName,
AddedEmployeesCount = x.AddedEmployeesCount
}).ToList();
}
public async Task<ICollection<WorkshopWithLeftWorkWorkFlowViewModel>> GetWorkshopsForLeftWorkTemp(long accountId)
{
List<WorkshopWithLeftWorkTempEmployeesDto> workshopDto = await _workshopApplication.GetWorkshopsForLeftWorkTemp(accountId);
return workshopDto.Select(x => new WorkshopWithLeftWorkWorkFlowViewModel
{
WorkshopId = x.WorkshopId,
WorkshopName = x.WorkshopName,
EmployerName = x.EmployerName,
LeftWorkEmployeesCount = x.LeftWorkEmployees
}).ToList();
}
public async Task<int> GetWorkshopsForEmployeeStartWorkCount(long accountId)
{
return await _workshopApplication.GetWorkshopsForEmployeeStartWorkCount(accountId);
}
public async Task<int> GetWorkshopsForLeftWorkTempCount(long accountId)
{
return await _workshopApplication.GetWorkshopsForLeftWorkTempCount(accountId);
}
}

View File

@@ -7,8 +7,10 @@ using WorkFlow.Domain.RollCallConfirmedAbsenceAgg;
using WorkFlow.Domain.RollCallConfirmedWithoutLunchBreakAgg;
using WorkFlow.Infrastructure.ACL.Checkout;
using WorkFlow.Infrastructure.ACL.CustomizedWorkshopSettings;
using WorkFlow.Infrastructure.ACL.Employee;
using WorkFlow.Infrastructure.ACL.EmployeeDocuments;
using WorkFlow.Infrastructure.ACL.RollCall;
using WorkFlow.Infrastructure.ACL.Workshop;
using WorkFlow.Infrastructure.EfCore;
using WorkFlow.Infrastructure.EfCore.Repository;
@@ -27,9 +29,13 @@ namespace WorkFlow.Infrastructure.Config
services.AddTransient<IWorkFlowCheckoutACL, WorkFlowCheckoutACL>();
services.AddTransient<IWorkFlowEmployeeDocumentsACL, WorkFlowEmployeeDocumentsACL>();
services.AddTransient<IWorkFlowRollCallACL, WorkFlowRollCallACL>();
services.AddTransient<IWorkFlowCustomizedWorkshopSettingsACL, WorkFlowCustomizedWorkshopSettingsACL>();
services.AddTransient<IWorkFlowEmployeeDocumentsACL, WorkFlowEmployeeDocumentsACL>();
services.AddTransient<IWorkFlowEmployeeACL, WorkFlowEmployeeACL>();
services.AddTransient<IWorkFlowWorkshopACL, WorkFlowWorkshopACL>();
services.AddDbContext<WorkFlowContext>(x =>