From 6b6ec79faaf87822cc81743b8c7c821309e5706c Mon Sep 17 00:00:00 2001 From: SamSys Date: Mon, 29 Dec 2025 17:57:24 +0330 Subject: [PATCH 1/2] add PrintAllDetailsPersonnelInfoClient metoth controler --- .../EmployeeAgg/IEmployeeRepository.cs | 7 ++ .../PrintAllDetailsPersonnelInfoDtoClient.cs | 54 +++++++++++ .../Employee/IEmployeeApplication.cs | 8 ++ .../EmployeeAplication.cs | 5 + .../Repository/EmployeeRepository .cs | 94 ++++++++++++++++++- .../Client/Controllers/EmployeeController.cs | 12 ++- 6 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 CompanyManagment.App.Contracts/Employee/DTO/PrintAllDetailsPersonnelInfoDtoClient.cs diff --git a/Company.Domain/EmployeeAgg/IEmployeeRepository.cs b/Company.Domain/EmployeeAgg/IEmployeeRepository.cs index 5bf23937..6d4fb5aa 100644 --- a/Company.Domain/EmployeeAgg/IEmployeeRepository.cs +++ b/Company.Domain/EmployeeAgg/IEmployeeRepository.cs @@ -96,6 +96,13 @@ public interface IEmployeeRepository : IRepository /// Task> PrintAllEmployeesInfoClient(long workshopId); + /// + /// پرینت گروهی تفکیکی پرسنل + /// + /// + /// + Task> PrintAllDetailsPersonnelInfoClient(long workshopId); + /// /// سلکت لیست پرسنل های کارگاه کلاینت /// diff --git a/CompanyManagment.App.Contracts/Employee/DTO/PrintAllDetailsPersonnelInfoDtoClient.cs b/CompanyManagment.App.Contracts/Employee/DTO/PrintAllDetailsPersonnelInfoDtoClient.cs new file mode 100644 index 00000000..655dc6d1 --- /dev/null +++ b/CompanyManagment.App.Contracts/Employee/DTO/PrintAllDetailsPersonnelInfoDtoClient.cs @@ -0,0 +1,54 @@ +namespace CompanyManagment.App.Contracts.Employee.DTO; + +/// +/// پرینت گروهی تفکیکی پرسنل +/// +public class PrintAllDetailsPersonnelInfoDtoClient +{ + + + /// + /// نام کامل پرسنل + /// + public string EmployeeFullName { get; set; } + + + + /// + ///کد ملی + /// + public string NationalCode { get; set; } + + /// + /// شماره شناسنامه + /// + public string IdNumber { get; set; } + + /// + /// تاریخ تولد + /// + public string DateOfBirth { get; set; } + + /// + /// نام پدر + /// + public string FatherName { get; set; } + + /// + /// تعداد فرزندان + /// + public string NumberOfChildren { get; set; } + + /// + /// استان + /// + public string State { get; set; } + + /// + /// شهر + /// + public string City { get; set; } + + + public string Address { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/Employee/IEmployeeApplication.cs b/CompanyManagment.App.Contracts/Employee/IEmployeeApplication.cs index 9347332f..73314de0 100644 --- a/CompanyManagment.App.Contracts/Employee/IEmployeeApplication.cs +++ b/CompanyManagment.App.Contracts/Employee/IEmployeeApplication.cs @@ -124,6 +124,14 @@ public interface IEmployeeApplication /// Task> PrintAllEmployeesInfoClient(long workshopId); + + /// + /// پرینت گروهی تفکیکی پرسنل + /// + /// + /// + Task> PrintAllDetailsPersonnelInfoClient(long workshopId); + /// /// سلکت لیست پرسنل های کارگاه کلاینت /// diff --git a/CompanyManagment.Application/EmployeeAplication.cs b/CompanyManagment.Application/EmployeeAplication.cs index fdf7e950..decb579a 100644 --- a/CompanyManagment.Application/EmployeeAplication.cs +++ b/CompanyManagment.Application/EmployeeAplication.cs @@ -1744,6 +1744,11 @@ public class EmployeeAplication : RepositoryBase, IEmployeeAppli return await _EmployeeRepository.PrintAllEmployeesInfoClient(workshopId); } + public async Task> PrintAllDetailsPersonnelInfoClient(long workshopId) + { + return await _EmployeeRepository.PrintAllDetailsPersonnelInfoClient(workshopId); + } + public async Task> GetWorkingEmployeesSelectList(long workshopId) { return await _EmployeeRepository.GetWorkingEmployeesSelectList(workshopId); diff --git a/CompanyManagment.EFCore/Repository/EmployeeRepository .cs b/CompanyManagment.EFCore/Repository/EmployeeRepository .cs index fc08b209..e60c5398 100644 --- a/CompanyManagment.EFCore/Repository/EmployeeRepository .cs +++ b/CompanyManagment.EFCore/Repository/EmployeeRepository .cs @@ -1287,7 +1287,99 @@ public class EmployeeRepository : RepositoryBase, IEmployeeRepos && x.EmployeeStatusInWorkshop != EmployeeStatusInWorkshop.LefWorkTemp) .Select(x => new PrintAllEmployeesInfoDtoClient(x)).ToList(); } - + + public async Task> PrintAllDetailsPersonnelInfoClient(long workshopId) + { + var hasNotStoppedWorkingYet = Tools.GetUndefinedDateTime(); + + var baseQuery = await + ( + from personnelCode in _context.PersonnelCodeSet + join employee in _context.Employees + on personnelCode.EmployeeId equals employee.id + where personnelCode.WorkshopId == workshopId + select new + { + Employee = employee, + PersonnelCode = personnelCode + } + ).ToListAsync(); + + + var employeeIds = baseQuery.Select(x => x.Employee.id).ToList(); + + var leftWorks = await _context.LeftWorkList + .Where(x => x.WorkshopId == workshopId && employeeIds.Contains(x.EmployeeId)) + .ToListAsync(); + + var insuranceLeftWorks = await _context.LeftWorkInsuranceList + .Where(x => x.WorkshopId == workshopId && employeeIds.Contains(x.EmployeeId)) + .ToListAsync(); + + var children = await _context.EmployeeChildrenSet.Where(x => employeeIds.Contains(x.EmployeeId)).ToListAsync(); + + + + + var result = baseQuery.Select(x => + { + var left = leftWorks + .Where(l => l.EmployeeId == x.Employee.id) + .MaxBy(l => l.StartWorkDate); + + var insuranceLeftWork = insuranceLeftWorks + .Where(l => l.EmployeeId == x.Employee.id).MaxBy(l => l.StartWorkDate); + + + var contractLeft = left != null + ? left.LeftWorkDate != hasNotStoppedWorkingYet ? left.LeftWorkDate.ToFarsi() : "" + : ""; + + + var insuranceLeft = insuranceLeftWork != null + ? insuranceLeftWork.LeftWorkDate != null ? insuranceLeftWork.LeftWorkDate.ToFarsi() : "" + : ""; + int personnelCode = Convert.ToInt32($"{x.PersonnelCode.PersonnelCode}"); + + int numberOfChildren = children.Count(ch => ch.EmployeeId == x.Employee.id); + + bool employeeHasLeft = + (!string.IsNullOrWhiteSpace(insuranceLeft) && !string.IsNullOrWhiteSpace(contractLeft)) + || (left == null && !string.IsNullOrWhiteSpace(insuranceLeft)) + || (insuranceLeftWork == null && !string.IsNullOrWhiteSpace(contractLeft)); + + return new + { + EmployeeFullName = x.Employee.FullName, + PersonnelCode = personnelCode, + NationalCode = x.Employee.NationalCode, + IdNumber = x.Employee.IdNumber, + DateOfBirth = x.Employee.DateOfBirth.ToFarsi(), + FatherName = x.Employee.FatherName, + NumberOfChildren = $"{numberOfChildren}", + Black = employeeHasLeft, + State = x.Employee.State, + City = x.Employee.City, + Address = x.Employee.Address + }; + }).OrderBy(x => x.Black ? 1 : 0).ThenBy(x => x.PersonnelCode).ToList(); + + return result.Select(x => new PrintAllDetailsPersonnelInfoDtoClient + { + EmployeeFullName = x.EmployeeFullName, + NationalCode = x.NationalCode, + IdNumber = x.IdNumber, + FatherName = x.FatherName, + DateOfBirth = x.DateOfBirth, + NumberOfChildren = x.NumberOfChildren, + State = x.State, + City = x.City, + Address = x.Address + + }).ToList(); + + } + public async Task> GetWorkingEmployeesSelectList(long workshopId) { var hasNotStoppedWorkingYet = Tools.GetUndefinedDateTime(); diff --git a/ServiceHost/Areas/Client/Controllers/EmployeeController.cs b/ServiceHost/Areas/Client/Controllers/EmployeeController.cs index 1ed78e45..effd7e1e 100644 --- a/ServiceHost/Areas/Client/Controllers/EmployeeController.cs +++ b/ServiceHost/Areas/Client/Controllers/EmployeeController.cs @@ -52,6 +52,16 @@ public class EmployeeController:ClientBaseController var result = await _employeeApplication.PrintAllEmployeesInfoClient(_workshopId); return result; } - + + /// + /// پرینت گروهی تفکیکی پرسنل + /// + /// + [HttpGet("PrintAllDetailsPersonnelInfo")] + public async Task> PrintAllDetailsPersonnelInfoClient() + { + var result = await _employeeApplication.PrintAllDetailsPersonnelInfoClient(_workshopId); + return result; + } } \ No newline at end of file From 0a7d80c2fe7dc86156a71087bf4309f7ac7ad192 Mon Sep 17 00:00:00 2001 From: SamSys Date: Mon, 29 Dec 2025 19:24:53 +0330 Subject: [PATCH 2/2] CreateEmployeeTemp for client completed --- .../DTO/CreateLeftWorkTempDtoClient.cs | 26 ++++ .../DTO/GetLeftWorkTempDayOfWeekDtoClient.cs | 25 ++++ .../LeftWorkTemp/ILeftWorkTempApplication.cs | 28 +++- .../LeftWorkTempApplication.cs | 120 +++++++++++++++++- .../Client/Controllers/EmployeeController.cs | 30 ++++- 5 files changed, 220 insertions(+), 9 deletions(-) create mode 100644 CompanyManagment.App.Contracts/Employee/DTO/CreateLeftWorkTempDtoClient.cs create mode 100644 CompanyManagment.App.Contracts/Employee/DTO/GetLeftWorkTempDayOfWeekDtoClient.cs diff --git a/CompanyManagment.App.Contracts/Employee/DTO/CreateLeftWorkTempDtoClient.cs b/CompanyManagment.App.Contracts/Employee/DTO/CreateLeftWorkTempDtoClient.cs new file mode 100644 index 00000000..6f2158fd --- /dev/null +++ b/CompanyManagment.App.Contracts/Employee/DTO/CreateLeftWorkTempDtoClient.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace CompanyManagment.App.Contracts.Employee.DTO; + +/// +/// ایجاد ترک کار از کلاینت +/// api +/// +public class CreateLeftWorkTempDtoClient +{ + /// + /// آی دی پرسنل + /// + public long EmployeeId { get; set; } + + + /// + /// تاریخ ترک کار + /// + public string LeftWorkTime { get; set; } + + /// + /// تاریخ آخرین روز کاری + /// + public string LastDayStanding { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/Employee/DTO/GetLeftWorkTempDayOfWeekDtoClient.cs b/CompanyManagment.App.Contracts/Employee/DTO/GetLeftWorkTempDayOfWeekDtoClient.cs new file mode 100644 index 00000000..7bfaa592 --- /dev/null +++ b/CompanyManagment.App.Contracts/Employee/DTO/GetLeftWorkTempDayOfWeekDtoClient.cs @@ -0,0 +1,25 @@ +namespace CompanyManagment.App.Contracts.Employee.DTO; + +public class GetLeftWorkTempDayOfWeekDtoClient +{ + /// + /// تاریخ ترک کار + /// + public string LeftWorkTime { get; set; } + + /// + /// آخرین روز کاری + /// + public string LastDayStanding { get; set; } + + + /// + /// روز هفته ترک کار + /// + public string LeftWorkTimeDayOfWeek { get; set; } + + /// + /// روز هفته اخرین روز کاری + /// + public string LastDayStandingDayOfWeek { get; set; } +} diff --git a/CompanyManagment.App.Contracts/LeftWorkTemp/ILeftWorkTempApplication.cs b/CompanyManagment.App.Contracts/LeftWorkTemp/ILeftWorkTempApplication.cs index 4bb83c56..457e28d2 100644 --- a/CompanyManagment.App.Contracts/LeftWorkTemp/ILeftWorkTempApplication.cs +++ b/CompanyManagment.App.Contracts/LeftWorkTemp/ILeftWorkTempApplication.cs @@ -1,8 +1,9 @@ -using System; +using _0_Framework.Application; +using CompanyManagment.App.Contracts.Employee.DTO; +using CompanyManagment.App.Contracts.LeftWork; +using System; using System.Collections.Generic; using System.Threading.Tasks; -using _0_Framework.Application; -using CompanyManagment.App.Contracts.LeftWork; namespace CompanyManagment.App.Contracts.LeftWorkTemp; @@ -36,6 +37,27 @@ public interface ILeftWorkTempApplication List GetLeftWorksByWorkshopId(long workshopId); + + #region ForApi + + /// + /// ایجاد ترک کار از کلاینت + /// + /// + /// + /// + Task CreateLeftWorkTempClient(CreateLeftWorkTempDtoClient command, long workshopId); + + /// + /// دریافت روز هفته برای ترک کار و اخرین روز کاری + /// + /// + /// + /// + Task GetLeftWorkTempDayOfWeekDtoClient(string leftWorkTime, + string lastDayStanding); + + #endregion } public class LeftWorkTempViewModel diff --git a/CompanyManagment.Application/LeftWorkTempApplication.cs b/CompanyManagment.Application/LeftWorkTempApplication.cs index 75a27a98..8ee0115e 100644 --- a/CompanyManagment.Application/LeftWorkTempApplication.cs +++ b/CompanyManagment.Application/LeftWorkTempApplication.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using _0_Framework.Application; +using _0_Framework.Application; using _0_Framework_b.Application; using Company.Domain.CheckoutAgg; using Company.Domain.ContractAgg; @@ -15,11 +11,17 @@ using Company.Domain.RollCallEmployeeStatusAgg; using Company.Domain.WorkshopAgg; using CompanyManagment.App.Contracts.Checkout; using CompanyManagment.App.Contracts.Contract; +using CompanyManagment.App.Contracts.Employee.DTO; using CompanyManagment.App.Contracts.LeftWork; using CompanyManagment.App.Contracts.LeftWorkTemp; using CompanyManagment.App.Contracts.ReportClient; using CompanyManagment.App.Contracts.RollCallEmployee; using CompanyManagment.EFCore.Migrations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using PersianTools.Core; using OperationResult = _0_Framework.Application.OperationResult; using Tools = _0_Framework.Application.Tools; @@ -329,4 +331,112 @@ public class LeftWorkTempApplication : ILeftWorkTempApplication } + + + + #region ForApi + + public async Task CreateLeftWorkTempClient(CreateLeftWorkTempDtoClient command, long workshopId) + { + var op = new OperationResult(); + + #region Validation + + if (_leftWorkTempRepository.Exists(x => x.WorkshopId == workshopId && x.EmployeeId == command.EmployeeId)) + { + return op.Failed("برای پرسنل وارد شده قبلا درخواست ترک کار ثبت کرده اید"); + } + + if (command.LeftWorkTime.TryToGeorgianDateTime(out var leftWorkDateGr) == false) + { + return op.Failed("تاریخ شروع به کار وارد شده نامعتبر است"); + } + + if (command.LastDayStanding.TryToGeorgianDateTime(out var lastDayStandingDateGr) == false) + { + return op.Failed("تاریخ شروع به کار وارد شده نامعتبر است"); + } + + var leftWork = await _leftWorkRepository.GetLastLeftWork(command.EmployeeId, workshopId); + + if (lastDayStandingDateGr.AddDays(1).Date != leftWorkDateGr) + { + return op.Failed("تاریخ آخرین روز کاری با تاریخ ترک کار یک روز اختلاف ندارند"); + } + + if (leftWork == null) + { + return op.Failed("شروع به کار پرسنل یافت نشد"); + } + + if (leftWork.HasLeft) + { + return op.Failed("پرسنل وارد شده قبلا ترک کار ثبت شده است"); + } + + if (leftWork.StartWorkDate > lastDayStandingDateGr) + { + return op.Failed("تاریخ ثبت شده قبل از شروع به کار است"); + } + + if (leftWork.WorkshopId != workshopId || leftWork.EmployeeId != command.EmployeeId) + { + return op.Failed("اطلاعات وارد شده نامعتبر است"); + } + + var leftWorkTemp = LeftWorkTemp.CreateLeftWork(leftWork.id, leftWork.StartWorkDate, leftWorkDateGr, + lastDayStandingDateGr, + workshopId, command.EmployeeId, leftWork.JobId); + + await _leftWorkTempRepository.CreateAsync(leftWorkTemp); + await _leftWorkTempRepository.SaveChangesAsync(); + return op.Succcedded(); + #endregion + } + + + public async Task GetLeftWorkTempDayOfWeekDtoClient(string leftWorkTime, + string lastDayStanding) + { + var result = new GetLeftWorkTempDayOfWeekDtoClient(); + if (!string.IsNullOrWhiteSpace(leftWorkTime) && leftWorkTime.Length == 10) + { + if (leftWorkTime.TryToGeorgianDateTime(out var left) == false) + return result; + int year = Convert.ToInt32(leftWorkTime.Substring(0, 4)); + int month = Convert.ToInt32(leftWorkTime.Substring(5, 2)); + int day = Convert.ToInt32(leftWorkTime.Substring(8, 2)); + + var leftWorkTimePersian = new PersianDateTime(year, month, day); + + result.LeftWorkTime = leftWorkTime; + result.LeftWorkTimeDayOfWeek = leftWorkTimePersian.DayOfWeek; + + var lastDayStandingPersian = leftWorkTimePersian.AddDays(-1); + result.LastDayStanding = $"{lastDayStandingPersian}"; + result.LastDayStandingDayOfWeek = lastDayStandingPersian.DayOfWeek; + } + else if(!string.IsNullOrWhiteSpace(lastDayStanding) && lastDayStanding.Length == 10) + { + if (lastDayStanding.TryToGeorgianDateTime(out var lastDay) == false) + return result; + int year = Convert.ToInt32(lastDayStanding.Substring(0, 4)); + int month = Convert.ToInt32(lastDayStanding.Substring(5, 2)); + int day = Convert.ToInt32(lastDayStanding.Substring(8, 2)); + + var lastDayStandingPersian = new PersianDateTime(year, month, day); + + result.LastDayStanding = lastDayStanding; + result.LastDayStandingDayOfWeek = lastDayStandingPersian.DayOfWeek; + + + var leftWorkTimePersian = lastDayStandingPersian.AddDays(1); + result.LeftWorkTime = $"{leftWorkTimePersian}"; + result.LeftWorkTimeDayOfWeek = leftWorkTimePersian.DayOfWeek; + + } + + return result; + } + #endregion } \ No newline at end of file diff --git a/ServiceHost/Areas/Client/Controllers/EmployeeController.cs b/ServiceHost/Areas/Client/Controllers/EmployeeController.cs index effd7e1e..ac536b1b 100644 --- a/ServiceHost/Areas/Client/Controllers/EmployeeController.cs +++ b/ServiceHost/Areas/Client/Controllers/EmployeeController.cs @@ -1,6 +1,7 @@ using _0_Framework.Application; using CompanyManagment.App.Contracts.Employee; using CompanyManagment.App.Contracts.Employee.DTO; +using CompanyManagment.App.Contracts.LeftWorkTemp; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; @@ -9,11 +10,13 @@ namespace ServiceHost.Areas.Client.Controllers; public class EmployeeController:ClientBaseController { private readonly IEmployeeApplication _employeeApplication; + private readonly ILeftWorkTempApplication _leftWorkTempApplication; private readonly long _workshopId; - public EmployeeController(IEmployeeApplication employeeApplication,IAuthHelper authHelper) + public EmployeeController(IEmployeeApplication employeeApplication,IAuthHelper authHelper, ILeftWorkTempApplication leftWorkTempApplication) { _employeeApplication = employeeApplication; + _leftWorkTempApplication = leftWorkTempApplication; _workshopId = authHelper.GetWorkshopId(); } @@ -64,4 +67,29 @@ public class EmployeeController:ClientBaseController return result; } + /// + /// اعلام ترک کار + /// + /// + /// + [HttpPost] + public async Task> CreateLeftWorkTempClient([FromBody] CreateLeftWorkTempDtoClient command) + { + var result = await _leftWorkTempApplication.CreateLeftWorkTempClient(command, _workshopId); + return result; + } + + + /// + /// دریافت روز هفته برای ترک کار و اخرین روز کاری + /// + /// + [HttpGet("GetDayOfWeek")] + public async Task GetLeftWorkTempDayOfWeekDtoClient(string leftWorkTime, + string lastDayStanding) + { + var result = await _leftWorkTempApplication.GetLeftWorkTempDayOfWeekDtoClient(leftWorkTime,lastDayStanding); + return result; + } + } \ No newline at end of file