Compare commits
4 Commits
master
...
Feature/Em
| Author | SHA1 | Date | |
|---|---|---|---|
| b850ab1206 | |||
| fedfc372d0 | |||
| 8faddedd46 | |||
| 1382305433 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -368,6 +368,3 @@ MigrationBackup/
|
|||||||
# Storage folder - ignore all uploaded files, thumbnails, and temporary files
|
# Storage folder - ignore all uploaded files, thumbnails, and temporary files
|
||||||
ServiceHost/Storage
|
ServiceHost/Storage
|
||||||
|
|
||||||
.env
|
|
||||||
.env.*
|
|
||||||
|
|
||||||
|
|||||||
@@ -45,11 +45,6 @@ public enum TypeOfSmsSetting
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
SendInstitutionContractConfirmationCode,
|
SendInstitutionContractConfirmationCode,
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// لینک تاییدیه ایجاد قرارداد مالی
|
|
||||||
/// </summary>
|
|
||||||
SendInstitutionContractConfirmationLink,
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// یادآور وظایف
|
/// یادآور وظایف
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace _0_Framework.Application;
|
|||||||
public class PagedResult<T> where T : class
|
public class PagedResult<T> where T : class
|
||||||
{
|
{
|
||||||
public int TotalCount { get; set; }
|
public int TotalCount { get; set; }
|
||||||
public List<T> List { get; set; } = [];
|
public List<T> List { get; set; }
|
||||||
}
|
}
|
||||||
public class PagedResult<T,TMeta>:PagedResult<T> where T : class
|
public class PagedResult<T,TMeta>:PagedResult<T> where T : class
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -30,22 +30,5 @@ public class ApiReportDto
|
|||||||
public string DeliveryState { get; set; }
|
public string DeliveryState { get; set; }
|
||||||
public string DeliveryUnixTime { get; set; }
|
public string DeliveryUnixTime { get; set; }
|
||||||
public string DeliveryColor { get; set; }
|
public string DeliveryColor { get; set; }
|
||||||
public string FullName { get; set; }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class SmsDetailsDto
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
public string MessageText { get; set; }
|
|
||||||
|
|
||||||
public long Mobile { get; set; }
|
|
||||||
|
|
||||||
public string SendUnixTime { get; set; }
|
|
||||||
public string DeliveryState { get; set; }
|
|
||||||
public string DeliveryUnixTime { get; set; }
|
|
||||||
public string DeliveryColor { get; set; }
|
|
||||||
public string FullName { get; set; }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -23,13 +23,7 @@ public interface ISmsService
|
|||||||
#region ForApi
|
#region ForApi
|
||||||
|
|
||||||
Task<List<ApiReportDto>> GetApiReport(string startDate, string endDate);
|
Task<List<ApiReportDto>> GetApiReport(string startDate, string endDate);
|
||||||
/// <summary>
|
|
||||||
/// دریافت جزئیات پیامک
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="messId"></param>
|
|
||||||
/// <param name="fullName"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<SmsDetailsDto> GetSmsDetailsByMessageId(int messId, string fullName);
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
string DeliveryStatus(byte? dv);
|
string DeliveryStatus(byte? dv);
|
||||||
|
|||||||
@@ -31,9 +31,8 @@ public static class StaticWorkshopAccounts
|
|||||||
/// 381 - مهدی قربانی
|
/// 381 - مهدی قربانی
|
||||||
/// 392 - عمار حسن دوست
|
/// 392 - عمار حسن دوست
|
||||||
/// 20 - سمیرا الهی نیا
|
/// 20 - سمیرا الهی نیا
|
||||||
/// 322 - ماهان چمنی
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static List<long> StaticAccountIds = [2, 3, 380, 381, 392, 20, 476,322];
|
public static List<long> StaticAccountIds = [2, 3, 380, 381, 392, 20, 476];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// این تاریخ در جدول اکانت لفت ورک به این معنیست
|
/// این تاریخ در جدول اکانت لفت ورک به این معنیست
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<NuGetAudit>false</NuGetAudit>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -8,5 +8,6 @@ namespace Company.Domain.BankAgg
|
|||||||
{
|
{
|
||||||
public void Remove(Bank entity);
|
public void Remove(Bank entity);
|
||||||
List<BankViewModel> Search(string name);
|
List<BankViewModel> Search(string name);
|
||||||
|
List<BankSelectList> GetBanksForSelectList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class Checkout : EntityBase
|
|||||||
string overNightWorkValue, string fridayWorkValue, string rotatingShifValue, string absenceValue,
|
string overNightWorkValue, string fridayWorkValue, string rotatingShifValue, string absenceValue,
|
||||||
string totalDayOfLeaveCompute, string totalDayOfYearsCompute, string totalDayOfBunosesCompute,
|
string totalDayOfLeaveCompute, string totalDayOfYearsCompute, string totalDayOfBunosesCompute,
|
||||||
ICollection<CheckoutLoanInstallment> loanInstallments,
|
ICollection<CheckoutLoanInstallment> loanInstallments,
|
||||||
ICollection<CheckoutSalaryAid> salaryAids, CheckoutRollCall checkoutRollCall, TimeSpan employeeMandatoryHours, bool hasInsuranceShareTheSameAsList, ICollection<CheckoutReward> rewards,double rewardPay)
|
ICollection<CheckoutSalaryAid> salaryAids, CheckoutRollCall checkoutRollCall, TimeSpan employeeMandatoryHours, bool hasInsuranceShareTheSameAsList)
|
||||||
{
|
{
|
||||||
EmployeeFullName = employeeFullName;
|
EmployeeFullName = employeeFullName;
|
||||||
FathersName = fathersName;
|
FathersName = fathersName;
|
||||||
@@ -71,7 +71,7 @@ public class Checkout : EntityBase
|
|||||||
TotalClaims = totalClaims;
|
TotalClaims = totalClaims;
|
||||||
TotalDeductions = totalDeductions;
|
TotalDeductions = totalDeductions;
|
||||||
TotalPayment = totalPayment;
|
TotalPayment = totalPayment;
|
||||||
RewardPay = rewardPay;
|
RewardPay = 0;
|
||||||
IsActiveString = "true";
|
IsActiveString = "true";
|
||||||
Signature = signature;
|
Signature = signature;
|
||||||
MarriedAllowance = marriedAllowance;
|
MarriedAllowance = marriedAllowance;
|
||||||
@@ -93,7 +93,6 @@ public class Checkout : EntityBase
|
|||||||
CheckoutRollCall = checkoutRollCall;
|
CheckoutRollCall = checkoutRollCall;
|
||||||
EmployeeMandatoryHours = employeeMandatoryHours;
|
EmployeeMandatoryHours = employeeMandatoryHours;
|
||||||
HasInsuranceShareTheSameAsList = hasInsuranceShareTheSameAsList;
|
HasInsuranceShareTheSameAsList = hasInsuranceShareTheSameAsList;
|
||||||
Rewards = rewards;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -131,7 +130,7 @@ public class Checkout : EntityBase
|
|||||||
public double BonusesPay { get; private set; }
|
public double BonusesPay { get; private set; }
|
||||||
public double YearsPay { get; private set; }
|
public double YearsPay { get; private set; }
|
||||||
public double LeavePay { get; private set; }
|
public double LeavePay { get; private set; }
|
||||||
public double RewardPay { get; private set; }
|
public double? RewardPay { get; private set; }
|
||||||
public double InsuranceDeduction { get; private set; }
|
public double InsuranceDeduction { get; private set; }
|
||||||
public double TaxDeducation { get; private set; }
|
public double TaxDeducation { get; private set; }
|
||||||
public double InstallmentDeduction { get; private set; }
|
public double InstallmentDeduction { get; private set; }
|
||||||
@@ -224,8 +223,6 @@ public class Checkout : EntityBase
|
|||||||
|
|
||||||
public ICollection<CheckoutLoanInstallment> LoanInstallments { get; set; } = [];
|
public ICollection<CheckoutLoanInstallment> LoanInstallments { get; set; } = [];
|
||||||
public ICollection<CheckoutSalaryAid> SalaryAids { get; set; } = [];
|
public ICollection<CheckoutSalaryAid> SalaryAids { get; set; } = [];
|
||||||
|
|
||||||
public ICollection<CheckoutReward> Rewards { get; set; } = [];
|
|
||||||
public CheckoutRollCall CheckoutRollCall { get; private set; }
|
public CheckoutRollCall CheckoutRollCall { get; private set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -242,7 +239,7 @@ public class Checkout : EntityBase
|
|||||||
double insuranceDeduction, double taxDeducation, double installmentDeduction,
|
double insuranceDeduction, double taxDeducation, double installmentDeduction,
|
||||||
double salaryAidDeduction, double absenceDeduction, string sumOfWorkingDays
|
double salaryAidDeduction, double absenceDeduction, string sumOfWorkingDays
|
||||||
, string archiveCode, string personnelCode,
|
, string archiveCode, string personnelCode,
|
||||||
string totalClaims, string totalDeductions, double totalPayment, double rewardPay)
|
string totalClaims, string totalDeductions, double totalPayment, double? rewardPay)
|
||||||
{
|
{
|
||||||
EmployeeFullName = employeeFullName;
|
EmployeeFullName = employeeFullName;
|
||||||
FathersName = fathersName;
|
FathersName = fathersName;
|
||||||
@@ -340,11 +337,6 @@ public class Checkout : EntityBase
|
|||||||
InstallmentDeduction = installmentsAmount;
|
InstallmentDeduction = installmentsAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetReward(ICollection<CheckoutReward> rewards, double rewardAmount)
|
|
||||||
{
|
|
||||||
RewardPay = rewardAmount;
|
|
||||||
Rewards = rewards;
|
|
||||||
}
|
|
||||||
public void SetCheckoutRollCall(CheckoutRollCall checkoutRollCall)
|
public void SetCheckoutRollCall(CheckoutRollCall checkoutRollCall)
|
||||||
{
|
{
|
||||||
CheckoutRollCall = checkoutRollCall;
|
CheckoutRollCall = checkoutRollCall;
|
||||||
|
|||||||
@@ -1,57 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace Company.Domain.CheckoutAgg.ValueObjects;
|
|
||||||
|
|
||||||
public class CheckoutReward
|
|
||||||
{
|
|
||||||
public CheckoutReward(string amount, double amountDouble, string grantDateFa, DateTime grantDateGr, string description, string title, long entityId)
|
|
||||||
{
|
|
||||||
Amount = amount;
|
|
||||||
AmountDouble = amountDouble;
|
|
||||||
GrantDateFa = grantDateFa;
|
|
||||||
GrantDateGr = grantDateGr;
|
|
||||||
Description = description;
|
|
||||||
Title = title;
|
|
||||||
EntityId = entityId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// مبلغ پاداش
|
|
||||||
/// string
|
|
||||||
/// </summary>
|
|
||||||
public string Amount { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// مبلغ پاداش
|
|
||||||
/// double
|
|
||||||
/// </summary>
|
|
||||||
public double AmountDouble { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// تاریخ اعطاء
|
|
||||||
/// شمسی
|
|
||||||
/// </summary>
|
|
||||||
public string GrantDateFa { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// تاریخ اعطاء
|
|
||||||
/// میلادی
|
|
||||||
/// </summary>
|
|
||||||
public DateTime GrantDateGr { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// توضیحات
|
|
||||||
/// </summary>
|
|
||||||
public string Description { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// عنوان
|
|
||||||
/// </summary>
|
|
||||||
public string Title { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// آی دی پاداش
|
|
||||||
/// </summary>
|
|
||||||
public long EntityId { get; set; }
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
|
|
||||||
|
using System;
|
||||||
using _0_Framework.Domain;
|
using _0_Framework.Domain;
|
||||||
using CompanyManagment.App.Contracts.EmployeeBankInformation;
|
using CompanyManagment.App.Contracts.EmployeeBankInformation;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Security.AccessControl;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using CompanyManagment.App.Contracts.Workshop;
|
||||||
|
|
||||||
namespace Company.Domain.EmployeeBankInformationAgg
|
namespace Company.Domain.EmployeeBankInformationAgg
|
||||||
{
|
{
|
||||||
@@ -11,14 +15,31 @@ namespace Company.Domain.EmployeeBankInformationAgg
|
|||||||
void Remove(EmployeeBankInformation bankInformation);
|
void Remove(EmployeeBankInformation bankInformation);
|
||||||
void RemoveRange(List<EmployeeBankInformation> entities);
|
void RemoveRange(List<EmployeeBankInformation> entities);
|
||||||
|
|
||||||
|
[Obsolete("از متد async استفاده کنید")]
|
||||||
List<GroupedEmployeeBankInformationViewModel> Search(long workshopId, EmployeeBankInformationSearchModel searchParams);
|
List<GroupedEmployeeBankInformationViewModel> Search(long workshopId, EmployeeBankInformationSearchModel searchParams);
|
||||||
|
|
||||||
|
Task<List<GroupedEmployeeBankInformationViewModel>> SearchAsync(long workshopId,
|
||||||
|
EmployeeBankInformationSearchModel searchParams);
|
||||||
|
|
||||||
|
|
||||||
GroupedEmployeeBankInformationViewModel GetByEmployeeId(long workshopId, long employeeId);
|
GroupedEmployeeBankInformationViewModel GetByEmployeeId(long workshopId, long employeeId);
|
||||||
List<EmployeeBankInformation> GetRangeByEmployeeId(long workshopId, long employeeId);
|
List<EmployeeBankInformation> GetRangeByEmployeeId(long workshopId, long employeeId);
|
||||||
EmployeeBankInformationViewModel GetDetails(long id);
|
EmployeeBankInformationViewModel GetDetails(long id);
|
||||||
List<GroupedEmployeeBankInformationViewModel> GetAllByWorkshopId(long workshopId);
|
List<GroupedEmployeeBankInformationViewModel> GetAllByWorkshopId(long workshopId);
|
||||||
|
|
||||||
|
List<EmployeeBankInformationViewModelForExcel> SearchForExcel(long workshopId,
|
||||||
|
EmployeeBankInformationSearchModel searchParams);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// جزئیات اطلاعات بانکی بر اساس پرسنل
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <param name="employeeId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<GetEmployeeBankInfoDetailsDto> GetDetailsByEmployeeIdAsync(long workshopId, long employeeId);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
List<EmployeeBankInformationViewModelForExcel> SearchForExcel(long workshopId, EmployeeBankInformationSearchModel searchParams);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
using _0_Framework.Domain;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using _0_Framework.Domain;
|
||||||
using Company.Domain.CustomizeWorkshopEmployeeSettingsAgg.Entities;
|
using Company.Domain.CustomizeWorkshopEmployeeSettingsAgg.Entities;
|
||||||
using CompanyManagment.App.Contracts.Contract;
|
using CompanyManagment.App.Contracts.Contract;
|
||||||
using CompanyManagment.App.Contracts.CustomizeCheckout;
|
using CompanyManagment.App.Contracts.CustomizeCheckout;
|
||||||
using CompanyManagment.App.Contracts.Leave;
|
using CompanyManagment.App.Contracts.Leave;
|
||||||
using CompanyManagment.App.Contracts.Loan;
|
using CompanyManagment.App.Contracts.Loan;
|
||||||
using CompanyManagment.App.Contracts.Reward;
|
|
||||||
using CompanyManagment.App.Contracts.RollCall;
|
using CompanyManagment.App.Contracts.RollCall;
|
||||||
using CompanyManagment.App.Contracts.SalaryAid;
|
using CompanyManagment.App.Contracts.SalaryAid;
|
||||||
using CompanyManagment.App.Contracts.WorkingHoursTemp;
|
using CompanyManagment.App.Contracts.WorkingHoursTemp;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Company.Domain.RollCallAgg;
|
namespace Company.Domain.RollCallAgg;
|
||||||
|
|
||||||
@@ -54,9 +53,6 @@ public interface IRollCallMandatoryRepository : IRepository<long, RollCall>
|
|||||||
List<SalaryAidViewModel> SalaryAidsForCheckout(long employeeId, long workshopId, DateTime checkoutStart,
|
List<SalaryAidViewModel> SalaryAidsForCheckout(long employeeId, long workshopId, DateTime checkoutStart,
|
||||||
DateTime checkoutEnd);
|
DateTime checkoutEnd);
|
||||||
|
|
||||||
List<RewardViewModel> RewardForCheckout(long employeeId, long workshopId, DateTime checkoutEnd,
|
|
||||||
DateTime checkoutStart);
|
|
||||||
|
|
||||||
Task<ComputingViewModel> RotatingShiftReport(long workshopId, long employeeId, DateTime contractStart,
|
Task<ComputingViewModel> RotatingShiftReport(long workshopId, long employeeId, DateTime contractStart,
|
||||||
DateTime contractEnd, string shiftwork, bool hasRollCall, CreateWorkingHoursTemp command,bool holidayWorking);
|
DateTime contractEnd, string shiftwork, bool hasRollCall, CreateWorkingHoursTemp command,bool holidayWorking);
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,6 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using _0_Framework.Application;
|
|
||||||
using _0_Framework.Domain;
|
using _0_Framework.Domain;
|
||||||
using CompanyManagment.App.Contracts.RollCall;
|
using CompanyManagment.App.Contracts.RollCall;
|
||||||
using CompanyManagment.App.Contracts.WorkingHoursTemp;
|
using CompanyManagment.App.Contracts.WorkingHoursTemp;
|
||||||
@@ -92,9 +91,5 @@ namespace Company.Domain.RollCallAgg
|
|||||||
Task<List<RollCall>> GetRollCallsUntilNowWithWorkshopIdEmployeeIds(long workshopId, List<long> employeeIds,
|
Task<List<RollCall>> GetRollCallsUntilNowWithWorkshopIdEmployeeIds(long workshopId, List<long> employeeIds,
|
||||||
DateTime fromDate);
|
DateTime fromDate);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
Task<PagedResult<RollCallCaseHistoryTitleDto>> GetCaseHistoryTitles(long workshopId,RollCallCaseHistorySearchModel searchModel);
|
|
||||||
Task<List<RollCallCaseHistoryDetail>> GetCaseHistoryDetails(long workshopId,
|
|
||||||
string titleId, RollCallCaseHistorySearchModel searchModel);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using _0_Framework.Application.Enums;
|
using _0_Framework.Domain;
|
||||||
using _0_Framework.Domain;
|
|
||||||
using CompanyManagment.App.Contracts.SmsResult;
|
using CompanyManagment.App.Contracts.SmsResult;
|
||||||
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -23,9 +22,8 @@ public interface ISmsResultRepository : IRepository<long, SmsResult>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="searchModel"></param>
|
/// <param name="searchModel"></param>
|
||||||
/// <param name="date"></param>
|
/// <param name="date"></param>
|
||||||
/// <param name="typeOfSmsSetting"></param>
|
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date, string typeOfSmsSetting);
|
Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
List<SmsResultViewModel> Search(SmsResultSearchModel searchModel);
|
List<SmsResultViewModel> Search(SmsResultSearchModel searchModel);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using _0_Framework.Application.Enums;
|
using _0_Framework.Application.Enums;
|
||||||
using _0_Framework.Domain;
|
using _0_Framework.Domain;
|
||||||
using CompanyManagment.App.Contracts.SmsResult;
|
using CompanyManagment.App.Contracts.SmsResult;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Company.Domain.SmsResultAgg;
|
namespace Company.Domain.SmsResultAgg;
|
||||||
@@ -28,25 +27,4 @@ public interface ISmsSettingsRepository : IRepository<long, SmsSetting>
|
|||||||
/// <param name="id"></param>
|
/// <param name="id"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task RemoveItem(long id);
|
Task RemoveItem(long id);
|
||||||
|
|
||||||
|
|
||||||
#region ForApi
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست پیامک های خودکار بر اساس نوع آن
|
|
||||||
/// Api
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="typeOfSmsSetting"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<SmsSettingDto>> GetSmsSettingList(TypeOfSmsSetting typeOfSmsSetting);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت اطلاعات تنظیمات پیامک جهت ویرایش
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<SmsSettingDto> GetSmsSettingDataToEdit(long id);
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,6 @@
|
|||||||
using _0_Framework.Excel;
|
using _0_Framework.Excel;
|
||||||
using _0_Framework.Application;
|
|
||||||
using CompanyManagment.App.Contracts.RollCall;
|
|
||||||
using OfficeOpenXml;
|
using OfficeOpenXml;
|
||||||
using OfficeOpenXml.Drawing;
|
using OfficeOpenXml.Drawing;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
|
|
||||||
namespace CompanyManagement.Infrastructure.Excel.RollCall;
|
namespace CompanyManagement.Infrastructure.Excel.RollCall;
|
||||||
|
|
||||||
@@ -314,111 +308,6 @@ public class RollCallExcelGenerator : ExcelGenerator
|
|||||||
return package.GetAsByteArray();
|
return package.GetAsByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] CaseHistoryExcelForEmployee(List<RollCallCaseHistoryDetail> data, string titleId)
|
|
||||||
{
|
|
||||||
if (!Regex.IsMatch(titleId, @"^\d{4}_\d{2}$"))
|
|
||||||
throw new ArgumentException("Invalid titleId format.", nameof(titleId));
|
|
||||||
|
|
||||||
var splitDate = titleId.Split("_");
|
|
||||||
var year = Convert.ToInt32(splitDate.First());
|
|
||||||
var month = Convert.ToInt32(splitDate.Last());
|
|
||||||
|
|
||||||
var startDateFa = $"{year:D4}/{month:D2}/01";
|
|
||||||
var startDate = startDateFa.ToGeorgianDateTime();
|
|
||||||
var endDateFa = startDateFa.FindeEndOfMonth();
|
|
||||||
var endDate = endDateFa.ToGeorgianDateTime();
|
|
||||||
|
|
||||||
var dateRange = (int)(endDate.Date - startDate.Date).TotalDays + 1;
|
|
||||||
var dates = Enumerable.Range(0, dateRange).Select(x => startDate.AddDays(x)).ToList();
|
|
||||||
|
|
||||||
var safeData = data ?? new List<RollCallCaseHistoryDetail>();
|
|
||||||
var first = safeData.FirstOrDefault();
|
|
||||||
var totalWorkingTime = new TimeSpan(safeData.Sum(x => x.TotalWorkingTime.Ticks));
|
|
||||||
|
|
||||||
var viewModel = new CaseHistoryRollCallExcelForEmployeeViewModel
|
|
||||||
{
|
|
||||||
EmployeeId = first?.EmployeeId ?? 0,
|
|
||||||
DateGr = startDate,
|
|
||||||
PersonnelCode = first?.PersonnelCode,
|
|
||||||
EmployeeFullName = first?.EmployeeFullName,
|
|
||||||
PersianMonthName = month.ToFarsiMonthByIntNumber(),
|
|
||||||
PersianYear = year.ToString(),
|
|
||||||
TotalWorkingHoursFa = totalWorkingTime.ToFarsiHoursAndMinutes("-"),
|
|
||||||
TotalWorkingTimeSpan = $"{(int)totalWorkingTime.TotalHours}:{totalWorkingTime.Minutes:00}",
|
|
||||||
RollCalls = dates.Select((date, index) =>
|
|
||||||
{
|
|
||||||
var item = index < safeData.Count ? safeData[index] : null;
|
|
||||||
var records = item?.Records ?? new List<RollCallCaseHistoryDetailRecord>();
|
|
||||||
|
|
||||||
return new RollCallItemForEmployeeExcelViewModel
|
|
||||||
{
|
|
||||||
DateGr = date,
|
|
||||||
DateFa = date.ToFarsi(),
|
|
||||||
DayOfWeekFa = date.DayOfWeek.DayOfWeeKToPersian(),
|
|
||||||
PersonnelCode = item?.PersonnelCode,
|
|
||||||
EmployeeFullName = item?.EmployeeFullName,
|
|
||||||
IsAbsent = item?.Status == RollCallRecordStatus.Absent,
|
|
||||||
HasLeave = item?.Status == RollCallRecordStatus.Leaved,
|
|
||||||
IsHoliday = false,
|
|
||||||
TotalWorkingHours = (item?.TotalWorkingTime ?? TimeSpan.Zero).ToFarsiHoursAndMinutes("-"),
|
|
||||||
StartsItems = JoinRecords(records, r => r.StartTime),
|
|
||||||
EndsItems = JoinRecords(records, r => r.EndTime),
|
|
||||||
EnterTimeDifferences = JoinRecords(records, r => FormatSignedTimeSpan(r.EntryTimeDifference)),
|
|
||||||
ExitTimeDifferences = JoinRecords(records, r => FormatSignedTimeSpan(r.ExitTimeDifference))
|
|
||||||
};
|
|
||||||
}).ToList()
|
|
||||||
};
|
|
||||||
|
|
||||||
return CaseHistoryExcelForEmployee(viewModel);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte[] CaseHistoryExcelForOneDay(List<RollCallCaseHistoryDetail> data, string titleId)
|
|
||||||
{
|
|
||||||
if (!Regex.IsMatch(titleId, @"^\d{4}/\d{2}/\d{2}$"))
|
|
||||||
throw new ArgumentException("Invalid titleId format.", nameof(titleId));
|
|
||||||
|
|
||||||
var dateGr = titleId.ToGeorgianDateTime();
|
|
||||||
var safeData = data ?? new List<RollCallCaseHistoryDetail>();
|
|
||||||
|
|
||||||
var viewModel = new CaseHistoryRollCallForOneDayViewModel
|
|
||||||
{
|
|
||||||
DateFa = titleId,
|
|
||||||
DateGr = dateGr,
|
|
||||||
DayOfWeekFa = dateGr.DayOfWeek.DayOfWeeKToPersian(),
|
|
||||||
RollCalls = safeData.Select(item =>
|
|
||||||
{
|
|
||||||
var records = item.Records ?? new List<RollCallCaseHistoryDetailRecord>();
|
|
||||||
return new RollCallItemForOneDayExcelViewModel
|
|
||||||
{
|
|
||||||
EmployeeFullName = item.EmployeeFullName,
|
|
||||||
PersonnelCode = item.PersonnelCode,
|
|
||||||
StartsItems = JoinRecords(records, r => r.StartTime),
|
|
||||||
EndsItems = JoinRecords(records, r => r.EndTime),
|
|
||||||
TotalWorkingHours = item.TotalWorkingTime.ToFarsiHoursAndMinutes("-")
|
|
||||||
};
|
|
||||||
}).ToList()
|
|
||||||
};
|
|
||||||
|
|
||||||
return CaseHistoryExcelForOneDay(viewModel);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string JoinRecords(IEnumerable<RollCallCaseHistoryDetailRecord> records, Func<RollCallCaseHistoryDetailRecord, string> selector)
|
|
||||||
{
|
|
||||||
var safeRecords = records ?? Enumerable.Empty<RollCallCaseHistoryDetailRecord>();
|
|
||||||
var values = safeRecords.Select(selector).Where(x => !string.IsNullOrWhiteSpace(x)).ToList();
|
|
||||||
return values.Count == 0 ? string.Empty : string.Join(Environment.NewLine, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string FormatSignedTimeSpan(TimeSpan value)
|
|
||||||
{
|
|
||||||
if (value == TimeSpan.Zero)
|
|
||||||
return "-";
|
|
||||||
|
|
||||||
var abs = value.Duration();
|
|
||||||
var sign = value.Ticks < 0 ? "-" : "+";
|
|
||||||
return $"{(int)abs.TotalHours}:{abs.Minutes:00}{sign}";
|
|
||||||
}
|
|
||||||
|
|
||||||
private string CalculateExitMinuteDifference(TimeSpan early, TimeSpan late)
|
private string CalculateExitMinuteDifference(TimeSpan early, TimeSpan late)
|
||||||
{
|
{
|
||||||
if (early == TimeSpan.Zero && late == TimeSpan.Zero)
|
if (early == TimeSpan.Zero && late == TimeSpan.Zero)
|
||||||
|
|||||||
@@ -10,5 +10,12 @@ namespace CompanyManagment.App.Contracts.Bank
|
|||||||
OperationResult Create(CreateBank command);
|
OperationResult Create(CreateBank command);
|
||||||
OperationResult Edit(EditBank command);
|
OperationResult Edit(EditBank command);
|
||||||
List<BankViewModel> Search(string name);
|
List<BankViewModel> Search(string name);
|
||||||
|
List<BankSelectList> GetBanksForSelectList();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BankSelectList:SelectListViewModel
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -193,9 +193,4 @@ public class CreateCheckout
|
|||||||
/// پایه سنوات قبل از تاثیر ساعت کار
|
/// پایه سنوات قبل از تاثیر ساعت کار
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public double BaseYearUnAffected { get; set; }
|
public double BaseYearUnAffected { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// آیا برای محاسبه پاداش مجاز است
|
|
||||||
/// </summary>
|
|
||||||
public bool RewardPayCompute { get; set; }
|
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,6 @@
|
|||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
<NoWarn>$(NoWarn);1591</NoWarn>
|
<NoWarn>$(NoWarn);1591</NoWarn>
|
||||||
<NuGetAudit>false</NuGetAudit>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
namespace CompanyManagment.App.Contracts.EmployeeBankInformation;
|
||||||
|
|
||||||
|
public class GetEmployeeBankInfoDetailsBankItemDto
|
||||||
|
{
|
||||||
|
public long Id { get; set; }
|
||||||
|
public string CardNumber { get; set; }
|
||||||
|
public string ShebaNumber { get; set; }
|
||||||
|
public string BankAccountNumber { get; set; }
|
||||||
|
public string BankName { get; set; }
|
||||||
|
public string BankLogoPath { get; set; }
|
||||||
|
public bool IsDefault { get; set; }
|
||||||
|
public long BankId { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.EmployeeBankInformation;
|
||||||
|
|
||||||
|
public class GetEmployeeBankInfoDetailsDto
|
||||||
|
{
|
||||||
|
public long EmployeeId { get; set; }
|
||||||
|
public string EmployeeFullName { get; set; }
|
||||||
|
public List<GetEmployeeBankInfoDetailsBankItemDto> BankItems { get; set; }
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
using _0_Framework.Application;
|
using System;
|
||||||
|
using _0_Framework.Application;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace CompanyManagment.App.Contracts.EmployeeBankInformation
|
namespace CompanyManagment.App.Contracts.EmployeeBankInformation
|
||||||
{
|
{
|
||||||
@@ -8,6 +10,7 @@ namespace CompanyManagment.App.Contracts.EmployeeBankInformation
|
|||||||
OperationResult Create(CreateEmployeeInformation command);
|
OperationResult Create(CreateEmployeeInformation command);
|
||||||
OperationResult GroupCreate(long workshopId, List<CreateEmployeeInformation> command);
|
OperationResult GroupCreate(long workshopId, List<CreateEmployeeInformation> command);
|
||||||
OperationResult Edit(EditEmployeeInformation command);
|
OperationResult Edit(EditEmployeeInformation command);
|
||||||
|
[Obsolete("از متد Async استفاده شود")]
|
||||||
List<GroupedEmployeeBankInformationViewModel> Search(long workshopId, EmployeeBankInformationSearchModel searchParams);
|
List<GroupedEmployeeBankInformationViewModel> Search(long workshopId, EmployeeBankInformationSearchModel searchParams);
|
||||||
List<EmployeeBankInformationViewModelForExcel> SearchForExcel(long workshopId,
|
List<EmployeeBankInformationViewModelForExcel> SearchForExcel(long workshopId,
|
||||||
EmployeeBankInformationSearchModel searchParams);
|
EmployeeBankInformationSearchModel searchParams);
|
||||||
@@ -17,5 +20,22 @@ namespace CompanyManagment.App.Contracts.EmployeeBankInformation
|
|||||||
OperationResult RemoveByEmployeeId(long workshopId, long employeeId);
|
OperationResult RemoveByEmployeeId(long workshopId, long employeeId);
|
||||||
List<GroupedEmployeeBankInformationViewModel> GetAllByWorkshopId(long workshopId);
|
List<GroupedEmployeeBankInformationViewModel> GetAllByWorkshopId(long workshopId);
|
||||||
OperationResult SetDefault(long workshopId, long bankInfoId);
|
OperationResult SetDefault(long workshopId, long bankInfoId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// گرفتن لیست اطلاعات بانکی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <param name="searchParams"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<GroupedEmployeeBankInformationViewModel>> SearchAsync
|
||||||
|
(long workshopId, EmployeeBankInformationSearchModel searchParams);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// جزئیات اطلاعات بانکی بر اساس پرسنل
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <param name="employeeId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<GetEmployeeBankInfoDetailsDto> GetDetailsByEmployeeIdAsync(long workshopId, long employeeId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -324,7 +324,6 @@ public class InstitutionContractCreationWorkshopsResponse
|
|||||||
{
|
{
|
||||||
public List<WorkshopTempViewModel> WorkshopTemps { get; set; }
|
public List<WorkshopTempViewModel> WorkshopTemps { get; set; }
|
||||||
public string TotalAmount { get; set; }
|
public string TotalAmount { get; set; }
|
||||||
public Guid TempId { get; set; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InstitutionContractCreationWorkshopsRequest
|
public class InstitutionContractCreationWorkshopsRequest
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ public class InstitutionContractExtensionCompleteRequest
|
|||||||
public Guid TemporaryId { get; set; }
|
public Guid TemporaryId { get; set; }
|
||||||
public bool IsInstallment { get; set; }
|
public bool IsInstallment { get; set; }
|
||||||
public long LawId { get; set; }
|
public long LawId { get; set; }
|
||||||
public bool CancelSendVerificationSms { get; set; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InstitutionContractCreationCompleteRequest
|
public class InstitutionContractCreationCompleteRequest
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
|
|
||||||
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// لیست پیامکهای بدهکاران قرارداد ملی
|
/// لیست پیامکهای بدهکاران قرارداد ملی
|
||||||
@@ -115,30 +113,10 @@ public class BlockSmsListData
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///پیامک آنی یادآور
|
/// لیست قراداد های آبی
|
||||||
|
/// جهت ارسال هشدار یا اقدام قضائی
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class InstantReminderSendSms
|
public class BlueWarningSmsData
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// نام طرف حساب
|
|
||||||
/// </summary>
|
|
||||||
public string FullName { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// مبلغ بدهی
|
|
||||||
/// </summary>
|
|
||||||
public string Amount { get; set; }
|
|
||||||
public List<InstantReminderSmsList> InstantReminderSmsList { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class InstantReminderSmsList
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// شماره تماس طرف حساب
|
|
||||||
/// </summary>
|
|
||||||
public string PhoneNumber { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -21,6 +21,6 @@ public class LoanGroupedViewModel
|
|||||||
{
|
{
|
||||||
public List<LoanGroupedByDateViewModel> GroupedByDate { get; set; }
|
public List<LoanGroupedByDateViewModel> GroupedByDate { get; set; }
|
||||||
public List<LoanGroupedByEmployeeViewModel>GroupedByEmployee { get; set; }
|
public List<LoanGroupedByEmployeeViewModel>GroupedByEmployee { get; set; }
|
||||||
public PagedResult<LoanViewModel> LoanListViewModel { get; set; }
|
public List<LoanViewModel> LoanListViewModel { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,5 @@ public class LoanSearchViewModel
|
|||||||
public string EndDate { get; set; }
|
public string EndDate { get; set; }
|
||||||
|
|
||||||
public int PageIndex { get; set; }
|
public int PageIndex { get; set; }
|
||||||
public int PageSize { get; set; } = 30;
|
|
||||||
public bool ShowAsGrouped { get; set; }
|
public bool ShowAsGrouped { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using CompanyManagment.App.Contracts.Workshop;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace CompanyManagment.App.Contracts.RollCall
|
namespace CompanyManagment.App.Contracts.RollCall
|
||||||
{
|
{
|
||||||
@@ -127,62 +125,7 @@ namespace CompanyManagment.App.Contracts.RollCall
|
|||||||
/// <param name="command"></param>
|
/// <param name="command"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<OperationResult> RecalculateValues(long workshopId, List<ReCalculateRollCallValues> command);
|
Task<OperationResult> RecalculateValues(long workshopId, List<ReCalculateRollCallValues> command);
|
||||||
|
|
||||||
Task<PagedResult<RollCallCaseHistoryTitleDto>> GetCaseHistoryTitles(long workshopId,RollCallCaseHistorySearchModel searchModel);
|
|
||||||
Task<List<RollCallCaseHistoryDetail>> GetCaseHistoryDetails(long workshopId, string titleId,
|
|
||||||
RollCallCaseHistorySearchModel searchModel);
|
|
||||||
|
|
||||||
Task<RollCallCaseHistoryExcelDto> DownloadCaseHistoryExcel(long workshopId, string titleId,
|
|
||||||
RollCallCaseHistorySearchModel searchModel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RollCallCaseHistoryExcelDto
|
|
||||||
{
|
|
||||||
public byte[] Bytes { get; set; }
|
|
||||||
public string FileName { get; set; }
|
|
||||||
public string MimeType { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RollCallCaseHistoryDetail
|
|
||||||
{
|
|
||||||
public string EmployeeFullName { get; set; }
|
|
||||||
public string PersonnelCode { get; set; }
|
|
||||||
public TimeSpan TotalWorkingTime { get; set; }
|
|
||||||
public List<RollCallCaseHistoryDetailRecord> Records { get; set; }
|
|
||||||
public RollCallRecordStatus Status { get; set; }
|
|
||||||
public long EmployeeId { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum RollCallRecordStatus
|
|
||||||
{
|
|
||||||
Worked = 0,
|
|
||||||
Absent = 1,
|
|
||||||
Leaved = 2
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RollCallCaseHistoryDetailRecord
|
|
||||||
{
|
|
||||||
public TimeSpan EntryTimeDifference { get; set; }
|
|
||||||
public string StartTime { get; set; }
|
|
||||||
public string EndTime { get; set; }
|
|
||||||
public TimeSpan ExitTimeDifference { get; set; }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RollCallCaseHistorySearchModel:PaginationRequest
|
|
||||||
{
|
|
||||||
public string StartDate { get; set; }
|
|
||||||
public string EndDate { get; set; }
|
|
||||||
public string OneDayDate { get; set; }
|
|
||||||
public long? EmployeeId { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RollCallCaseHistoryTitleDto
|
|
||||||
{
|
|
||||||
public string Id { get; set; }
|
|
||||||
public string Title { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ReCalculateRollCallValues
|
public class ReCalculateRollCallValues
|
||||||
{
|
{
|
||||||
public long EmployeeId { get; set; }
|
public long EmployeeId { get; set; }
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ public class CreateSalaryAidViewModel
|
|||||||
public long WorkshopId { get; set; }
|
public long WorkshopId { get; set; }
|
||||||
public string Amount { get; set; }
|
public string Amount { get; set; }
|
||||||
public string SalaryDateTime { get; set; }
|
public string SalaryDateTime { get; set; }
|
||||||
|
public string CalculationDateTime { get; set; }
|
||||||
public string NationalCode { get; set; }
|
public string NationalCode { get; set; }
|
||||||
public int CalculationMonth { get; set; }
|
public int CalculationMonth { get; set; }
|
||||||
public int CalculationYear { get; set; }
|
public int CalculationYear { get; set; }
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ public class SalaryAidGroupedByDateViewModel
|
|||||||
public string YearFa { get; set; }
|
public string YearFa { get; set; }
|
||||||
public int Month { get; set; }
|
public int Month { get; set; }
|
||||||
public int Year { get; set; }
|
public int Year { get; set; }
|
||||||
public List<SalaryAidGroupedByDateViewModelItems> Items { get; set; }
|
public List<SalaryAidGroupedByDateViewModelItems> SalaryAidViewModels { get; set; }
|
||||||
public string TotalAmount { get; set; }
|
public string TotalAmount { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ public class SalaryAidGroupedByEmployeeViewModel
|
|||||||
{
|
{
|
||||||
public string EmployeeName { get; set; }
|
public string EmployeeName { get; set; }
|
||||||
public long EmployeeId { get; set; }
|
public long EmployeeId { get; set; }
|
||||||
public List<SalaryAidGroupedByEmployeeViewModelItems> Items { get; set; }
|
public List<SalaryAidGroupedByEmployeeViewModelItems> SalaryAidViewModels { get; set; }
|
||||||
public string TotalAmount { get; set; }
|
public string TotalAmount { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,15 +3,15 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using _0_Framework.Application;
|
|
||||||
|
|
||||||
namespace CompanyManagment.App.Contracts.SalaryAid;
|
namespace CompanyManagment.App.Contracts.SalaryAid;
|
||||||
public class SalaryAidSearchViewModel:PaginationRequest
|
public class SalaryAidSearchViewModel
|
||||||
{
|
{
|
||||||
public string StartDate { get; set; }
|
public string StartDate { get; set; }
|
||||||
public string EndDate { get; set; }
|
public string EndDate { get; set; }
|
||||||
public long EmployeeId { get; set; }
|
public long EmployeeId { get; set; }
|
||||||
public long WorkshopId { get; set; }
|
public long WorkshopId { get; set; }
|
||||||
|
public int PageIndex { get; set; }
|
||||||
public bool ShowAsGrouped { get; set; }
|
public bool ShowAsGrouped { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using _0_Framework.Application;
|
|
||||||
|
|
||||||
namespace CompanyManagment.App.Contracts.SalaryAid;
|
namespace CompanyManagment.App.Contracts.SalaryAid;
|
||||||
|
|
||||||
@@ -8,7 +7,7 @@ public class SalaryAidsGroupedViewModel
|
|||||||
{
|
{
|
||||||
public List<SalaryAidGroupedByEmployeeViewModel> GroupedByEmployee { get; set; }
|
public List<SalaryAidGroupedByEmployeeViewModel> GroupedByEmployee { get; set; }
|
||||||
public List<SalaryAidGroupedByDateViewModel> GroupedByDate { get; set; }
|
public List<SalaryAidGroupedByDateViewModel> GroupedByDate { get; set; }
|
||||||
public PagedResult<SalaryAidViewModel> List { get; set; }
|
public List<SalaryAidViewModel> SalaryAidListViewModels { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,43 +60,3 @@ public class SmsSettingViewModel
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public List<EditSmsSetting> EditSmsSettings { get; set; }
|
public List<EditSmsSetting> EditSmsSettings { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// لیست تنظیمات پیامک خودکار
|
|
||||||
/// </summary>
|
|
||||||
public class SmsSettingDto
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// آی دی
|
|
||||||
/// </summary>
|
|
||||||
public long Id { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// عدد روز از ماه
|
|
||||||
/// </summary>
|
|
||||||
public int DayOfMonth { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// نمایش ساعت و دقیقه
|
|
||||||
/// </summary>
|
|
||||||
public string TimeOfDayDisplay { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public class CreateSmsSettingDto
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// عدد روز از ماه
|
|
||||||
/// </summary>
|
|
||||||
public int DayOfMonth { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// نمایش ساعت و دقیقه
|
|
||||||
/// </summary>
|
|
||||||
public string TimeOfDayDisplay { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,11 +9,6 @@ public class SmsReportDto
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string SentDate { get; set; }
|
public string SentDate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// نوع پیامک
|
|
||||||
/// </summary>
|
|
||||||
public string TypeOfSms { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using _0_Framework.Application.Enums;
|
|
||||||
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -25,9 +24,8 @@ public interface ISmsResultApplication
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="searchModel"></param>
|
/// <param name="searchModel"></param>
|
||||||
/// <param name="date"></param>
|
/// <param name="date"></param>
|
||||||
/// <param name="typeOfSmsSetting"></param>
|
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date, string typeOfSmsSetting);
|
Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
@@ -75,45 +75,4 @@ public interface ISmsSettingApplication
|
|||||||
/// <param name="command"></param>
|
/// <param name="command"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<OperationResult> InstantSendBlockSms(List<BlockSmsListData> command);
|
Task<OperationResult> InstantSendBlockSms(List<BlockSmsListData> command);
|
||||||
|
|
||||||
|
|
||||||
#region ForApi
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست پیامک های خودکار بر اساس نوع آن
|
|
||||||
/// Api
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="typeOfSmsSetting"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<SmsSettingDto>> GetSmsSettingList(TypeOfSmsSetting typeOfSmsSetting);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت اطلاعات تنظیمات پیامک جهت ویرایش
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<SmsSettingDto> GetSmsSettingDataToEdit(long id);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ویرایش تنظیمات پیامک
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="command"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<OperationResult> EditSmsSetting(SmsSettingDto command);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست ارسال آنی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<InstantReminderSendSms>> GetInstantReminderSmsListData(TypeOfSmsSetting typeOfSmsSetting);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک آنی
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="typeOfSmsSetting"></param>
|
|
||||||
/// <param name="phoneNumbers"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<OperationResult> InstantSmsSendApi(TypeOfSmsSetting typeOfSmsSetting, List<string> phoneNumbers);
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
@@ -152,8 +152,5 @@ public class CreateWorkshop
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsStaticCheckout { get; set; }
|
public bool IsStaticCheckout { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// آیا پاداش در فیش حقوقی محاسبه شود
|
|
||||||
/// </summary>
|
|
||||||
public bool RewardComputeOnCheckout { get; set; }
|
|
||||||
}
|
}
|
||||||
@@ -104,5 +104,10 @@ namespace CompanyManagment.Application
|
|||||||
Id = x.Id
|
Id = x.Id
|
||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<BankSelectList> GetBanksForSelectList()
|
||||||
|
{
|
||||||
|
return _bankRepository.GetBanksForSelectList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -240,16 +240,6 @@ public class CheckoutApplication : ICheckoutApplication
|
|||||||
|
|
||||||
command.InstallmentDeduction = loanInstallments.Sum(x => x.AmountForMonth.MoneyToDouble());
|
command.InstallmentDeduction = loanInstallments.Sum(x => x.AmountForMonth.MoneyToDouble());
|
||||||
|
|
||||||
var rewards = new List<CheckoutReward>();
|
|
||||||
double rewardPay = 0;
|
|
||||||
if (command.RewardPayCompute)
|
|
||||||
{
|
|
||||||
rewards = _rollCallMandatoryRepository.RewardForCheckout(command.EmployeeId, command.WorkshopId, checkoutEnd.ToGeorgianDateTime(), checkoutStart.ToGeorgianDateTime())
|
|
||||||
.Select(x => new CheckoutReward(x.Amount, x.AmountDouble, x.GrantDateFa, x.GrantDateGr, x.Description, x.Title, x.Id)).ToList();
|
|
||||||
|
|
||||||
rewardPay = rewards.Sum(x => x.AmountDouble);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -371,7 +361,7 @@ public class CheckoutApplication : ICheckoutApplication
|
|||||||
|
|
||||||
|
|
||||||
var totalClaimsDouble = monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance + command.OvertimePay +
|
var totalClaimsDouble = monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance + command.OvertimePay +
|
||||||
command.NightworkPay + familyAllowance + bunos + years + command.LeavePay + command.FridayPay + command.ShiftPay + rewardPay;
|
command.NightworkPay + familyAllowance + bunos + years + command.LeavePay + command.FridayPay + command.ShiftPay;
|
||||||
var totalClaims = totalClaimsDouble.ToMoney();
|
var totalClaims = totalClaimsDouble.ToMoney();
|
||||||
var totalDeductionDouble = insuranceDeduction + command.AbsenceDeduction + command.InstallmentDeduction + command.SalaryAidDeduction;
|
var totalDeductionDouble = insuranceDeduction + command.AbsenceDeduction + command.InstallmentDeduction + command.SalaryAidDeduction;
|
||||||
var totalDeductions = totalDeductionDouble.ToMoney();
|
var totalDeductions = totalDeductionDouble.ToMoney();
|
||||||
@@ -396,7 +386,7 @@ public class CheckoutApplication : ICheckoutApplication
|
|||||||
, command.OvertimePay, command.NightworkPay, command.FridayPay, 0, command.ShiftPay, familyAllowance, bunos, years, command.LeavePay, insuranceDeduction, 0, command.InstallmentDeduction, command.SalaryAidDeduction, command.AbsenceDeduction, sumOfWorkingDays,
|
, command.OvertimePay, command.NightworkPay, command.FridayPay, 0, command.ShiftPay, familyAllowance, bunos, years, command.LeavePay, insuranceDeduction, 0, command.InstallmentDeduction, command.SalaryAidDeduction, command.AbsenceDeduction, sumOfWorkingDays,
|
||||||
command.ArchiveCode, command.PersonnelCode, totalClaims, totalDeductions, totalPayment, command.Signature, marriedAllowance, command.LeaveCheckout, command.CreditLeaves, command.AbsencePeriod, command.AverageHoursPerDay, command.HasRollCall, command.OverTimeWorkValue, command.OverNightWorkValue
|
command.ArchiveCode, command.PersonnelCode, totalClaims, totalDeductions, totalPayment, command.Signature, marriedAllowance, command.LeaveCheckout, command.CreditLeaves, command.AbsencePeriod, command.AverageHoursPerDay, command.HasRollCall, command.OverTimeWorkValue, command.OverNightWorkValue
|
||||||
, command.FridayWorkValue, command.RotatingShiftValue, command.AbsenceValue, command.TotalDayOfLeaveCompute, command.TotalDayOfYearsCompute, command.TotalDayOfBunosesCompute,
|
, command.FridayWorkValue, command.RotatingShiftValue, command.AbsenceValue, command.TotalDayOfLeaveCompute, command.TotalDayOfYearsCompute, command.TotalDayOfBunosesCompute,
|
||||||
loanInstallments, salaryAids,checkoutRollCall,command.EmployeeMandatoryHours, hasInsuranceShareTheSameAsList, rewards, rewardPay);
|
loanInstallments, salaryAids,checkoutRollCall,command.EmployeeMandatoryHours, hasInsuranceShareTheSameAsList);
|
||||||
|
|
||||||
_checkoutRepository.CreateCkeckout(checkout).GetAwaiter().GetResult();
|
_checkoutRepository.CreateCkeckout(checkout).GetAwaiter().GetResult();
|
||||||
//_checkoutRepository.SaveChanges();
|
//_checkoutRepository.SaveChanges();
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\0_Framework\0_Framework.csproj" />
|
<ProjectReference Include="..\0_Framework\0_Framework.csproj" />
|
||||||
<ProjectReference Include="..\Company.Domain\Company.Domain.csproj" />
|
<ProjectReference Include="..\Company.Domain\Company.Domain.csproj" />
|
||||||
<ProjectReference Include="..\CompanyManagement.Infrastructure.Excel\CompanyManagement.Infrastructure.Excel.csproj" />
|
|
||||||
<ProjectReference Include="..\CompanyManagment.App.Contracts\CompanyManagment.App.Contracts.csproj" />
|
<ProjectReference Include="..\CompanyManagment.App.Contracts\CompanyManagment.App.Contracts.csproj" />
|
||||||
<ProjectReference Include="..\CompanyManagment.EFCore\CompanyManagment.EFCore.csproj" />
|
<ProjectReference Include="..\CompanyManagment.EFCore\CompanyManagment.EFCore.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using Company.Domain.EmployeeBankInformationAgg;
|
|||||||
using CompanyManagment.App.Contracts.EmployeeBankInformation;
|
using CompanyManagment.App.Contracts.EmployeeBankInformation;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace CompanyManagment.Application
|
namespace CompanyManagment.Application
|
||||||
{
|
{
|
||||||
@@ -101,7 +102,13 @@ namespace CompanyManagment.Application
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//todo: add CardNumber, BankAccountNumber, etc validations
|
public async Task<List<GroupedEmployeeBankInformationViewModel>> SearchAsync(long workshopId,
|
||||||
|
EmployeeBankInformationSearchModel searchParams)
|
||||||
|
{
|
||||||
|
return await _employeeBankInformationRepository.SearchAsync(workshopId, searchParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public OperationResult Edit(EditEmployeeInformation command)
|
public OperationResult Edit(EditEmployeeInformation command)
|
||||||
{
|
{
|
||||||
OperationResult op = new();
|
OperationResult op = new();
|
||||||
@@ -168,9 +175,6 @@ namespace CompanyManagment.Application
|
|||||||
{
|
{
|
||||||
var entity = _employeeBankInformationRepository.GetByEmployeeId(workshopId, employeeId);
|
var entity = _employeeBankInformationRepository.GetByEmployeeId(workshopId, employeeId);
|
||||||
|
|
||||||
if (entity == null)
|
|
||||||
return new();
|
|
||||||
|
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,6 +215,12 @@ namespace CompanyManagment.Application
|
|||||||
return _employeeBankInformationRepository.GetAllByWorkshopId(workshopId);
|
return _employeeBankInformationRepository.GetAllByWorkshopId(workshopId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<GetEmployeeBankInfoDetailsDto> GetDetailsByEmployeeIdAsync(long workshopId, long employeeId)
|
||||||
|
{
|
||||||
|
return await _employeeBankInformationRepository.GetDetailsByEmployeeIdAsync(workshopId, employeeId);
|
||||||
|
}
|
||||||
|
|
||||||
#region Private Methods
|
#region Private Methods
|
||||||
|
|
||||||
private OperationResult ValidateCreateOperation(List<GroupedEmployeeBankInformationViewModel> workshopEmployeeBankInfoList, CreateEmployeeInformation command)
|
private OperationResult ValidateCreateOperation(List<GroupedEmployeeBankInformationViewModel> workshopEmployeeBankInfoList, CreateEmployeeInformation command)
|
||||||
@@ -254,7 +264,6 @@ namespace CompanyManagment.Application
|
|||||||
x.WorkshopId == workshopId && x.EmployeeId == employeeId);
|
x.WorkshopId == workshopId && x.EmployeeId == employeeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1516,9 +1516,8 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
|||||||
.Where(x => x.WorkshopCreated && x.WorkshopId is > 0).ToList();
|
.Where(x => x.WorkshopCreated && x.WorkshopId is > 0).ToList();
|
||||||
|
|
||||||
var currentWorkshops = institutionContract.WorkshopGroup.CurrentWorkshops.ToList();
|
var currentWorkshops = institutionContract.WorkshopGroup.CurrentWorkshops.ToList();
|
||||||
var account = _contractingPartyRepository
|
var accountId = _contractingPartyRepository
|
||||||
.GetAccountByPersonalContractingParty(institutionContract.ContractingPartyId);
|
.GetAccountByPersonalContractingParty(institutionContract.ContractingPartyId).Id;
|
||||||
var accountId = account.Id;
|
|
||||||
foreach (var createdWorkshop in initialCreatedWorkshops)
|
foreach (var createdWorkshop in initialCreatedWorkshops)
|
||||||
{
|
{
|
||||||
if (currentWorkshops.Any(x => x.WorkshopId == createdWorkshop.WorkshopId))
|
if (currentWorkshops.Any(x => x.WorkshopId == createdWorkshop.WorkshopId))
|
||||||
@@ -1570,7 +1569,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
|||||||
var previousInstitutionContract = await _institutionContractRepository
|
var previousInstitutionContract = await _institutionContractRepository
|
||||||
.GetPreviousContract(institutionContract.id);
|
.GetPreviousContract(institutionContract.id);
|
||||||
previousInstitutionContract?.DeActive();
|
previousInstitutionContract?.DeActive();
|
||||||
await _contractingPartyRepository.ActiveAllAsync(institutionContract.ContractingPartyId);
|
ReActiveAllAfterCreateNew(institutionContract.ContractingPartyId);
|
||||||
await _institutionContractRepository.SaveChangesAsync();
|
await _institutionContractRepository.SaveChangesAsync();
|
||||||
return op.Succcedded();
|
return op.Succcedded();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1524,7 +1524,6 @@ public class InsuranceListApplication : IInsuranceListApplication
|
|||||||
var dateOfBirth = employeeData.DateOfBirthGr.ToFarsi();
|
var dateOfBirth = employeeData.DateOfBirthGr.ToFarsi();
|
||||||
var dateOfIssue = employeeData.DateOfIssueGr.ToFarsi();
|
var dateOfIssue = employeeData.DateOfIssueGr.ToFarsi();
|
||||||
var leftDate = employeeData.LeftWorkDateGr != null ? employeeData.LeftWorkDateGr.Value.AddDays(-1) : new DateTime();
|
var leftDate = employeeData.LeftWorkDateGr != null ? employeeData.LeftWorkDateGr.Value.AddDays(-1) : new DateTime();
|
||||||
|
|
||||||
var workingDays = Tools.GetEmployeeInsuranceWorkingDays(employeeData.StartWorkDateGr, leftDate, startDateGr, endDateGr, employeeData.EmployeeId);
|
var workingDays = Tools.GetEmployeeInsuranceWorkingDays(employeeData.StartWorkDateGr, leftDate, startDateGr, endDateGr, employeeData.EmployeeId);
|
||||||
var leftWorkFa = workingDays.hasLeftWorkInMonth ? employeeData.LeftWorkDateGr.ToFarsi() : "";
|
var leftWorkFa = workingDays.hasLeftWorkInMonth ? employeeData.LeftWorkDateGr.ToFarsi() : "";
|
||||||
var startWorkFa = employeeData.StartWorkDateGr.ToFarsi();
|
var startWorkFa = employeeData.StartWorkDateGr.ToFarsi();
|
||||||
@@ -1607,7 +1606,7 @@ public class InsuranceListApplication : IInsuranceListApplication
|
|||||||
MaritalStatus = employeeData.MaritalStatus,
|
MaritalStatus = employeeData.MaritalStatus,
|
||||||
|
|
||||||
StartMonthCurrent = startMonthFa,
|
StartMonthCurrent = startMonthFa,
|
||||||
WorkingDays = employeeData.WorkingDays,
|
WorkingDays = workingDays.countWorkingDays,
|
||||||
StartWorkDate = startWorkFa,
|
StartWorkDate = startWorkFa,
|
||||||
StartWorkDateGr = employeeData.StartWorkDateGr,
|
StartWorkDateGr = employeeData.StartWorkDateGr,
|
||||||
LeftWorkDate = leftWorkFa,
|
LeftWorkDate = leftWorkFa,
|
||||||
|
|||||||
@@ -3,11 +3,9 @@ using System.Collections.Generic;
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using _0_Framework.Domain.CustomizeCheckoutShared.Enums;
|
using _0_Framework.Domain.CustomizeCheckoutShared.Enums;
|
||||||
using _0_Framework.Exceptions;
|
|
||||||
using Company.Domain.CheckoutAgg;
|
using Company.Domain.CheckoutAgg;
|
||||||
using Company.Domain.CustomizeCheckoutAgg;
|
using Company.Domain.CustomizeCheckoutAgg;
|
||||||
using Company.Domain.CustomizeCheckoutTempAgg;
|
using Company.Domain.CustomizeCheckoutTempAgg;
|
||||||
@@ -18,8 +16,6 @@ using Company.Domain.LeaveAgg;
|
|||||||
using Company.Domain.RollCallAgg;
|
using Company.Domain.RollCallAgg;
|
||||||
using Company.Domain.RollCallAgg.DomainService;
|
using Company.Domain.RollCallAgg.DomainService;
|
||||||
using Company.Domain.RollCallEmployeeAgg;
|
using Company.Domain.RollCallEmployeeAgg;
|
||||||
using Company.Domain.WorkshopAgg;
|
|
||||||
using CompanyManagement.Infrastructure.Excel.RollCall;
|
|
||||||
using CompanyManagment.App.Contracts.Checkout;
|
using CompanyManagment.App.Contracts.Checkout;
|
||||||
using CompanyManagment.App.Contracts.Employee;
|
using CompanyManagment.App.Contracts.Employee;
|
||||||
using CompanyManagment.App.Contracts.RollCall;
|
using CompanyManagment.App.Contracts.RollCall;
|
||||||
@@ -38,9 +34,8 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
private readonly ICustomizeWorkshopSettingsRepository _customizeWorkshopSettingsRepository;
|
private readonly ICustomizeWorkshopSettingsRepository _customizeWorkshopSettingsRepository;
|
||||||
private readonly ICustomizeWorkshopEmployeeSettingsRepository _customizeWorkshopEmployeeSettingsRepository;
|
private readonly ICustomizeWorkshopEmployeeSettingsRepository _customizeWorkshopEmployeeSettingsRepository;
|
||||||
private readonly ICustomizeCheckoutTempRepository _customizeCheckoutTempRepository;
|
private readonly ICustomizeCheckoutTempRepository _customizeCheckoutTempRepository;
|
||||||
private readonly IWorkshopRepository _workshopRepository;
|
|
||||||
|
|
||||||
public RollCallApplication(IRollCallRepository rollCallRepository, IRollCallEmployeeRepository rollCallEmployeeRepository, IEmployeeRepository employeeRepository, ILeaveRepository leaveRepository, ICustomizeCheckoutRepository customizeCheckoutRepository, ICheckoutRepository checkoutRepository, IRollCallDomainService rollCallDomainService, ICustomizeWorkshopSettingsRepository customizeWorkshopSettingsRepository, ICustomizeWorkshopEmployeeSettingsRepository customizeWorkshopEmployeeSettingsRepository, ICustomizeCheckoutTempRepository customizeCheckoutTempRepository, IWorkshopRepository workshopRepository)
|
public RollCallApplication(IRollCallRepository rollCallRepository, IRollCallEmployeeRepository rollCallEmployeeRepository, IEmployeeRepository employeeRepository, ILeaveRepository leaveRepository, ICustomizeCheckoutRepository customizeCheckoutRepository, ICheckoutRepository checkoutRepository, IRollCallDomainService rollCallDomainService, ICustomizeWorkshopSettingsRepository customizeWorkshopSettingsRepository, ICustomizeWorkshopEmployeeSettingsRepository customizeWorkshopEmployeeSettingsRepository, ICustomizeCheckoutTempRepository customizeCheckoutTempRepository)
|
||||||
{
|
{
|
||||||
_rollCallRepository = rollCallRepository;
|
_rollCallRepository = rollCallRepository;
|
||||||
_rollCallEmployeeRepository = rollCallEmployeeRepository;
|
_rollCallEmployeeRepository = rollCallEmployeeRepository;
|
||||||
@@ -52,7 +47,6 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
_customizeWorkshopSettingsRepository = customizeWorkshopSettingsRepository;
|
_customizeWorkshopSettingsRepository = customizeWorkshopSettingsRepository;
|
||||||
_customizeWorkshopEmployeeSettingsRepository = customizeWorkshopEmployeeSettingsRepository;
|
_customizeWorkshopEmployeeSettingsRepository = customizeWorkshopEmployeeSettingsRepository;
|
||||||
_customizeCheckoutTempRepository = customizeCheckoutTempRepository;
|
_customizeCheckoutTempRepository = customizeCheckoutTempRepository;
|
||||||
_workshopRepository = workshopRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult Create(CreateRollCall command)
|
public OperationResult Create(CreateRollCall command)
|
||||||
@@ -453,7 +447,8 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
return operation.Failed("کارمند در بازه انتخاب شده مرخصی ساعتی دارد");
|
return operation.Failed("کارمند در بازه انتخاب شده مرخصی ساعتی دارد");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.StartDate.Value.Date >= y.StartDateGr.Date && x.EndDate.Value.Date <= y.EndDateGr.Date)))
|
||||||
|
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -463,9 +458,6 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
_rollCallDomainService.GetEmployeeShiftDateByRollCallStartDate(command.WorkshopId, command.EmployeeId,
|
_rollCallDomainService.GetEmployeeShiftDateByRollCallStartDate(command.WorkshopId, command.EmployeeId,
|
||||||
x.StartDate!.Value,x.EndDate.Value);
|
x.StartDate!.Value,x.EndDate.Value);
|
||||||
});
|
});
|
||||||
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.ShiftDate.Date >= y.StartDateGr.Date && x.ShiftDate.Date <= y.EndDateGr.Date)))
|
|
||||||
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
|
||||||
|
|
||||||
|
|
||||||
if (newRollCallDates.Any(x => x.ShiftDate.Date != date.Date))
|
if (newRollCallDates.Any(x => x.ShiftDate.Date != date.Date))
|
||||||
{
|
{
|
||||||
@@ -495,8 +487,8 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.ShiftDate.Date >= y.StartDateGr.Date
|
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.StartDate.Value.Date >= y.StartDateGr.Date
|
||||||
&& x.ShiftDate.Date <= y.EndDateGr.Date)))
|
&& x.EndDate.Value.Date <= y.EndDateGr.Date)))
|
||||||
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
||||||
|
|
||||||
|
|
||||||
@@ -640,6 +632,9 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
return operation.Failed("کارمند در بازه انتخاب شده مرخصی ساعتی دارد");
|
return operation.Failed("کارمند در بازه انتخاب شده مرخصی ساعتی دارد");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.StartDate.Value.Date >= y.StartDateGr.Date && x.EndDate.Value.Date <= y.EndDateGr.Date)))
|
||||||
|
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
||||||
|
|
||||||
|
|
||||||
newRollCallDates.ForEach(x =>
|
newRollCallDates.ForEach(x =>
|
||||||
{
|
{
|
||||||
@@ -647,11 +642,6 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
_rollCallDomainService.GetEmployeeShiftDateByRollCallStartDate(command.WorkshopId, command.EmployeeId,
|
_rollCallDomainService.GetEmployeeShiftDateByRollCallStartDate(command.WorkshopId, command.EmployeeId,
|
||||||
x.StartDate!.Value,x.EndDate.Value);
|
x.StartDate!.Value,x.EndDate.Value);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.ShiftDate.Date >= y.StartDateGr.Date && x.ShiftDate.Date <= y.EndDateGr.Date)))
|
|
||||||
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
|
||||||
|
|
||||||
|
|
||||||
if (newRollCallDates.Any(x => x.ShiftDate.Date != date.Date))
|
if (newRollCallDates.Any(x => x.ShiftDate.Date != date.Date))
|
||||||
{
|
{
|
||||||
return operation.Failed("حضور غیاب در حال ویرایش را نمیتوانید از تاریخ شیفت عقب تر یا جلو تر ببرید");
|
return operation.Failed("حضور غیاب در حال ویرایش را نمیتوانید از تاریخ شیفت عقب تر یا جلو تر ببرید");
|
||||||
@@ -674,7 +664,7 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
&& (y.StartDate.Value.Date <= x.ContractEndGr.Date))))
|
&& (y.StartDate.Value.Date <= x.ContractEndGr.Date))))
|
||||||
return operation.Failed("برای بازه های وارد شده فیش حقوقی ثبت شده است");
|
return operation.Failed("برای بازه های وارد شده فیش حقوقی ثبت شده است");
|
||||||
|
|
||||||
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.ShiftDate.Date >= y.StartDateGr.Date && x.ShiftDate.Date <= y.EndDateGr.Date)))
|
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.StartDate.Value.Date >= y.StartDateGr.Date && x.EndDate.Value.Date <= y.EndDateGr.Date)))
|
||||||
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
||||||
|
|
||||||
var currentDayRollCall = employeeRollCalls.FirstOrDefault(x => x.EndDate == null);
|
var currentDayRollCall = employeeRollCalls.FirstOrDefault(x => x.EndDate == null);
|
||||||
@@ -868,58 +858,4 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PagedResult<RollCallCaseHistoryTitleDto>> GetCaseHistoryTitles(long workshopId,
|
|
||||||
RollCallCaseHistorySearchModel searchModel)
|
|
||||||
{
|
|
||||||
return await _rollCallRepository.GetCaseHistoryTitles(workshopId,searchModel);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<List<RollCallCaseHistoryDetail>> GetCaseHistoryDetails(long workshopId,
|
|
||||||
string titleId, RollCallCaseHistorySearchModel searchModel)
|
|
||||||
{
|
|
||||||
return await _rollCallRepository.GetCaseHistoryDetails(workshopId, titleId, searchModel);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<RollCallCaseHistoryExcelDto> DownloadCaseHistoryExcel(long workshopId, string titleId,
|
|
||||||
RollCallCaseHistorySearchModel searchModel)
|
|
||||||
{
|
|
||||||
var data = await _rollCallRepository
|
|
||||||
.GetCaseHistoryDetails(workshopId, titleId, searchModel);
|
|
||||||
string nameSecondPart = "";
|
|
||||||
byte[] excelBytes;
|
|
||||||
|
|
||||||
if (Regex.IsMatch(titleId, @"^\d{4}_\d{2}$"))
|
|
||||||
{
|
|
||||||
var splitDate = titleId.Split("_");
|
|
||||||
var year = Convert.ToInt32(splitDate.First());
|
|
||||||
var month = Convert.ToInt32(splitDate.Last());
|
|
||||||
|
|
||||||
var monthName = Convert.ToInt32(month).ToFarsiMonthByIntNumber();
|
|
||||||
nameSecondPart = $"{year}/{monthName}";
|
|
||||||
excelBytes = RollCallExcelGenerator.CaseHistoryExcelForEmployee(data, titleId);
|
|
||||||
}
|
|
||||||
else if (Regex.IsMatch(titleId, @"^\d{4}/\d{2}/\d{2}$"))
|
|
||||||
{
|
|
||||||
var oneDayDate = titleId.ToGeorgianDateTime();
|
|
||||||
nameSecondPart = $" {oneDayDate.DayOfWeek.DayOfWeeKToPersian()}،{titleId}";
|
|
||||||
excelBytes = RollCallExcelGenerator.CaseHistoryExcelForOneDay(data, titleId);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new BadRequestException("شناسه سر تیتر وارد شده نامعتبر است");
|
|
||||||
}
|
|
||||||
|
|
||||||
var workshopFullName = _workshopRepository.Get(workshopId)?.WorkshopFullName ?? "بدون کارگاه";
|
|
||||||
|
|
||||||
var fileName = $"{workshopFullName} - {nameSecondPart}.xlsx";
|
|
||||||
|
|
||||||
var res = new RollCallCaseHistoryExcelDto()
|
|
||||||
{
|
|
||||||
Bytes = excelBytes,
|
|
||||||
MimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
||||||
FileName = fileName
|
|
||||||
};
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,26 +1,20 @@
|
|||||||
using _0_Framework.Application;
|
using System.Collections.Generic;
|
||||||
using _0_Framework.Application.Enums;
|
using System.Linq;
|
||||||
using _0_Framework.Application.Sms;
|
using System.Threading.Tasks;
|
||||||
|
using _0_Framework.Application;
|
||||||
using Company.Domain.SmsResultAgg;
|
using Company.Domain.SmsResultAgg;
|
||||||
using CompanyManagment.App.Contracts.SmsResult;
|
using CompanyManagment.App.Contracts.SmsResult;
|
||||||
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
using CompanyManagment.EFCore.Services;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using SmsResult = Company.Domain.SmsResultAgg.SmsResult;
|
|
||||||
|
|
||||||
namespace CompanyManagment.Application;
|
namespace CompanyManagment.Application;
|
||||||
|
|
||||||
public class SmsResultApplication : ISmsResultApplication
|
public class SmsResultApplication : ISmsResultApplication
|
||||||
{
|
{
|
||||||
private readonly ISmsResultRepository _smsResultRepository;
|
private readonly ISmsResultRepository _smsResultRepository;
|
||||||
private readonly ISmsService _smsService;
|
|
||||||
|
|
||||||
public SmsResultApplication(ISmsResultRepository smsResultRepository, ISmsService smsService)
|
public SmsResultApplication(ISmsResultRepository smsResultRepository)
|
||||||
{
|
{
|
||||||
_smsResultRepository = smsResultRepository;
|
_smsResultRepository = smsResultRepository;
|
||||||
_smsService = smsService;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -31,9 +25,9 @@ public class SmsResultApplication : ISmsResultApplication
|
|||||||
return await _smsResultRepository.GetSmsReportList(searchModel);
|
return await _smsResultRepository.GetSmsReportList(searchModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date, string typeOfSmsSetting)
|
public async Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date)
|
||||||
{
|
{
|
||||||
return await _smsResultRepository.GetSmsReportExpandList(searchModel, date, typeOfSmsSetting);
|
return await _smsResultRepository.GetSmsReportExpandList(searchModel, date);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -73,6 +67,4 @@ public class SmsResultApplication : ISmsResultApplication
|
|||||||
}).ToList();
|
}).ToList();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -9,8 +9,6 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
|
|
||||||
namespace CompanyManagment.Application;
|
namespace CompanyManagment.Application;
|
||||||
|
|
||||||
@@ -19,15 +17,12 @@ public class SmsSettingApplication : ISmsSettingApplication
|
|||||||
private readonly ISmsSettingsRepository _smsSettingsRepository;
|
private readonly ISmsSettingsRepository _smsSettingsRepository;
|
||||||
private readonly IInstitutionContractRepository _institutionContractRepository;
|
private readonly IInstitutionContractRepository _institutionContractRepository;
|
||||||
private readonly IInstitutionContractSmsServiceRepository _institutionContractSmsServiceRepository;
|
private readonly IInstitutionContractSmsServiceRepository _institutionContractSmsServiceRepository;
|
||||||
private readonly IHostEnvironment _hostEnvironment;
|
|
||||||
|
|
||||||
public SmsSettingApplication(ISmsSettingsRepository smsSettingsRepository, IInstitutionContractRepository institutionContractRepository, IInstitutionContractSmsServiceRepository institutionContractSmsServiceRepository, IHostEnvironment hostEnvironment)
|
public SmsSettingApplication(ISmsSettingsRepository smsSettingsRepository, IInstitutionContractRepository institutionContractRepository, IInstitutionContractSmsServiceRepository institutionContractSmsServiceRepository)
|
||||||
{
|
{
|
||||||
_smsSettingsRepository = smsSettingsRepository;
|
_smsSettingsRepository = smsSettingsRepository;
|
||||||
_institutionContractRepository = institutionContractRepository;
|
_institutionContractRepository = institutionContractRepository;
|
||||||
_institutionContractSmsServiceRepository = institutionContractSmsServiceRepository;
|
_institutionContractSmsServiceRepository = institutionContractSmsServiceRepository;
|
||||||
_hostEnvironment = hostEnvironment;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -136,12 +131,6 @@ public class SmsSettingApplication : ISmsSettingApplication
|
|||||||
public async Task<OperationResult> InstantSendReminderSms(List<SmsListData> command)
|
public async Task<OperationResult> InstantSendReminderSms(List<SmsListData> command)
|
||||||
{
|
{
|
||||||
var op = new OperationResult();
|
var op = new OperationResult();
|
||||||
if (_hostEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
|
|
||||||
return op.Failed(" در محیط توسعه امکان ارسال وجود ندارد ");
|
|
||||||
|
|
||||||
}
|
|
||||||
string typeOfSms = "یادآور بدهی ماهانه";
|
string typeOfSms = "یادآور بدهی ماهانه";
|
||||||
string sendMessStart = "شروع یادآور آنی";
|
string sendMessStart = "شروع یادآور آنی";
|
||||||
string sendMessEnd = "پایان یادآور آنی";
|
string sendMessEnd = "پایان یادآور آنی";
|
||||||
@@ -162,13 +151,6 @@ public class SmsSettingApplication : ISmsSettingApplication
|
|||||||
public async Task<OperationResult> InstantSendBlockSms(List<BlockSmsListData> command)
|
public async Task<OperationResult> InstantSendBlockSms(List<BlockSmsListData> command)
|
||||||
{
|
{
|
||||||
var op = new OperationResult();
|
var op = new OperationResult();
|
||||||
|
|
||||||
if (_hostEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
|
|
||||||
return op.Failed(" در محیط توسعه امکان ارسال وجود ندارد ");
|
|
||||||
|
|
||||||
}
|
|
||||||
string typeOfSms = "اعلام مسدودی طرف حساب";
|
string typeOfSms = "اعلام مسدودی طرف حساب";
|
||||||
string sendMessStart = "شروع مسدودی آنی";
|
string sendMessStart = "شروع مسدودی آنی";
|
||||||
string sendMessEnd = "پایان مسدودی آنی ";
|
string sendMessEnd = "پایان مسدودی آنی ";
|
||||||
@@ -183,166 +165,4 @@ public class SmsSettingApplication : ISmsSettingApplication
|
|||||||
return op.Failed("موردی انتخاب نشده است");
|
return op.Failed("موردی انتخاب نشده است");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region ForApi
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست پیامک های خودکار بر اساس نوع آن
|
|
||||||
/// Api
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="typeOfSmsSetting"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<List<SmsSettingDto>> GetSmsSettingList(TypeOfSmsSetting typeOfSmsSetting)
|
|
||||||
{
|
|
||||||
return await _smsSettingsRepository.GetSmsSettingList(typeOfSmsSetting);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<SmsSettingDto> GetSmsSettingDataToEdit(long id)
|
|
||||||
{
|
|
||||||
return await _smsSettingsRepository.GetSmsSettingDataToEdit(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<OperationResult> EditSmsSetting(SmsSettingDto command)
|
|
||||||
{
|
|
||||||
var op = new OperationResult();
|
|
||||||
var editSmsSetting = _smsSettingsRepository.Get(command.Id);
|
|
||||||
var timeSpan = new TimeSpan();
|
|
||||||
if (string.IsNullOrWhiteSpace(command.TimeOfDayDisplay))
|
|
||||||
return op.Failed("ساعت وارد نشده است");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
timeSpan = TimeSpan.ParseExact(command.TimeOfDayDisplay, @"hh\:mm", null);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
return op.Failed("فرمت ساعت اشتباه است");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (command.DayOfMonth < 1 || command.DayOfMonth > 31)
|
|
||||||
{
|
|
||||||
return op.Failed("عدد روز می بایست بین 1 تا 31 باشد");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_smsSettingsRepository.Exists(x => x.DayOfMonth == command.DayOfMonth && x.TimeOfDay == timeSpan && x.TypeOfSmsSetting == editSmsSetting.TypeOfSmsSetting && x.id != command.Id))
|
|
||||||
return op.Failed("رکورد ایجاد شده تکراری است");
|
|
||||||
|
|
||||||
|
|
||||||
editSmsSetting.Edit(command.DayOfMonth, timeSpan);
|
|
||||||
await _smsSettingsRepository.SaveChangesAsync();
|
|
||||||
|
|
||||||
return op.Succcedded();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<List<InstantReminderSendSms>> GetInstantReminderSmsListData(TypeOfSmsSetting typeOfSmsSetting)
|
|
||||||
{
|
|
||||||
var result = new List<InstantReminderSendSms>();
|
|
||||||
|
|
||||||
|
|
||||||
if (typeOfSmsSetting == TypeOfSmsSetting.InstitutionContractDebtReminder)
|
|
||||||
{
|
|
||||||
var data = await _institutionContractSmsServiceRepository.GetSmsListData(DateTime.Now, TypeOfSmsSetting.InstitutionContractDebtReminder);
|
|
||||||
|
|
||||||
if (data.Any())
|
|
||||||
{
|
|
||||||
result = data.GroupBy(x => x.PartyName).Select(m => new InstantReminderSendSms()
|
|
||||||
{
|
|
||||||
FullName = m.Key,
|
|
||||||
Amount = m.Select(c => c.Amount).First(),
|
|
||||||
InstantReminderSmsList = m.Select(c => new InstantReminderSmsList()
|
|
||||||
{
|
|
||||||
PhoneNumber = c.PhoneNumber,
|
|
||||||
}).ToList()
|
|
||||||
|
|
||||||
|
|
||||||
}).ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeOfSmsSetting == TypeOfSmsSetting.BlockContractingParty)
|
|
||||||
{
|
|
||||||
var data = await _institutionContractSmsServiceRepository.GetBlockListData(DateTime.Now);
|
|
||||||
|
|
||||||
if (data.Any())
|
|
||||||
{
|
|
||||||
result = data.GroupBy(x => x.PartyName).Select(m => new InstantReminderSendSms()
|
|
||||||
{
|
|
||||||
FullName = m.Key,
|
|
||||||
Amount = m.Select(c => c.Amount).First(),
|
|
||||||
InstantReminderSmsList = m.Select(c => new InstantReminderSmsList()
|
|
||||||
{
|
|
||||||
PhoneNumber = c.PhoneNumber,
|
|
||||||
}).ToList()
|
|
||||||
|
|
||||||
|
|
||||||
}).ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<OperationResult> InstantSmsSendApi(TypeOfSmsSetting typeOfSmsSetting, List<string> phoneNumbers)
|
|
||||||
{
|
|
||||||
|
|
||||||
var op = new OperationResult();
|
|
||||||
if (_hostEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
var str = "";
|
|
||||||
foreach (var item in phoneNumbers)
|
|
||||||
{
|
|
||||||
str += $" {item}, ";
|
|
||||||
}
|
|
||||||
return op.Failed(" در محیط توسعه امکان ارسال وجود ندارد " + " لیست ارسال شما " + str);
|
|
||||||
|
|
||||||
}
|
|
||||||
if (typeOfSmsSetting == TypeOfSmsSetting.InstitutionContractDebtReminder)
|
|
||||||
{
|
|
||||||
if (phoneNumbers.Any())
|
|
||||||
{
|
|
||||||
var data = await _institutionContractSmsServiceRepository.GetSmsListData(DateTime.Now, TypeOfSmsSetting.InstitutionContractDebtReminder);
|
|
||||||
|
|
||||||
if (data.Any())
|
|
||||||
{
|
|
||||||
phoneNumbers = phoneNumbers.Where(x => x.Length == 11).ToList();
|
|
||||||
var sendItems = data.Where(x => phoneNumbers.Contains(x.PhoneNumber)).ToList();
|
|
||||||
var res = await InstantSendReminderSms(sendItems);
|
|
||||||
return res;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return op.Succcedded();
|
|
||||||
}
|
|
||||||
|
|
||||||
return op.Failed("موردی انتخاب نشده است");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeOfSmsSetting == TypeOfSmsSetting.BlockContractingParty)
|
|
||||||
{
|
|
||||||
if (phoneNumbers.Any())
|
|
||||||
{
|
|
||||||
var data = await _institutionContractSmsServiceRepository.GetBlockListData(DateTime.Now);
|
|
||||||
|
|
||||||
if (data.Any())
|
|
||||||
{
|
|
||||||
phoneNumbers = phoneNumbers.Where(x => x.Length == 11).ToList();
|
|
||||||
var sendItems = data.Where(x => phoneNumbers.Contains(x.PhoneNumber)).ToList();
|
|
||||||
var res = await InstantSendBlockSms(sendItems);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
return op.Succcedded();
|
|
||||||
}
|
|
||||||
return op.Failed("موردی انتخاب نشده است");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return op.Failed("خطای انتخاب نوع ارسال");
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
@@ -34,7 +34,7 @@ class CheckoutMapping : IEntityTypeConfiguration<Checkout>
|
|||||||
builder.Property(x => x.FamilyAllowance);
|
builder.Property(x => x.FamilyAllowance);
|
||||||
builder.Property(x => x.HousingAllowance);
|
builder.Property(x => x.HousingAllowance);
|
||||||
builder.Property(x => x.ConsumableItems);
|
builder.Property(x => x.ConsumableItems);
|
||||||
builder.Property(x => x.RewardPay);
|
builder.Property(x => x.RewardPay).HasColumnType("float").IsRequired(false);
|
||||||
|
|
||||||
builder.Property(x => x.LeaveCheckout);
|
builder.Property(x => x.LeaveCheckout);
|
||||||
builder.Property(x => x.CreditLeaves);
|
builder.Property(x => x.CreditLeaves);
|
||||||
@@ -82,15 +82,6 @@ class CheckoutMapping : IEntityTypeConfiguration<Checkout>
|
|||||||
salaryAid.Property(x => x.CalculationDateTimeFa).HasMaxLength(15);
|
salaryAid.Property(x => x.CalculationDateTimeFa).HasMaxLength(15);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
builder.OwnsMany(x => x.Rewards, reward =>
|
|
||||||
{
|
|
||||||
reward.Property(x => x.Description).HasColumnType("ntext");
|
|
||||||
reward.Property(x => x.Title).HasMaxLength(255);
|
|
||||||
reward.Property(x=> x.Amount).HasMaxLength(25);
|
|
||||||
reward.Property(x => x.GrantDateFa).HasMaxLength(10);
|
|
||||||
});
|
|
||||||
|
|
||||||
builder.OwnsOne(x => x.CheckoutRollCall, rollCall =>
|
builder.OwnsOne(x => x.CheckoutRollCall, rollCall =>
|
||||||
{
|
{
|
||||||
rollCall.Property(x => x.TotalPresentTimeSpan).HasTimeSpanConversion();
|
rollCall.Property(x => x.TotalPresentTimeSpan).HasTimeSpanConversion();
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,66 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace CompanyManagment.EFCore.Migrations
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public partial class AddRewardtocheckout : Migration
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.AlterColumn<double>(
|
|
||||||
name: "RewardPay",
|
|
||||||
table: "Checkouts",
|
|
||||||
type: "float",
|
|
||||||
nullable: false,
|
|
||||||
defaultValue: 0.0,
|
|
||||||
oldClrType: typeof(double),
|
|
||||||
oldType: "float",
|
|
||||||
oldNullable: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "CheckoutReward",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Checkoutid = table.Column<long>(type: "bigint", nullable: false),
|
|
||||||
Id = table.Column<int>(type: "int", nullable: false)
|
|
||||||
.Annotation("SqlServer:Identity", "1, 1"),
|
|
||||||
Amount = table.Column<string>(type: "nvarchar(25)", maxLength: 25, nullable: true),
|
|
||||||
AmountDouble = table.Column<double>(type: "float", nullable: false),
|
|
||||||
GrantDateFa = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: true),
|
|
||||||
GrantDateGr = table.Column<DateTime>(type: "datetime2", nullable: false),
|
|
||||||
Description = table.Column<string>(type: "ntext", nullable: true),
|
|
||||||
Title = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: true),
|
|
||||||
EntityId = table.Column<long>(type: "bigint", nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_CheckoutReward", x => new { x.Checkoutid, x.Id });
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_CheckoutReward_Checkouts_Checkoutid",
|
|
||||||
column: x => x.Checkoutid,
|
|
||||||
principalTable: "Checkouts",
|
|
||||||
principalColumn: "id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "CheckoutReward");
|
|
||||||
|
|
||||||
migrationBuilder.AlterColumn<double>(
|
|
||||||
name: "RewardPay",
|
|
||||||
table: "Checkouts",
|
|
||||||
type: "float",
|
|
||||||
nullable: true,
|
|
||||||
oldClrType: typeof(double),
|
|
||||||
oldType: "float");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -635,7 +635,7 @@ namespace CompanyManagment.EFCore.Migrations
|
|||||||
.HasMaxLength(10)
|
.HasMaxLength(10)
|
||||||
.HasColumnType("nvarchar(10)");
|
.HasColumnType("nvarchar(10)");
|
||||||
|
|
||||||
b.Property<double>("RewardPay")
|
b.Property<double?>("RewardPay")
|
||||||
.HasColumnType("float");
|
.HasColumnType("float");
|
||||||
|
|
||||||
b.Property<string>("RotatingShiftValue")
|
b.Property<string>("RotatingShiftValue")
|
||||||
@@ -7501,49 +7501,6 @@ namespace CompanyManagment.EFCore.Migrations
|
|||||||
.HasForeignKey("Checkoutid");
|
.HasForeignKey("Checkoutid");
|
||||||
});
|
});
|
||||||
|
|
||||||
b.OwnsMany("Company.Domain.CheckoutAgg.ValueObjects.CheckoutReward", "Rewards", b1 =>
|
|
||||||
{
|
|
||||||
b1.Property<long>("Checkoutid")
|
|
||||||
.HasColumnType("bigint");
|
|
||||||
|
|
||||||
b1.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("int");
|
|
||||||
|
|
||||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property<int>("Id"));
|
|
||||||
|
|
||||||
b1.Property<string>("Amount")
|
|
||||||
.HasMaxLength(25)
|
|
||||||
.HasColumnType("nvarchar(25)");
|
|
||||||
|
|
||||||
b1.Property<double>("AmountDouble")
|
|
||||||
.HasColumnType("float");
|
|
||||||
|
|
||||||
b1.Property<string>("Description")
|
|
||||||
.HasColumnType("ntext");
|
|
||||||
|
|
||||||
b1.Property<long>("EntityId")
|
|
||||||
.HasColumnType("bigint");
|
|
||||||
|
|
||||||
b1.Property<string>("GrantDateFa")
|
|
||||||
.HasMaxLength(10)
|
|
||||||
.HasColumnType("nvarchar(10)");
|
|
||||||
|
|
||||||
b1.Property<DateTime>("GrantDateGr")
|
|
||||||
.HasColumnType("datetime2");
|
|
||||||
|
|
||||||
b1.Property<string>("Title")
|
|
||||||
.HasMaxLength(255)
|
|
||||||
.HasColumnType("nvarchar(255)");
|
|
||||||
|
|
||||||
b1.HasKey("Checkoutid", "Id");
|
|
||||||
|
|
||||||
b1.ToTable("CheckoutReward");
|
|
||||||
|
|
||||||
b1.WithOwner()
|
|
||||||
.HasForeignKey("Checkoutid");
|
|
||||||
});
|
|
||||||
|
|
||||||
b.OwnsMany("Company.Domain.CheckoutAgg.ValueObjects.CheckoutSalaryAid", "SalaryAids", b1 =>
|
b.OwnsMany("Company.Domain.CheckoutAgg.ValueObjects.CheckoutSalaryAid", "SalaryAids", b1 =>
|
||||||
{
|
{
|
||||||
b1.Property<long>("Checkoutid")
|
b1.Property<long>("Checkoutid")
|
||||||
@@ -7588,8 +7545,6 @@ namespace CompanyManagment.EFCore.Migrations
|
|||||||
|
|
||||||
b.Navigation("LoanInstallments");
|
b.Navigation("LoanInstallments");
|
||||||
|
|
||||||
b.Navigation("Rewards");
|
|
||||||
|
|
||||||
b.Navigation("SalaryAids");
|
b.Navigation("SalaryAids");
|
||||||
|
|
||||||
b.Navigation("Workshop");
|
b.Navigation("Workshop");
|
||||||
|
|||||||
@@ -31,4 +31,13 @@ public class BankRepository:RepositoryBase<long,Bank>,IBankRepository
|
|||||||
BankLogoPictureMediaId = x.BankLogoMediaId
|
BankLogoPictureMediaId = x.BankLogoMediaId
|
||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<BankSelectList> GetBanksForSelectList()
|
||||||
|
{
|
||||||
|
return context.Banks.Select(x => new BankSelectList()
|
||||||
|
{
|
||||||
|
Id = x.id,
|
||||||
|
Text = x.BankName
|
||||||
|
}).ToList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -531,7 +531,6 @@ public class CheckoutRepository : RepositoryBase<long, Checkout>, ICheckoutRepos
|
|||||||
|
|
||||||
entity.SetSalaryAid(command.SalaryAids, command.SalaryAidDeduction);
|
entity.SetSalaryAid(command.SalaryAids, command.SalaryAidDeduction);
|
||||||
entity.SetLoanInstallment(command.LoanInstallments, command.InstallmentDeduction);
|
entity.SetLoanInstallment(command.LoanInstallments, command.InstallmentDeduction);
|
||||||
entity.SetReward(command.Rewards,command.RewardPay);
|
|
||||||
entity.SetCheckoutRollCall(command.CheckoutRollCall);
|
entity.SetCheckoutRollCall(command.CheckoutRollCall);
|
||||||
entity.SetEmployeeMandatoryHours(command.EmployeeMandatoryHours);
|
entity.SetEmployeeMandatoryHours(command.EmployeeMandatoryHours);
|
||||||
if(command.HasInsuranceShareTheSameAsList)
|
if(command.HasInsuranceShareTheSameAsList)
|
||||||
@@ -935,7 +934,7 @@ public class CheckoutRepository : RepositoryBase<long, Checkout>, ICheckoutRepos
|
|||||||
TotalClaims = item.TotalClaims,
|
TotalClaims = item.TotalClaims,
|
||||||
TotalDeductions = item.TotalDeductions,
|
TotalDeductions = item.TotalDeductions,
|
||||||
TotalPayment = item.TotalPayment.ToMoney(),
|
TotalPayment = item.TotalPayment.ToMoney(),
|
||||||
RewardPay = item.RewardPay.ToMoney(),
|
RewardPay = item.RewardPay.ToMoneyNullable(),
|
||||||
ContractStartGr = item.ContractStart,
|
ContractStartGr = item.ContractStart,
|
||||||
ContractEndGr = item.ContractEnd,
|
ContractEndGr = item.ContractEnd,
|
||||||
IsLeft = false,
|
IsLeft = false,
|
||||||
@@ -1336,7 +1335,7 @@ public class CheckoutRepository : RepositoryBase<long, Checkout>, ICheckoutRepos
|
|||||||
TotalClaims = x.TotalClaims,
|
TotalClaims = x.TotalClaims,
|
||||||
TotalDeductions = x.TotalDeductions,
|
TotalDeductions = x.TotalDeductions,
|
||||||
TotalPayment = x.TotalPayment.ToMoney(),
|
TotalPayment = x.TotalPayment.ToMoney(),
|
||||||
RewardPay = x.RewardPay.ToMoney(),
|
RewardPay = x.RewardPay.ToMoneyNullable(),
|
||||||
ContractStartGr = x.ContractStart,
|
ContractStartGr = x.ContractStart,
|
||||||
ContractEndGr = x.ContractEnd,
|
ContractEndGr = x.ContractEnd,
|
||||||
IsLeft = false,
|
IsLeft = false,
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ using CompanyManagment.App.Contracts.EmployeeBankInformation;
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using _0_Framework.Exceptions;
|
||||||
|
|
||||||
namespace CompanyManagment.EFCore.Repository;
|
namespace CompanyManagment.EFCore.Repository;
|
||||||
|
|
||||||
@@ -76,6 +78,76 @@ public class EmployeeBankInformationRepository : RepositoryBase<long, EmployeeBa
|
|||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<List<GroupedEmployeeBankInformationViewModel>> SearchAsync(long workshopId, EmployeeBankInformationSearchModel searchParams)
|
||||||
|
{
|
||||||
|
var bankInfoQuery = _companyContext.EmployeeBankInformationSet
|
||||||
|
.Where(x => x.WorkshopId == workshopId)
|
||||||
|
.Select(x => new
|
||||||
|
{
|
||||||
|
x.BankId,
|
||||||
|
x.EmployeeId,
|
||||||
|
x.WorkshopId,
|
||||||
|
}).AsQueryable();
|
||||||
|
|
||||||
|
if (searchParams.BankId > 0)
|
||||||
|
bankInfoQuery = bankInfoQuery.Where(x => x.BankId == searchParams.BankId);
|
||||||
|
|
||||||
|
if (searchParams.EmployeeId > 0)
|
||||||
|
bankInfoQuery = bankInfoQuery.Where(x => x.EmployeeId == searchParams.EmployeeId);
|
||||||
|
|
||||||
|
var bankInfoList = await bankInfoQuery.ToListAsync();
|
||||||
|
|
||||||
|
var employeeIds = bankInfoList.Select(x => x.EmployeeId).Distinct().ToList();
|
||||||
|
|
||||||
|
var employees = await _companyContext.Employees
|
||||||
|
.Where(x => employeeIds.Contains(x.id)).ToListAsync();
|
||||||
|
|
||||||
|
var personnelCodes = await _companyContext.PersonnelCodeSet
|
||||||
|
.Where(x=>employeeIds.Contains(x.EmployeeId) && x.WorkshopId == workshopId)
|
||||||
|
.ToDictionaryAsync(x=>x.EmployeeId,x=>x.PersonnelCode);
|
||||||
|
|
||||||
|
var bankIds = bankInfoList.Select(x=>x.BankId).Distinct().ToList();
|
||||||
|
|
||||||
|
var banks =await _companyContext.Banks.Where(x => bankIds.Contains(x.id)).ToListAsync();
|
||||||
|
|
||||||
|
|
||||||
|
//Get bank logos from account context
|
||||||
|
var mediaIds = banks.Select(x=>x.BankLogoMediaId).ToList();
|
||||||
|
|
||||||
|
var banksLogos = _accountContext.Medias.Where(y => mediaIds.Contains(y.id))
|
||||||
|
.Select(media => new { media.Path, MediaId = media.id }).ToList();
|
||||||
|
|
||||||
|
var banksWithLogo = banks.Select(x => new
|
||||||
|
{
|
||||||
|
Logo = banksLogos.FirstOrDefault(l => l.MediaId == x.BankLogoMediaId),
|
||||||
|
Bank = x
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
|
return bankInfoList.GroupBy(x => x.EmployeeId).Select(x =>
|
||||||
|
{
|
||||||
|
var employee = employees.FirstOrDefault(e=>e.id == x.Key);
|
||||||
|
|
||||||
|
var selectBankId = x.Select(b => b.BankId);
|
||||||
|
|
||||||
|
var selectBanks = banksWithLogo
|
||||||
|
.Where(b => selectBankId.Contains(b.Bank.id)).ToList();
|
||||||
|
|
||||||
|
return new GroupedEmployeeBankInformationViewModel()
|
||||||
|
{
|
||||||
|
BankPicturesList =
|
||||||
|
selectBanks.Select(y => y.Logo.Path).ToList(),
|
||||||
|
EmployeeId = x.Key,
|
||||||
|
WorkshopId = workshopId,
|
||||||
|
EmployeeName = employee?.FullName ?? "",
|
||||||
|
TotalBankAccountsCount = x.Count(),
|
||||||
|
PersonnelCode = personnelCodes.TryGetValue(x.Key,out var value)?
|
||||||
|
value.ToString() :
|
||||||
|
"",
|
||||||
|
BankNamesList = selectBanks.Select(y => y.Bank.BankName).ToList()
|
||||||
|
};
|
||||||
|
}).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void RemoveByEmployeeId(IEnumerable<EmployeeBankInformation> entities)
|
public void RemoveByEmployeeId(IEnumerable<EmployeeBankInformation> entities)
|
||||||
{
|
{
|
||||||
@@ -265,4 +337,55 @@ public class EmployeeBankInformationRepository : RepositoryBase<long, EmployeeBa
|
|||||||
};
|
};
|
||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<GetEmployeeBankInfoDetailsDto> GetDetailsByEmployeeIdAsync(long workshopId, long employeeId)
|
||||||
|
{
|
||||||
|
var employeeBankInfos =await _companyContext.EmployeeBankInformationSet
|
||||||
|
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId).ToListAsync();
|
||||||
|
|
||||||
|
if (employeeBankInfos.Count == 0)
|
||||||
|
{
|
||||||
|
throw new NotFoundException("اطلاعات بانکی یافت نشد");
|
||||||
|
}
|
||||||
|
var employee = await _companyContext.Employees
|
||||||
|
.FirstOrDefaultAsync(x=>x.id == employeeId);
|
||||||
|
|
||||||
|
if (employee == null)
|
||||||
|
{
|
||||||
|
throw new NotFoundException("پرسنل مورد نظر یافت نشد");
|
||||||
|
}
|
||||||
|
|
||||||
|
var employeeFullName = employee.FullName;
|
||||||
|
|
||||||
|
var bankIds = employeeBankInfos.Select(x => x.BankId).Distinct().ToList();
|
||||||
|
|
||||||
|
var banks = await _companyContext.Banks.Where(x => bankIds.Contains(x.id)).ToListAsync();
|
||||||
|
|
||||||
|
var mediaIds = banks.Select(x => x.BankLogoMediaId).ToList();
|
||||||
|
|
||||||
|
var bankLogos = await _accountContext.Medias.Where(x=>mediaIds.Contains(x.id)).ToListAsync();
|
||||||
|
|
||||||
|
var res = new GetEmployeeBankInfoDetailsDto()
|
||||||
|
{
|
||||||
|
EmployeeId = employeeId,
|
||||||
|
EmployeeFullName = employeeFullName,
|
||||||
|
BankItems = employeeBankInfos.Select(x =>
|
||||||
|
{
|
||||||
|
var bank = banks.FirstOrDefault(y => y.id == x.BankId);
|
||||||
|
var bankLogo = bankLogos.FirstOrDefault(l => bank?.BankLogoMediaId == l.id);
|
||||||
|
return new GetEmployeeBankInfoDetailsBankItemDto()
|
||||||
|
{
|
||||||
|
BankId = x.BankId,
|
||||||
|
BankAccountNumber = x.BankAccountNumber,
|
||||||
|
BankLogoPath = bankLogo?.Path ?? "",
|
||||||
|
BankName = bank?.BankName ?? "",
|
||||||
|
CardNumber = x.CardNumber,
|
||||||
|
ShebaNumber = x.ShebaNumber,
|
||||||
|
IsDefault = x.IsDefault,
|
||||||
|
Id = x.id
|
||||||
|
};
|
||||||
|
}).ToList()
|
||||||
|
};
|
||||||
|
return res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -713,15 +713,10 @@ public class EmployeeDocumentsRepository : RepositoryBase<long, EmployeeDocument
|
|||||||
var itemsQuery = _companyContext.EmployeeDocumentItems
|
var itemsQuery = _companyContext.EmployeeDocumentItems
|
||||||
.Where(x => x.DocumentStatus != DocumentStatus.Unsubmitted)
|
.Where(x => x.DocumentStatus != DocumentStatus.Unsubmitted)
|
||||||
.Include(x => x.EmployeeDocuments)
|
.Include(x => x.EmployeeDocuments)
|
||||||
.ThenInclude(x => x.Workshop)
|
.ThenInclude(x => x.Workshop).ThenInclude(x => x.WorkshopEmployers).ThenInclude(x => x.Employer)
|
||||||
.ThenInclude(x => x.WorkshopEmployers)
|
.GroupBy(x => x.WorkshopId).Select(x => new WorkshopWithEmployeeDocumentsViewModel()
|
||||||
.ThenInclude(x => x.Employer)
|
|
||||||
.GroupBy(x => x.WorkshopId)
|
|
||||||
.Select(x => new WorkshopWithEmployeeDocumentsViewModel()
|
|
||||||
{
|
{
|
||||||
SubmittedItemsCount = x
|
SubmittedItemsCount = x.Count(y => y.DocumentStatus == DocumentStatus.SubmittedByAdmin || y.DocumentStatus == DocumentStatus.SubmittedByClient),
|
||||||
.Count(y => y.DocumentStatus == DocumentStatus.SubmittedByAdmin
|
|
||||||
|| y.DocumentStatus == DocumentStatus.SubmittedByClient),
|
|
||||||
WorkshopId = x.Key,
|
WorkshopId = x.Key,
|
||||||
WorkshopFullName = x.First().EmployeeDocuments.Workshop.WorkshopName,
|
WorkshopFullName = x.First().EmployeeDocuments.Workshop.WorkshopName,
|
||||||
EmployerName = x.First().EmployeeDocuments.Workshop.WorkshopEmployers.First().Employer.FullName
|
EmployerName = x.First().EmployeeDocuments.Workshop.WorkshopEmployers.First().Employer.FullName
|
||||||
|
|||||||
@@ -1474,8 +1474,7 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
IsInPersonContract = workshopGroup?.CurrentWorkshops
|
IsInPersonContract = workshopGroup?.CurrentWorkshops
|
||||||
.Any(y => y.Services.ContractInPerson) ?? true,
|
.Any(y => y.Services.ContractInPerson) ?? true,
|
||||||
IsOldContract = x.contract.SigningType == InstitutionContractSigningType.Legacy,
|
IsOldContract = x.contract.SigningType == InstitutionContractSigningType.Legacy,
|
||||||
InstitutionContractIsSentFlag =
|
InstitutionContractIsSentFlag = sendFlags.ContainsKey(x.contract.id) ? sendFlags[x.contract.id] : false
|
||||||
sendFlags.ContainsKey(x.contract.id) ? sendFlags[x.contract.id] : false
|
|
||||||
};
|
};
|
||||||
}).ToList()
|
}).ToList()
|
||||||
};
|
};
|
||||||
@@ -2269,8 +2268,7 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
extenstionTemp
|
extenstionTemp
|
||||||
);
|
);
|
||||||
|
|
||||||
var workshopIds = prevInstitutionContracts.WorkshopGroup?.CurrentWorkshops?.Select(x => x.WorkshopId.Value) ??
|
var workshopIds = prevInstitutionContracts.WorkshopGroup.CurrentWorkshops.Select(x => x.WorkshopId.Value);
|
||||||
[];
|
|
||||||
|
|
||||||
var workshopsNotInInstitution = employerWorkshopIds.Where(x => !workshopIds.Contains(x)).ToList();
|
var workshopsNotInInstitution = employerWorkshopIds.Where(x => !workshopIds.Contains(x)).ToList();
|
||||||
|
|
||||||
@@ -2278,7 +2276,7 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
.Where(x => workshopIds.Contains(x.id) || employerWorkshopIds.Contains(x.id))
|
.Where(x => workshopIds.Contains(x.id) || employerWorkshopIds.Contains(x.id))
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
var workshopDetails = prevInstitutionContracts.WorkshopGroup?.CurrentWorkshops?
|
var workshopDetails = prevInstitutionContracts.WorkshopGroup.CurrentWorkshops
|
||||||
.Select(x =>
|
.Select(x =>
|
||||||
{
|
{
|
||||||
var workshop = workshops.FirstOrDefault(w => w.id == x.WorkshopId);
|
var workshop = workshops.FirstOrDefault(w => w.id == x.WorkshopId);
|
||||||
@@ -2318,7 +2316,7 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
WorkshopId = workshop?.id ?? 0,
|
WorkshopId = workshop?.id ?? 0,
|
||||||
RollCallInPerson = service.RollCallInPerson
|
RollCallInPerson = service.RollCallInPerson
|
||||||
};
|
};
|
||||||
}).ToList() ?? [];
|
}).ToList();
|
||||||
var notIncludeWorskhopsLeftWork = await _context.LeftWorkList
|
var notIncludeWorskhopsLeftWork = await _context.LeftWorkList
|
||||||
.Where(x => workshopsNotInInstitution.Contains(x.WorkshopId) && x.StartWorkDate <= DateTime.Now &&
|
.Where(x => workshopsNotInInstitution.Contains(x.WorkshopId) && x.StartWorkDate <= DateTime.Now &&
|
||||||
x.LeftWorkDate >= DateTime.Now)
|
x.LeftWorkDate >= DateTime.Now)
|
||||||
@@ -2960,11 +2958,8 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
|
|
||||||
await SaveChangesAsync();
|
await SaveChangesAsync();
|
||||||
|
|
||||||
if (!request.CancelSendVerificationSms)
|
|
||||||
{
|
|
||||||
await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName,
|
await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName,
|
||||||
entity.PublicId, contractingParty.id, entity.id);
|
entity.PublicId, contractingParty.id, entity.id);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
await SaveChangesAsync();
|
await SaveChangesAsync();
|
||||||
@@ -3363,17 +3358,9 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
OneMonthPrice = institution.ContractAmountWithTax.ToMoney(),
|
OneMonthPrice = institution.ContractAmountWithTax.ToMoney(),
|
||||||
OneMonthWithoutTax = institution.ContractAmount.ToMoney(),
|
OneMonthWithoutTax = institution.ContractAmount.ToMoney(),
|
||||||
OneMonthTax = institution.ContractAmountTax.ToMoney(),
|
OneMonthTax = institution.ContractAmountTax.ToMoney(),
|
||||||
VerifierFullName =
|
VerifierFullName = institution.VerifierFullName,
|
||||||
institution.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify
|
VerifierPhoneNumber = institution.VerifierPhoneNumber,
|
||||||
? null
|
VerifyCode = institution.VerifyCode,
|
||||||
: institution.VerifierFullName,
|
|
||||||
VerifierPhoneNumber =
|
|
||||||
institution.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify
|
|
||||||
? null
|
|
||||||
: institution.VerifierPhoneNumber,
|
|
||||||
VerifyCode = institution.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify
|
|
||||||
? null
|
|
||||||
: institution.VerifyCode,
|
|
||||||
VerifyDate = institution.VerifyCodeCreation.ToFarsi(),
|
VerifyDate = institution.VerifyCodeCreation.ToFarsi(),
|
||||||
VerifyTime = institution.VerifyCodeCreation.ToString("HH:mm:ss"),
|
VerifyTime = institution.VerifyCodeCreation.ToString("HH:mm:ss"),
|
||||||
Workshops = institution.WorkshopGroup.InitialWorkshops
|
Workshops = institution.WorkshopGroup.InitialWorkshops
|
||||||
@@ -3576,6 +3563,10 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region PrivateMetods
|
#region PrivateMetods
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -3620,8 +3611,11 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
//ایجاد سند مالی ماهانه
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//ایجاد سند مالی ماهانه
|
||||||
#region CreateMontlyTransaction
|
#region CreateMontlyTransaction
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -3631,6 +3625,7 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
public async Task CreateTransactionForInstitutionContracts(DateTime endOfMonthGr, string endOfMonthFa,
|
public async Task CreateTransactionForInstitutionContracts(DateTime endOfMonthGr, string endOfMonthFa,
|
||||||
string description)
|
string description)
|
||||||
{
|
{
|
||||||
|
|
||||||
#region FindeNextMonth 1th
|
#region FindeNextMonth 1th
|
||||||
|
|
||||||
var firstDayOfMonthGr = ($"{endOfMonthFa.Substring(0, 8)}01").ToGeorgianDateTime();
|
var firstDayOfMonthGr = ($"{endOfMonthFa.Substring(0, 8)}01").ToGeorgianDateTime();
|
||||||
@@ -4013,6 +4008,8 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<long> GetIdByInstallmentId(long installmentId)
|
public async Task<long> GetIdByInstallmentId(long installmentId)
|
||||||
{
|
{
|
||||||
return await _context.InstitutionContractSet.Include(x => x.Installments)
|
return await _context.InstitutionContractSet.Include(x => x.Installments)
|
||||||
@@ -4367,11 +4364,10 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
var creationTemp = await _institutionContractCreationTemp.Find(x => x.Id == request.TempId)
|
var creationTemp = await _institutionContractCreationTemp.Find(x => x.Id == request.TempId)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
// creationTemp.SetContractingPartyInfo(request.LegalType,request.RealParty,request.LegalParty);
|
// creationTemp.SetContractingPartyInfo(request.LegalType,request.RealParty,request.LegalParty);
|
||||||
bool tempCreated = false;
|
|
||||||
if (creationTemp == null)
|
if (creationTemp == null)
|
||||||
{
|
{
|
||||||
creationTemp = new InstitutionContractCreationTemp();
|
throw new BadRequestException("دیتای درخواست شده نامعتبر است");
|
||||||
await _institutionContractCreationTemp.InsertOneAsync(creationTemp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<WorkshopTempViewModel> workshopDetails = [];
|
List<WorkshopTempViewModel> workshopDetails = [];
|
||||||
@@ -4449,6 +4445,7 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
Id = 0,
|
Id = 0,
|
||||||
IdNumberSerial = "",
|
IdNumberSerial = "",
|
||||||
IdNumberSeri = "",
|
IdNumberSeri = "",
|
||||||
|
|
||||||
};
|
};
|
||||||
creationTemp.SetContractingPartyInfo(request.LegalType, real, legal);
|
creationTemp.SetContractingPartyInfo(request.LegalType, real, legal);
|
||||||
}
|
}
|
||||||
@@ -4465,8 +4462,7 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
var res = new InstitutionContractCreationWorkshopsResponse()
|
var res = new InstitutionContractCreationWorkshopsResponse()
|
||||||
{
|
{
|
||||||
TotalAmount = workshopDetails.Sum(x => x.WorkshopServicesAmount).ToMoney(),
|
TotalAmount = workshopDetails.Sum(x => x.WorkshopServicesAmount).ToMoney(),
|
||||||
WorkshopTemps = workshopDetails,
|
WorkshopTemps = workshopDetails
|
||||||
TempId = creationTemp.Id
|
|
||||||
};
|
};
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -5113,11 +5109,9 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
|
|
||||||
await SaveChangesAsync();
|
await SaveChangesAsync();
|
||||||
|
|
||||||
if (!request.CancelSendVerificationSms)
|
|
||||||
{
|
|
||||||
await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName,
|
await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName,
|
||||||
entity.PublicId, contractingParty.id, entity.id);
|
entity.PublicId, contractingParty.id, entity.id);
|
||||||
}
|
|
||||||
|
|
||||||
await SaveChangesAsync();
|
await SaveChangesAsync();
|
||||||
await transaction.CommitAsync();
|
await transaction.CommitAsync();
|
||||||
@@ -5227,6 +5221,11 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region CustomViewModels
|
#region CustomViewModels
|
||||||
|
|
||||||
public class WorkshopsAndEmployeeViewModel
|
public class WorkshopsAndEmployeeViewModel
|
||||||
|
|||||||
@@ -2109,24 +2109,11 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase<long, Inst
|
|||||||
int successProcess = 1;
|
int successProcess = 1;
|
||||||
int countList = smsListData.Count;
|
int countList = smsListData.Count;
|
||||||
|
|
||||||
#region Test
|
|
||||||
|
|
||||||
|
|
||||||
//for (int i = 0; i < 100; i++)
|
|
||||||
//{
|
|
||||||
// var percent = (successProcess / (double)countList) * 100;
|
|
||||||
// await _hubContext.Clients.Group(SendSmsHub.GetGroupName(7))
|
|
||||||
// .SendAsync("showStatus", (int)percent);
|
|
||||||
// Thread.Sleep(1000);
|
|
||||||
// successProcess += 1;
|
|
||||||
//}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
foreach (var item in smsListData)
|
foreach (var item in smsListData)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
if (item.TypeOfSmsMethod == "MonthlyBill")
|
if (item.TypeOfSmsMethod == "MonthlyBill")
|
||||||
{
|
{
|
||||||
var res = await _smsService.MonthlyBill(item.PhoneNumber, item.TemplateId, item.PartyName,
|
var res = await _smsService.MonthlyBill(item.PhoneNumber, item.TemplateId, item.PartyName,
|
||||||
|
|||||||
@@ -171,17 +171,12 @@ public class LoanRepository : RepositoryBase<long, Loan>, ILoanRepository
|
|||||||
query = query.Where(x => x.StartInstallmentPayment >= startDate && x.StartInstallmentPayment <= endDate);
|
query = query.Where(x => x.StartInstallmentPayment >= startDate && x.StartInstallmentPayment <= endDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
result.LoanListViewModel = new PagedResult<LoanViewModel>()
|
result.LoanListViewModel = query.OrderByDescending(x => x.StartInstallmentPayment).Skip(searchModel.PageIndex)
|
||||||
{
|
|
||||||
TotalCount = query.Count(),
|
|
||||||
List = query.OrderByDescending(x => x.StartInstallmentPayment)
|
|
||||||
.ApplyPagination(searchModel.PageIndex, searchModel.PageSize)
|
|
||||||
.Take(30).ToList()
|
.Take(30).ToList()
|
||||||
.Select(x => new LoanViewModel()
|
.Select(x => new LoanViewModel()
|
||||||
{
|
{
|
||||||
EmployeeFullName = employees.FirstOrDefault(e => e.id == x.EmployeeId).FullName,
|
EmployeeFullName = employees.FirstOrDefault(e => e.id == x.EmployeeId).FullName,
|
||||||
PersonnelCode = personnelCodes.FirstOrDefault(p => p.EmployeeId == x.EmployeeId).PersonnelCode
|
PersonnelCode = personnelCodes.FirstOrDefault(p => p.EmployeeId == x.EmployeeId).PersonnelCode.ToString(),
|
||||||
.ToString(),
|
|
||||||
Amount = x.Amount.ToMoney(),
|
Amount = x.Amount.ToMoney(),
|
||||||
AmountPerMonth = x.AmountPerMonth.ToMoney(),
|
AmountPerMonth = x.AmountPerMonth.ToMoney(),
|
||||||
StartDateTime = x.StartInstallmentPayment.ToFarsi(),
|
StartDateTime = x.StartInstallmentPayment.ToFarsi(),
|
||||||
@@ -191,9 +186,7 @@ public class LoanRepository : RepositoryBase<long, Loan>, ILoanRepository
|
|||||||
EmployeeId = x.EmployeeId,
|
EmployeeId = x.EmployeeId,
|
||||||
YearFa = pc.GetYear(x.StartInstallmentPayment).ToString(),
|
YearFa = pc.GetYear(x.StartInstallmentPayment).ToString(),
|
||||||
|
|
||||||
}).ToList()
|
}).ToList();
|
||||||
};
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ public class PersonalContractingPartyRepository : RepositoryBase<long, PersonalC
|
|||||||
return new();
|
return new();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _accountContext.Accounts.Where(x => x.id == accId).Select(x =>
|
return _accountContext.Accounts.Where(x => x.id == accId && x.IsActiveString == "true").Select(x =>
|
||||||
new AccountViewModel()
|
new AccountViewModel()
|
||||||
{
|
{
|
||||||
Id = x.id,
|
Id = x.id,
|
||||||
@@ -845,7 +845,8 @@ public class PersonalContractingPartyRepository : RepositoryBase<long, PersonalC
|
|||||||
public async Task<OperationResult> ActiveAllAsync(long id)
|
public async Task<OperationResult> ActiveAllAsync(long id)
|
||||||
{
|
{
|
||||||
OperationResult result = new OperationResult();
|
OperationResult result = new OperationResult();
|
||||||
|
await using var transaction =await _context.Database.BeginTransactionAsync();
|
||||||
|
await using var accountTransaction = await _accountContext.Database.BeginTransactionAsync();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var personel = _context.PersonalContractingParties
|
var personel = _context.PersonalContractingParties
|
||||||
@@ -889,12 +890,15 @@ public class PersonalContractingPartyRepository : RepositoryBase<long, PersonalC
|
|||||||
}
|
}
|
||||||
|
|
||||||
await _context.SaveChangesAsync();
|
await _context.SaveChangesAsync();
|
||||||
|
await transaction.CommitAsync();
|
||||||
|
await accountTransaction.CommitAsync();
|
||||||
result.Succcedded();
|
result.Succcedded();
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
result.Failed("فعال کردن طرف حساب با خطا مواجه شد");
|
result.Failed("فعال کردن طرف حساب با خطا مواجه شد");
|
||||||
|
await transaction.RollbackAsync();
|
||||||
|
await accountTransaction.RollbackAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ public class ReportClientRepository : IReportClientRepository
|
|||||||
TotalClaims = x.TotalClaims,
|
TotalClaims = x.TotalClaims,
|
||||||
TotalDeductions = x.TotalDeductions,
|
TotalDeductions = x.TotalDeductions,
|
||||||
TotalPayment = x.TotalPayment.ToMoney(),
|
TotalPayment = x.TotalPayment.ToMoney(),
|
||||||
RewardPay = x.RewardPay.ToMoney(),
|
RewardPay = x.RewardPay.ToMoneyNullable(),
|
||||||
MarriedAllowance = x.MarriedAllowance.ToMoney(),
|
MarriedAllowance = x.MarriedAllowance.ToMoney(),
|
||||||
}).Where(x => x.WorkshopId == workshopId);
|
}).Where(x => x.WorkshopId == workshopId);
|
||||||
|
|
||||||
@@ -448,7 +448,7 @@ public class ReportClientRepository : IReportClientRepository
|
|||||||
TotalClaims = x.TotalClaims,
|
TotalClaims = x.TotalClaims,
|
||||||
TotalDeductions = x.TotalDeductions,
|
TotalDeductions = x.TotalDeductions,
|
||||||
TotalPayment = x.TotalPayment.ToMoney(),
|
TotalPayment = x.TotalPayment.ToMoney(),
|
||||||
RewardPay = x.RewardPay.ToMoney(),
|
RewardPay = x.RewardPay.ToMoneyNullable(),
|
||||||
MarriedAllowance = x.MarriedAllowance.ToMoney(),
|
MarriedAllowance = x.MarriedAllowance.ToMoney(),
|
||||||
}).Where(x => x.WorkshopId == workshopId);
|
}).Where(x => x.WorkshopId == workshopId);
|
||||||
|
|
||||||
|
|||||||
@@ -82,45 +82,25 @@ public class RollCallEmployeeRepository : RepositoryBase<long, RollCallEmployee>
|
|||||||
|
|
||||||
var service = _rollCallServiceRepository.GetAllServiceByWorkshopId(workshopId);
|
var service = _rollCallServiceRepository.GetAllServiceByWorkshopId(workshopId);
|
||||||
|
|
||||||
//اگر سرویس حضور غیاب نداشت
|
|
||||||
if (!service.Any(x => x.StartService.Date <= contractStart.Date && x.EndService.Date >= contractEnd.Date))
|
if (!service.Any(x => x.StartService.Date <= contractStart.Date && x.EndService.Date >= contractEnd.Date))
|
||||||
return false;
|
return false;
|
||||||
//var rollCallEmployee = GetByEmployeeIdAndWorkshopId(employeeId, workshopId);
|
//var rollCallEmployee = GetByEmployeeIdAndWorkshopId(employeeId, workshopId);
|
||||||
|
|
||||||
//if (rollCallEmployee == null)
|
//if (rollCallEmployee == null)
|
||||||
// return false;
|
// return false;
|
||||||
var rollCallEmployee = _context.RollCallEmployees.Include(xs => xs.EmployeesStatus)
|
var rollCallEmployee = _context.RollCallEmployees
|
||||||
.FirstOrDefault(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId);
|
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
|
||||||
//اگر تنظیمات حضور غیاب نداشت
|
.Include(x => x.EmployeesStatus);
|
||||||
if (rollCallEmployee == null)
|
if (!rollCallEmployee.Any())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
//اگر استاتوس نداشت
|
var a = rollCallEmployee.Any(x => x.EmployeesStatus.Any(s =>
|
||||||
if (!rollCallEmployee.EmployeesStatus.Any())
|
(s.StartDate <= contractStart.Date && s.EndDate.Date >= contractEnd.Date) ||
|
||||||
return false;
|
(s.StartDate.Date <= contractStart.Date && s.EndDate.Date > contractStart.Date)));
|
||||||
|
//var result = _employeeRollCallStatusRepository.w(x => x.RollCallEmployeeId == rollCallEmployee.Id &&
|
||||||
var leftWork =
|
// (x.StartDate.Date <= contractStart.Date && x.EndDate.Date >= contractEnd.Date) ||
|
||||||
_context.LeftWorkList.FirstOrDefault(x =>
|
// (x.StartDate.Date <= contractStart.Date && x.EndDate.Date > contractStart.Date));
|
||||||
x.StartWorkDate <= contractEnd.Date && x.LeftWorkDate > contractStart);
|
return a;
|
||||||
if (leftWork == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var status = rollCallEmployee.EmployeesStatus.FirstOrDefault(s =>
|
|
||||||
(s.StartDate <= contractStart.Date && s.EndDate.Date >= contractEnd.Date));
|
|
||||||
//اگر استاتوس کامل پوشش داد
|
|
||||||
if (status != null)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
|
|
||||||
status = rollCallEmployee.EmployeesStatus.FirstOrDefault(s =>
|
|
||||||
(s.StartDate.Date <= contractStart.Date && s.EndDate.Date > contractStart.Date &&
|
|
||||||
s.EndDate.Date < contractEnd.Date));
|
|
||||||
//اگر قبل از پایان فیس استاتوس قطع شده ولی ترک کار داره
|
|
||||||
if (status != null && leftWork.HasLeft)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
public List<RollCallEmployeeViewModel> GetByWorkshopId(long workshopId)
|
public List<RollCallEmployeeViewModel> GetByWorkshopId(long workshopId)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5199,10 +5199,10 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<RewardViewModel> RewardForCheckout(long employeeId, long workshopId, DateTime checkoutEnd,
|
private List<RewardViewModel> RewardForCheckout(long employeeId, long workshopId, DateTime checkoutEnd,
|
||||||
DateTime checkoutStart)
|
DateTime checkoutStart)
|
||||||
{
|
{
|
||||||
var result = _context.Rewards.Where(x =>
|
return _context.Rewards.Where(x =>
|
||||||
x.WorkshopId == workshopId && x.EmployeeId == employeeId && x.GrantDate <= checkoutEnd &&
|
x.WorkshopId == workshopId && x.EmployeeId == employeeId && x.GrantDate <= checkoutEnd &&
|
||||||
x.GrantDate >= checkoutStart).Select(x => new RewardViewModel
|
x.GrantDate >= checkoutStart).Select(x => new RewardViewModel
|
||||||
{
|
{
|
||||||
@@ -5215,8 +5215,6 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
|
|||||||
IsActive = x.IsActive,
|
IsActive = x.IsActive,
|
||||||
Id = x.id
|
Id = x.id
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<FineViewModel> FinesForCheckout(long employeeId, long workshopId, DateTime contractStart,
|
private List<FineViewModel> FinesForCheckout(long employeeId, long workshopId, DateTime contractStart,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -146,7 +146,7 @@ public class SalaryAidRepository : RepositoryBase<long, SalaryAid>, ISalaryAidRe
|
|||||||
{
|
{
|
||||||
YearFa = x.Key.YearFa,
|
YearFa = x.Key.YearFa,
|
||||||
MonthFa = x.Key.MonthFa,
|
MonthFa = x.Key.MonthFa,
|
||||||
Items = x.Select(s => new SalaryAidGroupedByDateViewModelItems()
|
SalaryAidViewModels = x.Select(s => new SalaryAidGroupedByDateViewModelItems()
|
||||||
{
|
{
|
||||||
Amount = s.Amount,
|
Amount = s.Amount,
|
||||||
EmployeeName = s.EmployeeFullName,
|
EmployeeName = s.EmployeeFullName,
|
||||||
@@ -175,7 +175,7 @@ public class SalaryAidRepository : RepositoryBase<long, SalaryAid>, ISalaryAidRe
|
|||||||
EmployeeId = x.Key,
|
EmployeeId = x.Key,
|
||||||
TotalAmount = x.Sum(s => s.Amount).ToMoney(),
|
TotalAmount = x.Sum(s => s.Amount).ToMoney(),
|
||||||
EmployeeName = employees.FirstOrDefault(e => e.id == x.Key).FullName,
|
EmployeeName = employees.FirstOrDefault(e => e.id == x.Key).FullName,
|
||||||
Items = x.Select(s => new SalaryAidGroupedByEmployeeViewModelItems()
|
SalaryAidViewModels = x.Select(s => new SalaryAidGroupedByEmployeeViewModelItems()
|
||||||
{
|
{
|
||||||
Amount = s.Amount.ToMoney(),
|
Amount = s.Amount.ToMoney(),
|
||||||
Id = s.id,
|
Id = s.id,
|
||||||
@@ -197,11 +197,8 @@ public class SalaryAidRepository : RepositoryBase<long, SalaryAid>, ISalaryAidRe
|
|||||||
query = query.Where(x => x.SalaryAidDateTime >= startDate && x.SalaryAidDateTime <= endDate);
|
query = query.Where(x => x.SalaryAidDateTime >= startDate && x.SalaryAidDateTime <= endDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
result.List = new PagedResult<SalaryAidViewModel>()
|
result.SalaryAidListViewModels = query.OrderByDescending(x => x.SalaryAidDateTime).Skip(searchModel.PageIndex).Take(30).ToList().Select(
|
||||||
{
|
x => new SalaryAidViewModel()
|
||||||
TotalCount = query.Count(),
|
|
||||||
List = query.OrderByDescending(x => x.SalaryAidDateTime).ApplyPagination(searchModel.PageIndex,searchModel.PageSize).ToList()
|
|
||||||
.Select(x => new SalaryAidViewModel()
|
|
||||||
{
|
{
|
||||||
Amount = x.Amount.ToMoney(),
|
Amount = x.Amount.ToMoney(),
|
||||||
CreationDate = x.CreationDate.ToFarsi(),
|
CreationDate = x.CreationDate.ToFarsi(),
|
||||||
@@ -212,12 +209,10 @@ public class SalaryAidRepository : RepositoryBase<long, SalaryAid>, ISalaryAidRe
|
|||||||
WorkshopId = x.WorkshopId,
|
WorkshopId = x.WorkshopId,
|
||||||
YearFa = x.SalaryAidDateTime.ToFarsi().Substring(0, 4),
|
YearFa = x.SalaryAidDateTime.ToFarsi().Substring(0, 4),
|
||||||
MonthFa = x.SalaryAidDateTime.ToFarsi().Substring(5, 2),
|
MonthFa = x.SalaryAidDateTime.ToFarsi().Substring(5, 2),
|
||||||
PersonnelCode = personnelCodes.FirstOrDefault(p => p.EmployeeId == x.EmployeeId).PersonnelCode
|
PersonnelCode = personnelCodes.FirstOrDefault(p => p.EmployeeId == x.EmployeeId).PersonnelCode.ToString(),
|
||||||
.ToString(),
|
|
||||||
EmployeeFullName = employees.FirstOrDefault(e => e.id == x.EmployeeId).FullName,
|
EmployeeFullName = employees.FirstOrDefault(e => e.id == x.EmployeeId).FullName,
|
||||||
AmountDouble = x.Amount,
|
AmountDouble = x.Amount,
|
||||||
}).ToList()
|
}).ToList();
|
||||||
};
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,9 +77,6 @@ public class SmsResultRepository : RepositoryBase<long, SmsResult>, ISmsResultRe
|
|||||||
case TypeOfSmsSetting.SendInstitutionContractConfirmationCode:
|
case TypeOfSmsSetting.SendInstitutionContractConfirmationCode:
|
||||||
typeOfSms = "کد تاییدیه قرارداد مالی";
|
typeOfSms = "کد تاییدیه قرارداد مالی";
|
||||||
break;
|
break;
|
||||||
case TypeOfSmsSetting.SendInstitutionContractConfirmationLink:
|
|
||||||
typeOfSms = "لینک تاییدیه ایجاد قرارداد مالی";
|
|
||||||
break;
|
|
||||||
case TypeOfSmsSetting.TaskReminder:
|
case TypeOfSmsSetting.TaskReminder:
|
||||||
typeOfSms = "یادآور وظایف";
|
typeOfSms = "یادآور وظایف";
|
||||||
break;
|
break;
|
||||||
@@ -150,7 +147,7 @@ public class SmsResultRepository : RepositoryBase<long, SmsResult>, ISmsResultRe
|
|||||||
|
|
||||||
// مرحله 2: گروهبندی و انتخاب آخرین رکورد هر روز روی Client
|
// مرحله 2: گروهبندی و انتخاب آخرین رکورد هر روز روی Client
|
||||||
var grouped = rawQuery
|
var grouped = rawQuery
|
||||||
.GroupBy(x => (x.DateOnly, x.TypeOfSms))
|
.GroupBy(x => x.DateOnly)
|
||||||
.Select(g => g.OrderByDescending(x => x.CreationDate).First())
|
.Select(g => g.OrderByDescending(x => x.CreationDate).First())
|
||||||
.OrderByDescending(x => x.CreationDate)
|
.OrderByDescending(x => x.CreationDate)
|
||||||
.ToList();
|
.ToList();
|
||||||
@@ -158,16 +155,15 @@ public class SmsResultRepository : RepositoryBase<long, SmsResult>, ISmsResultRe
|
|||||||
// مرحله 3: تبدیل به DTO و ToFarsi
|
// مرحله 3: تبدیل به DTO و ToFarsi
|
||||||
var result = grouped.Select(x => new SmsReportDto
|
var result = grouped.Select(x => new SmsReportDto
|
||||||
{
|
{
|
||||||
SentDate = x.CreationDate.ToFarsi(),
|
SentDate = x.CreationDate.ToFarsi()
|
||||||
TypeOfSms = x.TypeOfSms
|
|
||||||
}).ToList();
|
}).ToList();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date, string typeOfSmsSetting)
|
public async Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date)
|
||||||
{
|
{
|
||||||
if(string.IsNullOrWhiteSpace(date) || string.IsNullOrWhiteSpace(typeOfSmsSetting))
|
if(string.IsNullOrWhiteSpace(date))
|
||||||
return new List<SmsReportListDto>();
|
return new List<SmsReportListDto>();
|
||||||
|
|
||||||
if (date.TryToGeorgianDateTime(out var searchDate) == false)
|
if (date.TryToGeorgianDateTime(out var searchDate) == false)
|
||||||
@@ -202,12 +198,41 @@ public class SmsResultRepository : RepositoryBase<long, SmsResult>, ISmsResultRe
|
|||||||
query = query.Where(x => x.Mobile.Contains(searchModel.Mobile)).ToList();
|
query = query.Where(x => x.Mobile.Contains(searchModel.Mobile)).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (searchModel.TypeOfSms != TypeOfSmsSetting.All && searchModel.TypeOfSms != TypeOfSmsSetting.Warning)
|
||||||
|
{
|
||||||
|
var typeOfSms = "All";
|
||||||
|
switch (searchModel.TypeOfSms)
|
||||||
|
{
|
||||||
|
case TypeOfSmsSetting.InstitutionContractDebtReminder:
|
||||||
|
typeOfSms = "یادآور بدهی ماهانه";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.MonthlyInstitutionContract:
|
||||||
|
typeOfSms = "صورت حساب ماهانه";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.BlockContractingParty:
|
||||||
|
typeOfSms = "اعلام مسدودی طرف حساب";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.LegalAction:
|
||||||
|
typeOfSms = "اقدام قضایی";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.InstitutionContractConfirm:
|
||||||
|
typeOfSms = "یادآور تایید قرارداد مالی";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.SendInstitutionContractConfirmationCode:
|
||||||
|
typeOfSms = "کد تاییدیه قرارداد مالی";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.TaskReminder:
|
||||||
|
typeOfSms = "یادآور وظایف";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeOfSmsSetting.Contains("هشدار"))
|
query = query.Where(x => x.TypeOfSms == typeOfSms).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchModel.TypeOfSms == TypeOfSmsSetting.Warning)
|
||||||
{
|
{
|
||||||
query = query.Where(x => x.TypeOfSms.Contains("هشدار")).ToList();
|
query = query.Where(x => x.TypeOfSms.Contains("هشدار")).ToList();
|
||||||
}
|
}
|
||||||
query = query.Where(x => x.TypeOfSms == typeOfSmsSetting).ToList();
|
|
||||||
|
|
||||||
if (searchModel.SendStatus != SendStatus.All)
|
if (searchModel.SendStatus != SendStatus.All)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
using System.Linq;
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using _0_Framework.Application.Enums;
|
using _0_Framework.Application.Enums;
|
||||||
using _0_Framework.InfraStructure;
|
using _0_Framework.InfraStructure;
|
||||||
@@ -69,48 +68,4 @@ public class SmsSettingsRepository : RepositoryBase<long, SmsSetting>, ISmsSetti
|
|||||||
_context.SmsSettings.Remove(removeItem);
|
_context.SmsSettings.Remove(removeItem);
|
||||||
await _context.SaveChangesAsync();
|
await _context.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#region ForApi
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست پیامک های خودکار بر اساس نوع آن
|
|
||||||
/// Api
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="typeOfSmsSetting"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<List<SmsSettingDto>> GetSmsSettingList(TypeOfSmsSetting typeOfSmsSetting)
|
|
||||||
{
|
|
||||||
|
|
||||||
var data = await _context.SmsSettings
|
|
||||||
.Where(x => x.TypeOfSmsSetting == typeOfSmsSetting)
|
|
||||||
.OrderBy(x => x.DayOfMonth).ThenBy(x => x.TimeOfDay)
|
|
||||||
.Select(x =>
|
|
||||||
new SmsSettingDto()
|
|
||||||
{
|
|
||||||
Id = x.id,
|
|
||||||
DayOfMonth = x.DayOfMonth,
|
|
||||||
TimeOfDayDisplay = x.TimeOfDay.ToString(@"hh\:mm")
|
|
||||||
}).ToListAsync();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<SmsSettingDto> GetSmsSettingDataToEdit(long id)
|
|
||||||
{
|
|
||||||
var edit = new SmsSettingDto();
|
|
||||||
var getItem = await _context.SmsSettings.FirstOrDefaultAsync(x => x.id == id);
|
|
||||||
|
|
||||||
if (getItem != null)
|
|
||||||
{
|
|
||||||
edit.Id = getItem.id;
|
|
||||||
edit.TimeOfDayDisplay = getItem.TimeOfDay.ToString(@"hh\:mm");
|
|
||||||
edit.DayOfMonth = getItem.DayOfMonth;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return edit;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
@@ -160,9 +160,7 @@ public class WorkshopRepository : RepositoryBase<long, Company.Domain.WorkshopAg
|
|||||||
public EditWorkshop GetDetails(long id)
|
public EditWorkshop GetDetails(long id)
|
||||||
{
|
{
|
||||||
var emp = _context.WorkshopEmployers.Where(x => x.WorkshopId == id)
|
var emp = _context.WorkshopEmployers.Where(x => x.WorkshopId == id)
|
||||||
.Select(x => x.Employer).ToList();
|
.Select(x => x.EmployerId).ToList();
|
||||||
var contractingPart = emp.Select(x => x.ContractingPartyId).ToList();
|
|
||||||
bool rewardCompute = contractingPart.Any(x=>x == 30804);
|
|
||||||
return _context.Workshops.Select(x => new EditWorkshop
|
return _context.Workshops.Select(x => new EditWorkshop
|
||||||
{
|
{
|
||||||
Id = x.id,
|
Id = x.id,
|
||||||
@@ -195,7 +193,7 @@ public class WorkshopRepository : RepositoryBase<long, Company.Domain.WorkshopAg
|
|||||||
BonusesOptions = string.IsNullOrWhiteSpace(x.BonusesOptions) ? "EndOfContract1402leftWork1403" : x.BonusesOptions,
|
BonusesOptions = string.IsNullOrWhiteSpace(x.BonusesOptions) ? "EndOfContract1402leftWork1403" : x.BonusesOptions,
|
||||||
YearsOptions = x.YearsOptions,
|
YearsOptions = x.YearsOptions,
|
||||||
IsOldContract = x.IsOldContract,
|
IsOldContract = x.IsOldContract,
|
||||||
EmployerIdList = emp.Select(e=>e.id).ToList(),
|
EmployerIdList = emp,
|
||||||
HasRollCallFreeVip = x.HasRollCallFreeVip,
|
HasRollCallFreeVip = x.HasRollCallFreeVip,
|
||||||
WorkshopHolidayWorking = x.WorkshopHolidayWorking,
|
WorkshopHolidayWorking = x.WorkshopHolidayWorking,
|
||||||
InsuranceCheckoutOvertime = x.InsuranceCheckoutOvertime,
|
InsuranceCheckoutOvertime = x.InsuranceCheckoutOvertime,
|
||||||
@@ -207,7 +205,6 @@ public class WorkshopRepository : RepositoryBase<long, Company.Domain.WorkshopAg
|
|||||||
SignCheckout = x.SignCheckout,
|
SignCheckout = x.SignCheckout,
|
||||||
RotatingShiftCompute = x.RotatingShiftCompute,
|
RotatingShiftCompute = x.RotatingShiftCompute,
|
||||||
IsStaticCheckout = x.IsStaticCheckout,
|
IsStaticCheckout = x.IsStaticCheckout,
|
||||||
RewardComputeOnCheckout = rewardCompute
|
|
||||||
|
|
||||||
}).FirstOrDefault(x => x.Id == id);
|
}).FirstOrDefault(x => x.Id == id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2859,7 +2859,7 @@ public class YearlySalaryRepository : RepositoryBase<long, YearlySalary>, IYearl
|
|||||||
var contactCanToleaveList = new List<ContractsCanToLeave>();
|
var contactCanToleaveList = new List<ContractsCanToLeave>();
|
||||||
var allContractsBetween = _context.Contracts.AsSplitQuery().Include(x => x.WorkingHoursList)
|
var allContractsBetween = _context.Contracts.AsSplitQuery().Include(x => x.WorkingHoursList)
|
||||||
.Where(x => x.WorkshopIds == workshopId && x.EmployeeId == employeeId &&
|
.Where(x => x.WorkshopIds == workshopId && x.EmployeeId == employeeId &&
|
||||||
x.ContractEnd >= startDate && x.ContarctStart <= endDate).OrderBy(x=>x.ContarctStart).ToList();
|
x.ContractEnd >= startDate && x.ContarctStart <= endDate).ToList();
|
||||||
var isWorkshopStaticCheckout = _context.Workshops.FirstOrDefault(x => x.id == workshopId)!.IsStaticCheckout;
|
var isWorkshopStaticCheckout = _context.Workshops.FirstOrDefault(x => x.id == workshopId)!.IsStaticCheckout;
|
||||||
int mandatoryDays = 0;
|
int mandatoryDays = 0;
|
||||||
double allCanToLeave = 0;
|
double allCanToLeave = 0;
|
||||||
|
|||||||
@@ -205,26 +205,6 @@ public class SmsService : ISmsService
|
|||||||
};
|
};
|
||||||
return appendData;
|
return appendData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SmsDetailsDto> GetSmsDetailsByMessageId(int messId, string fullName)
|
|
||||||
{
|
|
||||||
|
|
||||||
SmsIr smsIr = new SmsIr("Og5M562igmzJRhQPnq0GdtieYdLgtfikjzxOmeQBPxJjZtyge5Klc046Lfw1mxSa");
|
|
||||||
var response = await smsIr.GetReportAsync(messId);
|
|
||||||
MessageReportResult messages = response.Data;
|
|
||||||
|
|
||||||
var appendData = new SmsDetailsDto()
|
|
||||||
{
|
|
||||||
Mobile = messages.Mobile,
|
|
||||||
MessageText = messages.MessageText,
|
|
||||||
SendUnixTime = UnixTimeStampToDateTime(messages.SendDateTime),
|
|
||||||
DeliveryState = DeliveryStatus(messages.DeliveryState),
|
|
||||||
DeliveryUnixTime = UnixTimeStampToDateTime(messages.DeliveryDateTime),
|
|
||||||
DeliveryColor = DeliveryColorStatus(messages.DeliveryState),
|
|
||||||
FullName = fullName
|
|
||||||
};
|
|
||||||
return appendData;
|
|
||||||
}
|
|
||||||
public async Task<List<ApiResultViewModel>> GetApiResult(string startDate, string endDate)
|
public async Task<List<ApiResultViewModel>> GetApiResult(string startDate, string endDate)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -209,38 +209,22 @@ public class CreateOrEditCheckoutCommandHandler : IBaseCommandHandler<CreateOrEd
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
////حقوق نهایی
|
//حقوق نهایی
|
||||||
//var monthlySalaryPay = (totalHoursWorked * monthlySalaryDefined) / mandatoryHours;
|
var monthlySalaryPay = (totalHoursWorked * monthlySalaryDefined) / mandatoryHours;
|
||||||
//// اگر اضافه کار داشت حقوق تعین شده به عنوان حقوق نهایی در نظر گرفته میشود
|
// اگر اضافه کار داشت حقوق تعین شده به عنوان حقوق نهایی در نظر گرفته میشود
|
||||||
//monthlySalaryPay = monthlySalaryPay > monthlySalaryDefined ? monthlySalaryDefined : monthlySalaryPay;
|
monthlySalaryPay = monthlySalaryPay > monthlySalaryDefined ? monthlySalaryDefined : monthlySalaryPay;
|
||||||
|
|
||||||
////حقوق کسر شده
|
//حقوق کسر شده
|
||||||
//var deductionFromSalary = monthlySalaryDefined - monthlySalaryPay;
|
var deductionFromSalary = monthlySalaryDefined - monthlySalaryPay;
|
||||||
|
|
||||||
//new chang salary compute
|
|
||||||
var monthlySalaryPay = totalHoursWorked * monthlySalaryDefined;
|
|
||||||
|
|
||||||
//زمان باقی مانده
|
//زمان باقی مانده
|
||||||
var remainingTime = totalHoursWorked - mandatoryHours;
|
var remainingTime = totalHoursWorked - mandatoryHours;
|
||||||
|
|
||||||
|
|
||||||
//تناسب به دقیقه
|
|
||||||
#region MyRegion
|
|
||||||
|
|
||||||
//var monthlySalaryDefinedTest = monthlySalaryDefined * mandatoryHours;
|
|
||||||
//var monthlySalaryPayTest = totalHoursWorked * monthlySalaryDefined;
|
|
||||||
////// اگر اضافه کار داشت حقوق تعین شده به عنوان حقوق نهایی در نظر گرفته میشود
|
|
||||||
//monthlySalaryPayTest = monthlySalaryPayTest > monthlySalaryDefinedTest ? monthlySalaryDefinedTest : monthlySalaryPayTest;
|
|
||||||
//////حقوق کسر شده
|
|
||||||
//var deductionFromSalaryTest = monthlySalaryDefinedTest - monthlySalaryPayTest;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
var computeResult = new ComputeResultDto
|
var computeResult = new ComputeResultDto
|
||||||
{
|
{
|
||||||
MandatoryHours = mandatoryHours,
|
MandatoryHours = mandatoryHours,
|
||||||
MonthlySalaryPay = monthlySalaryPay,
|
MonthlySalaryPay = monthlySalaryPay,
|
||||||
DeductionFromSalary = 0 /*deductionFromSalary*/,
|
DeductionFromSalary = deductionFromSalary,
|
||||||
RemainingHours = remainingTime
|
RemainingHours = remainingTime
|
||||||
};
|
};
|
||||||
Console.WriteLine(mandatoryHours);
|
Console.WriteLine(mandatoryHours);
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
using DNTPersianUtils.Core;
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
using GozareshgirProgramManager.Application._Common.Interfaces;
|
|
||||||
using GozareshgirProgramManager.Application._Common.Models;
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Queries.GetUserListWhoHaveSettings;
|
using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Queries.GetUserListWhoHaveSettings;
|
||||||
using GozareshgirProgramManager.Domain._Common;
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
using GozareshgirProgramManager.Domain.CheckoutAgg.Enums;
|
using GozareshgirProgramManager.Domain.CheckoutAgg.Enums;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using PersianDateTime = PersianTools.Core.PersianDateTime;
|
using PersianTools.Core;
|
||||||
|
|
||||||
namespace GozareshgirProgramManager.Application.Modules.Checkouts.Queries.GetUserToGropCreate;
|
namespace GozareshgirProgramManager.Application.Modules.Checkouts.Queries.GetUserToGropCreate;
|
||||||
|
|
||||||
@@ -46,8 +45,8 @@ public class GetUserToGroupCreatingQueryHandler : IBaseQueryHandler<GetUserToGro
|
|||||||
"ایجاد فیش فقط برای ماه های گذشته امکان پذیر است");
|
"ایجاد فیش فقط برای ماه های گذشته امکان پذیر است");
|
||||||
|
|
||||||
|
|
||||||
//var lastMonthStart = lastMonth;
|
var lastMonthStart = lastMonth;
|
||||||
var lastMonthEnd = ((selectedDate.ToFarsi().FindeEndOfMonth())).ToGeorgianDateTime();
|
var lastMonthEnd = lastMonth;
|
||||||
|
|
||||||
var query =
|
var query =
|
||||||
await (from u in _context.Users
|
await (from u in _context.Users
|
||||||
@@ -61,8 +60,8 @@ public class GetUserToGroupCreatingQueryHandler : IBaseQueryHandler<GetUserToGro
|
|||||||
// LEFT JOIN
|
// LEFT JOIN
|
||||||
//فیش
|
//فیش
|
||||||
join ch in _context.Checkouts
|
join ch in _context.Checkouts
|
||||||
.Where(x => x.CheckoutStartDate < lastMonthEnd
|
.Where(x => x.CheckoutStartDate < lastMonthStart
|
||||||
&& x.CheckoutEndDate > selectedDate)
|
&& x.CheckoutEndDate >= lastMonthStart)
|
||||||
on u.Id equals ch.UserId into chJoin
|
on u.Id equals ch.UserId into chJoin
|
||||||
from ch in chJoin.DefaultIfEmpty()
|
from ch in chJoin.DefaultIfEmpty()
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.AddTaskToPhase;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Command to add a task to an existing phase
|
||||||
|
/// </summary>
|
||||||
|
public record AddTaskToPhaseCommand(
|
||||||
|
Guid PhaseId,
|
||||||
|
string Name,
|
||||||
|
string? Description = null,
|
||||||
|
ProjectTaskPriority Priority = ProjectTaskPriority.Medium,
|
||||||
|
int OrderIndex = 0,
|
||||||
|
DateTime? DueDate = null
|
||||||
|
) : IBaseCommand;
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.AddTaskToPhase;
|
||||||
|
|
||||||
|
public class AddTaskToPhaseCommandHandler : IRequestHandler<AddTaskToPhaseCommand, OperationResult>
|
||||||
|
{
|
||||||
|
private readonly IProjectPhaseRepository _phaseRepository;
|
||||||
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
|
|
||||||
|
public AddTaskToPhaseCommandHandler(
|
||||||
|
IProjectPhaseRepository phaseRepository,
|
||||||
|
IUnitOfWork unitOfWork)
|
||||||
|
{
|
||||||
|
_phaseRepository = phaseRepository;
|
||||||
|
_unitOfWork = unitOfWork;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> Handle(AddTaskToPhaseCommand request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Get phase
|
||||||
|
var phase = await _phaseRepository.GetByIdAsync(request.PhaseId);
|
||||||
|
if (phase == null)
|
||||||
|
{
|
||||||
|
return OperationResult.NotFound("فاز یافت نشد");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add task
|
||||||
|
var task = phase.AddTask(request.Name, request.Description);
|
||||||
|
task.SetPriority(request.Priority);
|
||||||
|
task.SetOrderIndex(request.OrderIndex);
|
||||||
|
|
||||||
|
if (request.DueDate.HasValue)
|
||||||
|
{
|
||||||
|
task.SetDates(dueDate: request.DueDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save changes
|
||||||
|
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||||||
|
|
||||||
|
return OperationResult.Success();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return OperationResult.Failure($"خطا در افزودن تسک: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,5 +4,4 @@ using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
|||||||
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.CreateProject;
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.CreateProject;
|
||||||
|
|
||||||
public record CreateProjectCommand(string Name,ProjectHierarchyLevel Level,
|
public record CreateProjectCommand(string Name,ProjectHierarchyLevel Level,
|
||||||
ProjectTaskPriority? Priority,
|
|
||||||
Guid? ParentId):IBaseCommand;
|
Guid? ParentId):IBaseCommand;
|
||||||
@@ -16,8 +16,7 @@ public class CreateProjectCommandHandler : IBaseCommandHandler<CreateProjectComm
|
|||||||
private readonly IUnitOfWork _unitOfWork;
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
|
|
||||||
|
|
||||||
public CreateProjectCommandHandler(IProjectRepository projectRepository, IUnitOfWork unitOfWork,
|
public CreateProjectCommandHandler(IProjectRepository projectRepository, IUnitOfWork unitOfWork, IProjectTaskRepository projectTaskRepository, IProjectPhaseRepository projectPhaseRepository)
|
||||||
IProjectTaskRepository projectTaskRepository, IProjectPhaseRepository projectPhaseRepository)
|
|
||||||
{
|
{
|
||||||
_projectRepository = projectRepository;
|
_projectRepository = projectRepository;
|
||||||
_unitOfWork = unitOfWork;
|
_unitOfWork = unitOfWork;
|
||||||
@@ -76,9 +75,8 @@ public class CreateProjectCommandHandler : IBaseCommandHandler<CreateProjectComm
|
|||||||
throw new BadRequestException("والد پروژه یافت نشد");
|
throw new BadRequestException("والد پروژه یافت نشد");
|
||||||
}
|
}
|
||||||
|
|
||||||
var priority = request.Priority ?? ProjectTaskPriority.Low;
|
var projectTask = new ProjectTask(request.Name, request.ParentId.Value);
|
||||||
|
|
||||||
var projectTask = new ProjectTask(request.Name, request.ParentId.Value, priority);
|
|
||||||
await _projectTaskRepository.CreateAsync(projectTask);
|
await _projectTaskRepository.CreateAsync(projectTask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -12,7 +12,6 @@ public record SetTimeProjectCommand(
|
|||||||
|
|
||||||
public class SetTimeSectionTime
|
public class SetTimeSectionTime
|
||||||
{
|
{
|
||||||
public Guid? Id { get; set; }
|
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
public int Hours { get; set; }
|
public int Hours { get; set; }
|
||||||
public int Minutes { get; set; }
|
public int Minutes { get; set; }
|
||||||
|
|||||||
@@ -349,15 +349,6 @@ public class SetTimeProjectCommandHandler : IBaseCommandHandler<SetTimeProjectCo
|
|||||||
return OperationResult.Success();
|
return OperationResult.Success();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ValidateTotalTimeNotLessThanSpent(TimeSpan newTotalTime, TimeSpan currentTotalSpent)
|
|
||||||
{
|
|
||||||
if (newTotalTime < currentTotalSpent)
|
|
||||||
{
|
|
||||||
throw new BadRequestException(
|
|
||||||
$"تایم کل سکشن نمیتواند کمتر از زمان مصرف شده ({currentTotalSpent.TotalHours:F2} ساعت) باشد");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetSectionTime(TaskSection section, SetTimeProjectSkillItem sectionItem, long? addedByUserId)
|
private void SetSectionTime(TaskSection section, SetTimeProjectSkillItem sectionItem, long? addedByUserId)
|
||||||
{
|
{
|
||||||
var initData = sectionItem.InitData;
|
var initData = sectionItem.InitData;
|
||||||
@@ -372,62 +363,18 @@ public class SetTimeProjectCommandHandler : IBaseCommandHandler<SetTimeProjectCo
|
|||||||
// تنظیم زمان اولیه
|
// تنظیم زمان اولیه
|
||||||
section.UpdateInitialEstimatedHours(initialTime, initData.Description);
|
section.UpdateInitialEstimatedHours(initialTime, initData.Description);
|
||||||
|
|
||||||
// مدیریت هوشمند زمانهای اضافی
|
section.ClearAdditionalTimes();
|
||||||
var existingAdditionalTimes = section.AdditionalTimes.ToList();
|
// افزودن زمانهای اضافی
|
||||||
var incomingAdditionalTimes = sectionItem.AdditionalTime ?? [];
|
bool hasAdditionalTime = false;
|
||||||
|
foreach (var additionalTime in sectionItem.AdditionalTime)
|
||||||
bool hasRealChange = false;
|
|
||||||
|
|
||||||
// حذف آیتمهایی که دیگر در لیست نیستند
|
|
||||||
foreach (var existingTime in existingAdditionalTimes)
|
|
||||||
{
|
|
||||||
var stillExists = incomingAdditionalTimes.Any(x => x.Id == existingTime.Id);
|
|
||||||
if (!stillExists)
|
|
||||||
{
|
|
||||||
section.RemoveAdditionalTime(existingTime.Id);
|
|
||||||
hasRealChange = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ویرایش یا اضافه کردن آیتمهای جدید
|
|
||||||
foreach (var additionalTime in incomingAdditionalTimes)
|
|
||||||
{
|
|
||||||
var additionalTimeSpan = TimeSpan.FromHours(additionalTime.Hours)
|
|
||||||
.Add(TimeSpan.FromMinutes(additionalTime.Minutes));
|
|
||||||
|
|
||||||
if (additionalTimeSpan <= TimeSpan.Zero)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var existingAdditionalTime = existingAdditionalTimes.FirstOrDefault(x => x.Id == additionalTime.Id);
|
|
||||||
|
|
||||||
if (existingAdditionalTime != null)
|
|
||||||
{
|
|
||||||
// اگر آیتم با این ID وجود دارد، بررسی کن اگر تغییر کرده باشد
|
|
||||||
if (existingAdditionalTime.HasChanged(additionalTimeSpan, additionalTime.Description))
|
|
||||||
{
|
|
||||||
// ویرایش بدون حذف و ایجاد دوباره
|
|
||||||
existingAdditionalTime.Update(additionalTimeSpan, additionalTime.Description);
|
|
||||||
hasRealChange = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// اگر ID نداشت یا ID جدید بود، اضافه کن
|
|
||||||
if (additionalTime.Id == null || additionalTime.Id == Guid.Empty)
|
|
||||||
{
|
{
|
||||||
|
var additionalTimeSpan = TimeSpan.FromHours(additionalTime.Hours).Add(TimeSpan.FromMinutes(additionalTime.Minutes));
|
||||||
section.AddAdditionalTime(additionalTimeSpan, additionalTime.Description, addedByUserId);
|
section.AddAdditionalTime(additionalTimeSpan, additionalTime.Description, addedByUserId);
|
||||||
hasRealChange = true;
|
hasAdditionalTime = true;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// اعتبارسنجی بعد از اعمال تمام تغییرات
|
// تغییر status به Incomplete فقط اگر زمان اضافی اضافه شده باشد و در وضعیتی غیر از ReadyToStart باشد
|
||||||
var currentTotalSpent = section.GetTotalTimeSpent();
|
if (hasAdditionalTime && section.Status != TaskSectionStatus.ReadyToStart)
|
||||||
var newTotalTime = section.FinalEstimatedHours;
|
|
||||||
ValidateTotalTimeNotLessThanSpent(newTotalTime, currentTotalSpent);
|
|
||||||
|
|
||||||
// تغییر status به Incomplete فقط اگر تغییری واقعی اعمال شده باشد و در وضعیتی غیر از ReadyToStart باشد
|
|
||||||
if (hasRealChange && section.Status != TaskSectionStatus.ReadyToStart)
|
|
||||||
{
|
{
|
||||||
// اگر سکشن درحال انجام است، باید متوقف شود قبل از تغییر status
|
// اگر سکشن درحال انجام است، باید متوقف شود قبل از تغییر status
|
||||||
if (section.Status == TaskSectionStatus.InProgress)
|
if (section.Status == TaskSectionStatus.InProgress)
|
||||||
|
|||||||
@@ -10,10 +10,8 @@ public class GetProjectItemDto
|
|||||||
public int Percentage { get; init; }
|
public int Percentage { get; init; }
|
||||||
public ProjectHierarchyLevel Level { get; init; }
|
public ProjectHierarchyLevel Level { get; init; }
|
||||||
public Guid? ParentId { get; init; }
|
public Guid? ParentId { get; init; }
|
||||||
|
public int TotalHours { get; set; }
|
||||||
public TimeSpan TotalTime { get; init; }
|
public int Minutes { get; set; }
|
||||||
|
|
||||||
public TimeSpan RemainingTime { get; init; }
|
|
||||||
public AssignmentStatus Front { get; set; }
|
public AssignmentStatus Front { get; set; }
|
||||||
public AssignmentStatus Backend { get; set; }
|
public AssignmentStatus Backend { get; set; }
|
||||||
public AssignmentStatus Design { get; set; }
|
public AssignmentStatus Design { get; set; }
|
||||||
|
|||||||
@@ -16,8 +16,7 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
_context = context;
|
_context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<OperationResult<GetProjectsListResponse>> Handle(GetProjectsListQuery request,
|
public async Task<OperationResult<GetProjectsListResponse>> Handle(GetProjectsListQuery request, CancellationToken cancellationToken)
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
var projects = new List<GetProjectDto>();
|
var projects = new List<GetProjectDto>();
|
||||||
var phases = new List<GetPhaseDto>();
|
var phases = new List<GetPhaseDto>();
|
||||||
@@ -52,14 +51,13 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
{
|
{
|
||||||
return new List<GetProjectDto>();
|
return new List<GetProjectDto>();
|
||||||
}
|
}
|
||||||
|
|
||||||
var entities = await query
|
var entities = await query
|
||||||
.OrderByDescending(p => p.CreationDate)
|
.OrderByDescending(p => p.CreationDate)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
var result = new List<GetProjectDto>();
|
var result = new List<GetProjectDto>();
|
||||||
foreach (var project in entities)
|
foreach (var project in entities)
|
||||||
{
|
{
|
||||||
var (percentage, totalTime,remainingTime) = await CalculateProjectPercentage(project, cancellationToken);
|
var (percentage, totalTime) = await CalculateProjectPercentage(project, cancellationToken);
|
||||||
result.Add(new GetProjectDto
|
result.Add(new GetProjectDto
|
||||||
{
|
{
|
||||||
Id = project.Id,
|
Id = project.Id,
|
||||||
@@ -67,12 +65,10 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
Level = ProjectHierarchyLevel.Project,
|
Level = ProjectHierarchyLevel.Project,
|
||||||
ParentId = null,
|
ParentId = null,
|
||||||
Percentage = percentage,
|
Percentage = percentage,
|
||||||
TotalTime = totalTime,
|
TotalHours = (int)totalTime.TotalHours,
|
||||||
RemainingTime = remainingTime
|
Minutes = totalTime.Minutes,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
result = result.OrderByDescending(x => x.Percentage).ToList();
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,14 +79,13 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
{
|
{
|
||||||
query = query.Where(x => x.ProjectId == parentId);
|
query = query.Where(x => x.ProjectId == parentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
var entities = await query
|
var entities = await query
|
||||||
.OrderByDescending(p => p.CreationDate)
|
.OrderByDescending(p => p.CreationDate)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
var result = new List<GetPhaseDto>();
|
var result = new List<GetPhaseDto>();
|
||||||
foreach (var phase in entities)
|
foreach (var phase in entities)
|
||||||
{
|
{
|
||||||
var (percentage, totalTime,remainingTime) = await CalculatePhasePercentage(phase, cancellationToken);
|
var (percentage, totalTime) = await CalculatePhasePercentage(phase, cancellationToken);
|
||||||
result.Add(new GetPhaseDto
|
result.Add(new GetPhaseDto
|
||||||
{
|
{
|
||||||
Id = phase.Id,
|
Id = phase.Id,
|
||||||
@@ -98,12 +93,10 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
Level = ProjectHierarchyLevel.Phase,
|
Level = ProjectHierarchyLevel.Phase,
|
||||||
ParentId = phase.ProjectId,
|
ParentId = phase.ProjectId,
|
||||||
Percentage = percentage,
|
Percentage = percentage,
|
||||||
TotalTime = totalTime,
|
TotalHours = (int)totalTime.TotalHours,
|
||||||
RemainingTime = remainingTime
|
Minutes = totalTime.Minutes,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
result = result.OrderByDescending(x => x.Percentage).ToList();
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,7 +107,6 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
{
|
{
|
||||||
query = query.Where(x => x.PhaseId == parentId);
|
query = query.Where(x => x.PhaseId == parentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
var entities = await query
|
var entities = await query
|
||||||
.OrderByDescending(t => t.CreationDate)
|
.OrderByDescending(t => t.CreationDate)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
@@ -126,7 +118,7 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
|
|
||||||
foreach (var task in entities)
|
foreach (var task in entities)
|
||||||
{
|
{
|
||||||
var (percentage, totalTime,remainingTime) = await CalculateTaskPercentage(task, cancellationToken);
|
var (percentage, totalTime) = await CalculateTaskPercentage(task, cancellationToken);
|
||||||
var sections = await _context.TaskSections
|
var sections = await _context.TaskSections
|
||||||
.Include(s => s.Activities)
|
.Include(s => s.Activities)
|
||||||
.Include(s => s.Skill)
|
.Include(s => s.Skill)
|
||||||
@@ -148,6 +140,7 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
|
|
||||||
// محاسبه SpentTime و RemainingTime
|
// محاسبه SpentTime و RemainingTime
|
||||||
var spentTime = TimeSpan.FromTicks(sections.Sum(s => s.Activities.Sum(a => a.GetTimeSpent().Ticks)));
|
var spentTime = TimeSpan.FromTicks(sections.Sum(s => s.Activities.Sum(a => a.GetTimeSpent().Ticks)));
|
||||||
|
var remainingTime = totalTime - spentTime;
|
||||||
|
|
||||||
// ساخت section DTOs برای تمام Skills
|
// ساخت section DTOs برای تمام Skills
|
||||||
var sectionDtos = allSkills.Select(skill =>
|
var sectionDtos = allSkills.Select(skill =>
|
||||||
@@ -191,20 +184,18 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
Level = ProjectHierarchyLevel.Task,
|
Level = ProjectHierarchyLevel.Task,
|
||||||
ParentId = task.PhaseId,
|
ParentId = task.PhaseId,
|
||||||
Percentage = percentage,
|
Percentage = percentage,
|
||||||
TotalTime = totalTime,
|
TotalHours = (int)totalTime.TotalHours,
|
||||||
|
Minutes = totalTime.Minutes,
|
||||||
SpentTime = spentTime,
|
SpentTime = spentTime,
|
||||||
RemainingTime = remainingTime,
|
RemainingTime = remainingTime,
|
||||||
Sections = sectionDtos,
|
Sections = sectionDtos,
|
||||||
Priority = task.Priority
|
Priority = task.Priority
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
result = result.OrderByDescending(x => x.Percentage).ToList();
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetSkillFlags<TItem>(List<TItem> items, CancellationToken cancellationToken)
|
private async Task SetSkillFlags<TItem>(List<TItem> items, CancellationToken cancellationToken) where TItem : GetProjectItemDto
|
||||||
where TItem : GetProjectItemDto
|
|
||||||
{
|
{
|
||||||
if (!items.Any())
|
if (!items.Any())
|
||||||
return;
|
return;
|
||||||
@@ -222,112 +213,101 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private async Task SetSkillFlagsForProjects<TItem>(List<TItem> items, List<Guid> projectIds,
|
private async Task SetSkillFlagsForProjects<TItem>(List<TItem> items, List<Guid> projectIds, CancellationToken cancellationToken) where TItem : GetProjectItemDto
|
||||||
CancellationToken cancellationToken) where TItem : GetProjectItemDto
|
|
||||||
{
|
{
|
||||||
// For projects: gather all phases, then tasks, then sections
|
// For projects: gather all phases, then tasks, then sections
|
||||||
var phases = await _context.ProjectPhases
|
var phases = await _context.ProjectPhases
|
||||||
.Where(ph => projectIds.Contains(ph.ProjectId))
|
.Where(ph => projectIds.Contains(ph.ProjectId))
|
||||||
.Select(ph => new { ph.Id, ph.ProjectId })
|
.Select(ph => ph.Id)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
var phaseIds = phases.Select(ph => ph.Id).ToList();
|
|
||||||
var tasks = await _context.ProjectTasks
|
var tasks = await _context.ProjectTasks
|
||||||
.Where(t => phaseIds.Contains(t.PhaseId))
|
.Where(t => phases.Contains(t.PhaseId))
|
||||||
.Select(t => new { t.Id, t.PhaseId })
|
.Select(t => t.Id)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
var taskIds = tasks.Select(t => t.Id).ToList();
|
|
||||||
var sections = await _context.TaskSections
|
var sections = await _context.TaskSections
|
||||||
.Include(s => s.Skill)
|
.Include(s => s.Skill)
|
||||||
.Where(s => taskIds.Contains(s.TaskId))
|
.Where(s => tasks.Contains(s.TaskId))
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
// Convert to tuple list for AggregatePhaseStatuses
|
|
||||||
var tasksList = tasks.Select(t => (t.Id, t.PhaseId)).ToList();
|
|
||||||
|
|
||||||
foreach (var item in items)
|
foreach (var item in items)
|
||||||
{
|
{
|
||||||
var projectPhaseIds = phases.Where(ph => ph.ProjectId == item.Id).Select(ph => ph.Id).ToList();
|
var relatedPhases = phases; // used for filtering tasks by project
|
||||||
|
var relatedTasks = await _context.ProjectTasks
|
||||||
// برای هر Skill، وضعیتهای تمام Phases را تجمیع کنیم
|
.Where(t => t.PhaseId != Guid.Empty && relatedPhases.Contains(t.PhaseId))
|
||||||
item.Backend = AggregatePhaseStatuses(projectPhaseIds, tasksList, sections, "Backend");
|
.Select(t => t.Id)
|
||||||
item.Front = AggregatePhaseStatuses(projectPhaseIds, tasksList, sections, "Frontend");
|
.ToListAsync(cancellationToken);
|
||||||
item.Design = AggregatePhaseStatuses(projectPhaseIds, tasksList, sections, "UI/UX Design");
|
var itemSections = sections.Where(s => relatedTasks.Contains(s.TaskId));
|
||||||
|
item.Backend = GetAssignmentStatus(itemSections.FirstOrDefault(x => x.Skill?.Name == "Backend"));
|
||||||
|
item.Front = GetAssignmentStatus(itemSections.FirstOrDefault(x => x.Skill?.Name == "Frontend"));
|
||||||
|
item.Design = GetAssignmentStatus(itemSections.FirstOrDefault(x => x.Skill?.Name == "UI/UX Design"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetSkillFlagsForPhases<TItem>(List<TItem> items, List<Guid> phaseIds,
|
private async Task SetSkillFlagsForPhases<TItem>(List<TItem> items, List<Guid> phaseIds, CancellationToken cancellationToken) where TItem : GetProjectItemDto
|
||||||
CancellationToken cancellationToken) where TItem : GetProjectItemDto
|
|
||||||
{
|
{
|
||||||
// For phases: gather tasks, then sections
|
// For phases: gather tasks, then sections
|
||||||
var tasks = await _context.ProjectTasks
|
var tasks = await _context.ProjectTasks
|
||||||
.Where(t => phaseIds.Contains(t.PhaseId))
|
.Where(t => phaseIds.Contains(t.PhaseId))
|
||||||
.Select(t => new { t.Id, t.PhaseId })
|
.Select(t => t.Id)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
var taskIds = tasks.Select(t => t.Id).ToList();
|
|
||||||
var sections = await _context.TaskSections
|
var sections = await _context.TaskSections
|
||||||
.Include(s => s.Skill)
|
.Include(s => s.Skill)
|
||||||
.Where(s => taskIds.Contains(s.TaskId))
|
.Where(s => tasks.Contains(s.TaskId))
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
foreach (var item in items)
|
foreach (var item in items)
|
||||||
{
|
{
|
||||||
var phaseTaskIds = tasks.Where(t => t.PhaseId == item.Id).Select(t => t.Id).ToList();
|
// Filter tasks for this phase
|
||||||
|
var phaseTaskIds = await _context.ProjectTasks
|
||||||
|
.Where(t => t.PhaseId == item.Id)
|
||||||
|
.Select(t => t.Id)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
var itemSections = sections.Where(s => phaseTaskIds.Contains(s.TaskId));
|
var itemSections = sections.Where(s => phaseTaskIds.Contains(s.TaskId));
|
||||||
|
item.Backend = GetAssignmentStatus(itemSections.FirstOrDefault(x => x.Skill?.Name == "Backend"));
|
||||||
item.Backend = AggregateAssignmentStatus(itemSections.Where(x => x.Skill?.Name == "Backend"));
|
item.Front = GetAssignmentStatus(itemSections.FirstOrDefault(x => x.Skill?.Name == "Frontend"));
|
||||||
item.Front = AggregateAssignmentStatus(itemSections.Where(x => x.Skill?.Name == "Frontend"));
|
item.Design = GetAssignmentStatus(itemSections.FirstOrDefault(x => x.Skill?.Name == "UI/UX Design"));
|
||||||
item.Design = AggregateAssignmentStatus(itemSections.Where(x => x.Skill?.Name == "UI/UX Design"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<(int Percentage, TimeSpan TotalTime,TimeSpan RemainingTime)> CalculateProjectPercentage(Project project,
|
private async Task<(int Percentage, TimeSpan TotalTime)> CalculateProjectPercentage(Project project, CancellationToken cancellationToken)
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
var phases = await _context.ProjectPhases
|
var phases = await _context.ProjectPhases
|
||||||
.Where(ph => ph.ProjectId == project.Id)
|
.Where(ph => ph.ProjectId == project.Id)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
if (!phases.Any())
|
if (!phases.Any())
|
||||||
return (0, TimeSpan.Zero,TimeSpan.Zero);
|
return (0, TimeSpan.Zero);
|
||||||
var phasePercentages = new List<int>();
|
var phasePercentages = new List<int>();
|
||||||
var totalTime = TimeSpan.Zero;
|
var totalTime = TimeSpan.Zero;
|
||||||
var remainingTime = TimeSpan.Zero;
|
|
||||||
foreach (var phase in phases)
|
foreach (var phase in phases)
|
||||||
{
|
{
|
||||||
var (phasePercentage, phaseTime,phaseRemainingTime) = await CalculatePhasePercentage(phase, cancellationToken);
|
var (phasePercentage, phaseTime) = await CalculatePhasePercentage(phase, cancellationToken);
|
||||||
phasePercentages.Add(phasePercentage);
|
phasePercentages.Add(phasePercentage);
|
||||||
totalTime += phaseTime;
|
totalTime += phaseTime;
|
||||||
remainingTime += phaseRemainingTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var averagePercentage = phasePercentages.Any() ? (int)phasePercentages.Average() : 0;
|
var averagePercentage = phasePercentages.Any() ? (int)phasePercentages.Average() : 0;
|
||||||
return (averagePercentage, totalTime,remainingTime);
|
return (averagePercentage, totalTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<(int Percentage, TimeSpan TotalTime,TimeSpan RemainingTime)> CalculatePhasePercentage(ProjectPhase phase,
|
private async Task<(int Percentage, TimeSpan TotalTime)> CalculatePhasePercentage(ProjectPhase phase, CancellationToken cancellationToken)
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
var tasks = await _context.ProjectTasks
|
var tasks = await _context.ProjectTasks
|
||||||
.Where(t => t.PhaseId == phase.Id)
|
.Where(t => t.PhaseId == phase.Id)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
if (!tasks.Any())
|
if (!tasks.Any())
|
||||||
return (0, TimeSpan.Zero,TimeSpan.Zero);
|
return (0, TimeSpan.Zero);
|
||||||
var taskPercentages = new List<int>();
|
var taskPercentages = new List<int>();
|
||||||
var totalTime = TimeSpan.Zero;
|
var totalTime = TimeSpan.Zero;
|
||||||
var remainingTime = TimeSpan.Zero;
|
|
||||||
foreach (var task in tasks)
|
foreach (var task in tasks)
|
||||||
{
|
{
|
||||||
var (taskPercentage, taskTime,taskRemainingTime) = await CalculateTaskPercentage(task, cancellationToken);
|
var (taskPercentage, taskTime) = await CalculateTaskPercentage(task, cancellationToken);
|
||||||
taskPercentages.Add(taskPercentage);
|
taskPercentages.Add(taskPercentage);
|
||||||
totalTime += taskTime;
|
totalTime += taskTime;
|
||||||
remainingTime += taskRemainingTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var averagePercentage = taskPercentages.Any() ? (int)taskPercentages.Average() : 0;
|
var averagePercentage = taskPercentages.Any() ? (int)taskPercentages.Average() : 0;
|
||||||
return (averagePercentage, totalTime,remainingTime);
|
return (averagePercentage, totalTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<(int Percentage, TimeSpan TotalTime, TimeSpan RemainingTime)> CalculateTaskPercentage(
|
private async Task<(int Percentage, TimeSpan TotalTime)> CalculateTaskPercentage(ProjectTask task, CancellationToken cancellationToken)
|
||||||
ProjectTask task, CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
var sections = await _context.TaskSections
|
var sections = await _context.TaskSections
|
||||||
.Include(s => s.Activities)
|
.Include(s => s.Activities)
|
||||||
@@ -335,21 +315,17 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
.Where(s => s.TaskId == task.Id)
|
.Where(s => s.TaskId == task.Id)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
if (!sections.Any())
|
if (!sections.Any())
|
||||||
return (0, TimeSpan.Zero, TimeSpan.Zero);
|
return (0, TimeSpan.Zero);
|
||||||
var sectionPercentages = new List<int>();
|
var sectionPercentages = new List<int>();
|
||||||
var totalTime = TimeSpan.Zero;
|
var totalTime = TimeSpan.Zero;
|
||||||
var spentTime = TimeSpan.Zero;
|
|
||||||
foreach (var section in sections)
|
foreach (var section in sections)
|
||||||
{
|
{
|
||||||
var (sectionPercentage, sectionTime) = CalculateSectionPercentage(section);
|
var (sectionPercentage, sectionTime) = CalculateSectionPercentage(section);
|
||||||
var sectionSpent = TimeSpan.FromTicks(section.Activities.Sum(x => x.GetTimeSpent().Ticks));
|
|
||||||
sectionPercentages.Add(sectionPercentage);
|
sectionPercentages.Add(sectionPercentage);
|
||||||
totalTime += sectionTime;
|
totalTime += sectionTime;
|
||||||
spentTime += sectionSpent;
|
|
||||||
}
|
}
|
||||||
var remainingTime = totalTime - spentTime;
|
|
||||||
var averagePercentage = sectionPercentages.Any() ? (int)sectionPercentages.Average() : 0;
|
var averagePercentage = sectionPercentages.Any() ? (int)sectionPercentages.Average() : 0;
|
||||||
return (averagePercentage, totalTime, remainingTime);
|
return (averagePercentage, totalTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static (int Percentage, TimeSpan TotalTime) CalculateSectionPercentage(TaskSection section)
|
private static (int Percentage, TimeSpan TotalTime) CalculateSectionPercentage(TaskSection section)
|
||||||
@@ -380,57 +356,5 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler<GetProjectsListQuer
|
|||||||
// تعیین تکلیف نشده: نه user دارد نه time
|
// تعیین تکلیف نشده: نه user دارد نه time
|
||||||
return AssignmentStatus.Unassigned;
|
return AssignmentStatus.Unassigned;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static AssignmentStatus AggregatePhaseStatuses(
|
|
||||||
List<Guid> phaseIds,
|
|
||||||
List<(Guid Id, Guid PhaseId)> tasks,
|
|
||||||
List<TaskSection> sections,
|
|
||||||
string skillName)
|
|
||||||
{
|
|
||||||
var phaseStatuses = new List<AssignmentStatus>();
|
|
||||||
|
|
||||||
foreach (var phaseId in phaseIds)
|
|
||||||
{
|
|
||||||
var phaseTaskIds = tasks.Where(t => t.PhaseId == phaseId).Select(t => t.Id).ToList();
|
|
||||||
var phaseSections = sections.Where(s => phaseTaskIds.Contains(s.TaskId) && s.Skill?.Name == skillName);
|
|
||||||
var phaseStatus = AggregateAssignmentStatus(phaseSections);
|
|
||||||
phaseStatuses.Add(phaseStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
// الآن تجمیع وضعیتهای Phases
|
|
||||||
if (!phaseStatuses.Any())
|
|
||||||
return AssignmentStatus.Unassigned;
|
|
||||||
|
|
||||||
// اگر هر یکی Unassigned باشد → Unassigned
|
|
||||||
if (phaseStatuses.Any(s => s == AssignmentStatus.Unassigned))
|
|
||||||
return AssignmentStatus.Unassigned;
|
|
||||||
|
|
||||||
// اگر Unassigned نیست و هر یکی UserOnly باشد → UserOnly
|
|
||||||
if (phaseStatuses.Any(s => s == AssignmentStatus.UserOnly))
|
|
||||||
return AssignmentStatus.UserOnly;
|
|
||||||
|
|
||||||
// فقط اگر همه Assigned باشند → Assigned
|
|
||||||
return AssignmentStatus.Assigned;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static AssignmentStatus AggregateAssignmentStatus(IEnumerable<TaskSection> sections)
|
|
||||||
{
|
|
||||||
var sectionList = sections.ToList();
|
|
||||||
if (!sectionList.Any())
|
|
||||||
return AssignmentStatus.Unassigned;
|
|
||||||
|
|
||||||
var statuses = sectionList.Select(GetAssignmentStatus).ToList();
|
|
||||||
|
|
||||||
// اگر هر یکی Unassigned باشد → Unassigned (بدترین وضعیت)
|
|
||||||
if (statuses.Any(s => s == AssignmentStatus.Unassigned))
|
|
||||||
return AssignmentStatus.Unassigned;
|
|
||||||
|
|
||||||
// اگر Unassigned نیست و هر یکی UserOnly باشد → UserOnly (وضعیت متوسط)
|
|
||||||
if (statuses.Any(s => s == AssignmentStatus.UserOnly))
|
|
||||||
return AssignmentStatus.UserOnly;
|
|
||||||
|
|
||||||
// فقط اگر همه Assigned باشند → Assigned (بهترین وضعیت)
|
|
||||||
return AssignmentStatus.Assigned;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ public class GetTaskDto
|
|||||||
public int Percentage { get; init; }
|
public int Percentage { get; init; }
|
||||||
public ProjectHierarchyLevel Level { get; init; }
|
public ProjectHierarchyLevel Level { get; init; }
|
||||||
public Guid? ParentId { get; init; }
|
public Guid? ParentId { get; init; }
|
||||||
|
public int TotalHours { get; set; }
|
||||||
public TimeSpan TotalTime { get; set; }
|
public int Minutes { get; set; }
|
||||||
|
|
||||||
// Task-specific fields
|
// Task-specific fields
|
||||||
public TimeSpan SpentTime { get; init; }
|
public TimeSpan SpentTime { get; init; }
|
||||||
|
|||||||
@@ -7,6 +7,6 @@ namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.Project
|
|||||||
public record ProjectBoardListQuery: IBaseQuery<List<ProjectBoardListResponse>>
|
public record ProjectBoardListQuery: IBaseQuery<List<ProjectBoardListResponse>>
|
||||||
{
|
{
|
||||||
public long? UserId { get; set; }
|
public long? UserId { get; set; }
|
||||||
public string? ProjectName { get; set; }
|
public string? SearchText { get; set; }
|
||||||
public TaskSectionStatus? Status { get; set; }
|
public TaskSectionStatus? Status { get; set; }
|
||||||
}
|
}
|
||||||
@@ -46,11 +46,11 @@ public class ProjectBoardListQueryHandler : IBaseQueryHandler<ProjectBoardListQu
|
|||||||
queryable = queryable.Where(x => x.CurrentAssignedUserId == request.UserId);
|
queryable = queryable.Where(x => x.CurrentAssignedUserId == request.UserId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(request.ProjectName))
|
if (!string.IsNullOrWhiteSpace(request.SearchText))
|
||||||
{
|
{
|
||||||
queryable = queryable.Where(x=>x.Task.Name.Contains(request.ProjectName)
|
queryable = queryable.Where(x=>x.Task.Name.Contains(request.SearchText)
|
||||||
|| x.Task.Phase.Name.Contains(request.ProjectName)
|
|| x.Task.Phase.Name.Contains(request.SearchText)
|
||||||
|| x.Task.Phase.Project.Name.Contains(request.ProjectName));
|
|| x.Task.Phase.Project.Name.Contains(request.SearchText));
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = await queryable.ToListAsync(cancellationToken);
|
var data = await queryable.ToListAsync(cancellationToken);
|
||||||
@@ -70,9 +70,6 @@ public class ProjectBoardListQueryHandler : IBaseQueryHandler<ProjectBoardListQu
|
|||||||
.OrderByDescending(x => x.CurrentAssignedUserId == currentUserId)
|
.OrderByDescending(x => x.CurrentAssignedUserId == currentUserId)
|
||||||
.ThenByDescending(x=>x.Task.Priority)
|
.ThenByDescending(x=>x.Task.Priority)
|
||||||
.ThenBy(x => GetStatusOrder(x.Status))
|
.ThenBy(x => GetStatusOrder(x.Status))
|
||||||
.ThenBy(x=>x.Task.Phase.ProjectId)
|
|
||||||
.ThenBy(x=>x.Task.PhaseId)
|
|
||||||
.ThenBy(x=>x.TaskId)
|
|
||||||
.Select(x =>
|
.Select(x =>
|
||||||
{
|
{
|
||||||
// محاسبه یکبار برای هر Activity و Cache کردن نتیجه
|
// محاسبه یکبار برای هر Activity و Cache کردن نتیجه
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ public record ProjectSetTimeResponseSkill
|
|||||||
|
|
||||||
public class ProjectSetTimeResponseSectionAdditionalTime
|
public class ProjectSetTimeResponseSectionAdditionalTime
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Hours { get; init; }
|
public int Hours { get; init; }
|
||||||
public int Minutes { get; init; }
|
public int Minutes { get; init; }
|
||||||
public string Description { get; init; }
|
public string Description { get; init; }
|
||||||
|
|||||||
@@ -62,7 +62,8 @@ public class ProjectSetTimeDetailsQueryHandler
|
|||||||
var res = new ProjectSetTimeResponse(
|
var res = new ProjectSetTimeResponse(
|
||||||
skills.Select(skill =>
|
skills.Select(skill =>
|
||||||
{
|
{
|
||||||
var section = task.Sections
|
var section = task
|
||||||
|
.Sections
|
||||||
.FirstOrDefault(x => x.SkillId == skill.Id);
|
.FirstOrDefault(x => x.SkillId == skill.Id);
|
||||||
var user = users.FirstOrDefault(x => x.Id == section?.OriginalAssignedUserId);
|
var user = users.FirstOrDefault(x => x.Id == section?.OriginalAssignedUserId);
|
||||||
return new ProjectSetTimeResponseSkill
|
return new ProjectSetTimeResponseSkill
|
||||||
@@ -70,7 +71,6 @@ public class ProjectSetTimeDetailsQueryHandler
|
|||||||
AdditionalTimes = section?.AdditionalTimes
|
AdditionalTimes = section?.AdditionalTimes
|
||||||
.Select(x => new ProjectSetTimeResponseSectionAdditionalTime
|
.Select(x => new ProjectSetTimeResponseSectionAdditionalTime
|
||||||
{
|
{
|
||||||
Id = x.Id,
|
|
||||||
Description = x.Reason ?? "",
|
Description = x.Reason ?? "",
|
||||||
Hours = (int)x.Hours.TotalHours,
|
Hours = (int)x.Hours.TotalHours,
|
||||||
Minutes = x.Hours.Minutes,
|
Minutes = x.Hours.Minutes,
|
||||||
|
|||||||
@@ -28,25 +28,26 @@ public class SendMessageCommandHandler : IBaseCommandHandler<SendMessageCommand,
|
|||||||
private readonly ITaskChatMessageRepository _messageRepository;
|
private readonly ITaskChatMessageRepository _messageRepository;
|
||||||
private readonly IUploadedFileRepository _fileRepository;
|
private readonly IUploadedFileRepository _fileRepository;
|
||||||
private readonly IProjectTaskRepository _taskRepository;
|
private readonly IProjectTaskRepository _taskRepository;
|
||||||
private readonly IFileUploadService _fileUploadService;
|
private readonly IFileStorageService _fileStorageService;
|
||||||
|
private readonly IThumbnailGeneratorService _thumbnailService;
|
||||||
private readonly IAuthHelper _authHelper;
|
private readonly IAuthHelper _authHelper;
|
||||||
|
|
||||||
public SendMessageCommandHandler(
|
public SendMessageCommandHandler(
|
||||||
ITaskChatMessageRepository messageRepository,
|
ITaskChatMessageRepository messageRepository,
|
||||||
IUploadedFileRepository fileRepository,
|
IUploadedFileRepository fileRepository,
|
||||||
IProjectTaskRepository taskRepository,
|
IProjectTaskRepository taskRepository,
|
||||||
IAuthHelper authHelper,
|
IFileStorageService fileStorageService,
|
||||||
IFileUploadService fileUploadService)
|
IThumbnailGeneratorService thumbnailService, IAuthHelper authHelper)
|
||||||
{
|
{
|
||||||
_messageRepository = messageRepository;
|
_messageRepository = messageRepository;
|
||||||
_fileRepository = fileRepository;
|
_fileRepository = fileRepository;
|
||||||
_taskRepository = taskRepository;
|
_taskRepository = taskRepository;
|
||||||
|
_fileStorageService = fileStorageService;
|
||||||
|
_thumbnailService = thumbnailService;
|
||||||
_authHelper = authHelper;
|
_authHelper = authHelper;
|
||||||
_fileUploadService = fileUploadService;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<OperationResult<MessageDto>> Handle(SendMessageCommand request,
|
public async Task<OperationResult<MessageDto>> Handle(SendMessageCommand request, CancellationToken cancellationToken)
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
var currentUserId = _authHelper.GetCurrentUserId()
|
var currentUserId = _authHelper.GetCurrentUserId()
|
||||||
?? throw new UnAuthorizedException("کاربر احراز هویت نشده است");
|
?? throw new UnAuthorizedException("کاربر احراز هویت نشده است");
|
||||||
@@ -60,17 +61,71 @@ public class SendMessageCommandHandler : IBaseCommandHandler<SendMessageCommand,
|
|||||||
Guid? uploadedFileId = null;
|
Guid? uploadedFileId = null;
|
||||||
if (request.File != null)
|
if (request.File != null)
|
||||||
{
|
{
|
||||||
var uploadedFile = await _fileUploadService.UploadFileAsync
|
if (request.File.Length == 0)
|
||||||
(
|
|
||||||
request.File,
|
|
||||||
FileCategory.TaskChatMessage,
|
|
||||||
currentUserId
|
|
||||||
);
|
|
||||||
if (!uploadedFile.IsSuccess)
|
|
||||||
{
|
{
|
||||||
return OperationResult<MessageDto>.Failure(uploadedFile.ErrorMessage ?? "خطا در آپلود فایل");
|
return OperationResult<MessageDto>.ValidationError("فایل خالی است");
|
||||||
|
}
|
||||||
|
|
||||||
|
const long maxFileSize = 100 * 1024 * 1024;
|
||||||
|
if (request.File.Length > maxFileSize)
|
||||||
|
{
|
||||||
|
return OperationResult<MessageDto>.ValidationError("حجم فایل بیش از حد مجاز است (حداکثر 100MB)");
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileType = DetectFileType(request.File.ContentType, Path.GetExtension(request.File.FileName));
|
||||||
|
|
||||||
|
var uploadedFile = new UploadedFile(
|
||||||
|
originalFileName: request.File.FileName,
|
||||||
|
fileSizeBytes: request.File.Length,
|
||||||
|
mimeType: request.File.ContentType,
|
||||||
|
fileType: fileType,
|
||||||
|
category: FileCategory.TaskChatMessage,
|
||||||
|
uploadedByUserId: currentUserId,
|
||||||
|
storageProvider: StorageProvider.LocalFileSystem
|
||||||
|
);
|
||||||
|
|
||||||
|
await _fileRepository.AddAsync(uploadedFile);
|
||||||
|
await _fileRepository.SaveChangesAsync();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var stream = request.File.OpenReadStream();
|
||||||
|
var uploadResult = await _fileStorageService.UploadAsync(
|
||||||
|
stream,
|
||||||
|
uploadedFile.UniqueFileName,
|
||||||
|
"TaskChatMessage"
|
||||||
|
);
|
||||||
|
|
||||||
|
uploadedFile.CompleteUpload(uploadResult.StoragePath, uploadResult.StorageUrl);
|
||||||
|
|
||||||
|
if (fileType == FileType.Image)
|
||||||
|
{
|
||||||
|
var dimensions = await _thumbnailService.GetImageDimensionsAsync(uploadResult.StoragePath);
|
||||||
|
if (dimensions.HasValue)
|
||||||
|
{
|
||||||
|
uploadedFile.SetImageDimensions(dimensions.Value.Width, dimensions.Value.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
var thumbnail = await _thumbnailService
|
||||||
|
.GenerateImageThumbnailAsync(uploadResult.StoragePath, category: "TaskChatMessage");
|
||||||
|
if (thumbnail.HasValue)
|
||||||
|
{
|
||||||
|
uploadedFile.SetThumbnail(thumbnail.Value.ThumbnailUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await _fileRepository.UpdateAsync(uploadedFile);
|
||||||
|
await _fileRepository.SaveChangesAsync();
|
||||||
|
|
||||||
|
uploadedFileId = uploadedFile.Id;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
await _fileRepository.DeleteAsync(uploadedFile);
|
||||||
|
await _fileRepository.SaveChangesAsync();
|
||||||
|
|
||||||
|
return OperationResult<MessageDto>.ValidationError($"خطا در آپلود فایل: {ex.Message}");
|
||||||
}
|
}
|
||||||
uploadedFileId = uploadedFile.FileId!.Value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var message = new TaskChatMessage(
|
var message = new TaskChatMessage(
|
||||||
|
|||||||
@@ -1,69 +0,0 @@
|
|||||||
using GozareshgirProgramManager.Domain.FileManagementAgg.Enums;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
|
|
||||||
namespace GozareshgirProgramManager.Application.Services.FileManagement;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// سرویس آپلود و مدیریت کامل فایل
|
|
||||||
/// این سرویس تمام مراحل آپلود، ذخیره، تولید thumbnail و... را انجام میدهد
|
|
||||||
/// </summary>
|
|
||||||
public interface IFileUploadService
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// آپلود فایل با تمام مراحل پردازش
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="file">فایل برای آپلود</param>
|
|
||||||
/// <param name="category">دستهبندی فایل</param>
|
|
||||||
/// <param name="uploadedByUserId">شناسه کاربر آپلودکننده</param>
|
|
||||||
/// <param name="maxFileSizeBytes">حداکثر حجم مجاز فایل (پیشفرض: 100MB)</param>
|
|
||||||
/// <returns>شناسه فایل آپلود شده یا null در صورت خطا</returns>
|
|
||||||
Task<FileUploadResult> UploadFileAsync(
|
|
||||||
IFormFile file,
|
|
||||||
FileCategory category,
|
|
||||||
long uploadedByUserId,
|
|
||||||
long maxFileSizeBytes = 100 * 1024 * 1024);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// آپلود فایل با Stream
|
|
||||||
/// </summary>
|
|
||||||
Task<FileUploadResult> UploadFileFromStreamAsync(
|
|
||||||
Stream fileStream,
|
|
||||||
string fileName,
|
|
||||||
string contentType,
|
|
||||||
FileCategory category,
|
|
||||||
long uploadedByUserId,
|
|
||||||
long maxFileSizeBytes = 100 * 1024 * 1024);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// نتیجه عملیات آپلود فایل
|
|
||||||
/// </summary>
|
|
||||||
public class FileUploadResult
|
|
||||||
{
|
|
||||||
public bool IsSuccess { get; set; }
|
|
||||||
public Guid? FileId { get; set; }
|
|
||||||
public string? ErrorMessage { get; set; }
|
|
||||||
public string? StorageUrl { get; set; }
|
|
||||||
public string? ThumbnailUrl { get; set; }
|
|
||||||
|
|
||||||
public static FileUploadResult Success(Guid fileId, string storageUrl, string? thumbnailUrl = null)
|
|
||||||
{
|
|
||||||
return new FileUploadResult
|
|
||||||
{
|
|
||||||
IsSuccess = true,
|
|
||||||
FileId = fileId,
|
|
||||||
StorageUrl = storageUrl,
|
|
||||||
ThumbnailUrl = thumbnailUrl
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static FileUploadResult Failed(string errorMessage)
|
|
||||||
{
|
|
||||||
return new FileUploadResult
|
|
||||||
{
|
|
||||||
IsSuccess = false,
|
|
||||||
ErrorMessage = errorMessage
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -149,22 +149,6 @@ public static class ProgramManagerPermissionCode
|
|||||||
{
|
{
|
||||||
public const int Code = 990111;
|
public const int Code = 990111;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// اولویت بندی
|
|
||||||
/// </summary>
|
|
||||||
public static class Priority
|
|
||||||
{
|
|
||||||
public const int Code = 990112;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ایجاد تسک باگ
|
|
||||||
/// </summary>
|
|
||||||
public static class CreateBug
|
|
||||||
{
|
|
||||||
public const int Code = 990113;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -242,25 +226,10 @@ public static class ProgramManagerPermissionCode
|
|||||||
{
|
{
|
||||||
public const int Code = 990208;
|
public const int Code = 990208;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// رد با تایید اتمام اجرا
|
|
||||||
/// </summary>
|
|
||||||
public static class RejectOrApproveTaskComplete
|
|
||||||
{
|
|
||||||
public const int Code = 990209;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Workflow[تب کارپوشه]
|
|
||||||
public static class Workflow
|
|
||||||
{
|
|
||||||
public const int Code = 9903;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
public static Dictionary<string, object> GetAllCodes()
|
public static Dictionary<string, object> GetAllCodes()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -42,6 +42,14 @@ public class ProjectPhase : ProjectHierarchyNode
|
|||||||
|
|
||||||
#region Task Management
|
#region Task Management
|
||||||
|
|
||||||
|
public ProjectTask AddTask(string name, string? description = null)
|
||||||
|
{
|
||||||
|
var task = new ProjectTask(name, Id, description);
|
||||||
|
_tasks.Add(task);
|
||||||
|
AddDomainEvent(new TaskAddedEvent(task.Id, Id, name));
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
public void RemoveTask(Guid taskId)
|
public void RemoveTask(Guid taskId)
|
||||||
{
|
{
|
||||||
var task = _tasks.FirstOrDefault(t => t.Id == taskId);
|
var task = _tasks.FirstOrDefault(t => t.Id == taskId);
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ public class ProjectTask : ProjectHierarchyNode
|
|||||||
_sections = new List<TaskSection>();
|
_sections = new List<TaskSection>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProjectTask(string name, Guid phaseId,ProjectTaskPriority priority, string? description = null) : base(name, description)
|
public ProjectTask(string name, Guid phaseId, string? description = null) : base(name, description)
|
||||||
{
|
{
|
||||||
PhaseId = phaseId;
|
PhaseId = phaseId;
|
||||||
_sections = new List<TaskSection>();
|
_sections = new List<TaskSection>();
|
||||||
Priority = priority;
|
Priority = ProjectTaskPriority.Low;
|
||||||
AddDomainEvent(new TaskCreatedEvent(Id, phaseId, name));
|
AddDomainEvent(new TaskCreatedEvent(Id, phaseId, name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,15 +26,4 @@ public class TaskSectionAdditionalTime : EntityBase<Guid>
|
|||||||
{
|
{
|
||||||
Reason = reason;
|
Reason = reason;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(TimeSpan hours, string? reason = null)
|
|
||||||
{
|
|
||||||
Hours = hours;
|
|
||||||
Reason = reason;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool HasChanged(TimeSpan newHours, string? newReason)
|
|
||||||
{
|
|
||||||
return Hours != newHours || Reason != newReason;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,7 +92,6 @@ public static class DependencyInjection
|
|||||||
// File Storage Services
|
// File Storage Services
|
||||||
services.AddScoped<IFileStorageService, Services.FileManagement.LocalFileStorageService>();
|
services.AddScoped<IFileStorageService, Services.FileManagement.LocalFileStorageService>();
|
||||||
services.AddScoped<IThumbnailGeneratorService, Services.FileManagement.ThumbnailGeneratorService>();
|
services.AddScoped<IThumbnailGeneratorService, Services.FileManagement.ThumbnailGeneratorService>();
|
||||||
services.AddScoped<IFileUploadService, Services.FileManagement.FileUploadService>();
|
|
||||||
|
|
||||||
// JWT Settings
|
// JWT Settings
|
||||||
services.Configure<JwtSettings>(configuration.GetSection("JwtSettings"));
|
services.Configure<JwtSettings>(configuration.GetSection("JwtSettings"));
|
||||||
|
|||||||
@@ -1,231 +0,0 @@
|
|||||||
using GozareshgirProgramManager.Application.Services.FileManagement;
|
|
||||||
using GozareshgirProgramManager.Domain.FileManagementAgg.Entities;
|
|
||||||
using GozareshgirProgramManager.Domain.FileManagementAgg.Enums;
|
|
||||||
using GozareshgirProgramManager.Domain.FileManagementAgg.Repositories;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
|
|
||||||
namespace GozareshgirProgramManager.Infrastructure.Services.FileManagement;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// پیادهسازی سرویس آپلود کامل فایل
|
|
||||||
/// </summary>
|
|
||||||
public class FileUploadService : IFileUploadService
|
|
||||||
{
|
|
||||||
private readonly IUploadedFileRepository _fileRepository;
|
|
||||||
private readonly IFileStorageService _fileStorageService;
|
|
||||||
private readonly IThumbnailGeneratorService _thumbnailService;
|
|
||||||
private readonly ILogger<FileUploadService> _logger;
|
|
||||||
|
|
||||||
public FileUploadService(
|
|
||||||
IUploadedFileRepository fileRepository,
|
|
||||||
IFileStorageService fileStorageService,
|
|
||||||
IThumbnailGeneratorService thumbnailService,
|
|
||||||
ILogger<FileUploadService> logger)
|
|
||||||
{
|
|
||||||
_fileRepository = fileRepository;
|
|
||||||
_fileStorageService = fileStorageService;
|
|
||||||
_thumbnailService = thumbnailService;
|
|
||||||
_logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<FileUploadResult> UploadFileAsync(
|
|
||||||
IFormFile file,
|
|
||||||
FileCategory category,
|
|
||||||
long uploadedByUserId,
|
|
||||||
long maxFileSizeBytes = 100 * 1024 * 1024)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// اعتبارسنجی ورودی
|
|
||||||
if (file.Length == 0)
|
|
||||||
{
|
|
||||||
return FileUploadResult.Failed("فایل خالی است");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file.Length > maxFileSizeBytes)
|
|
||||||
{
|
|
||||||
var maxSizeMb = maxFileSizeBytes / (1024 * 1024);
|
|
||||||
return FileUploadResult.Failed($"حجم فایل بیش از حد مجاز است (حداکثر {maxSizeMb}MB)");
|
|
||||||
}
|
|
||||||
|
|
||||||
using var stream = file.OpenReadStream();
|
|
||||||
return await UploadFileFromStreamAsync(
|
|
||||||
stream,
|
|
||||||
file.FileName,
|
|
||||||
file.ContentType,
|
|
||||||
category,
|
|
||||||
uploadedByUserId,
|
|
||||||
maxFileSizeBytes);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "خطا در آپلود فایل {FileName}", file.FileName);
|
|
||||||
return FileUploadResult.Failed($"خطا در آپلود فایل: {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<FileUploadResult> UploadFileFromStreamAsync(
|
|
||||||
Stream fileStream,
|
|
||||||
string fileName,
|
|
||||||
string contentType,
|
|
||||||
FileCategory category,
|
|
||||||
long uploadedByUserId,
|
|
||||||
long maxFileSizeBytes = 100 * 1024 * 1024)
|
|
||||||
{
|
|
||||||
UploadedFile? uploadedFile = null;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// تشخیص نوع فایل
|
|
||||||
var fileType = DetectFileType(contentType, Path.GetExtension(fileName));
|
|
||||||
|
|
||||||
// ایجاد رکورد فایل در دیتابیس
|
|
||||||
uploadedFile = new UploadedFile(
|
|
||||||
originalFileName: fileName,
|
|
||||||
fileSizeBytes: fileStream.Length,
|
|
||||||
mimeType: contentType,
|
|
||||||
fileType: fileType,
|
|
||||||
category: category,
|
|
||||||
uploadedByUserId: uploadedByUserId,
|
|
||||||
storageProvider: StorageProvider.LocalFileSystem
|
|
||||||
);
|
|
||||||
|
|
||||||
await _fileRepository.AddAsync(uploadedFile);
|
|
||||||
await _fileRepository.SaveChangesAsync();
|
|
||||||
|
|
||||||
// آپلود فایل به استوریج
|
|
||||||
var categoryFolder = category.ToString();
|
|
||||||
var uploadResult = await _fileStorageService.UploadAsync(
|
|
||||||
fileStream,
|
|
||||||
uploadedFile.UniqueFileName,
|
|
||||||
categoryFolder
|
|
||||||
);
|
|
||||||
|
|
||||||
// بهروزرسانی اطلاعات آپلود
|
|
||||||
uploadedFile.CompleteUpload(uploadResult.StoragePath, uploadResult.StorageUrl);
|
|
||||||
|
|
||||||
// پردازشهای خاص بر اساس نوع فایل
|
|
||||||
string? thumbnailUrl = null;
|
|
||||||
if (fileType == FileType.Image)
|
|
||||||
{
|
|
||||||
thumbnailUrl = await ProcessImageAsync(uploadedFile, uploadResult.StoragePath, categoryFolder);
|
|
||||||
}
|
|
||||||
else if (fileType == FileType.Video)
|
|
||||||
{
|
|
||||||
thumbnailUrl = await ProcessVideoAsync(uploadedFile, uploadResult.StoragePath, categoryFolder);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ذخیره تغییرات نهایی
|
|
||||||
await _fileRepository.UpdateAsync(uploadedFile);
|
|
||||||
await _fileRepository.SaveChangesAsync();
|
|
||||||
|
|
||||||
_logger.LogInformation(
|
|
||||||
"فایل {FileName} با شناسه {FileId} با موفقیت آپلود شد",
|
|
||||||
fileName,
|
|
||||||
uploadedFile.Id);
|
|
||||||
|
|
||||||
return FileUploadResult.Success(uploadedFile.Id, uploadResult.StorageUrl, thumbnailUrl);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "خطا در آپلود فایل {FileName}", fileName);
|
|
||||||
|
|
||||||
// در صورت خطا، فایل آپلود شده را حذف کنیم
|
|
||||||
if (uploadedFile != null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await _fileRepository.DeleteAsync(uploadedFile);
|
|
||||||
await _fileRepository.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
catch (Exception deleteEx)
|
|
||||||
{
|
|
||||||
_logger.LogError(deleteEx, "خطا در حذف فایل ناموفق {FileId}", uploadedFile.Id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return FileUploadResult.Failed($"خطا در آپلود فایل: {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// پردازش تصویر (ابعاد و thumbnail)
|
|
||||||
/// </summary>
|
|
||||||
private async Task<string?> ProcessImageAsync(UploadedFile file, string storagePath, string categoryFolder)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// دریافت ابعاد تصویر
|
|
||||||
var dimensions = await _thumbnailService.GetImageDimensionsAsync(storagePath);
|
|
||||||
if (dimensions.HasValue)
|
|
||||||
{
|
|
||||||
file.SetImageDimensions(dimensions.Value.Width, dimensions.Value.Height);
|
|
||||||
}
|
|
||||||
|
|
||||||
// تولید thumbnail
|
|
||||||
var thumbnail = await _thumbnailService.GenerateImageThumbnailAsync(
|
|
||||||
storagePath,
|
|
||||||
category: categoryFolder);
|
|
||||||
|
|
||||||
if (thumbnail.HasValue)
|
|
||||||
{
|
|
||||||
file.SetThumbnail(thumbnail.Value.ThumbnailUrl);
|
|
||||||
return thumbnail.Value.ThumbnailUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogWarning(ex, "خطا در پردازش تصویر {FileId}", file.Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// پردازش ویدیو (thumbnail)
|
|
||||||
/// </summary>
|
|
||||||
private async Task<string?> ProcessVideoAsync(UploadedFile file, string storagePath, string categoryFolder)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// تولید thumbnail از ویدیو
|
|
||||||
var thumbnail = await _thumbnailService.GenerateVideoThumbnailAsync(
|
|
||||||
storagePath,
|
|
||||||
category: categoryFolder);
|
|
||||||
|
|
||||||
if (thumbnail.HasValue)
|
|
||||||
{
|
|
||||||
file.SetThumbnail(thumbnail.Value.ThumbnailUrl);
|
|
||||||
return thumbnail.Value.ThumbnailUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogWarning(ex, "خطا در پردازش ویدیو {FileId}", file.Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// تشخیص نوع فایل از روی MIME type و extension
|
|
||||||
/// </summary>
|
|
||||||
private FileType DetectFileType(string mimeType, string extension)
|
|
||||||
{
|
|
||||||
if (mimeType.StartsWith("image/", StringComparison.OrdinalIgnoreCase))
|
|
||||||
return FileType.Image;
|
|
||||||
|
|
||||||
if (mimeType.StartsWith("video/", StringComparison.OrdinalIgnoreCase))
|
|
||||||
return FileType.Video;
|
|
||||||
|
|
||||||
if (mimeType.StartsWith("audio/", StringComparison.OrdinalIgnoreCase))
|
|
||||||
return FileType.Audio;
|
|
||||||
|
|
||||||
if (new[] { ".zip", ".rar", ".7z", ".tar", ".gz" }.Contains(extension.ToLower()))
|
|
||||||
return FileType.Archive;
|
|
||||||
|
|
||||||
return FileType.Document;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,7 +1,4 @@
|
|||||||
using _0_Framework.Application;
|
using _0_Framework.Application.Sms;
|
||||||
using _0_Framework.Application.Enums;
|
|
||||||
using _0_Framework.Application.Sms;
|
|
||||||
using CompanyManagment.App.Contracts.InstitutionContract;
|
|
||||||
using CompanyManagment.App.Contracts.SmsResult;
|
using CompanyManagment.App.Contracts.SmsResult;
|
||||||
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@@ -12,14 +9,12 @@ namespace ServiceHost.Areas.Admin.Controllers;
|
|||||||
public class SmsReportController : AdminBaseController
|
public class SmsReportController : AdminBaseController
|
||||||
{
|
{
|
||||||
private readonly ISmsResultApplication _smsResultApplication;
|
private readonly ISmsResultApplication _smsResultApplication;
|
||||||
private readonly ISmsSettingApplication _smsSettingApplication;
|
|
||||||
private readonly ISmsService _smsService;
|
private readonly ISmsService _smsService;
|
||||||
|
|
||||||
public SmsReportController(ISmsResultApplication smsResultApplication, ISmsService smsService, ISmsSettingApplication smsSettingApplication)
|
public SmsReportController(ISmsResultApplication smsResultApplication, ISmsService smsService)
|
||||||
{
|
{
|
||||||
_smsResultApplication = smsResultApplication;
|
_smsResultApplication = smsResultApplication;
|
||||||
_smsService = smsService;
|
_smsService = smsService;
|
||||||
_smsSettingApplication = smsSettingApplication;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -40,25 +35,11 @@ public class SmsReportController : AdminBaseController
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="searchModel"></param>
|
/// <param name="searchModel"></param>
|
||||||
/// <param name="date"></param>
|
/// <param name="date"></param>
|
||||||
/// <param name="typeOfSmsSetting"></param>
|
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("GetExpandedList")]
|
[HttpGet("GetExpandedList")]
|
||||||
public async Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date, string typeOfSmsSetting)
|
public async Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date)
|
||||||
{
|
{
|
||||||
var result =await _smsResultApplication.GetSmsReportExpandList(searchModel, date, typeOfSmsSetting);
|
var result =await _smsResultApplication.GetSmsReportExpandList(searchModel, date);
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت جزئیات پیامک
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="messId"></param>
|
|
||||||
/// <param name="fullName"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("GetSmsDetails")]
|
|
||||||
public async Task<SmsDetailsDto> GetSmsDetails(int messId, string fullName)
|
|
||||||
{
|
|
||||||
var result =await _smsService.GetSmsDetailsByMessageId(messId, fullName);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,207 +56,4 @@ public class SmsReportController : AdminBaseController
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//تنظیمات پیامک خودکار
|
|
||||||
#region SmsSettings
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// لیست تنظیمات پیامک - یادآور
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("ReminderSmsSettingList")]
|
|
||||||
public async Task<List<SmsSettingDto>> ReminderSmsSettingList()
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.GetSmsSettingList(TypeOfSmsSetting.InstitutionContractDebtReminder);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// لیست تنظیمات پیامک - مسدودی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("BlockSmsSettingList")]
|
|
||||||
public async Task<List<SmsSettingDto>> BlockSmsSettingList()
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.GetSmsSettingList(TypeOfSmsSetting.BlockContractingParty);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// لیست تنظیمات پیامک - هشدار قضایی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("WarningSmsSettingList")]
|
|
||||||
public async Task<List<SmsSettingDto>> WarningSmsSettingList()
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.GetSmsSettingList(TypeOfSmsSetting.Warning);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// لیست تنظیمات پیامک - اقدام قضایی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("LegalActionSmsSettingList")]
|
|
||||||
public async Task<List<SmsSettingDto>> LegalActionSmsSettingList()
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.GetSmsSettingList(TypeOfSmsSetting.LegalAction);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// لیست تنظیمات پیامک - تایید قراداد مالی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("ContractConfirmSmsSettingList")]
|
|
||||||
public async Task<List<SmsSettingDto>> ContractConfirmSmsSettingList()
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.GetSmsSettingList(TypeOfSmsSetting.InstitutionContractConfirm);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=====================Create=========================
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ایجاد پیامک یادآور
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost("CreateReminderSmsSetting")]
|
|
||||||
public async Task<ActionResult<OperationResult>> CreateReminderSmsSetting([FromBody] CreateSmsSettingDto command)
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.CreateSmsSetting(command.DayOfMonth, command.TimeOfDayDisplay, TypeOfSmsSetting.InstitutionContractDebtReminder);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ایجاد پیامک مسدودی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost("CreateBlockSmsSetting")]
|
|
||||||
public async Task<ActionResult<OperationResult>> CreateBlockSmsSetting([FromBody] CreateSmsSettingDto command)
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.CreateSmsSetting(command.DayOfMonth, command.TimeOfDayDisplay, TypeOfSmsSetting.BlockContractingParty);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ایجاد پیامک هشدار قضایی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost("CreateWarningSmsSetting")]
|
|
||||||
public async Task<ActionResult<OperationResult>> CreateWarningSmsSetting([FromBody] CreateSmsSettingDto command)
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.CreateSmsSetting(command.DayOfMonth, command.TimeOfDayDisplay, TypeOfSmsSetting.Warning);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ایجاد پیامک اقدام قضایی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost("CreateLegalActionSmsSetting")]
|
|
||||||
public async Task<ActionResult<OperationResult>> CreateLegalActionSmsSetting([FromBody] CreateSmsSettingDto command)
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.CreateSmsSetting(command.DayOfMonth, command.TimeOfDayDisplay, TypeOfSmsSetting.LegalAction);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ایجاد پیامک تایید قرارداد مالی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost("CreateContractConfirmSmsSetting")]
|
|
||||||
public async Task<ActionResult<OperationResult>> CreateContractConfirmSmsSetting([FromBody] CreateSmsSettingDto command)
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.CreateSmsSetting(command.DayOfMonth, command.TimeOfDayDisplay, TypeOfSmsSetting.InstitutionContractConfirm);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
//=====================Edit=========================
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت اطلاعات ویرایش تنظیمات پیامک
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("GetEditData")]
|
|
||||||
public async Task<SmsSettingDto> GetEditData(long id)
|
|
||||||
{
|
|
||||||
return await _smsSettingApplication.GetSmsSettingDataToEdit(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ویرایش تنظیمات پیامک
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="command"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPut("EditSmsSetting")]
|
|
||||||
public async Task<ActionResult<OperationResult>> EditSmsSetting([FromBody] SmsSettingDto command)
|
|
||||||
{
|
|
||||||
var result =await _smsSettingApplication.EditSmsSetting(command);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=====================Remove=========================
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// حذف تنظیمات پیامک
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpDelete]
|
|
||||||
public async Task<ActionResult<OperationResult>> RemoveSmsSetting(long id)
|
|
||||||
{
|
|
||||||
await _smsSettingApplication.RemoveSetting(id);
|
|
||||||
return Ok(new OperationResult().Succcedded());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست ارسال آنی یادآور
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("GetInstantReminderSmsListData")]
|
|
||||||
public async Task<List<InstantReminderSendSms>> GetInstantReminderSmsListData()
|
|
||||||
{
|
|
||||||
var result =await _smsSettingApplication.GetInstantReminderSmsListData(TypeOfSmsSetting.InstitutionContractDebtReminder);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست ارسال آنی مسدودی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("GetInstantBlockSmsListData")]
|
|
||||||
public async Task<List<InstantReminderSendSms>> GetInstantBlockSmsListData()
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.GetInstantReminderSmsListData(TypeOfSmsSetting.BlockContractingParty);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک آنی یادآور
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="phoneNumbers"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost("InstantReminderSmsSend")]
|
|
||||||
public async Task<ActionResult<OperationResult>> InstantReminderSmsSend([FromBody] List<string> phoneNumbers)
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.InstantSmsSendApi(TypeOfSmsSetting.InstitutionContractDebtReminder, phoneNumbers);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک آنی مسدودی
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="phoneNumbers"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost("InstantBlockSmsSend")]
|
|
||||||
public async Task<ActionResult<OperationResult>> InstantBlockSmsSend([FromBody] List<string> phoneNumbers)
|
|
||||||
{
|
|
||||||
var result = await _smsSettingApplication.InstantSmsSendApi(TypeOfSmsSetting.BlockContractingParty, phoneNumbers);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
@@ -1220,27 +1220,6 @@
|
|||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- اولویت بندی-->
|
|
||||||
<div class="child-check level3">
|
|
||||||
<label class="btn btn-icon waves-effect btn-default m-b-5 open-close">
|
|
||||||
<i class="ion-plus"></i> <i class="ion-minus" style="display: none;"></i><input type="checkbox" style="display: none" class="open-btn" />
|
|
||||||
</label>
|
|
||||||
<label class="btn btn-inverse waves-effect waves-light m-b-5 parentLevel2"> <input type="checkbox" disabled="disabled" value="990112" class="check-btn" data-pm=""> <span style="bottom: 2px;position: relative"> اولویت بندی </span> </label>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- ایجاد تسک باگ-->
|
|
||||||
<div class="child-check level3">
|
|
||||||
<label class="btn btn-icon waves-effect btn-default m-b-5 open-close">
|
|
||||||
<i class="ion-plus"></i> <i class="ion-minus" style="display: none;"></i><input type="checkbox" style="display: none" class="open-btn" />
|
|
||||||
</label>
|
|
||||||
<label class="btn btn-inverse waves-effect waves-light m-b-5 parentLevel2"> <input type="checkbox" disabled="disabled" value="990113" class="check-btn" data-pm=""> <span style="bottom: 2px;position: relative"> ایجاد تسک باگ </span> </label>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--=================================================-->
|
<!--=================================================-->
|
||||||
@@ -1331,28 +1310,8 @@
|
|||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- تایید یا رد اتمام اجرا -->
|
|
||||||
<div class="child-check level3">
|
|
||||||
<label class="btn btn-icon waves-effect btn-default m-b-5 open-close">
|
|
||||||
<i class="ion-plus"></i> <i class="ion-minus" style="display: none;"></i><input type="checkbox" style="display: none" class="open-btn" />
|
|
||||||
</label>
|
|
||||||
<label class="btn btn-inverse waves-effect waves-light m-b-5 parentLevel2"> <input type="checkbox" disabled="disabled" value="990209" class="check-btn" data-pm=""> <span style="bottom: 2px;position: relative"> تایید یا رد اتمام اجرا </span> </label>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
|
||||||
<!--=================================================-->
|
|
||||||
<!--#### کارپوشه ####-->
|
|
||||||
<div class="child-check level2">
|
|
||||||
<label class="btn btn-icon waves-effect btn-default m-b-5 open-close">
|
|
||||||
<i class="ion-plus"></i> <i class="ion-minus" style="display: none;"></i><input type="checkbox" style="display: none" class="open-btn" />
|
|
||||||
</label>
|
|
||||||
<label class="btn btn-inverse waves-effect waves-light m-b-5 parentLevel2"> <input type="checkbox" disabled="disabled" value="9903" class="check-btn" data-pm=""> <span style="bottom: 2px;position: relative"> کارپوشه </span> </label>
|
|
||||||
<!-----------------------Sub Menu------------------->
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1209,26 +1209,6 @@
|
|||||||
<label class="btn btn-inverse waves-effect waves-light m-b-5 parentLevel2"> <input type="checkbox" disabled="disabled" value="990111" class="check-btn" data-pm=""> <span style="bottom: 2px;position: relative"> ایجاد بخش فرعی </span> </label>
|
<label class="btn btn-inverse waves-effect waves-light m-b-5 parentLevel2"> <input type="checkbox" disabled="disabled" value="990111" class="check-btn" data-pm=""> <span style="bottom: 2px;position: relative"> ایجاد بخش فرعی </span> </label>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- اولویت بندی-->
|
|
||||||
<div class="child-check level3">
|
|
||||||
<label class="btn btn-icon waves-effect btn-default m-b-5 open-close">
|
|
||||||
<i class="ion-plus"></i> <i class="ion-minus" style="display: none;"></i><input type="checkbox" style="display: none" class="open-btn" />
|
|
||||||
</label>
|
|
||||||
<label class="btn btn-inverse waves-effect waves-light m-b-5 parentLevel2"> <input type="checkbox" disabled="disabled" value="990112" class="check-btn" data-pm=""> <span style="bottom: 2px;position: relative"> اولویت بندی </span> </label>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- ایجاد تسک باگ-->
|
|
||||||
<div class="child-check level3">
|
|
||||||
<label class="btn btn-icon waves-effect btn-default m-b-5 open-close">
|
|
||||||
<i class="ion-plus"></i> <i class="ion-minus" style="display: none;"></i><input type="checkbox" style="display: none" class="open-btn" />
|
|
||||||
</label>
|
|
||||||
<label class="btn btn-inverse waves-effect waves-light m-b-5 parentLevel2"> <input type="checkbox" disabled="disabled" value="990113" class="check-btn" data-pm=""> <span style="bottom: 2px;position: relative"> ایجاد تسک باگ </span> </label>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -1320,27 +1300,8 @@
|
|||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- تایید یا رد اتمام اجرا -->
|
|
||||||
<div class="child-check level3">
|
|
||||||
<label class="btn btn-icon waves-effect btn-default m-b-5 open-close">
|
|
||||||
<i class="ion-plus"></i> <i class="ion-minus" style="display: none;"></i><input type="checkbox" style="display: none" class="open-btn" />
|
|
||||||
</label>
|
|
||||||
<label class="btn btn-inverse waves-effect waves-light m-b-5 parentLevel2"> <input type="checkbox" disabled="disabled" value="990209" class="check-btn" data-pm=""> <span style="bottom: 2px;position: relative"> تایید یا رد اتمام اجرا </span> </label>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<!--=================================================-->
|
|
||||||
<!--#### کارپوشه ####-->
|
|
||||||
<div class="child-check level2">
|
|
||||||
<label class="btn btn-icon waves-effect btn-default m-b-5 open-close">
|
|
||||||
<i class="ion-plus"></i> <i class="ion-minus" style="display: none;"></i><input type="checkbox" style="display: none" class="open-btn" />
|
|
||||||
</label>
|
|
||||||
<label class="btn btn-inverse waves-effect waves-light m-b-5 parentLevel2"> <input type="checkbox" disabled="disabled" value="9903" class="check-btn" data-pm=""> <span style="bottom: 2px;position: relative"> کارپوشه </span> </label>
|
|
||||||
<!-----------------------Sub Menu------------------->
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -794,19 +794,13 @@ public class IndexModel : PageModel
|
|||||||
watch.Stop();
|
watch.Stop();
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
var firstContract = _contractApplication.GetDetails(ContractsId[0]);
|
|
||||||
var workshop = _workshopApplication.GetDetails(firstContract.WorkshopIds);
|
|
||||||
|
|
||||||
//int i = 0;
|
//int i = 0;
|
||||||
foreach (var item in ContractsId)
|
foreach (var item in ContractsId)
|
||||||
{
|
{
|
||||||
var contract = _contractApplication.GetDetails(item);
|
var contract = _contractApplication.GetDetails(item);
|
||||||
|
|
||||||
//=============== استثنا علی خادم دهقان - میز اداری پویا========
|
|
||||||
if (workshop.Id == 482 && contract.EmployeeId == 7175)
|
|
||||||
workshop.IsOldContract = false;
|
|
||||||
//==============================================================
|
|
||||||
|
|
||||||
//var workingHours = _workingHoursApplication.GetByContractId(contract.Id);
|
//var workingHours = _workingHoursApplication.GetByContractId(contract.Id);
|
||||||
var workingHours = _workingHoursTempApplication.GetByContractIdConvertToShiftwork4(contract.Id);
|
var workingHours = _workingHoursTempApplication.GetByContractIdConvertToShiftwork4(contract.Id);
|
||||||
var separation = _contractApplication.contractSeparation(ConvertYear, ConvertMonth,
|
var separation = _contractApplication.contractSeparation(ConvertYear, ConvertMonth,
|
||||||
@@ -815,7 +809,7 @@ public class IndexModel : PageModel
|
|||||||
if (separation.checker)
|
if (separation.checker)
|
||||||
{
|
{
|
||||||
//workshopInfo
|
//workshopInfo
|
||||||
|
var workshop = _workshopApplication.GetDetails(contract.WorkshopIds);
|
||||||
|
|
||||||
var employeeOptions =
|
var employeeOptions =
|
||||||
_employeeComputeOptionsApplication.GetAllByWorkshopId(contract.WorkshopIds);
|
_employeeComputeOptionsApplication.GetAllByWorkshopId(contract.WorkshopIds);
|
||||||
@@ -1218,7 +1212,7 @@ public class IndexModel : PageModel
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
RewardPayCompute = workshop.RewardComputeOnCheckout,
|
|
||||||
|
|
||||||
};
|
};
|
||||||
_checkoutApplication.Create(command);
|
_checkoutApplication.Create(command);
|
||||||
|
|||||||
@@ -190,7 +190,7 @@
|
|||||||
بانک ها </a>
|
بانک ها </a>
|
||||||
</li>
|
</li>
|
||||||
<li permission="314">
|
<li permission="314">
|
||||||
<a class="clik3" href="https://admin@(AppSetting.Value.Domain)/automatic-sms-reporting">
|
<a class="clik3" asp-page="/Company/SmsResult/Index">
|
||||||
<svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg" style="width: 7px;margin: 0 6px;">
|
<svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg" style="width: 7px;margin: 0 6px;">
|
||||||
<circle cx="6.5" cy="6.5" r="6.5" fill="white"/>
|
<circle cx="6.5" cy="6.5" r="6.5" fill="white"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
@@ -253,7 +253,7 @@
|
|||||||
بانک ها </a>
|
بانک ها </a>
|
||||||
</li>
|
</li>
|
||||||
<li permission="314">
|
<li permission="314">
|
||||||
<a class="clik3" href="https://admin@(AppSetting.Value.Domain)/automatic-sms-reporting">
|
<a class="clik3" asp-area="Admin" asp-page="/Company/SmsResult/Index">
|
||||||
<svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg" style="width: 7px;margin: 0 6px;">
|
<svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg" style="width: 7px;margin: 0 6px;">
|
||||||
<circle cx="6.5" cy="6.5" r="6.5" fill="white" />
|
<circle cx="6.5" cy="6.5" r="6.5" fill="white" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
using _0_Framework.Application;
|
||||||
|
using CompanyManagment.App.Contracts.EmployeeBankInformation;
|
||||||
|
using CompanyManagement.Infrastructure.Excel.EmployeeBankInfo;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using ServiceHost.BaseControllers;
|
||||||
|
|
||||||
|
namespace ServiceHost.Areas.Client.Controllers;
|
||||||
|
|
||||||
|
public class EmployeeBankInfoController : ClientBaseController
|
||||||
|
{
|
||||||
|
private readonly IEmployeeBankInformationApplication _employeeBankInformationApplication;
|
||||||
|
private readonly long _workshopId;
|
||||||
|
|
||||||
|
public EmployeeBankInfoController(IEmployeeBankInformationApplication employeeBankInformationApplication,
|
||||||
|
IAuthHelper authHelper)
|
||||||
|
{
|
||||||
|
_employeeBankInformationApplication = employeeBankInformationApplication;
|
||||||
|
_workshopId = authHelper.GetWorkshopId();
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<ActionResult<List<GroupedEmployeeBankInformationViewModel>>> GetList(
|
||||||
|
EmployeeBankInformationSearchModel searchModel)
|
||||||
|
{
|
||||||
|
return await _employeeBankInformationApplication.SearchAsync(_workshopId, searchModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("{employeeId:long}")]
|
||||||
|
public async Task<ActionResult<GetEmployeeBankInfoDetailsDto>> GetDetails(long employeeId)
|
||||||
|
{
|
||||||
|
return await _employeeBankInformationApplication.GetDetailsByEmployeeIdAsync(_workshopId, employeeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public ActionResult<OperationResult> Create([FromBody]CreateEmployeeInformation command)
|
||||||
|
{
|
||||||
|
command.WorkshopId = _workshopId;
|
||||||
|
return _employeeBankInformationApplication.Create(command);
|
||||||
|
}
|
||||||
|
[HttpPut]
|
||||||
|
public ActionResult<OperationResult> Edit([FromBody]EditEmployeeInformation command)
|
||||||
|
{
|
||||||
|
command.WorkshopId = _workshopId;
|
||||||
|
return _employeeBankInformationApplication.Edit(command);
|
||||||
|
}
|
||||||
|
[HttpDelete("delete-by-employee/{employeeId:long}")]
|
||||||
|
public ActionResult<OperationResult> Remove(long employeeId)
|
||||||
|
{
|
||||||
|
return _employeeBankInformationApplication.RemoveByEmployeeId(_workshopId, employeeId);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpDelete("delete-one/{id:long}")]
|
||||||
|
public IActionResult OnPostDelete(long id)
|
||||||
|
{
|
||||||
|
var result = _employeeBankInformationApplication.Remove(id);
|
||||||
|
return new JsonResult(new
|
||||||
|
{
|
||||||
|
success = result.IsSuccedded,
|
||||||
|
message = result.Message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost("excel")]
|
||||||
|
public ActionResult DownloadExcel([FromBody]DownloadExcelRequest request)
|
||||||
|
{
|
||||||
|
|
||||||
|
var employeeBankInformationViewModelForExcels = _employeeBankInformationApplication.SearchForExcel(_workshopId,
|
||||||
|
new EmployeeBankInformationSearchModel() { EmployeeBankInfoIds = request.Ids });
|
||||||
|
|
||||||
|
var resultViewModel = employeeBankInformationViewModelForExcels.Select(x => new EmployeeBankInfoExcelViewModel
|
||||||
|
{
|
||||||
|
Name = x.EmployeeName,
|
||||||
|
BankAccounts = x.BankInformationList.Select(b => new BankInfoExcelViewModel()
|
||||||
|
{
|
||||||
|
IsDefault = b.IsDefault,
|
||||||
|
ShebaNumber = b.ShebaNumber,
|
||||||
|
AccountNumber = b.BankAccountNumber,
|
||||||
|
BankName = b.BankName,
|
||||||
|
CardNumber = b.CardNumber
|
||||||
|
}).ToList()
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
|
var bytes = EmployeeBankInfoExcelGenerator.Generate(resultViewModel);
|
||||||
|
return File(bytes,
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||||
|
$"اطلاعات بانکی پرسنل.xlsx");
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost("set-default/{bankId:long}")]
|
||||||
|
public IActionResult SetDefault(long bankId)
|
||||||
|
{
|
||||||
|
var result = _employeeBankInformationApplication.SetDefault(_workshopId, bankId);
|
||||||
|
return new JsonResult(new
|
||||||
|
{
|
||||||
|
success = result.IsSuccedded,
|
||||||
|
message = result.Message,
|
||||||
|
id = result.SendId
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public class DownloadExcelRequest
|
||||||
|
{
|
||||||
|
public List<long> Ids { get; set; }
|
||||||
|
}
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
using _0_Framework.Application;
|
|
||||||
using _0_Framework.Domain.CustomizeCheckoutShared.Enums;
|
|
||||||
using CompanyManagment.App.Contracts.Loan;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using ServiceHost.BaseControllers;
|
|
||||||
|
|
||||||
namespace ServiceHost.Areas.Client.Controllers;
|
|
||||||
|
|
||||||
public class LoanController: ClientBaseController
|
|
||||||
{
|
|
||||||
private readonly ILoanApplication _loanApplication;
|
|
||||||
private readonly long _workshopId;
|
|
||||||
|
|
||||||
public LoanController(ILoanApplication loanApplication, IAuthHelper authHelper)
|
|
||||||
{
|
|
||||||
_loanApplication = loanApplication;
|
|
||||||
_workshopId= authHelper.GetWorkshopId();
|
|
||||||
}
|
|
||||||
[HttpGet]
|
|
||||||
public ActionResult<LoanGroupedViewModel> GetList(LoanSearchViewModel searchModel)
|
|
||||||
{
|
|
||||||
searchModel.WorkshopId = _workshopId;
|
|
||||||
var loans = _loanApplication.GetSearchListAsGrouped(searchModel);
|
|
||||||
return loans;
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("{id}")]
|
|
||||||
public async Task<ActionResult<LoanDetailsViewModel>> GetDetails(long id)
|
|
||||||
{
|
|
||||||
var loan = await _loanApplication.GetDetails(id);
|
|
||||||
return loan;
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost]
|
|
||||||
public ActionResult<OperationResult> Create([FromBody] CreateLoanViewModel command)
|
|
||||||
{
|
|
||||||
var result = _loanApplication.Create(command);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("create/installments")]
|
|
||||||
public ActionResult<List<LoanInstallmentViewModel>> CalculateLoanInstallment(string amount,
|
|
||||||
int installmentCount, string loanStartDate, bool getRounded)
|
|
||||||
{
|
|
||||||
var installments =
|
|
||||||
_loanApplication.CalculateLoanInstallment(amount, installmentCount, loanStartDate, getRounded);
|
|
||||||
return installments;
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpDelete("{id}")]
|
|
||||||
public ActionResult<OperationResult> Remove(long id)
|
|
||||||
{
|
|
||||||
var result = _loanApplication.Remove(id);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user