Add Employee By Client = Explodng Original by Mahan

This commit is contained in:
SamSys
2025-03-16 23:01:54 +03:30
134 changed files with 25947 additions and 3584 deletions

View File

@@ -1386,6 +1386,11 @@ public static class Tools
/// <returns></returns>
public static bool TryToGeorgianDateTime(this string persianDate, out DateTime georgianDateTime)
{
if (string.IsNullOrWhiteSpace(persianDate))
{
georgianDateTime = new DateTime(3000, 12, 20, new PersianCalendar());
return false;
}
persianDate = persianDate.ToEnglishNumber();
try
{

View File

@@ -13,5 +13,6 @@ public interface ICustomizeWorkshopEmployeeSettingsRepository : IRepository<long
List<CustomizeWorkshopEmployeeSettings> GetBy(long groupId);
List<CustomizeWorkshopEmployeeSettingsViewModel> GetEmployeeSettingsByWorkshopId(long workshopId);
List<CustomizeWorkshopEmployeeSettingsViewModel> GetEmployeeSettingNotInMainGroup(long entityWorkshopId);
void RemoveByWorkshopIdAndEmployeeId(long workshopId, long employeeId);
}

View File

@@ -21,11 +21,13 @@ public class Employee : EntityBase
public Employee(string fName, string lName, string fatherName,
DateTime dateOfBirth, DateTime dateOfIssue, string placeOfIssue,
string nationalCode, string idNumber, string gender, string nationality,
string phone, string address, string state, string city,
string maritalStatus, string militaryService, string levelOfEducation, string fieldOfStudy,
string bankCardNumber, string bankBranch, string insuranceCode, string insuranceHistoryByYear,
string insuranceHistoryByMonth, string numberOfChildren,string officePhone,
string mclsUserName, string mclsPassword, string eserviceUserName, string eservicePassword, string taxOfficeUserName, string taxOfficepassword, string sanaUserName, string sanaPassword)
string phone = null, string address = null, string state = null, string city = null,
string maritalStatus = null, string militaryService = null, string levelOfEducation = null, string fieldOfStudy = null,
string bankCardNumber = null, string bankBranch = null, string insuranceCode = null, string insuranceHistoryByYear = null,
string insuranceHistoryByMonth = null, string numberOfChildren = null, string officePhone = null,
string mclsUserName = null, string mclsPassword = null,
string eserviceUserName = null, string eservicePassword = null,
string taxOfficeUserName = null, string taxOfficepassword = null, string sanaUserName = null, string sanaPassword = null)
{
FName = fName;
LName = lName;
@@ -135,7 +137,16 @@ public class Employee : EntityBase
#region Pooya
public List<EmployeeDocuments> EmployeeDocuments { get; set; }
public EmployeeDocumentsAdminSelection EmployeeDocumentsAdminSelection { get; set; }
public List<EmployeeBankInformation> EmployeeBankInformationList { get; set; }
public List<EmployeeBankInformation> EmployeeBankInformationList { get; set; }
#endregion
#region Mahan
/// <summary>
/// آیا پرسنل احراز هویت شده است
/// </summary>
public bool IsAuthorized { get; set; }
#endregion
//public List<Checkout> Checkouts { get; set; }
@@ -211,4 +222,17 @@ public class Employee : EntityBase
this.IsActive = false;
this.IsActiveString = "false";
}
#region Mahan
public void EditFromEmployeeClientTemp(string maritalStatus)
{
MaritalStatus = maritalStatus;
}
public void Authorized()
{
IsAuthorized = true;
}
#endregion
}

View File

@@ -4,6 +4,7 @@ using System.Threading.Tasks;
using _0_Framework.Domain;
using Company.Domain.EmployeeInsuranceRecordAgg;
using CompanyManagment.App.Contracts.Employee;
using CompanyManagment.App.Contracts.Employee.DTO;
using CompanyManagment.App.Contracts.EmployeeInsuranceRecord;
namespace Company.Domain.EmployeeAgg;
@@ -47,6 +48,14 @@ public interface IEmployeeRepository : IRepository<long, Employee>
Employee GetByNationalCode(string nationalCode);
List<EmployeeViewModel> GetBy(List<long> employeeIds);
Employee GetByNationalCodeIgnoreQueryFilter(string nationalCode);
Task<ICollection<ClientStartedWorkEmployeesDto>> GetClientEmployeesStartWork(long workshopId);
Task<ICollection<ClientLeftWorkWorkEmployeesDto>> GetEmployeesForLeftWorkTemp(long workshopId);
Employee GetIgnoreQueryFilter(long id);
#endregion
#region Pooya
@@ -54,7 +63,14 @@ 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);
#endregion
}

View File

@@ -0,0 +1,31 @@
using System;
using _0_Framework.Domain;
using Company.Domain.EmployeeAgg;
namespace Company.Domain.EmployeeClientTempAgg;
public class EmployeeClientTemp : EntityBase
{
public EmployeeClientTemp(long workshopId, DateTime startWorkDate, long employeeId, string maritalStatus,
string employeeFullName)
{
StartWorkDate = startWorkDate;
WorkshopId = workshopId;
EmployeeId = employeeId;
MaritalStatus = maritalStatus;
EmployeeFullName = employeeFullName;
}
public string EmployeeFullName { get; private set; }
public long WorkshopId { get; private set; }
public long EmployeeId { get; private set; }
public DateTime StartWorkDate { get; private set; }
public string MaritalStatus { get; private set; }
public void Edit(string maritalStatus)
{
MaritalStatus = maritalStatus;
}
}

View File

@@ -0,0 +1,11 @@
using _0_Framework.Domain;
using CompanyManagment.App.Contracts.EmployeeClientTemp;
namespace Company.Domain.EmployeeClientTempAgg;
public interface IEmployeeClientTempRepository : IRepository<long, EmployeeClientTemp>
{
EmployeeClientTemp GetByEmployeeIdAndWorkshopId(long employeeId, long commandWorkshopId);
EmployeeClientTempGetDetailsViewModel GetDetails(long employeeId, long workshopId);
void Remove(EmployeeClientTemp entity);
}

View File

@@ -54,11 +54,12 @@ namespace Company.Domain.EmployeeDocumentsAgg
var currentItems = EmployeeDocumentItemCollection.Where(x => x.DocumentStatus != DocumentStatus.Unsubmitted)
.GroupBy(x => x.DocumentLabel).Select(x => x.OrderByDescending(y => y.CreationDate).First());
var currentItemsFiltered = currentItems.Where(x => x.DocumentStatus == DocumentStatus.Confirmed || x.DocumentStatus == DocumentStatus.SubmittedByAdmin)
.Select(x => new{x.DocumentStatus,x.DocumentLabel}).ToList();
var currentItemsFiltered = currentItems.Where(x => x.DocumentStatus is DocumentStatus.Confirmed or DocumentStatus.SubmittedByAdmin or DocumentStatus.SubmittedByClient)
.Select(x => new { x.DocumentStatus, x.DocumentLabel }).ToList();
// ReSharper disable once SimplifyLinqExpressionUseAll
if (!currentItemsFiltered.Any(x => x.DocumentStatus == DocumentStatus.SubmittedByAdmin))
if (!currentItemsFiltered.Any(x => x.DocumentStatus is DocumentStatus.SubmittedByAdmin or DocumentStatus.SubmittedByClient))
IsSentToChecker = false;
else

View File

@@ -26,9 +26,9 @@ namespace Company.Domain.EmployeeDocumentsAgg
List<WorkshopWithEmployeeDocumentsViewModel> GetWorkshopsWithDocumentsAwaitingReviewForAdminWorkFlow(List<long> workshops);
List<EmployeeDocumentsViewModel> GetByWorkshopIdWithItemsForAdminWorkFlow(long workshopId);
int GetCheckerWorkFlowCount();
//int GetAdminWorkFlowCountForNewEmployees(List<long> workshopIds);
int GetAdminWorkFlowCountForSubmittedAndRejectedDocuments(List<long> workshopIds);
Task<int> GetCheckerWorkFlowCount();
Task<int> GetAdminWorkFlowCountForNewEmployees(List<long> workshopIds);
Task<int> GetAdminWorkFlowCountForSubmittedAndRejectedDocuments(List<long> workshopIds);
List<EmployeeDocumentsViewModel> GetDocumentsAwaitingReviewByWorkshopIdForCheckerWorkFlow(long workshopId);
}
}

View File

@@ -27,6 +27,8 @@ public interface ILeftWorkRepository : IRepository<long, LeftWork>
/// <returns>یک کلاس از جنس اطلاعات ترک کار</returns>
LeftWorkViewModel GetByDateAndWorkshopIdAndEmployeeId(long workshopId, long employeeId, DateTime dateTime);
List<long> GetAllEmployeeIdsInWorkshop(long workshopId);
LeftWork GetLastLeftWorkByEmployeeIdAndWorkshopId(long workshopId, long employeeId);
#endregion
List<LeftWorkViewModel> GetLeftPersonelByWorkshopId(List<long> workshopIds);

View File

@@ -0,0 +1,17 @@
using System.Threading.Tasks;
using _0_Framework.Domain;
using CompanyManagment.App.Contracts.LeftWorkTemp;
namespace Company.Domain.LeftWorkTempAgg;
public interface ILeftWorkTempRepository:IRepository<long,LeftWorkTemp>
{
/// <summary>
/// گرفتن اطلاعات برای مودال جزئیات شروع به کار موقت یا ترک کار موقت
/// </summary>
/// <param name="employeeId"></param>
/// <param name="workshopId"></param>
/// <returns></returns>
Task<GetStartWorkTempDetails> GetStartAndLeftWorkDetails(long employeeId, long workshopId);
void Remove(LeftWorkTemp entity);
}

View File

@@ -0,0 +1,65 @@
using System;
using _0_Framework.Domain;
using Company.Domain.LeftWorkAgg;
using CompanyManagment.App.Contracts.LeftWorkTemp;
namespace Company.Domain.LeftWorkTempAgg;
public class LeftWorkTemp:EntityBase
{
private LeftWorkTemp()
{
}
/// <summary>
/// برای ایجاد ترک کار موقت
/// </summary>
/// <param name="leftWorkId"></param>
/// <param name="startWorkDate"></param>
/// <param name="leftWork"></param>
/// <param name="lastDayStanding"></param>
/// <param name="workshopId"></param>
/// <param name="employeeId"></param>
/// <param name="jobId"></param>
public static LeftWorkTemp CreateLeftWork(long leftWorkId, DateTime startWorkDate, DateTime leftWork, DateTime lastDayStanding, long workshopId, long employeeId,long jobId)
{
var leftWorkTemp = new LeftWorkTemp
{
LeftWorkId = leftWorkId,
LeftWork = leftWork,
LastDayStanding = lastDayStanding,
WorkshopId = workshopId,
EmployeeId = employeeId,
StartWork = startWorkDate,
LeftWorkType = LeftWorkTempType.LeftWork,
JobId = jobId
};
return leftWorkTemp;
}
public static LeftWorkTemp CreateStartWork(long workshopId, long employeeId, DateTime startDate,long jobId)
{
var leftWorkTemp = new LeftWorkTemp
{
StartWork = startDate,
WorkshopId = workshopId,
EmployeeId = employeeId,
JobId = jobId,
LeftWorkType = LeftWorkTempType.StartWork
};
return leftWorkTemp;
}
public long LeftWorkId { get; private set; }
public DateTime StartWork { get; private set; }
public DateTime LeftWork { get; private set; }
public DateTime LastDayStanding { get; private set; }
public long WorkshopId { get; private set; }
public long EmployeeId { get; private set; }
public long JobId { get; private set; }
public LeftWorkTempType LeftWorkType { get; private set; }
}

View File

@@ -18,4 +18,11 @@ public interface IPersonnelCodeRepository : IRepository<long, PersonnelCodeDomai
long GetPSCodeByWorkshopIdAndEmployeeId(long workshopId, long employeeId);
long GetEmployeeIdByPersonelCode(long personleCode, long workshopId);
#region Mahan
long GetLastPersonnelCodeByWorkshop(long workshopId);
#endregion
}

View File

@@ -28,6 +28,8 @@ public interface IRollCallEmployeeRepository : IRepository<long, RollCallEmploye
bool HasEmployees(long workshopId);
(int activeEmployees, int deActiveEmployees) GetActiveAndDeActiveRollCallEmployees(long workshopId);
RollCallEmployee GetBy(long employeeId, long workshopId);
#endregion

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

@@ -0,0 +1,42 @@
using System.Collections.Generic;
using _0_Framework.Application;
using CompanyManagment.App.Contracts.CustomizeWorkshopSettings;
using CompanyManagment.App.Contracts.EmployeeBankInformation;
using CompanyManagment.App.Contracts.EmployeeDocuments;
using CompanyManagment.App.Contracts.RollCallEmployee;
using CompanyManagment.App.Contracts.RollCallEmployeeStatus;
using Microsoft.Extensions.Logging;
namespace CompanyManagment.App.Contracts.Employee;
public class CreateEmployeeByClient
{
public string NationalCode { get; set; }
public string Nationality { get; set; }
public string Gender { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MaritalStatus { get; set; }
public long WorkshopId { get; set; }
public string StartLeftWork { get; set; }
public RollCallUploadEmployeePicture RollCallUploadEmployeePicture { get; set; }
public EditCustomizeEmployeeSettings CreateCustomizeEmployeeSettings { get; set; }
public ICollection<CreateEmployeeInformation> EmployeeBankInfos { get; set; }
public bool HasBankInformation { get; set; }
public string PersonnelCode { get; set; }
public long JobId { get; set; }
public List<AddEmployeeDocumentItem> EmployeeDocumentItems { get; set; }
public bool HasEmployeeDocument { get; set; }
public bool HasRollCallService { get; set; }
}
public record RollCallUploadEmployeePicture
{
public string Picture1 { get; set; }
public string Picture2 { get; set; }
public string EmployeeFullName { get; set; }
public string IsActiveString { get; set; }
public string HasUploadedImage { get; set; }
}

View File

@@ -0,0 +1,12 @@
namespace CompanyManagment.App.Contracts.Employee;
public class ClientLeftWorkWorkEmployeesDto
{
public long EmployeeId { get; set; }
public long WorkshopId { get; set; }
public string EmployeeName { get; set; } = string.Empty;
public string LeftWorkDateTime { get; set; } = string.Empty;
}

View File

@@ -0,0 +1,18 @@
namespace CompanyManagment.App.Contracts.Employee.DTO;
/// <summary>
/// پرسنل هایی که درسمت ادمین شروع به کار کرده اند
/// </summary>
public class ClientStartedWorkEmployeesDto
{
public long EmployeeId { get; set; }
public long WorkshopId { get; set; }
public string EmployeeName { get; set; } = string.Empty;
/// <summary>
/// آیا آپلود مدارک اصلی رو انجام داده یا نه
/// </summary>
public bool HasCompleteEmployeeDocument { get; set; }
}

View File

@@ -0,0 +1,17 @@
namespace CompanyManagment.App.Contracts.Employee;
public class EditEmployeeInEmployeeDocument
{
public long EmployeeId { get; set; }
public long WorkshopId { get; set; }
public string FName { get; set; } = string.Empty;
public string LName { get; set; } = string.Empty;
public string NationalCode { get; set; } = string.Empty;
public string IdNumber { get; set; } = string.Empty;
public string FatherName { get; set; } = string.Empty;
public string BirthDate { get; set; } = string.Empty;
public string MaritalStatus { get; set; } = string.Empty;
public string MilitaryService { get; set; } = string.Empty;
public string Nationality { get; set; } = string.Empty;
public string Gender { get; set; } = string.Empty;
}

View File

@@ -0,0 +1,55 @@
using System.Collections.Generic;
using System.Security.Cryptography;
using CompanyManagment.App.Contracts.EmployeeDocuments;
namespace CompanyManagment.App.Contracts.Employee;
public record EmployeeByNationalCodeInWorkshopViewModel
{
public string EmployeeFName { get; set; }
public string EmployeeLName { get; set; }
public string Nationality { get; set; }
public string Gender { get; set; }
public string MaritalStatus { get; set; }
public long EmployeeId { get; set; }
public string Picture1 { get; set; }
public string Picture2 { get; set; }
public long PersonnelCode { get; set; }
public List<EmployeeByNationalCodeEmployeeBankInfoViewModel> EmployeeBankInfos { get; set; }
public EmployeeByNationalCodeEmployeeDocumentViewModel EmployeeDocument { get; set; }
}
public class EmployeeByNationalCodeEmployeeDocumentViewModel
{
//عکس پرسنل
public EmployeeDocumentItemViewModel EmployeePicture { get; set; }
//شناسنامه
public EmployeeDocumentItemViewModel IdCardPage1 { get; set; }
public EmployeeDocumentItemViewModel IdCardPage2 { get; set; }
public EmployeeDocumentItemViewModel IdCardPage3 { get; set; }
public EmployeeDocumentItemViewModel IdCardPage4 { get; set; }
//کارت ملی
public EmployeeDocumentItemViewModel NationalCardFront { get; set; }
public EmployeeDocumentItemViewModel NationalCardRear { get; set; }
//مدرک تحصیلی
public EmployeeDocumentItemViewModel EducationalDegree { get; set; }
//کارت پایان خدمت
public EmployeeDocumentItemViewModel MilitaryServiceCard { get; set; }
}
public class EmployeeByNationalCodeEmployeeBankInfoViewModel
{
public string BankName { get; set; }
public string BankLogoPath { get; set; }
public string CardNumber { get; set; }
public string ShebaNumber { get; set; }
public string BankAccountNumber { get; set; }
public bool IsDefault { get; set; }
public long BankId { get; set; }
public long BankLogoMediaId { get; set; }
}

View File

@@ -0,0 +1,17 @@
namespace CompanyManagment.App.Contracts.Employee;
public class GetEditEmployeeInEmployeeDocumentViewModel
{
public long EmployeeId { get; set; }
public string FName { get; set; } = string.Empty;
public string LName { get; set; } = string.Empty;
public string NationalCode { get; set; } = string.Empty;
public string IdNumber { get; set; } = string.Empty;
public string FatherName { get; set; } = string.Empty;
public string BirthDate { get; set; } = string.Empty;
public string MaritalStatus { get; set; } = string.Empty;
public string MilitaryService { get; set; } = string.Empty;
public string Nationality { get; set; } = string.Empty;
public string Gender { get; set; } = string.Empty;
public bool IsAuthorized { 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

@@ -0,0 +1,15 @@
using System;
namespace CompanyManagment.App.Contracts.EmployeeClientTemp;
public class CreateEmployeeClientTemp
{
public string FName { get; set; }
public string LName { get; set; }
public string NationalCode { get; set; }
public string Nationality { get; set; }
public string MaritalStatus { get; set; }
public long WorkshopId { get; set; }
public long EmployeeId { get; set; }
public DateTime StartWorkTime { get; set; }
}

View File

@@ -0,0 +1,26 @@
using System;
using _0_Framework_b.Application;
namespace CompanyManagment.App.Contracts.EmployeeClientTemp;
public interface IEmployeeClientTempApplication
{
OperationResult Create(CreateEmployeeClientTemp command);
EmployeeClientTempGetDetailsViewModel GetDetails(long employeeId, long workshopId);
}
public class EmployeeClientTempGetDetailsViewModel
{
public long WorkshopId { get; set; }
public long EmployeeId { get; set; }
public string StartWorkDate { get; set; }
public string FName { get; set; }
public string LName { get; set; }
public string FullName => $"{FName} {LName}";
public string NationalCode { get; set; }
public string Nationality { get; set; }
}

View File

@@ -12,7 +12,7 @@ namespace CompanyManagment.App.Contracts.EmployeeDocuments
OperationResult AddEmployeeDocumentItemForAdmin(AddEmployeeDocumentItem command);
OperationResult AddRangeEmployeeDocumentItems(long workshopId, long employeeId,
OperationResult AddRangeEmployeeDocumentItemsByClient(long workshopId, long employeeId,
List<AddEmployeeDocumentItem> command);
/// <summary>
@@ -49,10 +49,16 @@ namespace CompanyManagment.App.Contracts.EmployeeDocuments
List<EmployeeDocumentsViewModel> GetByWorkshopIdWithItemsForAdminWorkFlow(long workshopId);
List<EmployeeDocumentsViewModel> GetDocumentsAwaitingReviewByWorkshopIdForCheckerWorkFlow(long workshopId);
int GetAdminWorkFlowCountForSubmittedAndRejectedDocuments(List<long> workshopIds);
//int GetAdminWorkFlowCountForNewEmployees(List<long> workshopIds);
Task<int> GetAdminWorkFlowCountForSubmittedAndRejectedDocuments(List<long> workshopIds);
Task<int> GetAdminWorkFlowCountForNewEmployees(List<long> workshopIds);
OperationResult RemoveByAdmin(long documentItemId);
int GetCheckerWorkFlowCount();
Task<int> GetCheckerWorkFlowCount();
/// <summary>
/// برای افزودن یکباره مدارک در افزودن پرسنل توسط ادمین
/// </summary>
OperationResult AddRangeEmployeeDocumentItemsByAdmin(long workshopId, long employeeId,
List<AddEmployeeDocumentItem> command);
}
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
namespace CompanyManagment.App.Contracts.LeftWorkTemp;
public class CreateLeftWorkTemp
{
public List<long> EmployeeIds { get; set; }
public long WorkshopId { get; set; }
public string LeftWorkTime { get; set; }
public string LastDayStanding { get; set; }
}

View File

@@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace CompanyManagment.App.Contracts.LeftWorkTemp;
public class CreateLeftWorkTempSingleViewModel
{
public string EmployeeFullName { get; set; }
public List<long> EmployeeIds { get; set; }
}

View File

@@ -0,0 +1,71 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using _0_Framework.Application;
using CompanyManagment.App.Contracts.LeftWork;
namespace CompanyManagment.App.Contracts.LeftWorkTemp;
public interface ILeftWorkTempApplication
{
Task<OperationResult> Create(CreateLeftWorkTemp command);
/// <summary>
/// گرفتن اطلاعات برای مودال جزئیات شروع به کار موقت یا ترک کار موقت
/// </summary>
/// <param name="employeeId"></param>
/// <param name="workshopId"></param>
/// <returns></returns>
Task<GetStartWorkTempDetails> GetStartAndLeftWorkDetails(long employeeId,long workshopId);
/// <summary>
/// تایید شروع به کار موقت
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
Task<OperationResult> AcceptStartWork(AcceptStartWorkTemp command);
/// <summary>
/// تایید ترک کار موقت
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
Task<OperationResult> AcceptLeftWork(AcceptLeftWorkTemp command);
}
public class AcceptLeftWorkTemp
{
public long LeftWorkTempId { get; set; }
public string LeftWorkTime { get; set; }
public string LastDayStanding { get; set; }
}
public class AcceptStartWorkTemp
{
public long LeftWorkTempId { get; set; }
public string StartDateTime { get; set; }
public long JobId { get; set; }
}
public class GetStartWorkTempDetails
{
public LeftWorkTempDetailsViewModel LeftWorkTemp { get; set; }
public List<LeftWorkTempDetailsViewModel> PreviousLeftWorks { get; set; }
public long JobId { get; set; }
public string JobName { get; set; }
public long WorkshopId { get; set; }
public string WorkshopFullName { get; set; }
public string EmployeeFullName { get; set; }
public long EmployeeId { get; set; }
public long PersonnelCode { get; set; }
}
public class LeftWorkTempDetailsViewModel
{
public long Id { get; set; }
public string StartWork { get; set; }
public string LeftWork { get; set; }
public string LastDayStanding { get; set; }
}

View File

@@ -0,0 +1,14 @@
namespace CompanyManagment.App.Contracts.LeftWorkTemp;
public enum LeftWorkTempType
{
/// <summary>
/// شروع به کار کرده
/// </summary>
StartWork,
/// <summary>
/// ترک کار کرده
/// </summary>
LeftWork
}

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

@@ -34,4 +34,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

@@ -396,7 +396,12 @@ public class CustomizeWorkshopSettingsApplication(ICustomizeWorkshopSettingsRepo
if (previousEnd != new DateTime())
{
if (newShift.start <= previousEnd)
if (newShift.start == previousEnd)
{
return op.Failed("در شیفت منظم پایان شیفت نمیتواند با شروع شیفت بعدی برابر باشد");
}
if (newShift.start <= previousEnd)
{
newShift.start = newShift.start.AddDays(1);
}

View File

@@ -1,4 +1,5 @@
using System;
using System.IO;
using System.Collections.Generic;
using _0_Framework.InfraStructure;
using Company.Domain.EmployeeAgg;
@@ -10,6 +11,24 @@ using Company.Domain.EmployeeInsuranceRecordAgg;
using Company.Domain.WorkshopAgg;
using System.Linq;
using System.Threading.Tasks;
using Company.Domain.PersonnelCodeAgg;
using CompanyManagment.App.Contracts.CustomizeWorkshopSettings;
using CompanyManagment.App.Contracts.EmployeeBankInformation;
using CompanyManagment.App.Contracts.EmployeeDocuments;
using CompanyManagment.App.Contracts.RollCallEmployeeStatus;
using Microsoft.AspNetCore.Hosting;
using System.IO;
using System.Transactions;
using Company.Domain.EmployeeClientTempAgg;
using Company.Domain.LeftWorkTempAgg;
using CompanyManagment.App.Contracts.LeftWorkTemp;
using _0_Framework.Application.UID;
using Company.Domain.CustomizeWorkshopEmployeeSettingsAgg;
using Company.Domain.EmployeeDocumentsAgg;
using Company.Domain.RollCallEmployeeAgg;
using Company.Domain.CustomizeWorkshopGroupSettingsAgg;
using Company.Domain.LeftWorkAgg;
using CompanyManagment.App.Contracts.Employee.DTO;
namespace CompanyManagment.Application;
@@ -25,11 +44,39 @@ public class EmployeeAplication : RepositoryBase<long, Employee>, IEmployeeAppli
public bool StatCity = true;
public bool city = true;
public bool address = true;
private readonly IWebHostEnvironment _webHostEnvironment;
private readonly IRollCallEmployeeStatusApplication _rollCallEmployeeStatusApplication;
private readonly IRollCallEmployeeRepository _rollCallEmployeeRepository;
private readonly ICustomizeWorkshopSettingsApplication _customizeWorkshopSettingsApplication;
private readonly IEmployeeDocumentsApplication _employeeDocumentsApplication;
private readonly IEmployeeDocumentsRepository _employeeDocumentsRepository;
private readonly IEmployeeBankInformationApplication _employeeBankInformationApplication;
private readonly ILeftWorkTempRepository _leftWorkTempRepository;
private readonly IUidService _uidService;
private readonly ICustomizeWorkshopEmployeeSettingsRepository _customizeWorkshopEmployeeSettingsRepository;
private readonly ILeftWorkRepository _leftWorkRepository;
private readonly IPersonnelCodeRepository _personnelCodeRepository;
private readonly IEmployeeClientTempRepository _employeeClientTempRepository;
private readonly ICustomizeWorkshopGroupSettingsRepository _customizeWorkshopGroupSettingsRepository;
public EmployeeAplication(IEmployeeRepository employeeRepository, CompanyContext context, IWorkshopRepository workShopRepository) : base(context)
public EmployeeAplication(IEmployeeRepository employeeRepository, CompanyContext context, IWorkshopRepository workShopRepository, IWebHostEnvironment webHostEnvironment, IRollCallEmployeeStatusApplication rollCallEmployeeStatusApplication, IRollCallEmployeeRepository rollCallEmployeeRepository, ICustomizeWorkshopSettingsApplication customizeWorkshopSettingsApplication, IEmployeeDocumentsApplication employeeDocumentsApplication, IEmployeeDocumentsRepository employeeDocumentsRepository, IEmployeeBankInformationApplication employeeBankInformationApplication, ILeftWorkTempRepository leftWorkTempRepository, IUidService uidService, ICustomizeWorkshopEmployeeSettingsRepository customizeWorkshopEmployeeSettingsRepository, IPersonnelCodeRepository personnelCodeRepository, IEmployeeClientTempRepository employeeClientTempRepository, ICustomizeWorkshopGroupSettingsRepository customizeWorkshopGroupSettingsRepository, ILeftWorkRepository leftWorkRepository) : base(context)
{
_context = context;
_WorkShopRepository = workShopRepository;
_webHostEnvironment = webHostEnvironment;
_rollCallEmployeeStatusApplication = rollCallEmployeeStatusApplication;
_rollCallEmployeeRepository = rollCallEmployeeRepository;
_customizeWorkshopSettingsApplication = customizeWorkshopSettingsApplication;
_employeeDocumentsApplication = employeeDocumentsApplication;
_employeeDocumentsRepository = employeeDocumentsRepository;
_employeeBankInformationApplication = employeeBankInformationApplication;
_leftWorkTempRepository = leftWorkTempRepository;
_uidService = uidService;
_customizeWorkshopEmployeeSettingsRepository = customizeWorkshopEmployeeSettingsRepository;
_personnelCodeRepository = personnelCodeRepository;
_employeeClientTempRepository = employeeClientTempRepository;
_customizeWorkshopGroupSettingsRepository = customizeWorkshopGroupSettingsRepository;
_leftWorkRepository = leftWorkRepository;
_EmployeeRepository = employeeRepository;
}
@@ -861,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);
@@ -902,4 +956,547 @@ public class EmployeeAplication : RepositoryBase<long, Employee>, IEmployeeAppli
}
#endregion
#region Mahan
public OperationResult CreateEmployeeByClient(CreateEmployeeByClient command)
{
OperationResult op = new();
if (command.Gender != "مرد" && command.Gender != "زن")
return op.Failed("جنسیت را انتخاب کنید");
if (string.IsNullOrWhiteSpace(command.FirstName) || string.IsNullOrWhiteSpace(command.LastName))
return op.Failed("نام نمی تواند خالی باشد");
if (command.MaritalStatus != "مجرد" && command.MaritalStatus != "متاهل")
return op.Failed("وضعیت تاهل نمی تواند خالی باشد");
bool isNationalCardValid = command.NationalCode?.NationalCodeValid() == "valid";
if (isNationalCardValid == false)
return op.Failed("کد ملی وارد شده معتبر نمی باشد");
if (command.Nationality != "ایرانی")
return op.Failed("خطای سیستمی");
if (!_WorkShopRepository.Exists(x => x.id == command.WorkshopId))
{
return op.Failed("کارگاه نامعتبر است");
}
using var transaction = new TransactionScope();
//if (_EmployeeRepository.ExistsIgnoreQueryFilter(x => x.NationalCode == command.NationalCode && x.EmployeeType == EmployeeType.CreatedByClient))
//{
// return op.Failed("این پرسنل قبلا افزوده شده است و در انتظار تایید میباشد");
//}
var employee = _EmployeeRepository.GetByNationalCodeIgnoreQueryFilter(command.NationalCode);
var workshop = _WorkShopRepository.GetDetails(command.WorkshopId);
if (employee == null)
{
return op.Failed("خطای سیستمی. لطفا دوباره تلاش کنید . درصورت تکرار این مشکل با تیم پشتیبان تماس بگیرید");
}
if (_leftWorkTempRepository.Exists(x =>
x.EmployeeId == employee.id && x.WorkshopId == command.WorkshopId && x.LeftWorkType == LeftWorkTempType.StartWork))
{
return op.Failed("این پرسنل در کارگاه شما قبلا افزوده شده است و در انتظار تایید میباشد");
}
var startLeftWork = command.StartLeftWork.ToGeorgianDateTime();
var leftWorkViewModel = _leftWorkRepository.GetLastLeftWorkByEmployeeIdAndWorkshopId(command.WorkshopId, employee.id);
PersonnelCodeDomain personnelCode = null;
if (leftWorkViewModel != null)
{
if (leftWorkViewModel.HasLeft == false && leftWorkViewModel.LeftWorkDate > DateTime.Now)
{
return op.Failed("شما نمیتوانید پرسنلی که در کارگاه شما در حال کار است را ایجاد کنید");
}
if (leftWorkViewModel.LeftWorkDate > startLeftWork)
{
return op.Failed("شما نمیتوانید قبل از بازه ترک کار قبلی پرسنل شروع به کاری ثبت کنید");
}
}
else
{
var lastPersonnelCodeByWorkshop = _personnelCodeRepository.GetLastPersonnelCodeByWorkshop(command.WorkshopId);
personnelCode = new PersonnelCodeDomain(command.WorkshopId,
employee.id, lastPersonnelCodeByWorkshop + 1);
}
var leftWorkTemp = LeftWorkTemp.CreateStartWork(command.WorkshopId, employee.id, startLeftWork, command.JobId);
_leftWorkTempRepository.Create(leftWorkTemp);
_leftWorkTempRepository.SaveChanges();
if (personnelCode != null)
{
_personnelCodeRepository.Create(personnelCode);
_personnelCodeRepository.SaveChanges();
}
if (string.IsNullOrWhiteSpace(command.RollCallUploadEmployeePicture?.Picture1) == false &&
string.IsNullOrWhiteSpace(command.RollCallUploadEmployeePicture?.Picture2) == false)
{
var directoryPath = $"{_webHostEnvironment.ContentRootPath}\\Faces\\{command.WorkshopId}\\{employee.id}";
if (!Directory.Exists(directoryPath))
Directory.CreateDirectory(directoryPath);
var filePath1 = Path.Combine(directoryPath) + $@"\1.jpg";
CreateImageFromBase64(command.RollCallUploadEmployeePicture.Picture1, filePath1);
var filePath2 = Path.Combine(directoryPath) + $@"\2.jpg";
CreateImageFromBase64(command.RollCallUploadEmployeePicture.Picture2, filePath2);
var rollCallEmployee =
_rollCallEmployeeRepository.GetBy(employee.id, command.WorkshopId);
if (rollCallEmployee == null)
{
if (_employeeClientTempRepository.Exists(x =>
x.EmployeeId == employee.id && x.WorkshopId == command.WorkshopId))
{
//var employeeTemp =
// _employeeClientTempRepository.GetByEmployeeIdAndWorkshopId(employee.id, command.WorkshopId);
rollCallEmployee = new RollCallEmployee(command.WorkshopId, employee.id, employee.FName,
employee.LName);
}
else
{
rollCallEmployee =
new RollCallEmployee(command.WorkshopId, employee.id, employee.FName, employee.LName);
}
rollCallEmployee.HasImage();
_rollCallEmployeeRepository.Create(rollCallEmployee);
_rollCallEmployeeRepository.SaveChanges();
}
if (command.CreateCustomizeEmployeeSettings.GroupId > 0)
{
if (_customizeWorkshopEmployeeSettingsRepository
.Exists(x => x.WorkshopId == workshop.Id && x.EmployeeId == employee.id))
{
_customizeWorkshopEmployeeSettingsRepository.RemoveByWorkshopIdAndEmployeeId(workshop.Id, employee.id);
}
command.CreateCustomizeEmployeeSettings.EmployeeIds = [employee.id];
command.CreateCustomizeEmployeeSettings.WorkshopId = command.WorkshopId;
var resultCreateEmployeeSettings =
_customizeWorkshopSettingsApplication.CreateEmployeesSettingsAndSetChanges(
command.CreateCustomizeEmployeeSettings);
if (resultCreateEmployeeSettings.IsSuccedded == false)
{
return resultCreateEmployeeSettings;
}
var rollCallEmployeeStatusResult = _rollCallEmployeeStatusApplication.Create(
new CreateRollCallEmployeeStatus() { RollCallEmployeeId = rollCallEmployee.id });
if (rollCallEmployeeStatusResult.IsSuccedded == false)
{
return rollCallEmployeeStatusResult;
}
}
}
else if (command.CreateCustomizeEmployeeSettings.GroupId > 0)
{
if (_customizeWorkshopEmployeeSettingsRepository
.Exists(x => x.WorkshopId == workshop.Id && x.EmployeeId == employee.id))
{
_customizeWorkshopEmployeeSettingsRepository.RemoveByWorkshopIdAndEmployeeId(workshop.Id, employee.id);
}
command.CreateCustomizeEmployeeSettings.EmployeeIds = [employee.id];
command.CreateCustomizeEmployeeSettings.WorkshopId = command.WorkshopId;
var resultCreateEmployeeSettings =
_customizeWorkshopSettingsApplication.CreateEmployeesSettingsAndSetChanges(
command.CreateCustomizeEmployeeSettings);
if (resultCreateEmployeeSettings.IsSuccedded == false)
{
return resultCreateEmployeeSettings;
}
var rollCallEmployee =
_rollCallEmployeeRepository.GetBy(employee.id, command.WorkshopId);
if (rollCallEmployee == null)
{
if (_employeeClientTempRepository.Exists(x =>
x.EmployeeId == employee.id && x.WorkshopId == command.WorkshopId))
{
rollCallEmployee = new RollCallEmployee(command.WorkshopId, employee.id, employee.FName,
employee.LName);
}
else
{
rollCallEmployee =
new RollCallEmployee(command.WorkshopId, employee.id, employee.FName, employee.LName);
}
_rollCallEmployeeRepository.Create(rollCallEmployee);
_rollCallEmployeeRepository.SaveChanges();
}
}
command.EmployeeDocumentItems = command.EmployeeDocumentItems ?? [];
var employeeDocumentResult = _employeeDocumentsApplication.AddRangeEmployeeDocumentItemsByClient(command.WorkshopId,
employee.id, command.EmployeeDocumentItems);
if (employeeDocumentResult.IsSuccedded == false)
{
return employeeDocumentResult;
}
var employeeTemp = new EmployeeClientTemp(command.WorkshopId, startLeftWork, employee.id,
command.MaritalStatus, employee.FullName);
_employeeClientTempRepository.Create(employeeTemp);
_employeeClientTempRepository.SaveChanges();
if (command.HasBankInformation)
{
var employeeBankInfos = command.EmployeeBankInfos.Select(x => new CreateEmployeeInformation
{
WorkshopId = command.WorkshopId,
BankAccountNumber = x.BankAccountNumber,
BankId = x.BankId,
CardNumber = x.CardNumber,
EmployeeId = employee.id,
EmployeeName = employee.FullName,
ShebaNumber = x.ShebaNumber
}).ToList();
var employeeBankInformationResult =
_employeeBankInformationApplication.GroupCreate(command.WorkshopId, employeeBankInfos);
if (employeeBankInformationResult.IsSuccedded == false)
{
return employeeBankInformationResult;
}
}
transaction.Complete();
return op.Succcedded(employee.id);
}
private void CreateImageFromBase64(string picture, string filePath)
{
var subBase64 = picture.Substring(picture.LastIndexOf(',') + 1);
byte[] bytes = Convert.FromBase64String(subBase64);
System.IO.File.WriteAllBytes(filePath, bytes);
}
public async Task<OperationResult<EmployeeByNationalCodeInWorkshopViewModel>>
ValidateCreateEmployeeClientByNationalCodeAndWorkshopId(string nationalCode, string birthDate, long workshopId)
{
var op = new OperationResult<EmployeeByNationalCodeInWorkshopViewModel>();
if (nationalCode.NationalCodeValid() != "valid")
{
return op.Failed("کد ملی معتبر نمیباشد");
}
if (birthDate.TryToGeorgianDateTime(out _) == false)
{
return op.Failed("تاریخ تولد معتبر نمیباشد");
}
var employee = _EmployeeRepository.GetByNationalCodeIgnoreQueryFilter(nationalCode);
if (employee == null)
{
var personalInfo = await _uidService.GetPersonalInfo(nationalCode, birthDate);
if (personalInfo.ResponseContext.Status.Code != 0)
{
return op.Failed("کد ملی و تاریخ تولد با هم همخانی ندارند");
}
var basicInfo = personalInfo.BasicInformation;
var identityInfo = personalInfo.IdentificationInformation;
DateTime apiBirthDate = identityInfo.BirthDate.ToGeorgianDateTime();
var dateOfIssue = new DateTime(1922, 1, 1);
var gender = basicInfo.GenderEnum switch
{
Gender.Female => "زن",
Gender.Male => "مرد",
_ => throw new AggregateException()
};
var idNumber = identityInfo.ShenasnamehNumber == "0" ? identityInfo.NationalId : identityInfo.ShenasnamehNumber;
var newEmployee = new Employee(basicInfo.FirstName, basicInfo.LastName, basicInfo.FatherName, apiBirthDate,
dateOfIssue, null, identityInfo.NationalId, idNumber, gender, "ایرانی");
newEmployee.Authorized();
await _EmployeeRepository.CreateAsync(newEmployee);
await _context.SaveChangesAsync();
return op.Succcedded(new EmployeeByNationalCodeInWorkshopViewModel()
{
EmployeeId = newEmployee.id,
EmployeeFName = newEmployee.FName,
Gender = newEmployee.Gender,
Nationality = newEmployee.Nationality,
EmployeeLName = newEmployee.LName
});
}
if (_leftWorkTempRepository.ExistsIgnoreQueryFilter(x =>
x.EmployeeId == employee.id && x.WorkshopId == workshopId && x.LeftWorkType == LeftWorkTempType.StartWork))
{
return op.Failed("این پرسنل در کارگاه شما قبلا افزوده شده است و در انتظار تایید میباشد");
}
if (employee.IsAuthorized == false)
{
var personalInfoResponse = await _uidService.GetPersonalInfo(nationalCode, birthDate);
if (personalInfoResponse.ResponseContext.Status.Code == 0)
{
var basicInfo = personalInfoResponse.BasicInformation;
var identityInfo = personalInfoResponse.IdentificationInformation;
var apiBirthDate = identityInfo.BirthDate.ToGeorgianDateTime();
var gender = basicInfo.GenderEnum switch
{
Gender.Female => "زن",
Gender.Male => "مرد",
_ => throw new AggregateException()
};
var idNumber = identityInfo.ShenasnamehNumber == "0" ? identityInfo.NationalId : identityInfo.ShenasnamehNumber;
employee.Edit(basicInfo.FirstName, basicInfo.LastName, basicInfo.FatherName, apiBirthDate,
employee.DateOfIssue, employee.PlaceOfIssue, identityInfo.NationalId, idNumber,
gender, "ایرانی", employee.Phone, employee.Address, employee.State, employee.City,
employee.MaritalStatus, employee.MilitaryService, employee.LevelOfEducation,
employee.FieldOfStudy, employee.BankCardNumber, employee.BankBranch, employee.InsuranceCode, employee.InsuranceHistoryByYear,
employee.InsuranceHistoryByMonth, employee.NumberOfChildren,
employee.OfficePhone, employee.MclsUserName, employee.MclsPassword,
employee.EserviceUserName, employee.EservicePassword, employee.TaxOfficeUserName,
employee.TaxOfficepassword, employee.SanaUserName, employee.SanaPassword);
employee.Authorized();
await _EmployeeRepository.SaveChangesAsync();
}
else
{
return op.Failed("کد ملی با تاریخ تولد وارد شده مطابقت ندارد");
}
}
else if (employee.DateOfBirth.ToFarsi() != birthDate || employee.NationalCode != nationalCode)
{
return op.Failed("کد ملی با تاریخ تولد وارد شده مطابقت ندارد");
}
var leftWorkViewModel = _leftWorkRepository.GetLastLeftWorkByEmployeeIdAndWorkshopId(workshopId, employee.id);
if (leftWorkViewModel == null)
{
return op.Succcedded(new EmployeeByNationalCodeInWorkshopViewModel()
{
EmployeeId = employee.id,
EmployeeFName = employee.FName,
Gender = employee.Gender,
Nationality = employee.Nationality,
EmployeeLName = employee.LName
}); ;
}
if (leftWorkViewModel.LeftWorkDate >= DateTime.Now || !leftWorkViewModel.HasLeft)
return op.Failed("این پرسنل در کارگاه شما در حال کار است");
var rollCallEmployee = _rollCallEmployeeRepository.GetBy(employee.id, workshopId);
string picture1 = string.Empty;
string picture2 = string.Empty;
if (rollCallEmployee != null)
{
var directoryPath = $"{_webHostEnvironment.ContentRootPath}\\Faces\\{workshopId}\\{employee.id}";
if (Directory.Exists(directoryPath))
{
var filePath1 = Path.Combine(directoryPath, @"1.jpg");
var filePath2 = Path.Combine(directoryPath, @"2.jpg");
if (System.IO.File.Exists(filePath1))
{
byte[] imageBytes1 = await System.IO.File.ReadAllBytesAsync(filePath1);
picture1 = Convert.ToBase64String(imageBytes1);
}
if (System.IO.File.Exists(filePath2))
{
byte[] imageBytes2 = await System.IO.File.ReadAllBytesAsync(filePath2);
picture2 = Convert.ToBase64String(imageBytes2);
}
}
}
var personnelCode = _personnelCodeRepository.GetPSCodeByWorkshopIdAndEmployeeId(workshopId, employee.id);
var bankInformationViewModel = _employeeBankInformationApplication.GetByEmployeeId(workshopId, employee.id);
var employeeDocumentsViewModel = _employeeDocumentsApplication.GetDetailsForClient(employee.id, workshopId);
return op.Succcedded(new EmployeeByNationalCodeInWorkshopViewModel
{
EmployeeId = employee.id,
EmployeeFName = employee.FName,
EmployeeLName = employee.LName,
Nationality = employee.Nationality,
MaritalStatus = employee.MaritalStatus,
Gender = employee.Gender,
Picture1 = picture1,
Picture2 = picture2,
PersonnelCode = personnelCode,
EmployeeBankInfos = bankInformationViewModel.BankInformation.Select(x => new EmployeeByNationalCodeEmployeeBankInfoViewModel
{
ShebaNumber = x.ShebaNumber,
IsDefault = x.IsDefault,
CardNumber = x.CardNumber,
BankAccountNumber = x.BankAccountNumber,
BankId = x.BankId,
BankLogoMediaId = x.BankLogoMediaId,
BankLogoPath = x.BankLogoPath,
BankName = x.BankName
}).ToList(),
EmployeeDocument = new EmployeeByNationalCodeEmployeeDocumentViewModel
{
EducationalDegree = employeeDocumentsViewModel.EducationalDegree,
EmployeePicture = employeeDocumentsViewModel.EmployeePicture,
IdCardPage1 = employeeDocumentsViewModel.IdCardPage1,
IdCardPage2 = employeeDocumentsViewModel.IdCardPage2,
IdCardPage3 = employeeDocumentsViewModel.IdCardPage3,
IdCardPage4 = employeeDocumentsViewModel.IdCardPage4,
MilitaryServiceCard = employeeDocumentsViewModel.MilitaryServiceCard,
NationalCardFront = employeeDocumentsViewModel.NationalCardFront,
NationalCardRear = employeeDocumentsViewModel.NationalCardRear
}
});
}
public async Task<ICollection<ClientStartedWorkEmployeesDto>> GetClientEmployeesStartWork(long workshopId)
{
return await _EmployeeRepository.GetClientEmployeesStartWork(workshopId);
}
public async Task<ICollection<ClientLeftWorkWorkEmployeesDto>> GetEmployeesForLeftWorkTemp(long workshopId)
{
return await _EmployeeRepository.GetEmployeesForLeftWorkTemp(workshopId);
}
public async Task<GetEditEmployeeInEmployeeDocumentViewModel> GetEmployeeEditInEmployeeDocumentWorkFlow(
long employeeId,
long workshopId)
{
return await _EmployeeRepository.GetEmployeeEditInEmployeeDocumentWorkFlow(employeeId, workshopId);
}
public async Task<OperationResult> EditEmployeeInEmployeeDocumentWorkFlow(EditEmployeeInEmployeeDocument command)
{
var op = new OperationResult();
if (command.MaritalStatus is not ("مجرد" or "متاهل"))
{
return op.Failed("وضعیت تاهل وارد شده نامعتبر میباشد");
}
var employee = _EmployeeRepository.Get(command.EmployeeId);
if (employee == null)
{
return op.Failed("پرسنل مورد نظر یافت نشد");
}
if (!employee.IsAuthorized)
{
if (command.Gender is not ("مرد" or "زن"))
{
return op.Failed("جنسیت وارد شده نامعتبر است");
}
if (command.BirthDate.TryToGeorgianDateTime(out var birthDateGr) == false)
{
return op.Failed("تاریخ تولد وارد شده نامعتبر است");
}
if (command.Nationality is not ("غیر ایرانی" or "ایرانی"))
{
return op.Failed("ملیت وارد شده نامعتبر است");
}
if (string.IsNullOrWhiteSpace(command.FName))
{
return op.Failed("لطفا نام پرسنل را وارد کنید");
}
if (string.IsNullOrWhiteSpace(command.LName))
{
return op.Failed("لطفا نام خانوادگی پرسنل را وارد کنید");
}
if (command.NationalCode.NationalCodeValid() != "valid")
{
return op.Failed("کد ملی وارد شده نامعتبر است");
}
if (string.IsNullOrWhiteSpace(command.IdNumber))
{
return op.Failed("لطفا شماره شناسنامه را وارد کنید");
}
if (string.IsNullOrWhiteSpace(command.FatherName))
{
return op.Failed("لطفا نام پدر را وارد کنید");
}
}
var employeeClientTemp = _employeeClientTempRepository.GetByEmployeeIdAndWorkshopId(command.EmployeeId, command.WorkshopId);
employeeClientTemp?.Edit(command.MaritalStatus);
if (!employee.IsAuthorized)
{
employee.Edit(command.FName, command.LName, command.FatherName, command.BirthDate.ToGeorgianDateTime(),
employee.DateOfIssue, employee.PlaceOfIssue, command.NationalCode, command.IdNumber, command.Gender,
command.Nationality,
employee.Phone, employee.Address, employee.State, employee.City, employee.MaritalStatus,
employee.MilitaryService,
employee.LevelOfEducation, employee.FieldOfStudy, employee.BankCardNumber, employee.BankBranch,
employee.InsuranceCode, employee.InsuranceHistoryByYear, employee.InsuranceHistoryByMonth,
employee.NumberOfChildren, employee.OfficePhone, employee.MclsUserName, employee.MclsPassword,
employee.EserviceUserName, employee.EservicePassword, employee.TaxOfficeUserName,
employee.TaxOfficepassword, employee.SanaUserName, employee.SanaPassword);
}
await _EmployeeRepository.SaveChangesAsync();
return op.Succcedded();
}
#endregion
}

View File

@@ -0,0 +1,32 @@
using _0_Framework_b.Application;
using Company.Domain.EmployeeClientTempAgg;
using CompanyManagment.App.Contracts.EmployeeClientTemp;
namespace CompanyManagment.Application;
public class EmployeeClientTempApplication : IEmployeeClientTempApplication
{
private readonly IEmployeeClientTempRepository _employeeClientTempRepository;
public EmployeeClientTempApplication(IEmployeeClientTempRepository employeeClientTempRepository)
{
_employeeClientTempRepository = employeeClientTempRepository;
}
public OperationResult Create(CreateEmployeeClientTemp command)
{
var op = new OperationResult();
var fullName = $"{command.FName} {command.LName}";
var employeeClientTemp = new EmployeeClientTemp(command.WorkshopId, command.StartWorkTime, command.EmployeeId, command.MaritalStatus, fullName);
_employeeClientTempRepository.Create(employeeClientTemp);
_employeeClientTempRepository.SaveChanges();
return op.Succcedded();
}
public EmployeeClientTempGetDetailsViewModel GetDetails(long employeeId, long workshopId)
{
return _employeeClientTempRepository.GetDetails(employeeId, workshopId);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,262 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using _0_Framework.Application;
using _0_Framework_b.Application;
using Company.Domain.CheckoutAgg;
using Company.Domain.ContractAgg;
using Company.Domain.EmployeeAgg;
using Company.Domain.JobAgg;
using Company.Domain.LeftWorkAgg;
using Company.Domain.LeftWorkTempAgg;
using Company.Domain.RollCallEmployeeAgg;
using Company.Domain.RollCallEmployeeStatusAgg;
using Company.Domain.WorkshopAgg;
using CompanyManagment.App.Contracts.Checkout;
using CompanyManagment.App.Contracts.Contract;
using CompanyManagment.App.Contracts.LeftWork;
using CompanyManagment.App.Contracts.LeftWorkTemp;
using CompanyManagment.App.Contracts.ReportClient;
using CompanyManagment.App.Contracts.RollCallEmployee;
using OperationResult = _0_Framework.Application.OperationResult;
using Tools = _0_Framework.Application.Tools;
namespace CompanyManagment.Application;
public class LeftWorkTempApplication : ILeftWorkTempApplication
{
private readonly ILeftWorkTempRepository _leftWorkTempRepository;
private readonly ILeftWorkRepository _leftWorkRepository;
private readonly IWorkshopRepository _workshopRepository;
private readonly IEmployeeRepository _employeeRepository;
private readonly IJobRepository _jobRepository;
private readonly ICheckoutRepository _checkoutRepository;
private readonly IContractRepository _contractRepository;
private readonly IRollCallEmployeeRepository _rollCallEmployeeRepository;
private readonly IRollCallEmployeeStatusRepository _rollCallEmployeeStatusRepository;
public LeftWorkTempApplication(ILeftWorkTempRepository leftWorkTempRepository, ILeftWorkRepository leftWorkRepository, IWorkshopRepository workshopRepository, IEmployeeRepository employeeRepository, IJobRepository jobRepository, ICheckoutRepository checkoutRepository, IContractRepository contractRepository, IRollCallEmployeeStatusRepository rollCallEmployeeStatusRepository, IRollCallEmployeeRepository rollCallEmployeeRepository)
{
_leftWorkTempRepository = leftWorkTempRepository;
_leftWorkRepository = leftWorkRepository;
_workshopRepository = workshopRepository;
_employeeRepository = employeeRepository;
_jobRepository = jobRepository;
_checkoutRepository = checkoutRepository;
_contractRepository = contractRepository;
_rollCallEmployeeStatusRepository = rollCallEmployeeStatusRepository;
_rollCallEmployeeRepository = rollCallEmployeeRepository;
}
public async Task<OperationResult> Create(CreateLeftWorkTemp command)
{
var op = new OperationResult();
foreach (var employee in command.EmployeeIds)
{
#region Validation
if (command.LeftWorkTime.TryToGeorgianDateTime(out var leftWorkDateGr) == false)
{
return op.Failed("تاریخ شروع به کار وارد شده نامعتبر است");
}
if (command.LastDayStanding.TryToGeorgianDateTime(out var lastDayStandingDateGr) == false)
{
return op.Failed("تاریخ شروع به کار وارد شده نامعتبر است");
}
var leftWork = _leftWorkRepository.GetByDateAndWorkshopIdAndEmployeeId(command.WorkshopId, employee, lastDayStandingDateGr);
if (lastDayStandingDateGr.AddDays(1).Date != leftWorkDateGr)
{
return op.Failed("تاریخ آخرین روز کاری با تاریخ ترک کار یک روز اختلاف ندارند");
}
if (leftWork == null)
{
return op.Failed("شروع به کار پرسنل یافت نشد");
}
if (leftWork.WorkshopId != command.WorkshopId || leftWork.EmployeeId != employee)
{
return op.Failed("اطلاعات وارد شده نامعتبر است");
}
//if (leftWork.StartWorkDate >= leftWorkDateGr)
//{
// return op.Failed("ترک کار نمیتواند کوچک تر یا مساوی شروع به کار باشد");
//}
//if (_checkoutRepository.Exists(x => x.EmployeeId == leftWorkTemp.EmployeeId &&
// x.WorkshopId == leftWorkTemp.WorkshopId &&
// x.ContractStart <= lastDayStandingGr && x.ContractEnd >= lastDayStandingGr))
//{
// return op.Failed("این پرسنل در تاریخ ترک کار وارد شده دارای فیش حقوقی میباشد. ابتدا فیش حقوقی پرسنل را حذف کنید ");
//}
//if (_contractRepository.Exists(x => x.EmployeeId == leftWorkTemp.EmployeeId &&
// x.WorkshopIds == leftWorkTemp.WorkshopId &&
// x.ContarctStart <= lastDayStandingGr && x.ContractEnd >= lastDayStandingGr))
//{
// return op.Failed("این پرسنل در تاریخ ترک کار وارد شده دارای قرارداد میباشد");
//}
#endregion
var leftWorkTemp = LeftWorkTemp.CreateLeftWork(leftWork.Id, leftWork.StartWorkDateGr, leftWorkDateGr, lastDayStandingDateGr,
command.WorkshopId, employee, leftWork.JobId);
await _leftWorkTempRepository.CreateAsync(leftWorkTemp);
}
await _leftWorkTempRepository.SaveChangesAsync();
return op.Succcedded();
}
public Task<GetStartWorkTempDetails> GetStartAndLeftWorkDetails(long employeeId, long workshopId)
{
return _leftWorkTempRepository.GetStartAndLeftWorkDetails(employeeId, workshopId);
}
public async Task<OperationResult> AcceptStartWork(AcceptStartWorkTemp command)
{
var op = new OperationResult();
if (command.StartDateTime.TryToGeorgianDateTime(out var startDateGr) == false)
{
return op.Failed("تاریخ شروع به کار وارد شده نامعتبر است");
}
var leftWorkTemp = _leftWorkTempRepository.Get(command.LeftWorkTempId);
if (leftWorkTemp.LeftWorkType != LeftWorkTempType.StartWork)
{
return op.Failed("اطلاعات وارد شده نامعتبر است");
}
if (_leftWorkRepository.Exists(x => x.WorkshopId == leftWorkTemp.WorkshopId && x.EmployeeId == leftWorkTemp.EmployeeId && x.LeftWorkDate >= startDateGr))
{
return op.Failed("شروع به کار وارد شده با ترک کار های قبلی تداخل دارد");
}
if (_jobRepository.Exists(x => x.id == command.JobId) == false)
{
return op.Failed("سمت وارد شده نامعتبر است");
}
var defaultTime = new DateTime(2121, 03, 21);
var workshop = _workshopRepository.Get(leftWorkTemp.WorkshopId);
var employee = _employeeRepository.Get(leftWorkTemp.EmployeeId);
var newLeftWork = new LeftWork(defaultTime, startDateGr, leftWorkTemp.WorkshopId, leftWorkTemp.EmployeeId,
employee.FullName, workshop.WorkshopFullName, command.JobId, false, false, false, false, "", "");
await _leftWorkRepository.CreateAsync(newLeftWork);
_leftWorkTempRepository.Remove(leftWorkTemp);
await _leftWorkRepository.SaveChangesAsync();
await _leftWorkTempRepository.SaveChangesAsync();
return op.Succcedded();
}
public async Task<OperationResult> AcceptLeftWork(AcceptLeftWorkTemp command)
{
var op = new OperationResult();
if (command.LeftWorkTime.TryToGeorgianDateTime(out var leftWorkDateGr) == false)
{
return op.Failed("تاریخ ترک کار وارد شده نامعتبر است");
}
if (command.LastDayStanding.TryToGeorgianDateTime(out var lastDayStandingGr) == false)
{
return op.Failed("تاریخ آخرین روز کاری وارد شده نامعتبر است");
}
if (lastDayStandingGr.AddDays(1).Date != leftWorkDateGr)
{
return op.Failed("تاریخ آخرین روز کاری با تاریخ ترک کار یک روز اختلاف ندارند");
}
var leftWorkTemp = _leftWorkTempRepository.Get(command.LeftWorkTempId);
if (leftWorkTemp == null)
{
return op.Failed("ترک کار وارد شده یافت نشد");
}
if (leftWorkTemp.LeftWorkType != LeftWorkTempType.LeftWork)
{
return op.Failed("اطلاعات وارد شده نامعتبر است");
}
var leftWork = _leftWorkRepository.Get(leftWorkTemp.LeftWorkId);
if (leftWork == null)
return op.Failed("شروع به کار پرسنل یافت نشد");
if (leftWork.StartWorkDate >= leftWorkDateGr)
{
return op.Failed("ترک کار نمیتواند کوچک تر یا مساوی شروع به کار باشد");
}
if (_checkoutRepository.Exists(x => x.EmployeeId == leftWorkTemp.EmployeeId &&
x.WorkshopId == leftWorkTemp.WorkshopId &&
x.ContractStart <= lastDayStandingGr && x.ContractEnd >= lastDayStandingGr))
{
return op.Failed("این پرسنل در تاریخ ترک کار وارد شده دارای فیش حقوقی میباشد. ابتدا فیش حقوقی پرسنل را حذف کنید ");
}
leftWork.Edit(leftWorkDateGr, leftWork.StartWorkDate, leftWork.WorkshopId, leftWork.EmployeeId, leftWork.JobId,
leftWork.IncludeStatus, leftWork.AddBonusesPay, leftWork.AddYearsPay, leftWork.AddLeavePay);
_leftWorkTempRepository.Remove(leftWorkTemp);
await _leftWorkRepository.SaveChangesAsync();
await _leftWorkTempRepository.SaveChangesAsync();
IfEmployeeHasNewLeftWorkDateAddEndDateToRollCallStatus(leftWork.EmployeeId);
return op.Succcedded();
}
//این متد ترک کار های کارمند را با فعالیت حضور غیاب یکپارچه می کند
private void IfEmployeeHasNewLeftWorkDateAddEndDateToRollCallStatus(long employeeId)
{
//get last leftworks for employee in all workshops
var leftWorks = _leftWorkRepository.search(new LeftWorkSearchModel() { EmployeeId = employeeId }).GroupBy(x => x.WorkshopId).Select(x =>
{
var leftWork = x.MaxBy(y => y.StartWorkDateGr);
return new LeftWorkViewModel()
{
EmployeeId = employeeId,
WorkshopId = x.Key,
LeftWorkDateGr = leftWork.LeftWorkDateGr.Date.AddDays(-1),
StartWorkDateGr = leftWork.StartWorkDateGr
};
}).ToList();
//get rollCallEmployee associated with those leftworks which have a higher end date than leftworkDate
var rollCallsEmployee = _rollCallEmployeeRepository.GetByEmployeeIdWithStatuses(employeeId)
.Where(x => leftWorks.Any(y => y.WorkshopId == x.WorkshopId)).ToList();
var joinedList = rollCallsEmployee.Join(leftWorks, x => x.WorkshopId, y => y.WorkshopId, (x, y) => new
{
x.WorkshopId,
x.EmployeeId,
y.LeftWorkDateGr,
Status = x.Statuses.OrderByDescending(z => z.StartDate).FirstOrDefault(z => z.StartDateGr.Date < y.LeftWorkDateGr && z.EndDateGr.Date > y.LeftWorkDateGr)
});
//shaping up the list to send as parameter to repository
var newRollCallRecords = joinedList.Where(x => x.Status != null).Select(x => new AdjustRollCallEmployeesWithEmployeeLeftWork()
{
LeaveDate = x.LeftWorkDateGr,
RollCallStatusId = x.Status.Id
}).ToList();
if (newRollCallRecords.Count > 0)
_rollCallEmployeeStatusRepository.AdjustRollCallStatusEndDates(newRollCallRecords);
}
}

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

@@ -5,12 +5,12 @@ using Company.Domain.RollCallEmployeeStatusAgg;
using CompanyManagment.App.Contracts.RollCallEmployeeStatus;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Company.Domain.RollCallServiceAgg;
using System.Globalization;
using CompanyManagment.EFCore.Migrations;
using RollCallEmployee = Company.Domain.RollCallEmployeeAgg.RollCallEmployee;
using RollCallEmployeeStatus = Company.Domain.RollCallEmployeeStatusAgg.RollCallEmployeeStatus;
using Company.Domain.LeftWorkTempAgg;
using Company.Domain.LeftWorkInsuranceAgg;
using CompanyManagment.App.Contracts.LeftWorkTemp;
namespace CompanyManagment.Application
@@ -21,14 +21,19 @@ namespace CompanyManagment.Application
private readonly IRollCallEmployeeRepository _rollCallEmployeeRepository;
private readonly ILeftWorkRepository _leftWorkRepository;
private readonly IRollCallServiceRepository _rollCallServiceRepository;
private readonly ILeftWorkTempRepository _leftWorkTempRepository;
private readonly ILeftWorkInsuranceRepository _leftWorkInsuranceRepository;
public RollCallEmployeeStatusApplication(IRollCallEmployeeStatusRepository employeeStatusRepository, IRollCallEmployeeRepository rollCallEmployeeRepository, ILeftWorkRepository leftWorkRepository, IRollCallServiceRepository rollCallServiceRepository)
public RollCallEmployeeStatusApplication(IRollCallEmployeeStatusRepository employeeStatusRepository, IRollCallEmployeeRepository rollCallEmployeeRepository, ILeftWorkRepository leftWorkRepository, IRollCallServiceRepository rollCallServiceRepository, ILeftWorkTempRepository leftWorkTempRepository, ILeftWorkInsuranceRepository leftWorkInsuranceRepository)
{
_employeeRollCallStatusRepository = employeeStatusRepository;
_rollCallEmployeeRepository = rollCallEmployeeRepository;
_leftWorkRepository = leftWorkRepository;
_rollCallServiceRepository = rollCallServiceRepository;
_leftWorkTempRepository = leftWorkTempRepository;
_leftWorkInsuranceRepository = leftWorkInsuranceRepository;
}
public OperationResult Create(CreateRollCallEmployeeStatus cmd)
@@ -38,9 +43,15 @@ namespace CompanyManagment.Application
if (rollCallEmployee == null)
return op.Failed("کارمند مجاز نیست");
if (!_leftWorkRepository.Exists(x => x.EmployeeId == rollCallEmployee.EmployeeId && x.WorkshopId == rollCallEmployee.WorkshopId &&
(x.LeftWorkDate.Date > DateTime.Now.Date && x.StartWorkDate.Date <= DateTime.Now.Date) || x.StartWorkDate >= DateTime.Today))
return op.Failed("کارمند در کارگاه شروع به کار نکرده است");
if (!_leftWorkRepository.Exists(x =>
x.EmployeeId == rollCallEmployee.EmployeeId && x.WorkshopId == rollCallEmployee.WorkshopId &&
x.StartWorkDate <= DateTime.Now && x.LeftWorkDate > DateTime.Now) &&
!_leftWorkTempRepository.Exists(x =>
x.EmployeeId == rollCallEmployee.EmployeeId && x.WorkshopId == rollCallEmployee.WorkshopId &&
x.LeftWorkType == LeftWorkTempType.StartWork))
{
return op.Failed("کارمند شروع به کار ندارد");
}
if (_employeeRollCallStatusRepository.Exists(y =>
rollCallEmployee.id == y.RollCallEmployeeId && y.EndDate.Date > DateTime.Now.Date))

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
}

View File

@@ -25,6 +25,7 @@ using Company.Domain.EmployeeAccountAgg;
using Company.Domain.EmployeeAgg;
using Company.Domain.EmployeeBankInformationAgg;
using Company.Domain.EmployeeChildrenAgg;
using Company.Domain.EmployeeClientTempAgg;
using Company.Domain.EmployeeComputeOptionsAgg;
using Company.Domain.EmployeeDocumentItemAgg;
using Company.Domain.EmployeeDocumentsAgg;
@@ -63,6 +64,7 @@ using Company.Domain.JobAgg;
using Company.Domain.LeaveAgg;
using Company.Domain.LeftWorkAgg;
using Company.Domain.LeftWorkInsuranceAgg;
using Company.Domain.LeftWorkTempAgg;
using Company.Domain.LoanAgg.Entities;
using Company.Domain.MandatoryHoursAgg;
using Company.Domain.MasterPenaltyTitle;
@@ -168,6 +170,9 @@ public class CompanyContext : DbContext
public DbSet<AndroidApkVersion> AndroidApkVersions { get; set; }
public DbSet<EmployeeClientTemp> EmployeeClientTemps { get; set; }
public DbSet<LeftWorkTemp> LeftWorkTemps { get; set; }
#endregion
#region Pooya

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

@@ -1487,6 +1487,9 @@ namespace CompanyManagment.EFCore.Migrations
.HasMaxLength(10)
.HasColumnType("nvarchar(10)");
b.Property<bool>("IsAuthorized")
.HasColumnType("bit");
b.Property<string>("LName")
.IsRequired()
.HasMaxLength(255)
@@ -1637,6 +1640,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")
@@ -3461,6 +3495,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

@@ -168,4 +168,10 @@ public class CustomizeWorkshopEmployeeSettingsRepository(CompanyContext companyC
}).ToList();
}
public void RemoveByWorkshopIdAndEmployeeId(long workshopId, long employeeId)
{
var entity = _companyContext.CustomizeWorkshopEmployeeSettings.FirstOrDefault(x => x.WorkshopId == workshopId && x.EmployeeId == employeeId);
if (entity != null)
Remove(entity);
}
}

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

@@ -394,17 +394,19 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
{
var activeEmployees = _companyContext.LeftWorkList
.Where(x => workshops.Contains(x.WorkshopId) && x.LeftWorkDate.AddDays(-1) >= DateTime.Now)
.Select(x=>new{x.WorkshopId,x.EmployeeId});
.Select(x => new { x.WorkshopId, x.EmployeeId });
var employeeClientTemp = _companyContext.EmployeeClientTemps.Where(x => workshops.Contains(x.WorkshopId));
var query = _companyContext.EmployeeDocuments
.Where(x=> workshops.Contains(x.WorkshopId) &&
activeEmployees.Any(y=>y.WorkshopId == x.WorkshopId && y.EmployeeId==x.EmployeeId))
.Include(x=>x.Workshop).Include(x => x.EmployeeDocumentItemCollection)
.Where(x=> x.IsSentToChecker == false &&
(x.EmployeeDocumentItemCollection.Any(y =>
y.DocumentStatus == DocumentStatus.SubmittedByClient)) || x.HasRejectedItems)
.GroupBy(x=>x.WorkshopId).Select(x => new WorkshopWithEmployeeDocumentsViewModel()
.Where(x => workshops.Contains(x.WorkshopId) &&
(activeEmployees.Any(y => y.WorkshopId == x.WorkshopId && y.EmployeeId == x.EmployeeId) ||
employeeClientTemp.Any(temp => x.EmployeeId == temp.EmployeeId && temp.WorkshopId == x.WorkshopId)) && x.IsConfirmed == false)
.Include(x => x.Workshop).Include(x => x.EmployeeDocumentItemCollection)
.Where(x => x.IsSentToChecker == false &&
(x.EmployeeDocumentItemCollection.Any(y =>
y.DocumentStatus == DocumentStatus.SubmittedByClient) || employeeClientTemp.Any(temp => x.EmployeeId == temp.EmployeeId && temp.WorkshopId == x.WorkshopId) || x.HasRejectedItems))
.GroupBy(x => x.WorkshopId).Select(x => new WorkshopWithEmployeeDocumentsViewModel()
{
WorkshopId = x.Key,
WorkshopFullName = x.FirstOrDefault().Workshop.WorkshopName,
@@ -414,7 +416,7 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
var workshopEmployers = _companyContext.WorkshopEmployers.Include(x => x.Employer)
.Where(x => query.Any(y=>y.WorkshopId==x.WorkshopId))
.Where(x => query.Any(y => y.WorkshopId == x.WorkshopId))
.GroupBy(x => x.WorkshopId).Select(x => x.FirstOrDefault()).ToList();
@@ -422,24 +424,27 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
var result = query.ToList();
result.ForEach(x =>
{
var employer = workshopEmployers.FirstOrDefault(y => y.WorkshopId == x.WorkshopId)?.Employer;
x.EmployerName = employer.FullName;
//x.SubmittedItems.ForEach(y=>y.PicturePath= medias.FirstOrDefault(z=>z.id == y.MediaId)?.Path ?? "");
});
return result.Where(x=>x.EmployeesWithoutDocumentCount > 0).OrderByDescending(x => x.EmployeesWithoutDocumentCount).ToList();
return result.Where(x => x.EmployeesWithoutDocumentCount > 0).OrderByDescending(x => x.EmployeesWithoutDocumentCount).ToList();
}
//ToDo آپلود مدارک و افزودن پرسنل
//public List<WorkshopWithEmployeeDocumentsViewModel> GetWorkshopsWithNewEmployeesWithoutDocuments(List<long> workshops)
//{
// var newEmployees = _companyContext.LeftWorkTemps.Where(x => workshops.Contains(x.WorkshopId))
// .Select(x => new { x.WorkshopId, x.EmployeeId });
// var query = _companyContext.EmployeeDocuments
// .Where(x => workshops.Contains(x.WorkshopId) &&
// newEmployees.Any(y => y.WorkshopId == x.WorkshopId && y.EmployeeId == x.EmployeeId))
@@ -472,62 +477,88 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
{
var activeEmployeesInWorkshop = _companyContext.LeftWorkList
.Where(x => workshopId == x.WorkshopId && x.LeftWorkDate.AddDays(-1) >= DateTime.Today)
.Include(x=>x.Employee).ThenInclude(x=>x.EmployeeDocuments)
.Select(x => new {x.EmployeeId ,FullName= x.Employee.FName +" " +x.Employee.LName,x.Employee.Gender});
.Include(x => x.Employee).ThenInclude(x => x.EmployeeDocuments)
.Select(x => new { x.EmployeeId, FullName = x.Employee.FName + " " + x.Employee.LName, x.Employee.Gender });
var EDItemsList = _companyContext.EmployeeDocumentItems
.Where(x => x.WorkshopId == workshopId && x.DocumentStatus != DocumentStatus.Unsubmitted &&
activeEmployeesInWorkshop.Any(y => y.EmployeeId == x.EmployeeId))
.Include(x => x.EmployeeDocuments).Where(x=> x.EmployeeDocuments.IsSentToChecker == false &&
( (x.DocumentStatus == DocumentStatus.SubmittedByClient) || x.EmployeeDocuments.HasRejectedItems) )
.Include(x => x.EmployeeDocuments)
.Where(x => x.EmployeeDocuments.IsSentToChecker == false &&
((x.DocumentStatus == DocumentStatus.SubmittedByClient) ||
x.EmployeeDocuments.HasRejectedItems))
.GroupBy(x => new { x.EmployeeId, x.DocumentLabel })
.Select(x =>
x.Select(y => new
{
y.EmployeeDocumentId,
Id = y.id,
y.EmployeeDocuments.Gender,
y.DocumentLabel,
y.DocumentStatus,
y.MediaId,
y.RejectionReason,
y.EmployeeId,
y.CreationDate,
IsSentToChecker = y.EmployeeDocuments.IsSentToChecker,
y.EmployeeDocuments.IsConfirmed
})
.OrderByDescending(y => y.CreationDate).First())
{
y.EmployeeDocumentId,
Id = y.id,
y.EmployeeDocuments.Gender,
y.DocumentLabel,
y.DocumentStatus,
y.MediaId,
y.RejectionReason,
y.EmployeeId,
y.CreationDate,
IsSentToChecker = y.EmployeeDocuments.IsSentToChecker,
y.EmployeeDocuments.IsConfirmed
}).OrderByDescending(y => y.CreationDate).First()).ToList();
var employeeClientTemp = _companyContext.EmployeeClientTemps.Where(x => x.WorkshopId == workshopId);
var tempEmployees = _companyContext.Employees.Where(x => employeeClientTemp.Any(a => a.EmployeeId == x.id))
.Select(x => new { EmployeeId = x.id, FullName = x.FName + " " + x.LName, x.Gender }).ToList();
var tempEmployeeDocuments = _companyContext.EmployeeDocuments
.Where(x => x.WorkshopId == workshopId && employeeClientTemp.Any(e => e.EmployeeId == x.EmployeeId) &&
x.IsSentToChecker == false && x.IsConfirmed == false)
.SelectMany(x => x.EmployeeDocumentItemCollection.DefaultIfEmpty(), // اگر خالی بود، مقدار پیش‌فرض ایجاد کن
(documents, y) => new
{
EmployeeDocumentId = documents.id, // اگر null بود مقدار نداشته باشد
Id = y != null ? y.id : 0,
documents.Gender,
DocumentLabel = y != null ? y.DocumentLabel : default,
DocumentStatus = y != null ? y.DocumentStatus : default,
MediaId = y != null ? y.MediaId : 0,
RejectionReason = y != null ? y.RejectionReason : default,
EmployeeId = y != null ? y.EmployeeId : documents.EmployeeId, // اگر مقدار نداشت از EmployeeDocuments پر کن
CreationDate = y != null ? y.CreationDate : documents.CreationDate,
IsSentToChecker = documents.IsSentToChecker,
IsConfirmed = documents.IsConfirmed
})
.ToList();
var activeEmployeesInWorkshopList = activeEmployeesInWorkshop.ToList();
var enumerable = EDItemsList.Concat(tempEmployeeDocuments);
var activeEmployeesInWorkshopList = activeEmployeesInWorkshop.ToList().Concat(tempEmployees);
//get medias for current documents of employees
var mediaIds = EDItemsList.Select(x => x.MediaId).ToList();
var mediaIds = enumerable.Select(x => x.MediaId).ToList();
var mediasList = _accountContext.Medias.Where(x => mediaIds.Contains(x.id))
.Select(x => new MediaViewModel() { Id= x.id, Path = x.Path }).ToList();
.Select(x => new MediaViewModel() { Id = x.id, Path = x.Path }).ToList();
return EDItemsList.GroupBy(x=>x.EmployeeId)
var result = enumerable.GroupBy(x => x.EmployeeId)
.Select(x =>
{
//var requiredDocs = EmployeeDocumentRequiredItems.GetByGender(x.Gender);
var employeeLatestConfirmedDocuments = x
.Where(y => y.EmployeeId == x.Key &&(y.DocumentStatus == DocumentStatus.SubmittedByClient || y.DocumentStatus == DocumentStatus.SubmittedByAdmin || y.DocumentStatus == DocumentStatus.Rejected))
.Select(y=>new EmployeeDocumentItemViewModel()
{
Status = y.DocumentStatus,
MediaId = y.MediaId,
DocumentItemLabel = y.DocumentLabel,
Id = y.Id,
RejectionMessage = y.RejectionReason,
StatusString = y.DocumentStatus.ToString()
}).ToList();
.Where(y => y.EmployeeId == x.Key && (y.DocumentStatus == DocumentStatus.SubmittedByClient || y.DocumentStatus == DocumentStatus.SubmittedByAdmin || y.DocumentStatus == DocumentStatus.Rejected))
.Select(y => new EmployeeDocumentItemViewModel()
{
Status = y.DocumentStatus,
MediaId = y.MediaId,
DocumentItemLabel = y.DocumentLabel,
Id = y.Id,
RejectionMessage = y.RejectionReason,
StatusString = y.DocumentStatus.ToString()
}).ToList();
//var requiredItemsUploaded = employeeLatestConfirmedDocuments
@@ -542,7 +573,7 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
IdCardPage3 = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.IdCardPage3),
IdCardPage4 = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.IdCardPage4),
EducationalDegree = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.EducationalDegree),
EmployeeFullName = activeEmployeesInWorkshopList.First(y=>y.EmployeeId==x.Key).FullName,
EmployeeFullName = activeEmployeesInWorkshopList.First(y => y.EmployeeId == x.Key).FullName,
NationalCardFront = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.NationalCardFront),
NationalCardRear = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.NationalCardRear),
MilitaryServiceCard = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.MilitaryServiceCard),
@@ -552,6 +583,8 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
};
}).ToList();
return result;
}
@@ -561,12 +594,12 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
public List<WorkshopWithEmployeeDocumentsViewModel> GetWorkshopsWithUploadedDocuments()
{
var itemsQuery = _companyContext.EmployeeDocumentItems
.Where(x => x.DocumentStatus != DocumentStatus.Unsubmitted && x.DocumentStatus != DocumentStatus.SubmittedByClient)
.Where(x => x.DocumentStatus != DocumentStatus.Unsubmitted)
.Include(x => x.EmployeeDocuments)
.ThenInclude(x => x.Workshop).ThenInclude(x=>x.WorkshopEmployers).ThenInclude(x=>x.Employer)
.GroupBy(x=>x.WorkshopId).Select(x => new WorkshopWithEmployeeDocumentsViewModel()
{
SubmittedItemsCount = x.Count(y => y.DocumentStatus == DocumentStatus.SubmittedByAdmin),
SubmittedItemsCount = x.Count(y => y.DocumentStatus == DocumentStatus.SubmittedByAdmin || y.DocumentStatus == DocumentStatus.SubmittedByClient),
WorkshopId = x.Key,
WorkshopFullName = x.First().EmployeeDocuments.Workshop.WorkshopName,
EmployerName = x.First().EmployeeDocuments.Workshop.WorkshopEmployers.First().Employer.FullName
@@ -633,7 +666,7 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
var workshopDocuments = _companyContext.EmployeeDocuments.Where(x => x.WorkshopId == workshopId)
.Include(x => x.EmployeeDocumentItemCollection)
.Where(x=>x.EmployeeDocumentItemCollection.Any(y =>
y.DocumentStatus != DocumentStatus.Unsubmitted && y.DocumentStatus != DocumentStatus.SubmittedByClient));
y.DocumentStatus != DocumentStatus.Unsubmitted));
var employeesList = _companyContext.Employees.Where(x =>
workshopDocuments.Any(y => y.EmployeeId == x.id))
@@ -655,8 +688,7 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
var workshopDocumentsListWithConfirmed = workshopDocumentsList.Select(x => new
{
EmployeeDocuments = x,
EmployeeDocumentItemCollection = x.EmployeeDocumentItemCollection.Where(y=> y.DocumentStatus != DocumentStatus.Unsubmitted &&
y.DocumentStatus != DocumentStatus.SubmittedByClient)
EmployeeDocumentItemCollection = x.EmployeeDocumentItemCollection.Where(y=> y.DocumentStatus != DocumentStatus.Unsubmitted)
.GroupBy(y => y.DocumentLabel)
.Select(y => y.MaxBy(z => z.CreationDate))
. ToList()
@@ -676,8 +708,8 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
x.EmployeeDocumentItemCollection.All(y => y.DocumentStatus != DocumentStatus.SubmittedByAdmin)).ToList();
else
workshopDocumentsListWithConfirmed = workshopDocumentsListWithConfirmed.Where(x =>
x.EmployeeDocumentItemCollection.Any(y => y.DocumentStatus == DocumentStatus.SubmittedByAdmin)).ToList();
x.EmployeeDocumentItemCollection.Any(y => y.DocumentStatus is DocumentStatus.SubmittedByAdmin or DocumentStatus.SubmittedByClient)).ToList();
return workshopDocumentsListWithConfirmed.Select(x => new EmployeeDocumentsViewModel()
{
Id=x.EmployeeDocuments.id,
@@ -704,7 +736,7 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
DocumentItemLabel.MilitaryServiceCard),
EmployeePicture = GetByLabelAndLoadMedia(x.EmployeeDocumentItemCollection, mediasList,
DocumentItemLabel.EmployeePicture),
SubmittedItemsCount = x.EmployeeDocumentItemCollection.Count(y=>y.DocumentStatus==DocumentStatus.SubmittedByAdmin),
SubmittedItemsCount = x.EmployeeDocumentItemCollection.Count(y=>y.DocumentStatus is DocumentStatus.SubmittedByAdmin or DocumentStatus.SubmittedByClient),
RejectedItemsCount = x.EmployeeDocumentItemCollection.Count(y => y.DocumentStatus == DocumentStatus.Rejected),
ConfirmedItemsCount = x.EmployeeDocumentItemCollection.Count(y => y.DocumentStatus == DocumentStatus.Confirmed),
EmployerFullName = employerName,
@@ -717,30 +749,30 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
public int GetCheckerWorkFlowCount()
public async Task<int> GetCheckerWorkFlowCount()
{
return _companyContext.EmployeeDocumentItems.Include(x => x.EmployeeDocuments)
.Count(x => x.DocumentStatus == DocumentStatus.SubmittedByAdmin);
return await _companyContext.EmployeeDocumentItems.Include(x => x.EmployeeDocuments)
.CountAsync(x => x.DocumentStatus == DocumentStatus.SubmittedByAdmin || x.DocumentStatus == DocumentStatus.SubmittedByClient);
}
//ToDo آپلود مدارک و افزدن پرسنل
//public int GetAdminWorkFlowCountForNewEmployees(List<long> workshopIds)
//{
// //New employees created by client should have their documents uploaded or confirmed
// var newEmployeesInWorkshop = _companyContext.LeftWorkTemps.Where(x => workshopIds.Contains(x.WorkshopId));
// var duty = _companyContext.EmployeeDocuments
// .Count(x => workshopIds.Contains(x.WorkshopId) &&
// newEmployeesInWorkshop.Any(y =>
// y.EmployeeId == x.EmployeeId)
// && x.IsSentToChecker == false && x.IsConfirmed == false);
public async Task<int> GetAdminWorkFlowCountForNewEmployees(List<long> workshopIds)
{
//New employees created by client should have their documents uploaded or confirmed
var newEmployeesInWorkshop = _companyContext.EmployeeClientTemps.Where(x => workshopIds.Contains(x.WorkshopId));
var duty = _companyContext.EmployeeDocuments
.CountAsync(x => workshopIds.Contains(x.WorkshopId) &&
newEmployeesInWorkshop.Any(y =>
y.EmployeeId == x.EmployeeId)
&& x.IsSentToChecker == false && x.IsConfirmed == false);
// return duty;
//}
return await duty;
}
public int GetAdminWorkFlowCountForSubmittedAndRejectedDocuments(List<long> workshopIds)
public async Task<int> GetAdminWorkFlowCountForSubmittedAndRejectedDocuments(List<long> workshopIds)
{
@@ -748,12 +780,12 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
var activeEmployeesInWorkshop = _companyContext.LeftWorkList
.Where(x => workshopIds.Contains(x.WorkshopId) && x.LeftWorkDate.AddDays(-1) >= DateTime.Today);
var dutyCount = _companyContext.EmployeeDocuments
.Count(x => workshopIds.Contains(x.WorkshopId) &&
activeEmployeesInWorkshop.Any(y => y.EmployeeId == x.EmployeeId) &&
x.IsSentToChecker == false &&
(x.EmployeeDocumentItemCollection.Any(y => y.DocumentStatus == DocumentStatus.SubmittedByClient) || x.HasRejectedItems));
.CountAsync(x => workshopIds.Contains(x.WorkshopId) &&
activeEmployeesInWorkshop.Any(y => y.EmployeeId == x.EmployeeId) &&
x.IsSentToChecker == false &&
(x.EmployeeDocumentItemCollection.Any(y => y.DocumentStatus == DocumentStatus.SubmittedByClient) || x.HasRejectedItems));
return dutyCount;
return await dutyCount;
}
public List<EmployeeDocumentsViewModel> GetDocumentsAwaitingReviewByWorkshopIdForCheckerWorkFlow(long workshopId)
@@ -800,7 +832,7 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
.Select(x => new MediaViewModel() { Id = x.id, Path = x.Path }).ToList();
workshopDocumentsListWithConfirmed = workshopDocumentsListWithConfirmed.Where(x =>
x.EmployeeDocumentItemCollection.Any(y => y.DocumentStatus == DocumentStatus.SubmittedByAdmin)).ToList();
x.EmployeeDocumentItemCollection.Any(y => y.DocumentStatus is DocumentStatus.SubmittedByAdmin or DocumentStatus.SubmittedByClient)).ToList();
return workshopDocumentsListWithConfirmed.Select(x => new EmployeeDocumentsViewModel()
{

View File

@@ -14,6 +14,8 @@ using CompanyManagment.App.Contracts.EmployeeInsuranceRecord;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using CompanyManagment.App.Contracts.Employee.DTO;
using CompanyManagment.App.Contracts.LeftWorkTemp;
namespace CompanyManagment.EFCore.Repository;
@@ -742,6 +744,64 @@ public class EmployeeRepository : RepositoryBase<long, Employee>, IEmployeeRepos
EmployeeFullName = x.FullName
}).ToList();
}
public Employee GetByNationalCodeIgnoreQueryFilter(string nationalCode)
{
return _context.Employees.IgnoreQueryFilters().FirstOrDefault(x => x.NationalCode == nationalCode);
}
public async Task<ICollection<ClientStartedWorkEmployeesDto>> GetClientEmployeesStartWork(long workshopId)
{
var res = await _context.Employees
.GroupJoin(_context.LeftWorkTemps.Where(x => x.WorkshopId == workshopId && x.LeftWorkType == LeftWorkTempType.StartWork),
employees => employees.id,
leftWorkTemp => leftWorkTemp.EmployeeId,
(employee, leftWorkTemps) => new { employee, leftWorkTemps })
.GroupJoin(_context.EmployeeDocuments.Where(x => x.WorkshopId == workshopId),
(query) => query.employee.id,
(employeeDoc) => employeeDoc.EmployeeId,
(query, employeeDoc) => new
{ query, employeeDoc }).SelectMany(x => x.employeeDoc.DefaultIfEmpty(),
(q, doc) => new
{
q.query,
EmployeeDoc = doc
}).Where(x => x.query.leftWorkTemps.Any(l => l.WorkshopId == workshopId && l.LeftWorkType == LeftWorkTempType.StartWork)).Select(
x => new ClientStartedWorkEmployeesDto()
{
WorkshopId = workshopId,
EmployeeId = x.query.employee.id,
EmployeeName = x.query.employee.FName + " " + x.query.employee.LName,
// ReSharper disable once SimplifyConditionalTernaryExpression
HasCompleteEmployeeDocument = x.EmployeeDoc == null ? false : x.EmployeeDoc.IsConfirmed
}).ToListAsync();
return res;
}
public async Task<ICollection<ClientLeftWorkWorkEmployeesDto>> GetEmployeesForLeftWorkTemp(long workshopId)
{
var res = await _context.Employees
.Join(_context.LeftWorkTemps.Where(x => x.WorkshopId == workshopId && x.LeftWorkType == LeftWorkTempType.LeftWork),
employees => employees.id,
leftWorkTemp => leftWorkTemp.EmployeeId,
(employee, leftWorkTemps) => new { employee, leftWorkTemps })
.Select(
x => new ClientLeftWorkWorkEmployeesDto()
{
WorkshopId = workshopId,
EmployeeId = x.employee.id,
EmployeeName = x.employee.FName + " " + x.employee.LName,
LeftWorkDateTime = x.leftWorkTemps.LeftWork.ToFarsi()
}).ToListAsync();
return res;
}
public Employee GetIgnoreQueryFilter(long id)
{
return _context.Employees.IgnoreQueryFilters().FirstOrDefault(x => x.id == id);
}
#endregion
#region Pooya
@@ -776,6 +836,38 @@ 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()
{
EmployeeId = x.id,
LName = x.LName,
BirthDate = x.DateOfBirth.ToFarsi(),
FName = x.FName,
FatherName = x.FatherName,
MaritalStatus = x.MaritalStatus,
MilitaryService = x.MilitaryService,
NationalCode = x.NationalCode,
IdNumber = x.IdNumber,
Nationality = x.Nationality,
Gender = x.Gender,
IsAuthorized = x.IsAuthorized
}).FirstOrDefaultAsync();
var employeeClientTemp =
await _context.EmployeeClientTemps.FirstOrDefaultAsync(x =>
x.EmployeeId == employeeId && x.WorkshopId == workshopId);
if (employeeClientTemp != null)
{
employee.MaritalStatus = employeeClientTemp.MaritalStatus;
}
return employee;
}
public List<(long Id, string Name)> SimpleGetRangeByIds(IEnumerable<long> newEmployeeIds)
{
return _context.Employees.Where(x => newEmployeeIds.Contains(x.id)).Select(x => new
@@ -799,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

@@ -210,6 +210,8 @@ public class LeftWorkRepository : RepositoryBase<long, LeftWork>, ILeftWorkRepos
return leftWorks.Concat(insuranceLeftWork).Distinct().ToList();
}
public List<LeftWorkViewModel> GetLeftPersonelByWorkshopId(List<long> workshopIds)
{
return _context.LeftWorkList.Select(x => new LeftWorkViewModel()
@@ -633,6 +635,12 @@ public class LeftWorkRepository : RepositoryBase<long, LeftWork>, ILeftWorkRepos
HasLeft = entity.HasLeft
};
}
public LeftWork GetLastLeftWorkByEmployeeIdAndWorkshopId(long workshopId, long employeeId)
{
return _context.LeftWorkList.Where(x => x.WorkshopId == workshopId && x.EmployeeId == employeeId)
.OrderByDescending(x => x.StartWorkDate).FirstOrDefault();
}
private bool HasActiveRollCallStatus(long workshopId, long employeeId)
{

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

@@ -90,4 +90,12 @@ public class PersonnelCodeRepository : RepositoryBase<long, PersonnelCodeDomain>
return res.EmployeeId;
return 0;
}
#region Mahan
public long GetLastPersonnelCodeByWorkshop(long workshopId)
{
return _context.PersonnelCodeSet.Where(x => x.WorkshopId == workshopId).Max(x => x.PersonnelCode);
}
#endregion
}

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;
@@ -78,7 +79,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))
//{
@@ -94,39 +95,59 @@ public class RollCallEmployeeRepository : RepositoryBase<long, RollCallEmployee>
//}
var rawQuery = employeeQuery.Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
.Where(x => x.LeftWorks.Any(y =>
(y.WorkshopId == command.WorkshopId && y.StartWorkDate <= dateNow &&
y.LeftWorkDate > dateNow) || (y.WorkshopId == command.WorkshopId && y.StartWorkDate > dateNow)) ||
x.LeftWorkInsurances.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 || y.LeftWorkDate == null))).OrderByDescending(x => x.id)
y.LeftWorkDate > dateNow || (y.WorkshopId == command.WorkshopId && y.StartWorkDate > dateNow)) ||
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))
@@ -135,9 +156,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();
@@ -243,19 +264,6 @@ public class RollCallEmployeeRepository : RepositoryBase<long, RollCallEmployee>
;
}
public bool HasEmployees(long workshopId)
{
var dateNow = DateTime.Now;
return _context.Employees.Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
.Any(x => x.LeftWorks.Any(y =>
y.WorkshopId == workshopId && y.StartWorkDate <= dateNow &&
y.LeftWorkDate > dateNow) ||
x.LeftWorkInsurances.Any(y =>
y.WorkshopId == workshopId && y.StartWorkDate <= dateNow &&
(y.LeftWorkDate > dateNow || y.LeftWorkDate == null)));
}
public List<RollCallEmployeeViewModel> GetActivePersonnelByWorkshopId(long workshopId)
{
var dateNow = DateTime.Now.Date;
@@ -332,46 +340,14 @@ public class RollCallEmployeeRepository : RepositoryBase<long, RollCallEmployee>
return new();
}
#endregion
#region Farokhi&Mahan
public (int activeEmployees, int deActiveEmployees) GetActiveAndDeActiveRollCallEmployees(long workshopId)
{
var dateNow = DateTime.Now;
//var employeeQuery = _context.Employees.AsQueryable();
//var rawQuery = employeeQuery.Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
// .Where(x => x.LeftWorks.Any(y =>
// y.WorkshopId == command.WorkshopId && y.StartWorkDate <= dateNow &&
// y.LeftWorkDate > dateNow) ||
// x.LeftWorkInsurances.Any(y =>
// y.WorkshopId == command.WorkshopId && y.StartWorkDate <= dateNow &&
// (y.LeftWorkDate > dateNow || y.LeftWorkDate == null))).OrderByDescending(x => x.id)
// .Select(x => new
// {
// Id = x.id,
// x.FullName,
// x.NationalCode,
// }).AsSplitQuery();
//var rollCallEmployees = _context.RollCallEmployees.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 == null ? "false" : joinedRollCall.IsActiveString,
// HasUploadedImage = joinedRollCall == null ? "false" : joinedRollCall.HasUploadedImage
// };
var rawQuery = _context.Employees.Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
.Where(x => x.LeftWorks.Any(y =>
y.WorkshopId == workshopId && y.StartWorkDate <= dateNow &&
@@ -384,20 +360,41 @@ public class RollCallEmployeeRepository : RepositoryBase<long, RollCallEmployee>
Id = x.id,
}).Distinct();
var rollCallEmployees = _context.RollCallEmployees.Where(x => x.WorkshopId == workshopId);
var rollCallEmployees = _context.RollCallEmployees.Include(x => x.EmployeesStatus).Where(x => x.WorkshopId == 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()
{
IsActiveString = joinedRollCall == null ? "false" : joinedRollCall.IsActiveString,
};
join rollCallEmployee in rollCallEmployees
on employee.Id equals rollCallEmployee.EmployeeId into grp
from joinedRollCall in grp.DefaultIfEmpty()
select new RollCallEmployeeViewModel()
{
IsActiveString = joinedRollCall.EmployeesStatus.Any(y => y.StartDate.Date <= dateNow.Date && y.EndDate.Date > dateNow.Date) ? "true" : "false",
};
var deActiveCount = joinedQuery.Count(x => x.IsActiveString == "false");
var ActiveCount = joinedQuery.Count(x => x.IsActiveString == "true");
return (ActiveCount, deActiveCount);
#endregion
}
public bool HasEmployees(long workshopId)
{
var dateNow = DateTime.Now;
return _context.Employees.Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
.Any(x => x.LeftWorks.Any(y =>
y.WorkshopId == workshopId && y.StartWorkDate <= dateNow &&
y.LeftWorkDate > dateNow) ||
x.LeftWorkInsurances.Any(y =>
y.WorkshopId == workshopId && y.StartWorkDate <= dateNow &&
(y.LeftWorkDate > dateNow || y.LeftWorkDate == null)));
}
public RollCallEmployee GetBy(long employeeId, long workshopId)
{
return _context.RollCallEmployees.FirstOrDefault(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId);
}
#endregion
}

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;
@@ -20,7 +21,7 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.WorkFlow
private readonly IAuthHelper _authHelper;
public int EmployeeDocumentsAwaitingSubmitCount;
public EmployeesDocumentsModel(IAdminWorkFlowApplication adminWorkFlowApplication, IWorkshopApplication workshopApplication, IEmployeeDocumentsApplication employeeDocumentsApplication, IWorkshopAccountRepository workshopAccountRepository, IAuthHelper authHelper)
public EmployeesDocumentsModel(IAdminWorkFlowApplication adminWorkFlowApplication, IWorkshopApplication workshopApplication, IEmployeeDocumentsApplication employeeDocumentsApplication, IWorkshopAccountRepository workshopAccountRepository, IAuthHelper authHelper)
{
_adminWorkFlowApplication = adminWorkFlowApplication;
_workshopApplication = workshopApplication;
@@ -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,31 @@ 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
});
}
public IActionResult OnPostGroupSave(long workshopId, long employeeId, List<AddEmployeeDocumentItem> command)
{
var result = _employeeDocumentsApplication.AddRangeEmployeeDocumentItemsByAdmin(workshopId, employeeId, 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,188 @@
@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 @(Model.IsAuthorized ? "disable" : "")">
<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 @(Model.IsAuthorized ? "disable" : "")">
<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 @(Model.IsAuthorized ? "disable" : "")">
<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 @(Model.IsAuthorized ? "disable" : "")">
<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 @(Model.IsAuthorized ? "disable" : "")">
<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 @(Model.IsAuthorized ? "disable" : "")">
<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 @(Model.IsAuthorized ? "disable" : "")">
<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 @(Model.IsAuthorized ? "disable" : "")">
<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>
<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,439 +22,483 @@
<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">
@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.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 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>
<input type="hidden" id="label_1" value="NationalCardFront" />
@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>
<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>
}
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.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>
<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" 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.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>
}
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>
}
else if (Model.IdCardPage1.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</div>
}
</div>
</div>
<input type="hidden" id="label_1" value="NationalCardFront" />
<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>
<div>
<button type="button" class="btnUploadingPD d-block mb-1" data-index="1">آپلود عکس</button>
}
else if (Model.IdCardPage2.UploaderType == UserType.Client)
{
<div class="uploaderSign client">
<span>مشتری</span>
</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" data-index="1">ارسال به ناظر</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 @(!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.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.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", "EditEmployeeModal", new { employeeId = Model.EmployeeId, workshopId = Model.WorkshopId})')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable" data-index="2">ارسال به ناظر</button>
}
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>
<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 militaryService @(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 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>
}
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", "EditEmployeeModal", new { employeeId = Model.EmployeeId, workshopId = Model.WorkshopId})')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable" data-index="3">ارسال به ناظر</button>
</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.IdCardPage1.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.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", "EditEmployeeModal", new { employeeId = Model.EmployeeId, workshopId = Model.WorkshopId})')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable" 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>
}
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", "EditEmployeeModal", new { employeeId = Model.EmployeeId, workshopId = Model.WorkshopId})')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable" data-index="5">ارسال به ناظر</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", "EditEmployeeModal", new { employeeId = Model.EmployeeId, workshopId = Model.WorkshopId})')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable" data-index="6">ارسال به ناظر</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", "EditEmployeeModal", new { employeeId = Model.EmployeeId, workshopId = Model.WorkshopId})')">ویرایش پرسنل</button>
<button type="button" class="btnSendToChecker d-block mb-1 disable" 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="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>
pdfjsLib.GlobalWorkerOptions.workerSrc = '/assetsclient/libs/pdf/pdf.worker.js';
var antiForgeryToken = $(`@Html.AntiForgeryToken()`).val();
var saveGroupSubmitAjax = `@Url.Page("./EmployeesDocuments", "GroupSave")`;
var saveUploadFileModalAjax = `@Url.Page("./EmployeesDocuments", "CreateUploadDocument")`;
var saveSubmitAjax = `@Url.Page("./EmployeesDocuments", "SaveSubmit")`;
var deleteFileAjaxUrl = `@Url.Page("./EmployeesDocuments", "RemoveEmployeeDocumentByLabel")`;
@@ -460,5 +506,7 @@
var employeeId = Number(@Model.EmployeeId);
var workshopId = Number(@Model.WorkshopId);
var UploadedCount = Number(@Model.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(y => y.PropertyType == typeof(EmployeeDocumentItemViewModel)).Select(y => y.GetValue(@Model) as EmployeeDocumentItemViewModel).Count(x=>x.Status == DocumentStatus.Unsubmitted && !string.IsNullOrWhiteSpace(x.PicturePath)));
var hasGenderFemale = @(Model.Gender == "زن" ? "true" : "false");
</script>
<script src="~/assetsadminnew/workflow/js/modaluploaddocument.js?ver=@adminVersion"></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,289 @@
@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/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>
@if (rollCallPath == "/Client/Company/RollCall/EmployeeUploadPicture")
{
<button type="button" class="stepBtn disable">مرحله بعد</button>
}
else
{
<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="~/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,390 @@
@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>
@section Script {
<script src="~/assetsclient/js/site.js?ver=@clintVersion"></script>
<script src="~/AdminTheme/assets/sweet-alert/sweet-alert.min.js"></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 select2EmployeeOption" aria-label="انتخاب پرسنل ..." name="Command.EmployeeIds[]" id="employeeSelect">
</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" 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,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,90 @@
@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">
<input type="hidden" name="Command.HasBankInformation" id="HasBankInformation" asp-for="@Model.HasBankInformation" />
<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,250 @@
@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/libs/pdf/pdf.js"></script>
<script>
pdfjsLib.GlobalWorkerOptions.workerSrc = '/assetsclient/libs/pdf/pdf.worker.js';
</script>
<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,46 +130,56 @@
</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>
<div id="MainModal" class="modal fade personalListModal" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
<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-md modal-dialog-centered">
<div class="modal-content" id="ModalContent">
</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;
@@ -112,6 +115,47 @@
</div>
}
<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 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="AjaxUrlContentModal('/Client/Company/Employees/EmployeeList?handler=CreateLeftWorkEmployee')">
<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 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 22ZM15.3569 16.532C15.1291 16.3042 14.7598 16.3042 14.532 16.532C14.3042 16.7598 14.3042 17.1291 14.532 17.3569L15.675 18.5L14.532 19.6431C14.3042 19.8709 14.3042 20.2402 14.532 20.468C14.7598 20.6958 15.1291 20.6958 15.3569 20.468L16.5 19.325L17.6431 20.468C17.8709 20.6958 18.2402 20.6958 18.468 20.468C18.6958 20.2402 18.6958 19.8709 18.468 19.6431L17.325 18.5L18.468 17.3569C18.6958 17.1291 18.6958 16.7598 18.468 16.532C18.2402 16.3042 17.8709 16.3042 17.6431 16.532L16.5 17.675L15.3569 16.532Z" fill="#23A8A8" />
<path 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" />
</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.LeaveCreatePermissionCode" 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" id="btnCardLeaveIntro">
@@ -132,7 +176,7 @@
</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 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 +289,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

@@ -306,7 +306,7 @@
if (response.countWorkFlow === 0) {
$('#_countWorkFlowMenu').hide();
$('#spinnerWorkFlow').hide();
// $('#_countWorkFlowMenuMobile').hide();
$('#_countWorkFlowMenuMobile').hide();
$('#spinnerWorkFlowMobile').hide();
} else {
$('#_countWorkFlowMenu').show();

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

@@ -16,6 +16,10 @@
//local
"MesbahDb": "Data Source=.;Initial Catalog=mesbah_db;Integrated Security=True;TrustServerCertificate=true;"
//dad-mehr
// "MesbahDb": "Data Source=.;Initial Catalog=teamWork;Integrated Security=True;TrustServerCertificate=true;"
},
"GoogleRecaptchaV3": {
"SiteKey": "6Lfhp_AnAAAAAB79WkrMoHd1k8ir4m8VvfjE7FTH",

View File

@@ -8,7 +8,12 @@
},
"ConnectionStrings": {
//"MesbahDb": "Data Source=.\\MSSQLSERVER2019;Initial Catalog=mesbah_db;Persist Security Info=False;User ID=mesbah_db;Password=sa142857$@;"
"MesbahDb": "Data Source=.;Initial Catalog=mesbah_db;Integrated Security=True;TrustServerCertificate=true;"
//gozareshgir
//"MesbahDb": "Data Source=.;Initial Catalog=mesbah_db;Integrated Security=True;TrustServerCertificate=true;",
//dad-mehr
"MesbahDb": "Data Source=.;Initial Catalog=teamWork;Integrated Security=True;TrustServerCertificate=true;"
},
"BackupOptions": {
"DbName": "mesbah_db",

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

@@ -71,7 +71,7 @@ $(document).ready(function () {
$('.signHolder').each(function() {
const buttonClass = $(this).find('button').attr('class');
const spanElement = $(this).find('span.sign');
if (buttonClass.includes('submittedbyadmin')) {
if (buttonClass.includes('submittedbyadmin') || buttonClass.includes('submittedbyclient')) {
$(this).addClass('pending');
spanElement.html(svgPending);
} else if (buttonClass.includes('rejected')) {
@@ -163,7 +163,7 @@ $(document).ready(function () {
//debugger;
let enable = false;
$(".mg-btn.active").each(function () {
if ($(this).hasClass("submittedbyadmin")) {
if ($(this).hasClass("submittedbyadmin") || $(this).hasClass("submittedbyclient")) {
enable = true;
}
});
@@ -301,7 +301,7 @@ function checkFields() {
var inputValue = $("#label_" + index).val();
$("#confirm").click(function () {
$(this).removeClass('submittedbyadmin').addClass("confirmed");
$(this).removeClass('submittedbyadmin submittedbyclient').addClass('confirmed');
$(this).closest('.signHolder').removeClass("pending").addClass("confirmed");
$(this).siblings("span.sign").html(svgConfirmed);
//تایید توضیحات نمیخواد
@@ -310,7 +310,7 @@ function checkFields() {
});
$("#reject").click(function () {
$(this).removeClass('submittedbyadmin').addClass("reject");
$(this).removeClass('submittedbyadmin submittedbyclient').addClass('reject');
$(this).closest('.signHolder').removeClass("pending").addClass("rejected");
$(this).siblings("span.sign").html(svgReject);
inputValue = $("#message").val();
@@ -347,7 +347,7 @@ function rejectAjax() {
showAlertMessage('.alert-success-msg', 'تصویر موجود رد شد.', 3500);
$(".mg-btn.active").removeClass('submittedbyadmin').addClass("reject");
$(".mg-btn.active").removeClass('submittedbyadmin submittedbyclient').addClass('reject');
$(".mg-btn.active").closest('.signHolder').removeClass("pending").addClass("rejected");
$(".mg-btn.active").siblings("span.sign").html(svgReject);
@@ -376,7 +376,7 @@ function confirmAjax() {
showAlertMessage('.alert-success-msg', 'تصویر موجود تایید شد.', 3500);
$(".mg-btn.active").removeClass('submittedbyadmin').addClass("confirmed");
$(".mg-btn.active").removeClass('submittedbyadmin submittedbyclient').addClass('confirmed');
$(".mg-btn.active").closest('.signHolder').removeClass("pending").addClass("confirmed");
$(".mg-btn.active").siblings("span.sign").html(svgConfirmed);

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
}

Some files were not shown because too many files have changed in this diff Show More