uid autorize for create employee in admin side

This commit is contained in:
SamSys
2025-05-03 15:42:46 +03:30
32 changed files with 12282 additions and 1052 deletions

View File

@@ -32,20 +32,22 @@ public class UidService : IUidService
var json = JsonConvert.SerializeObject(request);
var contentType = new StringContent(json, Encoding.UTF8, "application/json");
var requestResult = await _httpClient.PostAsync("person/v2", contentType);
try
{
var requestResult = await _httpClient.PostAsync("person/v2", contentType);
if (!requestResult.IsSuccessStatusCode)
return null;
var responseResult = await requestResult.Content.ReadFromJsonAsync<PersonalInfoResponse>();
responseResult.BasicInformation.FirstName = responseResult.BasicInformation.FirstName.ToPersian();
responseResult.BasicInformation.LastName = responseResult.BasicInformation.LastName.ToPersian();
responseResult.BasicInformation.FatherName = responseResult.BasicInformation.FatherName.ToPersian();
if (responseResult.BasicInformation != null)
{
responseResult.BasicInformation.FirstName = responseResult.BasicInformation.FirstName?.ToPersian();
responseResult.BasicInformation.LastName = responseResult.BasicInformation.LastName?.ToPersian();
responseResult.BasicInformation.FatherName = responseResult.BasicInformation.FatherName?.ToPersian();
}
return responseResult;
}
catch (Exception)
catch
{
return null;
@@ -63,19 +65,12 @@ public class UidService : IUidService
};
var json = JsonConvert.SerializeObject(request);
var contentType = new StringContent(json, Encoding.UTF8, "application/json");
try
{
var requestResult = await _httpClient.PostAsync("mobile/owner/v2", contentType);
if (!requestResult.IsSuccessStatusCode)
return null;
var responseResult = await requestResult.Content.ReadFromJsonAsync<MatchMobileWithNationalCodeResponse>();
return responseResult;
}
catch (Exception e)
{
var requestResult = await _httpClient.PostAsync("mobile/owner/v2", contentType);
if (!requestResult.IsSuccessStatusCode)
return null;
}
var responseResult = await requestResult.Content.ReadFromJsonAsync<MatchMobileWithNationalCodeResponse>();
return responseResult;
}
}

View File

@@ -20,14 +20,14 @@ 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 nationalCode, string idNumber, string gender, string nationality, string idNumberSerial , string idNumberSeri ,
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)
string taxOfficeUserName = null, string taxOfficepassword = null, string sanaUserName = null, string sanaPassword = null )
{
FName = fName;
LName = lName;
@@ -146,6 +146,15 @@ public class Employee : EntityBase
/// آیا پرسنل احراز هویت شده است
/// </summary>
public bool IsAuthorized { get; set; }
/// <summary>
/// سریال شناسنامه
/// </summary>
public string IdNumberSerial { get; set; }
/// <summary>
/// سری شناسنامه
/// </summary>
public string IdNumberSeri { get; set; }
#endregion
@@ -234,5 +243,39 @@ public class Employee : EntityBase
IsAuthorized = true;
}
public void EditAuthorizeEmployee(DateTime dateOfIssue, string placeOfIssue,
string phone, string address, string state, string citi,
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)
{
DateOfIssue = dateOfIssue;
PlaceOfIssue = placeOfIssue;
Phone = phone;
Address = address;
State = state;
City = citi;
MaritalStatus = maritalStatus;
MilitaryService = militaryService;
LevelOfEducation = levelOfEducation;
FieldOfStudy = fieldOfStudy;
BankCardNumber = bankCardNumber;
BankBranch = bankBranch;
InsuranceCode = insuranceCode;
InsuranceHistoryByYear = insuranceHistoryByYear;
InsuranceHistoryByMonth = insuranceHistoryByMonth;
NumberOfChildren = numberOfChildren;
OfficePhone = OfficePhone;
MclsUserName = mclsUserName;
MclsPassword = mclsPassword;
EserviceUserName = eserviceUserName;
EservicePassword = eservicePassword;
TaxOfficeUserName = taxOfficeUserName;
TaxOfficepassword = taxOfficepassword;
SanaUserName = sanaUserName;
SanaPassword = sanaPassword;
}
#endregion
}

View File

@@ -0,0 +1,44 @@
using System;
using _0_Framework.Application;
using _0_Framework.Domain;
namespace Company.Domain.EmployeeAuthorizeTempAgg;
public class EmployeeAuthorizeTemp:EntityBase
{
public EmployeeAuthorizeTemp(Gender gender, string fName, string lName, string fatherName, DateTime birthDate, string nationalCode, string idNumber, string idNumberSerial, string idNumberSeri)
{
Gender = gender;
FName = fName;
LName = lName;
FatherName = fatherName;
BirthDate = birthDate;
NationalCode = nationalCode;
IdNumber = idNumber;
IdNumberSerial = idNumberSerial;
IdNumberSeri = idNumberSeri;
}
public Gender Gender { get; private set; }
public string FName { get; private set; }
public string LName { get; private set; }
public string FatherName { get; private set; }
public DateTime BirthDate { get; private set; }
/// <summary>
/// کدملی
/// </summary>
public string NationalCode { get; set; }
/// <summary>
/// شماره شناسنامه
/// </summary>
public string IdNumber { get; set; }
/// <summary>
/// سریال شناسنامه
/// </summary>
public string IdNumberSerial { get; set; }
/// <summary>
/// سری شناسنامه
/// </summary>
public string IdNumberSeri { get; set; }
}

View File

@@ -0,0 +1,10 @@
using System;
using System.Threading.Tasks;
using _0_Framework.Domain;
namespace Company.Domain.EmployeeAuthorizeTempAgg;
public interface IEmployeeAuthorizeTempRepository:IRepository<long,EmployeeAuthorizeTemp>
{
Task<EmployeeAuthorizeTemp> GetByNationalCode(string nationalCode);
}

View File

@@ -41,6 +41,7 @@ public class ComputingViewModel
public string EmployeeFullName { get; set; }
public string YearAndMonth { get; set; }
public bool HasRotatingShift { get; set; }
//public List<string> holidays;
}

View File

@@ -94,4 +94,14 @@ public class CreateEmployee
public long WorkshopId { get; set; }
public long? PersonelCode { get; set; }
public bool IsAuthorized { get; set; }
/// <summary>
/// سریال شناسنامه
/// </summary>
public string IdNumberSerial { get; set; }
/// <summary>
/// سری شناسنامه
/// </summary>
public string IdNumberSeri { get; set; }
}

View File

@@ -0,0 +1,29 @@
using _0_Framework.Application;
namespace CompanyManagment.App.Contracts.Employee;
public class EmployeeDataFromApiViewModel
{
public Gender Gender { get; set; }
public string FName { get; set; }
public string LName { get; set; }
public string FatherName { get; set; }
public string BirthDate { get; set; }
/// <summary>
/// کدملی
/// </summary>
public string NationalCode { get; set; }
/// <summary>
/// شماره شناسنامه
/// </summary>
public string IdNumber { get; set; }
/// <summary>
/// سریال شناسنامه
/// </summary>
public string IdNumberSerial { get; set; }
/// <summary>
/// سری شناسنامه
/// </summary>
public string IdNumberSeri { get; set; }
}

View File

@@ -75,6 +75,8 @@ public interface IEmployeeApplication
Task<List<EmployeeSelectListViewModel>> WorkedEmployeesInWorkshopSelectList(long workshopId);
Task<OperationResult<EmployeeDataFromApiViewModel>> GetEmployeeDataFromApi(string nationalCode, string birthDate);
#endregion
}

View File

@@ -12,6 +12,7 @@ namespace CompanyManagment.App.Contracts.EmployeeDocuments
public long WorkshopId { get; set; }
public IFormFile PictureFile { get; set; }
public DocumentItemLabel Label { get; set; }
}
public bool WithoutPicture { get; set; }
}
}

View File

@@ -16,5 +16,6 @@ public class RotatingShiftViewModel
public bool IsEveningShift { get; set; }
public bool IsNightShift { get; set; }
public string RotatingDate { get; set; }
public int WinRate { get; set; }
}

View File

@@ -29,6 +29,7 @@ using Company.Domain.RollCallEmployeeAgg;
using Company.Domain.CustomizeWorkshopGroupSettingsAgg;
using Company.Domain.LeftWorkAgg;
using CompanyManagment.App.Contracts.Employee.DTO;
using Company.Domain.EmployeeAuthorizeTempAgg;
namespace CompanyManagment.Application;
@@ -56,14 +57,10 @@ public class EmployeeAplication : RepositoryBase<long, Employee>, IEmployeeAppli
private readonly ILeftWorkRepository _leftWorkRepository;
private readonly IPersonnelCodeRepository _personnelCodeRepository;
private readonly IEmployeeClientTempRepository _employeeClientTempRepository;
private readonly ICustomizeWorkshopGroupSettingsRepository _customizeWorkshopGroupSettingsRepository;
private readonly IEmployeeAuthorizeTempRepository _employeeAuthorizeTempRepository;
public EmployeeAplication(IEmployeeRepository employeeRepository, CompanyContext context,
IWorkshopRepository workShopRepository, IWebHostEnvironment webHostEnvironment,
IRollCallEmployeeStatusApplication rollCallEmployeeStatusApplication, IRollCallEmployeeRepository rollCallEmployeeRepository,
ICustomizeWorkshopSettingsApplication customizeWorkshopSettingsApplication, IEmployeeDocumentsApplication employeeDocumentsApplication,
IEmployeeBankInformationApplication employeeBankInformationApplication, ILeftWorkTempRepository leftWorkTempRepository,
IUidService uidService, ICustomizeWorkshopEmployeeSettingsRepository customizeWorkshopEmployeeSettingsRepository, IPersonnelCodeRepository personnelCodeRepository,
IEmployeeClientTempRepository employeeClientTempRepository, ILeftWorkRepository leftWorkRepository) : 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, IEmployeeAuthorizeTempRepository employeeAuthorizeTempRepository) : base(context)
{
_context = context;
_WorkShopRepository = workShopRepository;
@@ -79,6 +76,7 @@ public class EmployeeAplication : RepositoryBase<long, Employee>, IEmployeeAppli
_personnelCodeRepository = personnelCodeRepository;
_employeeClientTempRepository = employeeClientTempRepository;
_leftWorkRepository = leftWorkRepository;
_employeeAuthorizeTempRepository = employeeAuthorizeTempRepository;
_EmployeeRepository = employeeRepository;
}
@@ -203,10 +201,10 @@ public class EmployeeAplication : RepositoryBase<long, Employee>, IEmployeeAppli
var dateOfBirth = command.DateOfBirth != null ? command.DateOfBirth.ToGeorgianDateTime() : initial.ToGeorgianDateTime();
var dateOfIssue = command.DateOfIssue != null ? command.DateOfIssue.ToGeorgianDateTime() : initial.ToGeorgianDateTime();
var employeeData = new Employee(command.FName, command.LName, command.FatherName, dateOfBirth,
dateOfIssue,
command.PlaceOfIssue, command.NationalCode, command.IdNumber, command.Gender, command.Nationality,
command.PlaceOfIssue, command.NationalCode, command.IdNumber, command.Gender, command.Nationality, command.IdNumberSerial, command.IdNumberSeri,
command.Phone, command.Address,
command.State, command.City, command.MaritalStatus, command.MilitaryService, command.LevelOfEducation,
command.FieldOfStudy, command.BankCardNumber,
@@ -214,7 +212,10 @@ public class EmployeeAplication : RepositoryBase<long, Employee>, IEmployeeAppli
command.InsuranceHistoryByMonth, command.NumberOfChildren, command.OfficePhone, command.MclsUserName, command.MclsPassword, command.EserviceUserName, command.EservicePassword,
command.TaxOfficeUserName, command.TaxOfficepassword, command.SanaUserName, command.SanaPassword);
if (command.IsAuthorized)
{
employeeData.Authorized();
}
_EmployeeRepository.Create(employeeData);
_EmployeeRepository.SaveChanges();
@@ -1250,10 +1251,10 @@ public class EmployeeAplication : RepositoryBase<long, Employee>, IEmployeeAppli
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, "ایرانی");
dateOfIssue, null, identityInfo.NationalId, idNumber, gender, "ایرانی", identityInfo.ShenasnameSerial, identityInfo.ShenasnameSeri);
newEmployee.Authorized();
await _EmployeeRepository.CreateAsync(newEmployee);
await _context.SaveChangesAsync();
await _EmployeeRepository.SaveChangesAsync();
return op.Succcedded(new EmployeeByNationalCodeInWorkshopViewModel()
{
@@ -1486,15 +1487,25 @@ public class EmployeeAplication : RepositoryBase<long, Employee>, IEmployeeAppli
{
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,
command.Nationality, employee.Phone, employee.Address, employee.State, employee.City,
command.MaritalStatus, command.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);
}
else
{
employee.EditAuthorizeEmployee(employee.DateOfIssue, employee.PlaceOfIssue,
employee.Phone, employee.Address, employee.State, employee.City, command.MaritalStatus,
command.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();
@@ -1505,5 +1516,105 @@ public class EmployeeAplication : RepositoryBase<long, Employee>, IEmployeeAppli
return await _EmployeeRepository.WorkedEmployeesInWorkshopSelectList(workshopId);
}
public async Task<OperationResult<EmployeeDataFromApiViewModel>> GetEmployeeDataFromApi(string nationalCode, string birthDate)
{
var op = new OperationResult<EmployeeDataFromApiViewModel>();
var birthDateGr = birthDate.ToGeorgianDateTime();
if (_EmployeeRepository.Exists(x => x.NationalCode == nationalCode))
{
var employee = _EmployeeRepository.GetByNationalCode(nationalCode);
if (employee.IsAuthorized == false)
{
var apiResult = await _uidService.GetPersonalInfo(nationalCode, birthDate);
if (apiResult.ResponseContext.Status.Code != 0)
{
return op.Failed("کد ملی و تاریخ تولد با هم همخانی ندارند");
}
var basicInfo = apiResult.BasicInformation;
var identityInfo = apiResult.IdentificationInformation;
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, birthDateGr,
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();
}
return op.Failed("این پرسنل در بانک اطلاعات موجود میباشد");
}
else
{
EmployeeDataFromApiViewModel data;
if (_employeeAuthorizeTempRepository.Exists(x => x.NationalCode == nationalCode))
{
var employeeAuthorizeTemp = await _employeeAuthorizeTempRepository.GetByNationalCode(nationalCode);
if (employeeAuthorizeTemp.BirthDate.ToFarsi() != birthDate)
{
return op.Failed("کد ملی و تاریخ تولد با هم همخانی ندارند");
}
data = new EmployeeDataFromApiViewModel()
{
BirthDate = employeeAuthorizeTemp.BirthDate.ToFarsi(),
NationalCode = employeeAuthorizeTemp.NationalCode,
IdNumber = employeeAuthorizeTemp.IdNumber,
FName = employeeAuthorizeTemp.FName,
FatherName = employeeAuthorizeTemp.FatherName,
Gender = employeeAuthorizeTemp.Gender,
LName = employeeAuthorizeTemp.LName,
};
return op.Succcedded(data);
}
var apiResult = await _uidService.GetPersonalInfo(nationalCode, birthDate);
if (apiResult.ResponseContext.Status.Code != 0)
{
return op.Failed("کد ملی و تاریخ تولد با هم همخانی ندارند");
}
var basicInfo = apiResult.BasicInformation;
var identityInfo = apiResult.IdentificationInformation;
data = new EmployeeDataFromApiViewModel()
{
BirthDate = identityInfo.BirthDate,
NationalCode = identityInfo.NationalId,
IdNumber = identityInfo.ShenasnamehNumber == "0" ? identityInfo.NationalId : identityInfo.ShenasnamehNumber,
FatherName = basicInfo.FatherName,
FName = basicInfo.FirstName,
Gender = basicInfo.GenderEnum,
LName = basicInfo.LastName,
IdNumberSeri = identityInfo.ShenasnameSeri,
IdNumberSerial = identityInfo.ShenasnameSerial
};
var newAuthorizeTemp = new EmployeeAuthorizeTemp(data.Gender, data.FName, data.LName, data.FatherName, birthDateGr, data.NationalCode, data.IdNumber, data.IdNumberSerial, data.IdNumberSeri);
await _employeeAuthorizeTempRepository.CreateAsync(newAuthorizeTemp);
await _employeeAuthorizeTempRepository.SaveChangesAsync();
return op.Succcedded(data);
}
}
#endregion
}

View File

@@ -1414,27 +1414,42 @@ namespace CompanyManagment.Application
{
var opCreate = Create(new CreateEmployeeDocuments()
{ EmployeeId = employeeId, WorkshopId = workshopId });
if (opCreate.IsSuccedded == false) return opCreate;
entity = _employeeDocumentsRepository.GetByEmployeeIdWorkshopId(employeeId, workshopId);
if (opCreate.IsSuccedded == false)
return opCreate;
entity = _employeeDocumentsRepository.GetByEmployeeIdWorkshopIdWithItems(employeeId, workshopId);
}
List<EmployeeDocumentItem> newEntities = new();
foreach (var item in command)
{
DeleteMultipleUnsubmittedDocumentsByLabel(entity, item.Label, uploaderType);
long mediaId = 0;
if (item.WithoutPicture)
{
var employeeDocumentItem =
entity.EmployeeDocumentItemCollection.First(x => x.DocumentLabel == item.Label);
mediaId = employeeDocumentItem.MediaId;
}
else
{
DeleteMultipleUnsubmittedDocumentsByLabel(entity, item.Label, uploaderType);
var mediaOpResult = UploadDocumentItemFile(item.PictureFile, item.Label.ToString(),
$"temp/{workshopId}/{employeeId}");
var mediaOpResult = UploadDocumentItemFile(item.PictureFile, item.Label.ToString(),
$"temp/{workshopId}/{employeeId}");
if (mediaOpResult.IsSuccedded == false)
return mediaOpResult;
if (mediaOpResult.IsSuccedded == false)
return mediaOpResult;
//if the mediaId is already in use in our table return failed
if (_employeeDocumentItemRepository.Exists(x => x.MediaId == mediaOpResult.SendId))
return op.Failed("امکان ثبت رکورد تکراری وجود ندارد");
//if the mediaId is already in use in our table return failed
if (_employeeDocumentItemRepository.Exists(x => x.MediaId == mediaOpResult.SendId))
return op.Failed("امکان ثبت رکورد تکراری وجود ندارد");
var newEntity = new EmployeeDocumentItem(workshopId, employeeId, mediaOpResult.SendId, entity.id, item.Label, uploaderId, uploaderType, DocumentStatus.SubmittedByAdmin);
mediaId = mediaOpResult.SendId;
}
var newEntity = new EmployeeDocumentItem(workshopId, employeeId, mediaId, entity.id, item.Label, uploaderId, uploaderType, DocumentStatus.SubmittedByAdmin);
newEntities.Add(newEntity);
}

View File

@@ -24,6 +24,7 @@ using Company.Domain.DateSalaryAgg;
using Company.Domain.DateSalaryItemAgg;
using Company.Domain.EmployeeAccountAgg;
using Company.Domain.EmployeeAgg;
using Company.Domain.EmployeeAuthorizeTempAgg;
using Company.Domain.EmployeeBankInformationAgg;
using Company.Domain.EmployeeChildrenAgg;
using Company.Domain.EmployeeClientTempAgg;
@@ -177,6 +178,7 @@ public class CompanyContext : DbContext
public DbSet<ContactUs> ContactUs { get; set; }
public DbSet<EmployeeAuthorizeTemp> EmployeeAuthorizeTemps { get; set; }
#endregion
#region Pooya

View File

@@ -0,0 +1,27 @@
using Company.Domain.EmployeeAuthorizeTempAgg;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace CompanyManagment.EFCore.Mapping;
public class EmployeeAuthorizeTempMapping:IEntityTypeConfiguration<EmployeeAuthorizeTemp>
{
public void Configure(EntityTypeBuilder<EmployeeAuthorizeTemp> builder)
{
builder.ToTable("EmployeeAuthorizeTemps");
builder.HasKey(x => x.id);
builder.Property(x => x.NationalCode).HasMaxLength(15);
builder.Property(x => x.IdNumber).HasMaxLength(15);
builder.Property(x => x.FName).HasMaxLength(100);
builder.Property(x => x.LName).HasMaxLength(100);
builder.Property(x => x.FatherName).HasMaxLength(100);
builder.Property(x => x.Gender).HasConversion<string>().HasMaxLength(15);
builder.Property(x => x.IdNumberSerial).HasMaxLength(25);
builder.Property(x => x.IdNumberSeri).HasMaxLength(25);
builder.HasIndex(x => x.NationalCode).IsUnique();
}
}

View File

@@ -80,9 +80,17 @@ public class EmployeeMapping : IEntityTypeConfiguration<Employee>
.HasForeignKey(x => x.EmployeeId);
builder.HasMany(x => x.EmployeeBankInformationList).WithOne(x => x.Employee)
.HasForeignKey(x => x.EmployeeId);
.HasForeignKey(x => x.EmployeeId);
builder.Ignore(x => x.FullName);
#endregion
#region Mahan
builder.Property(x => x.IdNumberSerial).HasMaxLength(25);
builder.Property(x => x.IdNumberSeri).HasMaxLength(25);
builder.Ignore(x => x.FullName);
#endregion
}

View File

@@ -0,0 +1,73 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace CompanyManagment.EFCore.Migrations
{
/// <inheritdoc />
public partial class addemployeeAuthorizeTempandaddserialNumber : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "IdNumberSeri",
table: "Employees",
type: "nvarchar(25)",
maxLength: 25,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "IdNumberSerial",
table: "Employees",
type: "nvarchar(25)",
maxLength: 25,
nullable: true);
migrationBuilder.CreateTable(
name: "EmployeeAuthorizeTemps",
columns: table => new
{
id = table.Column<long>(type: "bigint", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Gender = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: false),
FName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
LName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
FatherName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
BirthDate = table.Column<DateTime>(type: "datetime2", nullable: false),
NationalCode = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: true),
IdNumber = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: true),
IdNumberSerial = table.Column<string>(type: "nvarchar(25)", maxLength: 25, nullable: true),
IdNumberSeri = table.Column<string>(type: "nvarchar(25)", maxLength: 25, nullable: true),
CreationDate = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_EmployeeAuthorizeTemps", x => x.id);
});
migrationBuilder.CreateIndex(
name: "IX_EmployeeAuthorizeTemps_NationalCode",
table: "EmployeeAuthorizeTemps",
column: "NationalCode",
unique: true,
filter: "[NationalCode] IS NOT NULL");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "EmployeeAuthorizeTemps");
migrationBuilder.DropColumn(
name: "IdNumberSeri",
table: "Employees");
migrationBuilder.DropColumn(
name: "IdNumberSerial",
table: "Employees");
}
}
}

View File

@@ -1539,6 +1539,14 @@ namespace CompanyManagment.EFCore.Migrations
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.Property<string>("IdNumberSeri")
.HasMaxLength(25)
.HasColumnType("nvarchar(25)");
b.Property<string>("IdNumberSerial")
.HasMaxLength(25)
.HasColumnType("nvarchar(25)");
b.Property<string>("InsuranceCode")
.HasMaxLength(10)
.HasColumnType("nvarchar(10)");
@@ -1635,6 +1643,62 @@ namespace CompanyManagment.EFCore.Migrations
b.ToTable("Employees", (string)null);
});
modelBuilder.Entity("Company.Domain.EmployeeAuthorizeTempAgg.EmployeeAuthorizeTemp", b =>
{
b.Property<long>("id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("id"));
b.Property<DateTime>("BirthDate")
.HasColumnType("datetime2");
b.Property<DateTime>("CreationDate")
.HasColumnType("datetime2");
b.Property<string>("FName")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<string>("FatherName")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<string>("Gender")
.IsRequired()
.HasMaxLength(15)
.HasColumnType("nvarchar(15)");
b.Property<string>("IdNumber")
.HasMaxLength(15)
.HasColumnType("nvarchar(15)");
b.Property<string>("IdNumberSeri")
.HasMaxLength(25)
.HasColumnType("nvarchar(25)");
b.Property<string>("IdNumberSerial")
.HasMaxLength(25)
.HasColumnType("nvarchar(25)");
b.Property<string>("LName")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<string>("NationalCode")
.HasMaxLength(15)
.HasColumnType("nvarchar(15)");
b.HasKey("id");
b.HasIndex("NationalCode")
.IsUnique()
.HasFilter("[NationalCode] IS NOT NULL");
b.ToTable("EmployeeAuthorizeTemps", (string)null);
});
modelBuilder.Entity("Company.Domain.EmployeeBankInformationAgg.EmployeeBankInformation", b =>
{
b.Property<long>("id")

View File

@@ -0,0 +1,22 @@
using System;
using System.Threading.Tasks;
using _0_Framework.InfraStructure;
using Company.Domain.EmployeeAuthorizeTempAgg;
using Microsoft.EntityFrameworkCore;
namespace CompanyManagment.EFCore.Repository;
public class EmployeeAuthorizeTempRepository:RepositoryBase<long,EmployeeAuthorizeTemp>, IEmployeeAuthorizeTempRepository
{
private readonly CompanyContext _context;
public EmployeeAuthorizeTempRepository(CompanyContext context) : base(context)
{
_context = context;
}
public async Task<EmployeeAuthorizeTemp> GetByNationalCode(string nationalCode)
{
return await _context.EmployeeAuthorizeTemps.FirstOrDefaultAsync(x =>
x.NationalCode == nationalCode);
}
}

View File

@@ -392,48 +392,122 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
public List<WorkshopWithEmployeeDocumentsViewModel> GetWorkshopsWithDocumentsAwaitingReviewForAdminWorkFlow(List<long> workshops)
{
var activeEmployees = _companyContext.LeftWorkList
//var activeEmployees = _companyContext.LeftWorkList
// .Where(x => workshops.Contains(x.WorkshopId) && x.LeftWorkDate.AddDays(-1) >= DateTime.Now)
// .Select(x => new { x.WorkshopId, x.EmployeeId });
//var employeeClientTemp = _companyContext.EmployeeClientTemps.Where(x => workshops.Contains(x.WorkshopId))
// .Select(x=> new { x.WorkshopId, x.EmployeeId });
//var query = _companyContext.EmployeeDocuments
// .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).AsSplitQuery().AsNoTracking()
// .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,
// EmployeesWithoutDocumentCount = x.Count()
// });
//var workshopEmployers = _companyContext.WorkshopEmployers.Include(x => x.Employer).AsSplitQuery()
// .Where(x => query.Any(y => y.WorkshopId == x.WorkshopId))
// .GroupBy(x => x.WorkshopId).Select(x => x.FirstOrDefault()).ToList();
//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();
// یک بار keyها رو آماده می‌کنیم
var activeEmployeeKeys = _companyContext.LeftWorkList
.Where(x => workshops.Contains(x.WorkshopId) && x.LeftWorkDate.AddDays(-1) >= DateTime.Now)
.Select(x => new { x.WorkshopId, x.EmployeeId });
var employeeClientTemp = _companyContext.EmployeeClientTemps.Where(x => workshops.Contains(x.WorkshopId));
var employeeClientTempKeys = _companyContext.EmployeeClientTemps
.Where(x => workshops.Contains(x.WorkshopId))
.Select(x => new { x.WorkshopId, x.EmployeeId });
var query = _companyContext.EmployeeDocuments
.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()
var allValidKeys = activeEmployeeKeys
.Union(employeeClientTempKeys);
// کوئری اصلی بدون Include و بدون GroupBy
var employeeDocs = _companyContext.EmployeeDocuments
.Where(x =>
workshops.Contains(x.WorkshopId) &&
allValidKeys.Any(k => k.WorkshopId == x.WorkshopId && k.EmployeeId == x.EmployeeId) &&
!x.IsConfirmed &&
!x.IsSentToChecker &&
(
x.EmployeeDocumentItemCollection.Any(y => y.DocumentStatus == DocumentStatus.SubmittedByClient) ||
x.HasRejectedItems ||
employeeClientTempKeys.Any(k => k.WorkshopId == x.WorkshopId && k.EmployeeId == x.EmployeeId)
))
.Select(x => new
{
WorkshopId = x.Key,
WorkshopFullName = x.FirstOrDefault().Workshop.WorkshopName,
EmployeesWithoutDocumentCount = x.Count()
});
x.WorkshopId,
WorkshopName = x.Workshop.WorkshopName,
x.EmployeeId
})
.AsNoTracking()
.ToList();
// Group در حافظه با سرعت بیشتر
var grouped = employeeDocs
.GroupBy(x => new { x.WorkshopId, x.WorkshopName })
.Select(g => new WorkshopWithEmployeeDocumentsViewModel
{
WorkshopId = g.Key.WorkshopId,
WorkshopFullName = g.Key.WorkshopName,
EmployeesWithoutDocumentCount = g.Count()
})
.ToList();
// گرفتن کارفرماها فقط برای ورکشاپ‌هایی که توی لیست بالا هستن
var workshopIds = grouped.Select(x => x.WorkshopId).ToList();
var workshopEmployers = _companyContext.WorkshopEmployers.Include(x => x.Employer)
.Where(x => query.Any(y => y.WorkshopId == x.WorkshopId))
.GroupBy(x => x.WorkshopId).Select(x => x.FirstOrDefault()).ToList();
var employers = _companyContext.WorkshopEmployers
.Where(x => workshopIds.Contains(x.WorkshopId))
.Include(x => x.Employer)
.AsSplitQuery()
.AsNoTracking()
.GroupBy(x => x.WorkshopId)
.Select(g => g.FirstOrDefault())
.ToList();
var result = query.ToList();
result.ForEach(x =>
// اضافه کردن اسم کارفرما
grouped.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 ?? "");
var employer = employers.FirstOrDefault(y => y.WorkshopId == x.WorkshopId)?.Employer;
x.EmployerName = employer?.FullName;
});
return result.Where(x => x.EmployeesWithoutDocumentCount > 0).OrderByDescending(x => x.EmployeesWithoutDocumentCount).ToList();
// فیلتر نهایی
return grouped
.Where(x => x.EmployeesWithoutDocumentCount > 0)
.OrderByDescending(x => x.EmployeesWithoutDocumentCount)
.ToList();
}
@@ -475,44 +549,83 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
public List<EmployeeDocumentsViewModel> GetByWorkshopIdWithItemsForAdminWorkFlow(long workshopId)
{
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 });
var activeEmployeeIds = _companyContext.LeftWorkList
.Where(x => x.WorkshopId == workshopId && x.LeftWorkDate.AddDays(-1) >= DateTime.Today)
.Select(x => new
{
x.EmployeeId,
FullName = x.Employee.FName + " " + x.Employee.LName,
x.Employee.Gender
}).ToList();
var activeEmployeeIdList = activeEmployeeIds.Select(x => x.EmployeeId).ToList();
//var EDItemsList = _companyContext.EmployeeDocumentItems
// .Where(x => x.WorkshopId == workshopId &&
// x.DocumentStatus != DocumentStatus.Unsubmitted &&
// activeEmployeeIdList.Contains(x.EmployeeId))
// .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()).ToList();
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))
.Where(x => x.WorkshopId == workshopId &&
x.DocumentStatus != DocumentStatus.Unsubmitted &&
activeEmployeeIdList.Contains(x.EmployeeId) &&
x.EmployeeDocuments.IsSentToChecker == false &&
(x.DocumentStatus == DocumentStatus.SubmittedByClient || x.EmployeeDocuments.HasRejectedItems))
.Include(x=>x.EmployeeDocuments).ToList()
.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()).ToList();
.Select(g => g.OrderByDescending(x => x.CreationDate).Select(y => new
{
y.EmployeeDocumentId,
Id = y.id,
y.EmployeeDocuments.Gender,
y.DocumentLabel,
y.DocumentStatus,
y.MediaId,
y.RejectionReason,
y.EmployeeId,
y.CreationDate,
y.EmployeeDocuments.IsSentToChecker,
y.EmployeeDocuments.IsConfirmed
}).FirstOrDefault())
.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 tempEmployeeIds = _companyContext.EmployeeClientTemps
.Where(x => x.WorkshopId == workshopId)
.Select(x => x.EmployeeId)
.ToList();
var tempEmployees = _companyContext.Employees
.Where(x => tempEmployeeIds.Contains(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) &&
.Where(x => x.WorkshopId == workshopId && tempEmployeeIds.Contains(x.EmployeeId) &&
x.IsSentToChecker == false && x.IsConfirmed == false)
.SelectMany(x => x.EmployeeDocumentItemCollection.DefaultIfEmpty(), // اگر خالی بود، مقدار پیش‌فرض ایجاد کن
(documents, y) => new
@@ -533,55 +646,57 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
var enumerable = EDItemsList.Concat(tempEmployeeDocuments);
var activeEmployeesInWorkshopList = activeEmployeesInWorkshop.ToList().Concat(tempEmployees);
//var enumerable = EDItemsList.Concat(tempEmployeeDocuments);
//var activeEmployeesInWorkshopList = activeEmployeesInWorkshop.ToList().Concat(tempEmployees);
var allEmployeeDocuments = EDItemsList.Concat(tempEmployeeDocuments).ToList();
var allEmployees = activeEmployeeIds.Concat(tempEmployees).ToList();
//get medias for current documents of employees
var mediaIds = enumerable.Select(x => x.MediaId).ToList();
var mediasList = _accountContext.Medias.Where(x => mediaIds.Contains(x.id))
var mediaIds = allEmployeeDocuments.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();
var result = enumerable.GroupBy(x => x.EmployeeId)
.Select(x =>
var result = allEmployeeDocuments
.GroupBy(x => x.EmployeeId)
.Select(group =>
{
//var requiredDocs = EmployeeDocumentRequiredItems.GetByGender(x.Gender);
var employeeLatestConfirmedDocuments = x
var employee = allEmployees.First(e => e.EmployeeId == group.Key);
.Where(y => y.EmployeeId == x.Key && (y.DocumentStatus == DocumentStatus.SubmittedByClient || y.DocumentStatus == DocumentStatus.SubmittedByAdmin || y.DocumentStatus == DocumentStatus.Rejected))
.Select(y => new EmployeeDocumentItemViewModel()
var docs = group
.Where(y => 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();
return new EmployeeDocumentsViewModel
{
Status = y.DocumentStatus,
MediaId = y.MediaId,
DocumentItemLabel = y.DocumentLabel,
Id = y.Id,
RejectionMessage = y.RejectionReason,
StatusString = y.DocumentStatus.ToString()
}).ToList();
//var requiredItemsUploaded = employeeLatestConfirmedDocuments
// .Where(y => requiredDocs.Contains(y.DocumentItemLabel)).Select(y => y.DocumentItemLabel)
// .ToList();
return new EmployeeDocumentsViewModel()
{
EmployeeId = x.Key,
IdCardPage1 = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.IdCardPage1),
IdCardPage2 = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.IdCardPage2),
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,
NationalCardFront = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.NationalCardFront),
NationalCardRear = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.NationalCardRear),
MilitaryServiceCard = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.MilitaryServiceCard),
EmployeePicture = GetByLabelAndLoadMedia(employeeLatestConfirmedDocuments, mediasList, DocumentItemLabel.EmployeePicture),
//RequiredDocumentsUploaded = requiredItemsUploaded,
//RequiredDocuments = requiredDocs
EmployeeId = group.Key,
IdCardPage1 = GetByLabelAndLoadMedia(docs, mediasList, DocumentItemLabel.IdCardPage1),
IdCardPage2 = GetByLabelAndLoadMedia(docs, mediasList, DocumentItemLabel.IdCardPage2),
IdCardPage3 = GetByLabelAndLoadMedia(docs, mediasList, DocumentItemLabel.IdCardPage3),
IdCardPage4 = GetByLabelAndLoadMedia(docs, mediasList, DocumentItemLabel.IdCardPage4),
EducationalDegree = GetByLabelAndLoadMedia(docs, mediasList, DocumentItemLabel.EducationalDegree),
EmployeeFullName = employee.FullName,
NationalCardFront = GetByLabelAndLoadMedia(docs, mediasList, DocumentItemLabel.NationalCardFront),
NationalCardRear = GetByLabelAndLoadMedia(docs, mediasList, DocumentItemLabel.NationalCardRear),
MilitaryServiceCard = GetByLabelAndLoadMedia(docs, mediasList, DocumentItemLabel.MilitaryServiceCard),
EmployeePicture = GetByLabelAndLoadMedia(docs, mediasList, DocumentItemLabel.EmployeePicture),
};
}).ToList();
})
.ToList();
return result;

View File

@@ -450,7 +450,7 @@ public class EmployeeRepository : RepositoryBase<long, Employee>, IEmployeeRepos
var employeeData = new Employee(command.FName, command.LName, command.FatherName, dateOfBirth,
dateOfIssue,
command.PlaceOfIssue, command.NationalCode, command.IdNumber, command.Gender, command.Nationality,
command.PlaceOfIssue, command.NationalCode, command.IdNumber, command.Gender, command.Nationality,command.IdNumberSerial,command.IdNumberSeri,
command.Phone, command.Address,
command.State, command.City, command.MaritalStatus, command.MilitaryService, command.LevelOfEducation,
command.FieldOfStudy, command.BankCardNumber,

View File

@@ -462,48 +462,98 @@ CreateWorkingHoursTemp command, bool holidayWorking)
string shiftPayValue = "0";
List<RotatingShiftViewModel> rotatingResultList = RotatingShiftCheck(groupedRollCall);
var moriningCount = rotatingResultList.Count(x => x.IsMorningShift);
var eveningCount = rotatingResultList.Count(x => x.IsEveningShift);
var nightCount = rotatingResultList.Count(x => x.IsNightShift);
// شبکاری
TimeSpan over22 = new TimeSpan(rotatingResultList.Sum(x => x.NightWorkSpan.Ticks));
var RotatingfaName = new List<string>();
if (command.ShiftWork != "1" && command.ShiftWork != "2" && command.ShiftWork != "4")//اگر چرخشی بود و منظم نبود
{
if (moriningCount > 0)
RotatingfaName.Add("صبح");
if (eveningCount > 0)
RotatingfaName.Add("عصر");
if (nightCount > 0)
RotatingfaName.Add("شب");
}
else// اگر منظم و شیفتی بود
{
var totalDays = (int)(command.ContractEndGr - command.ContractStartGr).TotalDays + 1;
int validCount = 0;
if (totalDays <= 7) // زیر 7 روز باید حد اقل 2 تغییر شیفت داشته باشد
{
validCount = 2;
}
else if (totalDays >= 28) // بالای 28 روز حد اقل 8 تغییر شیفت
{
validCount = 8;
}
else
{
// تناسب گیری - اگر برای 28 روز 8 تغییر پس برای ایکس روز چند تغییر لازم است
validCount = (int)((totalDays * 8) / 28);
}
//if (command.ShiftWork != "1" && command.ShiftWork != "2" && command.ShiftWork != "4")//اگر چرخشی بود و منظم نبود
//{
// if (moriningCount > 0)
// RotatingfaName.Add("صبح");
// if (eveningCount > 0)
// RotatingfaName.Add("عصر");
// if (nightCount > 0)
// RotatingfaName.Add("شب");
//}
//else// اگر منظم و شیفتی بود
//{
// var totalDays = (int)(command.ContractEndGr - command.ContractStartGr).TotalDays + 1;
// int validCount = 0;
// if (totalDays <= 7) // زیر 7 روز باید حد اقل 2 تغییر شیفت داشته باشد
// {
// validCount = 2;
// }
// else if (totalDays >= 28) // بالای 28 روز حد اقل 8 تغییر شیفت
// {
// validCount = 8;
// }
// else
// {
// // تناسب گیری - اگر برای 28 روز 8 تغییر پس برای ایکس روز چند تغییر لازم است
// validCount = (int)((totalDays * 8) / 28);
// }
if (moriningCount >= validCount)
RotatingfaName.Add("صبح");
if (eveningCount >= validCount)
RotatingfaName.Add("عصر");
if (nightCount >= validCount)
RotatingfaName.Add("شب");
// if (moriningCount >= validCount)
// RotatingfaName.Add("صبح");
// if (eveningCount >= validCount)
// RotatingfaName.Add("عصر");
// if (nightCount >= validCount)
// RotatingfaName.Add("شب");
//}
int moriningCount = 0;
int eveningCount = 0;
int nightCount = 0;
int moriningWinRate = rotatingResultList.Where(x => x.IsMorningShift).Sum(x => x.WinRate);
int eveningWinRate = rotatingResultList.Where(x => x.IsEveningShift).Sum(x => x.WinRate);
int nightWinRate = rotatingResultList.Where(x => x.IsNightShift).Sum(x => x.WinRate);
if (moriningWinRate > eveningWinRate && moriningWinRate > nightWinRate)
{
moriningCount = rotatingResultList.Count(x => x.IsMorningShift);
eveningCount = rotatingResultList.Count(x => x.IsEveningShift && x.WinRate > 55);
nightCount = rotatingResultList.Count(x => x.IsNightShift && x.WinRate > 55);
}
if (eveningWinRate > moriningWinRate && eveningWinRate > nightWinRate)
{
moriningCount = rotatingResultList.Count(x => x.IsMorningShift && x.WinRate > 55);
eveningCount = rotatingResultList.Count(x => x.IsEveningShift);
nightCount = rotatingResultList.Count(x => x.IsNightShift && x.WinRate > 55);
}
if (nightWinRate > moriningWinRate && nightWinRate > eveningWinRate)
{
moriningCount = rotatingResultList.Count(x => x.IsMorningShift && x.WinRate > 55);
eveningCount = rotatingResultList.Count(x => x.IsEveningShift && x.WinRate > 55);
nightCount = rotatingResultList.Count(x => x.IsNightShift);
}
var totalDays = (int)(command.ContractEndGr - command.ContractStartGr).TotalDays + 1;
int validCount = 0;
if (totalDays <= 7) // زیر 7 روز باید حد اقل 2 تغییر شیفت داشته باشد
{
validCount = 2;
}
else if (totalDays >= 28) // بالای 28 روز حد اقل 8 تغییر شیفت
{
validCount = 8;
}
else
{
// تناسب گیری - اگر برای 28 روز 8 تغییر پس برای ایکس روز چند تغییر لازم است
validCount = (int)((totalDays * 8) / 28);
}
if (moriningCount >= validCount)
RotatingfaName.Add("صبح");
if (eveningCount >= validCount)
RotatingfaName.Add("عصر");
if (nightCount >= validCount)
RotatingfaName.Add("شب");
var rotatingFaResult = "";
if (RotatingfaName.Count > 1)// اگر تعداد شیفت های محاسبه شده بیش از یک بود
{
@@ -623,9 +673,41 @@ CreateWorkingHoursTemp command, bool holidayWorking)
string shiftPayValue = "0";
List<RotatingShiftViewModel> rotatingResultList = RotatingShiftCheck(groupedRollCall);
var moriningCount = rotatingResultList.Count(x => x.IsMorningShift);
var eveningCount = rotatingResultList.Count(x => x.IsEveningShift);
var nightCount = rotatingResultList.Count(x => x.IsNightShift);
int moriningCount = 0;
int eveningCount = 0;
int nightCount = 0;
int moriningWinRate = rotatingResultList.Where(x=>x.IsMorningShift).Sum(x => x.WinRate);
int eveningWinRate = rotatingResultList.Where(x => x.IsEveningShift).Sum(x => x.WinRate);
int nightWinRate = rotatingResultList.Where(x => x.IsNightShift).Sum(x => x.WinRate);
if (moriningWinRate > eveningWinRate && moriningWinRate > nightWinRate)
{
moriningCount = rotatingResultList.Count(x => x.IsMorningShift);
eveningCount = rotatingResultList.Count(x => x.IsEveningShift && x.WinRate > 55);
nightCount = rotatingResultList.Count(x => x.IsNightShift && x.WinRate > 55);
}
if (eveningWinRate > moriningWinRate && eveningWinRate > nightWinRate)
{
moriningCount = rotatingResultList.Count(x => x.IsMorningShift && x.WinRate > 55);
eveningCount = rotatingResultList.Count(x => x.IsEveningShift);
nightCount = rotatingResultList.Count(x => x.IsNightShift && x.WinRate > 55);
}
if (nightWinRate > moriningWinRate && nightWinRate > eveningWinRate)
{
moriningCount = rotatingResultList.Count(x => x.IsMorningShift && x.WinRate > 55);
eveningCount = rotatingResultList.Count(x => x.IsEveningShift && x.WinRate > 55);
nightCount = rotatingResultList.Count(x => x.IsNightShift);
}
// شبکاری
TimeSpan over22 = new TimeSpan(rotatingResultList.Sum(x => x.NightWorkSpan.Ticks));
var RotatingfaName = new List<string>();
@@ -1061,18 +1143,28 @@ CreateWorkingHoursTemp command, bool holidayWorking)
if (result.MorningWorkSpan > result.EveningWorkSpan
|| result.MorningWorkSpan == result.EveningWorkSpan) // if morning bigerThan evening or equal
{
if (result.MorningWorkSpan != nullWorkspan)
{
var sumSpan = result.MorningWorkSpan.Add(result.EveningWorkSpan);
var sumSpanDouble = sumSpan.TotalMinutes;
var winRate = (result.MorningWorkSpan.TotalMinutes * 100) / sumSpanDouble;
result.WinRate = Convert.ToInt32(winRate);
result.IsMorningShift = true;
result.IsNightShift = false;
result.IsEveningShift = false;
result.RotatingShiftStatus = "صبح";
}
if (result.MorningWorkSpan < result.NightWorkSpan
|| result.MorningWorkSpan == result.NightWorkSpan) // if night bigerThan morning or equal
if (result.NightWorkSpan != nullWorkspan)
{
var sumSpan = result.MorningWorkSpan.Add(result.NightWorkSpan);
var sumSpanDouble = sumSpan.TotalMinutes;
var winRate = (result.NightWorkSpan.TotalMinutes * 100) / sumSpanDouble;
result.WinRate = Convert.ToInt32(winRate);
result.IsMorningShift = false;
result.IsNightShift = true;
result.IsEveningShift = false;
@@ -1083,6 +1175,10 @@ CreateWorkingHoursTemp command, bool holidayWorking)
{
if (result.EveningWorkSpan != nullWorkspan)
{
var sumSpan = result.MorningWorkSpan.Add(result.EveningWorkSpan);
var sumSpanDouble = sumSpan.TotalMinutes;
var winRate = (result.EveningWorkSpan.TotalMinutes * 100) / sumSpanDouble;
result.WinRate = Convert.ToInt32(winRate);
result.IsEveningShift = true;
result.IsMorningShift = false;
result.IsNightShift = false;
@@ -1093,6 +1189,10 @@ CreateWorkingHoursTemp command, bool holidayWorking)
|| result.EveningWorkSpan == result.NightWorkSpan) // if night bigerThan evening or equal
if (result.NightWorkSpan != nullWorkspan)
{
var sumSpan = result.EveningWorkSpan.Add(result.NightWorkSpan);
var sumSpanDouble = sumSpan.TotalMinutes;
var winRate = (result.NightWorkSpan.TotalMinutes * 100) / sumSpanDouble;
result.WinRate = Convert.ToInt32(winRate);
result.IsMorningShift = false;
result.IsEveningShift = false;
result.IsNightShift = true;

View File

@@ -207,6 +207,7 @@ using CompanyManagment.App.Contracts.LeftWorkTemp;
using CompanyManagment.App.Contracts.TemporaryClientRegistration;
using Company.Domain.ContactUsAgg;
using CompanyManagment.App.Contracts.ContactUs;
using Company.Domain.EmployeeAuthorizeTempAgg;
namespace PersonalContractingParty.Config;
@@ -426,6 +427,9 @@ public class PersonalBootstrapper
services.AddTransient<ILeftWorkTempRepository, LeftWorkTempRepository>();
services.AddTransient<ILeftWorkTempApplication, LeftWorkTempApplication>();
services.AddTransient<IEmployeeAuthorizeTempRepository, EmployeeAuthorizeTempRepository>();
services.AddTransient<IContactUsRepository, ContactUsRepository>();
services.AddTransient<IContactUsApplication, ContactUsApplication>();
#endregion

View File

@@ -186,6 +186,7 @@ public class IndexModel : PageModel
result.EmployeeFullName = checkout.EmployeeFullName;
result.YearAndMonth = $"{checkout.Month} {checkout.Year}";
result.HasRotatingShift = result.RotatingStatus == "نوبت کاری ندارد" ? false : true;
Console.WriteLine("ok");
return Partial("./RotatingShiftReportDesktop", result);
}

View File

@@ -53,7 +53,17 @@
.rotateParntModal {
height: 600px !important;
}
.noRotating{
background-color: #fe8470;
}
.hasRotating{
background-color: #1bff01;
}
</style>
string noRotating = "noRotating";
string hasRotating = "hasRotating";
}
@@ -98,7 +108,8 @@
<div class="col-xs-3" style="text-align:left"> <h5>نوع ساعت کاری :</h5> </div>
<div class="col-xs-3" style="text-align:right">
<div class="col-xs-3 @(!Model.HasRotatingShift? @noRotating :@hasRotating )" style="text-align:right ">
<h5>@Model.RotatingStatus</h5>
</div>
<div class="col-xs-3" style="text-align:left">
@@ -118,19 +129,8 @@
<span style="padding: 0px 10px;"> نوبت شب </span>
</div>
<div id="rotatingList">
@{
if (@Model.RotatingStatus == "نوبت کاری ندارد")
{
<div class="row">
<div class="col-xs-4"></div>
<div class="col-xs-4">
<h3>نوبت کاری ندارد</h3>
</div>
<div class="col-xs-4"></div>
</div>
}
else
{
@foreach (var item in @Model.RotatingResultList)
{
@@ -163,9 +163,9 @@
</div>
}
}
}
</div>
</div>
<div class="row">

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,8 @@
</style>
}
<link href="@Href("~/Admintheme/css/personelCreate.css")" rel="stylesheet"/>
@* <link href="@Href("~/Admintheme/css/personelCreate.css")" rel="stylesheet"/> *@
<link href="@Href("~/Admintheme/css/personelEdit.css")" rel="stylesheet"/>
<fieldset class="content-fieldset">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>

View File

@@ -1591,5 +1591,15 @@ public class IndexModel : PageModel
});
}
#endregion
#endregion
public async Task<IActionResult> OnPostEmployeeDataFromApi(string nationalCode, string birthDate)
{
var result = await _employeeApplication.GetEmployeeDataFromApi(nationalCode, birthDate);
return new JsonResult(new
{
success = result.IsSuccedded,
message = result.Message,
data = result.Data
});
}
}

View File

@@ -145,7 +145,7 @@
<label class="titleForm2">
نظام وظیفه
</label>
<select class="form-select form-select-sm" id="militaryStatus" asp-for="@Model.MilitaryService">
<select class="form-select form-select-sm" id="militaryStatus" name="Command.MilitaryService" asp-for="@Model.MilitaryService">
<option value="">انتخاب ...</option>
<option value="مشمول">مشمول</option>
<option value="پایان خدمت">پایان خدمت</option>

View File

@@ -8,6 +8,13 @@
.modal .modal-dialog .modal-content{
padding: 0;
}
.disable {
filter: grayscale(100%);
pointer-events: none;
opacity: 0.6;
}
@media(min-width: 1650px) {
.modal-dialog {
margin: auto;
@@ -74,7 +81,7 @@
}
.form {
position: absolute;
/*position: absolute;*/
font-size: 1.2rem;
width: 100%;
}
@@ -135,17 +142,31 @@
width: 100% !important;
}
.form1, .listForm1 {
.formInit {
margin-top: 30px;
width: 96%;
width: 100%;
}
.formInit .formSection {
display: flex;
align-items: center;
justify-content: center;
gap: 30px;
height: 45vh;
}
.form1, .listForm1 {
/*left: 1200px;*/
margin-top: 30px;
width: 100%;
}
.form2, .listForm2 {
left: 1200px;
/*left: 1200px;*/
margin-top: 30px;
}
.form3, .listForm3 {
right: 1200px;
/*right: 1200px;*/
padding: 0 10px;
margin: 0;
margin-top: 30px;
@@ -188,13 +209,15 @@
padding: 7px;
text-align: center;
margin: 0 3px 0 3px;
width: 33.33%;
/*width: 33.33%;*/
width: 25%;
z-index: 9;
}
.progressBar {
position: absolute;
width: 33.33%;
/*width: 33.33%;*/
width: 25%;
background: linear-gradient(90deg, rgba(15,149,0,1) 0%, rgba(53,189,37,1) 18%, rgba(68,207,52,1) 47%, rgba(73,214,57,1) 82%, rgba(15,149,0,1) 100%);
height: 103%;
right: -1px;

View File

@@ -0,0 +1,827 @@
.modal-dialog {
width: 55%;
margin: 30px auto;
}
#MainModal {
backdrop-filter: blur(8px);
}
.modal .modal-dialog .modal-content {
padding: 0;
}
@media(min-width: 1650px) {
.modal-dialog {
margin: auto;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) !important;
width: 50%;
}
}
@media (max-width: 1580px) {
.modal-dialog {
width: 60%;
}
}
.modal .modal-dialog .modal-content {
border-radius: 18px;
min-height: 68rem;
background: #ebebeb;
}
@media (max-width: 1200px) {
.modal .modal-dialog .modal-content {
min-height: 80rem;
}
}
.form-box {
position: relative;
padding: 40px 20px;
top: 5rem;
border: 1px solid #d1d1d1;
position: relative;
border-radius: 1rem;
overflow: hidden;
min-height: 57rem;
}
.main-title {
position: absolute;
width: 17rem;
font-size: 1.7rem;
background-color: inherit;
left: 49%;
top: 7px;
margin-left: -100px;
text-align: center;
color: black;
border: 1px solid #00000030;
border-radius: 9px;
padding: 2px 0px;
}
.ltr {
direction: ltr;
}
.close {
margin-top: 12px;
margin-left: -19px;
font-size: 26px;
position: absolute;
right: 25px;
}
.form {
position: absolute;
font-size: 1.2rem;
width: 100%;
}
.input-type {
padding: 0px 8px;
}
.nationality-type {
padding: 0.7px 4px;
}
.duty-condition {
position: relative;
top: -5px;
}
.loc-box {
margin-top: 10px;
}
.loc-text {
height: 182px;
}
.insInput {
background-color: #d4e9ff;
}
.insInputDate label {
font-size: 10px;
}
.content-fieldset {
width: 95%;
margin: auto;
}
.radio-sections {
padding: 15px 7px !important;
background: #ffffff6b;
border-radius: 7px;
border: 1px solid #0000004a;
display: flex;
flex-wrap: nowrap;
justify-content: space-evenly;
align-items: flex-start;
}
.form1 .form-group, .listForm1 .form-group {
justify-content: space-around;
padding: 15px 5px 15px 0;
border: 1px solid #e3e3e3;
box-shadow: 0px 0px 4px 0px #a7a7a7;
background: #e5e5e5;
border-radius: 7px;
margin: 0;
margin-bottom: 15px !important;
width: 100% !important;
}
.form1, .listForm1 {
margin-top: 30px;
width: 96%;
}
.form2, .listForm2 {
left: 1200px;
margin-top: 30px;
}
.form3, .listForm3 {
right: 1200px;
padding: 0 10px;
margin: 0;
margin-top: 30px;
}
.flexible-wrap {
display: flex;
flex-wrap: wrap;
}
.form3 legend, .listForm3 legend {
margin-bottom: 5px;
font-size: 16px;
border-bottom: 0px;
color: #505458;
width: 130px;
text-align: center;
}
.form3 fieldset, .listForm3 fieldset {
border: 1px solid #999797;
border-radius: 10px;
padding: 5px 0;
width: 100%;
}
.steps {
display: flex;
align-items: center;
flex-direction: row-reverse;
width: 100%;
position: absolute;
top: 0px;
left: 0;
height: 42px;
border: 1px solid #36292947;
border-top-right-radius: 7px;
border-top-left-radius: 7px;
box-shadow: 0 2px 5px 0 rgb(104 106 106 / 49%), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
}
.step {
padding: 7px;
text-align: center;
margin: 0 3px 0 3px;
width: 33.33%;
z-index: 9;
}
.progressBar {
position: absolute;
width: 33.33%;
background: linear-gradient(90deg, rgba(15,149,0,1) 0%, rgba(53,189,37,1) 18%, rgba(68,207,52,1) 47%, rgba(73,214,57,1) 82%, rgba(15,149,0,1) 100%);
height: 103%;
right: -1px;
top: -1px;
transition: 1s;
}
.progressBar:after {
content: '';
border-top: 20px solid transparent;
border-bottom: 20px solid transparent;
position: absolute;
left: -19px;
top: 1px;
border-right: 20px solid #0f9500;
}
.radio-box {
font-size: 12px;
border-radius: 10px;
align-items: center;
width: 100%;
display: grid;
grid-template-columns: repeat(15, 1fr);
}
.radio-label {
grid-column: 1/7;
grid-row: 1;
margin-bottom: 0;
}
.radio-input {
grid-column: 7 / 16;
grid-row: 1;
text-align: left;
display: grid;
grid-template-columns: repeat(15, 1fr);
}
.radio-input label:first-child {
grid-column: 1 / 8;
}
.radio-input label:nth-child(2) {
grid-column: 8 / 16;
}
.radio-input.nationality {
grid-column: 5 / 16;
}
.radio-input.nationality label:first-child {
grid-column: 1 / 7;
}
.radio-input.nationality label:nth-child(2) {
grid-column: 7 / 16;
}
.form-box input[type="radio"] {
margin: 2px 0px;
}
.form-box .radio-input input[type="radio"] {
margin: 0 4px 0px 4px;
transform: translate(0px,4px);
}
.inputs-box {
float: left;
display: flex;
align-items: center;
}
.inputs {
padding: 10px;
}
.input {
border: 1px solid #0000004a;
border-radius: 7px;
padding: 7px;
width: 100%;
}
.input:focus {
box-shadow: 0 2px 5px 0 rgb(136 137 141), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
}
#save {
background-color: #0f9500;
color: white;
cursor: pointer;
}
#close {
background-color: white;
color: #323030;
}
.btn-modal {
padding: 1rem 0;
border-radius: 20px;
border: none;
font-size: 12px;
width: 9rem;
}
.btns {
position: absolute;
display: inline-flex;
bottom: 12px;
width: 100%;
justify-content: flex-end;
margin-right: 50px;
}
.btns-2 {
bottom: 15px;
margin-right: 17px;
}
.btn-modal.pre, .btn-modal.listPrev {
border-top-left-radius: 0px;
border-bottom-left-radius: 0px;
background-color: #c7c0c0ba;
color: #000000b8;
margin-left: -4px;
}
.btn-modal.next, .btn-modal.listNext {
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
margin-left: -4px;
border-right: 1px solid #817b7b;
background-color: white;
color: #1e88b3;
}
.btns-left {
float: left;
}
.btn-rounded {
border-radius: 2em;
padding: 6px 10px;
}
.form-footer-btns {
position: absolute;
bottom: 5px;
left: 40%;
}
.form-footer {
padding: 15px;
text-align: right;
float: left;
border-top: 0;
position: absolute;
bottom: -5px;
left: 5px;
}
#divEdit .form-footer {
bottom: 5px;
}
.btn:hover {
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
}
.children-box {
position: relative;
display: flex;
flex-direction: column;
}
#children-container {
position: relative;
display: flex;
flex-direction: column;
height: 18rem;
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: #f2f2f2 transparent;
direction: ltr;
border: 1px solid #9b97976e;
border-radius: 10px 10px 7px 7px;
padding: 10px 0;
background-color: #dbdadaba;
margin-top: 10px;
margin-bottom: 5px;
}
#children {
border-collapse: separate !important;
position: relative;
top: -10px;
width: 100%;
background: whitesmoke;
text-align: center;
border-radius: 10px;
border: none !important;
margin-bottom: 0 !important;
}
#children th {
text-align: center;
color: white;
position: sticky;
top: -10px;
z-index: 20;
background-color: #404040;
font-size: 13px;
}
#children th, td {
padding: 8px;
}
#children th:nth-child(2n) {
border-left: 1px solid #fff;
}
#children tr:nth-child(2n) {
background-color: #e3e3e3;
}
#children th:nth-child(2n) {
border-left: 1px solid #fff;
}
#children td:nth-child(2n) {
border-left: 1px solid #fff;
border-right: 1px solid #9b979721;
}
#children td:nth-child(2n+1) {
border-left: 1px solid #9b979721;
display: flex;
flex-direction: row-reverse;
justify-content: center;
}
#children td {
text-align: center;
}
#children th:first-child {
border-radius: 7px 0px 0px 0px;
-moz-border-radius: 7px 0px 0px 0px;
-webkit-border-radius: 7px 0px 0px 0px;
}
#children th:last-child {
border-left: 1px solid #fff;
border-radius: 0px 7px 0 0;
-moz-border-radius: 0px 7px 0 0;
-webkit-border-radius: 0px 7px 0 0;
}
#children tbody tr {
min-height: 68px;
}
#children-container.hide-scrollbar::-webkit-scrollbar {
width: 0px;
}
#children-container::-webkit-scrollbar {
width: 7px;
height: 5px;
}
#children-container::-webkit-scrollbar-track {
background-color: #f2f2f2;
border-radius: 5px;
}
#children-container::-webkit-scrollbar-thumb {
background-color: #ccc;
border-radius: 5px;
}
#children-container::-webkit-scrollbar-thumb:hover {
background-color: #aaa;
}
.children-box .add {
cursor: pointer;
padding: 8px 6px;
border-radius: 16px;
border: 2px solid #0f9500;
background: white;
color: #0f9500;
font-size: 10px;
width: 9rem;
}
.d-flex {
display: flex;
flex-wrap: wrap;
}
.trash {
color: #c91d1d;
font-size: 22px;
position: relative;
left: -7px;
top: 5px;
}
.add:hover {
background: #0f9500;
color: white;
border: 2px solid #0f9500;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
}
.items, .items1 {
border: 1px solid #c7c7c7;
border-radius: 5px;
padding: 5px 0px;
background-color: white;
text-align: center;
}
.green {
background-color: #e0ffe0;
}
.modal-content2 {
background-color: whitesmoke;
border: 1px solid #a5a5a59e;
border-radius: 18px;
margin-top: 300px;
padding: 0px 30px;
}
.modal .modal-dialoge .modal-content2 .modal-body {
padding: 50px 20px;
font-size: 17px;
}
.modal-dialoge {
padding: 0px 180px;
}
.error-icon {
position: absolute;
left: 15px;
top: 40px;
font-size: 16px;
color: red;
}
.error-message {
font-size: 1rem;
color: red;
position: absolute;
}
.input-div {
display: flex;
}
.education {
height: 36px;
}
.errored, .patternMisMatch {
animation: shake 300ms;
box-shadow: inset 0 0 2px #eb3434, 0 0 5px #eb3434 !important;
border: 1px solid #eb3434 !important;
border-radius: 8px;
}
@media (max-width: 1550px) and (min-width:1441px) {
.education {
height: 33px;
}
}
@media (max-width: 1550px) {
.modal-content {
height: 680px !important;
}
.box {
font-size: 12px;
height: 575px;
top: 40px;
}
.inputs {
padding: 6px 8px;
}
.btn-modal {
font-size: 12px;
}
.main-title {
width: 185px;
font-size: 17px;
left: 52%;
top: 5px;
}
.trash {
font-size: 18px;
}
}
@media (max-width: 1440px) {
#progress:after {
border-top: 17px solid transparent;
border-bottom: 17px solid transparent;
}
.inputs {
padding: 8px 10px;
}
.education {
height: 29px;
}
.btn-modal {
font-size: 10px;
}
.main-title {
width: 169px;
font-size: 15px;
left: 53%;
top: 3px;
}
.radio-sections {
padding: 8px 5px !important;
display: flex;
align-items: center;
}
.nationality-type {
padding: 0px 2px;
}
.input-type {
padding: 0px 5px;
}
.duty-condition {
top: -9px;
}
.loc-box {
margin-top: 9px;
}
#children-container, .loc-text {
height: 136px;
}
#children th, td {
padding: 5px 8px;
}
#children th {
font-size: 11px;
}
.radio-box {
font-size: 10px;
}
}
@media (max-width: 1200px) {
.form-box {
min-height: 69rem;
}
.form1, .listForm1 {
width: 93%;
}
.radio-input.nationality label:first-child {
grid-column: 1 / 9;
}
.radio-input.nationality label:nth-child(2) {
grid-column: 9 / 16;
}
#employee-panel .name-th {
max-width: 55px;
}
#employee-panel .Lname-th {
max-width: 85px;
}
#employee-panel .code-th {
max-width: 55px;
}
#employee-panel .insurance-th {
max-width: 50px;
}
#employee-panel #datatable tbody tr td {
font-size: 1rem;
}
}
@media (max-width: 900px) {
.modal-dialog {
width: 75%;
}
/* .operationBtns a {
width: 3.8rem;
height: 3.6rem;
}*/
#employee-panel .code-th {
max-width: 65px;
}
#employee-panel .Lname-th {
max-width: 75px;
}
.Lname-td .fulltext {
max-width: 68px;
}
}
@media (max-width: 768px) {
.form-box {
min-height: 85rem;
padding: 40px 10px;
}
.radio-box, .step {
font-size: 10px;
}
.modal .modal-dialog .modal-content {
min-height: 96rem;
}
.form1 .form-group, .listForm1 .form-group {
padding: 8px 5px 8px 0;
}
.modal-dialog {
width: 90%;
}
.form3 fieldset, .listForm3 fieldset {
margin: 10px 0;
}
.form {
font-size: 1rem;
}
.input-type {
padding: 0px 3px;
}
.loc-text {
height: 60px;
}
.radio-input.nationality, .radio-input {
grid-column: 5 / 16;
}
.radio-input.nationality label:first-child {
grid-column: 1 / 8;
}
}
@media (max-width: 768px) and (min-width:490px ) {
.Lname-td .fulltext {
max-width: 80px;
}
}
@media (max-width: 450px) {
.form-box {
min-height: 86rem;
}
.form-footer-btns {
left: 25%;
}
.name-td .fulltext {
max-width: 75px;
}
.modal .modal-dialog .modal-content {
min-height: 96rem;
}
}
@media (max-width: 390px) {
.name-td .fulltext {
max-width: 65px;
}
}

View File

@@ -8,6 +8,40 @@ var idCardPage3;
var idCardPage4;
var uploadFileCount = UploadedCount;
var command = [];
var allPicture = [
{
'label': 0,
'changeImage': false
},
{
'label': 1,
'changeImage': false
},
{
'label': 2,
'changeImage': false
},
{
'label': 3,
'changeImage': false
},
{
'label': 4,
'changeImage': false
},
{
'label': 5,
'changeImage': false
},
{
'label': 6,
'changeImage': false
},
{
'label': 7,
'changeImage': false
},
]
var pendingMessage = `<div class="pendingMessage">بررسی</div>`;
var pendingIcon = `<svg width="24" height="24" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11 19.25C15.5563 19.25 19.25 15.5563 19.25 11C19.25 6.44365 15.5563 2.75 11 2.75C6.44365 2.75 2.75 6.44365 2.75 11C2.75 15.5563 6.44365 19.25 11 19.25Z" fill="#FDBA74"/><path d="M11.4168 14.6667C11.4168 14.8968 11.2303 15.0833 11.0002 15.0833C10.77 15.0833 10.5835 14.8968 10.5835 14.6667C10.5835 14.4365 10.77 14.25 11.0002 14.25C11.2303 14.25 11.4168 14.4365 11.4168 14.6667Z" fill="white" stroke="white"/><path d="M11 11.916V6.41602V11.916Z" fill="white"/><path d="M11 11.916V6.41602" stroke="white" stroke-width="1.5" stroke-linecap="round"/></svg>`;
@@ -191,10 +225,14 @@ $(document).ready(function () {
} else {
let picturesPart = {
Label: label,
PictureFile: newFile
PictureFile: newFile,
};
command.push(picturesPart);
}
var getChangeIndex = allPicture.findIndex(item => item.label === indexFileValue);
allPicture[getChangeIndex].changeImage = true;
};
reader.readAsDataURL(fileInputFile);
@@ -348,12 +386,15 @@ $(document).ready(function () {
.then(res => res.blob())
.then(blob => {
var getChangeIndex = allPicture.findIndex(item => item.label === indexFileValue);
const fileName = `image_${indexFileValue || Date.now()}.png`;
const newFile = new File([blob], fileName, { type: blob.type });
const picturesPart = {
Label: label,
PictureFile: newFile
PictureFile: newFile,
WithoutPicture: allPicture[getChangeIndex].changeImage === true ? false : true
};
const existingIndex = command.findIndex(item => item.Label === label);
@@ -363,6 +404,8 @@ $(document).ready(function () {
command.push(picturesPart);
}
console.log(command);
$button.addClass('disable');
pdBox.addClass('pending');
@@ -658,6 +701,9 @@ function uploadCanvasAsFile(canvas, fileName, indexFileValue, label) {
command.push(picturesPart);
}
var getChangeIndex = allPicture.findIndex(item => item.label === indexFileValue);
allPicture[getChangeIndex].changeImage = true;
showLoadingAnimation(indexFileValue);
}, "image/png");
@@ -749,6 +795,7 @@ function saveSubmit(id) {
command.forEach((item, index) => {
formData.append(`command[${index}].Label`, item.Label);
formData.append(`command[${index}].PictureFile`, item.PictureFile);
formData.append(`command[${index}].WithoutPicture`, item.WithoutPicture);
});
$.ajax({