Compare commits

..

4 Commits

110 changed files with 1476 additions and 14928 deletions

3
.gitignore vendored
View File

@@ -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.*

View File

@@ -45,11 +45,6 @@ public enum TypeOfSmsSetting
/// </summary> /// </summary>
SendInstitutionContractConfirmationCode, SendInstitutionContractConfirmationCode,
/// <summary>
/// لینک تاییدیه ایجاد قرارداد مالی
/// </summary>
SendInstitutionContractConfirmationLink,
/// <summary> /// <summary>
/// یادآور وظایف /// یادآور وظایف
/// </summary> /// </summary>

View File

@@ -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
{ {

View File

@@ -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; }
} }

View File

@@ -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);

View File

@@ -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>
/// این تاریخ در جدول اکانت لفت ورک به این معنیست /// این تاریخ در جدول اکانت لفت ورک به این معنیست

View File

@@ -2,7 +2,6 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net10.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<NuGetAudit>false</NuGetAudit>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@@ -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();
} }
} }

View File

@@ -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;

View File

@@ -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; }
}

View File

@@ -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);
} }
} }

View File

@@ -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);
} }

View File

@@ -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);
} }
} }

View File

@@ -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);

View File

@@ -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
} }

View File

@@ -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)

View File

@@ -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
{
} }
} }

View File

@@ -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; }
} }

View File

@@ -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>

View File

@@ -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; }
}

View File

@@ -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; }
}

View File

@@ -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);
} }
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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; }
} }

View File

@@ -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; }
} }

View File

@@ -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; }
} }

View File

@@ -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; }

View File

@@ -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; }

View File

@@ -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; }
} }

View File

@@ -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; }
} }

View File

@@ -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; }
} }

View File

@@ -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; }
} }

View File

@@ -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; }
}

View File

@@ -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; }
} }

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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; }
} }

View File

@@ -104,5 +104,10 @@ namespace CompanyManagment.Application
Id = x.Id Id = x.Id
}).ToList(); }).ToList();
} }
public List<BankSelectList> GetBanksForSelectList()
{
return _bankRepository.GetBanksForSelectList();
}
} }
} }

View File

@@ -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();

View File

@@ -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>

View File

@@ -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
} }
} }

View File

@@ -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();
} }

View File

@@ -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,

View File

@@ -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;
}
} }

View File

@@ -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;
} }
} }

View File

@@ -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
} }

View File

@@ -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();

View File

@@ -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");
}
}
}

View File

@@ -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");

View File

@@ -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();
}
} }

View File

@@ -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,

View File

@@ -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;
}
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View File

@@ -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;
} }

View File

@@ -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;

View File

@@ -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);

View File

@@ -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)
{ {

View File

@@ -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

View File

@@ -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;
} }

View File

@@ -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)
{ {

View File

@@ -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
} }

View File

@@ -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);
} }

View File

@@ -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;

View File

@@ -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)
{ {

View File

@@ -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);

View File

@@ -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()

View File

@@ -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;

View File

@@ -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}");
}
}
}

View File

@@ -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;

View File

@@ -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);
} }
} }

View File

@@ -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; }

View File

@@ -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)

View File

@@ -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; }

View File

@@ -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;
}
} }

View File

@@ -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; }

View File

@@ -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; }
} }

View File

@@ -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 کردن نتیجه

View File

@@ -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; }

View File

@@ -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,

View File

@@ -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(

View File

@@ -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
};
}
}

View File

@@ -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()
{ {

View File

@@ -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);

View File

@@ -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));
} }

View File

@@ -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;
}
} }

View File

@@ -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"));

View File

@@ -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;
}
}

View File

@@ -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
} }

View File

@@ -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=""> &nbsp;<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=""> &nbsp;<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=""> &nbsp;<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=""> &nbsp;<span style="bottom: 2px;position: relative"> کارپوشه </span> </label>
<!-----------------------Sub Menu------------------->
</div>
</div> </div>

View File

@@ -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=""> &nbsp;<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=""> &nbsp;<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=""> &nbsp;<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=""> &nbsp;<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=""> &nbsp;<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=""> &nbsp;<span style="bottom: 2px;position: relative"> کارپوشه </span> </label>
<!-----------------------Sub Menu------------------->
</div>
</div> </div>

View File

@@ -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);

View File

@@ -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>

View File

@@ -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>

View File

@@ -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; }
}

View File

@@ -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