diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index 70b7740e..7157b669 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -55,6 +55,9 @@ public interface IInstitutionContractRepository : IRepository GetVerificationDetails(Guid id); Task GetByPublicIdAsync(Guid id); + InstitutionContractExtensionPaymentResponse CalculateDiscount(InstitutionContractSetDiscountRequest request); + InstitutionContractExtensionPaymentResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request); + #region Extension @@ -62,9 +65,12 @@ public interface IInstitutionContractRepository : IRepository GetExtensionWorkshops(InstitutionContractExtensionWorkshopsRequest request); Task GetExtensionInstitutionPlan(InstitutionContractExtensionPlanRequest request); Task GetExtensionPaymentMethod(InstitutionContractExtensionPaymentRequest request); + Task SetDiscountForExtension(InstitutionContractSetDiscountForExtensionRequest request); + Task ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request); + Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request); - #endregion + #endregion #region Upgrade(Amendment) @@ -147,4 +153,6 @@ public interface IInstitutionContractRepository : IRepository GetIdByInstallmentId(long installmentId); } \ No newline at end of file diff --git a/Company.Domain/InstitutionContractAgg/InstitutionContract.cs b/Company.Domain/InstitutionContractAgg/InstitutionContract.cs index ff2cfae7..0a1d084f 100644 --- a/Company.Domain/InstitutionContractAgg/InstitutionContract.cs +++ b/Company.Domain/InstitutionContractAgg/InstitutionContract.cs @@ -19,7 +19,7 @@ public class InstitutionContract : EntityBase string contractEndFa, double contractAmount, double dailyCompenseation, double obligation, double totalAmount, int extensionNo, string workshopManualCount, string employeeManualCount, string description, string officialCompany, string typeOfcontract, string hasValueAddedTax, double valueAddedTax, - List workshopDetails, long lawId) + List workshopDetails, long lawId,int discountPercentage, double discountAmount) { ContractNo = contractNo; RepresentativeId = representativeId; diff --git a/Company.Domain/InstitutionContractExtensionTempAgg/InstitutionContractExtensionTemp.cs b/Company.Domain/InstitutionContractExtensionTempAgg/InstitutionContractExtensionTemp.cs index 568ae4a5..9075e183 100644 --- a/Company.Domain/InstitutionContractExtensionTempAgg/InstitutionContractExtensionTemp.cs +++ b/Company.Domain/InstitutionContractExtensionTempAgg/InstitutionContractExtensionTemp.cs @@ -65,6 +65,7 @@ public class InstitutionContractExtensionTemp MonthlyPayment = monthly; OneTimePayment = oneTime; } + } diff --git a/CompanyManagment.App.Contracts/InstitutionContract/CreateInstitutionContractRequest.cs b/CompanyManagment.App.Contracts/InstitutionContract/CreateInstitutionContractRequest.cs index 3cebc401..fb4c9f08 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/CreateInstitutionContractRequest.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/CreateInstitutionContractRequest.cs @@ -102,6 +102,10 @@ public class CreateInstitutionContractRequest public double OneMonthAmount { get; set; } public long LawId { get; set; } + + public int DiscountPercentage { get; set; } + + public double DiscountAmount { get; set; } } /// /// مدت زمان قرارداد نهاد diff --git a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs index 6c6adfa1..1cb06890 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs @@ -215,7 +215,9 @@ public interface IInstitutionContractApplication Task> SendVerifyOtp(Guid id); Task> VerifyOtpAndMakeGateway(Guid publicId, string code, string callbackUrl); Task GetWorkshopInitialDetails(long workshopDetailsId); - + InstitutionContractExtensionPaymentResponse CalculateDiscount(InstitutionContractSetDiscountRequest request); + InstitutionContractExtensionPaymentResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request); + #region Extension Task GetExtensionInquiry(long previousContractId); @@ -228,6 +230,11 @@ public interface IInstitutionContractApplication Task GetExtensionPaymentMethod( InstitutionContractExtensionPaymentRequest request); + + Task SetDiscountForExtension( + InstitutionContractSetDiscountForExtensionRequest request); + Task> ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request); + Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request); Task> GetInstitutionContractSelectList(string search,string selected); @@ -257,6 +264,16 @@ public interface IInstitutionContractApplication Task GetContractWorkshopsDetails(long id); Task GetAmendmentVerificationDetails(Guid id, long amendmentId); + Task GetIdByInstallmentId(long installmentId); + +} + +public class InstitutionContractResetDiscountForCreateRequest +{ + public int Percentage { get; set; } + public double PaymentAmount { get; set; } + public bool IsInstallment { get; set; } + public InstitutionContractDuration Duration { get; set; } } public class GetInstitutionAmendmentVerificationDetailsViewModel @@ -274,6 +291,29 @@ public class GetInstitutionAmendmentVerificationDetailsViewModel public List Installments { get; set; } public bool IsInstallment { get; set; } + +} + +public class InstitutionContractSetDiscountForExtensionRequest +{ + public Guid TempId { get; set; } + public int DiscountPercentage { get; set; } + public double PaymentAmount { get; set; } + public bool IsInstallment { get; set; } +} +public class InstitutionContractResetDiscountForExtensionRequest +{ + public Guid TempId { get; set; } + public bool IsInstallment { get; set; } +} + + +public class InstitutionContractSetDiscountRequest +{ + public int DiscountPercentage { get; set; } + public double PaymentAmount { get; set; } + public InstitutionContractDuration Duration { get; set; } + public bool IsInstallment { get; set; } } public class InstitutionContractAmendmentCompleteRequest diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractPaymentOneTimeViewModel.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractPaymentOneTimeViewModel.cs index fcc28d47..2cee866e 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractPaymentOneTimeViewModel.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractPaymentOneTimeViewModel.cs @@ -17,6 +17,9 @@ public class InstitutionContractPaymentOneTimeViewModel /// مبلغ قابل پرداخت /// public string PaymentAmount { get; set; } + + public string DiscountedAmount { get; set; } + public int DiscountPercetage { get; set; } } public class InstitutionContractPaymentMonthlyViewModel:InstitutionContractPaymentOneTimeViewModel { diff --git a/CompanyManagment.Application/EmployerApplication.cs b/CompanyManagment.Application/EmployerApplication.cs index 8e7d6663..5270231a 100644 --- a/CompanyManagment.Application/EmployerApplication.cs +++ b/CompanyManagment.Application/EmployerApplication.cs @@ -1485,12 +1485,12 @@ public class EmployerApplication : IEmployerApplication return opration.Failed("نام شرکت وارد شده تکراری است"); } - if (_EmployerRepository.Exists(x => - x.RegisterId == command.RegisterId && !string.IsNullOrWhiteSpace(command.RegisterId) && - x.RegisterId != null)) - { - return opration.Failed(" شماره ثبت وارد شده تکراری است"); - } + // if (_EmployerRepository.Exists(x => + // x.RegisterId == command.RegisterId && !string.IsNullOrWhiteSpace(command.RegisterId) && + // x.RegisterId != null)) + // { + // return opration.Failed(" شماره ثبت وارد شده تکراری است"); + // } if (!string.IsNullOrEmpty(command.NationalId) && command.NationalId.Length != 11) { diff --git a/CompanyManagment.Application/InstitutionContractApplication.cs b/CompanyManagment.Application/InstitutionContractApplication.cs index c67c3270..2911685e 100644 --- a/CompanyManagment.Application/InstitutionContractApplication.cs +++ b/CompanyManagment.Application/InstitutionContractApplication.cs @@ -42,53 +42,54 @@ namespace CompanyManagment.Application; public class InstitutionContractApplication : IInstitutionContractApplication { - private readonly IInstitutionContractRepository _institutionContractRepository; - private readonly IPersonalContractingPartyRepository _contractingPartyRepository; - private readonly IRepresentativeRepository _representativeRepository; - private readonly IFinancialStatmentApplication _financialStatmentApplication; - private readonly IEmployerRepository _employerRepository; - private readonly IWorkshopRepository _workshopRepository; - private readonly ILeftWorkRepository _leftWorkRepository; - private readonly IWorkshopApplication _workshopApplication; - private readonly IContractingPartyTempRepository _contractingPartyTempRepository; - private readonly IFinancialStatmentRepository _financialStatmentRepository; - private readonly IContactInfoApplication _contactInfoApplication; - private readonly IAccountApplication _accountApplication; - private readonly ISmsService _smsService; - private readonly IUidService _uidService; - private readonly IFinancialInvoiceRepository _financialInvoiceRepository; - private readonly IPaymentGateway _paymentGateway; - private readonly IPaymentTransactionRepository _paymentTransactionRepository; + private readonly IInstitutionContractRepository _institutionContractRepository; + private readonly IPersonalContractingPartyRepository _contractingPartyRepository; + private readonly IRepresentativeRepository _representativeRepository; + private readonly IFinancialStatmentApplication _financialStatmentApplication; + private readonly IEmployerRepository _employerRepository; + private readonly IWorkshopRepository _workshopRepository; + private readonly ILeftWorkRepository _leftWorkRepository; + private readonly IWorkshopApplication _workshopApplication; + private readonly IContractingPartyTempRepository _contractingPartyTempRepository; + private readonly IFinancialStatmentRepository _financialStatmentRepository; + private readonly IContactInfoApplication _contactInfoApplication; + private readonly IAccountApplication _accountApplication; + private readonly ISmsService _smsService; + private readonly IUidService _uidService; + private readonly IFinancialInvoiceRepository _financialInvoiceRepository; + private readonly IPaymentGateway _paymentGateway; + private readonly IPaymentTransactionRepository _paymentTransactionRepository; - public InstitutionContractApplication(IInstitutionContractRepository institutionContractRepository, - IPersonalContractingPartyRepository contractingPartyRepository, - IRepresentativeRepository representativeRepository, IEmployerRepository employerRepository, - IWorkshopRepository workshopRepository, ILeftWorkRepository leftWorkRepository, - IFinancialStatmentApplication financialStatmentApplication, IWorkshopApplication workshopApplication, - IContractingPartyTempRepository contractingPartyTempRepository, - IFinancialStatmentRepository financialStatmentRepository, IContactInfoApplication contactInfoApplication, - IAccountApplication accountApplication, ISmsService smsService, IUidService uidService, - IFinancialInvoiceRepository financialInvoiceRepository, IHttpClientFactory httpClientFactory, IPaymentTransactionRepository paymentTransactionRepository) - { - _institutionContractRepository = institutionContractRepository; - _contractingPartyRepository = contractingPartyRepository; - _representativeRepository = representativeRepository; - _employerRepository = employerRepository; - _workshopRepository = workshopRepository; - _leftWorkRepository = leftWorkRepository; - _financialStatmentApplication = financialStatmentApplication; - _workshopApplication = workshopApplication; - _contractingPartyTempRepository = contractingPartyTempRepository; - _financialStatmentRepository = financialStatmentRepository; - _contactInfoApplication = contactInfoApplication; - _accountApplication = accountApplication; - _smsService = smsService; - _uidService = uidService; - _financialInvoiceRepository = financialInvoiceRepository; - _paymentTransactionRepository = paymentTransactionRepository; - _paymentGateway = new SepehrPaymentGateway(httpClientFactory); - } + public InstitutionContractApplication(IInstitutionContractRepository institutionContractRepository, + IPersonalContractingPartyRepository contractingPartyRepository, + IRepresentativeRepository representativeRepository, IEmployerRepository employerRepository, + IWorkshopRepository workshopRepository, ILeftWorkRepository leftWorkRepository, + IFinancialStatmentApplication financialStatmentApplication, IWorkshopApplication workshopApplication, + IContractingPartyTempRepository contractingPartyTempRepository, + IFinancialStatmentRepository financialStatmentRepository, IContactInfoApplication contactInfoApplication, + IAccountApplication accountApplication, ISmsService smsService, IUidService uidService, + IFinancialInvoiceRepository financialInvoiceRepository, IHttpClientFactory httpClientFactory, + IPaymentTransactionRepository paymentTransactionRepository) + { + _institutionContractRepository = institutionContractRepository; + _contractingPartyRepository = contractingPartyRepository; + _representativeRepository = representativeRepository; + _employerRepository = employerRepository; + _workshopRepository = workshopRepository; + _leftWorkRepository = leftWorkRepository; + _financialStatmentApplication = financialStatmentApplication; + _workshopApplication = workshopApplication; + _contractingPartyTempRepository = contractingPartyTempRepository; + _financialStatmentRepository = financialStatmentRepository; + _contactInfoApplication = contactInfoApplication; + _accountApplication = accountApplication; + _smsService = smsService; + _uidService = uidService; + _financialInvoiceRepository = financialInvoiceRepository; + _paymentTransactionRepository = paymentTransactionRepository; + _paymentGateway = new SepehrPaymentGateway(httpClientFactory); + } public OperationResult Create(CreateInstitutionContract command) { @@ -222,7 +223,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication command.ContractStartFa, contractEndGr, command.ContractEndFa, command.ContractAmount, command.DailyCompenseation, command.Obligation, command.TotalAmount, 0, command.WorkshopManualCount, command.EmployeeManualCount, command.Description, - command.OfficialCompany, command.TypeOfContract, command.HasValueAddedTax, command.ValueAddedTax, [], command.LawId); + command.OfficialCompany, command.TypeOfContract, command.HasValueAddedTax, command.ValueAddedTax, [], command.LawId,0,0); _institutionContractRepository.Create(createContract); _institutionContractRepository.SaveChanges(); @@ -331,7 +332,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication command.DailyCompenseation, command.Obligation, command.TotalAmount, command.ExtensionNo, command.WorkshopManualCount, command.EmployeeManualCount, command.Description, command.OfficialCompany, command.TypeOfContract, command.HasValueAddedTax, - command.ValueAddedTax, [], command.LawId); + command.ValueAddedTax, [], command.LawId,0,0); _institutionContractRepository.Create(createContract); _institutionContractRepository.SaveChanges(); @@ -340,642 +341,641 @@ public class InstitutionContractApplication : IInstitutionContractApplication return opration.Succcedded(createContract.id); } - public OperationResult Edit(EditInstitutionContract command) - { - bool dateMessages = false; - string dateMaessageResult = String.Empty; - var opration = new OperationResult(); - var ContractEdit = _institutionContractRepository.Get(command.Id); - if (ContractEdit == null) - opration.Failed("رکورد مورد نظر وجود ندارد"); - - var contractStartGr = command.ContractStartFa.ToGeorgianDateTime(); - var contractEndGr = command.ContractEndFa.ToGeorgianDateTime(); - - var contractDateGr = command.ContractDateFa.ToGeorgianDateTime(); - - if (_institutionContractRepository.Exists(x => - x.ContractingPartyId == ContractEdit.ContractingPartyId && - ((contractStartGr >= x.ContractStartGr && contractStartGr <= x.ContractEndGr) || - (contractEndGr >= x.ContractStartGr && contractEndGr <= x.ContractEndGr)) && x.id != command.Id && - x.TypeOfContract == command.TypeOfContract)) - return opration.Failed("در بازه تاریخ وارد شده قرارداد دیگری وجود دارد"); - //if (_institutionContractRepository.Exists(x => - // x.ContractingPartyId == ContractEdit.ContractingPartyId && (x.ContractStartGr <= contractDateGr || x.ContractDateGr <= contractDateGr) && x.id != command.Id)) - // return opration.Failed("تاریخ عقد قرارداد با قرارداد دیگری تداخل دارد"); - if (string.IsNullOrWhiteSpace(command.ContractDateFa)) - { - dateMaessageResult = "تاریخ قراراداد اجباری است. "; - dateMessages = true; - } - - if (string.IsNullOrWhiteSpace(command.ContractStartFa)) - { - dateMaessageResult += "تاریخ شروع قراراداد اجباری است. "; - dateMessages = true; - } - - if (string.IsNullOrWhiteSpace(command.ContractEndFa)) - { - dateMaessageResult += "تاریخ پایان قراراداد اجباری است. "; - dateMessages = true; - } - - if (dateMessages) - return opration.Failed(dateMaessageResult); - if (command.Address != null && command.State == null) - { - return opration.Failed("لطفا استان و شهر را انتخاب کنید"); - } - - if ((command.Address != null && command.State != null) && command.City == "شهرستان") - { - return opration.Failed("لطفا شهر را انتخاب کنید"); - } - - if (command.Address == null && command.State != null) - { - return opration.Failed("لطفا آدرس را وارد کنید"); - } - - if (string.IsNullOrWhiteSpace(command.OfficialCompany)) - return opration.Failed("رسمی یا غیر رسمی بودن پرداخت را مشخص کنید"); - if (command.OfficialCompany == "Official" && string.IsNullOrWhiteSpace(command.HasValueAddedTax)) - return opration.Failed("وضعیت ارزش افزوده را مشخص کنید"); - if (string.IsNullOrWhiteSpace(command.TypeOfContract)) - return opration.Failed("عنوان قرارداد را انتخاب کنید"); - - if (string.IsNullOrWhiteSpace(command.ContractAmountString)) - command.ContractAmountString = "0"; - if (string.IsNullOrWhiteSpace(command.DailyCompenseationString)) - command.DailyCompenseationString = "0"; - if (string.IsNullOrWhiteSpace(command.ObligationString)) - command.ObligationString = "0"; - if (string.IsNullOrWhiteSpace(command.TotalAmountString)) - command.TotalAmountString = "0"; - - command.ValueAddedTax = command.ValueAddedTaxStr.MoneyToDouble(); - var contractAmount = command.ContractAmountString.ToDoubleMoney(); - command.ContractAmount = Convert.ToDouble(contractAmount); - var DailyCompenseation = command.DailyCompenseationString.ToDoubleMoney(); - command.DailyCompenseation = Convert.ToDouble(DailyCompenseation); - var Obligation = command.ObligationString.ToDoubleMoney(); - command.Obligation = Convert.ToDouble(Obligation); - var TotalAmount = command.TotalAmountString.ToDoubleMoney(); - command.TotalAmount = Convert.ToDouble(TotalAmount); - - ContractEdit.Edit(contractDateGr, command.ContractDateFa, command.State, command.City, command.Address, - contractStartGr, - command.ContractStartFa, contractEndGr, command.ContractEndFa, command.ContractAmount, - command.DailyCompenseation, - command.Obligation, command.TotalAmount, command.WorkshopManualCount, command.EmployeeManualCount, - command.Description, command.OfficialCompany, command.TypeOfContract, command.ValueAddedTax, - command.HasValueAddedTax); - _institutionContractRepository.SaveChanges(); - return opration.Succcedded(command.Id); - } - - public EditInstitutionContract GetDetails(long id) - { - return _institutionContractRepository.GetDetails(id); - } - - public List Search(InstitutionContractSearchModel searchModel) - { - var query = _institutionContractRepository.Search(searchModel); - var join = new List(); - - var now = DateTime.Now; - var nowFa = now.ToFarsi(); - - var endFa = nowFa.FindeEndOfMonth(); - var endThisMontGr = endFa.ToGeorgianDateTime(); - //var watch = System.Diagnostics.Stopwatch.StartNew(); - - - var newResult = query.Select(x => new InstitutionContractViewModel - { - Id = x.Id, - ContractNo = x.ContractNo, - ContractStartGr = x.ContractStartGr, - ContractStartFa = x.ContractStartFa, - ContractEndGr = x.ContractEndGr, - ContractEndFa = x.ContractEndFa, - //RepresentativeId = x.RepresentativeId, - RepresentativeName = x.RepresentativeName, - //ContractingPartyName = _contractingPartyRepository.GetDetails(x.ContractingPartyId).LName, - //IsContractingPartyBlock = _contractingPartyRepository.GetDetails(x.ContractingPartyId).IsBlock, - //BlockTimes = _contractingPartyRepository.GetDetails(x.ContractingPartyId).BlockTimes, - ContractingPartyId = x.ContractingPartyId, - EmployerViewModels = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId), - EmployerNo = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId) - .FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.EmployerNo, - EmployerName = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId) - .FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.FullName, - //EmployerId = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId).FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.Id == null ? 0 : - // _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId).FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)!.Id, - ContractAmount = x.ContractAmount, - TotalAmount = x.TotalAmount, - SearchAmount = x.SearchAmount, - IsActiveString = x.IsActiveString, - OfficialCompany = x.OfficialCompany, - Signature = x.Signature, - ExpireColor = ExpCheckColor(now, x.ContractEndGr, endThisMontGr, x.ContractAmount, x.IsActiveString), - BalanceDouble = TotalBalance(x.ContractingPartyId).TotalBalanceDbl, - BalanceStr = TotalBalance(x.ContractingPartyId).TotalBalanceStr, - //WorkshopViewModels = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).WorkshopViewModels, - //WorkshopCount = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).WorkshopCount, - //EmployeeCount = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).EmployeeCount, - //ArchiveCode = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).ArchiveCode, - TypeOfContract = x.TypeOfContract - }).ToList(); - //Console.WriteLine("efTime : " + watch.Elapsed); - - //var watchw = System.Diagnostics.Stopwatch.StartNew(); - foreach (var item in newResult) - { - //string totalBalanceStr = "0"; - //double totalBalance = 0; - //var firstGetStatement = _financialStatmentApplication.GetDetailsByContractingPartyId(item.ContractingPartyId); - //var allTransactions = firstGetStatement.FinancialTransactionViewModels; - //if (allTransactions != null) - //{ - // allTransactions = allTransactions.OrderBy(x => x.TdateGr).ToList(); - // var debt = allTransactions.Sum(x => x.Deptor); - // var credit = allTransactions.Sum(x => x.Creditor); - // totalBalance = debt - credit; - // totalBalanceStr = totalBalance.ToMoney(); - //} - var contractingParty = _contractingPartyRepository.GetDetails(item.ContractingPartyId); - if (contractingParty != null) - { - item.ContractingPartyName = contractingParty.LName; - item.IsContractingPartyBlock = contractingParty.IsBlock; - item.BlockTimes = contractingParty.BlockTimes; - } - - - var employer = _employerRepository.GetEmployerByContracrtingPartyID(item.ContractingPartyId); - item.EmployerViewModels = employer; - item.EmployerName = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.FullName; - var id = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.Id; - item.EmployerNo = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.EmployerNo; - if (id != null) item.EmployerId = (long)id; - - var emplId = item.EmployerViewModels.Select(x => x.Id).ToList(); - - item.WorkshopViewModels = _workshopRepository.GetWorkshopsByEmployerId(emplId); - var workshopIds = item.WorkshopViewModels.Select(x => x.Id).ToList(); - var left = 0; - item.WorkshopCount = Convert.ToString(item.WorkshopViewModels.Count); - //var joinPersonelList = new List(); - int pCount = 0; - foreach (var workshopId in workshopIds) - { - //var reslt = _workshopApplication.GetConnectedPersonnels(workshopId); - //var noBlock = reslt.Where(x => x.Black == false).ToList(); - //joinPersonelList.AddRange(noBlock); - var p = _workshopApplication.PersonnelCount(workshopId); - pCount += p; - } - //var joinlistWithoutDuplicat = joinPersonelList.GroupBy(x => x.PersonName).Select(x => x.First()).ToList(); - //left = joinlistWithoutDuplicat.Count(); - // var left= _leftWorkRepository.GetLeftPersonelByWorkshopId(workshopIds).Count(); - - item.EmployeeCount = Convert.ToString(pCount); - //if (item.ContractEndGr < now) - // item.ExpireColor = "black"; - //if (item.ContractEndGr >= now && item.ContractEndGr <= endThisMontGr) - // item.ExpireColor = "red"; - //if (item.ContractAmount == "0") - // item.ExpireColor = "purple"; - int archiveCode = 0; - if (item.WorkshopViewModels.Count > 0) - { - var workshop = item.WorkshopViewModels.OrderBy(x => x.Id)?.ToList(); - - var arc = workshop.Select(x => new ArchiveCodConvertoint - { - ArchiveCodeInt = x.ArchiveCode.Substring(0, 1) == "b" ? 10000000 : x.ArchiveCode.ConvertToInt(), - }).OrderBy(x => x.ArchiveCodeInt).ToList(); - var minArchiveCode = arc.Min(x => x.ArchiveCodeInt); - archiveCode = minArchiveCode == 10000000 ? 0 : minArchiveCode; - } - - var result = new InstitutionContractViewModel() - { - Id = item.Id, - ContractNo = item.ContractNo, - ContractStartGr = item.ContractStartGr, - ContractStartFa = item.ContractStartFa, - ContractEndGr = item.ContractEndGr, - ContractEndFa = item.ContractEndFa, - RepresentativeName = item.RepresentativeName, - ContractingPartyName = item.ContractingPartyName, - ContractingPartyId = item.ContractingPartyId, - EmployerNo = item.EmployerNo, - ContractAmount = item.ContractAmount, - EmployerName = item.EmployerName, - EmployerViewModels = item.EmployerViewModels, - IsActiveString = item.IsActiveString, - WorkshopCount = item.WorkshopCount, - WorkshopViewModels = item.WorkshopViewModels, - EmployeeCount = item.EmployeeCount, - ExpireColor = item.ExpireColor, - SearchAmount = item.SearchAmount, - BalanceDouble = item.BalanceDouble, - BalanceStr = item.BalanceStr, - Signature = item.Signature, - ArchiveCode = archiveCode, - TypeOfContract = item.TypeOfContract, - IsContractingPartyBlock = item.IsContractingPartyBlock, - BlockTimes = item.BlockTimes, - }; - join.Add(result); - } - - //Console.WriteLine("forEchTime : " + watchw.Elapsed); - var findeByFilter = new List(); - if (searchModel.WorkshopId != 0) - { - foreach (var item in join) - { - var check = item.WorkshopViewModels.Where(x => x.Id == searchModel.WorkshopId).ToList(); - if (check.Count > 0) - findeByFilter.Add(item); - } - - join = findeByFilter; - } - - var findeByFilter2 = new List(); - if (searchModel.EmployerId != 0) - { - foreach (var item in join) - { - var check = item.EmployerViewModels.Where(x => x.Id == searchModel.EmployerId).ToList(); - if (check.Count > 0) - findeByFilter2.Add(item); - } - - join = findeByFilter2; - } - - - join = join.OrderBy(x => x.WorkshopCount != "0" && string.IsNullOrWhiteSpace(x.ExpireColor)) - .ThenBy(x => x.WorkshopCount == "0" && string.IsNullOrWhiteSpace(x.ExpireColor)) - .ThenBy(x => x.ExpireColor == "red") - .ThenBy(x => x.ExpireColor == "purple") - .ThenBy(x => x.ExpireColor == "black").ToList(); - - return join; - } - - public List NewSearch(InstitutionContractSearchModel searchModel) - { - return _institutionContractRepository.NewSearch(searchModel); - } - - - public List GetInstitutionContractToSetServicesExcelImport() - { - var result = _institutionContractRepository.NewSearch(new InstitutionContractSearchModel()); - - return result.Where(x => - x.IsActiveString == "true" && x.IsContractingPartyBlock != "true" && x.WorkshopCount != "0" && - x.ContractStartGr <= DateTime.Now && x.ContractEndGr >= DateTime.Now).ToList(); - } - - public string ExpCheckColor(DateTime now, DateTime ContractEndGr, DateTime endThisMontGr, string ContractAmount, - string isActiveString) - { - string result = ""; - - if (ContractEndGr < now) - result = "black"; - if (ContractEndGr >= now && ContractEndGr <= endThisMontGr) - result = "red"; - if (ContractAmount == "0") - result = "purple"; - if (isActiveString == "blue") - result = "blue"; - return result; - } - - public TotalbalancViewModel TotalBalance(long contractingPartyId) - { - var result = new TotalbalancViewModel(); - - var firstGetStatement = _financialStatmentApplication.GetDetailsByContractingPartyId(contractingPartyId); - var allTransactions = firstGetStatement.FinancialTransactionViewModels; - if (allTransactions != null) - { - allTransactions = allTransactions.OrderBy(x => x.TdateGr).ToList(); - var debt = allTransactions.Sum(x => x.Deptor); - var credit = allTransactions.Sum(x => x.Creditor); - result.TotalBalanceDbl = debt - credit; - result.TotalBalanceStr = result.TotalBalanceDbl.ToMoney(); - } - - return result; - } - - public WorkshopsAndEmployeeViewModel WorkShopDetailsAndEmployeeCount(long contractingPartyId) - { - var result = new WorkshopsAndEmployeeViewModel(); - - var emplId = _employerRepository.GetEmployerByContracrtingPartyID(contractingPartyId).Select(x => x.Id) - .ToList(); - ; - result.WorkshopViewModels = _workshopRepository.GetWorkshopsByEmployerId(emplId); - var workshopIds = result.WorkshopViewModels.Select(x => x.Id).ToList(); - var left = 0; - result.WorkshopCount = Convert.ToString(workshopIds.Count); - var joinPersonelList = new List(); - foreach (var workshopId in workshopIds) - { - //var reslt = _workshopApplication.GetConnectedPersonnels(workshopId); - //var noBlock = reslt.Where(x => x.Black == false).ToList(); - //joinPersonelList.AddRange(noBlock); - var pCount = _workshopApplication.PersonnelCount(workshopId); - result.EmployeeCount = Convert.ToString(pCount); - } - //var joinlistWithoutDuplicat = joinPersonelList.GroupBy(x => x.PersonName).Select(x => x.First()).ToList(); - //left = joinlistWithoutDuplicat.Count(); - //result.EmployeeCount = Convert.ToString(left); - - - result.ArchiveCode = 0; - if (workshopIds.Count > 0) - { - var workshop = result.WorkshopViewModels.OrderBy(x => x.Id)?.ToList(); - - var arc = workshop.Select(x => new ArchiveCodConvertoint - { - ArchiveCodeInt = x.ArchiveCode.Substring(0, 1) == "b" ? 10000000 : x.ArchiveCode.ConvertToInt(), - }).OrderBy(x => x.ArchiveCodeInt).ToList(); - var minArchiveCode = arc.Min(x => x.ArchiveCodeInt); - result.ArchiveCode = minArchiveCode == 10000000 ? 0 : minArchiveCode; - } - - return result; - } - - public List PrintAll(List id) - { - throw new NotImplementedException(); - } - - public InstitutionContractViewModel PrintOne(long id) - { - var get = _institutionContractRepository.GetDetails(id); - var employer = _employerRepository.GetEmployerByContracrtingPartyID(get.ContractingPartyId); - var employerViewModels = employer; - var emplId = employerViewModels.Select(x => x.Id).ToList(); - var workshops = _workshopRepository.GetWorkshopsByEmployerId(emplId); - var res = new InstitutionContractViewModel() - { - Id = get.Id, - ContractNo = get.ContractNo, - - ContractStartFa = get.ContractStartFa, - - ContractEndFa = get.ContractEndFa, - - ContractingPartyName = get.ContractingPartyName, - - ContractingPartyId = get.ContractingPartyId, - ContractDateFa = get.ContractDateFa, - State = get.State, - City = get.City, - Address = get.Address, - Description = get.Description, - HasValueAddedTax = get.HasValueAddedTax, - ValueAddedTax = get.ValueAddedTax, - ContractAmount = get.ContractAmountString, - DailyCompenseation = get.DailyCompenseationString, - Obligation = get.ObligationString, - TotalAmount = get.TotalAmountString, - WorkshopViewModels = workshops - }; - return res; - } - - - public OperationResult Active(long id) - { - var opration = new OperationResult(); - var contract = _institutionContractRepository.Get(id); - if (contract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - contract.Active(); - - _institutionContractRepository.SaveChanges(); - return opration.Succcedded(); - } - - public OperationResult DeActive(long id) - { - var opration = new OperationResult(); - var contract = _institutionContractRepository.Get(id); - if (contract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - contract.DeActive(); - - - _institutionContractRepository.SaveChanges(); - return opration.Succcedded(); - } - - public OperationResult DeActiveBlue(long id) - { - var opration = new OperationResult(); - var institutionContract = _institutionContractRepository.Get(id); - if (institutionContract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - institutionContract.DeActiveBlue(); - _institutionContractRepository.SaveChanges(); - - return opration.Succcedded(); - } - - public OperationResult DeActiveAllConnections(long id) - { - var opration = new OperationResult(); - var institutionContract = _institutionContractRepository.Get(id); - if (institutionContract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - - var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId); - if (contractingParty != null) - { - contractingParty.DeActive(); - _contractingPartyRepository.SaveChanges(); - var employers = - _employerRepository.GetEmployerByContracrtingPartyID(institutionContract.ContractingPartyId); - //var employersIdList = employers.Select(x => x.Id).ToList(); - //var workshops = _workshopApplication.GetWorkshopsByEmployerId(employersIdList); - //foreach (var workshop in workshops) - //{ - // var res = _workshopApplication.DeActive(workshop.Id); - //} - foreach (var employer in employers) - { - var res = _employerRepository.DeActiveAll(employer.Id); - } - } - - return opration.Succcedded(); - } - - public OperationResult ReActiveAllConnections(long id) - { - var opration = new OperationResult(); - var institutionContract = _institutionContractRepository.Get(id); - if (institutionContract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - - var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId); - if (contractingParty != null) - { - contractingParty.Active(); - _contractingPartyRepository.SaveChanges(); - var employers = - _employerRepository.GetEmployerByContracrtingPartyID(institutionContract.ContractingPartyId); - //var employersIdList = employers.Select(x => x.Id).ToList(); - //var workshops = _workshopApplication.GetWorkshopsByEmployerId(employersIdList); - //foreach (var workshop in workshops) - //{ - // var res = _workshopApplication.DeActive(workshop.Id); - //} - foreach (var employer in employers) - { - var res = _employerRepository.ActiveAll(employer.Id); - } - } - - return opration.Succcedded(); - } - - public void ReActiveAllAfterCreateNew(long contractingPartyId) - { - var contractingParty = _contractingPartyRepository.Get(contractingPartyId); - if (contractingParty != null) - { - if (contractingParty.IsActiveString == "false") - { - contractingParty.Active(); - _contractingPartyRepository.SaveChanges(); - } - - var employers = - _employerRepository.GetEmployerByContracrtingPartyID(contractingPartyId); - - foreach (var employer in employers) - { - var res = _employerRepository.ActiveAll(employer.Id); - } - } - } - - - public void RemoveContract(long id) - { - _institutionContractRepository.RemoveContract(id); - } - - - public OperationResult Sign(long id) - { - var opration = new OperationResult(); - var contract = _institutionContractRepository.Get(id); - if (contract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - contract.Sign(); - - - _institutionContractRepository.SaveChanges(); - opration.IsSuccedded = true; - return opration.Succcedded(); - } - - public OperationResult UnSign(long id) - { - var opration = new OperationResult(); - var contract = _institutionContractRepository.Get(id); - if (contract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - contract.UnSign(); - - - _institutionContractRepository.SaveChanges(); - opration.IsSuccedded = true; - return opration.Succcedded(); - } - - public void CreateContractingPartyAccount(long contractingPartyid, long accountId) - { - _institutionContractRepository.CreateContractingPartyAccount(contractingPartyid, accountId); - } - - public double GetcontractAmount(int countPerson) - { - return _institutionContractRepository.GetcontractAmount(countPerson); - } - - public async Task> GetList( - InstitutionContractListSearchModel searchModel) - { - return await _institutionContractRepository.GetList(searchModel); - } - - public Task GetListStats(InstitutionContractListSearchModel searchModel) - { - return _institutionContractRepository.GetListStats(searchModel); - } - - public async Task CreateAsync(CreateInstitutionContractRequest command) - { - - var opration = new OperationResult(); - var syear = command.ContractStartFa.Substring(0, 4); - var smonth = command.ContractStartFa.Substring(5, 2); - var sday = command.ContractStartFa.Substring(8, 2); - - var transaction = await _contractingPartyRepository.BeginTransactionAsync(); - - if (command.ContractStartFa.TryToGeorgianDateTime(out var contractStartGr) == false) - return opration.Failed("تاریخ شروع قرارداد معتبر نیست"); - - contractStartGr.AddMonthsFa((int)command.Duration, out var contractEndGr); - - contractEndGr = contractEndGr.ToFarsi().FindeEndOfMonth().ToGeorgianDateTime(); - - PersonalContractingParty existingContractingParty = null; - if (command.ContractingPartyLegalType == LegalType.Legal) - { - existingContractingParty = - await _contractingPartyRepository.GetByNationalId(command.LegalParty.NationalId); - if (_contractingPartyRepository.Exists(x => - x.LName == command.LegalParty.CompanyName && x.RegisterId == command.LegalParty.RegisterId)) - { - if (_institutionContractRepository.Exists(x => x.ContractStartGr < contractEndGr - && contractStartGr < x.ContractEndGr - && x.ContractingPartyId == existingContractingParty.id - && x.IsActiveString == "true")) - { - throw new BadRequestException("امکان ایجاد قرارداد تکراری وجود ندارد"); - } - } - - if (!command.LegalParty.IsAuth) + public OperationResult Edit(EditInstitutionContract command) + { + bool dateMessages = false; + string dateMaessageResult = String.Empty; + var opration = new OperationResult(); + var ContractEdit = _institutionContractRepository.Get(command.Id); + if (ContractEdit == null) + opration.Failed("رکورد مورد نظر وجود ندارد"); + + var contractStartGr = command.ContractStartFa.ToGeorgianDateTime(); + var contractEndGr = command.ContractEndFa.ToGeorgianDateTime(); + + var contractDateGr = command.ContractDateFa.ToGeorgianDateTime(); + + if (_institutionContractRepository.Exists(x => + x.ContractingPartyId == ContractEdit.ContractingPartyId && + ((contractStartGr >= x.ContractStartGr && contractStartGr <= x.ContractEndGr) || + (contractEndGr >= x.ContractStartGr && contractEndGr <= x.ContractEndGr)) && x.id != command.Id && + x.TypeOfContract == command.TypeOfContract)) + return opration.Failed("در بازه تاریخ وارد شده قرارداد دیگری وجود دارد"); + //if (_institutionContractRepository.Exists(x => + // x.ContractingPartyId == ContractEdit.ContractingPartyId && (x.ContractStartGr <= contractDateGr || x.ContractDateGr <= contractDateGr) && x.id != command.Id)) + // return opration.Failed("تاریخ عقد قرارداد با قرارداد دیگری تداخل دارد"); + if (string.IsNullOrWhiteSpace(command.ContractDateFa)) + { + dateMaessageResult = "تاریخ قراراداد اجباری است. "; + dateMessages = true; + } + + if (string.IsNullOrWhiteSpace(command.ContractStartFa)) + { + dateMaessageResult += "تاریخ شروع قراراداد اجباری است. "; + dateMessages = true; + } + + if (string.IsNullOrWhiteSpace(command.ContractEndFa)) + { + dateMaessageResult += "تاریخ پایان قراراداد اجباری است. "; + dateMessages = true; + } + + if (dateMessages) + return opration.Failed(dateMaessageResult); + if (command.Address != null && command.State == null) + { + return opration.Failed("لطفا استان و شهر را انتخاب کنید"); + } + + if ((command.Address != null && command.State != null) && command.City == "شهرستان") + { + return opration.Failed("لطفا شهر را انتخاب کنید"); + } + + if (command.Address == null && command.State != null) + { + return opration.Failed("لطفا آدرس را وارد کنید"); + } + + if (string.IsNullOrWhiteSpace(command.OfficialCompany)) + return opration.Failed("رسمی یا غیر رسمی بودن پرداخت را مشخص کنید"); + if (command.OfficialCompany == "Official" && string.IsNullOrWhiteSpace(command.HasValueAddedTax)) + return opration.Failed("وضعیت ارزش افزوده را مشخص کنید"); + if (string.IsNullOrWhiteSpace(command.TypeOfContract)) + return opration.Failed("عنوان قرارداد را انتخاب کنید"); + + if (string.IsNullOrWhiteSpace(command.ContractAmountString)) + command.ContractAmountString = "0"; + if (string.IsNullOrWhiteSpace(command.DailyCompenseationString)) + command.DailyCompenseationString = "0"; + if (string.IsNullOrWhiteSpace(command.ObligationString)) + command.ObligationString = "0"; + if (string.IsNullOrWhiteSpace(command.TotalAmountString)) + command.TotalAmountString = "0"; + + command.ValueAddedTax = command.ValueAddedTaxStr.MoneyToDouble(); + var contractAmount = command.ContractAmountString.ToDoubleMoney(); + command.ContractAmount = Convert.ToDouble(contractAmount); + var DailyCompenseation = command.DailyCompenseationString.ToDoubleMoney(); + command.DailyCompenseation = Convert.ToDouble(DailyCompenseation); + var Obligation = command.ObligationString.ToDoubleMoney(); + command.Obligation = Convert.ToDouble(Obligation); + var TotalAmount = command.TotalAmountString.ToDoubleMoney(); + command.TotalAmount = Convert.ToDouble(TotalAmount); + + ContractEdit.Edit(contractDateGr, command.ContractDateFa, command.State, command.City, command.Address, + contractStartGr, + command.ContractStartFa, contractEndGr, command.ContractEndFa, command.ContractAmount, + command.DailyCompenseation, + command.Obligation, command.TotalAmount, command.WorkshopManualCount, command.EmployeeManualCount, + command.Description, command.OfficialCompany, command.TypeOfContract, command.ValueAddedTax, + command.HasValueAddedTax); + _institutionContractRepository.SaveChanges(); + return opration.Succcedded(command.Id); + } + + public EditInstitutionContract GetDetails(long id) + { + return _institutionContractRepository.GetDetails(id); + } + + public List Search(InstitutionContractSearchModel searchModel) + { + var query = _institutionContractRepository.Search(searchModel); + var join = new List(); + + var now = DateTime.Now; + var nowFa = now.ToFarsi(); + + var endFa = nowFa.FindeEndOfMonth(); + var endThisMontGr = endFa.ToGeorgianDateTime(); + //var watch = System.Diagnostics.Stopwatch.StartNew(); + + + var newResult = query.Select(x => new InstitutionContractViewModel + { + Id = x.Id, + ContractNo = x.ContractNo, + ContractStartGr = x.ContractStartGr, + ContractStartFa = x.ContractStartFa, + ContractEndGr = x.ContractEndGr, + ContractEndFa = x.ContractEndFa, + //RepresentativeId = x.RepresentativeId, + RepresentativeName = x.RepresentativeName, + //ContractingPartyName = _contractingPartyRepository.GetDetails(x.ContractingPartyId).LName, + //IsContractingPartyBlock = _contractingPartyRepository.GetDetails(x.ContractingPartyId).IsBlock, + //BlockTimes = _contractingPartyRepository.GetDetails(x.ContractingPartyId).BlockTimes, + ContractingPartyId = x.ContractingPartyId, + EmployerViewModels = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId), + EmployerNo = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId) + .FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.EmployerNo, + EmployerName = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId) + .FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.FullName, + //EmployerId = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId).FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.Id == null ? 0 : + // _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId).FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)!.Id, + ContractAmount = x.ContractAmount, + TotalAmount = x.TotalAmount, + SearchAmount = x.SearchAmount, + IsActiveString = x.IsActiveString, + OfficialCompany = x.OfficialCompany, + Signature = x.Signature, + ExpireColor = ExpCheckColor(now, x.ContractEndGr, endThisMontGr, x.ContractAmount, x.IsActiveString), + BalanceDouble = TotalBalance(x.ContractingPartyId).TotalBalanceDbl, + BalanceStr = TotalBalance(x.ContractingPartyId).TotalBalanceStr, + //WorkshopViewModels = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).WorkshopViewModels, + //WorkshopCount = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).WorkshopCount, + //EmployeeCount = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).EmployeeCount, + //ArchiveCode = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).ArchiveCode, + TypeOfContract = x.TypeOfContract + }).ToList(); + //Console.WriteLine("efTime : " + watch.Elapsed); + + //var watchw = System.Diagnostics.Stopwatch.StartNew(); + foreach (var item in newResult) + { + //string totalBalanceStr = "0"; + //double totalBalance = 0; + //var firstGetStatement = _financialStatmentApplication.GetDetailsByContractingPartyId(item.ContractingPartyId); + //var allTransactions = firstGetStatement.FinancialTransactionViewModels; + //if (allTransactions != null) + //{ + // allTransactions = allTransactions.OrderBy(x => x.TdateGr).ToList(); + // var debt = allTransactions.Sum(x => x.Deptor); + // var credit = allTransactions.Sum(x => x.Creditor); + // totalBalance = debt - credit; + // totalBalanceStr = totalBalance.ToMoney(); + //} + var contractingParty = _contractingPartyRepository.GetDetails(item.ContractingPartyId); + if (contractingParty != null) + { + item.ContractingPartyName = contractingParty.LName; + item.IsContractingPartyBlock = contractingParty.IsBlock; + item.BlockTimes = contractingParty.BlockTimes; + } + + + var employer = _employerRepository.GetEmployerByContracrtingPartyID(item.ContractingPartyId); + item.EmployerViewModels = employer; + item.EmployerName = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.FullName; + var id = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.Id; + item.EmployerNo = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.EmployerNo; + if (id != null) item.EmployerId = (long)id; + + var emplId = item.EmployerViewModels.Select(x => x.Id).ToList(); + + item.WorkshopViewModels = _workshopRepository.GetWorkshopsByEmployerId(emplId); + var workshopIds = item.WorkshopViewModels.Select(x => x.Id).ToList(); + var left = 0; + item.WorkshopCount = Convert.ToString(item.WorkshopViewModels.Count); + //var joinPersonelList = new List(); + int pCount = 0; + foreach (var workshopId in workshopIds) + { + //var reslt = _workshopApplication.GetConnectedPersonnels(workshopId); + //var noBlock = reslt.Where(x => x.Black == false).ToList(); + //joinPersonelList.AddRange(noBlock); + var p = _workshopApplication.PersonnelCount(workshopId); + pCount += p; + } + //var joinlistWithoutDuplicat = joinPersonelList.GroupBy(x => x.PersonName).Select(x => x.First()).ToList(); + //left = joinlistWithoutDuplicat.Count(); + // var left= _leftWorkRepository.GetLeftPersonelByWorkshopId(workshopIds).Count(); + + item.EmployeeCount = Convert.ToString(pCount); + //if (item.ContractEndGr < now) + // item.ExpireColor = "black"; + //if (item.ContractEndGr >= now && item.ContractEndGr <= endThisMontGr) + // item.ExpireColor = "red"; + //if (item.ContractAmount == "0") + // item.ExpireColor = "purple"; + int archiveCode = 0; + if (item.WorkshopViewModels.Count > 0) + { + var workshop = item.WorkshopViewModels.OrderBy(x => x.Id)?.ToList(); + + var arc = workshop.Select(x => new ArchiveCodConvertoint + { + ArchiveCodeInt = x.ArchiveCode.Substring(0, 1) == "b" ? 10000000 : x.ArchiveCode.ConvertToInt(), + }).OrderBy(x => x.ArchiveCodeInt).ToList(); + var minArchiveCode = arc.Min(x => x.ArchiveCodeInt); + archiveCode = minArchiveCode == 10000000 ? 0 : minArchiveCode; + } + + var result = new InstitutionContractViewModel() + { + Id = item.Id, + ContractNo = item.ContractNo, + ContractStartGr = item.ContractStartGr, + ContractStartFa = item.ContractStartFa, + ContractEndGr = item.ContractEndGr, + ContractEndFa = item.ContractEndFa, + RepresentativeName = item.RepresentativeName, + ContractingPartyName = item.ContractingPartyName, + ContractingPartyId = item.ContractingPartyId, + EmployerNo = item.EmployerNo, + ContractAmount = item.ContractAmount, + EmployerName = item.EmployerName, + EmployerViewModels = item.EmployerViewModels, + IsActiveString = item.IsActiveString, + WorkshopCount = item.WorkshopCount, + WorkshopViewModels = item.WorkshopViewModels, + EmployeeCount = item.EmployeeCount, + ExpireColor = item.ExpireColor, + SearchAmount = item.SearchAmount, + BalanceDouble = item.BalanceDouble, + BalanceStr = item.BalanceStr, + Signature = item.Signature, + ArchiveCode = archiveCode, + TypeOfContract = item.TypeOfContract, + IsContractingPartyBlock = item.IsContractingPartyBlock, + BlockTimes = item.BlockTimes, + }; + join.Add(result); + } + + //Console.WriteLine("forEchTime : " + watchw.Elapsed); + var findeByFilter = new List(); + if (searchModel.WorkshopId != 0) + { + foreach (var item in join) + { + var check = item.WorkshopViewModels.Where(x => x.Id == searchModel.WorkshopId).ToList(); + if (check.Count > 0) + findeByFilter.Add(item); + } + + join = findeByFilter; + } + + var findeByFilter2 = new List(); + if (searchModel.EmployerId != 0) + { + foreach (var item in join) + { + var check = item.EmployerViewModels.Where(x => x.Id == searchModel.EmployerId).ToList(); + if (check.Count > 0) + findeByFilter2.Add(item); + } + + join = findeByFilter2; + } + + + join = join.OrderBy(x => x.WorkshopCount != "0" && string.IsNullOrWhiteSpace(x.ExpireColor)) + .ThenBy(x => x.WorkshopCount == "0" && string.IsNullOrWhiteSpace(x.ExpireColor)) + .ThenBy(x => x.ExpireColor == "red") + .ThenBy(x => x.ExpireColor == "purple") + .ThenBy(x => x.ExpireColor == "black").ToList(); + + return join; + } + + public List NewSearch(InstitutionContractSearchModel searchModel) + { + return _institutionContractRepository.NewSearch(searchModel); + } + + + public List GetInstitutionContractToSetServicesExcelImport() + { + var result = _institutionContractRepository.NewSearch(new InstitutionContractSearchModel()); + + return result.Where(x => + x.IsActiveString == "true" && x.IsContractingPartyBlock != "true" && x.WorkshopCount != "0" && + x.ContractStartGr <= DateTime.Now && x.ContractEndGr >= DateTime.Now).ToList(); + } + + public string ExpCheckColor(DateTime now, DateTime ContractEndGr, DateTime endThisMontGr, string ContractAmount, + string isActiveString) + { + string result = ""; + + if (ContractEndGr < now) + result = "black"; + if (ContractEndGr >= now && ContractEndGr <= endThisMontGr) + result = "red"; + if (ContractAmount == "0") + result = "purple"; + if (isActiveString == "blue") + result = "blue"; + return result; + } + + public TotalbalancViewModel TotalBalance(long contractingPartyId) + { + var result = new TotalbalancViewModel(); + + var firstGetStatement = _financialStatmentApplication.GetDetailsByContractingPartyId(contractingPartyId); + var allTransactions = firstGetStatement.FinancialTransactionViewModels; + if (allTransactions != null) + { + allTransactions = allTransactions.OrderBy(x => x.TdateGr).ToList(); + var debt = allTransactions.Sum(x => x.Deptor); + var credit = allTransactions.Sum(x => x.Creditor); + result.TotalBalanceDbl = debt - credit; + result.TotalBalanceStr = result.TotalBalanceDbl.ToMoney(); + } + + return result; + } + + public WorkshopsAndEmployeeViewModel WorkShopDetailsAndEmployeeCount(long contractingPartyId) + { + var result = new WorkshopsAndEmployeeViewModel(); + + var emplId = _employerRepository.GetEmployerByContracrtingPartyID(contractingPartyId).Select(x => x.Id) + .ToList(); + ; + result.WorkshopViewModels = _workshopRepository.GetWorkshopsByEmployerId(emplId); + var workshopIds = result.WorkshopViewModels.Select(x => x.Id).ToList(); + var left = 0; + result.WorkshopCount = Convert.ToString(workshopIds.Count); + var joinPersonelList = new List(); + foreach (var workshopId in workshopIds) + { + //var reslt = _workshopApplication.GetConnectedPersonnels(workshopId); + //var noBlock = reslt.Where(x => x.Black == false).ToList(); + //joinPersonelList.AddRange(noBlock); + var pCount = _workshopApplication.PersonnelCount(workshopId); + result.EmployeeCount = Convert.ToString(pCount); + } + //var joinlistWithoutDuplicat = joinPersonelList.GroupBy(x => x.PersonName).Select(x => x.First()).ToList(); + //left = joinlistWithoutDuplicat.Count(); + //result.EmployeeCount = Convert.ToString(left); + + + result.ArchiveCode = 0; + if (workshopIds.Count > 0) + { + var workshop = result.WorkshopViewModels.OrderBy(x => x.Id)?.ToList(); + + var arc = workshop.Select(x => new ArchiveCodConvertoint + { + ArchiveCodeInt = x.ArchiveCode.Substring(0, 1) == "b" ? 10000000 : x.ArchiveCode.ConvertToInt(), + }).OrderBy(x => x.ArchiveCodeInt).ToList(); + var minArchiveCode = arc.Min(x => x.ArchiveCodeInt); + result.ArchiveCode = minArchiveCode == 10000000 ? 0 : minArchiveCode; + } + + return result; + } + + public List PrintAll(List id) + { + throw new NotImplementedException(); + } + + public InstitutionContractViewModel PrintOne(long id) + { + var get = _institutionContractRepository.GetDetails(id); + var employer = _employerRepository.GetEmployerByContracrtingPartyID(get.ContractingPartyId); + var employerViewModels = employer; + var emplId = employerViewModels.Select(x => x.Id).ToList(); + var workshops = _workshopRepository.GetWorkshopsByEmployerId(emplId); + var res = new InstitutionContractViewModel() + { + Id = get.Id, + ContractNo = get.ContractNo, + + ContractStartFa = get.ContractStartFa, + + ContractEndFa = get.ContractEndFa, + + ContractingPartyName = get.ContractingPartyName, + + ContractingPartyId = get.ContractingPartyId, + ContractDateFa = get.ContractDateFa, + State = get.State, + City = get.City, + Address = get.Address, + Description = get.Description, + HasValueAddedTax = get.HasValueAddedTax, + ValueAddedTax = get.ValueAddedTax, + ContractAmount = get.ContractAmountString, + DailyCompenseation = get.DailyCompenseationString, + Obligation = get.ObligationString, + TotalAmount = get.TotalAmountString, + WorkshopViewModels = workshops + }; + return res; + } + + + public OperationResult Active(long id) + { + var opration = new OperationResult(); + var contract = _institutionContractRepository.Get(id); + if (contract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + contract.Active(); + + _institutionContractRepository.SaveChanges(); + return opration.Succcedded(); + } + + public OperationResult DeActive(long id) + { + var opration = new OperationResult(); + var contract = _institutionContractRepository.Get(id); + if (contract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + contract.DeActive(); + + + _institutionContractRepository.SaveChanges(); + return opration.Succcedded(); + } + + public OperationResult DeActiveBlue(long id) + { + var opration = new OperationResult(); + var institutionContract = _institutionContractRepository.Get(id); + if (institutionContract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + institutionContract.DeActiveBlue(); + _institutionContractRepository.SaveChanges(); + + return opration.Succcedded(); + } + + public OperationResult DeActiveAllConnections(long id) + { + var opration = new OperationResult(); + var institutionContract = _institutionContractRepository.Get(id); + if (institutionContract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + + var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId); + if (contractingParty != null) + { + contractingParty.DeActive(); + _contractingPartyRepository.SaveChanges(); + var employers = + _employerRepository.GetEmployerByContracrtingPartyID(institutionContract.ContractingPartyId); + //var employersIdList = employers.Select(x => x.Id).ToList(); + //var workshops = _workshopApplication.GetWorkshopsByEmployerId(employersIdList); + //foreach (var workshop in workshops) + //{ + // var res = _workshopApplication.DeActive(workshop.Id); + //} + foreach (var employer in employers) + { + var res = _employerRepository.DeActiveAll(employer.Id); + } + } + + return opration.Succcedded(); + } + + public OperationResult ReActiveAllConnections(long id) + { + var opration = new OperationResult(); + var institutionContract = _institutionContractRepository.Get(id); + if (institutionContract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + + var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId); + if (contractingParty != null) + { + contractingParty.Active(); + _contractingPartyRepository.SaveChanges(); + var employers = + _employerRepository.GetEmployerByContracrtingPartyID(institutionContract.ContractingPartyId); + //var employersIdList = employers.Select(x => x.Id).ToList(); + //var workshops = _workshopApplication.GetWorkshopsByEmployerId(employersIdList); + //foreach (var workshop in workshops) + //{ + // var res = _workshopApplication.DeActive(workshop.Id); + //} + foreach (var employer in employers) + { + var res = _employerRepository.ActiveAll(employer.Id); + } + } + + return opration.Succcedded(); + } + + public void ReActiveAllAfterCreateNew(long contractingPartyId) + { + var contractingParty = _contractingPartyRepository.Get(contractingPartyId); + if (contractingParty != null) + { + if (contractingParty.IsActiveString == "false") + { + contractingParty.Active(); + _contractingPartyRepository.SaveChanges(); + } + + var employers = + _employerRepository.GetEmployerByContracrtingPartyID(contractingPartyId); + + foreach (var employer in employers) + { + var res = _employerRepository.ActiveAll(employer.Id); + } + } + } + + + public void RemoveContract(long id) + { + _institutionContractRepository.RemoveContract(id); + } + + + public OperationResult Sign(long id) + { + var opration = new OperationResult(); + var contract = _institutionContractRepository.Get(id); + if (contract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + contract.Sign(); + + + _institutionContractRepository.SaveChanges(); + opration.IsSuccedded = true; + return opration.Succcedded(); + } + + public OperationResult UnSign(long id) + { + var opration = new OperationResult(); + var contract = _institutionContractRepository.Get(id); + if (contract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + contract.UnSign(); + + + _institutionContractRepository.SaveChanges(); + opration.IsSuccedded = true; + return opration.Succcedded(); + } + + public void CreateContractingPartyAccount(long contractingPartyid, long accountId) + { + _institutionContractRepository.CreateContractingPartyAccount(contractingPartyid, accountId); + } + + public double GetcontractAmount(int countPerson) + { + return _institutionContractRepository.GetcontractAmount(countPerson); + } + + public async Task> GetList( + InstitutionContractListSearchModel searchModel) + { + return await _institutionContractRepository.GetList(searchModel); + } + + public Task GetListStats(InstitutionContractListSearchModel searchModel) + { + return _institutionContractRepository.GetListStats(searchModel); + } + + public async Task CreateAsync(CreateInstitutionContractRequest command) + { + var opration = new OperationResult(); + var syear = command.ContractStartFa.Substring(0, 4); + var smonth = command.ContractStartFa.Substring(5, 2); + var sday = command.ContractStartFa.Substring(8, 2); + + var transaction = await _contractingPartyRepository.BeginTransactionAsync(); + + if (command.ContractStartFa.TryToGeorgianDateTime(out var contractStartGr) == false) + return opration.Failed("تاریخ شروع قرارداد معتبر نیست"); + + contractStartGr.AddMonthsFa((int)command.Duration, out var contractEndGr); + + contractEndGr = contractEndGr.ToFarsi().FindeEndOfMonth().ToGeorgianDateTime(); + + PersonalContractingParty existingContractingParty = null; + if (command.ContractingPartyLegalType == LegalType.Legal) + { + existingContractingParty = + await _contractingPartyRepository.GetByNationalId(command.LegalParty.NationalId); + if (_contractingPartyRepository.Exists(x => + x.LName == command.LegalParty.CompanyName && x.RegisterId == command.LegalParty.RegisterId)) + { + if (_institutionContractRepository.Exists(x => x.ContractStartGr < contractEndGr + && contractStartGr < x.ContractEndGr + && x.ContractingPartyId == existingContractingParty.id + && x.IsActiveString == "true")) + { + throw new BadRequestException("امکان ایجاد قرارداد تکراری وجود ندارد"); + } + } + + if (!command.LegalParty.IsAuth && existingContractingParty != null) { var legalCommand = command.LegalParty; existingContractingParty.UnAuthenticateLegalEdit(legalCommand.FName,legalCommand.LName,legalCommand.FatherName,legalCommand.IdNumber,existingContractingParty.IdNumberSeri,existingContractingParty.IdNumberSerial, @@ -997,7 +997,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication throw new BadRequestException("امکان ایجاد قرارداد تکراری وجود ندارد"); } } - if (!command.RealParty.IsAuth) + if (!command.RealParty.IsAuth && existingContractingParty != null) { var realCommand = command.RealParty; existingContractingParty.UnAuthenticateRealEdit(realCommand.FName,realCommand.LName,realCommand.FatherName,realCommand.IdNumber,existingContractingParty.IdNumberSeri,existingContractingParty.IdNumberSerial, @@ -1005,86 +1005,87 @@ public class InstitutionContractApplication : IInstitutionContractApplication } } - await _institutionContractRepository.SaveChangesAsync(); - PersonalContractingParty contractingParty; - if (existingContractingParty != null) - { - contractingParty = existingContractingParty; - } - else - { - OperationResult contractingPartyResult = command.ContractingPartyLegalType switch - { - LegalType.Legal => await CreateLegalContractingPartyEntity(command.LegalParty, command.RepresentativeId, - command.Address, - command.City, command.Province), - LegalType.Real => await CreateRealContractingPartyEntity(command.RealParty, command.RepresentativeId, - command.Address, - command.City, command.Province), - _ => throw new BadRequestException("نوع طرف قرارداد مشخص نشده است") - }; + await _institutionContractRepository.SaveChangesAsync(); + PersonalContractingParty contractingParty; + if (existingContractingParty != null) + { + contractingParty = existingContractingParty; + } + else + { + OperationResult contractingPartyResult = command.ContractingPartyLegalType switch + { + LegalType.Legal => await CreateLegalContractingPartyEntity(command.LegalParty, command.RepresentativeId, + command.Address, + command.City, command.Province), + LegalType.Real => await CreateRealContractingPartyEntity(command.RealParty, command.RepresentativeId, + command.Address, + command.City, command.Province), + _ => throw new BadRequestException("نوع طرف قرارداد مشخص نشده است") + }; - if (!contractingPartyResult.IsSuccedded) - return opration.Failed(contractingPartyResult.Message); + if (!contractingPartyResult.IsSuccedded) + return opration.Failed(contractingPartyResult.Message); contractingParty = contractingPartyResult.Data; } + + - if (_institutionContractRepository.Exists(x => - x.ContractingPartyId == contractingParty.id && x.RepresentativeId == command.RepresentativeId && - x.TypeOfContract == "JobRelation")) - return opration.Failed( - "برای این معرف و طرف حساب قبلا قرارداد ایجاد شده است، شما میتوانید از تمدید استفاده کنید"); + if (_institutionContractRepository.Exists(x => + x.ContractingPartyId == contractingParty.id && x.RepresentativeId == command.RepresentativeId && + x.TypeOfContract == "JobRelation")) + return opration.Failed( + "برای این معرف و طرف حساب قبلا قرارداد ایجاد شده است، شما میتوانید از تمدید استفاده کنید"); - var contractNo = $"{syear}{smonth}{sday}/{contractingParty.ArchiveCode}/0"; + var contractNo = $"{syear}{smonth}{sday}/{contractingParty.ArchiveCode}/0"; - var representative = _representativeRepository.Get(command.RepresentativeId); - if (representative == null) - return opration.Failed("معرف مورد نظر یافت نشد"); + var representative = _representativeRepository.Get(command.RepresentativeId); + if (representative == null) + return opration.Failed("معرف مورد نظر یافت نشد"); - if (command.IsInstallment && - !command.Workshops.Any(x => x.HasContractPlanInPerson || x.HasInsurancePlanInPerson)) - { - return opration.Failed("برای قراردادهای اقساطی حداقل یک کارگاه باید دارای طرح حضوری باشد"); - } + if (command.IsInstallment && + !command.Workshops.Any(x => x.HasContractPlanInPerson || x.HasInsurancePlanInPerson)) + { + return opration.Failed("برای قراردادهای اقساطی حداقل یک کارگاه باید دارای طرح حضوری باشد"); + } - var today = DateTime.Today; + var today = DateTime.Today; - var contractDateGr = today; - var contractDateFa = contractDateGr.ToFarsi(); + var contractDateGr = today; + var contractDateFa = contractDateGr.ToFarsi(); - var hasValueAddedTax = command.TaxAmount > 0 ? "true" : "false"; + var hasValueAddedTax = command.TaxAmount > 0 ? "true" : "false"; - var contractingPartyFullName = ""; - if (contractingParty.IsLegal == "حقیقی") - { + var contractingPartyFullName = ""; + if (contractingParty.IsLegal == "حقیقی") + { + contractingPartyFullName = contractingParty.FName + " " + contractingParty.LName; + } + else + { + contractingPartyFullName = contractingParty.CeoFName + " " + contractingParty.CeoLName; + } - contractingPartyFullName = contractingParty.FName + " " + contractingParty.LName; - } - else - { - contractingPartyFullName = contractingParty.CeoFName + " " + contractingParty.CeoLName; - } - - var workshopDetails = command.Workshops.Select(x => - new InstitutionContractWorkshopInitial(x.WorkshopName, x.HasRollCallPlan, false, x.HasCustomizeCheckoutPlan, - x.HasContractPlan, x.HasContractPlanInPerson, x.HasInsurancePlan, x.HasInsurancePlanInPerson, - x.PersonnelCount, x.Price)).ToList(); + var workshopDetails = command.Workshops.Select(x => + new InstitutionContractWorkshopInitial(x.WorkshopName, x.HasRollCallPlan, false, x.HasCustomizeCheckoutPlan, + x.HasContractPlan, x.HasContractPlanInPerson, x.HasInsurancePlan, x.HasInsurancePlanInPerson, + x.PersonnelCount, x.Price)).ToList(); - var entity = new InstitutionContract(contractNo, command.RepresentativeId, representative.FullName, - contractingParty.id, - contractingPartyFullName, contractDateGr, contractDateFa, command.Province, command.City, command.Address, - contractStartGr, - contractStartGr.ToFarsi(), contractEndGr, contractEndGr.ToFarsi(), command.OneMonthAmount, - command.DailyCompensation, - command.Obligation, command.TotalAmount, 0, - command.Workshops.Count.ToString(), - command.Workshops.Sum(x => x.PersonnelCount).ToString(), command.Description, - "NotOfficial", "JobRelation", hasValueAddedTax, - command.TaxAmount, workshopDetails, command.LawId); + var entity = new InstitutionContract(contractNo, command.RepresentativeId, representative.FullName, + contractingParty.id, + contractingPartyFullName, contractDateGr, contractDateFa, command.Province, command.City, command.Address, + contractStartGr, + contractStartGr.ToFarsi(), contractEndGr, contractEndGr.ToFarsi(), command.OneMonthAmount, + command.DailyCompensation, + command.Obligation, command.TotalAmount, 0, + command.Workshops.Count.ToString(), + command.Workshops.Sum(x => x.PersonnelCount).ToString(), command.Description, + "NotOfficial", "JobRelation", hasValueAddedTax, + command.TaxAmount, workshopDetails, command.LawId,command.DiscountPercentage,command.DiscountAmount ); FinancialStatment financialStatement; @@ -1099,63 +1100,33 @@ public class InstitutionContractApplication : IInstitutionContractApplication } await _institutionContractRepository.CreateAsync(entity); await _institutionContractRepository.SaveChangesAsync(); - - double invoiceAmount; - string invoiceItemDescription; - FinancialInvoiceItemType invoiceItemType; - long invoiceItemEntityId; + if (command.IsInstallment) { var installments = CalculateInstallment(command.TotalAmount, (int)command.Duration, command.ContractStartFa, true); - // دریافت مبلغ اولین قسط - //این کار برای این هست که اولین قسط باید با تاریخ امروز باشد و باید به وضعیت مالی بدهی ایجاد شود که یوزر اولین بدهی را وارد کند - var firstInstallmentAmount = installments.First().Amount; + // دریافت مبلغ اولین قسط + //این کار برای این هست که اولین قسط باید با تاریخ امروز باشد و باید به وضعیت مالی بدهی ایجاد شود که یوزر اولین بدهی را وارد کند + var firstInstallmentAmount = installments.First().Amount; - // حذف اولین قسط - installments.RemoveAt(0); + // حذف اولین قسط + installments.RemoveAt(0); - // ایجاد قسط جدید با تاریخ امروز - var todayInstallment = new InstitutionContractInstallment(DateTime.Today, firstInstallmentAmount, ""); + // ایجاد قسط جدید با تاریخ امروز + var todayInstallment = new InstitutionContractInstallment(DateTime.Today, firstInstallmentAmount, ""); - // اضافه کردن قسط جدید به ابتدای لیست - installments.Insert(0, todayInstallment); + // اضافه کردن قسط جدید به ابتدای لیست + installments.Insert(0, todayInstallment); - entity.SetInstallments(installments); + entity.SetInstallments(installments); await _institutionContractRepository.SaveChangesAsync(); - - var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(), - "قسط اول سرویس", "debt", "بابت خدمات", firstInstallmentAmount, 0, 0); - - financialStatement.AddFinancialTransaction(financialTransaction); - invoiceAmount = firstInstallmentAmount; - invoiceItemDescription = $"پرداخت قسط اول قرارداد شماره {entity.ContractNo}"; - invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContractInstallment; - invoiceItemEntityId = todayInstallment.Id; + } - else - { - var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(), - "پرداخت کل سرویس", "debt", "بابت خدمات", command.TotalAmount, 0, 0); - financialStatement.AddFinancialTransaction(financialTransaction); - invoiceAmount = command.TotalAmount; - invoiceItemDescription = $"پرداخت کل قرارداد شماره {entity.ContractNo}"; - invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract; - invoiceItemEntityId = entity.id; - } - - var financialInvoice = new FinancialInvoice(invoiceAmount, contractingParty.id, $"خرید قرارداد مالی شماره {entity.ContractNo}"); - var financialInvoiceItem = new FinancialInvoiceItem(invoiceItemDescription, invoiceAmount, 0, invoiceItemType, invoiceItemEntityId); - financialInvoice.AddItem(financialInvoiceItem); - - - await _financialInvoiceRepository.CreateAsync(financialInvoice); - await _institutionContractRepository.SaveChangesAsync(); - + var mainContactInfo = new CreateContactInfo { InstitutionContractId = entity.id, @@ -1167,114 +1138,115 @@ public class InstitutionContractApplication : IInstitutionContractApplication }; _contactInfoApplication.Create(mainContactInfo); - foreach (var contactInfo in command.ContactInfos) - { - if (contactInfo.PhoneNumber != null) - { - var contactinfo = new CreateContactInfo - { - InstitutionContractId = entity.id, - PhoneType = contactInfo.PhoneType, - Position = contactInfo.Position, - PhoneNumber = contactInfo.PhoneNumber, - FnameLname = contactInfo.FnameLname, - SendSms = contactInfo.SendSmsString == "true" ? true : false - }; - _contactInfoApplication.Create(contactinfo); - } - } + foreach (var contactInfo in command.ContactInfos) + { + if (contactInfo.PhoneNumber != null) + { + var contactinfo = new CreateContactInfo + { + InstitutionContractId = entity.id, + PhoneType = contactInfo.PhoneType, + Position = contactInfo.Position, + PhoneNumber = contactInfo.PhoneNumber, + FnameLname = contactInfo.FnameLname, + SendSms = contactInfo.SendSmsString == "true" ? true : false + }; + _contactInfoApplication.Create(contactinfo); + } + } - var userPass = contractingParty.IsLegal == "حقیقی" - ? contractingParty.Nationalcode - : contractingParty.NationalId; - var createAcc = new RegisterAccount - { - Fullname = contractingParty.LName, - Username = userPass, - Password = userPass, - Mobile = contractingParty.Phone, - NationalCode = userPass - }; - var res = _accountApplication.RegisterClient(createAcc); - if (res.IsSuccedded) - CreateContractingPartyAccount(contractingParty.id, res.SendId); + var userPass = contractingParty.IsLegal == "حقیقی" + ? contractingParty.Nationalcode + : contractingParty.NationalId; + var createAcc = new RegisterAccount + { + Fullname = contractingParty.LName, + Username = userPass, + Password = userPass, + Mobile = contractingParty.Phone, + NationalCode = userPass + }; + var res = _accountApplication.RegisterClient(createAcc); + if (res.IsSuccedded) + CreateContractingPartyAccount(contractingParty.id, res.SendId); - await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName, - entity.PublicId, contractingParty.id, entity.id); + await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName, + entity.PublicId, contractingParty.id, entity.id); - await _institutionContractRepository.SaveChangesAsync(); + await _institutionContractRepository.SaveChangesAsync(); - await transaction.CommitAsync(); - return opration.Succcedded(); - } + await transaction.CommitAsync(); + return opration.Succcedded(); + } - public async Task EditAsync(EditInstitutionContractRequest command) - { - throw new NotImplementedException(); - } + public async Task EditAsync(EditInstitutionContractRequest command) + { + throw new NotImplementedException(); + } - public Task> RegistrationWorkflowMainList() - { - return _institutionContractRepository.RegistrationWorkflowMainList(); - } + public Task> RegistrationWorkflowMainList() + { + return _institutionContractRepository.RegistrationWorkflowMainList(); + } - public Task> RegistrationWorkflowItems(long institutionContractId) - { - return _institutionContractRepository.RegistrationWorkflowItems(institutionContractId); - } + public Task> RegistrationWorkflowItems(long institutionContractId) + { + return _institutionContractRepository.RegistrationWorkflowItems(institutionContractId); + } - public async Task GetVerificationDetails(Guid id) - { - return await _institutionContractRepository.GetVerificationDetails(id); - } + public async Task GetVerificationDetails(Guid id) + { + return await _institutionContractRepository.GetVerificationDetails(id); + } - public async Task> SendVerifyOtp(Guid id) - { - var institutionContract = await _institutionContractRepository.GetByPublicIdAsync(id); - if (institutionContract == null) - { - throw new NotFoundException("رکورد مورد نظر یافت نشد"); - } + public async Task> SendVerifyOtp(Guid id) + { + var institutionContract = await _institutionContractRepository.GetByPublicIdAsync(id); + if (institutionContract == null) + { + throw new NotFoundException("رکورد مورد نظر یافت نشد"); + } - if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.Verified) - throw new BadRequestException("این قرارداد مالی قبلا تایید شده است"); + if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.Verified) + throw new BadRequestException("این قرارداد مالی قبلا تایید شده است"); - if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify && - institutionContract.VerifyCodeCreation != DateTime.MinValue) - { - if (!institutionContract.CanResendVerifyCode) - { - throw new BadRequestException("کد تایید قبلی هنوز منقضی نشده است", - new Dictionary - { - { - "expireTime", (int)institutionContract.ReSendTime.TotalSeconds - - (int)(DateTime.Now - institutionContract.VerifyCodeCreation).TotalSeconds - } - }); - } - } + if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify && + institutionContract.VerifyCodeCreation != DateTime.MinValue) + { + if (!institutionContract.CanResendVerifyCode) + { + throw new BadRequestException("کد تایید قبلی هنوز منقضی نشده است", + new Dictionary + { + { + "expireTime", (int)institutionContract.ReSendTime.TotalSeconds - + (int)(DateTime.Now - institutionContract.VerifyCodeCreation).TotalSeconds + } + }); + } + } - var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId); - if (contractingParty == null) - throw new NotFoundException("طرف قرارداد یافت نشد"); + var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId); + if (contractingParty == null) + throw new NotFoundException("طرف قرارداد یافت نشد"); - var code = new Random().Next(1000, 9999).ToString(); + var code = new Random().Next(1000, 9999).ToString(); - var contractingPartyFullName = contractingParty.IsLegal == "حقیقی" - ? contractingParty.FName + " " + contractingParty.LName - : contractingParty.CeoFName + " " + contractingParty.CeoLName; + var contractingPartyFullName = contractingParty.IsLegal == "حقیقی" + ? contractingParty.FName + " " + contractingParty.LName + : contractingParty.CeoFName + " " + contractingParty.CeoLName; - institutionContract.SetVerifyCode(code, contractingPartyFullName, contractingParty.Phone); + institutionContract.SetVerifyCode(code, contractingPartyFullName, contractingParty.Phone); var transaction = await _institutionContractRepository.BeginTransactionAsync(); try { await _institutionContractRepository.SaveChangesAsync(); - _smsService.VerifySend(contractingParty.Phone, code); + await _smsService.SendInstitutionVerificationCode(contractingParty.Phone, code,contractingPartyFullName, + contractingParty.id, institutionContract.id); } catch (Exception e) { @@ -1283,57 +1255,106 @@ public class InstitutionContractApplication : IInstitutionContractApplication throw; } - await transaction.CommitAsync(); - var result = new OtpResultViewModel - { - ExpireTimeSec = (int)institutionContract.ExpireTime.TotalSeconds, - ReSendTimeSec = (int)institutionContract.ReSendTime.TotalSeconds - }; - return new OperationResult().Succcedded(result); - } + await transaction.CommitAsync(); + var result = new OtpResultViewModel + { + ExpireTimeSec = (int)institutionContract.ExpireTime.TotalSeconds, + ReSendTimeSec = (int)institutionContract.ReSendTime.TotalSeconds + }; + return new OperationResult().Succcedded(result); + } - public async Task> VerifyOtpAndMakeGateway(Guid publicId, string code, string callbackUrl) - { - var op = new OperationResult(); - var institutionContract = await _institutionContractRepository.GetByPublicIdAsync(publicId); - if (institutionContract == null) - { - throw new NotFoundException("رکورد مورد نظر یافت نشد"); - } + public async Task> VerifyOtpAndMakeGateway(Guid publicId, string code, string callbackUrl) + { + var op = new OperationResult(); + var institutionContract = await _institutionContractRepository.GetByPublicIdAsync(publicId); + if (institutionContract == null) + { + throw new NotFoundException("رکورد مورد نظر یافت نشد"); + } - if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.Verified) - throw new BadRequestException("این قرارداد مالی قبلا تایید شده است"); + if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.Verified) + throw new BadRequestException("این قرارداد مالی قبلا تایید شده است"); - if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify && - institutionContract.VerifyCodeExpired) - throw new BadRequestException("کد تایید منقضی شده است"); + if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify && + institutionContract.VerifyCodeExpired) + throw new BadRequestException("کد تایید منقضی شده است"); - var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId); - if (contractingParty == null) - throw new NotFoundException("طرف قرارداد یافت نشد"); + var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId); + if (contractingParty == null) + throw new NotFoundException("طرف قرارداد یافت نشد"); if (institutionContract.VerifyCode != code) return op.Failed("کد وارد شده صحیح نمی باشد"); + + var financialStatement =await _financialStatmentRepository.GetByContractingPartyId(contractingParty.id); var dbTransaction = await _institutionContractRepository.BeginTransactionAsync(); + FinancialInvoice financialInvoice; + FinancialInvoiceItem financialInvoiceItem; + var today = DateTime.Today; + double invoiceAmount = 0; + string invoiceItemDescription = string.Empty; + FinancialInvoiceItemType invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract; + long invoiceItemEntityId = 0; - long entityId = 0; - FinancialInvoiceItemType financialInvoiceItemType; if (institutionContract.IsInstallment) { - entityId = institutionContract.Installments.MinBy(x => x.InstallmentDateGr).Id; - financialInvoiceItemType = FinancialInvoiceItemType.BuyInstitutionContractInstallment; + var firstInstallment = institutionContract.Installments.First(); + var firstInstallmentAmount = firstInstallment.Amount; + + financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(firstInstallment.Id, FinancialInvoiceItemType.BuyInstitutionContractInstallment); + if (financialInvoice == null) + { + var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(), + "قسط اول سرویس", "debt", "بابت خدمات", firstInstallmentAmount, 0, 0); + financialStatement.AddFinancialTransaction(financialTransaction); + invoiceAmount = firstInstallmentAmount; + invoiceItemDescription = $"پرداخت قسط اول قرارداد شماره {institutionContract.ContractNo}"; + invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContractInstallment; + invoiceItemEntityId = firstInstallment.Id; + } + else + { + invoiceAmount = financialInvoice.Amount; + invoiceItemDescription = financialInvoice.Items.First().Description; + invoiceItemType = financialInvoice.Items.First().Type; + invoiceItemEntityId = financialInvoice.Items.First().EntityId; + } } else { - entityId = institutionContract.id; - financialInvoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract; + financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(institutionContract.id, FinancialInvoiceItemType.BuyInstitutionContract); + if (financialInvoice == null) + { + var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(), + "پرداخت کل سرویس", "debt", "بابت خدمات", institutionContract.TotalAmount, 0, 0); + financialStatement.AddFinancialTransaction(financialTransaction); + invoiceAmount = institutionContract.TotalAmount; + invoiceItemDescription = $"پرداخت کل قرارداد شماره {institutionContract.ContractNo}"; + invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract; + invoiceItemEntityId = institutionContract.id; + } + else + { + invoiceAmount = financialInvoice.Amount; + invoiceItemDescription = financialInvoice.Items.First().Description; + invoiceItemType = financialInvoice.Items.First().Type; + invoiceItemEntityId = financialInvoice.Items.First().EntityId; + } } - var financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(entityId, financialInvoiceItemType); - var amount = financialInvoice.Amount; + if (financialInvoice == null) + { + financialInvoice = new FinancialInvoice(invoiceAmount, contractingParty.id, $"خرید قرارداد مالی شماره {institutionContract.ContractNo}"); + financialInvoiceItem = new FinancialInvoiceItem(invoiceItemDescription, invoiceAmount, 0, invoiceItemType, invoiceItemEntityId); + financialInvoice.AddItem(financialInvoiceItem); + await _financialInvoiceRepository.CreateAsync(financialInvoice); + } - var transaction = new PaymentTransaction(institutionContract.ContractingPartyId, amount, + await _financialInvoiceRepository.SaveChangesAsync(); + + var transaction = new PaymentTransaction(institutionContract.ContractingPartyId, invoiceAmount, institutionContract.ContractingPartyName, "https://client.gozareshgir.ir", PaymentTransactionGateWay.SepehrPay); await _paymentTransactionRepository.CreateAsync(transaction); @@ -1341,7 +1362,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication var createPayment = new CreatePaymentGatewayRequest() { - Amount = amount, + Amount = invoiceAmount, TransactionId = transaction.id.ToString(), CallBackUrl = callbackUrl, FinancialInvoiceId = financialInvoice.id, @@ -1351,155 +1372,194 @@ public class InstitutionContractApplication : IInstitutionContractApplication return op.Failed("خطا در ایجاد درگاه پرداخت: " + gatewayResponse.Message + gatewayResponse.ErrorCode); - // institutionContract.SetPendingWorkflow(); - // - // var phone = institutionContract.ContactInfoList.FirstOrDefault(x => - // x.SendSms && x.Position == "طرف قرارداد" && x.PhoneType == "شماره همراه"); - // if (phone !=null) - // { - // var userPass = contractingParty.IsLegal == "حقیقی" - // ? contractingParty.Nationalcode - // : contractingParty.NationalId; - // var createAcc = new RegisterAccount - // { - // Fullname = contractingParty.LName, - // Username = userPass, - // Password = userPass, - // Mobile = phone.PhoneNumber, - // NationalCode = userPass - // }; - // var res = _accountApplication.RegisterClient(createAcc); - // if (res.IsSuccedded) - // CreateContractingPartyAccount(contractingParty.id, res.SendId); - // } + // institutionContract.SetPendingWorkflow(); + // + // var phone = institutionContract.ContactInfoList.FirstOrDefault(x => + // x.SendSms && x.Position == "طرف قرارداد" && x.PhoneType == "شماره همراه"); + // if (phone !=null) + // { + // var userPass = contractingParty.IsLegal == "حقیقی" + // ? contractingParty.Nationalcode + // : contractingParty.NationalId; + // var createAcc = new RegisterAccount + // { + // Fullname = contractingParty.LName, + // Username = userPass, + // Password = userPass, + // Mobile = phone.PhoneNumber, + // NationalCode = userPass + // }; + // var res = _accountApplication.RegisterClient(createAcc); + // if (res.IsSuccedded) + // CreateContractingPartyAccount(contractingParty.id, res.SendId); + // } - await dbTransaction.CommitAsync(); - await _institutionContractRepository.SaveChangesAsync(); - return op.Succcedded(gatewayResponse.Token); - } + await dbTransaction.CommitAsync(); + await _institutionContractRepository.SaveChangesAsync(); + return op.Succcedded(gatewayResponse.Token); + } - public async Task GetWorkshopInitialDetails(long workshopDetailsId) + public async Task GetWorkshopInitialDetails(long workshopDetailsId) + { + var details = await _institutionContractRepository.GetInstitutionWorkshopInitialDetails(workshopDetailsId); + var services = details.Services; + var newArchiveCode = _workshopRepository.GetLastArchiveCode() + 1; + + var res = new InstitutionContractWorkshopDetailViewModel() + { + ServicesViewModel = new WorkshopServicesViewModel() + { + Contract = services.Contract, + ContractInPerson = services.ContractInPerson, + CustomizeCheckout = services.CustomizeCheckout, + Insurance = services.Insurance, + InsuranceInPerson = services.InsuranceInPerson, + RollCall = services.RollCall, + RollCallInPerson = services.RollCallInPerson + }, + WorkshopName = details.WorkshopName, + ArchiveCode = newArchiveCode + }; + return res; + } + + public InstitutionContractExtensionPaymentResponse CalculateDiscount(InstitutionContractSetDiscountRequest request) + { + return _institutionContractRepository.CalculateDiscount(request); + } + + public InstitutionContractExtensionPaymentResponse ResetDiscountCreate( + InstitutionContractResetDiscountForCreateRequest request) + { + return _institutionContractRepository.ResetDiscountCreate(request); + } + + public async Task GetExtensionInquiry(long previousContractId) + { + return await _institutionContractRepository.GetExtensionInquiry(previousContractId); + } + + public async Task GetExtensionWorkshops( + InstitutionContractExtensionWorkshopsRequest request) + { + return await _institutionContractRepository.GetExtensionWorkshops(request); + } + + public async Task GetExtensionInstitutionPlan( + InstitutionContractExtensionPlanRequest request) + { + return await _institutionContractRepository.GetExtensionInstitutionPlan(request); + } + + public async Task GetExtensionPaymentMethod( + InstitutionContractExtensionPaymentRequest request) + { + return await _institutionContractRepository.GetExtensionPaymentMethod(request); + } + + public async Task SetDiscountForExtension( + InstitutionContractSetDiscountForExtensionRequest request) + { + return await _institutionContractRepository.SetDiscountForExtension(request); + } + + public async Task> ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request) + { + return await _institutionContractRepository.ResetDiscountForExtension(request); + } + + public async Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request) + { + return await _institutionContractRepository.ExtensionComplete(request); + } + + public async Task> GetInstitutionContractSelectList(string search, + string selected) + { + return await _institutionContractRepository.GetInstitutionContractSelectList(search, selected); + } + + public async Task GetAmendmentWorkshops(long institutionContractId) + { + return await _institutionContractRepository.GetAmendmentWorkshops(institutionContractId); + } + + public async Task InsertAmendmentTempWorkshops( + InstitutionContractAmendmentTempWorkshopViewModel request) + { + return await _institutionContractRepository.InsertAmendmentTempWorkshops(request); + } + + public Task RemoveAmendmentWorkshops(Guid workshopTempId) + { + return _institutionContractRepository.RemoveAmendmentWorkshops(workshopTempId); + } + + public Task GetAmendmentPaymentDetails( + InsitutionContractAmendmentPaymentRequest request) + { + return _institutionContractRepository.GetAmendmentPaymentDetails(request); + } + + public async Task ResendVerifyLink(long institutionContractId) + { + var institutionContract = _institutionContractRepository.Get(institutionContractId); + + if (institutionContract == null) + { + throw new NotFoundException("رکورد مورد نظر یافت نشد"); + } + + if (institutionContract.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify) + { + throw new BadRequestException("این قرارداد مالی در وضعیت مناسبی برای ارسال مجدد لینک تایید نمی باشد"); + } + + var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId); + if (contractingParty == null) + throw new NotFoundException("طرف قرارداد یافت نشد"); + var contractingPartyFullName = contractingParty.FName + " " + contractingParty.LName; + await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName, + institutionContract.PublicId, contractingParty.id, institutionContract.id); + return new OperationResult().Succcedded(); + } + + public async Task PrintOneAsync(long id) + { + return (await _institutionContractRepository.PrintAllAsync([id])).FirstOrDefault(); + } + + public async Task SetPendingWorkflow(long entityId) + { + var op = new OperationResult(); + var institutionContract = await _institutionContractRepository.GetIncludeWorkshopDetailsAsync(entityId); + if (institutionContract == null) + { + return op.Failed("قرارداد مالی یافت نشد"); + } + + if (institutionContract.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify) + { + return op.Failed("وضعیت قرارداد مالی برای این عملیات مناسب نمی باشد"); + } + + if (institutionContract.WorkshopGroup.InitialWorkshops.All(x => x.WorkshopCreated && x.WorkshopId is > 0)) + { + institutionContract.Verified(); + } + else + { + institutionContract.SetPendingWorkflow(); + } + + await _institutionContractRepository.SaveChangesAsync(); + return op.Succcedded(); + } + + public async Task GetIdByInstallmentId(long installmentId) { - var details = await _institutionContractRepository.GetInstitutionWorkshopInitialDetails(workshopDetailsId); - var services = details.Services; - var newArchiveCode = _workshopRepository.GetLastArchiveCode() + 1; - - var res = new InstitutionContractWorkshopDetailViewModel() - { - ServicesViewModel = new WorkshopServicesViewModel() - { - Contract = services.Contract, - ContractInPerson = services.ContractInPerson, - CustomizeCheckout = services.CustomizeCheckout, - Insurance = services.Insurance, - InsuranceInPerson = services.InsuranceInPerson, - RollCall = services.RollCall, - RollCallInPerson = services.RollCallInPerson - }, - WorkshopName = details.WorkshopName, - ArchiveCode = newArchiveCode - }; - return res; + return await _institutionContractRepository.GetIdByInstallmentId(installmentId); } - - public async Task GetExtensionInquiry(long previousContractId) - { - return await _institutionContractRepository.GetExtensionInquiry(previousContractId); - } - - public async Task GetExtensionWorkshops( - InstitutionContractExtensionWorkshopsRequest request) - { - return await _institutionContractRepository.GetExtensionWorkshops(request); - } - - public async Task GetExtensionInstitutionPlan( - InstitutionContractExtensionPlanRequest request) - { - return await _institutionContractRepository.GetExtensionInstitutionPlan(request); - } - - public async Task GetExtensionPaymentMethod( - InstitutionContractExtensionPaymentRequest request) - { - return await _institutionContractRepository.GetExtensionPaymentMethod(request); - } - - public async Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request) - { - return await _institutionContractRepository.ExtensionComplete(request); - } - - public async Task> GetInstitutionContractSelectList(string search, string selected) - { - return await _institutionContractRepository.GetInstitutionContractSelectList(search, selected); - } - - public async Task GetAmendmentWorkshops(long institutionContractId) - { - return await _institutionContractRepository.GetAmendmentWorkshops(institutionContractId); - } - - public async Task InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request) - { - return await _institutionContractRepository.InsertAmendmentTempWorkshops(request); - } - - public Task RemoveAmendmentWorkshops(Guid workshopTempId) - { - return _institutionContractRepository.RemoveAmendmentWorkshops(workshopTempId); - } - - public Task GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request) - { - return _institutionContractRepository.GetAmendmentPaymentDetails(request); - } - - public async Task ResendVerifyLink(long institutionContractId) - { - var institutionContract = _institutionContractRepository.Get(institutionContractId); - - if (institutionContract == null) - { - throw new NotFoundException("رکورد مورد نظر یافت نشد"); - } - - if (institutionContract.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify) - { - throw new BadRequestException("این قرارداد مالی در وضعیت مناسبی برای ارسال مجدد لینک تایید نمی باشد"); - } - var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId); - if (contractingParty == null) - throw new NotFoundException("طرف قرارداد یافت نشد"); - var contractingPartyFullName = contractingParty.FName + " " + contractingParty.LName; - await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName, - institutionContract.PublicId, contractingParty.id, institutionContract.id); - return new OperationResult().Succcedded(); - } - - public async Task PrintOneAsync(long id) - { - return (await _institutionContractRepository.PrintAllAsync([id])).FirstOrDefault(); - } - - public async Task SetPendingWorkflow(long entityId) - { - var op = new OperationResult(); - var institutionContract = _institutionContractRepository.Get(entityId); - if (institutionContract == null) - { - return op.Failed("قرارداد مالی یافت نشد"); - } - - if (institutionContract.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify) - { - return op.Failed("وضعیت قرارداد مالی برای این عملیات مناسب نمی باشد"); - } - institutionContract.SetPendingWorkflow(); - await _institutionContractRepository.SaveChangesAsync(); - return op.Succcedded(); - } - public Task GetContractWorkshopsDetails(long id) { return _institutionContractRepository.GetContractWorkshopsDetails(id); @@ -1516,206 +1576,207 @@ public class InstitutionContractApplication : IInstitutionContractApplication } - private async Task> CreateLegalContractingPartyEntity( - CreateInstitutionContractLegalPartyRequest request, long representativeId, string address, string city, - string state) - { - var opration = new OperationResult(); + private async Task> CreateLegalContractingPartyEntity( + CreateInstitutionContractLegalPartyRequest request, long representativeId, string address, string city, + string state) + { + var opration = new OperationResult(); - if (representativeId < 1) - return opration.Failed("لطفا معرف را انتخاب کنید"); + if (representativeId < 1) + return opration.Failed("لطفا معرف را انتخاب کنید"); - if (_contractingPartyRepository.Exists(x => - x.LName == request.CompanyName && x.NationalId == request.NationalId)) - return opration.Failed("نام شرکت وارد شده تکراری است"); + if (_contractingPartyRepository.Exists(x => + x.LName == request.CompanyName && x.NationalId == request.NationalId)) + return opration.Failed("نام شرکت وارد شده تکراری است"); - //if (_contractingPartyRepository.Exists(x => - // x.RegisterId == request.RegisterId && x.LName != request.CompanyName)) - // return opration.Failed("شماره ثبت وارد شده تکراری است"); + //if (_contractingPartyRepository.Exists(x => + // x.RegisterId == request.RegisterId && x.LName != request.CompanyName)) + // return opration.Failed("شماره ثبت وارد شده تکراری است"); - if (_contractingPartyRepository.Exists(x => - x.NationalId == request.NationalId && x.LName != request.CompanyName)) - { - return opration.Failed("شناسه ملی وارد شده تکراری است"); - } + if (_contractingPartyRepository.Exists(x => + x.NationalId == request.NationalId && x.LName != request.CompanyName)) + { + return opration.Failed("شناسه ملی وارد شده تکراری است"); + } - var archiveCode = _contractingPartyRepository.GetLastNewArchiveCode(); + var archiveCode = _contractingPartyRepository.GetLastNewArchiveCode(); - var representative = _representativeRepository.GetDetails(representativeId); - var legalContractingParty = new PersonalContractingParty("*", request.CompanyName, - "*", "*", request.RegisterId, request.NationalId, - "حقوقی", - request.PhoneNumber, request.PhoneNumber, address, representativeId, representative.FullName, - archiveCode, state, city, null, null, - request.FName, request.LName, request.Position); + var representative = _representativeRepository.GetDetails(representativeId); + var legalContractingParty = new PersonalContractingParty("*", request.CompanyName, + "*", "*", request.RegisterId, request.NationalId, + "حقوقی", + request.PhoneNumber, request.PhoneNumber, address, representativeId, representative.FullName, + archiveCode, state, city, null, null, + request.FName, request.LName, request.Position); - if (request.IsAuth) - { - legalContractingParty.LegalAuthentication(request.FName, request.LName, request.FatherName, - request.IdNumber, null, null, request.BirthDateFa, request.Gender, request.PhoneNumber); - } + if (request.IsAuth) + { + legalContractingParty.LegalAuthentication(request.FName, request.LName, request.FatherName, + request.IdNumber, null, null, request.BirthDateFa, request.Gender, request.PhoneNumber); + } - await _contractingPartyRepository.CreateAsync(legalContractingParty); - await _contractingPartyRepository.SaveChangesAsync(); + await _contractingPartyRepository.CreateAsync(legalContractingParty); + await _contractingPartyRepository.SaveChangesAsync(); - return opration.Succcedded(legalContractingParty); - } + return opration.Succcedded(legalContractingParty); + } - private async Task> CreateRealContractingPartyEntity( - CreateInstitutionContractRealPartyRequest request, long representativeId, string address, - string city, string province) - { - var operation = new OperationResult(); + private async Task> CreateRealContractingPartyEntity( + CreateInstitutionContractRealPartyRequest request, long representativeId, string address, + string city, string province) + { + var operation = new OperationResult(); - if (representativeId < 1) - return operation.Failed("لطفا معرف را انتخاب کنید"); + if (representativeId < 1) + return operation.Failed("لطفا معرف را انتخاب کنید"); - if (_contractingPartyRepository.Exists(x => x.Nationalcode == request.NationalCode)) - { - return operation.Failed("کد ملی وارد شده تکراری است"); - } + if (_contractingPartyRepository.Exists(x => x.Nationalcode == request.NationalCode)) + { + return operation.Failed("کد ملی وارد شده تکراری است"); + } - var archiveCode = _contractingPartyRepository.GetLastNewArchiveCode(); + var archiveCode = _contractingPartyRepository.GetLastNewArchiveCode(); - if (request.NationalCode.NationalCodeValid() != "valid") - { - return operation.Failed("کد ملی وارد شده نا معتبر است"); - } + if (request.NationalCode.NationalCodeValid() != "valid") + { + return operation.Failed("کد ملی وارد شده نا معتبر است"); + } - var representative = _representativeRepository.GetDetails(representativeId); + var representative = _representativeRepository.GetDetails(representativeId); - if (representative == null) - return operation.Failed("معرف مورد نظر یافت نشد"); + if (representative == null) + return operation.Failed("معرف مورد نظر یافت نشد"); - var personalContractingParty = new PersonalContractingParty(request.FName, request.LName, - request.NationalCode, request.IdNumber, "*", "*", - "حقیقی", - request.PhoneNumber, request.PhoneNumber, address, representativeId, representative.FullName, archiveCode, - province, city, null, null, null, null); + var personalContractingParty = new PersonalContractingParty(request.FName, request.LName, + request.NationalCode, request.IdNumber, "*", "*", + "حقیقی", + request.PhoneNumber, request.PhoneNumber, address, representativeId, representative.FullName, archiveCode, + province, city, null, null, null, null); - if (request.IsAuth) - { - personalContractingParty.Authentication(request.FName, request.LName, request.FatherName, - request.IdNumber, null, null, request.BirthDateFa, request.Gender, request.PhoneNumber); - } + if (request.IsAuth) + { + personalContractingParty.Authentication(request.FName, request.LName, request.FatherName, + request.IdNumber, null, null, request.BirthDateFa, request.Gender, request.PhoneNumber); + } - await _contractingPartyRepository.CreateAsync(personalContractingParty); - await _contractingPartyRepository.SaveChangesAsync(); + await _contractingPartyRepository.CreateAsync(personalContractingParty); + await _contractingPartyRepository.SaveChangesAsync(); - return operation.Succcedded(personalContractingParty); - } + return operation.Succcedded(personalContractingParty); + } - public static List CalculateInstallment(double amount, int installmentCount, - string loanStartDate, bool getRounded) - { - int day = Convert.ToInt32(loanStartDate.Substring(8, 2)); - int month = Convert.ToInt32(loanStartDate.Substring(5, 2)); - int year = Convert.ToInt32(loanStartDate.Substring(0, 4)); + public static List CalculateInstallment(double amount, int installmentCount, + string loanStartDate, bool getRounded) + { + int day = Convert.ToInt32(loanStartDate.Substring(8, 2)); + int month = Convert.ToInt32(loanStartDate.Substring(5, 2)); + int year = Convert.ToInt32(loanStartDate.Substring(0, 4)); - var installments = new List(); + var installments = new List(); - bool endOfMonth = day == 31; + bool endOfMonth = day == 31; - var dividedAmount = amount / installmentCount; + var dividedAmount = amount / installmentCount; - double moneyPerMonth = 0; + double moneyPerMonth = 0; - if (getRounded) - moneyPerMonth = Math.Floor(dividedAmount / 1000) * 1000; - else - moneyPerMonth = Math.Floor(dividedAmount); + if (getRounded) + moneyPerMonth = Math.Floor(dividedAmount / 1000) * 1000; + else + moneyPerMonth = Math.Floor(dividedAmount); - double lastLoan = amount - (moneyPerMonth * (installmentCount - 1)); + double lastLoan = amount - (moneyPerMonth * (installmentCount - 1)); - if (endOfMonth) - { - for (int i = 1; i < installmentCount; i++) - { - var installment = - new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), moneyPerMonth, ""); + if (endOfMonth) + { + for (int i = 1; i < installmentCount; i++) + { + var installment = + new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), moneyPerMonth, ""); - installments.Add(installment); + installments.Add(installment); - if (month == 12) - { - year++; - month = 1; - } - else - { - month++; - } + if (month == 12) + { + year++; + month = 1; + } + else + { + month++; + } - loanStartDate = $"{year:0000}/{month:00}/01".FindeEndOfMonth(); - } + loanStartDate = $"{year:0000}/{month:00}/01".FindeEndOfMonth(); + } - var lastInstallment = new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), lastLoan, ""); + var lastInstallment = new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), lastLoan, ""); - installments.Add(lastInstallment); - return installments; - } - else - { - for (int i = 1; i < installmentCount; i++) - { - var installment = - new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), moneyPerMonth, ""); + installments.Add(lastInstallment); + return installments; + } + else + { + for (int i = 1; i < installmentCount; i++) + { + var installment = + new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), moneyPerMonth, ""); - installments.Add(installment); - var endDay = 0; + installments.Add(installment); + var endDay = 0; - if (month == 12) - { - year++; - month = 1; - } - else - { - month++; - } + if (month == 12) + { + year++; + month = 1; + } + else + { + month++; + } - if (day == 30) - { - if (month == 12) - { - var lastYearDay = - Convert.ToInt32($"{year:0000}/{month:00}/1".FindeEndOfMonth().Substring(8, 2)); - endDay = lastYearDay == 30 ? lastYearDay : 29; - } - } + if (day == 30) + { + if (month == 12) + { + var lastYearDay = + Convert.ToInt32($"{year:0000}/{month:00}/1".FindeEndOfMonth().Substring(8, 2)); + endDay = lastYearDay == 30 ? lastYearDay : 29; + } + } - loanStartDate = - endDay == 0 ? $"{year:0000}/{month:00}/{day:00}" : $"{year:0000}/{month:00}/{endDay:00}"; - } + loanStartDate = + endDay == 0 ? $"{year:0000}/{month:00}/{day:00}" : $"{year:0000}/{month:00}/{endDay:00}"; + } - var lastInstallment = new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), lastLoan, ""); - installments.Add(lastInstallment); - return installments; - } - } + var lastInstallment = new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), lastLoan, ""); + installments.Add(lastInstallment); + return installments; + } + } } #region CustomViewModels public class TotalbalancViewModel { - public string TotalBalanceStr { get; set; } = "0"; - public double TotalBalanceDbl { get; set; } = 0; + public string TotalBalanceStr { get; set; } = "0"; + public double TotalBalanceDbl { get; set; } = 0; } public class WorkshopsAndEmployeeViewModel { - public List WorkshopViewModels { get; set; } - public string WorkshopCount { get; set; } - public string EmployeeCount { get; set; } - public int ArchiveCode { get; set; } + public List WorkshopViewModels { get; set; } + public string WorkshopCount { get; set; } + public string EmployeeCount { get; set; } + public int ArchiveCode { get; set; } } -#endregion \ No newline at end of file +#endregion + diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index 757b29c7..d2a5bad8 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -1101,7 +1101,7 @@ public class InstitutionContractRepository : RepositoryBase= now && x.contract.ContractEndGr <= endThisMontGr) + : (x.contract.ContractEndGr >= now && x.contract.ContractEndGr <= endThisMontGr && !_context.InstitutionContractSet.Any(i=>i.ContractingPartyId == x.contract.ContractingPartyId && x.contract.ExtensionNo+1 <= i.ExtensionNo && i.IsActiveString == "true")) ? (int)InstitutionContractListStatus.PendingForRenewal : x.contractingParty.IsBlock == "true" ? (int)InstitutionContractListStatus.Block @@ -1729,6 +1729,9 @@ public class InstitutionContractRepository : RepositoryBase x.WorkshopGroup) + .ThenInclude(x=> x.InitialWorkshops) + .Include(x=>x.WorkshopGroup) + .ThenInclude(x=>x.CurrentWorkshops) .FirstOrDefaultAsync(x => x.id == institutionContractId); } @@ -1870,6 +1873,95 @@ public class InstitutionContractRepository : RepositoryBase x.PublicId == id); } + public InstitutionContractExtensionPaymentResponse CalculateDiscount(InstitutionContractSetDiscountRequest request) + { + var baseAmount = request.PaymentAmount; + var discountAmount = (baseAmount * request.DiscountPercentage) / 100; + var paymentAmount = baseAmount - discountAmount; + var taxAmount = paymentAmount * 0.10; + var totalAmount = paymentAmount + taxAmount; + InstitutionContractPaymentMonthlyViewModel monthlyPayment = null; + InstitutionContractPaymentOneTimeViewModel oneTimePayment = null; + + if (request.IsInstallment) + { + monthlyPayment = new InstitutionContractPaymentMonthlyViewModel() + { + TotalAmount = totalAmount.ToMoney(), + PaymentAmount = paymentAmount.ToMoney(), + Tax = taxAmount.ToMoney(), + DiscountedAmount = discountAmount.ToMoney(), + DiscountPercetage = request.DiscountPercentage, + Installments = InstitutionMonthlyInstallmentCaculation((int)request.Duration, + totalAmount, DateTime.Now.ToFarsi()) + }; + } + else + { + oneTimePayment = new InstitutionContractPaymentOneTimeViewModel() + { + TotalAmount = totalAmount.ToMoney(), + PaymentAmount = paymentAmount.ToMoney(), + Tax = taxAmount.ToMoney(), + DiscountedAmount = discountAmount.ToMoney(), + DiscountPercetage = request.DiscountPercentage + }; + } + + if (discountAmount > baseAmount) + throw new BadRequestException("مقدار تخفیف نمی‌تواند بیشتر از مبلغ کل باشد"); + + return new InstitutionContractExtensionPaymentResponse() + { + Monthly = monthlyPayment, + OneTime = oneTimePayment + }; + } + + public InstitutionContractExtensionPaymentResponse ResetDiscountCreate( + InstitutionContractResetDiscountForCreateRequest request) + { + InstitutionContractPaymentMonthlyViewModel monthlyPayment = null; + InstitutionContractPaymentOneTimeViewModel oneTimePayment = null; + + if (request.IsInstallment) + { + var newPaymentAmount = request.PaymentAmount / (1 - (request.Percentage / 100)); + var taxAmount = (newPaymentAmount * 0.10); + var paymentAmount = (newPaymentAmount + taxAmount); + monthlyPayment = new InstitutionContractPaymentMonthlyViewModel() + { + PaymentAmount = newPaymentAmount.ToMoney(), + Tax = taxAmount.ToMoney(), + DiscountedAmount = "0", + DiscountPercetage = 0, + TotalAmount =paymentAmount.ToMoney(), + Installments = InstitutionMonthlyInstallmentCaculation((int)request.Duration, + paymentAmount, DateTime.Now.ToFarsi()) + }; + } + else + { + var newPaymentAmount = request.PaymentAmount / (1 - (request.Percentage / 100)); + var taxAmount = (newPaymentAmount * 0.10); + var paymentAmount = (newPaymentAmount + taxAmount); + oneTimePayment = new InstitutionContractPaymentOneTimeViewModel() + { + PaymentAmount = newPaymentAmount.ToMoney(), + Tax = taxAmount.ToMoney(), + TotalAmount = paymentAmount.ToMoney(), + DiscountedAmount = "0", + DiscountPercetage = 0 + }; + } + + return new InstitutionContractExtensionPaymentResponse() + { + Monthly = monthlyPayment, + OneTime = oneTimePayment + }; + } + #region Extension public async Task GetExtensionInquiry(long previousContractId) @@ -2177,6 +2269,118 @@ public class InstitutionContractRepository : RepositoryBase SetDiscountForExtension(InstitutionContractSetDiscountForExtensionRequest request) + { + + if (request.DiscountPercentage <= 0) + throw new BadRequestException("مقدار تخفیف نمی‌تواند برابر یا کمتر از صفر باشد"); + var institutionTemp = await _institutionExtensionTemp.Find(x => x.Id == request.TempId) + .FirstOrDefaultAsync(); + if (institutionTemp == null) + { + throw new BadRequestException("اطلاعات وارد شده نامعتبر است"); + } + + if (request.IsInstallment) + { + if(institutionTemp.MonthlyPayment.DiscountPercetage>0) + throw new BadRequestException("تخفیف قبلا برای این قرارداد اعمال شده است"); + } + else + { + if(institutionTemp.OneTimePayment.DiscountPercetage>0) + throw new BadRequestException("تخفیف قبلا برای این قرارداد اعمال شده است"); + } + + var calculateRequest = new InstitutionContractSetDiscountRequest() + { + Duration = institutionTemp.Duration.Value, + PaymentAmount = request.PaymentAmount, + DiscountPercentage = request.DiscountPercentage, + IsInstallment = request.IsInstallment + }; + var res = CalculateDiscount(calculateRequest); + + //این به این دلیل هست که متد caclulate discount یکی از مقادیر رو پر میکنه و ما نیاز داریم هر دو مقدار رو داشته باشیم + if (request.IsInstallment) + { + res.OneTime = institutionTemp.OneTimePayment; + } + else + { + res.Monthly = institutionTemp.MonthlyPayment; + } + institutionTemp.SetAmountAndDuration(institutionTemp.Duration.Value, res.Monthly, res.OneTime); + await _institutionExtensionTemp.ReplaceOneAsync(x => x.Id == institutionTemp.Id, + institutionTemp); + + return new() + { + OneTime = res.OneTime, + Monthly = res.Monthly + }; + } + + public async Task ResetDiscountForExtension + (InstitutionContractResetDiscountForExtensionRequest request) + { + var institutionTemp = await _institutionExtensionTemp.Find(x => x.Id == request.TempId) + .FirstOrDefaultAsync(); + if (institutionTemp == null) + { + throw new BadRequestException("اطلاعات وارد شده نامعتبر است"); + } + + InstitutionContractPaymentMonthlyViewModel monthlyPayment = null; + InstitutionContractPaymentOneTimeViewModel oneTimePayment = null; + if (request.IsInstallment) + { + var prevMonthlyPayment = institutionTemp.MonthlyPayment; + var resetPaymentAmount = prevMonthlyPayment.PaymentAmount.MoneyToDouble() / (1 - (prevMonthlyPayment.DiscountPercetage / 100.0)); + var resetTax = (resetPaymentAmount * 0.10); + var totalAmount = (resetPaymentAmount + resetTax); + monthlyPayment = new InstitutionContractPaymentMonthlyViewModel() + { + DiscountPercetage = 0, + DiscountedAmount = "0", + PaymentAmount = resetPaymentAmount.ToMoney(), + Tax = resetTax.ToMoney(), + TotalAmount = totalAmount.ToMoney(), + Installments = InstitutionMonthlyInstallmentCaculation((int)institutionTemp.Duration.Value, + totalAmount, DateTime.Now.ToFarsi()), + }; + institutionTemp.MonthlyPayment = monthlyPayment; + await _institutionExtensionTemp.ReplaceOneAsync(x=>x.Id == institutionTemp.Id, + institutionTemp); + + } + else + { + var prevOneTimePayment = institutionTemp.OneTimePayment; + var resetPaymentAmount = prevOneTimePayment.PaymentAmount.MoneyToDouble() / + (1 - (prevOneTimePayment.DiscountPercetage / 100.0)); + var resetTax = (resetPaymentAmount * 0.10); + oneTimePayment = new InstitutionContractPaymentOneTimeViewModel() + { + DiscountPercetage = 0, + DiscountedAmount = "0", + PaymentAmount = resetPaymentAmount.ToMoney(), + Tax = resetTax.ToMoney(), + TotalAmount = (resetPaymentAmount + resetTax).ToMoney(), + }; + institutionTemp.OneTimePayment = oneTimePayment; + await _institutionExtensionTemp.ReplaceOneAsync(x=>x.Id == institutionTemp.Id, + institutionTemp); + } + + return new() + { + OneTime = oneTimePayment, + Monthly = monthlyPayment + }; + + } + public async Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request) { var institutionContractTemp = await _institutionExtensionTemp.Find(x => x.Id == request.TemporaryId) @@ -2321,7 +2525,7 @@ public class InstitutionContractRepository : RepositoryBase @@ -2389,32 +2589,7 @@ public class InstitutionContractRepository : RepositoryBase GetIdByInstallmentId(long installmentId) + { + return await _context.InstitutionContractSet.Include(x=>x.Installments) + .Where(x=>x.Installments.Any(i=>i.Id==installmentId)) + .Select(x=>x.id).FirstOrDefaultAsync(); + } #endregion diff --git a/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs b/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs index 627391e0..d0c41ac7 100644 --- a/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs +++ b/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs @@ -458,8 +458,19 @@ public class institutionContractController : AdminBaseController return operationResult; } - - + [HttpPost("create/set-discount")] + public ActionResult SetDiscountForInstitutionContract([FromBody]InstitutionContractSetDiscountRequest request) + { + var res = _institutionContractApplication.CalculateDiscount(request); + return res; + } + + [HttpPost("create/reset-discount")] + public ActionResult ResetDiscountForCreate([FromBody]InstitutionContractResetDiscountForCreateRequest request) + { + var res = _institutionContractApplication.ResetDiscountCreate(request); + return res; + } /// /// /// @@ -552,7 +563,21 @@ public class institutionContractController : AdminBaseController var res =await _institutionContractApplication.GetExtensionPaymentMethod(request); return res; } + + [HttpPost("extension/set-discount")] + public async Task> SetDiscountForExtension([FromBody]InstitutionContractSetDiscountForExtensionRequest request) + { + var res =await _institutionContractApplication.SetDiscountForExtension(request); + return res; + } + [HttpPost("extension/reset-discount")] + public async Task> ResetDiscountForExtension([FromBody]InstitutionContractResetDiscountForExtensionRequest request) + { + var res =await _institutionContractApplication.ResetDiscountForExtension(request); + return res; + } + [HttpPost("extenstion/complete")] public async Task> ExtensionComplete([FromBody]InstitutionContractExtensionCompleteRequest request) { diff --git a/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs b/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs index 17716c6f..44b797d2 100644 --- a/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs +++ b/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs @@ -28,6 +28,7 @@ using Parbad; using Parbad.AspNetCore; using Parbad.Gateway.Sepehr; using System.ComponentModel.DataAnnotations; +using _0_Framework.Application.Enums; using CompanyManagement.Infrastructure.Excel.WorkshopsRollCall; using static ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk.IndexModel2; @@ -46,18 +47,18 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk private readonly IOnlinePayment _onlinePayment; - [BindProperty] public IFormFile File { get; set; } - + [BindProperty] [Required(ErrorMessage = "لطفا نام ورژن را وارد کنید")] [Display(Name = "نام ورژن")] public string VersionName { get; set; } - + [BindProperty] [Required(ErrorMessage = "لطفا کد ورژن را وارد کنید")] [Display(Name = "کد ورژن")] public string VersionCode { get; set; } + [BindProperty] public ApkType SelectedApkType { get; set; } [BindProperty] public bool IsForce { get; set; } @@ -82,7 +83,7 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk public async Task OnPostUpload() { - var result = await _application.CreateAndActive(File,SelectedApkType, VersionName, VersionCode, IsForce); + var result = await _application.CreateAndActive(File, SelectedApkType, VersionName, VersionCode, IsForce); ViewData["message"] = result.Message; return Page(); } @@ -103,50 +104,39 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk var amount = 10000; - var transaction = new PaymentTransaction(30427, amount, "سید حسن مصباح", "https://client.gozareshgir.ir", PaymentTransactionGateWay.SepehrPay); + var transaction = new PaymentTransaction(30427, amount, "سید حسن مصباح", "https://client.gozareshgir.ir", + PaymentTransactionGateWay.SepehrPay); _context.PaymentTransactions.Add(transaction); await _context.SaveChangesAsync(); - var command = new CreatePaymentGatewayRequest() + var command = new CreatePaymentGatewayRequest() { TransactionId = transaction.id.ToString(), Amount = amount, CallBackUrl = callBack - }; + }; var createRes = await _paymentGateway.Create(command); if (createRes.IsSuccess) { - transaction.SetTransactionId(createRes.Token); - await _context.SaveChangesAsync(); + transaction.SetTransactionId(createRes.Token); + await _context.SaveChangesAsync(); - var payUrl = _paymentGateway.GetStartPayUrl(createRes.Token); - return Redirect(payUrl); + var payUrl = _paymentGateway.GetStartPayUrl(createRes.Token); + return Redirect(payUrl); } else { - return BadRequest(createRes.Status + "خطا در ارسال به درگاه پرداخت"); + return BadRequest(createRes.Status + "خطا در ارسال به درگاه پرداخت"); } } - - public IActionResult OnPostShiftDateNew() + public async Task OnPostShiftDateNew() { - var startRollCall = new DateTime(2025, 4, 21); - //var employees = _context.CustomizeWorkshopEmployeeSettings - // .Where(x => x.WorkshopShiftStatus == WorkshopShiftStatus.Rotating).Select(x => x.EmployeeId).ToList(); - - var rollCalls = _context.RollCalls.Where(x => x.ShiftDate >= startRollCall && x.EndDate != null).ToList(); - var r1 = rollCalls.ToList(); - - Console.ForegroundColor = ConsoleColor.DarkRed; - Console.WriteLine("endStep 1 ============"); - SetBreakTime(r1); - - + await UpdateInstitutionContract(); ViewData["message"] = "تومام یک"; return Page(); } @@ -169,21 +159,22 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk .ThenInclude(x => x.LeftWorks) .Include(x => x.Workshop) .ThenInclude(x => x.WorkshopEmployers) - .ThenInclude(x=>x.Employer) + .ThenInclude(x => x.Employer) .Select(x => new WorkshopRollCallExcelViewModel() { EmployerName = x.Workshop.WorkshopEmployers.First().Employer.FullName, IsActive = x.IsActiveString == "true", PersonnelCount = x.Workshop.LeftWorks.Count(l => l.StartWorkDate <= now && l.LeftWorkDate >= now), WorkshopName = x.Workshop.WorkshopFullName - }).OrderByDescending(x=>x.IsActive).ToList(); + }).OrderByDescending(x => x.IsActive).ToList(); var dataBytes = WorkshopRollCallExcelExporter.Export(data); return File(dataBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "RollCallServices.xlsx"); ViewData["message"] = "تومام دو"; return Page(); } - private async System.Threading.Tasks.Task CreateDadmehrWorkshopFaceEmbedding() + + private async System.Threading.Tasks.Task CreateDadmehrWorkshopFaceEmbedding() { var basePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "faces"); @@ -264,7 +255,7 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk } } } - + public async Task OnPostPaymentGateWay(CancellationToken cancellationToken) { var command = new CreatePaymentGatewayRequest() @@ -820,7 +811,10 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk { var today = DateTime.Today; var transaction = await _context.Database.BeginTransactionAsync(); + var query = _context.InstitutionContractSet + .Where(a => a.VerifyCode == null + && a.PublicId == Guid.Empty) .Include(x => x.WorkshopGroup) .Join(_context.PersonalContractingParties .Include(x => x.Employers) @@ -830,8 +824,8 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk contract => contract.ContractingPartyId, contractingParty => contractingParty.id, (contract, contractingParty) => new { contract, contractingParty }); - - + + var remoteContractsQuery = query .Where(x => x.contractingParty.Employers .Any(e => e.WorkshopEmployers @@ -854,13 +848,17 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk var personnelCount = w.LeftWorks.Count(lw => lw.StartWorkDate <= today && lw.LeftWorkDate >= today); + var rollCallService = _context.RollCallServices + .Where(x => x.WorkshopId == w.id) + .ToList().MaxBy(x => x.StartService); + var calculation = _clientRegistrationApplication .GetInstitutionPlanForWorkshop(new WorkshopTempViewModel() { CustomizeCheckout = false, Insurance = true, InsuranceInPerson = false, - RollCall = true, + RollCall = rollCallService != null, WorkshopName = "", ContractAndCheckout = true, ContractAndCheckoutInPerson = false, @@ -915,14 +913,19 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk .SelectMany(e => e.WorkshopEmployers.Select(we => we.Workshop)).ToList() .DistinctBy(x => x.id).ToList(); + var initialWorkshop = workshops .Select(w => { var personnelCount = w.LeftWorks.Count(lw => lw.StartWorkDate <= today && lw.LeftWorkDate >= today); - bool hasRollCallPlan = true; - bool hasRollCallPlanInPerson = false; + var rollCallService = _context.RollCallServices + .Where(x => x.WorkshopId == w.id) + .ToList().MaxBy(x => x.StartService); + + bool hasRollCallPlan = rollCallService != null; + bool hasRollCallPlanInPerson = rollCallService != null; bool hasCustomizeCheckoutPlan = w.id == 170; bool hasContractPlan = true; bool hasContractPlanInPerson = true; diff --git a/ServiceHost/Controllers/GeneralController.cs b/ServiceHost/Controllers/GeneralController.cs index e15ae033..e19d1c45 100644 --- a/ServiceHost/Controllers/GeneralController.cs +++ b/ServiceHost/Controllers/GeneralController.cs @@ -150,7 +150,7 @@ public class GeneralController : GeneralBaseController payResponse.cardnumber, payResponse.issuerbank, payResponse.rrn.ToString(), payResponse.digitalreceipt); - if (financialInvoice.Items?.Any(x => x.Type == FinancialInvoiceItemType.BuyInstitutionContract) ?? false) + if (financialInvoice.Items?.Any(x => x.Type is FinancialInvoiceItemType.BuyInstitutionContract or FinancialInvoiceItemType.BuyInstitutionContractInstallment) ?? false) { var financialItems = financialInvoice.Items .Where(x => x.Type == FinancialInvoiceItemType.BuyInstitutionContract); @@ -158,6 +158,16 @@ public class GeneralController : GeneralBaseController { await _institutionContractApplication.SetPendingWorkflow(editFinancialInvoiceItem.EntityId); } + var financialInstallmentItems = financialInvoice.Items + .Where(x => x.Type == FinancialInvoiceItemType.BuyInstitutionContractInstallment); + + foreach (var editFinancialInvoiceItem in financialInstallmentItems) + { + var institutionContractId = + await _institutionContractApplication.GetIdByInstallmentId( + editFinancialInvoiceItem.Id); + await _institutionContractApplication.SetPendingWorkflow(institutionContractId); + } } if (!setSuccessResult.IsSuccedded) diff --git a/ServiceHost/Program.cs b/ServiceHost/Program.cs index 1e94643e..f55074f5 100644 --- a/ServiceHost/Program.cs +++ b/ServiceHost/Program.cs @@ -336,6 +336,8 @@ builder.Services.AddParbad().ConfigureGateways(gateways => var app = builder.Build(); + + app.UseCors("AllowSpecificOrigins"); #region InternalProgarmManagerApi diff --git a/ServiceHost/appsettings.Development.json b/ServiceHost/appsettings.Development.json index 747f1a2b..b979657f 100644 --- a/ServiceHost/appsettings.Development.json +++ b/ServiceHost/appsettings.Development.json @@ -16,6 +16,9 @@ //local "MesbahDb": "Data Source=.;Initial Catalog=mesbah_db;Integrated Security=True;TrustServerCertificate=true;", + + //server + //"MesbahDb": "Data Source=185.208.175.186;Initial Catalog=mesbah_db;Persist Security Info=False;User ID=ir_db;Password=R2rNp[170]18[3019]#@ATt;TrustServerCertificate=true;", //dad-mehr //"MesbahDb": "Data Source=.;Initial Catalog=teamWork;Integrated Security=True;TrustServerCertificate=true;",