From 7b9e7881c64c7727ce5729458044242fc051804b Mon Sep 17 00:00:00 2001 From: mahan Date: Mon, 3 Nov 2025 14:45:41 +0330 Subject: [PATCH 1/9] feat: add commented-out method for retrieving contract list for client --- Company.Domain/ContractAgg/IContractRepository.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Company.Domain/ContractAgg/IContractRepository.cs b/Company.Domain/ContractAgg/IContractRepository.cs index 3d6ea269..109d3a6a 100644 --- a/Company.Domain/ContractAgg/IContractRepository.cs +++ b/Company.Domain/ContractAgg/IContractRepository.cs @@ -48,6 +48,9 @@ public interface IContractRepository : IRepository bool Remove(long id); List SearchForClient(ContractSearchModel searchModel); + + //Task> GetContractListForClient(ContractClientSearchModel searchModel); + #endregion #region NewChangeByHeydari From e124a4d5d90edc8b0c83d78fbab348dfa6b66040 Mon Sep 17 00:00:00 2001 From: mahan Date: Mon, 3 Nov 2025 17:43:50 +0330 Subject: [PATCH 2/9] feat: implement method to retrieve paginated contract list for client with filtering options --- .../ContractAgg/IContractRepository.cs | 34 +++++- .../Repository/ContractRepository.cs | 104 ++++++++++++++++++ 2 files changed, 137 insertions(+), 1 deletion(-) diff --git a/Company.Domain/ContractAgg/IContractRepository.cs b/Company.Domain/ContractAgg/IContractRepository.cs index 109d3a6a..4edc80fe 100644 --- a/Company.Domain/ContractAgg/IContractRepository.cs +++ b/Company.Domain/ContractAgg/IContractRepository.cs @@ -49,7 +49,7 @@ public interface IContractRepository : IRepository List SearchForClient(ContractSearchModel searchModel); - //Task> GetContractListForClient(ContractClientSearchModel searchModel); + Task> GetContractListForClient(GetContractListForClientRequest searchModel); #endregion #region NewChangeByHeydari @@ -66,4 +66,36 @@ public interface IContractRepository : IRepository ContractViweModel GetByWorkshopIdEmployeeIdInDates(long workshopId, long employeeId, DateTime startOfMonth, DateTime endOfMonth); List GetByWorkshopIdInDates(long workshopId, DateTime contractStart, DateTime contractEnd); #endregion +} + +public class GetContractListForClientResponse +{ + public long Id { get; set; } + public string PersonnelCode { get; set; } + public string ContractNo { get; set; } + public string EmployeeFullName { get; set; } + public string ContractStart { get; set; } + public string ContractEnd { get; set; } + public bool IsSigned { get; set; } +} + +public class GetContractListForClientRequest: PaginationRequest +{ + public int Year { get; set; } + public int Month { get; set; } + public string StartDate { get; set; } + public string EndDate { get; set; } + public long EmployeeId { get; set; } + public ContractListOrderType? OrderType { get; set; } +} + +public enum ContractListOrderType +{ + ByContractCreationDate, + BySignedContract, + ByUnSignedContract, + ByPersonnelCode, + ByPersonnelCodeDescending, + ByContractStartDate, + ByContractStartDateDescending } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/ContractRepository.cs b/CompanyManagment.EFCore/Repository/ContractRepository.cs index c9d82f10..0a563b28 100644 --- a/CompanyManagment.EFCore/Repository/ContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/ContractRepository.cs @@ -5,6 +5,7 @@ using System.Globalization; using System.Linq; using System.Threading.Tasks; using _0_Framework.Application; +using _0_Framework.Exceptions; using _0_Framework.InfraStructure; using Company.Domain.ContractAgg; using Company.Domain.empolyerAgg; @@ -1506,6 +1507,109 @@ public class ContractRepository : RepositoryBase, IContractRepos } + public async Task> GetContractListForClient(GetContractListForClientRequest searchModel) + { + var workshopId = _authHelper.GetWorkshopId(); + var query = _context.Contracts + .Where(c => c.WorkshopIds == workshopId); + + #region Search + + if (searchModel.EmployeeId > 0) + query = query.Where(x => x.EmployeeId == searchModel.EmployeeId); + if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && string.IsNullOrWhiteSpace(searchModel.EndDate)) + { + if (!searchModel.StartDate.TryToGeorgianDateTime(out var startDate)) + throw new BadRequestException("تاریخ شروع وارد شده معتبر نمی باشد."); + + if (!searchModel.EndDate.TryToGeorgianDateTime(out var endDate)) + throw new BadRequestException("تاریخ پایان وارد شده معتبر نمی باشد."); + + query = query.Where(x => x.ContarctStart <=endDate && x.ContractEnd >= startDate); + } + + if (searchModel.Year>0 && searchModel.Month >0) + { + + var startDateFa = $"{searchModel.Year:0000}/{searchModel.Month:00}/01"; + if (!startDateFa.TryToGeorgianDateTime(out var startDate)) + throw new BadRequestException("سال و ماه وارد شده معتبر نمی باشد."); + + if(!startDateFa.FindeEndOfMonth().TryToGeorgianDateTime(out var endDate)) + throw new BadRequestException("سال و ماه وارد شده معتبر نمی باشد."); + + query = query.Where(x => x.ContarctStart <=endDate && x.ContractEnd >= startDate); + } + + if (searchModel.OrderType != null) + { + switch (searchModel.OrderType) + { + case ContractListOrderType.ByContractCreationDate: + query = query.OrderBy(x => x.CreationDate); + break; + case ContractListOrderType.ByContractStartDate: + query = query.OrderBy(x => x.ContarctStart); + break; + case ContractListOrderType.ByContractStartDateDescending: + query = query.OrderByDescending(x=>x.ContarctStart); + break; + case ContractListOrderType.ByPersonnelCode: + query = query.OrderBy(x => x.PersonnelCode); + break; + case ContractListOrderType.ByPersonnelCodeDescending: + query = query.OrderByDescending(x => x.PersonnelCode); + break; + case ContractListOrderType.BySignedContract: + query = query.OrderByDescending(x => x.Signature == "1"); + break; + case ContractListOrderType.ByUnSignedContract: + query = query.OrderBy(x => x.Signature == "1"); + break; + } + } + else + { + query = query.OrderByDescending(x => x.id); + } + #endregion + + var pagedList =await query + .ApplyPagination(searchModel.PageIndex, searchModel.PageSize).ToListAsync(); + + var employeeIds = pagedList.Select(x => x.EmployeeId).ToList(); + + var employees = await _context.Employees + .Where(x => employeeIds.Contains(x.id)).Select(x => new + { + Id = x.id, + x.FullName + }).ToListAsync(); + + var result = new PagedResult + { + TotalCount = await query.CountAsync(), + List = pagedList.Select(c => + { + var employeeFullName = employees + .FirstOrDefault(e => e.Id == c.EmployeeId)?.FullName ?? ""; + + return new GetContractListForClientResponse + { + Id = c.id, + PersonnelCode = c.PersonnelCode.ToString(), + ContractStart = c.ContarctStart.ToFarsi(), + ContractEnd = c.ContractEnd.ToFarsi(), + ContractNo = c.ContractNo, + IsSigned = c.Signature == "1", + EmployeeFullName = employeeFullName + }; + }).ToList() + }; + + return result; + } + #endregion #region NewChangeByHeydari From 9cf8447a83bb16d41ccd2404e9b5fcbd32ab57e0 Mon Sep 17 00:00:00 2001 From: mahan Date: Mon, 3 Nov 2025 17:49:51 +0330 Subject: [PATCH 3/9] feat: add API for retrieving paginated contract list for client with filtering options --- .../ContractAgg/IContractRepository.cs | 29 ------------------- .../Contract/ContractListOrderType.cs | 12 ++++++++ .../GetContractListForClientRequest.cs | 13 +++++++++ .../GetContractListForClientResponse.cs | 12 ++++++++ .../Contract/IContractApplication.cs | 11 +++++++ .../ContractApplication.cs | 5 ++++ .../Client/Controllers/ContractController.cs | 27 +++++++++++++++++ 7 files changed, 80 insertions(+), 29 deletions(-) create mode 100644 CompanyManagment.App.Contracts/Contract/ContractListOrderType.cs create mode 100644 CompanyManagment.App.Contracts/Contract/GetContractListForClientRequest.cs create mode 100644 CompanyManagment.App.Contracts/Contract/GetContractListForClientResponse.cs create mode 100644 ServiceHost/Areas/Client/Controllers/ContractController.cs diff --git a/Company.Domain/ContractAgg/IContractRepository.cs b/Company.Domain/ContractAgg/IContractRepository.cs index 4edc80fe..fbffa304 100644 --- a/Company.Domain/ContractAgg/IContractRepository.cs +++ b/Company.Domain/ContractAgg/IContractRepository.cs @@ -68,34 +68,5 @@ public interface IContractRepository : IRepository #endregion } -public class GetContractListForClientResponse -{ - public long Id { get; set; } - public string PersonnelCode { get; set; } - public string ContractNo { get; set; } - public string EmployeeFullName { get; set; } - public string ContractStart { get; set; } - public string ContractEnd { get; set; } - public bool IsSigned { get; set; } -} -public class GetContractListForClientRequest: PaginationRequest -{ - public int Year { get; set; } - public int Month { get; set; } - public string StartDate { get; set; } - public string EndDate { get; set; } - public long EmployeeId { get; set; } - public ContractListOrderType? OrderType { get; set; } -} -public enum ContractListOrderType -{ - ByContractCreationDate, - BySignedContract, - ByUnSignedContract, - ByPersonnelCode, - ByPersonnelCodeDescending, - ByContractStartDate, - ByContractStartDateDescending -} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/Contract/ContractListOrderType.cs b/CompanyManagment.App.Contracts/Contract/ContractListOrderType.cs new file mode 100644 index 00000000..0fca1352 --- /dev/null +++ b/CompanyManagment.App.Contracts/Contract/ContractListOrderType.cs @@ -0,0 +1,12 @@ +namespace CompanyManagment.App.Contracts.Contract; + +public enum ContractListOrderType +{ + ByContractCreationDate, + BySignedContract, + ByUnSignedContract, + ByPersonnelCode, + ByPersonnelCodeDescending, + ByContractStartDate, + ByContractStartDateDescending +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/Contract/GetContractListForClientRequest.cs b/CompanyManagment.App.Contracts/Contract/GetContractListForClientRequest.cs new file mode 100644 index 00000000..060a5f08 --- /dev/null +++ b/CompanyManagment.App.Contracts/Contract/GetContractListForClientRequest.cs @@ -0,0 +1,13 @@ +using _0_Framework.Application; + +namespace CompanyManagment.App.Contracts.Contract; + +public class GetContractListForClientRequest: PaginationRequest +{ + public int Year { get; set; } + public int Month { get; set; } + public string StartDate { get; set; } + public string EndDate { get; set; } + public long EmployeeId { get; set; } + public ContractListOrderType? OrderType { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/Contract/GetContractListForClientResponse.cs b/CompanyManagment.App.Contracts/Contract/GetContractListForClientResponse.cs new file mode 100644 index 00000000..d7efa472 --- /dev/null +++ b/CompanyManagment.App.Contracts/Contract/GetContractListForClientResponse.cs @@ -0,0 +1,12 @@ +namespace CompanyManagment.App.Contracts.Contract; + +public class GetContractListForClientResponse +{ + public long Id { get; set; } + public string PersonnelCode { get; set; } + public string ContractNo { get; set; } + public string EmployeeFullName { get; set; } + public string ContractStart { get; set; } + public string ContractEnd { get; set; } + public bool IsSigned { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/Contract/IContractApplication.cs b/CompanyManagment.App.Contracts/Contract/IContractApplication.cs index 5048b564..8e17f094 100644 --- a/CompanyManagment.App.Contracts/Contract/IContractApplication.cs +++ b/CompanyManagment.App.Contracts/Contract/IContractApplication.cs @@ -45,7 +45,18 @@ public interface IContractApplication #region Client OperationResult Remove(long id); + + [Obsolete("این متد منسوخ شده است. لطفاً از متد GetContractListForClient استفاده کنید.")] List SearchForClient(ContractSearchModel searchModel); + + /// + /// لیست قراردادها برای کلاینت + /// + /// + /// + Task> + GetContractListForClient(GetContractListForClientRequest searchModel); + #endregion #region NewChangeByHeydari diff --git a/CompanyManagment.Application/ContractApplication.cs b/CompanyManagment.Application/ContractApplication.cs index 085616ea..b5936feb 100644 --- a/CompanyManagment.Application/ContractApplication.cs +++ b/CompanyManagment.Application/ContractApplication.cs @@ -3107,6 +3107,11 @@ public class ContractApplication : IContractApplication return _contractRepository.SearchForClient(searchModel); } + public async Task> GetContractListForClient(GetContractListForClientRequest searchModel) + { + return await _contractRepository.GetContractListForClient(searchModel); + } + #endregion #region NewChangeByHeydari diff --git a/ServiceHost/Areas/Client/Controllers/ContractController.cs b/ServiceHost/Areas/Client/Controllers/ContractController.cs new file mode 100644 index 00000000..95d24437 --- /dev/null +++ b/ServiceHost/Areas/Client/Controllers/ContractController.cs @@ -0,0 +1,27 @@ +using _0_Framework.Application; +using Company.Domain.ContractAgg; +using CompanyManagment.App.Contracts.Contract; +using Microsoft.AspNetCore.Mvc; +using ServiceHost.BaseControllers; + +namespace ServiceHost.Areas.Client.Controllers; + +public class ContractController:ClientBaseController +{ + private readonly IContractApplication _contractApplication; + + public ContractController(IContractApplication contractApplication) + { + _contractApplication = contractApplication; + } + + [HttpGet] + public async Task>> GetList( + GetContractListForClientRequest searchModel) + { + var res = await _contractApplication + .GetContractListForClient(searchModel); + + return res; + } +} \ No newline at end of file From 8436f70aa0a40252c730980f3f39bb9f84c64627 Mon Sep 17 00:00:00 2001 From: mahan Date: Tue, 11 Nov 2025 19:26:45 +0330 Subject: [PATCH 4/9] Refactor and enhance contract handling logic - Added `DailyWage`, `AvgWorkingHour`, and `FamilyAllowance` properties to `GetContractListForClientResponse`. - Refactored `WorkingHoursWeekly` conversion logic by introducing a reusable `WeeklyHourConvertor` method in `ContractRepository`. - Updated query result mapping to include new properties and utilize `WeeklyHourConvertor` for `AvgWorkingHour`. - Improved code readability and maintainability by centralizing repetitive logic. --- .../GetContractListForClientResponse.cs | 3 + .../Repository/ContractRepository.cs | 61 +++++++++++-------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/CompanyManagment.App.Contracts/Contract/GetContractListForClientResponse.cs b/CompanyManagment.App.Contracts/Contract/GetContractListForClientResponse.cs index d7efa472..58e21ad9 100644 --- a/CompanyManagment.App.Contracts/Contract/GetContractListForClientResponse.cs +++ b/CompanyManagment.App.Contracts/Contract/GetContractListForClientResponse.cs @@ -9,4 +9,7 @@ public class GetContractListForClientResponse public string ContractStart { get; set; } public string ContractEnd { get; set; } public bool IsSigned { get; set; } + public string DailyWage { get; set; } + public string AvgWorkingHour { get; set; } + public string FamilyAllowance { get; set; } } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/ContractRepository.cs b/CompanyManagment.EFCore/Repository/ContractRepository.cs index 0a563b28..a998860b 100644 --- a/CompanyManagment.EFCore/Repository/ContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/ContractRepository.cs @@ -1082,30 +1082,7 @@ public class ContractRepository : RepositoryBase, IContractRepos var weeklyDouble = 0.0; var weekly = c.WorkingHoursWeekly; - if (!string.IsNullOrWhiteSpace(weekly) && - weekly != "24 - 12" && weekly != "24 - 24" && weekly != "36 - 12" && weekly != "48 - 24") - { - if (weekly.Contains("/")) - { - weeklyDouble = double.Parse(weekly); - var minute = (int)((weeklyDouble % 1) * 60); - var hour = (int)(weeklyDouble); - c.WorkingHoursWeekly = hour + " " + "ساعت و" + " " + minute + " " + "دقیقه"; - } - else if (weekly.Contains(".")) - { - weeklyDouble = double.Parse(weekly, CultureInfo.InvariantCulture); - var minute = (int)((weeklyDouble % 1) * 60); - var hour = (int)(weeklyDouble); - c.WorkingHoursWeekly = hour + " " + "ساعت و" + " " + minute + " " + "دقیقه"; - } - else - { - c.WorkingHoursWeekly = c.WorkingHoursWeekly + " " + "ساعت"; - } - - - } + c.WorkingHoursWeekly = WeeklyHourConvertor(weekly); var emp = workshopEmpList.Where(x => x.WorkshopId == c.WorkshopIds) .Select(x => x.EmployerId).ToList(); c.Employers = _employerRepository.GetEmployers(emp); @@ -1162,6 +1139,37 @@ public class ContractRepository : RepositoryBase, IContractRepos return query; } + private static string WeeklyHourConvertor(string weekly) + { + double weeklyDouble; + if (!string.IsNullOrWhiteSpace(weekly) && + weekly != "24 - 12" && weekly != "24 - 24" && weekly != "36 - 12" && weekly != "48 - 24") + { + if (weekly.Contains("/")) + { + weeklyDouble = double.Parse(weekly); + var minute = (int)((weeklyDouble % 1) * 60); + var hour = (int)(weeklyDouble); + return hour + " " + "ساعت و" + " " + minute + " " + "دقیقه"; + } + else if (weekly.Contains(".")) + { + weeklyDouble = double.Parse(weekly, CultureInfo.InvariantCulture); + var minute = (int)((weeklyDouble % 1) * 60); + var hour = (int)(weeklyDouble); + return hour + " " + "ساعت و" + " " + minute + " " + "دقیقه"; + } + else + { + return weekly + " " + "ساعت"; + } + + + } + + return ""; + } + public IQueryable GetWorkshopEmployer() { return _context.WorkshopEmployers.Select(x => new WorkshopEmployerViewModel @@ -1602,7 +1610,10 @@ public class ContractRepository : RepositoryBase, IContractRepos ContractEnd = c.ContractEnd.ToFarsi(), ContractNo = c.ContractNo, IsSigned = c.Signature == "1", - EmployeeFullName = employeeFullName + EmployeeFullName = employeeFullName, + AvgWorkingHour = WeeklyHourConvertor(c.WorkingHoursWeekly), + DailyWage = c.DayliWage, + FamilyAllowance = c.FamilyAllowance }; }).ToList() }; From 0fbd5c9d3ec3277c35246c6aaf7843d07918fe6c Mon Sep 17 00:00:00 2001 From: mahan Date: Tue, 11 Nov 2025 19:29:51 +0330 Subject: [PATCH 5/9] Add print methods and ContractPrintViewModel class Updated the `IContractApplication` interface: - Added `PrintOneAsync(long id)` and `PrintAllAsync(List ids)` methods. - Corrected formatting of `DeleteAllContarcts(List ids)`. - Grouped changes under the `NewChangeByHeydari` region. Introduced the `ContractPrintViewModel` class (currently empty). Implemented `PrintOneAsync` and `PrintAllAsync` in `ContractApplication` with `NotImplementedException`. These changes prepare the codebase for contract printing functionality. --- .../Contract/IContractApplication.cs | 14 ++++++++++---- .../ContractApplication.cs | 10 ++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CompanyManagment.App.Contracts/Contract/IContractApplication.cs b/CompanyManagment.App.Contracts/Contract/IContractApplication.cs index 8e17f094..b6038104 100644 --- a/CompanyManagment.App.Contracts/Contract/IContractApplication.cs +++ b/CompanyManagment.App.Contracts/Contract/IContractApplication.cs @@ -56,16 +56,22 @@ public interface IContractApplication /// Task> GetContractListForClient(GetContractListForClientRequest searchModel); - - #endregion + Task PrintOneAsync(long id); + Task> PrintAllAsync(List ids); - #region NewChangeByHeydari + #endregion - OperationResult DeleteAllContarcts(List ids); + #region NewChangeByHeydari + + OperationResult DeleteAllContarcts(List ids); OperationResult DeleteContarcts(long id); List CheckHasCheckout(List ids); List CheckHasSignature(List ids); List SearchForMainContract(ContractSearchModel searchModel); #endregion +} + +public class ContractPrintViewModel +{ } \ No newline at end of file diff --git a/CompanyManagment.Application/ContractApplication.cs b/CompanyManagment.Application/ContractApplication.cs index b5936feb..48acc0bf 100644 --- a/CompanyManagment.Application/ContractApplication.cs +++ b/CompanyManagment.Application/ContractApplication.cs @@ -3112,6 +3112,16 @@ public class ContractApplication : IContractApplication return await _contractRepository.GetContractListForClient(searchModel); } + public Task PrintOneAsync(long id) + { + throw new NotImplementedException(); + } + + public Task> PrintAllAsync(List ids) + { + throw new NotImplementedException(); + } + #endregion #region NewChangeByHeydari From b0d174a575181ebb4ffc71ca981b37cbbfdaed80 Mon Sep 17 00:00:00 2001 From: mahan Date: Sat, 20 Dec 2025 13:04:30 +0330 Subject: [PATCH 6/9] feat: implement contract printing methods and view models --- .../ContractAgg/IContractRepository.cs | 2 + .../Contract/IContractApplication.cs | 69 +++++++++++++++++++ .../ContractApplication.cs | 8 +-- .../Repository/ContractRepository.cs | 16 +++++ 4 files changed, 91 insertions(+), 4 deletions(-) diff --git a/Company.Domain/ContractAgg/IContractRepository.cs b/Company.Domain/ContractAgg/IContractRepository.cs index fbffa304..585d9e13 100644 --- a/Company.Domain/ContractAgg/IContractRepository.cs +++ b/Company.Domain/ContractAgg/IContractRepository.cs @@ -51,6 +51,7 @@ public interface IContractRepository : IRepository Task> GetContractListForClient(GetContractListForClientRequest searchModel); + Task> PrintAllAsync(List ids); #endregion #region NewChangeByHeydari @@ -66,6 +67,7 @@ public interface IContractRepository : IRepository ContractViweModel GetByWorkshopIdEmployeeIdInDates(long workshopId, long employeeId, DateTime startOfMonth, DateTime endOfMonth); List GetByWorkshopIdInDates(long workshopId, DateTime contractStart, DateTime contractEnd); #endregion + } diff --git a/CompanyManagment.App.Contracts/Contract/IContractApplication.cs b/CompanyManagment.App.Contracts/Contract/IContractApplication.cs index b6038104..38c2fc2b 100644 --- a/CompanyManagment.App.Contracts/Contract/IContractApplication.cs +++ b/CompanyManagment.App.Contracts/Contract/IContractApplication.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using _0_Framework.Application; using CompanyManagment.App.Contracts.Workshop; using System.Threading.Tasks; +using _0_Framework.Application.Enums; + namespace CompanyManagment.App.Contracts.Contract; public interface IContractApplication @@ -74,4 +76,71 @@ public interface IContractApplication public class ContractPrintViewModel { + public string ContractNo { get; set; } + public ContractPrintEmployerViewModel Employer { get; set; } + public ContractPrintEmployeeViewModel Employee { get; set; } + public ContractPrintTypeOfContractViewModel TypeOfContract { get; set; } + public ContractPrintFeesViewModel Fees { get; set; } + public string ConditionAndDetials { get; set; } + + +} + +public class ContractPrintFeesViewModel +{ + public string DailyWage { get; set; } + public string FamilyAllowance { get; set; } + public string ConsumableItems { get; set; } + public string HousingAllowance { get; set; } +} + +public class ContractPrintTypeOfContractViewModel +{ + public string ContractType { get; set; } + public string JobName { get; set; } + public string SetContractDate { get; set; } + public string ContarctStart { get; set; } + public string ContractEnd { get; set; } + public string WorkingHoursWeekly { get; set; } + public List WorkshopAddress { get; set; } + + + +} + +public class ContractPrintEmployeeViewModel +{ + public string FullName { get; set; } + public string NationalCode { get; set; } + public string IdNumber { get; set; } + public string DateOfBirth { get; set; } + public string FatherName { get; set; } + public string LevelOfEducation { get; set; } + public string Address { get; set; } + + +} + +public class ContractPrintEmployerViewModel +{ + public LegalType LegalType { get; set; } + public ContractPrintRealEmployerViewModel RealEmployer { get; set; } + public ContractPrintLegalEmployerViewModel LegalEmployer { get; set; } + public string WorkshopName { get; set; } + public string Address { get; set; } + +} + +public class ContractPrintLegalEmployerViewModel +{ + public string CompanyName { get; set; } + public string NationalId { get; set; } + public string RegisterId { get; set; } +} + +public class ContractPrintRealEmployerViewModel +{ + public string FullName { get; set; } + public string NationalCode { get; set; } + public string IdNumber { get; set; } } \ No newline at end of file diff --git a/CompanyManagment.Application/ContractApplication.cs b/CompanyManagment.Application/ContractApplication.cs index 48acc0bf..4229d01e 100644 --- a/CompanyManagment.Application/ContractApplication.cs +++ b/CompanyManagment.Application/ContractApplication.cs @@ -3112,14 +3112,14 @@ public class ContractApplication : IContractApplication return await _contractRepository.GetContractListForClient(searchModel); } - public Task PrintOneAsync(long id) + public async Task PrintOneAsync(long id) { - throw new NotImplementedException(); + return (await _contractRepository.PrintAllAsync([id])).FirstOrDefault(); } - public Task> PrintAllAsync(List ids) + public async Task> PrintAllAsync(List ids) { - throw new NotImplementedException(); + return await _contractRepository.PrintAllAsync(ids); } #endregion diff --git a/CompanyManagment.EFCore/Repository/ContractRepository.cs b/CompanyManagment.EFCore/Repository/ContractRepository.cs index a998860b..66991e45 100644 --- a/CompanyManagment.EFCore/Repository/ContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/ContractRepository.cs @@ -1621,6 +1621,22 @@ public class ContractRepository : RepositoryBase, IContractRepos return result; } + public async Task> PrintAllAsync(List ids) + { + var query =await _context.Contracts.Include(x => x.Employer) + .Include(x => x.Employee).Where(x => ids.Contains(x.id)) + .ToListAsync(); + + var res = query.Select(x=> + { + var employer = + return new ContractPrintViewModel() + { + Employer = + }; + }) + } + #endregion #region NewChangeByHeydari From 20c00893b6916d528d92001bb0e542daea0921ad Mon Sep 17 00:00:00 2001 From: mahan Date: Sat, 20 Dec 2025 14:23:23 +0330 Subject: [PATCH 7/9] feat: add API endpoint for printing contract details and enhance contract print logic --- .../ContractApplication.cs | 2 + .../Repository/ContractRepository.cs | 75 ++++++++++++++++++- .../Client/Controllers/ContractController.cs | 7 ++ 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/CompanyManagment.Application/ContractApplication.cs b/CompanyManagment.Application/ContractApplication.cs index 4229d01e..c8ed4524 100644 --- a/CompanyManagment.Application/ContractApplication.cs +++ b/CompanyManagment.Application/ContractApplication.cs @@ -2712,7 +2712,9 @@ public class ContractApplication : IContractApplication var emp = workshopEmpList.Where(x => x.WorkshopId == res.WorkshopIds) .Select(x => x.EmployerId).ToList(); + res.Employers = _employerRepository.GetEmployers(emp); + var workshopSelect = _workshopApplication.GetDetails(res.WorkshopIds); var workshop = new WorkshopViewModel() { diff --git a/CompanyManagment.EFCore/Repository/ContractRepository.cs b/CompanyManagment.EFCore/Repository/ContractRepository.cs index 66991e45..08a8a43f 100644 --- a/CompanyManagment.EFCore/Repository/ContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/ContractRepository.cs @@ -5,6 +5,7 @@ using System.Globalization; using System.Linq; using System.Threading.Tasks; using _0_Framework.Application; +using _0_Framework.Application.Enums; using _0_Framework.Exceptions; using _0_Framework.InfraStructure; using Company.Domain.ContractAgg; @@ -1627,14 +1628,80 @@ public class ContractRepository : RepositoryBase, IContractRepos .Include(x => x.Employee).Where(x => ids.Contains(x.id)) .ToListAsync(); - var res = query.Select(x=> + var workshopIds = query.Select(x => x.WorkshopIds).Distinct().ToList(); + + var workshops = await _context.Workshops + .Where(x => workshopIds.Contains(x.id)) + .ToListAsync(); + + List exceptionWorkshops = [516,63,38,39]; + var res = query.Select(x => { - var employer = + var workshop = workshops.FirstOrDefault(w => w.id == x.WorkshopIds); + + var employerRes = new ContractPrintEmployerViewModel() + { + WorkshopName = workshop!.WorkshopName, + Address =$"{workshop.State} - {workshop.City} - {workshop.Address}", + LegalType = x.Employer.IsLegal == "حقیقی" ? LegalType.Real : LegalType.Legal, + LegalEmployer = x.Employer.IsLegal == "حقیقی" + ? null + : new ContractPrintLegalEmployerViewModel() + { + NationalId = x.Employer.NationalId, + RegisterId = x.Employer.RegisterId, + CompanyName = x.Employer.LName, + }, + RealEmployer = x.Employer.IsLegal == "حقیقی" + ? new ContractPrintRealEmployerViewModel() + { + FullName = x.Employer.FullName, + IdNumber = x.Employer.IdNumber, + NationalCode = x.Employer.Nationalcode + } + : null, + + }; + var employeeRes = new ContractPrintEmployeeViewModel() + { + Address =$"{x.Employee.State} - {x.Employee.City} - {x.Employee.Address}" , + FullName = x.Employee.FullName, + IdNumber = x.Employee.IdNumber, + NationalCode = x.Employee.NationalCode, + DateOfBirth = x.Employee.DateOfBirth.ToFarsi(), + FatherName = x.Employee.FatherName, + LevelOfEducation = x.Employee.LevelOfEducation + }; + + var typeOfContract = new ContractPrintTypeOfContractViewModel() + { + ContarctStart = x.ContarctStart.ToFarsi(), + ContractEnd = x.ContractEnd.ToFarsi(), + JobName = x.JobType, + ContractType = x.ContractType, + SetContractDate = x.SetContractDate.ToFarsi(), + WorkingHoursWeekly = WeeklyHourConvertor(x.WorkingHoursWeekly), + WorkshopAddress = [x.WorkshopAddress1, x.WorkshopAddress2], + }; + ContractPrintFeesViewModel fees= new ContractPrintFeesViewModel() + { + DailyWage = x.DayliWage, + FamilyAllowance = x.FamilyAllowance, + HousingAllowance = x.HousingAllowance, + ConsumableItems = x.ConsumableItems, + }; return new ContractPrintViewModel() { - Employer = + Employer = employerRes, + Employee = employeeRes, + TypeOfContract = typeOfContract, + Fees = fees, + ContractNo = x.ContractNo, + ConditionAndDetials = exceptionWorkshops.Contains(x.WorkshopIds) ? "بر اساس ماده 190 قانون کار جمهوری اسلامی ایران ، پرسنل اقرار مینماید کلیه مبالغ پیش بینی شده در قانون کار را وفق قرارداد منعقده دریافت مینماید. این مبالغ قسمتی بصورت مستقیم از سوی کارفرما و قسمتی بر اساس شرایط کارگاه از محل درآمد حاصله از مشتری اخذ میگردد . با توجه به شرایط کارگاه کلیه مبالغ بصورت واریز به حساب و وجه نقد رایج کشور ، تواما به پرسنل پرداخت میگردد. امضا تصفیه حساب دارای مبالغ ، توسط پرسنل نشانگر تصفیه قطعی ایشان میباشد.": "", + }; - }) + }).ToList(); + return res; } #endregion diff --git a/ServiceHost/Areas/Client/Controllers/ContractController.cs b/ServiceHost/Areas/Client/Controllers/ContractController.cs index 95d24437..523289e1 100644 --- a/ServiceHost/Areas/Client/Controllers/ContractController.cs +++ b/ServiceHost/Areas/Client/Controllers/ContractController.cs @@ -24,4 +24,11 @@ public class ContractController:ClientBaseController return res; } + [HttpGet("print/{id}")] + public async Task> PrintOne(long id) + { + var res = await _contractApplication.PrintOneAsync(id); + return res; + } + } \ No newline at end of file From 0dd2dc7c43d4e1860b01d06ab82e399c7561688f Mon Sep 17 00:00:00 2001 From: mahan Date: Sat, 20 Dec 2025 15:21:34 +0330 Subject: [PATCH 8/9] add workshopCode on client contract print --- CompanyManagment.App.Contracts/Contract/IContractApplication.cs | 1 + CompanyManagment.EFCore/Repository/ContractRepository.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/CompanyManagment.App.Contracts/Contract/IContractApplication.cs b/CompanyManagment.App.Contracts/Contract/IContractApplication.cs index 38c2fc2b..c2f10398 100644 --- a/CompanyManagment.App.Contracts/Contract/IContractApplication.cs +++ b/CompanyManagment.App.Contracts/Contract/IContractApplication.cs @@ -128,6 +128,7 @@ public class ContractPrintEmployerViewModel public ContractPrintLegalEmployerViewModel LegalEmployer { get; set; } public string WorkshopName { get; set; } public string Address { get; set; } + public string WorkshopCode { get; set; } } diff --git a/CompanyManagment.EFCore/Repository/ContractRepository.cs b/CompanyManagment.EFCore/Repository/ContractRepository.cs index 08a8a43f..c684138e 100644 --- a/CompanyManagment.EFCore/Repository/ContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/ContractRepository.cs @@ -1660,6 +1660,7 @@ public class ContractRepository : RepositoryBase, IContractRepos NationalCode = x.Employer.Nationalcode } : null, + WorkshopCode = workshop.InsuranceCode }; var employeeRes = new ContractPrintEmployeeViewModel() From 4b39994de6dbf0689f23df9cad5162e221b7c1f8 Mon Sep 17 00:00:00 2001 From: mahan Date: Sat, 20 Dec 2025 15:50:34 +0330 Subject: [PATCH 9/9] feat: add API endpoint for printing multiple contracts --- ServiceHost/Areas/Client/Controllers/ContractController.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ServiceHost/Areas/Client/Controllers/ContractController.cs b/ServiceHost/Areas/Client/Controllers/ContractController.cs index 523289e1..e3681c6f 100644 --- a/ServiceHost/Areas/Client/Controllers/ContractController.cs +++ b/ServiceHost/Areas/Client/Controllers/ContractController.cs @@ -30,5 +30,10 @@ public class ContractController:ClientBaseController var res = await _contractApplication.PrintOneAsync(id); return res; } - + [HttpGet("print")] + public async Task>> PrintAll([FromQuery] List ids) + { + var res = await _contractApplication.PrintAllAsync(ids); + return res; + } } \ No newline at end of file